Sync to trunk head(r38096)
[reactos.git] / reactos / 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 <ddk/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 /* FIXME: Use ntgdi.h then cleanup... */
46 HGDIOBJ WINAPI NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj);
47 BOOL WINAPI NtGdiPatBlt(HDC hdcDst, INT x, INT y, INT cx, INT cy, DWORD rop4);
48 LONG WINAPI GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *);
49 BOOL FASTCALL IsMetaFile(HDC);
50
51 extern PW32PROCESSINFO g_pi;
52 extern PW32PROCESSINFO g_kpi;
53 extern PSERVERINFO g_psi;
54
55 static __inline PVOID
56 SharedPtrToUser(PVOID Ptr)
57 {
58 ASSERT(Ptr != NULL);
59 ASSERT(g_pi != NULL);
60 ASSERT(g_pi->UserHeapDelta != 0);
61 return (PVOID)((ULONG_PTR)Ptr - g_pi->UserHeapDelta);
62 }
63
64 static __inline PVOID
65 DesktopPtrToUser(PVOID Ptr)
66 {
67 GetW32ThreadInfo();
68 PCLIENTINFO pci = GetWin32ClientInfo();
69 PDESKTOPINFO pdi = pci->pDeskInfo;
70
71 ASSERT(Ptr != NULL);
72 ASSERT(pdi != NULL);
73 if ((ULONG_PTR)Ptr >= (ULONG_PTR)pdi->pvDesktopBase &&
74 (ULONG_PTR)Ptr < (ULONG_PTR)pdi->pvDesktopLimit)
75 {
76 return (PVOID)((ULONG_PTR)Ptr - pci->ulClientDelta);
77 }
78 else
79 {
80 /* NOTE: This is slow as it requires a call to win32k. This should only be
81 neccessary if a thread wants to access an object on a different
82 desktop */
83 return (PVOID)NtUserGetDesktopMapping(Ptr);
84 }
85 }
86
87 static __inline PVOID
88 SharedPtrToKernel(PVOID Ptr)
89 {
90 ASSERT(Ptr != NULL);
91 ASSERT(g_pi != NULL);
92 ASSERT(g_pi->UserHeapDelta != 0);
93 return (PVOID)((ULONG_PTR)Ptr + g_pi->UserHeapDelta);
94 }
95
96 static __inline BOOL
97 IsThreadHooked(PW32THREADINFO ti)
98 {
99 return ti->Hooks != 0;
100 }
101
102 static __inline PDESKTOPINFO
103 GetThreadDesktopInfo(VOID)
104 {
105 PW32THREADINFO ti;
106 PDESKTOPINFO di = NULL;
107
108 ti = GetW32ThreadInfo();
109 if (ti != NULL)
110 di = DesktopPtrToUser(ti->Desktop);
111
112 return di;
113 }
114
115 PCALLPROC FASTCALL ValidateCallProc(HANDLE hCallProc);
116 PWINDOW FASTCALL ValidateHwnd(HWND hwnd);
117 PWINDOW FASTCALL ValidateHwndOrDesk(HWND hwnd);
118 PWINDOW FASTCALL GetThreadDesktopWnd(VOID);
119 PVOID FASTCALL ValidateHandleNoErr(HANDLE handle, UINT uType);
120 PWINDOW FASTCALL ValidateHwndNoErr(HWND hwnd);
121 VOID FASTCALL GetConnected(VOID);