extern "C++" // templates cannot be declared to have 'C' linkage template char (*RtlpNumberOf( T (&)[N] ))[N]; #define _WINNT_ extern "C" { #define ANYSIZE_ARRAY 1 // // For compilers that don't support nameless unions/structs // #define DUMMYUNIONNAME u #define DUMMYUNIONNAME2 u2 #define DUMMYUNIONNAME3 u3 #define DUMMYUNIONNAME4 u4 #define DUMMYUNIONNAME5 u5 #define DUMMYUNIONNAME6 u6 #define DUMMYUNIONNAME7 u7 #define DUMMYUNIONNAME8 u8 #define DUMMYUNIONNAME9 u9 #define DUMMYUNIONNAME #define DUMMYUNIONNAME2 #define DUMMYUNIONNAME3 #define DUMMYUNIONNAME4 #define DUMMYUNIONNAME5 #define DUMMYUNIONNAME6 #define DUMMYUNIONNAME7 #define DUMMYUNIONNAME8 #define DUMMYUNIONNAME9 #define DUMMYSTRUCTNAME s #define DUMMYSTRUCTNAME2 s2 #define DUMMYSTRUCTNAME3 s3 #define DUMMYSTRUCTNAME4 s4 #define DUMMYSTRUCTNAME5 s5 #define DUMMYSTRUCTNAME #define DUMMYSTRUCTNAME2 #define DUMMYSTRUCTNAME3 #define DUMMYSTRUCTNAME4 #define DUMMYSTRUCTNAME5 #define RESTRICTED_POINTER __restrict #define RESTRICTED_POINTER #define ALIGNMENT_MACHINE #define UNALIGNED __unaligned #define UNALIGNED64 __unaligned #define UNALIGNED64 #undef ALIGNMENT_MACHINE #define UNALIGNED #define UNALIGNED64 #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG) #define MEMORY_ALLOCATION_ALIGNMENT 16 #define MAX_NATURAL_ALIGNMENT sizeof(DWORD) #define MEMORY_ALLOCATION_ALIGNMENT 8 // // TYPE_ALIGNMENT will return the alignment requirements of a given type for // the current platform. // #define TYPE_ALIGNMENT( t ) __alignof(t) #define TYPE_ALIGNMENT( t ) FIELD_OFFSET( struct { char x; t test; }, test ) #define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD ) #define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD )) #define PROBE_ALIGNMENT32( _s ) TYPE_ALIGNMENT( DWORD ) #define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD ) // // C_ASSERT() can be used to perform many compile-time assertions: // type sizes, field offsets, etc. // // An assertion failure results in error C2118: negative subscript. // #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] #define C_ASSERT(e) #define DECLSPEC_IMPORT __declspec(dllimport) #define DECLSPEC_IMPORT #define DECLSPEC_NORETURN __declspec(noreturn) #define DECLSPEC_NORETURN #define DECLSPEC_NOTHROW __declspec(nothrow) #define DECLSPEC_NOTHROW #define DECLSPEC_ALIGN(x) __declspec(align(x)) #define DECLSPEC_ALIGN(x) #define SYSTEM_CACHE_ALIGNMENT_SIZE 64 #define SYSTEM_CACHE_ALIGNMENT_SIZE 128 #define DECLSPEC_CACHEALIGN DECLSPEC_ALIGN(SYSTEM_CACHE_ALIGNMENT_SIZE) #define DECLSPEC_UUID(x) __declspec(uuid(x)) #define DECLSPEC_UUID(x) #define DECLSPEC_NOVTABLE __declspec(novtable) #define DECLSPEC_NOVTABLE #define DECLSPEC_SELECTANY __declspec(selectany) #define DECLSPEC_SELECTANY #define NOP_FUNCTION __noop #define NOP_FUNCTION (void)0 #define DECLSPEC_ADDRSAFE __declspec(address_safe) #define DECLSPEC_ADDRSAFE #define DECLSPEC_NOINLINE __declspec(noinline) #define DECLSPEC_NOINLINE #define FORCEINLINE __forceinline #define FORCEINLINE __inline #define DECLSPEC_DEPRECATED __declspec(deprecated) #define DEPRECATE_SUPPORTED #define DECLSPEC_DEPRECATED #undef DEPRECATE_SUPPORTED #define DECLSPEC_DEPRECATED_DDK DECLSPEC_DEPRECATED #define PRAGMA_DEPRECATED_DDK 1 #define DECLSPEC_DEPRECATED_DDK #define PRAGMA_DEPRECATED_DDK 1 #define DECLSPEC_DEPRECATED_DDK #define PRAGMA_DEPRECATED_DDK 0 // // Void // typedef void *PVOID; typedef void * PVOID64; #define NTAPI __stdcall #define _cdecl #define __cdecl #define NTAPI #define NTAPI_INLINE NTAPI #define NTAPI_INLINE // // Define API decoration for direct importing system DLL references. // #define NTSYSAPI DECLSPEC_IMPORT #define NTSYSCALLAPI DECLSPEC_IMPORT #define NTSYSAPI #define NTSYSCALLAPI #define NTSYSCALLAPI DECLSPEC_ADDRSAFE // // Basics // #define VOID void typedef char CHAR; typedef short SHORT; typedef long LONG; typedef int INT; // // UNICODE (Wide Character) types // typedef wchar_t WCHAR; // wc, 16-bit UNICODE character typedef WCHAR *PWCHAR, *LPWCH, *PWCH; typedef const WCHAR *LPCWCH, *PCWCH; typedef WCHAR *NWPSTR, *LPWSTR, *PWSTR; typedef PWSTR *PZPWSTR; typedef const PWSTR *PCZPWSTR; typedef WCHAR *LPUWSTR, *PUWSTR; typedef const WCHAR *LPCWSTR, *PCWSTR; typedef PCWSTR *PZPCWSTR; typedef const WCHAR *LPCUWSTR, *PCUWSTR; typedef WCHAR *PZZWSTR; typedef const WCHAR *PCZZWSTR; typedef WCHAR *PUZZWSTR; typedef const WCHAR *PCUZZWSTR; typedef [OnParameterOrReturnOnly] WCHAR *PNZWCH; typedef [OnParameterOrReturnOnly] const WCHAR *PCNZWCH; typedef [OnParameterOrReturnOnly] WCHAR *PUNZWCH; typedef [OnParameterOrReturnOnly] const WCHAR *PCUNZWCH; typedef const WCHAR *LPCWCHAR, *PCWCHAR; typedef const WCHAR *LPCUWCHAR, *PCUWCHAR; // // UCS (Universal Character Set) types // typedef unsigned long UCSCHAR; // // Even pre-Unicode agreement, UCS values are always in the // range U+00000000 to U+7FFFFFFF, so we'll pick an obvious // value. #define UCSCHAR_INVALID_CHARACTER (0xffffffff) #define MIN_UCSCHAR (0) // // We'll assume here that the ISO-10646 / Unicode agreement // not to assign code points after U+0010FFFF holds so that // we do not have to have separate "UCSCHAR" and "UNICODECHAR" // types. // #define MAX_UCSCHAR (0x0010FFFF) typedef UCSCHAR *PUCSCHAR; typedef const UCSCHAR *PCUCSCHAR; typedef UCSCHAR *PUCSSTR; typedef UCSCHAR *PUUCSSTR; typedef const UCSCHAR *PCUCSSTR; typedef const UCSCHAR *PCUUCSSTR; typedef UCSCHAR *PUUCSCHAR; typedef const UCSCHAR *PCUUCSCHAR; // // ANSI (Multi-byte Character) types // typedef CHAR *PCHAR, *LPCH, *PCH; typedef const CHAR *LPCCH, *PCCH; typedef CHAR *NPSTR, *LPSTR, *PSTR; typedef PSTR *PZPSTR; typedef const PSTR *PCZPSTR; typedef const CHAR *LPCSTR, *PCSTR; typedef PCSTR *PZPCSTR; typedef CHAR *PZZSTR; typedef const CHAR *PCZZSTR; typedef [OnParameterOrReturnOnly] CHAR *PNZCH; typedef [OnParameterOrReturnOnly] const CHAR *PCNZCH; // // Neutral ANSI/UNICODE types and macros // typedef WCHAR TCHAR, *PTCHAR; typedef WCHAR TBYTE , *PTBYTE ; #define _TCHAR_DEFINED typedef LPWCH LPTCH, PTCH; typedef LPCWCH LPCTCH, PCTCH; typedef LPWSTR PTSTR, LPTSTR; typedef LPCWSTR PCTSTR, LPCTSTR; typedef LPUWSTR PUTSTR, LPUTSTR; typedef LPCUWSTR PCUTSTR, LPCUTSTR; typedef LPWSTR LP; typedef PZZWSTR PZZTSTR; typedef PCZZWSTR PCZZTSTR; typedef PUZZWSTR PUZZTSTR; typedef PCUZZWSTR PCUZZTSTR; typedef PNZWCH PNZTCH; typedef PCNZWCH PCNZTCH; typedef PUNZWCH PUNZTCH; typedef PCUNZWCH PCUNZTCH; #define __TEXT(quote) L##quote // r_winnt #define _TCHAR_DEFINED #define __TEXT(quote) quote // r_winnt #define TEXT(quote) __TEXT(quote) // r_winnt typedef SHORT *PSHORT; typedef LONG *PLONG; #define ALL_PROCESSOR_GROUPS 0xffff // // Structure to represent a system wide processor number. It contains a // group number and relative processor number within the group. // typedef struct _PROCESSOR_NUMBER { WORD Group; BYTE Number; BYTE Reserved; } PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; // // Structure to represent a group-specific affinity, such as that of a // thread. Specifies the group number and the affinity within that group. // typedef struct _GROUP_AFFINITY { KAFFINITY Mask; WORD Group; WORD Reserved[3]; } GROUP_AFFINITY, *PGROUP_AFFINITY; // // Handle to an Object // typedef void *HANDLE; #define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name #define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name #define DECLARE_HANDLE(name) typedef HANDLE name typedef HANDLE *PHANDLE; // // Flag (bit) fields // typedef BYTE FCHAR; typedef WORD FSHORT; typedef DWORD FLONG; // Component Object Model defines, and macros #define _HRESULT_DEFINED typedef LONG HRESULT; #define EXTERN_C extern "C" #define EXTERN_C extern // Win32 doesn't support __export #define STDMETHODCALLTYPE __cdecl #define STDMETHODCALLTYPE __stdcall #define STDMETHODVCALLTYPE __cdecl #define STDAPICALLTYPE __stdcall #define STDAPIVCALLTYPE __cdecl #define STDMETHODCALLTYPE __export __stdcall #define STDMETHODVCALLTYPE __export __cdecl #define STDAPICALLTYPE __export __stdcall #define STDAPIVCALLTYPE __export __cdecl #define STDAPI EXTERN_C HRESULT STDAPICALLTYPE #define STDAPI_(type) EXTERN_C type STDAPICALLTYPE #define STDMETHODIMP HRESULT STDMETHODCALLTYPE #define STDMETHODIMP_(type) type STDMETHODCALLTYPE #define STDOVERRIDEMETHODIMP __override STDMETHODIMP #define STDOVERRIDEMETHODIMP_(type) __override STDMETHODIMP_(type) #define IFACEMETHODIMP __override STDMETHODIMP #define IFACEMETHODIMP_(type) __override STDMETHODIMP_(type) // The 'V' versions allow Variable Argument lists. #define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE #define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE #define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE #define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE #define STDOVERRIDEMETHODIMPV __override STDMETHODIMPV #define STDOVERRIDEMETHODIMPV_(type) __override STDMETHODIMPV_(type) #define IFACEMETHODIMPV __override STDMETHODIMPV #define IFACEMETHODIMPV_(type) __override STDMETHODIMPV_(type) typedef char CCHAR; typedef DWORD LCID; typedef PDWORD PLCID; typedef WORD LANGID; #define APPLICATION_ERROR_MASK 0x20000000 #define ERROR_SEVERITY_SUCCESS 0x00000000 #define ERROR_SEVERITY_INFORMATIONAL 0x40000000 #define ERROR_SEVERITY_WARNING 0x80000000 #define ERROR_SEVERITY_ERROR 0xC0000000 // // _M_IX86 included so that EM CONTEXT structure compiles with // x86 programs. *** TBD should this be for all architectures? // // // 16 byte aligned type for 128 bit floats // // // For we define a 128 bit structure and use __declspec(align(16)) pragma to // align to 128 bits. // typedef struct _FLOAT128 { __int64 LowPart; __int64 HighPart; } FLOAT128; typedef FLOAT128 *PFLOAT128; // // __int64 is only supported by 2.0 and later midl. // __midl is set by the 2.0 midl and not by 1.0 midl. // #define _ULONGLONG_ typedef __int64 LONGLONG; typedef unsigned __int64 ULONGLONG; #define MAXLONGLONG (0x7fffffffffffffff) #define MAXLONGLONG (0x7fffffffffffffff) typedef LONGLONG *PLONGLONG; typedef ULONGLONG *PULONGLONG; // Update Sequence Number typedef LONGLONG USN; typedef struct _LARGE_INTEGER { LONGLONG QuadPart; } LARGE_INTEGER; typedef LARGE_INTEGER *PLARGE_INTEGER; typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart; } ULARGE_INTEGER; typedef ULARGE_INTEGER *PULARGE_INTEGER; // end_ntminiport end_ntndis end_ntminitape // // Locally Unique Identifier // typedef struct _LUID { DWORD LowPart; LONG HighPart; } LUID, *PLUID; #define _DWORDLONG_ typedef ULONGLONG DWORDLONG; typedef DWORDLONG *PDWORDLONG; // // Define operations to logically shift an int64 by 0..31 bits and to multiply // 32-bits by 32-bits to form a 64-bit product. // // // Midl does not understand inline assembler. Therefore, the Rtl functions // are used for shifts by 0..31 and multiplies of 32-bits times 32-bits to // form a 64-bit product. // // // IA64 and AMD64 have native 64-bit operations that are just as fast as their // 32-bit counter parts. Therefore, the int64 data type is used directly to form // shifts of 0..31 and multiplies of 32-bits times 32-bits to form a 64-bit // product. // #define Int32x32To64(a, b) (((__int64)((long)(a))) * ((__int64)((long)(b)))) #define UInt32x32To64(a, b) (((unsigned __int64)((unsigned int)(a))) * ((unsigned __int64)((unsigned int)(b)))) #define Int64ShllMod32(a, b) (((unsigned __int64)(a)) << (b)) #define Int64ShraMod32(a, b) (((__int64)(a)) >> (b)) #define Int64ShrlMod32(a, b) (((unsigned __int64)(a)) >> (b)) #define Int32x32To64(a, b) ((__int64)(((__int64)((long)(a))) * ((long)(b)))) #define UInt32x32To64(a, b) ((unsigned __int64)(((unsigned __int64)((unsigned int)(a))) * ((unsigned int)(b)))) // // Define rotate intrinsics. // extern "C" { #define RotateLeft8 _rotl8 #define RotateLeft16 _rotl16 #define RotateRight8 _rotr8 #define RotateRight16 _rotr16 unsigned char _rotl8 ( [OnParameterOnly] unsigned char Value, [OnParameterOnly] unsigned char Shift ); unsigned short _rotl16 ( [OnParameterOnly] unsigned short Value, [OnParameterOnly] unsigned char Shift ); unsigned char _rotr8 ( [OnParameterOnly] unsigned char Value, [OnParameterOnly] unsigned char Shift ); unsigned short _rotr16 ( [OnParameterOnly] unsigned short Value, [OnParameterOnly] unsigned char Shift ); #define RotateLeft32 _rotl #define RotateLeft64 _rotl64 #define RotateRight32 _rotr #define RotateRight64 _rotr64 [method: OnFunctionOnly] unsigned int _rotl ( [OnParameterOnly] unsigned int Value, [OnParameterOnly] int Shift ); [method: OnFunctionOnly] unsigned __int64 _rotl64 ( [OnParameterOnly] unsigned __int64 Value, [OnParameterOnly] int Shift ); [method: OnFunctionOnly] unsigned int _rotr ( [OnParameterOnly] unsigned int Value, [OnParameterOnly] int Shift ); [method: OnFunctionOnly] unsigned __int64 _rotr64 ( [OnParameterOnly] unsigned __int64 Value, [OnParameterOnly] int Shift ); } #define ANSI_NULL ((CHAR)0) #define UNICODE_NULL ((WCHAR)0) #define UNICODE_STRING_MAX_BYTES ((WORD ) 65534) #define UNICODE_STRING_MAX_CHARS (32767) typedef BYTE BOOLEAN; typedef BOOLEAN *PBOOLEAN; // // Doubly linked list structure. Can be used as either a list head, or // as link words. // typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink; } LIST_ENTRY, *PLIST_ENTRY, * PRLIST_ENTRY; // // Singly linked list structure. Can be used as either a list head, or // as link words. // typedef struct _SINGLE_LIST_ENTRY { struct _SINGLE_LIST_ENTRY *Next; } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY; // // These are needed for portable debugger support. // typedef struct LIST_ENTRY32 { DWORD Flink; DWORD Blink; } LIST_ENTRY32; typedef LIST_ENTRY32 *PLIST_ENTRY32; typedef struct LIST_ENTRY64 { ULONGLONG Flink; ULONGLONG Blink; } LIST_ENTRY64; typedef LIST_ENTRY64 *PLIST_ENTRY64; #define __OBJECTID_DEFINED typedef struct _OBJECTID { // size is 20 GUID Lineage; DWORD Uniquifier; } OBJECTID; #define MINCHAR 0x80 #define MAXCHAR 0x7f #define MINSHORT 0x8000 #define MAXSHORT 0x7fff #define MINLONG 0x80000000 #define MAXLONG 0x7fffffff #define MAXBYTE 0xff #define MAXWORD 0xffff #define MAXDWORD 0xffffffff // // Calculate the byte offset of a field in a structure of type type. // #define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field)) // // Calculate the size of a field in a structure of type type, without // knowing or stating the type of the field. // #define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) // // Calculate the size of a structure of type type up through and // including a field. // #define RTL_SIZEOF_THROUGH_FIELD(type, field) (FIELD_OFFSET(type, field) + RTL_FIELD_SIZE(type, field)) // // RTL_CONTAINS_FIELD usage: // // if (RTL_CONTAINS_FIELD(pBlock, pBlock->cbSize, dwMumble)) { // safe to use pBlock->dwMumble // #define RTL_CONTAINS_FIELD(Struct, Size, Field) ( (((PCHAR)(&(Struct)->Field)) + sizeof((Struct)->Field)) <= (((PCHAR)(Struct))+(Size)) ) // // Return the number of elements in a statically sized array. // DWORD Buffer[100]; // RTL_NUMBER_OF(Buffer) == 100 // This is also popularly known as: NUMBER_OF, ARRSIZE, _countof, NELEM, etc. // #define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0])) // // RtlpNumberOf is a function that takes a reference to an array of N Ts. // // typedef T array_of_T[N]; // typedef array_of_T &reference_to_array_of_T; // // RtlpNumberOf returns a pointer to an array of N chars. // We could return a reference instead of a pointer but older compilers do not accept that. // // typedef char array_of_char[N]; // typedef array_of_char *pointer_to_array_of_char; // // sizeof(array_of_char) == N // sizeof(*pointer_to_array_of_char) == N // // pointer_to_array_of_char RtlpNumberOf(reference_to_array_of_T); // // We never even call RtlpNumberOf, we just take the size of dereferencing its return type. // We do not even implement RtlpNumberOf, we just decare it. // // Attempts to pass pointers instead of arrays to this macro result in compile time errors. // That is the point. // extern "C++" // templates cannot be declared to have 'C' linkage template char (*RtlpNumberOf( T (&)[N] ))[N]; #define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A))) // // This does not work with: // // void Foo() // { // struct { int x; } y[2]; // RTL_NUMBER_OF_V2(y); // illegal use of anonymous local type in template instantiation // } // // You must instead do: // // struct Foo1 { int x; }; // // void Foo() // { // Foo1 y[2]; // RTL_NUMBER_OF_V2(y); // ok // } // // OR // // void Foo() // { // struct { int x; } y[2]; // RTL_NUMBER_OF_V1(y); // ok // } // // OR // // void Foo() // { // struct { int x; } y[2]; // _ARRAYSIZE(y); // ok // } // #define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A) #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A) #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A) // // ARRAYSIZE is more readable version of RTL_NUMBER_OF_V2, and uses // it regardless of ENABLE_RTL_NUMBER_OF_V2 // // _ARRAYSIZE is a version useful for anonymous types // #define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A) #define _ARRAYSIZE(A) RTL_NUMBER_OF_V1(A) // // An expression that yields the type of a field in a struct. // #define RTL_FIELD_TYPE(type, field) (((type*)0)->field) // RTL_ to avoid collisions in the global namespace. // // Given typedef struct _FOO { BYTE Bar[123]; } FOO; // RTL_NUMBER_OF_FIELD(FOO, Bar) == 123 // #define RTL_NUMBER_OF_FIELD(type, field) (RTL_NUMBER_OF(RTL_FIELD_TYPE(type, field))) // // eg: // typedef struct FOO { // DWORD Integer; // PVOID Pointer; // } FOO; // // RTL_PADDING_BETWEEN_FIELDS(FOO, Integer, Pointer) == 0 for Win32, 4 for Win64 // #define RTL_PADDING_BETWEEN_FIELDS(T, F1, F2) ((FIELD_OFFSET(T, F2) > FIELD_OFFSET(T, F1)) ? (FIELD_OFFSET(T, F2) - FIELD_OFFSET(T, F1) - RTL_FIELD_SIZE(T, F1)) : (FIELD_OFFSET(T, F1) - FIELD_OFFSET(T, F2) - RTL_FIELD_SIZE(T, F2))) // RTL_ to avoid collisions in the global namespace. #define RTL_CONST_CAST(type) const_cast #define RTL_CONST_CAST(type) (type) // like sizeof // usually this would be * CHAR_BIT, but we don't necessarily have #include #define RTL_BITS_OF(sizeOfArg) (sizeof(sizeOfArg) * 8) #define RTL_BITS_OF_FIELD(type, field) (RTL_BITS_OF(RTL_FIELD_TYPE(type, field))) // // Calculate the address of the base of the structure given its type, and an // address of a field within the structure. // #define CONTAINING_RECORD(address, type, field) ((type *)( (PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) // end_ntminiport end_ntndis // // Exception handler routine definition. // typedef EXCEPTION_DISPOSITION EXCEPTION_ROUTINE ( [OnParameterOnly] struct _EXCEPTION_RECORD *ExceptionRecord, [OnParameterOnly] PVOID EstablisherFrame, [OnParameterOnly] struct _CONTEXT *ContextRecord, [OnParameterOnly] PVOID DispatcherContext ); typedef EXCEPTION_ROUTINE *PEXCEPTION_ROUTINE; #define VER_SERVER_NT 0x80000000 #define VER_WORKSTATION_NT 0x40000000 #define VER_SUITE_SMALLBUSINESS 0x00000001 #define VER_SUITE_ENTERPRISE 0x00000002 #define VER_SUITE_BACKOFFICE 0x00000004 #define VER_SUITE_COMMUNICATIONS 0x00000008 #define VER_SUITE_TERMINAL 0x00000010 #define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020 #define VER_SUITE_EMBEDDEDNT 0x00000040 #define VER_SUITE_DATACENTER 0x00000080 #define VER_SUITE_SINGLEUSERTS 0x00000100 #define VER_SUITE_PERSONAL 0x00000200 #define VER_SUITE_BLADE 0x00000400 #define VER_SUITE_EMBEDDED_RESTRICTED 0x00000800 #define VER_SUITE_SECURITY_APPLIANCE 0x00001000 #define VER_SUITE_STORAGE_SERVER 0x00002000 #define VER_SUITE_COMPUTE_SERVER 0x00004000 #define VER_SUITE_WH_SERVER 0x00008000 // // Product types // This list grows with each OS release. // // There is no ordering of values to ensure callers // do an equality test i.e. greater-than and less-than // comparisons are not useful. // // NOTE: Values in this list should never be deleted. // When a product-type 'X' gets dropped from a // OS release onwards, the value of 'X' continues // to be used in the mapping table of GetProductInfo. // #define PRODUCT_UNDEFINED 0x00000000 #define PRODUCT_ULTIMATE 0x00000001 #define PRODUCT_HOME_BASIC 0x00000002 #define PRODUCT_HOME_PREMIUM 0x00000003 #define PRODUCT_ENTERPRISE 0x00000004 #define PRODUCT_HOME_BASIC_N 0x00000005 #define PRODUCT_BUSINESS 0x00000006 #define PRODUCT_STANDARD_SERVER 0x00000007 #define PRODUCT_DATACENTER_SERVER 0x00000008 #define PRODUCT_SMALLBUSINESS_SERVER 0x00000009 #define PRODUCT_ENTERPRISE_SERVER 0x0000000A #define PRODUCT_STARTER 0x0000000B #define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C #define PRODUCT_STANDARD_SERVER_CORE 0x0000000D #define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E #define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F #define PRODUCT_BUSINESS_N 0x00000010 #define PRODUCT_WEB_SERVER 0x00000011 #define PRODUCT_CLUSTER_SERVER 0x00000012 #define PRODUCT_HOME_SERVER 0x00000013 #define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014 #define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015 #define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016 #define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017 #define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018 #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019 #define PRODUCT_HOME_PREMIUM_N 0x0000001A #define PRODUCT_ENTERPRISE_N 0x0000001B #define PRODUCT_ULTIMATE_N 0x0000001C #define PRODUCT_WEB_SERVER_CORE 0x0000001D #define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT 0x0000001E #define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY 0x0000001F #define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING 0x00000020 #define PRODUCT_SERVER_FOUNDATION 0x00000021 #define PRODUCT_HOME_PREMIUM_SERVER 0x00000022 #define PRODUCT_SERVER_FOR_SMALLBUSINESS_V 0x00000023 #define PRODUCT_STANDARD_SERVER_V 0x00000024 #define PRODUCT_DATACENTER_SERVER_V 0x00000025 #define PRODUCT_ENTERPRISE_SERVER_V 0x00000026 #define PRODUCT_DATACENTER_SERVER_CORE_V 0x00000027 #define PRODUCT_STANDARD_SERVER_CORE_V 0x00000028 #define PRODUCT_ENTERPRISE_SERVER_CORE_V 0x00000029 #define PRODUCT_HYPERV 0x0000002A #define PRODUCT_STORAGE_EXPRESS_SERVER_CORE 0x0000002B #define PRODUCT_STORAGE_STANDARD_SERVER_CORE 0x0000002C #define PRODUCT_STORAGE_WORKGROUP_SERVER_CORE 0x0000002D #define PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE 0x0000002E #define PRODUCT_STARTER_N 0x0000002F #define PRODUCT_PROFESSIONAL 0x00000030 #define PRODUCT_PROFESSIONAL_N 0x00000031 #define PRODUCT_SB_SOLUTION_SERVER 0x00000032 #define PRODUCT_SERVER_FOR_SB_SOLUTIONS 0x00000033 #define PRODUCT_STANDARD_SERVER_SOLUTIONS 0x00000034 #define PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE 0x00000035 #define PRODUCT_SB_SOLUTION_SERVER_EM 0x00000036 #define PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM 0x00000037 #define PRODUCT_SOLUTION_EMBEDDEDSERVER 0x00000038 #define PRODUCT_SOLUTION_EMBEDDEDSERVER_CORE 0x00000039 #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE 0x0000003F #define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT 0x0000003B #define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL 0x0000003C #define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC 0x0000003D #define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC 0x0000003E #define PRODUCT_CLUSTER_SERVER_V 0x00000040 #define PRODUCT_EMBEDDED 0x00000041 #define PRODUCT_STARTER_E 0x00000042 #define PRODUCT_HOME_BASIC_E 0x00000043 #define PRODUCT_HOME_PREMIUM_E 0x00000044 #define PRODUCT_PROFESSIONAL_E 0x00000045 #define PRODUCT_ENTERPRISE_E 0x00000046 #define PRODUCT_ULTIMATE_E 0x00000047 #define PRODUCT_UNLICENSED 0xABCDABCD // // Language IDs. // // Note that the named locale APIs (eg GetLocaleInfoEx) are preferred. // // Not all locales have unique Language IDs // // The following two combinations of primary language ID and // sublanguage ID have special semantics: // // Primary Language ID Sublanguage ID Result // ------------------- --------------- ------------------------ // LANG_NEUTRAL SUBLANG_NEUTRAL Language neutral // LANG_NEUTRAL SUBLANG_DEFAULT User default language // LANG_NEUTRAL SUBLANG_SYS_DEFAULT System default language // LANG_INVARIANT SUBLANG_NEUTRAL Invariant locale // // It is recommended that applications test for locale names instead of // Language IDs / LCIDs. // // Primary language IDs. // // WARNING: These aren't always unique. Bosnian, Serbian & Croation for example. // // It is recommended that applications test for locale names or actual LCIDs. // // Note that the LANG, SUBLANG construction is not always consistent. // The named locale APIs (eg GetLocaleInfoEx) are recommended. // #define LANG_NEUTRAL 0x00 #define LANG_INVARIANT 0x7f #define LANG_AFRIKAANS 0x36 #define LANG_ALBANIAN 0x1c #define LANG_ALSATIAN 0x84 #define LANG_AMHARIC 0x5e #define LANG_ARABIC 0x01 #define LANG_ARMENIAN 0x2b #define LANG_ASSAMESE 0x4d #define LANG_AZERI 0x2c #define LANG_BASHKIR 0x6d #define LANG_BASQUE 0x2d #define LANG_BELARUSIAN 0x23 #define LANG_BENGALI 0x45 #define LANG_BRETON 0x7e #define LANG_BOSNIAN 0x1a // Use with SUBLANG_BOSNIAN_* Sublanguage IDs #define LANG_BOSNIAN_NEUTRAL 0x781a // Use with the ConvertDefaultLocale function #define LANG_BULGARIAN 0x02 #define LANG_CATALAN 0x03 #define LANG_CHINESE 0x04 // Use with SUBLANG_CHINESE_* Sublanguage IDs #define LANG_CHINESE_SIMPLIFIED 0x04 // Use with the ConvertDefaultLocale function #define LANG_CHINESE_TRADITIONAL 0x7c04 // Use with the ConvertDefaultLocale function #define LANG_CORSICAN 0x83 #define LANG_CROATIAN 0x1a #define LANG_CZECH 0x05 #define LANG_DANISH 0x06 #define LANG_DARI 0x8c #define LANG_DIVEHI 0x65 #define LANG_DUTCH 0x13 #define LANG_ENGLISH 0x09 #define LANG_ESTONIAN 0x25 #define LANG_FAEROESE 0x38 #define LANG_FARSI 0x29 // Deprecated: use LANG_PERSIAN instead #define LANG_FILIPINO 0x64 #define LANG_FINNISH 0x0b #define LANG_FRENCH 0x0c #define LANG_FRISIAN 0x62 #define LANG_GALICIAN 0x56 #define LANG_GEORGIAN 0x37 #define LANG_GERMAN 0x07 #define LANG_GREEK 0x08 #define LANG_GREENLANDIC 0x6f #define LANG_GUJARATI 0x47 #define LANG_HAUSA 0x68 #define LANG_HEBREW 0x0d #define LANG_HINDI 0x39 #define LANG_HUNGARIAN 0x0e #define LANG_ICELANDIC 0x0f #define LANG_IGBO 0x70 #define LANG_INDONESIAN 0x21 #define LANG_INUKTITUT 0x5d #define LANG_IRISH 0x3c // Use with the SUBLANG_IRISH_IRELAND Sublanguage ID #define LANG_ITALIAN 0x10 #define LANG_JAPANESE 0x11 #define LANG_KANNADA 0x4b #define LANG_KASHMIRI 0x60 #define LANG_KAZAK 0x3f #define LANG_KHMER 0x53 #define LANG_KICHE 0x86 #define LANG_KINYARWANDA 0x87 #define LANG_KONKANI 0x57 #define LANG_KOREAN 0x12 #define LANG_KYRGYZ 0x40 #define LANG_LAO 0x54 #define LANG_LATVIAN 0x26 #define LANG_LITHUANIAN 0x27 #define LANG_LOWER_SORBIAN 0x2e #define LANG_LUXEMBOURGISH 0x6e #define LANG_MACEDONIAN 0x2f // the Former Yugoslav Republic of Macedonia #define LANG_MALAY 0x3e #define LANG_MALAYALAM 0x4c #define LANG_MALTESE 0x3a #define LANG_MANIPURI 0x58 #define LANG_MAORI 0x81 #define LANG_MAPUDUNGUN 0x7a #define LANG_MARATHI 0x4e #define LANG_MOHAWK 0x7c #define LANG_MONGOLIAN 0x50 #define LANG_NEPALI 0x61 #define LANG_NORWEGIAN 0x14 #define LANG_OCCITAN 0x82 #define LANG_ORIYA 0x48 #define LANG_PASHTO 0x63 #define LANG_PERSIAN 0x29 #define LANG_POLISH 0x15 #define LANG_PORTUGUESE 0x16 #define LANG_PUNJABI 0x46 #define LANG_QUECHUA 0x6b #define LANG_ROMANIAN 0x18 #define LANG_ROMANSH 0x17 #define LANG_RUSSIAN 0x19 #define LANG_SAMI 0x3b #define LANG_SANSKRIT 0x4f #define LANG_SCOTTISH_GAELIC 0x91 #define LANG_SERBIAN 0x1a // Use with the SUBLANG_SERBIAN_* Sublanguage IDs #define LANG_SERBIAN_NEUTRAL 0x7c1a // Use with the ConvertDefaultLocale function #define LANG_SINDHI 0x59 #define LANG_SINHALESE 0x5b #define LANG_SLOVAK 0x1b #define LANG_SLOVENIAN 0x24 #define LANG_SOTHO 0x6c #define LANG_SPANISH 0x0a #define LANG_SWAHILI 0x41 #define LANG_SWEDISH 0x1d #define LANG_SYRIAC 0x5a #define LANG_TAJIK 0x28 #define LANG_TAMAZIGHT 0x5f #define LANG_TAMIL 0x49 #define LANG_TATAR 0x44 #define LANG_TELUGU 0x4a #define LANG_THAI 0x1e #define LANG_TIBETAN 0x51 #define LANG_TIGRIGNA 0x73 #define LANG_TSWANA 0x32 #define LANG_TURKISH 0x1f #define LANG_TURKMEN 0x42 #define LANG_UIGHUR 0x80 #define LANG_UKRAINIAN 0x22 #define LANG_UPPER_SORBIAN 0x2e #define LANG_URDU 0x20 #define LANG_UZBEK 0x43 #define LANG_VIETNAMESE 0x2a #define LANG_WELSH 0x52 #define LANG_WOLOF 0x88 #define LANG_XHOSA 0x34 #define LANG_YAKUT 0x85 #define LANG_YI 0x78 #define LANG_YORUBA 0x6a #define LANG_ZULU 0x35 // // Sublanguage IDs. // // The name immediately following SUBLANG_ dictates which primary // language ID that sublanguage ID can be combined with to form a // valid language ID. // // Note that the LANG, SUBLANG construction is not always consistent. // The named locale APIs (eg GetLocaleInfoEx) are recommended. // #define SUBLANG_NEUTRAL 0x00 // language neutral #define SUBLANG_DEFAULT 0x01 // user default #define SUBLANG_SYS_DEFAULT 0x02 // system default #define SUBLANG_CUSTOM_DEFAULT 0x03 // default custom language/locale #define SUBLANG_CUSTOM_UNSPECIFIED 0x04 // custom language/locale #define SUBLANG_UI_CUSTOM_DEFAULT 0x05 // Default custom MUI language/locale #define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01 // Afrikaans (South Africa) 0x0436 af-ZA #define SUBLANG_ALBANIAN_ALBANIA 0x01 // Albanian (Albania) 0x041c sq-AL #define SUBLANG_ALSATIAN_FRANCE 0x01 // Alsatian (France) 0x0484 #define SUBLANG_AMHARIC_ETHIOPIA 0x01 // Amharic (Ethiopia) 0x045e #define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 // Arabic (Saudi Arabia) #define SUBLANG_ARABIC_IRAQ 0x02 // Arabic (Iraq) #define SUBLANG_ARABIC_EGYPT 0x03 // Arabic (Egypt) #define SUBLANG_ARABIC_LIBYA 0x04 // Arabic (Libya) #define SUBLANG_ARABIC_ALGERIA 0x05 // Arabic (Algeria) #define SUBLANG_ARABIC_MOROCCO 0x06 // Arabic (Morocco) #define SUBLANG_ARABIC_TUNISIA 0x07 // Arabic (Tunisia) #define SUBLANG_ARABIC_OMAN 0x08 // Arabic (Oman) #define SUBLANG_ARABIC_YEMEN 0x09 // Arabic (Yemen) #define SUBLANG_ARABIC_SYRIA 0x0a // Arabic (Syria) #define SUBLANG_ARABIC_JORDAN 0x0b // Arabic (Jordan) #define SUBLANG_ARABIC_LEBANON 0x0c // Arabic (Lebanon) #define SUBLANG_ARABIC_KUWAIT 0x0d // Arabic (Kuwait) #define SUBLANG_ARABIC_UAE 0x0e // Arabic (U.A.E) #define SUBLANG_ARABIC_BAHRAIN 0x0f // Arabic (Bahrain) #define SUBLANG_ARABIC_QATAR 0x10 // Arabic (Qatar) #define SUBLANG_ARMENIAN_ARMENIA 0x01 // Armenian (Armenia) 0x042b hy-AM #define SUBLANG_ASSAMESE_INDIA 0x01 // Assamese (India) 0x044d #define SUBLANG_AZERI_LATIN 0x01 // Azeri (Latin) #define SUBLANG_AZERI_CYRILLIC 0x02 // Azeri (Cyrillic) #define SUBLANG_BASHKIR_RUSSIA 0x01 // Bashkir (Russia) 0x046d ba-RU #define SUBLANG_BASQUE_BASQUE 0x01 // Basque (Basque) 0x042d eu-ES #define SUBLANG_BELARUSIAN_BELARUS 0x01 // Belarusian (Belarus) 0x0423 be-BY #define SUBLANG_BENGALI_INDIA 0x01 // Bengali (India) #define SUBLANG_BENGALI_BANGLADESH 0x02 // Bengali (Bangladesh) #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 // Bosnian (Bosnia and Herzegovina - Latin) 0x141a bs-BA-Latn #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08 // Bosnian (Bosnia and Herzegovina - Cyrillic) 0x201a bs-BA-Cyrl #define SUBLANG_BRETON_FRANCE 0x01 // Breton (France) 0x047e #define SUBLANG_BULGARIAN_BULGARIA 0x01 // Bulgarian (Bulgaria) 0x0402 #define SUBLANG_CATALAN_CATALAN 0x01 // Catalan (Catalan) 0x0403 #define SUBLANG_CHINESE_TRADITIONAL 0x01 // Chinese (Taiwan) 0x0404 zh-TW #define SUBLANG_CHINESE_SIMPLIFIED 0x02 // Chinese (PR China) 0x0804 zh-CN #define SUBLANG_CHINESE_HONGKONG 0x03 // Chinese (Hong Kong S.A.R., P.R.C.) 0x0c04 zh-HK #define SUBLANG_CHINESE_SINGAPORE 0x04 // Chinese (Singapore) 0x1004 zh-SG #define SUBLANG_CHINESE_MACAU 0x05 // Chinese (Macau S.A.R.) 0x1404 zh-MO #define SUBLANG_CORSICAN_FRANCE 0x01 // Corsican (France) 0x0483 #define SUBLANG_CZECH_CZECH_REPUBLIC 0x01 // Czech (Czech Republic) 0x0405 #define SUBLANG_CROATIAN_CROATIA 0x01 // Croatian (Croatia) #define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 // Croatian (Bosnia and Herzegovina - Latin) 0x101a hr-BA #define SUBLANG_DANISH_DENMARK 0x01 // Danish (Denmark) 0x0406 #define SUBLANG_DARI_AFGHANISTAN 0x01 // Dari (Afghanistan) #define SUBLANG_DIVEHI_MALDIVES 0x01 // Divehi (Maldives) 0x0465 div-MV #define SUBLANG_DUTCH 0x01 // Dutch #define SUBLANG_DUTCH_BELGIAN 0x02 // Dutch (Belgian) #define SUBLANG_ENGLISH_US 0x01 // English (USA) #define SUBLANG_ENGLISH_UK 0x02 // English (UK) #define SUBLANG_ENGLISH_AUS 0x03 // English (Australian) #define SUBLANG_ENGLISH_CAN 0x04 // English (Canadian) #define SUBLANG_ENGLISH_NZ 0x05 // English (New Zealand) #define SUBLANG_ENGLISH_EIRE 0x06 // English (Irish) #define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 // English (South Africa) #define SUBLANG_ENGLISH_JAMAICA 0x08 // English (Jamaica) #define SUBLANG_ENGLISH_CARIBBEAN 0x09 // English (Caribbean) #define SUBLANG_ENGLISH_BELIZE 0x0a // English (Belize) #define SUBLANG_ENGLISH_TRINIDAD 0x0b // English (Trinidad) #define SUBLANG_ENGLISH_ZIMBABWE 0x0c // English (Zimbabwe) #define SUBLANG_ENGLISH_PHILIPPINES 0x0d // English (Philippines) #define SUBLANG_ENGLISH_INDIA 0x10 // English (India) #define SUBLANG_ENGLISH_MALAYSIA 0x11 // English (Malaysia) #define SUBLANG_ENGLISH_SINGAPORE 0x12 // English (Singapore) #define SUBLANG_ESTONIAN_ESTONIA 0x01 // Estonian (Estonia) 0x0425 et-EE #define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01 // Faroese (Faroe Islands) 0x0438 fo-FO #define SUBLANG_FILIPINO_PHILIPPINES 0x01 // Filipino (Philippines) 0x0464 fil-PH #define SUBLANG_FINNISH_FINLAND 0x01 // Finnish (Finland) 0x040b #define SUBLANG_FRENCH 0x01 // French #define SUBLANG_FRENCH_BELGIAN 0x02 // French (Belgian) #define SUBLANG_FRENCH_CANADIAN 0x03 // French (Canadian) #define SUBLANG_FRENCH_SWISS 0x04 // French (Swiss) #define SUBLANG_FRENCH_LUXEMBOURG 0x05 // French (Luxembourg) #define SUBLANG_FRENCH_MONACO 0x06 // French (Monaco) #define SUBLANG_FRISIAN_NETHERLANDS 0x01 // Frisian (Netherlands) 0x0462 fy-NL #define SUBLANG_GALICIAN_GALICIAN 0x01 // Galician (Galician) 0x0456 gl-ES #define SUBLANG_GEORGIAN_GEORGIA 0x01 // Georgian (Georgia) 0x0437 ka-GE #define SUBLANG_GERMAN 0x01 // German #define SUBLANG_GERMAN_SWISS 0x02 // German (Swiss) #define SUBLANG_GERMAN_AUSTRIAN 0x03 // German (Austrian) #define SUBLANG_GERMAN_LUXEMBOURG 0x04 // German (Luxembourg) #define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 // German (Liechtenstein) #define SUBLANG_GREEK_GREECE 0x01 // Greek (Greece) #define SUBLANG_GREENLANDIC_GREENLAND 0x01 // Greenlandic (Greenland) 0x046f kl-GL #define SUBLANG_GUJARATI_INDIA 0x01 // Gujarati (India (Gujarati Script)) 0x0447 gu-IN #define SUBLANG_HAUSA_NIGERIA_LATIN 0x01 // Hausa (Latin, Nigeria) 0x0468 ha-NG-Latn #define SUBLANG_HEBREW_ISRAEL 0x01 // Hebrew (Israel) 0x040d #define SUBLANG_HINDI_INDIA 0x01 // Hindi (India) 0x0439 hi-IN #define SUBLANG_HUNGARIAN_HUNGARY 0x01 // Hungarian (Hungary) 0x040e #define SUBLANG_ICELANDIC_ICELAND 0x01 // Icelandic (Iceland) 0x040f #define SUBLANG_IGBO_NIGERIA 0x01 // Igbo (Nigeria) 0x0470 ig-NG #define SUBLANG_INDONESIAN_INDONESIA 0x01 // Indonesian (Indonesia) 0x0421 id-ID #define SUBLANG_INUKTITUT_CANADA 0x01 // Inuktitut (Syllabics) (Canada) 0x045d iu-CA-Cans #define SUBLANG_INUKTITUT_CANADA_LATIN 0x02 // Inuktitut (Canada - Latin) #define SUBLANG_IRISH_IRELAND 0x02 // Irish (Ireland) #define SUBLANG_ITALIAN 0x01 // Italian #define SUBLANG_ITALIAN_SWISS 0x02 // Italian (Swiss) #define SUBLANG_JAPANESE_JAPAN 0x01 // Japanese (Japan) 0x0411 #define SUBLANG_KANNADA_INDIA 0x01 // Kannada (India (Kannada Script)) 0x044b kn-IN #define SUBLANG_KASHMIRI_SASIA 0x02 // Kashmiri (South Asia) #define SUBLANG_KASHMIRI_INDIA 0x02 // For app compatibility only #define SUBLANG_KAZAK_KAZAKHSTAN 0x01 // Kazakh (Kazakhstan) 0x043f kk-KZ #define SUBLANG_KHMER_CAMBODIA 0x01 // Khmer (Cambodia) 0x0453 kh-KH #define SUBLANG_KICHE_GUATEMALA 0x01 // K'iche (Guatemala) #define SUBLANG_KINYARWANDA_RWANDA 0x01 // Kinyarwanda (Rwanda) 0x0487 rw-RW #define SUBLANG_KONKANI_INDIA 0x01 // Konkani (India) 0x0457 kok-IN #define SUBLANG_KOREAN 0x01 // Korean (Extended Wansung) #define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01 // Kyrgyz (Kyrgyzstan) 0x0440 ky-KG #define SUBLANG_LAO_LAO 0x01 // Lao (Lao PDR) 0x0454 lo-LA #define SUBLANG_LATVIAN_LATVIA 0x01 // Latvian (Latvia) 0x0426 lv-LV #define SUBLANG_LITHUANIAN 0x01 // Lithuanian #define SUBLANG_LOWER_SORBIAN_GERMANY 0x02 // Lower Sorbian (Germany) 0x082e wee-DE #define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01 // Luxembourgish (Luxembourg) 0x046e lb-LU #define SUBLANG_MACEDONIAN_MACEDONIA 0x01 // Macedonian (Macedonia (FYROM)) 0x042f mk-MK #define SUBLANG_MALAY_MALAYSIA 0x01 // Malay (Malaysia) #define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 // Malay (Brunei Darussalam) #define SUBLANG_MALAYALAM_INDIA 0x01 // Malayalam (India (Malayalam Script) ) 0x044c ml-IN #define SUBLANG_MALTESE_MALTA 0x01 // Maltese (Malta) 0x043a mt-MT #define SUBLANG_MAORI_NEW_ZEALAND 0x01 // Maori (New Zealand) 0x0481 mi-NZ #define SUBLANG_MAPUDUNGUN_CHILE 0x01 // Mapudungun (Chile) 0x047a arn-CL #define SUBLANG_MARATHI_INDIA 0x01 // Marathi (India) 0x044e mr-IN #define SUBLANG_MOHAWK_MOHAWK 0x01 // Mohawk (Mohawk) 0x047c moh-CA #define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01 // Mongolian (Cyrillic, Mongolia) #define SUBLANG_MONGOLIAN_PRC 0x02 // Mongolian (PRC) #define SUBLANG_NEPALI_INDIA 0x02 // Nepali (India) #define SUBLANG_NEPALI_NEPAL 0x01 // Nepali (Nepal) 0x0461 ne-NP #define SUBLANG_NORWEGIAN_BOKMAL 0x01 // Norwegian (Bokmal) #define SUBLANG_NORWEGIAN_NYNORSK 0x02 // Norwegian (Nynorsk) #define SUBLANG_OCCITAN_FRANCE 0x01 // Occitan (France) 0x0482 oc-FR #define SUBLANG_ORIYA_INDIA 0x01 // Oriya (India (Oriya Script)) 0x0448 or-IN #define SUBLANG_PASHTO_AFGHANISTAN 0x01 // Pashto (Afghanistan) #define SUBLANG_PERSIAN_IRAN 0x01 // Persian (Iran) 0x0429 fa-IR #define SUBLANG_POLISH_POLAND 0x01 // Polish (Poland) 0x0415 #define SUBLANG_PORTUGUESE 0x02 // Portuguese #define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 // Portuguese (Brazilian) #define SUBLANG_PUNJABI_INDIA 0x01 // Punjabi (India (Gurmukhi Script)) 0x0446 pa-IN #define SUBLANG_QUECHUA_BOLIVIA 0x01 // Quechua (Bolivia) #define SUBLANG_QUECHUA_ECUADOR 0x02 // Quechua (Ecuador) #define SUBLANG_QUECHUA_PERU 0x03 // Quechua (Peru) #define SUBLANG_ROMANIAN_ROMANIA 0x01 // Romanian (Romania) 0x0418 #define SUBLANG_ROMANSH_SWITZERLAND 0x01 // Romansh (Switzerland) 0x0417 rm-CH #define SUBLANG_RUSSIAN_RUSSIA 0x01 // Russian (Russia) 0x0419 #define SUBLANG_SAMI_NORTHERN_NORWAY 0x01 // Northern Sami (Norway) #define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02 // Northern Sami (Sweden) #define SUBLANG_SAMI_NORTHERN_FINLAND 0x03 // Northern Sami (Finland) #define SUBLANG_SAMI_LULE_NORWAY 0x04 // Lule Sami (Norway) #define SUBLANG_SAMI_LULE_SWEDEN 0x05 // Lule Sami (Sweden) #define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06 // Southern Sami (Norway) #define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07 // Southern Sami (Sweden) #define SUBLANG_SAMI_SKOLT_FINLAND 0x08 // Skolt Sami (Finland) #define SUBLANG_SAMI_INARI_FINLAND 0x09 // Inari Sami (Finland) #define SUBLANG_SANSKRIT_INDIA 0x01 // Sanskrit (India) 0x044f sa-IN #define SUBLANG_SCOTTISH_GAELIC 0x01 // Scottish Gaelic (United Kingdom) 0x0491 gd-GB #define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN 0x06 // Serbian (Bosnia and Herzegovina - Latin) #define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07 // Serbian (Bosnia and Herzegovina - Cyrillic) #define SUBLANG_SERBIAN_MONTENEGRO_LATIN 0x0b // Serbian (Montenegro - Latn) #define SUBLANG_SERBIAN_MONTENEGRO_CYRILLIC 0x0c // Serbian (Montenegro - Cyrillic) #define SUBLANG_SERBIAN_SERBIA_LATIN 0x09 // Serbian (Serbia - Latin) #define SUBLANG_SERBIAN_SERBIA_CYRILLIC 0x0a // Serbian (Serbia - Cyrillic) #define SUBLANG_SERBIAN_CROATIA 0x01 // Croatian (Croatia) 0x041a hr-HR #define SUBLANG_SERBIAN_LATIN 0x02 // Serbian (Latin) #define SUBLANG_SERBIAN_CYRILLIC 0x03 // Serbian (Cyrillic) #define SUBLANG_SINDHI_INDIA 0x01 // Sindhi (India) reserved 0x0459 #define SUBLANG_SINDHI_PAKISTAN 0x02 // Sindhi (Pakistan) reserved 0x0859 #define SUBLANG_SINDHI_AFGHANISTAN 0x02 // For app compatibility only #define SUBLANG_SINHALESE_SRI_LANKA 0x01 // Sinhalese (Sri Lanka) #define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA 0x01 // Northern Sotho (South Africa) #define SUBLANG_SLOVAK_SLOVAKIA 0x01 // Slovak (Slovakia) 0x041b sk-SK #define SUBLANG_SLOVENIAN_SLOVENIA 0x01 // Slovenian (Slovenia) 0x0424 sl-SI #define SUBLANG_SPANISH 0x01 // Spanish (Castilian) #define SUBLANG_SPANISH_MEXICAN 0x02 // Spanish (Mexican) #define SUBLANG_SPANISH_MODERN 0x03 // Spanish (Modern) #define SUBLANG_SPANISH_GUATEMALA 0x04 // Spanish (Guatemala) #define SUBLANG_SPANISH_COSTA_RICA 0x05 // Spanish (Costa Rica) #define SUBLANG_SPANISH_PANAMA 0x06 // Spanish (Panama) #define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 // Spanish (Dominican Republic) #define SUBLANG_SPANISH_VENEZUELA 0x08 // Spanish (Venezuela) #define SUBLANG_SPANISH_COLOMBIA 0x09 // Spanish (Colombia) #define SUBLANG_SPANISH_PERU 0x0a // Spanish (Peru) #define SUBLANG_SPANISH_ARGENTINA 0x0b // Spanish (Argentina) #define SUBLANG_SPANISH_ECUADOR 0x0c // Spanish (Ecuador) #define SUBLANG_SPANISH_CHILE 0x0d // Spanish (Chile) #define SUBLANG_SPANISH_URUGUAY 0x0e // Spanish (Uruguay) #define SUBLANG_SPANISH_PARAGUAY 0x0f // Spanish (Paraguay) #define SUBLANG_SPANISH_BOLIVIA 0x10 // Spanish (Bolivia) #define SUBLANG_SPANISH_EL_SALVADOR 0x11 // Spanish (El Salvador) #define SUBLANG_SPANISH_HONDURAS 0x12 // Spanish (Honduras) #define SUBLANG_SPANISH_NICARAGUA 0x13 // Spanish (Nicaragua) #define SUBLANG_SPANISH_PUERTO_RICO 0x14 // Spanish (Puerto Rico) #define SUBLANG_SPANISH_US 0x15 // Spanish (United States) #define SUBLANG_SWAHILI_KENYA 0x01 // Swahili (Kenya) 0x0441 sw-KE #define SUBLANG_SWEDISH 0x01 // Swedish #define SUBLANG_SWEDISH_FINLAND 0x02 // Swedish (Finland) #define SUBLANG_SYRIAC_SYRIA 0x01 // Syriac (Syria) 0x045a syr-SY #define SUBLANG_TAJIK_TAJIKISTAN 0x01 // Tajik (Tajikistan) 0x0428 tg-TJ-Cyrl #define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02 // Tamazight (Latin, Algeria) 0x085f tmz-DZ-Latn #define SUBLANG_TAMIL_INDIA 0x01 // Tamil (India) #define SUBLANG_TATAR_RUSSIA 0x01 // Tatar (Russia) 0x0444 tt-RU #define SUBLANG_TELUGU_INDIA 0x01 // Telugu (India (Telugu Script)) 0x044a te-IN #define SUBLANG_THAI_THAILAND 0x01 // Thai (Thailand) 0x041e th-TH #define SUBLANG_TIBETAN_PRC 0x01 // Tibetan (PRC) #define SUBLANG_TIGRIGNA_ERITREA 0x02 // Tigrigna (Eritrea) #define SUBLANG_TSWANA_SOUTH_AFRICA 0x01 // Setswana / Tswana (South Africa) 0x0432 tn-ZA #define SUBLANG_TURKISH_TURKEY 0x01 // Turkish (Turkey) 0x041f tr-TR #define SUBLANG_TURKMEN_TURKMENISTAN 0x01 // Turkmen (Turkmenistan) 0x0442 tk-TM #define SUBLANG_UIGHUR_PRC 0x01 // Uighur (PRC) 0x0480 ug-CN #define SUBLANG_UKRAINIAN_UKRAINE 0x01 // Ukrainian (Ukraine) 0x0422 uk-UA #define SUBLANG_UPPER_SORBIAN_GERMANY 0x01 // Upper Sorbian (Germany) 0x042e wen-DE #define SUBLANG_URDU_PAKISTAN 0x01 // Urdu (Pakistan) #define SUBLANG_URDU_INDIA 0x02 // Urdu (India) #define SUBLANG_UZBEK_LATIN 0x01 // Uzbek (Latin) #define SUBLANG_UZBEK_CYRILLIC 0x02 // Uzbek (Cyrillic) #define SUBLANG_VIETNAMESE_VIETNAM 0x01 // Vietnamese (Vietnam) 0x042a vi-VN #define SUBLANG_WELSH_UNITED_KINGDOM 0x01 // Welsh (United Kingdom) 0x0452 cy-GB #define SUBLANG_WOLOF_SENEGAL 0x01 // Wolof (Senegal) #define SUBLANG_XHOSA_SOUTH_AFRICA 0x01 // isiXhosa / Xhosa (South Africa) 0x0434 xh-ZA #define SUBLANG_YAKUT_RUSSIA 0x01 // Yakut (Russia) 0x0485 sah-RU #define SUBLANG_YI_PRC 0x01 // Yi (PRC)) 0x0478 #define SUBLANG_YORUBA_NIGERIA 0x01 // Yoruba (Nigeria) 046a yo-NG #define SUBLANG_ZULU_SOUTH_AFRICA 0x01 // isiZulu / Zulu (South Africa) 0x0435 zu-ZA // // Sorting IDs. // // Note that the named locale APIs (eg CompareStringExEx) are recommended. // #define SORT_DEFAULT 0x0 // sorting default #define SORT_INVARIANT_MATH 0x1 // Invariant (Mathematical Symbols) #define SORT_JAPANESE_XJIS 0x0 // Japanese XJIS order #define SORT_JAPANESE_UNICODE 0x1 // Japanese Unicode order (no longer supported) #define SORT_JAPANESE_RADICALSTROKE 0x4 // Japanese radical/stroke order #define SORT_CHINESE_BIG5 0x0 // Chinese BIG5 order #define SORT_CHINESE_PRCP 0x0 // PRC Chinese Phonetic order #define SORT_CHINESE_UNICODE 0x1 // Chinese Unicode order (no longer supported) #define SORT_CHINESE_PRC 0x2 // PRC Chinese Stroke Count order #define SORT_CHINESE_BOPOMOFO 0x3 // Traditional Chinese Bopomofo order #define SORT_CHINESE_RADICALSTROKE 0x4 // Traditional Chinese radical/stroke order. #define SORT_KOREAN_KSC 0x0 // Korean KSC order #define SORT_KOREAN_UNICODE 0x1 // Korean Unicode order (no longer supported) #define SORT_GERMAN_PHONE_BOOK 0x1 // German Phone Book order #define SORT_HUNGARIAN_DEFAULT 0x0 // Hungarian Default order #define SORT_HUNGARIAN_TECHNICAL 0x1 // Hungarian Technical order #define SORT_GEORGIAN_TRADITIONAL 0x0 // Georgian Traditional order #define SORT_GEORGIAN_MODERN 0x1 // Georgian Modern order // end_r_winnt // // A language ID is a 16 bit value which is the combination of a // primary language ID and a secondary language ID. The bits are // allocated as follows: // // +-----------------------+-------------------------+ // | Sublanguage ID | Primary Language ID | // +-----------------------+-------------------------+ // 15 10 9 0 bit // // WARNING: This pattern isn't always follows, Serbina, Bosnian & Croation // for example. // // It is recommended that applications test for locale names or actual LCIDs. // // Language ID creation/extraction macros: // // MAKELANGID - construct language id from a primary language id and // a sublanguage id. // PRIMARYLANGID - extract primary language id from a language id. // SUBLANGID - extract sublanguage id from a language id. // // Note that the LANG, SUBLANG construction is not always consistent. // The named locale APIs (eg GetLocaleInfoEx) are recommended. // // Language IDs do not exist for all locales // #define MAKELANGID(p, s) ((((WORD )(s)) << 10) | (WORD )(p)) #define PRIMARYLANGID(lgid) ((WORD )(lgid) & 0x3ff) #define SUBLANGID(lgid) ((WORD )(lgid) >> 10) // // A locale ID is a 32 bit value which is the combination of a // language ID, a sort ID, and a reserved area. The bits are // allocated as follows: // // +-------------+---------+-------------------------+ // | Reserved | Sort ID | Language ID | // +-------------+---------+-------------------------+ // 31 20 19 16 15 0 bit // // WARNING: This pattern isn't always followed (es-ES_tradnl vs es-ES for example) // // It is recommended that applications test for locale names or actual LCIDs. // // Locale ID creation/extraction macros: // // MAKELCID - construct the locale id from a language id and a sort id. // MAKESORTLCID - construct the locale id from a language id, sort id, and sort version. // LANGIDFROMLCID - extract the language id from a locale id. // SORTIDFROMLCID - extract the sort id from a locale id. // SORTVERSIONFROMLCID - extract the sort version from a locale id. // // Note that the LANG, SUBLANG construction is not always consistent. // The named locale APIs (eg GetLocaleInfoEx) are recommended. // // LCIDs do not exist for all locales. // #define NLS_VALID_LOCALE_MASK 0x000fffff #define MAKELCID(lgid, srtid) ((DWORD)((((DWORD)((WORD )(srtid))) << 16) | ((DWORD)((WORD )(lgid))))) #define MAKESORTLCID(lgid, srtid, ver) ((DWORD)((MAKELCID(lgid, srtid)) | (((DWORD)((WORD )(ver))) << 20))) #define LANGIDFROMLCID(lcid) ((WORD )(lcid)) #define SORTIDFROMLCID(lcid) ((WORD )((((DWORD)(lcid)) >> 16) & 0xf)) #define SORTVERSIONFROMLCID(lcid) ((WORD )((((DWORD)(lcid)) >> 20) & 0xf)) // 8 characters for language // 8 characters for region // 64 characters for suffix (script) // 2 characters for '-' separators // 2 characters for prefix like "i-" or "x-" // 1 null termination #define LOCALE_NAME_MAX_LENGTH 85 // // Default System and User IDs for language and locale. // Locale names such as LOCALE_NAME_SYSTEM_DEFAULT, LOCALE_NAME_USER_DEFAULT, // and LOCALE_NAME_INVARIANT are preferred. // #define LANG_SYSTEM_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT)) #define LANG_USER_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)) #define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT)) #define LOCALE_USER_DEFAULT (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT)) // // Other special IDs for language and locale. // #define LOCALE_CUSTOM_DEFAULT (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_CUSTOM_DEFAULT), SORT_DEFAULT)) #define LOCALE_CUSTOM_UNSPECIFIED (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_CUSTOM_UNSPECIFIED), SORT_DEFAULT)) #define LOCALE_CUSTOM_UI_DEFAULT (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_UI_CUSTOM_DEFAULT), SORT_DEFAULT)) #define LOCALE_NEUTRAL (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT)) #define LOCALE_INVARIANT (MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT)) // begin_ntminiport begin_ntndis begin_ntminitape // // Macros used to eliminate compiler warning generated when formal // parameters or local variables are not declared. // // Use DBG_UNREFERENCED_PARAMETER() when a parameter is not yet // referenced but will be once the module is completely developed. // // Use DBG_UNREFERENCED_LOCAL_VARIABLE() when a local variable is not yet // referenced but will be once the module is completely developed. // // Use UNREFERENCED_PARAMETER() if a parameter will never be referenced. // // DBG_UNREFERENCED_PARAMETER and DBG_UNREFERENCED_LOCAL_VARIABLE will // eventually be made into a null macro to help determine whether there // is unfinished work. // #define UNREFERENCED_PARAMETER(P) (P) #define DBG_UNREFERENCED_PARAMETER(P) (P) #define DBG_UNREFERENCED_LOCAL_VARIABLE(V) (V) #define UNREFERENCED_PARAMETER(P) { (P) = (P); } #define DBG_UNREFERENCED_PARAMETER(P) { (P) = (P); } #define DBG_UNREFERENCED_LOCAL_VARIABLE(V) { (V) = (V); } // // Macro used to eliminate compiler warning 4715 within a switch statement // when all possible cases have already been accounted for. // // switch (a & 3) { // case 0: return 1; // case 1: return Foo(); // case 2: return Bar(); // case 3: return 1; // DEFAULT_UNREACHABLE; // #define DEFAULT_UNREACHABLE default: __assume(0) #define DEFAULT_UNREACHABLE // Define operator overloads to enable bit operations on enum values that are // used to define flags. Use DEFINE_ENUM_FLAG_OPERATORS(YOUR_TYPE) to enable these // operators on YOUR_TYPE. // Moved here from objbase.w. #define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) extern "C++" { inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) | ((int)b)); } inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) |= ((int)b)); } inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) & ((int)b)); } inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) &= ((int)b)); } inline ENUMTYPE operator ~ (ENUMTYPE a) { return ENUMTYPE(~((int)a)); } inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) ^ ((int)b)); } inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) ^= ((int)b)); } } #define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) // NOP, C allows these operators. // Compile-time macros for initializing flag values in const data. // // When using DEFINE_ENUM_FLAG_OPERATORS for enum values you should use the macros below // when you need to initialize global const data. Without these macros the inline operators // from DEFINE_ENUM_FLAG_OPERATORS force a runtime initialization rather than a // compile time initialization. This applies even if you have declared the data as const. #define COMPILETIME_OR_2FLAGS(a,b) ((UINT)(a)|(UINT)(b)) #define COMPILETIME_OR_3FLAGS(a,b,c) ((UINT)(a)|(UINT)(b)|(UINT)(c)) #define COMPILETIME_OR_4FLAGS(a,b,c,d) ((UINT)(a)|(UINT)(b)|(UINT)(c)|(UINT)(d)) #define COMPILETIME_OR_5FLAGS(a,b,c,d,e) ((UINT)(a)|(UINT)(b)|(UINT)(c)|(UINT)(d)|(UINT)(e)) #define STATUS_WAIT_0 ((DWORD )0x00000000L) #define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L) #define STATUS_USER_APC ((DWORD )0x000000C0L) #define STATUS_TIMEOUT ((DWORD )0x00000102L) #define STATUS_PENDING ((DWORD )0x00000103L) #define DBG_EXCEPTION_HANDLED ((DWORD )0x00010001L) #define DBG_CONTINUE ((DWORD )0x00010002L) #define STATUS_SEGMENT_NOTIFICATION ((DWORD )0x40000005L) #define DBG_TERMINATE_THREAD ((DWORD )0x40010003L) #define DBG_TERMINATE_PROCESS ((DWORD )0x40010004L) #define DBG_CONTROL_C ((DWORD )0x40010005L) #define DBG_PRINTEXCEPTION_C ((DWORD )0x40010006L) #define DBG_RIPEXCEPTION ((DWORD )0x40010007L) #define DBG_CONTROL_BREAK ((DWORD )0x40010008L) #define DBG_COMMAND_EXCEPTION ((DWORD )0x40010009L) #define STATUS_GUARD_PAGE_VIOLATION ((DWORD )0x80000001L) #define STATUS_DATATYPE_MISALIGNMENT ((DWORD )0x80000002L) #define STATUS_BREAKPOINT ((DWORD )0x80000003L) #define STATUS_SINGLE_STEP ((DWORD )0x80000004L) #define STATUS_LONGJUMP ((DWORD )0x80000026L) #define STATUS_UNWIND_CONSOLIDATE ((DWORD )0x80000029L) #define DBG_EXCEPTION_NOT_HANDLED ((DWORD )0x80010001L) #define STATUS_ACCESS_VIOLATION ((DWORD )0xC0000005L) #define STATUS_IN_PAGE_ERROR ((DWORD )0xC0000006L) #define STATUS_INVALID_HANDLE ((DWORD )0xC0000008L) #define STATUS_INVALID_PARAMETER ((DWORD )0xC000000DL) #define STATUS_NO_MEMORY ((DWORD )0xC0000017L) #define STATUS_ILLEGAL_INSTRUCTION ((DWORD )0xC000001DL) #define STATUS_NONCONTINUABLE_EXCEPTION ((DWORD )0xC0000025L) #define STATUS_INVALID_DISPOSITION ((DWORD )0xC0000026L) #define STATUS_ARRAY_BOUNDS_EXCEEDED ((DWORD )0xC000008CL) #define STATUS_FLOAT_DENORMAL_OPERAND ((DWORD )0xC000008DL) #define STATUS_FLOAT_DIVIDE_BY_ZERO ((DWORD )0xC000008EL) #define STATUS_FLOAT_INEXACT_RESULT ((DWORD )0xC000008FL) #define STATUS_FLOAT_INVALID_OPERATION ((DWORD )0xC0000090L) #define STATUS_FLOAT_OVERFLOW ((DWORD )0xC0000091L) #define STATUS_FLOAT_STACK_CHECK ((DWORD )0xC0000092L) #define STATUS_FLOAT_UNDERFLOW ((DWORD )0xC0000093L) #define STATUS_INTEGER_DIVIDE_BY_ZERO ((DWORD )0xC0000094L) #define STATUS_INTEGER_OVERFLOW ((DWORD )0xC0000095L) #define STATUS_PRIVILEGED_INSTRUCTION ((DWORD )0xC0000096L) #define STATUS_STACK_OVERFLOW ((DWORD )0xC00000FDL) #define STATUS_DLL_NOT_FOUND ((DWORD )0xC0000135L) #define STATUS_ORDINAL_NOT_FOUND ((DWORD )0xC0000138L) #define STATUS_ENTRYPOINT_NOT_FOUND ((DWORD )0xC0000139L) #define STATUS_CONTROL_C_EXIT ((DWORD )0xC000013AL) #define STATUS_DLL_INIT_FAILED ((DWORD )0xC0000142L) #define STATUS_FLOAT_MULTIPLE_FAULTS ((DWORD )0xC00002B4L) #define STATUS_FLOAT_MULTIPLE_TRAPS ((DWORD )0xC00002B5L) #define STATUS_REG_NAT_CONSUMPTION ((DWORD )0xC00002C9L) #define STATUS_STACK_BUFFER_OVERRUN ((DWORD )0xC0000409L) #define STATUS_INVALID_CRUNTIME_PARAMETER ((DWORD )0xC0000417L) #define STATUS_ASSERTION_FAILURE ((DWORD )0xC0000420L) #define STATUS_SXS_EARLY_DEACTIVATION ((DWORD )0xC015000FL) #define STATUS_SXS_INVALID_DEACTIVATION ((DWORD )0xC0150010L) #define MAXIMUM_WAIT_OBJECTS 64 // Maximum number of wait objects #define MAXIMUM_SUSPEND_COUNT MAXCHAR // Maximum times thread can be suspended typedef ULONG_PTR KSPIN_LOCK; typedef KSPIN_LOCK *PKSPIN_LOCK; // // Define 128-bit 16-byte aligned xmm register type. // typedef struct _M128A { ULONGLONG Low; LONGLONG High; } M128A, *PM128A; // // Format of data for (F)XSAVE/(F)XRSTOR instruction // typedef struct _XSAVE_FORMAT { WORD ControlWord; WORD StatusWord; BYTE TagWord; BYTE Reserved1; WORD ErrorOpcode; DWORD ErrorOffset; WORD ErrorSelector; WORD Reserved2; DWORD DataOffset; WORD DataSelector; WORD Reserved3; DWORD MxCsr; DWORD MxCsr_Mask; M128A FloatRegisters[8]; M128A XmmRegisters[16]; BYTE Reserved4[96]; } XSAVE_FORMAT, *PXSAVE_FORMAT; typedef struct _XSAVE_AREA_HEADER { DWORD64 Mask; DWORD64 Reserved[7]; } XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER; typedef struct _XSAVE_AREA { XSAVE_FORMAT LegacyState; XSAVE_AREA_HEADER Header; } XSAVE_AREA, *PXSAVE_AREA; typedef struct _XSTATE_CONTEXT { DWORD64 Mask; DWORD Length; DWORD Reserved1; [OnFieldOnly] PXSAVE_AREA Area; DWORD Reserved2; PVOID Buffer; DWORD Reserved3; } XSTATE_CONTEXT, *PXSTATE_CONTEXT; #define XSAVE_ALIGN 64 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA) // // This structure specifies an offset (from the beginning of CONTEXT_EX // structure) and size of a single chunk of an extended context structure. // // N.B. Offset may be negative. // typedef struct _CONTEXT_CHUNK { LONG Offset; DWORD Length; } CONTEXT_CHUNK, *PCONTEXT_CHUNK; // // CONTEXT_EX structure is an extension to CONTEXT structure. It defines // a context record as a set of disjoint variable-sized buffers (chunks) // each containing a portion of processor state. Currently there are only // two buffers (chunks) are defined: // // - Legacy, that stores traditional CONTEXT structure; // - XState, that stores XSAVE save area buffer starting from // XSAVE_AREA_HEADER, i.e. without the first 512 bytes. // // There a few assumptions exists that simplify conversion of PCONTEXT // pointer to PCONTEXT_EX pointer. // // 1. APIs that work with PCONTEXT pointers assume that CONTEXT_EX is // stored right after the CONTEXT structure. It is also assumed that // CONTEXT_EX is present if and only if corresponding CONTEXT_XXX // flags are set in CONTEXT.ContextFlags. // // 2. CONTEXT_EX.Legacy is always present if CONTEXT_EX structure is // present. All other chunks are optional. // // 3. CONTEXT.ContextFlags unambigiously define which chunks are // present. I.e. if CONTEXT_XSTATE is set CONTEXT_EX.XState is valid. // typedef struct _CONTEXT_EX { // // The total length of the structure starting from the chunk with // the smallest offset. N.B. that the offset may be negative. // CONTEXT_CHUNK All; // // Wrapper for the traditional CONTEXT structure. N.B. the size of // the chunk may be less than sizeof(CONTEXT) is some cases (when // CONTEXT_EXTENDED_REGISTERS is not set on x86 for instance). // CONTEXT_CHUNK Legacy; // // CONTEXT_XSTATE: Extended processor state chunk. The state is // stored in the same format XSAVE operation strores it with // exception of the first 512 bytes, i.e. staring from // XSAVE_AREA_HEADER. The lower two bits corresponding FP and // SSE state must be zero. // CONTEXT_CHUNK XState; } CONTEXT_EX, *PCONTEXT_EX; #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN) // // These macros make context chunks manupulations easier. // #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset) #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length) #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk))) #define RTL_CONTEXT_OFFSET(Context, Chunk) RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk) #define RTL_CONTEXT_LENGTH(Context, Chunk) RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk) #define RTL_CONTEXT_CHUNK(Context, Chunk) RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), (PCONTEXT_EX)(Context + 1), Chunk) // // XSAVE/XRSTOR save area should be aligned on 64 byte boundary // ; ; // XSAVE_AREA structure must be sized uniformly on all architectures ; // // Define bit test intrinsics. // extern "C" { #define BitTest _bittest #define BitTestAndComplement _bittestandcomplement #define BitTestAndSet _bittestandset #define BitTestAndReset _bittestandreset #define InterlockedBitTestAndSet _interlockedbittestandset #define InterlockedBitTestAndReset _interlockedbittestandreset #define BitTest64 _bittest64 #define BitTestAndComplement64 _bittestandcomplement64 #define BitTestAndSet64 _bittestandset64 #define BitTestAndReset64 _bittestandreset64 #define InterlockedBitTestAndSet64 _interlockedbittestandset64 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64 [method: OnFunctionOnly] BOOLEAN _bittest ( [OnParameterOnly] LONG const *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandcomplement ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandset ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandreset ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _interlockedbittestandset ( [OnParameterOnly] LONG volatile *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _interlockedbittestandreset ( [OnParameterOnly] LONG volatile *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittest64 ( [OnParameterOnly] LONG64 const *Base, [OnParameterOnly] LONG64 Offset ); BOOLEAN _bittestandcomplement64 ( [OnParameterOnly] LONG64 *Base, [OnParameterOnly] LONG64 Offset ); BOOLEAN _bittestandset64 ( [OnParameterOnly] LONG64 *Base, [OnParameterOnly] LONG64 Offset ); BOOLEAN _bittestandreset64 ( [OnParameterOnly] LONG64 *Base, [OnParameterOnly] LONG64 Offset ); BOOLEAN _interlockedbittestandset64 ( [OnParameterOnly] LONG64 volatile *Base, [OnParameterOnly] LONG64 Offset ); BOOLEAN _interlockedbittestandreset64 ( [OnParameterOnly] LONG64 volatile *Base, [OnParameterOnly] LONG64 Offset ); // // Define bit scan intrinsics. // #define BitScanForward _BitScanForward #define BitScanReverse _BitScanReverse #define BitScanForward64 _BitScanForward64 #define BitScanReverse64 _BitScanReverse64 BOOLEAN _BitScanForward ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD Mask ); BOOLEAN _BitScanReverse ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD Mask ); BOOLEAN _BitScanForward64 ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD64 Mask ); BOOLEAN _BitScanReverse64 ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD64 Mask ); // // Interlocked intrinsic functions. // #define InterlockedIncrement16 _InterlockedIncrement16 #define InterlockedDecrement16 _InterlockedDecrement16 #define InterlockedCompareExchange16 _InterlockedCompareExchange16 #define InterlockedAnd _InterlockedAnd #define InterlockedAndAcquire _InterlockedAnd #define InterlockedAndRelease _InterlockedAnd #define InterlockedOr _InterlockedOr #define InterlockedOrAcquire _InterlockedOr #define InterlockedOrRelease _InterlockedOr #define InterlockedXor _InterlockedXor #define InterlockedIncrement _InterlockedIncrement #define InterlockedIncrementAcquire InterlockedIncrement #define InterlockedIncrementRelease InterlockedIncrement #define InterlockedDecrement _InterlockedDecrement #define InterlockedDecrementAcquire InterlockedDecrement #define InterlockedDecrementRelease InterlockedDecrement #define InterlockedAdd _InterlockedAdd #define InterlockedExchange _InterlockedExchange #define InterlockedExchangeAdd _InterlockedExchangeAdd #define InterlockedCompareExchange _InterlockedCompareExchange #define InterlockedCompareExchangeAcquire InterlockedCompareExchange #define InterlockedCompareExchangeRelease InterlockedCompareExchange #define InterlockedAnd64 _InterlockedAnd64 #define InterlockedAnd64Acquire _InterlockedAnd64 #define InterlockedAnd64Release _InterlockedAnd64 #define InterlockedAndAffinity InterlockedAnd64 #define InterlockedOr64 _InterlockedOr64 #define InterlockedOr64Acquire _InterlockedOr64 #define InterlockedOr64Release _InterlockedOr64 #define InterlockedOrAffinity InterlockedOr64 #define InterlockedXor64 _InterlockedXor64 #define InterlockedIncrement64 _InterlockedIncrement64 #define InterlockedDecrement64 _InterlockedDecrement64 #define InterlockedAdd64 _InterlockedAdd64 #define InterlockedExchange64 _InterlockedExchange64 #define InterlockedExchangeAcquire64 InterlockedExchange64 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64 #define InterlockedCompareExchange64 _InterlockedCompareExchange64 #define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64 #define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64 #define InterlockedExchangePointer _InterlockedExchangePointer #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer #define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer #define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b) #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a) #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a) SHORT _InterlockedIncrement16 ( [OnParameterOnly] SHORT volatile *Addend ); SHORT _InterlockedDecrement16 ( [OnParameterOnly] SHORT volatile *Addend ); SHORT _InterlockedCompareExchange16 ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT ExChange, [OnParameterOnly] SHORT Comperand ); LONG _InterlockedAnd ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG _InterlockedOr ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG _InterlockedXor ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG64 _InterlockedAnd64 ( [OnParameterOnly] LONG64 volatile *Destination, [OnParameterOnly] LONG64 Value ); LONG64 _InterlockedOr64 ( [OnParameterOnly] LONG64 volatile *Destination, [OnParameterOnly] LONG64 Value ); LONG64 _InterlockedXor64 ( [OnParameterOnly] LONG64 volatile *Destination, [OnParameterOnly] LONG64 Value ); LONG _InterlockedIncrement( [OnParameterOnly] LONG volatile *Addend ); LONG _InterlockedDecrement( [OnParameterOnly] LONG volatile *Addend ); LONG _InterlockedExchange( [OnParameterOnly] LONG volatile *Target, [OnParameterOnly] LONG Value ); LONG _InterlockedExchangeAdd( [OnParameterOnly] LONG volatile *Addend, [OnParameterOnly] LONG Value ); LONG _InterlockedAdd( [OnParameterOnly] LONG volatile *Addend, [OnParameterOnly] LONG Value ) { return _InterlockedExchangeAdd(Addend, Value) + Value; } LONG _InterlockedCompareExchange ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG ExChange, [OnParameterOnly] LONG Comperand ); LONG64 _InterlockedIncrement64( [OnParameterOnly] LONG64 volatile *Addend ); LONG64 _InterlockedDecrement64( [OnParameterOnly] LONG64 volatile *Addend ); LONG64 _InterlockedExchange64( [OnParameterOnly] LONG64 volatile *Target, [OnParameterOnly] LONG64 Value ); LONG64 _InterlockedExchangeAdd64( [OnParameterOnly] LONG64 volatile *Addend, [OnParameterOnly] LONG64 Value ); LONG64 _InterlockedAdd64( [OnParameterOnly] LONG64 volatile *Addend, [OnParameterOnly] LONG64 Value ) { return _InterlockedExchangeAdd64(Addend, Value) + Value; } LONG64 _InterlockedCompareExchange64 ( [OnParameterOnly] LONG64 volatile *Destination, [OnParameterOnly] LONG64 ExChange, [OnParameterOnly] LONG64 Comperand ); PVOID _InterlockedCompareExchangePointer ( [OnParameterOnly] PVOID volatile *Destination, [OnParameterOnly] PVOID Exchange, [OnParameterOnly] PVOID Comperand ); PVOID _InterlockedExchangePointer( [OnParameterOnly] PVOID volatile *Target, [OnParameterOnly] PVOID Value ); #define InterlockedAnd8 _InterlockedAnd8 #define InterlockedOr8 _InterlockedOr8 #define InterlockedXor8 _InterlockedXor8 #define InterlockedAnd16 _InterlockedAnd16 #define InterlockedOr16 _InterlockedOr16 #define InterlockedXor16 _InterlockedXor16 char _InterlockedAnd8 ( [OnParameterOnly] char volatile *Destination, [OnParameterOnly] char Value ); char _InterlockedOr8 ( [OnParameterOnly] char volatile *Destination, [OnParameterOnly] char Value ); char _InterlockedXor8 ( [OnParameterOnly] char volatile *Destination, [OnParameterOnly] char Value ); SHORT _InterlockedAnd16( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedOr16( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedXor16( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); // // Define function to flush a cache line. // #define CacheLineFlush(Address) _mm_clflush(Address) void _mm_clflush ( [OnParameterOnly] void const *Address ); void _ReadWriteBarrier ( void ); // // Define memory fence intrinsics // #define FastFence __faststorefence #define LoadFence _mm_lfence #define MemoryFence _mm_mfence #define StoreFence _mm_sfence void __faststorefence ( void ); void _mm_lfence ( void ); void _mm_mfence ( void ); void _mm_sfence ( void ); void _mm_pause ( void ); void _mm_prefetch ( [OnParameterOnly] CHAR const *a, [OnParameterOnly] int sel ); void _m_prefetchw ( [OnParameterOnly] volatile const void *Source ); // // Define constants for use with _mm_prefetch. // #define _MM_HINT_T0 1 #define _MM_HINT_T1 2 #define _MM_HINT_T2 3 #define _MM_HINT_NTA 0 #define YieldProcessor _mm_pause #define MemoryBarrier __faststorefence #define PreFetchCacheLine(l, a) _mm_prefetch((CHAR CONST *) a, l) #define PrefetchForWrite(p) _m_prefetchw(p) #define ReadForWriteAccess(p) (_m_prefetchw(p), *(p)) // // PreFetchCacheLine level defines. // #define PF_TEMPORAL_LEVEL_1 _MM_HINT_T0 #define PF_TEMPORAL_LEVEL_2 _MM_HINT_T1 #define PF_TEMPORAL_LEVEL_3 _MM_HINT_T2 #define PF_NON_TEMPORAL_LEVEL_ALL _MM_HINT_NTA // // Define get/set MXCSR intrinsics. // #define ReadMxCsr _mm_getcsr #define WriteMxCsr _mm_setcsr unsigned int _mm_getcsr ( void ); void _mm_setcsr ( [OnParameterOnly] unsigned int MxCsr ); // // Assert exception. // void __int2c ( void ); __inline void DbgRaiseAssertionFailure ( void ) { __int2c(); } // // Define function to get the caller's EFLAGs value. // #define GetCallersEflags() __getcallerseflags() unsigned __int32 __getcallerseflags ( void ); // // Define function to get segment limit. // #define GetSegmentLimit __segmentlimit DWORD __segmentlimit ( [OnParameterOnly] DWORD Selector ); // // Define function to read the value of a performance counter. // #define ReadPMC __readpmc DWORD64 __readpmc ( [OnParameterOnly] DWORD Counter ); // // Define function to read the value of the time stamp counter // #define ReadTimeStampCounter() __rdtsc() DWORD64 __rdtsc ( void ); // // Define functions to move strings as bytes, words, dwords, and qwords. // void __movsb ( [OnParameterOnly] PBYTE Destination, [OnParameterOnly] BYTE const *Source, [OnParameterOnly] SIZE_T Count ); void __movsw ( [OnParameterOnly] PWORD Destination, [OnParameterOnly] WORD const *Source, [OnParameterOnly] SIZE_T Count ); void __movsd ( [OnParameterOnly] PDWORD Destination, [OnParameterOnly] DWORD const *Source, [OnParameterOnly] SIZE_T Count ); void __movsq ( [OnParameterOnly] PDWORD64 Destination, [OnParameterOnly] DWORD64 const *Source, [OnParameterOnly] SIZE_T Count ); // // Define functions to store strings as bytes, words, dwords, and qwords. // void __stosb ( [OnParameterOnly] PBYTE Destination, [OnParameterOnly] BYTE Value, [OnParameterOnly] SIZE_T Count ); void __stosw ( [OnParameterOnly] PWORD Destination, [OnParameterOnly] WORD Value, [OnParameterOnly] SIZE_T Count ); void __stosd ( [OnParameterOnly] PDWORD Destination, [OnParameterOnly] DWORD Value, [OnParameterOnly] SIZE_T Count ); void __stosq ( [OnParameterOnly] PDWORD64 Destination, [OnParameterOnly] DWORD64 Value, [OnParameterOnly] SIZE_T Count ); // // Define functions to capture the high 64-bits of a 128-bit multiply. // #define MultiplyHigh __mulh #define UnsignedMultiplyHigh __umulh LONGLONG __mulh ( [OnParameterOnly] LONG64 Multiplier, [OnParameterOnly] LONG64 Multiplicand ); ULONGLONG __umulh ( [OnParameterOnly] DWORD64 Multiplier, [OnParameterOnly] DWORD64 Multiplicand ); // // Define functions to perform 128-bit shifts // #define ShiftLeft128 __shiftleft128 #define ShiftRight128 __shiftright128 DWORD64 __shiftleft128 ( [OnParameterOnly] DWORD64 LowPart, [OnParameterOnly] DWORD64 HighPart, [OnParameterOnly] BYTE Shift ); DWORD64 __shiftright128 ( [OnParameterOnly] DWORD64 LowPart, [OnParameterOnly] DWORD64 HighPart, [OnParameterOnly] BYTE Shift ); // // Define functions to perform 128-bit multiplies. // #define Multiply128 _mul128 LONG64 _mul128 ( [OnParameterOnly] LONG64 Multiplier, [OnParameterOnly] LONG64 Multiplicand, [OnParameterOnly] LONG64 *HighProduct ); #define UnsignedMultiply128 _umul128 DWORD64 _umul128 ( [OnParameterOnly] DWORD64 Multiplier, [OnParameterOnly] DWORD64 Multiplicand, [OnParameterOnly] DWORD64 *HighProduct ); LONG64 MultiplyExtract128 ( [OnParameterOnly] LONG64 Multiplier, [OnParameterOnly] LONG64 Multiplicand, [OnParameterOnly] BYTE Shift ) { LONG64 extractedProduct; LONG64 highProduct; LONG64 lowProduct; BOOLEAN negate; DWORD64 uhighProduct; DWORD64 ulowProduct; lowProduct = _mul128(Multiplier, Multiplicand, &highProduct); negate = 0; uhighProduct = (DWORD64)highProduct; ulowProduct = (DWORD64)lowProduct; if (highProduct < 0) { negate = 1; uhighProduct = (DWORD64)(-highProduct); ulowProduct = (DWORD64)(-lowProduct); if (ulowProduct != 0) { uhighProduct -= 1; } } extractedProduct = (LONG64) __shiftright128(ulowProduct, uhighProduct, Shift); if (negate != 0) { extractedProduct = -extractedProduct; } return extractedProduct; } DWORD64 UnsignedMultiplyExtract128 ( [OnParameterOnly] DWORD64 Multiplier, [OnParameterOnly] DWORD64 Multiplicand, [OnParameterOnly] BYTE Shift ) { DWORD64 extractedProduct; DWORD64 highProduct; DWORD64 lowProduct; lowProduct = _umul128(Multiplier, Multiplicand, &highProduct); extractedProduct = __shiftright128(lowProduct, highProduct, Shift); return extractedProduct; } // // Define functions to read and write the uer TEB and the system PCR/PRCB. // BYTE __readgsbyte ( [OnParameterOnly] DWORD Offset ); WORD __readgsword ( [OnParameterOnly] DWORD Offset ); DWORD __readgsdword ( [OnParameterOnly] DWORD Offset ); DWORD64 __readgsqword ( [OnParameterOnly] DWORD Offset ); void __writegsbyte ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] BYTE Data ); void __writegsword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] WORD Data ); void __writegsdword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] DWORD Data ); void __writegsqword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] DWORD64 Data ); void __incgsbyte ( [OnParameterOnly] DWORD Offset ); void __addgsbyte ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] BYTE Value ); void __incgsword ( [OnParameterOnly] DWORD Offset ); void __addgsword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] WORD Value ); void __incgsdword ( [OnParameterOnly] DWORD Offset ); void __addgsdword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] DWORD Value ); void __incgsqword ( [OnParameterOnly] DWORD Offset ); void __addgsqword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] DWORD64 Value ); } // // The following values specify the type of access in the first parameter // of the exception record whan the exception code specifies an access // violation. // #define EXCEPTION_READ_FAULT 0 // exception caused by a read #define EXCEPTION_WRITE_FAULT 1 // exception caused by a write #define EXCEPTION_EXECUTE_FAULT 8 // exception caused by an instruction fetch // begin_wx86 // // The following flags control the contents of the CONTEXT structure. // #define CONTEXT_AMD64 0x100000 // end_wx86 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L) #define CONTEXT_EXCEPTION_ACTIVE 0x8000000 #define CONTEXT_SERVICE_ACTIVE 0x10000000 #define CONTEXT_EXCEPTION_REQUEST 0x40000000 #define CONTEXT_EXCEPTION_REPORTING 0x80000000 // begin_wx86 // // Define initial MxCsr and FpCsr control. // #define INITIAL_MXCSR 0x1f80 // initial MXCSR value #define INITIAL_FPCSR 0x027f // initial FPCSR value // end_ntddk // begin_wdm begin_ntosp typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; // end_wdm end_ntosp // begin_ntddk // // Context Frame // // This frame has a several purposes: 1) it is used as an argument to // NtContinue, 2) it is used to constuct a call frame for APC delivery, // and 3) it is used in the user level thread creation routines. // // // The flags field within this record controls the contents of a CONTEXT // record. // // If the context record is used as an input parameter, then for each // portion of the context record controlled by a flag whose value is // set, it is assumed that that portion of the context record contains // valid context. If the context record is being used to modify a threads // context, then only that portion of the threads context is modified. // // If the context record is used as an output parameter to capture the // context of a thread, then only those portions of the thread's context // corresponding to set flags will be returned. // // CONTEXT_CONTROL specifies SegSs, Rsp, SegCs, Rip, and EFlags. // // CONTEXT_INTEGER specifies Rax, Rcx, Rdx, Rbx, Rbp, Rsi, Rdi, and R8-R15. // // CONTEXT_SEGMENTS specifies SegDs, SegEs, SegFs, and SegGs. // // CONTEXT_FLOATING_POINT specifies Xmm0-Xmm15. // // CONTEXT_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7. // typedef struct _CONTEXT { // // Register parameter home addresses. // // N.B. These fields are for convience - they could be used to extend the // context record in the future. // DWORD64 P1Home; DWORD64 P2Home; DWORD64 P3Home; DWORD64 P4Home; DWORD64 P5Home; DWORD64 P6Home; // // Control flags. // DWORD ContextFlags; DWORD MxCsr; // // Segment Registers and processor flags. // WORD SegCs; WORD SegDs; WORD SegEs; WORD SegFs; WORD SegGs; WORD SegSs; DWORD EFlags; // // Debug registers // DWORD64 Dr0; DWORD64 Dr1; DWORD64 Dr2; DWORD64 Dr3; DWORD64 Dr6; DWORD64 Dr7; // // Integer registers. // DWORD64 Rax; DWORD64 Rcx; DWORD64 Rdx; DWORD64 Rbx; DWORD64 Rsp; DWORD64 Rbp; DWORD64 Rsi; DWORD64 Rdi; DWORD64 R8; DWORD64 R9; DWORD64 R10; DWORD64 R11; DWORD64 R12; DWORD64 R13; DWORD64 R14; DWORD64 R15; // // Program counter. // DWORD64 Rip; // // Floating point state. // union { XMM_SAVE_AREA32 FltSave; struct { M128A Header[2]; M128A Legacy[8]; M128A Xmm0; M128A Xmm1; M128A Xmm2; M128A Xmm3; M128A Xmm4; M128A Xmm5; M128A Xmm6; M128A Xmm7; M128A Xmm8; M128A Xmm9; M128A Xmm10; M128A Xmm11; M128A Xmm12; M128A Xmm13; M128A Xmm14; M128A Xmm15; } ; } ; // // Vector registers. // M128A VectorRegister[26]; DWORD64 VectorControl; // // Special debug control registers. // DWORD64 DebugControl; DWORD64 LastBranchToRip; DWORD64 LastBranchFromRip; DWORD64 LastExceptionToRip; DWORD64 LastExceptionFromRip; } CONTEXT, *PCONTEXT; // // Define function table entry - a function table entry is generated for // each frame function. // #define RUNTIME_FUNCTION_INDIRECT 0x1 typedef struct _RUNTIME_FUNCTION { DWORD BeginAddress; DWORD EndAddress; DWORD UnwindData; } RUNTIME_FUNCTION, *PRUNTIME_FUNCTION; // // Define unwind history table structure. // #define UNWIND_HISTORY_TABLE_SIZE 12 typedef struct _UNWIND_HISTORY_TABLE_ENTRY { DWORD64 ImageBase; PRUNTIME_FUNCTION FunctionEntry; } UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY; typedef struct _UNWIND_HISTORY_TABLE { DWORD Count; BYTE LocalHint; BYTE GlobalHint; BYTE Search; BYTE Once; DWORD64 LowAddress; DWORD64 HighAddress; UNWIND_HISTORY_TABLE_ENTRY Entry[ 12]; } UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; // // Define dynamic function table entry. // typedef PRUNTIME_FUNCTION GET_RUNTIME_FUNCTION_CALLBACK ( [OnParameterOnly] DWORD64 ControlPc, [OnParameterOnly] PVOID Context ); typedef GET_RUNTIME_FUNCTION_CALLBACK *PGET_RUNTIME_FUNCTION_CALLBACK; typedef DWORD OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK ( [OnParameterOnly] HANDLE Process, [OnParameterOnly] PVOID TableAddress, [OnParameterOnly] PDWORD Entries, [OnParameterOnly] PRUNTIME_FUNCTION* Functions ); typedef OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK *POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK; #define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME "OutOfProcessFunctionTableCallback" // // Define runtime exception handling prototypes. // void RtlRestoreContext ( [OnParameterOnly] PCONTEXT ContextRecord, [OnParameterOnly] struct _EXCEPTION_RECORD *ExceptionRecord ); BOOLEAN RtlAddFunctionTable ( [OnParameterOnly] PRUNTIME_FUNCTION FunctionTable, [OnParameterOnly] DWORD EntryCount, [OnParameterOnly] DWORD64 BaseAddress ); PRUNTIME_FUNCTION RtlLookupFunctionEntry ( [OnParameterOnly] DWORD64 ControlPc, [OnParameterOnly] PDWORD64 ImageBase, [OnParameterOnly] PUNWIND_HISTORY_TABLE HistoryTable ); // // Nonvolatile context pointer record. // typedef struct _KNONVOLATILE_CONTEXT_POINTERS { union { PM128A FloatingContext[16]; struct { PM128A Xmm0; PM128A Xmm1; PM128A Xmm2; PM128A Xmm3; PM128A Xmm4; PM128A Xmm5; PM128A Xmm6; PM128A Xmm7; PM128A Xmm8; PM128A Xmm9; PM128A Xmm10; PM128A Xmm11; PM128A Xmm12; PM128A Xmm13; PM128A Xmm14; PM128A Xmm15; } ; } ; union { PDWORD64 IntegerContext[16]; struct { PDWORD64 Rax; PDWORD64 Rcx; PDWORD64 Rdx; PDWORD64 Rbx; PDWORD64 Rsp; PDWORD64 Rbp; PDWORD64 Rsi; PDWORD64 Rdi; PDWORD64 R8; PDWORD64 R9; PDWORD64 R10; PDWORD64 R11; PDWORD64 R12; PDWORD64 R13; PDWORD64 R14; PDWORD64 R15; } ; } ; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; PEXCEPTION_ROUTINE RtlVirtualUnwind ( [OnParameterOnly] DWORD HandlerType, [OnParameterOnly] DWORD64 ImageBase, [OnParameterOnly] DWORD64 ControlPc, [OnParameterOnly] PRUNTIME_FUNCTION FunctionEntry, [OnParameterOnly] PCONTEXT ContextRecord, [OnParameterOnly] PVOID *HandlerData, [OnParameterOnly] PDWORD64 EstablisherFrame, [OnParameterOnly] PKNONVOLATILE_CONTEXT_POINTERS ContextPointers ); BOOLEAN RtlInstallFunctionTableCallback ( [OnParameterOnly] DWORD64 TableIdentifier, [OnParameterOnly] DWORD64 BaseAddress, [OnParameterOnly] DWORD Length, [OnParameterOnly] PGET_RUNTIME_FUNCTION_CALLBACK Callback, [OnParameterOnly] PVOID Context, [OnParameterOnly] PCWSTR OutOfProcessCallbackDll ); BOOLEAN RtlDeleteFunctionTable ( [OnParameterOnly] PRUNTIME_FUNCTION FunctionTable ); // // Disable these two pragmas that evaluate to "sti" "cli" on x86 so that driver // writers to not leave them inadvertantly in their code. // // build with /Od don't get weird errors ! // end_ntddk end_nthal extern "C" { // // Define bit test intrinsics. // #define BitTest _bittest #define BitTestAndComplement _bittestandcomplement #define BitTestAndSet _bittestandset #define BitTestAndReset _bittestandreset #define InterlockedBitTestAndSet _interlockedbittestandset #define InterlockedBitTestAndReset _interlockedbittestandreset [method: OnFunctionOnly] BOOLEAN _bittest ( [OnParameterOnly] LONG const *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandcomplement ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandset ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandreset ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _interlockedbittestandset ( [OnParameterOnly] LONG volatile *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _interlockedbittestandreset ( [OnParameterOnly] LONG volatile *Base, [OnParameterOnly] LONG Offset ); // // Define bit scan intrinsics. // #define BitScanForward _BitScanForward #define BitScanReverse _BitScanReverse BOOLEAN _BitScanForward ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD Mask ); BOOLEAN _BitScanReverse ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD Mask ); // // [pfx_parse] - guard against PREfix intrinsic error // #define InterlockedAnd16 _InterlockedAnd16 #define InterlockedCompareExchange16 _InterlockedCompareExchange16 #define InterlockedOr16 _InterlockedOr16 SHORT _InterlockedAnd16 ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedCompareExchange16 ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT ExChange, [OnParameterOnly] SHORT Comperand ); SHORT _InterlockedOr16 ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); __inline BOOLEAN InterlockedBitTestAndComplement ( [OnParameterOnly] LONG volatile *Base, [OnParameterOnly] LONG Bit ) { __asm { mov eax, Bit mov ecx, Base lock btc [ecx], eax setc al }; } // // [pfx_parse] // guard against __readfsbyte parsing error // // // Define FS referencing intrinsics // BYTE __readfsbyte ( [OnParameterOnly] DWORD Offset ); WORD __readfsword ( [OnParameterOnly] DWORD Offset ); DWORD __readfsdword ( [OnParameterOnly] DWORD Offset ); void __writefsbyte ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] BYTE Data ); void __writefsword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] WORD Data ); void __writefsdword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] DWORD Data ); void __incfsbyte ( [OnParameterOnly] DWORD Offset ); void __addfsbyte ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] BYTE Value ); void __incfsword ( [OnParameterOnly] DWORD Offset ); void __addfsword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] WORD Value ); void __incfsdword ( [OnParameterOnly] DWORD Offset ); void __addfsdword ( [OnParameterOnly] DWORD Offset, [OnParameterOnly] DWORD Value ); void _mm_pause ( void ); #define YieldProcessor _mm_pause #define YieldProcessor() __asm { rep nop } } __inline void __faststorefence ( void ) { LONG Barrier; __asm { xchg Barrier, eax } } // // Prefetch is not supported on all x86 procssors. // #define PreFetchCacheLine(l, a) #define PrefetchForWrite(p) #define ReadForWriteAccess(p) (*(p)) // // PreFetchCacheLine level defines. // #define PF_TEMPORAL_LEVEL_1 #define PF_NON_TEMPORAL_LEVEL_ALL // // Define function to read the value of a performance counter. // #define ReadPMC __readpmc DWORD64 __readpmc ( [OnParameterOnly] DWORD Counter ); // // Define function to read the value of the time stamp counter // #define ReadTimeStampCounter() __rdtsc() DWORD64 __rdtsc ( void ); // end_ntddk // begin_wdm void __int2c ( void ); __inline void DbgRaiseAssertionFailure ( void ) { __int2c(); } // end_wdm __inline PVOID GetFiberData( void ) { return *(PVOID *) (ULONG_PTR) __readfsdword (0x10);} __inline PVOID GetCurrentFiber( void ) { return (PVOID) (ULONG_PTR) __readfsdword (0x10);} // begin_ntddk // end_ntddk // // The following values specify the type of failing access when the status is // STATUS_ACCESS_VIOLATION and the first parameter in the execpetion record. // #define EXCEPTION_READ_FAULT 0 // Access violation was caused by a read #define EXCEPTION_WRITE_FAULT 1 // Access violation was caused by a write #define EXCEPTION_EXECUTE_FAULT 8 // Access violation was caused by an instruction fetch // begin_wx86 // begin_ntddk // // Define the size of the 80387 save area, which is in the context frame. // #define SIZE_OF_80387_REGISTERS 80 // // The following flags control the contents of the CONTEXT structure. // #define CONTEXT_i386 0x00010000 // this assumes that i386 and #define CONTEXT_i486 0x00010000 // i486 have identical context records // end_wx86 #define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP #define CONTEXT_INTEGER (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI #define CONTEXT_SEGMENTS (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS #define CONTEXT_FLOATING_POINT (CONTEXT_i386 | 0x00000008L) // 387 state #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x00000020L) // cpu specific extensions #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS) #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS) #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L) // begin_wx86 typedef struct _FLOATING_SAVE_AREA { DWORD ControlWord; DWORD StatusWord; DWORD TagWord; DWORD ErrorOffset; DWORD ErrorSelector; DWORD DataOffset; DWORD DataSelector; BYTE RegisterArea[ 80]; DWORD Cr0NpxState; } FLOATING_SAVE_AREA; typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA; // end_ntddk // begin_wdm begin_ntosp #define MAXIMUM_SUPPORTED_EXTENSION 512 ; // end_wdm end_ntosp // begin_ntddk // // Context Frame // // This frame has a several purposes: 1) it is used as an argument to // NtContinue, 2) is is used to constuct a call frame for APC delivery, // and 3) it is used in the user level thread creation routines. // // The layout of the record conforms to a standard call frame. // typedef struct _CONTEXT { // // The flags values within this flag control the contents of // a CONTEXT record. // // If the context record is used as an input parameter, then // for each portion of the context record controlled by a flag // whose value is set, it is assumed that that portion of the // context record contains valid context. If the context record // is being used to modify a threads context, then only that // portion of the threads context will be modified. // // If the context record is used as an IN OUT parameter to capture // the context of a thread, then only those portions of the thread's // context corresponding to set flags will be returned. // // The context record is never used as an OUT only parameter. // DWORD ContextFlags; // // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT // included in CONTEXT_FULL. // DWORD Dr0; DWORD Dr1; DWORD Dr2; DWORD Dr3; DWORD Dr6; DWORD Dr7; // // This section is specified/returned if the // ContextFlags word contians the flag CONTEXT_FLOATING_POINT. // FLOATING_SAVE_AREA FloatSave; // // This section is specified/returned if the // ContextFlags word contians the flag CONTEXT_SEGMENTS. // DWORD SegGs; DWORD SegFs; DWORD SegEs; DWORD SegDs; // // This section is specified/returned if the // ContextFlags word contians the flag CONTEXT_INTEGER. // DWORD Edi; DWORD Esi; DWORD Ebx; DWORD Edx; DWORD Ecx; DWORD Eax; // // This section is specified/returned if the // ContextFlags word contians the flag CONTEXT_CONTROL. // DWORD Ebp; DWORD Eip; DWORD SegCs; // MUST BE SANITIZED DWORD EFlags; // MUST BE SANITIZED DWORD Esp; DWORD SegSs; // // This section is specified/returned if the ContextFlags word // contains the flag CONTEXT_EXTENDED_REGISTERS. // The format and contexts are processor specific // BYTE ExtendedRegisters[ 512]; } CONTEXT; typedef CONTEXT *PCONTEXT; // begin_ntminiport #define _LDT_ENTRY_DEFINED typedef struct _LDT_ENTRY { WORD LimitLow; WORD BaseLow; union { struct { BYTE BaseMid; BYTE Flags1; // Declare as bytes to avoid alignment BYTE Flags2; // Problems. BYTE BaseHi; } Bytes; struct { DWORD BaseMid : 8; DWORD Type : 5; DWORD Dpl : 2; DWORD Pres : 1; DWORD LimitHi : 4; DWORD Sys : 1; DWORD Reserved_0 : 1; DWORD Default_Big : 1; DWORD Granularity : 1; DWORD BaseHi : 8; } Bits; } HighWord; } LDT_ENTRY, *PLDT_ENTRY; extern "C" { // // Define bit test intrinsics. // #define BitTest _bittest #define BitTestAndComplement _bittestandcomplement #define BitTestAndSet _bittestandset #define BitTestAndReset _bittestandreset #define BitTest64 _bittest64 #define BitTestAndComplement64 _bittestandcomplement64 #define BitTestAndSet64 _bittestandset64 #define BitTestAndReset64 _bittestandreset64 [method: OnFunctionOnly] BOOLEAN _bittest ( [OnParameterOnly] LONG const *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandcomplement ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandset ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); BOOLEAN _bittestandreset ( [OnParameterOnly] LONG *Base, [OnParameterOnly] LONG Offset ); [method: OnFunctionOnly] BOOLEAN _bittest64 ( [OnParameterOnly] LONG64 const *Base, [OnParameterOnly] LONG64 Offset ); BOOLEAN _bittestandcomplement64 ( [OnParameterOnly] LONG64 *Base, [OnParameterOnly] LONG64 Offset ); BOOLEAN _bittestandset64 ( [OnParameterOnly] LONG64 *Base, [OnParameterOnly] LONG64 Offset ); BOOLEAN _bittestandreset64 ( [OnParameterOnly] LONG64 *Base, [OnParameterOnly] LONG64 Offset ); // // Define bit scan intrinsics. // #define BitScanForward _BitScanForward #define BitScanReverse _BitScanReverse #define BitScanForward64 _BitScanForward64 #define BitScanReverse64 _BitScanReverse64 BOOLEAN _BitScanForward ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD Mask ); BOOLEAN _BitScanReverse ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD Mask ); BOOLEAN _BitScanForward64 ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD64 Mask ); BOOLEAN _BitScanReverse64 ( [OnParameterOnly] DWORD *Index, [OnParameterOnly] DWORD64 Mask ); #define InterlockedCompareExchange16 _InterlockedCompareExchange16 SHORT _InterlockedCompareExchange16 ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT ExChange, [OnParameterOnly] SHORT Comperand ); } #define InterlockedAdd _InterlockedAdd #define InterlockedAddAcquire _InterlockedAdd_acq #define InterlockedAddRelease _InterlockedAdd_rel #define InterlockedIncrement _InterlockedIncrement #define InterlockedIncrementAcquire _InterlockedIncrement_acq #define InterlockedIncrementRelease _InterlockedIncrement_rel #define InterlockedDecrement _InterlockedDecrement #define InterlockedDecrementAcquire _InterlockedDecrement_acq #define InterlockedDecrementRelease _InterlockedDecrement_rel #define InterlockedExchange _InterlockedExchange #define InterlockedExchangeAcquire _InterlockedExchange_acq #define InterlockedExchangeAdd _InterlockedExchangeAdd #define InterlockedExchangeAddAcquire _InterlockedExchangeAdd_acq #define InterlockedExchangeAddRelease _InterlockedExchangeAdd_rel #define InterlockedAdd64 _InterlockedAdd64 #define InterlockedAddAcquire64 _InterlockedAdd64_acq #define InterlockedAddRelease64 _InterlockedAdd64_rel #define InterlockedIncrement64 _InterlockedIncrement64 #define InterlockedIncrementAcquire64 _InterlockedIncrement64_acq #define InterlockedIncrementRelease64 _InterlockedIncrement64_rel #define InterlockedDecrement64 _InterlockedDecrement64 #define InterlockedDecrementAcquire64 _InterlockedDecrement64_acq #define InterlockedDecrementRelease64 _InterlockedDecrement64_rel #define InterlockedExchange64 _InterlockedExchange64 #define InterlockedExchangeAcquire64 _InterlockedExchange64_acq #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64 #define InterlockedExchangeAddAcquire64 _InterlockedExchangeAdd64_acq #define InterlockedExchangeAddRelease64 _InterlockedExchangeAdd64_rel #define InterlockedCompareExchange64 _InterlockedCompareExchange64 #define InterlockedCompareExchangeAcquire64 _InterlockedCompareExchange64_acq #define InterlockedCompareExchangeRelease64 _InterlockedCompareExchange64_rel #define InterlockedCompare64Exchange128 _InterlockedCompare64Exchange128 #define InterlockedCompare64ExchangeAcquire128 _InterlockedCompare64Exchange128_acq #define InterlockedCompare64ExchangeRelease128 _InterlockedCompare64Exchange128_rel #define InterlockedCompareExchange _InterlockedCompareExchange #define InterlockedCompareExchangeAcquire _InterlockedCompareExchange_acq #define InterlockedCompareExchangeRelease _InterlockedCompareExchange_rel #define InterlockedExchangePointer _InterlockedExchangePointer #define InterlockedExchangePointerAcquire _InterlockedExchangePointer_acq #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer #define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer_rel #define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer_acq #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b) #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a) #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a) #define InterlockedOr _InterlockedOr #define InterlockedOrAcquire _InterlockedOr_acq #define InterlockedOrRelease _InterlockedOr_rel #define InterlockedOr8 _InterlockedOr8 #define InterlockedOr8Acquire _InterlockedOr8_acq #define InterlockedOr8Release _InterlockedOr8_rel #define InterlockedOr16 _InterlockedOr16 #define InterlockedOr16Acquire _InterlockedOr16_acq #define InterlockedOr16Release _InterlockedOr16_rel #define InterlockedOr64 _InterlockedOr64 #define InterlockedOr64Acquire _InterlockedOr64_acq #define InterlockedOr64Release _InterlockedOr64_rel #define InterlockedXor _InterlockedXor #define InterlockedXorAcquire _InterlockedXor_acq #define InterlockedXorRelease _InterlockedXor_rel #define InterlockedXor8 _InterlockedXor8 #define InterlockedXor8Acquire _InterlockedXor8_acq #define InterlockedXor8Release _InterlockedXor8_rel #define InterlockedXor16 _InterlockedXor16 #define InterlockedXor16Acquire _InterlockedXor16_acq #define InterlockedXor16Release _InterlockedXor16_rel #define InterlockedXor64 _InterlockedXor64 #define InterlockedXor64Acquire _InterlockedXor64_acq #define InterlockedXor64Release _InterlockedXor64_rel #define InterlockedAnd _InterlockedAnd #define InterlockedAndAcquire _InterlockedAnd_acq #define InterlockedAndRelease _InterlockedAnd_rel #define InterlockedAnd8 _InterlockedAnd8 #define InterlockedAnd8Acquire _InterlockedAnd8_acq #define InterlockedAnd8Release _InterlockedAnd8_rel #define InterlockedAnd16 _InterlockedAnd16 #define InterlockedAnd16Acquire _InterlockedAnd16_acq #define InterlockedAnd16Release _InterlockedAnd16_rel #define InterlockedAnd64 _InterlockedAnd64 #define InterlockedAnd64Acquire _InterlockedAnd64_acq #define InterlockedAnd64Release _InterlockedAnd64_rel extern "C" { LONG _InterlockedAdd ( [OnParameterOnly] LONG volatile *Addend, [OnParameterOnly] LONG Value ); LONG _InterlockedAdd_acq ( [OnParameterOnly] LONG volatile *Addend, [OnParameterOnly] LONG Value ); LONG _InterlockedAdd_rel ( [OnParameterOnly] LONG volatile *Addend, [OnParameterOnly] LONG Value ); LONGLONG _InterlockedAdd64 ( [OnParameterOnly] LONGLONG volatile *Addend, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedAdd64_acq ( [OnParameterOnly] LONGLONG volatile *Addend, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedAdd64_rel ( [OnParameterOnly] LONGLONG volatile *Addend, [OnParameterOnly] LONGLONG Value ); LONG _InterlockedIncrement( [OnParameterOnly] LONG volatile *Addend ); LONG _InterlockedDecrement( [OnParameterOnly] LONG volatile *Addend ); LONG _InterlockedIncrement_acq( [OnParameterOnly] LONG volatile *Addend ); LONG _InterlockedDecrement_acq( [OnParameterOnly] LONG volatile *Addend ); LONG _InterlockedIncrement_rel( [OnParameterOnly] LONG volatile *Addend ); LONG _InterlockedDecrement_rel( [OnParameterOnly] LONG volatile *Addend ); LONG _InterlockedExchange( [OnParameterOnly] LONG volatile *Target, [OnParameterOnly] LONG Value ); LONG _InterlockedExchange_acq( [OnParameterOnly] LONG volatile *Target, [OnParameterOnly] LONG Value ); LONG _InterlockedExchangeAdd( [OnParameterOnly] LONG volatile *Addend, [OnParameterOnly] LONG Value ); LONG _InterlockedExchangeAdd_acq( [OnParameterOnly] LONG volatile *Addend, [OnParameterOnly] LONG Value ); LONG _InterlockedExchangeAdd_rel( [OnParameterOnly] LONG volatile *Addend, [OnParameterOnly] LONG Value ); LONG _InterlockedCompareExchange ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG ExChange, [OnParameterOnly] LONG Comperand ); LONG _InterlockedCompareExchange_rel ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG ExChange, [OnParameterOnly] LONG Comperand ); LONG _InterlockedCompareExchange_acq ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG ExChange, [OnParameterOnly] LONG Comperand ); LONGLONG _InterlockedIncrement64( [OnParameterOnly] LONGLONG volatile *Addend ); LONGLONG _InterlockedIncrement64_acq( [OnParameterOnly] LONGLONG volatile *Addend ); LONGLONG _InterlockedIncrement64_rel( [OnParameterOnly] LONGLONG volatile *Addend ); LONGLONG _InterlockedDecrement64( [OnParameterOnly] LONGLONG volatile *Addend ); LONGLONG _InterlockedDecrement64_acq( [OnParameterOnly] LONGLONG volatile *Addend ); LONGLONG _InterlockedDecrement64_rel( [OnParameterOnly] LONGLONG volatile *Addend ); LONGLONG _InterlockedExchange64( [OnParameterOnly] LONGLONG volatile *Target, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedExchange64_acq( [OnParameterOnly] LONGLONG volatile *Target, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedExchangeAdd64( [OnParameterOnly] LONGLONG volatile *Addend, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedExchangeAdd64_acq( [OnParameterOnly] LONGLONG volatile *Addend, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedExchangeAdd64_rel( [OnParameterOnly] LONGLONG volatile *Addend, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedCompareExchange64 ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG ExChange, [OnParameterOnly] LONGLONG Comperand ); LONGLONG _InterlockedCompareExchange64_acq ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG ExChange, [OnParameterOnly] LONGLONG Comperand ); LONGLONG _InterlockedCompareExchange64_rel ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG ExChange, [OnParameterOnly] LONGLONG Comperand ); LONG64 _InterlockedCompare64Exchange128( [OnParameterOnly] LONG64 volatile *Destination, [OnParameterOnly] LONG64 ExchangeHigh, [OnParameterOnly] LONG64 ExchangeLow, [OnParameterOnly] LONG64 Comperand ); LONG64 _InterlockedCompare64Exchange128_acq( [OnParameterOnly] LONG64 volatile *Destination, [OnParameterOnly] LONG64 ExchangeHigh, [OnParameterOnly] LONG64 ExchangeLow, [OnParameterOnly] LONG64 Comperand ); LONG64 _InterlockedCompare64Exchange128_rel( [OnParameterOnly] LONG64 volatile *Destination, [OnParameterOnly] LONG64 ExchangeHigh, [OnParameterOnly] LONG64 ExchangeLow, [OnParameterOnly] LONG64 Comperand ); PVOID _InterlockedCompareExchangePointer ( [OnParameterOnly] PVOID volatile *Destination, [OnParameterOnly] PVOID Exchange, [OnParameterOnly] PVOID Comperand ); PVOID _InterlockedCompareExchangePointer_acq ( [OnParameterOnly] PVOID volatile *Destination, [OnParameterOnly] PVOID Exchange, [OnParameterOnly] PVOID Comperand ); PVOID _InterlockedCompareExchangePointer_rel ( [OnParameterOnly] PVOID volatile *Destination, [OnParameterOnly] PVOID Exchange, [OnParameterOnly] PVOID Comperand ); PVOID _InterlockedExchangePointer( [OnParameterOnly] PVOID volatile *Target, [OnParameterOnly] PVOID Value ); PVOID _InterlockedExchangePointer_acq( [OnParameterOnly] PVOID volatile *Target, [OnParameterOnly] PVOID Value ); LONG _InterlockedOr ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG _InterlockedOr_acq ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG _InterlockedOr_rel ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); CHAR _InterlockedOr8 ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); CHAR _InterlockedOr8_acq ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); CHAR _InterlockedOr8_rel ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); SHORT _InterlockedOr16( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedOr16_acq ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedOr16_rel ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); LONGLONG _InterlockedOr64 ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedOr64_acq ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedOr64_rel ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); LONG _InterlockedXor ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG _InterlockedXor_acq ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG _InterlockedXor_rel ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); CHAR _InterlockedXor8 ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); CHAR _InterlockedXor8_acq ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); CHAR _InterlockedXor8_rel ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); SHORT _InterlockedXor16( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedXor16_acq ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedXor16_rel ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); LONGLONG _InterlockedXor64 ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedXor64_acq ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedXor64_rel ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); LONG _InterlockedAnd ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG _InterlockedAnd_acq ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); LONG _InterlockedAnd_rel ( [OnParameterOnly] LONG volatile *Destination, [OnParameterOnly] LONG Value ); CHAR _InterlockedAnd8 ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); CHAR _InterlockedAnd8_acq ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); CHAR _InterlockedAnd8_rel ( [OnParameterOnly] CHAR volatile *Destination, [OnParameterOnly] CHAR Value ); SHORT _InterlockedAnd16( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedAnd16_acq ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); SHORT _InterlockedAnd16_rel ( [OnParameterOnly] SHORT volatile *Destination, [OnParameterOnly] SHORT Value ); LONGLONG _InterlockedAnd64 ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedAnd64_acq ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); LONGLONG _InterlockedAnd64_rel ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ); #define InterlockedAnd64 InterlockedAnd64_Inline LONGLONG __inline InterlockedAnd64_Inline ( [OnParameterOnly] LONGLONG volatile *Destination, [OnParameterOnly] LONGLONG Value ) { LONGLONG Old; do { Old = *Destination; } while ( _InterlockedCompareExchange64(Destination, Old & Value, Old) != Old); return Old; }