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