STDCALL and CDECL are now defined conditionally to be overridable
[reactos.git] / include / ntos / types.h
1 /*
2  * COPYRIGHT:    See COPYING in the top level directory
3  * PROJECT:      ReactOS kernel
4  * FILE:         include/types.h
5  * PURPOSE:      Types used by all the parts of the system
6  * PROGRAMMER:   David Welch <welch@cwcom.net>
7  * DEFINES:      _WIN64: 64-bit architecture
8  *               _WIN32: 32-bit architecture (default)
9  * UPDATE HISTORY:
10  *               27/06/00: Created
11  *               01/05/01: Portabillity changes
12  */
13
14 #ifndef __INCLUDE_TYPES_H
15 #define __INCLUDE_TYPES_H
16
17 /* Fixed precision types */
18 typedef signed char         INT8, *PINT8;
19 typedef signed short        INT16, *PINT16;
20 typedef signed int          INT32, *PINT32;
21 typedef signed long long    INT64, *PINT64;
22 typedef unsigned char       UINT8, *PUINT8;
23 typedef unsigned short      UINT16, *PUINT16;
24 typedef unsigned int        UINT32, *PUINT32;
25 typedef unsigned long long  UINT64, *PUINT64;
26
27 typedef signed long int     LONG32, *PLONG32;
28 typedef unsigned long int   ULONG32, *PULONG32;
29 typedef unsigned long int   DWORD32, *PDWORD32;
30
31
32 #ifdef _WIN64
33
34 /* 64-bit architecture */
35
36 typedef INT64 INT, *PINT;
37 typedef LONG64 LONG, *PLONG;
38 typedef DWORD64 DWORD, *PDWORD;
39 typedef UINT64 UINT, *PUINT;
40 typedef ULONG64 ULONG, *PULONG;
41
42 /* Pointer precision types */
43 typedef long long           INT_PTR, *PINT_PTR;
44 typedef unsigned long long  UINT_PTR, *PUINT_PTR;
45 typedef long long           LONG_PTR, *PLONG_PTR;
46 typedef unsigned long long  ULONG_PTR, *PULONG_PTR;
47 typedef unsigned long long  HANDLE_PTR;
48 typedef unsigned int        UHALF_PTR, *PUHALF_PTR;
49 typedef int                 HALF_PTR, *PHALF_PTR;
50
51 #else /* _WIN64 */
52
53 /* 32-bit architecture */
54
55 typedef INT32 INT, *PINT;
56 typedef LONG32 LONG, *PLONG;
57 typedef DWORD32 DWORD, *PDWORD;
58 typedef UINT32 UINT, *PUINT;
59 typedef ULONG32 ULONG, *PULONG;
60
61
62 /* Pointer precision types */
63 typedef int               INT_PTR, *PINT_PTR;
64 typedef unsigned int      UINT_PTR, *PUINT_PTR;
65 typedef long              LONG_PTR, *PLONG_PTR;
66 typedef unsigned long     ULONG_PTR, *PULONG_PTR;
67 typedef unsigned short    UHALF_PTR, *PUHALF_PTR;
68 typedef short             HALF_PTR, *PHALF_PTR;
69 typedef unsigned long     HANDLE_PTR;
70
71 #endif /* _WIN64 */
72
73 typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
74
75 typedef long long LONG64, *PLONG64;
76
77 typedef unsigned long long ULONG64, *PULONG64;
78 typedef unsigned long long DWORD64, *PDWORD64;
79
80
81 typedef unsigned char UCHAR;
82 typedef unsigned short USHORT;
83 /* Yes, W32 uses 16-bit wchar_t requiring GCC -fshort-wchar option */
84 typedef unsigned short WCHAR;
85 typedef unsigned short WORD;
86 typedef int BOOL;
87 typedef unsigned char BOOLEAN;
88 typedef BOOLEAN* PBOOLEAN;
89 typedef unsigned short *LPWSTR;
90 typedef unsigned short *PWSTR;
91 typedef unsigned char *PUCHAR;
92 typedef unsigned short *PUSHORT;
93 typedef void *PVOID;
94 typedef unsigned char BYTE;
95 typedef void *LPVOID;
96 typedef float *PFLOAT;
97 typedef unsigned short *PWCH;
98 typedef unsigned short *PWORD;
99
100 typedef long long LONGLONG;
101 typedef unsigned long long ULONGLONG;
102 typedef long long *PLONGLONG;
103 typedef unsigned long long *PULONGLONG;
104
105 /* Check VOID before defining CHAR, SHORT */
106 #ifndef VOID
107 #define VOID void
108 typedef char CHAR;
109 typedef short SHORT;
110 #endif
111
112 typedef CHAR *PCHAR;
113 typedef CHAR *PCH;
114 typedef void *HANDLE;
115 typedef char CCHAR;
116 typedef CCHAR *PCCHAR;
117
118
119 #ifndef FALSE
120 #define FALSE 0
121 #endif
122 #ifndef TRUE
123 #define TRUE 1
124 #endif
125
126 #ifndef NULL
127 #ifdef __cplusplus
128 #define NULL 0
129 #else
130 #define NULL ((void*)0)
131 #endif /* __cplusplus */
132 #endif /* NULL */
133
134 typedef const unsigned short *PCWSTR;
135
136 typedef const char* PCSZ;
137
138 typedef union _LARGE_INTEGER
139 {
140   struct
141   {
142     DWORD LowPart;
143     LONG  HighPart;
144   } u;
145 #ifdef ANONYMOUSUNIONS
146   struct
147   {
148     DWORD LowPart;
149     LONG  HighPart;
150   };
151 #endif /* ANONYMOUSUNIONS */
152   LONGLONG QuadPart;
153 } LARGE_INTEGER, *PLARGE_INTEGER;
154
155 typedef union _ULARGE_INTEGER
156 {
157   struct
158   {
159     DWORD LowPart;
160     DWORD HighPart;
161   } u;
162 #ifdef ANONYMOUSUNIONS
163   struct
164   {
165     DWORD LowPart;
166     DWORD HighPart;
167   };
168 #endif /* ANONYMOUSUNIONS */
169   ULONGLONG QuadPart;
170 } ULARGE_INTEGER, *PULARGE_INTEGER;
171
172 typedef struct _FILETIME
173 {
174    DWORD dwLowDateTime;
175    DWORD dwHighDateTime;
176 } FILETIME, *LPFILETIME, *PFILETIME;
177
178 #define CONST const
179
180 #ifdef i386
181 #ifndef STDCALL
182 #define STDCALL     __attribute__ ((stdcall))
183 #endif
184 #ifndef CDECL
185 #define CDECL       __attribute((cdecl))
186 #endif
187 #define CALLBACK    WINAPI
188 #define PASCAL      WINAPI
189 #else
190 #ifndef STDCALL
191 #define STDCALL
192 #endif
193 #ifndef CDECL
194 #define CDECL
195 #endif
196 #define CALLBACK
197 #define PASCAL
198 #endif
199
200 typedef struct _LIST_ENTRY {
201   struct _LIST_ENTRY *Flink;
202   struct _LIST_ENTRY *Blink;
203 } LIST_ENTRY, *PLIST_ENTRY;
204
205 typedef struct _SINGLE_LIST_ENTRY {
206   struct _SINGLE_LIST_ENTRY *Next;
207 } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
208
209 typedef DWORD STDCALL (*PTHREAD_START_ROUTINE) (LPVOID);
210 typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
211
212 typedef unsigned short *PWCHAR;
213
214 #ifdef __PPC__
215 #define CONTEXT_CONTROL         1L
216 #define CONTEXT_FLOATING_POINT  2L
217 #define CONTEXT_INTEGER         4L
218 #define CONTEXT_DEBUG_REGISTERS 8L
219
220 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
221 #define CONTEXT_DEBUGGER (CONTEXT_FULL)
222
223 #else /* x86 */
224 /* The doc refered me to winnt.h, so I had to look... */
225 #define SIZE_OF_80387_REGISTERS      80
226
227 /* Values for contextflags */
228 #define CONTEXT_i386    0x10000
229 #define CONTEXT_CONTROL         (CONTEXT_i386 | 1)      
230 #define CONTEXT_INTEGER         (CONTEXT_i386 | 2)      
231 #define CONTEXT_SEGMENTS        (CONTEXT_i386 | 4)      
232 #define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 8)      
233 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x10)
234 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
235
236 /* our own invention */
237 #define FLAG_TRACE_BIT 0x100
238 #define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
239
240 #endif
241
242 typedef struct _FLOATING_SAVE_AREA {
243     DWORD   ControlWord;
244     DWORD   StatusWord;
245     DWORD   TagWord;
246     DWORD   ErrorOffset;
247     DWORD   ErrorSelector;
248     DWORD   DataOffset;
249     DWORD   DataSelector;
250     BYTE    RegisterArea[80];
251     DWORD   Cr0NpxState;
252 } FLOATING_SAVE_AREA;
253
254 typedef struct _CONTEXT_X86 {
255     DWORD ContextFlags;
256
257     DWORD   Dr0;
258     DWORD   Dr1;
259     DWORD   Dr2;
260     DWORD   Dr3;
261     DWORD   Dr6;
262     DWORD   Dr7;
263
264     FLOATING_SAVE_AREA FloatSave;
265
266     DWORD   SegGs;
267     DWORD   SegFs;
268     DWORD   SegEs;
269     DWORD   SegDs;
270
271     DWORD   Edi;
272     DWORD   Esi;
273     DWORD   Ebx;
274     DWORD   Edx;
275     DWORD   Ecx;
276     DWORD   Eax;
277
278     DWORD   Ebp;
279     DWORD   Eip;
280     DWORD   SegCs;
281     DWORD   EFlags;
282     DWORD   Esp;
283     DWORD   SegSs;
284 } CONTEXT_X86, *PCONTEXT_X86, *LPCONTEXT_X86;
285
286 typedef struct _CONTEXT_PPC
287   {
288     /* Floating point registers returned when CONTEXT_FLOATING_POINT is set */
289     double Fpr0;
290     double Fpr1;
291     double Fpr2;
292     double Fpr3;
293     double Fpr4;
294     double Fpr5;
295     double Fpr6;
296     double Fpr7;
297     double Fpr8;
298     double Fpr9;
299     double Fpr10;
300     double Fpr11;
301     double Fpr12;
302     double Fpr13;
303     double Fpr14;
304     double Fpr15;
305     double Fpr16;
306     double Fpr17;
307     double Fpr18;
308     double Fpr19;
309     double Fpr20;
310     double Fpr21;
311     double Fpr22;
312     double Fpr23;
313     double Fpr24;
314     double Fpr25;
315     double Fpr26;
316     double Fpr27;
317     double Fpr28;
318     double Fpr29;
319     double Fpr30;
320     double Fpr31;
321     double Fpscr;
322
323     /* Integer registers returned when CONTEXT_INTEGER is set.  */
324     DWORD Gpr0;
325     DWORD Gpr1;
326     DWORD Gpr2;
327     DWORD Gpr3;
328     DWORD Gpr4;
329     DWORD Gpr5;
330     DWORD Gpr6;
331     DWORD Gpr7;
332     DWORD Gpr8;
333     DWORD Gpr9;
334     DWORD Gpr10;
335     DWORD Gpr11;
336     DWORD Gpr12;
337     DWORD Gpr13;
338     DWORD Gpr14;
339     DWORD Gpr15;
340     DWORD Gpr16;
341     DWORD Gpr17;
342     DWORD Gpr18;
343     DWORD Gpr19;
344     DWORD Gpr20;
345     DWORD Gpr21;
346     DWORD Gpr22;
347     DWORD Gpr23;
348     DWORD Gpr24;
349     DWORD Gpr25;
350     DWORD Gpr26;
351     DWORD Gpr27;
352     DWORD Gpr28;
353     DWORD Gpr29;
354     DWORD Gpr30;
355     DWORD Gpr31;
356
357     DWORD Cr;                   /* Condition register */
358     DWORD Xer;                  /* Fixed point exception register */
359
360     /* The following are set when CONTEXT_CONTROL is set.  */
361     DWORD Msr;                  /* Machine status register */
362     DWORD Iar;                  /* Instruction address register */
363     DWORD Lr;                   /* Link register */
364     DWORD Ctr;                  /* Control register */
365
366     /* Control which context values are returned */
367     DWORD ContextFlags;
368     DWORD Fill[3];
369
370     /* Registers returned if CONTEXT_DEBUG_REGISTERS is set.  */
371     DWORD Dr0;                          /* Breakpoint Register 1 */
372     DWORD Dr1;                          /* Breakpoint Register 2 */
373     DWORD Dr2;                          /* Breakpoint Register 3 */
374     DWORD Dr3;                          /* Breakpoint Register 4 */
375     DWORD Dr4;                          /* Breakpoint Register 5 */
376     DWORD Dr5;                          /* Breakpoint Register 6 */
377     DWORD Dr6;                          /* Debug Status Register */
378     DWORD Dr7;                          /* Debug Control Register */
379 } CONTEXT_PPC, *PCONTEXT_PPC, *LPCONTEXT_PPC;
380
381 #ifdef __i386__
382
383 typedef CONTEXT_X86 CONTEXT;
384 typedef PCONTEXT_X86 PCONTEXT;
385 typedef LPCONTEXT_X86 LPCONTEXT;
386
387 #else /* __ppc__ */
388
389 typedef CONTEXT_PPC CONTEXT;
390 typedef PCONTEXT_PPC PCONTEXT;
391 typedef LPCONTEXT_PPC LPCONTEXT;
392
393 #endif
394
395 typedef HANDLE *PHANDLE;
396
397 typedef struct value_ent {
398     LPWSTR ve_valuename;
399     DWORD  ve_valuelen;
400     DWORD  ve_valueptr;
401     DWORD  ve_type;
402 } WVALENT, *PWVALENT;
403
404
405 typedef const void *LPCVOID;
406 typedef BYTE *LPBYTE, *PBYTE;
407
408 typedef BOOL *PBOOL;
409
410 typedef DWORD LCID;
411 typedef DWORD *PLCID;
412
413 typedef const char *LPCSTR;
414
415 typedef char *LPSTR;
416
417 typedef const unsigned short *LPCWSTR;
418
419 typedef unsigned short RTL_ATOM;
420 typedef unsigned short *PRTL_ATOM;
421 typedef WORD ATOM;
422
423 typedef struct _COORD {
424   SHORT X;
425   SHORT Y;
426 } COORD;
427
428 typedef struct _SMALL_RECT {
429   SHORT Left;
430   SHORT Top;
431   SHORT Right;
432   SHORT Bottom;
433 } SMALL_RECT, *PSMALL_RECT;
434
435
436 typedef VOID STDCALL
437 (*PTIMERAPCROUTINE)(
438         LPVOID lpArgToCompletionRoutine,
439         DWORD dwTimerLowValue,
440         DWORD dwTimerHighValue
441         );
442
443 #include "except.h"
444
445 #endif /* __INCLUDE_TYPES_H */