WinNT.h

来源:互联网 发布:oracle awr sql 编辑:程序博客网 时间:2024/04/30 06:00

非常重要的一个头文件,定义了大部分windows系统里一些内部结构,收藏下来,以便翻阅...

/*++ BUILD Version: 0091     Increment this if a change has global effectsCopyright (c) Microsoft Corporation. All rights reserved.Module Name:    winnt.hAbstract:    This module defines the 32-Bit Windows types and constants that are    defined by NT, but exposed through the Win32 API.Revision History:--*/#ifndef _WINNT_#define _WINNT_#ifdef __cplusplusextern "C" {#endif#include <ctype.h>  #define ANYSIZE_ARRAY 1       #include <specstrings.h>#if defined(_M_MRX000) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) && defined(ENABLE_RESTRICTED)#define RESTRICTED_POINTER __restrict#else#define RESTRICTED_POINTER#endif#if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64)#define ALIGNMENT_MACHINE#define UNALIGNED __unaligned#if defined(_WIN64)#define UNALIGNED64 __unaligned#else#define UNALIGNED64#endif#else#undef ALIGNMENT_MACHINE#define UNALIGNED#define UNALIGNED64#endif#if defined(_WIN64) || defined(_M_ALPHA)#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)#define MEMORY_ALLOCATION_ALIGNMENT 16#else#define MAX_NATURAL_ALIGNMENT sizeof(DWORD)#define MEMORY_ALLOCATION_ALIGNMENT 8#endif//// TYPE_ALIGNMENT will return the alignment requirements of a given type for// the current platform.//#ifdef __cplusplus#if _MSC_VER >= 1300#define TYPE_ALIGNMENT( t ) __alignof(t)#endif#else#define TYPE_ALIGNMENT( t ) \    FIELD_OFFSET( struct { char x; t test; }, test )#endif#if defined(_WIN64)#if defined(_AMD64_)#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )#elif defined(_IA64_)#define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? \                              TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD ))#else#error "No Target Architecture"#endif#define PROBE_ALIGNMENT32( _s ) TYPE_ALIGNMENT( DWORD )#else#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )#endif//// 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.//#ifndef SORTPP_PASS#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]#else#define C_ASSERT(e) /* nothing */#endif#include <basetsd.h>#if (defined(_M_IX86) || defined(_M_IA64) || defined(_M_AMD64)) && !defined(MIDL_PASS)#define DECLSPEC_IMPORT __declspec(dllimport)#else#define DECLSPEC_IMPORT#endif#ifndef DECLSPEC_NORETURN#if (_MSC_VER >= 1200) && !defined(MIDL_PASS)#define DECLSPEC_NORETURN   __declspec(noreturn)#else#define DECLSPEC_NORETURN#endif#endif#ifndef DECLSPEC_NOTHROW#if (_MSC_VER >= 1200) && !defined(MIDL_PASS)#define DECLSPEC_NOTHROW   __declspec(nothrow)#else#define DECLSPEC_NOTHROW#endif#endif#ifndef DECLSPEC_ALIGN#if (_MSC_VER >= 1300) && !defined(MIDL_PASS)#define DECLSPEC_ALIGN(x)   __declspec(align(x))#else#define DECLSPEC_ALIGN(x)#endif#endif#ifndef SYSTEM_CACHE_ALIGNMENT_SIZE#if defined(_AMD64_) || defined(_X86_)#define SYSTEM_CACHE_ALIGNMENT_SIZE 64#else#define SYSTEM_CACHE_ALIGNMENT_SIZE 128#endif#endif#ifndef DECLSPEC_CACHEALIGN#define DECLSPEC_CACHEALIGN DECLSPEC_ALIGN(SYSTEM_CACHE_ALIGNMENT_SIZE)#endif#ifndef DECLSPEC_UUID#if (_MSC_VER >= 1100) && defined (__cplusplus)#define DECLSPEC_UUID(x)    __declspec(uuid(x))#else#define DECLSPEC_UUID(x)#endif#endif#ifndef DECLSPEC_NOVTABLE#if (_MSC_VER >= 1100) && defined(__cplusplus)#define DECLSPEC_NOVTABLE   __declspec(novtable)#else#define DECLSPEC_NOVTABLE#endif#endif#ifndef DECLSPEC_SELECTANY#if (_MSC_VER >= 1100)#define DECLSPEC_SELECTANY  __declspec(selectany)#else#define DECLSPEC_SELECTANY#endif#endif#ifndef NOP_FUNCTION#if (_MSC_VER >= 1210)#define NOP_FUNCTION __noop#else#define NOP_FUNCTION (void)0#endif#endif#ifndef DECLSPEC_ADDRSAFE#if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))#define DECLSPEC_ADDRSAFE  __declspec(address_safe)#else#define DECLSPEC_ADDRSAFE#endif#endif#ifndef DECLSPEC_NOINLINE#if (_MSC_VER >= 1300)#define DECLSPEC_NOINLINE  __declspec(noinline)#else#define DECLSPEC_NOINLINE#endif#endif#ifndef FORCEINLINE#if (_MSC_VER >= 1200)#define FORCEINLINE __forceinline#else#define FORCEINLINE __inline#endif#endif#ifndef DECLSPEC_DEPRECATED#if (_MSC_VER >= 1300) && !defined(MIDL_PASS)#define DECLSPEC_DEPRECATED   __declspec(deprecated)#define DEPRECATE_SUPPORTED#else#define DECLSPEC_DEPRECATED#undef  DEPRECATE_SUPPORTED#endif#endif#ifdef DEPRECATE_DDK_FUNCTIONS#ifdef _NTDDK_#define DECLSPEC_DEPRECATED_DDK DECLSPEC_DEPRECATED#ifdef DEPRECATE_SUPPORTED#define PRAGMA_DEPRECATED_DDK 1#endif#else#define DECLSPEC_DEPRECATED_DDK#define PRAGMA_DEPRECATED_DDK 1#endif#else#define DECLSPEC_DEPRECATED_DDK#define PRAGMA_DEPRECATED_DDK 0#endif//// Void//typedef void *PVOID;typedef void * POINTER_64 PVOID64;#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)#define NTAPI __stdcall#else#define _cdecl#define NTAPI#endif#if !defined(_M_CEE_PURE)#define NTAPI_INLINE    NTAPI#else#define NTAPI_INLINE#endif//// Define API decoration for direct importing system DLL references.//#if !defined(_NTSYSTEM_)#define NTSYSAPI     DECLSPEC_IMPORT#define NTSYSCALLAPI DECLSPEC_IMPORT#else#define NTSYSAPI#if defined(_NTDLLBUILD_)#define NTSYSCALLAPI#else#define NTSYSCALLAPI DECLSPEC_ADDRSAFE#endif#endif//// Basics//#ifndef VOID#define VOID voidtypedef char CHAR;typedef short SHORT;typedef long LONG;#if !defined(MIDL_PASS)typedef int INT;#endif#endif//// UNICODE (Wide Character) types//#ifndef _MACtypedef wchar_t WCHAR;    // wc,   16-bit UNICODE character#else// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a chartypedef unsigned short WCHAR;    // wc,   16-bit UNICODE character#endiftypedef WCHAR *PWCHAR, *LPWCH, *PWCH;typedef CONST WCHAR *LPCWCH, *PCWCH;typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;typedef __nullterminated PWSTR *PZPWSTR;typedef __nullterminated CONST PWSTR *PCZPWSTR;typedef __nullterminated WCHAR UNALIGNED *LPUWSTR, *PUWSTR;typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;typedef __nullterminated PCWSTR *PZPCWSTR;typedef __nullterminated CONST WCHAR UNALIGNED *LPCUWSTR, *PCUWSTR;#if _WIN32_WINNT >= 0x0600 || (defined(__cplusplus) && defined(WINDOWS_ENABLE_CPLUSPLUS))typedef CONST WCHAR *LPCWCHAR, *PCWCHAR;typedef CONST WCHAR UNALIGNED *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 UNALIGNED *PUUCSSTR;typedef const UCSCHAR *PCUCSSTR;typedef const UCSCHAR UNALIGNED *PCUUCSSTR;typedef UCSCHAR UNALIGNED *PUUCSCHAR;typedef const UCSCHAR UNALIGNED *PCUUCSCHAR;#endif // _WIN32_WINNT >= 0x0600//// ANSI (Multi-byte Character) types//typedef CHAR *PCHAR, *LPCH, *PCH;typedef CONST CHAR *LPCCH, *PCCH;typedef __nullterminated CHAR *NPSTR, *LPSTR, *PSTR;typedef __nullterminated PSTR *PZPSTR;typedef __nullterminated CONST PSTR *PCZPSTR;typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;typedef __nullterminated PCSTR *PZPCSTR;//// Neutral ANSI/UNICODE types and macros//#ifdef  UNICODE                     // r_winnt#ifndef _TCHAR_DEFINEDtypedef WCHAR TCHAR, *PTCHAR;typedef WCHAR TBYTE , *PTBYTE ;#define _TCHAR_DEFINED#endif /* !_TCHAR_DEFINED */typedef LPWCH LPTCH, PTCH;typedef LPWSTR PTSTR, LPTSTR;typedef LPCWSTR PCTSTR, LPCTSTR;typedef LPUWSTR PUTSTR, LPUTSTR;typedef LPCUWSTR PCUTSTR, LPCUTSTR;typedef LPWSTR LP;#define __TEXT(quote) L##quote      // r_winnt#else   /* UNICODE */               // r_winnt#ifndef _TCHAR_DEFINEDtypedef char TCHAR, *PTCHAR;typedef unsigned char TBYTE , *PTBYTE ;#define _TCHAR_DEFINED#endif /* !_TCHAR_DEFINED */typedef LPCH LPTCH, PTCH;typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;#define __TEXT(quote) quote         // r_winnt#endif /* UNICODE */                // r_winnt#define TEXT(quote) __TEXT(quote)   // r_winnttypedef SHORT *PSHORT;  typedef LONG *PLONG;    #ifdef STRICTtypedef void *HANDLE;#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name#elsetypedef PVOID HANDLE;#define DECLARE_HANDLE(name) typedef HANDLE name#endiftypedef HANDLE *PHANDLE;//// Flag (bit) fields//typedef BYTE   FCHAR;typedef WORD   FSHORT;typedef DWORD  FLONG;// Component Object Model defines, and macros#ifndef _HRESULT_DEFINED#define _HRESULT_DEFINED#ifdef __midltypedef LONG HRESULT;#elsetypedef __success(return >= 0) long HRESULT;#endif // __midl#endif // !_HRESULT_DEFINED#ifdef __cplusplus    #define EXTERN_C    extern "C"#else    #define EXTERN_C    extern#endif#if defined(_WIN32) || defined(_MPPC_)// Win32 doesn't support __export#ifdef _68K_#define STDMETHODCALLTYPE       __cdecl#else#define STDMETHODCALLTYPE       __stdcall#endif#define STDMETHODVCALLTYPE      __cdecl#define STDAPICALLTYPE          __stdcall#define STDAPIVCALLTYPE         __cdecl#else#define STDMETHODCALLTYPE       __export __stdcall#define STDMETHODVCALLTYPE      __export __cdecl#define STDAPICALLTYPE          __export __stdcall#define STDAPIVCALLTYPE         __export __cdecl#endif#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.//#if defined(_M_IA64) && !defined(MIDL_PASS)__declspec(align(16))#endiftypedef 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_#if (!defined (_MAC) && (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))typedef __int64 LONGLONG;typedef unsigned __int64 ULONGLONG;#define MAXLONGLONG                         (0x7fffffffffffffff)#else#if defined(_MAC) && defined(_MAC_INT_64)typedef __int64 LONGLONG;typedef unsigned __int64 ULONGLONG;#define MAXLONGLONG                      (0x7fffffffffffffff)#elsetypedef double LONGLONG;typedef double ULONGLONG;#endif //_MAC and int64#endiftypedef LONGLONG *PLONGLONG;typedef ULONGLONG *PULONGLONG;// Update Sequence Numbertypedef LONGLONG USN;#if defined(MIDL_PASS)typedef struct _LARGE_INTEGER {#else // MIDL_PASStypedef union _LARGE_INTEGER {    struct {        DWORD LowPart;        LONG HighPart;    };    struct {        DWORD LowPart;        LONG HighPart;    } u;#endif //MIDL_PASS    LONGLONG QuadPart;} LARGE_INTEGER;typedef LARGE_INTEGER *PLARGE_INTEGER;#if defined(MIDL_PASS)typedef struct _ULARGE_INTEGER {#else // MIDL_PASStypedef union _ULARGE_INTEGER {    struct {        DWORD LowPart;        DWORD HighPart;    };    struct {        DWORD LowPart;        DWORD HighPart;    } u;#endif //MIDL_PASS    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.//#if defined(MIDL_PASS) || defined(RC_INVOKED) || defined(_M_CEE_PURE) \    || defined(_68K_) || defined(_MPPC_) \    || defined(_M_IA64) || defined(_M_AMD64)//// 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))#elif defined(_M_IX86)//// The x86 C compiler understands inline assembler. Therefore, inline functions// that employ inline assembler are used for shifts of 0..31.  The multiplies// rely on the compiler recognizing the cast of the multiplicand to int64 to// generate the optimal code inline.//#define Int32x32To64(a, b)  ((__int64)(((__int64)((long)(a))) * ((long)(b))))#define UInt32x32To64(a, b) ((unsigned __int64)(((unsigned __int64)((unsigned int)(a))) * ((unsigned int)(b))))ULONGLONGNTAPIInt64ShllMod32 (    ULONGLONG Value,    DWORD ShiftCount    );LONGLONGNTAPIInt64ShraMod32 (    LONGLONG Value,    DWORD ShiftCount    );ULONGLONGNTAPIInt64ShrlMod32 (    ULONGLONG Value,    DWORD ShiftCount    );#if _MSC_VER >= 1200#pragma warning(push)#endif#pragma warning(disable:4035 4793)               // re-enable below__inline ULONGLONGNTAPIInt64ShllMod32 (    ULONGLONG Value,    DWORD ShiftCount    ){    __asm    {        mov     ecx, ShiftCount        mov     eax, dword ptr [Value]        mov     edx, dword ptr [Value+4]        shld    edx, eax, cl        shl     eax, cl    }}__inline LONGLONGNTAPIInt64ShraMod32 (    LONGLONG Value,    DWORD ShiftCount    ){    __asm {        mov     ecx, ShiftCount        mov     eax, dword ptr [Value]        mov     edx, dword ptr [Value+4]        shrd    eax, edx, cl        sar     edx, cl    }}__inline ULONGLONGNTAPIInt64ShrlMod32 (    ULONGLONG Value,    DWORD ShiftCount    ){    __asm    {        mov     ecx, ShiftCount        mov     eax, dword ptr [Value]        mov     edx, dword ptr [Value+4]        shrd    eax, edx, cl        shr     edx, cl    }}#if _MSC_VER >= 1200#pragma warning(pop)#else#pragma warning(default:4035 4793)#endif#else#error Must define a target architecture.#endif//// Define rotate intrinsics.//#ifdef __cplusplusextern "C" {#endif#if defined(_M_AMD64)#define RotateLeft8 _rotl8#define RotateLeft16 _rotl16#define RotateRight8 _rotr8#define RotateRight16 _rotr16unsigned char__cdecl_rotl8 (    IN unsigned char Value,    IN unsigned char Shift    );unsigned short__cdecl_rotl16 (    IN unsigned short Value,    IN unsigned char Shift    );unsigned char__cdecl_rotr8 (    IN unsigned char Value,    IN unsigned char Shift    );unsigned short__cdecl_rotr16 (    IN unsigned short Value,    IN unsigned char Shift    );#pragma intrinsic(_rotl8)#pragma intrinsic(_rotl16)#pragma intrinsic(_rotr8)#pragma intrinsic(_rotr16)#endif /* _M_AMD64 */#if _MSC_VER >= 1300#define RotateLeft32 _rotl#define RotateLeft64 _rotl64#define RotateRight32 _rotr#define RotateRight64 _rotr64__checkReturnunsigned int__cdecl_rotl (    __in unsigned int Value,    __in int Shift    );unsigned __int64__cdecl_rotl64 (    IN unsigned __int64 Value,    __in int Shift    );__checkReturnunsigned int__cdecl_rotr (    __in unsigned int Value,    __in int Shift    );unsigned __int64__cdecl_rotr64 (    IN unsigned __int64 Value,    __in int Shift    );#pragma intrinsic(_rotl)#pragma intrinsic(_rotl64)#pragma intrinsic(_rotr)#pragma intrinsic(_rotr64)#endif  /* _MSC_VER >= 1300 */#ifdef __cplusplus}#endif#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, *RESTRICTED_POINTER 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;#include <guiddef.h>#ifndef __OBJECTID_DEFINED#define __OBJECTID_DEFINEDtypedef struct  _OBJECTID {     // size is 20    GUID Lineage;    DWORD Uniquifier;} OBJECTID;#endif // !_OBJECTID_DEFINED#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]))#if defined(__cplusplus) && \    !defined(MIDL_PASS) && \    !defined(RC_INVOKED) && \    !defined(_PREFAST_) && \    (_MSC_FULL_VER >= 13009466) && \    !defined(SORTPP_PASS)//// 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' linkagetemplate <typename T, size_t N>char (*RtlpNumberOf( UNALIGNED 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// }//#else#define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A)#endif#ifdef ENABLE_RTL_NUMBER_OF_V2#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A)#else#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A)#endif//// 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.#if defined(__cplusplus)#define RTL_CONST_CAST(type) const_cast<type>#else#define RTL_CONST_CAST(type) (type)#endif// like sizeof// usually this would be * CHAR_BIT, but we don't necessarily have #include <limits.h>#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)))#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//// 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_UNLICENSED                      0xABCDABCD#include <sdkddkver.h>////  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//////  Primary language IDs.//#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_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.//#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_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_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.//#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_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//////  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.//#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//////  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.//#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.//#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.//#if ! defined(lint)#define UNREFERENCED_PARAMETER(P)          (P)#define DBG_UNREFERENCED_PARAMETER(P)      (P)#define DBG_UNREFERENCED_LOCAL_VARIABLE(V) (V)#else // lint// Note: lint -e530 says don't complain about uninitialized variables for// this varible.  Error 527 has to do with unreachable code.// -restore restores checking to the -save state#define UNREFERENCED_PARAMETER(P)          \    /*lint -save -e527 -e530 */ \    { \        (P) = (P); \    } \    /*lint -restore */#define DBG_UNREFERENCED_PARAMETER(P)      \    /*lint -save -e527 -e530 */ \    { \        (P) = (P); \    } \    /*lint -restore */#define DBG_UNREFERENCED_LOCAL_VARIABLE(V) \    /*lint -save -e527 -e530 */ \    { \        (V) = (V); \    } \    /*lint -restore */#endif // lint//// 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;//#if (_MSC_VER > 1200)#define DEFAULT_UNREACHABLE default: __assume(0)#else//// Older compilers do not support __assume(), and there is no other free// method of eliminating the warning.//#define DEFAULT_UNREACHABLE#endif#ifndef WIN32_NO_STATUS /*lint -save -e767 */  #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_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 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_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_CONTROL_C_EXIT            ((DWORD   )0xC000013AL)    #define STATUS_FLOAT_MULTIPLE_FAULTS     ((DWORD   )0xC00002B4L)    #define STATUS_FLOAT_MULTIPLE_TRAPS      ((DWORD   )0xC00002B5L)    #define STATUS_REG_NAT_CONSUMPTION       ((DWORD   )0xC00002C9L)    #if defined(STATUS_SUCCESS) || (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100) #define STATUS_SXS_EARLY_DEACTIVATION    ((DWORD   )0xC015000FL)    #define STATUS_SXS_INVALID_DEACTIVATION  ((DWORD   )0xC0150010L)    #endif /*lint -restore */  #endif #define MAXIMUM_WAIT_OBJECTS 64     // Maximum number of wait objects#define MAXIMUM_SUSPEND_COUNT MAXCHAR // Maximum times thread can be suspendedtypedef ULONG_PTR KSPIN_LOCK;typedef KSPIN_LOCK *PKSPIN_LOCK;#ifdef _AMD64_#if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)//// Define bit test intrinsics.//#ifdef __cplusplusextern "C" {#endif#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 _interlockedbittestandreset64BOOLEAN_bittest (    IN LONG const *Base,    IN LONG Offset    );BOOLEAN_bittestandcomplement (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_bittestandset (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_bittestandreset (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_interlockedbittestandset (    IN LONG volatile *Base,    IN LONG Offset    );BOOLEAN_interlockedbittestandreset (    IN LONG volatile *Base,    IN LONG Offset    );BOOLEAN_bittest64 (    IN LONG64 const *Base,    IN LONG64 Offset    );BOOLEAN_bittestandcomplement64 (    IN LONG64 *Base,    IN LONG64 Offset    );BOOLEAN_bittestandset64 (    IN LONG64 *Base,    IN LONG64 Offset    );BOOLEAN_bittestandreset64 (    IN LONG64 *Base,    IN LONG64 Offset    );BOOLEAN_interlockedbittestandset64 (    IN LONG64 volatile *Base,    IN LONG64 Offset    );BOOLEAN_interlockedbittestandreset64 (    IN LONG64 volatile *Base,    IN LONG64 Offset    );#pragma intrinsic(_bittest)#pragma intrinsic(_bittestandcomplement)#pragma intrinsic(_bittestandset)#pragma intrinsic(_bittestandreset)#pragma intrinsic(_interlockedbittestandset)#pragma intrinsic(_interlockedbittestandreset)#pragma intrinsic(_bittest64)#pragma intrinsic(_bittestandcomplement64)#pragma intrinsic(_bittestandset64)#pragma intrinsic(_bittestandreset64)#pragma intrinsic(_interlockedbittestandset64)#pragma intrinsic(_interlockedbittestandreset64)//// Define bit scan intrinsics.//#define BitScanForward _BitScanForward#define BitScanReverse _BitScanReverse#define BitScanForward64 _BitScanForward64#define BitScanReverse64 _BitScanReverse64BOOLEAN_BitScanForward (    __out DWORD *Index,    __in DWORD Mask    );BOOLEAN_BitScanReverse (    __out DWORD *Index,    __in DWORD Mask    );BOOLEAN_BitScanForward64 (    __out DWORD *Index,    __in DWORD64 Mask    );BOOLEAN_BitScanReverse64 (    __out DWORD *Index,    __in DWORD64 Mask    );#pragma intrinsic(_BitScanForward)#pragma intrinsic(_BitScanReverse)#pragma intrinsic(_BitScanForward64)#pragma intrinsic(_BitScanReverse64)//// Interlocked intrinsic functions.//#define InterlockedIncrement16 _InterlockedIncrement16#define InterlockedDecrement16 _InterlockedDecrement16#define InterlockedCompareExchange16 _InterlockedCompareExchange16#define InterlockedAnd _InterlockedAnd#define InterlockedOr _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 InterlockedAndAffinity InterlockedAnd64#define InterlockedOr64 _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)SHORTInterlockedIncrement16 (    __inout SHORT volatile *Addend    );SHORTInterlockedDecrement16 (    __inout SHORT volatile *Addend    );SHORTInterlockedCompareExchange16 (    __inout SHORT volatile *Destination,    __in SHORT ExChange,    __in SHORT Comperand    );LONGInterlockedAnd (    __inout LONG volatile *Destination,    __in LONG Value    );LONGInterlockedOr (    __inout LONG volatile *Destination,    __in LONG Value    );LONGInterlockedXor (    __inout LONG volatile *Destination,    __in LONG Value    );LONG64InterlockedAnd64 (    __inout LONG64 volatile *Destination,    __in LONG64 Value    );LONG64InterlockedOr64 (    __inout LONG64 volatile *Destination,    __in LONG64 Value    );LONG64InterlockedXor64 (    __inout LONG64 volatile *Destination,    __in LONG64 Value    );LONGInterlockedIncrement(    __inout LONG volatile *Addend    );LONGInterlockedDecrement(    __inout LONG volatile *Addend    );LONGInterlockedExchange(    __inout LONG volatile *Target,    __in LONG Value    );LONGInterlockedExchangeAdd(    __inout LONG volatile *Addend,    __in LONG Value    );#if !defined(_X86AMD64_)__forceinlineLONGInterlockedAdd(    __inout LONG volatile *Addend,    __in LONG Value    ){    return InterlockedExchangeAdd(Addend, Value) + Value;}#endifLONGInterlockedCompareExchange (    __inout LONG volatile *Destination,    __in LONG ExChange,    __in LONG Comperand    );LONG64InterlockedIncrement64(    __inout LONG64 volatile *Addend    );LONG64InterlockedDecrement64(    __inout LONG64 volatile *Addend    );LONG64InterlockedExchange64(    __inout LONG64 volatile *Target,    __in LONG64 Value    );LONG64InterlockedExchangeAdd64(    __inout LONG64 volatile *Addend,    __in LONG64 Value    );#if !defined(_X86AMD64_)__forceinlineLONG64InterlockedAdd64(    __inout LONG64 volatile *Addend,    __in LONG64 Value    ){    return InterlockedExchangeAdd64(Addend, Value) + Value;}#endifLONG64InterlockedCompareExchange64 (    __inout LONG64 volatile *Destination,    __in LONG64 ExChange,    __in LONG64 Comperand    );PVOIDInterlockedCompareExchangePointer (    __inout PVOID volatile *Destination,    __in_opt PVOID Exchange,    __in_opt PVOID Comperand    );PVOIDInterlockedExchangePointer(    __inout PVOID volatile *Target,    __in_opt PVOID Value    );#pragma intrinsic(_InterlockedIncrement16)#pragma intrinsic(_InterlockedDecrement16)#pragma intrinsic(_InterlockedCompareExchange16)#pragma intrinsic(_InterlockedAnd)#pragma intrinsic(_InterlockedOr)#pragma intrinsic(_InterlockedXor)#pragma intrinsic(_InterlockedIncrement)#pragma intrinsic(_InterlockedDecrement)#pragma intrinsic(_InterlockedExchange)#pragma intrinsic(_InterlockedExchangeAdd)#pragma intrinsic(_InterlockedCompareExchange)#pragma intrinsic(_InterlockedAnd64)#pragma intrinsic(_InterlockedOr64)#pragma intrinsic(_InterlockedXor64)#pragma intrinsic(_InterlockedIncrement64)#pragma intrinsic(_InterlockedDecrement64)#pragma intrinsic(_InterlockedExchange64)#pragma intrinsic(_InterlockedExchangeAdd64)#pragma intrinsic(_InterlockedCompareExchange64)#pragma intrinsic(_InterlockedExchangePointer)#pragma intrinsic(_InterlockedCompareExchangePointer)#if _MSC_FULL_VER >= 140041204#define InterlockedAnd8 _InterlockedAnd8#define InterlockedOr8 _InterlockedOr8#define InterlockedXor8 _InterlockedXor8#define InterlockedAnd16 _InterlockedAnd16#define InterlockedOr16 _InterlockedOr16#define InterlockedXor16 _InterlockedXor16charInterlockedAnd8 (    __inout char volatile *Destination,    __in char Value    );charInterlockedOr8 (    __inout char volatile *Destination,    __in char Value    );charInterlockedXor8 (    __inout char volatile *Destination,    __in char Value    );SHORTInterlockedAnd16(    __inout SHORT volatile *Destination,    __in SHORT Value    );    SHORTInterlockedOr16(    __inout SHORT volatile *Destination,    __in SHORT Value    );SHORTInterlockedXor16(    __inout SHORT volatile *Destination,    __in SHORT Value    );#pragma intrinsic (_InterlockedAnd8)#pragma intrinsic (_InterlockedOr8)#pragma intrinsic (_InterlockedXor8)#pragma intrinsic (_InterlockedAnd16)#pragma intrinsic (_InterlockedOr16)#pragma intrinsic (_InterlockedXor16)#endif//// Define function to flush a cache line.//#define CacheLineFlush(Address) _mm_clflush(Address)VOID_mm_clflush (    __in VOID const *Address    );#pragma intrinsic(_mm_clflush)VOID_ReadWriteBarrier (    VOID    );#pragma intrinsic(_ReadWriteBarrier)//// Define memory fence intrinsics//#define FastFence __faststorefence#define LoadFence _mm_lfence#define MemoryFence _mm_mfence#define StoreFence _mm_sfenceVOID__faststorefence (    VOID    );VOID_mm_lfence (    VOID    );VOID_mm_mfence (    VOID    );VOID_mm_sfence (    VOID    );VOID_mm_pause (    VOID    );VOID _mm_prefetch (    __in CHAR CONST *a,     __in int sel    );VOID_m_prefetchw (    __in 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#pragma intrinsic(__faststorefence)#pragma intrinsic(_mm_pause)#pragma intrinsic(_mm_prefetch)#pragma intrinsic(_mm_lfence)#pragma intrinsic(_mm_mfence)#pragma intrinsic(_mm_sfence)#pragma intrinsic(_m_prefetchw)#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_setcsrunsigned int_mm_getcsr (    VOID    );VOID_mm_setcsr (    __in unsigned int MxCsr    );#pragma intrinsic(_mm_getcsr)#pragma intrinsic(_mm_setcsr)//// Assert exception.//VOID__int2c (    VOID    );#pragma intrinsic(__int2c)#define DbgRaiseAssertionFailure() __int2c()//// Define function to get the caller's EFLAGs value.//#define GetCallersEflags() __getcallerseflags()unsigned __int32__getcallerseflags (    VOID    );#pragma intrinsic(__getcallerseflags)//// Define function to get segment limit.//#define GetSegmentLimit __segmentlimitDWORD__segmentlimit (    __in DWORD Selector    );#pragma intrinsic(__segmentlimit)//// Define function to read the value of a performance counter.//#define ReadPMC __readpmcDWORD64__readpmc (    __in DWORD Counter    );#pragma intrinsic(__readpmc)//// Define function to read the value of the time stamp counter//#define ReadTimeStampCounter() __rdtsc()DWORD64__rdtsc (    VOID    );#pragma intrinsic(__rdtsc)//// Define functions to move strings as bytes, words, dwords, and qwords.//VOID__movsb (    IN PBYTE  Destination,    IN BYTE  const *Source,    IN SIZE_T Count    );VOID__movsw (    IN PWORD   Destination,    IN WORD   const *Source,    IN SIZE_T Count    );VOID__movsd (    IN PDWORD Destination,    IN DWORD const *Source,    IN SIZE_T Count    );VOID__movsq (    IN PDWORD64 Destination,    IN DWORD64 const *Source,    IN SIZE_T Count    );#pragma intrinsic(__movsb)#pragma intrinsic(__movsw)#pragma intrinsic(__movsd)#pragma intrinsic(__movsq)//// Define functions to store strings as bytes, words, dwords, and qwords.//VOID__stosb (    IN PBYTE  Destination,    IN BYTE  Value,    IN SIZE_T Count    );VOID__stosw (    IN PWORD   Destination,    IN WORD   Value,    IN SIZE_T Count    );VOID__stosd (    IN PDWORD Destination,    IN DWORD Value,    IN SIZE_T Count    );VOID__stosq (    IN PDWORD64 Destination,    IN DWORD64 Value,    IN SIZE_T Count    );#pragma intrinsic(__stosb)#pragma intrinsic(__stosw)#pragma intrinsic(__stosd)#pragma intrinsic(__stosq)//// Define functions to capture the high 64-bits of a 128-bit multiply.//#define MultiplyHigh __mulh#define UnsignedMultiplyHigh __umulhLONGLONGMultiplyHigh (    __in LONG64 Multiplier,    __in LONG64 Multiplicand    );ULONGLONGUnsignedMultiplyHigh (    __in DWORD64 Multiplier,    __in DWORD64 Multiplicand    );#pragma intrinsic(__mulh)#pragma intrinsic(__umulh)//// Define functions to perform 128-bit shifts//#define ShiftLeft128 __shiftleft128#define ShiftRight128 __shiftright128DWORD64ShiftLeft128 (    __in DWORD64 LowPart,    __in DWORD64 HighPart,    __in BYTE  Shift    );DWORD64ShiftRight128 (    __in DWORD64 LowPart,    __in DWORD64 HighPart,    __in BYTE  Shift    );#pragma intrinsic(__shiftleft128)#pragma intrinsic(__shiftright128)//// Define functions to perform 128-bit multiplies.//#define Multiply128 _mul128LONG64Multiply128 (    __in LONG64 Multiplier,    __in LONG64 Multiplicand,    __out LONG64 *HighProduct    );#pragma intrinsic(_mul128)#ifndef UnsignedMultiply128#define UnsignedMultiply128 _umul128DWORD64UnsignedMultiply128 (    __in DWORD64 Multiplier,    __in DWORD64 Multiplicand,    __out DWORD64 *HighProduct    );#pragma intrinsic(_umul128)#endif__forceinlineLONG64MultiplyExtract128 (    __in LONG64 Multiplier,    __in LONG64 Multiplicand,    __in BYTE  Shift    ){    LONG64 extractedProduct;    LONG64 highProduct;    LONG64 lowProduct;    BOOLEAN negate;    DWORD64 uhighProduct;    DWORD64 ulowProduct;    lowProduct = Multiply128(Multiplier, Multiplicand, &highProduct);    negate = FALSE;    uhighProduct = (DWORD64)highProduct;    ulowProduct = (DWORD64)lowProduct;    if (highProduct < 0) {        negate = TRUE;        uhighProduct = (DWORD64)(-highProduct);        ulowProduct = (DWORD64)(-lowProduct);        if (ulowProduct != 0) {            uhighProduct -= 1;        }    }    extractedProduct = (LONG64)ShiftRight128(ulowProduct, uhighProduct, Shift);    if (negate != FALSE) {        extractedProduct = -extractedProduct;    }    return extractedProduct;}__forceinlineDWORD64UnsignedMultiplyExtract128 (    __in DWORD64 Multiplier,    __in DWORD64 Multiplicand,    __in BYTE  Shift    ){    DWORD64 extractedProduct;    DWORD64 highProduct;    DWORD64 lowProduct;    lowProduct = UnsignedMultiply128(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 (    IN DWORD Offset    );WORD  __readgsword (    IN DWORD Offset    );DWORD__readgsdword (    IN DWORD Offset    );DWORD64__readgsqword (    IN DWORD Offset    );VOID__writegsbyte (    IN DWORD Offset,    IN BYTE  Data    );VOID__writegsword (    IN DWORD Offset,    IN WORD   Data    );VOID__writegsdword (    IN DWORD Offset,    IN DWORD Data    );VOID__writegsqword (    IN DWORD Offset,    IN DWORD64 Data    );#pragma intrinsic(__readgsbyte)#pragma intrinsic(__readgsword)#pragma intrinsic(__readgsdword)#pragma intrinsic(__readgsqword)#pragma intrinsic(__writegsbyte)#pragma intrinsic(__writegsword)#pragma intrinsic(__writegsdword)#pragma intrinsic(__writegsqword)#if !defined(_MANAGED)VOID__incgsbyte (    DWORD Offset    ); VOID__addgsbyte (    DWORD Offset,    BYTE  Value    ); VOID__incgsword (    DWORD Offset    ); VOID__addgsword (    DWORD Offset,    WORD   Value    ); VOID__incgsdword (    DWORD Offset    ); VOID__addgsdword (    DWORD Offset,    DWORD Value    ); VOID__incgsqword (    DWORD Offset    ); VOID__addgsqword (    DWORD Offset,    DWORD64 Value    );#if 0#pragma intrinsic(__incgsbyte)#pragma intrinsic(__addgsbyte)#pragma intrinsic(__incgsword)#pragma intrinsic(__addgsword)#pragma intrinsic(__incgsdword)#pragma intrinsic(__addgsdword)#pragma intrinsic(__incgsqword)#pragma intrinsic(__addgsqword)#endif#endif#ifdef __cplusplus}#endif #endif // defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)//// 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.//#if !defined(RC_INVOKED)#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_EXCEPTION_ACTIVE 0x8000000#define CONTEXT_SERVICE_ACTIVE 0x10000000#define CONTEXT_EXCEPTION_REQUEST 0x40000000#define CONTEXT_EXCEPTION_REPORTING 0x80000000// begin_wx86#endif // !defined(RC_INVOKED)//// Define initial MxCsr and FpCsr control.//#define INITIAL_MXCSR 0x1f80            // initial MXCSR value#define INITIAL_FPCSR 0x027f            // initial FPCSR value//// Define 128-bit 16-byte aligned xmm register type.//typedef struct DECLSPEC_ALIGN(16) _M128A {    ULONGLONG Low;    LONGLONG High;} M128A, *PM128A;//// Format of data for 32-bit fxsave/fxrstor instructions.//typedef struct _XMM_SAVE_AREA32 {    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];} XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;#define LEGACY_SAVE_AREA_LENGTH sizeof(XMM_SAVE_AREA32)//// 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 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_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7.//// CONTEXT_MMX_REGISTERS specifies the floating point and extended registers//     Mm0/St0-Mm7/St7 and Xmm0-Xmm15).//typedef struct DECLSPEC_ALIGN(16) _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 0x1typedef struct _RUNTIME_FUNCTION {    DWORD BeginAddress;    DWORD EndAddress;    DWORD UnwindData;} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;//// Define dynamic function table entry.//typedefPRUNTIME_FUNCTION(*PGET_RUNTIME_FUNCTION_CALLBACK) (    IN DWORD64 ControlPc,    IN PVOID Context    );typedefDWORD   (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK) (    IN HANDLE Process,    IN PVOID TableAddress,    OUT PDWORD Entries,    OUT PRUNTIME_FUNCTION* Functions    );#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \    "OutOfProcessFunctionTableCallback"//// Define runtime exception handling prototypes.//NTSYSAPIVOID__cdeclRtlRestoreContext (    IN PCONTEXT ContextRecord,    IN struct _EXCEPTION_RECORD *ExceptionRecord OPTIONAL    );NTSYSAPIBOOLEAN__cdeclRtlAddFunctionTable (    IN PRUNTIME_FUNCTION FunctionTable,    IN DWORD EntryCount,    IN DWORD64 BaseAddress    );NTSYSAPIBOOLEAN__cdeclRtlInstallFunctionTableCallback (    IN DWORD64 TableIdentifier,    IN DWORD64 BaseAddress,    IN DWORD Length,    IN PGET_RUNTIME_FUNCTION_CALLBACK Callback,    IN PVOID Context,    IN PCWSTR OutOfProcessCallbackDll OPTIONAL    );NTSYSAPIBOOLEAN__cdeclRtlDeleteFunctionTable (    IN PRUNTIME_FUNCTION FunctionTable    );#endif // _AMD64_#ifdef _X86_//// Disable these two pragmas that evaluate to "sti" "cli" on x86 so that driver// writers to not leave them inadvertantly in their code.//#if !defined(MIDL_PASS)#if !defined(RC_INVOKED)#if _MSC_VER >= 1200#pragma warning(push)#endif#pragma warning(disable:4164)   // disable C4164 warning so that apps that                                // build with /Od don't get weird errors !#ifdef _M_IX86#pragma function(_enable)#pragma function(_disable)#endif#if _MSC_VER >= 1200#pragma warning(pop)#else#pragma warning(default:4164)   // reenable C4164 warning#endif#endif#endif// end_ntddk end_nthal#if defined(_M_IX86) && !defined(RC_INVOKED) && !defined(MIDL_PASS)#ifdef __cplusplusextern "C" {#endif//// [pfx_parse] - guard against PREfix intrinsic error//#if (_MSC_FULL_VER >= 14000101) && (!defined(_PREFIX_))//// Define bit test intrinsics.//#define BitTest _bittest#define BitTestAndComplement _bittestandcomplement#define BitTestAndSet _bittestandset#define BitTestAndReset _bittestandreset#define InterlockedBitTestAndSet _interlockedbittestandset#define InterlockedBitTestAndReset _interlockedbittestandresetBOOLEAN_bittest (    IN LONG const *Base,    IN LONG Offset    );BOOLEAN_bittestandcomplement (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_bittestandset (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_bittestandreset (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_interlockedbittestandset (    IN LONG volatile *Base,    IN LONG Offset    );BOOLEAN_interlockedbittestandreset (    IN LONG volatile *Base,    IN LONG Offset    );#pragma intrinsic(_bittest)#pragma intrinsic(_bittestandcomplement)#pragma intrinsic(_bittestandset)#pragma intrinsic(_bittestandreset)#pragma intrinsic(_interlockedbittestandset)#pragma intrinsic(_interlockedbittestandreset)//// Define bit scan intrinsics.//#define BitScanForward _BitScanForward#define BitScanReverse _BitScanReverseBOOLEAN_BitScanForward (    __out DWORD *Index,    __in DWORD Mask    );BOOLEAN_BitScanReverse (    __out DWORD *Index,    __in DWORD Mask    );#pragma intrinsic(_BitScanForward)#pragma intrinsic(_BitScanReverse)#else#pragma warning(push)#pragma warning(disable:4035 4793)FORCEINLINEBOOLEANInterlockedBitTestAndSet (    IN LONG volatile *Base,    IN LONG Bit    ){    __asm {           mov eax, Bit           mov ecx, Base           lock bts [ecx], eax           setc al    };}FORCEINLINEBOOLEANInterlockedBitTestAndReset (    IN LONG volatile *Base,    IN LONG Bit    ){    __asm {           mov eax, Bit           mov ecx, Base           lock btr [ecx], eax           setc al    };}#pragma warning(pop)#endif/* _MSC_FULL_VER >= 14000101 *///// [pfx_parse] - guard against PREfix intrinsic error//#if (_MSC_FULL_VER >= 140040816) || (defined(_PREFAST_) && (_MSC_VER >= 1400))#define InterlockedCompareExchange16 _InterlockedCompareExchange16SHORT_InterlockedCompareExchange16 (    __inout SHORT volatile *Destination,    __in SHORT ExChange,    __in SHORT Comperand    );#pragma intrinsic(_InterlockedCompareExchange16)#endif  /* _MSC_FULL_VER >= 140040816 */#if !defined(_M_CEE_PURE)#pragma warning(push)#pragma warning(disable:4035 4793)FORCEINLINEBOOLEANInterlockedBitTestAndComplement (    IN LONG volatile *Base,    IN LONG Bit    ){    __asm {           mov eax, Bit           mov ecx, Base           lock btc [ecx], eax           setc al    };}#pragma warning(pop)#endif/* _M_CEE_PURE *///// [pfx_parse]// guard against __readfsbyte parsing error//#if (_MSC_FULL_VER >= 13012035) || defined(_PREFIX_) || defined(_PREFAST_)//// Define FS referencing intrinsics//BYTE __readfsbyte (    IN DWORD Offset    ); WORD  __readfsword (    IN DWORD Offset    ); DWORD__readfsdword (    IN DWORD Offset    ); VOID__writefsbyte (    IN DWORD Offset,    IN BYTE  Data    ); VOID__writefsword (    IN DWORD Offset,    IN WORD   Data    ); VOID__writefsdword (    IN DWORD Offset,    IN DWORD Data    );#pragma intrinsic(__readfsbyte)#pragma intrinsic(__readfsword)#pragma intrinsic(__readfsdword)#pragma intrinsic(__writefsbyte)#pragma intrinsic(__writefsword)#pragma intrinsic(__writefsdword)#endif/* _MSC_FULL_VER >= 13012035 */#if (_MSC_FULL_VER >= 140050727) || defined(_PREFIX_) || defined(_PREFAST_)#if !defined(_MANAGED)VOID__incfsbyte (    DWORD Offset    ); VOID__addfsbyte (    DWORD Offset,    BYTE  Value    ); VOID__incfsword (    DWORD Offset    ); VOID__addfsword (    DWORD Offset,    WORD   Value    ); VOID__incfsdword (    DWORD Offset    ); VOID__addfsdword (    DWORD Offset,    DWORD Value    ); #if 0#pragma intrinsic(__incfsbyte)#pragma intrinsic(__addfsbyte)#pragma intrinsic(__incfsword)#pragma intrinsic(__addfsword)#pragma intrinsic(__incfsdword)#pragma intrinsic(__addfsdword)#endif#endif#endif/* _MSC_FULL_VER >= 140050727 */#if (_MSC_FULL_VER >= 140041204) || defined(_PREFIX_) || defined(_PREFAST_)VOID_mm_pause (    VOID    );#pragma intrinsic(_mm_pause)#define YieldProcessor _mm_pause#else#if !defined(_M_CEE_PURE)#define YieldProcessor() __asm { rep nop }#endif  // !defined(_M_CEE_PURE)#endif  // (_MSC_FULL_VER >= 140041204)#ifdef __cplusplus}#endif#endif  /* !defined(MIDL_PASS) || defined(_M_IX86) */#if !defined(MIDL_PASS) && defined(_M_IX86)#if !defined(_M_CEE_PURE)#pragma warning( push )#pragma warning( disable : 4793 )FORCEINLINEVOIDMemoryBarrier (    VOID    ){    LONG Barrier;    __asm {        xchg Barrier, eax    }}#pragma warning( pop )#endif /* _M_CEE_PURE *///// Prefetch is not supported on all x86 procssors.//#define PreFetchCacheLine(l, a)#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.//#if _MSC_FULL_VER >= 140050727#define ReadPMC __readpmcDWORD64__readpmc (    __in DWORD Counter    );#pragma intrinsic(__readpmc)#elseFORCEINLINEDWORD64ReadPMC (    __in DWORD Counter    ){    __asm {        mov ecx, Counter        rdpmc    };}#endif//// Define function to read the value of the time stamp counter//#if _MSC_FULL_VER >= 140040310#define ReadTimeStampCounter() __rdtsc()DWORD64__rdtsc (    VOID    );#pragma intrinsic(__rdtsc)#elseFORCEINLINEDWORD64ReadTimeStampCounter (    VOID    ){    __asm rdtsc}#endif// end_ntddk// begin_wdm#if defined(_X86_) && defined(_M_IX86) && !defined(RC_INVOKED) && !defined(MIDL_PASS)#if _MSC_FULL_VER >= 140030222VOID__int2c (    VOID    );#pragma intrinsic(__int2c)#define DbgRaiseAssertionFailure() __int2c()#else#pragma warning( push )#pragma warning( disable : 4793 )FORCEINLINEVOIDDbgRaiseAssertionFailure (    void    ){    __asm int 0x2c}#pragma warning( pop )#endif#endif// end_wdm #if (_MSC_FULL_VER >= 13012035)__inline PVOID GetFiberData( void )    { return *(PVOID *) (ULONG_PTR) __readfsdword (0x10);}__inline PVOID GetCurrentFiber( void ) { return (PVOID) (ULONG_PTR) __readfsdword (0x10);}#else#if _MSC_VER >= 1200#pragma warning(push)#endif#pragma warning (disable:4035 4793)        // disable 4035 (function must return something)__inline PVOID GetFiberData( void ) { __asm {                                        mov eax, fs:[0x10]                                        mov eax,[eax]                                        }                                     }__inline PVOID GetCurrentFiber( void ) { __asm mov eax, fs:[0x10] }#if _MSC_VER >= 1200#pragma warning(pop)#else#pragma warning (default:4035 4793)        // Reenable it#endif#endif // (_MSC_FULL_VER >= 13012035)// begin_ntddk#endif // !defined(MIDL_PASS) && defined(_M_IX86)// 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.//#if !defined(RC_INVOKED)#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)// begin_wx86#endif // !defined(RC_INVOKED)#define MAXIMUM_SUPPORTED_EXTENSION     512typedef struct _FLOATING_SAVE_AREA {    DWORD   ControlWord;    DWORD   StatusWord;    DWORD   TagWord;    DWORD   ErrorOffset;    DWORD   ErrorSelector;    DWORD   DataOffset;    DWORD   DataSelector;    BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];    DWORD   Cr0NpxState;} FLOATING_SAVE_AREA;typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;//// 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[MAXIMUM_SUPPORTED_EXTENSION];} CONTEXT;typedef CONTEXT *PCONTEXT;// begin_ntminiport#endif //_X86_#ifndef _LDT_ENTRY_DEFINED#define _LDT_ENTRY_DEFINEDtypedef 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;#endif#if defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)#ifdef __cplusplusextern "C" {#endif//// 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 _bittestandreset64BOOLEAN_bittest (    IN LONG const *Base,    IN LONG Offset    );BOOLEAN_bittestandcomplement (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_bittestandset (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_bittestandreset (    IN LONG *Base,    IN LONG Offset    );BOOLEAN_bittest64 (    IN LONG64 const *Base,    IN LONG64 Offset    );BOOLEAN_bittestandcomplement64 (    IN LONG64 *Base,    IN LONG64 Offset    );BOOLEAN_bittestandset64 (    IN LONG64 *Base,    IN LONG64 Offset    );BOOLEAN_bittestandreset64 (    IN LONG64 *Base,    IN LONG64 Offset    );#pragma intrinsic(_bittest)#pragma intrinsic(_bittestandcomplement)#pragma intrinsic(_bittestandset)#pragma intrinsic(_bittestandreset)#pragma intrinsic(_bittest64)#pragma intrinsic(_bittestandcomplement64)#pragma intrinsic(_bittestandset64)#pragma intrinsic(_bittestandreset64)//// Define bit scan intrinsics.//#define BitScanForward _BitScanForward#define BitScanReverse _BitScanReverse#define BitScanForward64 _BitScanForward64#define BitScanReverse64 _BitScanReverse64BOOLEAN_BitScanForward (    OUT DWORD *Index,    IN DWORD Mask    );BOOLEAN_BitScanReverse (    OUT DWORD *Index,    IN DWORD Mask    );BOOLEAN_BitScanForward64 (    OUT DWORD *Index,    IN DWORD64 Mask    );BOOLEAN_BitScanReverse64 (    OUT DWORD *Index,    IN DWORD64 Mask    );#pragma intrinsic(_BitScanForward)#pragma intrinsic(_BitScanReverse)#pragma intrinsic(_BitScanForward64)#pragma intrinsic(_BitScanReverse64)#define InterlockedCompareExchange16 _InterlockedCompareExchange16SHORT_InterlockedCompareExchange16 (    __inout SHORT volatile *Destination,    __in SHORT ExChange,    __in SHORT Comperand    );#pragma intrinsic(_InterlockedCompareExchange16)#ifdef __cplusplus}#endif#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#ifdef __cplusplusextern "C" {#endifLONG__cdeclInterlockedAdd (    LONG volatile *Addend,    LONG Value    );LONG__cdeclInterlockedAddAcquire (    LONG volatile *Addend,    LONG Value    );LONG__cdeclInterlockedAddRelease (    LONG volatile *Addend,    LONG Value    );    LONGLONG__cdeclInterlockedAdd64 (    LONGLONG volatile *Addend,    LONGLONG Value    );LONGLONG__cdeclInterlockedAddAcquire64 (    LONGLONG volatile *Addend,    LONGLONG Value    );LONGLONG__cdeclInterlockedAddRelease64 (    LONGLONG volatile *Addend,    LONGLONG Value    );LONG__cdeclInterlockedIncrement(    IN OUT LONG volatile *Addend    );LONG__cdeclInterlockedDecrement(    IN OUT LONG volatile *Addend    );LONG__cdeclInterlockedIncrementAcquire(    IN OUT LONG volatile *Addend    );LONG__cdeclInterlockedDecrementAcquire(    IN OUT LONG volatile *Addend    );LONG__cdeclInterlockedIncrementRelease(    IN OUT LONG volatile *Addend    );LONG__cdeclInterlockedDecrementRelease(    IN OUT LONG volatile *Addend    );LONG__cdeclInterlockedExchange(    IN OUT LONG volatile *Target,    IN LONG Value    );LONG__cdeclInterlockedExchangeAcquire(    IN OUT LONG volatile *Target,    IN LONG Value    );LONG__cdeclInterlockedExchangeAdd(    IN OUT LONG volatile *Addend,    IN LONG Value    );LONG__cdeclInterlockedExchangeAddAcquire(    IN OUT LONG volatile *Addend,    IN LONG Value    );LONG__cdeclInterlockedExchangeAddRelease(    IN OUT LONG volatile *Addend,    IN LONG Value    );LONG__cdeclInterlockedCompareExchange (    IN OUT LONG volatile *Destination,    IN LONG ExChange,    IN LONG Comperand    );LONG__cdeclInterlockedCompareExchangeRelease (    IN OUT LONG volatile *Destination,    IN LONG ExChange,    IN LONG Comperand    );LONG__cdeclInterlockedCompareExchangeAcquire (    IN OUT LONG volatile *Destination,    IN LONG ExChange,    IN LONG Comperand    );LONGLONG__cdeclInterlockedIncrement64(    IN OUT LONGLONG volatile *Addend    );LONGLONG__cdeclInterlockedIncrementAcquire64(    IN OUT LONGLONG volatile *Addend    );LONGLONG__cdeclInterlockedIncrementRelease64(    IN OUT LONGLONG volatile *Addend    );LONGLONG__cdeclInterlockedDecrement64(    IN OUT LONGLONG volatile *Addend    );LONGLONG__cdeclInterlockedDecrementAcquire64(    IN OUT LONGLONG volatile *Addend    );LONGLONG__cdeclInterlockedDecrementRelease64(    IN OUT LONGLONG volatile *Addend    );LONGLONG__cdeclInterlockedExchange64(    IN OUT LONGLONG volatile *Target,    IN LONGLONG Value    );LONGLONG__cdeclInterlockedExchangeAcquire64(    IN OUT LONGLONG volatile *Target,    IN LONGLONG Value    );LONGLONG__cdeclInterlockedExchangeAdd64(    IN OUT LONGLONG volatile *Addend,    IN LONGLONG Value    );LONGLONG__cdeclInterlockedExchangeAddAcquire64(    IN OUT LONGLONG volatile *Addend,    IN LONGLONG Value    );LONGLONG__cdeclInterlockedExchangeAddRelease64(    IN OUT LONGLONG volatile *Addend,    IN LONGLONG Value    );LONGLONG__cdeclInterlockedCompareExchange64 (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG ExChange,    IN LONGLONG Comperand    );LONGLONG__cdeclInterlockedCompareExchangeAcquire64 (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG ExChange,    IN LONGLONG Comperand    );LONGLONG__cdeclInterlockedCompareExchangeRelease64 (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG ExChange,    IN LONGLONG Comperand    );LONG64__cdeclInterlockedCompare64Exchange128(    __inout LONG64 volatile * Destination,    __in LONG64 ExchangeHigh,    __in LONG64 ExchangeLow,    __in LONG64 Comperand    );LONG64__cdeclInterlockedCompare64ExchangeAcquire128(    __inout LONG64 volatile * Destination,    __in LONG64 ExchangeHigh,    __in LONG64 ExchangeLow,    __in LONG64 Comperand    );LONG64__cdeclInterlockedCompare64ExchangeRelease128(    __inout LONG64 volatile * Destination,    __in LONG64 ExchangeHigh,    __in LONG64 ExchangeLow,    __in LONG64 Comperand    );PVOID__cdeclInterlockedCompareExchangePointer (    IN OUT PVOID volatile *Destination,    IN PVOID Exchange,    IN PVOID Comperand    );PVOID__cdeclInterlockedCompareExchangePointerAcquire (    IN OUT PVOID volatile *Destination,    IN PVOID Exchange,    IN PVOID Comperand    );PVOID__cdeclInterlockedCompareExchangePointerRelease (    IN OUT PVOID volatile *Destination,    IN PVOID Exchange,    IN PVOID Comperand    );PVOID__cdeclInterlockedExchangePointer(    IN OUT PVOID volatile *Target,    IN PVOID Value    );PVOID__cdeclInterlockedExchangePointerAcquire(    IN OUT PVOID volatile *Target,    IN PVOID Value    );LONG__cdeclInterlockedOr (    IN OUT LONG volatile *Destination,    IN LONG Value    );LONG__cdeclInterlockedOrAcquire (    IN OUT LONG volatile *Destination,    IN LONG Value    );    LONG__cdeclInterlockedOrRelease (    IN OUT LONG volatile *Destination,    IN LONG Value    );CHAR__cdeclInterlockedOr8 (    IN OUT CHAR volatile *Destination,    IN    CHAR Value    );CHAR__cdeclInterlockedOr8Acquire (    IN OUT CHAR volatile *Destination,    IN    CHAR Value    );CHAR__cdeclInterlockedOr8Release (    IN OUT CHAR volatile *Destination,    IN CHAR Value    );SHORT__cdeclInterlockedOr16(    IN OUT SHORT volatile *Destination,    IN SHORT Value    );    SHORT__cdeclInterlockedOr16Acquire (    IN OUT SHORT volatile *Destination,    IN SHORT Value    );SHORT__cdeclInterlockedOr16Release (    IN OUT SHORT volatile *Destination,    IN SHORT Value    );LONGLONG__cdeclInterlockedOr64 (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );LONGLONG__cdeclInterlockedOr64Acquire (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );    LONGLONG__cdeclInterlockedOr64Release (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );LONG__cdeclInterlockedXor (    IN OUT LONG volatile *Destination,    IN LONG Value    );LONG__cdeclInterlockedXorAcquire (    IN OUT LONG volatile *Destination,    IN LONG Value    );    LONG__cdeclInterlockedXorRelease (    IN OUT LONG volatile *Destination,    IN LONG Value    );CHAR__cdeclInterlockedXor8 (    IN OUT CHAR volatile *Destination,    IN CHAR Value    );CHAR__cdeclInterlockedXor8Acquire (    IN OUT CHAR volatile *Destination,    IN CHAR Value    );CHAR__cdeclInterlockedXor8Release (    IN OUT CHAR volatile *Destination,    IN CHAR Value    );SHORT__cdeclInterlockedXor16(    IN OUT SHORT volatile *Destination,    IN SHORT Value    );    SHORT__cdeclInterlockedXor16Acquire (    IN OUT SHORT volatile *Destination,    IN SHORT Value    );SHORT__cdeclInterlockedXor16Release (    IN OUT SHORT volatile *Destination,    IN SHORT Value    );LONGLONG__cdeclInterlockedXor64 (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );LONGLONG__cdeclInterlockedXor64Acquire (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );    LONGLONG__cdeclInterlockedXor64Release (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );LONG__cdeclInterlockedAnd (    IN OUT LONG volatile *Destination,    IN LONG Value    );LONG__cdeclInterlockedAndAcquire (    IN OUT LONG volatile *Destination,    IN LONG Value    );    LONG__cdeclInterlockedAndRelease (    IN OUT LONG volatile *Destination,    IN LONG Value    );CHAR__cdeclInterlockedAnd8 (    IN OUT CHAR volatile *Destination,    IN CHAR Value    );CHAR__cdeclInterlockedAnd8Acquire (    IN OUT CHAR volatile *Destination,    IN CHAR Value    );CHAR__cdeclInterlockedAnd8Release (    IN OUT CHAR volatile *Destination,    IN CHAR Value    );SHORT__cdeclInterlockedAnd16(    IN OUT SHORT volatile *Destination,    IN SHORT Value    );    SHORT__cdeclInterlockedAnd16Acquire (    IN OUT SHORT volatile *Destination,    IN SHORT Value    );SHORT__cdeclInterlockedAnd16Release (    IN OUT SHORT volatile *Destination,    IN SHORT Value    );LONGLONG__cdeclInterlockedAnd64 (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );LONGLONG__cdeclInterlockedAnd64Acquire (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );    LONGLONG__cdeclInterlockedAnd64Release (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    );#pragma intrinsic(_InterlockedAdd)#pragma intrinsic(_InterlockedIncrement)#pragma intrinsic(_InterlockedIncrement_acq)#pragma intrinsic(_InterlockedIncrement_rel)#pragma intrinsic(_InterlockedDecrement)#pragma intrinsic(_InterlockedDecrement_acq)#pragma intrinsic(_InterlockedDecrement_rel)#pragma intrinsic(_InterlockedExchange)#pragma intrinsic(_InterlockedCompareExchange)#pragma intrinsic(_InterlockedCompareExchange_acq)#pragma intrinsic(_InterlockedCompareExchange_rel)#pragma intrinsic(_InterlockedExchangeAdd)#pragma intrinsic(_InterlockedAdd64)#pragma intrinsic(_InterlockedIncrement64)#pragma intrinsic(_InterlockedDecrement64)#pragma intrinsic(_InterlockedExchange64)#pragma intrinsic(_InterlockedExchange64_acq)#pragma intrinsic(_InterlockedCompareExchange64)#pragma intrinsic(_InterlockedCompareExchange64_acq)#pragma intrinsic(_InterlockedCompareExchange64_rel)#pragma intrinsic(_InterlockedCompare64Exchange128)#pragma intrinsic(_InterlockedCompare64Exchange128_acq)#pragma intrinsic(_InterlockedCompare64Exchange128_rel)#pragma intrinsic(_InterlockedExchangeAdd64)#pragma intrinsic(_InterlockedExchangePointer)#pragma intrinsic(_InterlockedCompareExchangePointer)#pragma intrinsic(_InterlockedCompareExchangePointer_acq)#pragma intrinsic(_InterlockedCompareExchangePointer_rel)#pragma intrinsic(_InterlockedAdd_acq)#pragma intrinsic(_InterlockedAdd_rel)#pragma intrinsic(_InterlockedExchange_acq)#pragma intrinsic(_InterlockedExchangeAdd_acq)#pragma intrinsic(_InterlockedExchangeAdd_rel)#pragma intrinsic(_InterlockedAdd64_acq)#pragma intrinsic(_InterlockedAdd64_rel)#pragma intrinsic(_InterlockedIncrement64_acq)#pragma intrinsic(_InterlockedIncrement64_rel)#pragma intrinsic(_InterlockedDecrement64_acq)#pragma intrinsic(_InterlockedDecrement64_rel)#pragma intrinsic(_InterlockedExchangeAdd64_acq)#pragma intrinsic(_InterlockedExchangeAdd64_rel)#pragma intrinsic(_InterlockedExchangePointer_acq)#pragma intrinsic (_InterlockedOr)#pragma intrinsic (_InterlockedOr_acq)#pragma intrinsic (_InterlockedOr_rel)#pragma intrinsic (_InterlockedOr8)#pragma intrinsic (_InterlockedOr8_acq)#pragma intrinsic (_InterlockedOr8_rel)#pragma intrinsic (_InterlockedOr16)#pragma intrinsic (_InterlockedOr16_acq)#pragma intrinsic (_InterlockedOr16_rel)#pragma intrinsic (_InterlockedOr64)#pragma intrinsic (_InterlockedOr64_acq)#pragma intrinsic (_InterlockedOr64_rel)#pragma intrinsic (_InterlockedXor)#pragma intrinsic (_InterlockedXor_acq)#pragma intrinsic (_InterlockedXor_rel)#pragma intrinsic (_InterlockedXor8)#pragma intrinsic (_InterlockedXor8_acq)#pragma intrinsic (_InterlockedXor8_rel)#pragma intrinsic (_InterlockedXor16)#pragma intrinsic (_InterlockedXor16_acq)#pragma intrinsic (_InterlockedXor16_rel)#pragma intrinsic (_InterlockedXor64)#pragma intrinsic (_InterlockedXor64_acq)#pragma intrinsic (_InterlockedXor64_rel)#pragma intrinsic (_InterlockedAnd)#pragma intrinsic (_InterlockedAnd_acq)#pragma intrinsic (_InterlockedAnd_rel)#pragma intrinsic (_InterlockedAnd8)#pragma intrinsic (_InterlockedAnd8_acq)#pragma intrinsic (_InterlockedAnd8_rel)#pragma intrinsic (_InterlockedAnd16)#pragma intrinsic (_InterlockedAnd16_acq)#pragma intrinsic (_InterlockedAnd16_rel)#pragma intrinsic (_InterlockedAnd64)#pragma intrinsic (_InterlockedAnd64_acq)#pragma intrinsic (_InterlockedAnd64_rel)#if !defined (InterlockedAnd64)#define InterlockedAnd64 InterlockedAnd64_InlineLONGLONGFORCEINLINEInterlockedAnd64_Inline (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    ){    LONGLONG Old;    do {        Old = *Destination;    } while (InterlockedCompareExchange64(Destination,                                          Old & Value,                                          Old) != Old);    return Old;}#endif#define InterlockedAndAffinity InterlockedAnd64#if !defined (InterlockedOr64)#define InterlockedOr64 InterlockedOr64_InlineLONGLONGFORCEINLINEInterlockedOr64_Inline (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    ){    LONGLONG Old;    do {        Old = *Destination;    } while (InterlockedCompareExchange64(Destination,                                          Old | Value,                                          Old) != Old);    return Old;}#endif#define InterlockedOrAffinity InterlockedOr64#if !defined (InterlockedXor64)#define InterlockedXor64 InterlockedXor64_InlineLONGLONGFORCEINLINEInterlockedXor64_Inline (    IN OUT LONGLONG volatile *Destination,    IN LONGLONG Value    ){    LONGLONG Old;    do {        Old = *Destination;    } while (InterlockedCompareExchange64(Destination,                                          Old ^ Value,                                          Old) != Old);    return Old;}#endif#if !defined (InterlockedBitTestAndSet)#define InterlockedBitTestAndSet InterlockedBitTestAndSet_InlineBOOLEANFORCEINLINEInterlockedBitTestAndSet_Inline (    IN LONG volatile *Base,    IN LONG Bit    ){    LONG tBit;    tBit = 1<<(Bit & (sizeof (*Base)*8-1));    return (BOOLEAN) ((InterlockedOr (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);}#endif#if !defined (InterlockedBitTestAndReset)#define InterlockedBitTestAndReset InterlockedBitTestAndReset_InlineBOOLEANFORCEINLINEInterlockedBitTestAndReset_Inline (    IN LONG volatile *Base,    IN LONG Bit    ){    LONG tBit;    tBit = 1<<(Bit & (sizeof (*Base)*8-1));    return (BOOLEAN) ((InterlockedAnd (&Base[Bit/(sizeof (*Base)*8)], ~tBit)&tBit) != 0);}#endif#if !defined (InterlockedBitTestAndSet64)#define InterlockedBitTestAndSet64 InterlockedBitTestAndSet64_InlineBOOLEANFORCEINLINEInterlockedBitTestAndSet64_Inline (    IN LONG64 volatile *Base,    IN LONG64 Bit    ){    LONG64 tBit;    tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));    return (BOOLEAN) ((InterlockedOr64 (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);}#endif#if !defined (InterlockedBitTestAndReset64)#define InterlockedBitTestAndReset64 InterlockedBitTestAndReset64_InlineBOOLEANFORCEINLINEInterlockedBitTestAndReset64_Inline (    IN LONG64 volatile *Base,    IN LONG64 Bit    ){    LONG64 tBit;    tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));    return (BOOLEAN) ((InterlockedAnd64 (&Base[Bit/(sizeof (*Base)*8)], ~tBit)&tBit) != 0);}#endif#if !defined (InterlockedBitTestAndComplement)#define InterlockedBitTestAndComplement InterlockedBitTestAndComplement_InlineBOOLEANFORCEINLINEInterlockedBitTestAndComplement_Inline (    IN LONG volatile *Base,    IN LONG Bit    ){    LONG tBit;    tBit = 1<<(Bit & (sizeof (*Base)*8-1));    return (BOOLEAN) ((InterlockedXor (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);}#endif#if !defined (InterlockedBitTestAndComplement64)#define InterlockedBitTestAndComplement64 InterlockedBitTestAndComplement64_InlineBOOLEANFORCEINLINEInterlockedBitTestAndComplement64_Inline (    IN LONG64 volatile *Base,    IN LONG64 Bit    ){    LONG64 tBit;    tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));    return (BOOLEAN) ((InterlockedXor64 (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);}#endif#ifdef __cplusplus}#endif#endif /* defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS) */#if !defined(__midl) && !defined(GENUTIL) && !defined(_GENIA64_) && defined(_IA64_)void * _cdecl _rdteb(void);void * _cdecl _rdtebex(void);#ifdef _M_IA64#pragma intrinsic(_rdteb)// _rdtebex() is a kernel safe version of _rdteb()#pragma intrinsic(_rdtebex)#define NtCurrentTeb()      ((struct _TEB *)_rdtebex())//// Define functions to get the address of the current fiber and the// current fiber data.//#define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)#define GetFiberData() (*(PVOID *)(GetCurrentFiber()))// begin_ntddk #ifdef __cplusplusextern "C" {#endif// begin_wdm#if defined(_IA64_) && defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)void __break(     int    );#pragma intrinsic (__break)#define BREAK_DEBUG_BASE    0x080000#define ASSERT_BREAKPOINT         (BREAK_DEBUG_BASE+3)  // Cause a STATUS_ASSERTION_FAILURE exception to be raised.#define DbgRaiseAssertionFailure() __break(ASSERT_BREAKPOINT)#endif// end_wdmvoid __yield(   void   );void__mf(    void    );void __lfetch(    int Level,     __in volatile VOID CONST *Address    );void __lfetchfault(    __in int Level,     __in volatile VOID CONST *Address    );void __lfetch_excl(    __in int Level,     __in volatile VOID CONST *Address    );void__lfetchfault_excl(    __in int Level,     __in volatile VOID CONST *Address    );//// __lfetch control defines.//#define MD_LFHINT_NONE    0x00#define MD_LFHINT_NT1     0x01#define MD_LFHINT_NT2     0x02#define MD_LFHINT_NTA     0x03#pragma intrinsic (__yield)#pragma intrinsic (__lfetch)#pragma intrinsic (__lfetchfault)#pragma intrinsic (__lfetchfault_excl)#pragma intrinsic (__lfetch_excl)#pragma intrinsic (__mf)//// Define function to read the value of the time stamp counter//// N.B. The register number for the time stamp counter is CV_IA64_ApITC which//      is 3116.//#define ReadTimeStampCounter() __getReg(3116)unsigned__int64__getReg (    int Number    );#pragma intrinsic(__getReg)#define YieldProcessor          __yield#define MemoryBarrier           __mf#define PreFetchCacheLine       __lfetch#define ReadForWriteAccess(p)   (__lfetch_excl(MD_LFHINT_NONE, (p)), (*(p)))//// PreFetchCacheLine level defines.//#define PF_TEMPORAL_LEVEL_1         MD_LFHINT_NONE#define PF_TEMPORAL_LEVEL_2         MD_LFHINT_NT1#define PF_TEMPORAL_LEVEL_3         MD_LFHINT_NT2#define PF_NON_TEMPORAL_LEVEL_ALL   MD_LFHINT_NTA//// Define functions to capture the high 64-bits of a 128-bit multiply.//#define UnsignedMultiplyHigh __UMULHULONGLONGUnsignedMultiplyHigh (    IN ULONGLONG Multiplier,    IN ULONGLONG Multiplicand    );#pragma intrinsic(__UMULH)#ifdef __cplusplus}#endif// end_ntddk #elsestruct _TEB *NtCurrentTeb(void);#endif#endif  // !defined(__midl) && !defined(GENUTIL) && !defined(_GENIA64_) && defined(_M_IA64)#ifdef _IA64_// begin_ntddk //// The following values specify the type of failing access when the status is // STATUS_ACCESS_VIOLATION and the first parameter in the exception 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       2 // Access violation was caused by an instruction fetch//// The following flags control the contents of the CONTEXT structure.//#if !defined(RC_INVOKED)#define CONTEXT_IA64                    0x00080000#define CONTEXT_CONTROL                 (CONTEXT_IA64 | 0x00000001L)#define CONTEXT_LOWER_FLOATING_POINT    (CONTEXT_IA64 | 0x00000002L)#define CONTEXT_HIGHER_FLOATING_POINT   (CONTEXT_IA64 | 0x00000004L)#define CONTEXT_INTEGER                 (CONTEXT_IA64 | 0x00000008L)#define CONTEXT_DEBUG                   (CONTEXT_IA64 | 0x00000010L)#define CONTEXT_IA32_CONTROL            (CONTEXT_IA64 | 0x00000020L)  // Includes StIPSR#define CONTEXT_FLOATING_POINT          (CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT)#define CONTEXT_FULL                    (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_IA32_CONTROL)#define CONTEXT_ALL                     (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_DEBUG | CONTEXT_IA32_CONTROL)#define CONTEXT_EXCEPTION_ACTIVE        0x8000000#define CONTEXT_SERVICE_ACTIVE          0x10000000#define CONTEXT_EXCEPTION_REQUEST       0x40000000#define CONTEXT_EXCEPTION_REPORTING     0x80000000#endif // !defined(RC_INVOKED)//// Context Frame////  This frame has a several purposes: 1) it is used as an argument to//  NtContinue, 2) it is used to construct a call frame for APC delivery,//  3) it is used to construct a call frame for exception dispatching//  in user mode, 4) it is used in the user level thread creation//  routines, and 5) it is used to to pass thread state to debuggers.////  N.B. Because this record is used as a call frame, it must be EXACTLY//  a multiple of 16 bytes in length and aligned on a 16-byte boundary.//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 thread's 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;    DWORD Fill1[3];         // for alignment of following on 16-byte boundary    //    // This section is specified/returned if the ContextFlags word contains    // the flag CONTEXT_DEBUG.    //    // N.B. CONTEXT_DEBUG is *not* part of CONTEXT_FULL.    //    ULONGLONG DbI0;    ULONGLONG DbI1;    ULONGLONG DbI2;    ULONGLONG DbI3;    ULONGLONG DbI4;    ULONGLONG DbI5;    ULONGLONG DbI6;    ULONGLONG DbI7;    ULONGLONG DbD0;    ULONGLONG DbD1;    ULONGLONG DbD2;    ULONGLONG DbD3;    ULONGLONG DbD4;    ULONGLONG DbD5;    ULONGLONG DbD6;    ULONGLONG DbD7;    //    // This section is specified/returned if the ContextFlags word contains    // the flag CONTEXT_LOWER_FLOATING_POINT.    //    FLOAT128 FltS0;    FLOAT128 FltS1;    FLOAT128 FltS2;    FLOAT128 FltS3;    FLOAT128 FltT0;    FLOAT128 FltT1;    FLOAT128 FltT2;    FLOAT128 FltT3;    FLOAT128 FltT4;    FLOAT128 FltT5;    FLOAT128 FltT6;    FLOAT128 FltT7;    FLOAT128 FltT8;    FLOAT128 FltT9;    //    // This section is specified/returned if the ContextFlags word contains    // the flag CONTEXT_HIGHER_FLOATING_POINT.    //    FLOAT128 FltS4;    FLOAT128 FltS5;    FLOAT128 FltS6;    FLOAT128 FltS7;    FLOAT128 FltS8;    FLOAT128 FltS9;    FLOAT128 FltS10;    FLOAT128 FltS11;    FLOAT128 FltS12;    FLOAT128 FltS13;    FLOAT128 FltS14;    FLOAT128 FltS15;    FLOAT128 FltS16;    FLOAT128 FltS17;    FLOAT128 FltS18;    FLOAT128 FltS19;    FLOAT128 FltF32;    FLOAT128 FltF33;    FLOAT128 FltF34;    FLOAT128 FltF35;    FLOAT128 FltF36;    FLOAT128 FltF37;    FLOAT128 FltF38;    FLOAT128 FltF39;    FLOAT128 FltF40;    FLOAT128 FltF41;    FLOAT128 FltF42;    FLOAT128 FltF43;    FLOAT128 FltF44;    FLOAT128 FltF45;    FLOAT128 FltF46;    FLOAT128 FltF47;    FLOAT128 FltF48;    FLOAT128 FltF49;    FLOAT128 FltF50;    FLOAT128 FltF51;    FLOAT128 FltF52;    FLOAT128 FltF53;    FLOAT128 FltF54;    FLOAT128 FltF55;    FLOAT128 FltF56;    FLOAT128 FltF57;    FLOAT128 FltF58;    FLOAT128 FltF59;    FLOAT128 FltF60;    FLOAT128 FltF61;    FLOAT128 FltF62;    FLOAT128 FltF63;    FLOAT128 FltF64;    FLOAT128 FltF65;    FLOAT128 FltF66;    FLOAT128 FltF67;    FLOAT128 FltF68;    FLOAT128 FltF69;    FLOAT128 FltF70;    FLOAT128 FltF71;    FLOAT128 FltF72;    FLOAT128 FltF73;    FLOAT128 FltF74;    FLOAT128 FltF75;    FLOAT128 FltF76;    FLOAT128 FltF77;    FLOAT128 FltF78;    FLOAT128 FltF79;    FLOAT128 FltF80;    FLOAT128 FltF81;    FLOAT128 FltF82;    FLOAT128 FltF83;    FLOAT128 FltF84;    FLOAT128 FltF85;    FLOAT128 FltF86;    FLOAT128 FltF87;    FLOAT128 FltF88;    FLOAT128 FltF89;    FLOAT128 FltF90;    FLOAT128 FltF91;    FLOAT128 FltF92;    FLOAT128 FltF93;    FLOAT128 FltF94;    FLOAT128 FltF95;    FLOAT128 FltF96;    FLOAT128 FltF97;    FLOAT128 FltF98;    FLOAT128 FltF99;    FLOAT128 FltF100;    FLOAT128 FltF101;    FLOAT128 FltF102;    FLOAT128 FltF103;    FLOAT128 FltF104;    FLOAT128 FltF105;    FLOAT128 FltF106;    FLOAT128 FltF107;    FLOAT128 FltF108;    FLOAT128 FltF109;    FLOAT128 FltF110;    FLOAT128 FltF111;    FLOAT128 FltF112;    FLOAT128 FltF113;    FLOAT128 FltF114;    FLOAT128 FltF115;    FLOAT128 FltF116;    FLOAT128 FltF117;    FLOAT128 FltF118;    FLOAT128 FltF119;    FLOAT128 FltF120;    FLOAT128 FltF121;    FLOAT128 FltF122;    FLOAT128 FltF123;    FLOAT128 FltF124;    FLOAT128 FltF125;    FLOAT128 FltF126;    FLOAT128 FltF127;    //    // This section is specified/returned if the ContextFlags word contains    // the flag CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT | CONTEXT_CONTROL.    //    ULONGLONG StFPSR;       //  FP status    //    // This section is specified/returned if the ContextFlags word contains    // the flag CONTEXT_INTEGER.    //    // N.B. The registers gp, sp, rp are part of the control context    //    ULONGLONG IntGp;        //  r1, volatile    ULONGLONG IntT0;        //  r2-r3, volatile    ULONGLONG IntT1;        //    ULONGLONG IntS0;        //  r4-r7, preserved    ULONGLONG IntS1;    ULONGLONG IntS2;    ULONGLONG IntS3;    ULONGLONG IntV0;        //  r8, volatile    ULONGLONG IntT2;        //  r9-r11, volatile    ULONGLONG IntT3;    ULONGLONG IntT4;    ULONGLONG IntSp;        //  stack pointer (r12), special    ULONGLONG IntTeb;       //  teb (r13), special    ULONGLONG IntT5;        //  r14-r31, volatile    ULONGLONG IntT6;    ULONGLONG IntT7;    ULONGLONG IntT8;    ULONGLONG IntT9;    ULONGLONG IntT10;    ULONGLONG IntT11;    ULONGLONG IntT12;    ULONGLONG IntT13;    ULONGLONG IntT14;    ULONGLONG IntT15;    ULONGLONG IntT16;    ULONGLONG IntT17;    ULONGLONG IntT18;    ULONGLONG IntT19;    ULONGLONG IntT20;    ULONGLONG IntT21;    ULONGLONG IntT22;    ULONGLONG IntNats;      //  Nat bits for r1-r31                            //  r1-r31 in bits 1 thru 31.    ULONGLONG Preds;        //  predicates, preserved    ULONGLONG BrRp;         //  return pointer, b0, preserved    ULONGLONG BrS0;         //  b1-b5, preserved    ULONGLONG BrS1;    ULONGLONG BrS2;    ULONGLONG BrS3;    ULONGLONG BrS4;    ULONGLONG BrT0;         //  b6-b7, volatile    ULONGLONG BrT1;    //    // This section is specified/returned if the ContextFlags word contains    // the flag CONTEXT_CONTROL.    //    // Other application registers    ULONGLONG ApUNAT;       //  User Nat collection register, preserved    ULONGLONG ApLC;         //  Loop counter register, preserved    ULONGLONG ApEC;         //  Epilog counter register, preserved    ULONGLONG ApCCV;        //  CMPXCHG value register, volatile    ULONGLONG ApDCR;        //  Default control register (TBD)    // Register stack info    ULONGLONG RsPFS;        //  Previous function state, preserved    ULONGLONG RsBSP;        //  Backing store pointer, preserved    ULONGLONG RsBSPSTORE;    ULONGLONG RsRSC;        //  RSE configuration, volatile    ULONGLONG RsRNAT;       //  RSE Nat collection register, preserved    // Trap Status Information    ULONGLONG StIPSR;       //  Interruption Processor Status    ULONGLONG StIIP;        //  Interruption IP    ULONGLONG StIFS;        //  Interruption Function State    // iA32 related control registers    ULONGLONG StFCR;        //  copy of Ar21    ULONGLONG Eflag;        //  Eflag copy of Ar24    ULONGLONG SegCSD;       //  iA32 CSDescriptor (Ar25)    ULONGLONG SegSSD;       //  iA32 SSDescriptor (Ar26)    ULONGLONG Cflag;        //  Cr0+Cr4 copy of Ar27    ULONGLONG StFSR;        //  x86 FP status (copy of AR28)    ULONGLONG StFIR;        //  x86 FP status (copy of AR29)    ULONGLONG StFDR;        //  x86 FP status (copy of AR30)      ULONGLONG UNUSEDPACK;   //  added to pack StFDR to 16-bytes} CONTEXT, *PCONTEXT;//// Plabel descriptor structure definition//typedef struct _PLABEL_DESCRIPTOR {   ULONGLONG EntryPoint;   ULONGLONG GlobalPointer;} PLABEL_DESCRIPTOR, *PPLABEL_DESCRIPTOR;//// Function table entry structure definition.//typedef struct _RUNTIME_FUNCTION {    DWORD BeginAddress;    DWORD EndAddress;    DWORD UnwindInfoAddress;} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;//// Define dynamic function table entry.//typedefPRUNTIME_FUNCTION(*PGET_RUNTIME_FUNCTION_CALLBACK) (    IN DWORD64 ControlPc,    IN PVOID Context    );typedefDWORD   (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK) (    IN HANDLE Process,    IN PVOID TableAddress,    OUT PDWORD Entries,    OUT PRUNTIME_FUNCTION* Functions    );#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \    "OutOfProcessFunctionTableCallback"BOOLEANRtlAddFunctionTable(    IN PRUNTIME_FUNCTION FunctionTable,    IN DWORD             EntryCount,    IN ULONGLONG         BaseAddress,    IN ULONGLONG         TargetGp    );BOOLEANRtlInstallFunctionTableCallback (    IN DWORD64 TableIdentifier,    IN DWORD64 BaseAddress,    IN DWORD Length,    IN DWORD64 TargetGp,    IN PGET_RUNTIME_FUNCTION_CALLBACK Callback,    IN PVOID Context,    IN PCWSTR OutOfProcessCallbackDll OPTIONAL    );BOOLEANRtlDeleteFunctionTable (    IN PRUNTIME_FUNCTION FunctionTable    );VOIDRtlRestoreContext (    IN PCONTEXT ContextRecord,    IN struct _EXCEPTION_RECORD *ExceptionRecord OPTIONAL    );VOID__jump_unwind (    ULONGLONG TargetMsFrame,    ULONGLONG TargetBsFrame,    ULONGLONG TargetPc    );#endif // _IA64_#if !defined(RC_INVOKED)#define WOW64_CONTEXT_i386      0x00010000    // this assumes that i386 and#define WOW64_CONTEXT_i486      0x00010000    // i486 have identical context records#define WOW64_CONTEXT_CONTROL               (WOW64_CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP#define WOW64_CONTEXT_INTEGER               (WOW64_CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI#define WOW64_CONTEXT_SEGMENTS              (WOW64_CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS#define WOW64_CONTEXT_FLOATING_POINT        (WOW64_CONTEXT_i386 | 0x00000008L) // 387 state#define WOW64_CONTEXT_DEBUG_REGISTERS       (WOW64_CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7#define WOW64_CONTEXT_EXTENDED_REGISTERS    (WOW64_CONTEXT_i386 | 0x00000020L) // cpu specific extensions#define WOW64_CONTEXT_FULL      (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS)#define WOW64_CONTEXT_ALL       (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS | \                                 WOW64_CONTEXT_FLOATING_POINT | WOW64_CONTEXT_DEBUG_REGISTERS | \                                 WOW64_CONTEXT_EXTENDED_REGISTERS)#endif // !defined(RC_INVOKED)////  Define the size of the 80387 save area, which is in the context frame.//#define WOW64_SIZE_OF_80387_REGISTERS      80#define WOW64_MAXIMUM_SUPPORTED_EXTENSION     512typedef struct _WOW64_FLOATING_SAVE_AREA {    DWORD   ControlWord;    DWORD   StatusWord;    DWORD   TagWord;    DWORD   ErrorOffset;    DWORD   ErrorSelector;    DWORD   DataOffset;    DWORD   DataSelector;    BYTE    RegisterArea[WOW64_SIZE_OF_80387_REGISTERS];    DWORD   Cr0NpxState;} WOW64_FLOATING_SAVE_AREA;typedef WOW64_FLOATING_SAVE_AREA *PWOW64_FLOATING_SAVE_AREA;//// 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 _WOW64_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.    //    WOW64_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[WOW64_MAXIMUM_SUPPORTED_EXTENSION];} WOW64_CONTEXT;typedef WOW64_CONTEXT *PWOW64_CONTEXT;#define EXCEPTION_NONCONTINUABLE 0x1    // Noncontinuable exception#define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters//// Exception record definition.//typedef struct _EXCEPTION_RECORD {    DWORD    ExceptionCode;    DWORD ExceptionFlags;    struct _EXCEPTION_RECORD *ExceptionRecord;    PVOID ExceptionAddress;    DWORD NumberParameters;    ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];    } EXCEPTION_RECORD;typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;typedef struct _EXCEPTION_RECORD32 {    DWORD    ExceptionCode;    DWORD ExceptionFlags;    DWORD ExceptionRecord;    DWORD ExceptionAddress;    DWORD NumberParameters;    DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;typedef struct _EXCEPTION_RECORD64 {    DWORD    ExceptionCode;    DWORD ExceptionFlags;    DWORD64 ExceptionRecord;    DWORD64 ExceptionAddress;    DWORD NumberParameters;    DWORD __unusedAlignment;    DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;//// Typedef for pointer returned by exception_info()//typedef struct _EXCEPTION_POINTERS {    PEXCEPTION_RECORD ExceptionRecord;    PCONTEXT ContextRecord;} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;typedef PVOID PACCESS_TOKEN;            typedef PVOID PSECURITY_DESCRIPTOR;     typedef PVOID PSID;     //////////////////////////////////////////////////////////////////////////                                                                    ////                             ACCESS MASK                            ////                                                                    //////////////////////////////////////////////////////////////////////////////  Define the access mask as a longword sized structure divided up as//  follows:////       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1//       1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0//      +---------------+---------------+-------------------------------+//      |G|G|G|G|Res'd|A| StandardRights|         SpecificRights        |//      |R|W|E|A|     |S|               |                               |//      +-+-------------+---------------+-------------------------------+////      typedef struct _ACCESS_MASK {//          WORD   SpecificRights;//          BYTE  StandardRights;//          BYTE  AccessSystemAcl : 1;//          BYTE  Reserved : 3;//          BYTE  GenericAll : 1;//          BYTE  GenericExecute : 1;//          BYTE  GenericWrite : 1;//          BYTE  GenericRead : 1;//      } ACCESS_MASK;//      typedef ACCESS_MASK *PACCESS_MASK;////  but to make life simple for programmer's we'll allow them to specify//  a desired access mask by simply OR'ing together mulitple single rights//  and treat an access mask as a DWORD.  For example////      DesiredAccess = DELETE | READ_CONTROL////  So we'll declare ACCESS_MASK as DWORD//// begin_wdmtypedef DWORD ACCESS_MASK;typedef ACCESS_MASK *PACCESS_MASK;//////////////////////////////////////////////////////////////////////////                                                                    ////                             ACCESS TYPES                           ////                                                                    //////////////////////////////////////////////////////////////////////////// begin_wdm////  The following are masks for the predefined standard access types//#define DELETE                           (0x00010000L)#define READ_CONTROL                     (0x00020000L)#define WRITE_DAC                        (0x00040000L)#define WRITE_OWNER                      (0x00080000L)#define SYNCHRONIZE                      (0x00100000L)#define STANDARD_RIGHTS_REQUIRED         (0x000F0000L)#define STANDARD_RIGHTS_READ             (READ_CONTROL)#define STANDARD_RIGHTS_WRITE            (READ_CONTROL)#define STANDARD_RIGHTS_EXECUTE          (READ_CONTROL)#define STANDARD_RIGHTS_ALL              (0x001F0000L)#define SPECIFIC_RIGHTS_ALL              (0x0000FFFFL)//// AccessSystemAcl access type//#define ACCESS_SYSTEM_SECURITY           (0x01000000L)//// MaximumAllowed access type//#define MAXIMUM_ALLOWED                  (0x02000000L)////  These are the generic rights.//#define GENERIC_READ                     (0x80000000L)#define GENERIC_WRITE                    (0x40000000L)#define GENERIC_EXECUTE                  (0x20000000L)#define GENERIC_ALL                      (0x10000000L)////  Define the generic mapping array.  This is used to denote the//  mapping of each generic access right to a specific access mask.//typedef struct _GENERIC_MAPPING {    ACCESS_MASK GenericRead;    ACCESS_MASK GenericWrite;    ACCESS_MASK GenericExecute;    ACCESS_MASK GenericAll;} GENERIC_MAPPING;typedef GENERIC_MAPPING *PGENERIC_MAPPING;//////////////////////////////////////////////////////////////////////////                                                                    ////                        LUID_AND_ATTRIBUTES                         ////                                                                    //////////////////////////////////////////////////////////////////////////////#include <pshpack4.h>typedef struct _LUID_AND_ATTRIBUTES {    LUID Luid;    DWORD Attributes;    } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;#include <poppack.h>//////////////////////////////////////////////////////////////////////////                                                                    ////              Security Id     (SID)                                 ////                                                                    //////////////////////////////////////////////////////////////////////////////// Pictorially the structure of an SID is as follows:////         1   1   1   1   1   1//         5   4   3   2   1   0   9   8   7   6   5   4   3   2   1   0//      +---------------------------------------------------------------+//      |      SubAuthorityCount        |Reserved1 (SBZ)|   Revision    |//      +---------------------------------------------------------------+//      |                   IdentifierAuthority[0]                      |//      +---------------------------------------------------------------+//      |                   IdentifierAuthority[1]                      |//      +---------------------------------------------------------------+//      |                   IdentifierAuthority[2]                      |//      +---------------------------------------------------------------+//      |                                                               |//      +- -  -  -  -  -  -  -  SubAuthority[]  -  -  -  -  -  -  -  - -+//      |                                                               |//      +---------------------------------------------------------------+////// begin_ntifs#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED#define SID_IDENTIFIER_AUTHORITY_DEFINEDtypedef struct _SID_IDENTIFIER_AUTHORITY {    BYTE  Value[6];} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;#endif#ifndef SID_DEFINED#define SID_DEFINEDtypedef struct _SID {   BYTE  Revision;   BYTE  SubAuthorityCount;   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;#ifdef MIDL_PASS   [size_is(SubAuthorityCount)] DWORD SubAuthority[*];#else // MIDL_PASS   DWORD SubAuthority[ANYSIZE_ARRAY];#endif // MIDL_PASS} SID, *PISID;#endif#define SID_REVISION                     (1)    // Current revision level#define SID_MAX_SUB_AUTHORITIES          (15)#define SID_RECOMMENDED_SUB_AUTHORITIES  (1)    // Will change to around 6                                                // in a future release.#ifndef MIDL_PASS#define SECURITY_MAX_SID_SIZE  \      (sizeof(SID) - sizeof(DWORD) + (SID_MAX_SUB_AUTHORITIES * sizeof(DWORD)))#endif // MIDL_PASStypedef enum _SID_NAME_USE {    SidTypeUser = 1,    SidTypeGroup,    SidTypeDomain,    SidTypeAlias,    SidTypeWellKnownGroup,    SidTypeDeletedAccount,    SidTypeInvalid,    SidTypeUnknown,    SidTypeComputer,    SidTypeLabel} SID_NAME_USE, *PSID_NAME_USE;typedef struct _SID_AND_ATTRIBUTES {    PSID Sid;    DWORD Attributes;    } SID_AND_ATTRIBUTES, * PSID_AND_ATTRIBUTES;typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;#define SID_HASH_SIZE 32typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY;typedef struct _SID_AND_ATTRIBUTES_HASH {    DWORD SidCount;    PSID_AND_ATTRIBUTES SidAttr;    SID_HASH_ENTRY Hash[SID_HASH_SIZE];} SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;///////////////////////////////////////////////////////////////////////////////                                                                         //// Universal well-known SIDs                                               ////                                                                         ////     Null SID                     S-1-0-0                                ////     World                        S-1-1-0                                ////     Local                        S-1-2-0                                ////     Creator Owner ID             S-1-3-0                                ////     Creator Group ID             S-1-3-1                                ////     Creator Owner Server ID      S-1-3-2                                ////     Creator Group Server ID      S-1-3-3                                ////                                                                         ////     (Non-unique IDs)             S-1-4                                  ////                                                                         ///////////////////////////////////////////////////////////////////////////////#define SECURITY_NULL_SID_AUTHORITY         {0,0,0,0,0,0}#define SECURITY_WORLD_SID_AUTHORITY        {0,0,0,0,0,1}#define SECURITY_LOCAL_SID_AUTHORITY        {0,0,0,0,0,2}#define SECURITY_CREATOR_SID_AUTHORITY      {0,0,0,0,0,3}#define SECURITY_NON_UNIQUE_AUTHORITY       {0,0,0,0,0,4}#define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}#define SECURITY_NULL_RID                 (0x00000000L)#define SECURITY_WORLD_RID                (0x00000000L)#define SECURITY_LOCAL_RID                (0x00000000L)#define SECURITY_CREATOR_OWNER_RID        (0x00000000L)#define SECURITY_CREATOR_GROUP_RID        (0x00000001L)#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)#define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L)/////////////////////////////////////////////////////////////////////////////////                                                                           //// NT well-known SIDs                                                        ////                                                                           ////     NT Authority            S-1-5                                         ////     Dialup                  S-1-5-1                                       ////                                                                           ////     Network                 S-1-5-2                                       ////     Batch                   S-1-5-3                                       ////     Interactive             S-1-5-4                                       ////     (Logon IDs)             S-1-5-5-X-Y                                   ////     Service                 S-1-5-6                                       ////     AnonymousLogon          S-1-5-7       (aka null logon session)        ////     Proxy                   S-1-5-8                                       ////     Enterprise DC (EDC)     S-1-5-9       (aka domain controller account) ////     Self                    S-1-5-10      (self RID)                      ////     Authenticated User      S-1-5-11      (Authenticated user somewhere)  ////     Restricted Code         S-1-5-12      (Running restricted code)       ////     Terminal Server         S-1-5-13      (Running on Terminal Server)    ////     Remote Logon            S-1-5-14      (Remote Interactive Logon)      ////     This Organization       S-1-5-15                                      ////                                                                           ////     IUser                   S-1-5-17//     Local System            S-1-5-18                                      ////     Local Service           S-1-5-19                                      ////     Network Service         S-1-5-20                                      ////                                                                           ////     (NT non-unique IDs)     S-1-5-0x15-... (NT Domain Sids)               ////                                                                           ////     (Built-in domain)       S-1-5-0x20                                    ////                                                                           ////     (Security Package IDs)  S-1-5-0x40                                    ////     NTLM Authentication     S-1-5-0x40-10                                 ////     SChannel Authentication S-1-5-0x40-14                                 ////     Digest Authentication   S-1-5-0x40-21                                 ////                                                                           ////     Other Organization      S-1-5-1000    (>=1000 can not be filtered)    ////                                                                           ////                                                                           //// NOTE: the relative identifier values (RIDs) determine which security      ////       boundaries the SID is allowed to cross.  Before adding new RIDs,    ////       a determination needs to be made regarding which range they should  ////       be added to in order to ensure proper "SID filtering"               ////                                                                           /////////////////////////////////////////////////////////////////////////////////#define SECURITY_NT_AUTHORITY           {0,0,0,0,0,5}   // ntifs#define SECURITY_DIALUP_RID             (0x00000001L)#define SECURITY_NETWORK_RID            (0x00000002L)#define SECURITY_BATCH_RID              (0x00000003L)#define SECURITY_INTERACTIVE_RID        (0x00000004L)#define SECURITY_LOGON_IDS_RID          (0x00000005L)#define SECURITY_LOGON_IDS_RID_COUNT    (3L)#define SECURITY_SERVICE_RID            (0x00000006L)#define SECURITY_ANONYMOUS_LOGON_RID    (0x00000007L)#define SECURITY_PROXY_RID              (0x00000008L)#define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)#define SECURITY_SERVER_LOGON_RID       SECURITY_ENTERPRISE_CONTROLLERS_RID#define SECURITY_PRINCIPAL_SELF_RID     (0x0000000AL)#define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)#define SECURITY_RESTRICTED_CODE_RID    (0x0000000CL)#define SECURITY_TERMINAL_SERVER_RID    (0x0000000DL)#define SECURITY_REMOTE_LOGON_RID       (0x0000000EL)#define SECURITY_THIS_ORGANIZATION_RID  (0x0000000FL)#define SECURITY_IUSER_RID              (0x00000011L)#define SECURITY_LOCAL_SYSTEM_RID       (0x00000012L)#define SECURITY_LOCAL_SERVICE_RID      (0x00000013L)#define SECURITY_NETWORK_SERVICE_RID    (0x00000014L)#define SECURITY_NT_NON_UNIQUE          (0x00000015L)#define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT  (3L)#define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)#define SECURITY_BUILTIN_DOMAIN_RID     (0x00000020L)#define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)#define SECURITY_PACKAGE_BASE_RID       (0x00000040L)#define SECURITY_PACKAGE_RID_COUNT      (2L)#define SECURITY_PACKAGE_NTLM_RID       (0x0000000AL)#define SECURITY_PACKAGE_SCHANNEL_RID   (0x0000000EL)#define SECURITY_PACKAGE_DIGEST_RID     (0x00000015L)#define SECURITY_SERVICE_ID_BASE_RID    (0x00000050L)#define SECURITY_SERVICE_ID_RID_COUNT   (6L)#define SECURITY_RESERVED_ID_BASE_RID   (0x00000051L)#define SECURITY_MAX_ALWAYS_FILTERED    (0x000003E7L)#define SECURITY_MIN_NEVER_FILTERED     (0x000003E8L)#define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)///////////////////////////////////////////////////////////////////////////////                                                                         //// well-known domain relative sub-authority values (RIDs)...               ////                                                                         ///////////////////////////////////////////////////////////////////////////////// Well-known users ...#define FOREST_USER_RID_MAX            (0x000001F3L)#define DOMAIN_USER_RID_ADMIN          (0x000001F4L)#define DOMAIN_USER_RID_GUEST          (0x000001F5L)#define DOMAIN_USER_RID_KRBTGT         (0x000001F6L)#define DOMAIN_USER_RID_MAX            (0x000003E7L)// well-known groups ...#define DOMAIN_GROUP_RID_ADMINS        (0x00000200L)#define DOMAIN_GROUP_RID_USERS         (0x00000201L)#define DOMAIN_GROUP_RID_GUESTS        (0x00000202L)#define DOMAIN_GROUP_RID_COMPUTERS     (0x00000203L)#define DOMAIN_GROUP_RID_CONTROLLERS   (0x00000204L)#define DOMAIN_GROUP_RID_CERT_ADMINS   (0x00000205L)#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)// well-known aliases ...#define DOMAIN_ALIAS_RID_ADMINS                         (0x00000220L)#define DOMAIN_ALIAS_RID_USERS                          (0x00000221L)#define DOMAIN_ALIAS_RID_GUESTS                         (0x00000222L)#define DOMAIN_ALIAS_RID_POWER_USERS                    (0x00000223L)#define DOMAIN_ALIAS_RID_ACCOUNT_OPS                    (0x00000224L)#define DOMAIN_ALIAS_RID_SYSTEM_OPS                     (0x00000225L)#define DOMAIN_ALIAS_RID_PRINT_OPS                      (0x00000226L)#define DOMAIN_ALIAS_RID_BACKUP_OPS                     (0x00000227L)#define DOMAIN_ALIAS_RID_REPLICATOR                     (0x00000228L)#define DOMAIN_ALIAS_RID_RAS_SERVERS                    (0x00000229L)#define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS               (0x0000022AL)#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS           (0x0000022BL)#define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS      (0x0000022CL)#define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)#define DOMAIN_ALIAS_RID_MONITORING_USERS               (0x0000022EL)#define DOMAIN_ALIAS_RID_LOGGING_USERS                  (0x0000022FL)#define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS            (0x00000230L)#define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS             (0x00000231L)#define DOMAIN_ALIAS_RID_DCOM_USERS                     (0x00000232L)#define DOMAIN_ALIAS_RID_IUSERS                         (0x00000238L)#define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS               (0x00000239L)#define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP     (0x0000023BL)#define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)#define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP        (0x0000023DL)#define SECURITY_MANDATORY_LABEL_AUTHORITY          {0,0,0,0,0,16}#define SECURITY_MANDATORY_UNTRUSTED_RID            (0x00000000L)#define SECURITY_MANDATORY_LOW_RID                  (0x00001000L)#define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)#define SECURITY_MANDATORY_HIGH_RID                 (0x00003000L)#define SECURITY_MANDATORY_SYSTEM_RID               (0x00004000L)#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    (0x00005000L)//// SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that// can be set by a usermode caller.//#define SECURITY_MANDATORY_MAXIMUM_USER_RID   SECURITY_MANDATORY_SYSTEM_RID#define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)//// Well known SID definitions for lookup.//typedef enum {    WinNullSid                                  = 0,    WinWorldSid                                 = 1,    WinLocalSid                                 = 2,    WinCreatorOwnerSid                          = 3,    WinCreatorGroupSid                          = 4,    WinCreatorOwnerServerSid                    = 5,    WinCreatorGroupServerSid                    = 6,    WinNtAuthoritySid                           = 7,    WinDialupSid                                = 8,    WinNetworkSid                               = 9,    WinBatchSid                                 = 10,    WinInteractiveSid                           = 11,    WinServiceSid                               = 12,    WinAnonymousSid                             = 13,    WinProxySid                                 = 14,    WinEnterpriseControllersSid                 = 15,    WinSelfSid                                  = 16,    WinAuthenticatedUserSid                     = 17,    WinRestrictedCodeSid                        = 18,    WinTerminalServerSid                        = 19,    WinRemoteLogonIdSid                         = 20,    WinLogonIdsSid                              = 21,    WinLocalSystemSid                           = 22,    WinLocalServiceSid                          = 23,    WinNetworkServiceSid                        = 24,    WinBuiltinDomainSid                         = 25,    WinBuiltinAdministratorsSid                 = 26,    WinBuiltinUsersSid                          = 27,    WinBuiltinGuestsSid                         = 28,    WinBuiltinPowerUsersSid                     = 29,    WinBuiltinAccountOperatorsSid               = 30,    WinBuiltinSystemOperatorsSid                = 31,    WinBuiltinPrintOperatorsSid                 = 32,    WinBuiltinBackupOperatorsSid                = 33,    WinBuiltinReplicatorSid                     = 34,    WinBuiltinPreWindows2000CompatibleAccessSid = 35,    WinBuiltinRemoteDesktopUsersSid             = 36,    WinBuiltinNetworkConfigurationOperatorsSid  = 37,    WinAccountAdministratorSid                  = 38,    WinAccountGuestSid                          = 39,    WinAccountKrbtgtSid                         = 40,    WinAccountDomainAdminsSid                   = 41,    WinAccountDomainUsersSid                    = 42,    WinAccountDomainGuestsSid                   = 43,    WinAccountComputersSid                      = 44,    WinAccountControllersSid                    = 45,    WinAccountCertAdminsSid                     = 46,    WinAccountSchemaAdminsSid                   = 47,    WinAccountEnterpriseAdminsSid               = 48,    WinAccountPolicyAdminsSid                   = 49,    WinAccountRasAndIasServersSid               = 50,    WinNTLMAuthenticationSid                    = 51,    WinDigestAuthenticationSid                  = 52,    WinSChannelAuthenticationSid                = 53,    WinThisOrganizationSid                      = 54,    WinOtherOrganizationSid                     = 55,    WinBuiltinIncomingForestTrustBuildersSid    = 56,    WinBuiltinPerfMonitoringUsersSid            = 57,    WinBuiltinPerfLoggingUsersSid               = 58,    WinBuiltinAuthorizationAccessSid            = 59,    WinBuiltinTerminalServerLicenseServersSid   = 60,    WinBuiltinDCOMUsersSid                      = 61,    WinBuiltinIUsersSid                         = 62,    WinIUserSid                                 = 63,    WinBuiltinCryptoOperatorsSid                = 64,    WinUntrustedLabelSid                        = 65,    WinLowLabelSid                              = 66,    WinMediumLabelSid                           = 67,    WinHighLabelSid                             = 68,    WinSystemLabelSid                           = 69,    WinWriteRestrictedCodeSid                   = 70,    WinCreatorOwnerRightsSid                    = 71,    WinCacheablePrincipalsGroupSid              = 72,    WinNonCacheablePrincipalsGroupSid           = 73,    WinEnterpriseReadonlyControllersSid         = 74,    WinAccountReadonlyControllersSid            = 75,    WinBuiltinEventLogReadersGroup              = 76,} WELL_KNOWN_SID_TYPE;//// Allocate the System Luid.  The first 1000 LUIDs are reserved.// Use #999 here (0x3e7 = 999)//#define SYSTEM_LUID                     { 0x3e7, 0x0 }#define ANONYMOUS_LOGON_LUID            { 0x3e6, 0x0 }#define LOCALSERVICE_LUID               { 0x3e5, 0x0 }#define NETWORKSERVICE_LUID             { 0x3e4, 0x0 }#define IUSER_LUID                      { 0x3e3, 0x0 }// end_ntifs//////////////////////////////////////////////////////////////////////////                                                                    ////                          User and Group related SID attributes     ////                                                                    ////////////////////////////////////////////////////////////////////////////// Group attributes//#define SE_GROUP_MANDATORY                 (0x00000001L)#define SE_GROUP_ENABLED_BY_DEFAULT        (0x00000002L)#define SE_GROUP_ENABLED                   (0x00000004L)#define SE_GROUP_OWNER                     (0x00000008L)#define SE_GROUP_USE_FOR_DENY_ONLY         (0x00000010L)#define SE_GROUP_INTEGRITY                 (0x00000020L)#define SE_GROUP_INTEGRITY_ENABLED         (0x00000040L)#define SE_GROUP_LOGON_ID                  (0xC0000000L)#define SE_GROUP_RESOURCE                  (0x20000000L)#define SE_GROUP_VALID_ATTRIBUTES          (SE_GROUP_MANDATORY          | \                                            SE_GROUP_ENABLED_BY_DEFAULT | \                                            SE_GROUP_ENABLED            | \                                            SE_GROUP_OWNER              | \                                            SE_GROUP_USE_FOR_DENY_ONLY  | \                                            SE_GROUP_LOGON_ID           | \                                            SE_GROUP_RESOURCE           | \                                            SE_GROUP_INTEGRITY          | \                                            SE_GROUP_INTEGRITY_ENABLED)//// User attributes//// (None yet defined.)//////////////////////////////////////////////////////////////////////////                                                                    ////                         ACL  and  ACE                              ////                                                                    //////////////////////////////////////////////////////////////////////////////  Define an ACL and the ACE format.  The structure of an ACL header//  followed by one or more ACEs.  Pictorally the structure of an ACL header//  is as follows:////       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1//       1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0//      +-------------------------------+---------------+---------------+//      |            AclSize            |      Sbz1     |  AclRevision  |//      +-------------------------------+---------------+---------------+//      |              Sbz2             |           AceCount            |//      +-------------------------------+-------------------------------+////  The current AclRevision is defined to be ACL_REVISION.////  AclSize is the size, in bytes, allocated for the ACL.  This includes//  the ACL header, ACES, and remaining free space in the buffer.////  AceCount is the number of ACES in the ACL.//// begin_wdm// This is the *current* ACL revision#define ACL_REVISION     (2)#define ACL_REVISION_DS  (4)// This is the history of ACL revisions.  Add a new one whenever// ACL_REVISION is updated#define ACL_REVISION1   (1)#define MIN_ACL_REVISION ACL_REVISION2#define ACL_REVISION2   (2)#define ACL_REVISION3   (3)#define ACL_REVISION4   (4)#define MAX_ACL_REVISION ACL_REVISION4typedef struct _ACL {    BYTE  AclRevision;    BYTE  Sbz1;    WORD   AclSize;    WORD   AceCount;    WORD   Sbz2;} ACL;typedef ACL *PACL;// end_wdm// begin_ntifs////  The structure of an ACE is a common ace header followed by ace type//  specific data.  Pictorally the structure of the common ace header is//  as follows:////       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1//       1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0//      +---------------+-------+-------+---------------+---------------+//      |            AceSize            |    AceFlags   |     AceType   |//      +---------------+-------+-------+---------------+---------------+////  AceType denotes the type of the ace, there are some predefined ace//  types////  AceSize is the size, in bytes, of ace.////  AceFlags are the Ace flags for audit and inheritance, defined shortly.typedef struct _ACE_HEADER {    BYTE  AceType;    BYTE  AceFlags;    WORD   AceSize;} ACE_HEADER;typedef ACE_HEADER *PACE_HEADER;////  The following are the predefined ace types that go into the AceType//  field of an Ace header.//#define ACCESS_MIN_MS_ACE_TYPE                  (0x0)#define ACCESS_ALLOWED_ACE_TYPE                 (0x0)#define ACCESS_DENIED_ACE_TYPE                  (0x1)#define SYSTEM_AUDIT_ACE_TYPE                   (0x2)#define SYSTEM_ALARM_ACE_TYPE                   (0x3)#define ACCESS_MAX_MS_V2_ACE_TYPE               (0x3)#define ACCESS_ALLOWED_COMPOUND_ACE_TYPE        (0x4)#define ACCESS_MAX_MS_V3_ACE_TYPE               (0x4)#define ACCESS_MIN_MS_OBJECT_ACE_TYPE           (0x5)#define ACCESS_ALLOWED_OBJECT_ACE_TYPE          (0x5)#define ACCESS_DENIED_OBJECT_ACE_TYPE           (0x6)#define SYSTEM_AUDIT_OBJECT_ACE_TYPE            (0x7)#define SYSTEM_ALARM_OBJECT_ACE_TYPE            (0x8)#define ACCESS_MAX_MS_OBJECT_ACE_TYPE           (0x8)#define ACCESS_MAX_MS_V4_ACE_TYPE               (0x8)#define ACCESS_MAX_MS_ACE_TYPE                  (0x8)#define ACCESS_ALLOWED_CALLBACK_ACE_TYPE        (0x9)#define ACCESS_DENIED_CALLBACK_ACE_TYPE         (0xA)#define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)#define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE  (0xC)#define SYSTEM_AUDIT_CALLBACK_ACE_TYPE          (0xD)#define SYSTEM_ALARM_CALLBACK_ACE_TYPE          (0xE)#define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE   (0xF)#define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE   (0x10)#define SYSTEM_MANDATORY_LABEL_ACE_TYPE         (0x11)#define ACCESS_MAX_MS_V5_ACE_TYPE               (0x11)////  The following are the inherit flags that go into the AceFlags field//  of an Ace header.//#define OBJECT_INHERIT_ACE                (0x1)#define CONTAINER_INHERIT_ACE             (0x2)#define NO_PROPAGATE_INHERIT_ACE          (0x4)#define INHERIT_ONLY_ACE                  (0x8)#define INHERITED_ACE                     (0x10)#define VALID_INHERIT_FLAGS               (0x1F)//  The following are the currently defined ACE flags that go into the//  AceFlags field of an ACE header.  Each ACE type has its own set of//  AceFlags.////  SUCCESSFUL_ACCESS_ACE_FLAG - used only with system audit and alarm ACE//  types to indicate that a message is generated for successful accesses.////  FAILED_ACCESS_ACE_FLAG - used only with system audit and alarm ACE types//  to indicate that a message is generated for failed accesses.//////  SYSTEM_AUDIT and SYSTEM_ALARM AceFlags////  These control the signaling of audit and alarms for success or failure.//#define SUCCESSFUL_ACCESS_ACE_FLAG       (0x40)#define FAILED_ACCESS_ACE_FLAG           (0x80)////  We'll define the structure of the predefined ACE types.  Pictorally//  the structure of the predefined ACE's is as follows:////       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1//       1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0//      +---------------+-------+-------+---------------+---------------+//      |    AceFlags   | Resd  |Inherit|    AceSize    |     AceType   |//      +---------------+-------+-------+---------------+---------------+//      |                              Mask                             |//      +---------------------------------------------------------------+//      |                                                               |//      +                                                               +//      |                                                               |//      +                              Sid                              +//      |                                                               |//      +                                                               +//      |                                                               |//      +---------------------------------------------------------------+////  Mask is the access mask associated with the ACE.  This is either the//  access allowed, access denied, audit, or alarm mask.////  Sid is the Sid associated with the ACE.////  The following are the four predefined ACE types.//  Examine the AceType field in the Header to determine//  which structure is appropriate to use for casting.typedef struct _ACCESS_ALLOWED_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;} ACCESS_ALLOWED_ACE;typedef ACCESS_ALLOWED_ACE *PACCESS_ALLOWED_ACE;typedef struct _ACCESS_DENIED_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;} ACCESS_DENIED_ACE;typedef ACCESS_DENIED_ACE *PACCESS_DENIED_ACE;typedef struct _SYSTEM_AUDIT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;} SYSTEM_AUDIT_ACE;typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;typedef struct _SYSTEM_ALARM_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;} SYSTEM_ALARM_ACE;typedef SYSTEM_ALARM_ACE *PSYSTEM_ALARM_ACE;typedef struct _SYSTEM_MANDATORY_LABEL_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;#define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP         0x1#define SYSTEM_MANDATORY_LABEL_NO_READ_UP          0x2#define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP       0x4#define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP   | \                                           SYSTEM_MANDATORY_LABEL_NO_READ_UP    | \                                           SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)// end_ntifstypedef struct _ACCESS_ALLOWED_OBJECT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD Flags;    GUID ObjectType;    GUID InheritedObjectType;    DWORD SidStart;} ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;typedef struct _ACCESS_DENIED_OBJECT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD Flags;    GUID ObjectType;    GUID InheritedObjectType;    DWORD SidStart;} ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;typedef struct _SYSTEM_AUDIT_OBJECT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD Flags;    GUID ObjectType;    GUID InheritedObjectType;    DWORD SidStart;} SYSTEM_AUDIT_OBJECT_ACE, *PSYSTEM_AUDIT_OBJECT_ACE;typedef struct _SYSTEM_ALARM_OBJECT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD Flags;    GUID ObjectType;    GUID InheritedObjectType;    DWORD SidStart;} SYSTEM_ALARM_OBJECT_ACE, *PSYSTEM_ALARM_OBJECT_ACE;//// Callback ace support in post Win2000.// Resource managers can put their own data after Sidstart + Length of the sid//typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;    // Opaque resouce manager specific data} ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;typedef struct _ACCESS_DENIED_CALLBACK_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;    // Opaque resouce manager specific data} ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;    // Opaque resouce manager specific data} SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;typedef struct _SYSTEM_ALARM_CALLBACK_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD SidStart;    // Opaque resouce manager specific data} SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD Flags;    GUID ObjectType;    GUID InheritedObjectType;    DWORD SidStart;    // Opaque resouce manager specific data} ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD Flags;    GUID ObjectType;    GUID InheritedObjectType;    DWORD SidStart;    // Opaque resouce manager specific data} ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD Flags;    GUID ObjectType;    GUID InheritedObjectType;    DWORD SidStart;    // Opaque resouce manager specific data} SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {    ACE_HEADER Header;    ACCESS_MASK Mask;    DWORD Flags;    GUID ObjectType;    GUID InheritedObjectType;    DWORD SidStart;    // Opaque resouce manager specific data} SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;//// Currently define Flags for "OBJECT" ACE types.//#define ACE_OBJECT_TYPE_PRESENT           0x1#define ACE_INHERITED_OBJECT_TYPE_PRESENT 0x2////  The following declarations are used for setting and querying information//  about and ACL.  First are the various information classes available to//  the user.//typedef enum _ACL_INFORMATION_CLASS {    AclRevisionInformation = 1,    AclSizeInformation} ACL_INFORMATION_CLASS;////  This record is returned/sent if the user is requesting/setting the//  AclRevisionInformation//typedef struct _ACL_REVISION_INFORMATION {    DWORD AclRevision;} ACL_REVISION_INFORMATION;typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;////  This record is returned if the user is requesting AclSizeInformation//typedef struct _ACL_SIZE_INFORMATION {    DWORD AceCount;    DWORD AclBytesInUse;    DWORD AclBytesFree;} ACL_SIZE_INFORMATION;typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;//////////////////////////////////////////////////////////////////////////                                                                    ////                             SECURITY_DESCRIPTOR                    ////                                                                    //////////////////////////////////////////////////////////////////////////////  Define the Security Descriptor and related data types.//  This is an opaque data structure.//// begin_wdm//// Current security descriptor revision value//#define SECURITY_DESCRIPTOR_REVISION     (1)#define SECURITY_DESCRIPTOR_REVISION1    (1)// end_wdm// begin_ntifs#define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR))typedef WORD   SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;#define SE_OWNER_DEFAULTED               (0x0001)#define SE_GROUP_DEFAULTED               (0x0002)#define SE_DACL_PRESENT                  (0x0004)#define SE_DACL_DEFAULTED                (0x0008)#define SE_SACL_PRESENT                  (0x0010)#define SE_SACL_DEFAULTED                (0x0020)#define SE_DACL_AUTO_INHERIT_REQ         (0x0100)#define SE_SACL_AUTO_INHERIT_REQ         (0x0200)#define SE_DACL_AUTO_INHERITED           (0x0400)#define SE_SACL_AUTO_INHERITED           (0x0800)#define SE_DACL_PROTECTED                (0x1000)#define SE_SACL_PROTECTED                (0x2000)#define SE_RM_CONTROL_VALID              (0x4000)#define SE_SELF_RELATIVE                 (0x8000)////  Where:////      SE_OWNER_DEFAULTED - This boolean flag, when set, indicates that the//          SID pointed to by the Owner field was provided by a//          defaulting mechanism rather than explicitly provided by the//          original provider of the security descriptor.  This may//          affect the treatment of the SID with respect to inheritence//          of an owner.////      SE_GROUP_DEFAULTED - This boolean flag, when set, indicates that the//          SID in the Group field was provided by a defaulting mechanism//          rather than explicitly provided by the original provider of//          the security descriptor.  This may affect the treatment of//          the SID with respect to inheritence of a primary group.////      SE_DACL_PRESENT - This boolean flag, when set, indicates that the//          security descriptor contains a discretionary ACL.  If this//          flag is set and the Dacl field of the SECURITY_DESCRIPTOR is//          null, then a null ACL is explicitly being specified.////      SE_DACL_DEFAULTED - This boolean flag, when set, indicates that the//          ACL pointed to by the Dacl field was provided by a defaulting//          mechanism rather than explicitly provided by the original//          provider of the security descriptor.  This may affect the//          treatment of the ACL with respect to inheritence of an ACL.//          This flag is ignored if the DaclPresent flag is not set.////      SE_SACL_PRESENT - This boolean flag, when set,  indicates that the//          security descriptor contains a system ACL pointed to by the//          Sacl field.  If this flag is set and the Sacl field of the//          SECURITY_DESCRIPTOR is null, then an empty (but present)//          ACL is being specified.////      SE_SACL_DEFAULTED - This boolean flag, when set, indicates that the//          ACL pointed to by the Sacl field was provided by a defaulting//          mechanism rather than explicitly provided by the original//          provider of the security descriptor.  This may affect the//          treatment of the ACL with respect to inheritence of an ACL.//          This flag is ignored if the SaclPresent flag is not set.////      SE_SELF_RELATIVE - This boolean flag, when set, indicates that the//          security descriptor is in self-relative form.  In this form,//          all fields of the security descriptor are contiguous in memory//          and all pointer fields are expressed as offsets from the//          beginning of the security descriptor.  This form is useful//          for treating security descriptors as opaque data structures//          for transmission in communication protocol or for storage on//          secondary media.//////// Pictorially the structure of a security descriptor is as follows:////       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1//       1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0//      +---------------------------------------------------------------+//      |            Control            |Reserved1 (SBZ)|   Revision    |//      +---------------------------------------------------------------+//      |                            Owner                              |//      +---------------------------------------------------------------+//      |                            Group                              |//      +---------------------------------------------------------------+//      |                            Sacl                               |//      +---------------------------------------------------------------+//      |                            Dacl                               |//      +---------------------------------------------------------------+//// In general, this data structure should be treated opaquely to ensure future// compatibility.////typedef struct _SECURITY_DESCRIPTOR_RELATIVE {    BYTE  Revision;    BYTE  Sbz1;    SECURITY_DESCRIPTOR_CONTROL Control;    DWORD Owner;    DWORD Group;    DWORD Sacl;    DWORD Dacl;    } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;typedef struct _SECURITY_DESCRIPTOR {   BYTE  Revision;   BYTE  Sbz1;   SECURITY_DESCRIPTOR_CONTROL Control;   PSID Owner;   PSID Group;   PACL Sacl;   PACL Dacl;   } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;// end_ntifs// Where:////     Revision - Contains the revision level of the security//         descriptor.  This allows this structure to be passed between//         systems or stored on disk even though it is expected to//         change in the future.////     Control - A set of flags which qualify the meaning of the//         security descriptor or individual fields of the security//         descriptor.////     Owner - is a pointer to an SID representing an object's owner.//         If this field is null, then no owner SID is present in the//         security descriptor.  If the security descriptor is in//         self-relative form, then this field contains an offset to//         the SID, rather than a pointer.////     Group - is a pointer to an SID representing an object's primary//         group.  If this field is null, then no primary group SID is//         present in the security descriptor.  If the security descriptor//         is in self-relative form, then this field contains an offset to//         the SID, rather than a pointer.////     Sacl - is a pointer to a system ACL.  This field value is only//         valid if the DaclPresent control flag is set.  If the//         SaclPresent flag is set and this field is null, then a null//         ACL  is specified.  If the security descriptor is in//         self-relative form, then this field contains an offset to//         the ACL, rather than a pointer.////     Dacl - is a pointer to a discretionary ACL.  This field value is//         only valid if the DaclPresent control flag is set.  If the//         DaclPresent flag is set and this field is null, then a null//         ACL (unconditionally granting access) is specified.  If the//         security descriptor is in self-relative form, then this field//         contains an offset to the ACL, rather than a pointer.////////////////////////////////////////////////////////////////////////////                                                                    ////               Object Type list for AccessCheckByType               ////                                                                    //////////////////////////////////////////////////////////////////////////typedef struct _OBJECT_TYPE_LIST {    WORD   Level;    WORD   Sbz;    GUID *ObjectType;} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;//// DS values for Level//#define ACCESS_OBJECT_GUID       0#define ACCESS_PROPERTY_SET_GUID 1#define ACCESS_PROPERTY_GUID     2#define ACCESS_MAX_LEVEL         4//// Parameters to NtAccessCheckByTypeAndAditAlarm//typedef enum _AUDIT_EVENT_TYPE {    AuditEventObjectAccess,    AuditEventDirectoryServiceAccess} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;#define AUDIT_ALLOW_NO_PRIVILEGE 0x1//// DS values for Source and ObjectTypeName//#define ACCESS_DS_SOURCE_A "DS"#define ACCESS_DS_SOURCE_W L"DS"#define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object"#define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object"//////////////////////////////////////////////////////////////////////////                                                                    ////               Privilege Related Data Structures                    ////                                                                    //////////////////////////////////////////////////////////////////////////// end_ntifs// begin_wdm//// Privilege attributes//#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)#define SE_PRIVILEGE_ENABLED            (0x00000002L)#define SE_PRIVILEGE_REMOVED            (0X00000004L)#define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)#define SE_PRIVILEGE_VALID_ATTRIBUTES   (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \                                         SE_PRIVILEGE_ENABLED            | \                                         SE_PRIVILEGE_REMOVED            | \                                         SE_PRIVILEGE_USED_FOR_ACCESS)//// Privilege Set Control flags//#define PRIVILEGE_SET_ALL_NECESSARY    (1)////  Privilege Set - This is defined for a privilege set of one.//                  If more than one privilege is needed, then this structure//                  will need to be allocated with more space.////  Note: don't change this structure without fixing the INITIAL_PRIVILEGE_SET//  structure (defined in se.h)//typedef struct _PRIVILEGE_SET {    DWORD PrivilegeCount;    DWORD Control;    LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];    } PRIVILEGE_SET, * PPRIVILEGE_SET;//////////////////////////////////////////////////////////////////////////                                                                    ////               NT Defined Privileges                                ////                                                                    //////////////////////////////////////////////////////////////////////////#define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")#define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")#define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")#define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")#define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")#define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")#define SE_TCB_NAME                       TEXT("SeTcbPrivilege")#define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")#define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")#define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")#define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")#define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")#define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")#define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")#define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")#define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")#define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")#define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")#define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")#define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")#define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")#define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")#define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")#define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")#define SE_UNDOCK_NAME                    TEXT("SeUndockPrivilege")#define SE_SYNC_AGENT_NAME                TEXT("SeSyncAgentPrivilege")#define SE_ENABLE_DELEGATION_NAME         TEXT("SeEnableDelegationPrivilege")#define SE_MANAGE_VOLUME_NAME             TEXT("SeManageVolumePrivilege")#define SE_IMPERSONATE_NAME               TEXT("SeImpersonatePrivilege")#define SE_CREATE_GLOBAL_NAME             TEXT("SeCreateGlobalPrivilege")#define SE_TRUSTED_CREDMAN_ACCESS_NAME    TEXT("SeTrustedCredManAccessPrivilege")#define SE_RELABEL_NAME                   TEXT("SeRelabelPrivilege")#define SE_INC_WORKING_SET_NAME           TEXT("SeIncreaseWorkingSetPrivilege")#define SE_TIME_ZONE_NAME                 TEXT("SeTimeZonePrivilege")#define SE_CREATE_SYMBOLIC_LINK_NAME      TEXT("SeCreateSymbolicLinkPrivilege")//////////////////////////////////////////////////////////////////////                                                                ////           Security Quality Of Service                          ////                                                                ////                                                                //////////////////////////////////////////////////////////////////////// begin_wdm//// Impersonation Level//// Impersonation level is represented by a pair of bits in Windows.// If a new impersonation level is added or lowest value is changed from// 0 to something else, fix the Windows CreateFile call.//typedef enum _SECURITY_IMPERSONATION_LEVEL {    SecurityAnonymous,    SecurityIdentification,    SecurityImpersonation,    SecurityDelegation    } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation#define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation#define VALID_IMPERSONATION_LEVEL(L) (((L) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((L) <= SECURITY_MAX_IMPERSONATION_LEVEL))//////////////////////////////////////////////////////////////////////                                                                ////           Token Object Definitions                             ////                                                                ////                                                                ////////////////////////////////////////////////////////////////////////// Token Specific Access Rights.//#define TOKEN_ASSIGN_PRIMARY    (0x0001)#define TOKEN_DUPLICATE         (0x0002)#define TOKEN_IMPERSONATE       (0x0004)#define TOKEN_QUERY             (0x0008)#define TOKEN_QUERY_SOURCE      (0x0010)#define TOKEN_ADJUST_PRIVILEGES (0x0020)#define TOKEN_ADJUST_GROUPS     (0x0040)#define TOKEN_ADJUST_DEFAULT    (0x0080)#define TOKEN_ADJUST_SESSIONID  (0x0100)#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED  |\                          TOKEN_ASSIGN_PRIMARY      |\                          TOKEN_DUPLICATE           |\                          TOKEN_IMPERSONATE         |\                          TOKEN_QUERY               |\                          TOKEN_QUERY_SOURCE        |\                          TOKEN_ADJUST_PRIVILEGES   |\                          TOKEN_ADJUST_GROUPS       |\                          TOKEN_ADJUST_DEFAULT )#if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))#define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P |\                          TOKEN_ADJUST_SESSIONID )#else#define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P)#endif#define TOKEN_READ       (STANDARD_RIGHTS_READ      |\                          TOKEN_QUERY)#define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE     |\                          TOKEN_ADJUST_PRIVILEGES   |\                          TOKEN_ADJUST_GROUPS       |\                          TOKEN_ADJUST_DEFAULT)#define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)////// Token Types//typedef enum _TOKEN_TYPE {    TokenPrimary = 1,    TokenImpersonation    } TOKEN_TYPE;typedef TOKEN_TYPE *PTOKEN_TYPE;//// Token elevation values describe the relative strength of a given token.// A full token is a token with all groups and privileges to which the principal// is authorized.  A limited token is one with some groups or privileges removed.//typedef enum _TOKEN_ELEVATION_TYPE {    TokenElevationTypeDefault = 1,    TokenElevationTypeFull,    TokenElevationTypeLimited,} TOKEN_ELEVATION_TYPE, *PTOKEN_ELEVATION_TYPE;//// Token Information Classes.//typedef enum _TOKEN_INFORMATION_CLASS {    TokenUser = 1,    TokenGroups,    TokenPrivileges,    TokenOwner,    TokenPrimaryGroup,    TokenDefaultDacl,    TokenSource,    TokenType,    TokenImpersonationLevel,    TokenStatistics,    TokenRestrictedSids,    TokenSessionId,    TokenGroupsAndPrivileges,    TokenSessionReference,    TokenSandBoxInert,    TokenAuditPolicy,    TokenOrigin,    TokenElevationType,    TokenLinkedToken,    TokenElevation,    TokenHasRestrictions,    TokenAccessInformation,    TokenVirtualizationAllowed,    TokenVirtualizationEnabled,    TokenIntegrityLevel,    TokenUIAccess,    TokenMandatoryPolicy,    TokenLogonSid,    MaxTokenInfoClass  // MaxTokenInfoClass should always be the last enum} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;//// Token information class structures//typedef struct _TOKEN_USER {    SID_AND_ATTRIBUTES User;} TOKEN_USER, *PTOKEN_USER;typedef struct _TOKEN_GROUPS {    DWORD GroupCount;    SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];} TOKEN_GROUPS, *PTOKEN_GROUPS;typedef struct _TOKEN_PRIVILEGES {    DWORD PrivilegeCount;    LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;typedef struct _TOKEN_OWNER {    PSID Owner;} TOKEN_OWNER, *PTOKEN_OWNER;typedef struct _TOKEN_PRIMARY_GROUP {    PSID PrimaryGroup;} TOKEN_PRIMARY_GROUP, *PTOKEN_PRIMARY_GROUP;typedef struct _TOKEN_DEFAULT_DACL {    PACL DefaultDacl;} TOKEN_DEFAULT_DACL, *PTOKEN_DEFAULT_DACL;typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {    DWORD SidCount;    DWORD SidLength;    PSID_AND_ATTRIBUTES Sids;    DWORD RestrictedSidCount;    DWORD RestrictedSidLength;    PSID_AND_ATTRIBUTES RestrictedSids;    DWORD PrivilegeCount;    DWORD PrivilegeLength;    PLUID_AND_ATTRIBUTES Privileges;    LUID AuthenticationId;} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;typedef struct _TOKEN_LINKED_TOKEN {    HANDLE LinkedToken;} TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN;typedef struct _TOKEN_ELEVATION {    DWORD TokenIsElevated;} TOKEN_ELEVATION, *PTOKEN_ELEVATION;typedef struct _TOKEN_MANDATORY_LABEL {    SID_AND_ATTRIBUTES Label;} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;#define TOKEN_MANDATORY_POLICY_OFF             0x0#define TOKEN_MANDATORY_POLICY_NO_WRITE_UP     0x1#define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN 0x2#define TOKEN_MANDATORY_POLICY_VALID_MASK      (TOKEN_MANDATORY_POLICY_NO_WRITE_UP | \                                                TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN)typedef struct _TOKEN_MANDATORY_POLICY {    DWORD Policy;} TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY;typedef struct _TOKEN_ACCESS_INFORMATION {    PSID_AND_ATTRIBUTES_HASH SidHash;    PSID_AND_ATTRIBUTES_HASH RestrictedSidHash;    PTOKEN_PRIVILEGES Privileges;    LUID AuthenticationId;    TOKEN_TYPE TokenType;    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;    TOKEN_MANDATORY_POLICY MandatoryPolicy;    DWORD Flags;} TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION;//// Valid bits for each TOKEN_AUDIT_POLICY policy mask field.//#define POLICY_AUDIT_SUBCATEGORY_COUNT (50)typedef struct _TOKEN_AUDIT_POLICY {    BYTE  PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT) >> 1) + 1];} TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;#define TOKEN_SOURCE_LENGTH 8typedef struct _TOKEN_SOURCE {    CHAR SourceName[TOKEN_SOURCE_LENGTH];    LUID SourceIdentifier;} TOKEN_SOURCE, *PTOKEN_SOURCE;typedef struct _TOKEN_STATISTICS {    LUID TokenId;    LUID AuthenticationId;    LARGE_INTEGER ExpirationTime;    TOKEN_TYPE TokenType;    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;    DWORD DynamicCharged;    DWORD DynamicAvailable;    DWORD GroupCount;    DWORD PrivilegeCount;    LUID ModifiedId;} TOKEN_STATISTICS, *PTOKEN_STATISTICS;typedef struct _TOKEN_CONTROL {    LUID TokenId;    LUID AuthenticationId;    LUID ModifiedId;    TOKEN_SOURCE TokenSource;} TOKEN_CONTROL, *PTOKEN_CONTROL;typedef struct _TOKEN_ORIGIN {    LUID OriginatingLogonSession ;} TOKEN_ORIGIN, * PTOKEN_ORIGIN ;typedef enum _MANDATORY_LEVEL {    MandatoryLevelUntrusted = 0,    MandatoryLevelLow,    MandatoryLevelMedium,    MandatoryLevelHigh,    MandatoryLevelSystem,    MandatoryLevelSecureProcess,    MandatoryLevelCount} MANDATORY_LEVEL, *PMANDATORY_LEVEL;//// Security Tracking Mode//#define SECURITY_DYNAMIC_TRACKING      (TRUE)#define SECURITY_STATIC_TRACKING       (FALSE)typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,                    * PSECURITY_CONTEXT_TRACKING_MODE;//// Quality Of Service//typedef struct _SECURITY_QUALITY_OF_SERVICE {    DWORD Length;    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;    SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;    BOOLEAN EffectiveOnly;    } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;//// Used to represent information related to a thread impersonation//typedef struct _SE_IMPERSONATION_STATE {    PACCESS_TOKEN Token;    BOOLEAN CopyOnOpen;    BOOLEAN EffectiveOnly;    SECURITY_IMPERSONATION_LEVEL Level;} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;#define DISABLE_MAX_PRIVILEGE   0x1 #define SANDBOX_INERT           0x2 #define LUA_TOKEN               0x4 #define WRITE_RESTRICTED        0x8 typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;#define OWNER_SECURITY_INFORMATION       (0x00000001L)#define GROUP_SECURITY_INFORMATION       (0x00000002L)#define DACL_SECURITY_INFORMATION        (0x00000004L)#define SACL_SECURITY_INFORMATION        (0x00000008L)#define LABEL_SECURITY_INFORMATION       (0x00000010L)#define PROTECTED_DACL_SECURITY_INFORMATION     (0x80000000L)#define PROTECTED_SACL_SECURITY_INFORMATION     (0x40000000L)#define UNPROTECTED_DACL_SECURITY_INFORMATION   (0x20000000L)#define UNPROTECTED_SACL_SECURITY_INFORMATION   (0x10000000L)#define PROCESS_TERMINATE                  (0x0001)  #define PROCESS_CREATE_THREAD              (0x0002)  #define PROCESS_SET_SESSIONID              (0x0004)  #define PROCESS_VM_OPERATION               (0x0008)  #define PROCESS_VM_READ                    (0x0010)  #define PROCESS_VM_WRITE                   (0x0020)  #define PROCESS_DUP_HANDLE                 (0x0040)  #define PROCESS_CREATE_PROCESS             (0x0080)  #define PROCESS_SET_QUOTA                  (0x0100)  #define PROCESS_SET_INFORMATION            (0x0200)  #define PROCESS_QUERY_INFORMATION          (0x0400)  #define PROCESS_SUSPEND_RESUME             (0x0800)  #define PROCESS_QUERY_LIMITED_INFORMATION  (0x1000)  #if (NTDDI_VERSION >= NTDDI_LONGHORN)#define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \                                   0xFFFF)#else#define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \                                   0xFFF)#endif#if defined(_WIN64)#define MAXIMUM_PROCESSORS 64#else#define MAXIMUM_PROCESSORS 32#endif#define THREAD_TERMINATE                 (0x0001)  #define THREAD_SUSPEND_RESUME            (0x0002)  #define THREAD_GET_CONTEXT               (0x0008)  #define THREAD_SET_CONTEXT               (0x0010)  #define THREAD_QUERY_INFORMATION         (0x0040)  #define THREAD_SET_INFORMATION           (0x0020)  #define THREAD_SET_THREAD_TOKEN          (0x0080)#define THREAD_IMPERSONATE               (0x0100)#define THREAD_DIRECT_IMPERSONATION      (0x0200)// begin_wdm#define THREAD_SET_LIMITED_INFORMATION   (0x0400)  // winnt#define THREAD_QUERY_LIMITED_INFORMATION (0x0800)  // winnt#if (NTDDI_VERSION >= NTDDI_LONGHORN)#define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \                                   0xFFFF)#else#define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \                                   0x3FF)#endif#define JOB_OBJECT_ASSIGN_PROCESS           (0x0001)#define JOB_OBJECT_SET_ATTRIBUTES           (0x0002)#define JOB_OBJECT_QUERY                    (0x0004)#define JOB_OBJECT_TERMINATE                (0x0008)#define JOB_OBJECT_SET_SECURITY_ATTRIBUTES  (0x0010)#define JOB_OBJECT_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \                                        0x1F )typedef struct _JOB_SET_ARRAY {    HANDLE JobHandle;   // Handle to job object to insert    DWORD MemberLevel;  // Level of this job in the set. Must be > 0. Can be sparse.    DWORD Flags;        // Unused. Must be zero} JOB_SET_ARRAY, *PJOB_SET_ARRAY;#define FLS_MAXIMUM_AVAILABLE 128   #define TLS_MINIMUM_AVAILABLE 64    typedef struct _NT_TIB {    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;    PVOID StackBase;    PVOID StackLimit;    PVOID SubSystemTib;    union {        PVOID FiberData;        DWORD Version;    };    PVOID ArbitraryUserPointer;    struct _NT_TIB *Self;} NT_TIB;typedef NT_TIB *PNT_TIB;//// 32 and 64 bit specific version for wow64 and the debugger//typedef struct _NT_TIB32 {    DWORD ExceptionList;    DWORD StackBase;    DWORD StackLimit;    DWORD SubSystemTib;    union {        DWORD FiberData;        DWORD Version;    };    DWORD ArbitraryUserPointer;    DWORD Self;} NT_TIB32, *PNT_TIB32;typedef struct _NT_TIB64 {    DWORD64 ExceptionList;    DWORD64 StackBase;    DWORD64 StackLimit;    DWORD64 SubSystemTib;    union {        DWORD64 FiberData;        DWORD Version;    };    DWORD64 ArbitraryUserPointer;    DWORD64 Self;} NT_TIB64, *PNT_TIB64;#define THREAD_BASE_PRIORITY_LOWRT  15  // value that gets a thread to LowRealtime-1#define THREAD_BASE_PRIORITY_MAX    2   // maximum thread base priority boost#define THREAD_BASE_PRIORITY_MIN    (-2)  // minimum thread base priority boost#define THREAD_BASE_PRIORITY_IDLE   (-15) // value that gets a thread to idletypedef struct _QUOTA_LIMITS {    SIZE_T PagedPoolLimit;    SIZE_T NonPagedPoolLimit;    SIZE_T MinimumWorkingSetSize;    SIZE_T MaximumWorkingSetSize;    SIZE_T PagefileLimit;    LARGE_INTEGER TimeLimit;} QUOTA_LIMITS, *PQUOTA_LIMITS;#define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002#define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010#define PS_RATE_PHASE_BITS  4#define PS_RATE_PHASE_MASK  ((1UL << PS_RATE_PHASE_BITS) - 1)typedef enum _PS_RATE_PHASE {    PsRateOneSecond = 0,    PsRateTwoSecond,    PsRateThreeSecond,    PsRateMaxPhase} PS_RATE_PHASE;typedef union _RATE_QUOTA_LIMIT {    DWORD RateData;    struct {        DWORD RatePhase     : PS_RATE_PHASE_BITS;        DWORD RatePercent   : 28;    };} RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT;#if !defined(SORTPP_PASS) && !defined(MIDL_PASS) && !defined(RC_INVOKED) && defined(_WIN64) && !defined(_X86AMD64_)C_ASSERT (sizeof (DWORD) * 8 - PS_RATE_PHASE_BITS == 28);#endiftypedef struct _QUOTA_LIMITS_EX {    SIZE_T PagedPoolLimit;    SIZE_T NonPagedPoolLimit;    SIZE_T MinimumWorkingSetSize;    SIZE_T MaximumWorkingSetSize;    SIZE_T PagefileLimit;               // Limit expressed in pages    LARGE_INTEGER TimeLimit;    SIZE_T WorkingSetLimit;             // Limit expressed in pages    SIZE_T Reserved2;    SIZE_T Reserved3;    SIZE_T Reserved4;    DWORD  Flags;    RATE_QUOTA_LIMIT CpuRateLimit;} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;typedef struct _IO_COUNTERS {    ULONGLONG  ReadOperationCount;    ULONGLONG  WriteOperationCount;    ULONGLONG  OtherOperationCount;    ULONGLONG ReadTransferCount;    ULONGLONG WriteTransferCount;    ULONGLONG OtherTransferCount;} IO_COUNTERS;typedef IO_COUNTERS *PIO_COUNTERS;typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {    LARGE_INTEGER TotalUserTime;    LARGE_INTEGER TotalKernelTime;    LARGE_INTEGER ThisPeriodTotalUserTime;    LARGE_INTEGER ThisPeriodTotalKernelTime;    DWORD TotalPageFaultCount;    DWORD TotalProcesses;    DWORD ActiveProcesses;    DWORD TotalTerminatedProcesses;} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {    LARGE_INTEGER PerProcessUserTimeLimit;    LARGE_INTEGER PerJobUserTimeLimit;    DWORD LimitFlags;    SIZE_T MinimumWorkingSetSize;    SIZE_T MaximumWorkingSetSize;    DWORD ActiveProcessLimit;    ULONG_PTR Affinity;    DWORD PriorityClass;    DWORD SchedulingClass;} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {    JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;    IO_COUNTERS IoInfo;    SIZE_T ProcessMemoryLimit;    SIZE_T JobMemoryLimit;    SIZE_T PeakProcessMemoryUsed;    SIZE_T PeakJobMemoryUsed;} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {    DWORD NumberOfAssignedProcesses;    DWORD NumberOfProcessIdsInList;    ULONG_PTR ProcessIdList[1];} JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {    DWORD UIRestrictionsClass;} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {    DWORD SecurityLimitFlags ;    HANDLE JobToken ;    PTOKEN_GROUPS SidsToDisable ;    PTOKEN_PRIVILEGES PrivilegesToDelete ;    PTOKEN_GROUPS RestrictedSids ;} JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {    DWORD EndOfJobTimeAction;} JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {    PVOID CompletionKey;    HANDLE CompletionPort;} JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {    JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;    IO_COUNTERS IoInfo;} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;typedef struct _JOBOBJECT_JOBSET_INFORMATION {    DWORD MemberLevel;} JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;#define JOB_OBJECT_TERMINATE_AT_END_OF_JOB  0#define JOB_OBJECT_POST_AT_END_OF_JOB       1//// Completion Port Messages for job objects//// These values are returned via the lpNumberOfBytesTransferred parameter//#define JOB_OBJECT_MSG_END_OF_JOB_TIME          1#define JOB_OBJECT_MSG_END_OF_PROCESS_TIME      2#define JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT     3#define JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO      4#define JOB_OBJECT_MSG_NEW_PROCESS              6#define JOB_OBJECT_MSG_EXIT_PROCESS             7#define JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS    8#define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT     9#define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT         10//// Basic Limits//#define JOB_OBJECT_LIMIT_WORKINGSET                 0x00000001#define JOB_OBJECT_LIMIT_PROCESS_TIME               0x00000002#define JOB_OBJECT_LIMIT_JOB_TIME                   0x00000004#define JOB_OBJECT_LIMIT_ACTIVE_PROCESS             0x00000008#define JOB_OBJECT_LIMIT_AFFINITY                   0x00000010#define JOB_OBJECT_LIMIT_PRIORITY_CLASS             0x00000020#define JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME          0x00000040#define JOB_OBJECT_LIMIT_SCHEDULING_CLASS           0x00000080//// Extended Limits//#define JOB_OBJECT_LIMIT_PROCESS_MEMORY             0x00000100#define JOB_OBJECT_LIMIT_JOB_MEMORY                 0x00000200#define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400#define JOB_OBJECT_LIMIT_BREAKAWAY_OK               0x00000800#define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK        0x00001000#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE          0x00002000#define JOB_OBJECT_LIMIT_RESERVED2                  0x00004000#define JOB_OBJECT_LIMIT_RESERVED3                  0x00008000#define JOB_OBJECT_LIMIT_RESERVED4                  0x00010000#define JOB_OBJECT_LIMIT_RESERVED5                  0x00020000#define JOB_OBJECT_LIMIT_RESERVED6                  0x00040000#define JOB_OBJECT_LIMIT_VALID_FLAGS            0x0007ffff#define JOB_OBJECT_BASIC_LIMIT_VALID_FLAGS      0x000000ff#define JOB_OBJECT_EXTENDED_LIMIT_VALID_FLAGS   0x00003fff#define JOB_OBJECT_RESERVED_LIMIT_VALID_FLAGS   0x0007ffff//// UI restrictions for jobs//#define JOB_OBJECT_UILIMIT_NONE             0x00000000#define JOB_OBJECT_UILIMIT_HANDLES          0x00000001#define JOB_OBJECT_UILIMIT_READCLIPBOARD    0x00000002#define JOB_OBJECT_UILIMIT_WRITECLIPBOARD   0x00000004#define JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x00000008#define JOB_OBJECT_UILIMIT_DISPLAYSETTINGS  0x00000010#define JOB_OBJECT_UILIMIT_GLOBALATOMS      0x00000020#define JOB_OBJECT_UILIMIT_DESKTOP          0x00000040#define JOB_OBJECT_UILIMIT_EXITWINDOWS      0x00000080#define JOB_OBJECT_UILIMIT_ALL              0x000000FF#define JOB_OBJECT_UI_VALID_FLAGS           0x000000FF#define JOB_OBJECT_SECURITY_NO_ADMIN            0x00000001#define JOB_OBJECT_SECURITY_RESTRICTED_TOKEN    0x00000002#define JOB_OBJECT_SECURITY_ONLY_TOKEN          0x00000004#define JOB_OBJECT_SECURITY_FILTER_TOKENS       0x00000008#define JOB_OBJECT_SECURITY_VALID_FLAGS         0x0000000ftypedef enum _JOBOBJECTINFOCLASS {    JobObjectBasicAccountingInformation = 1,    JobObjectBasicLimitInformation,    JobObjectBasicProcessIdList,    JobObjectBasicUIRestrictions,    JobObjectSecurityLimitInformation,    JobObjectEndOfJobTimeInformation,    JobObjectAssociateCompletionPortInformation,    JobObjectBasicAndIoAccountingInformation,    JobObjectExtendedLimitInformation,    JobObjectJobSetInformation,    MaxJobObjectInfoClass    } JOBOBJECTINFOCLASS;//#define EVENT_MODIFY_STATE      0x0002  #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) #define MUTANT_QUERY_STATE      0x0001#define MUTANT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|\                          MUTANT_QUERY_STATE)#define SEMAPHORE_MODIFY_STATE      0x0002  #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) //// Timer Specific Access Rights.//#define TIMER_QUERY_STATE       0x0001#define TIMER_MODIFY_STATE      0x0002#define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|\                          TIMER_QUERY_STATE|TIMER_MODIFY_STATE)#define TIME_ZONE_ID_UNKNOWN  0#define TIME_ZONE_ID_STANDARD 1#define TIME_ZONE_ID_DAYLIGHT 2typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {    RelationProcessorCore,    RelationNumaNode,    RelationCache,    RelationProcessorPackage} LOGICAL_PROCESSOR_RELATIONSHIP;#define LTP_PC_SMT 0x1typedef enum _PROCESSOR_CACHE_TYPE {    CacheUnified,    CacheInstruction,    CacheData,    CacheTrace} PROCESSOR_CACHE_TYPE;#define CACHE_FULLY_ASSOCIATIVE 0xFFtypedef struct _CACHE_DESCRIPTOR {    BYTE   Level;    BYTE   Associativity;    WORD   LineSize;    DWORD  Size;    PROCESSOR_CACHE_TYPE Type;} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {    ULONG_PTR   ProcessorMask;    LOGICAL_PROCESSOR_RELATIONSHIP Relationship;    union {        struct {            BYTE  Flags;        } ProcessorCore;        struct {            DWORD NodeNumber;        } NumaNode;        CACHE_DESCRIPTOR Cache;        ULONGLONG  Reserved[2];    };} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;#define PROCESSOR_INTEL_386     386#define PROCESSOR_INTEL_486     486#define PROCESSOR_INTEL_PENTIUM 586#define PROCESSOR_INTEL_IA64    2200#define PROCESSOR_AMD_X8664     8664#define PROCESSOR_MIPS_R4000    4000    // incl R4101 & R3910 for Windows CE#define PROCESSOR_ALPHA_21064   21064#define PROCESSOR_PPC_601       601#define PROCESSOR_PPC_603       603#define PROCESSOR_PPC_604       604#define PROCESSOR_PPC_620       620#define PROCESSOR_HITACHI_SH3   10003   // Windows CE#define PROCESSOR_HITACHI_SH3E  10004   // Windows CE#define PROCESSOR_HITACHI_SH4   10005   // Windows CE#define PROCESSOR_MOTOROLA_821  821     // Windows CE#define PROCESSOR_SHx_SH3       103     // Windows CE#define PROCESSOR_SHx_SH4       104     // Windows CE#define PROCESSOR_STRONGARM     2577    // Windows CE - 0xA11#define PROCESSOR_ARM720        1824    // Windows CE - 0x720#define PROCESSOR_ARM820        2080    // Windows CE - 0x820#define PROCESSOR_ARM920        2336    // Windows CE - 0x920#define PROCESSOR_ARM_7TDMI     70001   // Windows CE#define PROCESSOR_OPTIL         0x494f  // MSIL#define PROCESSOR_ARCHITECTURE_INTEL            0#define PROCESSOR_ARCHITECTURE_MIPS             1#define PROCESSOR_ARCHITECTURE_ALPHA            2#define PROCESSOR_ARCHITECTURE_PPC              3#define PROCESSOR_ARCHITECTURE_SHX              4#define PROCESSOR_ARCHITECTURE_ARM              5#define PROCESSOR_ARCHITECTURE_IA64             6#define PROCESSOR_ARCHITECTURE_ALPHA64          7#define PROCESSOR_ARCHITECTURE_MSIL             8#define PROCESSOR_ARCHITECTURE_AMD64            9#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64    10#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF#define PF_FLOATING_POINT_PRECISION_ERRATA  0   #define PF_FLOATING_POINT_EMULATED          1   #define PF_COMPARE_EXCHANGE_DOUBLE          2   #define PF_MMX_INSTRUCTIONS_AVAILABLE       3   #define PF_PPC_MOVEMEM_64BIT_OK             4   #define PF_ALPHA_BYTE_INSTRUCTIONS          5   #define PF_XMMI_INSTRUCTIONS_AVAILABLE      6   #define PF_3DNOW_INSTRUCTIONS_AVAILABLE     7   #define PF_RDTSC_INSTRUCTION_AVAILABLE      8   #define PF_PAE_ENABLED                      9   #define PF_XMMI64_INSTRUCTIONS_AVAILABLE   10   #define PF_SSE_DAZ_MODE_AVAILABLE          11   #define PF_NX_ENABLED                      12   #define PF_SSE3_INSTRUCTIONS_AVAILABLE     13   #define PF_COMPARE_EXCHANGE128             14   #define PF_COMPARE64_EXCHANGE128           15   #define PF_CHANNELS_ENABLED                16   typedef struct _MEMORY_BASIC_INFORMATION {    PVOID BaseAddress;    PVOID AllocationBase;    DWORD AllocationProtect;    SIZE_T RegionSize;    DWORD State;    DWORD Protect;    DWORD Type;} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;typedef struct _MEMORY_BASIC_INFORMATION32 {    DWORD BaseAddress;    DWORD AllocationBase;    DWORD AllocationProtect;    DWORD RegionSize;    DWORD State;    DWORD Protect;    DWORD Type;} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;typedef struct DECLSPEC_ALIGN(16) _MEMORY_BASIC_INFORMATION64 {    ULONGLONG BaseAddress;    ULONGLONG AllocationBase;    DWORD     AllocationProtect;    DWORD     __alignment1;    ULONGLONG RegionSize;    DWORD     State;    DWORD     Protect;    DWORD     Type;    DWORD     __alignment2;} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;#define SECTION_QUERY                0x0001#define SECTION_MAP_WRITE            0x0002#define SECTION_MAP_READ             0x0004#define SECTION_MAP_EXECUTE          0x0008#define SECTION_EXTEND_SIZE          0x0010#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 // not included in SECTION_ALL_ACCESS#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\                            SECTION_MAP_WRITE |      \                            SECTION_MAP_READ |       \                            SECTION_MAP_EXECUTE |    \                            SECTION_EXTEND_SIZE)#define SESSION_QUERY_ACCESS  0x0001#define SESSION_MODIFY_ACCESS 0x0002#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |  \                            SESSION_QUERY_ACCESS |             \                            SESSION_MODIFY_ACCESS)#define PAGE_NOACCESS          0x01     #define PAGE_READONLY          0x02     #define PAGE_READWRITE         0x04     #define PAGE_WRITECOPY         0x08     #define PAGE_EXECUTE           0x10     #define PAGE_EXECUTE_READ      0x20     #define PAGE_EXECUTE_READWRITE 0x40     #define PAGE_EXECUTE_WRITECOPY 0x80     #define PAGE_GUARD            0x100     #define PAGE_NOCACHE          0x200     #define PAGE_WRITECOMBINE     0x400     #define MEM_COMMIT           0x1000     #define MEM_RESERVE          0x2000     #define MEM_DECOMMIT         0x4000     #define MEM_RELEASE          0x8000     #define MEM_FREE            0x10000     #define MEM_PRIVATE         0x20000     #define MEM_MAPPED          0x40000     #define MEM_RESET           0x80000     #define MEM_TOP_DOWN       0x100000     #define MEM_WRITE_WATCH    0x200000     #define MEM_PHYSICAL       0x400000     #define MEM_ROTATE         0x800000     #define MEM_LARGE_PAGES  0x20000000     #define MEM_4MB_PAGES    0x80000000     #define SEC_FILE           0x800000     #define SEC_IMAGE         0x1000000     #define SEC_PROTECTED_IMAGE  0x2000000     #define SEC_RESERVE       0x4000000     #define SEC_COMMIT        0x8000000     #define SEC_NOCACHE      0x10000000     #define SEC_WRITECOMBINE 0x40000000     #define SEC_LARGE_PAGES  0x80000000     #define MEM_IMAGE         SEC_IMAGE     #define WRITE_WATCH_FLAG_RESET 0x01     //// Define access rights to files and directories////// The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in// devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these// constants *MUST* always be in sync.// The values are redefined in devioctl.h because they must be available to// both DOS and NT.//#define FILE_READ_DATA            ( 0x0001 )    // file & pipe#define FILE_LIST_DIRECTORY       ( 0x0001 )    // directory#define FILE_WRITE_DATA           ( 0x0002 )    // file & pipe#define FILE_ADD_FILE             ( 0x0002 )    // directory#define FILE_APPEND_DATA          ( 0x0004 )    // file#define FILE_ADD_SUBDIRECTORY     ( 0x0004 )    // directory#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 )    // named pipe#define FILE_READ_EA              ( 0x0008 )    // file & directory#define FILE_WRITE_EA             ( 0x0010 )    // file & directory#define FILE_EXECUTE              ( 0x0020 )    // file#define FILE_TRAVERSE             ( 0x0020 )    // directory#define FILE_DELETE_CHILD         ( 0x0040 )    // directory#define FILE_READ_ATTRIBUTES      ( 0x0080 )    // all#define FILE_WRITE_ATTRIBUTES     ( 0x0100 )    // all#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)#define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ     |\                                   FILE_READ_DATA           |\                                   FILE_READ_ATTRIBUTES     |\                                   FILE_READ_EA             |\                                   SYNCHRONIZE)#define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\                                   FILE_WRITE_DATA          |\                                   FILE_WRITE_ATTRIBUTES    |\                                   FILE_WRITE_EA            |\                                   FILE_APPEND_DATA         |\                                   SYNCHRONIZE)#define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE  |\                                   FILE_READ_ATTRIBUTES     |\                                   FILE_EXECUTE             |\                                   SYNCHRONIZE)#define FILE_SHARE_READ                 0x00000001  #define FILE_SHARE_WRITE                0x00000002  #define FILE_SHARE_DELETE               0x00000004  #define FILE_ATTRIBUTE_READONLY             0x00000001  #define FILE_ATTRIBUTE_HIDDEN               0x00000002  #define FILE_ATTRIBUTE_SYSTEM               0x00000004  #define FILE_ATTRIBUTE_DIRECTORY            0x00000010  #define FILE_ATTRIBUTE_ARCHIVE              0x00000020  #define FILE_ATTRIBUTE_DEVICE               0x00000040  #define FILE_ATTRIBUTE_NORMAL               0x00000080  #define FILE_ATTRIBUTE_TEMPORARY            0x00000100  #define FILE_ATTRIBUTE_SPARSE_FILE          0x00000200  #define FILE_ATTRIBUTE_REPARSE_POINT        0x00000400  #define FILE_ATTRIBUTE_COMPRESSED           0x00000800  #define FILE_ATTRIBUTE_OFFLINE              0x00001000  #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000  #define FILE_ATTRIBUTE_ENCRYPTED            0x00004000  #define FILE_ATTRIBUTE_VIRTUAL              0x00010000  #define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001   #define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002   #define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004   #define FILE_NOTIFY_CHANGE_SIZE         0x00000008   #define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010   #define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020   #define FILE_NOTIFY_CHANGE_CREATION     0x00000040   #define FILE_NOTIFY_CHANGE_SECURITY     0x00000100   #define FILE_ACTION_ADDED                   0x00000001   #define FILE_ACTION_REMOVED                 0x00000002   #define FILE_ACTION_MODIFIED                0x00000003   #define FILE_ACTION_RENAMED_OLD_NAME        0x00000004   #define FILE_ACTION_RENAMED_NEW_NAME        0x00000005   #define MAILSLOT_NO_MESSAGE             ((DWORD)-1) #define MAILSLOT_WAIT_FOREVER           ((DWORD)-1) #define FILE_CASE_SENSITIVE_SEARCH      0x00000001  #define FILE_CASE_PRESERVED_NAMES       0x00000002  #define FILE_UNICODE_ON_DISK            0x00000004  #define FILE_PERSISTENT_ACLS            0x00000008  #define FILE_FILE_COMPRESSION           0x00000010  #define FILE_VOLUME_QUOTAS              0x00000020  #define FILE_SUPPORTS_SPARSE_FILES      0x00000040  #define FILE_SUPPORTS_REPARSE_POINTS    0x00000080  #define FILE_SUPPORTS_REMOTE_STORAGE    0x00000100  #define FILE_VOLUME_IS_COMPRESSED       0x00008000  #define FILE_SUPPORTS_OBJECT_IDS        0x00010000  #define FILE_SUPPORTS_ENCRYPTION        0x00020000  #define FILE_NAMED_STREAMS              0x00040000  #define FILE_READ_ONLY_VOLUME           0x00080000  #define FILE_SEQUENTIAL_WRITE_ONCE      0x00100000  #define FILE_SUPPORTS_TRANSACTIONS      0x00200000  //// Define the file notification information structure//typedef struct _FILE_NOTIFY_INFORMATION {    DWORD NextEntryOffset;    DWORD Action;    DWORD FileNameLength;    WCHAR FileName[1];} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;//// Define segement buffer structure for scatter/gather read/write.//typedef union _FILE_SEGMENT_ELEMENT {    PVOID64 Buffer;    ULONGLONG Alignment;}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;//// The reparse GUID structure is used by all 3rd party layered drivers to// store data in a reparse point. For non-Microsoft tags, The GUID field// cannot be GUID_NULL.// The constraints on reparse tags are defined below.// Microsoft tags can also be used with this format of the reparse point buffer.//typedef struct _REPARSE_GUID_DATA_BUFFER {    DWORD  ReparseTag;    WORD   ReparseDataLength;    WORD   Reserved;    GUID   ReparseGuid;    struct {        BYTE   DataBuffer[1];    } GenericReparseBuffer;} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)//// Maximum allowed size of the reparse data.//#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE      ( 16 * 1024 )//// Predefined reparse tags.// These tags need to avoid conflicting with IO_REMOUNT defined in ntos\inc\io.h//#define IO_REPARSE_TAG_RESERVED_ZERO             (0)#define IO_REPARSE_TAG_RESERVED_ONE              (1)//// The value of the following constant needs to satisfy the following conditions://  (1) Be at least as large as the largest of the reserved tags.//  (2) Be strictly smaller than all the tags in use.//#define IO_REPARSE_TAG_RESERVED_RANGE            IO_REPARSE_TAG_RESERVED_ONE//// The reparse tags are a DWORD. The 32 bits are laid out as follows:////   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0//  +-+-+-+-+-----------------------+-------------------------------+//  |M|R|N|R|     Reserved bits     |       Reparse Tag Value       |//  +-+-+-+-+-----------------------+-------------------------------+//// M is the Microsoft bit. When set to 1, it denotes a tag owned by Microsoft.//   All ISVs must use a tag with a 0 in this position.//   Note: If a Microsoft tag is used by non-Microsoft software, the//   behavior is not defined.//// R is reserved.  Must be zero for non-Microsoft tags.//// N is name surrogate. When set to 1, the file represents another named//   entity in the system.//// The M and N bits are OR-able.// The following macros check for the M and N bit values:////// Macro to determine whether a reparse point tag corresponds to a tag// owned by Microsoft.//#define IsReparseTagMicrosoft(_tag) (              \                           ((_tag) & 0x80000000)   \                           )//// Macro to determine whether a reparse point tag is a name surrogate//#define IsReparseTagNameSurrogate(_tag) (          \                           ((_tag) & 0x20000000)   \                           )#define IO_REPARSE_TAG_MOUNT_POINT              (0xA0000003L)       #define IO_REPARSE_TAG_HSM                      (0xC0000004L)       #define IO_REPARSE_TAG_SIS                      (0x80000007L)       #define IO_REPARSE_TAG_DFS                      (0x8000000AL)       #define IO_REPARSE_TAG_SYMLINK                  (0xA000000CL)       #define IO_REPARSE_TAG_DFSR                     (0x80000012L)       //// I/O Completion Specific Access Rights.//#define IO_COMPLETION_MODIFY_STATE  0x0002  #define IO_COMPLETION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) //// Object Manager Symbolic Link Specific Access Rights.//#define DUPLICATE_CLOSE_SOURCE      0x00000001  #define DUPLICATE_SAME_ACCESS       0x00000002  //// =========================================// Define GUIDs which represent well-known power schemes// =========================================////// Maximum Power Savings - indicates that very aggressive power savings measures will be used to help//                         stretch battery life.//// {a1841308-3541-4fab-bc81-f71556f20b4a}//DEFINE_GUID( GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A );//// No Power Savings - indicates that almost no power savings measures will be used.//// {8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c}//DEFINE_GUID( GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C );//// Typical Power Savings - indicates that fairly aggressive power savings measures will be used.//// {381b4222-f694-41f0-9685-ff5bb260df2e}//DEFINE_GUID( GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E );//// This is a special GUID that represents "no subgroup" of settings.  That is, it indicates// that settings that are in the root of the power policy hierarchy as opposed to settings// that are buried under a subgroup of settings.  This should be used when querying for// power settings that may not fall into a subgroup.//DEFINE_GUID( NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94 );//// This is a special GUID that represents "every power scheme".  That is, it indicates// that any write to this power scheme should be reflected to every scheme present.// This allows users to write a single setting once and have it apply to all schemes.  They// can then apply custom settings to specific power schemes that they care about.//DEFINE_GUID( ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0 );//// This is a special GUID that represents a 'personality' that each power scheme will have.// In other words, each power scheme will have this key indicating "I'm most like *this* base// power scheme."  This individual setting will have one of three settings:// GUID_MAX_POWER_SAVINGS// GUID_MIN_POWER_SAVINGS// GUID_TYPICAL_POWER_SAVINGS//// This allows several features:// 1. Drivers and applications can register for notification of this GUID.  So when this power//    scheme is activiated, this GUID's setting will be sent across the system and drivers/applications//    can see "GUID_MAX_POWER_SAVINGS" which will tell them in a generic fashion "get real aggressive//    about conserving power".// 2. UserB may install a driver or application which creates power settings, and UserB may modify//    those power settings.  Now UserA logs in.  How does he see those settings?  They simply don't//    exist in his private power key.  Well they do exist over in the system power key.  When we//    enumerate all the power settings in this system power key and don't find a corresponding entry//    in the user's private power key, then we can go look at this "personality" key in the users//    power scheme.  We can then go get a default value for the power setting, depending on which//    "personality" power scheme is being operated on.  Here's an example://    A. UserB installs an application that creates a power setting Seetting1//    B. UserB changes Setting1 to have a value of 50 because that's one of the possible settings//       available for setting1.//    C. UserB logs out//    D. UserA logs in and his active power scheme is some custom scheme that was derived from//       the GUID_TYPICAL_POWER_SAVINGS.  But remember that UserA has no setting1 in his //       private power key.//    E. When activating UserA's selected power scheme, all power settings in the system power key will//       be enumerated (including Setting1).//    F. The power manager will see that UserA has no Setting1 power setting in his private power scheme.//    G. The power manager will query UserA's power scheme for its personality and retrieve//       GUID_TYPICAL_POWER_SAVINGS.//    H. The power manager then looks in Setting1 in the system power key and looks in its set of default//       values for the corresponding value for GUID_TYPICAL_POWER_SAVINGS power schemes.//    I. This derived power setting is applied.DEFINE_GUID( GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7 );//// Define a special GUID which will be used to define the active power scheme.// User will register for this power setting GUID, and when the active power// scheme changes, they'll get a callback where the payload is the GUID// representing the active powerscheme.// ( 31F9F286-5084-42FE-B720-2B0264993763 }//DEFINE_GUID( GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63 );//// =========================================// Define GUIDs which represent well-known power settings// =========================================//// Video settings// --------------//// Specifies the subgroup which will contain all of the video// settings for a single policy.//DEFINE_GUID( GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99 );//// Specifies (in seconds) how long we wait after the last user input has been// recieved before we power off the video.//DEFINE_GUID( GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E );//// Specifies if the operating system should use adaptive timers (based on// previous behavior) to power down the video,//DEFINE_GUID( GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B );//// Specifies if the monitor is currently being powered or not.// 02731015-4510-4526-99E6-E5A17EBD1AEA//DEFINE_GUID( GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA );// Harddisk settings// -----------------//// Specifies the subgroup which will contain all of the harddisk// settings for a single policy.//DEFINE_GUID( GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42 );//// Specifies (in seconds) how long we wait after the last disk access// before we power off the disk.//DEFINE_GUID( GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E );//// Specifies if the operating system should use adaptive timers (based on// previous behavior) to power down the disk,//DEFINE_GUID( GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67 );// System sleep settings// ---------------------//// Specifies the subgroup which will contain all of the sleep// settings for a single policy.// { 238C9FA8-0AAD-41ED-83F4-97BE242C8F20 }//DEFINE_GUID( GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20 );//// Specifies an idle treshold percentage (0-100). The system must be this idle// over a period of time in order to idle to sleep.//DEFINE_GUID( GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70 );                                  //// Specifies (in seconds) how long we wait after the system is deemed// "idle" before moving to standby (S1, S2 or S3).//DEFINE_GUID( GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA );//// Specifies (in seconds) how long we wait after the system is deemed// "idle" before moving to hibernate (S4).//DEFINE_GUID( GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64 );//// Specifies whether or not Fast S4 should be enabled if the system supports it// 94AC6D29-73CE-41A6-809F-6363BA21B47E//DEFINE_GUID( GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E );//// Define a GUID for controlling the criticality of sleep state transitions.// Critical sleep transitions do not query applications, services or drivers// before transitioning the platform to a sleep state.//// {B7A27025-E569-46c2-A504-2B96CAD225A1}//DEFINE_GUID( GUID_CRITICAL_POWER_TRANSITION,  0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);//// Specifies if the system is entering or exiting 'away mode'.// 98A7F580-01F7-48AA-9C0F-44352C29E5C0//DEFINE_GUID( GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0 );// Specify whether away mode is allowed //// {25DFA149-5DD1-4736-B5AB-E8A37B5B8187}//DEFINE_GUID( GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87 );//// Defines a guid for enabling/disabling standby (S1-S3) states. This does not// affect hibernation (S4).//// {abfc2519-3608-4c2a-94ea-171b0ed546ab}//DEFINE_GUID( GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab );//// Defines a guid for enabling/disabling the ability to wake via RTC.//// {BD3B718A-0680-4D9D-8AB2-E1D2B4AC806D}//DEFINE_GUID( GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D );// System button actions// ---------------------////// Specifies the subgroup which will contain all of the system button// settings for a single policy.//DEFINE_GUID( GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47 );// Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to// take when the system power button is pressed.//DEFINE_GUID( GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80 );DEFINE_GUID( GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78 );//// Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to// take when the system sleep button is pressed.//DEFINE_GUID( GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB );DEFINE_GUID( GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93 );//// Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to// take when the system sleep button is pressed.// { A7066653-8D6C-40A8-910E-A1F54B84C7E5 }//DEFINE_GUID( GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5 );//// Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to// take when the system lid is closed.//DEFINE_GUID( GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36 );DEFINE_GUID( GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B );DEFINE_GUID( GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4 );// Battery Discharge Settings// --------------------------//// Specifies the subgroup which will contain all of the battery discharge// settings for a single policy.//DEFINE_GUID( GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F );//// 4 battery discharge alarm settings.//// GUID_BATTERY_DISCHARGE_ACTION_x - This is the action to take.  It is a value//                                   of type POWER_ACTION// GUID_BATTERY_DISCHARGE_LEVEL_x  - This is the battery level (%)// GUID_BATTERY_DISCHARGE_FLAGS_x  - Flags defined below://                                   POWER_ACTION_POLICY->EventCode flags//                                   BATTERY_DISCHARGE_FLAGS_EVENTCODE_MASK//                                   BATTERY_DISCHARGE_FLAGS_ENABLEDEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46 );DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69 );DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f );DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06 );DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A );DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58 );DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4 );DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA );DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82 );DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8 );DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65 );DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3 );// Processor power settings// ------------------------//// Specifies the subgroup which will contain all of the processor// settings for a single policy.//DEFINE_GUID( GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00 );DEFINE_GUID( GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36 );//// Specifies a percentage (between 0 and 100) that the processor frequency// should never go above.  For example, if this value is set to 80, then// the processor frequency will never be throttled above 80 percent of its // maximum frequency by the system.// DEFINE_GUID( GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC );//// Specifies a percentage (between 0 and 100) that the processor frequency// should not drop below.  For example, if this value is set to 50, then the// processor frequency will never be throttled below 50 percent of its// maximum frequency by the system.//DEFINE_GUID( GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C );//// Specifies processor power settings for CState policy data// {68F262A7-F621-4069-B9A5-4874169BE23C}//DEFINE_GUID( GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);//// Specifies processor power settings for PerfState policy data// {BBDC3814-18E9-4463-8A55-D197327C45C0}//DEFINE_GUID( GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);//// Specifies active vs passive cooling.  Although not directly related to// processor settings, it is the processor that gets throttled if we're doing// passive cooling, so it is fairly strongly related.// {94D3A615-A899-4AC5-AE2B-E4D8F634367F}//DEFINE_GUID( GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);// Lock Console on Wake// --------------------//// Specifies the behavior of the system when we wake from standby or// hibernate.  If this is set, then we will cause the console to lock// after we resume.//DEFINE_GUID( GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51 );// AC/DC power source// ------------------//// Specifies the power source for the system.  consumers may register for// notification when the power source changes and will be notified with// one of 3 values:// 0 - Indicates the system is being powered by an AC power source.// 1 - Indicates the system is being powered by a DC power source.// 2 - Indicates the system is being powered by a short-term DC power//     source.  For example, this would be the case if the system is//     being powed by a short-term battery supply in a backing UPS//     system.  When this value is recieved, the consumer should make//     preparations for either a system hibernate or system shutdown.//// { 5D3E9A59-E9D5-4B00-A6BD-FF34FF516548 }DEFINE_GUID( GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48 );// Lid state changes// -----------------//// Specifies the current state of the lid (open or closed). The callback won't// be called at all until a lid device is found and its current state is known.//// Values://// 0 - closed// 1 - opened//// { BA3E0F4D-B817-4094-A2D1-D56379E6A0F3 }//DEFINE_GUID( GUID_LIDSWITCH_STATE_CHANGE,  0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3 );// Battery life remaining// ----------------------//// Specifies the percentage of battery life remaining.  The consumer// may register for notification in order to track battery life in// a fine-grained manner.//// Once registered, the consumer can expect to be notified as the battery// life percentage changes.// // The consumer will recieve a value between 0 and 100 (inclusive) which// indicates percent battery life remaining.//// { A7AD8041-B45A-4CAE-87A3-EECBB468A9E1 }DEFINE_GUID( GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1 );// Notification to listeners that the system is fairly busy and won't be moving// into an idle state any time soon.  This can be used as a hint to listeners// that now might be a good time to do background tasks.//DEFINE_GUID( GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1 );// Notification to listeners that the system is fairly busy and won't be moving// into an idle state any time soon.  This can be used as a hint to listeners// that now might be a good time to do background tasks.//// { CF23F240-2A54-48D8-B114-DE1518FF052E }DEFINE_GUID( GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E );// Define a GUID that will represent the action of a direct experience button// on the platform.  Users will register for this DPPE setting and recieve// notification when the h/w button is pressed.//// { 1A689231-7399-4E9A-8F99-B71F999DB3FA }//DEFINE_GUID( GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA );// PCI Express power settings// ------------------------//// Specifies the subgroup which will contain all of the PCI Express// settings for a single policy.// // {501a4d13-42af-4429-9fd1-a8218c268e20}// DEFINE_GUID( GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20 );// Specifies the PCI Express ASPM power policy.//// {ee12f906-d277-404b-b6da-e5fa1a576df5}//DEFINE_GUID( GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5 );typedef enum _SYSTEM_POWER_STATE {    PowerSystemUnspecified = 0,    PowerSystemWorking     = 1,    PowerSystemSleeping1   = 2,    PowerSystemSleeping2   = 3,    PowerSystemSleeping3   = 4,    PowerSystemHibernate   = 5,    PowerSystemShutdown    = 6,    PowerSystemMaximum     = 7} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;#define POWER_SYSTEM_MAXIMUM 7typedef enum {    PowerActionNone = 0,    PowerActionReserved,    PowerActionSleep,    PowerActionHibernate,    PowerActionShutdown,    PowerActionShutdownReset,    PowerActionShutdownOff,    PowerActionWarmEject} POWER_ACTION, *PPOWER_ACTION;typedef enum _DEVICE_POWER_STATE {    PowerDeviceUnspecified = 0,    PowerDeviceD0,    PowerDeviceD1,    PowerDeviceD2,    PowerDeviceD3,    PowerDeviceMaximum} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;#define ES_SYSTEM_REQUIRED   ((DWORD)0x00000001)#define ES_DISPLAY_REQUIRED  ((DWORD)0x00000002)#define ES_USER_PRESENT      ((DWORD)0x00000004)#define ES_AWAYMODE_REQUIRED ((DWORD)0x00000040)#define ES_CONTINUOUS        ((DWORD)0x80000000)typedef DWORD EXECUTION_STATE;typedef enum {    LT_DONT_CARE,    LT_LOWEST_LATENCY} LATENCY_TIME;// end_ntminiport #if (NTDDI_VERSION >= NTDDI_WINXP)//-----------------------------------------------------------------------------// Device Power Information// Accessable via CM_Get_DevInst_Registry_Property_Ex(CM_DRP_DEVICE_POWER_DATA)//-----------------------------------------------------------------------------#define PDCAP_D0_SUPPORTED              0x00000001#define PDCAP_D1_SUPPORTED              0x00000002#define PDCAP_D2_SUPPORTED              0x00000004#define PDCAP_D3_SUPPORTED              0x00000008#define PDCAP_WAKE_FROM_D0_SUPPORTED    0x00000010#define PDCAP_WAKE_FROM_D1_SUPPORTED    0x00000020#define PDCAP_WAKE_FROM_D2_SUPPORTED    0x00000040#define PDCAP_WAKE_FROM_D3_SUPPORTED    0x00000080#define PDCAP_WARM_EJECT_SUPPORTED      0x00000100typedef struct CM_Power_Data_s {    DWORD               PD_Size;    DEVICE_POWER_STATE  PD_MostRecentPowerState;    DWORD               PD_Capabilities;    DWORD               PD_D1Latency;    DWORD               PD_D2Latency;    DWORD               PD_D3Latency;    DEVICE_POWER_STATE  PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM];    SYSTEM_POWER_STATE  PD_DeepestSystemWake;} CM_POWER_DATA, *PCM_POWER_DATA;#endif // (NTDDI_VERSION >= NTDDI_WINXP)// begin_wdmtypedef enum {    SystemPowerPolicyAc,    SystemPowerPolicyDc,    VerifySystemPolicyAc,    VerifySystemPolicyDc,    SystemPowerCapabilities,    SystemBatteryState,    SystemPowerStateHandler,    ProcessorStateHandler,    SystemPowerPolicyCurrent,    AdministratorPowerPolicy,    SystemReserveHiberFile,    ProcessorInformation,    SystemPowerInformation,    ProcessorStateHandler2,    LastWakeTime,                                   // Compare with KeQueryInterruptTime()    LastSleepTime,                                  // Compare with KeQueryInterruptTime()    SystemExecutionState,    SystemPowerStateNotifyHandler,    ProcessorPowerPolicyAc,    ProcessorPowerPolicyDc,    VerifyProcessorPowerPolicyAc,    VerifyProcessorPowerPolicyDc,    ProcessorPowerPolicyCurrent,    SystemPowerStateLogging,    SystemPowerLoggingEntry,    SetPowerSettingValue,    NotifyUserPowerSetting,    GetPowerTransitionVetoes,    SetPowerTransitionVeto,    SystemVideoState,    TraceApplicationPowerMessage,    TraceApplicationPowerMessageEnd,    ProcessorPerfStates,    ProcessorIdleStates,    ProcessorThrottleStates,    SystemWakeSource,    SystemHiberFileInformation,    TraceServicePowerMessage,    ProcessorLoad,    PowerShutdownNotification} POWER_INFORMATION_LEVEL;//// Power Transition Vetos//#define PO_TRANSITION_VETO_TYPE_WINDOW  0x00000001#define PO_TRANSITION_VETO_TYPE_SERVICE 0x00000002//#define PO_TRANSITION_VETO_TYPE_DRIVER  0x00000004#define PO_TRANSITION_VETO_TYPE_ALL     \    (PO_TRANSITION_VETO_TYPE_WINDOW | PO_TRANSITION_VETO_TYPE_SERVICE)    typedef struct _PO_TRANSITION_VETO_REASON {    DWORD ResourceId;    DWORD ModuleNameOffset;} PO_TRANSITION_VETO_REASON, *PPO_TRANSITION_VETO_REASON;typedef struct _PO_TRANSITION_VETO_WINDOW {    HANDLE Handle;} PO_TRANSITION_VETO_WINDOW, *PPO_TRANSITION_VETO_WINDOW;typedef struct _PO_TRANSITION_VETO_SERVICE {    DWORD ServiceNameOffset;} PO_TRANSITION_VETO_SERVICE, *PPO_TRANSITION_VETO_SERVICE;/*typedef struct _PO_TRANSITION_VETO_DRIVER {    DWORD InstancePathOffset;    DWORD DriverNameOffset;} PO_TRANSITION_VETO_DRIVER, *PPO_TRANSITION_VETO_DRIVER;*/typedef struct _PO_TRANSITION_VETO {    DWORD Type;    PO_TRANSITION_VETO_REASON Reason;    DWORD ProcessId;        union {        PO_TRANSITION_VETO_WINDOW Window;        PO_TRANSITION_VETO_SERVICE Service;        //PO_TRANSITION_VETO_DRIVER Driver;    };} PO_TRANSITION_VETO, *PPO_TRANSITION_VETO;typedef struct _PO_TRANSITION_VETOES {    DWORD Count;    PO_TRANSITION_VETO Vetoes[ANYSIZE_ARRAY];} PO_TRANSITION_VETOES, *PPO_TRANSITION_VETOES;//// Power Setting definitions//typedef enum {    PoAc,    PoDc,    PoHot,    PoConditionMaximum} SYSTEM_POWER_CONDITION;typedef struct {        //    // Version of this structure.  Currently should be set to    // POWER_SETTING_VALUE_VERSION.    //    DWORD       Version;            //    // GUID representing the power setting being applied.    //    GUID        Guid;            //    // What power state should this setting be applied to?  E.g.    // AC, DC, thermal, ...    //    SYSTEM_POWER_CONDITION PowerCondition;        //    // Length (in bytes) of the 'Data' member.    //    DWORD       DataLength;        //    // Data which contains the actual setting value.    //     BYTE    Data[ANYSIZE_ARRAY];} SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE;#define POWER_SETTING_VALUE_VERSION (0x1)typedef struct {    GUID Guid;} NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;//// Package definition for an experience button device notification.  When// someone registers for GUID_EXPERIENCE_BUTTON, this is the definition of// the setting data they'll get.//typedef struct _APPLICATIONLAUNCH_SETTING_VALUE {    //    // System time when the most recent button press ocurred.  Note that this is    // specified in 100ns internvals since January 1, 1601.    //        LARGE_INTEGER       ActivationTime;        //    // Reserved for internal use.    //    DWORD               Flags;    //    // which instance of this device was pressed?    //    DWORD               ButtonInstanceID;} APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE;//// define platform roles//typedef enum {    PlatformRoleUnspecified = 0,    PlatformRoleDesktop,    PlatformRoleMobile,    PlatformRoleWorkstation,    PlatformRoleEnterpriseServer,    PlatformRoleSOHOServer,    PlatformRoleAppliancePC,    PlatformRolePerformanceServer,    PlatformRoleMaximum} POWER_PLATFORM_ROLE;//// Wake source tracking//typedef enum {    DeviceWakeSourceType,    FixedWakeSourceType} PO_WAKE_SOURCE_TYPE, *PPO_WAKE_SOURCE_TYPE;typedef enum {    FixedWakeSourcePowerButton,    FixedWakeSourceSleepButton,    FixedWakeSourceRtc} PO_FIXED_WAKE_SOURCE_TYPE, *PPO_FIXED_WAKE_SOURCE_TYPE;typedef struct _PO_WAKE_SOURCE_HEADER {    PO_WAKE_SOURCE_TYPE Type;    DWORD Size;} PO_WAKE_SOURCE_HEADER, *PPO_WAKE_SOURCE_HEADER;typedef struct _PO_WAKE_SOURCE_DEVICE {    PO_WAKE_SOURCE_HEADER Header;    WCHAR InstancePath[ANYSIZE_ARRAY];} PO_WAKE_SOURCE_DEVICE, *PPO_WAKE_SOURCE_DEVICE;typedef struct _PO_WAKE_SOURCE_FIXED {    PO_WAKE_SOURCE_HEADER Header;    PO_FIXED_WAKE_SOURCE_TYPE FixedWakeSourceType;} PO_WAKE_SOURCE_FIXED, *PPO_WAKE_SOURCE_FIXED;typedef struct _PO_WAKE_SOURCE_INFO {    DWORD Count;    DWORD Offsets[ANYSIZE_ARRAY];} PO_WAKE_SOURCE_INFO, *PPO_WAKE_SOURCE_INFO;typedef struct _PO_WAKE_SOURCE_HISTORY {    DWORD Count;    DWORD Offsets[ANYSIZE_ARRAY];} PO_WAKE_SOURCE_HISTORY, *PPO_WAKE_SOURCE_HISTORY;//// System power manager capabilities//#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)typedef struct {    DWORD       Granularity;    DWORD       Capacity;} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;#endif // (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)//typedef struct {    BOOLEAN Enabled;    BYTE  PercentBusy[MAXIMUM_PROCESSORS];} PPM_SIMULATED_PROCESSOR_LOAD, *PPPM_SIMULATED_PROCESSOR_LOAD;typedef struct {    DWORD   Frequency;    DWORD   Flags;    DWORD   PercentFrequency;} PPM_WMI_LEGACY_PERFSTATE, *PPPM_WMI_LEGACY_PERFSTATE;typedef struct {    DWORD Latency;    DWORD Power;    DWORD TimeCheck;    BYTE  PromotePercent;    BYTE  DemotePercent;    BYTE  StateType;    BYTE  Reserved;    DWORD StateFlags;    DWORD Context;    DWORD IdleHandler;    DWORD Reserved1;            // reserved for future use} PPM_WMI_IDLE_STATE, *PPPM_WMI_IDLE_STATE;typedef struct {    DWORD Type;    DWORD Count;    DWORD TargetState;          // current idle state    DWORD OldState;             // previous idle state    DWORD64 TargetProcessors;    PPM_WMI_IDLE_STATE State[ANYSIZE_ARRAY];} PPM_WMI_IDLE_STATES, *PPPM_WMI_IDLE_STATES;typedef struct {    DWORD Frequency;            // in Mhz    DWORD Power;                // in milliwatts    BYTE  PercentFrequency;    BYTE  IncreaseLevel;        // goto higher state    BYTE  DecreaseLevel;        // goto lower state    BYTE  Type;                 // performance or throttle    DWORD IncreaseTime;         // in tick counts    DWORD DecreaseTime;         // in tick counts    DWORD64 Control;            // control value    DWORD64 Status;             // control value    DWORD HitCount;    DWORD Reserved1;            // reserved for future use    DWORD64 Reserved2;    DWORD64 Reserved3;} PPM_WMI_PERF_STATE, *PPPM_WMI_PERF_STATE;typedef struct {    DWORD Count;    DWORD MaxFrequency;    DWORD CurrentState;         // current state    DWORD MaxPerfState;         // fastest state considering policy restrictions    DWORD MinPerfState;         // slowest state considering policy restrictions    DWORD LowestPerfState;      // slowest perf state, fixed, aka the "knee"    DWORD ThermalConstraint;    BYTE  BusyAdjThreshold;    BYTE  PolicyType;           // domain coordination    BYTE  Type;    BYTE  Reserved;    DWORD TimerInterval;    DWORD64 TargetProcessors;   // domain affinity    DWORD PStateHandler;    DWORD PStateContext;    DWORD TStateHandler;    DWORD TStateContext;    DWORD FeedbackHandler;    DWORD Reserved1;    DWORD64 Reserved2;    PPM_WMI_PERF_STATE State[ANYSIZE_ARRAY];} PPM_WMI_PERF_STATES, *PPPM_WMI_PERF_STATES;//// Accounting info.//#define PROC_IDLE_BUCKET_COUNT  6typedef struct {    DWORD IdleTransitions;    DWORD FailedTransitions;    DWORD InvalidBucketIndex;    DWORD64 TotalTime;    DWORD IdleTimeBuckets[PROC_IDLE_BUCKET_COUNT];} PPM_IDLE_STATE_ACCOUNTING, *PPPM_IDLE_STATE_ACCOUNTING;typedef struct {    DWORD StateCount;    DWORD TotalTransitions;    DWORD ResetCount;    DWORD64 StartTime;    PPM_IDLE_STATE_ACCOUNTING State[ANYSIZE_ARRAY];} PPM_IDLE_ACCOUNTING, *PPPM_IDLE_ACCOUNTING;//// Definitions of coordination types for _PSD, _TSD, and _CSD BIOS objects from// the Acpi 3.0 specification//#define ACPI_PPM_SOFTWARE_ALL     0xFC#define ACPI_PPM_SOFTWARE_ANY     0xFD#define ACPI_PPM_HARDWARE_ALL     0xFE//// Definition of Microsoft PPM coordination types.//#define MS_PPM_SOFTWARE_ALL       0x1//// Processor Power Management WMI interface.//// {A5B32DDD-7F39-4abc-B892-900E43B59EBB}DEFINE_GUID(PPM_PERFSTATE_CHANGE_GUID, 0xa5b32ddd, 0x7f39, 0x4abc, 0xb8, 0x92, 0x90, 0xe, 0x43, 0xb5, 0x9e, 0xbb);// {995e6b7f-d653-497a-b978-36a30c29bf01}DEFINE_GUID(PPM_PERFSTATE_DOMAIN_CHANGE_GUID,0x995e6b7f, 0xd653, 0x497a, 0xb9, 0x78, 0x36, 0xa3, 0xc, 0x29, 0xbf, 0x1);// {4838fe4f-f71c-4e51-9ecc-8430a7ac4c6c}DEFINE_GUID(PPM_IDLESTATE_CHANGE_GUID, 0x4838fe4f, 0xf71c, 0x4e51, 0x9e, 0xcc, 0x84, 0x30, 0xa7, 0xac, 0x4c, 0x6c);// {5708cc20-7d40-4bf4-b4aa-2b01338d0126}DEFINE_GUID(PPM_PERFSTATES_DATA_GUID, 0x5708cc20, 0x7d40, 0x4bf4, 0xb4, 0xaa, 0x2b, 0x01, 0x33, 0x8d, 0x01, 0x26);// {ba138e10-e250-4ad7-8616-cf1a7ad410e7}DEFINE_GUID(PPM_IDLESTATES_DATA_GUID, 0xba138e10, 0xe250, 0x4ad7, 0x86, 0x16, 0xcf, 0x1a, 0x7a, 0xd4, 0x10, 0xe7);// {e2a26f78-ae07-4ee0-a30f-ce354f5a94cd}DEFINE_GUID(PPM_IDLE_ACCOUNTING_GUID, 0xe2a26f78, 0xae07, 0x4ee0, 0xa3, 0x0f, 0xce, 0x54, 0xf5, 0x5a, 0x94, 0xcd);// {a852c2c8-1a4c-423b-8c2c-f30d82931a88}DEFINE_GUID(PPM_THERMALCONSTRAINT_GUID, 0xa852c2c8, 0x1a4c, 0x423b, 0x8c, 0x2c, 0xf3, 0x0d, 0x82, 0x93, 0x1a, 0x88);// {7fd18652-0cfe-40d2-b0a1-0b066a87759e}DEFINE_GUID(PPM_PERFMON_PERFSTATE_GUID, 0x7fd18652, 0xcfe, 0x40d2, 0xb0, 0xa1, 0xb, 0x6, 0x6a, 0x87, 0x75, 0x9e);// {48f377b8-6880-4c7b-8bdc-380176c6654d}DEFINE_GUID(PPM_THERMAL_POLICY_CHANGE_GUID, 0x48f377b8, 0x6880, 0x4c7b, 0x8b, 0xdc, 0x38, 0x1, 0x76, 0xc6, 0x65, 0x4d);typedef struct {    DWORD State;    DWORD Status;    DWORD Latency;    DWORD Speed;    DWORD Processor;} PPM_PERFSTATE_EVENT, *PPPM_PERFSTATE_EVENT;typedef struct {    DWORD State;    DWORD Latency;    DWORD Speed;    DWORD64 Processors;} PPM_PERFSTATE_DOMAIN_EVENT, *PPPM_PERFSTATE_DOMAIN_EVENT;typedef struct {    DWORD NewState;    DWORD OldState;    DWORD64 Processors;} PPM_IDLESTATE_EVENT, *PPPM_IDLESTATE_EVENT;typedef struct {    DWORD ThermalConstraint;    DWORD64 Processors;} PPM_THERMALCHANGE_EVENT, *PPPM_THERMALCHANGE_EVENT;#pragma warning(push)#pragma warning(disable:4121)typedef struct {    BYTE  Mode;    DWORD64 Processors;} PPM_THERMAL_POLICY_EVENT, *PPPM_THERMAL_POLICY_EVENT;#pragma warning(pop)       // Power Policy Management interfaces//typedef struct {    POWER_ACTION    Action;    DWORD           Flags;    DWORD           EventCode;} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;// POWER_ACTION_POLICY->Flags:#define POWER_ACTION_QUERY_ALLOWED      0x00000001#define POWER_ACTION_UI_ALLOWED         0x00000002#define POWER_ACTION_OVERRIDE_APPS      0x00000004#define POWER_ACTION_LIGHTEST_FIRST     0x10000000#define POWER_ACTION_LOCK_CONSOLE       0x20000000#define POWER_ACTION_DISABLE_WAKES      0x40000000#define POWER_ACTION_CRITICAL           0x80000000// POWER_ACTION_POLICY->EventCode flags#define POWER_LEVEL_USER_NOTIFY_TEXT    0x00000001#define POWER_LEVEL_USER_NOTIFY_SOUND   0x00000002#define POWER_LEVEL_USER_NOTIFY_EXEC    0x00000004#define POWER_USER_NOTIFY_BUTTON        0x00000008#define POWER_USER_NOTIFY_SHUTDOWN      0x00000010#define POWER_FORCE_TRIGGER_RESET       0x80000000// Note: for battery alarm EventCodes, the ID of the battery alarm << 16 is ORed// into the flags.  For example: DISCHARGE_POLICY_LOW << 16//// The GUID_BATTERY_DISCHARGE_FLAGS_x power settings use a subset of EventCode// flags.  The POWER_FORCE_TRIGGER_RESET flag doesn't make sense for a battery// alarm so it is overloaded for other purposes (gerneral enable/disable).#define BATTERY_DISCHARGE_FLAGS_EVENTCODE_MASK  0x00000007#define BATTERY_DISCHARGE_FLAGS_ENABLE  0x80000000// system battery drain policiestypedef struct {    BOOLEAN                 Enable;    BYTE                    Spare[3];    DWORD                   BatteryLevel;    POWER_ACTION_POLICY     PowerPolicy;    SYSTEM_POWER_STATE      MinSystemState;} SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;// Discharge policy constants#define NUM_DISCHARGE_POLICIES      4#define DISCHARGE_POLICY_CRITICAL   0#define DISCHARGE_POLICY_LOW        1// system power policiestypedef struct _SYSTEM_POWER_POLICY {    DWORD                   Revision;       // 1    // events    POWER_ACTION_POLICY     PowerButton;    POWER_ACTION_POLICY     SleepButton;    POWER_ACTION_POLICY     LidClose;    SYSTEM_POWER_STATE      LidOpenWake;    DWORD                   Reserved;    // "system idle" detection    POWER_ACTION_POLICY     Idle;    DWORD                   IdleTimeout;    BYTE                    IdleSensitivity;    BYTE                    DynamicThrottle;    BYTE                    Spare2[2];    // meaning of power action "sleep"    SYSTEM_POWER_STATE      MinSleep;    SYSTEM_POWER_STATE      MaxSleep;    SYSTEM_POWER_STATE      ReducedLatencySleep;    DWORD                   WinLogonFlags;    DWORD                   Spare3;    // parameters for dozing    //    DWORD                   DozeS4Timeout;    // battery policies    DWORD                   BroadcastCapacityResolution;    SYSTEM_POWER_LEVEL      DischargePolicy[NUM_DISCHARGE_POLICIES];    // video policies    DWORD                   VideoTimeout;    BOOLEAN                 VideoDimDisplay;    DWORD                   VideoReserved[3];    // hard disk policies    DWORD                   SpindownTimeout;    // processor policies    BOOLEAN                 OptimizeForPower;    BYTE                    FanThrottleTolerance;    BYTE                    ForcedThrottle;    BYTE                    MinThrottle;    POWER_ACTION_POLICY     OverThrottled;} SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;// processor power policy state//// Processor Idle State Policy.//#define PROCESSOR_IDLESTATE_POLICY_COUNT 0x3typedef struct {    DWORD TimeCheck;    BYTE  DemotePercent;    BYTE  PromotePercent;    BYTE  Spare[2];} PROCESSOR_IDLESTATE_INFO, *PPROCESSOR_IDLESTATE_INFO;typedef struct {    WORD   Revision;    union {        WORD   AsWORD  ;        struct {            WORD   AllowScaling : 1;            WORD   Disabled : 1;            WORD   Reserved : 14;        };    } Flags;    DWORD PolicyCount;    PROCESSOR_IDLESTATE_INFO Policy[PROCESSOR_IDLESTATE_POLICY_COUNT];} PROCESSOR_IDLESTATE_POLICY, *PPROCESSOR_IDLESTATE_POLICY;//// Legacy Processor Policy.  This is only provided to allow legacy // applications to compile.  New applications must use // PROCESSOR_IDLESTATE_POLICY.//#define PO_THROTTLE_NONE            0#define PO_THROTTLE_CONSTANT        1#define PO_THROTTLE_DEGRADE         2#define PO_THROTTLE_ADAPTIVE        3#define PO_THROTTLE_MAXIMUM         4   // not a policy, just a limittypedef struct _PROCESSOR_POWER_POLICY_INFO {    // Time based information (will be converted to kernel units)    DWORD                   TimeCheck;                      // in US    DWORD                   DemoteLimit;                    // in US    DWORD                   PromoteLimit;                   // in US    // Percentage based information    BYTE                    DemotePercent;    BYTE                    PromotePercent;    BYTE                    Spare[2];    // Flags    DWORD                   AllowDemotion:1;    DWORD                   AllowPromotion:1;    DWORD                   Reserved:30;} PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;// processor power policytypedef struct _PROCESSOR_POWER_POLICY {    DWORD                       Revision;       // 1    // Dynamic Throttling Policy    BYTE                        DynamicThrottle;    BYTE                        Spare[3];    // Flags    DWORD                       DisableCStates:1;    DWORD                       Reserved:31;    // System policy information    // The Array is last, in case it needs to be grown and the structure    // revision incremented.    DWORD                       PolicyCount;    PROCESSOR_POWER_POLICY_INFO Policy[3];} PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;//// Processor Perf State Policy.//#define PERFSTATE_POLICY_CHANGE_IDEAL  0x00#define PERFSTATE_POLICY_CHANGE_SINGLE 0x01#define PERFSTATE_POLICY_CHANGE_ROCKET 0x02#define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKETtypedef struct {    DWORD Revision;    BYTE  MaxThrottle;    BYTE  MinThrottle;    BYTE  BusyAdjThreshold;    union {        BYTE  Spare;        union {            BYTE  AsBYTE ;            struct {                BYTE  NoDomainAccounting : 1;                BYTE  IncreasePolicy: 2;                BYTE  DecreasePolicy: 2;                BYTE  Reserved : 3;            };        } Flags;    };        DWORD TimeCheck;    DWORD IncreaseTime;    DWORD DecreaseTime;    DWORD IncreasePercent;    DWORD DecreasePercent;} PROCESSOR_PERFSTATE_POLICY, *PPROCESSOR_PERFSTATE_POLICY;// administrator power policy overridestypedef struct _ADMINISTRATOR_POWER_POLICY {    // meaning of power action "sleep"    SYSTEM_POWER_STATE      MinSleep;    SYSTEM_POWER_STATE      MaxSleep;    // video policies    DWORD                   MinVideoTimeout;    DWORD                   MaxVideoTimeout;    // disk policies    DWORD                   MinSpindownTimeout;    DWORD                   MaxSpindownTimeout;} ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;typedef struct {    // Misc supported system features    BOOLEAN             PowerButtonPresent;    BOOLEAN             SleepButtonPresent;    BOOLEAN             LidPresent;    BOOLEAN             SystemS1;    BOOLEAN             SystemS2;    BOOLEAN             SystemS3;    BOOLEAN             SystemS4;           // hibernate    BOOLEAN             SystemS5;           // off    BOOLEAN             HiberFilePresent;    BOOLEAN             FullWake;    BOOLEAN             VideoDimPresent;    BOOLEAN             ApmPresent;    BOOLEAN             UpsPresent;    // Processors    BOOLEAN             ThermalControl;    BOOLEAN             ProcessorThrottle;    BYTE                ProcessorMinThrottle;    #if (NTDDI_VERSION < NTDDI_WINXP)    BYTE                ProcessorThrottleScale;    BYTE                spare2[4];#else    BYTE                ProcessorMaxThrottle;    BOOLEAN             FastSystemS4;    BYTE                spare2[3];#endif // (NTDDI_VERSION < NTDDI_WINXP)    // Disk    BOOLEAN             DiskSpinDown;    BYTE                spare3[8];    // System Battery    BOOLEAN             SystemBatteriesPresent;    BOOLEAN             BatteriesAreShortTerm;    BATTERY_REPORTING_SCALE BatteryScale[3];    // Wake    SYSTEM_POWER_STATE  AcOnLineWake;    SYSTEM_POWER_STATE  SoftLidWake;    SYSTEM_POWER_STATE  RtcWake;    SYSTEM_POWER_STATE  MinDeviceWakeState; // note this may change on driver load    SYSTEM_POWER_STATE  DefaultLowLatencyWake;} SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;typedef struct {    BOOLEAN             AcOnLine;    BOOLEAN             BatteryPresent;    BOOLEAN             Charging;    BOOLEAN             Discharging;    BOOLEAN             Spare1[4];    DWORD               MaxCapacity;    DWORD               RemainingCapacity;    DWORD               Rate;    DWORD               EstimatedTime;    DWORD               DefaultAlert1;    DWORD               DefaultAlert2;} SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;//// Image Format//#ifndef _MAC#include "pshpack4.h"                   // 4 byte packing is the default#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ#define IMAGE_OS2_SIGNATURE                 0x454E      // NE#define IMAGE_OS2_SIGNATURE_LE              0x454C      // LE#define IMAGE_VXD_SIGNATURE                 0x454C      // LE#define IMAGE_NT_SIGNATURE                  0x00004550  // PE00#include "pshpack2.h"                   // 16 bit headers are 2 byte packed#else#include "pshpack1.h"#define IMAGE_DOS_SIGNATURE                 0x4D5A      // MZ#define IMAGE_OS2_SIGNATURE                 0x4E45      // NE#define IMAGE_OS2_SIGNATURE_LE              0x4C45      // LE#define IMAGE_NT_SIGNATURE                  0x50450000  // PE00#endiftypedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header    WORD   e_magic;                     // Magic number    WORD   e_cblp;                      // Bytes on last page of file    WORD   e_cp;                        // Pages in file    WORD   e_crlc;                      // Relocations    WORD   e_cparhdr;                   // Size of header in paragraphs    WORD   e_minalloc;                  // Minimum extra paragraphs needed    WORD   e_maxalloc;                  // Maximum extra paragraphs needed    WORD   e_ss;                        // Initial (relative) SS value    WORD   e_sp;                        // Initial SP value    WORD   e_csum;                      // Checksum    WORD   e_ip;                        // Initial IP value    WORD   e_cs;                        // Initial (relative) CS value    WORD   e_lfarlc;                    // File address of relocation table    WORD   e_ovno;                      // Overlay number    WORD   e_res[4];                    // Reserved words    WORD   e_oemid;                     // OEM identifier (for e_oeminfo)    WORD   e_oeminfo;                   // OEM information; e_oemid specific    WORD   e_res2[10];                  // Reserved words    LONG   e_lfanew;                    // File address of new exe header  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;typedef struct _IMAGE_OS2_HEADER {      // OS/2 .EXE header    WORD   ne_magic;                    // Magic number    CHAR   ne_ver;                      // Version number    CHAR   ne_rev;                      // Revision number    WORD   ne_enttab;                   // Offset of Entry Table    WORD   ne_cbenttab;                 // Number of bytes in Entry Table    LONG   ne_crc;                      // Checksum of whole file    WORD   ne_flags;                    // Flag word    WORD   ne_autodata;                 // Automatic data segment number    WORD   ne_heap;                     // Initial heap allocation    WORD   ne_stack;                    // Initial stack allocation    LONG   ne_csip;                     // Initial CS:IP setting    LONG   ne_sssp;                     // Initial SS:SP setting    WORD   ne_cseg;                     // Count of file segments    WORD   ne_cmod;                     // Entries in Module Reference Table    WORD   ne_cbnrestab;                // Size of non-resident name table    WORD   ne_segtab;                   // Offset of Segment Table    WORD   ne_rsrctab;                  // Offset of Resource Table    WORD   ne_restab;                   // Offset of resident name table    WORD   ne_modtab;                   // Offset of Module Reference Table    WORD   ne_imptab;                   // Offset of Imported Names Table    LONG   ne_nrestab;                  // Offset of Non-resident Names Table    WORD   ne_cmovent;                  // Count of movable entries    WORD   ne_align;                    // Segment alignment shift count    WORD   ne_cres;                     // Count of resource segments    BYTE   ne_exetyp;                   // Target Operating system    BYTE   ne_flagsothers;              // Other .EXE flags    WORD   ne_pretthunks;               // offset to return thunks    WORD   ne_psegrefbytes;             // offset to segment ref. bytes    WORD   ne_swaparea;                 // Minimum code swap area size    WORD   ne_expver;                   // Expected Windows version number  } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;typedef struct _IMAGE_VXD_HEADER {      // Windows VXD header    WORD   e32_magic;                   // Magic number    BYTE   e32_border;                  // The byte ordering for the VXD    BYTE   e32_worder;                  // The word ordering for the VXD    DWORD  e32_level;                   // The EXE format level for now = 0    WORD   e32_cpu;                     // The CPU type    WORD   e32_os;                      // The OS type    DWORD  e32_ver;                     // Module version    DWORD  e32_mflags;                  // Module flags    DWORD  e32_mpages;                  // Module # pages    DWORD  e32_startobj;                // Object # for instruction pointer    DWORD  e32_eip;                     // Extended instruction pointer    DWORD  e32_stackobj;                // Object # for stack pointer    DWORD  e32_esp;                     // Extended stack pointer    DWORD  e32_pagesize;                // VXD page size    DWORD  e32_lastpagesize;            // Last page size in VXD    DWORD  e32_fixupsize;               // Fixup section size    DWORD  e32_fixupsum;                // Fixup section checksum    DWORD  e32_ldrsize;                 // Loader section size    DWORD  e32_ldrsum;                  // Loader section checksum    DWORD  e32_objtab;                  // Object table offset    DWORD  e32_objcnt;                  // Number of objects in module    DWORD  e32_objmap;                  // Object page map offset    DWORD  e32_itermap;                 // Object iterated data map offset    DWORD  e32_rsrctab;                 // Offset of Resource Table    DWORD  e32_rsrccnt;                 // Number of resource entries    DWORD  e32_restab;                  // Offset of resident name table    DWORD  e32_enttab;                  // Offset of Entry Table    DWORD  e32_dirtab;                  // Offset of Module Directive Table    DWORD  e32_dircnt;                  // Number of module directives    DWORD  e32_fpagetab;                // Offset of Fixup Page Table    DWORD  e32_frectab;                 // Offset of Fixup Record Table    DWORD  e32_impmod;                  // Offset of Import Module Name Table    DWORD  e32_impmodcnt;               // Number of entries in Import Module Name Table    DWORD  e32_impproc;                 // Offset of Import Procedure Name Table    DWORD  e32_pagesum;                 // Offset of Per-Page Checksum Table    DWORD  e32_datapage;                // Offset of Enumerated Data Pages    DWORD  e32_preload;                 // Number of preload pages    DWORD  e32_nrestab;                 // Offset of Non-resident Names Table    DWORD  e32_cbnrestab;               // Size of Non-resident Name Table    DWORD  e32_nressum;                 // Non-resident Name Table Checksum    DWORD  e32_autodata;                // Object # for automatic data object    DWORD  e32_debuginfo;               // Offset of the debugging information    DWORD  e32_debuglen;                // The length of the debugging info. in bytes    DWORD  e32_instpreload;             // Number of instance pages in preload section of VXD file    DWORD  e32_instdemand;              // Number of instance pages in demand load section of VXD file    DWORD  e32_heapsize;                // Size of heap - for 16-bit apps    BYTE   e32_res3[12];                // Reserved words    DWORD  e32_winresoff;    DWORD  e32_winreslen;    WORD   e32_devid;                   // Device ID for VxD    WORD   e32_ddkver;                  // DDK version for VxD  } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;#ifndef _MAC#include "poppack.h"                    // Back to 4 byte packing#endif//// File header format.//typedef struct _IMAGE_FILE_HEADER {    WORD    Machine;    WORD    NumberOfSections;    DWORD   TimeDateStamp;    DWORD   PointerToSymbolTable;    DWORD   NumberOfSymbols;    WORD    SizeOfOptionalHeader;    WORD    Characteristics;} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;#define IMAGE_SIZEOF_FILE_HEADER             20#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references).#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file.#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // If Image is on Net, copy and run from the swap file.#define IMAGE_FILE_SYSTEM                    0x1000  // System File.#define IMAGE_FILE_DLL                       0x2000  // File is a DLL.#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // File should only be run on a UP machine#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.#define IMAGE_FILE_MACHINE_UNKNOWN           0#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian#define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2#define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian#define IMAGE_FILE_MACHINE_SH3DSP            0x01a3#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian#define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian#define IMAGE_FILE_MACHINE_THUMB             0x01c2#define IMAGE_FILE_MACHINE_AM33              0x01d3#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64#define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon#define IMAGE_FILE_MACHINE_CEF               0x0CEF#define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian#define IMAGE_FILE_MACHINE_CEE               0xC0EE//// Directory format.//typedef struct _IMAGE_DATA_DIRECTORY {    DWORD   VirtualAddress;    DWORD   Size;} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16//// Optional header format.//typedef struct _IMAGE_OPTIONAL_HEADER {    //    // Standard fields.    //    WORD    Magic;    BYTE    MajorLinkerVersion;    BYTE    MinorLinkerVersion;    DWORD   SizeOfCode;    DWORD   SizeOfInitializedData;    DWORD   SizeOfUninitializedData;    DWORD   AddressOfEntryPoint;    DWORD   BaseOfCode;    DWORD   BaseOfData;    //    // NT additional fields.    //    DWORD   ImageBase;    DWORD   SectionAlignment;    DWORD   FileAlignment;    WORD    MajorOperatingSystemVersion;    WORD    MinorOperatingSystemVersion;    WORD    MajorImageVersion;    WORD    MinorImageVersion;    WORD    MajorSubsystemVersion;    WORD    MinorSubsystemVersion;    DWORD   Win32VersionValue;    DWORD   SizeOfImage;    DWORD   SizeOfHeaders;    DWORD   CheckSum;    WORD    Subsystem;    WORD    DllCharacteristics;    DWORD   SizeOfStackReserve;    DWORD   SizeOfStackCommit;    DWORD   SizeOfHeapReserve;    DWORD   SizeOfHeapCommit;    DWORD   LoaderFlags;    DWORD   NumberOfRvaAndSizes;    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;typedef struct _IMAGE_ROM_OPTIONAL_HEADER {    WORD   Magic;    BYTE   MajorLinkerVersion;    BYTE   MinorLinkerVersion;    DWORD  SizeOfCode;    DWORD  SizeOfInitializedData;    DWORD  SizeOfUninitializedData;    DWORD  AddressOfEntryPoint;    DWORD  BaseOfCode;    DWORD  BaseOfData;    DWORD  BaseOfBss;    DWORD  GprMask;    DWORD  CprMask[4];    DWORD  GpValue;} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;typedef struct _IMAGE_OPTIONAL_HEADER64 {    WORD        Magic;    BYTE        MajorLinkerVersion;    BYTE        MinorLinkerVersion;    DWORD       SizeOfCode;    DWORD       SizeOfInitializedData;    DWORD       SizeOfUninitializedData;    DWORD       AddressOfEntryPoint;    DWORD       BaseOfCode;    ULONGLONG   ImageBase;    DWORD       SectionAlignment;    DWORD       FileAlignment;    WORD        MajorOperatingSystemVersion;    WORD        MinorOperatingSystemVersion;    WORD        MajorImageVersion;    WORD        MinorImageVersion;    WORD        MajorSubsystemVersion;    WORD        MinorSubsystemVersion;    DWORD       Win32VersionValue;    DWORD       SizeOfImage;    DWORD       SizeOfHeaders;    DWORD       CheckSum;    WORD        Subsystem;    WORD        DllCharacteristics;    ULONGLONG   SizeOfStackReserve;    ULONGLONG   SizeOfStackCommit;    ULONGLONG   SizeOfHeapReserve;    ULONGLONG   SizeOfHeapCommit;    DWORD       LoaderFlags;    DWORD       NumberOfRvaAndSizes;    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;#define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10b#define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b#define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107#ifdef _WIN64typedef IMAGE_OPTIONAL_HEADER64             IMAGE_OPTIONAL_HEADER;typedef PIMAGE_OPTIONAL_HEADER64            PIMAGE_OPTIONAL_HEADER;#define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR64_MAGIC#elsetypedef IMAGE_OPTIONAL_HEADER32             IMAGE_OPTIONAL_HEADER;typedef PIMAGE_OPTIONAL_HEADER32            PIMAGE_OPTIONAL_HEADER;#define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR32_MAGIC#endiftypedef struct _IMAGE_NT_HEADERS64 {    DWORD Signature;    IMAGE_FILE_HEADER FileHeader;    IMAGE_OPTIONAL_HEADER64 OptionalHeader;} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;typedef struct _IMAGE_NT_HEADERS {    DWORD Signature;    IMAGE_FILE_HEADER FileHeader;    IMAGE_OPTIONAL_HEADER32 OptionalHeader;} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;typedef struct _IMAGE_ROM_HEADERS {    IMAGE_FILE_HEADER FileHeader;    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;#ifdef _WIN64typedef IMAGE_NT_HEADERS64                  IMAGE_NT_HEADERS;typedef PIMAGE_NT_HEADERS64                 PIMAGE_NT_HEADERS;#elsetypedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;#endif// IMAGE_FIRST_SECTION doesn't need 32/64 versions since the file header is the same either way.#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)        \    ((ULONG_PTR)ntheader +                                              \     FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +                 \     ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader   \    ))// Subsystem Values#define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.#define IMAGE_SUBSYSTEM_NATIVE               1   // Image doesn't require a subsystem.#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Image runs in the Windows GUI subsystem.#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Image runs in the Windows character subsystem.#define IMAGE_SUBSYSTEM_OS2_CUI              5   // image runs in the OS/2 character subsystem.#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // image runs in the Posix character subsystem.#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // image is a native Win9x driver.#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Image runs in the Windows CE subsystem.#define IMAGE_SUBSYSTEM_EFI_APPLICATION      10  //#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER  11   //#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER   12  //#define IMAGE_SUBSYSTEM_EFI_ROM              13#define IMAGE_SUBSYSTEM_XBOX                 14#define IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION 16// DllCharacteristics Entries//      IMAGE_LIBRARY_PROCESS_INIT            0x0001     // Reserved.//      IMAGE_LIBRARY_PROCESS_TERM            0x0002     // Reserved.//      IMAGE_LIBRARY_THREAD_INIT             0x0004     // Reserved.//      IMAGE_LIBRARY_THREAD_TERM             0x0008     // Reserved.#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040     // DLL can move.#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY    0x0080     // Code Integrity Image#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT    0x0100     // Image is NX compatible#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200     // Image understands isolation and doesn't want it#define IMAGE_DLLCHARACTERISTICS_NO_SEH       0x0400     // Image does not use SEH.  No SE handler may reside in this image#define IMAGE_DLLCHARACTERISTICS_NO_BIND      0x0800     // Do not bind this image.//                                            0x1000     // Reserved.#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER   0x2000     // Driver uses WDM model//                                            0x4000     // Reserved.#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE     0x8000// Directory Entries#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers#define IMAGE_DIRECTORY_ENTRY_IAT            12   // Import Address Table#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor//// Non-COFF Object file header//typedef struct ANON_OBJECT_HEADER {    WORD    Sig1;            // Must be IMAGE_FILE_MACHINE_UNKNOWN    WORD    Sig2;            // Must be 0xffff    WORD    Version;         // >= 1 (implies the CLSID field is present)    WORD    Machine;    DWORD   TimeDateStamp;    CLSID   ClassID;         // Used to invoke CoCreateInstance    DWORD   SizeOfData;      // Size of data that follows the header} ANON_OBJECT_HEADER;typedef struct ANON_OBJECT_HEADER_V2 {    WORD    Sig1;            // Must be IMAGE_FILE_MACHINE_UNKNOWN    WORD    Sig2;            // Must be 0xffff    WORD    Version;         // >= 2 (implies the Flags field is present - otherwise V1)    WORD    Machine;    DWORD   TimeDateStamp;    CLSID   ClassID;         // Used to invoke CoCreateInstance    DWORD   SizeOfData;      // Size of data that follows the header    DWORD   Flags;           // 0x1 -> contains metadata    DWORD   MetaDataSize;    // Size of CLR metadata    DWORD   MetaDataOffset;  // Offset of CLR metadata} ANON_OBJECT_HEADER_V2;//// Section header format.//#define IMAGE_SIZEOF_SHORT_NAME              8typedef struct _IMAGE_SECTION_HEADER {    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];    union {            DWORD   PhysicalAddress;            DWORD   VirtualSize;    } Misc;    DWORD   VirtualAddress;    DWORD   SizeOfRawData;    DWORD   PointerToRawData;    DWORD   PointerToRelocations;    DWORD   PointerToLinenumbers;    WORD    NumberOfRelocations;    WORD    NumberOfLinenumbers;    DWORD   Characteristics;} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;#define IMAGE_SIZEOF_SECTION_HEADER          40//// Section characteristics.////      IMAGE_SCN_TYPE_REG                   0x00000000  // Reserved.//      IMAGE_SCN_TYPE_DSECT                 0x00000001  // Reserved.//      IMAGE_SCN_TYPE_NOLOAD                0x00000002  // Reserved.//      IMAGE_SCN_TYPE_GROUP                 0x00000004  // Reserved.#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.//      IMAGE_SCN_TYPE_COPY                  0x00000010  // Reserved.#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.#define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.#define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.//      IMAGE_SCN_TYPE_OVER                  0x00000400  // Reserved.#define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.#define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.//                                           0x00002000  // Reserved.//      IMAGE_SCN_MEM_PROTECTED - Obsolete   0x00004000#define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000  // Reset speculative exceptions handling bits in the TLB entries for this section.#define IMAGE_SCN_GPREL                      0x00008000  // Section content can be accessed relative to GP#define IMAGE_SCN_MEM_FARDATA                0x00008000//      IMAGE_SCN_MEM_SYSHEAP  - Obsolete    0x00010000#define IMAGE_SCN_MEM_PURGEABLE              0x00020000#define IMAGE_SCN_MEM_16BIT                  0x00020000#define IMAGE_SCN_MEM_LOCKED                 0x00040000#define IMAGE_SCN_MEM_PRELOAD                0x00080000#define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //#define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //#define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //#define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.#define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //#define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //#define IMAGE_SCN_ALIGN_128BYTES             0x00800000  //#define IMAGE_SCN_ALIGN_256BYTES             0x00900000  //#define IMAGE_SCN_ALIGN_512BYTES             0x00A00000  //#define IMAGE_SCN_ALIGN_1024BYTES            0x00B00000  //#define IMAGE_SCN_ALIGN_2048BYTES            0x00C00000  //#define IMAGE_SCN_ALIGN_4096BYTES            0x00D00000  //#define IMAGE_SCN_ALIGN_8192BYTES            0x00E00000  //// Unused                                    0x00F00000#define IMAGE_SCN_ALIGN_MASK                 0x00F00000#define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  // Section contains extended relocations.#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.//// TLS Chaacteristic Flags//#define IMAGE_SCN_SCALE_INDEX                0x00000001  // Tls index is scaled#ifndef _MAC#include "pshpack2.h"                       // Symbols, relocs, and linenumbers are 2 byte packed#endif//// Symbol format.//typedef struct _IMAGE_SYMBOL {    union {        BYTE    ShortName[8];        struct {            DWORD   Short;     // if 0, use LongName            DWORD   Long;      // offset into string table        } Name;        DWORD   LongName[2];    // PBYTE [2]    } N;    DWORD   Value;    SHORT   SectionNumber;    WORD    Type;    BYTE    StorageClass;    BYTE    NumberOfAuxSymbols;} IMAGE_SYMBOL;typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;#define IMAGE_SIZEOF_SYMBOL                  18//// Section values.//// Symbols have a section number of the section in which they are// defined. Otherwise, section numbers have the following meanings://#define IMAGE_SYM_UNDEFINED           (SHORT)0          // Symbol is undefined or is common.#define IMAGE_SYM_ABSOLUTE            (SHORT)-1         // Symbol is an absolute value.#define IMAGE_SYM_DEBUG               (SHORT)-2         // Symbol is a special debug item.#define IMAGE_SYM_SECTION_MAX         0xFEFF            // Values 0xFF00-0xFFFF are special//// Type (fundamental) values.//#define IMAGE_SYM_TYPE_NULL                 0x0000  // no type.#define IMAGE_SYM_TYPE_VOID                 0x0001  //#define IMAGE_SYM_TYPE_CHAR                 0x0002  // type character.#define IMAGE_SYM_TYPE_SHORT                0x0003  // type short integer.#define IMAGE_SYM_TYPE_INT                  0x0004  //#define IMAGE_SYM_TYPE_LONG                 0x0005  //#define IMAGE_SYM_TYPE_FLOAT                0x0006  //#define IMAGE_SYM_TYPE_DOUBLE               0x0007  //#define IMAGE_SYM_TYPE_STRUCT               0x0008  //#define IMAGE_SYM_TYPE_UNION                0x0009  //#define IMAGE_SYM_TYPE_ENUM                 0x000A  // enumeration.#define IMAGE_SYM_TYPE_MOE                  0x000B  // member of enumeration.#define IMAGE_SYM_TYPE_BYTE                 0x000C  //#define IMAGE_SYM_TYPE_WORD                 0x000D  //#define IMAGE_SYM_TYPE_UINT                 0x000E  //#define IMAGE_SYM_TYPE_DWORD                0x000F  //#define IMAGE_SYM_TYPE_PCODE                0x8000  ////// Type (derived) values.//#define IMAGE_SYM_DTYPE_NULL                0       // no derived type.#define IMAGE_SYM_DTYPE_POINTER             1       // pointer.#define IMAGE_SYM_DTYPE_FUNCTION            2       // function.#define IMAGE_SYM_DTYPE_ARRAY               3       // array.//// Storage classes.//#define IMAGE_SYM_CLASS_END_OF_FUNCTION     (BYTE )-1#define IMAGE_SYM_CLASS_NULL                0x0000#define IMAGE_SYM_CLASS_AUTOMATIC           0x0001#define IMAGE_SYM_CLASS_EXTERNAL            0x0002#define IMAGE_SYM_CLASS_STATIC              0x0003#define IMAGE_SYM_CLASS_REGISTER            0x0004#define IMAGE_SYM_CLASS_EXTERNAL_DEF        0x0005#define IMAGE_SYM_CLASS_LABEL               0x0006#define IMAGE_SYM_CLASS_UNDEFINED_LABEL     0x0007#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT    0x0008#define IMAGE_SYM_CLASS_ARGUMENT            0x0009#define IMAGE_SYM_CLASS_STRUCT_TAG          0x000A#define IMAGE_SYM_CLASS_MEMBER_OF_UNION     0x000B#define IMAGE_SYM_CLASS_UNION_TAG           0x000C#define IMAGE_SYM_CLASS_TYPE_DEFINITION     0x000D#define IMAGE_SYM_CLASS_UNDEFINED_STATIC    0x000E#define IMAGE_SYM_CLASS_ENUM_TAG            0x000F#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM      0x0010#define IMAGE_SYM_CLASS_REGISTER_PARAM      0x0011#define IMAGE_SYM_CLASS_BIT_FIELD           0x0012#define IMAGE_SYM_CLASS_FAR_EXTERNAL        0x0044  //#define IMAGE_SYM_CLASS_BLOCK               0x0064#define IMAGE_SYM_CLASS_FUNCTION            0x0065#define IMAGE_SYM_CLASS_END_OF_STRUCT       0x0066#define IMAGE_SYM_CLASS_FILE                0x0067// new#define IMAGE_SYM_CLASS_SECTION             0x0068#define IMAGE_SYM_CLASS_WEAK_EXTERNAL       0x0069#define IMAGE_SYM_CLASS_CLR_TOKEN           0x006B// type packing constants#define N_BTMASK                            0x000F#define N_TMASK                             0x0030#define N_TMASK1                            0x00C0#define N_TMASK2                            0x00F0#define N_BTSHFT                            4#define N_TSHIFT                            2// MACROS// Basic Type of  x#define BTYPE(x) ((x) & N_BTMASK)// Is x a pointer?#ifndef ISPTR#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))#endif// Is x a function?#ifndef ISFCN#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))#endif// Is x an array?#ifndef ISARY#define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))#endif// Is x a structure, union, or enumeration TAG?#ifndef ISTAG#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)#endif#ifndef INCREF#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))#endif#ifndef DECREF#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))#endif//// Auxiliary entry format.//typedef union _IMAGE_AUX_SYMBOL {    struct {        DWORD    TagIndex;                      // struct, union, or enum tag index        union {            struct {                WORD    Linenumber;             // declaration line number                WORD    Size;                   // size of struct, union, or enum            } LnSz;           DWORD    TotalSize;        } Misc;        union {            struct {                            // if ISFCN, tag, or .bb                DWORD    PointerToLinenumber;                DWORD    PointerToNextFunction;            } Function;            struct {                            // if ISARY, up to 4 dimen.                WORD     Dimension[4];            } Array;        } FcnAry;        WORD    TvIndex;                        // tv index    } Sym;    struct {        BYTE    Name[IMAGE_SIZEOF_SYMBOL];    } File;    struct {        DWORD   Length;                         // section length        WORD    NumberOfRelocations;            // number of relocation entries        WORD    NumberOfLinenumbers;            // number of line numbers        DWORD   CheckSum;                       // checksum for communal        SHORT   Number;                         // section number to associate with        BYTE    Selection;                      // communal selection type    } Section;} IMAGE_AUX_SYMBOL;typedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL;typedef enum IMAGE_AUX_SYMBOL_TYPE {    IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1,} IMAGE_AUX_SYMBOL_TYPE;#include <pshpack2.h>typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {    BYTE  bAuxType;                  // IMAGE_AUX_SYMBOL_TYPE    BYTE  bReserved;                 // Must be 0    DWORD SymbolTableIndex;    BYTE  rgbReserved[12];           // Must be 0} IMAGE_AUX_SYMBOL_TOKEN_DEF;typedef IMAGE_AUX_SYMBOL_TOKEN_DEF UNALIGNED *PIMAGE_AUX_SYMBOL_TOKEN_DEF;#include <poppack.h>//// Communal selection types.//#define IMAGE_COMDAT_SELECT_NODUPLICATES    1#define IMAGE_COMDAT_SELECT_ANY             2#define IMAGE_COMDAT_SELECT_SAME_SIZE       3#define IMAGE_COMDAT_SELECT_EXACT_MATCH     4#define IMAGE_COMDAT_SELECT_ASSOCIATIVE     5#define IMAGE_COMDAT_SELECT_LARGEST         6#define IMAGE_COMDAT_SELECT_NEWEST          7#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3//// Relocation format.//typedef struct _IMAGE_RELOCATION {    union {        DWORD   VirtualAddress;        DWORD   RelocCount;             // Set to the real count when IMAGE_SCN_LNK_NRELOC_OVFL is set    };    DWORD   SymbolTableIndex;    WORD    Type;} IMAGE_RELOCATION;typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;//// I386 relocation types.//#define IMAGE_REL_I386_ABSOLUTE         0x0000  // Reference is absolute, no relocation is necessary#define IMAGE_REL_I386_DIR16            0x0001  // Direct 16-bit reference to the symbols virtual address#define IMAGE_REL_I386_REL16            0x0002  // PC-relative 16-bit reference to the symbols virtual address#define IMAGE_REL_I386_DIR32            0x0006  // Direct 32-bit reference to the symbols virtual address#define IMAGE_REL_I386_DIR32NB          0x0007  // Direct 32-bit reference to the symbols virtual address, base not included#define IMAGE_REL_I386_SEG12            0x0009  // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address#define IMAGE_REL_I386_SECTION          0x000A#define IMAGE_REL_I386_SECREL           0x000B#define IMAGE_REL_I386_TOKEN            0x000C  // clr token#define IMAGE_REL_I386_SECREL7          0x000D  // 7 bit offset from base of section containing target#define IMAGE_REL_I386_REL32            0x0014  // PC-relative 32-bit reference to the symbols virtual address//// MIPS relocation types.//#define IMAGE_REL_MIPS_ABSOLUTE         0x0000  // Reference is absolute, no relocation is necessary#define IMAGE_REL_MIPS_REFHALF          0x0001#define IMAGE_REL_MIPS_REFWORD          0x0002#define IMAGE_REL_MIPS_JMPADDR          0x0003#define IMAGE_REL_MIPS_REFHI            0x0004#define IMAGE_REL_MIPS_REFLO            0x0005#define IMAGE_REL_MIPS_GPREL            0x0006#define IMAGE_REL_MIPS_LITERAL          0x0007#define IMAGE_REL_MIPS_SECTION          0x000A#define IMAGE_REL_MIPS_SECREL           0x000B#define IMAGE_REL_MIPS_SECRELLO         0x000C  // Low 16-bit section relative referemce (used for >32k TLS)#define IMAGE_REL_MIPS_SECRELHI         0x000D  // High 16-bit section relative reference (used for >32k TLS)#define IMAGE_REL_MIPS_TOKEN            0x000E  // clr token#define IMAGE_REL_MIPS_JMPADDR16        0x0010#define IMAGE_REL_MIPS_REFWORDNB        0x0022#define IMAGE_REL_MIPS_PAIR             0x0025//// Alpha Relocation types.//#define IMAGE_REL_ALPHA_ABSOLUTE        0x0000#define IMAGE_REL_ALPHA_REFLONG         0x0001#define IMAGE_REL_ALPHA_REFQUAD         0x0002#define IMAGE_REL_ALPHA_GPREL32         0x0003#define IMAGE_REL_ALPHA_LITERAL         0x0004#define IMAGE_REL_ALPHA_LITUSE          0x0005#define IMAGE_REL_ALPHA_GPDISP          0x0006#define IMAGE_REL_ALPHA_BRADDR          0x0007#define IMAGE_REL_ALPHA_HINT            0x0008#define IMAGE_REL_ALPHA_INLINE_REFLONG  0x0009#define IMAGE_REL_ALPHA_REFHI           0x000A#define IMAGE_REL_ALPHA_REFLO           0x000B#define IMAGE_REL_ALPHA_PAIR            0x000C#define IMAGE_REL_ALPHA_MATCH           0x000D#define IMAGE_REL_ALPHA_SECTION         0x000E#define IMAGE_REL_ALPHA_SECREL          0x000F#define IMAGE_REL_ALPHA_REFLONGNB       0x0010#define IMAGE_REL_ALPHA_SECRELLO        0x0011  // Low 16-bit section relative reference#define IMAGE_REL_ALPHA_SECRELHI        0x0012  // High 16-bit section relative reference#define IMAGE_REL_ALPHA_REFQ3           0x0013  // High 16 bits of 48 bit reference#define IMAGE_REL_ALPHA_REFQ2           0x0014  // Middle 16 bits of 48 bit reference#define IMAGE_REL_ALPHA_REFQ1           0x0015  // Low 16 bits of 48 bit reference#define IMAGE_REL_ALPHA_GPRELLO         0x0016  // Low 16-bit GP relative reference#define IMAGE_REL_ALPHA_GPRELHI         0x0017  // High 16-bit GP relative reference//// IBM PowerPC relocation types.//#define IMAGE_REL_PPC_ABSOLUTE          0x0000  // NOP#define IMAGE_REL_PPC_ADDR64            0x0001  // 64-bit address#define IMAGE_REL_PPC_ADDR32            0x0002  // 32-bit address#define IMAGE_REL_PPC_ADDR24            0x0003  // 26-bit address, shifted left 2 (branch absolute)#define IMAGE_REL_PPC_ADDR16            0x0004  // 16-bit address#define IMAGE_REL_PPC_ADDR14            0x0005  // 16-bit address, shifted left 2 (load doubleword)#define IMAGE_REL_PPC_REL24             0x0006  // 26-bit PC-relative offset, shifted left 2 (branch relative)#define IMAGE_REL_PPC_REL14             0x0007  // 16-bit PC-relative offset, shifted left 2 (br cond relative)#define IMAGE_REL_PPC_TOCREL16          0x0008  // 16-bit offset from TOC base#define IMAGE_REL_PPC_TOCREL14          0x0009  // 16-bit offset from TOC base, shifted left 2 (load doubleword)#define IMAGE_REL_PPC_ADDR32NB          0x000A  // 32-bit addr w/o image base#define IMAGE_REL_PPC_SECREL            0x000B  // va of containing section (as in an image sectionhdr)#define IMAGE_REL_PPC_SECTION           0x000C  // sectionheader number#define IMAGE_REL_PPC_IFGLUE            0x000D  // substitute TOC restore instruction iff symbol is glue code#define IMAGE_REL_PPC_IMGLUE            0x000E  // symbol is glue code; virtual address is TOC restore instruction#define IMAGE_REL_PPC_SECREL16          0x000F  // va of containing section (limited to 16 bits)#define IMAGE_REL_PPC_REFHI             0x0010#define IMAGE_REL_PPC_REFLO             0x0011#define IMAGE_REL_PPC_PAIR              0x0012#define IMAGE_REL_PPC_SECRELLO          0x0013  // Low 16-bit section relative reference (used for >32k TLS)#define IMAGE_REL_PPC_SECRELHI          0x0014  // High 16-bit section relative reference (used for >32k TLS)#define IMAGE_REL_PPC_GPREL             0x0015#define IMAGE_REL_PPC_TOKEN             0x0016  // clr token#define IMAGE_REL_PPC_TYPEMASK          0x00FF  // mask to isolate above values in IMAGE_RELOCATION.Type// Flag bits in IMAGE_RELOCATION.TYPE#define IMAGE_REL_PPC_NEG               0x0100  // subtract reloc value rather than adding it#define IMAGE_REL_PPC_BRTAKEN           0x0200  // fix branch prediction bit to predict branch taken#define IMAGE_REL_PPC_BRNTAKEN          0x0400  // fix branch prediction bit to predict branch not taken#define IMAGE_REL_PPC_TOCDEFN           0x0800  // toc slot defined in file (or, data in toc)//// Hitachi SH3 relocation types.//#define IMAGE_REL_SH3_ABSOLUTE          0x0000  // No relocation#define IMAGE_REL_SH3_DIRECT16          0x0001  // 16 bit direct#define IMAGE_REL_SH3_DIRECT32          0x0002  // 32 bit direct#define IMAGE_REL_SH3_DIRECT8           0x0003  // 8 bit direct, -128..255#define IMAGE_REL_SH3_DIRECT8_WORD      0x0004  // 8 bit direct .W (0 ext.)#define IMAGE_REL_SH3_DIRECT8_LONG      0x0005  // 8 bit direct .L (0 ext.)#define IMAGE_REL_SH3_DIRECT4           0x0006  // 4 bit direct (0 ext.)#define IMAGE_REL_SH3_DIRECT4_WORD      0x0007  // 4 bit direct .W (0 ext.)#define IMAGE_REL_SH3_DIRECT4_LONG      0x0008  // 4 bit direct .L (0 ext.)#define IMAGE_REL_SH3_PCREL8_WORD       0x0009  // 8 bit PC relative .W#define IMAGE_REL_SH3_PCREL8_LONG       0x000A  // 8 bit PC relative .L#define IMAGE_REL_SH3_PCREL12_WORD      0x000B  // 12 LSB PC relative .W#define IMAGE_REL_SH3_STARTOF_SECTION   0x000C  // Start of EXE section#define IMAGE_REL_SH3_SIZEOF_SECTION    0x000D  // Size of EXE section#define IMAGE_REL_SH3_SECTION           0x000E  // Section table index#define IMAGE_REL_SH3_SECREL            0x000F  // Offset within section#define IMAGE_REL_SH3_DIRECT32_NB       0x0010  // 32 bit direct not based#define IMAGE_REL_SH3_GPREL4_LONG       0x0011  // GP-relative addressing#define IMAGE_REL_SH3_TOKEN             0x0012  // clr token#define IMAGE_REL_SHM_PCRELPT           0x0013  // Offset from current                                                //  instruction in longwords                                                //  if not NOMODE, insert the                                                //  inverse of the low bit at                                                //  bit 32 to select PTA/PTB#define IMAGE_REL_SHM_REFLO             0x0014  // Low bits of 32-bit address#define IMAGE_REL_SHM_REFHALF           0x0015  // High bits of 32-bit address#define IMAGE_REL_SHM_RELLO             0x0016  // Low bits of relative reference#define IMAGE_REL_SHM_RELHALF           0x0017  // High bits of relative reference#define IMAGE_REL_SHM_PAIR              0x0018  // offset operand for relocation#define IMAGE_REL_SH_NOMODE             0x8000  // relocation ignores section mode#define IMAGE_REL_ARM_ABSOLUTE          0x0000  // No relocation required#define IMAGE_REL_ARM_ADDR32            0x0001  // 32 bit address#define IMAGE_REL_ARM_ADDR32NB          0x0002  // 32 bit address w/o image base#define IMAGE_REL_ARM_BRANCH24          0x0003  // 24 bit offset << 2 & sign ext.#define IMAGE_REL_ARM_BRANCH11          0x0004  // Thumb: 2 11 bit offsets#define IMAGE_REL_ARM_TOKEN             0x0005  // clr token#define IMAGE_REL_ARM_GPREL12           0x0006  // GP-relative addressing (ARM)#define IMAGE_REL_ARM_GPREL7            0x0007  // GP-relative addressing (Thumb)#define IMAGE_REL_ARM_BLX24             0x0008#define IMAGE_REL_ARM_BLX11             0x0009#define IMAGE_REL_ARM_SECTION           0x000E  // Section table index#define IMAGE_REL_ARM_SECREL            0x000F  // Offset within section#define IMAGE_REL_AM_ABSOLUTE           0x0000#define IMAGE_REL_AM_ADDR32             0x0001#define IMAGE_REL_AM_ADDR32NB           0x0002#define IMAGE_REL_AM_CALL32             0x0003#define IMAGE_REL_AM_FUNCINFO           0x0004#define IMAGE_REL_AM_REL32_1            0x0005#define IMAGE_REL_AM_REL32_2            0x0006#define IMAGE_REL_AM_SECREL             0x0007#define IMAGE_REL_AM_SECTION            0x0008#define IMAGE_REL_AM_TOKEN              0x0009//// x64 relocations//#define IMAGE_REL_AMD64_ABSOLUTE        0x0000  // Reference is absolute, no relocation is necessary#define IMAGE_REL_AMD64_ADDR64          0x0001  // 64-bit address (VA).#define IMAGE_REL_AMD64_ADDR32          0x0002  // 32-bit address (VA).#define IMAGE_REL_AMD64_ADDR32NB        0x0003  // 32-bit address w/o image base (RVA).#define IMAGE_REL_AMD64_REL32           0x0004  // 32-bit relative address from byte following reloc#define IMAGE_REL_AMD64_REL32_1         0x0005  // 32-bit relative address from byte distance 1 from reloc#define IMAGE_REL_AMD64_REL32_2         0x0006  // 32-bit relative address from byte distance 2 from reloc#define IMAGE_REL_AMD64_REL32_3         0x0007  // 32-bit relative address from byte distance 3 from reloc#define IMAGE_REL_AMD64_REL32_4         0x0008  // 32-bit relative address from byte distance 4 from reloc#define IMAGE_REL_AMD64_REL32_5         0x0009  // 32-bit relative address from byte distance 5 from reloc#define IMAGE_REL_AMD64_SECTION         0x000A  // Section index#define IMAGE_REL_AMD64_SECREL          0x000B  // 32 bit offset from base of section containing target#define IMAGE_REL_AMD64_SECREL7         0x000C  // 7 bit unsigned offset from base of section containing target#define IMAGE_REL_AMD64_TOKEN           0x000D  // 32 bit metadata token#define IMAGE_REL_AMD64_SREL32          0x000E  // 32 bit signed span-dependent value emitted into object#define IMAGE_REL_AMD64_PAIR            0x000F#define IMAGE_REL_AMD64_SSPAN32         0x0010  // 32 bit signed span-dependent value applied at link time//// IA64 relocation types.//#define IMAGE_REL_IA64_ABSOLUTE         0x0000#define IMAGE_REL_IA64_IMM14            0x0001#define IMAGE_REL_IA64_IMM22            0x0002#define IMAGE_REL_IA64_IMM64            0x0003#define IMAGE_REL_IA64_DIR32            0x0004#define IMAGE_REL_IA64_DIR64            0x0005#define IMAGE_REL_IA64_PCREL21B         0x0006#define IMAGE_REL_IA64_PCREL21M         0x0007#define IMAGE_REL_IA64_PCREL21F         0x0008#define IMAGE_REL_IA64_GPREL22          0x0009#define IMAGE_REL_IA64_LTOFF22          0x000A#define IMAGE_REL_IA64_SECTION          0x000B#define IMAGE_REL_IA64_SECREL22         0x000C#define IMAGE_REL_IA64_SECREL64I        0x000D#define IMAGE_REL_IA64_SECREL32         0x000E//#define IMAGE_REL_IA64_DIR32NB          0x0010#define IMAGE_REL_IA64_SREL14           0x0011#define IMAGE_REL_IA64_SREL22           0x0012#define IMAGE_REL_IA64_SREL32           0x0013#define IMAGE_REL_IA64_UREL32           0x0014#define IMAGE_REL_IA64_PCREL60X         0x0015  // This is always a BRL and never converted#define IMAGE_REL_IA64_PCREL60B         0x0016  // If possible, convert to MBB bundle with NOP.B in slot 1#define IMAGE_REL_IA64_PCREL60F         0x0017  // If possible, convert to MFB bundle with NOP.F in slot 1#define IMAGE_REL_IA64_PCREL60I         0x0018  // If possible, convert to MIB bundle with NOP.I in slot 1#define IMAGE_REL_IA64_PCREL60M         0x0019  // If possible, convert to MMB bundle with NOP.M in slot 1#define IMAGE_REL_IA64_IMMGPREL64       0x001A#define IMAGE_REL_IA64_TOKEN            0x001B  // clr token#define IMAGE_REL_IA64_GPREL32          0x001C#define IMAGE_REL_IA64_ADDEND           0x001F//// CEF relocation types.//#define IMAGE_REL_CEF_ABSOLUTE          0x0000  // Reference is absolute, no relocation is necessary#define IMAGE_REL_CEF_ADDR32            0x0001  // 32-bit address (VA).#define IMAGE_REL_CEF_ADDR64            0x0002  // 64-bit address (VA).#define IMAGE_REL_CEF_ADDR32NB          0x0003  // 32-bit address w/o image base (RVA).#define IMAGE_REL_CEF_SECTION           0x0004  // Section index#define IMAGE_REL_CEF_SECREL            0x0005  // 32 bit offset from base of section containing target#define IMAGE_REL_CEF_TOKEN             0x0006  // 32 bit metadata token//// clr relocation types.//#define IMAGE_REL_CEE_ABSOLUTE          0x0000  // Reference is absolute, no relocation is necessary#define IMAGE_REL_CEE_ADDR32            0x0001  // 32-bit address (VA).#define IMAGE_REL_CEE_ADDR64            0x0002  // 64-bit address (VA).#define IMAGE_REL_CEE_ADDR32NB          0x0003  // 32-bit address w/o image base (RVA).#define IMAGE_REL_CEE_SECTION           0x0004  // Section index#define IMAGE_REL_CEE_SECREL            0x0005  // 32 bit offset from base of section containing target#define IMAGE_REL_CEE_TOKEN             0x0006  // 32 bit metadata token#define IMAGE_REL_M32R_ABSOLUTE         0x0000  // No relocation required#define IMAGE_REL_M32R_ADDR32           0x0001  // 32 bit address#define IMAGE_REL_M32R_ADDR32NB         0x0002  // 32 bit address w/o image base#define IMAGE_REL_M32R_ADDR24           0x0003  // 24 bit address#define IMAGE_REL_M32R_GPREL16          0x0004  // GP relative addressing#define IMAGE_REL_M32R_PCREL24          0x0005  // 24 bit offset << 2 & sign ext.#define IMAGE_REL_M32R_PCREL16          0x0006  // 16 bit offset << 2 & sign ext.#define IMAGE_REL_M32R_PCREL8           0x0007  // 8 bit offset << 2 & sign ext.#define IMAGE_REL_M32R_REFHALF          0x0008  // 16 MSBs#define IMAGE_REL_M32R_REFHI            0x0009  // 16 MSBs; adj for LSB sign ext.#define IMAGE_REL_M32R_REFLO            0x000A  // 16 LSBs#define IMAGE_REL_M32R_PAIR             0x000B  // Link HI and LO#define IMAGE_REL_M32R_SECTION          0x000C  // Section table index#define IMAGE_REL_M32R_SECREL32         0x000D  // 32 bit section relative reference#define IMAGE_REL_M32R_TOKEN            0x000E  // clr token#define IMAGE_REL_EBC_ABSOLUTE          0x0000  // No relocation required#define IMAGE_REL_EBC_ADDR32NB          0x0001  // 32 bit address w/o image base#define IMAGE_REL_EBC_REL32             0x0002  // 32-bit relative address from byte following reloc#define IMAGE_REL_EBC_SECTION           0x0003  // Section table index#define IMAGE_REL_EBC_SECREL            0x0004  // Offset within section#define EXT_IMM64(Value, Address, Size, InstPos, ValPos)  /* Intel-IA64-Filler */           \    Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos)  // Intel-IA64-Filler#define INS_IMM64(Value, Address, Size, InstPos, ValPos)  /* Intel-IA64-Filler */\    *(PDWORD)Address = (*(PDWORD)Address & ~(((1 << Size) - 1) << InstPos)) | /* Intel-IA64-Filler */\          ((DWORD)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos)  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM7B_INST_WORD_X         3  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM7B_SIZE_X              7  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X     4  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM7B_VAL_POS_X           0  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM9D_INST_WORD_X         3  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM9D_SIZE_X              9  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X     18 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM9D_VAL_POS_X           7  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM5C_INST_WORD_X         3  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM5C_SIZE_X              5  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X     13 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM5C_VAL_POS_X           16 // Intel-IA64-Filler#define EMARCH_ENC_I17_IC_INST_WORD_X            3  // Intel-IA64-Filler#define EMARCH_ENC_I17_IC_SIZE_X                 1  // Intel-IA64-Filler#define EMARCH_ENC_I17_IC_INST_WORD_POS_X        12 // Intel-IA64-Filler#define EMARCH_ENC_I17_IC_VAL_POS_X              21 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41a_INST_WORD_X        1  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41a_SIZE_X             10 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X    14 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41a_VAL_POS_X          22 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41b_INST_WORD_X        1  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41b_SIZE_X             8  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X    24 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41b_VAL_POS_X          32 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41c_INST_WORD_X        2  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41c_SIZE_X             23 // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X    0  // Intel-IA64-Filler#define EMARCH_ENC_I17_IMM41c_VAL_POS_X          40 // Intel-IA64-Filler#define EMARCH_ENC_I17_SIGN_INST_WORD_X          3  // Intel-IA64-Filler#define EMARCH_ENC_I17_SIGN_SIZE_X               1  // Intel-IA64-Filler#define EMARCH_ENC_I17_SIGN_INST_WORD_POS_X      27 // Intel-IA64-Filler#define EMARCH_ENC_I17_SIGN_VAL_POS_X            63 // Intel-IA64-Filler#define X3_OPCODE_INST_WORD_X                    3  // Intel-IA64-Filler#define X3_OPCODE_SIZE_X                         4  // Intel-IA64-Filler#define X3_OPCODE_INST_WORD_POS_X                28 // Intel-IA64-Filler#define X3_OPCODE_SIGN_VAL_POS_X                 0  // Intel-IA64-Filler#define X3_I_INST_WORD_X                         3  // Intel-IA64-Filler#define X3_I_SIZE_X                              1  // Intel-IA64-Filler#define X3_I_INST_WORD_POS_X                     27 // Intel-IA64-Filler#define X3_I_SIGN_VAL_POS_X                      59 // Intel-IA64-Filler#define X3_D_WH_INST_WORD_X                      3  // Intel-IA64-Filler#define X3_D_WH_SIZE_X                           3  // Intel-IA64-Filler#define X3_D_WH_INST_WORD_POS_X                  24 // Intel-IA64-Filler#define X3_D_WH_SIGN_VAL_POS_X                   0  // Intel-IA64-Filler#define X3_IMM20_INST_WORD_X                     3  // Intel-IA64-Filler#define X3_IMM20_SIZE_X                          20 // Intel-IA64-Filler#define X3_IMM20_INST_WORD_POS_X                 4  // Intel-IA64-Filler#define X3_IMM20_SIGN_VAL_POS_X                  0  // Intel-IA64-Filler#define X3_IMM39_1_INST_WORD_X                   2  // Intel-IA64-Filler#define X3_IMM39_1_SIZE_X                        23 // Intel-IA64-Filler#define X3_IMM39_1_INST_WORD_POS_X               0  // Intel-IA64-Filler#define X3_IMM39_1_SIGN_VAL_POS_X                36 // Intel-IA64-Filler#define X3_IMM39_2_INST_WORD_X                   1  // Intel-IA64-Filler#define X3_IMM39_2_SIZE_X                        16 // Intel-IA64-Filler#define X3_IMM39_2_INST_WORD_POS_X               16 // Intel-IA64-Filler#define X3_IMM39_2_SIGN_VAL_POS_X                20 // Intel-IA64-Filler#define X3_P_INST_WORD_X                         3  // Intel-IA64-Filler#define X3_P_SIZE_X                              4  // Intel-IA64-Filler#define X3_P_INST_WORD_POS_X                     0  // Intel-IA64-Filler#define X3_P_SIGN_VAL_POS_X                      0  // Intel-IA64-Filler#define X3_TMPLT_INST_WORD_X                     0  // Intel-IA64-Filler#define X3_TMPLT_SIZE_X                          4  // Intel-IA64-Filler#define X3_TMPLT_INST_WORD_POS_X                 0  // Intel-IA64-Filler#define X3_TMPLT_SIGN_VAL_POS_X                  0  // Intel-IA64-Filler#define X3_BTYPE_QP_INST_WORD_X                  2  // Intel-IA64-Filler#define X3_BTYPE_QP_SIZE_X                       9  // Intel-IA64-Filler#define X3_BTYPE_QP_INST_WORD_POS_X              23 // Intel-IA64-Filler#define X3_BTYPE_QP_INST_VAL_POS_X               0  // Intel-IA64-Filler#define X3_EMPTY_INST_WORD_X                     1  // Intel-IA64-Filler#define X3_EMPTY_SIZE_X                          2  // Intel-IA64-Filler#define X3_EMPTY_INST_WORD_POS_X                 14 // Intel-IA64-Filler#define X3_EMPTY_INST_VAL_POS_X                  0  // Intel-IA64-Filler//// Line number format.//typedef struct _IMAGE_LINENUMBER {    union {        DWORD   SymbolTableIndex;               // Symbol table index of function name if Linenumber is 0.        DWORD   VirtualAddress;                 // Virtual address of line number.    } Type;    WORD    Linenumber;                         // Line number.} IMAGE_LINENUMBER;typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;#ifndef _MAC#include "poppack.h"                        // Back to 4 byte packing#endif//// Based relocation format.//typedef struct _IMAGE_BASE_RELOCATION {    DWORD   VirtualAddress;    DWORD   SizeOfBlock;//  WORD    TypeOffset[1];} IMAGE_BASE_RELOCATION;typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;//// Based relocation types.//#define IMAGE_REL_BASED_ABSOLUTE              0#define IMAGE_REL_BASED_HIGH                  1#define IMAGE_REL_BASED_LOW                   2#define IMAGE_REL_BASED_HIGHLOW               3#define IMAGE_REL_BASED_HIGHADJ               4#define IMAGE_REL_BASED_MIPS_JMPADDR          5#define IMAGE_REL_BASED_MIPS_JMPADDR16        9#define IMAGE_REL_BASED_IA64_IMM64            9#define IMAGE_REL_BASED_DIR64                 10//// Archive format.//#define IMAGE_ARCHIVE_START_SIZE             8#define IMAGE_ARCHIVE_START                  "!<arch>\n"#define IMAGE_ARCHIVE_END                    "`\n"#define IMAGE_ARCHIVE_PAD                    "\n"#define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {    BYTE     Name[16];                          // File member name - `/' terminated.    BYTE     Date[12];                          // File member date - decimal.    BYTE     UserID[6];                         // File member user id - decimal.    BYTE     GroupID[6];                        // File member group id - decimal.    BYTE     Mode[8];                           // File member mode - octal.    BYTE     Size[10];                          // File member size - decimal.    BYTE     EndHeader[2];                      // String to end header.} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60//// DLL support.////// Export Format//typedef struct _IMAGE_EXPORT_DIRECTORY {    DWORD   Characteristics;    DWORD   TimeDateStamp;    WORD    MajorVersion;    WORD    MinorVersion;    DWORD   Name;    DWORD   Base;    DWORD   NumberOfFunctions;    DWORD   NumberOfNames;    DWORD   AddressOfFunctions;     // RVA from base of image    DWORD   AddressOfNames;         // RVA from base of image    DWORD   AddressOfNameOrdinals;  // RVA from base of image} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;//// Import Format//typedef struct _IMAGE_IMPORT_BY_NAME {    WORD    Hint;    BYTE    Name[1];} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;#include "pshpack8.h"                       // Use align 8 for the 64-bit IAT.typedef struct _IMAGE_THUNK_DATA64 {    union {        ULONGLONG ForwarderString;  // PBYTE         ULONGLONG Function;         // PDWORD        ULONGLONG Ordinal;        ULONGLONG AddressOfData;    // PIMAGE_IMPORT_BY_NAME    } u1;} IMAGE_THUNK_DATA64;typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;#include "poppack.h"                        // Back to 4 byte packingtypedef struct _IMAGE_THUNK_DATA32 {    union {        DWORD ForwarderString;      // PBYTE         DWORD Function;             // PDWORD        DWORD Ordinal;        DWORD AddressOfData;        // PIMAGE_IMPORT_BY_NAME    } u1;} IMAGE_THUNK_DATA32;typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;#define IMAGE_ORDINAL_FLAG64 0x8000000000000000#define IMAGE_ORDINAL_FLAG32 0x80000000#define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)#define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)#define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)#define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)//// Thread Local Storage//typedef VOID(NTAPI *PIMAGE_TLS_CALLBACK) (    PVOID DllHandle,    DWORD Reason,    PVOID Reserved    );typedef struct _IMAGE_TLS_DIRECTORY64 {    ULONGLONG   StartAddressOfRawData;    ULONGLONG   EndAddressOfRawData;    ULONGLONG   AddressOfIndex;         // PDWORD    ULONGLONG   AddressOfCallBacks;     // PIMAGE_TLS_CALLBACK *;    DWORD   SizeOfZeroFill;    DWORD   Characteristics;} IMAGE_TLS_DIRECTORY64;typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;typedef struct _IMAGE_TLS_DIRECTORY32 {    DWORD   StartAddressOfRawData;    DWORD   EndAddressOfRawData;    DWORD   AddressOfIndex;             // PDWORD    DWORD   AddressOfCallBacks;         // PIMAGE_TLS_CALLBACK *    DWORD   SizeOfZeroFill;    DWORD   Characteristics;} IMAGE_TLS_DIRECTORY32;typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;#ifdef _WIN64#define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG64#define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL64(Ordinal)typedef IMAGE_THUNK_DATA64              IMAGE_THUNK_DATA;typedef PIMAGE_THUNK_DATA64             PIMAGE_THUNK_DATA;#define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL64(Ordinal)typedef IMAGE_TLS_DIRECTORY64           IMAGE_TLS_DIRECTORY;typedef PIMAGE_TLS_DIRECTORY64          PIMAGE_TLS_DIRECTORY;#else#define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG32#define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL32(Ordinal)typedef IMAGE_THUNK_DATA32              IMAGE_THUNK_DATA;typedef PIMAGE_THUNK_DATA32             PIMAGE_THUNK_DATA;#define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL32(Ordinal)typedef IMAGE_TLS_DIRECTORY32           IMAGE_TLS_DIRECTORY;typedef PIMAGE_TLS_DIRECTORY32          PIMAGE_TLS_DIRECTORY;#endiftypedef struct _IMAGE_IMPORT_DESCRIPTOR {    union {        DWORD   Characteristics;            // 0 for terminating null import descriptor        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)    };    DWORD   TimeDateStamp;                  // 0 if not bound,                                            // -1 if bound, and real date\time stamp                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)                                            // O.W. date/time stamp of DLL bound to (Old BIND)    DWORD   ForwarderChain;                 // -1 if no forwarders    DWORD   Name;    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)} IMAGE_IMPORT_DESCRIPTOR;typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;//// New format import descriptors pointed to by DataDirectory[ IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ]//typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {    DWORD   TimeDateStamp;    WORD    OffsetModuleName;    WORD    NumberOfModuleForwarderRefs;// Array of zero or more IMAGE_BOUND_FORWARDER_REF follows} IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;typedef struct _IMAGE_BOUND_FORWARDER_REF {    DWORD   TimeDateStamp;    WORD    OffsetModuleName;    WORD    Reserved;} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;//// Resource Format.////// Resource directory consists of two counts, following by a variable length// array of directory entries.  The first count is the number of entries at// beginning of the array that have actual names associated with each entry.// The entries are in ascending order, case insensitive strings.  The second// count is the number of entries that immediately follow the named entries.// This second count identifies the number of entries that have 16-bit integer// Ids as their name.  These entries are also sorted in ascending order.//// This structure allows fast lookup by either name or number, but for any// given resource entry only one form of lookup is supported, not both.// This is consistant with the syntax of the .RC file and the .RES file.//typedef struct _IMAGE_RESOURCE_DIRECTORY {    DWORD   Characteristics;    DWORD   TimeDateStamp;    WORD    MajorVersion;    WORD    MinorVersion;    WORD    NumberOfNamedEntries;    WORD    NumberOfIdEntries;//  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;#define IMAGE_RESOURCE_NAME_IS_STRING        0x80000000#define IMAGE_RESOURCE_DATA_IS_DIRECTORY     0x80000000//// Each directory contains the 32-bit Name of the entry and an offset,// relative to the beginning of the resource directory of the data associated// with this directory entry.  If the name of the entry is an actual text// string instead of an integer Id, then the high order bit of the name field// is set to one and the low order 31-bits are an offset, relative to the// beginning of the resource directory of the string, which is of type// IMAGE_RESOURCE_DIRECTORY_STRING.  Otherwise the high bit is clear and the// low-order 16-bits are the integer Id that identify this resource directory// entry. If the directory entry is yet another resource directory (i.e. a// subdirectory), then the high order bit of the offset field will be// set to indicate this.  Otherwise the high bit is clear and the offset// field points to a resource data entry.//typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {    union {        struct {            DWORD NameOffset:31;            DWORD NameIsString:1;        };        DWORD   Name;        WORD    Id;    };    union {        DWORD   OffsetToData;        struct {            DWORD   OffsetToDirectory:31;            DWORD   DataIsDirectory:1;        };    };} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;//// For resource directory entries that have actual string names, the Name// field of the directory entry points to an object of the following type.// All of these string objects are stored together after the last resource// directory entry and before the first resource data object.  This minimizes// the impact of these variable length objects on the alignment of the fixed// size directory entry objects.//typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {    WORD    Length;    CHAR    NameString[ 1 ];} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;typedef struct _IMAGE_RESOURCE_DIR_STRING_U {    WORD    Length;    WCHAR   NameString[ 1 ];} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;//// Each resource data entry describes a leaf node in the resource directory// tree.  It contains an offset, relative to the beginning of the resource// directory of the data for the resource, a size field that gives the number// of bytes of data at that offset, a CodePage that should be used when// decoding code point values within the resource data.  Typically for new// applications the code page would be the unicode code page.//typedef struct _IMAGE_RESOURCE_DATA_ENTRY {    DWORD   OffsetToData;    DWORD   Size;    DWORD   CodePage;    DWORD   Reserved;} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;//// Load Configuration Directory Entry//typedef struct {    DWORD   Size;    DWORD   TimeDateStamp;    WORD    MajorVersion;    WORD    MinorVersion;    DWORD   GlobalFlagsClear;    DWORD   GlobalFlagsSet;    DWORD   CriticalSectionDefaultTimeout;    DWORD   DeCommitFreeBlockThreshold;    DWORD   DeCommitTotalFreeThreshold;    DWORD   LockPrefixTable;            // VA    DWORD   MaximumAllocationSize;    DWORD   VirtualMemoryThreshold;    DWORD   ProcessHeapFlags;    DWORD   ProcessAffinityMask;    WORD    CSDVersion;    WORD    Reserved1;    DWORD   EditList;                   // VA    DWORD   SecurityCookie;             // VA    DWORD   SEHandlerTable;             // VA    DWORD   SEHandlerCount;} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;typedef struct {    DWORD      Size;    DWORD      TimeDateStamp;    WORD       MajorVersion;    WORD       MinorVersion;    DWORD      GlobalFlagsClear;    DWORD      GlobalFlagsSet;    DWORD      CriticalSectionDefaultTimeout;    ULONGLONG  DeCommitFreeBlockThreshold;    ULONGLONG  DeCommitTotalFreeThreshold;    ULONGLONG  LockPrefixTable;         // VA    ULONGLONG  MaximumAllocationSize;    ULONGLONG  VirtualMemoryThreshold;    ULONGLONG  ProcessAffinityMask;    DWORD      ProcessHeapFlags;    WORD       CSDVersion;    WORD       Reserved1;    ULONGLONG  EditList;                // VA    ULONGLONG  SecurityCookie;          // VA    ULONGLONG  SEHandlerTable;          // VA    ULONGLONG  SEHandlerCount;} IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;#ifdef _WIN64typedef IMAGE_LOAD_CONFIG_DIRECTORY64     IMAGE_LOAD_CONFIG_DIRECTORY;typedef PIMAGE_LOAD_CONFIG_DIRECTORY64    PIMAGE_LOAD_CONFIG_DIRECTORY;#elsetypedef IMAGE_LOAD_CONFIG_DIRECTORY32     IMAGE_LOAD_CONFIG_DIRECTORY;typedef PIMAGE_LOAD_CONFIG_DIRECTORY32    PIMAGE_LOAD_CONFIG_DIRECTORY;#endif//// WIN CE Exception table format////// Function table entry format.  Function table is pointed to by the// IMAGE_DIRECTORY_ENTRY_EXCEPTION directory entry.//typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {    DWORD FuncStart;    DWORD PrologLen : 8;    DWORD FuncLen : 22;    DWORD ThirtyTwoBit : 1;    DWORD ExceptionFlag : 1;} IMAGE_CE_RUNTIME_FUNCTION_ENTRY, * PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {    ULONGLONG BeginAddress;    ULONGLONG EndAddress;    ULONGLONG ExceptionHandler;    ULONGLONG HandlerData;    ULONGLONG PrologEndAddress;} IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {    DWORD BeginAddress;    DWORD EndAddress;    DWORD ExceptionHandler;    DWORD HandlerData;    DWORD PrologEndAddress;} IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {    DWORD BeginAddress;    DWORD EndAddress;    DWORD UnwindInfoAddress;} _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;#if defined(_AXP64_)typedef  IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY  IMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;typedef  IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;#elif defined(_ALPHA_)typedef  IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;typedef PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;#elsetypedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;#endif//// Debug Format//typedef struct _IMAGE_DEBUG_DIRECTORY {    DWORD   Characteristics;    DWORD   TimeDateStamp;    WORD    MajorVersion;    WORD    MinorVersion;    DWORD   Type;    DWORD   SizeOfData;    DWORD   AddressOfRawData;    DWORD   PointerToRawData;} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;#define IMAGE_DEBUG_TYPE_UNKNOWN          0#define IMAGE_DEBUG_TYPE_COFF             1#define IMAGE_DEBUG_TYPE_CODEVIEW         2#define IMAGE_DEBUG_TYPE_FPO              3#define IMAGE_DEBUG_TYPE_MISC             4#define IMAGE_DEBUG_TYPE_EXCEPTION        5#define IMAGE_DEBUG_TYPE_FIXUP            6#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC      7#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC    8#define IMAGE_DEBUG_TYPE_BORLAND          9#define IMAGE_DEBUG_TYPE_RESERVED10       10#define IMAGE_DEBUG_TYPE_CLSID            11typedef struct _IMAGE_COFF_SYMBOLS_HEADER {    DWORD   NumberOfSymbols;    DWORD   LvaToFirstSymbol;    DWORD   NumberOfLinenumbers;    DWORD   LvaToFirstLinenumber;    DWORD   RvaToFirstByteOfCode;    DWORD   RvaToLastByteOfCode;    DWORD   RvaToFirstByteOfData;    DWORD   RvaToLastByteOfData;} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;#define FRAME_FPO       0#define FRAME_TRAP      1#define FRAME_TSS       2#define FRAME_NONFPO    3typedef struct _FPO_DATA {    DWORD       ulOffStart;             // offset 1st byte of function code    DWORD       cbProcSize;             // # bytes in function    DWORD       cdwLocals;              // # bytes in locals/4    WORD        cdwParams;              // # bytes in params/4    WORD        cbProlog : 8;           // # bytes in prolog    WORD        cbRegs   : 3;           // # regs saved    WORD        fHasSEH  : 1;           // TRUE if SEH in func    WORD        fUseBP   : 1;           // TRUE if EBP has been allocated    WORD        reserved : 1;           // reserved for future use    WORD        cbFrame  : 2;           // frame type} FPO_DATA, *PFPO_DATA;#define SIZEOF_RFPO_DATA 16#define IMAGE_DEBUG_MISC_EXENAME    1typedef struct _IMAGE_DEBUG_MISC {    DWORD       DataType;               // type of misc data, see defines    DWORD       Length;                 // total length of record, rounded to four                                        // byte multiple.    BOOLEAN     Unicode;                // TRUE if data is unicode string    BYTE        Reserved[ 3 ];    BYTE        Data[ 1 ];              // Actual data} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;//// Function table extracted from MIPS/ALPHA/IA64 images.  Does not contain// information needed only for runtime support.  Just those fields for// each entry needed by a debugger.//typedef struct _IMAGE_FUNCTION_ENTRY {    DWORD   StartingAddress;    DWORD   EndingAddress;    DWORD   EndOfPrologue;} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;typedef struct _IMAGE_FUNCTION_ENTRY64 {    ULONGLONG   StartingAddress;    ULONGLONG   EndingAddress;    union {        ULONGLONG   EndOfPrologue;        ULONGLONG   UnwindInfoAddress;    };} IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;//// Debugging information can be stripped from an image file and placed// in a separate .DBG file, whose file name part is the same as the// image file name part (e.g. symbols for CMD.EXE could be stripped// and placed in CMD.DBG).  This is indicated by the IMAGE_FILE_DEBUG_STRIPPED// flag in the Characteristics field of the file header.  The beginning of// the .DBG file contains the following structure which captures certain// information from the image file.  This allows a debug to proceed even if// the original image file is not accessable.  This header is followed by// zero of more IMAGE_SECTION_HEADER structures, followed by zero or more// IMAGE_DEBUG_DIRECTORY structures.  The latter structures and those in// the image file contain file offsets relative to the beginning of the// .DBG file.//// If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure// is left in the image file, but not mapped.  This allows a debugger to// compute the name of the .DBG file, from the name of the image in the// IMAGE_DEBUG_MISC structure.//typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {    WORD        Signature;    WORD        Flags;    WORD        Machine;    WORD        Characteristics;    DWORD       TimeDateStamp;    DWORD       CheckSum;    DWORD       ImageBase;    DWORD       SizeOfImage;    DWORD       NumberOfSections;    DWORD       ExportedNamesSize;    DWORD       DebugDirectorySize;    DWORD       SectionAlignment;    DWORD       Reserved[2];} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;typedef struct _NON_PAGED_DEBUG_INFO {    WORD        Signature;    WORD        Flags;    DWORD       Size;    WORD        Machine;    WORD        Characteristics;    DWORD       TimeDateStamp;    DWORD       CheckSum;    DWORD       SizeOfImage;    ULONGLONG   ImageBase;    //DebugDirectorySize    //IMAGE_DEBUG_DIRECTORY} NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;#ifndef _MAC#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944#define NON_PAGED_DEBUG_SIGNATURE      0x494E#else#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4449  // DI#define NON_PAGED_DEBUG_SIGNATURE      0x4E49  // NI#endif#define IMAGE_SEPARATE_DEBUG_FLAGS_MASK 0x8000#define IMAGE_SEPARATE_DEBUG_MISMATCH   0x8000  // when DBG was updated, the                                                // old checksum didn't match.////  The .arch section is made up of headers, each describing an amask position/value//  pointing to an array of IMAGE_ARCHITECTURE_ENTRY's.  Each "array" (both the header//  and entry arrays) are terminiated by a quadword of 0xffffffffL.////  NOTE: There may be quadwords of 0 sprinkled around and must be skipped.//typedef struct _ImageArchitectureHeader {    unsigned int AmaskValue: 1;                 // 1 -> code section depends on mask bit                                                // 0 -> new instruction depends on mask bit    int :7;                                     // MBZ    unsigned int AmaskShift: 8;                 // Amask bit in question for this fixup    int :16;                                    // MBZ    DWORD FirstEntryRVA;                        // RVA into .arch section to array of ARCHITECTURE_ENTRY's} IMAGE_ARCHITECTURE_HEADER, *PIMAGE_ARCHITECTURE_HEADER;typedef struct _ImageArchitectureEntry {    DWORD FixupInstRVA;                         // RVA of instruction to fixup    DWORD NewInst;                              // fixup instruction (see alphaops.h)} IMAGE_ARCHITECTURE_ENTRY, *PIMAGE_ARCHITECTURE_ENTRY;#include "poppack.h"                // Back to the initial value// The following structure defines the new import object.  Note the values of the first two fields,// which must be set as stated in order to differentiate old and new import members.// Following this structure, the linker emits two null-terminated strings used to recreate the// import at the time of use.  The first string is the import's name, the second is the dll's name.#define IMPORT_OBJECT_HDR_SIG2  0xfffftypedef struct IMPORT_OBJECT_HEADER {    WORD    Sig1;                       // Must be IMAGE_FILE_MACHINE_UNKNOWN    WORD    Sig2;                       // Must be IMPORT_OBJECT_HDR_SIG2.    WORD    Version;    WORD    Machine;    DWORD   TimeDateStamp;              // Time/date stamp    DWORD   SizeOfData;                 // particularly useful for incremental links    union {        WORD    Ordinal;                // if grf & IMPORT_OBJECT_ORDINAL        WORD    Hint;    };    WORD    Type : 2;                   // IMPORT_TYPE    WORD    NameType : 3;               // IMPORT_NAME_TYPE    WORD    Reserved : 11;              // Reserved. Must be zero.} IMPORT_OBJECT_HEADER;typedef enum IMPORT_OBJECT_TYPE{    IMPORT_OBJECT_CODE = 0,    IMPORT_OBJECT_DATA = 1,    IMPORT_OBJECT_CONST = 2,} IMPORT_OBJECT_TYPE;typedef enum IMPORT_OBJECT_NAME_TYPE{    IMPORT_OBJECT_ORDINAL = 0,          // Import by ordinal    IMPORT_OBJECT_NAME = 1,             // Import name == public symbol name.    IMPORT_OBJECT_NAME_NO_PREFIX = 2,   // Import name == public symbol name skipping leading ?, @, or optionally _.    IMPORT_OBJECT_NAME_UNDECORATE = 3,  // Import name == public symbol name skipping leading ?, @, or optionally _                                        // and truncating at first @} IMPORT_OBJECT_NAME_TYPE;#ifndef __IMAGE_COR20_HEADER_DEFINED__#define __IMAGE_COR20_HEADER_DEFINED__typedef enum ReplacesCorHdrNumericDefines{// COM+ Header entry point flags.    COMIMAGE_FLAGS_ILONLY               =0x00000001,    COMIMAGE_FLAGS_32BITREQUIRED        =0x00000002,    COMIMAGE_FLAGS_IL_LIBRARY           =0x00000004,    COMIMAGE_FLAGS_STRONGNAMESIGNED     =0x00000008,    COMIMAGE_FLAGS_TRACKDEBUGDATA       =0x00010000,// Version flags for image.    COR_VERSION_MAJOR_V2                =2,    COR_VERSION_MAJOR                   =COR_VERSION_MAJOR_V2,    COR_VERSION_MINOR                   =0,    COR_DELETED_NAME_LENGTH             =8,    COR_VTABLEGAP_NAME_LENGTH           =8,// Maximum size of a NativeType descriptor.    NATIVE_TYPE_MAX_CB                  =1,    COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,// #defines for the MIH FLAGS    IMAGE_COR_MIH_METHODRVA             =0x01,    IMAGE_COR_MIH_EHRVA                 =0x02,    IMAGE_COR_MIH_BASICBLOCK            =0x08,// V-table constants    COR_VTABLE_32BIT                    =0x01,          // V-table slots are 32-bits in size.    COR_VTABLE_64BIT                    =0x02,          // V-table slots are 64-bits in size.    COR_VTABLE_FROM_UNMANAGED           =0x04,          // If set, transition from unmanaged.    COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN  =0x08,  // If set, transition from unmanaged with keeping the current appdomain.    COR_VTABLE_CALL_MOST_DERIVED        =0x10,          // Call most derived method described by// EATJ constants    IMAGE_COR_EATJ_THUNK_SIZE           =32,            // Size of a jump thunk reserved range.// Max name lengths    //@todo: Change to unlimited name lengths.    MAX_CLASS_NAME                      =1024,    MAX_PACKAGE_NAME                    =1024,} ReplacesCorHdrNumericDefines;// CLR 2.0 header structure.typedef struct IMAGE_COR20_HEADER{    // Header versioning    DWORD                   cb;    WORD                    MajorRuntimeVersion;    WORD                    MinorRuntimeVersion;    // Symbol table and startup information    IMAGE_DATA_DIRECTORY    MetaData;    DWORD                   Flags;    DWORD                   EntryPointToken;    // Binding information    IMAGE_DATA_DIRECTORY    Resources;    IMAGE_DATA_DIRECTORY    StrongNameSignature;    // Regular fixup and binding information    IMAGE_DATA_DIRECTORY    CodeManagerTable;    IMAGE_DATA_DIRECTORY    VTableFixups;    IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;    // Precompiled image info (internal use only - set to zero)    IMAGE_DATA_DIRECTORY    ManagedNativeHeader;} IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;#endif // __IMAGE_COR20_HEADER_DEFINED__//// End Image Format////// for move macros//#ifdef _MAC#ifndef _INC_STRING#include <string.h>#endif /* _INC_STRING */#else#include <string.h>#endif // _MAC#ifndef _SLIST_HEADER_#define _SLIST_HEADER_#if defined(_WIN64)//// The type SINGLE_LIST_ENTRY is not suitable for use with SLISTs.  For// WIN64, an entry on an SLIST is required to be 16-byte aligned, while a// SINGLE_LIST_ENTRY structure has only 8 byte alignment.//// Therefore, all SLIST code should use the SLIST_ENTRY type instead of the// SINGLE_LIST_ENTRY type.//#pragma warning(push)#pragma warning(disable:4324)   // structure padded due to align()typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {    PSLIST_ENTRY Next;} SLIST_ENTRY;#pragma warning(pop)#else#define SLIST_ENTRY SINGLE_LIST_ENTRY#define _SLIST_ENTRY _SINGLE_LIST_ENTRY#define PSLIST_ENTRY PSINGLE_LIST_ENTRY#endif // _WIN64#if defined(_WIN64)typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {    struct {  // original struct        ULONGLONG Alignment;        ULONGLONG Region;    };    struct {  // 8-byte header        ULONGLONG Depth:16;        ULONGLONG Sequence:9;        ULONGLONG NextEntry:39;        ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte        ULONGLONG Init:1;       // 0: uninitialized; 1: initialized        ULONGLONG Reserved:59;        ULONGLONG Region:3;    } Header8;    struct {  // 16-byte header        ULONGLONG Depth:16;        ULONGLONG Sequence:48;        ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte        ULONGLONG Init:1;       // 0: uninitialized; 1: initialized        ULONGLONG Reserved:2;        ULONGLONG NextEntry:60; // last 4 bits are always 0's    } Header16;} SLIST_HEADER, *PSLIST_HEADER;#elsetypedef union _SLIST_HEADER {    ULONGLONG Alignment;    struct {        SLIST_ENTRY Next;        WORD   Depth;        WORD   Sequence;    };} SLIST_HEADER, *PSLIST_HEADER;#endif // _WIN64#endif // _SLIST_HEADER_NTSYSAPIVOIDNTAPIRtlInitializeSListHead (    IN PSLIST_HEADER ListHead    );NTSYSAPIPSLIST_ENTRYNTAPIRtlFirstEntrySList (    IN const SLIST_HEADER *ListHead    );NTSYSAPIPSLIST_ENTRYNTAPIRtlInterlockedPopEntrySList (    IN PSLIST_HEADER ListHead    );NTSYSAPIPSLIST_ENTRYNTAPIRtlInterlockedPushEntrySList (    IN PSLIST_HEADER ListHead,    IN PSLIST_ENTRY ListEntry    );NTSYSAPIPSLIST_ENTRYNTAPIRtlInterlockedFlushSList (    IN PSLIST_HEADER ListHead    );NTSYSAPIWORD  NTAPIRtlQueryDepthSList (    IN PSLIST_HEADER ListHead    );// begin_ntddk#ifndef _RTL_RUN_ONCE_DEF#define _RTL_RUN_ONCE_DEF//// Run once//#define RTL_RUN_ONCE_INIT {0}   // Static initializer//// Run once flags//#define RTL_RUN_ONCE_CHECK_ONLY     0x00000001UL#define RTL_RUN_ONCE_ASYNC          0x00000002UL#define RTL_RUN_ONCE_INIT_FAILED    0x00000004UL//// The context stored in the run once structure must leave the following number// of low order bits unused.//#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2typedef union _RTL_RUN_ONCE {           PVOID Ptr;                      } RTL_RUN_ONCE, *PRTL_RUN_ONCE;     typedefDWORD /* LOGICAL */(NTAPI *PRTL_RUN_ONCE_INIT_FN) (    __inout PRTL_RUN_ONCE RunOnce,    __inout_opt PVOID Parameter,    __deref_opt_out_opt PVOID *Context    );#endif // _RTL_RUN_ONCE_DEF#if !defined(MIDL_PASS) && !defined(SORTPP_PASS)VOID//FORCEINLINERtlRunOnceInitialize (    __out PRTL_RUN_ONCE RunOnce    );#endif // !defined(MIDL_PASS) && !defined(SORTPP_PASS)DWORD   RtlRunOnceExecuteOnce (    __inout PRTL_RUN_ONCE RunOnce,    __in __callback PRTL_RUN_ONCE_INIT_FN InitFn,    __inout_opt PVOID Parameter,    __deref_opt_out_opt PVOID *Context    );DWORD   RtlRunOnceBeginInitialize (    __inout PRTL_RUN_ONCE RunOnce,    __in DWORD Flags,    __deref_opt_out_opt PVOID *Context    );DWORD   RtlRunOnceComplete (    __inout PRTL_RUN_ONCE RunOnce,    __in DWORD Flags,    __in_opt PVOID Context    );#define HEAP_NO_SERIALIZE               0x00000001      #define HEAP_GROWABLE                   0x00000002      #define HEAP_GENERATE_EXCEPTIONS        0x00000004      #define HEAP_ZERO_MEMORY                0x00000008      #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010      #define HEAP_TAIL_CHECKING_ENABLED      0x00000020      #define HEAP_FREE_CHECKING_ENABLED      0x00000040      #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080      #define HEAP_CREATE_ALIGN_16            0x00010000      #define HEAP_CREATE_ENABLE_TRACING      0x00020000      #define HEAP_CREATE_ENABLE_EXECUTE      0x00040000      #define HEAP_MAXIMUM_TAG                0x0FFF              #define HEAP_PSEUDO_TAG_FLAG            0x8000              #define HEAP_TAG_SHIFT                  18                  #if !defined(MIDL_PASS)FORCEINLINEDWORDHEAP_MAKE_TAG_FLAGS (    IN DWORD TagBase,    IN DWORD Tag    ){    __assume_bound(TagBase);    return ((DWORD)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));}#endif#if (NTDDI_VERSION > NTDDI_WINXP)NTSYSAPIWORD  NTAPIRtlCaptureStackBackTrace(    __in DWORD FramesToSkip,    __in DWORD FramesToCapture,    __out_ecount(FramesToCapture) PVOID *BackTrace,    __out_opt PDWORD BackTraceHash   );#endif#if (NTDDI_VERSION > NTDDI_WIN2K)NTSYSAPIVOIDNTAPIRtlCaptureContext (    __out PCONTEXT ContextRecord    );#endif#define IS_TEXT_UNICODE_ASCII16               0x0001#define IS_TEXT_UNICODE_REVERSE_ASCII16       0x0010#define IS_TEXT_UNICODE_STATISTICS            0x0002#define IS_TEXT_UNICODE_REVERSE_STATISTICS    0x0020#define IS_TEXT_UNICODE_CONTROLS              0x0004#define IS_TEXT_UNICODE_REVERSE_CONTROLS      0x0040#define IS_TEXT_UNICODE_SIGNATURE             0x0008#define IS_TEXT_UNICODE_REVERSE_SIGNATURE     0x0080#define IS_TEXT_UNICODE_ILLEGAL_CHARS         0x0100#define IS_TEXT_UNICODE_ODD_LENGTH            0x0200#define IS_TEXT_UNICODE_DBCS_LEADBYTE         0x0400#define IS_TEXT_UNICODE_NULL_BYTES            0x1000#define IS_TEXT_UNICODE_UNICODE_MASK          0x000F#define IS_TEXT_UNICODE_REVERSE_MASK          0x00F0#define IS_TEXT_UNICODE_NOT_UNICODE_MASK      0x0F00#define IS_TEXT_UNICODE_NOT_ASCII_MASK        0xF000#define COMPRESSION_FORMAT_NONE          (0x0000)   #define COMPRESSION_FORMAT_DEFAULT       (0x0001)   #define COMPRESSION_FORMAT_LZNT1         (0x0002)   #define COMPRESSION_ENGINE_STANDARD      (0x0000)   #define COMPRESSION_ENGINE_MAXIMUM       (0x0100)   #define COMPRESSION_ENGINE_HIBER         (0x0200)   #if _DBG_MEMCPY_INLINE_ && !defined(MIDL_PASS) && !defined(_MEMCPY_INLINE_) && !defined(_CRTBLD)#define _MEMCPY_INLINE_FORCEINLINEPVOID__cdeclmemcpy_inline (    void *dst,    const void *src,    size_t size    ){    //    // Make sure the source and destination do not overlap such that the    // move destroys the destination.    //    if (((char *)dst > (char *)src) &&        ((char *)dst < ((char *)src + size))) {        __debugbreak();    }    return memcpy(dst, src, size);}#define memcpy memcpy_inline#endif#if (NTDDI_VERSION >= NTDDI_WIN2K)NTSYSAPISIZE_TNTAPIRtlCompareMemory (    const VOID *Source1,    const VOID *Source2,    SIZE_T Length    );#endif#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))#if !defined(MIDL_PASS)FORCEINLINEPVOIDRtlSecureZeroMemory(    __in_bcount(cnt) PVOID ptr,    __in SIZE_T cnt    ){    volatile char *vptr = (volatile char *)ptr;#if defined(_M_AMD64)        __stosb((PBYTE )((DWORD64)vptr), 0, cnt);#else    while (cnt) {        *vptr = 0;        vptr++;        cnt--;    }#endif    return ptr;}#endif#define SEF_DACL_AUTO_INHERIT             0x01#define SEF_SACL_AUTO_INHERIT             0x02#define SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT 0x04#define SEF_AVOID_PRIVILEGE_CHECK         0x08#define SEF_AVOID_OWNER_CHECK             0x10#define SEF_DEFAULT_OWNER_FROM_PARENT     0x20#define SEF_DEFAULT_GROUP_FROM_PARENT     0x40#define SEF_MACL_NO_WRITE_UP              0x100#define SEF_MACL_NO_READ_UP               0x200#define SEF_MACL_NO_EXECUTE_UP            0x400#define SEF_AVOID_OWNER_RESTRICTION       0x1000#define SEF_MACL_VALID_FLAGS              (SEF_MACL_NO_WRITE_UP   | \                                           SEF_MACL_NO_READ_UP    | \                                           SEF_MACL_NO_EXECUTE_UP)typedef struct _MESSAGE_RESOURCE_ENTRY {    WORD   Length;    WORD   Flags;    BYTE  Text[ 1 ];} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;#define MESSAGE_RESOURCE_UNICODE 0x0001typedef struct _MESSAGE_RESOURCE_BLOCK {    DWORD LowId;    DWORD HighId;    DWORD OffsetToEntries;} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;typedef struct _MESSAGE_RESOURCE_DATA {    DWORD NumberOfBlocks;    MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];} MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;typedef struct _OSVERSIONINFOA {    DWORD dwOSVersionInfoSize;    DWORD dwMajorVersion;    DWORD dwMinorVersion;    DWORD dwBuildNumber;    DWORD dwPlatformId;    CHAR   szCSDVersion[ 128 ];     // Maintenance string for PSS usage} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;typedef struct _OSVERSIONINFOW {    DWORD dwOSVersionInfoSize;    DWORD dwMajorVersion;    DWORD dwMinorVersion;    DWORD dwBuildNumber;    DWORD dwPlatformId;    WCHAR  szCSDVersion[ 128 ];     // Maintenance string for PSS usage} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;#ifdef UNICODEtypedef OSVERSIONINFOW OSVERSIONINFO;typedef POSVERSIONINFOW POSVERSIONINFO;typedef LPOSVERSIONINFOW LPOSVERSIONINFO;#elsetypedef OSVERSIONINFOA OSVERSIONINFO;typedef POSVERSIONINFOA POSVERSIONINFO;typedef LPOSVERSIONINFOA LPOSVERSIONINFO;#endif // UNICODEtypedef struct _OSVERSIONINFOEXA {    DWORD dwOSVersionInfoSize;    DWORD dwMajorVersion;    DWORD dwMinorVersion;    DWORD dwBuildNumber;    DWORD dwPlatformId;    CHAR   szCSDVersion[ 128 ];     // Maintenance string for PSS usage    WORD   wServicePackMajor;    WORD   wServicePackMinor;    WORD   wSuiteMask;    BYTE  wProductType;    BYTE  wReserved;} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;typedef struct _OSVERSIONINFOEXW {    DWORD dwOSVersionInfoSize;    DWORD dwMajorVersion;    DWORD dwMinorVersion;    DWORD dwBuildNumber;    DWORD dwPlatformId;    WCHAR  szCSDVersion[ 128 ];     // Maintenance string for PSS usage    WORD   wServicePackMajor;    WORD   wServicePackMinor;    WORD   wSuiteMask;    BYTE  wProductType;    BYTE  wReserved;} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;#ifdef UNICODEtypedef OSVERSIONINFOEXW OSVERSIONINFOEX;typedef POSVERSIONINFOEXW POSVERSIONINFOEX;typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;#elsetypedef OSVERSIONINFOEXA OSVERSIONINFOEX;typedef POSVERSIONINFOEXA POSVERSIONINFOEX;typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;#endif // UNICODE//// RtlVerifyVersionInfo() conditions//#define VER_EQUAL                       1#define VER_GREATER                     2#define VER_GREATER_EQUAL               3#define VER_LESS                        4#define VER_LESS_EQUAL                  5#define VER_AND                         6#define VER_OR                          7#define VER_CONDITION_MASK              7#define VER_NUM_BITS_PER_CONDITION_MASK 3//// RtlVerifyVersionInfo() type mask bits//#define VER_MINORVERSION                0x0000001#define VER_MAJORVERSION                0x0000002#define VER_BUILDNUMBER                 0x0000004#define VER_PLATFORMID                  0x0000008#define VER_SERVICEPACKMINOR            0x0000010#define VER_SERVICEPACKMAJOR            0x0000020#define VER_SUITENAME                   0x0000040#define VER_PRODUCT_TYPE                0x0000080//// RtlVerifyVersionInfo() os product type values//#define VER_NT_WORKSTATION              0x0000001#define VER_NT_DOMAIN_CONTROLLER        0x0000002#define VER_NT_SERVER                   0x0000003//// dwPlatformId defines://#define VER_PLATFORM_WIN32s             0#define VER_PLATFORM_WIN32_WINDOWS      1#define VER_PLATFORM_WIN32_NT           2////// VerifyVersionInfo() macro to set the condition mask//// For documentation sakes here's the old version of the macro that got// changed to call an API// #define VER_SET_CONDITION(_m_,_t_,_c_)  _m_=(_m_|(_c_<<(1<<_t_)))//#define VER_SET_CONDITION(_m_,_t_,_c_)  \        ((_m_)=VerSetConditionMask((_m_),(_t_),(_c_)))#if (NTDDI_VERSION >= NTDDI_WIN2K)NTSYSAPIULONGLONGNTAPIVerSetConditionMask(        IN  ULONGLONG   ConditionMask,        IN  DWORD   TypeMask,        IN  BYTE    Condition        );#endif//#if (NTDDI_VERSION >= NTDDI_LONGHORN)NTSYSAPIBOOLEANNTAPIRtlGetProductInfo(    __in  DWORD  OSMajorVersion,    __in  DWORD  OSMinorVersion,    __in  DWORD  SpMajorVersion,    __in  DWORD  SpMinorVersion,    __out PDWORD ReturnedProductType    );#endiftypedef struct _RTL_CRITICAL_SECTION_DEBUG {    WORD   Type;    WORD   CreatorBackTraceIndex;    struct _RTL_CRITICAL_SECTION *CriticalSection;    LIST_ENTRY ProcessLocksList;    DWORD EntryCount;    DWORD ContentionCount;    DWORD Flags;    WORD   CreatorBackTraceIndexHigh;    WORD   SpareWORD  ;} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;#define RTL_CRITSECT_TYPE 0#define RTL_RESOURCE_TYPE 1//// These flags define the upper byte of the critical section SpinCount field//#define RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO         0x01000000#define RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN          0x02000000#define RTL_CRITICAL_SECTION_FLAG_STATIC_INIT           0x04000000#define RTL_CRITICAL_SECTION_ALL_FLAG_BITS              0xFF000000#define RTL_CRITICAL_SECTION_FLAG_RESERVED              (RTL_CRITICAL_SECTION_ALL_FLAG_BITS & (~(RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO | RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN | RTL_CRITICAL_SECTION_FLAG_STATIC_INIT)))//// These flags define possible values stored in the Flags field of a critsec debuginfo.//#define RTL_CRITICAL_SECTION_DEBUG_FLAG_STATIC_INIT     0x00000001#pragma pack(push, 8)typedef struct _RTL_CRITICAL_SECTION {    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;    //    //  The following three fields control entering and exiting the critical    //  section for the resource    //    LONG LockCount;    LONG RecursionCount;    HANDLE OwningThread;        // from the thread's ClientId->UniqueThread    HANDLE LockSemaphore;    ULONG_PTR SpinCount;        // force size on 64-bit systems when packed} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;#pragma pack(pop)typedef struct _RTL_SRWLOCK {                                    PVOID Ptr;                                       } RTL_SRWLOCK, *PRTL_SRWLOCK;                            #define RTL_SRWLOCK_INIT {0}                            typedef struct _RTL_CONDITION_VARIABLE {                            PVOID Ptr;                                       } RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE;      #define RTL_CONDITION_VARIABLE_INIT {0}                 #define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED  0x1     typedef LONG (NTAPI *PVECTORED_EXCEPTION_HANDLER)(    struct _EXCEPTION_POINTERS *ExceptionInfo    );typedef enum _HEAP_INFORMATION_CLASS {    HeapCompatibilityInformation,    HeapEnableTerminationOnCorruption} HEAP_INFORMATION_CLASS;#define WT_EXECUTEDEFAULT       0x00000000                           #define WT_EXECUTEINIOTHREAD    0x00000001                           #define WT_EXECUTEINUITHREAD    0x00000002                           #define WT_EXECUTEINWAITTHREAD  0x00000004                           #define WT_EXECUTEONLYONCE      0x00000008                           #define WT_EXECUTEINTIMERTHREAD 0x00000020                           #define WT_EXECUTELONGFUNCTION  0x00000010                           #define WT_EXECUTEINPERSISTENTIOTHREAD  0x00000040                   #define WT_EXECUTEINPERSISTENTTHREAD 0x00000080                      #define WT_TRANSFER_IMPERSONATION 0x00000100                         #define WT_SET_MAX_THREADPOOL_THREADS(Flags, Limit)  ((Flags) |= (Limit)<<16) typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );   typedef VOID (NTAPI * WORKERCALLBACKFUNC) (PVOID );                 typedef VOID (NTAPI * APC_CALLBACK_FUNCTION) (DWORD   , PVOID, PVOID); typedefVOID(NTAPI *PFLS_CALLBACK_FUNCTION) (    IN PVOID lpFlsData    );#define WT_EXECUTEINLONGTHREAD  0x00000010                           #define WT_EXECUTEDELETEWAIT    0x00000008                           typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {    ActivationContextBasicInformation                       = 1,    ActivationContextDetailedInformation                    = 2,    AssemblyDetailedInformationInActivationContext          = 3,    FileInformationInAssemblyOfAssemblyInActivationContext  = 4,    RunlevelInformationInActivationContext                  = 5,    MaxActivationContextInfoClass,    //    // compatibility with old names    //    AssemblyDetailedInformationInActivationContxt           = 3,    FileInformationInAssemblyOfAssemblyInActivationContxt   = 4} ACTIVATION_CONTEXT_INFO_CLASS;#define ACTIVATIONCONTEXTINFOCLASS ACTIVATION_CONTEXT_INFO_CLASStypedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {    DWORD ulAssemblyIndex;    DWORD ulFileIndexInAssembly;} ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;#define ACTIVATION_CONTEXT_PATH_TYPE_NONE (1)#define ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE (2)#define ACTIVATION_CONTEXT_PATH_TYPE_URL (3)#define ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF (4)typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {    DWORD ulFlags;    DWORD ulFilenameLength;    DWORD ulPathLength;    PCWSTR lpFileName;    PCWSTR lpFilePath;} ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;//// compatibility with old names// The new names use "file" consistently.//#define  _ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION  _ASSEMBLY_FILE_DETAILED_INFORMATION#define   ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION   ASSEMBLY_FILE_DETAILED_INFORMATION#define  PASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION  PASSEMBLY_FILE_DETAILED_INFORMATION#define PCASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PCASSEMBLY_FILE_DETAILED_INFORMATIONtypedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {    DWORD ulFlags;    DWORD ulEncodedAssemblyIdentityLength;      // in bytes    DWORD ulManifestPathType;                   // ACTIVATION_CONTEXT_PATH_TYPE_*    DWORD ulManifestPathLength;                 // in bytes    LARGE_INTEGER liManifestLastWriteTime;      // FILETIME    DWORD ulPolicyPathType;                     // ACTIVATION_CONTEXT_PATH_TYPE_*    DWORD ulPolicyPathLength;                   // in bytes    LARGE_INTEGER liPolicyLastWriteTime;        // FILETIME    DWORD ulMetadataSatelliteRosterIndex;    DWORD ulManifestVersionMajor;               // 1    DWORD ulManifestVersionMinor;               // 0    DWORD ulPolicyVersionMajor;                 // 0    DWORD ulPolicyVersionMinor;                 // 0    DWORD ulAssemblyDirectoryNameLength;        // in bytes    PCWSTR lpAssemblyEncodedAssemblyIdentity;    PCWSTR lpAssemblyManifestPath;    PCWSTR lpAssemblyPolicyPath;    PCWSTR lpAssemblyDirectoryName;    DWORD  ulFileCount;} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;typedef enum{    ACTCTX_RUN_LEVEL_UNSPECIFIED = 0,    ACTCTX_RUN_LEVEL_AS_INVOKER,    ACTCTX_RUN_LEVEL_HIGHEST_AVAILABLE,    ACTCTX_RUN_LEVEL_REQUIRE_ADMIN,    ACTCTX_RUN_LEVEL_NUMBERS} ACTCTX_REQUESTED_RUN_LEVEL;typedef struct _ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION {    DWORD ulFlags;    ACTCTX_REQUESTED_RUN_LEVEL  RunLevel;    DWORD UiAccess;} ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION, * PACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION;typedef const struct _ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION * PCACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION ;typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {    DWORD dwFlags;    DWORD ulFormatVersion;    DWORD ulAssemblyCount;    DWORD ulRootManifestPathType;    DWORD ulRootManifestPathChars;    DWORD ulRootConfigurationPathType;    DWORD ulRootConfigurationPathChars;    DWORD ulAppDirPathType;    DWORD ulAppDirPathChars;    PCWSTR lpRootManifestPath;    PCWSTR lpRootConfigurationPath;    PCWSTR lpAppDirPath;} ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;#define DLL_PROCESS_ATTACH   1    #define DLL_THREAD_ATTACH    2    #define DLL_THREAD_DETACH    3    #define DLL_PROCESS_DETACH   0    //// Defines for the READ flags for Eventlogging//#define EVENTLOG_SEQUENTIAL_READ        0x0001#define EVENTLOG_SEEK_READ              0x0002#define EVENTLOG_FORWARDS_READ          0x0004#define EVENTLOG_BACKWARDS_READ         0x0008//// The types of events that can be logged.//#define EVENTLOG_SUCCESS                0x0000#define EVENTLOG_ERROR_TYPE             0x0001#define EVENTLOG_WARNING_TYPE           0x0002#define EVENTLOG_INFORMATION_TYPE       0x0004#define EVENTLOG_AUDIT_SUCCESS          0x0008#define EVENTLOG_AUDIT_FAILURE          0x0010//// Defines for the WRITE flags used by Auditing for paired events// These are not implemented in Product 1//#define EVENTLOG_START_PAIRED_EVENT    0x0001#define EVENTLOG_END_PAIRED_EVENT      0x0002#define EVENTLOG_END_ALL_PAIRED_EVENTS 0x0004#define EVENTLOG_PAIRED_EVENT_ACTIVE   0x0008#define EVENTLOG_PAIRED_EVENT_INACTIVE 0x0010//// Structure that defines the header of the Eventlog record. This is the// fixed-sized portion before all the variable-length strings, binary// data and pad bytes.//// TimeGenerated is the time it was generated at the client.// TimeWritten is the time it was put into the log at the server end.//typedef struct _EVENTLOGRECORD {    DWORD  Length;        // Length of full record    DWORD  Reserved;      // Used by the service    DWORD  RecordNumber;  // Absolute record number    DWORD  TimeGenerated; // Seconds since 1-1-1970    DWORD  TimeWritten;   // Seconds since 1-1-1970    DWORD  EventID;    WORD   EventType;    WORD   NumStrings;    WORD   EventCategory;    WORD   ReservedFlags; // For use with paired events (auditing)    DWORD  ClosingRecordNumber; // For use with paired events (auditing)    DWORD  StringOffset;  // Offset from beginning of record    DWORD  UserSidLength;    DWORD  UserSidOffset;    DWORD  DataLength;    DWORD  DataOffset;    // Offset from beginning of record    //    // Then follow:    //    // WCHAR SourceName[]    // WCHAR Computername[]    // SID   UserSid    // WCHAR Strings[]    // BYTE  Data[]    // CHAR  Pad[]    // DWORD Length;    //} EVENTLOGRECORD, *PEVENTLOGRECORD;//SS: start of changes to support clustering//SS: ideally the#define MAXLOGICALLOGNAMESIZE   256#if _MSC_VER >= 1200#pragma warning(push)#endif#pragma warning(disable : 4200)typedef struct _EVENTSFORLOGFILE{    DWORD           ulSize;    WCHAR           szLogicalLogFile[MAXLOGICALLOGNAMESIZE];        //name of the logical file-security/application/system    DWORD           ulNumRecords;    EVENTLOGRECORD  pEventLogRecords[];}EVENTSFORLOGFILE, *PEVENTSFORLOGFILE;typedef struct _PACKEDEVENTINFO{    DWORD               ulSize;  //total size of the structure    DWORD               ulNumEventsForLogFile; //number of EventsForLogFile structure that follow    DWORD               ulOffsets[];           //the offsets from the start of this structure to the EVENTSFORLOGFILE structure}PACKEDEVENTINFO, *PPACKEDEVENTINFO;#if _MSC_VER >= 1200#pragma warning(pop)#else#pragma warning(default : 4200)#endif//SS: end of changes to support clustering//// begin_wdm //// Registry Specific Access Rights.//#define KEY_QUERY_VALUE         (0x0001)#define KEY_SET_VALUE           (0x0002)#define KEY_CREATE_SUB_KEY      (0x0004)#define KEY_ENUMERATE_SUB_KEYS  (0x0008)#define KEY_NOTIFY              (0x0010)#define KEY_CREATE_LINK         (0x0020)#define KEY_WOW64_32KEY         (0x0200)#define KEY_WOW64_64KEY         (0x0100)#define KEY_WOW64_RES           (0x0300)#define KEY_READ                ((STANDARD_RIGHTS_READ       |\                                  KEY_QUERY_VALUE            |\                                  KEY_ENUMERATE_SUB_KEYS     |\                                  KEY_NOTIFY)                 \                                  &                           \                                 (~SYNCHRONIZE))#define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\                                  KEY_SET_VALUE              |\                                  KEY_CREATE_SUB_KEY)         \                                  &                           \                                 (~SYNCHRONIZE))#define KEY_EXECUTE             ((KEY_READ)                   \                                  &                           \                                 (~SYNCHRONIZE))#define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\                                  KEY_QUERY_VALUE            |\                                  KEY_SET_VALUE              |\                                  KEY_CREATE_SUB_KEY         |\                                  KEY_ENUMERATE_SUB_KEYS     |\                                  KEY_NOTIFY                 |\                                  KEY_CREATE_LINK)            \                                  &                           \                                 (~SYNCHRONIZE))//// Open/Create Options//#define REG_OPTION_RESERVED         (0x00000000L)   // Parameter is reserved#define REG_OPTION_NON_VOLATILE     (0x00000000L)   // Key is preserved                                                    // when system is rebooted#define REG_OPTION_VOLATILE         (0x00000001L)   // Key is not preserved                                                    // when system is rebooted#define REG_OPTION_CREATE_LINK      (0x00000002L)   // Created key is a                                                    // symbolic link#define REG_OPTION_BACKUP_RESTORE   (0x00000004L)   // open for backup or restore                                                    // special access rules                                                    // privilege required#define REG_OPTION_OPEN_LINK        (0x00000008L)   // Open symbolic link#define REG_LEGAL_OPTION            \                (REG_OPTION_RESERVED            |\                 REG_OPTION_NON_VOLATILE        |\                 REG_OPTION_VOLATILE            |\                 REG_OPTION_CREATE_LINK         |\                 REG_OPTION_BACKUP_RESTORE      |\                 REG_OPTION_OPEN_LINK)//// Key creation/open disposition//#define REG_CREATED_NEW_KEY         (0x00000001L)   // New Registry Key created#define REG_OPENED_EXISTING_KEY     (0x00000002L)   // Existing Key opened//// hive format to be used by Reg(Nt)SaveKeyEx//#define REG_STANDARD_FORMAT     1#define REG_LATEST_FORMAT       2#define REG_NO_COMPRESSION      4//// Key restore & hive load flags//#define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)   // Restore whole hive volatile#define REG_REFRESH_HIVE                (0x00000002L)   // Unwind changes to last flush#define REG_NO_LAZY_FLUSH               (0x00000004L)   // Never lazy flush this hive#define REG_FORCE_RESTORE               (0x00000008L)   // Force the restore process even when we have open handles on subkeys#define REG_APP_HIVE                    (0x00000010L)   // Loads the hive visible to the calling process#define REG_PROCESS_PRIVATE             (0x00000020L)   // Hive cannot be mounted by any other process while in use#define REG_START_JOURNAL               (0x00000040L)   // Starts Hive Journal#define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)   // Grow hive file in exact 4k increments#define REG_HIVE_NO_RM                  (0x00000100L)   // No RM is started for this hive (no transactions)#define REG_HIVE_SINGLE_LOG             (0x00000200L)   // Legacy single logging is used for this hive//// Unload Flags//#define REG_FORCE_UNLOAD            1//// Notify filter values//#define REG_NOTIFY_CHANGE_NAME          (0x00000001L) // Create or delete (child)#define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)#define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L) // time stamp#define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)#define REG_LEGAL_CHANGE_FILTER                 \                (REG_NOTIFY_CHANGE_NAME          |\                 REG_NOTIFY_CHANGE_ATTRIBUTES    |\                 REG_NOTIFY_CHANGE_LAST_SET      |\                 REG_NOTIFY_CHANGE_SECURITY) // end_wdm ////// Predefined Value Types.//#define REG_NONE                    ( 0 )   // No value type#define REG_SZ                      ( 1 )   // Unicode nul terminated string#define REG_EXPAND_SZ               ( 2 )   // Unicode nul terminated string                                            // (with environment variable references)#define REG_BINARY                  ( 3 )   // Free form binary#define REG_DWORD                   ( 4 )   // 32-bit number#define REG_DWORD_LITTLE_ENDIAN     ( 4 )   // 32-bit number (same as REG_DWORD)#define REG_DWORD_BIG_ENDIAN        ( 5 )   // 32-bit number#define REG_LINK                    ( 6 )   // Symbolic Link (unicode)#define REG_MULTI_SZ                ( 7 )   // Multiple Unicode strings#define REG_RESOURCE_LIST           ( 8 )   // Resource list in the resource map#define REG_FULL_RESOURCE_DESCRIPTOR ( 9 )  // Resource list in the hardware description#define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )#define REG_QWORD                   ( 11 )  // 64-bit number#define REG_QWORD_LITTLE_ENDIAN     ( 11 )  // 64-bit number (same as REG_QWORD)// end_wdm// begin_wdm//// Service Types (Bit Mask)//#define SERVICE_KERNEL_DRIVER          0x00000001#define SERVICE_FILE_SYSTEM_DRIVER     0x00000002#define SERVICE_ADAPTER                0x00000004#define SERVICE_RECOGNIZER_DRIVER      0x00000008#define SERVICE_DRIVER                 (SERVICE_KERNEL_DRIVER | \                                        SERVICE_FILE_SYSTEM_DRIVER | \                                        SERVICE_RECOGNIZER_DRIVER)#define SERVICE_WIN32_OWN_PROCESS      0x00000010#define SERVICE_WIN32_SHARE_PROCESS    0x00000020#define SERVICE_WIN32                  (SERVICE_WIN32_OWN_PROCESS | \                                        SERVICE_WIN32_SHARE_PROCESS)#define SERVICE_INTERACTIVE_PROCESS    0x00000100#define SERVICE_TYPE_ALL               (SERVICE_WIN32  | \                                        SERVICE_ADAPTER | \                                        SERVICE_DRIVER  | \                                        SERVICE_INTERACTIVE_PROCESS)//// Start Type//#define SERVICE_BOOT_START             0x00000000#define SERVICE_SYSTEM_START           0x00000001#define SERVICE_AUTO_START             0x00000002#define SERVICE_DEMAND_START           0x00000003#define SERVICE_DISABLED               0x00000004//// Error control type//#define SERVICE_ERROR_IGNORE           0x00000000#define SERVICE_ERROR_NORMAL           0x00000001#define SERVICE_ERROR_SEVERE           0x00000002#define SERVICE_ERROR_CRITICAL         0x00000003////// Define the registry driver node enumerations//typedef enum _CM_SERVICE_NODE_TYPE {    DriverType               = SERVICE_KERNEL_DRIVER,    FileSystemType           = SERVICE_FILE_SYSTEM_DRIVER,    Win32ServiceOwnProcess   = SERVICE_WIN32_OWN_PROCESS,    Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,    AdapterType              = SERVICE_ADAPTER,    RecognizerType           = SERVICE_RECOGNIZER_DRIVER} SERVICE_NODE_TYPE;typedef enum _CM_SERVICE_LOAD_TYPE {    BootLoad    = SERVICE_BOOT_START,    SystemLoad  = SERVICE_SYSTEM_START,    AutoLoad    = SERVICE_AUTO_START,    DemandLoad  = SERVICE_DEMAND_START,    DisableLoad = SERVICE_DISABLED} SERVICE_LOAD_TYPE;typedef enum _CM_ERROR_CONTROL_TYPE {    IgnoreError   = SERVICE_ERROR_IGNORE,    NormalError   = SERVICE_ERROR_NORMAL,    SevereError   = SERVICE_ERROR_SEVERE,    CriticalError = SERVICE_ERROR_CRITICAL} SERVICE_ERROR_TYPE;//// IOCTL_TAPE_ERASE definitions//#define TAPE_ERASE_SHORT            0L#define TAPE_ERASE_LONG             1Ltypedef struct _TAPE_ERASE {    DWORD Type;    BOOLEAN Immediate;} TAPE_ERASE, *PTAPE_ERASE;//// IOCTL_TAPE_PREPARE definitions//#define TAPE_LOAD                   0L#define TAPE_UNLOAD                 1L#define TAPE_TENSION                2L#define TAPE_LOCK                   3L#define TAPE_UNLOCK                 4L#define TAPE_FORMAT                 5Ltypedef struct _TAPE_PREPARE {    DWORD Operation;    BOOLEAN Immediate;} TAPE_PREPARE, *PTAPE_PREPARE;//// IOCTL_TAPE_WRITE_MARKS definitions//#define TAPE_SETMARKS               0L#define TAPE_FILEMARKS              1L#define TAPE_SHORT_FILEMARKS        2L#define TAPE_LONG_FILEMARKS         3Ltypedef struct _TAPE_WRITE_MARKS {    DWORD Type;    DWORD Count;    BOOLEAN Immediate;} TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;//// IOCTL_TAPE_GET_POSITION definitions//#define TAPE_ABSOLUTE_POSITION       0L#define TAPE_LOGICAL_POSITION        1L#define TAPE_PSEUDO_LOGICAL_POSITION 2Ltypedef struct _TAPE_GET_POSITION {    DWORD Type;    DWORD Partition;    LARGE_INTEGER Offset;} TAPE_GET_POSITION, *PTAPE_GET_POSITION;//// IOCTL_TAPE_SET_POSITION definitions//#define TAPE_REWIND                 0L#define TAPE_ABSOLUTE_BLOCK         1L#define TAPE_LOGICAL_BLOCK          2L#define TAPE_PSEUDO_LOGICAL_BLOCK   3L#define TAPE_SPACE_END_OF_DATA      4L#define TAPE_SPACE_RELATIVE_BLOCKS  5L#define TAPE_SPACE_FILEMARKS        6L#define TAPE_SPACE_SEQUENTIAL_FMKS  7L#define TAPE_SPACE_SETMARKS         8L#define TAPE_SPACE_SEQUENTIAL_SMKS  9Ltypedef struct _TAPE_SET_POSITION {    DWORD Method;    DWORD Partition;    LARGE_INTEGER Offset;    BOOLEAN Immediate;} TAPE_SET_POSITION, *PTAPE_SET_POSITION;//// IOCTL_TAPE_GET_DRIVE_PARAMS definitions////// Definitions for FeaturesLow parameter//#define TAPE_DRIVE_FIXED            0x00000001#define TAPE_DRIVE_SELECT           0x00000002#define TAPE_DRIVE_INITIATOR        0x00000004#define TAPE_DRIVE_ERASE_SHORT      0x00000010#define TAPE_DRIVE_ERASE_LONG       0x00000020#define TAPE_DRIVE_ERASE_BOP_ONLY   0x00000040#define TAPE_DRIVE_ERASE_IMMEDIATE  0x00000080#define TAPE_DRIVE_TAPE_CAPACITY    0x00000100#define TAPE_DRIVE_TAPE_REMAINING   0x00000200#define TAPE_DRIVE_FIXED_BLOCK      0x00000400#define TAPE_DRIVE_VARIABLE_BLOCK   0x00000800#define TAPE_DRIVE_WRITE_PROTECT    0x00001000#define TAPE_DRIVE_EOT_WZ_SIZE      0x00002000#define TAPE_DRIVE_ECC              0x00010000#define TAPE_DRIVE_COMPRESSION      0x00020000#define TAPE_DRIVE_PADDING          0x00040000#define TAPE_DRIVE_REPORT_SMKS      0x00080000#define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x00100000#define TAPE_DRIVE_GET_LOGICAL_BLK  0x00200000#define TAPE_DRIVE_SET_EOT_WZ_SIZE  0x00400000#define TAPE_DRIVE_EJECT_MEDIA      0x01000000#define TAPE_DRIVE_CLEAN_REQUESTS   0x02000000#define TAPE_DRIVE_SET_CMP_BOP_ONLY 0x04000000#define TAPE_DRIVE_RESERVED_BIT     0x80000000  //don't use this bit!//                                              //can't be a low features bit!//                                              //reserved; high features only//// Definitions for FeaturesHigh parameter//#define TAPE_DRIVE_LOAD_UNLOAD      0x80000001#define TAPE_DRIVE_TENSION          0x80000002#define TAPE_DRIVE_LOCK_UNLOCK      0x80000004#define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008#define TAPE_DRIVE_SET_BLOCK_SIZE   0x80000010#define TAPE_DRIVE_LOAD_UNLD_IMMED  0x80000020#define TAPE_DRIVE_TENSION_IMMED    0x80000040#define TAPE_DRIVE_LOCK_UNLK_IMMED  0x80000080#define TAPE_DRIVE_SET_ECC          0x80000100#define TAPE_DRIVE_SET_COMPRESSION  0x80000200#define TAPE_DRIVE_SET_PADDING      0x80000400#define TAPE_DRIVE_SET_REPORT_SMKS  0x80000800#define TAPE_DRIVE_ABSOLUTE_BLK     0x80001000#define TAPE_DRIVE_ABS_BLK_IMMED    0x80002000#define TAPE_DRIVE_LOGICAL_BLK      0x80004000#define TAPE_DRIVE_LOG_BLK_IMMED    0x80008000#define TAPE_DRIVE_END_OF_DATA      0x80010000#define TAPE_DRIVE_RELATIVE_BLKS    0x80020000#define TAPE_DRIVE_FILEMARKS        0x80040000#define TAPE_DRIVE_SEQUENTIAL_FMKS  0x80080000#define TAPE_DRIVE_SETMARKS         0x80100000#define TAPE_DRIVE_SEQUENTIAL_SMKS  0x80200000#define TAPE_DRIVE_REVERSE_POSITION 0x80400000#define TAPE_DRIVE_SPACE_IMMEDIATE  0x80800000#define TAPE_DRIVE_WRITE_SETMARKS   0x81000000#define TAPE_DRIVE_WRITE_FILEMARKS  0x82000000#define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000#define TAPE_DRIVE_WRITE_LONG_FMKS  0x88000000#define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000#define TAPE_DRIVE_FORMAT           0xA0000000#define TAPE_DRIVE_FORMAT_IMMEDIATE 0xC0000000#define TAPE_DRIVE_HIGH_FEATURES    0x80000000  //mask for high features flagtypedef struct _TAPE_GET_DRIVE_PARAMETERS {    BOOLEAN ECC;    BOOLEAN Compression;    BOOLEAN DataPadding;    BOOLEAN ReportSetmarks;    DWORD DefaultBlockSize;    DWORD MaximumBlockSize;    DWORD MinimumBlockSize;    DWORD MaximumPartitionCount;    DWORD FeaturesLow;    DWORD FeaturesHigh;    DWORD EOTWarningZoneSize;} TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;//// IOCTL_TAPE_SET_DRIVE_PARAMETERS definitions//typedef struct _TAPE_SET_DRIVE_PARAMETERS {    BOOLEAN ECC;    BOOLEAN Compression;    BOOLEAN DataPadding;    BOOLEAN ReportSetmarks;    DWORD EOTWarningZoneSize;} TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;//// IOCTL_TAPE_GET_MEDIA_PARAMETERS definitions//typedef struct _TAPE_GET_MEDIA_PARAMETERS {    LARGE_INTEGER Capacity;    LARGE_INTEGER Remaining;    DWORD BlockSize;    DWORD PartitionCount;    BOOLEAN WriteProtected;} TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;//// IOCTL_TAPE_SET_MEDIA_PARAMETERS definitions//typedef struct _TAPE_SET_MEDIA_PARAMETERS {    DWORD BlockSize;} TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;//// IOCTL_TAPE_CREATE_PARTITION definitions//#define TAPE_FIXED_PARTITIONS       0L#define TAPE_SELECT_PARTITIONS      1L#define TAPE_INITIATOR_PARTITIONS   2Ltypedef struct _TAPE_CREATE_PARTITION {    DWORD Method;    DWORD Count;    DWORD Size;} TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;//// WMI Methods//#define TAPE_QUERY_DRIVE_PARAMETERS       0L#define TAPE_QUERY_MEDIA_CAPACITY         1L#define TAPE_CHECK_FOR_DRIVE_PROBLEM      2L#define TAPE_QUERY_IO_ERROR_DATA          3L#define TAPE_QUERY_DEVICE_ERROR_DATA      4Ltypedef struct _TAPE_WMI_OPERATIONS {   DWORD Method;   DWORD DataBufferSize;   PVOID DataBuffer;} TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;//// Type of drive errors//typedef enum _TAPE_DRIVE_PROBLEM_TYPE {   TapeDriveProblemNone, TapeDriveReadWriteWarning,   TapeDriveReadWriteError, TapeDriveReadWarning,   TapeDriveWriteWarning, TapeDriveReadError,   TapeDriveWriteError, TapeDriveHardwareError,   TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError,   TapeDriveTimetoClean, TapeDriveCleanDriveNow,   TapeDriveMediaLifeExpired, TapeDriveSnappedTape} TAPE_DRIVE_PROBLEM_TYPE;#ifndef _NTTMAPI_#define _NTTMAPI_#ifdef __cplusplusextern "C" {#endif#include <ktmtypes.h>//// Types for Nt level TM calls////// KTM Tm object rights//#define TRANSACTIONMANAGER_QUERY_INFORMATION     ( 0x0001 )#define TRANSACTIONMANAGER_SET_INFORMATION       ( 0x0002 )#define TRANSACTIONMANAGER_RECOVER               ( 0x0004 )#define TRANSACTIONMANAGER_RENAME                ( 0x0008 )#define TRANSACTIONMANAGER_CREATE_RM             ( 0x0010 )// The following right is intended for DTC's use only; it will be// deprecated, and no one else should take a dependency on it.#define TRANSACTIONMANAGER_BIND_TRANSACTION      ( 0x0020 )//// Generic mappings for transaction manager rights.//#define TRANSACTIONMANAGER_GENERIC_READ            (STANDARD_RIGHTS_READ            |\                                                    TRANSACTIONMANAGER_QUERY_INFORMATION)#define TRANSACTIONMANAGER_GENERIC_WRITE           (STANDARD_RIGHTS_WRITE           |\                                                    TRANSACTIONMANAGER_SET_INFORMATION     |\                                                    TRANSACTIONMANAGER_RECOVER             |\                                                    TRANSACTIONMANAGER_RENAME              |\                                                    TRANSACTIONMANAGER_CREATE_RM)#define TRANSACTIONMANAGER_GENERIC_EXECUTE         (STANDARD_RIGHTS_EXECUTE)#define TRANSACTIONMANAGER_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED        |\                                                    TRANSACTIONMANAGER_GENERIC_READ        |\                                                    TRANSACTIONMANAGER_GENERIC_WRITE       |\                                                    TRANSACTIONMANAGER_GENERIC_EXECUTE     |\                                                    TRANSACTIONMANAGER_BIND_TRANSACTION)//// KTM transaction object rights.//#define TRANSACTION_QUERY_INFORMATION     ( 0x0001 )#define TRANSACTION_SET_INFORMATION       ( 0x0002 )#define TRANSACTION_ENLIST                ( 0x0004 )#define TRANSACTION_COMMIT                ( 0x0008 )#define TRANSACTION_ROLLBACK              ( 0x0010 )#define TRANSACTION_PROPAGATE             ( 0x0020 )#define TRANSACTION_SAVEPOINT             ( 0x0040 )#define TRANSACTION_MARSHALL              ( TRANSACTION_QUERY_INFORMATION )//// Generic mappings for transaction rights.// Resource managers, when enlisting, should generally use the macro// TRANSACTION_RESOURCE_MANAGER_RIGHTS when opening a transaction.// It's the same as generic read and write except that it does not allow// a commit decision to be made.//#define TRANSACTION_GENERIC_READ            (STANDARD_RIGHTS_READ            |\                                             TRANSACTION_QUERY_INFORMATION   |\                                             SYNCHRONIZE)#define TRANSACTION_GENERIC_WRITE           (STANDARD_RIGHTS_WRITE           |\                                             TRANSACTION_SET_INFORMATION     |\                                             TRANSACTION_COMMIT              |\                                             TRANSACTION_ENLIST              |\                                             TRANSACTION_ROLLBACK            |\                                             TRANSACTION_PROPAGATE           |\                                             TRANSACTION_SAVEPOINT           |\                                             SYNCHRONIZE)#define TRANSACTION_GENERIC_EXECUTE         (STANDARD_RIGHTS_EXECUTE         |\                                             TRANSACTION_COMMIT              |\                                             TRANSACTION_ROLLBACK            |\                                             SYNCHRONIZE)#define TRANSACTION_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED        |\                                             TRANSACTION_GENERIC_READ        |\                                             TRANSACTION_GENERIC_WRITE       |\                                             TRANSACTION_GENERIC_EXECUTE)#define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ        |\                                             STANDARD_RIGHTS_WRITE           |\                                             TRANSACTION_SET_INFORMATION     |\                                             TRANSACTION_ENLIST              |\                                             TRANSACTION_ROLLBACK            |\                                             TRANSACTION_PROPAGATE           |\                                             SYNCHRONIZE)//// KTM resource manager object rights.//#define RESOURCEMANAGER_QUERY_INFORMATION     ( 0x0001 )#define RESOURCEMANAGER_SET_INFORMATION       ( 0x0002 )#define RESOURCEMANAGER_RECOVER               ( 0x0004 )#define RESOURCEMANAGER_ENLIST                ( 0x0008 )#define RESOURCEMANAGER_GET_NOTIFICATION      ( 0x0010 )#define RESOURCEMANAGER_REGISTER_PROTOCOL     ( 0x0020 )#define RESOURCEMANAGER_COMPLETE_PROPAGATION  ( 0x0040 )//// Generic mappings for resource manager rights.//#define RESOURCEMANAGER_GENERIC_READ        (STANDARD_RIGHTS_READ                 |\                                             RESOURCEMANAGER_QUERY_INFORMATION    |\                                             SYNCHRONIZE)#define RESOURCEMANAGER_GENERIC_WRITE       (STANDARD_RIGHTS_WRITE                |\                                             RESOURCEMANAGER_SET_INFORMATION      |\                                             RESOURCEMANAGER_RECOVER              |\                                             RESOURCEMANAGER_ENLIST               |\                                             RESOURCEMANAGER_GET_NOTIFICATION     |\                                             RESOURCEMANAGER_REGISTER_PROTOCOL    |\                                             RESOURCEMANAGER_COMPLETE_PROPAGATION |\                                             SYNCHRONIZE)#define RESOURCEMANAGER_GENERIC_EXECUTE     (STANDARD_RIGHTS_EXECUTE              |\                                             RESOURCEMANAGER_RECOVER              |\                                             RESOURCEMANAGER_ENLIST               |\                                             RESOURCEMANAGER_GET_NOTIFICATION     |\                                             RESOURCEMANAGER_COMPLETE_PROPAGATION |\                                             SYNCHRONIZE)#define RESOURCEMANAGER_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED             |\                                             RESOURCEMANAGER_GENERIC_READ         |\                                             RESOURCEMANAGER_GENERIC_WRITE        |\                                             RESOURCEMANAGER_GENERIC_EXECUTE)//// KTM enlistment object rights.//#define ENLISTMENT_QUERY_INFORMATION     ( 0x0001 )#define ENLISTMENT_SET_INFORMATION       ( 0x0002 )#define ENLISTMENT_RECOVER               ( 0x0004 )#define ENLISTMENT_SUBORDINATE_RIGHTS    ( 0x0008 )#define ENLISTMENT_SUPERIOR_RIGHTS       ( 0x0010 )//// Generic mappings for enlistment rights.//#define ENLISTMENT_GENERIC_READ        (STANDARD_RIGHTS_READ           |\                                        ENLISTMENT_QUERY_INFORMATION)#define ENLISTMENT_GENERIC_WRITE       (STANDARD_RIGHTS_WRITE          |\                                        ENLISTMENT_SET_INFORMATION     |\                                        ENLISTMENT_RECOVER             |\                                        ENLISTMENT_SUBORDINATE_RIGHTS  |\                                        ENLISTMENT_SUPERIOR_RIGHTS)#define ENLISTMENT_GENERIC_EXECUTE     (STANDARD_RIGHTS_EXECUTE        |\                                        ENLISTMENT_RECOVER             |\                                        ENLISTMENT_SUBORDINATE_RIGHTS  |\                                        ENLISTMENT_SUPERIOR_RIGHTS)#define ENLISTMENT_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED       |\                                        ENLISTMENT_GENERIC_READ        |\                                        ENLISTMENT_GENERIC_WRITE       |\                                        ENLISTMENT_GENERIC_EXECUTE)//// Transaction outcomes.//// TODO: warning, must match values in KTRANSACTION_OUTCOME duplicated def // in tm.h.//typedef enum _TRANSACTION_OUTCOME {    TransactionOutcomeUndetermined = 1,    TransactionOutcomeCommitted,    TransactionOutcomeAborted,} TRANSACTION_OUTCOME;typedef enum _TRANSACTION_STATE {    TransactionStateNormal = 1,    TransactionStateIndoubt,    TransactionStateCommittedNotify,} TRANSACTION_STATE;typedef struct _TRANSACTION_BASIC_INFORMATION {    GUID    TransactionId;    DWORD   State;    DWORD   Outcome;} TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {    GUID    TmIdentity;    LARGE_INTEGER VirtualClock;} TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {    GUID  LogIdentity;} TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {    DWORD LogPathLength;    __field_ecount(LogPathLength) WCHAR LogPath[1]; // Variable size//  Data[1];                                        // Variable size data not declared} TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;typedef struct _TRANSACTION_PROPERTIES_INFORMATION {    DWORD              IsolationLevel;    DWORD              IsolationFlags;    LARGE_INTEGER      Timeout;    DWORD              Outcome;    DWORD              DescriptionLength;    WCHAR              Description[1];            // Variable size//          Data[1];            // Variable size data not declared} TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;// The following info-class is intended for DTC's use only; it will be// deprecated, and no one else should take a dependency on it.typedef struct _TRANSACTION_BIND_INFORMATION {    HANDLE TmHandle;} TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;typedef struct _TRANSACTION_ENLISTMENT_PAIR {    GUID   EnlistmentId;    GUID   ResourceManagerId;} TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {    DWORD                       NumberOfEnlistments;    TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; // Variable size} TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;typedef struct _TRANSACTION_FULL_INFORMATION {// Not currently defined    DWORD   NameLength;} TRANSACTION_FULL_INFORMATION, *PTRANSACTION_FULL_INFORMATION;typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {    GUID    ResourceManagerId;    DWORD   DescriptionLength;    WCHAR   Description[1];            // Variable size} RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {    HANDLE    IoCompletionPortHandle;    ULONG_PTR CompletionKey;} RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;// end_wdmtypedef struct _TRANSACTION_NAME_INFORMATION {    DWORD   NameLength;    WCHAR   Name[1];            // Variable length string} TRANSACTION_NAME_INFORMATION, *PTRANSACTION_NAME_INFORMATION;// begin_wdmtypedef enum _TRANSACTION_INFORMATION_CLASS {    TransactionBasicInformation,    TransactionPropertiesInformation,    TransactionEnlistmentInformation,    TransactionFullInformation// end_wdm    ,// The following info-class is intended for DTC's use only; it will be// deprecated, and no one else should take a dependency on it.    TransactionBindInformation // private and deprecated    ,//    TransactionNameInformation// begin_wdm} TRANSACTION_INFORMATION_CLASS;// begin_wdmtypedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {    TransactionManagerBasicInformation,    TransactionManagerLogInformation,    TransactionManagerLogPathInformation,    TransactionManagerOnlineProbeInformation// end_wdm// begin_wdm} TRANSACTIONMANAGER_INFORMATION_CLASS;// begin_wdmtypedef enum _RESOURCEMANAGER_INFORMATION_CLASS {    ResourceManagerBasicInformation,    ResourceManagerCompletionInformation,    ResourceManagerFullInformation// end_wdm    ,    ResourceManagerNameInformation// begin_wdm} RESOURCEMANAGER_INFORMATION_CLASS;typedef struct _ENLISTMENT_BASIC_INFORMATION {    GUID    EnlistmentId;    GUID    TransactionId;    GUID    ResourceManagerId;} ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;// begin_wdmtypedef enum _ENLISTMENT_INFORMATION_CLASS {    EnlistmentBasicInformation,    EnlistmentRecoveryInformation,    EnlistmentFullInformation// end_wdm    ,    EnlistmentNameInformation// begin_wdm} ENLISTMENT_INFORMATION_CLASS;typedef struct _TRANSACTION_LIST_ENTRY {    UOW    UOW;} TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;typedef struct _TRANSACTION_LIST_INFORMATION {    DWORD   NumberOfTransactions;    TRANSACTION_LIST_ENTRY TransactionInformation[1]; // Var size} TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;//// Types of objects known to the kernel transaction manager.//typedef enum _KTMOBJECT_TYPE {    KTMOBJECT_TRANSACTION,    KTMOBJECT_TRANSACTION_MANAGER,    KTMOBJECT_RESOURCE_MANAGER,    KTMOBJECT_ENLISTMENT,    KTMOBJECT_INVALID} KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;//// KTMOBJECT_CURSOR//// Used by NtEnumerateTransactionObject to enumerate a transaction// object namespace (e.g. enlistments in a resource manager).//typedef struct _KTMOBJECT_CURSOR {    //    // The last GUID enumerated; zero if beginning enumeration.    //     GUID    LastQuery;    //    // A count of GUIDs filled in by this last enumeration.    //     DWORD   ObjectIdCount;    //    // ObjectIdCount GUIDs from the namespace specified.    //     GUID    ObjectIds[1];} KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;// begin_wdm#ifdef __cplusplus}#endif#endif // _NTTMAPI_typedef DWORD TP_VERSION, *PTP_VERSION; typedef struct _TP_CALLBACK_INSTANCE TP_CALLBACK_INSTANCE, *PTP_CALLBACK_INSTANCE;typedef VOID (NTAPI *PTP_SIMPLE_CALLBACK)(    __inout     PTP_CALLBACK_INSTANCE Instance,    __inout_opt PVOID                 Context    );typedef struct _TP_POOL TP_POOL, *PTP_POOL; typedef struct _TP_CLEANUP_GROUP TP_CLEANUP_GROUP, *PTP_CLEANUP_GROUP; typedef VOID (NTAPI *PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(    __inout_opt PVOID ObjectContext,    __inout_opt PVOID CleanupContext    );//// Do not manipulate this structure directly!  Allocate space for it// and use the inline interfaces below.//typedef struct _TP_CALLBACK_ENVIRON {    TP_VERSION                         Version;    PTP_POOL                           Pool;    PTP_CLEANUP_GROUP                  CleanupGroup;    PTP_CLEANUP_GROUP_CANCEL_CALLBACK  CleanupGroupCancelCallback;    PVOID                              RaceDll;    struct _ACTIVATION_CONTEXT        *ActivationContext;    PTP_SIMPLE_CALLBACK                FinalizationCallback;    union {        DWORD                          Flags;        struct {            DWORD                      LongFunction :  1;            DWORD                      Private      : 31;        } s;    } u;} TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON;#if !defined(MIDL_PASS)FORCEINLINEVOIDTpInitializeCallbackEnviron(    __out PTP_CALLBACK_ENVIRON CallbackEnviron    ){    CallbackEnviron->Version = 1;    CallbackEnviron->Pool = NULL;    CallbackEnviron->CleanupGroup = NULL;    CallbackEnviron->CleanupGroupCancelCallback = NULL;    CallbackEnviron->RaceDll = NULL;    CallbackEnviron->ActivationContext = NULL;    CallbackEnviron->FinalizationCallback = NULL;    CallbackEnviron->u.Flags = 0;}FORCEINLINEVOIDTpSetCallbackThreadpool(    __inout PTP_CALLBACK_ENVIRON CallbackEnviron,    __in    PTP_POOL             Pool    ){    CallbackEnviron->Pool = Pool;}FORCEINLINEVOIDTpSetCallbackCleanupGroup(    __inout  PTP_CALLBACK_ENVIRON              CallbackEnviron,    __in     PTP_CLEANUP_GROUP                 CleanupGroup,    __in_opt PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback    ){    CallbackEnviron->CleanupGroup = CleanupGroup;    CallbackEnviron->CleanupGroupCancelCallback = CleanupGroupCancelCallback;}FORCEINLINEVOIDTpSetCallbackActivationContext(    __inout  PTP_CALLBACK_ENVIRON CallbackEnviron,    __in_opt struct _ACTIVATION_CONTEXT *ActivationContext    ){    CallbackEnviron->ActivationContext = ActivationContext;}FORCEINLINEVOIDTpSetCallbackNoActivationContext(    __inout PTP_CALLBACK_ENVIRON CallbackEnviron    ){    CallbackEnviron->ActivationContext = (struct _ACTIVATION_CONTEXT *)(LONG_PTR) -1; // INVALID_ACTIVATION_CONTEXT}FORCEINLINEVOIDTpSetCallbackLongFunction(    __inout PTP_CALLBACK_ENVIRON CallbackEnviron    ){    CallbackEnviron->u.s.LongFunction = 1;}FORCEINLINEVOIDTpSetCallbackRaceWithDll(    __inout PTP_CALLBACK_ENVIRON CallbackEnviron,    __in    PVOID                DllHandle    ){    CallbackEnviron->RaceDll = DllHandle;}FORCEINLINEVOIDTpSetCallbackFinalizationCallback(    __inout PTP_CALLBACK_ENVIRON CallbackEnviron,    __in    PTP_SIMPLE_CALLBACK  FinalizationCallback    ){    CallbackEnviron->FinalizationCallback = FinalizationCallback;}FORCEINLINEVOIDTpDestroyCallbackEnviron(    __in PTP_CALLBACK_ENVIRON CallbackEnviron    ){    //    // For the current version of the callback environment, no actions    // need to be taken to tear down an initialized structure.  This    // may change in a future release.    //        UNREFERENCED_PARAMETER(CallbackEnviron);}#endif // !defined(MIDL_PASS)typedef struct _TP_WORK TP_WORK, *PTP_WORK;typedef VOID (NTAPI *PTP_WORK_CALLBACK)(    __inout     PTP_CALLBACK_INSTANCE Instance,    __inout_opt PVOID                 Context,    __inout     PTP_WORK              Work    );typedef struct _TP_TIMER TP_TIMER, *PTP_TIMER;typedef VOID (NTAPI *PTP_TIMER_CALLBACK)(    __inout     PTP_CALLBACK_INSTANCE Instance,    __inout_opt PVOID                 Context,    __inout     PTP_TIMER             Timer    );typedef DWORD    TP_WAIT_RESULT;typedef struct _TP_WAIT TP_WAIT, *PTP_WAIT;typedef VOID (NTAPI *PTP_WAIT_CALLBACK)(    __inout     PTP_CALLBACK_INSTANCE Instance,    __inout_opt PVOID                 Context,    __inout     PTP_WAIT              Wait,    __in        TP_WAIT_RESULT        WaitResult    );typedef struct _TP_IO TP_IO, *PTP_IO;#if defined(_M_AMD64) && !defined(__midl)__forceinlinestruct _TEB *NtCurrentTeb (    VOID    ){    return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB, Self));}__forceinlinePVOIDGetCurrentFiber (    VOID    ){    return (PVOID)__readgsqword(FIELD_OFFSET(NT_TIB, FiberData));}__forceinlinePVOIDGetFiberData (    VOID    ){    return *(PVOID *)GetCurrentFiber();}#endif // _M_AMD64 && !defined(__midl)#if defined(_M_IX86) && !defined(MIDL_PASS)#define PcTeb 0x18#if (_MSC_FULL_VER >= 13012035)__inline struct _TEB * NtCurrentTeb( void ) { return (struct _TEB *) (ULONG_PTR) __readfsdword (PcTeb); }#else#if _MSC_VER >= 1200#pragma warning(push)#endif#pragma warning (disable:4035)        // disable 4035 (function must return something)__inline struct _TEB * NtCurrentTeb( void ) { __asm mov eax, fs:[PcTeb] }#if _MSC_VER >= 1200#pragma warning(pop)#else#pragma warning (default:4035)        // reenable it#endif#endif#endif // defined(_M_IX86) && !defined(MIDL_PASS)#if (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100) || ISOLATION_AWARE_ENABLED // winnt_only#define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION         (1)#define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION              (2)#define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION     (3)#define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION       (4)#define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION    (5)#define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION (6)#define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION       (7)#define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE   (8)#define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES               (9)#define ACTIVATION_CONTEXT_SECTION_APPLICATION_SETTINGS         (10)#endif // winnt_only#ifdef __cplusplus}#endif#endif /* _WINNT_ */