sync with trunk (r49238)
[reactos.git] / dll / win32 / user32 / include / user32.h
1 /*
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)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 /* C Headers */
12 #include <assert.h>
13 #include <stdio.h>
14 #include <math.h>
15
16 /* SDK/NDK Headers */
17 #define _USER32_
18 #define OEMRESOURCE
19 #define NTOS_MODE_USER
20 #define WIN32_NO_STATUS
21 #include <windows.h>
22 #include <winuser.h>
23 #include <windowsx.h>
24 #include <winnls32.h>
25 #include <ndk/ntndk.h>
26 #include <ntstatus.h>
27
28 /* CSRSS Headers */
29 #include <csrss/csrss.h>
30
31 /* Public Win32K Headers */
32 #include <win32k/ntusrtyp.h>
33 #include <win32k/ntuser.h>
34 #include <win32k/callback.h>
35
36 /* WINE Headers */
37 #include <wine/unicode.h>
38
39 /* Internal User32 Headers */
40 #include "user32p.h"
41
42 /* SEH Support with PSEH */
43 #include <pseh/pseh2.h>
44
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)))
48
49 /* Temporarily in here for now. */
50 typedef struct _USERAPIHOOKINFO
51 {
52 DWORD m_size;
53 LPCWSTR m_dllname1;
54 LPCWSTR m_funname1;
55 LPCWSTR m_dllname2;
56 LPCWSTR m_funname2;
57 } USERAPIHOOKINFO,*PUSERAPIHOOKINFO;
58
59 typedef LRESULT(CALLBACK *WNDPROC_OWP)(HWND,UINT,WPARAM,LPARAM,ULONG_PTR,PDWORD);
60
61 typedef struct _UAHOWP
62 {
63 BYTE* MsgBitArray;
64 DWORD Size;
65 } UAHOWP, *PUAHOWP;
66
67 typedef struct tagUSERAPIHOOK
68 {
69 DWORD size;
70 WNDPROC DefWindowProcA;
71 WNDPROC DefWindowProcW;
72 UAHOWP DefWndProcArray;
73 FARPROC GetScrollInfo;
74 FARPROC SetScrollInfo;
75 FARPROC EnableScrollBar;
76 FARPROC AdjustWindowRectEx;
77 FARPROC SetWindowRgn;
78 WNDPROC_OWP PreWndProc;
79 WNDPROC_OWP PostWndProc;
80 UAHOWP WndProcArray;
81 WNDPROC_OWP PreDefDlgProc;
82 WNDPROC_OWP PostDefDlgProc;
83 UAHOWP DlgProcArray;
84 FARPROC GetSystemMetrics;
85 FARPROC SystemParametersInfoA;
86 FARPROC SystemParametersInfoW;
87 FARPROC ForceResetUserApiHook;
88 FARPROC DrawFrameControl;
89 FARPROC DrawCaption;
90 FARPROC MDIRedrawFrame;
91 FARPROC GetRealWindowOwner;
92 } USERAPIHOOK, *PUSERAPIHOOK;
93
94 typedef enum _UAPIHK
95 {
96 uahLoadInit,
97 uahStop,
98 uahShutdown
99 } UAPIHK, *PUAPIHK;
100
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);
109
110 #define LOADUSERAPIHOOK \
111 if (!gfServerProcess && \
112 !IsInsideUserApiHook() && \
113 (gpsi->dwSRVIFlags & SRVINFO_APIHOOK) && \
114 !RtlIsThreadWithinLoaderCallout()) \
115 { \
116 NtUserCallNoParam(NOPARAM_ROUTINE_LOADUSERAPIHOOK); \
117 } \
118
119 /* FIXME: Use ntgdi.h then cleanup... */
120 LONG WINAPI GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *);
121 BOOL FASTCALL IsMetaFile(HDC);
122
123 extern PPROCESSINFO g_ppi;
124 extern ULONG_PTR g_ulSharedDelta;
125 extern PSERVERINFO gpsi;
126 extern BOOL gfServerProcess;
127
128 static __inline PVOID
129 SharedPtrToUser(PVOID Ptr)
130 {
131 ASSERT(Ptr != NULL);
132 ASSERT(g_ulSharedDelta != 0);
133 return (PVOID)((ULONG_PTR)Ptr - g_ulSharedDelta);
134 }
135
136 static __inline PVOID
137 DesktopPtrToUser(PVOID Ptr)
138 {
139 PCLIENTINFO pci;
140 PDESKTOPINFO pdi;
141 GetW32ThreadInfo();
142 pci = GetWin32ClientInfo();
143 pdi = pci->pDeskInfo;
144
145 ASSERT(Ptr != NULL);
146 ASSERT(pdi != NULL);
147 if ((ULONG_PTR)Ptr >= (ULONG_PTR)pdi->pvDesktopBase &&
148 (ULONG_PTR)Ptr < (ULONG_PTR)pdi->pvDesktopLimit)
149 {
150 return (PVOID)((ULONG_PTR)Ptr - pci->ulClientDelta);
151 }
152 else
153 {
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
156 desktop */
157 return (PVOID)NtUserGetDesktopMapping(Ptr);
158 }
159 }
160
161 static __inline PVOID
162 SharedPtrToKernel(PVOID Ptr)
163 {
164 ASSERT(Ptr != NULL);
165 ASSERT(g_ulSharedDelta != 0);
166 return (PVOID)((ULONG_PTR)Ptr + g_ulSharedDelta);
167 }
168
169 static __inline BOOL
170 IsThreadHooked(PCLIENTINFO pci)
171 {
172 return pci->fsHooks != 0;
173 }
174
175 static __inline PDESKTOPINFO
176 GetThreadDesktopInfo(VOID)
177 {
178 PTHREADINFO ti;
179 PDESKTOPINFO di = NULL;
180
181 ti = GetW32ThreadInfo();
182 if (ti != NULL)
183 di = GetWin32ClientInfo()->pDeskInfo;
184
185 return di;
186 }
187
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);