2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS System Libraries
4 * FILE: lib/user32/include/user32.h
5 * PURPOSE: Win32 User Library
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
9 /* INCLUDES ******************************************************************/
19 #define NTOS_MODE_USER
20 #define WIN32_NO_STATUS
25 #include <ndk/ntndk.h>
26 #include <ddk/ntstatus.h>
29 #include <csrss/csrss.h>
31 /* Public Win32K Headers */
32 #include <win32k/ntusrtyp.h>
33 #include <win32k/ntuser.h>
34 #include <win32k/callback.h>
37 #include <wine/unicode.h>
39 /* Internal User32 Headers */
42 /* SEH Support with PSEH */
43 #include <pseh/pseh2.h>
45 #define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1))
46 #define ISITHOOKED(HookId) (GetWin32ClientInfo()->fsHooks & HOOKID_TO_FLAG(HookId))
48 /* Temporarily in here for now. */
49 typedef struct _USERAPIHOOKINFO
56 } USERAPIHOOKINFO
,*PUSERAPIHOOKINFO
;
58 typedef LRESULT(CALLBACK
*WNDPROC_OWP
)(HWND
,UINT
,WPARAM
,LPARAM
,ULONG_PTR
,PDWORD
);
60 typedef struct _UAHOWP
66 typedef struct tagUSERAPIHOOK
69 WNDPROC DefWindowProcA
;
70 WNDPROC DefWindowProcW
;
71 UAHOWP DefWndProcArray
;
72 FARPROC GetScrollInfo
;
73 FARPROC SetScrollInfo
;
74 FARPROC EnableScrollBar
;
75 FARPROC AdjustWindowRectEx
;
77 WNDPROC_OWP PreWndProc
;
78 WNDPROC_OWP PostWndProc
;
80 WNDPROC_OWP PreDefDlgProc
;
81 WNDPROC_OWP PostDefDlgProc
;
83 FARPROC GetSystemMetrics
;
84 FARPROC SystemParametersInfoA
;
85 FARPROC SystemParametersInfoW
;
86 FARPROC ForceResetUserApiHook
;
87 FARPROC DrawFrameControl
;
89 FARPROC MDIRedrawFrame
;
90 FARPROC GetRealWindowOwner
;
91 } USERAPIHOOK
, *PUSERAPIHOOK
;
100 extern RTL_CRITICAL_SECTION gcsUserApiHook
;
101 extern USERAPIHOOK guah
;
102 typedef DWORD (CALLBACK
* USERAPIHOOKPROC
)(UAPIHK State
, ULONG_PTR Info
);
103 BOOL FASTCALL
BeginIfHookedUserApiHook(VOID
);
104 BOOL FASTCALL
EndUserApiHook(VOID
);
105 BOOL FASTCALL
IsInsideUserApiHook(VOID
);
106 VOID FASTCALL
ResetUserApiHook(PUSERAPIHOOK
);
107 BOOL FASTCALL
IsMsgOverride(UINT
,PUAHOWP
);
109 #define LOADUSERAPIHOOK \
110 if (!gfServerProcess && \
111 !IsInsideUserApiHook() && \
112 (gpsi->dwSRVIFlags & SRVINFO_APIHOOK) && \
113 !RtlIsThreadWithinLoaderCallout()) \
115 NtUserCallNoParam(NOPARAM_ROUTINE_LOADUSERAPIHOOK); \
118 /* FIXME: Use ntgdi.h then cleanup... */
119 LONG WINAPI
GdiGetCharDimensions(HDC
, LPTEXTMETRICW
, LONG
*);
120 BOOL FASTCALL
IsMetaFile(HDC
);
122 extern PPROCESSINFO g_ppi
;
123 extern ULONG_PTR g_ulSharedDelta
;
124 extern PSERVERINFO gpsi
;
125 extern BOOL gfServerProcess
;
127 static __inline PVOID
128 SharedPtrToUser(PVOID Ptr
)
131 ASSERT(g_ulSharedDelta
!= 0);
132 return (PVOID
)((ULONG_PTR
)Ptr
- g_ulSharedDelta
);
135 static __inline PVOID
136 DesktopPtrToUser(PVOID Ptr
)
141 pci
= GetWin32ClientInfo();
142 pdi
= pci
->pDeskInfo
;
146 if ((ULONG_PTR
)Ptr
>= (ULONG_PTR
)pdi
->pvDesktopBase
&&
147 (ULONG_PTR
)Ptr
< (ULONG_PTR
)pdi
->pvDesktopLimit
)
149 return (PVOID
)((ULONG_PTR
)Ptr
- pci
->ulClientDelta
);
153 /* NOTE: This is slow as it requires a call to win32k. This should only be
154 neccessary if a thread wants to access an object on a different
156 return (PVOID
)NtUserGetDesktopMapping(Ptr
);
160 static __inline PVOID
161 SharedPtrToKernel(PVOID Ptr
)
164 ASSERT(g_ulSharedDelta
!= 0);
165 return (PVOID
)((ULONG_PTR
)Ptr
+ g_ulSharedDelta
);
169 IsThreadHooked(PCLIENTINFO pci
)
171 return pci
->fsHooks
!= 0;
174 static __inline PDESKTOPINFO
175 GetThreadDesktopInfo(VOID
)
178 PDESKTOPINFO di
= NULL
;
180 ti
= GetW32ThreadInfo();
182 di
= GetWin32ClientInfo()->pDeskInfo
;
187 PCALLPROCDATA FASTCALL
ValidateCallProc(HANDLE hCallProc
);
188 PWND FASTCALL
ValidateHwnd(HWND hwnd
);
189 PWND FASTCALL
ValidateHwndOrDesk(HWND hwnd
);
190 PWND FASTCALL
GetThreadDesktopWnd(VOID
);
191 PVOID FASTCALL
ValidateHandleNoErr(HANDLE handle
, UINT uType
);
192 PWND FASTCALL
ValidateHwndNoErr(HWND hwnd
);
193 VOID FASTCALL
GetConnected(VOID
);
194 BOOL FASTCALL
DefSetText(HWND hWnd
, PCWSTR String
, BOOL Ansi
);
195 BOOL FASTCALL
TestWindowProcess(PWND
);
196 VOID
UserGetWindowBorders(DWORD
, DWORD
, SIZE
*, BOOL
);