zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

ntdef.h (31498B) - Raw


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