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