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