5ccdbffb321c36baedaa47f61d9e7916a0a02fa3
[reactos.git] / reactos / sdk / include / host / typedefs.h
1 /*
2 PROJECT: ReactOS
3 LICENSE: GPL v2 or any later version
4 FILE: include/host/typedefs.h
5 PURPOSE: Type definitions and useful macros for host tools
6 COPYRIGHT: Copyright 2007 Hervé Poussineau
7 Copyright 2007 Colin Finck <mail@colinfinck.de>
8 */
9
10 #ifndef _TYPEDEFS_HOST_H
11 #define _TYPEDEFS_HOST_H
12
13 #include <assert.h>
14 #include <stdlib.h>
15 #include <limits.h>
16 #include <stdint.h>
17
18 /* Function attributes for GCC */
19 #if !defined(_MSC_VER) && !defined(__fastcall)
20 #define __fastcall __attribute__((fastcall))
21 #endif
22 #if !defined(_MSC_VER) && !defined(__cdecl)
23 #define __cdecl __attribute__((cdecl))
24 #endif
25 #if !defined(_MSC_VER) && !defined(__stdcall)
26 #define __stdcall __attribute__((stdcall))
27 #endif
28
29 /* Basic definitions */
30 #define UNIMPLEMENTED { printf("%s unimplemented\n", __FUNCTION__); exit(1); }
31 #define ASSERT(x) assert(x)
32 #define ASSERTMSG(m, x) assert(x)
33 #define DPRINT if (0) printf
34 #define DPRINT1 printf
35
36 #define NTAPI
37 #define WINAPI
38
39 #define IN
40 #define OUT
41 #define OPTIONAL
42
43 #define FALSE 0
44 #define TRUE 1
45
46 #define ANYSIZE_ARRAY 1
47
48 /* Basic types
49 Emulate a LLP64 memory model using a LP64 compiler */
50 typedef void VOID, *PVOID, *LPVOID;
51 typedef char CHAR, CCHAR, *PCHAR, *PSTR, *LPSTR;
52 typedef const char *PCSTR, *LPCSTR;
53 typedef unsigned char UCHAR, *PUCHAR, BYTE, *LPBYTE, BOOLEAN, *PBOOLEAN;
54 typedef int16_t SHORT, *PSHORT;
55 typedef uint16_t USHORT, *PUSHORT, WORD, *PWORD, *LPWORD, WCHAR, *PWCHAR, *PWSTR, *LPWSTR, UINT16;
56 typedef const uint16_t *PCWSTR, *LPCWSTR;
57 typedef int32_t INT, LONG, *PLONG, *LPLONG, BOOL, WINBOOL;
58 typedef uint32_t UINT, *PUINT, *LPUINT, ULONG, *PULONG, DWORD, *PDWORD, *LPDWORD, UINT32;
59 #if defined(_LP64) || defined(_WIN64)
60 typedef int64_t LONG_PTR, *PLONG_PTR, INT_PTR, *PINT_PTR;
61 typedef uint64_t ULONG_PTR, DWORD_PTR, *PULONG_PTR, UINT_PTR, *PUINT_PTR;
62 #else
63 typedef int32_t LONG_PTR, *PLONG_PTR, INT_PTR, *PINT_PTR;
64 typedef uint32_t ULONG_PTR, DWORD_PTR, *PULONG_PTR, UINT_PTR, *PUINT_PTR;
65 #endif
66 typedef uint64_t ULONG64, DWORD64, *PDWORD64, UINT64, ULONGLONG;
67 typedef int64_t LONGLONG, LONG64;
68 typedef float FLOAT;
69 typedef double DOUBLE;
70
71 /* Derived types */
72 typedef PVOID HANDLE;
73 #ifndef _HAVE_HKEY
74 typedef HANDLE HKEY, *PHKEY;
75 #endif
76 typedef HANDLE HMODULE, HINSTANCE;
77 typedef INT NTSTATUS, POOL_TYPE;
78 typedef LONG HRESULT;
79 typedef ULONG_PTR SIZE_T, *PSIZE_T;
80 typedef WORD LANGID;
81
82 #define MAXUSHORT USHRT_MAX
83
84 /* Widely used structures */
85 #include <pshpack4.h>
86 #ifndef _HAVE_RTL_BITMAP
87 typedef struct _RTL_BITMAP
88 {
89 ULONG SizeOfBitMap;
90 PULONG Buffer;
91 } RTL_BITMAP, *PRTL_BITMAP;
92
93 typedef struct _RTL_BITMAP_RUN
94 {
95 ULONG StartingIndex;
96 ULONG NumberOfBits;
97 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
98 #endif
99
100 #ifndef _HAVE_LARGE_INTEGER
101 typedef union _LARGE_INTEGER
102 {
103 struct
104 {
105 ULONG LowPart;
106 LONG HighPart;
107 };
108 struct
109 {
110 ULONG LowPart;
111 LONG HighPart;
112 } u;
113 LONGLONG QuadPart;
114 } LARGE_INTEGER, *PLARGE_INTEGER;
115 #endif
116
117 #ifndef _HAVE_LIST_ENTRY
118 typedef struct _LIST_ENTRY
119 {
120 struct _LIST_ENTRY *Flink;
121 struct _LIST_ENTRY *Blink;
122 } LIST_ENTRY,*PLIST_ENTRY;
123 #endif
124
125 #ifndef _HAVE_ANSI_STRING
126 typedef struct _ANSI_STRING
127 {
128 USHORT Length;
129 USHORT MaximumLength;
130 PSTR Buffer;
131 } ANSI_STRING, *PANSI_STRING;
132
133 typedef struct _UNICODE_STRING
134 {
135 USHORT Length;
136 USHORT MaximumLength;
137 PWSTR Buffer;
138 } UNICODE_STRING, *PUNICODE_STRING;
139 #endif
140
141 #include <poppack.h>
142
143 #ifndef _HAVE_LIST_ENTRY
144 /* List Functions */
145 static __inline
146 VOID
147 InitializeListHead(
148 IN PLIST_ENTRY ListHead
149 )
150 {
151 ListHead->Flink = ListHead->Blink = ListHead;
152 }
153
154 static __inline
155 VOID
156 InsertHeadList(
157 IN PLIST_ENTRY ListHead,
158 IN PLIST_ENTRY Entry
159 )
160 {
161 PLIST_ENTRY OldFlink;
162 OldFlink = ListHead->Flink;
163 Entry->Flink = OldFlink;
164 Entry->Blink = ListHead;
165 OldFlink->Blink = Entry;
166 ListHead->Flink = Entry;
167 }
168
169 static __inline
170 VOID
171 InsertTailList(
172 IN PLIST_ENTRY ListHead,
173 IN PLIST_ENTRY Entry
174 )
175 {
176 PLIST_ENTRY OldBlink;
177 OldBlink = ListHead->Blink;
178 Entry->Flink = ListHead;
179 Entry->Blink = OldBlink;
180 OldBlink->Flink = Entry;
181 ListHead->Blink = Entry;
182 }
183
184 static __inline
185 BOOLEAN
186 IsListEmpty(
187 IN const LIST_ENTRY * ListHead
188 )
189 {
190 return (BOOLEAN)(ListHead->Flink == ListHead);
191 }
192
193 static __inline
194 BOOLEAN
195 RemoveEntryList(
196 IN PLIST_ENTRY Entry)
197 {
198 PLIST_ENTRY OldFlink;
199 PLIST_ENTRY OldBlink;
200
201 OldFlink = Entry->Flink;
202 OldBlink = Entry->Blink;
203 OldFlink->Blink = OldBlink;
204 OldBlink->Flink = OldFlink;
205 return (BOOLEAN)(OldFlink == OldBlink);
206 }
207
208 static __inline
209 PLIST_ENTRY
210 RemoveHeadList(
211 IN PLIST_ENTRY ListHead)
212 {
213 PLIST_ENTRY Flink;
214 PLIST_ENTRY Entry;
215
216 Entry = ListHead->Flink;
217 Flink = Entry->Flink;
218 ListHead->Flink = Flink;
219 Flink->Blink = ListHead;
220 return Entry;
221 }
222
223 static __inline
224 PLIST_ENTRY
225 RemoveTailList(
226 IN PLIST_ENTRY ListHead)
227 {
228 PLIST_ENTRY Blink;
229 PLIST_ENTRY Entry;
230
231 Entry = ListHead->Blink;
232 Blink = Entry->Blink;
233 ListHead->Blink = Blink;
234 Blink->Flink = ListHead;
235 return Entry;
236 }
237 #endif
238
239 #ifndef _HAVE_ANSI_STRING
240 typedef const UNICODE_STRING *PCUNICODE_STRING;
241 #endif
242
243 /* Widely used macros */
244 #define LOBYTE(w) ((BYTE)(w))
245 #define HIBYTE(w) ((BYTE)(((WORD)(w)>>8)&0xFF))
246 #define LOWORD(l) ((WORD)((DWORD_PTR)(l)))
247 #define HIWORD(l) ((WORD)(((DWORD_PTR)(l)>>16)&0xFFFF))
248 #define MAKEWORD(a,b) ((WORD)(((BYTE)(a))|(((WORD)((BYTE)(b)))<<8)))
249 #define MAKELONG(a,b) ((LONG)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16)))
250
251 #define MAXULONG 0xFFFFFFFF
252
253 #define NT_SUCCESS(x) ((x)>=0)
254 #if !defined(__GNUC__)
255 #define FIELD_OFFSET(t,f) ((LONG)(LONG_PTR)&(((t*) 0)->f))
256 #else
257 #define FIELD_OFFSET(t,f) ((LONG)__builtin_offsetof(t,f))
258 #endif
259 #define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
260 #define CONTAINING_RECORD(address, type, field) ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
261
262 #define RtlZeroMemory(Destination, Length) memset(Destination, 0, Length)
263 #define RtlCopyMemory(Destination, Source, Length) memcpy(Destination, Source, Length)
264 #define RtlMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length)
265
266 #define MAKELANGID(p,s) ((((WORD)(s))<<10)|(WORD)(p))
267 #define PRIMARYLANGID(l) ((WORD)(l)&0x3ff)
268 #define SUBLANGID(l) ((WORD)(l)>>10)
269 #define SUBLANG_NEUTRAL 0x00
270
271 /* Prevent inclusion of some other headers */
272 #define __INTERNAL_DEBUG
273 #define RTL_H
274
275 #endif
276