[NDK]
[reactos.git] / reactos / subsystems / win32 / win32k / pch.h
1 #ifndef __W32K_H
2 #define __W32K_H
3 /*
4 * COPYRIGHT: See COPYING in the top level directory
5 * PROJECT: ReactOS Graphics Subsystem
6 * FILE: subsys/win32k/w32k.h
7 * PURPOSE: Main Win32K Header
8 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
9 */
10
11 /* INCLUDES ******************************************************************/
12
13 #define _NO_COM
14
15 /* DDK/NDK/SDK Headers */
16 #undef NTDDI_VERSION
17 #define NTDDI_VERSION NTDDI_WS03SP1
18 #include <ntddk.h>
19 #include <ntddmou.h>
20 #include <ntifs.h>
21 #include <tvout.h>
22 #include <ntndk.h>
23 #include <ntstrsafe.h>
24
25 /* Win32 Headers */
26 /* FIXME: Defines in winbase.h that we need... */
27 typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
28 #define WINBASEAPI
29 #define STARTF_USESIZE 2
30 #define STARTF_USEPOSITION 4
31 #include <stdarg.h>
32 #include <windef.h>
33
34 /* Avoid type casting, by defining RECT to RECTL */
35 #define RECT RECTL
36 #define PRECT PRECTL
37 #define LPRECT LPRECTL
38 #define LPCRECT LPCRECTL
39 #define POINT POINTL
40 #define LPPOINT PPOINTL
41 #define PPOINT PPOINTL
42
43 #include <winerror.h>
44 #include <wingdi.h>
45 #define NT_BUILD_ENVIRONMENT
46 #include <winddi.h>
47 #include <winuser.h>
48 #include <prntfont.h>
49 #include <dde.h>
50 #include <wincon.h>
51 #define _NOCSECT_TYPE
52 #include <ddrawi.h>
53
54 /* SEH Support with PSEH */
55 #include <pseh/pseh2.h>
56
57 /* CSRSS Header */
58 #include <csrss/csrss.h>
59
60 /* Public Win32K Headers */
61 #include <win32k/callback.h>
62 #include <win32k/ntusrtyp.h>
63 #include <win32k/ntuser.h>
64 #include <win32k/ntgdityp.h>
65 #include <win32k/ntgdibad.h>
66 #include <ntgdi.h>
67
68 /* Undocumented user definitions */
69 #include <undocuser.h>
70
71 /* Internal Win32K Header */
72 #include "include/win32kp.h"
73
74 /* Undocumented stuff */
75 typedef DRIVEROBJ *PDRIVEROBJ;
76
77 /* User heap */
78 extern HANDLE GlobalUserHeap;
79
80 PWIN32HEAP
81 UserCreateHeap(OUT PSECTION_OBJECT *SectionObject,
82 IN OUT PVOID *SystemBase,
83 IN SIZE_T HeapSize);
84
85 static __inline PVOID
86 UserHeapAlloc(SIZE_T Bytes)
87 {
88 return RtlAllocateHeap(GlobalUserHeap,
89 HEAP_NO_SERIALIZE,
90 Bytes);
91 }
92
93 static __inline BOOL
94 UserHeapFree(PVOID lpMem)
95 {
96 return RtlFreeHeap(GlobalUserHeap,
97 HEAP_NO_SERIALIZE,
98 lpMem);
99 }
100
101 static __inline PVOID
102 UserHeapReAlloc(PVOID lpMem,
103 SIZE_T Bytes)
104 {
105 #if 0
106 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
107 return RtlReAllocateHeap(GlobalUserHeap,
108 HEAP_NO_SERIALIZE,
109 lpMem,
110 Bytes);
111 #else
112 SIZE_T PrevSize;
113 PVOID pNew;
114
115 PrevSize = RtlSizeHeap(GlobalUserHeap,
116 HEAP_NO_SERIALIZE,
117 lpMem);
118
119 if (PrevSize == Bytes)
120 return lpMem;
121
122 pNew = RtlAllocateHeap(GlobalUserHeap,
123 HEAP_NO_SERIALIZE,
124 Bytes);
125 if (pNew != NULL)
126 {
127 if (PrevSize < Bytes)
128 Bytes = PrevSize;
129
130 RtlCopyMemory(pNew,
131 lpMem,
132 Bytes);
133
134 RtlFreeHeap(GlobalUserHeap,
135 HEAP_NO_SERIALIZE,
136 lpMem);
137 }
138
139 return pNew;
140 #endif
141 }
142
143 static __inline PVOID
144 UserHeapAddressToUser(PVOID lpMem)
145 {
146 PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process();
147 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)GlobalUserHeap) +
148 (ULONG_PTR)W32Process->HeapMappings.UserMapping);
149 }
150
151 #define ROUND_DOWN(n, align) \
152 (((ULONG)n) & ~((align) - 1l))
153
154 #define ROUND_UP(n, align) \
155 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
156
157 #define LIST_FOR_EACH(elem, list, type, field) \
158 for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \
159 &(elem)->field != (list) && ((&((elem)->field)) != NULL); \
160 (elem) = CONTAINING_RECORD((elem)->field.Flink, type, field))
161
162 #define LIST_FOR_EACH_SAFE(cursor, cursor2, list, type, field) \
163 for ((cursor) = CONTAINING_RECORD((list)->Flink, type, field), \
164 (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field); \
165 &(cursor)->field != (list) && ((&((cursor)->field)) != NULL); \
166 (cursor) = (cursor2), \
167 (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field))
168
169 #endif /* __W32K_H */