10 #include <sdkddkver.h>
12 // FIXME: Should we include these here?
16 /* Helper macro to enable gcc's extension. */
17 #ifndef __GNU_EXTENSION
19 #define __GNU_EXTENSION __extension__
21 #define __GNU_EXTENSION
25 typedef unsigned long POINTER_64
; // FIXME! HACK!!!
30 // Pseudo Modifiers for Input Parameters
58 // Defines the "size" of an any-size array
61 #define ANYSIZE_ARRAY 1
85 #define NULL ((void *)0)
86 #define NULL64 ((void * POINTER_64)0)
90 typedef enum _EVENT_TYPE
{
95 typedef enum _TIMER_TYPE
{
100 typedef enum _WAIT_TYPE
{
107 // We should use the -fms-extensions compiler flag for gcc,
108 // and clean up the mess.
110 #ifndef __ANONYMOUS_DEFINED
111 #define __ANONYMOUS_DEFINED
113 #ifndef NONAMELESSUNION
115 #define _ANONYMOUS_UNION __GNU_EXTENSION
116 #define _ANONYMOUS_STRUCT __GNU_EXTENSION
117 #elif defined(__WATCOMC__) || defined(_MSC_VER)
118 #define _ANONYMOUS_UNION
119 #define _ANONYMOUS_STRUCT
120 #endif /* __GNUC__/__WATCOMC__ */
121 #endif /* NONAMELESSUNION */
123 #ifndef _ANONYMOUS_UNION
124 #define _ANONYMOUS_UNION
125 #define _UNION_NAME(x) x
126 #define DUMMYUNIONNAME u
127 #define DUMMYUNIONNAME2 u2
128 #define DUMMYUNIONNAME3 u3
129 #define DUMMYUNIONNAME4 u4
130 #define DUMMYUNIONNAME5 u5
131 #define DUMMYUNIONNAME6 u6
132 #define DUMMYUNIONNAME7 u7
133 #define DUMMYUNIONNAME8 u8
135 #define _UNION_NAME(x)
136 #define DUMMYUNIONNAME
137 #define DUMMYUNIONNAME2
138 #define DUMMYUNIONNAME3
139 #define DUMMYUNIONNAME4
140 #define DUMMYUNIONNAME5
141 #define DUMMYUNIONNAME6
142 #define DUMMYUNIONNAME7
143 #define DUMMYUNIONNAME8
146 #ifndef _ANONYMOUS_STRUCT
147 #define _ANONYMOUS_STRUCT
148 #define _STRUCT_NAME(x) x
149 #define DUMMYSTRUCTNAME s
150 #define DUMMYSTRUCTNAME2 s2
151 #define DUMMYSTRUCTNAME3 s3
152 #define DUMMYSTRUCTNAME4 s4
153 #define DUMMYSTRUCTNAME5 s5
155 #define _STRUCT_NAME(x)
156 #define DUMMYSTRUCTNAME
157 #define DUMMYSTRUCTNAME2
158 #define DUMMYSTRUCTNAME3
159 #define DUMMYSTRUCTNAME4
160 #define DUMMYSTRUCTNAME5
163 #endif /* __ANONYMOUS_DEFINED */
168 #define RESTRICTED_POINTER
171 // Returns the base address of a structure from a structure member
173 #ifndef CONTAINING_RECORD
174 #define CONTAINING_RECORD(address, type, field) \
175 ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
179 // Returns the byte offset of the specified structure's member
182 #define FIELD_OFFSET(Type, Field) ((LONG)(LONG_PTR)&(((Type*) 0)->Field))
184 #define FIELD_OFFSET(Type, Field) __builtin_offsetof(Type, Field)
188 // Returns the type's alignment
190 #if defined(_MSC_VER) && (_MSC_VER >= 1300)
191 #define TYPE_ALIGNMENT(t) __alignof(t)
193 #define TYPE_ALIGNMENT(t) FIELD_OFFSET( struct { char x; t test; }, test )
197 // Calling Conventions
200 #define FASTCALL __fastcall
205 #define NTAPI __stdcall
208 // Used by the DDK exclusively , don't put in drivers
210 #define DDKAPI __stdcall // Use NTAPI instead
211 #define DDKCDECLAPI __cdecl // Just use __cdecl
214 // Import and Export Specifiers
217 // Done the same way as in windef.h for now
218 #define DECLSPEC_IMPORT __declspec(dllimport)
219 #define DECLSPEC_NORETURN __declspec(noreturn)
222 #ifndef DECLSPEC_ADDRSAFE
223 #if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
224 #define DECLSPEC_ADDRSAFE __declspec(address_safe)
226 #define DECLSPEC_ADDRSAFE
230 #if !defined(_NTSYSTEM_)
231 #define NTSYSAPI DECLSPEC_IMPORT
232 #define NTSYSCALLAPI DECLSPEC_IMPORT
235 #if defined(_NTDLLBUILD_)
238 #define NTSYSCALLAPI DECLSPEC_ADDRSAFE
246 #if (_MSC_VER >= 1200)
247 #define FORCEINLINE __forceinline
249 #define FORCEINLINE __inline
251 #define FORCEINLINE static __inline__ __attribute__((always_inline))
255 #ifndef DECLSPEC_NOINLINE
256 #if (_MSC_VER >= 1300)
257 #define DECLSPEC_NOINLINE __declspec(noinline)
258 #elif defined(__GNUC__)
259 #define DECLSPEC_NOINLINE __attribute__((noinline))
261 #define DECLSPEC_NOINLINE
265 #if !defined(_M_CEE_PURE)
266 #define NTAPI_INLINE NTAPI
272 // Use to specify structure alignment
274 #ifndef DECLSPEC_ALIGN
275 #if defined(_MSC_VER) && (_MSC_VER >= 1300) && !defined(MIDL_PASS)
276 #define DECLSPEC_ALIGN(x) __declspec(align(x))
277 #elif defined(__GNUC__)
278 #define DECLSPEC_ALIGN(x) __attribute__((aligned(x)))
280 #define DECLSPEC_ALIGN(x)
287 // Use to silence unused variable warnings when it is intentional
289 #define UNREFERENCED_PARAMETER(P) {(P)=(P);}
290 #define UNREFERENCED_LOCAL_VARIABLE(L) {(L)=(L);}
291 #define DBG_UNREFERENCED_PARAMETER(P)
292 #define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
297 // min/max helper macros
302 #define min(a,b) (((a) < (b)) ? (a) : (b))
306 #define max(a,b) (((a) > (b)) ? (a) : (b))
314 // Tell windef.h that we have defined some basic types
322 //typedef void * POINTER_64 PVOID64;
323 typedef PVOID PVOID64
; // FIXME!
329 typedef void *HANDLE
;
330 #define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
332 typedef PVOID HANDLE
;
333 #define DECLARE_HANDLE(n) typedef HANDLE n
335 typedef HANDLE
*PHANDLE
;
338 // Upper-Case Versions of Some Standard C Types
345 #if !defined(MIDL_PASS)
349 typedef double DOUBLE
;
352 // Used to store a non-float 8 byte aligned structure
356 _ANONYMOUS_UNION
union
358 __GNU_EXTENSION __int64 UseThisFieldToCopy
;
359 double DoNotUseThisField
;
361 } QUAD
, *PQUAD
, UQUAD
, *PUQUAD
;
367 typedef unsigned char UCHAR
, *PUCHAR
;
368 typedef unsigned short USHORT
, *PUSHORT
;
369 typedef unsigned long ULONG
, *PULONG
;
370 typedef CONST UCHAR
*PCUCHAR
;
371 typedef CONST USHORT
*PCUSHORT
;
372 typedef CONST ULONG
*PCULONG
;
375 typedef USHORT FSHORT
;
377 typedef UCHAR BOOLEAN
;
378 typedef BOOLEAN
*PBOOLEAN
;
380 typedef ULONG LOGICAL
;
381 typedef ULONG
*PLOGICAL
;
386 typedef SHORT
*PSHORT
;
389 typedef LONG NTSTATUS
;
390 typedef NTSTATUS
*PNTSTATUS
;
392 typedef signed char SCHAR
;
393 typedef SCHAR
*PSCHAR
;
395 #ifndef _HRESULT_DEFINED
396 #define _HRESULT_DEFINED
397 typedef LONG HRESULT
;
403 __GNU_EXTENSION
typedef __int64 LONGLONG
, *PLONGLONG
;
404 __GNU_EXTENSION
typedef unsigned __int64 ULONGLONG
, *PULONGLONG
;
405 typedef ULONGLONG DWORDLONG
, *PDWORDLONG
;
408 // Update Sequence Number
410 typedef LONGLONG USN
;
414 // ANSI (Multi-byte Character) types
416 typedef CHAR
*PCHAR
, *LPCH
, *PCH
;
417 typedef CONST CHAR
*LPCCH
, *PCCH
;
418 typedef CHAR
*NPSTR
, *LPSTR
, *PSTR
;
419 typedef PSTR
*PZPSTR
;
420 typedef CONST PSTR
*PCZPSTR
;
421 typedef CONST CHAR
*LPCSTR
, *PCSTR
;
422 typedef PCSTR
*PZPCSTR
;
425 // Pointer to an Asciiz string
428 typedef CONST
char *PCSZ
;
431 // UNICODE (Wide Character) types
433 typedef wchar_t WCHAR
;
434 typedef WCHAR
*PWCHAR
, *LPWCH
, *PWCH
;
435 typedef CONST WCHAR
*LPCWCH
, *PCWCH
;
436 typedef WCHAR
*NWPSTR
, *LPWSTR
, *PWSTR
;
437 typedef PWSTR
*PZPWSTR
;
438 typedef CONST PWSTR
*PCZPWSTR
;
439 typedef WCHAR UNALIGNED
*LPUWSTR
, *PUWSTR
;
440 typedef CONST WCHAR
*LPCWSTR
, *PCWSTR
;
441 typedef PCWSTR
*PZPCWSTR
;
442 typedef CONST WCHAR UNALIGNED
*LPCUWSTR
, *PCUWSTR
;
445 // Cardinal Data Types
447 typedef char CCHAR
, *PCCHAR
;
448 typedef short CSHORT
, *PCSHORT
;
449 typedef ULONG CLONG
, *PCLONG
;
452 // NLS basics (Locale and Language Ids)
455 typedef PULONG PLCID
;
456 typedef USHORT LANGID
;
461 // Large Integer Unions
463 #if defined(MIDL_PASS)
464 typedef struct _LARGE_INTEGER
{
466 typedef union _LARGE_INTEGER
{
467 _ANONYMOUS_STRUCT
struct
479 } LARGE_INTEGER
, *PLARGE_INTEGER
;
481 #if defined(MIDL_PASS)
482 typedef struct _ULARGE_INTEGER
{
484 typedef union _ULARGE_INTEGER
{
485 _ANONYMOUS_STRUCT
struct
497 } ULARGE_INTEGER
, *PULARGE_INTEGER
;
500 // Physical Addresses are always treated as 64-bit wide
502 typedef LARGE_INTEGER PHYSICAL_ADDRESS
, *PPHYSICAL_ADDRESS
;
507 // Locally Unique Identifier
509 typedef struct _LUID
{
517 // Native API Return Value Macros
519 #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
520 #define NT_INFORMATION(Status) ((((ULONG)(Status)) >> 30) == 1)
521 #define NT_WARNING(Status) ((((ULONG)(Status)) >> 30) == 2)
522 #define NT_ERROR(Status) ((((ULONG)(Status)) >> 30) == 3)
529 typedef struct _UNICODE_STRING
{
531 USHORT MaximumLength
;
533 } UNICODE_STRING
, *PUNICODE_STRING
;
534 typedef const UNICODE_STRING
* PCUNICODE_STRING
;
535 #define UNICODE_NULL ((WCHAR)0)
537 typedef struct _CSTRING
{
539 USHORT MaximumLength
;
541 } CSTRING
, *PCSTRING
;
542 #define ANSI_NULL ((CHAR)0)
544 typedef struct _STRING
{
546 USHORT MaximumLength
;
550 typedef STRING ANSI_STRING
;
551 typedef PSTRING PANSI_STRING
;
552 typedef STRING OEM_STRING
;
553 typedef PSTRING POEM_STRING
;
554 typedef CONST STRING
* PCOEM_STRING
;
555 typedef STRING CANSI_STRING
;
556 typedef PSTRING PCANSI_STRING
;
558 typedef struct _STRING32
{
560 USHORT MaximumLength
;
562 } STRING32
, *PSTRING32
,
563 UNICODE_STRING32
, *PUNICODE_STRING32
,
564 ANSI_STRING32
, *PANSI_STRING32
;
566 typedef struct _STRING64
{
568 USHORT MaximumLength
;
570 } STRING64
, *PSTRING64
,
571 UNICODE_STRING64
, *PUNICODE_STRING64
,
572 ANSI_STRING64
, *PANSI_STRING64
;
577 #define MAKELANGID(p, s) ((((USHORT)(s)) << 10) | (USHORT)(p))
578 #define PRIMARYLANGID(lgid) ((USHORT)(lgid) & 0x3ff)
579 #define SUBLANGID(lgid) ((USHORT)(lgid) >> 10)
581 #define NLS_VALID_LOCALE_MASK 0x000fffff
583 #define MAKELCID(lgid, srtid) ((ULONG)((((ULONG)((USHORT)(srtid))) << 16) | \
584 ((ULONG)((USHORT)(lgid)))))
585 #define MAKESORTLCID(lgid, srtid, ver) \
586 ((ULONG)((MAKELCID(lgid, srtid)) | \
587 (((ULONG)((USHORT)(ver))) << 20)))
588 #define LANGIDFROMLCID(lcid) ((USHORT)(lcid))
589 #define SORTIDFROMLCID(lcid) ((USHORT)((((ULONG)(lcid)) >> 16) & 0xf))
590 #define SORTVERSIONFROMLCID(lcid) ((USHORT)((((ULONG)(lcid)) >> 20) & 0xf))
597 typedef struct _OBJECT_ATTRIBUTES
{
599 HANDLE RootDirectory
;
600 PUNICODE_STRING ObjectName
;
602 PVOID SecurityDescriptor
;
603 PVOID SecurityQualityOfService
;
604 } OBJECT_ATTRIBUTES
, *POBJECT_ATTRIBUTES
;
605 typedef CONST OBJECT_ATTRIBUTES
*PCOBJECT_ATTRIBUTES
;
608 // Values for the Attributes member
610 #define OBJ_INHERIT 0x00000002
611 #define OBJ_PERMANENT 0x00000010
612 #define OBJ_EXCLUSIVE 0x00000020
613 #define OBJ_CASE_INSENSITIVE 0x00000040
614 #define OBJ_OPENIF 0x00000080
615 #define OBJ_OPENLINK 0x00000100
616 #define OBJ_KERNEL_HANDLE 0x00000200
617 #define OBJ_FORCE_ACCESS_CHECK 0x00000400
618 #define OBJ_VALID_ATTRIBUTES 0x000007F2
623 #define InitializeObjectAttributes(p,n,a,r,s) { \
624 (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
625 (p)->RootDirectory = (r); \
626 (p)->Attributes = (a); \
627 (p)->ObjectName = (n); \
628 (p)->SecurityDescriptor = (s); \
629 (p)->SecurityQualityOfService = NULL; \
637 typedef enum _NT_PRODUCT_TYPE
{
641 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
646 // Doubly Linked Lists
648 typedef struct _LIST_ENTRY
{
649 struct _LIST_ENTRY
*Flink
;
650 struct _LIST_ENTRY
*Blink
;
651 } LIST_ENTRY
, *PLIST_ENTRY
, *RESTRICTED_POINTER PRLIST_ENTRY
;
653 typedef struct LIST_ENTRY32
657 } LIST_ENTRY32
, *PLIST_ENTRY32
;
659 typedef struct LIST_ENTRY64
663 } LIST_ENTRY64
, *PLIST_ENTRY64
;
666 // Singly Linked Lists
668 typedef struct _SINGLE_LIST_ENTRY
{
669 struct _SINGLE_LIST_ENTRY
*Next
;
670 } SINGLE_LIST_ENTRY
, *PSINGLE_LIST_ENTRY
;
677 #define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
679 #define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
681 #define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0]))
682 #define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A)
683 #ifdef ENABLE_RTL_NUMBER_OF_V2
684 #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A)
686 #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A)
688 #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
697 #define MINSHORT 0x8000
698 #define MAXSHORT 0x7fff
699 #define MINLONG 0x80000000
700 #define MAXLONG 0x7fffffff
701 #define MAXUCHAR 0xff
702 #define MAXUSHORT 0xffff
703 #define MAXULONG 0xffffffff
704 #define MAXLONGLONG (0x7fffffffffffffffLL)
709 // Multiplication and Shift Operations
711 #define Int32x32To64(a,b) ((LONGLONG)(a)*(LONGLONG)(b))
712 #define UInt32x32To64(a,b) ((DWORDLONG)(a)*(DWORDLONG)(b))
713 #define Int64ShllMod32(a,b) ((DWORDLONG)(a)<<(b))
714 #define Int64ShraMod32(a,b) ((LONGLONG)(a)>>(b))
715 #define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b))
720 // C_ASSERT Definition
722 #define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1]
727 // Primary language IDs.
729 #define LANG_NEUTRAL 0x00
730 #define LANG_INVARIANT 0x7f
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
856 #define LANG_YORUBA 0x6a
857 #define LANG_ZULU 0x35
861 #endif /* _NTDEF_H */