bbee9b8a26653b34ea72c4f6e01d8c65d18234ec
[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 #define EXPORTED __declspec(dllexport)
18 #define IMPORTED __declspec(dllimport)
19
20 #include <basetsd.h>
21
22 #ifdef __GNUC__
23 #define STDCALL_FUNC STDCALL
24 #else
25 #define STDCALL_FUNC(a) (__stdcall a )
26 #endif /*__GNUC__*/
27
28 /* Fixed precision types */
29 typedef signed char         INT8, *PINT8;
30 typedef signed short        INT16, *PINT16;
31
32 typedef unsigned char       UINT8, *PUINT8;
33 typedef unsigned short      UINT16, *PUINT16;
34
35
36 /* Check VOID before defining CHAR, SHORT */
37 #ifndef VOID
38 #define VOID void
39 typedef char CHAR;
40 typedef short SHORT;
41 #endif
42
43
44 #ifndef __USE_W32API
45
46 #ifdef i386
47 #ifdef __GNUC__
48 #ifndef STDCALL
49 #define STDCALL     __attribute__ ((stdcall))
50 #endif
51 #ifndef CDECL
52 #define CDECL       __attribute__ ((cdecl))
53 #endif
54 #else
55 #define STDCALL __stdcall
56 #define CDECL __cdecl
57 #endif
58 #define CALLBACK    WINAPI
59 #define PASCAL      WINAPI
60 #else
61
62 #ifdef __GNUC__
63 #define STDCALL
64 #define CDECL
65 #define CALLBACK
66 #define PASCAL
67 #else
68 #define STDCALL __stdcall
69 #define CDECL __cdecl
70 #define CALLBACK
71 #define PASCAL
72 #endif /*__GNUC__*/
73
74 #endif /*i386*/
75
76 typedef INT32 INT, *PINT;
77 typedef LONG32 LONG, *PLONG;
78 typedef ULONG32 DWORD, *PDWORD;
79 typedef UINT32 UINT, *PUINT;
80 typedef ULONG32 ULONG, *PULONG;
81
82 #ifndef _WCHAR_T_
83 #define _WCHAR_T_
84 #define _WCHAR_T
85 #define _WCHAR_T_DEFINED
86 #ifndef __WCHAR_TYPE__
87 #define __WCHAR_TYPE__      short unsigned int
88 #endif
89
90 #ifndef __cplusplus
91 typedef __WCHAR_TYPE__      wchar_t;
92 #endif  /* C++ */
93
94 #endif  /* wchar_t not already defined */
95
96
97 /* #ifndef __cplusplus
98 #ifndef _WCHAR_T_DEFINED
99 #define _WCHAR_T_DEFINED
100 typedef unsigned short wchar_t;
101 #endif
102 #endif
103 */
104
105 typedef unsigned char UCHAR;
106 typedef unsigned short USHORT;
107 typedef wchar_t WCHAR;
108 typedef unsigned short WORD;
109 typedef int BOOL;
110 typedef unsigned char BOOLEAN;
111 typedef BOOLEAN* PBOOLEAN;
112 typedef wchar_t *LPWSTR;
113 typedef wchar_t *PWSTR;
114 typedef unsigned char *PUCHAR;
115 typedef unsigned short *PUSHORT;
116 typedef void *PVOID;
117 typedef unsigned char BYTE;
118 typedef void *LPVOID;
119 typedef float *PFLOAT;
120 typedef wchar_t *PWCH;
121 typedef unsigned short *PWORD;
122
123 #include <msvcrt/crttypes.h> /* for definition of LONGLONG, PLONGLONG etc */
124
125 typedef const void *LPCVOID;
126 typedef BYTE *LPBYTE, *PBYTE;
127 typedef BOOL *PBOOL;
128 typedef DWORD LCID;
129 typedef DWORD *PLCID;
130 typedef const char *LPCSTR;
131 typedef char *LPSTR;
132 typedef const wchar_t *LPCWSTR;
133 typedef CHAR *PCHAR;
134 typedef CHAR *PCH;
135 typedef void *HANDLE;
136 typedef HANDLE *PHANDLE;
137 typedef char CCHAR;
138 typedef CCHAR *PCCHAR;
139 typedef wchar_t *PWCHAR;
140 typedef ULONG WAIT_TYPE;
141 typedef USHORT CSHORT;
142 typedef const wchar_t *PCWSTR;
143 typedef const char* PCSZ;
144
145 #ifdef __GNUC__
146 typedef DWORD STDCALL (*PTHREAD_START_ROUTINE) (LPVOID);
147 #else
148 typedef DWORD (STDCALL *PTHREAD_START_ROUTINE) (LPVOID);
149 #endif /*__GNUC__*/
150
151 typedef union _LARGE_INTEGER
152 {
153   struct
154   {
155     DWORD LowPart;
156     LONG  HighPart;
157   } u;
158 #ifdef ANONYMOUSUNIONS
159   struct
160   {
161     DWORD LowPart;
162     LONG  HighPart;
163   };
164 #endif /* ANONYMOUSUNIONS */
165   LONGLONG QuadPart;
166 } LARGE_INTEGER, *PLARGE_INTEGER;
167
168 typedef union _ULARGE_INTEGER
169 {
170   struct
171   {
172     DWORD LowPart;
173     DWORD HighPart;
174   } u;
175 #ifdef ANONYMOUSUNIONS
176   struct
177   {
178     DWORD LowPart;
179     DWORD HighPart;
180   };
181 #endif /* ANONYMOUSUNIONS */
182   ULONGLONG QuadPart;
183 } ULARGE_INTEGER, *PULARGE_INTEGER;
184
185
186 /* 
187  * Moved here by AG
188  * typedef ULARGE_INTEGER TIME, *PTIME;
189  */
190
191 typedef struct _FILETIME
192 {
193   DWORD dwLowDateTime;
194   DWORD dwHighDateTime;
195 } FILETIME, *LPFILETIME, *PFILETIME;
196
197 typedef struct _LIST_ENTRY
198 {
199   struct _LIST_ENTRY *Flink;
200   struct _LIST_ENTRY *Blink;
201 } LIST_ENTRY, *PLIST_ENTRY;
202
203 typedef struct _SINGLE_LIST_ENTRY
204 {
205   struct _SINGLE_LIST_ENTRY *Next;
206 } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
207
208 #define SLIST_ENTRY SINGLE_LIST_ENTRY
209 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
210 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
211
212 typedef struct _UNICODE_STRING
213 {
214   USHORT Length;
215   USHORT MaximumLength;
216   PWSTR Buffer;
217 } UNICODE_STRING, *PUNICODE_STRING;
218
219 typedef const UNICODE_STRING* PCUNICODE_STRING;
220
221 #define UNICODE_NULL ((WCHAR)0)
222
223 typedef struct _FLOATING_SAVE_AREA
224 {
225   DWORD   ControlWord;
226   DWORD   StatusWord;
227   DWORD   TagWord;
228   DWORD   ErrorOffset;
229   DWORD   ErrorSelector;
230   DWORD   DataOffset;
231   DWORD   DataSelector;
232   BYTE    RegisterArea[80];
233   DWORD   Cr0NpxState;
234 } FLOATING_SAVE_AREA;
235
236 typedef unsigned short RTL_ATOM;
237 typedef unsigned short *PRTL_ATOM;
238
239 #else /* __USE_W32API */
240
241 #include <windows.h>
242
243 #endif /* __USE_W32API */
244
245 #ifndef FALSE
246 #define FALSE 0
247 #endif
248 #ifndef TRUE
249 #define TRUE 1
250 #endif
251
252 #ifndef NULL
253 #ifdef __cplusplus
254 #define NULL 0
255 #else
256 #define NULL ((void*)0)
257 #endif /* __cplusplus */
258 #endif /* NULL */
259
260 #define CONST const
261
262 #ifdef __PPC__
263 #define CONTEXT_CONTROL         1L
264 #define CONTEXT_FLOATING_POINT  2L
265 #define CONTEXT_INTEGER         4L
266 #define CONTEXT_DEBUG_REGISTERS 8L
267
268 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
269 #define CONTEXT_DEBUGGER (CONTEXT_FULL)
270
271 #else /* x86 */
272
273 #define SIZE_OF_80387_REGISTERS      80
274
275 /* Values for contextflags */
276 #define CONTEXT_i386    0x10000
277
278 #ifndef __USE_W32API
279
280 #define CONTEXT_CONTROL         (CONTEXT_i386 | 1)
281 #define CONTEXT_INTEGER         (CONTEXT_i386 | 2)
282 #define CONTEXT_SEGMENTS        (CONTEXT_i386 | 4)
283 #define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 8)
284 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x10)
285 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
286
287 #endif /* !__USE_W32API */
288
289 /* our own invention */
290 #define FLAG_TRACE_BIT 0x100
291 #define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
292
293 #endif
294
295 typedef struct _CONTEXT_X86
296 {
297   DWORD ContextFlags;
298
299   DWORD   Dr0;
300   DWORD   Dr1;
301   DWORD   Dr2;
302   DWORD   Dr3;
303   DWORD   Dr6;
304   DWORD   Dr7;
305
306   FLOATING_SAVE_AREA FloatSave;
307
308   DWORD   SegGs;
309   DWORD   SegFs;
310   DWORD   SegEs;
311   DWORD   SegDs;
312
313   DWORD   Edi;
314   DWORD   Esi;
315   DWORD   Ebx;
316   DWORD   Edx;
317   DWORD   Ecx;
318   DWORD   Eax;
319
320   DWORD   Ebp;
321   DWORD   Eip;
322   DWORD   SegCs;
323   DWORD   EFlags;
324   DWORD   Esp;
325   DWORD   SegSs;
326 } CONTEXT_X86, *PCONTEXT_X86, *LPCONTEXT_X86;
327
328 typedef struct _CONTEXT_PPC
329 {
330   /* Floating point registers returned when CONTEXT_FLOATING_POINT is set */
331   double Fpr0;
332   double Fpr1;
333   double Fpr2;
334   double Fpr3;
335   double Fpr4;
336   double Fpr5;
337   double Fpr6;
338   double Fpr7;
339   double Fpr8;
340   double Fpr9;
341   double Fpr10;
342   double Fpr11;
343   double Fpr12;
344   double Fpr13;
345   double Fpr14;
346   double Fpr15;
347   double Fpr16;
348   double Fpr17;
349   double Fpr18;
350   double Fpr19;
351   double Fpr20;
352   double Fpr21;
353   double Fpr22;
354   double Fpr23;
355   double Fpr24;
356   double Fpr25;
357   double Fpr26;
358   double Fpr27;
359   double Fpr28;
360   double Fpr29;
361   double Fpr30;
362   double Fpr31;
363   double Fpscr;
364
365   /* Integer registers returned when CONTEXT_INTEGER is set. */
366   DWORD Gpr0;
367   DWORD Gpr1;
368   DWORD Gpr2;
369   DWORD Gpr3;
370   DWORD Gpr4;
371   DWORD Gpr5;
372   DWORD Gpr6;
373   DWORD Gpr7;
374   DWORD Gpr8;
375   DWORD Gpr9;
376   DWORD Gpr10;
377   DWORD Gpr11;
378   DWORD Gpr12;
379   DWORD Gpr13;
380   DWORD Gpr14;
381   DWORD Gpr15;
382   DWORD Gpr16;
383   DWORD Gpr17;
384   DWORD Gpr18;
385   DWORD Gpr19;
386   DWORD Gpr20;
387   DWORD Gpr21;
388   DWORD Gpr22;
389   DWORD Gpr23;
390   DWORD Gpr24;
391   DWORD Gpr25;
392   DWORD Gpr26;
393   DWORD Gpr27;
394   DWORD Gpr28;
395   DWORD Gpr29;
396   DWORD Gpr30;
397   DWORD Gpr31;
398
399   DWORD Cr;     /* Condition register */
400   DWORD Xer;    /* Fixed point exception register */
401
402   /* The following are set when CONTEXT_CONTROL is set. */
403   DWORD Msr;    /* Machine status register */
404   DWORD Iar;    /* Instruction address register */
405   DWORD Lr;     /* Link register */
406   DWORD Ctr;    /* Control register */
407
408   /* Control which context values are returned */
409   DWORD ContextFlags;
410   DWORD Fill[3];
411
412   /* Registers returned if CONTEXT_DEBUG_REGISTERS is set. */
413   DWORD Dr0;    /* Breakpoint Register 1 */
414   DWORD Dr1;    /* Breakpoint Register 2 */
415   DWORD Dr2;    /* Breakpoint Register 3 */
416   DWORD Dr3;    /* Breakpoint Register 4 */
417   DWORD Dr4;    /* Breakpoint Register 5 */
418   DWORD Dr5;    /* Breakpoint Register 6 */
419   DWORD Dr6;    /* Debug Status Register */
420   DWORD Dr7;    /* Debug Control Register */
421 } CONTEXT_PPC, *PCONTEXT_PPC, *LPCONTEXT_PPC;
422
423 typedef struct value_ent
424 {
425   LPWSTR ve_valuename;
426   DWORD  ve_valuelen;
427   DWORD  ve_valueptr;
428   DWORD  ve_type;
429 } WVALENT, *PWVALENT;
430
431 /* #include "except.h" */
432
433 #ifndef __USE_W32API
434
435 typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
436
437 #ifdef __i386__
438
439 typedef CONTEXT_X86 CONTEXT;
440 typedef PCONTEXT_X86 PCONTEXT;
441 typedef LPCONTEXT_X86 LPCONTEXT;
442
443 #else /* __ppc__ */
444
445 typedef CONTEXT_PPC CONTEXT;
446 typedef PCONTEXT_PPC PCONTEXT;
447 typedef LPCONTEXT_PPC LPCONTEXT;
448
449 #endif
450
451 typedef WORD ATOM;
452
453 typedef struct _COORD
454 {
455   SHORT X;
456   SHORT Y;
457 } COORD;
458
459 typedef struct _SMALL_RECT
460 {
461   SHORT Left;
462   SHORT Top;
463   SHORT Right;
464   SHORT Bottom;
465 } SMALL_RECT, *PSMALL_RECT;
466
467
468 #ifdef __GNUC__
469 typedef VOID STDCALL
470 (*PTIMERAPCROUTINE)(
471         LPVOID lpArgToCompletionRoutine,
472         DWORD dwTimerLowValue,
473         DWORD dwTimerHighValue
474         );
475 #else
476 typedef VOID
477 (STDCALL *PTIMERAPCROUTINE)(
478         LPVOID lpArgToCompletionRoutine,
479         DWORD dwTimerLowValue,
480         DWORD dwTimerHighValue
481         );
482 #endif /*__GNUC__*/
483
484 #include "except.h"
485
486 #else /* __USE_W32API */
487
488 typedef LPTHREAD_START_ROUTINE PTHREAD_START_ROUTINE;
489
490 #include <ddk/ntapi.h>
491
492 #endif /* __USE_W32API */
493
494 typedef struct _ADDRESS_RANGE
495 {
496    ULONG BaseAddrLow;
497    ULONG BaseAddrHigh;
498    ULONG LengthLow;
499    ULONG LengthHigh;
500    ULONG Type;
501 } ADDRESS_RANGE, *PADDRESS_RANGE;
502
503 #define MB_FLAGS_MEM_INFO         (0x1)
504 #define MB_FLAGS_BOOT_DEVICE      (0x2)
505 #define MB_FLAGS_COMMAND_LINE     (0x4)
506 #define MB_FLAGS_MODULE_INFO      (0x8)
507 #define MB_FLAGS_AOUT_SYMS        (0x10)
508 #define MB_FLAGS_ELF_SYMS         (0x20)
509 #define MB_FLAGS_MMAP_INFO        (0x40)
510 #define MB_FLAGS_DRIVES_INFO      (0x80)
511 #define MB_FLAGS_CONFIG_TABLE     (0x100)
512 #define MB_FLAGS_BOOT_LOADER_NAME (0x200)
513 #define MB_FLAGS_APM_TABLE        (0x400)
514 #define MB_FLAGS_GRAPHICS_TABLE   (0x800)
515
516 typedef struct _LOADER_MODULE
517 {
518    ULONG ModStart;
519    ULONG ModEnd;
520    ULONG String;
521    ULONG Reserved;
522 } LOADER_MODULE, *PLOADER_MODULE;
523
524 typedef struct _LOADER_PARAMETER_BLOCK
525 {
526    ULONG Flags;
527    ULONG MemLower;
528    ULONG MemHigher;
529    ULONG BootDevice;
530    ULONG CommandLine;
531    ULONG ModsCount;
532    ULONG ModsAddr;
533    UCHAR Syms[12];
534    ULONG MmapLength;
535    ULONG MmapAddr;
536    ULONG DrivesCount;
537    ULONG DrivesAddr;
538    ULONG ConfigTable;
539    ULONG BootLoaderName;
540 } LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
541
542 typedef enum _KAPC_ENVIRONMENT
543 {
544   OriginalApcEnvironment,
545   AttachedApcEnvironment,
546   CurrentApcEnvironment
547 } KAPC_ENVIRONMENT;
548
549 /* FIXME: Are these official values ?? */
550 #define STATUS_FS_QUERY_REQUIRED                    ((NTSTATUS)0xC1000001)
551 #define STATUS_HANDLE_NOT_WAITABLE                  ((NTSTATUS)0xC1000002)
552 #define STATUS_OBJECT_FILE_MISMATCH                 ((NTSTATUS)0xC1000003)
553 #define STATUS_INVALID_PARAMETER_MAX                ((NTSTATUS)0xC1000004)
554 #define STATUS_CONFLICTING_ADDRESS                  ((NTSTATUS)0xC1000005)
555 #define STATUS_NO_MEDIA_IN_DRIVE                    ((NTSTATUS)0xC1000006)
556
557 #define NTSTAT_SEVERITY_SHIFT 30
558 #define NTSTAT_SEVERITY_MASK  0x00000003
559 #define NTSTAT_FACILITY_SHIFT 16
560 #define NTSTAT_FACILITY_MASK  0x00000FFF
561 #define NTSTAT_CUSTOMER_MASK  0x20000000
562
563 #define NT_SEVERITY(StatCode) (((StatCode) >> NTSTAT_SEVERITY_SHIFT) & NTSTAT_SEVERITY_MASK)
564 #define NT_FACILITY(StatCode) (((StatCode) >> NTSTAT_FACILITY_SHIFT) & NTSTAT_FACILITY_MASK)
565 #define NT_CUSTOMER(StatCode) ((StatCode) & NTSTAT_CUSTOMER_MASK)
566
567 #endif /* __INCLUDE_TYPES_H */