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>
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) ||\
47 (GetWin32ClientInfo()->pDeskInfo && GetWin32ClientInfo()->pDeskInfo->fsHooks & HOOKID_TO_FLAG(HookId)))
49 /* Temporarily in here for now. */
50 typedef struct _USERAPIHOOKINFO
57 } USERAPIHOOKINFO
,*PUSERAPIHOOKINFO
;
59 typedef LRESULT(CALLBACK
*WNDPROC_OWP
)(HWND
,UINT
,WPARAM
,LPARAM
,ULONG_PTR
,PDWORD
);
61 typedef struct _UAHOWP
67 typedef struct tagUSERAPIHOOK
70 WNDPROC DefWindowProcA
;
71 WNDPROC DefWindowProcW
;
72 UAHOWP DefWndProcArray
;
73 FARPROC GetScrollInfo
;
74 FARPROC SetScrollInfo
;
75 FARPROC EnableScrollBar
;
76 FARPROC AdjustWindowRectEx
;
78 WNDPROC_OWP PreWndProc
;
79 WNDPROC_OWP PostWndProc
;
81 WNDPROC_OWP PreDefDlgProc
;
82 WNDPROC_OWP PostDefDlgProc
;
84 FARPROC GetSystemMetrics
;
85 FARPROC SystemParametersInfoA
;
86 FARPROC SystemParametersInfoW
;
87 FARPROC ForceResetUserApiHook
;
88 FARPROC DrawFrameControl
;
90 FARPROC MDIRedrawFrame
;
91 FARPROC GetRealWindowOwner
;
92 } USERAPIHOOK
, *PUSERAPIHOOK
;
101 extern RTL_CRITICAL_SECTION gcsUserApiHook
;
102 extern USERAPIHOOK guah
;
103 typedef DWORD (CALLBACK
* USERAPIHOOKPROC
)(UAPIHK State
, ULONG_PTR Info
);
104 BOOL FASTCALL
BeginIfHookedUserApiHook(VOID
);
105 BOOL FASTCALL
EndUserApiHook(VOID
);
106 BOOL FASTCALL
IsInsideUserApiHook(VOID
);
107 VOID FASTCALL
ResetUserApiHook(PUSERAPIHOOK
);
108 BOOL FASTCALL
IsMsgOverride(UINT
,PUAHOWP
);
110 #define LOADUSERAPIHOOK \
111 if (!gfServerProcess && \
112 !IsInsideUserApiHook() && \
113 (gpsi->dwSRVIFlags & SRVINFO_APIHOOK) && \
114 !RtlIsThreadWithinLoaderCallout()) \
116 NtUserCallNoParam(NOPARAM_ROUTINE_LOADUSERAPIHOOK); \
119 /* FIXME: Use ntgdi.h then cleanup... */
120 LONG WINAPI
GdiGetCharDimensions(HDC
, LPTEXTMETRICW
, LONG
*);
121 BOOL FASTCALL
IsMetaFile(HDC
);
123 extern PPROCESSINFO g_ppi
;
124 extern ULONG_PTR g_ulSharedDelta
;
125 extern PSERVERINFO gpsi
;
126 extern BOOL gfServerProcess
;
128 static __inline PVOID
129 SharedPtrToUser(PVOID Ptr
)
132 ASSERT(g_ulSharedDelta
!= 0);
133 return (PVOID
)((ULONG_PTR
)Ptr
- g_ulSharedDelta
);
136 static __inline PVOID
137 DesktopPtrToUser(PVOID Ptr
)
142 pci
= GetWin32ClientInfo();
143 pdi
= pci
->pDeskInfo
;
147 if ((ULONG_PTR
)Ptr
>= (ULONG_PTR
)pdi
->pvDesktopBase
&&
148 (ULONG_PTR
)Ptr
< (ULONG_PTR
)pdi
->pvDesktopLimit
)
150 return (PVOID
)((ULONG_PTR
)Ptr
- pci
->ulClientDelta
);
154 /* NOTE: This is slow as it requires a call to win32k. This should only be
155 neccessary if a thread wants to access an object on a different
157 return (PVOID
)NtUserGetDesktopMapping(Ptr
);
161 static __inline PVOID
162 SharedPtrToKernel(PVOID Ptr
)
165 ASSERT(g_ulSharedDelta
!= 0);
166 return (PVOID
)((ULONG_PTR
)Ptr
+ g_ulSharedDelta
);
170 IsThreadHooked(PCLIENTINFO pci
)
172 return (pci
->fsHooks
|pci
->pDeskInfo
->fsHooks
) != 0;
175 static __inline PDESKTOPINFO
176 GetThreadDesktopInfo(VOID
)
179 PDESKTOPINFO di
= NULL
;
181 ti
= GetW32ThreadInfo();
183 di
= GetWin32ClientInfo()->pDeskInfo
;
188 PCALLPROCDATA FASTCALL
ValidateCallProc(HANDLE hCallProc
);
189 PWND FASTCALL
ValidateHwnd(HWND hwnd
);
190 PWND FASTCALL
ValidateHwndOrDesk(HWND hwnd
);
191 PWND FASTCALL
GetThreadDesktopWnd(VOID
);
192 PVOID FASTCALL
ValidateHandleNoErr(HANDLE handle
, UINT uType
);
193 PWND FASTCALL
ValidateHwndNoErr(HWND hwnd
);
194 VOID FASTCALL
GetConnected(VOID
);
195 BOOL FASTCALL
DefSetText(HWND hWnd
, PCWSTR String
, BOOL Ansi
);
196 BOOL FASTCALL
TestWindowProcess(PWND
);
197 VOID
UserGetWindowBorders(DWORD
, DWORD
, SIZE
*, BOOL
);
198 VOID FASTCALL
IntNotifyWinEvent(DWORD
, HWND
, LONG
, LONG
, DWORD
);