[user32]
[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 /* Undocumented user definitions*/
37 #include <undocuser.h>
38
39 /* WINE Headers */
40 #include <wine/unicode.h>
41
42 /* Internal User32 Headers */
43 #include "user32p.h"
44
45 /* SEH Support with PSEH */
46 #include <pseh/pseh2.h>
47
48 extern PPROCESSINFO g_ppi;
49 extern ULONG_PTR g_ulSharedDelta;
50 extern PSERVERINFO gpsi;
51 extern BOOL gfServerProcess;
52
53 #define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1))
54 #define ISITHOOKED(HookId) (GetWin32ClientInfo()->fsHooks & HOOKID_TO_FLAG(HookId) ||\
55 (GetWin32ClientInfo()->pDeskInfo && GetWin32ClientInfo()->pDeskInfo->fsHooks & HOOKID_TO_FLAG(HookId)))
56
57 /* Temporarily in here for now. */
58
59 extern RTL_CRITICAL_SECTION gcsUserApiHook;
60 extern USERAPIHOOK guah;
61 extern HINSTANCE ghmodUserApiHook;
62 BOOL FASTCALL BeginIfHookedUserApiHook(VOID);
63 BOOL FASTCALL EndUserApiHook(VOID);
64 BOOL FASTCALL IsInsideUserApiHook(VOID);
65 VOID FASTCALL ResetUserApiHook(PUSERAPIHOOK);
66 BOOL FASTCALL IsMsgOverride(UINT,PUAHOWP);
67 BOOL WINAPI InitUserApiHook(HINSTANCE hInstance, USERAPIHOOKPROC pfn);
68 BOOL WINAPI ClearUserApiHook(HINSTANCE hInstance);
69
70 static __inline void LoadUserApiHook()
71 {
72 if(!(gpsi->dwSRVIFlags & SRVINFO_APIHOOK))
73 return;
74
75 if(IsInsideUserApiHook())
76 return;
77
78 /* HACK! Please remove when gfServerProcess is correct */
79 #if 0
80 if(gfServerProcess)
81 return;
82 #endif
83 if(RtlIsThreadWithinLoaderCallout())
84 return;
85
86 NtUserCallNoParam(NOPARAM_ROUTINE_LOADUSERAPIHOOK);
87 }
88
89 /* FIXME: Use ntgdi.h then cleanup... */
90 LONG WINAPI GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *);
91 BOOL FASTCALL IsMetaFile(HDC);
92
93 static __inline PVOID
94 SharedPtrToUser(PVOID Ptr)
95 {
96 ASSERT(Ptr != NULL);
97 ASSERT(g_ulSharedDelta != 0);
98 return (PVOID)((ULONG_PTR)Ptr - g_ulSharedDelta);
99 }
100
101 static __inline PVOID
102 DesktopPtrToUser(PVOID Ptr)
103 {
104 PCLIENTINFO pci;
105 PDESKTOPINFO pdi;
106 GetW32ThreadInfo();
107 pci = GetWin32ClientInfo();
108 pdi = pci->pDeskInfo;
109
110 ASSERT(Ptr != NULL);
111 ASSERT(pdi != NULL);
112 if ((ULONG_PTR)Ptr >= (ULONG_PTR)pdi->pvDesktopBase &&
113 (ULONG_PTR)Ptr < (ULONG_PTR)pdi->pvDesktopLimit)
114 {
115 return (PVOID)((ULONG_PTR)Ptr - pci->ulClientDelta);
116 }
117 else
118 {
119 /* NOTE: This is slow as it requires a call to win32k. This should only be
120 neccessary if a thread wants to access an object on a different
121 desktop */
122 return (PVOID)NtUserGetDesktopMapping(Ptr);
123 }
124 }
125
126 static __inline PVOID
127 SharedPtrToKernel(PVOID Ptr)
128 {
129 ASSERT(Ptr != NULL);
130 ASSERT(g_ulSharedDelta != 0);
131 return (PVOID)((ULONG_PTR)Ptr + g_ulSharedDelta);
132 }
133
134 static __inline BOOL
135 IsThreadHooked(PCLIENTINFO pci)
136 {
137 return (pci->fsHooks|pci->pDeskInfo->fsHooks) != 0;
138 }
139
140 static __inline PDESKTOPINFO
141 GetThreadDesktopInfo(VOID)
142 {
143 PTHREADINFO ti;
144 PDESKTOPINFO di = NULL;
145
146 ti = GetW32ThreadInfo();
147 if (ti != NULL)
148 di = GetWin32ClientInfo()->pDeskInfo;
149
150 return di;
151 }
152
153 PCALLPROCDATA FASTCALL ValidateCallProc(HANDLE hCallProc);
154 PWND FASTCALL ValidateHwnd(HWND hwnd);
155 PWND FASTCALL ValidateHwndOrDesk(HWND hwnd);
156 PWND FASTCALL GetThreadDesktopWnd(VOID);
157 PVOID FASTCALL ValidateHandleNoErr(HANDLE handle, UINT uType);
158 PWND FASTCALL ValidateHwndNoErr(HWND hwnd);
159 VOID FASTCALL GetConnected(VOID);
160 BOOL FASTCALL DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi);
161 BOOL FASTCALL TestWindowProcess(PWND);
162 VOID UserGetWindowBorders(DWORD, DWORD, SIZE *, BOOL);
163 VOID FASTCALL IntNotifyWinEvent(DWORD, HWND, LONG, LONG, DWORD);