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 1025