Synchronize with trunk's revision r57629.
[reactos.git] / include / psdk / ntdef.h
1 /*
2 * ntdef.h
3 *
4 * This file is part of the ReactOS PSDK package.
5 *
6 * Contributors:
7 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
8 *
9 * THIS SOFTWARE IS NOT COPYRIGHTED
10 *
11 * This source code is offered for use in the public domain. You may
12 * use, modify or distribute it freely.
13 *
14 * This code is distributed in the hope that it will be useful but
15 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
16 * DISCLAIMED. This includes but is not limited to warranties of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 *
19 */
20
21 #ifndef _NTDEF_
22 #define _NTDEF_
23
24 /* Dependencies */
25 #include <ctype.h>
26 #include <basetsd.h>
27 #include <excpt.h>
28 #include <sdkddkver.h>
29 #include <specstrings.h>
30
31 // FIXME: Shouldn't be included!
32 #include <stdarg.h>
33 #include <string.h>
34
35 /* Helper macro to enable gcc's extension. */
36 #ifndef __GNU_EXTENSION
37 #ifdef __GNUC__
38 #define __GNU_EXTENSION __extension__
39 #else
40 #define __GNU_EXTENSION
41 #endif
42 #endif
43
44 /* Pseudo Modifiers for Input Parameters */
45
46 #ifndef IN
47 #define IN
48 #endif
49
50 #ifndef OUT
51 #define OUT
52 #endif
53
54 #ifndef OPTIONAL
55 #define OPTIONAL
56 #endif
57
58 #ifndef NOTHING
59 #define NOTHING
60 #endif
61
62 #ifndef CRITICAL
63 #define CRITICAL
64 #endif
65
66 #ifndef FAR
67 #define FAR
68 #endif
69
70
71 /* Defines the "size" of an any-size array */
72 #ifndef ANYSIZE_ARRAY
73 #define ANYSIZE_ARRAY 1
74 #endif
75
76 /* Constant modifier */
77 #ifndef CONST
78 #define CONST const
79 #endif
80
81 /* TRUE/FALSE */
82 #define FALSE 0
83 #define TRUE 1
84
85 /* NULL/NULL64 */
86 #ifndef NULL
87 #ifdef __cplusplus
88 #define NULL 0
89 #define NULL64 0
90 #else
91 #define NULL ((void *)0)
92 #define NULL64 ((void * POINTER_64)0)
93 #endif
94 #endif /* NULL */
95
96
97 //
98 // FIXME
99 // We should use the -fms-extensions compiler flag for gcc,
100 // and clean up the mess.
101 //
102 #ifndef __ANONYMOUS_DEFINED
103 #define __ANONYMOUS_DEFINED
104
105 #ifndef NONAMELESSUNION
106 #ifdef __GNUC__
107 #define _ANONYMOUS_UNION __GNU_EXTENSION
108 #define _ANONYMOUS_STRUCT __GNU_EXTENSION
109 #elif defined(__WATCOMC__) || defined(_MSC_VER)
110 #define _ANONYMOUS_UNION
111 #define _ANONYMOUS_STRUCT
112 #endif /* __GNUC__/__WATCOMC__ */
113 #endif /* NONAMELESSUNION */
114
115 #ifndef _ANONYMOUS_UNION
116 #define _ANONYMOUS_UNION
117 #define _UNION_NAME(x) x
118 #define DUMMYUNIONNAME u
119 #define DUMMYUNIONNAME2 u2
120 #define DUMMYUNIONNAME3 u3
121 #define DUMMYUNIONNAME4 u4
122 #define DUMMYUNIONNAME5 u5
123 #define DUMMYUNIONNAME6 u6
124 #define DUMMYUNIONNAME7 u7
125 #define DUMMYUNIONNAME8 u8
126 #else
127 #define _UNION_NAME(x)
128 #define DUMMYUNIONNAME
129 #define DUMMYUNIONNAME2
130 #define DUMMYUNIONNAME3
131 #define DUMMYUNIONNAME4
132 #define DUMMYUNIONNAME5
133 #define DUMMYUNIONNAME6
134 #define DUMMYUNIONNAME7
135 #define DUMMYUNIONNAME8
136 #endif
137
138 #ifndef _ANONYMOUS_STRUCT
139 #define _ANONYMOUS_STRUCT
140 #define _STRUCT_NAME(x) x
141 #define DUMMYSTRUCTNAME s
142 #define DUMMYSTRUCTNAME2 s2
143 #define DUMMYSTRUCTNAME3 s3
144 #define DUMMYSTRUCTNAME4 s4
145 #define DUMMYSTRUCTNAME5 s5
146 #else
147 #define _STRUCT_NAME(x)
148 #define DUMMYSTRUCTNAME
149 #define DUMMYSTRUCTNAME2
150 #define DUMMYSTRUCTNAME3
151 #define DUMMYSTRUCTNAME4
152 #define DUMMYSTRUCTNAME5
153 #endif
154
155 #endif /* __ANONYMOUS_DEFINED */
156
157 #if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64)
158 #define ALIGNMENT_MACHINE
159 #define UNALIGNED __unaligned
160 #if defined(_WIN64)
161 #define UNALIGNED64 __unaligned
162 #else
163 #define UNALIGNED64
164 #endif
165 #else
166 #undef ALIGNMENT_MACHINE
167 #define UNALIGNED
168 #define UNALIGNED64
169 #endif
170
171 #if defined(_WIN64) || defined(_M_ALPHA)
172 #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
173 #define MEMORY_ALLOCATION_ALIGNMENT 16
174 #else
175 #define MAX_NATURAL_ALIGNMENT sizeof(ULONG)
176 #define MEMORY_ALLOCATION_ALIGNMENT 8
177 #endif
178
179 #if defined(_M_MRX000) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) && defined(ENABLE_RESTRICTED)
180 #define RESTRICTED_POINTER __restrict
181 #else
182 #define RESTRICTED_POINTER
183 #endif
184
185 #define ARGUMENT_PRESENT(ArgumentPointer) \
186 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
187
188 /* Returns the base address of a structure from a structure member */
189 #ifndef CONTAINING_RECORD
190 #define CONTAINING_RECORD(address, type, field) \
191 ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
192 #endif
193
194 /* Returns the byte offset of the specified structure's member */
195 #ifndef __GNUC__
196 #define FIELD_OFFSET(Type, Field) ((LONG)(LONG_PTR)&(((Type*) 0)->Field))
197 #else
198 #define FIELD_OFFSET(Type, Field) __builtin_offsetof(Type, Field)
199 #endif
200
201 /* Returns the type's alignment */
202 #if defined(_MSC_VER) && (_MSC_VER >= 1300)
203 #define TYPE_ALIGNMENT(t) __alignof(t)
204 #else
205 #define TYPE_ALIGNMENT(t) FIELD_OFFSET(struct { char x; t test; }, test)
206 #endif
207
208 #if defined(_AMD64_) || defined(_X86_)
209 #define PROBE_ALIGNMENT(_s) TYPE_ALIGNMENT(ULONG)
210 #elif defined(_IA64_) || defined(_ARM_)
211 #define PROBE_ALIGNMENT(_s) max((TYPE_ALIGNMENT(_s), TYPE_ALIGNMENT(ULONG))
212 #else
213 #error "unknown architecture"
214 #endif
215
216 /* Calling Conventions */
217 #if defined(_M_IX86)
218 #define FASTCALL __fastcall
219 #else
220 #define FASTCALL
221 #endif
222
223 #define NTAPI __stdcall
224
225
226 /* Import and Export Specifiers */
227
228 /* Done the same way as in windef.h for now */
229 #define DECLSPEC_IMPORT __declspec(dllimport)
230 #define DECLSPEC_NORETURN __declspec(noreturn)
231
232 #ifndef DECLSPEC_ADDRSAFE
233 #if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
234 #define DECLSPEC_ADDRSAFE __declspec(address_safe)
235 #else
236 #define DECLSPEC_ADDRSAFE
237 #endif
238 #endif /* DECLSPEC_ADDRSAFE */
239
240 #ifndef NOP_FUNCTION
241 #if (_MSC_VER >= 1210)
242 #define NOP_FUNCTION __noop
243 #else
244 #define NOP_FUNCTION (void)0
245 #endif
246 #endif
247
248 #if !defined(_NTSYSTEM_)
249 #define NTSYSAPI DECLSPEC_IMPORT
250 #define NTSYSCALLAPI DECLSPEC_IMPORT
251 #else
252 #define NTSYSAPI
253 #if defined(_NTDLLBUILD_)
254 #define NTSYSCALLAPI
255 #else
256 #define NTSYSCALLAPI DECLSPEC_ADDRSAFE
257 #endif
258 #endif
259
260 /* Inlines */
261 #ifndef FORCEINLINE
262 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
263 #define FORCEINLINE __forceinline
264 #elif defined(_MSC_VER)
265 #define FORCEINLINE __inline
266 #else /* __GNUC__ */
267 # if ( __MINGW_GNUC_PREREQ(4, 3) && __STDC_VERSION__ >= 199901L)
268 # define FORCEINLINE extern inline __attribute__((__always_inline__,__gnu_inline__))
269 # else
270 # define FORCEINLINE extern __inline__ __attribute__((__always_inline__))
271 # endif
272 #endif
273 #endif /* FORCEINLINE */
274
275 #ifndef DECLSPEC_NOINLINE
276 #if (_MSC_VER >= 1300)
277 #define DECLSPEC_NOINLINE __declspec(noinline)
278 #elif defined(__GNUC__)
279 #define DECLSPEC_NOINLINE __attribute__((noinline))
280 #else
281 #define DECLSPEC_NOINLINE
282 #endif
283 #endif /* DECLSPEC_NOINLINE */
284
285 #if !defined(_M_CEE_PURE)
286 #define NTAPI_INLINE NTAPI
287 #else
288 #define NTAPI_INLINE
289 #endif
290
291 /* Use to specify structure alignment */
292 #ifndef DECLSPEC_ALIGN
293 #if defined(_MSC_VER) && (_MSC_VER >= 1300) && !defined(MIDL_PASS)
294 #define DECLSPEC_ALIGN(x) __declspec(align(x))
295 #elif defined(__GNUC__)
296 #define DECLSPEC_ALIGN(x) __attribute__ ((__aligned__ (x)))
297 #else
298 #define DECLSPEC_ALIGN(x)
299 #endif
300 #endif /* DECLSPEC_ALIGN */
301
302 /* Use to silence unused variable warnings when it is intentional */
303 #define UNREFERENCED_PARAMETER(P) {(P)=(P);}
304 #define UNREFERENCED_LOCAL_VARIABLE(L) {(L)=(L);}
305 #define DBG_UNREFERENCED_PARAMETER(P)
306 #define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
307
308 /* min/max helper macros */
309 #ifndef NOMINMAX
310
311 #ifndef min
312 #define min(a,b) (((a) < (b)) ? (a) : (b))
313 #endif
314
315 #ifndef max
316 #define max(a,b) (((a) > (b)) ? (a) : (b))
317 #endif
318
319 #endif /* NOMINMAX */
320
321 /* Tell windef.h that we have defined some basic types */
322 #define BASETYPES
323
324 /* Void Pointers */
325 typedef void *PVOID;
326 //typedef void * POINTER_64 PVOID64;
327 typedef PVOID PVOID64; // FIXME!
328
329 /* Handle Type */
330 #ifdef STRICT
331 typedef void *HANDLE;
332 #define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
333 #else
334 typedef PVOID HANDLE;
335 #define DECLARE_HANDLE(n) typedef HANDLE n
336 #endif
337 typedef HANDLE *PHANDLE;
338
339 /* Upper-Case Versions of Some Standard C Types */
340 #ifndef VOID
341 #define VOID void
342 typedef char CHAR;
343 typedef short SHORT;
344 typedef long LONG;
345 #if !defined(MIDL_PASS)
346 typedef int INT;
347 #endif
348 #endif
349 typedef double DOUBLE;
350
351 /* Unsigned Types */
352 typedef unsigned char UCHAR, *PUCHAR;
353 typedef unsigned short USHORT, *PUSHORT;
354 typedef unsigned long ULONG, *PULONG;
355 typedef CONST UCHAR *PCUCHAR;
356 typedef CONST USHORT *PCUSHORT;
357 typedef CONST ULONG *PCULONG;
358 typedef UCHAR FCHAR;
359 typedef USHORT FSHORT;
360 typedef ULONG FLONG;
361 typedef UCHAR BOOLEAN, *PBOOLEAN;
362 typedef ULONG LOGICAL;
363 typedef ULONG *PLOGICAL;
364
365 /* Signed Types */
366 typedef SHORT *PSHORT;
367 typedef LONG *PLONG;
368 typedef _Return_type_success_(return >= 0) LONG NTSTATUS;
369 typedef NTSTATUS *PNTSTATUS;
370 typedef signed char SCHAR;
371 typedef SCHAR *PSCHAR;
372
373 #ifndef _HRESULT_DEFINED
374 #define _HRESULT_DEFINED
375 typedef LONG HRESULT;
376 #endif
377
378 /* 64-bit types */
379 __GNU_EXTENSION typedef __int64 LONGLONG, *PLONGLONG;
380 __GNU_EXTENSION typedef unsigned __int64 ULONGLONG, *PULONGLONG;
381 typedef ULONGLONG DWORDLONG, *PDWORDLONG;
382
383 /* Update Sequence Number */
384 typedef LONGLONG USN;
385
386 /* ANSI (Multi-byte Character) types */
387 typedef CHAR *PCHAR, *LPCH, *PCH;
388 typedef CONST CHAR *LPCCH, *PCCH;
389 typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR;
390 typedef _Null_terminated_ PSTR *PZPSTR;
391 typedef _Null_terminated_ CONST PSTR *PCZPSTR;
392 typedef _Null_terminated_ CONST CHAR *LPCSTR, *PCSTR;
393 typedef _Null_terminated_ PCSTR *PZPCSTR;
394
395 /* Pointer to an Asciiz string */
396 typedef _Null_terminated_ CHAR *PSZ;
397 typedef _Null_terminated_ CONST char *PCSZ;
398
399 /* UNICODE (Wide Character) types */
400 typedef wchar_t WCHAR;
401 typedef WCHAR *PWCHAR, *LPWCH, *PWCH;
402 typedef CONST WCHAR *LPCWCH, *PCWCH;
403 typedef _Null_terminated_ WCHAR *NWPSTR, *LPWSTR, *PWSTR;
404 typedef _Null_terminated_ PWSTR *PZPWSTR;
405 typedef _Null_terminated_ CONST PWSTR *PCZPWSTR;
406 typedef _Null_terminated_ WCHAR UNALIGNED *LPUWSTR, *PUWSTR;
407 typedef _Null_terminated_ CONST WCHAR *LPCWSTR, *PCWSTR;
408 typedef _Null_terminated_ PCWSTR *PZPCWSTR;
409 typedef _Null_terminated_ CONST WCHAR UNALIGNED *LPCUWSTR, *PCUWSTR;
410 typedef _NullNull_terminated_ WCHAR *PZZWSTR;
411
412 /* Cardinal Data Types */
413 typedef char CCHAR, *PCCHAR;
414 typedef short CSHORT, *PCSHORT;
415 typedef ULONG CLONG, *PCLONG;
416
417 /* NLS basics (Locale and Language Ids) */
418 typedef ULONG LCID;
419 typedef PULONG PLCID;
420 typedef USHORT LANGID;
421
422 typedef enum {
423 UNSPECIFIED_COMPARTMENT_ID = 0,
424 DEFAULT_COMPARTMENT_ID
425 } COMPARTMENT_ID, *PCOMPARTMENT_ID;
426
427 /* Used to store a non-float 8 byte aligned structure */
428 typedef struct _QUAD
429 {
430 _ANONYMOUS_UNION union
431 {
432 __GNU_EXTENSION __int64 UseThisFieldToCopy;
433 double DoNotUseThisField;
434 } DUMMYUNIONNAME;
435 } QUAD, *PQUAD, UQUAD, *PUQUAD;
436
437 /* Large Integer Unions */
438 #if defined(MIDL_PASS)
439 typedef struct _LARGE_INTEGER {
440 #else
441 typedef union _LARGE_INTEGER {
442 _ANONYMOUS_STRUCT struct
443 {
444 ULONG LowPart;
445 LONG HighPart;
446 } DUMMYSTRUCTNAME;
447 struct
448 {
449 ULONG LowPart;
450 LONG HighPart;
451 } u;
452 #endif /* MIDL_PASS */
453 LONGLONG QuadPart;
454 } LARGE_INTEGER, *PLARGE_INTEGER;
455
456 #if defined(MIDL_PASS)
457 typedef struct _ULARGE_INTEGER {
458 #else
459 typedef union _ULARGE_INTEGER {
460 _ANONYMOUS_STRUCT struct
461 {
462 ULONG LowPart;
463 ULONG HighPart;
464 } DUMMYSTRUCTNAME;
465 struct
466 {
467 ULONG LowPart;
468 ULONG HighPart;
469 } u;
470 #endif /* MIDL_PASS */
471 ULONGLONG QuadPart;
472 } ULARGE_INTEGER, *PULARGE_INTEGER;
473
474 /* Physical Addresses are always treated as 64-bit wide */
475 typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
476
477 /* Locally Unique Identifier */
478 typedef struct _LUID {
479 ULONG LowPart;
480 LONG HighPart;
481 } LUID, *PLUID;
482
483 /* Native API Return Value Macros */
484 #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
485 #define NT_INFORMATION(Status) ((((ULONG)(Status)) >> 30) == 1)
486 #define NT_WARNING(Status) ((((ULONG)(Status)) >> 30) == 2)
487 #define NT_ERROR(Status) ((((ULONG)(Status)) >> 30) == 3)
488
489 /* String Types */
490 typedef struct _UNICODE_STRING {
491 USHORT Length;
492 USHORT MaximumLength;
493 PWSTR Buffer;
494 } UNICODE_STRING, *PUNICODE_STRING;
495 typedef const UNICODE_STRING* PCUNICODE_STRING;
496 #define UNICODE_NULL ((WCHAR)0)
497 #define UNICODE_STRING_MAX_BYTES ((USHORT) 65534)
498 #define UNICODE_STRING_MAX_CHARS (32767)
499
500 typedef struct _CSTRING {
501 USHORT Length;
502 USHORT MaximumLength;
503 CONST CHAR *Buffer;
504 } CSTRING, *PCSTRING;
505 #define ANSI_NULL ((CHAR)0)
506
507 typedef struct _STRING {
508 USHORT Length;
509 USHORT MaximumLength;
510 #ifdef MIDL_PASS
511 [size_is(MaximumLength), length_is(Length) ]
512 #endif
513 _Field_size_bytes_part_opt_(MaximumLength, Length) PCHAR Buffer;
514 } STRING, *PSTRING;
515
516 typedef STRING ANSI_STRING;
517 typedef PSTRING PANSI_STRING;
518 typedef STRING OEM_STRING;
519 typedef PSTRING POEM_STRING;
520 typedef CONST STRING* PCOEM_STRING;
521 typedef STRING CANSI_STRING;
522 typedef PSTRING PCANSI_STRING;
523
524 typedef struct _STRING32 {
525 USHORT Length;
526 USHORT MaximumLength;
527 ULONG Buffer;
528 } STRING32, *PSTRING32,
529 UNICODE_STRING32, *PUNICODE_STRING32,
530 ANSI_STRING32, *PANSI_STRING32;
531
532 typedef struct _STRING64 {
533 USHORT Length;
534 USHORT MaximumLength;
535 ULONGLONG Buffer;
536 } STRING64, *PSTRING64,
537 UNICODE_STRING64, *PUNICODE_STRING64,
538 ANSI_STRING64, *PANSI_STRING64;
539
540 /* LangID and NLS */
541 #define MAKELANGID(p, s) ((((USHORT)(s)) << 10) | (USHORT)(p))
542 #define PRIMARYLANGID(lgid) ((USHORT)(lgid) & 0x3ff)
543 #define SUBLANGID(lgid) ((USHORT)(lgid) >> 10)
544
545 #define NLS_VALID_LOCALE_MASK 0x000fffff
546
547 #define MAKELCID(lgid, srtid) ((ULONG)((((ULONG)((USHORT)(srtid))) << 16) | \
548 ((ULONG)((USHORT)(lgid)))))
549 #define MAKESORTLCID(lgid, srtid, ver) \
550 ((ULONG)((MAKELCID(lgid, srtid)) | \
551 (((ULONG)((USHORT)(ver))) << 20)))
552 #define LANGIDFROMLCID(lcid) ((USHORT)(lcid))
553 #define SORTIDFROMLCID(lcid) ((USHORT)((((ULONG)(lcid)) >> 16) & 0xf))
554 #define SORTVERSIONFROMLCID(lcid) ((USHORT)((((ULONG)(lcid)) >> 20) & 0xf))
555
556
557 /* Object Attributes */
558 typedef struct _OBJECT_ATTRIBUTES {
559 ULONG Length;
560 HANDLE RootDirectory;
561 PUNICODE_STRING ObjectName;
562 ULONG Attributes;
563 PVOID SecurityDescriptor;
564 PVOID SecurityQualityOfService;
565 } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
566 typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES;
567
568 /* Values for the Attributes member */
569 #define OBJ_INHERIT 0x00000002
570 #define OBJ_PERMANENT 0x00000010
571 #define OBJ_EXCLUSIVE 0x00000020
572 #define OBJ_CASE_INSENSITIVE 0x00000040
573 #define OBJ_OPENIF 0x00000080
574 #define OBJ_OPENLINK 0x00000100
575 #define OBJ_KERNEL_HANDLE 0x00000200
576 #define OBJ_FORCE_ACCESS_CHECK 0x00000400
577 #define OBJ_VALID_ATTRIBUTES 0x000007F2
578
579 /* Helper Macro */
580 #define InitializeObjectAttributes(p,n,a,r,s) { \
581 (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
582 (p)->RootDirectory = (r); \
583 (p)->Attributes = (a); \
584 (p)->ObjectName = (n); \
585 (p)->SecurityDescriptor = (s); \
586 (p)->SecurityQualityOfService = NULL; \
587 }
588
589 /* Product Types */
590 typedef enum _NT_PRODUCT_TYPE {
591 NtProductWinNt = 1,
592 NtProductLanManNt,
593 NtProductServer
594 } NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE;
595
596 typedef enum _EVENT_TYPE {
597 NotificationEvent,
598 SynchronizationEvent
599 } EVENT_TYPE;
600
601 typedef enum _TIMER_TYPE {
602 NotificationTimer,
603 SynchronizationTimer
604 } TIMER_TYPE;
605
606 typedef enum _WAIT_TYPE {
607 WaitAll,
608 WaitAny
609 } WAIT_TYPE;
610
611 /* Doubly Linked Lists */
612 typedef struct _LIST_ENTRY {
613 struct _LIST_ENTRY *Flink;
614 struct _LIST_ENTRY *Blink;
615 } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
616
617 typedef struct LIST_ENTRY32 {
618 ULONG Flink;
619 ULONG Blink;
620 } LIST_ENTRY32, *PLIST_ENTRY32;
621
622 typedef struct LIST_ENTRY64 {
623 ULONGLONG Flink;
624 ULONGLONG Blink;
625 } LIST_ENTRY64, *PLIST_ENTRY64;
626
627 /* Singly Linked Lists */
628 typedef struct _SINGLE_LIST_ENTRY {
629 struct _SINGLE_LIST_ENTRY *Next;
630 } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
631
632 typedef struct _PROCESSOR_NUMBER {
633 USHORT Group;
634 UCHAR Number;
635 UCHAR Reserved;
636 } PROCESSOR_NUMBER, *PPROCESSOR_NUMBER;
637
638 struct _CONTEXT;
639 struct _EXCEPTION_RECORD;
640
641 _IRQL_requires_same_
642 _Function_class_(EXCEPTION_ROUTINE)
643 typedef EXCEPTION_DISPOSITION
644 (NTAPI *PEXCEPTION_ROUTINE)(
645 _Inout_ struct _EXCEPTION_RECORD *ExceptionRecord,
646 _In_ PVOID EstablisherFrame,
647 _Inout_ struct _CONTEXT *ContextRecord,
648 _In_ PVOID DispatcherContext);
649
650 typedef struct _GROUP_AFFINITY {
651 KAFFINITY Mask;
652 USHORT Group;
653 USHORT Reserved[3];
654 } GROUP_AFFINITY, *PGROUP_AFFINITY;
655
656 /* Helper Macros */
657
658 #define RTL_FIELD_TYPE(type, field) (((type*)0)->field)
659 #define RTL_BITS_OF(sizeOfArg) (sizeof(sizeOfArg) * 8)
660 #define RTL_BITS_OF_FIELD(type, field) (RTL_BITS_OF(RTL_FIELD_TYPE(type, field)))
661
662 #define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
663
664 #define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
665
666 #define RTL_SIZEOF_THROUGH_FIELD(type, field) \
667 (FIELD_OFFSET(type, field) + RTL_FIELD_SIZE(type, field))
668
669 #define RTL_CONTAINS_FIELD(Struct, Size, Field) \
670 ( (((PCHAR)(&(Struct)->Field)) + sizeof((Struct)->Field)) <= (((PCHAR)(Struct))+(Size)) )
671
672 #define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0]))
673 #define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A)
674 #ifdef ENABLE_RTL_NUMBER_OF_V2
675 #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A)
676 #else
677 #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A)
678 #endif
679 #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
680
681 /* Type Limits */
682 #define MINCHAR 0x80
683 #define MAXCHAR 0x7f
684 #define MINSHORT 0x8000
685 #define MAXSHORT 0x7fff
686 #define MINLONG 0x80000000
687 #define MAXLONG 0x7fffffff
688 #define MAXUCHAR 0xff
689 #define MAXUSHORT 0xffff
690 #define MAXULONG 0xffffffff
691 #define MAXLONGLONG (0x7fffffffffffffffLL)
692
693 /* Multiplication and Shift Operations */
694 #define Int32x32To64(a,b) ((LONGLONG)(a)*(LONGLONG)(b))
695 #define UInt32x32To64(a,b) ((DWORDLONG)(a)*(DWORDLONG)(b))
696 #define Int64ShllMod32(a,b) ((DWORDLONG)(a)<<(b))
697 #define Int64ShraMod32(a,b) ((LONGLONG)(a)>>(b))
698 #define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b))
699
700 /* C_ASSERT Definition */
701 #define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1]
702
703 #define VER_WORKSTATION_NT 0x40000000
704 #define VER_SERVER_NT 0x80000000
705 #define VER_SUITE_SMALLBUSINESS 0x00000001
706 #define VER_SUITE_ENTERPRISE 0x00000002
707 #define VER_SUITE_BACKOFFICE 0x00000004
708 #define VER_SUITE_COMMUNICATIONS 0x00000008
709 #define VER_SUITE_TERMINAL 0x00000010
710 #define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020
711 #define VER_SUITE_EMBEDDEDNT 0x00000040
712 #define VER_SUITE_DATACENTER 0x00000080
713 #define VER_SUITE_SINGLEUSERTS 0x00000100
714 #define VER_SUITE_PERSONAL 0x00000200
715 #define VER_SUITE_BLADE 0x00000400
716 #define VER_SUITE_EMBEDDED_RESTRICTED 0x00000800
717 #define VER_SUITE_SECURITY_APPLIANCE 0x00001000
718 #define VER_SUITE_STORAGE_SERVER 0x00002000
719 #define VER_SUITE_COMPUTE_SERVER 0x00004000
720 #define VER_SUITE_WH_SERVER 0x00008000
721
722 /* Primary language IDs. */
723 #define LANG_NEUTRAL 0x00
724 #define LANG_INVARIANT 0x7f
725
726 #define LANG_AFRIKAANS 0x36
727 #define LANG_ALBANIAN 0x1c
728 #define LANG_ALSATIAN 0x84
729 #define LANG_AMHARIC 0x5e
730 #define LANG_ARABIC 0x01
731 #define LANG_ARMENIAN 0x2b
732 #define LANG_ASSAMESE 0x4d
733 #define LANG_AZERI 0x2c
734 #define LANG_BASHKIR 0x6d
735 #define LANG_BASQUE 0x2d
736 #define LANG_BELARUSIAN 0x23
737 #define LANG_BENGALI 0x45
738 #define LANG_BRETON 0x7e
739 #define LANG_BOSNIAN 0x1a
740 #define LANG_BOSNIAN_NEUTRAL 0x781a
741 #define LANG_BULGARIAN 0x02
742 #define LANG_CATALAN 0x03
743 #define LANG_CHINESE 0x04
744 #define LANG_CHINESE_SIMPLIFIED 0x04
745 #define LANG_CHINESE_TRADITIONAL 0x7c04
746 #define LANG_CORSICAN 0x83
747 #define LANG_CROATIAN 0x1a
748 #define LANG_CZECH 0x05
749 #define LANG_DANISH 0x06
750 #define LANG_DARI 0x8c
751 #define LANG_DIVEHI 0x65
752 #define LANG_DUTCH 0x13
753 #define LANG_ENGLISH 0x09
754 #define LANG_ESTONIAN 0x25
755 #define LANG_FAEROESE 0x38
756 #define LANG_FARSI 0x29
757 #define LANG_FILIPINO 0x64
758 #define LANG_FINNISH 0x0b
759 #define LANG_FRENCH 0x0c
760 #define LANG_FRISIAN 0x62
761 #define LANG_GALICIAN 0x56
762 #define LANG_GEORGIAN 0x37
763 #define LANG_GERMAN 0x07
764 #define LANG_GREEK 0x08
765 #define LANG_GREENLANDIC 0x6f
766 #define LANG_GUJARATI 0x47
767 #define LANG_HAUSA 0x68
768 #define LANG_HEBREW 0x0d
769 #define LANG_HINDI 0x39
770 #define LANG_HUNGARIAN 0x0e
771 #define LANG_ICELANDIC 0x0f
772 #define LANG_IGBO 0x70
773 #define LANG_INDONESIAN 0x21
774 #define LANG_INUKTITUT 0x5d
775 #define LANG_IRISH 0x3c
776 #define LANG_ITALIAN 0x10
777 #define LANG_JAPANESE 0x11
778 #define LANG_KANNADA 0x4b
779 #define LANG_KASHMIRI 0x60
780 #define LANG_KAZAK 0x3f
781 #define LANG_KHMER 0x53
782 #define LANG_KICHE 0x86
783 #define LANG_KINYARWANDA 0x87
784 #define LANG_KONKANI 0x57
785 #define LANG_KOREAN 0x12
786 #define LANG_KYRGYZ 0x40
787 #define LANG_LAO 0x54
788 #define LANG_LATVIAN 0x26
789 #define LANG_LITHUANIAN 0x27
790 #define LANG_LOWER_SORBIAN 0x2e
791 #define LANG_LUXEMBOURGISH 0x6e
792 #define LANG_MACEDONIAN 0x2f
793 #define LANG_MALAY 0x3e
794 #define LANG_MALAYALAM 0x4c
795 #define LANG_MALTESE 0x3a
796 #define LANG_MANIPURI 0x58
797 #define LANG_MAORI 0x81
798 #define LANG_MAPUDUNGUN 0x7a
799 #define LANG_MARATHI 0x4e
800 #define LANG_MOHAWK 0x7c
801 #define LANG_MONGOLIAN 0x50
802 #define LANG_NEPALI 0x61
803 #define LANG_NORWEGIAN 0x14
804 #define LANG_OCCITAN 0x82
805 #define LANG_ORIYA 0x48
806 #define LANG_PASHTO 0x63
807 #define LANG_PERSIAN 0x29
808 #define LANG_POLISH 0x15
809 #define LANG_PORTUGUESE 0x16
810 #define LANG_PUNJABI 0x46
811 #define LANG_QUECHUA 0x6b
812 #define LANG_ROMANIAN 0x18
813 #define LANG_ROMANSH 0x17
814 #define LANG_RUSSIAN 0x19
815 #define LANG_SAMI 0x3b
816 #define LANG_SANSKRIT 0x4f
817 #define LANG_SERBIAN 0x1a
818 #define LANG_SERBIAN_NEUTRAL 0x7c1a
819 #define LANG_SINDHI 0x59
820 #define LANG_SINHALESE 0x5b
821 #define LANG_SLOVAK 0x1b
822 #define LANG_SLOVENIAN 0x24
823 #define LANG_SOTHO 0x6c
824 #define LANG_SPANISH 0x0a
825 #define LANG_SWAHILI 0x41
826 #define LANG_SWEDISH 0x1d
827 #define LANG_SYRIAC 0x5a
828 #define LANG_TAJIK 0x28
829 #define LANG_TAMAZIGHT 0x5f
830 #define LANG_TAMIL 0x49
831 #define LANG_TATAR 0x44
832 #define LANG_TELUGU 0x4a
833 #define LANG_THAI 0x1e
834 #define LANG_TIBETAN 0x51
835 #define LANG_TIGRIGNA 0x73
836 #define LANG_TSWANA 0x32
837 #define LANG_TURKISH 0x1f
838 #define LANG_TURKMEN 0x42
839 #define LANG_UIGHUR 0x80
840 #define LANG_UKRAINIAN 0x22
841 #define LANG_UPPER_SORBIAN 0x2e
842 #define LANG_URDU 0x20
843 #define LANG_UZBEK 0x43
844 #define LANG_VIETNAMESE 0x2a
845 #define LANG_WELSH 0x52
846 #define LANG_WOLOF 0x88
847 #define LANG_XHOSA 0x34
848 #define LANG_YAKUT 0x85
849 #define LANG_YI 0x78
850 #define LANG_YORUBA 0x6a
851 #define LANG_ZULU 0x35
852
853 #endif /* _NTDEF_ */