LCOV - code coverage report
Current view: directory - cygdrive/c/program files/microsoft sdks/windows/v6.0a/include - winnt.h (source / functions) Found Hit Coverage
Test: coverage.lcov Lines: 9 9 100.0 %
Date: 2014-12-17 Functions: 0 0 -

       1                 : /*++ BUILD Version: 0091     Increment this if a change has global effects

       2                 : 
       3                 : Copyright (c) Microsoft Corporation. All rights reserved.
       4                 : 
       5                 : Module Name:
       6                 : 
       7                 :     winnt.h
       8                 : 
       9                 : Abstract:
      10                 : 
      11                 :     This module defines the 32-Bit Windows types and constants that are
      12                 :     defined by NT, but exposed through the Win32 API.
      13                 : 
      14                 : Revision History:
      15                 : 
      16                 : --*/
      17                 : 
      18                 : #ifndef _WINNT_
      19                 : #define _WINNT_
      20                 : 
      21                 : #ifdef __cplusplus
      22                 : extern "C" {
      23                 : #endif
      24                 : 
      25                 : #include <ctype.h>  
      26                 : #define ANYSIZE_ARRAY 1       
      27                 : 
      28                 : #include <specstrings.h>
      29                 : 
      30                 : #if defined(_M_MRX000) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) && defined(ENABLE_RESTRICTED)
      31                 : #define RESTRICTED_POINTER __restrict
      32                 : #else
      33                 : #define RESTRICTED_POINTER
      34                 : #endif
      35                 : 
      36                 : #if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64)
      37                 : #define ALIGNMENT_MACHINE
      38                 : #define UNALIGNED __unaligned
      39                 : #if defined(_WIN64)
      40                 : #define UNALIGNED64 __unaligned
      41                 : #else
      42                 : #define UNALIGNED64
      43                 : #endif
      44                 : #else
      45                 : #undef ALIGNMENT_MACHINE
      46                 : #define UNALIGNED
      47                 : #define UNALIGNED64
      48                 : #endif
      49                 : 
      50                 : 
      51                 : #if defined(_WIN64) || defined(_M_ALPHA)
      52                 : #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
      53                 : #define MEMORY_ALLOCATION_ALIGNMENT 16
      54                 : #else
      55                 : #define MAX_NATURAL_ALIGNMENT sizeof(DWORD)
      56                 : #define MEMORY_ALLOCATION_ALIGNMENT 8
      57                 : #endif
      58                 : 
      59                 : //
      60                 : // TYPE_ALIGNMENT will return the alignment requirements of a given type for
      61                 : // the current platform.
      62                 : //
      63                 : 
      64                 : #ifdef __cplusplus
      65                 : #if _MSC_VER >= 1300
      66                 : #define TYPE_ALIGNMENT( t ) __alignof(t)
      67                 : #endif
      68                 : #else
      69                 : #define TYPE_ALIGNMENT( t ) \
      70                 :     FIELD_OFFSET( struct { char x; t test; }, test )
      71                 : #endif
      72                 : 
      73                 : #if defined(_WIN64)
      74                 : 
      75                 : #if defined(_AMD64_)
      76                 : #define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
      77                 : #elif defined(_IA64_)
      78                 : #define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? \
      79                 :                               TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD ))
      80                 : #else
      81                 : #error "No Target Architecture"
      82                 : #endif
      83                 : 
      84                 : #define PROBE_ALIGNMENT32( _s ) TYPE_ALIGNMENT( DWORD )
      85                 : 
      86                 : #else
      87                 : 
      88                 : #define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
      89                 : 
      90                 : #endif
      91                 : 
      92                 : //
      93                 : // C_ASSERT() can be used to perform many compile-time assertions:
      94                 : //            type sizes, field offsets, etc.
      95                 : //
      96                 : // An assertion failure results in error C2118: negative subscript.
      97                 : //
      98                 : 
      99                 : #ifndef SORTPP_PASS
     100                 : #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
     101                 : #else
     102                 : #define C_ASSERT(e) /* nothing */
     103                 : #endif
     104                 : 
     105                 : #include <basetsd.h>
     106                 : 
     107                 : 
     108                 : #if (defined(_M_IX86) || defined(_M_IA64) || defined(_M_AMD64)) && !defined(MIDL_PASS)
     109                 : #define DECLSPEC_IMPORT __declspec(dllimport)
     110                 : #else
     111                 : #define DECLSPEC_IMPORT
     112                 : #endif
     113                 : 
     114                 : #ifndef DECLSPEC_NORETURN
     115                 : #if (_MSC_VER >= 1200) && !defined(MIDL_PASS)
     116                 : #define DECLSPEC_NORETURN   __declspec(noreturn)
     117                 : #else
     118                 : #define DECLSPEC_NORETURN
     119                 : #endif
     120                 : #endif
     121                 : 
     122                 : #ifndef DECLSPEC_NOTHROW
     123                 : #if (_MSC_VER >= 1200) && !defined(MIDL_PASS)
     124                 : #define DECLSPEC_NOTHROW   __declspec(nothrow)
     125                 : #else
     126                 : #define DECLSPEC_NOTHROW
     127                 : #endif
     128                 : #endif
     129                 : 
     130                 : #ifndef DECLSPEC_ALIGN
     131                 : #if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
     132                 : #define DECLSPEC_ALIGN(x)   __declspec(align(x))
     133                 : #else
     134                 : #define DECLSPEC_ALIGN(x)
     135                 : #endif
     136                 : #endif
     137                 : 
     138                 : #ifndef SYSTEM_CACHE_ALIGNMENT_SIZE
     139                 : #if defined(_AMD64_) || defined(_X86_)
     140                 : #define SYSTEM_CACHE_ALIGNMENT_SIZE 64
     141                 : #else
     142                 : #define SYSTEM_CACHE_ALIGNMENT_SIZE 128
     143                 : #endif
     144                 : #endif
     145                 : 
     146                 : #ifndef DECLSPEC_CACHEALIGN
     147                 : #define DECLSPEC_CACHEALIGN DECLSPEC_ALIGN(SYSTEM_CACHE_ALIGNMENT_SIZE)
     148                 : #endif
     149                 : 
     150                 : #ifndef DECLSPEC_UUID
     151                 : #if (_MSC_VER >= 1100) && defined (__cplusplus)
     152                 : #define DECLSPEC_UUID(x)    __declspec(uuid(x))
     153                 : #else
     154                 : #define DECLSPEC_UUID(x)
     155                 : #endif
     156                 : #endif
     157                 : 
     158                 : #ifndef DECLSPEC_NOVTABLE
     159                 : #if (_MSC_VER >= 1100) && defined(__cplusplus)
     160                 : #define DECLSPEC_NOVTABLE   __declspec(novtable)
     161                 : #else
     162                 : #define DECLSPEC_NOVTABLE
     163                 : #endif
     164                 : #endif
     165                 : 
     166                 : #ifndef DECLSPEC_SELECTANY
     167                 : #if (_MSC_VER >= 1100)
     168                 : #define DECLSPEC_SELECTANY  __declspec(selectany)
     169                 : #else
     170                 : #define DECLSPEC_SELECTANY
     171                 : #endif
     172                 : #endif
     173                 : 
     174                 : #ifndef NOP_FUNCTION
     175                 : #if (_MSC_VER >= 1210)
     176                 : #define NOP_FUNCTION __noop
     177                 : #else
     178                 : #define NOP_FUNCTION (void)0
     179                 : #endif
     180                 : #endif
     181                 : 
     182                 : #ifndef DECLSPEC_ADDRSAFE
     183                 : #if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
     184                 : #define DECLSPEC_ADDRSAFE  __declspec(address_safe)
     185                 : #else
     186                 : #define DECLSPEC_ADDRSAFE
     187                 : #endif
     188                 : #endif
     189                 : 
     190                 : #ifndef DECLSPEC_NOINLINE
     191                 : #if (_MSC_VER >= 1300)
     192                 : #define DECLSPEC_NOINLINE  __declspec(noinline)
     193                 : #else
     194                 : #define DECLSPEC_NOINLINE
     195                 : #endif
     196                 : #endif
     197                 : 
     198                 : #ifndef FORCEINLINE
     199                 : #if (_MSC_VER >= 1200)
     200                 : #define FORCEINLINE __forceinline
     201                 : #else
     202                 : #define FORCEINLINE __inline
     203                 : #endif
     204                 : #endif
     205                 : 
     206                 : #ifndef DECLSPEC_DEPRECATED
     207                 : #if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
     208                 : #define DECLSPEC_DEPRECATED   __declspec(deprecated)
     209                 : #define DEPRECATE_SUPPORTED
     210                 : #else
     211                 : #define DECLSPEC_DEPRECATED
     212                 : #undef  DEPRECATE_SUPPORTED
     213                 : #endif
     214                 : #endif
     215                 : 
     216                 : #ifdef DEPRECATE_DDK_FUNCTIONS
     217                 : #ifdef _NTDDK_
     218                 : #define DECLSPEC_DEPRECATED_DDK DECLSPEC_DEPRECATED
     219                 : #ifdef DEPRECATE_SUPPORTED
     220                 : #define PRAGMA_DEPRECATED_DDK 1
     221                 : #endif
     222                 : #else
     223                 : #define DECLSPEC_DEPRECATED_DDK
     224                 : #define PRAGMA_DEPRECATED_DDK 1
     225                 : #endif
     226                 : #else
     227                 : #define DECLSPEC_DEPRECATED_DDK
     228                 : #define PRAGMA_DEPRECATED_DDK 0
     229                 : #endif
     230                 : 
     231                 : //
     232                 : // Void
     233                 : //
     234                 : 
     235                 : typedef void *PVOID;
     236                 : typedef void * POINTER_64 PVOID64;
     237                 : 
     238                 : 
     239                 : #if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
     240                 : #define NTAPI __stdcall
     241                 : #else
     242                 : #define _cdecl
     243                 : #define NTAPI
     244                 : #endif
     245                 : 
     246                 : #if !defined(_M_CEE_PURE)
     247                 : #define NTAPI_INLINE    NTAPI
     248                 : #else
     249                 : #define NTAPI_INLINE
     250                 : #endif
     251                 : 
     252                 : //
     253                 : // Define API decoration for direct importing system DLL references.
     254                 : //
     255                 : 
     256                 : #if !defined(_NTSYSTEM_)
     257                 : #define NTSYSAPI     DECLSPEC_IMPORT
     258                 : #define NTSYSCALLAPI DECLSPEC_IMPORT
     259                 : #else
     260                 : #define NTSYSAPI
     261                 : #if defined(_NTDLLBUILD_)
     262                 : #define NTSYSCALLAPI
     263                 : #else
     264                 : #define NTSYSCALLAPI DECLSPEC_ADDRSAFE
     265                 : #endif
     266                 : 
     267                 : #endif
     268                 : 
     269                 : 
     270                 : //
     271                 : // Basics
     272                 : //
     273                 : 
     274                 : #ifndef VOID
     275                 : #define VOID void
     276                 : typedef char CHAR;
     277                 : typedef short SHORT;
     278                 : typedef long LONG;
     279                 : #if !defined(MIDL_PASS)
     280                 : typedef int INT;
     281                 : #endif
     282                 : #endif
     283                 : 
     284                 : //
     285                 : // UNICODE (Wide Character) types
     286                 : //
     287                 : 
     288                 : #ifndef _MAC
     289                 : typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character
     290                 : #else
     291                 : // some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
     292                 : typedef unsigned short WCHAR;    // wc,   16-bit UNICODE character
     293                 : #endif
     294                 : 
     295                 : typedef WCHAR *PWCHAR, *LPWCH, *PWCH;
     296                 : typedef CONST WCHAR *LPCWCH, *PCWCH;
     297                 : typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
     298                 : typedef __nullterminated PWSTR *PZPWSTR;
     299                 : typedef __nullterminated CONST PWSTR *PCZPWSTR;
     300                 : typedef __nullterminated WCHAR UNALIGNED *LPUWSTR, *PUWSTR;
     301                 : typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;
     302                 : typedef __nullterminated PCWSTR *PZPCWSTR;
     303                 : typedef __nullterminated CONST WCHAR UNALIGNED *LPCUWSTR, *PCUWSTR;
     304                 : 
     305                 : 
     306                 : #if _WIN32_WINNT >= 0x0600 || (defined(__cplusplus) && defined(WINDOWS_ENABLE_CPLUSPLUS))
     307                 : 
     308                 : typedef CONST WCHAR *LPCWCHAR, *PCWCHAR;
     309                 : typedef CONST WCHAR UNALIGNED *LPCUWCHAR, *PCUWCHAR;
     310                 : 
     311                 : //
     312                 : //  UCS (Universal Character Set) types
     313                 : //
     314                 : 
     315                 : typedef unsigned long UCSCHAR;
     316                 : 
     317                 : //
     318                 : //  Even pre-Unicode agreement, UCS values are always in the
     319                 : //  range U+00000000 to U+7FFFFFFF, so we'll pick an obvious
     320                 : //  value.
     321                 : 
     322                 : #define UCSCHAR_INVALID_CHARACTER (0xffffffff)
     323                 : 
     324                 : #define MIN_UCSCHAR (0)
     325                 : 
     326                 : //
     327                 : //  We'll assume here that the ISO-10646 / Unicode agreement
     328                 : //  not to assign code points after U+0010FFFF holds so that
     329                 : //  we do not have to have separate "UCSCHAR" and "UNICODECHAR"
     330                 : //  types.
     331                 : //
     332                 : 
     333                 : #define MAX_UCSCHAR (0x0010FFFF)
     334                 : 
     335                 : typedef UCSCHAR *PUCSCHAR;
     336                 : typedef const UCSCHAR *PCUCSCHAR;
     337                 : 
     338                 : typedef UCSCHAR *PUCSSTR;
     339                 : typedef UCSCHAR UNALIGNED *PUUCSSTR;
     340                 : 
     341                 : typedef const UCSCHAR *PCUCSSTR;
     342                 : typedef const UCSCHAR UNALIGNED *PCUUCSSTR;
     343                 : 
     344                 : typedef UCSCHAR UNALIGNED *PUUCSCHAR;
     345                 : typedef const UCSCHAR UNALIGNED *PCUUCSCHAR;
     346                 : 
     347                 : #endif // _WIN32_WINNT >= 0x0600
     348                 : 
     349                 : 
     350                 : //
     351                 : // ANSI (Multi-byte Character) types
     352                 : //
     353                 : typedef CHAR *PCHAR, *LPCH, *PCH;
     354                 : typedef CONST CHAR *LPCCH, *PCCH;
     355                 : 
     356                 : typedef __nullterminated CHAR *NPSTR, *LPSTR, *PSTR;
     357                 : typedef __nullterminated PSTR *PZPSTR;
     358                 : typedef __nullterminated CONST PSTR *PCZPSTR;
     359                 : typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
     360                 : typedef __nullterminated PCSTR *PZPCSTR;
     361                 : 
     362                 : //
     363                 : // Neutral ANSI/UNICODE types and macros
     364                 : //
     365                 : #ifdef  UNICODE                     // r_winnt
     366                 : 
     367                 : #ifndef _TCHAR_DEFINED
     368                 : typedef WCHAR TCHAR, *PTCHAR;
     369                 : typedef WCHAR TBYTE , *PTBYTE ;
     370                 : #define _TCHAR_DEFINED
     371                 : #endif /* !_TCHAR_DEFINED */
     372                 : 
     373                 : typedef LPWCH LPTCH, PTCH;
     374                 : typedef LPWSTR PTSTR, LPTSTR;
     375                 : typedef LPCWSTR PCTSTR, LPCTSTR;
     376                 : typedef LPUWSTR PUTSTR, LPUTSTR;
     377                 : typedef LPCUWSTR PCUTSTR, LPCUTSTR;
     378                 : typedef LPWSTR LP;
     379                 : #define __TEXT(quote) L##quote      // r_winnt
     380                 : 
     381                 : #else   /* UNICODE */               // r_winnt
     382                 : 
     383                 : #ifndef _TCHAR_DEFINED
     384                 : typedef char TCHAR, *PTCHAR;
     385                 : typedef unsigned char TBYTE , *PTBYTE ;
     386                 : #define _TCHAR_DEFINED
     387                 : #endif /* !_TCHAR_DEFINED */
     388                 : 
     389                 : typedef LPCH LPTCH, PTCH;
     390                 : typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
     391                 : typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
     392                 : #define __TEXT(quote) quote         // r_winnt
     393                 : 
     394                 : #endif /* UNICODE */                // r_winnt
     395                 : #define TEXT(quote) __TEXT(quote)   // r_winnt
     396                 : 
     397                 : 
     398                 : typedef SHORT *PSHORT;  
     399                 : typedef LONG *PLONG;    
     400                 : 
     401                 : #ifdef STRICT
     402                 : typedef void *HANDLE;
     403                 : #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
     404                 : #else
     405                 : typedef PVOID HANDLE;
     406                 : #define DECLARE_HANDLE(name) typedef HANDLE name
     407                 : #endif
     408                 : typedef HANDLE *PHANDLE;
     409                 : 
     410                 : //
     411                 : // Flag (bit) fields
     412                 : //
     413                 : 
     414                 : typedef BYTE   FCHAR;
     415                 : typedef WORD   FSHORT;
     416                 : typedef DWORD  FLONG;
     417                 : 
     418                 : // Component Object Model defines, and macros
     419                 : 
     420                 : #ifndef _HRESULT_DEFINED
     421                 : #define _HRESULT_DEFINED
     422                 : #ifdef __midl
     423                 : typedef LONG HRESULT;
     424                 : #else
     425                 : typedef __success(return >= 0) long HRESULT;
     426                 : #endif // __midl
     427                 : #endif // !_HRESULT_DEFINED
     428                 : 
     429                 : #ifdef __cplusplus
     430                 :     #define EXTERN_C    extern "C"
     431                 : #else
     432                 :     #define EXTERN_C    extern
     433                 : #endif
     434                 : 
     435                 : #if defined(_WIN32) || defined(_MPPC_)
     436                 : 
     437                 : // Win32 doesn't support __export
     438                 : 
     439                 : #ifdef _68K_
     440                 : #define STDMETHODCALLTYPE       __cdecl
     441                 : #else
     442                 : #define STDMETHODCALLTYPE       __stdcall
     443                 : #endif
     444                 : #define STDMETHODVCALLTYPE      __cdecl
     445                 : 
     446                 : #define STDAPICALLTYPE          __stdcall
     447                 : #define STDAPIVCALLTYPE         __cdecl
     448                 : 
     449                 : #else
     450                 : 
     451                 : #define STDMETHODCALLTYPE       __export __stdcall
     452                 : #define STDMETHODVCALLTYPE      __export __cdecl
     453                 : 
     454                 : #define STDAPICALLTYPE          __export __stdcall
     455                 : #define STDAPIVCALLTYPE         __export __cdecl
     456                 : 
     457                 : #endif
     458                 : 
     459                 : 
     460                 : #define STDAPI                  EXTERN_C HRESULT STDAPICALLTYPE
     461                 : #define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
     462                 : 
     463                 : #define STDMETHODIMP            HRESULT STDMETHODCALLTYPE
     464                 : #define STDMETHODIMP_(type)     type STDMETHODCALLTYPE
     465                 : 
     466                 : #define STDOVERRIDEMETHODIMP        __override STDMETHODIMP
     467                 : #define STDOVERRIDEMETHODIMP_(type) __override STDMETHODIMP_(type)
     468                 : 
     469                 : #define IFACEMETHODIMP          __override STDMETHODIMP
     470                 : #define IFACEMETHODIMP_(type)   __override STDMETHODIMP_(type)
     471                 : 
     472                 : // The 'V' versions allow Variable Argument lists.
     473                 : 
     474                 : #define STDAPIV                 EXTERN_C HRESULT STDAPIVCALLTYPE
     475                 : #define STDAPIV_(type)          EXTERN_C type STDAPIVCALLTYPE
     476                 : 
     477                 : #define STDMETHODIMPV           HRESULT STDMETHODVCALLTYPE
     478                 : #define STDMETHODIMPV_(type)    type STDMETHODVCALLTYPE
     479                 : 
     480                 : #define STDOVERRIDEMETHODIMPV        __override STDMETHODIMPV
     481                 : #define STDOVERRIDEMETHODIMPV_(type) __override STDMETHODIMPV_(type)
     482                 : 
     483                 : #define IFACEMETHODIMPV          __override STDMETHODIMPV
     484                 : #define IFACEMETHODIMPV_(type)   __override STDMETHODIMPV_(type)
     485                 : 
     486                 : typedef char CCHAR;          
     487                 : typedef DWORD LCID;         
     488                 : typedef PDWORD PLCID;       
     489                 : typedef WORD   LANGID;      
     490                 : #define APPLICATION_ERROR_MASK       0x20000000
     491                 : #define ERROR_SEVERITY_SUCCESS       0x00000000
     492                 : #define ERROR_SEVERITY_INFORMATIONAL 0x40000000
     493                 : #define ERROR_SEVERITY_WARNING       0x80000000
     494                 : #define ERROR_SEVERITY_ERROR         0xC0000000
     495                 : 
     496                 : //
     497                 : // _M_IX86 included so that EM CONTEXT structure compiles with
     498                 : // x86 programs. *** TBD should this be for all architectures?
     499                 : //
     500                 : 
     501                 : //
     502                 : // 16 byte aligned type for 128 bit floats
     503                 : //
     504                 : 
     505                 : //
     506                 : // For we define a 128 bit structure and use __declspec(align(16)) pragma to
     507                 : // align to 128 bits.
     508                 : //
     509                 : 
     510                 : #if defined(_M_IA64) && !defined(MIDL_PASS)
     511                 : __declspec(align(16))
     512                 : #endif
     513                 : typedef struct _FLOAT128 {
     514                 :     __int64 LowPart;
     515                 :     __int64 HighPart;
     516                 : } FLOAT128;
     517                 : 
     518                 : typedef FLOAT128 *PFLOAT128;
     519                 : 
     520                 : 
     521                 : //
     522                 : // __int64 is only supported by 2.0 and later midl.
     523                 : // __midl is set by the 2.0 midl and not by 1.0 midl.
     524                 : //
     525                 : 
     526                 : #define _ULONGLONG_
     527                 : #if (!defined (_MAC) && (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))
     528                 : typedef __int64 LONGLONG;
     529                 : typedef unsigned __int64 ULONGLONG;
     530                 : 
     531                 : #define MAXLONGLONG                         (0x7fffffffffffffff)
     532                 : 
     533                 : 
     534                 : #else
     535                 : 
     536                 : #if defined(_MAC) && defined(_MAC_INT_64)
     537                 : typedef __int64 LONGLONG;
     538                 : typedef unsigned __int64 ULONGLONG;
     539                 : 
     540                 : #define MAXLONGLONG                      (0x7fffffffffffffff)
     541                 : 
     542                 : 
     543                 : #else
     544                 : typedef double LONGLONG;
     545                 : typedef double ULONGLONG;
     546                 : #endif //_MAC and int64
     547                 : 
     548                 : #endif
     549                 : 
     550                 : typedef LONGLONG *PLONGLONG;
     551                 : typedef ULONGLONG *PULONGLONG;
     552                 : 
     553                 : // Update Sequence Number
     554                 : 
     555                 : typedef LONGLONG USN;
     556                 : 
     557                 : #if defined(MIDL_PASS)
     558                 : typedef struct _LARGE_INTEGER {
     559                 : #else // MIDL_PASS
     560                 : typedef union _LARGE_INTEGER {
     561                 :     struct {
     562                 :         DWORD LowPart;
     563                 :         LONG HighPart;
     564                 :     };
     565                 :     struct {
     566                 :         DWORD LowPart;
     567                 :         LONG HighPart;
     568                 :     } u;
     569                 : #endif //MIDL_PASS
     570                 :     LONGLONG QuadPart;
     571                 : } LARGE_INTEGER;
     572                 : 
     573                 : typedef LARGE_INTEGER *PLARGE_INTEGER;
     574                 : 
     575                 : #if defined(MIDL_PASS)
     576                 : typedef struct _ULARGE_INTEGER {
     577                 : #else // MIDL_PASS
     578                 : typedef union _ULARGE_INTEGER {
     579                 :     struct {
     580                 :         DWORD LowPart;
     581                 :         DWORD HighPart;
     582                 :     };
     583                 :     struct {
     584                 :         DWORD LowPart;
     585                 :         DWORD HighPart;
     586                 :     } u;
     587                 : #endif //MIDL_PASS
     588                 :     ULONGLONG QuadPart;
     589                 : } ULARGE_INTEGER;
     590                 : 
     591                 : typedef ULARGE_INTEGER *PULARGE_INTEGER;
     592                 : 
     593                 : // end_ntminiport end_ntndis end_ntminitape
     594                 : 
     595                 : 
     596                 : //
     597                 : // Locally Unique Identifier
     598                 : //
     599                 : 
     600                 : typedef struct _LUID {
     601                 :     DWORD LowPart;
     602                 :     LONG HighPart;
     603                 : } LUID, *PLUID;
     604                 : 
     605                 : #define _DWORDLONG_
     606                 : typedef ULONGLONG  DWORDLONG;
     607                 : typedef DWORDLONG *PDWORDLONG;
     608                 : 
     609                 : 
     610                 : //
     611                 : // Define operations to logically shift an int64 by 0..31 bits and to multiply
     612                 : // 32-bits by 32-bits to form a 64-bit product.
     613                 : //
     614                 : 
     615                 : #if defined(MIDL_PASS) || defined(RC_INVOKED) || defined(_M_CEE_PURE) \
     616                 :     || defined(_68K_) || defined(_MPPC_) \
     617                 :     || defined(_M_IA64) || defined(_M_AMD64)
     618                 : 
     619                 : //
     620                 : // Midl does not understand inline assembler. Therefore, the Rtl functions
     621                 : // are used for shifts by 0..31 and multiplies of 32-bits times 32-bits to
     622                 : // form a 64-bit product.
     623                 : //
     624                 : //
     625                 : // IA64 and AMD64 have native 64-bit operations that are just as fast as their
     626                 : // 32-bit counter parts. Therefore, the int64 data type is used directly to form
     627                 : // shifts of 0..31 and multiplies of 32-bits times 32-bits to form a 64-bit
     628                 : // product.
     629                 : //
     630                 : 
     631                 : #define Int32x32To64(a, b)  (((__int64)((long)(a))) * ((__int64)((long)(b))))
     632                 : #define UInt32x32To64(a, b) (((unsigned __int64)((unsigned int)(a))) * ((unsigned __int64)((unsigned int)(b))))
     633                 : 
     634                 : #define Int64ShllMod32(a, b) (((unsigned __int64)(a)) << (b))
     635                 : #define Int64ShraMod32(a, b) (((__int64)(a)) >> (b))
     636                 : #define Int64ShrlMod32(a, b) (((unsigned __int64)(a)) >> (b))
     637                 : 
     638                 : 
     639                 : #elif defined(_M_IX86)
     640                 : 
     641                 : //
     642                 : // The x86 C compiler understands inline assembler. Therefore, inline functions
     643                 : // that employ inline assembler are used for shifts of 0..31.  The multiplies
     644                 : // rely on the compiler recognizing the cast of the multiplicand to int64 to
     645                 : // generate the optimal code inline.
     646                 : //
     647                 : 
     648                 : #define Int32x32To64(a, b)  ((__int64)(((__int64)((long)(a))) * ((long)(b))))
     649                 : #define UInt32x32To64(a, b) ((unsigned __int64)(((unsigned __int64)((unsigned int)(a))) * ((unsigned int)(b))))
     650                 : 
     651                 : 
     652                 : ULONGLONG
     653                 : NTAPI
     654                 : Int64ShllMod32 (
     655                 :     ULONGLONG Value,
     656                 :     DWORD ShiftCount
     657                 :     );
     658                 : 
     659                 : LONGLONG
     660                 : NTAPI
     661                 : Int64ShraMod32 (
     662                 :     LONGLONG Value,
     663                 :     DWORD ShiftCount
     664                 :     );
     665                 : 
     666                 : ULONGLONG
     667                 : NTAPI
     668                 : Int64ShrlMod32 (
     669                 :     ULONGLONG Value,
     670                 :     DWORD ShiftCount
     671                 :     );
     672                 : 
     673                 : #if _MSC_VER >= 1200
     674                 : #pragma warning(push)
     675                 : #endif
     676                 : #pragma warning(disable:4035 4793)               // re-enable below
     677                 : 
     678                 : __inline ULONGLONG
     679                 : NTAPI
     680                 : Int64ShllMod32 (
     681                 :     ULONGLONG Value,
     682                 :     DWORD ShiftCount
     683                 :     )
     684                 : {
     685                 :     __asm    {
     686                 :         mov     ecx, ShiftCount
     687                 :         mov     eax, dword ptr [Value]
     688                 :         mov     edx, dword ptr [Value+4]
     689                 :         shld    edx, eax, cl
     690                 :         shl     eax, cl
     691                 :     }
     692                 : }
     693                 : 
     694                 : __inline LONGLONG
     695                 : NTAPI
     696                 : Int64ShraMod32 (
     697                 :     LONGLONG Value,
     698                 :     DWORD ShiftCount
     699                 :     )
     700                 : {
     701                 :     __asm {
     702                 :         mov     ecx, ShiftCount
     703                 :         mov     eax, dword ptr [Value]
     704                 :         mov     edx, dword ptr [Value+4]
     705                 :         shrd    eax, edx, cl
     706                 :         sar     edx, cl
     707                 :     }
     708                 : }
     709                 : 
     710                 : __inline ULONGLONG
     711                 : NTAPI
     712                 : Int64ShrlMod32 (
     713                 :     ULONGLONG Value,
     714                 :     DWORD ShiftCount
     715                 :     )
     716                 : {
     717                 :     __asm    {
     718                 :         mov     ecx, ShiftCount
     719                 :         mov     eax, dword ptr [Value]
     720                 :         mov     edx, dword ptr [Value+4]
     721                 :         shrd    eax, edx, cl
     722                 :         shr     edx, cl
     723                 :     }
     724                 : }
     725                 : 
     726                 : #if _MSC_VER >= 1200
     727                 : #pragma warning(pop)
     728                 : #else
     729                 : #pragma warning(default:4035 4793)
     730                 : #endif
     731                 : 
     732                 : #else
     733                 : 
     734                 : #error Must define a target architecture.
     735                 : 
     736                 : #endif
     737                 : 
     738                 : //
     739                 : // Define rotate intrinsics.
     740                 : //
     741                 : 
     742                 : #ifdef __cplusplus
     743                 : extern "C" {
     744                 : #endif
     745                 : 
     746                 : #if defined(_M_AMD64)
     747                 : 
     748                 : #define RotateLeft8 _rotl8
     749                 : #define RotateLeft16 _rotl16
     750                 : #define RotateRight8 _rotr8
     751                 : #define RotateRight16 _rotr16
     752                 : 
     753                 : unsigned char
     754                 : __cdecl
     755                 : _rotl8 (
     756                 :     IN unsigned char Value,
     757                 :     IN unsigned char Shift
     758                 :     );
     759                 : 
     760                 : unsigned short
     761                 : __cdecl
     762                 : _rotl16 (
     763                 :     IN unsigned short Value,
     764                 :     IN unsigned char Shift
     765                 :     );
     766                 : 
     767                 : unsigned char
     768                 : __cdecl
     769                 : _rotr8 (
     770                 :     IN unsigned char Value,
     771                 :     IN unsigned char Shift
     772                 :     );
     773                 : 
     774                 : unsigned short
     775                 : __cdecl
     776                 : _rotr16 (
     777                 :     IN unsigned short Value,
     778                 :     IN unsigned char Shift
     779                 :     );
     780                 : 
     781                 : #pragma intrinsic(_rotl8)
     782                 : #pragma intrinsic(_rotl16)
     783                 : #pragma intrinsic(_rotr8)
     784                 : #pragma intrinsic(_rotr16)
     785                 : 
     786                 : #endif /* _M_AMD64 */
     787                 : 
     788                 : #if _MSC_VER >= 1300
     789                 : 
     790                 : #define RotateLeft32 _rotl
     791                 : #define RotateLeft64 _rotl64
     792                 : #define RotateRight32 _rotr
     793                 : #define RotateRight64 _rotr64
     794                 : 
     795                 : __checkReturn
     796                 : unsigned int
     797                 : __cdecl
     798                 : _rotl (
     799                 :     __in unsigned int Value,
     800                 :     __in int Shift
     801                 :     );
     802                 : 
     803                 : unsigned __int64
     804                 : __cdecl
     805                 : _rotl64 (
     806                 :     IN unsigned __int64 Value,
     807                 :     __in int Shift
     808                 :     );
     809                 : 
     810                 : __checkReturn
     811                 : unsigned int
     812                 : __cdecl
     813                 : _rotr (
     814                 :     __in unsigned int Value,
     815                 :     __in int Shift
     816                 :     );
     817                 : 
     818                 : unsigned __int64
     819                 : __cdecl
     820                 : _rotr64 (
     821                 :     IN unsigned __int64 Value,
     822                 :     __in int Shift
     823                 :     );
     824                 : 
     825                 : #pragma intrinsic(_rotl)
     826                 : #pragma intrinsic(_rotl64)
     827                 : #pragma intrinsic(_rotr)
     828                 : #pragma intrinsic(_rotr64)
     829                 : 
     830                 : #endif  /* _MSC_VER >= 1300 */
     831                 : 
     832                 : #ifdef __cplusplus
     833                 : }
     834                 : #endif
     835                 : 
     836                 : #define ANSI_NULL ((CHAR)0)     
     837                 : #define UNICODE_NULL ((WCHAR)0) 
     838                 : #define UNICODE_STRING_MAX_BYTES ((WORD  ) 65534) 
     839                 : #define UNICODE_STRING_MAX_CHARS (32767) 
     840                 : typedef BYTE  BOOLEAN;           
     841                 : typedef BOOLEAN *PBOOLEAN;       
     842                 : //
     843                 : //  Doubly linked list structure.  Can be used as either a list head, or
     844                 : //  as link words.
     845                 : //
     846                 : 
     847                 : typedef struct _LIST_ENTRY {
     848                 :    struct _LIST_ENTRY *Flink;
     849                 :    struct _LIST_ENTRY *Blink;
     850                 : } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
     851                 : 
     852                 : //
     853                 : //  Singly linked list structure. Can be used as either a list head, or
     854                 : //  as link words.
     855                 : //
     856                 : 
     857                 : typedef struct _SINGLE_LIST_ENTRY {
     858                 :     struct _SINGLE_LIST_ENTRY *Next;
     859                 : } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
     860                 : 
     861                 : //
     862                 : // These are needed for portable debugger support.
     863                 : //
     864                 : 
     865                 : typedef struct LIST_ENTRY32 {
     866                 :     DWORD Flink;
     867                 :     DWORD Blink;
     868                 : } LIST_ENTRY32;
     869                 : typedef LIST_ENTRY32 *PLIST_ENTRY32;
     870                 : 
     871                 : typedef struct LIST_ENTRY64 {
     872                 :     ULONGLONG Flink;
     873                 :     ULONGLONG Blink;
     874                 : } LIST_ENTRY64;
     875                 : typedef LIST_ENTRY64 *PLIST_ENTRY64;
     876                 : 
     877                 : 
     878                 : #include <guiddef.h>
     879                 : 
     880                 : #ifndef __OBJECTID_DEFINED
     881                 : #define __OBJECTID_DEFINED
     882                 : 
     883                 : typedef struct  _OBJECTID {     // size is 20
     884                 :     GUID Lineage;
     885                 :     DWORD Uniquifier;
     886                 : } OBJECTID;
     887                 : #endif // !_OBJECTID_DEFINED
     888                 : 
     889                 : #define MINCHAR     0x80        
     890                 : #define MAXCHAR     0x7f        
     891                 : #define MINSHORT    0x8000      
     892                 : #define MAXSHORT    0x7fff      
     893                 : #define MINLONG     0x80000000  
     894                 : #define MAXLONG     0x7fffffff  
     895                 : #define MAXBYTE     0xff        
     896                 : #define MAXWORD     0xffff      
     897                 : #define MAXDWORD    0xffffffff  
     898                 : //
     899                 : // Calculate the byte offset of a field in a structure of type type.
     900                 : //
     901                 : 
     902                 : #define FIELD_OFFSET(type, field)    ((LONG)(LONG_PTR)&(((type *)0)->field))
     903                 : 
     904                 : //
     905                 : // Calculate the size of a field in a structure of type type, without
     906                 : // knowing or stating the type of the field.
     907                 : //
     908                 : #define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
     909                 : 
     910                 : //
     911                 : // Calculate the size of a structure of type type up through and
     912                 : // including a field.
     913                 : //
     914                 : #define RTL_SIZEOF_THROUGH_FIELD(type, field) \
     915                 :     (FIELD_OFFSET(type, field) + RTL_FIELD_SIZE(type, field))
     916                 : 
     917                 : //
     918                 : //  RTL_CONTAINS_FIELD usage:
     919                 : //
     920                 : //      if (RTL_CONTAINS_FIELD(pBlock, pBlock->cbSize, dwMumble)) { // safe to use pBlock->dwMumble
     921                 : //
     922                 : #define RTL_CONTAINS_FIELD(Struct, Size, Field) \
     923                 :     ( (((PCHAR)(&(Struct)->Field)) + sizeof((Struct)->Field)) <= (((PCHAR)(Struct))+(Size)) )
     924                 : 
     925                 : //
     926                 : // Return the number of elements in a statically sized array.
     927                 : //   DWORD Buffer[100];
     928                 : //   RTL_NUMBER_OF(Buffer) == 100
     929                 : // This is also popularly known as: NUMBER_OF, ARRSIZE, _countof, NELEM, etc.
     930                 : //
     931                 : #define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0]))
     932                 : 
     933                 : #if defined(__cplusplus) && \
     934                 :     !defined(MIDL_PASS) && \
     935                 :     !defined(RC_INVOKED) && \
     936                 :     !defined(_PREFAST_) && \
     937                 :     (_MSC_FULL_VER >= 13009466) && \
     938                 :     !defined(SORTPP_PASS)
     939                 : //
     940                 : // RtlpNumberOf is a function that takes a reference to an array of N Ts.
     941                 : //
     942                 : // typedef T array_of_T[N];
     943                 : // typedef array_of_T &reference_to_array_of_T;
     944                 : //
     945                 : // RtlpNumberOf returns a pointer to an array of N chars.
     946                 : // We could return a reference instead of a pointer but older compilers do not accept that.
     947                 : //
     948                 : // typedef char array_of_char[N];
     949                 : // typedef array_of_char *pointer_to_array_of_char;
     950                 : //
     951                 : // sizeof(array_of_char) == N
     952                 : // sizeof(*pointer_to_array_of_char) == N
     953                 : //
     954                 : // pointer_to_array_of_char RtlpNumberOf(reference_to_array_of_T);
     955                 : //
     956                 : // We never even call RtlpNumberOf, we just take the size of dereferencing its return type.
     957                 : // We do not even implement RtlpNumberOf, we just decare it.
     958                 : //
     959                 : // Attempts to pass pointers instead of arrays to this macro result in compile time errors.
     960                 : // That is the point.
     961                 : //
     962                 : extern "C++" // templates cannot be declared to have 'C' linkage
     963                 : template <typename T, size_t N>
     964                 : char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];
     965                 : 
     966                 : #define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A)))
     967                 : 
     968                 : //
     969                 : // This does not work with:
     970                 : //
     971                 : // void Foo()
     972                 : // {
     973                 : //    struct { int x; } y[2];
     974                 : //    RTL_NUMBER_OF_V2(y); // illegal use of anonymous local type in template instantiation
     975                 : // }
     976                 : //
     977                 : // You must instead do:
     978                 : //
     979                 : // struct Foo1 { int x; };
     980                 : //
     981                 : // void Foo()
     982                 : // {
     983                 : //    Foo1 y[2];
     984                 : //    RTL_NUMBER_OF_V2(y); // ok
     985                 : // }
     986                 : //
     987                 : // OR
     988                 : //
     989                 : // void Foo()
     990                 : // {
     991                 : //    struct { int x; } y[2];
     992                 : //    RTL_NUMBER_OF_V1(y); // ok
     993                 : // }
     994                 : //
     995                 : // OR
     996                 : //
     997                 : // void Foo()
     998                 : // {
     999                 : //    struct { int x; } y[2];
    1000                 : //    _ARRAYSIZE(y); // ok
    1001                 : // }
    1002                 : //
    1003                 : 
    1004                 : #else
    1005                 : #define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A)
    1006                 : #endif
    1007                 : 
    1008                 : #ifdef ENABLE_RTL_NUMBER_OF_V2
    1009                 : #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A)
    1010                 : #else
    1011                 : #define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A)
    1012                 : #endif
    1013                 : 
    1014                 : //
    1015                 : // ARRAYSIZE is more readable version of RTL_NUMBER_OF_V2, and uses
    1016                 : // it regardless of ENABLE_RTL_NUMBER_OF_V2
    1017                 : //
    1018                 : // _ARRAYSIZE is a version useful for anonymous types
    1019                 : //
    1020                 : #define ARRAYSIZE(A)    RTL_NUMBER_OF_V2(A)
    1021                 : #define _ARRAYSIZE(A)   RTL_NUMBER_OF_V1(A)
    1022                 : 
    1023                 : //
    1024                 : // An expression that yields the type of a field in a struct.
    1025                 : //
    1026                 : #define RTL_FIELD_TYPE(type, field) (((type*)0)->field)
    1027                 : 
    1028                 : // RTL_ to avoid collisions in the global namespace.
    1029                 : //
    1030                 : // Given typedef struct _FOO { BYTE Bar[123]; } FOO;
    1031                 : // RTL_NUMBER_OF_FIELD(FOO, Bar) == 123
    1032                 : //
    1033                 : #define RTL_NUMBER_OF_FIELD(type, field) (RTL_NUMBER_OF(RTL_FIELD_TYPE(type, field)))
    1034                 : 
    1035                 : //
    1036                 : // eg:
    1037                 : // typedef struct FOO {
    1038                 : //   DWORD Integer;
    1039                 : //   PVOID Pointer;
    1040                 : // } FOO;
    1041                 : //
    1042                 : // RTL_PADDING_BETWEEN_FIELDS(FOO, Integer, Pointer) == 0 for Win32, 4 for Win64
    1043                 : //
    1044                 : #define RTL_PADDING_BETWEEN_FIELDS(T, F1, F2) \
    1045                 :     ((FIELD_OFFSET(T, F2) > FIELD_OFFSET(T, F1)) \
    1046                 :         ? (FIELD_OFFSET(T, F2) - FIELD_OFFSET(T, F1) - RTL_FIELD_SIZE(T, F1)) \
    1047                 :         : (FIELD_OFFSET(T, F1) - FIELD_OFFSET(T, F2) - RTL_FIELD_SIZE(T, F2)))
    1048                 : 
    1049                 : // RTL_ to avoid collisions in the global namespace.
    1050                 : #if defined(__cplusplus)
    1051                 : #define RTL_CONST_CAST(type) const_cast<type>
    1052                 : #else
    1053                 : #define RTL_CONST_CAST(type) (type)
    1054                 : #endif
    1055                 : 
    1056                 : 
    1057                 : // like sizeof
    1058                 : // usually this would be * CHAR_BIT, but we don't necessarily have #include <limits.h>
    1059                 : #define RTL_BITS_OF(sizeOfArg) (sizeof(sizeOfArg) * 8)
    1060                 : 
    1061                 : #define RTL_BITS_OF_FIELD(type, field) (RTL_BITS_OF(RTL_FIELD_TYPE(type, field)))
    1062                 : 
    1063                 : //
    1064                 : // Calculate the address of the base of the structure given its type, and an
    1065                 : // address of a field within the structure.
    1066                 : //
    1067                 : 
    1068                 : #define CONTAINING_RECORD(address, type, field) ((type *)( \
    1069                 :                                                   (PCHAR)(address) - \
    1070                 :                                                   (ULONG_PTR)(&((type *)0)->field)))
    1071                 : 
    1072                 : 
    1073                 : #define VER_SERVER_NT                       0x80000000
    1074                 : #define VER_WORKSTATION_NT                  0x40000000
    1075                 : #define VER_SUITE_SMALLBUSINESS             0x00000001
    1076                 : #define VER_SUITE_ENTERPRISE                0x00000002
    1077                 : #define VER_SUITE_BACKOFFICE                0x00000004
    1078                 : #define VER_SUITE_COMMUNICATIONS            0x00000008
    1079                 : #define VER_SUITE_TERMINAL                  0x00000010
    1080                 : #define VER_SUITE_SMALLBUSINESS_RESTRICTED  0x00000020
    1081                 : #define VER_SUITE_EMBEDDEDNT                0x00000040
    1082                 : #define VER_SUITE_DATACENTER                0x00000080
    1083                 : #define VER_SUITE_SINGLEUSERTS              0x00000100
    1084                 : #define VER_SUITE_PERSONAL                  0x00000200
    1085                 : #define VER_SUITE_BLADE                     0x00000400
    1086                 : #define VER_SUITE_EMBEDDED_RESTRICTED       0x00000800
    1087                 : #define VER_SUITE_SECURITY_APPLIANCE        0x00001000
    1088                 : #define VER_SUITE_STORAGE_SERVER            0x00002000
    1089                 : #define VER_SUITE_COMPUTE_SERVER            0x00004000
    1090                 : 
    1091                 : 
    1092                 : //
    1093                 : // Product types
    1094                 : // This list grows with each OS release.
    1095                 : //
    1096                 : // There is no ordering of values to ensure callers
    1097                 : // do an equality test i.e. greater-than and less-than
    1098                 : // comparisons are not useful.
    1099                 : //
    1100                 : // NOTE: Values in this list should never be deleted.
    1101                 : //       When a product-type 'X' gets dropped from a
    1102                 : //       OS release onwards, the value of 'X' continues
    1103                 : //       to be used in the mapping table of GetProductInfo.
    1104                 : //
    1105                 : 
    1106                 : #define PRODUCT_UNDEFINED                       0x00000000
    1107                 : 
    1108                 : #define PRODUCT_ULTIMATE                        0x00000001
    1109                 : #define PRODUCT_HOME_BASIC                      0x00000002
    1110                 : #define PRODUCT_HOME_PREMIUM                    0x00000003
    1111                 : #define PRODUCT_ENTERPRISE                      0x00000004
    1112                 : #define PRODUCT_HOME_BASIC_N                    0x00000005
    1113                 : #define PRODUCT_BUSINESS                        0x00000006
    1114                 : #define PRODUCT_STANDARD_SERVER                 0x00000007
    1115                 : #define PRODUCT_DATACENTER_SERVER               0x00000008
    1116                 : #define PRODUCT_SMALLBUSINESS_SERVER            0x00000009
    1117                 : #define PRODUCT_ENTERPRISE_SERVER               0x0000000A
    1118                 : #define PRODUCT_STARTER                         0x0000000B
    1119                 : #define PRODUCT_DATACENTER_SERVER_CORE          0x0000000C
    1120                 : #define PRODUCT_STANDARD_SERVER_CORE            0x0000000D
    1121                 : #define PRODUCT_ENTERPRISE_SERVER_CORE          0x0000000E
    1122                 : #define PRODUCT_ENTERPRISE_SERVER_IA64          0x0000000F
    1123                 : #define PRODUCT_BUSINESS_N                      0x00000010
    1124                 : #define PRODUCT_WEB_SERVER                      0x00000011
    1125                 : #define PRODUCT_CLUSTER_SERVER                  0x00000012
    1126                 : #define PRODUCT_HOME_SERVER                     0x00000013
    1127                 : #define PRODUCT_STORAGE_EXPRESS_SERVER          0x00000014
    1128                 : #define PRODUCT_STORAGE_STANDARD_SERVER         0x00000015
    1129                 : #define PRODUCT_STORAGE_WORKGROUP_SERVER        0x00000016
    1130                 : #define PRODUCT_STORAGE_ENTERPRISE_SERVER       0x00000017
    1131                 : #define PRODUCT_SERVER_FOR_SMALLBUSINESS        0x00000018
    1132                 : #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM    0x00000019
    1133                 : 
    1134                 : #define PRODUCT_UNLICENSED                      0xABCDABCD
    1135                 : 
    1136                 : #include <sdkddkver.h>
    1137                 : 
    1138                 : //
    1139                 : //  Language IDs.
    1140                 : //
    1141                 : //  The following two combinations of primary language ID and
    1142                 : //  sublanguage ID have special semantics:
    1143                 : //
    1144                 : //    Primary Language ID   Sublanguage ID      Result
    1145                 : //    -------------------   ---------------     ------------------------
    1146                 : //    LANG_NEUTRAL          SUBLANG_NEUTRAL     Language neutral
    1147                 : //    LANG_NEUTRAL          SUBLANG_DEFAULT     User default language
    1148                 : //    LANG_NEUTRAL          SUBLANG_SYS_DEFAULT System default language
    1149                 : //    LANG_INVARIANT        SUBLANG_NEUTRAL     Invariant locale
    1150                 : //
    1151                 : 
    1152                 : //
    1153                 : //  Primary language IDs.
    1154                 : //
    1155                 : 
    1156                 : #define LANG_NEUTRAL                     0x00
    1157                 : #define LANG_INVARIANT                   0x7f
    1158                 : 
    1159                 : #define LANG_AFRIKAANS                   0x36
    1160                 : #define LANG_ALBANIAN                    0x1c
    1161                 : #define LANG_ALSATIAN                    0x84
    1162                 : #define LANG_AMHARIC                     0x5e
    1163                 : #define LANG_ARABIC                      0x01
    1164                 : #define LANG_ARMENIAN                    0x2b
    1165                 : #define LANG_ASSAMESE                    0x4d
    1166                 : #define LANG_AZERI                       0x2c
    1167                 : #define LANG_BASHKIR                     0x6d
    1168                 : #define LANG_BASQUE                      0x2d
    1169                 : #define LANG_BELARUSIAN                  0x23
    1170                 : #define LANG_BENGALI                     0x45
    1171                 : #define LANG_BRETON                      0x7e
    1172                 : #define LANG_BOSNIAN                     0x1a   // Use with SUBLANG_BOSNIAN_* Sublanguage IDs
    1173                 : #define LANG_BOSNIAN_NEUTRAL           0x781a   // Use with the ConvertDefaultLocale function
    1174                 : #define LANG_BULGARIAN                   0x02
    1175                 : #define LANG_CATALAN                     0x03
    1176                 : #define LANG_CHINESE                     0x04   // Use with SUBLANG_CHINESE_* Sublanguage IDs
    1177                 : #define LANG_CHINESE_SIMPLIFIED          0x04   // Use with the ConvertDefaultLocale function
    1178                 : #define LANG_CHINESE_TRADITIONAL       0x7c04   // Use with the ConvertDefaultLocale function
    1179                 : #define LANG_CORSICAN                    0x83
    1180                 : #define LANG_CROATIAN                    0x1a
    1181                 : #define LANG_CZECH                       0x05
    1182                 : #define LANG_DANISH                      0x06
    1183                 : #define LANG_DARI                        0x8c
    1184                 : #define LANG_DIVEHI                      0x65
    1185                 : #define LANG_DUTCH                       0x13
    1186                 : #define LANG_ENGLISH                     0x09
    1187                 : #define LANG_ESTONIAN                    0x25
    1188                 : #define LANG_FAEROESE                    0x38
    1189                 : #define LANG_FARSI                       0x29   // Deprecated: use LANG_PERSIAN instead
    1190                 : #define LANG_FILIPINO                    0x64
    1191                 : #define LANG_FINNISH                     0x0b
    1192                 : #define LANG_FRENCH                      0x0c
    1193                 : #define LANG_FRISIAN                     0x62
    1194                 : #define LANG_GALICIAN                    0x56
    1195                 : #define LANG_GEORGIAN                    0x37
    1196                 : #define LANG_GERMAN                      0x07
    1197                 : #define LANG_GREEK                       0x08
    1198                 : #define LANG_GREENLANDIC                 0x6f
    1199                 : #define LANG_GUJARATI                    0x47
    1200                 : #define LANG_HAUSA                       0x68
    1201                 : #define LANG_HEBREW                      0x0d
    1202                 : #define LANG_HINDI                       0x39
    1203                 : #define LANG_HUNGARIAN                   0x0e
    1204                 : #define LANG_ICELANDIC                   0x0f
    1205                 : #define LANG_IGBO                        0x70
    1206                 : #define LANG_INDONESIAN                  0x21
    1207                 : #define LANG_INUKTITUT                   0x5d
    1208                 : #define LANG_IRISH                       0x3c   // Use with the SUBLANG_IRISH_IRELAND Sublanguage ID
    1209                 : #define LANG_ITALIAN                     0x10
    1210                 : #define LANG_JAPANESE                    0x11
    1211                 : #define LANG_KANNADA                     0x4b
    1212                 : #define LANG_KASHMIRI                    0x60
    1213                 : #define LANG_KAZAK                       0x3f
    1214                 : #define LANG_KHMER                       0x53
    1215                 : #define LANG_KICHE                       0x86
    1216                 : #define LANG_KINYARWANDA                 0x87
    1217                 : #define LANG_KONKANI                     0x57
    1218                 : #define LANG_KOREAN                      0x12
    1219                 : #define LANG_KYRGYZ                      0x40
    1220                 : #define LANG_LAO                         0x54
    1221                 : #define LANG_LATVIAN                     0x26
    1222                 : #define LANG_LITHUANIAN                  0x27
    1223                 : #define LANG_LOWER_SORBIAN               0x2e
    1224                 : #define LANG_LUXEMBOURGISH               0x6e
    1225                 : #define LANG_MACEDONIAN                  0x2f   // the Former Yugoslav Republic of Macedonia
    1226                 : #define LANG_MALAY                       0x3e
    1227                 : #define LANG_MALAYALAM                   0x4c
    1228                 : #define LANG_MALTESE                     0x3a
    1229                 : #define LANG_MANIPURI                    0x58
    1230                 : #define LANG_MAORI                       0x81
    1231                 : #define LANG_MAPUDUNGUN                  0x7a
    1232                 : #define LANG_MARATHI                     0x4e
    1233                 : #define LANG_MOHAWK                      0x7c
    1234                 : #define LANG_MONGOLIAN                   0x50
    1235                 : #define LANG_NEPALI                      0x61
    1236                 : #define LANG_NORWEGIAN                   0x14
    1237                 : #define LANG_OCCITAN                     0x82
    1238                 : #define LANG_ORIYA                       0x48
    1239                 : #define LANG_PASHTO                      0x63
    1240                 : #define LANG_PERSIAN                     0x29
    1241                 : #define LANG_POLISH                      0x15
    1242                 : #define LANG_PORTUGUESE                  0x16
    1243                 : #define LANG_PUNJABI                     0x46
    1244                 : #define LANG_QUECHUA                     0x6b
    1245                 : #define LANG_ROMANIAN                    0x18
    1246                 : #define LANG_ROMANSH                     0x17
    1247                 : #define LANG_RUSSIAN                     0x19
    1248                 : #define LANG_SAMI                        0x3b
    1249                 : #define LANG_SANSKRIT                    0x4f
    1250                 : #define LANG_SERBIAN                     0x1a   // Use with the SUBLANG_SERBIAN_* Sublanguage IDs
    1251                 : #define LANG_SERBIAN_NEUTRAL           0x7c1a   // Use with the ConvertDefaultLocale function
    1252                 : #define LANG_SINDHI                      0x59
    1253                 : #define LANG_SINHALESE                   0x5b
    1254                 : #define LANG_SLOVAK                      0x1b
    1255                 : #define LANG_SLOVENIAN                   0x24
    1256                 : #define LANG_SOTHO                       0x6c
    1257                 : #define LANG_SPANISH                     0x0a
    1258                 : #define LANG_SWAHILI                     0x41
    1259                 : #define LANG_SWEDISH                     0x1d
    1260                 : #define LANG_SYRIAC                      0x5a
    1261                 : #define LANG_TAJIK                       0x28
    1262                 : #define LANG_TAMAZIGHT                   0x5f
    1263                 : #define LANG_TAMIL                       0x49
    1264                 : #define LANG_TATAR                       0x44
    1265                 : #define LANG_TELUGU                      0x4a
    1266                 : #define LANG_THAI                        0x1e
    1267                 : #define LANG_TIBETAN                     0x51
    1268                 : #define LANG_TIGRIGNA                    0x73
    1269                 : #define LANG_TSWANA                      0x32
    1270                 : #define LANG_TURKISH                     0x1f
    1271                 : #define LANG_TURKMEN                     0x42
    1272                 : #define LANG_UIGHUR                      0x80
    1273                 : #define LANG_UKRAINIAN                   0x22
    1274                 : #define LANG_UPPER_SORBIAN               0x2e
    1275                 : #define LANG_URDU                        0x20
    1276                 : #define LANG_UZBEK                       0x43
    1277                 : #define LANG_VIETNAMESE                  0x2a
    1278                 : #define LANG_WELSH                       0x52
    1279                 : #define LANG_WOLOF                       0x88
    1280                 : #define LANG_XHOSA                       0x34
    1281                 : #define LANG_YAKUT                       0x85
    1282                 : #define LANG_YI                          0x78
    1283                 : #define LANG_YORUBA                      0x6a
    1284                 : #define LANG_ZULU                        0x35
    1285                 : 
    1286                 : //
    1287                 : //  Sublanguage IDs.
    1288                 : //
    1289                 : //  The name immediately following SUBLANG_ dictates which primary
    1290                 : //  language ID that sublanguage ID can be combined with to form a
    1291                 : //  valid language ID.
    1292                 : //
    1293                 : 
    1294                 : #define SUBLANG_NEUTRAL                             0x00    // language neutral
    1295                 : #define SUBLANG_DEFAULT                             0x01    // user default
    1296                 : #define SUBLANG_SYS_DEFAULT                         0x02    // system default
    1297                 : #define SUBLANG_CUSTOM_DEFAULT                      0x03    // default custom language/locale
    1298                 : #define SUBLANG_CUSTOM_UNSPECIFIED                  0x04    // custom language/locale
    1299                 : #define SUBLANG_UI_CUSTOM_DEFAULT                   0x05    // Default custom MUI language/locale
    1300                 : 
    1301                 : 
    1302                 : #define SUBLANG_AFRIKAANS_SOUTH_AFRICA              0x01    // Afrikaans (South Africa) 0x0436 af-ZA
    1303                 : #define SUBLANG_ALBANIAN_ALBANIA                    0x01    // Albanian (Albania) 0x041c sq-AL
    1304                 : #define SUBLANG_ALSATIAN_FRANCE                     0x01    // Alsatian (France) 0x0484
    1305                 : #define SUBLANG_AMHARIC_ETHIOPIA                    0x01    // Amharic (Ethiopia) 0x045e
    1306                 : #define SUBLANG_ARABIC_SAUDI_ARABIA                 0x01    // Arabic (Saudi Arabia)
    1307                 : #define SUBLANG_ARABIC_IRAQ                         0x02    // Arabic (Iraq)
    1308                 : #define SUBLANG_ARABIC_EGYPT                        0x03    // Arabic (Egypt)
    1309                 : #define SUBLANG_ARABIC_LIBYA                        0x04    // Arabic (Libya)
    1310                 : #define SUBLANG_ARABIC_ALGERIA                      0x05    // Arabic (Algeria)
    1311                 : #define SUBLANG_ARABIC_MOROCCO                      0x06    // Arabic (Morocco)
    1312                 : #define SUBLANG_ARABIC_TUNISIA                      0x07    // Arabic (Tunisia)
    1313                 : #define SUBLANG_ARABIC_OMAN                         0x08    // Arabic (Oman)
    1314                 : #define SUBLANG_ARABIC_YEMEN                        0x09    // Arabic (Yemen)
    1315                 : #define SUBLANG_ARABIC_SYRIA                        0x0a    // Arabic (Syria)
    1316                 : #define SUBLANG_ARABIC_JORDAN                       0x0b    // Arabic (Jordan)
    1317                 : #define SUBLANG_ARABIC_LEBANON                      0x0c    // Arabic (Lebanon)
    1318                 : #define SUBLANG_ARABIC_KUWAIT                       0x0d    // Arabic (Kuwait)
    1319                 : #define SUBLANG_ARABIC_UAE                          0x0e    // Arabic (U.A.E)
    1320                 : #define SUBLANG_ARABIC_BAHRAIN                      0x0f    // Arabic (Bahrain)
    1321                 : #define SUBLANG_ARABIC_QATAR                        0x10    // Arabic (Qatar)
    1322                 : #define SUBLANG_ARMENIAN_ARMENIA                    0x01    // Armenian (Armenia) 0x042b hy-AM
    1323                 : #define SUBLANG_ASSAMESE_INDIA                      0x01    // Assamese (India) 0x044d
    1324                 : #define SUBLANG_AZERI_LATIN                         0x01    // Azeri (Latin)
    1325                 : #define SUBLANG_AZERI_CYRILLIC                      0x02    // Azeri (Cyrillic)
    1326                 : #define SUBLANG_BASHKIR_RUSSIA                      0x01    // Bashkir (Russia) 0x046d ba-RU
    1327                 : #define SUBLANG_BASQUE_BASQUE                       0x01    // Basque (Basque) 0x042d eu-ES
    1328                 : #define SUBLANG_BELARUSIAN_BELARUS                  0x01    // Belarusian (Belarus) 0x0423 be-BY
    1329                 : #define SUBLANG_BENGALI_INDIA                       0x01    // Bengali (India)
    1330                 : #define SUBLANG_BENGALI_BANGLADESH                  0x02    // Bengali (Bangladesh)
    1331                 : #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN    0x05    // Bosnian (Bosnia and Herzegovina - Latin) 0x141a bs-BA-Latn
    1332                 : #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08    // Bosnian (Bosnia and Herzegovina - Cyrillic) 0x201a bs-BA-Cyrl
    1333                 : #define SUBLANG_BRETON_FRANCE                       0x01    // Breton (France) 0x047e
    1334                 : #define SUBLANG_BULGARIAN_BULGARIA                  0x01    // Bulgarian (Bulgaria) 0x0402
    1335                 : #define SUBLANG_CATALAN_CATALAN                     0x01    // Catalan (Catalan) 0x0403
    1336                 : #define SUBLANG_CHINESE_TRADITIONAL                 0x01    // Chinese (Taiwan) 0x0404 zh-TW
    1337                 : #define SUBLANG_CHINESE_SIMPLIFIED                  0x02    // Chinese (PR China) 0x0804 zh-CN
    1338                 : #define SUBLANG_CHINESE_HONGKONG                    0x03    // Chinese (Hong Kong S.A.R., P.R.C.) 0x0c04 zh-HK
    1339                 : #define SUBLANG_CHINESE_SINGAPORE                   0x04    // Chinese (Singapore) 0x1004 zh-SG
    1340                 : #define SUBLANG_CHINESE_MACAU                       0x05    // Chinese (Macau S.A.R.) 0x1404 zh-MO
    1341                 : #define SUBLANG_CORSICAN_FRANCE                     0x01    // Corsican (France) 0x0483
    1342                 : #define SUBLANG_CZECH_CZECH_REPUBLIC                0x01    // Czech (Czech Republic) 0x0405
    1343                 : #define SUBLANG_CROATIAN_CROATIA                    0x01    // Croatian (Croatia)
    1344                 : #define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN   0x04    // Croatian (Bosnia and Herzegovina - Latin) 0x101a hr-BA
    1345                 : #define SUBLANG_DANISH_DENMARK                      0x01    // Danish (Denmark) 0x0406
    1346                 : #define SUBLANG_DARI_AFGHANISTAN                    0x01    // Dari (Afghanistan)
    1347                 : #define SUBLANG_DIVEHI_MALDIVES                     0x01    // Divehi (Maldives) 0x0465 div-MV
    1348                 : #define SUBLANG_DUTCH                               0x01    // Dutch
    1349                 : #define SUBLANG_DUTCH_BELGIAN                       0x02    // Dutch (Belgian)
    1350                 : #define SUBLANG_ENGLISH_US                          0x01    // English (USA)
    1351                 : #define SUBLANG_ENGLISH_UK                          0x02    // English (UK)
    1352                 : #define SUBLANG_ENGLISH_AUS                         0x03    // English (Australian)
    1353                 : #define SUBLANG_ENGLISH_CAN                         0x04    // English (Canadian)
    1354                 : #define SUBLANG_ENGLISH_NZ                          0x05    // English (New Zealand)
    1355                 : #define SUBLANG_ENGLISH_EIRE                        0x06    // English (Irish)
    1356                 : #define SUBLANG_ENGLISH_SOUTH_AFRICA                0x07    // English (South Africa)
    1357                 : #define SUBLANG_ENGLISH_JAMAICA                     0x08    // English (Jamaica)
    1358                 : #define SUBLANG_ENGLISH_CARIBBEAN                   0x09    // English (Caribbean)
    1359                 : #define SUBLANG_ENGLISH_BELIZE                      0x0a    // English (Belize)
    1360                 : #define SUBLANG_ENGLISH_TRINIDAD                    0x0b    // English (Trinidad)
    1361                 : #define SUBLANG_ENGLISH_ZIMBABWE                    0x0c    // English (Zimbabwe)
    1362                 : #define SUBLANG_ENGLISH_PHILIPPINES                 0x0d    // English (Philippines)
    1363                 : #define SUBLANG_ENGLISH_INDIA                       0x10    // English (India)
    1364                 : #define SUBLANG_ENGLISH_MALAYSIA                    0x11    // English (Malaysia)
    1365                 : #define SUBLANG_ENGLISH_SINGAPORE                   0x12    // English (Singapore)
    1366                 : #define SUBLANG_ESTONIAN_ESTONIA                    0x01    // Estonian (Estonia) 0x0425 et-EE
    1367                 : #define SUBLANG_FAEROESE_FAROE_ISLANDS              0x01    // Faroese (Faroe Islands) 0x0438 fo-FO
    1368                 : #define SUBLANG_FILIPINO_PHILIPPINES                0x01    // Filipino (Philippines) 0x0464 fil-PH
    1369                 : #define SUBLANG_FINNISH_FINLAND                     0x01    // Finnish (Finland) 0x040b
    1370                 : #define SUBLANG_FRENCH                              0x01    // French
    1371                 : #define SUBLANG_FRENCH_BELGIAN                      0x02    // French (Belgian)
    1372                 : #define SUBLANG_FRENCH_CANADIAN                     0x03    // French (Canadian)
    1373                 : #define SUBLANG_FRENCH_SWISS                        0x04    // French (Swiss)
    1374                 : #define SUBLANG_FRENCH_LUXEMBOURG                   0x05    // French (Luxembourg)
    1375                 : #define SUBLANG_FRENCH_MONACO                       0x06    // French (Monaco)
    1376                 : #define SUBLANG_FRISIAN_NETHERLANDS                 0x01    // Frisian (Netherlands) 0x0462 fy-NL
    1377                 : #define SUBLANG_GALICIAN_GALICIAN                   0x01    // Galician (Galician) 0x0456 gl-ES
    1378                 : #define SUBLANG_GEORGIAN_GEORGIA                    0x01    // Georgian (Georgia) 0x0437 ka-GE
    1379                 : #define SUBLANG_GERMAN                              0x01    // German
    1380                 : #define SUBLANG_GERMAN_SWISS                        0x02    // German (Swiss)
    1381                 : #define SUBLANG_GERMAN_AUSTRIAN                     0x03    // German (Austrian)
    1382                 : #define SUBLANG_GERMAN_LUXEMBOURG                   0x04    // German (Luxembourg)
    1383                 : #define SUBLANG_GERMAN_LIECHTENSTEIN                0x05    // German (Liechtenstein)
    1384                 : #define SUBLANG_GREEK_GREECE                        0x01    // Greek (Greece)
    1385                 : #define SUBLANG_GREENLANDIC_GREENLAND               0x01    // Greenlandic (Greenland) 0x046f kl-GL
    1386                 : #define SUBLANG_GUJARATI_INDIA                      0x01    // Gujarati (India (Gujarati Script)) 0x0447 gu-IN
    1387                 : #define SUBLANG_HAUSA_NIGERIA_LATIN                 0x01    // Hausa (Latin, Nigeria) 0x0468 ha-NG-Latn
    1388                 : #define SUBLANG_HEBREW_ISRAEL                       0x01    // Hebrew (Israel) 0x040d
    1389                 : #define SUBLANG_HINDI_INDIA                         0x01    // Hindi (India) 0x0439 hi-IN
    1390                 : #define SUBLANG_HUNGARIAN_HUNGARY                   0x01    // Hungarian (Hungary) 0x040e
    1391                 : #define SUBLANG_ICELANDIC_ICELAND                   0x01    // Icelandic (Iceland) 0x040f
    1392                 : #define SUBLANG_IGBO_NIGERIA                        0x01    // Igbo (Nigeria) 0x0470 ig-NG
    1393                 : #define SUBLANG_INDONESIAN_INDONESIA                0x01    // Indonesian (Indonesia) 0x0421 id-ID
    1394                 : #define SUBLANG_INUKTITUT_CANADA                    0x01    // Inuktitut (Syllabics) (Canada) 0x045d iu-CA-Cans
    1395                 : #define SUBLANG_INUKTITUT_CANADA_LATIN              0x02    // Inuktitut (Canada - Latin)
    1396                 : #define SUBLANG_IRISH_IRELAND                       0x02    // Irish (Ireland)
    1397                 : #define SUBLANG_ITALIAN                             0x01    // Italian
    1398                 : #define SUBLANG_ITALIAN_SWISS                       0x02    // Italian (Swiss)
    1399                 : #define SUBLANG_JAPANESE_JAPAN                      0x01    // Japanese (Japan) 0x0411
    1400                 : #define SUBLANG_KANNADA_INDIA                       0x01    // Kannada (India (Kannada Script)) 0x044b kn-IN
    1401                 : #define SUBLANG_KASHMIRI_SASIA                      0x02    // Kashmiri (South Asia)
    1402                 : #define SUBLANG_KASHMIRI_INDIA                      0x02    // For app compatibility only
    1403                 : #define SUBLANG_KAZAK_KAZAKHSTAN                    0x01    // Kazakh (Kazakhstan) 0x043f kk-KZ
    1404                 : #define SUBLANG_KHMER_CAMBODIA                      0x01    // Khmer (Cambodia) 0x0453 kh-KH
    1405                 : #define SUBLANG_KICHE_GUATEMALA                     0x01    // K'iche (Guatemala)
    1406                 : #define SUBLANG_KINYARWANDA_RWANDA                  0x01    // Kinyarwanda (Rwanda) 0x0487 rw-RW
    1407                 : #define SUBLANG_KONKANI_INDIA                       0x01    // Konkani (India) 0x0457 kok-IN
    1408                 : #define SUBLANG_KOREAN                              0x01    // Korean (Extended Wansung)
    1409                 : #define SUBLANG_KYRGYZ_KYRGYZSTAN                   0x01    // Kyrgyz (Kyrgyzstan) 0x0440 ky-KG
    1410                 : #define SUBLANG_LAO_LAO                             0x01    // Lao (Lao PDR) 0x0454 lo-LA
    1411                 : #define SUBLANG_LATVIAN_LATVIA                      0x01    // Latvian (Latvia) 0x0426 lv-LV
    1412                 : #define SUBLANG_LITHUANIAN                          0x01    // Lithuanian
    1413                 : #define SUBLANG_LOWER_SORBIAN_GERMANY               0x02    // Lower Sorbian (Germany) 0x082e wee-DE
    1414                 : #define SUBLANG_LUXEMBOURGISH_LUXEMBOURG            0x01    // Luxembourgish (Luxembourg) 0x046e lb-LU
    1415                 : #define SUBLANG_MACEDONIAN_MACEDONIA                0x01    // Macedonian (Macedonia (FYROM)) 0x042f mk-MK
    1416                 : #define SUBLANG_MALAY_MALAYSIA                      0x01    // Malay (Malaysia)
    1417                 : #define SUBLANG_MALAY_BRUNEI_DARUSSALAM             0x02    // Malay (Brunei Darussalam)
    1418                 : #define SUBLANG_MALAYALAM_INDIA                     0x01    // Malayalam (India (Malayalam Script) ) 0x044c ml-IN
    1419                 : #define SUBLANG_MALTESE_MALTA                       0x01    // Maltese (Malta) 0x043a mt-MT
    1420                 : #define SUBLANG_MAORI_NEW_ZEALAND                   0x01    // Maori (New Zealand) 0x0481 mi-NZ
    1421                 : #define SUBLANG_MAPUDUNGUN_CHILE                    0x01    // Mapudungun (Chile) 0x047a arn-CL
    1422                 : #define SUBLANG_MARATHI_INDIA                       0x01    // Marathi (India) 0x044e mr-IN
    1423                 : #define SUBLANG_MOHAWK_MOHAWK                       0x01    // Mohawk (Mohawk) 0x047c moh-CA
    1424                 : #define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA         0x01    // Mongolian (Cyrillic, Mongolia)
    1425                 : #define SUBLANG_MONGOLIAN_PRC                       0x02    // Mongolian (PRC)
    1426                 : #define SUBLANG_NEPALI_INDIA                        0x02    // Nepali (India)
    1427                 : #define SUBLANG_NEPALI_NEPAL                        0x01    // Nepali (Nepal) 0x0461 ne-NP
    1428                 : #define SUBLANG_NORWEGIAN_BOKMAL                    0x01    // Norwegian (Bokmal)
    1429                 : #define SUBLANG_NORWEGIAN_NYNORSK                   0x02    // Norwegian (Nynorsk)
    1430                 : #define SUBLANG_OCCITAN_FRANCE                      0x01    // Occitan (France) 0x0482 oc-FR
    1431                 : #define SUBLANG_ORIYA_INDIA                         0x01    // Oriya (India (Oriya Script)) 0x0448 or-IN
    1432                 : #define SUBLANG_PASHTO_AFGHANISTAN                  0x01    // Pashto (Afghanistan)
    1433                 : #define SUBLANG_PERSIAN_IRAN                        0x01    // Persian (Iran) 0x0429 fa-IR
    1434                 : #define SUBLANG_POLISH_POLAND                       0x01    // Polish (Poland) 0x0415
    1435                 : #define SUBLANG_PORTUGUESE                          0x02    // Portuguese
    1436                 : #define SUBLANG_PORTUGUESE_BRAZILIAN                0x01    // Portuguese (Brazilian)
    1437                 : #define SUBLANG_PUNJABI_INDIA                       0x01    // Punjabi (India (Gurmukhi Script)) 0x0446 pa-IN
    1438                 : #define SUBLANG_QUECHUA_BOLIVIA                     0x01    // Quechua (Bolivia)
    1439                 : #define SUBLANG_QUECHUA_ECUADOR                     0x02    // Quechua (Ecuador)
    1440                 : #define SUBLANG_QUECHUA_PERU                        0x03    // Quechua (Peru)
    1441                 : #define SUBLANG_ROMANIAN_ROMANIA                    0x01    // Romanian (Romania) 0x0418
    1442                 : #define SUBLANG_ROMANSH_SWITZERLAND                 0x01    // Romansh (Switzerland) 0x0417 rm-CH
    1443                 : #define SUBLANG_RUSSIAN_RUSSIA                      0x01    // Russian (Russia) 0x0419
    1444                 : #define SUBLANG_SAMI_NORTHERN_NORWAY                0x01    // Northern Sami (Norway)
    1445                 : #define SUBLANG_SAMI_NORTHERN_SWEDEN                0x02    // Northern Sami (Sweden)
    1446                 : #define SUBLANG_SAMI_NORTHERN_FINLAND               0x03    // Northern Sami (Finland)
    1447                 : #define SUBLANG_SAMI_LULE_NORWAY                    0x04    // Lule Sami (Norway)
    1448                 : #define SUBLANG_SAMI_LULE_SWEDEN                    0x05    // Lule Sami (Sweden)
    1449                 : #define SUBLANG_SAMI_SOUTHERN_NORWAY                0x06    // Southern Sami (Norway)
    1450                 : #define SUBLANG_SAMI_SOUTHERN_SWEDEN                0x07    // Southern Sami (Sweden)
    1451                 : #define SUBLANG_SAMI_SKOLT_FINLAND                  0x08    // Skolt Sami (Finland)
    1452                 : #define SUBLANG_SAMI_INARI_FINLAND                  0x09    // Inari Sami (Finland)
    1453                 : #define SUBLANG_SANSKRIT_INDIA                      0x01    // Sanskrit (India) 0x044f sa-IN
    1454                 : #define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN    0x06    // Serbian (Bosnia and Herzegovina - Latin)
    1455                 : #define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07    // Serbian (Bosnia and Herzegovina - Cyrillic)
    1456                 : #define SUBLANG_SERBIAN_CROATIA                     0x01    // Croatian (Croatia) 0x041a hr-HR
    1457                 : #define SUBLANG_SERBIAN_LATIN                       0x02    // Serbian (Latin)
    1458                 : #define SUBLANG_SERBIAN_CYRILLIC                    0x03    // Serbian (Cyrillic)
    1459                 : #define SUBLANG_SINDHI_INDIA                        0x01    // Sindhi (India) reserved 0x0459
    1460                 : #define SUBLANG_SINDHI_PAKISTAN                     0x02    // Sindhi (Pakistan) reserved 0x0859
    1461                 : #define SUBLANG_SINDHI_AFGHANISTAN                  0x02    // For app compatibility only
    1462                 : #define SUBLANG_SINHALESE_SRI_LANKA                 0x01    // Sinhalese (Sri Lanka)
    1463                 : #define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA         0x01    // Northern Sotho (South Africa)
    1464                 : #define SUBLANG_SLOVAK_SLOVAKIA                     0x01    // Slovak (Slovakia) 0x041b sk-SK
    1465                 : #define SUBLANG_SLOVENIAN_SLOVENIA                  0x01    // Slovenian (Slovenia) 0x0424 sl-SI
    1466                 : #define SUBLANG_SPANISH                             0x01    // Spanish (Castilian)
    1467                 : #define SUBLANG_SPANISH_MEXICAN                     0x02    // Spanish (Mexican)
    1468                 : #define SUBLANG_SPANISH_MODERN                      0x03    // Spanish (Modern)
    1469                 : #define SUBLANG_SPANISH_GUATEMALA                   0x04    // Spanish (Guatemala)
    1470                 : #define SUBLANG_SPANISH_COSTA_RICA                  0x05    // Spanish (Costa Rica)
    1471                 : #define SUBLANG_SPANISH_PANAMA                      0x06    // Spanish (Panama)
    1472                 : #define SUBLANG_SPANISH_DOMINICAN_REPUBLIC          0x07    // Spanish (Dominican Republic)
    1473                 : #define SUBLANG_SPANISH_VENEZUELA                   0x08    // Spanish (Venezuela)
    1474                 : #define SUBLANG_SPANISH_COLOMBIA                    0x09    // Spanish (Colombia)
    1475                 : #define SUBLANG_SPANISH_PERU                        0x0a    // Spanish (Peru)
    1476                 : #define SUBLANG_SPANISH_ARGENTINA                   0x0b    // Spanish (Argentina)
    1477                 : #define SUBLANG_SPANISH_ECUADOR                     0x0c    // Spanish (Ecuador)
    1478                 : #define SUBLANG_SPANISH_CHILE                       0x0d    // Spanish (Chile)
    1479                 : #define SUBLANG_SPANISH_URUGUAY                     0x0e    // Spanish (Uruguay)
    1480                 : #define SUBLANG_SPANISH_PARAGUAY                    0x0f    // Spanish (Paraguay)
    1481                 : #define SUBLANG_SPANISH_BOLIVIA                     0x10    // Spanish (Bolivia)
    1482                 : #define SUBLANG_SPANISH_EL_SALVADOR                 0x11    // Spanish (El Salvador)
    1483                 : #define SUBLANG_SPANISH_HONDURAS                    0x12    // Spanish (Honduras)
    1484                 : #define SUBLANG_SPANISH_NICARAGUA                   0x13    // Spanish (Nicaragua)
    1485                 : #define SUBLANG_SPANISH_PUERTO_RICO                 0x14    // Spanish (Puerto Rico)
    1486                 : #define SUBLANG_SPANISH_US                          0x15    // Spanish (United States)
    1487                 : #define SUBLANG_SWAHILI_KENYA                       0x01    // Swahili (Kenya) 0x0441 sw-KE
    1488                 : #define SUBLANG_SWEDISH                             0x01    // Swedish
    1489                 : #define SUBLANG_SWEDISH_FINLAND                     0x02    // Swedish (Finland)
    1490                 : #define SUBLANG_SYRIAC_SYRIA                        0x01    // Syriac (Syria) 0x045a syr-SY
    1491                 : #define SUBLANG_TAJIK_TAJIKISTAN                    0x01    // Tajik (Tajikistan) 0x0428 tg-TJ-Cyrl
    1492                 : #define SUBLANG_TAMAZIGHT_ALGERIA_LATIN             0x02    // Tamazight (Latin, Algeria) 0x085f tmz-DZ-Latn
    1493                 : #define SUBLANG_TAMIL_INDIA                         0x01    // Tamil (India)
    1494                 : #define SUBLANG_TATAR_RUSSIA                        0x01    // Tatar (Russia) 0x0444 tt-RU
    1495                 : #define SUBLANG_TELUGU_INDIA                        0x01    // Telugu (India (Telugu Script)) 0x044a te-IN
    1496                 : #define SUBLANG_THAI_THAILAND                       0x01    // Thai (Thailand) 0x041e th-TH
    1497                 : #define SUBLANG_TIBETAN_PRC                         0x01    // Tibetan (PRC)
    1498                 : #define SUBLANG_TIGRIGNA_ERITREA                    0x02    // Tigrigna (Eritrea)
    1499                 : #define SUBLANG_TSWANA_SOUTH_AFRICA                 0x01    // Setswana / Tswana (South Africa) 0x0432 tn-ZA
    1500                 : #define SUBLANG_TURKISH_TURKEY                      0x01    // Turkish (Turkey) 0x041f tr-TR
    1501                 : #define SUBLANG_TURKMEN_TURKMENISTAN                0x01    // Turkmen (Turkmenistan) 0x0442 tk-TM
    1502                 : #define SUBLANG_UIGHUR_PRC                          0x01    // Uighur (PRC) 0x0480 ug-CN
    1503                 : #define SUBLANG_UKRAINIAN_UKRAINE                   0x01    // Ukrainian (Ukraine) 0x0422 uk-UA
    1504                 : #define SUBLANG_UPPER_SORBIAN_GERMANY               0x01    // Upper Sorbian (Germany) 0x042e wen-DE
    1505                 : #define SUBLANG_URDU_PAKISTAN                       0x01    // Urdu (Pakistan)
    1506                 : #define SUBLANG_URDU_INDIA                          0x02    // Urdu (India)
    1507                 : #define SUBLANG_UZBEK_LATIN                         0x01    // Uzbek (Latin)
    1508                 : #define SUBLANG_UZBEK_CYRILLIC                      0x02    // Uzbek (Cyrillic)
    1509                 : #define SUBLANG_VIETNAMESE_VIETNAM                  0x01    // Vietnamese (Vietnam) 0x042a vi-VN
    1510                 : #define SUBLANG_WELSH_UNITED_KINGDOM                0x01    // Welsh (United Kingdom) 0x0452 cy-GB
    1511                 : #define SUBLANG_WOLOF_SENEGAL                       0x01    // Wolof (Senegal)
    1512                 : #define SUBLANG_XHOSA_SOUTH_AFRICA                  0x01    // isiXhosa / Xhosa (South Africa) 0x0434 xh-ZA
    1513                 : #define SUBLANG_YAKUT_RUSSIA                        0x01    // Yakut (Russia) 0x0485 sah-RU
    1514                 : #define SUBLANG_YI_PRC                              0x01    // Yi (PRC)) 0x0478
    1515                 : #define SUBLANG_YORUBA_NIGERIA                      0x01    // Yoruba (Nigeria) 046a yo-NG
    1516                 : #define SUBLANG_ZULU_SOUTH_AFRICA                   0x01    // isiZulu / Zulu (South Africa) 0x0435 zu-ZA
    1517                 : 
    1518                 : 
    1519                 : 
    1520                 : 
    1521                 : //
    1522                 : //  Sorting IDs.
    1523                 : //
    1524                 : 
    1525                 : #define SORT_DEFAULT                     0x0     // sorting default
    1526                 : 
    1527                 : #define SORT_INVARIANT_MATH              0x1     // Invariant (Mathematical Symbols)
    1528                 : 
    1529                 : #define SORT_JAPANESE_XJIS               0x0     // Japanese XJIS order
    1530                 : #define SORT_JAPANESE_UNICODE            0x1     // Japanese Unicode order (no longer supported)
    1531                 : #define SORT_JAPANESE_RADICALSTROKE      0x4     // Japanese radical/stroke order
    1532                 : 
    1533                 : #define SORT_CHINESE_BIG5                0x0     // Chinese BIG5 order
    1534                 : #define SORT_CHINESE_PRCP                0x0     // PRC Chinese Phonetic order
    1535                 : #define SORT_CHINESE_UNICODE             0x1     // Chinese Unicode order (no longer supported)
    1536                 : #define SORT_CHINESE_PRC                 0x2     // PRC Chinese Stroke Count order
    1537                 : #define SORT_CHINESE_BOPOMOFO            0x3     // Traditional Chinese Bopomofo order
    1538                 : 
    1539                 : #define SORT_KOREAN_KSC                  0x0     // Korean KSC order
    1540                 : #define SORT_KOREAN_UNICODE              0x1     // Korean Unicode order (no longer supported)
    1541                 : 
    1542                 : #define SORT_GERMAN_PHONE_BOOK           0x1     // German Phone Book order
    1543                 : 
    1544                 : #define SORT_HUNGARIAN_DEFAULT           0x0     // Hungarian Default order
    1545                 : #define SORT_HUNGARIAN_TECHNICAL         0x1     // Hungarian Technical order
    1546                 : 
    1547                 : #define SORT_GEORGIAN_TRADITIONAL        0x0     // Georgian Traditional order
    1548                 : #define SORT_GEORGIAN_MODERN             0x1     // Georgian Modern order
    1549                 : 
    1550                 : // end_r_winnt
    1551                 : 
    1552                 : //
    1553                 : //  A language ID is a 16 bit value which is the combination of a
    1554                 : //  primary language ID and a secondary language ID.  The bits are
    1555                 : //  allocated as follows:
    1556                 : //
    1557                 : //       +-----------------------+-------------------------+
    1558                 : //       |     Sublanguage ID    |   Primary Language ID   |
    1559                 : //       +-----------------------+-------------------------+
    1560                 : //        15                   10 9                       0   bit
    1561                 : //
    1562                 : //
    1563                 : //  Language ID creation/extraction macros:
    1564                 : //
    1565                 : //    MAKELANGID    - construct language id from a primary language id and
    1566                 : //                    a sublanguage id.
    1567                 : //    PRIMARYLANGID - extract primary language id from a language id.
    1568                 : //    SUBLANGID     - extract sublanguage id from a language id.
    1569                 : //
    1570                 : 
    1571                 : #define MAKELANGID(p, s)       ((((WORD  )(s)) << 10) | (WORD  )(p))
    1572                 : #define PRIMARYLANGID(lgid)    ((WORD  )(lgid) & 0x3ff)
    1573                 : #define SUBLANGID(lgid)        ((WORD  )(lgid) >> 10)
    1574                 : 
    1575                 : 
    1576                 : //
    1577                 : //  A locale ID is a 32 bit value which is the combination of a
    1578                 : //  language ID, a sort ID, and a reserved area.  The bits are
    1579                 : //  allocated as follows:
    1580                 : //
    1581                 : //       +-------------+---------+-------------------------+
    1582                 : //       |   Reserved  | Sort ID |      Language ID        |
    1583                 : //       +-------------+---------+-------------------------+
    1584                 : //        31         20 19     16 15                      0   bit
    1585                 : //
    1586                 : //
    1587                 : //  Locale ID creation/extraction macros:
    1588                 : //
    1589                 : //    MAKELCID            - construct the locale id from a language id and a sort id.
    1590                 : //    MAKESORTLCID        - construct the locale id from a language id, sort id, and sort version.
    1591                 : //    LANGIDFROMLCID      - extract the language id from a locale id.
    1592                 : //    SORTIDFROMLCID      - extract the sort id from a locale id.
    1593                 : //    SORTVERSIONFROMLCID - extract the sort version from a locale id.
    1594                 : //
    1595                 : 
    1596                 : #define NLS_VALID_LOCALE_MASK  0x000fffff
    1597                 : 
    1598                 : #define MAKELCID(lgid, srtid)  ((DWORD)((((DWORD)((WORD  )(srtid))) << 16) |  \
    1599                 :                                          ((DWORD)((WORD  )(lgid)))))
    1600                 : #define MAKESORTLCID(lgid, srtid, ver)                                            \
    1601                 :                                ((DWORD)((MAKELCID(lgid, srtid)) |             \
    1602                 :                                     (((DWORD)((WORD  )(ver))) << 20)))
    1603                 : #define LANGIDFROMLCID(lcid)   ((WORD  )(lcid))
    1604                 : #define SORTIDFROMLCID(lcid)   ((WORD  )((((DWORD)(lcid)) >> 16) & 0xf))
    1605                 : #define SORTVERSIONFROMLCID(lcid)  ((WORD  )((((DWORD)(lcid)) >> 20) & 0xf))
    1606                 : 
    1607                 : // 8 characters for language
    1608                 : // 8 characters for region
    1609                 : // 64 characters for suffix (script)
    1610                 : // 2 characters for '-' separators
    1611                 : // 2 characters for prefix like "i-" or "x-"
    1612                 : // 1 null termination
    1613                 : #define LOCALE_NAME_MAX_LENGTH   85
    1614                 : 
    1615                 : //
    1616                 : //  Default System and User IDs for language and locale.
    1617                 : //
    1618                 : 
    1619                 : #define LANG_SYSTEM_DEFAULT    (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
    1620                 : #define LANG_USER_DEFAULT      (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
    1621                 : 
    1622                 : #define LOCALE_SYSTEM_DEFAULT  (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))
    1623                 : #define LOCALE_USER_DEFAULT    (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT))
    1624                 : 
    1625                 : //
    1626                 : //  Other special IDs for language and locale.
    1627                 : //
    1628                 : #define LOCALE_CUSTOM_DEFAULT                                                 \
    1629                 :           (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_CUSTOM_DEFAULT), SORT_DEFAULT))
    1630                 : 
    1631                 : #define LOCALE_CUSTOM_UNSPECIFIED                                             \
    1632                 :           (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_CUSTOM_UNSPECIFIED), SORT_DEFAULT))
    1633                 : 
    1634                 : #define LOCALE_CUSTOM_UI_DEFAULT                                              \
    1635                 :           (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_UI_CUSTOM_DEFAULT), SORT_DEFAULT))
    1636                 : 
    1637                 : #define LOCALE_NEUTRAL                                                        \
    1638                 :           (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT))
    1639                 : 
    1640                 : #define LOCALE_INVARIANT                                                      \
    1641                 :           (MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT))
    1642                 : 
    1643                 : // begin_ntminiport begin_ntndis begin_ntminitape
    1644                 : 
    1645                 : //
    1646                 : // Macros used to eliminate compiler warning generated when formal
    1647                 : // parameters or local variables are not declared.
    1648                 : //
    1649                 : // Use DBG_UNREFERENCED_PARAMETER() when a parameter is not yet
    1650                 : // referenced but will be once the module is completely developed.
    1651                 : //
    1652                 : // Use DBG_UNREFERENCED_LOCAL_VARIABLE() when a local variable is not yet
    1653                 : // referenced but will be once the module is completely developed.
    1654                 : //
    1655                 : // Use UNREFERENCED_PARAMETER() if a parameter will never be referenced.
    1656                 : //
    1657                 : // DBG_UNREFERENCED_PARAMETER and DBG_UNREFERENCED_LOCAL_VARIABLE will
    1658                 : // eventually be made into a null macro to help determine whether there
    1659                 : // is unfinished work.
    1660                 : //
    1661                 : 
    1662                 : #if ! defined(lint)
    1663                 : #define UNREFERENCED_PARAMETER(P)          (P)
    1664                 : #define DBG_UNREFERENCED_PARAMETER(P)      (P)
    1665                 : #define DBG_UNREFERENCED_LOCAL_VARIABLE(V) (V)
    1666                 : 
    1667                 : #else // lint
    1668                 : 
    1669                 : // Note: lint -e530 says don't complain about uninitialized variables for
    1670                 : // this varible.  Error 527 has to do with unreachable code.
    1671                 : // -restore restores checking to the -save state
    1672                 : 
    1673                 : #define UNREFERENCED_PARAMETER(P)          \
    1674                 :     /*lint -save -e527 -e530 */ \
    1675                 :     { \
    1676                 :         (P) = (P); \
    1677                 :     } \
    1678                 :     /*lint -restore */
    1679                 : #define DBG_UNREFERENCED_PARAMETER(P)      \
    1680                 :     /*lint -save -e527 -e530 */ \
    1681                 :     { \
    1682                 :         (P) = (P); \
    1683                 :     } \
    1684                 :     /*lint -restore */
    1685                 : #define DBG_UNREFERENCED_LOCAL_VARIABLE(V) \
    1686                 :     /*lint -save -e527 -e530 */ \
    1687                 :     { \
    1688                 :         (V) = (V); \
    1689                 :     } \
    1690                 :     /*lint -restore */
    1691                 : 
    1692                 : #endif // lint
    1693                 : 
    1694                 : //
    1695                 : // Macro used to eliminate compiler warning 4715 within a switch statement
    1696                 : // when all possible cases have already been accounted for.
    1697                 : //
    1698                 : // switch (a & 3) {
    1699                 : //     case 0: return 1;
    1700                 : //     case 1: return Foo();
    1701                 : //     case 2: return Bar();
    1702                 : //     case 3: return 1;
    1703                 : //     DEFAULT_UNREACHABLE;
    1704                 : //
    1705                 : 
    1706                 : #if (_MSC_VER > 1200)
    1707                 : #define DEFAULT_UNREACHABLE default: __assume(0)
    1708                 : #else
    1709                 : 
    1710                 : //
    1711                 : // Older compilers do not support __assume(), and there is no other free
    1712                 : // method of eliminating the warning.
    1713                 : //
    1714                 : 
    1715                 : #define DEFAULT_UNREACHABLE
    1716                 : 
    1717                 : #endif
    1718                 : 
    1719                 : #ifndef WIN32_NO_STATUS 
    1720                 : /*lint -save -e767 */  
    1721                 : #define STATUS_WAIT_0                    ((DWORD   )0x00000000L)    
    1722                 : #define STATUS_ABANDONED_WAIT_0          ((DWORD   )0x00000080L)    
    1723                 : #define STATUS_USER_APC                  ((DWORD   )0x000000C0L)    
    1724                 : #define STATUS_TIMEOUT                   ((DWORD   )0x00000102L)    
    1725                 : #define STATUS_PENDING                   ((DWORD   )0x00000103L)    
    1726                 : #define DBG_EXCEPTION_HANDLED            ((DWORD   )0x00010001L)    
    1727                 : #define DBG_CONTINUE                     ((DWORD   )0x00010002L)    
    1728                 : #define STATUS_SEGMENT_NOTIFICATION      ((DWORD   )0x40000005L)    
    1729                 : #define DBG_TERMINATE_THREAD             ((DWORD   )0x40010003L)    
    1730                 : #define DBG_TERMINATE_PROCESS            ((DWORD   )0x40010004L)    
    1731                 : #define DBG_CONTROL_C                    ((DWORD   )0x40010005L)    
    1732                 : #define DBG_CONTROL_BREAK                ((DWORD   )0x40010008L)    
    1733                 : #define DBG_COMMAND_EXCEPTION            ((DWORD   )0x40010009L)    
    1734                 : #define STATUS_GUARD_PAGE_VIOLATION      ((DWORD   )0x80000001L)    
    1735                 : #define STATUS_DATATYPE_MISALIGNMENT     ((DWORD   )0x80000002L)    
    1736                 : #define STATUS_BREAKPOINT                ((DWORD   )0x80000003L)    
    1737                 : #define STATUS_SINGLE_STEP               ((DWORD   )0x80000004L)    
    1738                 : #define DBG_EXCEPTION_NOT_HANDLED        ((DWORD   )0x80010001L)    
    1739                 : #define STATUS_ACCESS_VIOLATION          ((DWORD   )0xC0000005L)    
    1740                 : #define STATUS_IN_PAGE_ERROR             ((DWORD   )0xC0000006L)    
    1741                 : #define STATUS_INVALID_HANDLE            ((DWORD   )0xC0000008L)    
    1742                 : #define STATUS_NO_MEMORY                 ((DWORD   )0xC0000017L)    
    1743                 : #define STATUS_ILLEGAL_INSTRUCTION       ((DWORD   )0xC000001DL)    
    1744                 : #define STATUS_NONCONTINUABLE_EXCEPTION  ((DWORD   )0xC0000025L)    
    1745                 : #define STATUS_INVALID_DISPOSITION       ((DWORD   )0xC0000026L)    
    1746                 : #define STATUS_ARRAY_BOUNDS_EXCEEDED     ((DWORD   )0xC000008CL)    
    1747                 : #define STATUS_FLOAT_DENORMAL_OPERAND    ((DWORD   )0xC000008DL)    
    1748                 : #define STATUS_FLOAT_DIVIDE_BY_ZERO      ((DWORD   )0xC000008EL)    
    1749                 : #define STATUS_FLOAT_INEXACT_RESULT      ((DWORD   )0xC000008FL)    
    1750                 : #define STATUS_FLOAT_INVALID_OPERATION   ((DWORD   )0xC0000090L)    
    1751                 : #define STATUS_FLOAT_OVERFLOW            ((DWORD   )0xC0000091L)    
    1752                 : #define STATUS_FLOAT_STACK_CHECK         ((DWORD   )0xC0000092L)    
    1753                 : #define STATUS_FLOAT_UNDERFLOW           ((DWORD   )0xC0000093L)    
    1754                 : #define STATUS_INTEGER_DIVIDE_BY_ZERO    ((DWORD   )0xC0000094L)    
    1755                 : #define STATUS_INTEGER_OVERFLOW          ((DWORD   )0xC0000095L)    
    1756                 : #define STATUS_PRIVILEGED_INSTRUCTION    ((DWORD   )0xC0000096L)    
    1757                 : #define STATUS_STACK_OVERFLOW            ((DWORD   )0xC00000FDL)    
    1758                 : #define STATUS_CONTROL_C_EXIT            ((DWORD   )0xC000013AL)    
    1759                 : #define STATUS_FLOAT_MULTIPLE_FAULTS     ((DWORD   )0xC00002B4L)    
    1760                 : #define STATUS_FLOAT_MULTIPLE_TRAPS      ((DWORD   )0xC00002B5L)    
    1761                 : #define STATUS_REG_NAT_CONSUMPTION       ((DWORD   )0xC00002C9L)    
    1762                 : #if defined(STATUS_SUCCESS) || (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100) 
    1763                 : #define STATUS_SXS_EARLY_DEACTIVATION    ((DWORD   )0xC015000FL)    
    1764                 : #define STATUS_SXS_INVALID_DEACTIVATION  ((DWORD   )0xC0150010L)    
    1765                 : #endif 
    1766                 : /*lint -restore */  
    1767                 : #endif 
    1768                 : #define MAXIMUM_WAIT_OBJECTS 64     // Maximum number of wait objects
    1769                 : 
    1770                 : #define MAXIMUM_SUSPEND_COUNT MAXCHAR // Maximum times thread can be suspended
    1771                 : 
    1772                 : typedef ULONG_PTR KSPIN_LOCK;
    1773                 : typedef KSPIN_LOCK *PKSPIN_LOCK;
    1774                 : 
    1775                 : 
    1776                 : #ifdef _AMD64_
    1777                 : 
    1778                 : 
    1779                 : #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
    1780                 : 
    1781                 : //
    1782                 : // Define bit test intrinsics.
    1783                 : //
    1784                 : 
    1785                 : #ifdef __cplusplus
    1786                 : extern "C" {
    1787                 : #endif
    1788                 : 
    1789                 : #define BitTest _bittest
    1790                 : #define BitTestAndComplement _bittestandcomplement
    1791                 : #define BitTestAndSet _bittestandset
    1792                 : #define BitTestAndReset _bittestandreset
    1793                 : #define InterlockedBitTestAndSet _interlockedbittestandset
    1794                 : #define InterlockedBitTestAndReset _interlockedbittestandreset
    1795                 : 
    1796                 : #define BitTest64 _bittest64
    1797                 : #define BitTestAndComplement64 _bittestandcomplement64
    1798                 : #define BitTestAndSet64 _bittestandset64
    1799                 : #define BitTestAndReset64 _bittestandreset64
    1800                 : #define InterlockedBitTestAndSet64 _interlockedbittestandset64
    1801                 : #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
    1802                 : 
    1803                 : BOOLEAN
    1804                 : _bittest (
    1805                 :     IN LONG const *Base,
    1806                 :     IN LONG Offset
    1807                 :     );
    1808                 : 
    1809                 : BOOLEAN
    1810                 : _bittestandcomplement (
    1811                 :     IN LONG *Base,
    1812                 :     IN LONG Offset
    1813                 :     );
    1814                 : 
    1815                 : BOOLEAN
    1816                 : _bittestandset (
    1817                 :     IN LONG *Base,
    1818                 :     IN LONG Offset
    1819                 :     );
    1820                 : 
    1821                 : BOOLEAN
    1822                 : _bittestandreset (
    1823                 :     IN LONG *Base,
    1824                 :     IN LONG Offset
    1825                 :     );
    1826                 : 
    1827                 : BOOLEAN
    1828                 : _interlockedbittestandset (
    1829                 :     IN LONG volatile *Base,
    1830                 :     IN LONG Offset
    1831                 :     );
    1832                 : 
    1833                 : BOOLEAN
    1834                 : _interlockedbittestandreset (
    1835                 :     IN LONG volatile *Base,
    1836                 :     IN LONG Offset
    1837                 :     );
    1838                 : 
    1839                 : BOOLEAN
    1840                 : _bittest64 (
    1841                 :     IN LONG64 const *Base,
    1842                 :     IN LONG64 Offset
    1843                 :     );
    1844                 : 
    1845                 : BOOLEAN
    1846                 : _bittestandcomplement64 (
    1847                 :     IN LONG64 *Base,
    1848                 :     IN LONG64 Offset
    1849                 :     );
    1850                 : 
    1851                 : BOOLEAN
    1852                 : _bittestandset64 (
    1853                 :     IN LONG64 *Base,
    1854                 :     IN LONG64 Offset
    1855                 :     );
    1856                 : 
    1857                 : BOOLEAN
    1858                 : _bittestandreset64 (
    1859                 :     IN LONG64 *Base,
    1860                 :     IN LONG64 Offset
    1861                 :     );
    1862                 : 
    1863                 : BOOLEAN
    1864                 : _interlockedbittestandset64 (
    1865                 :     IN LONG64 volatile *Base,
    1866                 :     IN LONG64 Offset
    1867                 :     );
    1868                 : 
    1869                 : BOOLEAN
    1870                 : _interlockedbittestandreset64 (
    1871                 :     IN LONG64 volatile *Base,
    1872                 :     IN LONG64 Offset
    1873                 :     );
    1874                 : 
    1875                 : #pragma intrinsic(_bittest)
    1876                 : #pragma intrinsic(_bittestandcomplement)
    1877                 : #pragma intrinsic(_bittestandset)
    1878                 : #pragma intrinsic(_bittestandreset)
    1879                 : #pragma intrinsic(_interlockedbittestandset)
    1880                 : #pragma intrinsic(_interlockedbittestandreset)
    1881                 : 
    1882                 : #pragma intrinsic(_bittest64)
    1883                 : #pragma intrinsic(_bittestandcomplement64)
    1884                 : #pragma intrinsic(_bittestandset64)
    1885                 : #pragma intrinsic(_bittestandreset64)
    1886                 : #pragma intrinsic(_interlockedbittestandset64)
    1887                 : #pragma intrinsic(_interlockedbittestandreset64)
    1888                 : 
    1889                 : //
    1890                 : // Define bit scan intrinsics.
    1891                 : //
    1892                 : 
    1893                 : #define BitScanForward _BitScanForward
    1894                 : #define BitScanReverse _BitScanReverse
    1895                 : #define BitScanForward64 _BitScanForward64
    1896                 : #define BitScanReverse64 _BitScanReverse64
    1897                 : 
    1898                 : BOOLEAN
    1899                 : _BitScanForward (
    1900                 :     __out DWORD *Index,
    1901                 :     __in DWORD Mask
    1902                 :     );
    1903                 : 
    1904                 : BOOLEAN
    1905                 : _BitScanReverse (
    1906                 :     __out DWORD *Index,
    1907                 :     __in DWORD Mask
    1908                 :     );
    1909                 : 
    1910                 : BOOLEAN
    1911                 : _BitScanForward64 (
    1912                 :     __out DWORD *Index,
    1913                 :     __in DWORD64 Mask
    1914                 :     );
    1915                 : 
    1916                 : BOOLEAN
    1917                 : _BitScanReverse64 (
    1918                 :     __out DWORD *Index,
    1919                 :     __in DWORD64 Mask
    1920                 :     );
    1921                 : 
    1922                 : #pragma intrinsic(_BitScanForward)
    1923                 : #pragma intrinsic(_BitScanReverse)
    1924                 : #pragma intrinsic(_BitScanForward64)
    1925                 : #pragma intrinsic(_BitScanReverse64)
    1926                 : 
    1927                 : //
    1928                 : // Interlocked intrinsic functions.
    1929                 : //
    1930                 : 
    1931                 : #define InterlockedIncrement16 _InterlockedIncrement16
    1932                 : #define InterlockedDecrement16 _InterlockedDecrement16
    1933                 : #define InterlockedCompareExchange16 _InterlockedCompareExchange16
    1934                 : 
    1935                 : #define InterlockedAnd _InterlockedAnd
    1936                 : #define InterlockedOr _InterlockedOr
    1937                 : #define InterlockedXor _InterlockedXor
    1938                 : #define InterlockedIncrement _InterlockedIncrement
    1939                 : #define InterlockedIncrementAcquire InterlockedIncrement
    1940                 : #define InterlockedIncrementRelease InterlockedIncrement
    1941                 : #define InterlockedDecrement _InterlockedDecrement
    1942                 : #define InterlockedDecrementAcquire InterlockedDecrement
    1943                 : #define InterlockedDecrementRelease InterlockedDecrement
    1944                 : #define InterlockedAdd _InterlockedAdd
    1945                 : #define InterlockedExchange _InterlockedExchange
    1946                 : #define InterlockedExchangeAdd _InterlockedExchangeAdd
    1947                 : #define InterlockedCompareExchange _InterlockedCompareExchange
    1948                 : #define InterlockedCompareExchangeAcquire InterlockedCompareExchange
    1949                 : #define InterlockedCompareExchangeRelease InterlockedCompareExchange
    1950                 : 
    1951                 : #define InterlockedAnd64 _InterlockedAnd64
    1952                 : #define InterlockedAndAffinity InterlockedAnd64
    1953                 : #define InterlockedOr64 _InterlockedOr64
    1954                 : #define InterlockedOrAffinity InterlockedOr64
    1955                 : #define InterlockedXor64 _InterlockedXor64
    1956                 : #define InterlockedIncrement64 _InterlockedIncrement64
    1957                 : #define InterlockedDecrement64 _InterlockedDecrement64
    1958                 : #define InterlockedAdd64 _InterlockedAdd64
    1959                 : #define InterlockedExchange64 _InterlockedExchange64
    1960                 : #define InterlockedExchangeAcquire64 InterlockedExchange64
    1961                 : #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
    1962                 : #define InterlockedCompareExchange64 _InterlockedCompareExchange64
    1963                 : #define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64
    1964                 : #define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64
    1965                 : 
    1966                 : #define InterlockedExchangePointer _InterlockedExchangePointer
    1967                 : #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
    1968                 : #define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer
    1969                 : #define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer
    1970                 : 
    1971                 : #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
    1972                 : #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)
    1973                 : #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)
    1974                 : 
    1975                 : SHORT
    1976                 : InterlockedIncrement16 (
    1977                 :     __inout SHORT volatile *Addend
    1978                 :     );
    1979                 : 
    1980                 : SHORT
    1981                 : InterlockedDecrement16 (
    1982                 :     __inout SHORT volatile *Addend
    1983                 :     );
    1984                 : 
    1985                 : SHORT
    1986                 : InterlockedCompareExchange16 (
    1987                 :     __inout SHORT volatile *Destination,
    1988                 :     __in SHORT ExChange,
    1989                 :     __in SHORT Comperand
    1990                 :     );
    1991                 : 
    1992                 : LONG
    1993                 : InterlockedAnd (
    1994                 :     __inout LONG volatile *Destination,
    1995                 :     __in LONG Value
    1996                 :     );
    1997                 : 
    1998                 : LONG
    1999                 : InterlockedOr (
    2000                 :     __inout LONG volatile *Destination,
    2001                 :     __in LONG Value
    2002                 :     );
    2003                 : 
    2004                 : LONG
    2005                 : InterlockedXor (
    2006                 :     __inout LONG volatile *Destination,
    2007                 :     __in LONG Value
    2008                 :     );
    2009                 : 
    2010                 : LONG64
    2011                 : InterlockedAnd64 (
    2012                 :     __inout LONG64 volatile *Destination,
    2013                 :     __in LONG64 Value
    2014                 :     );
    2015                 : 
    2016                 : LONG64
    2017                 : InterlockedOr64 (
    2018                 :     __inout LONG64 volatile *Destination,
    2019                 :     __in LONG64 Value
    2020                 :     );
    2021                 : 
    2022                 : LONG64
    2023                 : InterlockedXor64 (
    2024                 :     __inout LONG64 volatile *Destination,
    2025                 :     __in LONG64 Value
    2026                 :     );
    2027                 : 
    2028                 : LONG
    2029                 : InterlockedIncrement(
    2030                 :     __inout LONG volatile *Addend
    2031                 :     );
    2032                 : 
    2033                 : LONG
    2034                 : InterlockedDecrement(
    2035                 :     __inout LONG volatile *Addend
    2036                 :     );
    2037                 : 
    2038                 : LONG
    2039                 : InterlockedExchange(
    2040                 :     __inout LONG volatile *Target,
    2041                 :     __in LONG Value
    2042                 :     );
    2043                 : 
    2044                 : LONG
    2045                 : InterlockedExchangeAdd(
    2046                 :     __inout LONG volatile *Addend,
    2047                 :     __in LONG Value
    2048                 :     );
    2049                 : 
    2050                 : #if !defined(_X86AMD64_)
    2051                 : 
    2052                 : __forceinline
    2053                 : LONG
    2054                 : InterlockedAdd(
    2055                 :     __inout LONG volatile *Addend,
    2056                 :     __in LONG Value
    2057                 :     )
    2058                 : 
    2059                 : {
    2060                 :     return InterlockedExchangeAdd(Addend, Value) + Value;
    2061                 : }
    2062                 : 
    2063                 : #endif
    2064                 : 
    2065                 : LONG
    2066                 : InterlockedCompareExchange (
    2067                 :     __inout LONG volatile *Destination,
    2068                 :     __in LONG ExChange,
    2069                 :     __in LONG Comperand
    2070                 :     );
    2071                 : 
    2072                 : LONG64
    2073                 : InterlockedIncrement64(
    2074                 :     __inout LONG64 volatile *Addend
    2075                 :     );
    2076                 : 
    2077                 : LONG64
    2078                 : InterlockedDecrement64(
    2079                 :     __inout LONG64 volatile *Addend
    2080                 :     );
    2081                 : 
    2082                 : LONG64
    2083                 : InterlockedExchange64(
    2084                 :     __inout LONG64 volatile *Target,
    2085                 :     __in LONG64 Value
    2086                 :     );
    2087                 : 
    2088                 : LONG64
    2089                 : InterlockedExchangeAdd64(
    2090                 :     __inout LONG64 volatile *Addend,
    2091                 :     __in LONG64 Value
    2092                 :     );
    2093                 : 
    2094                 : #if !defined(_X86AMD64_)
    2095                 : 
    2096                 : __forceinline
    2097                 : LONG64
    2098                 : InterlockedAdd64(
    2099                 :     __inout LONG64 volatile *Addend,
    2100                 :     __in LONG64 Value
    2101                 :     )
    2102                 : 
    2103                 : {
    2104                 :     return InterlockedExchangeAdd64(Addend, Value) + Value;
    2105                 : }
    2106                 : 
    2107                 : #endif
    2108                 : 
    2109                 : LONG64
    2110                 : InterlockedCompareExchange64 (
    2111                 :     __inout LONG64 volatile *Destination,
    2112                 :     __in LONG64 ExChange,
    2113                 :     __in LONG64 Comperand
    2114                 :     );
    2115                 : 
    2116                 : PVOID
    2117                 : InterlockedCompareExchangePointer (
    2118                 :     __inout PVOID volatile *Destination,
    2119                 :     __in_opt PVOID Exchange,
    2120                 :     __in_opt PVOID Comperand
    2121                 :     );
    2122                 : 
    2123                 : PVOID
    2124                 : InterlockedExchangePointer(
    2125                 :     __inout PVOID volatile *Target,
    2126                 :     __in_opt PVOID Value
    2127                 :     );
    2128                 : 
    2129                 : #pragma intrinsic(_InterlockedIncrement16)
    2130                 : #pragma intrinsic(_InterlockedDecrement16)
    2131                 : #pragma intrinsic(_InterlockedCompareExchange16)
    2132                 : #pragma intrinsic(_InterlockedAnd)
    2133                 : #pragma intrinsic(_InterlockedOr)
    2134                 : #pragma intrinsic(_InterlockedXor)
    2135                 : #pragma intrinsic(_InterlockedIncrement)
    2136                 : #pragma intrinsic(_InterlockedDecrement)
    2137                 : #pragma intrinsic(_InterlockedExchange)
    2138                 : #pragma intrinsic(_InterlockedExchangeAdd)
    2139                 : #pragma intrinsic(_InterlockedCompareExchange)
    2140                 : #pragma intrinsic(_InterlockedAnd64)
    2141                 : #pragma intrinsic(_InterlockedOr64)
    2142                 : #pragma intrinsic(_InterlockedXor64)
    2143                 : #pragma intrinsic(_InterlockedIncrement64)
    2144                 : #pragma intrinsic(_InterlockedDecrement64)
    2145                 : #pragma intrinsic(_InterlockedExchange64)
    2146                 : #pragma intrinsic(_InterlockedExchangeAdd64)
    2147                 : #pragma intrinsic(_InterlockedCompareExchange64)
    2148                 : #pragma intrinsic(_InterlockedExchangePointer)
    2149                 : #pragma intrinsic(_InterlockedCompareExchangePointer)
    2150                 : 
    2151                 : #if _MSC_FULL_VER >= 140041204
    2152                 : 
    2153                 : #define InterlockedAnd8 _InterlockedAnd8
    2154                 : #define InterlockedOr8 _InterlockedOr8
    2155                 : #define InterlockedXor8 _InterlockedXor8
    2156                 : #define InterlockedAnd16 _InterlockedAnd16
    2157                 : #define InterlockedOr16 _InterlockedOr16
    2158                 : #define InterlockedXor16 _InterlockedXor16
    2159                 : 
    2160                 : char
    2161                 : InterlockedAnd8 (
    2162                 :     __inout char volatile *Destination,
    2163                 :     __in char Value
    2164                 :     );
    2165                 : 
    2166                 : char
    2167                 : InterlockedOr8 (
    2168                 :     __inout char volatile *Destination,
    2169                 :     __in char Value
    2170                 :     );
    2171                 : 
    2172                 : char
    2173                 : InterlockedXor8 (
    2174                 :     __inout char volatile *Destination,
    2175                 :     __in char Value
    2176                 :     );
    2177                 : 
    2178                 : SHORT
    2179                 : InterlockedAnd16(
    2180                 :     __inout SHORT volatile *Destination,
    2181                 :     __in SHORT Value
    2182                 :     );
    2183                 :     
    2184                 : SHORT
    2185                 : InterlockedOr16(
    2186                 :     __inout SHORT volatile *Destination,
    2187                 :     __in SHORT Value
    2188                 :     );
    2189                 : 
    2190                 : SHORT
    2191                 : InterlockedXor16(
    2192                 :     __inout SHORT volatile *Destination,
    2193                 :     __in SHORT Value
    2194                 :     );
    2195                 : 
    2196                 : #pragma intrinsic (_InterlockedAnd8)
    2197                 : #pragma intrinsic (_InterlockedOr8)
    2198                 : #pragma intrinsic (_InterlockedXor8)
    2199                 : #pragma intrinsic (_InterlockedAnd16)
    2200                 : #pragma intrinsic (_InterlockedOr16)
    2201                 : #pragma intrinsic (_InterlockedXor16)
    2202                 : 
    2203                 : #endif
    2204                 : 
    2205                 : //
    2206                 : // Define function to flush a cache line.
    2207                 : //
    2208                 : 
    2209                 : #define CacheLineFlush(Address) _mm_clflush(Address)
    2210                 : 
    2211                 : VOID
    2212                 : _mm_clflush (
    2213                 :     __in VOID const *Address
    2214                 :     );
    2215                 : 
    2216                 : #pragma intrinsic(_mm_clflush)
    2217                 : 
    2218                 : VOID
    2219                 : _ReadWriteBarrier (
    2220                 :     VOID
    2221                 :     );
    2222                 : 
    2223                 : #pragma intrinsic(_ReadWriteBarrier)
    2224                 : 
    2225                 : //
    2226                 : // Define memory fence intrinsics
    2227                 : //
    2228                 : 
    2229                 : #define FastFence __faststorefence
    2230                 : #define LoadFence _mm_lfence
    2231                 : #define MemoryFence _mm_mfence
    2232                 : #define StoreFence _mm_sfence
    2233                 : 
    2234                 : VOID
    2235                 : __faststorefence (
    2236                 :     VOID
    2237                 :     );
    2238                 : 
    2239                 : VOID
    2240                 : _mm_lfence (
    2241                 :     VOID
    2242                 :     );
    2243                 : 
    2244                 : VOID
    2245                 : _mm_mfence (
    2246                 :     VOID
    2247                 :     );
    2248                 : 
    2249                 : VOID
    2250                 : _mm_sfence (
    2251                 :     VOID
    2252                 :     );
    2253                 : 
    2254                 : VOID
    2255                 : _mm_pause (
    2256                 :     VOID
    2257                 :     );
    2258                 : 
    2259                 : VOID 
    2260                 : _mm_prefetch (
    2261                 :     __in CHAR CONST *a, 
    2262                 :     __in int sel
    2263                 :     );
    2264                 : 
    2265                 : VOID
    2266                 : _m_prefetchw (
    2267                 :     __in volatile CONST VOID *Source
    2268                 :     );
    2269                 : 
    2270                 : //
    2271                 : // Define constants for use with _mm_prefetch.
    2272                 : //
    2273                 : 
    2274                 : #define _MM_HINT_T0     1
    2275                 : #define _MM_HINT_T1     2
    2276                 : #define _MM_HINT_T2     3
    2277                 : #define _MM_HINT_NTA    0
    2278                 : 
    2279                 : #pragma intrinsic(__faststorefence)
    2280                 : #pragma intrinsic(_mm_pause)
    2281                 : #pragma intrinsic(_mm_prefetch)
    2282                 : #pragma intrinsic(_mm_lfence)
    2283                 : #pragma intrinsic(_mm_mfence)
    2284                 : #pragma intrinsic(_mm_sfence)
    2285                 : #pragma intrinsic(_m_prefetchw)
    2286                 : 
    2287                 : #define YieldProcessor _mm_pause
    2288                 : #define MemoryBarrier __faststorefence
    2289                 : #define PreFetchCacheLine(l, a)  _mm_prefetch((CHAR CONST *) a, l)
    2290                 : #define PrefetchForWrite(p) _m_prefetchw(p)
    2291                 : #define ReadForWriteAccess(p) (_m_prefetchw(p), *(p))
    2292                 : 
    2293                 : //
    2294                 : // PreFetchCacheLine level defines.
    2295                 : //
    2296                 : 
    2297                 : #define PF_TEMPORAL_LEVEL_1 _MM_HINT_T0
    2298                 : #define PF_TEMPORAL_LEVEL_2 _MM_HINT_T1
    2299                 : #define PF_TEMPORAL_LEVEL_3 _MM_HINT_T2
    2300                 : #define PF_NON_TEMPORAL_LEVEL_ALL _MM_HINT_NTA
    2301                 : 
    2302                 : //
    2303                 : // Define get/set MXCSR intrinsics.
    2304                 : //
    2305                 : 
    2306                 : #define ReadMxCsr _mm_getcsr
    2307                 : #define WriteMxCsr _mm_setcsr
    2308                 : 
    2309                 : unsigned int
    2310                 : _mm_getcsr (
    2311                 :     VOID
    2312                 :     );
    2313                 : 
    2314                 : VOID
    2315                 : _mm_setcsr (
    2316                 :     __in unsigned int MxCsr
    2317                 :     );
    2318                 : 
    2319                 : #pragma intrinsic(_mm_getcsr)
    2320                 : #pragma intrinsic(_mm_setcsr)
    2321                 : 
    2322                 : //
    2323                 : // Assert exception.
    2324                 : //
    2325                 : 
    2326                 : VOID
    2327                 : __int2c (
    2328                 :     VOID
    2329                 :     );
    2330                 : 
    2331                 : #pragma intrinsic(__int2c)
    2332                 : 
    2333                 : #define DbgRaiseAssertionFailure() __int2c()
    2334                 : 
    2335                 : //
    2336                 : // Define function to get the caller's EFLAGs value.
    2337                 : //
    2338                 : 
    2339                 : #define GetCallersEflags() __getcallerseflags()
    2340                 : 
    2341                 : unsigned __int32
    2342                 : __getcallerseflags (
    2343                 :     VOID
    2344                 :     );
    2345                 : 
    2346                 : #pragma intrinsic(__getcallerseflags)
    2347                 : 
    2348                 : //
    2349                 : // Define function to get segment limit.
    2350                 : //
    2351                 : 
    2352                 : #define GetSegmentLimit __segmentlimit
    2353                 : 
    2354                 : DWORD
    2355                 : __segmentlimit (
    2356                 :     __in DWORD Selector
    2357                 :     );
    2358                 : 
    2359                 : #pragma intrinsic(__segmentlimit)
    2360                 : 
    2361                 : //
    2362                 : // Define function to read the value of a performance counter.
    2363                 : //
    2364                 : 
    2365                 : #define ReadPMC __readpmc
    2366                 : 
    2367                 : DWORD64
    2368                 : __readpmc (
    2369                 :     __in DWORD Counter
    2370                 :     );
    2371                 : 
    2372                 : #pragma intrinsic(__readpmc)
    2373                 : 
    2374                 : //
    2375                 : // Define function to read the value of the time stamp counter
    2376                 : //
    2377                 : 
    2378                 : #define ReadTimeStampCounter() __rdtsc()
    2379                 : 
    2380                 : DWORD64
    2381                 : __rdtsc (
    2382                 :     VOID
    2383                 :     );
    2384                 : 
    2385                 : #pragma intrinsic(__rdtsc)
    2386                 : 
    2387                 : //
    2388                 : // Define functions to move strings as bytes, words, dwords, and qwords.
    2389                 : //
    2390                 : 
    2391                 : VOID
    2392                 : __movsb (
    2393                 :     IN PBYTE  Destination,
    2394                 :     IN BYTE  const *Source,
    2395                 :     IN SIZE_T Count
    2396                 :     );
    2397                 : 
    2398                 : VOID
    2399                 : __movsw (
    2400                 :     IN PWORD   Destination,
    2401                 :     IN WORD   const *Source,
    2402                 :     IN SIZE_T Count
    2403                 :     );
    2404                 : 
    2405                 : VOID
    2406                 : __movsd (
    2407                 :     IN PDWORD Destination,
    2408                 :     IN DWORD const *Source,
    2409                 :     IN SIZE_T Count
    2410                 :     );
    2411                 : 
    2412                 : VOID
    2413                 : __movsq (
    2414                 :     IN PDWORD64 Destination,
    2415                 :     IN DWORD64 const *Source,
    2416                 :     IN SIZE_T Count
    2417                 :     );
    2418                 : 
    2419                 : #pragma intrinsic(__movsb)
    2420                 : #pragma intrinsic(__movsw)
    2421                 : #pragma intrinsic(__movsd)
    2422                 : #pragma intrinsic(__movsq)
    2423                 : 
    2424                 : //
    2425                 : // Define functions to store strings as bytes, words, dwords, and qwords.
    2426                 : //
    2427                 : 
    2428                 : VOID
    2429                 : __stosb (
    2430                 :     IN PBYTE  Destination,
    2431                 :     IN BYTE  Value,
    2432                 :     IN SIZE_T Count
    2433                 :     );
    2434                 : 
    2435                 : VOID
    2436                 : __stosw (
    2437                 :     IN PWORD   Destination,
    2438                 :     IN WORD   Value,
    2439                 :     IN SIZE_T Count
    2440                 :     );
    2441                 : 
    2442                 : VOID
    2443                 : __stosd (
    2444                 :     IN PDWORD Destination,
    2445                 :     IN DWORD Value,
    2446                 :     IN SIZE_T Count
    2447                 :     );
    2448                 : 
    2449                 : VOID
    2450                 : __stosq (
    2451                 :     IN PDWORD64 Destination,
    2452                 :     IN DWORD64 Value,
    2453                 :     IN SIZE_T Count
    2454                 :     );
    2455                 : 
    2456                 : #pragma intrinsic(__stosb)
    2457                 : #pragma intrinsic(__stosw)
    2458                 : #pragma intrinsic(__stosd)
    2459                 : #pragma intrinsic(__stosq)
    2460                 : 
    2461                 : //
    2462                 : // Define functions to capture the high 64-bits of a 128-bit multiply.
    2463                 : //
    2464                 : 
    2465                 : #define MultiplyHigh __mulh
    2466                 : #define UnsignedMultiplyHigh __umulh
    2467                 : 
    2468                 : LONGLONG
    2469                 : MultiplyHigh (
    2470                 :     __in LONG64 Multiplier,
    2471                 :     __in LONG64 Multiplicand
    2472                 :     );
    2473                 : 
    2474                 : ULONGLONG
    2475                 : UnsignedMultiplyHigh (
    2476                 :     __in DWORD64 Multiplier,
    2477                 :     __in DWORD64 Multiplicand
    2478                 :     );
    2479                 : 
    2480                 : #pragma intrinsic(__mulh)
    2481                 : #pragma intrinsic(__umulh)
    2482                 : 
    2483                 : //
    2484                 : // Define functions to perform 128-bit shifts
    2485                 : //
    2486                 : 
    2487                 : #define ShiftLeft128 __shiftleft128
    2488                 : #define ShiftRight128 __shiftright128
    2489                 : 
    2490                 : DWORD64
    2491                 : ShiftLeft128 (
    2492                 :     __in DWORD64 LowPart,
    2493                 :     __in DWORD64 HighPart,
    2494                 :     __in BYTE  Shift
    2495                 :     );
    2496                 : 
    2497                 : DWORD64
    2498                 : ShiftRight128 (
    2499                 :     __in DWORD64 LowPart,
    2500                 :     __in DWORD64 HighPart,
    2501                 :     __in BYTE  Shift
    2502                 :     );
    2503                 : 
    2504                 : #pragma intrinsic(__shiftleft128)
    2505                 : #pragma intrinsic(__shiftright128)
    2506                 : 
    2507                 : //
    2508                 : // Define functions to perform 128-bit multiplies.
    2509                 : //
    2510                 : 
    2511                 : #define Multiply128 _mul128
    2512                 : 
    2513                 : LONG64
    2514                 : Multiply128 (
    2515                 :     __in LONG64 Multiplier,
    2516                 :     __in LONG64 Multiplicand,
    2517                 :     __out LONG64 *HighProduct
    2518                 :     );
    2519                 : 
    2520                 : #pragma intrinsic(_mul128)
    2521                 : 
    2522                 : #ifndef UnsignedMultiply128
    2523                 : 
    2524                 : #define UnsignedMultiply128 _umul128
    2525                 : 
    2526                 : DWORD64
    2527                 : UnsignedMultiply128 (
    2528                 :     __in DWORD64 Multiplier,
    2529                 :     __in DWORD64 Multiplicand,
    2530                 :     __out DWORD64 *HighProduct
    2531                 :     );
    2532                 : 
    2533                 : #pragma intrinsic(_umul128)
    2534                 : 
    2535                 : #endif
    2536                 : 
    2537                 : __forceinline
    2538                 : LONG64
    2539                 : MultiplyExtract128 (
    2540                 :     __in LONG64 Multiplier,
    2541                 :     __in LONG64 Multiplicand,
    2542                 :     __in BYTE  Shift
    2543                 :     )
    2544                 : 
    2545                 : {
    2546                 : 
    2547                 :     LONG64 extractedProduct;
    2548                 :     LONG64 highProduct;
    2549                 :     LONG64 lowProduct;
    2550                 :     BOOLEAN negate;
    2551                 :     DWORD64 uhighProduct;
    2552                 :     DWORD64 ulowProduct;
    2553                 : 
    2554                 :     lowProduct = Multiply128(Multiplier, Multiplicand, &highProduct);
    2555                 :     negate = FALSE;
    2556                 :     uhighProduct = (DWORD64)highProduct;
    2557                 :     ulowProduct = (DWORD64)lowProduct;
    2558                 :     if (highProduct < 0) {
    2559                 :         negate = TRUE;
    2560                 :         uhighProduct = (DWORD64)(-highProduct);
    2561                 :         ulowProduct = (DWORD64)(-lowProduct);
    2562                 :         if (ulowProduct != 0) {
    2563                 :             uhighProduct -= 1;
    2564                 :         }
    2565                 :     }
    2566                 : 
    2567                 :     extractedProduct = (LONG64)ShiftRight128(ulowProduct, uhighProduct, Shift);
    2568                 :     if (negate != FALSE) {
    2569                 :         extractedProduct = -extractedProduct;
    2570                 :     }
    2571                 : 
    2572                 :     return extractedProduct;
    2573                 : }
    2574                 : 
    2575                 : __forceinline
    2576                 : DWORD64
    2577                 : UnsignedMultiplyExtract128 (
    2578                 :     __in DWORD64 Multiplier,
    2579                 :     __in DWORD64 Multiplicand,
    2580                 :     __in BYTE  Shift
    2581                 :     )
    2582                 : 
    2583                 : {
    2584                 : 
    2585                 :     DWORD64 extractedProduct;
    2586                 :     DWORD64 highProduct;
    2587                 :     DWORD64 lowProduct;
    2588                 : 
    2589                 :     lowProduct = UnsignedMultiply128(Multiplier, Multiplicand, &highProduct);
    2590                 :     extractedProduct = ShiftRight128(lowProduct, highProduct, Shift);
    2591                 :     return extractedProduct;
    2592                 : }
    2593                 : 
    2594                 : //
    2595                 : // Define functions to read and write the uer TEB and the system PCR/PRCB.
    2596                 : //
    2597                 : 
    2598                 : BYTE 
    2599                 : __readgsbyte (
    2600                 :     IN DWORD Offset
    2601                 :     );
    2602                 : 
    2603                 : WORD  
    2604                 : __readgsword (
    2605                 :     IN DWORD Offset
    2606                 :     );
    2607                 : 
    2608                 : DWORD
    2609                 : __readgsdword (
    2610                 :     IN DWORD Offset
    2611                 :     );
    2612                 : 
    2613                 : DWORD64
    2614                 : __readgsqword (
    2615                 :     IN DWORD Offset
    2616                 :     );
    2617                 : 
    2618                 : VOID
    2619                 : __writegsbyte (
    2620                 :     IN DWORD Offset,
    2621                 :     IN BYTE  Data
    2622                 :     );
    2623                 : 
    2624                 : VOID
    2625                 : __writegsword (
    2626                 :     IN DWORD Offset,
    2627                 :     IN WORD   Data
    2628                 :     );
    2629                 : 
    2630                 : VOID
    2631                 : __writegsdword (
    2632                 :     IN DWORD Offset,
    2633                 :     IN DWORD Data
    2634                 :     );
    2635                 : 
    2636                 : VOID
    2637                 : __writegsqword (
    2638                 :     IN DWORD Offset,
    2639                 :     IN DWORD64 Data
    2640                 :     );
    2641                 : 
    2642                 : #pragma intrinsic(__readgsbyte)
    2643                 : #pragma intrinsic(__readgsword)
    2644                 : #pragma intrinsic(__readgsdword)
    2645                 : #pragma intrinsic(__readgsqword)
    2646                 : #pragma intrinsic(__writegsbyte)
    2647                 : #pragma intrinsic(__writegsword)
    2648                 : #pragma intrinsic(__writegsdword)
    2649                 : #pragma intrinsic(__writegsqword)
    2650                 : 
    2651                 : #if !defined(_MANAGED)
    2652                 : 
    2653                 : VOID
    2654                 : __incgsbyte (
    2655                 :     DWORD Offset
    2656                 :     );
    2657                 :  
    2658                 : VOID
    2659                 : __addgsbyte (
    2660                 :     DWORD Offset,
    2661                 :     BYTE  Value
    2662                 :     );
    2663                 :  
    2664                 : VOID
    2665                 : __incgsword (
    2666                 :     DWORD Offset
    2667                 :     );
    2668                 :  
    2669                 : VOID
    2670                 : __addgsword (
    2671                 :     DWORD Offset,
    2672                 :     WORD   Value
    2673                 :     );
    2674                 :  
    2675                 : VOID
    2676                 : __incgsdword (
    2677                 :     DWORD Offset
    2678                 :     );
    2679                 :  
    2680                 : VOID
    2681                 : __addgsdword (
    2682                 :     DWORD Offset,
    2683                 :     DWORD Value
    2684                 :     );
    2685                 :  
    2686                 : VOID
    2687                 : __incgsqword (
    2688                 :     DWORD Offset
    2689                 :     );
    2690                 :  
    2691                 : VOID
    2692                 : __addgsqword (
    2693                 :     DWORD Offset,
    2694                 :     DWORD64 Value
    2695                 :     );
    2696                 : 
    2697                 : #if 0
    2698                 : #pragma intrinsic(__incgsbyte)
    2699                 : #pragma intrinsic(__addgsbyte)
    2700                 : #pragma intrinsic(__incgsword)
    2701                 : #pragma intrinsic(__addgsword)
    2702                 : #pragma intrinsic(__incgsdword)
    2703                 : #pragma intrinsic(__addgsdword)
    2704                 : #pragma intrinsic(__incgsqword)
    2705                 : #pragma intrinsic(__addgsqword)
    2706                 : #endif
    2707                 : 
    2708                 : #endif
    2709                 : 
    2710                 : #ifdef __cplusplus
    2711                 : }
    2712                 : #endif 
    2713                 : 
    2714                 : #endif // defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
    2715                 : 
    2716                 : //
    2717                 : // The following values specify the type of access in the first parameter
    2718                 : // of the exception record whan the exception code specifies an access
    2719                 : // violation.
    2720                 : //
    2721                 : 
    2722                 : #define EXCEPTION_READ_FAULT 0          // exception caused by a read
    2723                 : #define EXCEPTION_WRITE_FAULT 1         // exception caused by a write
    2724                 : #define EXCEPTION_EXECUTE_FAULT 8       // exception caused by an instruction fetch
    2725                 : 
    2726                 : // begin_wx86
    2727                 : //
    2728                 : // The following flags control the contents of the CONTEXT structure.
    2729                 : //
    2730                 : 
    2731                 : #if !defined(RC_INVOKED)
    2732                 : 
    2733                 : #define CONTEXT_AMD64   0x100000
    2734                 : 
    2735                 : // end_wx86
    2736                 : 
    2737                 : #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
    2738                 : #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
    2739                 : #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
    2740                 : #define CONTEXT_FLOATING_POINT  (CONTEXT_AMD64 | 0x8L)
    2741                 : #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
    2742                 : 
    2743                 : #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
    2744                 : 
    2745                 : #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
    2746                 : 
    2747                 : #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
    2748                 : #define CONTEXT_SERVICE_ACTIVE 0x10000000
    2749                 : #define CONTEXT_EXCEPTION_REQUEST 0x40000000
    2750                 : #define CONTEXT_EXCEPTION_REPORTING 0x80000000
    2751                 : 
    2752                 : // begin_wx86
    2753                 : 
    2754                 : #endif // !defined(RC_INVOKED)
    2755                 : 
    2756                 : //
    2757                 : // Define initial MxCsr and FpCsr control.
    2758                 : //
    2759                 : 
    2760                 : #define INITIAL_MXCSR 0x1f80            // initial MXCSR value
    2761                 : #define INITIAL_FPCSR 0x027f            // initial FPCSR value
    2762                 : 
    2763                 : //
    2764                 : // Define 128-bit 16-byte aligned xmm register type.
    2765                 : //
    2766                 : 
    2767                 : typedef struct DECLSPEC_ALIGN(16) _M128A {
    2768                 :     ULONGLONG Low;
    2769                 :     LONGLONG High;
    2770                 : } M128A, *PM128A;
    2771                 : 
    2772                 : //
    2773                 : // Format of data for 32-bit fxsave/fxrstor instructions.
    2774                 : //
    2775                 : 
    2776                 : typedef struct _XMM_SAVE_AREA32 {
    2777                 :     WORD   ControlWord;
    2778                 :     WORD   StatusWord;
    2779                 :     BYTE  TagWord;
    2780                 :     BYTE  Reserved1;
    2781                 :     WORD   ErrorOpcode;
    2782                 :     DWORD ErrorOffset;
    2783                 :     WORD   ErrorSelector;
    2784                 :     WORD   Reserved2;
    2785                 :     DWORD DataOffset;
    2786                 :     WORD   DataSelector;
    2787                 :     WORD   Reserved3;
    2788                 :     DWORD MxCsr;
    2789                 :     DWORD MxCsr_Mask;
    2790                 :     M128A FloatRegisters[8];
    2791                 :     M128A XmmRegisters[16];
    2792                 :     BYTE  Reserved4[96];
    2793                 : } XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
    2794                 : 
    2795                 : #define LEGACY_SAVE_AREA_LENGTH sizeof(XMM_SAVE_AREA32)
    2796                 : 
    2797                 : //
    2798                 : // Context Frame
    2799                 : //
    2800                 : //  This frame has a several purposes: 1) it is used as an argument to
    2801                 : //  NtContinue, 2) is is used to constuct a call frame for APC delivery,
    2802                 : //  and 3) it is used in the user level thread creation routines.
    2803                 : //
    2804                 : //
    2805                 : // The flags field within this record controls the contents of a CONTEXT
    2806                 : // record.
    2807                 : //
    2808                 : // If the context record is used as an input parameter, then for each
    2809                 : // portion of the context record controlled by a flag whose value is
    2810                 : // set, it is assumed that that portion of the context record contains
    2811                 : // valid context. If the context record is being used to modify a threads
    2812                 : // context, then only that portion of the threads context is modified.
    2813                 : //
    2814                 : // If the context record is used as an output parameter to capture the
    2815                 : // context of a thread, then only those portions of the thread's context
    2816                 : // corresponding to set flags will be returned.
    2817                 : //
    2818                 : // CONTEXT_CONTROL specifies SegSs, Rsp, SegCs, Rip, and EFlags.
    2819                 : //
    2820                 : // CONTEXT_INTEGER specifies Rax, Rcx, Rdx, Rbx, Rbp, Rsi, Rdi, and R8-R15.
    2821                 : //
    2822                 : // CONTEXT_SEGMENTS specifies SegDs, SegEs, SegFs, and SegGs.
    2823                 : //
    2824                 : // CONTEXT_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7.
    2825                 : //
    2826                 : // CONTEXT_MMX_REGISTERS specifies the floating point and extended registers
    2827                 : //     Mm0/St0-Mm7/St7 and Xmm0-Xmm15).
    2828                 : //
    2829                 : 
    2830                 : typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
    2831                 : 
    2832                 :     //
    2833                 :     // Register parameter home addresses.
    2834                 :     //
    2835                 :     // N.B. These fields are for convience - they could be used to extend the
    2836                 :     //      context record in the future.
    2837                 :     //
    2838                 : 
    2839                 :     DWORD64 P1Home;
    2840                 :     DWORD64 P2Home;
    2841                 :     DWORD64 P3Home;
    2842                 :     DWORD64 P4Home;
    2843                 :     DWORD64 P5Home;
    2844                 :     DWORD64 P6Home;
    2845                 : 
    2846                 :     //
    2847                 :     // Control flags.
    2848                 :     //
    2849                 : 
    2850                 :     DWORD ContextFlags;
    2851                 :     DWORD MxCsr;
    2852                 : 
    2853                 :     //
    2854                 :     // Segment Registers and processor flags.
    2855                 :     //
    2856                 : 
    2857                 :     WORD   SegCs;
    2858                 :     WORD   SegDs;
    2859                 :     WORD   SegEs;
    2860                 :     WORD   SegFs;
    2861                 :     WORD   SegGs;
    2862                 :     WORD   SegSs;
    2863                 :     DWORD EFlags;
    2864                 : 
    2865                 :     //
    2866                 :     // Debug registers
    2867                 :     //
    2868                 : 
    2869                 :     DWORD64 Dr0;
    2870                 :     DWORD64 Dr1;
    2871                 :     DWORD64 Dr2;
    2872                 :     DWORD64 Dr3;
    2873                 :     DWORD64 Dr6;
    2874                 :     DWORD64 Dr7;
    2875                 : 
    2876                 :     //
    2877                 :     // Integer registers.
    2878                 :     //
    2879                 : 
    2880                 :     DWORD64 Rax;
    2881                 :     DWORD64 Rcx;
    2882                 :     DWORD64 Rdx;
    2883                 :     DWORD64 Rbx;
    2884                 :     DWORD64 Rsp;
    2885                 :     DWORD64 Rbp;
    2886                 :     DWORD64 Rsi;
    2887                 :     DWORD64 Rdi;
    2888                 :     DWORD64 R8;
    2889                 :     DWORD64 R9;
    2890                 :     DWORD64 R10;
    2891                 :     DWORD64 R11;
    2892                 :     DWORD64 R12;
    2893                 :     DWORD64 R13;
    2894                 :     DWORD64 R14;
    2895                 :     DWORD64 R15;
    2896                 : 
    2897                 :     //
    2898                 :     // Program counter.
    2899                 :     //
    2900                 : 
    2901                 :     DWORD64 Rip;
    2902                 : 
    2903                 :     //
    2904                 :     // Floating point state.
    2905                 :     //
    2906                 : 
    2907                 :     union {
    2908                 :         XMM_SAVE_AREA32 FltSave;
    2909                 :         struct {
    2910                 :             M128A Header[2];
    2911                 :             M128A Legacy[8];
    2912                 :             M128A Xmm0;
    2913                 :             M128A Xmm1;
    2914                 :             M128A Xmm2;
    2915                 :             M128A Xmm3;
    2916                 :             M128A Xmm4;
    2917                 :             M128A Xmm5;
    2918                 :             M128A Xmm6;
    2919                 :             M128A Xmm7;
    2920                 :             M128A Xmm8;
    2921                 :             M128A Xmm9;
    2922                 :             M128A Xmm10;
    2923                 :             M128A Xmm11;
    2924                 :             M128A Xmm12;
    2925                 :             M128A Xmm13;
    2926                 :             M128A Xmm14;
    2927                 :             M128A Xmm15;
    2928                 :         };
    2929                 :     };
    2930                 : 
    2931                 :     //
    2932                 :     // Vector registers.
    2933                 :     //
    2934                 : 
    2935                 :     M128A VectorRegister[26];
    2936                 :     DWORD64 VectorControl;
    2937                 : 
    2938                 :     //
    2939                 :     // Special debug control registers.
    2940                 :     //
    2941                 : 
    2942                 :     DWORD64 DebugControl;
    2943                 :     DWORD64 LastBranchToRip;
    2944                 :     DWORD64 LastBranchFromRip;
    2945                 :     DWORD64 LastExceptionToRip;
    2946                 :     DWORD64 LastExceptionFromRip;
    2947                 : } CONTEXT, *PCONTEXT;
    2948                 : 
    2949                 : //
    2950                 : // Define function table entry - a function table entry is generated for
    2951                 : // each frame function.
    2952                 : //
    2953                 : 
    2954                 : #define RUNTIME_FUNCTION_INDIRECT 0x1
    2955                 : 
    2956                 : typedef struct _RUNTIME_FUNCTION {
    2957                 :     DWORD BeginAddress;
    2958                 :     DWORD EndAddress;
    2959                 :     DWORD UnwindData;
    2960                 : } RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
    2961                 : 
    2962                 : //
    2963                 : // Define dynamic function table entry.
    2964                 : //
    2965                 : 
    2966                 : typedef
    2967                 : PRUNTIME_FUNCTION
    2968                 : (*PGET_RUNTIME_FUNCTION_CALLBACK) (
    2969                 :     IN DWORD64 ControlPc,
    2970                 :     IN PVOID Context
    2971                 :     );
    2972                 : 
    2973                 : 
    2974                 : typedef
    2975                 : DWORD   
    2976                 : (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK) (
    2977                 :     IN HANDLE Process,
    2978                 :     IN PVOID TableAddress,
    2979                 :     OUT PDWORD Entries,
    2980                 :     OUT PRUNTIME_FUNCTION* Functions
    2981                 :     );
    2982                 : 
    2983                 : #define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \
    2984                 :     "OutOfProcessFunctionTableCallback"
    2985                 : 
    2986                 : //
    2987                 : // Define runtime exception handling prototypes.
    2988                 : //
    2989                 : 
    2990                 : NTSYSAPI
    2991                 : VOID
    2992                 : __cdecl
    2993                 : RtlRestoreContext (
    2994                 :     IN PCONTEXT ContextRecord,
    2995                 :     IN struct _EXCEPTION_RECORD *ExceptionRecord OPTIONAL
    2996                 :     );
    2997                 : 
    2998                 : 
    2999                 : NTSYSAPI
    3000                 : BOOLEAN
    3001                 : __cdecl
    3002                 : RtlAddFunctionTable (
    3003                 :     IN PRUNTIME_FUNCTION FunctionTable,
    3004                 :     IN DWORD EntryCount,
    3005                 :     IN DWORD64 BaseAddress
    3006                 :     );
    3007                 : 
    3008                 : NTSYSAPI
    3009                 : BOOLEAN
    3010                 : __cdecl
    3011                 : RtlInstallFunctionTableCallback (
    3012                 :     IN DWORD64 TableIdentifier,
    3013                 :     IN DWORD64 BaseAddress,
    3014                 :     IN DWORD Length,
    3015                 :     IN PGET_RUNTIME_FUNCTION_CALLBACK Callback,
    3016                 :     IN PVOID Context,
    3017                 :     IN PCWSTR OutOfProcessCallbackDll OPTIONAL
    3018                 :     );
    3019                 : 
    3020                 : NTSYSAPI
    3021                 : BOOLEAN
    3022                 : __cdecl
    3023                 : RtlDeleteFunctionTable (
    3024                 :     IN PRUNTIME_FUNCTION FunctionTable
    3025                 :     );
    3026                 : 
    3027                 : #endif // _AMD64_
    3028                 : 
    3029                 : 
    3030                 : #ifdef _X86_
    3031                 : 
    3032                 : //
    3033                 : // Disable these two pragmas that evaluate to "sti" "cli" on x86 so that driver
    3034                 : // writers to not leave them inadvertantly in their code.
    3035                 : //
    3036                 : 
    3037                 : #if !defined(MIDL_PASS)
    3038                 : #if !defined(RC_INVOKED)
    3039                 : 
    3040                 : #if _MSC_VER >= 1200
    3041                 : #pragma warning(push)
    3042                 : #endif
    3043                 : #pragma warning(disable:4164)   // disable C4164 warning so that apps that
    3044                 :                                 // build with /Od don't get weird errors !
    3045                 : #ifdef _M_IX86
    3046                 : #pragma function(_enable)
    3047                 : #pragma function(_disable)
    3048                 : #endif
    3049                 : 
    3050                 : #if _MSC_VER >= 1200
    3051                 : #pragma warning(pop)
    3052                 : #else
    3053                 : #pragma warning(default:4164)   // reenable C4164 warning
    3054                 : #endif
    3055                 : 
    3056                 : #endif
    3057                 : #endif
    3058                 : 
    3059                 : // end_ntddk end_nthal
    3060                 : #if defined(_M_IX86) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
    3061                 : 
    3062                 : #ifdef __cplusplus
    3063                 : extern "C" {
    3064                 : #endif
    3065                 : 
    3066                 : 
    3067                 : //
    3068                 : // [pfx_parse] - guard against PREfix intrinsic error
    3069                 : //
    3070                 : #if (_MSC_FULL_VER >= 14000101) && (!defined(_PREFIX_))
    3071                 : 
    3072                 : 
    3073                 : //
    3074                 : // Define bit test intrinsics.
    3075                 : //
    3076                 : 
    3077                 : #define BitTest _bittest
    3078                 : #define BitTestAndComplement _bittestandcomplement
    3079                 : #define BitTestAndSet _bittestandset
    3080                 : #define BitTestAndReset _bittestandreset
    3081                 : #define InterlockedBitTestAndSet _interlockedbittestandset
    3082                 : #define InterlockedBitTestAndReset _interlockedbittestandreset
    3083                 : 
    3084                 : BOOLEAN
    3085                 : _bittest (
    3086                 :     IN LONG const *Base,
    3087                 :     IN LONG Offset
    3088                 :     );
    3089                 : 
    3090                 : BOOLEAN
    3091                 : _bittestandcomplement (
    3092                 :     IN LONG *Base,
    3093                 :     IN LONG Offset
    3094                 :     );
    3095                 : 
    3096                 : BOOLEAN
    3097                 : _bittestandset (
    3098                 :     IN LONG *Base,
    3099                 :     IN LONG Offset
    3100                 :     );
    3101                 : 
    3102                 : BOOLEAN
    3103                 : _bittestandreset (
    3104                 :     IN LONG *Base,
    3105                 :     IN LONG Offset
    3106                 :     );
    3107                 : 
    3108                 : BOOLEAN
    3109                 : _interlockedbittestandset (
    3110                 :     IN LONG volatile *Base,
    3111                 :     IN LONG Offset
    3112                 :     );
    3113                 : 
    3114                 : BOOLEAN
    3115                 : _interlockedbittestandreset (
    3116                 :     IN LONG volatile *Base,
    3117                 :     IN LONG Offset
    3118                 :     );
    3119                 : 
    3120                 : #pragma intrinsic(_bittest)
    3121                 : #pragma intrinsic(_bittestandcomplement)
    3122                 : #pragma intrinsic(_bittestandset)
    3123                 : #pragma intrinsic(_bittestandreset)
    3124                 : #pragma intrinsic(_interlockedbittestandset)
    3125                 : #pragma intrinsic(_interlockedbittestandreset)
    3126                 : 
    3127                 : //
    3128                 : // Define bit scan intrinsics.
    3129                 : //
    3130                 : 
    3131                 : #define BitScanForward _BitScanForward
    3132                 : #define BitScanReverse _BitScanReverse
    3133                 : 
    3134                 : BOOLEAN
    3135                 : _BitScanForward (
    3136                 :     __out DWORD *Index,
    3137                 :     __in DWORD Mask
    3138                 :     );
    3139                 : 
    3140                 : BOOLEAN
    3141                 : _BitScanReverse (
    3142                 :     __out DWORD *Index,
    3143                 :     __in DWORD Mask
    3144                 :     );
    3145                 : 
    3146                 : #pragma intrinsic(_BitScanForward)
    3147                 : #pragma intrinsic(_BitScanReverse)
    3148                 : 
    3149                 : #else
    3150                 : 
    3151                 : #pragma warning(push)
    3152                 : #pragma warning(disable:4035 4793)
    3153                 : 
    3154                 : FORCEINLINE
    3155                 : BOOLEAN
    3156                 : InterlockedBitTestAndSet (
    3157                 :     IN LONG volatile *Base,
    3158                 :     IN LONG Bit
    3159                 :     )
    3160                 : {
    3161                 :     __asm {
    3162                 :            mov eax, Bit
    3163                 :            mov ecx, Base
    3164                 :            lock bts [ecx], eax
    3165                 :            setc al
    3166                 :     };
    3167                 : }
    3168                 : 
    3169                 : FORCEINLINE
    3170                 : BOOLEAN
    3171                 : InterlockedBitTestAndReset (
    3172                 :     IN LONG volatile *Base,
    3173                 :     IN LONG Bit
    3174                 :     )
    3175                 : {
    3176                 :     __asm {
    3177                 :            mov eax, Bit
    3178                 :            mov ecx, Base
    3179                 :            lock btr [ecx], eax
    3180                 :            setc al
    3181                 :     };
    3182                 : }
    3183                 : #pragma warning(pop)
    3184                 : 
    3185                 : #endif  /* _MSC_FULL_VER >= 14000101 */
    3186                 : 
    3187                 : //
    3188                 : // [pfx_parse] - guard against PREfix intrinsic error
    3189                 : //
    3190                 : #if (_MSC_FULL_VER >= 140040816) || (defined(_PREFAST_) && (_MSC_VER >= 1400))
    3191                 : 
    3192                 : 
    3193                 : #define InterlockedCompareExchange16 _InterlockedCompareExchange16
    3194                 : 
    3195                 : SHORT
    3196                 : _InterlockedCompareExchange16 (
    3197                 :     __inout SHORT volatile *Destination,
    3198                 :     __in SHORT ExChange,
    3199                 :     __in SHORT Comperand
    3200                 :     );
    3201                 : 
    3202                 : #pragma intrinsic(_InterlockedCompareExchange16)
    3203                 : 
    3204                 : #endif  /* _MSC_FULL_VER >= 140040816 */
    3205                 : 
    3206                 : #if !defined(_M_CEE_PURE)
    3207                 : #pragma warning(push)
    3208                 : #pragma warning(disable:4035 4793)
    3209                 : 
    3210                 : FORCEINLINE
    3211                 : BOOLEAN
    3212                 : InterlockedBitTestAndComplement (
    3213                 :     IN LONG volatile *Base,
    3214                 :     IN LONG Bit
    3215                 :     )
    3216                 : {
    3217                 :     __asm {
    3218                 :            mov eax, Bit
    3219                 :            mov ecx, Base
    3220                 :            lock btc [ecx], eax
    3221                 :            setc al
    3222                 :     };
    3223                 : }
    3224                 : #pragma warning(pop)
    3225                 : #endif  /* _M_CEE_PURE */
    3226                 : 
    3227                 : //
    3228                 : // [pfx_parse]
    3229                 : // guard against __readfsbyte parsing error
    3230                 : //
    3231                 : #if (_MSC_FULL_VER >= 13012035) || defined(_PREFIX_) || defined(_PREFAST_)
    3232                 : 
    3233                 : //
    3234                 : // Define FS referencing intrinsics
    3235                 : //
    3236                 : 
    3237                 : BYTE 
    3238                 : __readfsbyte (
    3239                 :     IN DWORD Offset
    3240                 :     );
    3241                 :  
    3242                 : WORD  
    3243                 : __readfsword (
    3244                 :     IN DWORD Offset
    3245                 :     );
    3246                 :  
    3247                 : DWORD
    3248                 : __readfsdword (
    3249                 :     IN DWORD Offset
    3250                 :     );
    3251                 :  
    3252                 : VOID
    3253                 : __writefsbyte (
    3254                 :     IN DWORD Offset,
    3255                 :     IN BYTE  Data
    3256                 :     );
    3257                 :  
    3258                 : VOID
    3259                 : __writefsword (
    3260                 :     IN DWORD Offset,
    3261                 :     IN WORD   Data
    3262                 :     );
    3263                 :  
    3264                 : VOID
    3265                 : __writefsdword (
    3266                 :     IN DWORD Offset,
    3267                 :     IN DWORD Data
    3268                 :     );
    3269                 : 
    3270                 : #pragma intrinsic(__readfsbyte)
    3271                 : #pragma intrinsic(__readfsword)
    3272                 : #pragma intrinsic(__readfsdword)
    3273                 : #pragma intrinsic(__writefsbyte)
    3274                 : #pragma intrinsic(__writefsword)
    3275                 : #pragma intrinsic(__writefsdword)
    3276                 : 
    3277                 : #endif  /* _MSC_FULL_VER >= 13012035 */
    3278                 : 
    3279                 : #if (_MSC_FULL_VER >= 140050727) || defined(_PREFIX_) || defined(_PREFAST_)
    3280                 : 
    3281                 : #if !defined(_MANAGED)
    3282                 : 
    3283                 : VOID
    3284                 : __incfsbyte (
    3285                 :     DWORD Offset
    3286                 :     );
    3287                 :  
    3288                 : VOID
    3289                 : __addfsbyte (
    3290                 :     DWORD Offset,
    3291                 :     BYTE  Value
    3292                 :     );
    3293                 :  
    3294                 : VOID
    3295                 : __incfsword (
    3296                 :     DWORD Offset
    3297                 :     );
    3298                 :  
    3299                 : VOID
    3300                 : __addfsword (
    3301                 :     DWORD Offset,
    3302                 :     WORD   Value
    3303                 :     );
    3304                 :  
    3305                 : VOID
    3306                 : __incfsdword (
    3307                 :     DWORD Offset
    3308                 :     );
    3309                 :  
    3310                 : VOID
    3311                 : __addfsdword (
    3312                 :     DWORD Offset,
    3313                 :     DWORD Value
    3314                 :     );
    3315                 :  
    3316                 : #if 0
    3317                 : #pragma intrinsic(__incfsbyte)
    3318                 : #pragma intrinsic(__addfsbyte)
    3319                 : #pragma intrinsic(__incfsword)
    3320                 : #pragma intrinsic(__addfsword)
    3321                 : #pragma intrinsic(__incfsdword)
    3322                 : #pragma intrinsic(__addfsdword)
    3323                 : #endif
    3324                 : 
    3325                 : #endif
    3326                 : 
    3327                 : #endif  /* _MSC_FULL_VER >= 140050727 */
    3328                 : 
    3329                 : #if (_MSC_FULL_VER >= 140041204) || defined(_PREFIX_) || defined(_PREFAST_)
    3330                 : 
    3331                 : VOID
    3332                 : _mm_pause (
    3333                 :     VOID
    3334                 :     );
    3335                 : 
    3336                 : #pragma intrinsic(_mm_pause)
    3337                 : 
    3338                 : #define YieldProcessor _mm_pause
    3339                 : 
    3340                 : #else
    3341                 : 
    3342                 : #if !defined(_M_CEE_PURE)
    3343                 : #define YieldProcessor() __asm { rep nop }
    3344                 : #endif  // !defined(_M_CEE_PURE)
    3345                 : 
    3346                 : #endif  // (_MSC_FULL_VER >= 140041204)
    3347                 : 
    3348                 : #ifdef __cplusplus
    3349                 : }
    3350                 : #endif
    3351                 : 
    3352                 : #endif  /* !defined(MIDL_PASS) || defined(_M_IX86) */
    3353                 : 
    3354                 : #if !defined(MIDL_PASS) && defined(_M_IX86)
    3355                 : 
    3356                 : #if !defined(_M_CEE_PURE)
    3357                 : 
    3358                 : #pragma warning( push )
    3359                 : #pragma warning( disable : 4793 )
    3360                 : FORCEINLINE
    3361                 : VOID
    3362                 : MemoryBarrier (
    3363                 :     VOID
    3364                 :     )
    3365                 : {
    3366                 :     LONG Barrier;
    3367                 :     __asm {
    3368                 :         xchg Barrier, eax
    3369                 :     }
    3370                 : }
    3371                 : #pragma warning( pop )
    3372                 : 
    3373                 : #endif /* _M_CEE_PURE */
    3374                 : //
    3375                 : // Prefetch is not supported on all x86 procssors.
    3376                 : //
    3377                 : 
    3378                 : #define PreFetchCacheLine(l, a)
    3379                 : #define ReadForWriteAccess(p) (*(p))
    3380                 : 
    3381                 : //
    3382                 : // PreFetchCacheLine level defines.
    3383                 : //
    3384                 : 
    3385                 : #define PF_TEMPORAL_LEVEL_1 
    3386                 : #define PF_NON_TEMPORAL_LEVEL_ALL
    3387                 : 
    3388                 : //
    3389                 : // Define function to read the value of a performance counter.
    3390                 : //
    3391                 : 
    3392                 : #if _MSC_FULL_VER >= 140050727
    3393                 : 
    3394                 : #define ReadPMC __readpmc
    3395                 : 
    3396                 : DWORD64
    3397                 : __readpmc (
    3398                 :     __in DWORD Counter
    3399                 :     );
    3400                 : 
    3401                 : #pragma intrinsic(__readpmc)
    3402                 : 
    3403                 : #else
    3404                 : 
    3405                 : FORCEINLINE
    3406                 : DWORD64
    3407                 : ReadPMC (
    3408                 :     __in DWORD Counter
    3409                 :     )
    3410                 : 
    3411                 : {
    3412                 : 
    3413                 :     __asm {
    3414                 :         mov ecx, Counter
    3415                 :         rdpmc
    3416                 :     };
    3417                 : }
    3418                 : 
    3419                 : #endif
    3420                 : 
    3421                 : //
    3422                 : // Define function to read the value of the time stamp counter
    3423                 : //
    3424                 : 
    3425                 : #if _MSC_FULL_VER >= 140040310
    3426                 : 
    3427                 : #define ReadTimeStampCounter() __rdtsc()
    3428                 : 
    3429                 : DWORD64
    3430                 : __rdtsc (
    3431                 :     VOID
    3432                 :     );
    3433                 : 
    3434                 : #pragma intrinsic(__rdtsc)
    3435                 : 
    3436                 : #else
    3437                 : 
    3438                 : FORCEINLINE
    3439                 : DWORD64
    3440                 : ReadTimeStampCounter (
    3441                 :     VOID
    3442                 :     )
    3443                 : 
    3444                 : {
    3445                 : 
    3446                 :     __asm rdtsc
    3447                 : }
    3448                 : 
    3449                 : #endif
    3450                 : 
    3451                 : // end_ntddk
    3452                 : // begin_wdm
    3453                 : 
    3454                 : #if defined(_X86_) && defined(_M_IX86) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
    3455                 : 
    3456                 : #if _MSC_FULL_VER >= 140030222
    3457                 : 
    3458                 : VOID
    3459                 : __int2c (
    3460                 :     VOID
    3461                 :     );
    3462                 : 
    3463                 : #pragma intrinsic(__int2c)
    3464                 : #define DbgRaiseAssertionFailure() __int2c()
    3465                 : 
    3466                 : #else
    3467                 : #pragma warning( push )
    3468                 : #pragma warning( disable : 4793 )
    3469                 : 
    3470                 : FORCEINLINE
    3471                 : VOID
    3472                 : DbgRaiseAssertionFailure (
    3473                 :     void
    3474                 :     )
    3475                 : 
    3476                 : {
    3477                 :     __asm int 0x2c
    3478                 : }
    3479                 : 
    3480                 : #pragma warning( pop )
    3481                 : 
    3482                 : #endif
    3483                 : 
    3484                 : #endif
    3485                 : 
    3486                 : // end_wdm 
    3487                 : 
    3488                 : #if (_MSC_FULL_VER >= 13012035)
    3489                 : 
    3490                 : __inline PVOID GetFiberData( void )    { return *(PVOID *) (ULONG_PTR) __readfsdword (0x10);}
    3491                 : __inline PVOID GetCurrentFiber( void ) { return (PVOID) (ULONG_PTR) __readfsdword (0x10);}
    3492                 : 
    3493                 : #else
    3494                 : #if _MSC_VER >= 1200
    3495                 : #pragma warning(push)
    3496                 : #endif
    3497                 : #pragma warning (disable:4035 4793)        // disable 4035 (function must return something)
    3498                 : __inline PVOID GetFiberData( void ) { __asm {
    3499                 :                                         mov eax, fs:[0x10]
    3500                 :                                         mov eax,[eax]
    3501                 :                                         }
    3502                 :                                      }
    3503                 : __inline PVOID GetCurrentFiber( void ) { __asm mov eax, fs:[0x10] }
    3504                 : 
    3505                 : #if _MSC_VER >= 1200
    3506                 : #pragma warning(pop)
    3507                 : #else
    3508                 : #pragma warning (default:4035 4793)        // Reenable it
    3509                 : #endif
    3510                 : #endif // (_MSC_FULL_VER >= 13012035)
    3511                 : 
    3512                 : // begin_ntddk
    3513                 : #endif // !defined(MIDL_PASS) && defined(_M_IX86)
    3514                 : // end_ntddk
    3515                 : 
    3516                 : //
    3517                 : // The following values specify the type of failing access when the status is 
    3518                 : // STATUS_ACCESS_VIOLATION and the first parameter in the execpetion record.
    3519                 : //
    3520                 : 
    3521                 : #define EXCEPTION_READ_FAULT          0 // Access violation was caused by a read
    3522                 : #define EXCEPTION_WRITE_FAULT         1 // Access violation was caused by a write
    3523                 : #define EXCEPTION_EXECUTE_FAULT       8 // Access violation was caused by an instruction fetch
    3524                 : 
    3525                 : // begin_wx86
    3526                 : // begin_ntddk                                                                  
    3527                 : 
    3528                 : //
    3529                 : //  Define the size of the 80387 save area, which is in the context frame.
    3530                 : //
    3531                 : 
    3532                 : #define SIZE_OF_80387_REGISTERS      80
    3533                 : 
    3534                 : //
    3535                 : // The following flags control the contents of the CONTEXT structure.
    3536                 : //
    3537                 : 
    3538                 : #if !defined(RC_INVOKED)
    3539                 : 
    3540                 : #define CONTEXT_i386    0x00010000    // this assumes that i386 and
    3541                 : #define CONTEXT_i486    0x00010000    // i486 have identical context records
    3542                 : 
    3543                 : // end_wx86
    3544                 : 
    3545                 : #define CONTEXT_CONTROL         (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
    3546                 : #define CONTEXT_INTEGER         (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
    3547                 : #define CONTEXT_SEGMENTS        (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
    3548                 : #define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x00000008L) // 387 state
    3549                 : #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
    3550                 : #define CONTEXT_EXTENDED_REGISTERS  (CONTEXT_i386 | 0x00000020L) // cpu specific extensions
    3551                 : 
    3552                 : #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER |\
    3553                 :                       CONTEXT_SEGMENTS)
    3554                 : 
    3555                 : #define CONTEXT_ALL             (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
    3556                 :                                  CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
    3557                 :                                  CONTEXT_EXTENDED_REGISTERS)
    3558                 : 
    3559                 : // begin_wx86
    3560                 : 
    3561                 : #endif // !defined(RC_INVOKED)
    3562                 : 
    3563                 : #define MAXIMUM_SUPPORTED_EXTENSION     512
    3564                 : 
    3565                 : typedef struct _FLOATING_SAVE_AREA {
    3566                 :     DWORD   ControlWord;
    3567                 :     DWORD   StatusWord;
    3568                 :     DWORD   TagWord;
    3569                 :     DWORD   ErrorOffset;
    3570                 :     DWORD   ErrorSelector;
    3571                 :     DWORD   DataOffset;
    3572                 :     DWORD   DataSelector;
    3573                 :     BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
    3574                 :     DWORD   Cr0NpxState;
    3575                 : } FLOATING_SAVE_AREA;
    3576                 : 
    3577                 : typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
    3578                 : 
    3579                 : //
    3580                 : // Context Frame
    3581                 : //
    3582                 : //  This frame has a several purposes: 1) it is used as an argument to
    3583                 : //  NtContinue, 2) is is used to constuct a call frame for APC delivery,
    3584                 : //  and 3) it is used in the user level thread creation routines.
    3585                 : //
    3586                 : //  The layout of the record conforms to a standard call frame.
    3587                 : //
    3588                 : 
    3589                 : typedef struct _CONTEXT {
    3590                 : 
    3591                 :     //
    3592                 :     // The flags values within this flag control the contents of
    3593                 :     // a CONTEXT record.
    3594                 :     //
    3595                 :     // If the context record is used as an input parameter, then
    3596                 :     // for each portion of the context record controlled by a flag
    3597                 :     // whose value is set, it is assumed that that portion of the
    3598                 :     // context record contains valid context. If the context record
    3599                 :     // is being used to modify a threads context, then only that
    3600                 :     // portion of the threads context will be modified.
    3601                 :     //
    3602                 :     // If the context record is used as an IN OUT parameter to capture
    3603                 :     // the context of a thread, then only those portions of the thread's
    3604                 :     // context corresponding to set flags will be returned.
    3605                 :     //
    3606                 :     // The context record is never used as an OUT only parameter.
    3607                 :     //
    3608                 : 
    3609                 :     DWORD ContextFlags;
    3610                 : 
    3611                 :     //
    3612                 :     // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
    3613                 :     // set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT
    3614                 :     // included in CONTEXT_FULL.
    3615                 :     //
    3616                 : 
    3617                 :     DWORD   Dr0;
    3618                 :     DWORD   Dr1;
    3619                 :     DWORD   Dr2;
    3620                 :     DWORD   Dr3;
    3621                 :     DWORD   Dr6;
    3622                 :     DWORD   Dr7;
    3623                 : 
    3624                 :     //
    3625                 :     // This section is specified/returned if the
    3626                 :     // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
    3627                 :     //
    3628                 : 
    3629                 :     FLOATING_SAVE_AREA FloatSave;
    3630                 : 
    3631                 :     //
    3632                 :     // This section is specified/returned if the
    3633                 :     // ContextFlags word contians the flag CONTEXT_SEGMENTS.
    3634                 :     //
    3635                 : 
    3636                 :     DWORD   SegGs;
    3637                 :     DWORD   SegFs;
    3638                 :     DWORD   SegEs;
    3639                 :     DWORD   SegDs;
    3640                 : 
    3641                 :     //
    3642                 :     // This section is specified/returned if the
    3643                 :     // ContextFlags word contians the flag CONTEXT_INTEGER.
    3644                 :     //
    3645                 : 
    3646                 :     DWORD   Edi;
    3647                 :     DWORD   Esi;
    3648                 :     DWORD   Ebx;
    3649                 :     DWORD   Edx;
    3650                 :     DWORD   Ecx;
    3651                 :     DWORD   Eax;
    3652                 : 
    3653                 :     //
    3654                 :     // This section is specified/returned if the
    3655                 :     // ContextFlags word contians the flag CONTEXT_CONTROL.
    3656                 :     //
    3657                 : 
    3658                 :     DWORD   Ebp;
    3659                 :     DWORD   Eip;
    3660                 :     DWORD   SegCs;              // MUST BE SANITIZED
    3661                 :     DWORD   EFlags;             // MUST BE SANITIZED
    3662                 :     DWORD   Esp;
    3663                 :     DWORD   SegSs;
    3664                 : 
    3665                 :     //
    3666                 :     // This section is specified/returned if the ContextFlags word
    3667                 :     // contains the flag CONTEXT_EXTENDED_REGISTERS.
    3668                 :     // The format and contexts are processor specific
    3669                 :     //
    3670                 : 
    3671                 :     BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
    3672                 : 
    3673                 : } CONTEXT;
    3674                 : 
    3675                 : 
    3676                 : 
    3677                 : typedef CONTEXT *PCONTEXT;
    3678                 : 
    3679                 : // begin_ntminiport
    3680                 : #endif //_X86_
    3681                 : 
    3682                 : 
    3683                 : #ifndef _LDT_ENTRY_DEFINED
    3684                 : #define _LDT_ENTRY_DEFINED
    3685                 : 
    3686                 : typedef struct _LDT_ENTRY {
    3687                 :     WORD    LimitLow;
    3688                 :     WORD    BaseLow;
    3689                 :     union {
    3690                 :         struct {
    3691                 :             BYTE    BaseMid;
    3692                 :             BYTE    Flags1;     // Declare as bytes to avoid alignment
    3693                 :             BYTE    Flags2;     // Problems.
    3694                 :             BYTE    BaseHi;
    3695                 :         } Bytes;
    3696                 :         struct {
    3697                 :             DWORD   BaseMid : 8;
    3698                 :             DWORD   Type : 5;
    3699                 :             DWORD   Dpl : 2;
    3700                 :             DWORD   Pres : 1;
    3701                 :             DWORD   LimitHi : 4;
    3702                 :             DWORD   Sys : 1;
    3703                 :             DWORD   Reserved_0 : 1;
    3704                 :             DWORD   Default_Big : 1;
    3705                 :             DWORD   Granularity : 1;
    3706                 :             DWORD   BaseHi : 8;
    3707                 :         } Bits;
    3708                 :     } HighWord;
    3709                 : } LDT_ENTRY, *PLDT_ENTRY;
    3710                 : 
    3711                 : #endif
    3712                 : 
    3713                 : 
    3714                 : #if defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
    3715                 : 
    3716                 : #ifdef __cplusplus
    3717                 : extern "C" {
    3718                 : #endif
    3719                 : 
    3720                 : //
    3721                 : // Define bit test intrinsics.
    3722                 : //
    3723                 : 
    3724                 : #define BitTest _bittest
    3725                 : #define BitTestAndComplement _bittestandcomplement
    3726                 : #define BitTestAndSet _bittestandset
    3727                 : #define BitTestAndReset _bittestandreset
    3728                 : 
    3729                 : #define BitTest64 _bittest64
    3730                 : #define BitTestAndComplement64 _bittestandcomplement64
    3731                 : #define BitTestAndSet64 _bittestandset64
    3732                 : #define BitTestAndReset64 _bittestandreset64
    3733                 : 
    3734                 : BOOLEAN
    3735                 : _bittest (
    3736                 :     IN LONG const *Base,
    3737                 :     IN LONG Offset
    3738                 :     );
    3739                 : 
    3740                 : BOOLEAN
    3741                 : _bittestandcomplement (
    3742                 :     IN LONG *Base,
    3743                 :     IN LONG Offset
    3744                 :     );
    3745                 : 
    3746                 : BOOLEAN
    3747                 : _bittestandset (
    3748                 :     IN LONG *Base,
    3749                 :     IN LONG Offset
    3750                 :     );
    3751                 : 
    3752                 : BOOLEAN
    3753                 : _bittestandreset (
    3754                 :     IN LONG *Base,
    3755                 :     IN LONG Offset
    3756                 :     );
    3757                 : 
    3758                 : BOOLEAN
    3759                 : _bittest64 (
    3760                 :     IN LONG64 const *Base,
    3761                 :     IN LONG64 Offset
    3762                 :     );
    3763                 : 
    3764                 : BOOLEAN
    3765                 : _bittestandcomplement64 (
    3766                 :     IN LONG64 *Base,
    3767                 :     IN LONG64 Offset
    3768                 :     );
    3769                 : 
    3770                 : BOOLEAN
    3771                 : _bittestandset64 (
    3772                 :     IN LONG64 *Base,
    3773                 :     IN LONG64 Offset
    3774                 :     );
    3775                 : 
    3776                 : BOOLEAN
    3777                 : _bittestandreset64 (
    3778                 :     IN LONG64 *Base,
    3779                 :     IN LONG64 Offset
    3780                 :     );
    3781                 : 
    3782                 : #pragma intrinsic(_bittest)
    3783                 : #pragma intrinsic(_bittestandcomplement)
    3784                 : #pragma intrinsic(_bittestandset)
    3785                 : #pragma intrinsic(_bittestandreset)
    3786                 : 
    3787                 : #pragma intrinsic(_bittest64)
    3788                 : #pragma intrinsic(_bittestandcomplement64)
    3789                 : #pragma intrinsic(_bittestandset64)
    3790                 : #pragma intrinsic(_bittestandreset64)
    3791                 : 
    3792                 : //
    3793                 : // Define bit scan intrinsics.
    3794                 : //
    3795                 : 
    3796                 : #define BitScanForward _BitScanForward
    3797                 : #define BitScanReverse _BitScanReverse
    3798                 : #define BitScanForward64 _BitScanForward64
    3799                 : #define BitScanReverse64 _BitScanReverse64
    3800                 : 
    3801                 : BOOLEAN
    3802                 : _BitScanForward (
    3803                 :     OUT DWORD *Index,
    3804                 :     IN DWORD Mask
    3805                 :     );
    3806                 : 
    3807                 : BOOLEAN
    3808                 : _BitScanReverse (
    3809                 :     OUT DWORD *Index,
    3810                 :     IN DWORD Mask
    3811                 :     );
    3812                 : 
    3813                 : BOOLEAN
    3814                 : _BitScanForward64 (
    3815                 :     OUT DWORD *Index,
    3816                 :     IN DWORD64 Mask
    3817                 :     );
    3818                 : 
    3819                 : BOOLEAN
    3820                 : _BitScanReverse64 (
    3821                 :     OUT DWORD *Index,
    3822                 :     IN DWORD64 Mask
    3823                 :     );
    3824                 : 
    3825                 : #pragma intrinsic(_BitScanForward)
    3826                 : #pragma intrinsic(_BitScanReverse)
    3827                 : #pragma intrinsic(_BitScanForward64)
    3828                 : #pragma intrinsic(_BitScanReverse64)
    3829                 : 
    3830                 : #define InterlockedCompareExchange16 _InterlockedCompareExchange16
    3831                 : 
    3832                 : SHORT
    3833                 : _InterlockedCompareExchange16 (
    3834                 :     __inout SHORT volatile *Destination,
    3835                 :     __in SHORT ExChange,
    3836                 :     __in SHORT Comperand
    3837                 :     );
    3838                 : 
    3839                 : #pragma intrinsic(_InterlockedCompareExchange16)
    3840                 : 
    3841                 : #ifdef __cplusplus
    3842                 : }
    3843                 : #endif
    3844                 : 
    3845                 : #define InterlockedAdd                          _InterlockedAdd
    3846                 : #define InterlockedAddAcquire                   _InterlockedAdd_acq
    3847                 : #define InterlockedAddRelease                   _InterlockedAdd_rel
    3848                 : 
    3849                 : #define InterlockedIncrement                    _InterlockedIncrement
    3850                 : #define InterlockedIncrementAcquire             _InterlockedIncrement_acq
    3851                 : #define InterlockedIncrementRelease             _InterlockedIncrement_rel
    3852                 : 
    3853                 : #define InterlockedDecrement                    _InterlockedDecrement
    3854                 : #define InterlockedDecrementAcquire             _InterlockedDecrement_acq
    3855                 : #define InterlockedDecrementRelease             _InterlockedDecrement_rel
    3856                 : 
    3857                 : #define InterlockedExchange                     _InterlockedExchange
    3858                 : #define InterlockedExchangeAcquire              _InterlockedExchange_acq
    3859                 : 
    3860                 : #define InterlockedExchangeAdd                  _InterlockedExchangeAdd
    3861                 : #define InterlockedExchangeAddAcquire           _InterlockedExchangeAdd_acq
    3862                 : #define InterlockedExchangeAddRelease           _InterlockedExchangeAdd_rel
    3863                 : 
    3864                 : #define InterlockedAdd64                        _InterlockedAdd64
    3865                 : #define InterlockedAddAcquire64                 _InterlockedAdd64_acq
    3866                 : #define InterlockedAddRelease64                 _InterlockedAdd64_rel
    3867                 : 
    3868                 : #define InterlockedIncrement64                  _InterlockedIncrement64
    3869                 : #define InterlockedIncrementAcquire64           _InterlockedIncrement64_acq
    3870                 : #define InterlockedIncrementRelease64           _InterlockedIncrement64_rel
    3871                 : 
    3872                 : #define InterlockedDecrement64                  _InterlockedDecrement64
    3873                 : #define InterlockedDecrementAcquire64           _InterlockedDecrement64_acq
    3874                 : #define InterlockedDecrementRelease64           _InterlockedDecrement64_rel
    3875                 : 
    3876                 : #define InterlockedExchange64                   _InterlockedExchange64
    3877                 : #define InterlockedExchangeAcquire64            _InterlockedExchange64_acq
    3878                 : 
    3879                 : #define InterlockedExchangeAdd64                _InterlockedExchangeAdd64
    3880                 : #define InterlockedExchangeAddAcquire64         _InterlockedExchangeAdd64_acq
    3881                 : #define InterlockedExchangeAddRelease64         _InterlockedExchangeAdd64_rel
    3882                 : 
    3883                 : #define InterlockedCompareExchange64            _InterlockedCompareExchange64
    3884                 : #define InterlockedCompareExchangeAcquire64     _InterlockedCompareExchange64_acq
    3885                 : #define InterlockedCompareExchangeRelease64     _InterlockedCompareExchange64_rel
    3886                 : 
    3887                 : #define InterlockedCompare64Exchange128     _InterlockedCompare64Exchange128
    3888                 : #define InterlockedCompare64ExchangeAcquire128  _InterlockedCompare64Exchange128_acq
    3889                 : #define InterlockedCompare64ExchangeRelease128  _InterlockedCompare64Exchange128_rel
    3890                 : 
    3891                 : #define InterlockedCompareExchange              _InterlockedCompareExchange
    3892                 : #define InterlockedCompareExchangeAcquire       _InterlockedCompareExchange_acq
    3893                 : #define InterlockedCompareExchangeRelease       _InterlockedCompareExchange_rel
    3894                 : 
    3895                 : #define InterlockedExchangePointer              _InterlockedExchangePointer
    3896                 : #define InterlockedExchangePointerAcquire       _InterlockedExchangePointer_acq
    3897                 : 
    3898                 : #define InterlockedCompareExchangePointer        _InterlockedCompareExchangePointer
    3899                 : #define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer_rel
    3900                 : #define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer_acq
    3901                 : 
    3902                 : 
    3903                 : #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
    3904                 : #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)
    3905                 : #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)
    3906                 : 
    3907                 : #define InterlockedOr       _InterlockedOr
    3908                 : #define InterlockedOrAcquire   _InterlockedOr_acq
    3909                 : #define InterlockedOrRelease   _InterlockedOr_rel
    3910                 : #define InterlockedOr8      _InterlockedOr8
    3911                 : #define InterlockedOr8Acquire  _InterlockedOr8_acq
    3912                 : #define InterlockedOr8Release  _InterlockedOr8_rel
    3913                 : #define InterlockedOr16     _InterlockedOr16
    3914                 : #define InterlockedOr16Acquire _InterlockedOr16_acq
    3915                 : #define InterlockedOr16Release _InterlockedOr16_rel
    3916                 : #define InterlockedOr64     _InterlockedOr64
    3917                 : #define InterlockedOr64Acquire _InterlockedOr64_acq
    3918                 : #define InterlockedOr64Release _InterlockedOr64_rel
    3919                 : #define InterlockedXor      _InterlockedXor
    3920                 : #define InterlockedXorAcquire  _InterlockedXor_acq
    3921                 : #define InterlockedXorRelease  _InterlockedXor_rel
    3922                 : #define InterlockedXor8     _InterlockedXor8
    3923                 : #define InterlockedXor8Acquire _InterlockedXor8_acq
    3924                 : #define InterlockedXor8Release _InterlockedXor8_rel
    3925                 : #define InterlockedXor16    _InterlockedXor16
    3926                 : #define InterlockedXor16Acquire _InterlockedXor16_acq
    3927                 : #define InterlockedXor16Release _InterlockedXor16_rel
    3928                 : #define InterlockedXor64     _InterlockedXor64
    3929                 : #define InterlockedXor64Acquire _InterlockedXor64_acq
    3930                 : #define InterlockedXor64Release _InterlockedXor64_rel
    3931                 : #define InterlockedAnd       _InterlockedAnd
    3932                 : #define InterlockedAndAcquire   _InterlockedAnd_acq
    3933                 : #define InterlockedAndRelease   _InterlockedAnd_rel
    3934                 : #define InterlockedAnd8      _InterlockedAnd8
    3935                 : #define InterlockedAnd8Acquire  _InterlockedAnd8_acq
    3936                 : #define InterlockedAnd8Release  _InterlockedAnd8_rel
    3937                 : #define InterlockedAnd16     _InterlockedAnd16
    3938                 : #define InterlockedAnd16Acquire _InterlockedAnd16_acq
    3939                 : #define InterlockedAnd16Release _InterlockedAnd16_rel
    3940                 : #define InterlockedAnd64     _InterlockedAnd64
    3941                 : #define InterlockedAnd64Acquire _InterlockedAnd64_acq
    3942                 : #define InterlockedAnd64Release _InterlockedAnd64_rel
    3943                 : 
    3944                 : #ifdef __cplusplus
    3945                 : extern "C" {
    3946                 : #endif
    3947                 : 
    3948                 : LONG
    3949                 : __cdecl
    3950                 : InterlockedAdd (
    3951                 :     LONG volatile *Addend,
    3952                 :     LONG Value
    3953                 :     );
    3954                 : 
    3955                 : LONG
    3956                 : __cdecl
    3957                 : InterlockedAddAcquire (
    3958                 :     LONG volatile *Addend,
    3959                 :     LONG Value
    3960                 :     );
    3961                 : 
    3962                 : LONG
    3963                 : __cdecl
    3964                 : InterlockedAddRelease (
    3965                 :     LONG volatile *Addend,
    3966                 :     LONG Value
    3967                 :     );
    3968                 :     
    3969                 : LONGLONG
    3970                 : __cdecl
    3971                 : InterlockedAdd64 (
    3972                 :     LONGLONG volatile *Addend,
    3973                 :     LONGLONG Value
    3974                 :     );
    3975                 : 
    3976                 : LONGLONG
    3977                 : __cdecl
    3978                 : InterlockedAddAcquire64 (
    3979                 :     LONGLONG volatile *Addend,
    3980                 :     LONGLONG Value
    3981                 :     );
    3982                 : 
    3983                 : 
    3984                 : LONGLONG
    3985                 : __cdecl
    3986                 : InterlockedAddRelease64 (
    3987                 :     LONGLONG volatile *Addend,
    3988                 :     LONGLONG Value
    3989                 :     );
    3990                 : 
    3991                 : LONG
    3992                 : __cdecl
    3993                 : InterlockedIncrement(
    3994                 :     IN OUT LONG volatile *Addend
    3995                 :     );
    3996                 : 
    3997                 : LONG
    3998                 : __cdecl
    3999                 : InterlockedDecrement(
    4000                 :     IN OUT LONG volatile *Addend
    4001                 :     );
    4002                 : 
    4003                 : LONG
    4004                 : __cdecl
    4005                 : InterlockedIncrementAcquire(
    4006                 :     IN OUT LONG volatile *Addend
    4007                 :     );
    4008                 : 
    4009                 : LONG
    4010                 : __cdecl
    4011                 : InterlockedDecrementAcquire(
    4012                 :     IN OUT LONG volatile *Addend
    4013                 :     );
    4014                 : 
    4015                 : LONG
    4016                 : __cdecl
    4017                 : InterlockedIncrementRelease(
    4018                 :     IN OUT LONG volatile *Addend
    4019                 :     );
    4020                 : 
    4021                 : LONG
    4022                 : __cdecl
    4023                 : InterlockedDecrementRelease(
    4024                 :     IN OUT LONG volatile *Addend
    4025                 :     );
    4026                 : 
    4027                 : LONG
    4028                 : __cdecl
    4029                 : InterlockedExchange(
    4030                 :     IN OUT LONG volatile *Target,
    4031                 :     IN LONG Value
    4032                 :     );
    4033                 : 
    4034                 : LONG
    4035                 : __cdecl
    4036                 : InterlockedExchangeAcquire(
    4037                 :     IN OUT LONG volatile *Target,
    4038                 :     IN LONG Value
    4039                 :     );
    4040                 : 
    4041                 : LONG
    4042                 : __cdecl
    4043                 : InterlockedExchangeAdd(
    4044                 :     IN OUT LONG volatile *Addend,
    4045                 :     IN LONG Value
    4046                 :     );
    4047                 : 
    4048                 : LONG
    4049                 : __cdecl
    4050                 : InterlockedExchangeAddAcquire(
    4051                 :     IN OUT LONG volatile *Addend,
    4052                 :     IN LONG Value
    4053                 :     );
    4054                 : 
    4055                 : LONG
    4056                 : __cdecl
    4057                 : InterlockedExchangeAddRelease(
    4058                 :     IN OUT LONG volatile *Addend,
    4059                 :     IN LONG Value
    4060                 :     );
    4061                 : LONG
    4062                 : __cdecl
    4063                 : InterlockedCompareExchange (
    4064                 :     IN OUT LONG volatile *Destination,
    4065                 :     IN LONG ExChange,
    4066                 :     IN LONG Comperand
    4067                 :     );
    4068                 : 
    4069                 : 
    4070                 : LONG
    4071                 : __cdecl
    4072                 : InterlockedCompareExchangeRelease (
    4073                 :     IN OUT LONG volatile *Destination,
    4074                 :     IN LONG ExChange,
    4075                 :     IN LONG Comperand
    4076                 :     );
    4077                 : 
    4078                 : 
    4079                 : LONG
    4080                 : __cdecl
    4081                 : InterlockedCompareExchangeAcquire (
    4082                 :     IN OUT LONG volatile *Destination,
    4083                 :     IN LONG ExChange,
    4084                 :     IN LONG Comperand
    4085                 :     );
    4086                 : 
    4087                 : 
    4088                 : LONGLONG
    4089                 : __cdecl
    4090                 : InterlockedIncrement64(
    4091                 :     IN OUT LONGLONG volatile *Addend
    4092                 :     );
    4093                 : 
    4094                 : LONGLONG
    4095                 : __cdecl
    4096                 : InterlockedIncrementAcquire64(
    4097                 :     IN OUT LONGLONG volatile *Addend
    4098                 :     );
    4099                 : 
    4100                 : LONGLONG
    4101                 : __cdecl
    4102                 : InterlockedIncrementRelease64(
    4103                 :     IN OUT LONGLONG volatile *Addend
    4104                 :     );
    4105                 : 
    4106                 : LONGLONG
    4107                 : __cdecl
    4108                 : InterlockedDecrement64(
    4109                 :     IN OUT LONGLONG volatile *Addend
    4110                 :     );
    4111                 : 
    4112                 : LONGLONG
    4113                 : __cdecl
    4114                 : InterlockedDecrementAcquire64(
    4115                 :     IN OUT LONGLONG volatile *Addend
    4116                 :     );
    4117                 : 
    4118                 : LONGLONG
    4119                 : __cdecl
    4120                 : InterlockedDecrementRelease64(
    4121                 :     IN OUT LONGLONG volatile *Addend
    4122                 :     );
    4123                 : 
    4124                 : LONGLONG
    4125                 : __cdecl
    4126                 : InterlockedExchange64(
    4127                 :     IN OUT LONGLONG volatile *Target,
    4128                 :     IN LONGLONG Value
    4129                 :     );
    4130                 : 
    4131                 : LONGLONG
    4132                 : __cdecl
    4133                 : InterlockedExchangeAcquire64(
    4134                 :     IN OUT LONGLONG volatile *Target,
    4135                 :     IN LONGLONG Value
    4136                 :     );
    4137                 : 
    4138                 : LONGLONG
    4139                 : __cdecl
    4140                 : InterlockedExchangeAdd64(
    4141                 :     IN OUT LONGLONG volatile *Addend,
    4142                 :     IN LONGLONG Value
    4143                 :     );
    4144                 : 
    4145                 : LONGLONG
    4146                 : __cdecl
    4147                 : InterlockedExchangeAddAcquire64(
    4148                 :     IN OUT LONGLONG volatile *Addend,
    4149                 :     IN LONGLONG Value
    4150                 :     );
    4151                 : 
    4152                 : LONGLONG
    4153                 : __cdecl
    4154                 : InterlockedExchangeAddRelease64(
    4155                 :     IN OUT LONGLONG volatile *Addend,
    4156                 :     IN LONGLONG Value
    4157                 :     );
    4158                 : 
    4159                 : LONGLONG
    4160                 : __cdecl
    4161                 : InterlockedCompareExchange64 (
    4162                 :     IN OUT LONGLONG volatile *Destination,
    4163                 :     IN LONGLONG ExChange,
    4164                 :     IN LONGLONG Comperand
    4165                 :     );
    4166                 : 
    4167                 : LONGLONG
    4168                 : __cdecl
    4169                 : InterlockedCompareExchangeAcquire64 (
    4170                 :     IN OUT LONGLONG volatile *Destination,
    4171                 :     IN LONGLONG ExChange,
    4172                 :     IN LONGLONG Comperand
    4173                 :     );
    4174                 : 
    4175                 : LONGLONG
    4176                 : __cdecl
    4177                 : InterlockedCompareExchangeRelease64 (
    4178                 :     IN OUT LONGLONG volatile *Destination,
    4179                 :     IN LONGLONG ExChange,
    4180                 :     IN LONGLONG Comperand
    4181                 :     );
    4182                 : 
    4183                 : LONG64
    4184                 : __cdecl
    4185                 : InterlockedCompare64Exchange128(
    4186                 :     __inout LONG64 volatile * Destination,
    4187                 :     __in LONG64 ExchangeHigh,
    4188                 :     __in LONG64 ExchangeLow,
    4189                 :     __in LONG64 Comperand
    4190                 :     );
    4191                 : 
    4192                 : LONG64
    4193                 : __cdecl
    4194                 : InterlockedCompare64ExchangeAcquire128(
    4195                 :     __inout LONG64 volatile * Destination,
    4196                 :     __in LONG64 ExchangeHigh,
    4197                 :     __in LONG64 ExchangeLow,
    4198                 :     __in LONG64 Comperand
    4199                 :     );
    4200                 : 
    4201                 : LONG64
    4202                 : __cdecl
    4203                 : InterlockedCompare64ExchangeRelease128(
    4204                 :     __inout LONG64 volatile * Destination,
    4205                 :     __in LONG64 ExchangeHigh,
    4206                 :     __in LONG64 ExchangeLow,
    4207                 :     __in LONG64 Comperand
    4208                 :     );
    4209                 : 
    4210                 : PVOID
    4211                 : __cdecl
    4212                 : InterlockedCompareExchangePointer (
    4213                 :     IN OUT PVOID volatile *Destination,
    4214                 :     IN PVOID Exchange,
    4215                 :     IN PVOID Comperand
    4216                 :     );
    4217                 : 
    4218                 : PVOID
    4219                 : __cdecl
    4220                 : InterlockedCompareExchangePointerAcquire (
    4221                 :     IN OUT PVOID volatile *Destination,
    4222                 :     IN PVOID Exchange,
    4223                 :     IN PVOID Comperand
    4224                 :     );
    4225                 : 
    4226                 : PVOID
    4227                 : __cdecl
    4228                 : InterlockedCompareExchangePointerRelease (
    4229                 :     IN OUT PVOID volatile *Destination,
    4230                 :     IN PVOID Exchange,
    4231                 :     IN PVOID Comperand
    4232                 :     );
    4233                 : 
    4234                 : PVOID
    4235                 : __cdecl
    4236                 : InterlockedExchangePointer(
    4237                 :     IN OUT PVOID volatile *Target,
    4238                 :     IN PVOID Value
    4239                 :     );
    4240                 : 
    4241                 : PVOID
    4242                 : __cdecl
    4243                 : InterlockedExchangePointerAcquire(
    4244                 :     IN OUT PVOID volatile *Target,
    4245                 :     IN PVOID Value
    4246                 :     );
    4247                 : 
    4248                 : LONG
    4249                 : __cdecl
    4250                 : InterlockedOr (
    4251                 :     IN OUT LONG volatile *Destination,
    4252                 :     IN LONG Value
    4253                 :     );
    4254                 : 
    4255                 : LONG
    4256                 : __cdecl
    4257                 : InterlockedOrAcquire (
    4258                 :     IN OUT LONG volatile *Destination,
    4259                 :     IN LONG Value
    4260                 :     );
    4261                 :     
    4262                 : LONG
    4263                 : __cdecl
    4264                 : InterlockedOrRelease (
    4265                 :     IN OUT LONG volatile *Destination,
    4266                 :     IN LONG Value
    4267                 :     );
    4268                 : 
    4269                 : CHAR
    4270                 : __cdecl
    4271                 : InterlockedOr8 (
    4272                 :     IN OUT CHAR volatile *Destination,
    4273                 :     IN    CHAR Value
    4274                 :     );
    4275                 : 
    4276                 : CHAR
    4277                 : __cdecl
    4278                 : InterlockedOr8Acquire (
    4279                 :     IN OUT CHAR volatile *Destination,
    4280                 :     IN    CHAR Value
    4281                 :     );
    4282                 : 
    4283                 : CHAR
    4284                 : __cdecl
    4285                 : InterlockedOr8Release (
    4286                 :     IN OUT CHAR volatile *Destination,
    4287                 :     IN CHAR Value
    4288                 :     );
    4289                 : 
    4290                 : SHORT
    4291                 : __cdecl
    4292                 : InterlockedOr16(
    4293                 :     IN OUT SHORT volatile *Destination,
    4294                 :     IN SHORT Value
    4295                 :     );
    4296                 :     
    4297                 : SHORT
    4298                 : __cdecl
    4299                 : InterlockedOr16Acquire (
    4300                 :     IN OUT SHORT volatile *Destination,
    4301                 :     IN SHORT Value
    4302                 :     );
    4303                 : 
    4304                 : SHORT
    4305                 : __cdecl
    4306                 : InterlockedOr16Release (
    4307                 :     IN OUT SHORT volatile *Destination,
    4308                 :     IN SHORT Value
    4309                 :     );
    4310                 : 
    4311                 : LONGLONG
    4312                 : __cdecl
    4313                 : InterlockedOr64 (
    4314                 :     IN OUT LONGLONG volatile *Destination,
    4315                 :     IN LONGLONG Value
    4316                 :     );
    4317                 : 
    4318                 : LONGLONG
    4319                 : __cdecl
    4320                 : InterlockedOr64Acquire (
    4321                 :     IN OUT LONGLONG volatile *Destination,
    4322                 :     IN LONGLONG Value
    4323                 :     );
    4324                 :     
    4325                 : LONGLONG
    4326                 : __cdecl
    4327                 : InterlockedOr64Release (
    4328                 :     IN OUT LONGLONG volatile *Destination,
    4329                 :     IN LONGLONG Value
    4330                 :     );
    4331                 : 
    4332                 : LONG
    4333                 : __cdecl
    4334                 : InterlockedXor (
    4335                 :     IN OUT LONG volatile *Destination,
    4336                 :     IN LONG Value
    4337                 :     );
    4338                 : 
    4339                 : LONG
    4340                 : __cdecl
    4341                 : InterlockedXorAcquire (
    4342                 :     IN OUT LONG volatile *Destination,
    4343                 :     IN LONG Value
    4344                 :     );
    4345                 :     
    4346                 : LONG
    4347                 : __cdecl
    4348                 : InterlockedXorRelease (
    4349                 :     IN OUT LONG volatile *Destination,
    4350                 :     IN LONG Value
    4351                 :     );
    4352                 : 
    4353                 : CHAR
    4354                 : __cdecl
    4355                 : InterlockedXor8 (
    4356                 :     IN OUT CHAR volatile *Destination,
    4357                 :     IN CHAR Value
    4358                 :     );
    4359                 : 
    4360                 : CHAR
    4361                 : __cdecl
    4362                 : InterlockedXor8Acquire (
    4363                 :     IN OUT CHAR volatile *Destination,
    4364                 :     IN CHAR Value
    4365                 :     );
    4366                 : 
    4367                 : CHAR
    4368                 : __cdecl
    4369                 : InterlockedXor8Release (
    4370                 :     IN OUT CHAR volatile *Destination,
    4371                 :     IN CHAR Value
    4372                 :     );
    4373                 : 
    4374                 : SHORT
    4375                 : __cdecl
    4376                 : InterlockedXor16(
    4377                 :     IN OUT SHORT volatile *Destination,
    4378                 :     IN SHORT Value
    4379                 :     );
    4380                 :     
    4381                 : SHORT
    4382                 : __cdecl
    4383                 : InterlockedXor16Acquire (
    4384                 :     IN OUT SHORT volatile *Destination,
    4385                 :     IN SHORT Value
    4386                 :     );
    4387                 : 
    4388                 : SHORT
    4389                 : __cdecl
    4390                 : InterlockedXor16Release (
    4391                 :     IN OUT SHORT volatile *Destination,
    4392                 :     IN SHORT Value
    4393                 :     );
    4394                 : 
    4395                 : LONGLONG
    4396                 : __cdecl
    4397                 : InterlockedXor64 (
    4398                 :     IN OUT LONGLONG volatile *Destination,
    4399                 :     IN LONGLONG Value
    4400                 :     );
    4401                 : 
    4402                 : LONGLONG
    4403                 : __cdecl
    4404                 : InterlockedXor64Acquire (
    4405                 :     IN OUT LONGLONG volatile *Destination,
    4406                 :     IN LONGLONG Value
    4407                 :     );
    4408                 :     
    4409                 : LONGLONG
    4410                 : __cdecl
    4411                 : InterlockedXor64Release (
    4412                 :     IN OUT LONGLONG volatile *Destination,
    4413                 :     IN LONGLONG Value
    4414                 :     );
    4415                 : 
    4416                 : LONG
    4417                 : __cdecl
    4418                 : InterlockedAnd (
    4419                 :     IN OUT LONG volatile *Destination,
    4420                 :     IN LONG Value
    4421                 :     );
    4422                 : 
    4423                 : LONG
    4424                 : __cdecl
    4425                 : InterlockedAndAcquire (
    4426                 :     IN OUT LONG volatile *Destination,
    4427                 :     IN LONG Value
    4428                 :     );
    4429                 :     
    4430                 : LONG
    4431                 : __cdecl
    4432                 : InterlockedAndRelease (
    4433                 :     IN OUT LONG volatile *Destination,
    4434                 :     IN LONG Value
    4435                 :     );
    4436                 : 
    4437                 : CHAR
    4438                 : __cdecl
    4439                 : InterlockedAnd8 (
    4440                 :     IN OUT CHAR volatile *Destination,
    4441                 :     IN CHAR Value
    4442                 :     );
    4443                 : 
    4444                 : CHAR
    4445                 : __cdecl
    4446                 : InterlockedAnd8Acquire (
    4447                 :     IN OUT CHAR volatile *Destination,
    4448                 :     IN CHAR Value
    4449                 :     );
    4450                 : 
    4451                 : CHAR
    4452                 : __cdecl
    4453                 : InterlockedAnd8Release (
    4454                 :     IN OUT CHAR volatile *Destination,
    4455                 :     IN CHAR Value
    4456                 :     );
    4457                 : 
    4458                 : SHORT
    4459                 : __cdecl
    4460                 : InterlockedAnd16(
    4461                 :     IN OUT SHORT volatile *Destination,
    4462                 :     IN SHORT Value
    4463                 :     );
    4464                 :     
    4465                 : SHORT
    4466                 : __cdecl
    4467                 : InterlockedAnd16Acquire (
    4468                 :     IN OUT SHORT volatile *Destination,
    4469                 :     IN SHORT Value
    4470                 :     );
    4471                 : 
    4472                 : SHORT
    4473                 : __cdecl
    4474                 : InterlockedAnd16Release (
    4475                 :     IN OUT SHORT volatile *Destination,
    4476                 :     IN SHORT Value
    4477                 :     );
    4478                 : 
    4479                 : LONGLONG
    4480                 : __cdecl
    4481                 : InterlockedAnd64 (
    4482                 :     IN OUT LONGLONG volatile *Destination,
    4483                 :     IN LONGLONG Value
    4484                 :     );
    4485                 : 
    4486                 : LONGLONG
    4487                 : __cdecl
    4488                 : InterlockedAnd64Acquire (
    4489                 :     IN OUT LONGLONG volatile *Destination,
    4490                 :     IN LONGLONG Value
    4491                 :     );
    4492                 :     
    4493                 : LONGLONG
    4494                 : __cdecl
    4495                 : InterlockedAnd64Release (
    4496                 :     IN OUT LONGLONG volatile *Destination,
    4497                 :     IN LONGLONG Value
    4498                 :     );
    4499                 : 
    4500                 : #pragma intrinsic(_InterlockedAdd)
    4501                 : #pragma intrinsic(_InterlockedIncrement)
    4502                 : #pragma intrinsic(_InterlockedIncrement_acq)
    4503                 : #pragma intrinsic(_InterlockedIncrement_rel)
    4504                 : #pragma intrinsic(_InterlockedDecrement)
    4505                 : #pragma intrinsic(_InterlockedDecrement_acq)
    4506                 : #pragma intrinsic(_InterlockedDecrement_rel)
    4507                 : #pragma intrinsic(_InterlockedExchange)
    4508                 : #pragma intrinsic(_InterlockedCompareExchange)
    4509                 : #pragma intrinsic(_InterlockedCompareExchange_acq)
    4510                 : #pragma intrinsic(_InterlockedCompareExchange_rel)
    4511                 : #pragma intrinsic(_InterlockedExchangeAdd)
    4512                 : #pragma intrinsic(_InterlockedAdd64)
    4513                 : #pragma intrinsic(_InterlockedIncrement64)
    4514                 : #pragma intrinsic(_InterlockedDecrement64)
    4515                 : #pragma intrinsic(_InterlockedExchange64)
    4516                 : #pragma intrinsic(_InterlockedExchange64_acq)
    4517                 : #pragma intrinsic(_InterlockedCompareExchange64)
    4518                 : #pragma intrinsic(_InterlockedCompareExchange64_acq)
    4519                 : #pragma intrinsic(_InterlockedCompareExchange64_rel)
    4520                 : #pragma intrinsic(_InterlockedCompare64Exchange128)
    4521                 : #pragma intrinsic(_InterlockedCompare64Exchange128_acq)
    4522                 : #pragma intrinsic(_InterlockedCompare64Exchange128_rel)
    4523                 : #pragma intrinsic(_InterlockedExchangeAdd64)
    4524                 : #pragma intrinsic(_InterlockedExchangePointer)
    4525                 : #pragma intrinsic(_InterlockedCompareExchangePointer)
    4526                 : #pragma intrinsic(_InterlockedCompareExchangePointer_acq)
    4527                 : #pragma intrinsic(_InterlockedCompareExchangePointer_rel)
    4528                 : #pragma intrinsic(_InterlockedAdd_acq)
    4529                 : #pragma intrinsic(_InterlockedAdd_rel)
    4530                 : #pragma intrinsic(_InterlockedExchange_acq)
    4531                 : #pragma intrinsic(_InterlockedExchangeAdd_acq)
    4532                 : #pragma intrinsic(_InterlockedExchangeAdd_rel)
    4533                 : #pragma intrinsic(_InterlockedAdd64_acq)
    4534                 : #pragma intrinsic(_InterlockedAdd64_rel)
    4535                 : #pragma intrinsic(_InterlockedIncrement64_acq)
    4536                 : #pragma intrinsic(_InterlockedIncrement64_rel)
    4537                 : #pragma intrinsic(_InterlockedDecrement64_acq)
    4538                 : #pragma intrinsic(_InterlockedDecrement64_rel)
    4539                 : #pragma intrinsic(_InterlockedExchangeAdd64_acq)
    4540                 : #pragma intrinsic(_InterlockedExchangeAdd64_rel)
    4541                 : #pragma intrinsic(_InterlockedExchangePointer_acq)
    4542                 : #pragma intrinsic (_InterlockedOr)
    4543                 : #pragma intrinsic (_InterlockedOr_acq)
    4544                 : #pragma intrinsic (_InterlockedOr_rel)
    4545                 : #pragma intrinsic (_InterlockedOr8)
    4546                 : #pragma intrinsic (_InterlockedOr8_acq)
    4547                 : #pragma intrinsic (_InterlockedOr8_rel)
    4548                 : #pragma intrinsic (_InterlockedOr16)
    4549                 : #pragma intrinsic (_InterlockedOr16_acq)
    4550                 : #pragma intrinsic (_InterlockedOr16_rel)
    4551                 : #pragma intrinsic (_InterlockedOr64)
    4552                 : #pragma intrinsic (_InterlockedOr64_acq)
    4553                 : #pragma intrinsic (_InterlockedOr64_rel)
    4554                 : #pragma intrinsic (_InterlockedXor)
    4555                 : #pragma intrinsic (_InterlockedXor_acq)
    4556                 : #pragma intrinsic (_InterlockedXor_rel)
    4557                 : #pragma intrinsic (_InterlockedXor8)
    4558                 : #pragma intrinsic (_InterlockedXor8_acq)
    4559                 : #pragma intrinsic (_InterlockedXor8_rel)
    4560                 : #pragma intrinsic (_InterlockedXor16)
    4561                 : #pragma intrinsic (_InterlockedXor16_acq)
    4562                 : #pragma intrinsic (_InterlockedXor16_rel)
    4563                 : #pragma intrinsic (_InterlockedXor64)
    4564                 : #pragma intrinsic (_InterlockedXor64_acq)
    4565                 : #pragma intrinsic (_InterlockedXor64_rel)
    4566                 : #pragma intrinsic (_InterlockedAnd)
    4567                 : #pragma intrinsic (_InterlockedAnd_acq)
    4568                 : #pragma intrinsic (_InterlockedAnd_rel)
    4569                 : #pragma intrinsic (_InterlockedAnd8)
    4570                 : #pragma intrinsic (_InterlockedAnd8_acq)
    4571                 : #pragma intrinsic (_InterlockedAnd8_rel)
    4572                 : #pragma intrinsic (_InterlockedAnd16)
    4573                 : #pragma intrinsic (_InterlockedAnd16_acq)
    4574                 : #pragma intrinsic (_InterlockedAnd16_rel)
    4575                 : #pragma intrinsic (_InterlockedAnd64)
    4576                 : #pragma intrinsic (_InterlockedAnd64_acq)
    4577                 : #pragma intrinsic (_InterlockedAnd64_rel)
    4578                 : 
    4579                 : #if !defined (InterlockedAnd64)
    4580                 : 
    4581                 : #define InterlockedAnd64 InterlockedAnd64_Inline
    4582                 : 
    4583                 : LONGLONG
    4584                 : FORCEINLINE
    4585                 : InterlockedAnd64_Inline (
    4586                 :     IN OUT LONGLONG volatile *Destination,
    4587                 :     IN LONGLONG Value
    4588                 :     )
    4589                 : {
    4590                 :     LONGLONG Old;
    4591                 : 
    4592                 :     do {
    4593                 :         Old = *Destination;
    4594                 :     } while (InterlockedCompareExchange64(Destination,
    4595                 :                                           Old & Value,
    4596                 :                                           Old) != Old);
    4597                 : 
    4598                 :     return Old;
    4599                 : }
    4600                 : 
    4601                 : #endif
    4602                 : 
    4603                 : #define InterlockedAndAffinity InterlockedAnd64
    4604                 : 
    4605                 : #if !defined (InterlockedOr64)
    4606                 : 
    4607                 : #define InterlockedOr64 InterlockedOr64_Inline
    4608                 : 
    4609                 : LONGLONG
    4610                 : FORCEINLINE
    4611                 : InterlockedOr64_Inline (
    4612                 :     IN OUT LONGLONG volatile *Destination,
    4613                 :     IN LONGLONG Value
    4614                 :     )
    4615                 : {
    4616                 :     LONGLONG Old;
    4617                 : 
    4618                 :     do {
    4619                 :         Old = *Destination;
    4620                 :     } while (InterlockedCompareExchange64(Destination,
    4621                 :                                           Old | Value,
    4622                 :                                           Old) != Old);
    4623                 : 
    4624                 :     return Old;
    4625                 : }
    4626                 : 
    4627                 : #endif
    4628                 : 
    4629                 : #define InterlockedOrAffinity InterlockedOr64
    4630                 : 
    4631                 : #if !defined (InterlockedXor64)
    4632                 : 
    4633                 : #define InterlockedXor64 InterlockedXor64_Inline
    4634                 : 
    4635                 : LONGLONG
    4636                 : FORCEINLINE
    4637                 : InterlockedXor64_Inline (
    4638                 :     IN OUT LONGLONG volatile *Destination,
    4639                 :     IN LONGLONG Value
    4640                 :     )
    4641                 : {
    4642                 :     LONGLONG Old;
    4643                 : 
    4644                 :     do {
    4645                 :         Old = *Destination;
    4646                 :     } while (InterlockedCompareExchange64(Destination,
    4647                 :                                           Old ^ Value,
    4648                 :                                           Old) != Old);
    4649                 : 
    4650                 :     return Old;
    4651                 : }
    4652                 : 
    4653                 : #endif
    4654                 : 
    4655                 : #if !defined (InterlockedBitTestAndSet)
    4656                 : 
    4657                 : #define InterlockedBitTestAndSet InterlockedBitTestAndSet_Inline
    4658                 : 
    4659                 : BOOLEAN
    4660                 : FORCEINLINE
    4661                 : InterlockedBitTestAndSet_Inline (
    4662                 :     IN LONG volatile *Base,
    4663                 :     IN LONG Bit
    4664                 :     )
    4665                 : {
    4666                 :     LONG tBit;
    4667                 : 
    4668                 :     tBit = 1<<(Bit & (sizeof (*Base)*8-1));
    4669                 :     return (BOOLEAN) ((InterlockedOr (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);
    4670                 : }
    4671                 : 
    4672                 : #endif
    4673                 : 
    4674                 : #if !defined (InterlockedBitTestAndReset)
    4675                 : 
    4676                 : #define InterlockedBitTestAndReset InterlockedBitTestAndReset_Inline
    4677                 : 
    4678                 : BOOLEAN
    4679                 : FORCEINLINE
    4680                 : InterlockedBitTestAndReset_Inline (
    4681                 :     IN LONG volatile *Base,
    4682                 :     IN LONG Bit
    4683                 :     )
    4684                 : {
    4685                 :     LONG tBit;
    4686                 : 
    4687                 :     tBit = 1<<(Bit & (sizeof (*Base)*8-1));
    4688                 :     return (BOOLEAN) ((InterlockedAnd (&Base[Bit/(sizeof (*Base)*8)], ~tBit)&tBit) != 0);
    4689                 : }
    4690                 : 
    4691                 : #endif
    4692                 : 
    4693                 : #if !defined (InterlockedBitTestAndSet64)
    4694                 : 
    4695                 : #define InterlockedBitTestAndSet64 InterlockedBitTestAndSet64_Inline
    4696                 : 
    4697                 : BOOLEAN
    4698                 : FORCEINLINE
    4699                 : InterlockedBitTestAndSet64_Inline (
    4700                 :     IN LONG64 volatile *Base,
    4701                 :     IN LONG64 Bit
    4702                 :     )
    4703                 : {
    4704                 :     LONG64 tBit;
    4705                 : 
    4706                 :     tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));
    4707                 :     return (BOOLEAN) ((InterlockedOr64 (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);
    4708                 : }
    4709                 : 
    4710                 : #endif
    4711                 : 
    4712                 : #if !defined (InterlockedBitTestAndReset64)
    4713                 : 
    4714                 : #define InterlockedBitTestAndReset64 InterlockedBitTestAndReset64_Inline
    4715                 : 
    4716                 : BOOLEAN
    4717                 : FORCEINLINE
    4718                 : InterlockedBitTestAndReset64_Inline (
    4719                 :     IN LONG64 volatile *Base,
    4720                 :     IN LONG64 Bit
    4721                 :     )
    4722                 : {
    4723                 :     LONG64 tBit;
    4724                 : 
    4725                 :     tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));
    4726                 :     return (BOOLEAN) ((InterlockedAnd64 (&Base[Bit/(sizeof (*Base)*8)], ~tBit)&tBit) != 0);
    4727                 : }
    4728                 : 
    4729                 : #endif
    4730                 : 
    4731                 : #if !defined (InterlockedBitTestAndComplement)
    4732                 : 
    4733                 : #define InterlockedBitTestAndComplement InterlockedBitTestAndComplement_Inline
    4734                 : 
    4735                 : BOOLEAN
    4736                 : FORCEINLINE
    4737                 : InterlockedBitTestAndComplement_Inline (
    4738                 :     IN LONG volatile *Base,
    4739                 :     IN LONG Bit
    4740                 :     )
    4741                 : {
    4742                 :     LONG tBit;
    4743                 : 
    4744                 :     tBit = 1<<(Bit & (sizeof (*Base)*8-1));
    4745                 :     return (BOOLEAN) ((InterlockedXor (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);
    4746                 : }
    4747                 : 
    4748                 : #endif
    4749                 : 
    4750                 : #if !defined (InterlockedBitTestAndComplement64)
    4751                 : 
    4752                 : #define InterlockedBitTestAndComplement64 InterlockedBitTestAndComplement64_Inline
    4753                 : 
    4754                 : BOOLEAN
    4755                 : FORCEINLINE
    4756                 : InterlockedBitTestAndComplement64_Inline (
    4757                 :     IN LONG64 volatile *Base,
    4758                 :     IN LONG64 Bit
    4759                 :     )
    4760                 : {
    4761                 :     LONG64 tBit;
    4762                 : 
    4763                 :     tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));
    4764                 :     return (BOOLEAN) ((InterlockedXor64 (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);
    4765                 : }
    4766                 : 
    4767                 : #endif
    4768                 : 
    4769                 : #ifdef __cplusplus
    4770                 : }
    4771                 : #endif
    4772                 : 
    4773                 : #endif /* defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS) */
    4774                 : 
    4775                 : 
    4776                 : #if !defined(__midl) && !defined(GENUTIL) && !defined(_GENIA64_) && defined(_IA64_)
    4777                 : 
    4778                 : void * _cdecl _rdteb(void);
    4779                 : void * _cdecl _rdtebex(void);
    4780                 : #ifdef _M_IA64
    4781                 : 
    4782                 : #pragma intrinsic(_rdteb)
    4783                 : // _rdtebex() is a kernel safe version of _rdteb()
    4784                 : #pragma intrinsic(_rdtebex)
    4785                 : #define NtCurrentTeb()      ((struct _TEB *)_rdtebex())
    4786                 : 
    4787                 : //
    4788                 : // Define functions to get the address of the current fiber and the
    4789                 : // current fiber data.
    4790                 : //
    4791                 : 
    4792                 : #define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)
    4793                 : #define GetFiberData() (*(PVOID *)(GetCurrentFiber()))
    4794                 : 
    4795                 : 
    4796                 : // begin_ntddk 
    4797                 : 
    4798                 : #ifdef __cplusplus
    4799                 : extern "C" {
    4800                 : #endif
    4801                 : 
    4802                 : // begin_wdm
    4803                 : 
    4804                 : #if defined(_IA64_) && defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
    4805                 : 
    4806                 : void 
    4807                 : __break( 
    4808                 :     int
    4809                 :     );
    4810                 : 
    4811                 : #pragma intrinsic (__break)
    4812                 : 
    4813                 : #define BREAK_DEBUG_BASE    0x080000
    4814                 : #define ASSERT_BREAKPOINT         (BREAK_DEBUG_BASE+3)  // Cause a STATUS_ASSERTION_FAILURE exception to be raised.
    4815                 : 
    4816                 : #define DbgRaiseAssertionFailure() __break(ASSERT_BREAKPOINT)
    4817                 : 
    4818                 : #endif
    4819                 : 
    4820                 : // end_wdm
    4821                 : 
    4822                 : void 
    4823                 : __yield(
    4824                 :    void
    4825                 :    );
    4826                 : 
    4827                 : void
    4828                 : __mf(
    4829                 :     void
    4830                 :     );
    4831                 : 
    4832                 : void 
    4833                 : __lfetch(
    4834                 :     int Level, 
    4835                 :     __in volatile VOID CONST *Address
    4836                 :     );
    4837                 : 
    4838                 : void 
    4839                 : __lfetchfault(
    4840                 :     __in int Level, 
    4841                 :     __in volatile VOID CONST *Address
    4842                 :     );
    4843                 : 
    4844                 : void 
    4845                 : __lfetch_excl(
    4846                 :     __in int Level, 
    4847                 :     __in volatile VOID CONST *Address
    4848                 :     );
    4849                 : 
    4850                 : void
    4851                 : __lfetchfault_excl(
    4852                 :     __in int Level, 
    4853                 :     __in volatile VOID CONST *Address
    4854                 :     );
    4855                 : 
    4856                 : //
    4857                 : // __lfetch control defines.
    4858                 : //
    4859                 : 
    4860                 : #define MD_LFHINT_NONE    0x00
    4861                 : #define MD_LFHINT_NT1     0x01
    4862                 : #define MD_LFHINT_NT2     0x02
    4863                 : #define MD_LFHINT_NTA     0x03
    4864                 : 
    4865                 : #pragma intrinsic (__yield)
    4866                 : #pragma intrinsic (__lfetch)
    4867                 : #pragma intrinsic (__lfetchfault)
    4868                 : #pragma intrinsic (__lfetchfault_excl)
    4869                 : #pragma intrinsic (__lfetch_excl)
    4870                 : #pragma intrinsic (__mf)
    4871                 : 
    4872                 : //
    4873                 : // Define function to read the value of the time stamp counter
    4874                 : //
    4875                 : // N.B. The register number for the time stamp counter is CV_IA64_ApITC which
    4876                 : //      is 3116.
    4877                 : //
    4878                 : 
    4879                 : #define ReadTimeStampCounter() __getReg(3116)
    4880                 : 
    4881                 : unsigned
    4882                 : __int64
    4883                 : __getReg (
    4884                 :     int Number
    4885                 :     );
    4886                 : 
    4887                 : #pragma intrinsic(__getReg)
    4888                 : 
    4889                 : #define YieldProcessor          __yield
    4890                 : #define MemoryBarrier           __mf
    4891                 : #define PreFetchCacheLine       __lfetch
    4892                 : #define ReadForWriteAccess(p)   (__lfetch_excl(MD_LFHINT_NONE, (p)), (*(p)))
    4893                 : 
    4894                 : 
    4895                 : //
    4896                 : // PreFetchCacheLine level defines.
    4897                 : //
    4898                 : 
    4899                 : #define PF_TEMPORAL_LEVEL_1         MD_LFHINT_NONE
    4900                 : #define PF_TEMPORAL_LEVEL_2         MD_LFHINT_NT1
    4901                 : #define PF_TEMPORAL_LEVEL_3         MD_LFHINT_NT2
    4902                 : #define PF_NON_TEMPORAL_LEVEL_ALL   MD_LFHINT_NTA
    4903                 : 
    4904                 : //
    4905                 : // Define functions to capture the high 64-bits of a 128-bit multiply.
    4906                 : //
    4907                 : 
    4908                 : #define UnsignedMultiplyHigh __UMULH
    4909                 : 
    4910                 : ULONGLONG
    4911                 : UnsignedMultiplyHigh (
    4912                 :     IN ULONGLONG Multiplier,
    4913                 :     IN ULONGLONG Multiplicand
    4914                 :     );
    4915                 : 
    4916                 : #pragma intrinsic(__UMULH)
    4917                 : 
    4918                 : #ifdef __cplusplus
    4919                 : }
    4920                 : #endif
    4921                 : 
    4922                 : // end_ntddk 
    4923                 : 
    4924                 : #else
    4925                 : struct _TEB *
    4926                 : NtCurrentTeb(void);
    4927                 : #endif
    4928                 : 
    4929                 : #endif  // !defined(__midl) && !defined(GENUTIL) && !defined(_GENIA64_) && defined(_M_IA64)
    4930                 : 
    4931                 : #ifdef _IA64_
    4932                 : 
    4933                 : // begin_ntddk 
    4934                 : 
    4935                 : //
    4936                 : // The following values specify the type of failing access when the status is 
    4937                 : // STATUS_ACCESS_VIOLATION and the first parameter in the exception record.
    4938                 : //
    4939                 : 
    4940                 : #define EXCEPTION_READ_FAULT          0 // Access violation was caused by a read
    4941                 : #define EXCEPTION_WRITE_FAULT         1 // Access violation was caused by a write
    4942                 : #define EXCEPTION_EXECUTE_FAULT       2 // Access violation was caused by an instruction fetch
    4943                 : 
    4944                 : //
    4945                 : // The following flags control the contents of the CONTEXT structure.
    4946                 : //
    4947                 : 
    4948                 : #if !defined(RC_INVOKED)
    4949                 : 
    4950                 : #define CONTEXT_IA64                    0x00080000
    4951                 : 
    4952                 : #define CONTEXT_CONTROL                 (CONTEXT_IA64 | 0x00000001L)
    4953                 : #define CONTEXT_LOWER_FLOATING_POINT    (CONTEXT_IA64 | 0x00000002L)
    4954                 : #define CONTEXT_HIGHER_FLOATING_POINT   (CONTEXT_IA64 | 0x00000004L)
    4955                 : #define CONTEXT_INTEGER                 (CONTEXT_IA64 | 0x00000008L)
    4956                 : #define CONTEXT_DEBUG                   (CONTEXT_IA64 | 0x00000010L)
    4957                 : #define CONTEXT_IA32_CONTROL            (CONTEXT_IA64 | 0x00000020L)  // Includes StIPSR
    4958                 : 
    4959                 : 
    4960                 : #define CONTEXT_FLOATING_POINT          (CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT)
    4961                 : #define CONTEXT_FULL                    (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_IA32_CONTROL)
    4962                 : #define CONTEXT_ALL                     (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_DEBUG | CONTEXT_IA32_CONTROL)
    4963                 : 
    4964                 : #define CONTEXT_EXCEPTION_ACTIVE        0x8000000
    4965                 : #define CONTEXT_SERVICE_ACTIVE          0x10000000
    4966                 : #define CONTEXT_EXCEPTION_REQUEST       0x40000000
    4967                 : #define CONTEXT_EXCEPTION_REPORTING     0x80000000
    4968                 : 
    4969                 : #endif // !defined(RC_INVOKED)
    4970                 : 
    4971                 : //
    4972                 : // Context Frame
    4973                 : //
    4974                 : //  This frame has a several purposes: 1) it is used as an argument to
    4975                 : //  NtContinue, 2) it is used to construct a call frame for APC delivery,
    4976                 : //  3) it is used to construct a call frame for exception dispatching
    4977                 : //  in user mode, 4) it is used in the user level thread creation
    4978                 : //  routines, and 5) it is used to to pass thread state to debuggers.
    4979                 : //
    4980                 : //  N.B. Because this record is used as a call frame, it must be EXACTLY
    4981                 : //  a multiple of 16 bytes in length and aligned on a 16-byte boundary.
    4982                 : //
    4983                 : 
    4984                 : typedef struct _CONTEXT {
    4985                 : 
    4986                 :     //
    4987                 :     // The flags values within this flag control the contents of
    4988                 :     // a CONTEXT record.
    4989                 :     //
    4990                 :     // If the context record is used as an input parameter, then
    4991                 :     // for each portion of the context record controlled by a flag
    4992                 :     // whose value is set, it is assumed that that portion of the
    4993                 :     // context record contains valid context. If the context record
    4994                 :     // is being used to modify a thread's context, then only that
    4995                 :     // portion of the threads context will be modified.
    4996                 :     //
    4997                 :     // If the context record is used as an IN OUT parameter to capture
    4998                 :     // the context of a thread, then only those portions of the thread's
    4999                 :     // context corresponding to set flags will be returned.
    5000                 :     //
    5001                 :     // The context record is never used as an OUT only parameter.
    5002                 :     //
    5003                 : 
    5004                 :     DWORD ContextFlags;
    5005                 :     DWORD Fill1[3];         // for alignment of following on 16-byte boundary
    5006                 : 
    5007                 :     //
    5008                 :     // This section is specified/returned if the ContextFlags word contains
    5009                 :     // the flag CONTEXT_DEBUG.
    5010                 :     //
    5011                 :     // N.B. CONTEXT_DEBUG is *not* part of CONTEXT_FULL.
    5012                 :     //
    5013                 : 
    5014                 :     ULONGLONG DbI0;
    5015                 :     ULONGLONG DbI1;
    5016                 :     ULONGLONG DbI2;
    5017                 :     ULONGLONG DbI3;
    5018                 :     ULONGLONG DbI4;
    5019                 :     ULONGLONG DbI5;
    5020                 :     ULONGLONG DbI6;
    5021                 :     ULONGLONG DbI7;
    5022                 : 
    5023                 :     ULONGLONG DbD0;
    5024                 :     ULONGLONG DbD1;
    5025                 :     ULONGLONG DbD2;
    5026                 :     ULONGLONG DbD3;
    5027                 :     ULONGLONG DbD4;
    5028                 :     ULONGLONG DbD5;
    5029                 :     ULONGLONG DbD6;
    5030                 :     ULONGLONG DbD7;
    5031                 : 
    5032                 :     //
    5033                 :     // This section is specified/returned if the ContextFlags word contains
    5034                 :     // the flag CONTEXT_LOWER_FLOATING_POINT.
    5035                 :     //
    5036                 : 
    5037                 :     FLOAT128 FltS0;
    5038                 :     FLOAT128 FltS1;
    5039                 :     FLOAT128 FltS2;
    5040                 :     FLOAT128 FltS3;
    5041                 :     FLOAT128 FltT0;
    5042                 :     FLOAT128 FltT1;
    5043                 :     FLOAT128 FltT2;
    5044                 :     FLOAT128 FltT3;
    5045                 :     FLOAT128 FltT4;
    5046                 :     FLOAT128 FltT5;
    5047                 :     FLOAT128 FltT6;
    5048                 :     FLOAT128 FltT7;
    5049                 :     FLOAT128 FltT8;
    5050                 :     FLOAT128 FltT9;
    5051                 : 
    5052                 :     //
    5053                 :     // This section is specified/returned if the ContextFlags word contains
    5054                 :     // the flag CONTEXT_HIGHER_FLOATING_POINT.
    5055                 :     //
    5056                 : 
    5057                 :     FLOAT128 FltS4;
    5058                 :     FLOAT128 FltS5;
    5059                 :     FLOAT128 FltS6;
    5060                 :     FLOAT128 FltS7;
    5061                 :     FLOAT128 FltS8;
    5062                 :     FLOAT128 FltS9;
    5063                 :     FLOAT128 FltS10;
    5064                 :     FLOAT128 FltS11;
    5065                 :     FLOAT128 FltS12;
    5066                 :     FLOAT128 FltS13;
    5067                 :     FLOAT128 FltS14;
    5068                 :     FLOAT128 FltS15;
    5069                 :     FLOAT128 FltS16;
    5070                 :     FLOAT128 FltS17;
    5071                 :     FLOAT128 FltS18;
    5072                 :     FLOAT128 FltS19;
    5073                 : 
    5074                 :     FLOAT128 FltF32;
    5075                 :     FLOAT128 FltF33;
    5076                 :     FLOAT128 FltF34;
    5077                 :     FLOAT128 FltF35;
    5078                 :     FLOAT128 FltF36;
    5079                 :     FLOAT128 FltF37;
    5080                 :     FLOAT128 FltF38;
    5081                 :     FLOAT128 FltF39;
    5082                 : 
    5083                 :     FLOAT128 FltF40;
    5084                 :     FLOAT128 FltF41;
    5085                 :     FLOAT128 FltF42;
    5086                 :     FLOAT128 FltF43;
    5087                 :     FLOAT128 FltF44;
    5088                 :     FLOAT128 FltF45;
    5089                 :     FLOAT128 FltF46;
    5090                 :     FLOAT128 FltF47;
    5091                 :     FLOAT128 FltF48;
    5092                 :     FLOAT128 FltF49;
    5093                 : 
    5094                 :     FLOAT128 FltF50;
    5095                 :     FLOAT128 FltF51;
    5096                 :     FLOAT128 FltF52;
    5097                 :     FLOAT128 FltF53;
    5098                 :     FLOAT128 FltF54;
    5099                 :     FLOAT128 FltF55;
    5100                 :     FLOAT128 FltF56;
    5101                 :     FLOAT128 FltF57;
    5102                 :     FLOAT128 FltF58;
    5103                 :     FLOAT128 FltF59;
    5104                 : 
    5105                 :     FLOAT128 FltF60;
    5106                 :     FLOAT128 FltF61;
    5107                 :     FLOAT128 FltF62;
    5108                 :     FLOAT128 FltF63;
    5109                 :     FLOAT128 FltF64;
    5110                 :     FLOAT128 FltF65;
    5111                 :     FLOAT128 FltF66;
    5112                 :     FLOAT128 FltF67;
    5113                 :     FLOAT128 FltF68;
    5114                 :     FLOAT128 FltF69;
    5115                 : 
    5116                 :     FLOAT128 FltF70;
    5117                 :     FLOAT128 FltF71;
    5118                 :     FLOAT128 FltF72;
    5119                 :     FLOAT128 FltF73;
    5120                 :     FLOAT128 FltF74;
    5121                 :     FLOAT128 FltF75;
    5122                 :     FLOAT128 FltF76;
    5123                 :     FLOAT128 FltF77;
    5124                 :     FLOAT128 FltF78;
    5125                 :     FLOAT128 FltF79;
    5126                 : 
    5127                 :     FLOAT128 FltF80;
    5128                 :     FLOAT128 FltF81;
    5129                 :     FLOAT128 FltF82;
    5130                 :     FLOAT128 FltF83;
    5131                 :     FLOAT128 FltF84;
    5132                 :     FLOAT128 FltF85;
    5133                 :     FLOAT128 FltF86;
    5134                 :     FLOAT128 FltF87;
    5135                 :     FLOAT128 FltF88;
    5136                 :     FLOAT128 FltF89;
    5137                 : 
    5138                 :     FLOAT128 FltF90;
    5139                 :     FLOAT128 FltF91;
    5140                 :     FLOAT128 FltF92;
    5141                 :     FLOAT128 FltF93;
    5142                 :     FLOAT128 FltF94;
    5143                 :     FLOAT128 FltF95;
    5144                 :     FLOAT128 FltF96;
    5145                 :     FLOAT128 FltF97;
    5146                 :     FLOAT128 FltF98;
    5147                 :     FLOAT128 FltF99;
    5148                 : 
    5149                 :     FLOAT128 FltF100;
    5150                 :     FLOAT128 FltF101;
    5151                 :     FLOAT128 FltF102;
    5152                 :     FLOAT128 FltF103;
    5153                 :     FLOAT128 FltF104;
    5154                 :     FLOAT128 FltF105;
    5155                 :     FLOAT128 FltF106;
    5156                 :     FLOAT128 FltF107;
    5157                 :     FLOAT128 FltF108;
    5158                 :     FLOAT128 FltF109;
    5159                 : 
    5160                 :     FLOAT128 FltF110;
    5161                 :     FLOAT128 FltF111;
    5162                 :     FLOAT128 FltF112;
    5163                 :     FLOAT128 FltF113;
    5164                 :     FLOAT128 FltF114;
    5165                 :     FLOAT128 FltF115;
    5166                 :     FLOAT128 FltF116;
    5167                 :     FLOAT128 FltF117;
    5168                 :     FLOAT128 FltF118;
    5169                 :     FLOAT128 FltF119;
    5170                 : 
    5171                 :     FLOAT128 FltF120;
    5172                 :     FLOAT128 FltF121;
    5173                 :     FLOAT128 FltF122;
    5174                 :     FLOAT128 FltF123;
    5175                 :     FLOAT128 FltF124;
    5176                 :     FLOAT128 FltF125;
    5177                 :     FLOAT128 FltF126;
    5178                 :     FLOAT128 FltF127;
    5179                 : 
    5180                 :     //
    5181                 :     // This section is specified/returned if the ContextFlags word contains
    5182                 :     // the flag CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT | CONTEXT_CONTROL.
    5183                 :     //
    5184                 : 
    5185                 :     ULONGLONG StFPSR;       //  FP status
    5186                 : 
    5187                 :     //
    5188                 :     // This section is specified/returned if the ContextFlags word contains
    5189                 :     // the flag CONTEXT_INTEGER.
    5190                 :     //
    5191                 :     // N.B. The registers gp, sp, rp are part of the control context
    5192                 :     //
    5193                 : 
    5194                 :     ULONGLONG IntGp;        //  r1, volatile
    5195                 :     ULONGLONG IntT0;        //  r2-r3, volatile
    5196                 :     ULONGLONG IntT1;        //
    5197                 :     ULONGLONG IntS0;        //  r4-r7, preserved
    5198                 :     ULONGLONG IntS1;
    5199                 :     ULONGLONG IntS2;
    5200                 :     ULONGLONG IntS3;
    5201                 :     ULONGLONG IntV0;        //  r8, volatile
    5202                 :     ULONGLONG IntT2;        //  r9-r11, volatile
    5203                 :     ULONGLONG IntT3;
    5204                 :     ULONGLONG IntT4;
    5205                 :     ULONGLONG IntSp;        //  stack pointer (r12), special
    5206                 :     ULONGLONG IntTeb;       //  teb (r13), special
    5207                 :     ULONGLONG IntT5;        //  r14-r31, volatile
    5208                 :     ULONGLONG IntT6;
    5209                 :     ULONGLONG IntT7;
    5210                 :     ULONGLONG IntT8;
    5211                 :     ULONGLONG IntT9;
    5212                 :     ULONGLONG IntT10;
    5213                 :     ULONGLONG IntT11;
    5214                 :     ULONGLONG IntT12;
    5215                 :     ULONGLONG IntT13;
    5216                 :     ULONGLONG IntT14;
    5217                 :     ULONGLONG IntT15;
    5218                 :     ULONGLONG IntT16;
    5219                 :     ULONGLONG IntT17;
    5220                 :     ULONGLONG IntT18;
    5221                 :     ULONGLONG IntT19;
    5222                 :     ULONGLONG IntT20;
    5223                 :     ULONGLONG IntT21;
    5224                 :     ULONGLONG IntT22;
    5225                 : 
    5226                 :     ULONGLONG IntNats;      //  Nat bits for r1-r31
    5227                 :                             //  r1-r31 in bits 1 thru 31.
    5228                 :     ULONGLONG Preds;        //  predicates, preserved
    5229                 : 
    5230                 :     ULONGLONG BrRp;         //  return pointer, b0, preserved
    5231                 :     ULONGLONG BrS0;         //  b1-b5, preserved
    5232                 :     ULONGLONG BrS1;
    5233                 :     ULONGLONG BrS2;
    5234                 :     ULONGLONG BrS3;
    5235                 :     ULONGLONG BrS4;
    5236                 :     ULONGLONG BrT0;         //  b6-b7, volatile
    5237                 :     ULONGLONG BrT1;
    5238                 : 
    5239                 :     //
    5240                 :     // This section is specified/returned if the ContextFlags word contains
    5241                 :     // the flag CONTEXT_CONTROL.
    5242                 :     //
    5243                 : 
    5244                 :     // Other application registers
    5245                 :     ULONGLONG ApUNAT;       //  User Nat collection register, preserved
    5246                 :     ULONGLONG ApLC;         //  Loop counter register, preserved
    5247                 :     ULONGLONG ApEC;         //  Epilog counter register, preserved
    5248                 :     ULONGLONG ApCCV;        //  CMPXCHG value register, volatile
    5249                 :     ULONGLONG ApDCR;        //  Default control register (TBD)
    5250                 : 
    5251                 :     // Register stack info
    5252                 :     ULONGLONG RsPFS;        //  Previous function state, preserved
    5253                 :     ULONGLONG RsBSP;        //  Backing store pointer, preserved
    5254                 :     ULONGLONG RsBSPSTORE;
    5255                 :     ULONGLONG RsRSC;        //  RSE configuration, volatile
    5256                 :     ULONGLONG RsRNAT;       //  RSE Nat collection register, preserved
    5257                 : 
    5258                 :     // Trap Status Information
    5259                 :     ULONGLONG StIPSR;       //  Interruption Processor Status
    5260                 :     ULONGLONG StIIP;        //  Interruption IP
    5261                 :     ULONGLONG StIFS;        //  Interruption Function State
    5262                 : 
    5263                 :     // iA32 related control registers
    5264                 :     ULONGLONG StFCR;        //  copy of Ar21
    5265                 :     ULONGLONG Eflag;        //  Eflag copy of Ar24
    5266                 :     ULONGLONG SegCSD;       //  iA32 CSDescriptor (Ar25)
    5267                 :     ULONGLONG SegSSD;       //  iA32 SSDescriptor (Ar26)
    5268                 :     ULONGLONG Cflag;        //  Cr0+Cr4 copy of Ar27
    5269                 :     ULONGLONG StFSR;        //  x86 FP status (copy of AR28)
    5270                 :     ULONGLONG StFIR;        //  x86 FP status (copy of AR29)
    5271                 :     ULONGLONG StFDR;        //  x86 FP status (copy of AR30)
    5272                 : 
    5273                 :       ULONGLONG UNUSEDPACK;   //  added to pack StFDR to 16-bytes
    5274                 : 
    5275                 : } CONTEXT, *PCONTEXT;
    5276                 : 
    5277                 : //
    5278                 : // Plabel descriptor structure definition
    5279                 : //
    5280                 : 
    5281                 : typedef struct _PLABEL_DESCRIPTOR {
    5282                 :    ULONGLONG EntryPoint;
    5283                 :    ULONGLONG GlobalPointer;
    5284                 : } PLABEL_DESCRIPTOR, *PPLABEL_DESCRIPTOR;
    5285                 : 
    5286                 : //
    5287                 : // Function table entry structure definition.
    5288                 : //
    5289                 : 
    5290                 : typedef struct _RUNTIME_FUNCTION {
    5291                 :     DWORD BeginAddress;
    5292                 :     DWORD EndAddress;
    5293                 :     DWORD UnwindInfoAddress;
    5294                 : } RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
    5295                 : 
    5296                 : //
    5297                 : // Define dynamic function table entry.
    5298                 : //
    5299                 : 
    5300                 : typedef
    5301                 : PRUNTIME_FUNCTION
    5302                 : (*PGET_RUNTIME_FUNCTION_CALLBACK) (
    5303                 :     IN DWORD64 ControlPc,
    5304                 :     IN PVOID Context
    5305                 :     );
    5306                 : 
    5307                 : typedef
    5308                 : DWORD   
    5309                 : (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK) (
    5310                 :     IN HANDLE Process,
    5311                 :     IN PVOID TableAddress,
    5312                 :     OUT PDWORD Entries,
    5313                 :     OUT PRUNTIME_FUNCTION* Functions
    5314                 :     );
    5315                 : 
    5316                 : #define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \
    5317                 :     "OutOfProcessFunctionTableCallback"
    5318                 : 
    5319                 : 
    5320                 : BOOLEAN
    5321                 : RtlAddFunctionTable(
    5322                 :     IN PRUNTIME_FUNCTION FunctionTable,
    5323                 :     IN DWORD             EntryCount,
    5324                 :     IN ULONGLONG         BaseAddress,
    5325                 :     IN ULONGLONG         TargetGp
    5326                 :     );
    5327                 : 
    5328                 : BOOLEAN
    5329                 : RtlInstallFunctionTableCallback (
    5330                 :     IN DWORD64 TableIdentifier,
    5331                 :     IN DWORD64 BaseAddress,
    5332                 :     IN DWORD Length,
    5333                 :     IN DWORD64 TargetGp,
    5334                 :     IN PGET_RUNTIME_FUNCTION_CALLBACK Callback,
    5335                 :     IN PVOID Context,
    5336                 :     IN PCWSTR OutOfProcessCallbackDll OPTIONAL
    5337                 :     );
    5338                 : 
    5339                 : BOOLEAN
    5340                 : RtlDeleteFunctionTable (
    5341                 :     IN PRUNTIME_FUNCTION FunctionTable
    5342                 :     );
    5343                 : 
    5344                 : 
    5345                 : VOID
    5346                 : RtlRestoreContext (
    5347                 :     IN PCONTEXT ContextRecord,
    5348                 :     IN struct _EXCEPTION_RECORD *ExceptionRecord OPTIONAL
    5349                 :     );
    5350                 : 
    5351                 : 
    5352                 : VOID
    5353                 : __jump_unwind (
    5354                 :     ULONGLONG TargetMsFrame,
    5355                 :     ULONGLONG TargetBsFrame,
    5356                 :     ULONGLONG TargetPc
    5357                 :     );
    5358                 : 
    5359                 : #endif // _IA64_
    5360                 : 
    5361                 : 
    5362                 : #if !defined(RC_INVOKED)
    5363                 : 
    5364                 : #define WOW64_CONTEXT_i386      0x00010000    // this assumes that i386 and
    5365                 : #define WOW64_CONTEXT_i486      0x00010000    // i486 have identical context records
    5366                 : 
    5367                 : #define WOW64_CONTEXT_CONTROL               (WOW64_CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
    5368                 : #define WOW64_CONTEXT_INTEGER               (WOW64_CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
    5369                 : #define WOW64_CONTEXT_SEGMENTS              (WOW64_CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
    5370                 : #define WOW64_CONTEXT_FLOATING_POINT        (WOW64_CONTEXT_i386 | 0x00000008L) // 387 state
    5371                 : #define WOW64_CONTEXT_DEBUG_REGISTERS       (WOW64_CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
    5372                 : #define WOW64_CONTEXT_EXTENDED_REGISTERS    (WOW64_CONTEXT_i386 | 0x00000020L) // cpu specific extensions
    5373                 : 
    5374                 : #define WOW64_CONTEXT_FULL      (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS)
    5375                 : 
    5376                 : #define WOW64_CONTEXT_ALL       (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS | \
    5377                 :                                  WOW64_CONTEXT_FLOATING_POINT | WOW64_CONTEXT_DEBUG_REGISTERS | \
    5378                 :                                  WOW64_CONTEXT_EXTENDED_REGISTERS)
    5379                 : 
    5380                 : #endif // !defined(RC_INVOKED)
    5381                 : 
    5382                 : //
    5383                 : //  Define the size of the 80387 save area, which is in the context frame.
    5384                 : //
    5385                 : 
    5386                 : #define WOW64_SIZE_OF_80387_REGISTERS      80
    5387                 : 
    5388                 : #define WOW64_MAXIMUM_SUPPORTED_EXTENSION     512
    5389                 : 
    5390                 : typedef struct _WOW64_FLOATING_SAVE_AREA {
    5391                 :     DWORD   ControlWord;
    5392                 :     DWORD   StatusWord;
    5393                 :     DWORD   TagWord;
    5394                 :     DWORD   ErrorOffset;
    5395                 :     DWORD   ErrorSelector;
    5396                 :     DWORD   DataOffset;
    5397                 :     DWORD   DataSelector;
    5398                 :     BYTE    RegisterArea[WOW64_SIZE_OF_80387_REGISTERS];
    5399                 :     DWORD   Cr0NpxState;
    5400                 : } WOW64_FLOATING_SAVE_AREA;
    5401                 : 
    5402                 : typedef WOW64_FLOATING_SAVE_AREA *PWOW64_FLOATING_SAVE_AREA;
    5403                 : 
    5404                 : //
    5405                 : // Context Frame
    5406                 : //
    5407                 : //  This frame has a several purposes: 1) it is used as an argument to
    5408                 : //  NtContinue, 2) is is used to constuct a call frame for APC delivery,
    5409                 : //  and 3) it is used in the user level thread creation routines.
    5410                 : //
    5411                 : //  The layout of the record conforms to a standard call frame.
    5412                 : //
    5413                 : 
    5414                 : typedef struct _WOW64_CONTEXT {
    5415                 : 
    5416                 :     //
    5417                 :     // The flags values within this flag control the contents of
    5418                 :     // a CONTEXT record.
    5419                 :     //
    5420                 :     // If the context record is used as an input parameter, then
    5421                 :     // for each portion of the context record controlled by a flag
    5422                 :     // whose value is set, it is assumed that that portion of the
    5423                 :     // context record contains valid context. If the context record
    5424                 :     // is being used to modify a threads context, then only that
    5425                 :     // portion of the threads context will be modified.
    5426                 :     //
    5427                 :     // If the context record is used as an IN OUT parameter to capture
    5428                 :     // the context of a thread, then only those portions of the thread's
    5429                 :     // context corresponding to set flags will be returned.
    5430                 :     //
    5431                 :     // The context record is never used as an OUT only parameter.
    5432                 :     //
    5433                 : 
    5434                 :     DWORD ContextFlags;
    5435                 : 
    5436                 :     //
    5437                 :     // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
    5438                 :     // set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT
    5439                 :     // included in CONTEXT_FULL.
    5440                 :     //
    5441                 : 
    5442                 :     DWORD   Dr0;
    5443                 :     DWORD   Dr1;
    5444                 :     DWORD   Dr2;
    5445                 :     DWORD   Dr3;
    5446                 :     DWORD   Dr6;
    5447                 :     DWORD   Dr7;
    5448                 : 
    5449                 :     //
    5450                 :     // This section is specified/returned if the
    5451                 :     // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
    5452                 :     //
    5453                 : 
    5454                 :     WOW64_FLOATING_SAVE_AREA FloatSave;
    5455                 : 
    5456                 :     //
    5457                 :     // This section is specified/returned if the
    5458                 :     // ContextFlags word contians the flag CONTEXT_SEGMENTS.
    5459                 :     //
    5460                 : 
    5461                 :     DWORD   SegGs;
    5462                 :     DWORD   SegFs;
    5463                 :     DWORD   SegEs;
    5464                 :     DWORD   SegDs;
    5465                 : 
    5466                 :     //
    5467                 :     // This section is specified/returned if the
    5468                 :     // ContextFlags word contians the flag CONTEXT_INTEGER.
    5469                 :     //
    5470                 : 
    5471                 :     DWORD   Edi;
    5472                 :     DWORD   Esi;
    5473                 :     DWORD   Ebx;
    5474                 :     DWORD   Edx;
    5475                 :     DWORD   Ecx;
    5476                 :     DWORD   Eax;
    5477                 : 
    5478                 :     //
    5479                 :     // This section is specified/returned if the
    5480                 :     // ContextFlags word contians the flag CONTEXT_CONTROL.
    5481                 :     //
    5482                 : 
    5483                 :     DWORD   Ebp;
    5484                 :     DWORD   Eip;
    5485                 :     DWORD   SegCs;              // MUST BE SANITIZED
    5486                 :     DWORD   EFlags;             // MUST BE SANITIZED
    5487                 :     DWORD   Esp;
    5488                 :     DWORD   SegSs;
    5489                 : 
    5490                 :     //
    5491                 :     // This section is specified/returned if the ContextFlags word
    5492                 :     // contains the flag CONTEXT_EXTENDED_REGISTERS.
    5493                 :     // The format and contexts are processor specific
    5494                 :     //
    5495                 : 
    5496                 :     BYTE    ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
    5497                 : 
    5498                 : } WOW64_CONTEXT;
    5499                 : 
    5500                 : typedef WOW64_CONTEXT *PWOW64_CONTEXT;
    5501                 : 
    5502                 : #define EXCEPTION_NONCONTINUABLE 0x1    // Noncontinuable exception
    5503                 : #define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters
    5504                 : 
    5505                 : //
    5506                 : // Exception record definition.
    5507                 : //
    5508                 : 
    5509                 : typedef struct _EXCEPTION_RECORD {
    5510                 :     DWORD    ExceptionCode;
    5511                 :     DWORD ExceptionFlags;
    5512                 :     struct _EXCEPTION_RECORD *ExceptionRecord;
    5513                 :     PVOID ExceptionAddress;
    5514                 :     DWORD NumberParameters;
    5515                 :     ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
    5516                 :     } EXCEPTION_RECORD;
    5517                 : 
    5518                 : typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
    5519                 : 
    5520                 : typedef struct _EXCEPTION_RECORD32 {
    5521                 :     DWORD    ExceptionCode;
    5522                 :     DWORD ExceptionFlags;
    5523                 :     DWORD ExceptionRecord;
    5524                 :     DWORD ExceptionAddress;
    5525                 :     DWORD NumberParameters;
    5526                 :     DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
    5527                 : } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
    5528                 : 
    5529                 : typedef struct _EXCEPTION_RECORD64 {
    5530                 :     DWORD    ExceptionCode;
    5531                 :     DWORD ExceptionFlags;
    5532                 :     DWORD64 ExceptionRecord;
    5533                 :     DWORD64 ExceptionAddress;
    5534                 :     DWORD NumberParameters;
    5535                 :     DWORD __unusedAlignment;
    5536                 :     DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
    5537                 : } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
    5538                 : 
    5539                 : //
    5540                 : // Typedef for pointer returned by exception_info()
    5541                 : //
    5542                 : 
    5543                 : typedef struct _EXCEPTION_POINTERS {
    5544                 :     PEXCEPTION_RECORD ExceptionRecord;
    5545                 :     PCONTEXT ContextRecord;
    5546                 : } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
    5547                 : typedef PVOID PACCESS_TOKEN;            
    5548                 : typedef PVOID PSECURITY_DESCRIPTOR;     
    5549                 : typedef PVOID PSID;     
    5550                 : ////////////////////////////////////////////////////////////////////////
    5551                 : //                                                                    //
    5552                 : //                             ACCESS MASK                            //
    5553                 : //                                                                    //
    5554                 : ////////////////////////////////////////////////////////////////////////
    5555                 : 
    5556                 : //
    5557                 : //  Define the access mask as a longword sized structure divided up as
    5558                 : //  follows:
    5559                 : //
    5560                 : //       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    5561                 : //       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
    5562                 : //      +---------------+---------------+-------------------------------+
    5563                 : //      |G|G|G|G|Res'd|A| StandardRights|         SpecificRights        |
    5564                 : //      |R|W|E|A|     |S|               |                               |
    5565                 : //      +-+-------------+---------------+-------------------------------+
    5566                 : //
    5567                 : //      typedef struct _ACCESS_MASK {
    5568                 : //          WORD   SpecificRights;
    5569                 : //          BYTE  StandardRights;
    5570                 : //          BYTE  AccessSystemAcl : 1;
    5571                 : //          BYTE  Reserved : 3;
    5572                 : //          BYTE  GenericAll : 1;
    5573                 : //          BYTE  GenericExecute : 1;
    5574                 : //          BYTE  GenericWrite : 1;
    5575                 : //          BYTE  GenericRead : 1;
    5576                 : //      } ACCESS_MASK;
    5577                 : //      typedef ACCESS_MASK *PACCESS_MASK;
    5578                 : //
    5579                 : //  but to make life simple for programmer's we'll allow them to specify
    5580                 : //  a desired access mask by simply OR'ing together mulitple single rights
    5581                 : //  and treat an access mask as a DWORD.  For example
    5582                 : //
    5583                 : //      DesiredAccess = DELETE | READ_CONTROL
    5584                 : //
    5585                 : //  So we'll declare ACCESS_MASK as DWORD
    5586                 : //
    5587                 : 
    5588                 : // begin_wdm
    5589                 : typedef DWORD ACCESS_MASK;
    5590                 : typedef ACCESS_MASK *PACCESS_MASK;
    5591                 : 
    5592                 : ////////////////////////////////////////////////////////////////////////
    5593                 : //                                                                    //
    5594                 : //                             ACCESS TYPES                           //
    5595                 : //                                                                    //
    5596                 : ////////////////////////////////////////////////////////////////////////
    5597                 : 
    5598                 : 
    5599                 : // begin_wdm
    5600                 : //
    5601                 : //  The following are masks for the predefined standard access types
    5602                 : //
    5603                 : 
    5604                 : #define DELETE                           (0x00010000L)
    5605                 : #define READ_CONTROL                     (0x00020000L)
    5606                 : #define WRITE_DAC                        (0x00040000L)
    5607                 : #define WRITE_OWNER                      (0x00080000L)
    5608                 : #define SYNCHRONIZE                      (0x00100000L)
    5609                 : 
    5610                 : #define STANDARD_RIGHTS_REQUIRED         (0x000F0000L)
    5611                 : 
    5612                 : #define STANDARD_RIGHTS_READ             (READ_CONTROL)
    5613                 : #define STANDARD_RIGHTS_WRITE            (READ_CONTROL)
    5614                 : #define STANDARD_RIGHTS_EXECUTE          (READ_CONTROL)
    5615                 : 
    5616                 : #define STANDARD_RIGHTS_ALL              (0x001F0000L)
    5617                 : 
    5618                 : #define SPECIFIC_RIGHTS_ALL              (0x0000FFFFL)
    5619                 : 
    5620                 : //
    5621                 : // AccessSystemAcl access type
    5622                 : //
    5623                 : 
    5624                 : #define ACCESS_SYSTEM_SECURITY           (0x01000000L)
    5625                 : 
    5626                 : //
    5627                 : // MaximumAllowed access type
    5628                 : //
    5629                 : 
    5630                 : #define MAXIMUM_ALLOWED                  (0x02000000L)
    5631                 : 
    5632                 : //
    5633                 : //  These are the generic rights.
    5634                 : //
    5635                 : 
    5636                 : #define GENERIC_READ                     (0x80000000L)
    5637                 : #define GENERIC_WRITE                    (0x40000000L)
    5638                 : #define GENERIC_EXECUTE                  (0x20000000L)
    5639                 : #define GENERIC_ALL                      (0x10000000L)
    5640                 : 
    5641                 : 
    5642                 : //
    5643                 : //  Define the generic mapping array.  This is used to denote the
    5644                 : //  mapping of each generic access right to a specific access mask.
    5645                 : //
    5646                 : 
    5647                 : typedef struct _GENERIC_MAPPING {
    5648                 :     ACCESS_MASK GenericRead;
    5649                 :     ACCESS_MASK GenericWrite;
    5650                 :     ACCESS_MASK GenericExecute;
    5651                 :     ACCESS_MASK GenericAll;
    5652                 : } GENERIC_MAPPING;
    5653                 : typedef GENERIC_MAPPING *PGENERIC_MAPPING;
    5654                 : 
    5655                 : 
    5656                 : 
    5657                 : ////////////////////////////////////////////////////////////////////////
    5658                 : //                                                                    //
    5659                 : //                        LUID_AND_ATTRIBUTES                         //
    5660                 : //                                                                    //
    5661                 : ////////////////////////////////////////////////////////////////////////
    5662                 : //
    5663                 : //
    5664                 : 
    5665                 : 
    5666                 : #include <pshpack4.h>
    5667                 : 
    5668                 : typedef struct _LUID_AND_ATTRIBUTES {
    5669                 :     LUID Luid;
    5670                 :     DWORD Attributes;
    5671                 :     } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
    5672                 : typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
    5673                 : typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
    5674                 : 
    5675                 : #include <poppack.h>
    5676                 : 
    5677                 : 
    5678                 : ////////////////////////////////////////////////////////////////////////
    5679                 : //                                                                    //
    5680                 : //              Security Id     (SID)                                 //
    5681                 : //                                                                    //
    5682                 : ////////////////////////////////////////////////////////////////////////
    5683                 : //
    5684                 : //
    5685                 : // Pictorially the structure of an SID is as follows:
    5686                 : //
    5687                 : //         1   1   1   1   1   1
    5688                 : //         5   4   3   2   1   0   9   8   7   6   5   4   3   2   1   0
    5689                 : //      +---------------------------------------------------------------+
    5690                 : //      |      SubAuthorityCount        |Reserved1 (SBZ)|   Revision    |
    5691                 : //      +---------------------------------------------------------------+
    5692                 : //      |                   IdentifierAuthority[0]                      |
    5693                 : //      +---------------------------------------------------------------+
    5694                 : //      |                   IdentifierAuthority[1]                      |
    5695                 : //      +---------------------------------------------------------------+
    5696                 : //      |                   IdentifierAuthority[2]                      |
    5697                 : //      +---------------------------------------------------------------+
    5698                 : //      |                                                               |
    5699                 : //      +- -  -  -  -  -  -  -  SubAuthority[]  -  -  -  -  -  -  -  - -+
    5700                 : //      |                                                               |
    5701                 : //      +---------------------------------------------------------------+
    5702                 : //
    5703                 : //
    5704                 : 
    5705                 : 
    5706                 : // begin_ntifs
    5707                 : 
    5708                 : #ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
    5709                 : #define SID_IDENTIFIER_AUTHORITY_DEFINED
    5710                 : typedef struct _SID_IDENTIFIER_AUTHORITY {
    5711                 :     BYTE  Value[6];
    5712                 : } SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
    5713                 : #endif
    5714                 : 
    5715                 : 
    5716                 : #ifndef SID_DEFINED
    5717                 : #define SID_DEFINED
    5718                 : typedef struct _SID {
    5719                 :    BYTE  Revision;
    5720                 :    BYTE  SubAuthorityCount;
    5721                 :    SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
    5722                 : #ifdef MIDL_PASS
    5723                 :    [size_is(SubAuthorityCount)] DWORD SubAuthority[*];
    5724                 : #else // MIDL_PASS
    5725                 :    DWORD SubAuthority[ANYSIZE_ARRAY];
    5726                 : #endif // MIDL_PASS
    5727                 : } SID, *PISID;
    5728                 : #endif
    5729                 : 
    5730                 : #define SID_REVISION                     (1)    // Current revision level
    5731                 : #define SID_MAX_SUB_AUTHORITIES          (15)
    5732                 : #define SID_RECOMMENDED_SUB_AUTHORITIES  (1)    // Will change to around 6
    5733                 : 
    5734                 :                                                 // in a future release.
    5735                 : #ifndef MIDL_PASS
    5736                 : #define SECURITY_MAX_SID_SIZE  \
    5737                 :       (sizeof(SID) - sizeof(DWORD) + (SID_MAX_SUB_AUTHORITIES * sizeof(DWORD)))
    5738                 : #endif // MIDL_PASS
    5739                 : 
    5740                 : 
    5741                 : typedef enum _SID_NAME_USE {
    5742                 :     SidTypeUser = 1,
    5743                 :     SidTypeGroup,
    5744                 :     SidTypeDomain,
    5745                 :     SidTypeAlias,
    5746                 :     SidTypeWellKnownGroup,
    5747                 :     SidTypeDeletedAccount,
    5748                 :     SidTypeInvalid,
    5749                 :     SidTypeUnknown,
    5750                 :     SidTypeComputer,
    5751                 :     SidTypeLabel
    5752                 : } SID_NAME_USE, *PSID_NAME_USE;
    5753                 : 
    5754                 : typedef struct _SID_AND_ATTRIBUTES {
    5755                 :     PSID Sid;
    5756                 :     DWORD Attributes;
    5757                 :     } SID_AND_ATTRIBUTES, * PSID_AND_ATTRIBUTES;
    5758                 : 
    5759                 : typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
    5760                 : typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
    5761                 : 
    5762                 : #define SID_HASH_SIZE 32
    5763                 : typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY;
    5764                 : 
    5765                 : typedef struct _SID_AND_ATTRIBUTES_HASH {
    5766                 :     DWORD SidCount;
    5767                 :     PSID_AND_ATTRIBUTES SidAttr;
    5768                 :     SID_HASH_ENTRY Hash[SID_HASH_SIZE];
    5769                 : } SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;
    5770                 : 
    5771                 : 
    5772                 : /////////////////////////////////////////////////////////////////////////////
    5773                 : //                                                                         //
    5774                 : // Universal well-known SIDs                                               //
    5775                 : //                                                                         //
    5776                 : //     Null SID                     S-1-0-0                                //
    5777                 : //     World                        S-1-1-0                                //
    5778                 : //     Local                        S-1-2-0                                //
    5779                 : //     Creator Owner ID             S-1-3-0                                //
    5780                 : //     Creator Group ID             S-1-3-1                                //
    5781                 : //     Creator Owner Server ID      S-1-3-2                                //
    5782                 : //     Creator Group Server ID      S-1-3-3                                //
    5783                 : //                                                                         //
    5784                 : //     (Non-unique IDs)             S-1-4                                  //
    5785                 : //                                                                         //
    5786                 : /////////////////////////////////////////////////////////////////////////////
    5787                 : 
    5788                 : #define SECURITY_NULL_SID_AUTHORITY         {0,0,0,0,0,0}
    5789                 : #define SECURITY_WORLD_SID_AUTHORITY        {0,0,0,0,0,1}
    5790                 : #define SECURITY_LOCAL_SID_AUTHORITY        {0,0,0,0,0,2}
    5791                 : #define SECURITY_CREATOR_SID_AUTHORITY      {0,0,0,0,0,3}
    5792                 : #define SECURITY_NON_UNIQUE_AUTHORITY       {0,0,0,0,0,4}
    5793                 : #define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}
    5794                 : 
    5795                 : #define SECURITY_NULL_RID                 (0x00000000L)
    5796                 : #define SECURITY_WORLD_RID                (0x00000000L)
    5797                 : #define SECURITY_LOCAL_RID                (0x00000000L)
    5798                 : 
    5799                 : #define SECURITY_CREATOR_OWNER_RID        (0x00000000L)
    5800                 : #define SECURITY_CREATOR_GROUP_RID        (0x00000001L)
    5801                 : 
    5802                 : #define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
    5803                 : #define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
    5804                 : 
    5805                 : #define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L)
    5806                 : 
    5807                 : 
    5808                 : ///////////////////////////////////////////////////////////////////////////////
    5809                 : //                                                                           //
    5810                 : // NT well-known SIDs                                                        //
    5811                 : //                                                                           //
    5812                 : //     NT Authority            S-1-5                                         //
    5813                 : //     Dialup                  S-1-5-1                                       //
    5814                 : //                                                                           //
    5815                 : //     Network                 S-1-5-2                                       //
    5816                 : //     Batch                   S-1-5-3                                       //
    5817                 : //     Interactive             S-1-5-4                                       //
    5818                 : //     (Logon IDs)             S-1-5-5-X-Y                                   //
    5819                 : //     Service                 S-1-5-6                                       //
    5820                 : //     AnonymousLogon          S-1-5-7       (aka null logon session)        //
    5821                 : //     Proxy                   S-1-5-8                                       //
    5822                 : //     Enterprise DC (EDC)     S-1-5-9       (aka domain controller account) //
    5823                 : //     Self                    S-1-5-10      (self RID)                      //
    5824                 : //     Authenticated User      S-1-5-11      (Authenticated user somewhere)  //
    5825                 : //     Restricted Code         S-1-5-12      (Running restricted code)       //
    5826                 : //     Terminal Server         S-1-5-13      (Running on Terminal Server)    //
    5827                 : //     Remote Logon            S-1-5-14      (Remote Interactive Logon)      //
    5828                 : //     This Organization       S-1-5-15                                      //
    5829                 : //                                                                           //
    5830                 : //     IUser                   S-1-5-17
    5831                 : //     Local System            S-1-5-18                                      //
    5832                 : //     Local Service           S-1-5-19                                      //
    5833                 : //     Network Service         S-1-5-20                                      //
    5834                 : //                                                                           //
    5835                 : //     (NT non-unique IDs)     S-1-5-0x15-... (NT Domain Sids)               //
    5836                 : //                                                                           //
    5837                 : //     (Built-in domain)       S-1-5-0x20                                    //
    5838                 : //                                                                           //
    5839                 : //     (Security Package IDs)  S-1-5-0x40                                    //
    5840                 : //     NTLM Authentication     S-1-5-0x40-10                                 //
    5841                 : //     SChannel Authentication S-1-5-0x40-14                                 //
    5842                 : //     Digest Authentication   S-1-5-0x40-21                                 //
    5843                 : //                                                                           //
    5844                 : //     Other Organization      S-1-5-1000    (>=1000 can not be filtered)    //
    5845                 : //                                                                           //
    5846                 : //                                                                           //
    5847                 : // NOTE: the relative identifier values (RIDs) determine which security      //
    5848                 : //       boundaries the SID is allowed to cross.  Before adding new RIDs,    //
    5849                 : //       a determination needs to be made regarding which range they should  //
    5850                 : //       be added to in order to ensure proper "SID filtering"               //
    5851                 : //                                                                           //
    5852                 : ///////////////////////////////////////////////////////////////////////////////
    5853                 : 
    5854                 : 
    5855                 : #define SECURITY_NT_AUTHORITY           {0,0,0,0,0,5}   // ntifs
    5856                 : 
    5857                 : #define SECURITY_DIALUP_RID             (0x00000001L)
    5858                 : #define SECURITY_NETWORK_RID            (0x00000002L)
    5859                 : #define SECURITY_BATCH_RID              (0x00000003L)
    5860                 : #define SECURITY_INTERACTIVE_RID        (0x00000004L)
    5861                 : #define SECURITY_LOGON_IDS_RID          (0x00000005L)
    5862                 : #define SECURITY_LOGON_IDS_RID_COUNT    (3L)
    5863                 : #define SECURITY_SERVICE_RID            (0x00000006L)
    5864                 : #define SECURITY_ANONYMOUS_LOGON_RID    (0x00000007L)
    5865                 : #define SECURITY_PROXY_RID              (0x00000008L)
    5866                 : #define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)
    5867                 : #define SECURITY_SERVER_LOGON_RID       SECURITY_ENTERPRISE_CONTROLLERS_RID
    5868                 : #define SECURITY_PRINCIPAL_SELF_RID     (0x0000000AL)
    5869                 : #define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)
    5870                 : #define SECURITY_RESTRICTED_CODE_RID    (0x0000000CL)
    5871                 : #define SECURITY_TERMINAL_SERVER_RID    (0x0000000DL)
    5872                 : #define SECURITY_REMOTE_LOGON_RID       (0x0000000EL)
    5873                 : #define SECURITY_THIS_ORGANIZATION_RID  (0x0000000FL)
    5874                 : #define SECURITY_IUSER_RID              (0x00000011L)
    5875                 : #define SECURITY_LOCAL_SYSTEM_RID       (0x00000012L)
    5876                 : #define SECURITY_LOCAL_SERVICE_RID      (0x00000013L)
    5877                 : #define SECURITY_NETWORK_SERVICE_RID    (0x00000014L)
    5878                 : 
    5879                 : #define SECURITY_NT_NON_UNIQUE          (0x00000015L)
    5880                 : #define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT  (3L)
    5881                 : 
    5882                 : #define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)
    5883                 : 
    5884                 : #define SECURITY_BUILTIN_DOMAIN_RID     (0x00000020L)
    5885                 : #define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)
    5886                 : 
    5887                 : 
    5888                 : #define SECURITY_PACKAGE_BASE_RID       (0x00000040L)
    5889                 : #define SECURITY_PACKAGE_RID_COUNT      (2L)
    5890                 : #define SECURITY_PACKAGE_NTLM_RID       (0x0000000AL)
    5891                 : #define SECURITY_PACKAGE_SCHANNEL_RID   (0x0000000EL)
    5892                 : #define SECURITY_PACKAGE_DIGEST_RID     (0x00000015L)
    5893                 : 
    5894                 : #define SECURITY_SERVICE_ID_BASE_RID    (0x00000050L)
    5895                 : #define SECURITY_SERVICE_ID_RID_COUNT   (6L)
    5896                 : 
    5897                 : #define SECURITY_RESERVED_ID_BASE_RID   (0x00000051L)
    5898                 : 
    5899                 : #define SECURITY_MAX_ALWAYS_FILTERED    (0x000003E7L)
    5900                 : #define SECURITY_MIN_NEVER_FILTERED     (0x000003E8L)
    5901                 : 
    5902                 : #define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)
    5903                 : 
    5904                 : 
    5905                 : 
    5906                 : /////////////////////////////////////////////////////////////////////////////
    5907                 : //                                                                         //
    5908                 : // well-known domain relative sub-authority values (RIDs)...               //
    5909                 : //                                                                         //
    5910                 : /////////////////////////////////////////////////////////////////////////////
    5911                 : 
    5912                 : // Well-known users ...
    5913                 : 
    5914                 : #define FOREST_USER_RID_MAX            (0x000001F3L)
    5915                 : 
    5916                 : #define DOMAIN_USER_RID_ADMIN          (0x000001F4L)
    5917                 : #define DOMAIN_USER_RID_GUEST          (0x000001F5L)
    5918                 : #define DOMAIN_USER_RID_KRBTGT         (0x000001F6L)
    5919                 : 
    5920                 : #define DOMAIN_USER_RID_MAX            (0x000003E7L)
    5921                 : 
    5922                 : 
    5923                 : // well-known groups ...
    5924                 : 
    5925                 : #define DOMAIN_GROUP_RID_ADMINS        (0x00000200L)
    5926                 : #define DOMAIN_GROUP_RID_USERS         (0x00000201L)
    5927                 : #define DOMAIN_GROUP_RID_GUESTS        (0x00000202L)
    5928                 : #define DOMAIN_GROUP_RID_COMPUTERS     (0x00000203L)
    5929                 : #define DOMAIN_GROUP_RID_CONTROLLERS   (0x00000204L)
    5930                 : #define DOMAIN_GROUP_RID_CERT_ADMINS   (0x00000205L)
    5931                 : #define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)
    5932                 : #define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)
    5933                 : #define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)
    5934                 : #define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)
    5935                 : 
    5936                 : 
    5937                 : 
    5938                 : 
    5939                 : // well-known aliases ...
    5940                 : 
    5941                 : #define DOMAIN_ALIAS_RID_ADMINS                         (0x00000220L)
    5942                 : #define DOMAIN_ALIAS_RID_USERS                          (0x00000221L)
    5943                 : #define DOMAIN_ALIAS_RID_GUESTS                         (0x00000222L)
    5944                 : #define DOMAIN_ALIAS_RID_POWER_USERS                    (0x00000223L)
    5945                 : 
    5946                 : #define DOMAIN_ALIAS_RID_ACCOUNT_OPS                    (0x00000224L)
    5947                 : #define DOMAIN_ALIAS_RID_SYSTEM_OPS                     (0x00000225L)
    5948                 : #define DOMAIN_ALIAS_RID_PRINT_OPS                      (0x00000226L)
    5949                 : #define DOMAIN_ALIAS_RID_BACKUP_OPS                     (0x00000227L)
    5950                 : 
    5951                 : #define DOMAIN_ALIAS_RID_REPLICATOR                     (0x00000228L)
    5952                 : #define DOMAIN_ALIAS_RID_RAS_SERVERS                    (0x00000229L)
    5953                 : #define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS               (0x0000022AL)
    5954                 : #define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS           (0x0000022BL)
    5955                 : #define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS      (0x0000022CL)
    5956                 : #define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)
    5957                 : 
    5958                 : #define DOMAIN_ALIAS_RID_MONITORING_USERS               (0x0000022EL)
    5959                 : #define DOMAIN_ALIAS_RID_LOGGING_USERS                  (0x0000022FL)
    5960                 : #define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS            (0x00000230L)
    5961                 : #define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS             (0x00000231L)
    5962                 : #define DOMAIN_ALIAS_RID_DCOM_USERS                     (0x00000232L)
    5963                 : #define DOMAIN_ALIAS_RID_IUSERS                         (0x00000238L)
    5964                 : #define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS               (0x00000239L)
    5965                 : #define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP     (0x0000023BL)
    5966                 : #define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)
    5967                 : #define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP        (0x0000023DL)
    5968                 : 
    5969                 : #define SECURITY_MANDATORY_LABEL_AUTHORITY          {0,0,0,0,0,16}
    5970                 : #define SECURITY_MANDATORY_UNTRUSTED_RID            (0x00000000L)
    5971                 : #define SECURITY_MANDATORY_LOW_RID                  (0x00001000L)
    5972                 : #define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
    5973                 : #define SECURITY_MANDATORY_HIGH_RID                 (0x00003000L)
    5974                 : #define SECURITY_MANDATORY_SYSTEM_RID               (0x00004000L)
    5975                 : #define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    (0x00005000L)
    5976                 : 
    5977                 : //
    5978                 : // SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that
    5979                 : // can be set by a usermode caller.
    5980                 : //
    5981                 : 
    5982                 : #define SECURITY_MANDATORY_MAXIMUM_USER_RID   SECURITY_MANDATORY_SYSTEM_RID
    5983                 : 
    5984                 : #define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)
    5985                 : 
    5986                 : 
    5987                 : 
    5988                 : //
    5989                 : // Well known SID definitions for lookup.
    5990                 : //
    5991                 : 
    5992                 : typedef enum {
    5993                 : 
    5994                 :     WinNullSid                                  = 0,
    5995                 :     WinWorldSid                                 = 1,
    5996                 :     WinLocalSid                                 = 2,
    5997                 :     WinCreatorOwnerSid                          = 3,
    5998                 :     WinCreatorGroupSid                          = 4,
    5999                 :     WinCreatorOwnerServerSid                    = 5,
    6000                 :     WinCreatorGroupServerSid                    = 6,
    6001                 :     WinNtAuthoritySid                           = 7,
    6002                 :     WinDialupSid                                = 8,
    6003                 :     WinNetworkSid                               = 9,
    6004                 :     WinBatchSid                                 = 10,
    6005                 :     WinInteractiveSid                           = 11,
    6006                 :     WinServiceSid                               = 12,
    6007                 :     WinAnonymousSid                             = 13,
    6008                 :     WinProxySid                                 = 14,
    6009                 :     WinEnterpriseControllersSid                 = 15,
    6010                 :     WinSelfSid                                  = 16,
    6011                 :     WinAuthenticatedUserSid                     = 17,
    6012                 :     WinRestrictedCodeSid                        = 18,
    6013                 :     WinTerminalServerSid                        = 19,
    6014                 :     WinRemoteLogonIdSid                         = 20,
    6015                 :     WinLogonIdsSid                              = 21,
    6016                 :     WinLocalSystemSid                           = 22,
    6017                 :     WinLocalServiceSid                          = 23,
    6018                 :     WinNetworkServiceSid                        = 24,
    6019                 :     WinBuiltinDomainSid                         = 25,
    6020                 :     WinBuiltinAdministratorsSid                 = 26,
    6021                 :     WinBuiltinUsersSid                          = 27,
    6022                 :     WinBuiltinGuestsSid                         = 28,
    6023                 :     WinBuiltinPowerUsersSid                     = 29,
    6024                 :     WinBuiltinAccountOperatorsSid               = 30,
    6025                 :     WinBuiltinSystemOperatorsSid                = 31,
    6026                 :     WinBuiltinPrintOperatorsSid                 = 32,
    6027                 :     WinBuiltinBackupOperatorsSid                = 33,
    6028                 :     WinBuiltinReplicatorSid                     = 34,
    6029                 :     WinBuiltinPreWindows2000CompatibleAccessSid = 35,
    6030                 :     WinBuiltinRemoteDesktopUsersSid             = 36,
    6031                 :     WinBuiltinNetworkConfigurationOperatorsSid  = 37,
    6032                 :     WinAccountAdministratorSid                  = 38,
    6033                 :     WinAccountGuestSid                          = 39,
    6034                 :     WinAccountKrbtgtSid                         = 40,
    6035                 :     WinAccountDomainAdminsSid                   = 41,
    6036                 :     WinAccountDomainUsersSid                    = 42,
    6037                 :     WinAccountDomainGuestsSid                   = 43,
    6038                 :     WinAccountComputersSid                      = 44,
    6039                 :     WinAccountControllersSid                    = 45,
    6040                 :     WinAccountCertAdminsSid                     = 46,
    6041                 :     WinAccountSchemaAdminsSid                   = 47,
    6042                 :     WinAccountEnterpriseAdminsSid               = 48,
    6043                 :     WinAccountPolicyAdminsSid                   = 49,
    6044                 :     WinAccountRasAndIasServersSid               = 50,
    6045                 :     WinNTLMAuthenticationSid                    = 51,
    6046                 :     WinDigestAuthenticationSid                  = 52,
    6047                 :     WinSChannelAuthenticationSid                = 53,
    6048                 :     WinThisOrganizationSid                      = 54,
    6049                 :     WinOtherOrganizationSid                     = 55,
    6050                 :     WinBuiltinIncomingForestTrustBuildersSid    = 56,
    6051                 :     WinBuiltinPerfMonitoringUsersSid            = 57,
    6052                 :     WinBuiltinPerfLoggingUsersSid               = 58,
    6053                 :     WinBuiltinAuthorizationAccessSid            = 59,
    6054                 :     WinBuiltinTerminalServerLicenseServersSid   = 60,
    6055                 :     WinBuiltinDCOMUsersSid                      = 61,
    6056                 :     WinBuiltinIUsersSid                         = 62,
    6057                 :     WinIUserSid                                 = 63,
    6058                 :     WinBuiltinCryptoOperatorsSid                = 64,
    6059                 :     WinUntrustedLabelSid                        = 65,
    6060                 :     WinLowLabelSid                              = 66,
    6061                 :     WinMediumLabelSid                           = 67,
    6062                 :     WinHighLabelSid                             = 68,
    6063                 :     WinSystemLabelSid                           = 69,
    6064                 :     WinWriteRestrictedCodeSid                   = 70,
    6065                 :     WinCreatorOwnerRightsSid                    = 71,
    6066                 :     WinCacheablePrincipalsGroupSid              = 72,
    6067                 :     WinNonCacheablePrincipalsGroupSid           = 73,
    6068                 :     WinEnterpriseReadonlyControllersSid         = 74,
    6069                 :     WinAccountReadonlyControllersSid            = 75,
    6070                 :     WinBuiltinEventLogReadersGroup              = 76,
    6071                 : 
    6072                 : } WELL_KNOWN_SID_TYPE;
    6073                 : 
    6074                 : //
    6075                 : // Allocate the System Luid.  The first 1000 LUIDs are reserved.
    6076                 : // Use #999 here (0x3e7 = 999)
    6077                 : //
    6078                 : 
    6079                 : #define SYSTEM_LUID                     { 0x3e7, 0x0 }
    6080                 : #define ANONYMOUS_LOGON_LUID            { 0x3e6, 0x0 }
    6081                 : #define LOCALSERVICE_LUID               { 0x3e5, 0x0 }
    6082                 : #define NETWORKSERVICE_LUID             { 0x3e4, 0x0 }
    6083                 : #define IUSER_LUID                      { 0x3e3, 0x0 }
    6084                 : 
    6085                 : // end_ntifs
    6086                 : 
    6087                 : ////////////////////////////////////////////////////////////////////////
    6088                 : //                                                                    //
    6089                 : //                          User and Group related SID attributes     //
    6090                 : //                                                                    //
    6091                 : ////////////////////////////////////////////////////////////////////////
    6092                 : 
    6093                 : //
    6094                 : // Group attributes
    6095                 : //
    6096                 : 
    6097                 : #define SE_GROUP_MANDATORY                 (0x00000001L)
    6098                 : #define SE_GROUP_ENABLED_BY_DEFAULT        (0x00000002L)
    6099                 : #define SE_GROUP_ENABLED                   (0x00000004L)
    6100                 : #define SE_GROUP_OWNER                     (0x00000008L)
    6101                 : #define SE_GROUP_USE_FOR_DENY_ONLY         (0x00000010L)
    6102                 : #define SE_GROUP_INTEGRITY                 (0x00000020L)
    6103                 : #define SE_GROUP_INTEGRITY_ENABLED         (0x00000040L)
    6104                 : #define SE_GROUP_LOGON_ID                  (0xC0000000L)
    6105                 : #define SE_GROUP_RESOURCE                  (0x20000000L)
    6106                 : 
    6107                 : #define SE_GROUP_VALID_ATTRIBUTES          (SE_GROUP_MANDATORY          | \
    6108                 :                                             SE_GROUP_ENABLED_BY_DEFAULT | \
    6109                 :                                             SE_GROUP_ENABLED            | \
    6110                 :                                             SE_GROUP_OWNER              | \
    6111                 :                                             SE_GROUP_USE_FOR_DENY_ONLY  | \
    6112                 :                                             SE_GROUP_LOGON_ID           | \
    6113                 :                                             SE_GROUP_RESOURCE           | \
    6114                 :                                             SE_GROUP_INTEGRITY          | \
    6115                 :                                             SE_GROUP_INTEGRITY_ENABLED)
    6116                 : 
    6117                 : //
    6118                 : // User attributes
    6119                 : //
    6120                 : 
    6121                 : // (None yet defined.)
    6122                 : 
    6123                 : 
    6124                 : 
    6125                 : 
    6126                 : ////////////////////////////////////////////////////////////////////////
    6127                 : //                                                                    //
    6128                 : //                         ACL  and  ACE                              //
    6129                 : //                                                                    //
    6130                 : ////////////////////////////////////////////////////////////////////////
    6131                 : 
    6132                 : //
    6133                 : //  Define an ACL and the ACE format.  The structure of an ACL header
    6134                 : //  followed by one or more ACEs.  Pictorally the structure of an ACL header
    6135                 : //  is as follows:
    6136                 : //
    6137                 : //       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    6138                 : //       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
    6139                 : //      +-------------------------------+---------------+---------------+
    6140                 : //      |            AclSize            |      Sbz1     |  AclRevision  |
    6141                 : //      +-------------------------------+---------------+---------------+
    6142                 : //      |              Sbz2             |           AceCount            |
    6143                 : //      +-------------------------------+-------------------------------+
    6144                 : //
    6145                 : //  The current AclRevision is defined to be ACL_REVISION.
    6146                 : //
    6147                 : //  AclSize is the size, in bytes, allocated for the ACL.  This includes
    6148                 : //  the ACL header, ACES, and remaining free space in the buffer.
    6149                 : //
    6150                 : //  AceCount is the number of ACES in the ACL.
    6151                 : //
    6152                 : 
    6153                 : // begin_wdm
    6154                 : // This is the *current* ACL revision
    6155                 : 
    6156                 : #define ACL_REVISION     (2)
    6157                 : #define ACL_REVISION_DS  (4)
    6158                 : 
    6159                 : // This is the history of ACL revisions.  Add a new one whenever
    6160                 : // ACL_REVISION is updated
    6161                 : 
    6162                 : #define ACL_REVISION1   (1)
    6163                 : #define MIN_ACL_REVISION ACL_REVISION2
    6164                 : #define ACL_REVISION2   (2)
    6165                 : #define ACL_REVISION3   (3)
    6166                 : #define ACL_REVISION4   (4)
    6167                 : #define MAX_ACL_REVISION ACL_REVISION4
    6168                 : 
    6169                 : typedef struct _ACL {
    6170                 :     BYTE  AclRevision;
    6171                 :     BYTE  Sbz1;
    6172                 :     WORD   AclSize;
    6173                 :     WORD   AceCount;
    6174                 :     WORD   Sbz2;
    6175                 : } ACL;
    6176                 : typedef ACL *PACL;
    6177                 : 
    6178                 : // end_wdm
    6179                 : // begin_ntifs
    6180                 : 
    6181                 : //
    6182                 : //  The structure of an ACE is a common ace header followed by ace type
    6183                 : //  specific data.  Pictorally the structure of the common ace header is
    6184                 : //  as follows:
    6185                 : //
    6186                 : //       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    6187                 : //       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
    6188                 : //      +---------------+-------+-------+---------------+---------------+
    6189                 : //      |            AceSize            |    AceFlags   |     AceType   |
    6190                 : //      +---------------+-------+-------+---------------+---------------+
    6191                 : //
    6192                 : //  AceType denotes the type of the ace, there are some predefined ace
    6193                 : //  types
    6194                 : //
    6195                 : //  AceSize is the size, in bytes, of ace.
    6196                 : //
    6197                 : //  AceFlags are the Ace flags for audit and inheritance, defined shortly.
    6198                 : 
    6199                 : typedef struct _ACE_HEADER {
    6200                 :     BYTE  AceType;
    6201                 :     BYTE  AceFlags;
    6202                 :     WORD   AceSize;
    6203                 : } ACE_HEADER;
    6204                 : typedef ACE_HEADER *PACE_HEADER;
    6205                 : 
    6206                 : //
    6207                 : //  The following are the predefined ace types that go into the AceType
    6208                 : //  field of an Ace header.
    6209                 : //
    6210                 : 
    6211                 : #define ACCESS_MIN_MS_ACE_TYPE                  (0x0)
    6212                 : #define ACCESS_ALLOWED_ACE_TYPE                 (0x0)
    6213                 : #define ACCESS_DENIED_ACE_TYPE                  (0x1)
    6214                 : #define SYSTEM_AUDIT_ACE_TYPE                   (0x2)
    6215                 : #define SYSTEM_ALARM_ACE_TYPE                   (0x3)
    6216                 : #define ACCESS_MAX_MS_V2_ACE_TYPE               (0x3)
    6217                 : 
    6218                 : #define ACCESS_ALLOWED_COMPOUND_ACE_TYPE        (0x4)
    6219                 : #define ACCESS_MAX_MS_V3_ACE_TYPE               (0x4)
    6220                 : 
    6221                 : #define ACCESS_MIN_MS_OBJECT_ACE_TYPE           (0x5)
    6222                 : #define ACCESS_ALLOWED_OBJECT_ACE_TYPE          (0x5)
    6223                 : #define ACCESS_DENIED_OBJECT_ACE_TYPE           (0x6)
    6224                 : #define SYSTEM_AUDIT_OBJECT_ACE_TYPE            (0x7)
    6225                 : #define SYSTEM_ALARM_OBJECT_ACE_TYPE            (0x8)
    6226                 : #define ACCESS_MAX_MS_OBJECT_ACE_TYPE           (0x8)
    6227                 : 
    6228                 : #define ACCESS_MAX_MS_V4_ACE_TYPE               (0x8)
    6229                 : #define ACCESS_MAX_MS_ACE_TYPE                  (0x8)
    6230                 : 
    6231                 : #define ACCESS_ALLOWED_CALLBACK_ACE_TYPE        (0x9)
    6232                 : #define ACCESS_DENIED_CALLBACK_ACE_TYPE         (0xA)
    6233                 : #define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)
    6234                 : #define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE  (0xC)
    6235                 : #define SYSTEM_AUDIT_CALLBACK_ACE_TYPE          (0xD)
    6236                 : #define SYSTEM_ALARM_CALLBACK_ACE_TYPE          (0xE)
    6237                 : #define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE   (0xF)
    6238                 : #define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE   (0x10)
    6239                 : 
    6240                 : #define SYSTEM_MANDATORY_LABEL_ACE_TYPE         (0x11)
    6241                 : #define ACCESS_MAX_MS_V5_ACE_TYPE               (0x11)
    6242                 : 
    6243                 : 
    6244                 : //
    6245                 : //  The following are the inherit flags that go into the AceFlags field
    6246                 : //  of an Ace header.
    6247                 : //
    6248                 : 
    6249                 : #define OBJECT_INHERIT_ACE                (0x1)
    6250                 : #define CONTAINER_INHERIT_ACE             (0x2)
    6251                 : #define NO_PROPAGATE_INHERIT_ACE          (0x4)
    6252                 : #define INHERIT_ONLY_ACE                  (0x8)
    6253                 : #define INHERITED_ACE                     (0x10)
    6254                 : #define VALID_INHERIT_FLAGS               (0x1F)
    6255                 : 
    6256                 : 
    6257                 : //  The following are the currently defined ACE flags that go into the
    6258                 : //  AceFlags field of an ACE header.  Each ACE type has its own set of
    6259                 : //  AceFlags.
    6260                 : //
    6261                 : //  SUCCESSFUL_ACCESS_ACE_FLAG - used only with system audit and alarm ACE
    6262                 : //  types to indicate that a message is generated for successful accesses.
    6263                 : //
    6264                 : //  FAILED_ACCESS_ACE_FLAG - used only with system audit and alarm ACE types
    6265                 : //  to indicate that a message is generated for failed accesses.
    6266                 : //
    6267                 : 
    6268                 : //
    6269                 : //  SYSTEM_AUDIT and SYSTEM_ALARM AceFlags
    6270                 : //
    6271                 : //  These control the signaling of audit and alarms for success or failure.
    6272                 : //
    6273                 : 
    6274                 : #define SUCCESSFUL_ACCESS_ACE_FLAG       (0x40)
    6275                 : #define FAILED_ACCESS_ACE_FLAG           (0x80)
    6276                 : 
    6277                 : 
    6278                 : //
    6279                 : //  We'll define the structure of the predefined ACE types.  Pictorally
    6280                 : //  the structure of the predefined ACE's is as follows:
    6281                 : //
    6282                 : //       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    6283                 : //       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
    6284                 : //      +---------------+-------+-------+---------------+---------------+
    6285                 : //      |    AceFlags   | Resd  |Inherit|    AceSize    |     AceType   |
    6286                 : //      +---------------+-------+-------+---------------+---------------+
    6287                 : //      |                              Mask                             |
    6288                 : //      +---------------------------------------------------------------+
    6289                 : //      |                                                               |
    6290                 : //      +                                                               +
    6291                 : //      |                                                               |
    6292                 : //      +                              Sid                              +
    6293                 : //      |                                                               |
    6294                 : //      +                                                               +
    6295                 : //      |                                                               |
    6296                 : //      +---------------------------------------------------------------+
    6297                 : //
    6298                 : //  Mask is the access mask associated with the ACE.  This is either the
    6299                 : //  access allowed, access denied, audit, or alarm mask.
    6300                 : //
    6301                 : //  Sid is the Sid associated with the ACE.
    6302                 : //
    6303                 : 
    6304                 : //  The following are the four predefined ACE types.
    6305                 : 
    6306                 : //  Examine the AceType field in the Header to determine
    6307                 : //  which structure is appropriate to use for casting.
    6308                 : 
    6309                 : 
    6310                 : typedef struct _ACCESS_ALLOWED_ACE {
    6311                 :     ACE_HEADER Header;
    6312                 :     ACCESS_MASK Mask;
    6313                 :     DWORD SidStart;
    6314                 : } ACCESS_ALLOWED_ACE;
    6315                 : 
    6316                 : typedef ACCESS_ALLOWED_ACE *PACCESS_ALLOWED_ACE;
    6317                 : 
    6318                 : typedef struct _ACCESS_DENIED_ACE {
    6319                 :     ACE_HEADER Header;
    6320                 :     ACCESS_MASK Mask;
    6321                 :     DWORD SidStart;
    6322                 : } ACCESS_DENIED_ACE;
    6323                 : typedef ACCESS_DENIED_ACE *PACCESS_DENIED_ACE;
    6324                 : 
    6325                 : typedef struct _SYSTEM_AUDIT_ACE {
    6326                 :     ACE_HEADER Header;
    6327                 :     ACCESS_MASK Mask;
    6328                 :     DWORD SidStart;
    6329                 : } SYSTEM_AUDIT_ACE;
    6330                 : typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;
    6331                 : 
    6332                 : typedef struct _SYSTEM_ALARM_ACE {
    6333                 :     ACE_HEADER Header;
    6334                 :     ACCESS_MASK Mask;
    6335                 :     DWORD SidStart;
    6336                 : } SYSTEM_ALARM_ACE;
    6337                 : typedef SYSTEM_ALARM_ACE *PSYSTEM_ALARM_ACE;
    6338                 : 
    6339                 : typedef struct _SYSTEM_MANDATORY_LABEL_ACE {
    6340                 :     ACE_HEADER Header;
    6341                 :     ACCESS_MASK Mask;
    6342                 :     DWORD SidStart;
    6343                 : } SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
    6344                 : 
    6345                 : #define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP         0x1
    6346                 : #define SYSTEM_MANDATORY_LABEL_NO_READ_UP          0x2
    6347                 : #define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP       0x4
    6348                 : 
    6349                 : #define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP   | \
    6350                 :                                            SYSTEM_MANDATORY_LABEL_NO_READ_UP    | \
    6351                 :                                            SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)
    6352                 : // end_ntifs
    6353                 : 
    6354                 : 
    6355                 : typedef struct _ACCESS_ALLOWED_OBJECT_ACE {
    6356                 :     ACE_HEADER Header;
    6357                 :     ACCESS_MASK Mask;
    6358                 :     DWORD Flags;
    6359                 :     GUID ObjectType;
    6360                 :     GUID InheritedObjectType;
    6361                 :     DWORD SidStart;
    6362                 : } ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;
    6363                 : 
    6364                 : typedef struct _ACCESS_DENIED_OBJECT_ACE {
    6365                 :     ACE_HEADER Header;
    6366                 :     ACCESS_MASK Mask;
    6367                 :     DWORD Flags;
    6368                 :     GUID ObjectType;
    6369                 :     GUID InheritedObjectType;
    6370                 :     DWORD SidStart;
    6371                 : } ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;
    6372                 : 
    6373                 : typedef struct _SYSTEM_AUDIT_OBJECT_ACE {
    6374                 :     ACE_HEADER Header;
    6375                 :     ACCESS_MASK Mask;
    6376                 :     DWORD Flags;
    6377                 :     GUID ObjectType;
    6378                 :     GUID InheritedObjectType;
    6379                 :     DWORD SidStart;
    6380                 : } SYSTEM_AUDIT_OBJECT_ACE, *PSYSTEM_AUDIT_OBJECT_ACE;
    6381                 : 
    6382                 : typedef struct _SYSTEM_ALARM_OBJECT_ACE {
    6383                 :     ACE_HEADER Header;
    6384                 :     ACCESS_MASK Mask;
    6385                 :     DWORD Flags;
    6386                 :     GUID ObjectType;
    6387                 :     GUID InheritedObjectType;
    6388                 :     DWORD SidStart;
    6389                 : } SYSTEM_ALARM_OBJECT_ACE, *PSYSTEM_ALARM_OBJECT_ACE;
    6390                 : 
    6391                 : //
    6392                 : // Callback ace support in post Win2000.
    6393                 : // Resource managers can put their own data after Sidstart + Length of the sid
    6394                 : //
    6395                 : 
    6396                 : typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {
    6397                 :     ACE_HEADER Header;
    6398                 :     ACCESS_MASK Mask;
    6399                 :     DWORD SidStart;
    6400                 :     // Opaque resouce manager specific data
    6401                 : } ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;
    6402                 : 
    6403                 : typedef struct _ACCESS_DENIED_CALLBACK_ACE {
    6404                 :     ACE_HEADER Header;
    6405                 :     ACCESS_MASK Mask;
    6406                 :     DWORD SidStart;
    6407                 :     // Opaque resouce manager specific data
    6408                 : } ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;
    6409                 : 
    6410                 : typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {
    6411                 :     ACE_HEADER Header;
    6412                 :     ACCESS_MASK Mask;
    6413                 :     DWORD SidStart;
    6414                 :     // Opaque resouce manager specific data
    6415                 : } SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;
    6416                 : 
    6417                 : typedef struct _SYSTEM_ALARM_CALLBACK_ACE {
    6418                 :     ACE_HEADER Header;
    6419                 :     ACCESS_MASK Mask;
    6420                 :     DWORD SidStart;
    6421                 :     // Opaque resouce manager specific data
    6422                 : } SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;
    6423                 : 
    6424                 : typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
    6425                 :     ACE_HEADER Header;
    6426                 :     ACCESS_MASK Mask;
    6427                 :     DWORD Flags;
    6428                 :     GUID ObjectType;
    6429                 :     GUID InheritedObjectType;
    6430                 :     DWORD SidStart;
    6431                 :     // Opaque resouce manager specific data
    6432                 : } ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;
    6433                 : 
    6434                 : typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {
    6435                 :     ACE_HEADER Header;
    6436                 :     ACCESS_MASK Mask;
    6437                 :     DWORD Flags;
    6438                 :     GUID ObjectType;
    6439                 :     GUID InheritedObjectType;
    6440                 :     DWORD SidStart;
    6441                 :     // Opaque resouce manager specific data
    6442                 : } ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;
    6443                 : 
    6444                 : typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {
    6445                 :     ACE_HEADER Header;
    6446                 :     ACCESS_MASK Mask;
    6447                 :     DWORD Flags;
    6448                 :     GUID ObjectType;
    6449                 :     GUID InheritedObjectType;
    6450                 :     DWORD SidStart;
    6451                 :     // Opaque resouce manager specific data
    6452                 : } SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;
    6453                 : 
    6454                 : typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
    6455                 :     ACE_HEADER Header;
    6456                 :     ACCESS_MASK Mask;
    6457                 :     DWORD Flags;
    6458                 :     GUID ObjectType;
    6459                 :     GUID InheritedObjectType;
    6460                 :     DWORD SidStart;
    6461                 :     // Opaque resouce manager specific data
    6462                 : } SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;
    6463                 : 
    6464                 : //
    6465                 : // Currently define Flags for "OBJECT" ACE types.
    6466                 : //
    6467                 : 
    6468                 : #define ACE_OBJECT_TYPE_PRESENT           0x1
    6469                 : #define ACE_INHERITED_OBJECT_TYPE_PRESENT 0x2
    6470                 : 
    6471                 : 
    6472                 : //
    6473                 : //  The following declarations are used for setting and querying information
    6474                 : //  about and ACL.  First are the various information classes available to
    6475                 : //  the user.
    6476                 : //
    6477                 : 
    6478                 : typedef enum _ACL_INFORMATION_CLASS {
    6479                 :     AclRevisionInformation = 1,
    6480                 :     AclSizeInformation
    6481                 : } ACL_INFORMATION_CLASS;
    6482                 : 
    6483                 : //
    6484                 : //  This record is returned/sent if the user is requesting/setting the
    6485                 : //  AclRevisionInformation
    6486                 : //
    6487                 : 
    6488                 : typedef struct _ACL_REVISION_INFORMATION {
    6489                 :     DWORD AclRevision;
    6490                 : } ACL_REVISION_INFORMATION;
    6491                 : typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;
    6492                 : 
    6493                 : //
    6494                 : //  This record is returned if the user is requesting AclSizeInformation
    6495                 : //
    6496                 : 
    6497                 : typedef struct _ACL_SIZE_INFORMATION {
    6498                 :     DWORD AceCount;
    6499                 :     DWORD AclBytesInUse;
    6500                 :     DWORD AclBytesFree;
    6501                 : } ACL_SIZE_INFORMATION;
    6502                 : typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;
    6503                 : 
    6504                 : 
    6505                 : ////////////////////////////////////////////////////////////////////////
    6506                 : //                                                                    //
    6507                 : //                             SECURITY_DESCRIPTOR                    //
    6508                 : //                                                                    //
    6509                 : ////////////////////////////////////////////////////////////////////////
    6510                 : //
    6511                 : //  Define the Security Descriptor and related data types.
    6512                 : //  This is an opaque data structure.
    6513                 : //
    6514                 : 
    6515                 : // begin_wdm
    6516                 : //
    6517                 : // Current security descriptor revision value
    6518                 : //
    6519                 : 
    6520                 : #define SECURITY_DESCRIPTOR_REVISION     (1)
    6521                 : #define SECURITY_DESCRIPTOR_REVISION1    (1)
    6522                 : 
    6523                 : // end_wdm
    6524                 : // begin_ntifs
    6525                 : 
    6526                 : #define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR))
    6527                 : 
    6528                 : 
    6529                 : typedef WORD   SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
    6530                 : 
    6531                 : #define SE_OWNER_DEFAULTED               (0x0001)
    6532                 : #define SE_GROUP_DEFAULTED               (0x0002)
    6533                 : #define SE_DACL_PRESENT                  (0x0004)
    6534                 : #define SE_DACL_DEFAULTED                (0x0008)
    6535                 : #define SE_SACL_PRESENT                  (0x0010)
    6536                 : #define SE_SACL_DEFAULTED                (0x0020)
    6537                 : #define SE_DACL_AUTO_INHERIT_REQ         (0x0100)
    6538                 : #define SE_SACL_AUTO_INHERIT_REQ         (0x0200)
    6539                 : #define SE_DACL_AUTO_INHERITED           (0x0400)
    6540                 : #define SE_SACL_AUTO_INHERITED           (0x0800)
    6541                 : #define SE_DACL_PROTECTED                (0x1000)
    6542                 : #define SE_SACL_PROTECTED                (0x2000)
    6543                 : #define SE_RM_CONTROL_VALID              (0x4000)
    6544                 : #define SE_SELF_RELATIVE                 (0x8000)
    6545                 : 
    6546                 : //
    6547                 : //  Where:
    6548                 : //
    6549                 : //      SE_OWNER_DEFAULTED - This boolean flag, when set, indicates that the
    6550                 : //          SID pointed to by the Owner field was provided by a
    6551                 : //          defaulting mechanism rather than explicitly provided by the
    6552                 : //          original provider of the security descriptor.  This may
    6553                 : //          affect the treatment of the SID with respect to inheritence
    6554                 : //          of an owner.
    6555                 : //
    6556                 : //      SE_GROUP_DEFAULTED - This boolean flag, when set, indicates that the
    6557                 : //          SID in the Group field was provided by a defaulting mechanism
    6558                 : //          rather than explicitly provided by the original provider of
    6559                 : //          the security descriptor.  This may affect the treatment of
    6560                 : //          the SID with respect to inheritence of a primary group.
    6561                 : //
    6562                 : //      SE_DACL_PRESENT - This boolean flag, when set, indicates that the
    6563                 : //          security descriptor contains a discretionary ACL.  If this
    6564                 : //          flag is set and the Dacl field of the SECURITY_DESCRIPTOR is
    6565                 : //          null, then a null ACL is explicitly being specified.
    6566                 : //
    6567                 : //      SE_DACL_DEFAULTED - This boolean flag, when set, indicates that the
    6568                 : //          ACL pointed to by the Dacl field was provided by a defaulting
    6569                 : //          mechanism rather than explicitly provided by the original
    6570                 : //          provider of the security descriptor.  This may affect the
    6571                 : //          treatment of the ACL with respect to inheritence of an ACL.
    6572                 : //          This flag is ignored if the DaclPresent flag is not set.
    6573                 : //
    6574                 : //      SE_SACL_PRESENT - This boolean flag, when set,  indicates that the
    6575                 : //          security descriptor contains a system ACL pointed to by the
    6576                 : //          Sacl field.  If this flag is set and the Sacl field of the
    6577                 : //          SECURITY_DESCRIPTOR is null, then an empty (but present)
    6578                 : //          ACL is being specified.
    6579                 : //
    6580                 : //      SE_SACL_DEFAULTED - This boolean flag, when set, indicates that the
    6581                 : //          ACL pointed to by the Sacl field was provided by a defaulting
    6582                 : //          mechanism rather than explicitly provided by the original
    6583                 : //          provider of the security descriptor.  This may affect the
    6584                 : //          treatment of the ACL with respect to inheritence of an ACL.
    6585                 : //          This flag is ignored if the SaclPresent flag is not set.
    6586                 : //
    6587                 : //      SE_SELF_RELATIVE - This boolean flag, when set, indicates that the
    6588                 : //          security descriptor is in self-relative form.  In this form,
    6589                 : //          all fields of the security descriptor are contiguous in memory
    6590                 : //          and all pointer fields are expressed as offsets from the
    6591                 : //          beginning of the security descriptor.  This form is useful
    6592                 : //          for treating security descriptors as opaque data structures
    6593                 : //          for transmission in communication protocol or for storage on
    6594                 : //          secondary media.
    6595                 : //
    6596                 : //
    6597                 : //
    6598                 : // Pictorially the structure of a security descriptor is as follows:
    6599                 : //
    6600                 : //       3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    6601                 : //       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
    6602                 : //      +---------------------------------------------------------------+
    6603                 : //      |            Control            |Reserved1 (SBZ)|   Revision    |
    6604                 : //      +---------------------------------------------------------------+
    6605                 : //      |                            Owner                              |
    6606                 : //      +---------------------------------------------------------------+
    6607                 : //      |                            Group                              |
    6608                 : //      +---------------------------------------------------------------+
    6609                 : //      |                            Sacl                               |
    6610                 : //      +---------------------------------------------------------------+
    6611                 : //      |                            Dacl                               |
    6612                 : //      +---------------------------------------------------------------+
    6613                 : //
    6614                 : // In general, this data structure should be treated opaquely to ensure future
    6615                 : // compatibility.
    6616                 : //
    6617                 : //
    6618                 : 
    6619                 : typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
    6620                 :     BYTE  Revision;
    6621                 :     BYTE  Sbz1;
    6622                 :     SECURITY_DESCRIPTOR_CONTROL Control;
    6623                 :     DWORD Owner;
    6624                 :     DWORD Group;
    6625                 :     DWORD Sacl;
    6626                 :     DWORD Dacl;
    6627                 :     } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
    6628                 : 
    6629                 : typedef struct _SECURITY_DESCRIPTOR {
    6630                 :    BYTE  Revision;
    6631                 :    BYTE  Sbz1;
    6632                 :    SECURITY_DESCRIPTOR_CONTROL Control;
    6633                 :    PSID Owner;
    6634                 :    PSID Group;
    6635                 :    PACL Sacl;
    6636                 :    PACL Dacl;
    6637                 : 
    6638                 :    } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
    6639                 : 
    6640                 : // end_ntifs
    6641                 : 
    6642                 : // Where:
    6643                 : //
    6644                 : //     Revision - Contains the revision level of the security
    6645                 : //         descriptor.  This allows this structure to be passed between
    6646                 : //         systems or stored on disk even though it is expected to
    6647                 : //         change in the future.
    6648                 : //
    6649                 : //     Control - A set of flags which qualify the meaning of the
    6650                 : //         security descriptor or individual fields of the security
    6651                 : //         descriptor.
    6652                 : //
    6653                 : //     Owner - is a pointer to an SID representing an object's owner.
    6654                 : //         If this field is null, then no owner SID is present in the
    6655                 : //         security descriptor.  If the security descriptor is in
    6656                 : //         self-relative form, then this field contains an offset to
    6657                 : //         the SID, rather than a pointer.
    6658                 : //
    6659                 : //     Group - is a pointer to an SID representing an object's primary
    6660                 : //         group.  If this field is null, then no primary group SID is
    6661                 : //         present in the security descriptor.  If the security descriptor
    6662                 : //         is in self-relative form, then this field contains an offset to
    6663                 : //         the SID, rather than a pointer.
    6664                 : //
    6665                 : //     Sacl - is a pointer to a system ACL.  This field value is only
    6666                 : //         valid if the DaclPresent control flag is set.  If the
    6667                 : //         SaclPresent flag is set and this field is null, then a null
    6668                 : //         ACL  is specified.  If the security descriptor is in
    6669                 : //         self-relative form, then this field contains an offset to
    6670                 : //         the ACL, rather than a pointer.
    6671                 : //
    6672                 : //     Dacl - is a pointer to a discretionary ACL.  This field value is
    6673                 : //         only valid if the DaclPresent control flag is set.  If the
    6674                 : //         DaclPresent flag is set and this field is null, then a null
    6675                 : //         ACL (unconditionally granting access) is specified.  If the
    6676                 : //         security descriptor is in self-relative form, then this field
    6677                 : //         contains an offset to the ACL, rather than a pointer.
    6678                 : //
    6679                 : 
    6680                 : 
    6681                 : 
    6682                 : 
    6683                 : ////////////////////////////////////////////////////////////////////////
    6684                 : //                                                                    //
    6685                 : //               Object Type list for AccessCheckByType               //
    6686                 : //                                                                    //
    6687                 : ////////////////////////////////////////////////////////////////////////
    6688                 : 
    6689                 : typedef struct _OBJECT_TYPE_LIST {
    6690                 :     WORD   Level;
    6691                 :     WORD   Sbz;
    6692                 :     GUID *ObjectType;
    6693                 : } OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
    6694                 : 
    6695                 : //
    6696                 : // DS values for Level
    6697                 : //
    6698                 : 
    6699                 : #define ACCESS_OBJECT_GUID       0
    6700                 : #define ACCESS_PROPERTY_SET_GUID 1
    6701                 : #define ACCESS_PROPERTY_GUID     2
    6702                 : 
    6703                 : #define ACCESS_MAX_LEVEL         4
    6704                 : 
    6705                 : //
    6706                 : // Parameters to NtAccessCheckByTypeAndAditAlarm
    6707                 : //
    6708                 : 
    6709                 : typedef enum _AUDIT_EVENT_TYPE {
    6710                 :     AuditEventObjectAccess,
    6711                 :     AuditEventDirectoryServiceAccess
    6712                 : } AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
    6713                 : 
    6714                 : #define AUDIT_ALLOW_NO_PRIVILEGE 0x1
    6715                 : 
    6716                 : //
    6717                 : // DS values for Source and ObjectTypeName
    6718                 : //
    6719                 : 
    6720                 : #define ACCESS_DS_SOURCE_A "DS"
    6721                 : #define ACCESS_DS_SOURCE_W L"DS"
    6722                 : #define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object"
    6723                 : #define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object"
    6724                 : 
    6725                 : 
    6726                 : ////////////////////////////////////////////////////////////////////////
    6727                 : //                                                                    //
    6728                 : //               Privilege Related Data Structures                    //
    6729                 : //                                                                    //
    6730                 : ////////////////////////////////////////////////////////////////////////
    6731                 : 
    6732                 : // end_ntifs
    6733                 : // begin_wdm
    6734                 : //
    6735                 : // Privilege attributes
    6736                 : //
    6737                 : 
    6738                 : #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
    6739                 : #define SE_PRIVILEGE_ENABLED            (0x00000002L)
    6740                 : #define SE_PRIVILEGE_REMOVED            (0X00000004L)
    6741                 : #define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)
    6742                 : 
    6743                 : #define SE_PRIVILEGE_VALID_ATTRIBUTES   (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
    6744                 :                                          SE_PRIVILEGE_ENABLED            | \
    6745                 :                                          SE_PRIVILEGE_REMOVED            | \
    6746                 :                                          SE_PRIVILEGE_USED_FOR_ACCESS)
    6747                 : 
    6748                 : 
    6749                 : //
    6750                 : // Privilege Set Control flags
    6751                 : //
    6752                 : 
    6753                 : #define PRIVILEGE_SET_ALL_NECESSARY    (1)
    6754                 : 
    6755                 : //
    6756                 : //  Privilege Set - This is defined for a privilege set of one.
    6757                 : //                  If more than one privilege is needed, then this structure
    6758                 : //                  will need to be allocated with more space.
    6759                 : //
    6760                 : //  Note: don't change this structure without fixing the INITIAL_PRIVILEGE_SET
    6761                 : //  structure (defined in se.h)
    6762                 : //
    6763                 : 
    6764                 : typedef struct _PRIVILEGE_SET {
    6765                 :     DWORD PrivilegeCount;
    6766                 :     DWORD Control;
    6767                 :     LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
    6768                 :     } PRIVILEGE_SET, * PPRIVILEGE_SET;
    6769                 : 
    6770                 : 
    6771                 : ////////////////////////////////////////////////////////////////////////
    6772                 : //                                                                    //
    6773                 : //               NT Defined Privileges                                //
    6774                 : //                                                                    //
    6775                 : ////////////////////////////////////////////////////////////////////////
    6776                 : 
    6777                 : #define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")
    6778                 : #define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")
    6779                 : #define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")
    6780                 : #define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")
    6781                 : #define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")
    6782                 : #define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")
    6783                 : #define SE_TCB_NAME                       TEXT("SeTcbPrivilege")
    6784                 : #define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")
    6785                 : #define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")
    6786                 : #define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")
    6787                 : #define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")
    6788                 : #define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")
    6789                 : #define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")
    6790                 : #define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")
    6791                 : #define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")
    6792                 : #define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")
    6793                 : #define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")
    6794                 : #define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")
    6795                 : #define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")
    6796                 : #define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")
    6797                 : #define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")
    6798                 : #define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")
    6799                 : #define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")
    6800                 : #define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")
    6801                 : #define SE_UNDOCK_NAME                    TEXT("SeUndockPrivilege")
    6802                 : #define SE_SYNC_AGENT_NAME                TEXT("SeSyncAgentPrivilege")
    6803                 : #define SE_ENABLE_DELEGATION_NAME         TEXT("SeEnableDelegationPrivilege")
    6804                 : #define SE_MANAGE_VOLUME_NAME             TEXT("SeManageVolumePrivilege")
    6805                 : #define SE_IMPERSONATE_NAME               TEXT("SeImpersonatePrivilege")
    6806                 : #define SE_CREATE_GLOBAL_NAME             TEXT("SeCreateGlobalPrivilege")
    6807                 : #define SE_TRUSTED_CREDMAN_ACCESS_NAME    TEXT("SeTrustedCredManAccessPrivilege")
    6808                 : #define SE_RELABEL_NAME                   TEXT("SeRelabelPrivilege")
    6809                 : #define SE_INC_WORKING_SET_NAME           TEXT("SeIncreaseWorkingSetPrivilege")
    6810                 : #define SE_TIME_ZONE_NAME                 TEXT("SeTimeZonePrivilege")
    6811                 : #define SE_CREATE_SYMBOLIC_LINK_NAME      TEXT("SeCreateSymbolicLinkPrivilege")
    6812                 : 
    6813                 : 
    6814                 : 
    6815                 : ////////////////////////////////////////////////////////////////////
    6816                 : //                                                                //
    6817                 : //           Security Quality Of Service                          //
    6818                 : //                                                                //
    6819                 : //                                                                //
    6820                 : ////////////////////////////////////////////////////////////////////
    6821                 : 
    6822                 : // begin_wdm
    6823                 : //
    6824                 : // Impersonation Level
    6825                 : //
    6826                 : // Impersonation level is represented by a pair of bits in Windows.
    6827                 : // If a new impersonation level is added or lowest value is changed from
    6828                 : // 0 to something else, fix the Windows CreateFile call.
    6829                 : //
    6830                 : 
    6831                 : typedef enum _SECURITY_IMPERSONATION_LEVEL {
    6832                 :     SecurityAnonymous,
    6833                 :     SecurityIdentification,
    6834                 :     SecurityImpersonation,
    6835                 :     SecurityDelegation
    6836                 :     } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
    6837                 : 
    6838                 : #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
    6839                 : #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
    6840                 : #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
    6841                 : #define VALID_IMPERSONATION_LEVEL(L) (((L) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((L) <= SECURITY_MAX_IMPERSONATION_LEVEL))
    6842                 : 
    6843                 : ////////////////////////////////////////////////////////////////////
    6844                 : //                                                                //
    6845                 : //           Token Object Definitions                             //
    6846                 : //                                                                //
    6847                 : //                                                                //
    6848                 : ////////////////////////////////////////////////////////////////////
    6849                 : 
    6850                 : 
    6851                 : //
    6852                 : // Token Specific Access Rights.
    6853                 : //
    6854                 : 
    6855                 : #define TOKEN_ASSIGN_PRIMARY    (0x0001)
    6856                 : #define TOKEN_DUPLICATE         (0x0002)
    6857                 : #define TOKEN_IMPERSONATE       (0x0004)
    6858                 : #define TOKEN_QUERY             (0x0008)
    6859                 : #define TOKEN_QUERY_SOURCE      (0x0010)
    6860                 : #define TOKEN_ADJUST_PRIVILEGES (0x0020)
    6861                 : #define TOKEN_ADJUST_GROUPS     (0x0040)
    6862                 : #define TOKEN_ADJUST_DEFAULT    (0x0080)
    6863                 : #define TOKEN_ADJUST_SESSIONID  (0x0100)
    6864                 : 
    6865                 : #define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED  |\
    6866                 :                           TOKEN_ASSIGN_PRIMARY      |\
    6867                 :                           TOKEN_DUPLICATE           |\
    6868                 :                           TOKEN_IMPERSONATE         |\
    6869                 :                           TOKEN_QUERY               |\
    6870                 :                           TOKEN_QUERY_SOURCE        |\
    6871                 :                           TOKEN_ADJUST_PRIVILEGES   |\
    6872                 :                           TOKEN_ADJUST_GROUPS       |\
    6873                 :                           TOKEN_ADJUST_DEFAULT )
    6874                 : 
    6875                 : #if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))
    6876                 : #define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P |\
    6877                 :                           TOKEN_ADJUST_SESSIONID )
    6878                 : #else
    6879                 : #define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P)
    6880                 : #endif
    6881                 : 
    6882                 : #define TOKEN_READ       (STANDARD_RIGHTS_READ      |\
    6883                 :                           TOKEN_QUERY)
    6884                 : 
    6885                 : 
    6886                 : #define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE     |\
    6887                 :                           TOKEN_ADJUST_PRIVILEGES   |\
    6888                 :                           TOKEN_ADJUST_GROUPS       |\
    6889                 :                           TOKEN_ADJUST_DEFAULT)
    6890                 : 
    6891                 : #define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)
    6892                 : 
    6893                 : //
    6894                 : //
    6895                 : // Token Types
    6896                 : //
    6897                 : 
    6898                 : typedef enum _TOKEN_TYPE {
    6899                 :     TokenPrimary = 1,
    6900                 :     TokenImpersonation
    6901                 :     } TOKEN_TYPE;
    6902                 : typedef TOKEN_TYPE *PTOKEN_TYPE;
    6903                 : 
    6904                 : //
    6905                 : // Token elevation values describe the relative strength of a given token.
    6906                 : // A full token is a token with all groups and privileges to which the principal
    6907                 : // is authorized.  A limited token is one with some groups or privileges removed.
    6908                 : //
    6909                 : 
    6910                 : typedef enum _TOKEN_ELEVATION_TYPE {
    6911                 :     TokenElevationTypeDefault = 1,
    6912                 :     TokenElevationTypeFull,
    6913                 :     TokenElevationTypeLimited,
    6914                 : } TOKEN_ELEVATION_TYPE, *PTOKEN_ELEVATION_TYPE;
    6915                 : 
    6916                 : //
    6917                 : // Token Information Classes.
    6918                 : //
    6919                 : 
    6920                 : 
    6921                 : typedef enum _TOKEN_INFORMATION_CLASS {
    6922                 :     TokenUser = 1,
    6923                 :     TokenGroups,
    6924                 :     TokenPrivileges,
    6925                 :     TokenOwner,
    6926                 :     TokenPrimaryGroup,
    6927                 :     TokenDefaultDacl,
    6928                 :     TokenSource,
    6929                 :     TokenType,
    6930                 :     TokenImpersonationLevel,
    6931                 :     TokenStatistics,
    6932                 :     TokenRestrictedSids,
    6933                 :     TokenSessionId,
    6934                 :     TokenGroupsAndPrivileges,
    6935                 :     TokenSessionReference,
    6936                 :     TokenSandBoxInert,
    6937                 :     TokenAuditPolicy,
    6938                 :     TokenOrigin,
    6939                 :     TokenElevationType,
    6940                 :     TokenLinkedToken,
    6941                 :     TokenElevation,
    6942                 :     TokenHasRestrictions,
    6943                 :     TokenAccessInformation,
    6944                 :     TokenVirtualizationAllowed,
    6945                 :     TokenVirtualizationEnabled,
    6946                 :     TokenIntegrityLevel,
    6947                 :     TokenUIAccess,
    6948                 :     TokenMandatoryPolicy,
    6949                 :     TokenLogonSid,
    6950                 :     MaxTokenInfoClass  // MaxTokenInfoClass should always be the last enum
    6951                 : } TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
    6952                 : 
    6953                 : //
    6954                 : // Token information class structures
    6955                 : //
    6956                 : 
    6957                 : 
    6958                 : typedef struct _TOKEN_USER {
    6959                 :     SID_AND_ATTRIBUTES User;
    6960                 : } TOKEN_USER, *PTOKEN_USER;
    6961                 : 
    6962                 : typedef struct _TOKEN_GROUPS {
    6963                 :     DWORD GroupCount;
    6964                 :     SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
    6965                 : } TOKEN_GROUPS, *PTOKEN_GROUPS;
    6966                 : 
    6967                 : 
    6968                 : typedef struct _TOKEN_PRIVILEGES {
    6969                 :     DWORD PrivilegeCount;
    6970                 :     LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
    6971                 : } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
    6972                 : 
    6973                 : 
    6974                 : typedef struct _TOKEN_OWNER {
    6975                 :     PSID Owner;
    6976                 : } TOKEN_OWNER, *PTOKEN_OWNER;
    6977                 : 
    6978                 : 
    6979                 : typedef struct _TOKEN_PRIMARY_GROUP {
    6980                 :     PSID PrimaryGroup;
    6981                 : } TOKEN_PRIMARY_GROUP, *PTOKEN_PRIMARY_GROUP;
    6982                 : 
    6983                 : 
    6984                 : typedef struct _TOKEN_DEFAULT_DACL {
    6985                 :     PACL DefaultDacl;
    6986                 : } TOKEN_DEFAULT_DACL, *PTOKEN_DEFAULT_DACL;
    6987                 : 
    6988                 : typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
    6989                 :     DWORD SidCount;
    6990                 :     DWORD SidLength;
    6991                 :     PSID_AND_ATTRIBUTES Sids;
    6992                 :     DWORD RestrictedSidCount;
    6993                 :     DWORD RestrictedSidLength;
    6994                 :     PSID_AND_ATTRIBUTES RestrictedSids;
    6995                 :     DWORD PrivilegeCount;
    6996                 :     DWORD PrivilegeLength;
    6997                 :     PLUID_AND_ATTRIBUTES Privileges;
    6998                 :     LUID AuthenticationId;
    6999                 : } TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
    7000                 : 
    7001                 : typedef struct _TOKEN_LINKED_TOKEN {
    7002                 :     HANDLE LinkedToken;
    7003                 : } TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN;
    7004                 : 
    7005                 : typedef struct _TOKEN_ELEVATION {
    7006                 :     DWORD TokenIsElevated;
    7007                 : } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
    7008                 : 
    7009                 : typedef struct _TOKEN_MANDATORY_LABEL {
    7010                 :     SID_AND_ATTRIBUTES Label;
    7011                 : } TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
    7012                 : 
    7013                 : #define TOKEN_MANDATORY_POLICY_OFF             0x0
    7014                 : #define TOKEN_MANDATORY_POLICY_NO_WRITE_UP     0x1
    7015                 : #define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN 0x2
    7016                 : 
    7017                 : #define TOKEN_MANDATORY_POLICY_VALID_MASK      (TOKEN_MANDATORY_POLICY_NO_WRITE_UP | \
    7018                 :                                                 TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN)
    7019                 : 
    7020                 : typedef struct _TOKEN_MANDATORY_POLICY {
    7021                 :     DWORD Policy;
    7022                 : } TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY;
    7023                 : 
    7024                 : typedef struct _TOKEN_ACCESS_INFORMATION {
    7025                 :     PSID_AND_ATTRIBUTES_HASH SidHash;
    7026                 :     PSID_AND_ATTRIBUTES_HASH RestrictedSidHash;
    7027                 :     PTOKEN_PRIVILEGES Privileges;
    7028                 :     LUID AuthenticationId;
    7029                 :     TOKEN_TYPE TokenType;
    7030                 :     SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
    7031                 :     TOKEN_MANDATORY_POLICY MandatoryPolicy;
    7032                 :     DWORD Flags;
    7033                 : } TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION;
    7034                 : 
    7035                 : //
    7036                 : // Valid bits for each TOKEN_AUDIT_POLICY policy mask field.
    7037                 : //
    7038                 : 
    7039                 : #define POLICY_AUDIT_SUBCATEGORY_COUNT (50)
    7040                 : 
    7041                 : typedef struct _TOKEN_AUDIT_POLICY {
    7042                 :     BYTE  PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT) >> 1) + 1];
    7043                 : } TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
    7044                 : 
    7045                 : #define TOKEN_SOURCE_LENGTH 8
    7046                 : 
    7047                 : typedef struct _TOKEN_SOURCE {
    7048                 :     CHAR SourceName[TOKEN_SOURCE_LENGTH];
    7049                 :     LUID SourceIdentifier;
    7050                 : } TOKEN_SOURCE, *PTOKEN_SOURCE;
    7051                 : 
    7052                 : 
    7053                 : typedef struct _TOKEN_STATISTICS {
    7054                 :     LUID TokenId;
    7055                 :     LUID AuthenticationId;
    7056                 :     LARGE_INTEGER ExpirationTime;
    7057                 :     TOKEN_TYPE TokenType;
    7058                 :     SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
    7059                 :     DWORD DynamicCharged;
    7060                 :     DWORD DynamicAvailable;
    7061                 :     DWORD GroupCount;
    7062                 :     DWORD PrivilegeCount;
    7063                 :     LUID ModifiedId;
    7064                 : } TOKEN_STATISTICS, *PTOKEN_STATISTICS;
    7065                 : 
    7066                 : 
    7067                 : 
    7068                 : typedef struct _TOKEN_CONTROL {
    7069                 :     LUID TokenId;
    7070                 :     LUID AuthenticationId;
    7071                 :     LUID ModifiedId;
    7072                 :     TOKEN_SOURCE TokenSource;
    7073                 : } TOKEN_CONTROL, *PTOKEN_CONTROL;
    7074                 : 
    7075                 : typedef struct _TOKEN_ORIGIN {
    7076                 :     LUID OriginatingLogonSession ;
    7077                 : } TOKEN_ORIGIN, * PTOKEN_ORIGIN ;
    7078                 : 
    7079                 : typedef enum _MANDATORY_LEVEL {
    7080                 :     MandatoryLevelUntrusted = 0,
    7081                 :     MandatoryLevelLow,
    7082                 :     MandatoryLevelMedium,
    7083                 :     MandatoryLevelHigh,
    7084                 :     MandatoryLevelSystem,
    7085                 :     MandatoryLevelSecureProcess,
    7086                 :     MandatoryLevelCount
    7087                 : } MANDATORY_LEVEL, *PMANDATORY_LEVEL;
    7088                 : 
    7089                 : //
    7090                 : // Security Tracking Mode
    7091                 : //
    7092                 : 
    7093                 : #define SECURITY_DYNAMIC_TRACKING      (TRUE)
    7094                 : #define SECURITY_STATIC_TRACKING       (FALSE)
    7095                 : 
    7096                 : typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
    7097                 :                     * PSECURITY_CONTEXT_TRACKING_MODE;
    7098                 : 
    7099                 : 
    7100                 : 
    7101                 : //
    7102                 : // Quality Of Service
    7103                 : //
    7104                 : 
    7105                 : typedef struct _SECURITY_QUALITY_OF_SERVICE {
    7106                 :     DWORD Length;
    7107                 :     SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
    7108                 :     SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
    7109                 :     BOOLEAN EffectiveOnly;
    7110                 :     } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;
    7111                 : 
    7112                 : 
    7113                 : //
    7114                 : // Used to represent information related to a thread impersonation
    7115                 : //
    7116                 : 
    7117                 : typedef struct _SE_IMPERSONATION_STATE {
    7118                 :     PACCESS_TOKEN Token;
    7119                 :     BOOLEAN CopyOnOpen;
    7120                 :     BOOLEAN EffectiveOnly;
    7121                 :     SECURITY_IMPERSONATION_LEVEL Level;
    7122                 : } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
    7123                 : 
    7124                 : #define DISABLE_MAX_PRIVILEGE   0x1 
    7125                 : #define SANDBOX_INERT           0x2 
    7126                 : #define LUA_TOKEN               0x4 
    7127                 : #define WRITE_RESTRICTED        0x8 
    7128                 : 
    7129                 : typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
    7130                 : 
    7131                 : #define OWNER_SECURITY_INFORMATION       (0x00000001L)
    7132                 : #define GROUP_SECURITY_INFORMATION       (0x00000002L)
    7133                 : #define DACL_SECURITY_INFORMATION        (0x00000004L)
    7134                 : #define SACL_SECURITY_INFORMATION        (0x00000008L)
    7135                 : #define LABEL_SECURITY_INFORMATION       (0x00000010L)
    7136                 : 
    7137                 : #define PROTECTED_DACL_SECURITY_INFORMATION     (0x80000000L)
    7138                 : #define PROTECTED_SACL_SECURITY_INFORMATION     (0x40000000L)
    7139                 : #define UNPROTECTED_DACL_SECURITY_INFORMATION   (0x20000000L)
    7140                 : #define UNPROTECTED_SACL_SECURITY_INFORMATION   (0x10000000L)
    7141                 : 
    7142                 : #define PROCESS_TERMINATE                  (0x0001)  
    7143                 : #define PROCESS_CREATE_THREAD              (0x0002)  
    7144                 : #define PROCESS_SET_SESSIONID              (0x0004)  
    7145                 : #define PROCESS_VM_OPERATION               (0x0008)  
    7146                 : #define PROCESS_VM_READ                    (0x0010)  
    7147                 : #define PROCESS_VM_WRITE                   (0x0020)  
    7148                 : #define PROCESS_DUP_HANDLE                 (0x0040)  
    7149                 : #define PROCESS_CREATE_PROCESS             (0x0080)  
    7150                 : #define PROCESS_SET_QUOTA                  (0x0100)  
    7151                 : #define PROCESS_SET_INFORMATION            (0x0200)  
    7152                 : #define PROCESS_QUERY_INFORMATION          (0x0400)  
    7153                 : #define PROCESS_SUSPEND_RESUME             (0x0800)  
    7154                 : #define PROCESS_QUERY_LIMITED_INFORMATION  (0x1000)  
    7155                 : #if (NTDDI_VERSION >= NTDDI_LONGHORN)
    7156                 : #define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
    7157                 :                                    0xFFFF)
    7158                 : #else
    7159                 : #define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
    7160                 :                                    0xFFF)
    7161                 : #endif
    7162                 : 
    7163                 : #if defined(_WIN64)
    7164                 : 
    7165                 : #define MAXIMUM_PROCESSORS 64
    7166                 : 
    7167                 : #else
    7168                 : 
    7169                 : #define MAXIMUM_PROCESSORS 32
    7170                 : 
    7171                 : #endif
    7172                 : 
    7173                 : #define THREAD_TERMINATE                 (0x0001)  
    7174                 : #define THREAD_SUSPEND_RESUME            (0x0002)  
    7175                 : #define THREAD_GET_CONTEXT               (0x0008)  
    7176                 : #define THREAD_SET_CONTEXT               (0x0010)  
    7177                 : #define THREAD_QUERY_INFORMATION         (0x0040)  
    7178                 : #define THREAD_SET_INFORMATION           (0x0020)  
    7179                 : #define THREAD_SET_THREAD_TOKEN          (0x0080)
    7180                 : #define THREAD_IMPERSONATE               (0x0100)
    7181                 : #define THREAD_DIRECT_IMPERSONATION      (0x0200)
    7182                 : // begin_wdm
    7183                 : #define THREAD_SET_LIMITED_INFORMATION   (0x0400)  // winnt
    7184                 : #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)  // winnt
    7185                 : #if (NTDDI_VERSION >= NTDDI_LONGHORN)
    7186                 : #define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
    7187                 :                                    0xFFFF)
    7188                 : #else
    7189                 : #define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
    7190                 :                                    0x3FF)
    7191                 : #endif
    7192                 : #define JOB_OBJECT_ASSIGN_PROCESS           (0x0001)
    7193                 : #define JOB_OBJECT_SET_ATTRIBUTES           (0x0002)
    7194                 : #define JOB_OBJECT_QUERY                    (0x0004)
    7195                 : #define JOB_OBJECT_TERMINATE                (0x0008)
    7196                 : #define JOB_OBJECT_SET_SECURITY_ATTRIBUTES  (0x0010)
    7197                 : #define JOB_OBJECT_ALL_ACCESS       (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
    7198                 :                                         0x1F )
    7199                 : 
    7200                 : typedef struct _JOB_SET_ARRAY {
    7201                 :     HANDLE JobHandle;   // Handle to job object to insert
    7202                 :     DWORD MemberLevel;  // Level of this job in the set. Must be > 0. Can be sparse.
    7203                 :     DWORD Flags;        // Unused. Must be zero
    7204                 : } JOB_SET_ARRAY, *PJOB_SET_ARRAY;
    7205                 : 
    7206                 : #define FLS_MAXIMUM_AVAILABLE 128   
    7207                 : #define TLS_MINIMUM_AVAILABLE 64    
    7208                 : 
    7209                 : typedef struct _NT_TIB {
    7210                 :     struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
    7211                 :     PVOID StackBase;
    7212                 :     PVOID StackLimit;
    7213                 :     PVOID SubSystemTib;
    7214                 :     union {
    7215                 :         PVOID FiberData;
    7216                 :         DWORD Version;
    7217                 :     };
    7218                 :     PVOID ArbitraryUserPointer;
    7219                 :     struct _NT_TIB *Self;
    7220                 : } NT_TIB;
    7221                 : typedef NT_TIB *PNT_TIB;
    7222                 : 
    7223                 : //
    7224                 : // 32 and 64 bit specific version for wow64 and the debugger
    7225                 : //
    7226                 : typedef struct _NT_TIB32 {
    7227                 :     DWORD ExceptionList;
    7228                 :     DWORD StackBase;
    7229                 :     DWORD StackLimit;
    7230                 :     DWORD SubSystemTib;
    7231                 :     union {
    7232                 :         DWORD FiberData;
    7233                 :         DWORD Version;
    7234                 :     };
    7235                 :     DWORD ArbitraryUserPointer;
    7236                 :     DWORD Self;
    7237                 : } NT_TIB32, *PNT_TIB32;
    7238                 : 
    7239                 : typedef struct _NT_TIB64 {
    7240                 :     DWORD64 ExceptionList;
    7241                 :     DWORD64 StackBase;
    7242                 :     DWORD64 StackLimit;
    7243                 :     DWORD64 SubSystemTib;
    7244                 :     union {
    7245                 :         DWORD64 FiberData;
    7246                 :         DWORD Version;
    7247                 :     };
    7248                 :     DWORD64 ArbitraryUserPointer;
    7249                 :     DWORD64 Self;
    7250                 : } NT_TIB64, *PNT_TIB64;
    7251                 : 
    7252                 : 
    7253                 : 
    7254                 : #define THREAD_BASE_PRIORITY_LOWRT  15  // value that gets a thread to LowRealtime-1
    7255                 : #define THREAD_BASE_PRIORITY_MAX    2   // maximum thread base priority boost
    7256                 : #define THREAD_BASE_PRIORITY_MIN    (-2)  // minimum thread base priority boost
    7257                 : #define THREAD_BASE_PRIORITY_IDLE   (-15) // value that gets a thread to idle
    7258                 : 
    7259                 : 
    7260                 : typedef struct _QUOTA_LIMITS {
    7261                 :     SIZE_T PagedPoolLimit;
    7262                 :     SIZE_T NonPagedPoolLimit;
    7263                 :     SIZE_T MinimumWorkingSetSize;
    7264                 :     SIZE_T MaximumWorkingSetSize;
    7265                 :     SIZE_T PagefileLimit;
    7266                 :     LARGE_INTEGER TimeLimit;
    7267                 : } QUOTA_LIMITS, *PQUOTA_LIMITS;
    7268                 : 
    7269                 : #define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001
    7270                 : #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
    7271                 : #define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004
    7272                 : #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
    7273                 : #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
    7274                 : 
    7275                 : #define PS_RATE_PHASE_BITS  4
    7276                 : #define PS_RATE_PHASE_MASK  ((1UL << PS_RATE_PHASE_BITS) - 1)
    7277                 : 
    7278                 : typedef enum _PS_RATE_PHASE {
    7279                 :     PsRateOneSecond = 0,
    7280                 :     PsRateTwoSecond,
    7281                 :     PsRateThreeSecond,
    7282                 :     PsRateMaxPhase
    7283                 : } PS_RATE_PHASE;
    7284                 : 
    7285                 : typedef union _RATE_QUOTA_LIMIT {
    7286                 :     DWORD RateData;
    7287                 :     struct {
    7288                 :         DWORD RatePhase     : PS_RATE_PHASE_BITS;
    7289                 :         DWORD RatePercent   : 28;
    7290                 :     };
    7291                 : } RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT;
    7292                 : 
    7293                 : #if !defined(SORTPP_PASS) && !defined(MIDL_PASS) && !defined(RC_INVOKED) && defined(_WIN64) && !defined(_X86AMD64_)
    7294                 : C_ASSERT (sizeof (DWORD) * 8 - PS_RATE_PHASE_BITS == 28);
    7295                 : #endif
    7296                 : 
    7297                 : typedef struct _QUOTA_LIMITS_EX {
    7298                 :     SIZE_T PagedPoolLimit;
    7299                 :     SIZE_T NonPagedPoolLimit;
    7300                 :     SIZE_T MinimumWorkingSetSize;
    7301                 :     SIZE_T MaximumWorkingSetSize;
    7302                 :     SIZE_T PagefileLimit;               // Limit expressed in pages
    7303                 :     LARGE_INTEGER TimeLimit;
    7304                 :     SIZE_T WorkingSetLimit;             // Limit expressed in pages
    7305                 :     SIZE_T Reserved2;
    7306                 :     SIZE_T Reserved3;
    7307                 :     SIZE_T Reserved4;
    7308                 :     DWORD  Flags;
    7309                 :     RATE_QUOTA_LIMIT CpuRateLimit;
    7310                 : } QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
    7311                 : 
    7312                 : typedef struct _IO_COUNTERS {
    7313                 :     ULONGLONG  ReadOperationCount;
    7314                 :     ULONGLONG  WriteOperationCount;
    7315                 :     ULONGLONG  OtherOperationCount;
    7316                 :     ULONGLONG ReadTransferCount;
    7317                 :     ULONGLONG WriteTransferCount;
    7318                 :     ULONGLONG OtherTransferCount;
    7319                 : } IO_COUNTERS;
    7320                 : typedef IO_COUNTERS *PIO_COUNTERS;
    7321                 : 
    7322                 : 
    7323                 : typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
    7324                 :     LARGE_INTEGER TotalUserTime;
    7325                 :     LARGE_INTEGER TotalKernelTime;
    7326                 :     LARGE_INTEGER ThisPeriodTotalUserTime;
    7327                 :     LARGE_INTEGER ThisPeriodTotalKernelTime;
    7328                 :     DWORD TotalPageFaultCount;
    7329                 :     DWORD TotalProcesses;
    7330                 :     DWORD ActiveProcesses;
    7331                 :     DWORD TotalTerminatedProcesses;
    7332                 : } JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
    7333                 : 
    7334                 : typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
    7335                 :     LARGE_INTEGER PerProcessUserTimeLimit;
    7336                 :     LARGE_INTEGER PerJobUserTimeLimit;
    7337                 :     DWORD LimitFlags;
    7338                 :     SIZE_T MinimumWorkingSetSize;
    7339                 :     SIZE_T MaximumWorkingSetSize;
    7340                 :     DWORD ActiveProcessLimit;
    7341                 :     ULONG_PTR Affinity;
    7342                 :     DWORD PriorityClass;
    7343                 :     DWORD SchedulingClass;
    7344                 : } JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
    7345                 : 
    7346                 : typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
    7347                 :     JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
    7348                 :     IO_COUNTERS IoInfo;
    7349                 :     SIZE_T ProcessMemoryLimit;
    7350                 :     SIZE_T JobMemoryLimit;
    7351                 :     SIZE_T PeakProcessMemoryUsed;
    7352                 :     SIZE_T PeakJobMemoryUsed;
    7353                 : } JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
    7354                 : 
    7355                 : typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
    7356                 :     DWORD NumberOfAssignedProcesses;
    7357                 :     DWORD NumberOfProcessIdsInList;
    7358                 :     ULONG_PTR ProcessIdList[1];
    7359                 : } JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;
    7360                 : 
    7361                 : typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
    7362                 :     DWORD UIRestrictionsClass;
    7363                 : } JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
    7364                 : 
    7365                 : typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
    7366                 :     DWORD SecurityLimitFlags ;
    7367                 :     HANDLE JobToken ;
    7368                 :     PTOKEN_GROUPS SidsToDisable ;
    7369                 :     PTOKEN_PRIVILEGES PrivilegesToDelete ;
    7370                 :     PTOKEN_GROUPS RestrictedSids ;
    7371                 : } JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;
    7372                 : 
    7373                 : typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
    7374                 :     DWORD EndOfJobTimeAction;
    7375                 : } JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
    7376                 : 
    7377                 : typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
    7378                 :     PVOID CompletionKey;
    7379                 :     HANDLE CompletionPort;
    7380                 : } JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
    7381                 : 
    7382                 : typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
    7383                 :     JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
    7384                 :     IO_COUNTERS IoInfo;
    7385                 : } JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
    7386                 : 
    7387                 : typedef struct _JOBOBJECT_JOBSET_INFORMATION {
    7388                 :     DWORD MemberLevel;
    7389                 : } JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;
    7390                 : 
    7391                 : #define JOB_OBJECT_TERMINATE_AT_END_OF_JOB  0
    7392                 : #define JOB_OBJECT_POST_AT_END_OF_JOB       1
    7393                 : 
    7394                 : //
    7395                 : // Completion Port Messages for job objects
    7396                 : //
    7397                 : // These values are returned via the lpNumberOfBytesTransferred parameter
    7398                 : //
    7399                 : 
    7400                 : #define JOB_OBJECT_MSG_END_OF_JOB_TIME          1
    7401                 : #define JOB_OBJECT_MSG_END_OF_PROCESS_TIME      2
    7402                 : #define JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT     3
    7403                 : #define JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO      4
    7404                 : #define JOB_OBJECT_MSG_NEW_PROCESS              6
    7405                 : #define JOB_OBJECT_MSG_EXIT_PROCESS             7
    7406                 : #define JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS    8
    7407                 : #define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT     9
    7408                 : #define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT         10
    7409                 : 
    7410                 : //
    7411                 : // Basic Limits
    7412                 : //
    7413                 : #define JOB_OBJECT_LIMIT_WORKINGSET                 0x00000001
    7414                 : #define JOB_OBJECT_LIMIT_PROCESS_TIME               0x00000002
    7415                 : #define JOB_OBJECT_LIMIT_JOB_TIME                   0x00000004
    7416                 : #define JOB_OBJECT_LIMIT_ACTIVE_PROCESS             0x00000008
    7417                 : #define JOB_OBJECT_LIMIT_AFFINITY                   0x00000010
    7418                 : #define JOB_OBJECT_LIMIT_PRIORITY_CLASS             0x00000020
    7419                 : #define JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME          0x00000040
    7420                 : #define JOB_OBJECT_LIMIT_SCHEDULING_CLASS           0x00000080
    7421                 : 
    7422                 : //
    7423                 : // Extended Limits
    7424                 : //
    7425                 : #define JOB_OBJECT_LIMIT_PROCESS_MEMORY             0x00000100
    7426                 : #define JOB_OBJECT_LIMIT_JOB_MEMORY                 0x00000200
    7427                 : #define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400
    7428                 : #define JOB_OBJECT_LIMIT_BREAKAWAY_OK               0x00000800
    7429                 : #define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK        0x00001000
    7430                 : #define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE          0x00002000
    7431                 : 
    7432                 : #define JOB_OBJECT_LIMIT_RESERVED2                  0x00004000
    7433                 : #define JOB_OBJECT_LIMIT_RESERVED3                  0x00008000
    7434                 : #define JOB_OBJECT_LIMIT_RESERVED4                  0x00010000
    7435                 : #define JOB_OBJECT_LIMIT_RESERVED5                  0x00020000
    7436                 : #define JOB_OBJECT_LIMIT_RESERVED6                  0x00040000
    7437                 : 
    7438                 : 
    7439                 : #define JOB_OBJECT_LIMIT_VALID_FLAGS            0x0007ffff
    7440                 : 
    7441                 : #define JOB_OBJECT_BASIC_LIMIT_VALID_FLAGS      0x000000ff
    7442                 : #define JOB_OBJECT_EXTENDED_LIMIT_VALID_FLAGS   0x00003fff
    7443                 : #define JOB_OBJECT_RESERVED_LIMIT_VALID_FLAGS   0x0007ffff
    7444                 : 
    7445                 : //
    7446                 : // UI restrictions for jobs
    7447                 : //
    7448                 : 
    7449                 : #define JOB_OBJECT_UILIMIT_NONE             0x00000000
    7450                 : 
    7451                 : #define JOB_OBJECT_UILIMIT_HANDLES          0x00000001
    7452                 : #define JOB_OBJECT_UILIMIT_READCLIPBOARD    0x00000002
    7453                 : #define JOB_OBJECT_UILIMIT_WRITECLIPBOARD   0x00000004
    7454                 : #define JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x00000008
    7455                 : #define JOB_OBJECT_UILIMIT_DISPLAYSETTINGS  0x00000010
    7456                 : #define JOB_OBJECT_UILIMIT_GLOBALATOMS      0x00000020
    7457                 : #define JOB_OBJECT_UILIMIT_DESKTOP          0x00000040
    7458                 : #define JOB_OBJECT_UILIMIT_EXITWINDOWS      0x00000080
    7459                 : 
    7460                 : #define JOB_OBJECT_UILIMIT_ALL              0x000000FF
    7461                 : 
    7462                 : #define JOB_OBJECT_UI_VALID_FLAGS           0x000000FF
    7463                 : 
    7464                 : #define JOB_OBJECT_SECURITY_NO_ADMIN            0x00000001
    7465                 : #define JOB_OBJECT_SECURITY_RESTRICTED_TOKEN    0x00000002
    7466                 : #define JOB_OBJECT_SECURITY_ONLY_TOKEN          0x00000004
    7467                 : #define JOB_OBJECT_SECURITY_FILTER_TOKENS       0x00000008
    7468                 : 
    7469                 : #define JOB_OBJECT_SECURITY_VALID_FLAGS         0x0000000f
    7470                 : 
    7471                 : typedef enum _JOBOBJECTINFOCLASS {
    7472                 :     JobObjectBasicAccountingInformation = 1,
    7473                 :     JobObjectBasicLimitInformation,
    7474                 :     JobObjectBasicProcessIdList,
    7475                 :     JobObjectBasicUIRestrictions,
    7476                 :     JobObjectSecurityLimitInformation,
    7477                 :     JobObjectEndOfJobTimeInformation,
    7478                 :     JobObjectAssociateCompletionPortInformation,
    7479                 :     JobObjectBasicAndIoAccountingInformation,
    7480                 :     JobObjectExtendedLimitInformation,
    7481                 :     JobObjectJobSetInformation,
    7482                 :     MaxJobObjectInfoClass
    7483                 :     } JOBOBJECTINFOCLASS;
    7484                 : //
    7485                 : #define EVENT_MODIFY_STATE      0x0002  
    7486                 : #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) 
    7487                 : #define MUTANT_QUERY_STATE      0x0001
    7488                 : 
    7489                 : #define MUTANT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|\
    7490                 :                           MUTANT_QUERY_STATE)
    7491                 : #define SEMAPHORE_MODIFY_STATE      0x0002  
    7492                 : #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) 
    7493                 : //
    7494                 : // Timer Specific Access Rights.
    7495                 : //
    7496                 : 
    7497                 : #define TIMER_QUERY_STATE       0x0001
    7498                 : #define TIMER_MODIFY_STATE      0x0002
    7499                 : 
    7500                 : #define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|\
    7501                 :                           TIMER_QUERY_STATE|TIMER_MODIFY_STATE)
    7502                 : 
    7503                 : #define TIME_ZONE_ID_UNKNOWN  0
    7504                 : #define TIME_ZONE_ID_STANDARD 1
    7505                 : #define TIME_ZONE_ID_DAYLIGHT 2
    7506                 : 
    7507                 : typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
    7508                 :     RelationProcessorCore,
    7509                 :     RelationNumaNode,
    7510                 :     RelationCache,
    7511                 :     RelationProcessorPackage
    7512                 : } LOGICAL_PROCESSOR_RELATIONSHIP;
    7513                 : 
    7514                 : #define LTP_PC_SMT 0x1
    7515                 : 
    7516                 : typedef enum _PROCESSOR_CACHE_TYPE {
    7517                 :     CacheUnified,
    7518                 :     CacheInstruction,
    7519                 :     CacheData,
    7520                 :     CacheTrace
    7521                 : } PROCESSOR_CACHE_TYPE;
    7522                 : 
    7523                 : #define CACHE_FULLY_ASSOCIATIVE 0xFF
    7524                 : 
    7525                 : typedef struct _CACHE_DESCRIPTOR {
    7526                 :     BYTE   Level;
    7527                 :     BYTE   Associativity;
    7528                 :     WORD   LineSize;
    7529                 :     DWORD  Size;
    7530                 :     PROCESSOR_CACHE_TYPE Type;
    7531                 : } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
    7532                 : 
    7533                 : typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
    7534                 :     ULONG_PTR   ProcessorMask;
    7535                 :     LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
    7536                 :     union {
    7537                 :         struct {
    7538                 :             BYTE  Flags;
    7539                 :         } ProcessorCore;
    7540                 :         struct {
    7541                 :             DWORD NodeNumber;
    7542                 :         } NumaNode;
    7543                 :         CACHE_DESCRIPTOR Cache;
    7544                 :         ULONGLONG  Reserved[2];
    7545                 :     };
    7546                 : } SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
    7547                 : 
    7548                 : 
    7549                 : #define PROCESSOR_INTEL_386     386
    7550                 : #define PROCESSOR_INTEL_486     486
    7551                 : #define PROCESSOR_INTEL_PENTIUM 586
    7552                 : #define PROCESSOR_INTEL_IA64    2200
    7553                 : #define PROCESSOR_AMD_X8664     8664
    7554                 : #define PROCESSOR_MIPS_R4000    4000    // incl R4101 & R3910 for Windows CE
    7555                 : #define PROCESSOR_ALPHA_21064   21064
    7556                 : #define PROCESSOR_PPC_601       601
    7557                 : #define PROCESSOR_PPC_603       603
    7558                 : #define PROCESSOR_PPC_604       604
    7559                 : #define PROCESSOR_PPC_620       620
    7560                 : #define PROCESSOR_HITACHI_SH3   10003   // Windows CE
    7561                 : #define PROCESSOR_HITACHI_SH3E  10004   // Windows CE
    7562                 : #define PROCESSOR_HITACHI_SH4   10005   // Windows CE
    7563                 : #define PROCESSOR_MOTOROLA_821  821     // Windows CE
    7564                 : #define PROCESSOR_SHx_SH3       103     // Windows CE
    7565                 : #define PROCESSOR_SHx_SH4       104     // Windows CE
    7566                 : #define PROCESSOR_STRONGARM     2577    // Windows CE - 0xA11
    7567                 : #define PROCESSOR_ARM720        1824    // Windows CE - 0x720
    7568                 : #define PROCESSOR_ARM820        2080    // Windows CE - 0x820
    7569                 : #define PROCESSOR_ARM920        2336    // Windows CE - 0x920
    7570                 : #define PROCESSOR_ARM_7TDMI     70001   // Windows CE
    7571                 : #define PROCESSOR_OPTIL         0x494f  // MSIL
    7572                 : 
    7573                 : #define PROCESSOR_ARCHITECTURE_INTEL            0
    7574                 : #define PROCESSOR_ARCHITECTURE_MIPS             1
    7575                 : #define PROCESSOR_ARCHITECTURE_ALPHA            2
    7576                 : #define PROCESSOR_ARCHITECTURE_PPC              3
    7577                 : #define PROCESSOR_ARCHITECTURE_SHX              4
    7578                 : #define PROCESSOR_ARCHITECTURE_ARM              5
    7579                 : #define PROCESSOR_ARCHITECTURE_IA64             6
    7580                 : #define PROCESSOR_ARCHITECTURE_ALPHA64          7
    7581                 : #define PROCESSOR_ARCHITECTURE_MSIL             8
    7582                 : #define PROCESSOR_ARCHITECTURE_AMD64            9
    7583                 : #define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64    10
    7584                 : 
    7585                 : #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
    7586                 : 
    7587                 : #define PF_FLOATING_POINT_PRECISION_ERRATA  0   
    7588                 : #define PF_FLOATING_POINT_EMULATED          1   
    7589                 : #define PF_COMPARE_EXCHANGE_DOUBLE          2   
    7590                 : #define PF_MMX_INSTRUCTIONS_AVAILABLE       3   
    7591                 : #define PF_PPC_MOVEMEM_64BIT_OK             4   
    7592                 : #define PF_ALPHA_BYTE_INSTRUCTIONS          5   
    7593                 : #define PF_XMMI_INSTRUCTIONS_AVAILABLE      6   
    7594                 : #define PF_3DNOW_INSTRUCTIONS_AVAILABLE     7   
    7595                 : #define PF_RDTSC_INSTRUCTION_AVAILABLE      8   
    7596                 : #define PF_PAE_ENABLED                      9   
    7597                 : #define PF_XMMI64_INSTRUCTIONS_AVAILABLE   10   
    7598                 : #define PF_SSE_DAZ_MODE_AVAILABLE          11   
    7599                 : #define PF_NX_ENABLED                      12   
    7600                 : #define PF_SSE3_INSTRUCTIONS_AVAILABLE     13   
    7601                 : #define PF_COMPARE_EXCHANGE128             14   
    7602                 : #define PF_COMPARE64_EXCHANGE128           15   
    7603                 : #define PF_CHANNELS_ENABLED                16   
    7604                 : 
    7605                 : typedef struct _MEMORY_BASIC_INFORMATION {
    7606                 :     PVOID BaseAddress;
    7607                 :     PVOID AllocationBase;
    7608                 :     DWORD AllocationProtect;
    7609                 :     SIZE_T RegionSize;
    7610                 :     DWORD State;
    7611                 :     DWORD Protect;
    7612                 :     DWORD Type;
    7613                 : } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
    7614                 : 
    7615                 : typedef struct _MEMORY_BASIC_INFORMATION32 {
    7616                 :     DWORD BaseAddress;
    7617                 :     DWORD AllocationBase;
    7618                 :     DWORD AllocationProtect;
    7619                 :     DWORD RegionSize;
    7620                 :     DWORD State;
    7621                 :     DWORD Protect;
    7622                 :     DWORD Type;
    7623                 : } MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;
    7624                 : 
    7625                 : typedef struct DECLSPEC_ALIGN(16) _MEMORY_BASIC_INFORMATION64 {
    7626                 :     ULONGLONG BaseAddress;
    7627                 :     ULONGLONG AllocationBase;
    7628                 :     DWORD     AllocationProtect;
    7629                 :     DWORD     __alignment1;
    7630                 :     ULONGLONG RegionSize;
    7631                 :     DWORD     State;
    7632                 :     DWORD     Protect;
    7633                 :     DWORD     Type;
    7634                 :     DWORD     __alignment2;
    7635                 : } MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;
    7636                 : 
    7637                 : #define SECTION_QUERY                0x0001
    7638                 : #define SECTION_MAP_WRITE            0x0002
    7639                 : #define SECTION_MAP_READ             0x0004
    7640                 : #define SECTION_MAP_EXECUTE          0x0008
    7641                 : #define SECTION_EXTEND_SIZE          0x0010
    7642                 : #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 // not included in SECTION_ALL_ACCESS
    7643                 : 
    7644                 : #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
    7645                 :                             SECTION_MAP_WRITE |      \
    7646                 :                             SECTION_MAP_READ |       \
    7647                 :                             SECTION_MAP_EXECUTE |    \
    7648                 :                             SECTION_EXTEND_SIZE)
    7649                 : 
    7650                 : #define SESSION_QUERY_ACCESS  0x0001
    7651                 : #define SESSION_MODIFY_ACCESS 0x0002
    7652                 : 
    7653                 : #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |  \
    7654                 :                             SESSION_QUERY_ACCESS |             \
    7655                 :                             SESSION_MODIFY_ACCESS)
    7656                 : 
    7657                 : #define PAGE_NOACCESS          0x01     
    7658                 : #define PAGE_READONLY          0x02     
    7659                 : #define PAGE_READWRITE         0x04     
    7660                 : #define PAGE_WRITECOPY         0x08     
    7661                 : #define PAGE_EXECUTE           0x10     
    7662                 : #define PAGE_EXECUTE_READ      0x20     
    7663                 : #define PAGE_EXECUTE_READWRITE 0x40     
    7664                 : #define PAGE_EXECUTE_WRITECOPY 0x80     
    7665                 : #define PAGE_GUARD            0x100     
    7666                 : #define PAGE_NOCACHE          0x200     
    7667                 : #define PAGE_WRITECOMBINE     0x400     
    7668                 : #define MEM_COMMIT           0x1000     
    7669                 : #define MEM_RESERVE          0x2000     
    7670                 : #define MEM_DECOMMIT         0x4000     
    7671                 : #define MEM_RELEASE          0x8000     
    7672                 : #define MEM_FREE            0x10000     
    7673                 : #define MEM_PRIVATE         0x20000     
    7674                 : #define MEM_MAPPED          0x40000     
    7675                 : #define MEM_RESET           0x80000     
    7676                 : #define MEM_TOP_DOWN       0x100000     
    7677                 : #define MEM_WRITE_WATCH    0x200000     
    7678                 : #define MEM_PHYSICAL       0x400000     
    7679                 : #define MEM_ROTATE         0x800000     
    7680                 : #define MEM_LARGE_PAGES  0x20000000     
    7681                 : #define MEM_4MB_PAGES    0x80000000     
    7682                 : #define SEC_FILE           0x800000     
    7683                 : #define SEC_IMAGE         0x1000000     
    7684                 : #define SEC_PROTECTED_IMAGE  0x2000000     
    7685                 : #define SEC_RESERVE       0x4000000     
    7686                 : #define SEC_COMMIT        0x8000000     
    7687                 : #define SEC_NOCACHE      0x10000000     
    7688                 : #define SEC_WRITECOMBINE 0x40000000     
    7689                 : #define SEC_LARGE_PAGES  0x80000000     
    7690                 : #define MEM_IMAGE         SEC_IMAGE     
    7691                 : #define WRITE_WATCH_FLAG_RESET 0x01     
    7692                 : 
    7693                 : //
    7694                 : // Define access rights to files and directories
    7695                 : //
    7696                 : 
    7697                 : //
    7698                 : // The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in
    7699                 : // devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these
    7700                 : // constants *MUST* always be in sync.
    7701                 : // The values are redefined in devioctl.h because they must be available to
    7702                 : // both DOS and NT.
    7703                 : //
    7704                 : 
    7705                 : #define FILE_READ_DATA            ( 0x0001 )    // file & pipe
    7706                 : #define FILE_LIST_DIRECTORY       ( 0x0001 )    // directory
    7707                 : 
    7708                 : #define FILE_WRITE_DATA           ( 0x0002 )    // file & pipe
    7709                 : #define FILE_ADD_FILE             ( 0x0002 )    // directory
    7710                 : 
    7711                 : #define FILE_APPEND_DATA          ( 0x0004 )    // file
    7712                 : #define FILE_ADD_SUBDIRECTORY     ( 0x0004 )    // directory
    7713                 : #define FILE_CREATE_PIPE_INSTANCE ( 0x0004 )    // named pipe
    7714                 : 
    7715                 : 
    7716                 : #define FILE_READ_EA              ( 0x0008 )    // file & directory
    7717                 : 
    7718                 : #define FILE_WRITE_EA             ( 0x0010 )    // file & directory
    7719                 : 
    7720                 : #define FILE_EXECUTE              ( 0x0020 )    // file
    7721                 : #define FILE_TRAVERSE             ( 0x0020 )    // directory
    7722                 : 
    7723                 : #define FILE_DELETE_CHILD         ( 0x0040 )    // directory
    7724                 : 
    7725                 : #define FILE_READ_ATTRIBUTES      ( 0x0080 )    // all
    7726                 : 
    7727                 : #define FILE_WRITE_ATTRIBUTES     ( 0x0100 )    // all
    7728                 : 
    7729                 : #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
    7730                 : 
    7731                 : #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ     |\
    7732                 :                                    FILE_READ_DATA           |\
    7733                 :                                    FILE_READ_ATTRIBUTES     |\
    7734                 :                                    FILE_READ_EA             |\
    7735                 :                                    SYNCHRONIZE)
    7736                 : 
    7737                 : 
    7738                 : #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\
    7739                 :                                    FILE_WRITE_DATA          |\
    7740                 :                                    FILE_WRITE_ATTRIBUTES    |\
    7741                 :                                    FILE_WRITE_EA            |\
    7742                 :                                    FILE_APPEND_DATA         |\
    7743                 :                                    SYNCHRONIZE)
    7744                 : 
    7745                 : 
    7746                 : #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE  |\
    7747                 :                                    FILE_READ_ATTRIBUTES     |\
    7748                 :                                    FILE_EXECUTE             |\
    7749                 :                                    SYNCHRONIZE)
    7750                 : 
    7751                 : #define FILE_SHARE_READ                 0x00000001  
    7752                 : #define FILE_SHARE_WRITE                0x00000002  
    7753                 : #define FILE_SHARE_DELETE               0x00000004  
    7754                 : #define FILE_ATTRIBUTE_READONLY             0x00000001  
    7755                 : #define FILE_ATTRIBUTE_HIDDEN               0x00000002  
    7756                 : #define FILE_ATTRIBUTE_SYSTEM               0x00000004  
    7757                 : #define FILE_ATTRIBUTE_DIRECTORY            0x00000010  
    7758                 : #define FILE_ATTRIBUTE_ARCHIVE              0x00000020  
    7759                 : #define FILE_ATTRIBUTE_DEVICE               0x00000040  
    7760                 : #define FILE_ATTRIBUTE_NORMAL               0x00000080  
    7761                 : #define FILE_ATTRIBUTE_TEMPORARY            0x00000100  
    7762                 : #define FILE_ATTRIBUTE_SPARSE_FILE          0x00000200  
    7763                 : #define FILE_ATTRIBUTE_REPARSE_POINT        0x00000400  
    7764                 : #define FILE_ATTRIBUTE_COMPRESSED           0x00000800  
    7765                 : #define FILE_ATTRIBUTE_OFFLINE              0x00001000  
    7766                 : #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000  
    7767                 : #define FILE_ATTRIBUTE_ENCRYPTED            0x00004000  
    7768                 : #define FILE_ATTRIBUTE_VIRTUAL              0x00010000  
    7769                 : #define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001   
    7770                 : #define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002   
    7771                 : #define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004   
    7772                 : #define FILE_NOTIFY_CHANGE_SIZE         0x00000008   
    7773                 : #define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010   
    7774                 : #define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020   
    7775                 : #define FILE_NOTIFY_CHANGE_CREATION     0x00000040   
    7776                 : #define FILE_NOTIFY_CHANGE_SECURITY     0x00000100   
    7777                 : #define FILE_ACTION_ADDED                   0x00000001   
    7778                 : #define FILE_ACTION_REMOVED                 0x00000002   
    7779                 : #define FILE_ACTION_MODIFIED                0x00000003   
    7780                 : #define FILE_ACTION_RENAMED_OLD_NAME        0x00000004   
    7781                 : #define FILE_ACTION_RENAMED_NEW_NAME        0x00000005   
    7782                 : #define MAILSLOT_NO_MESSAGE             ((DWORD)-1) 
    7783                 : #define MAILSLOT_WAIT_FOREVER           ((DWORD)-1) 
    7784                 : #define FILE_CASE_SENSITIVE_SEARCH      0x00000001  
    7785                 : #define FILE_CASE_PRESERVED_NAMES       0x00000002  
    7786                 : #define FILE_UNICODE_ON_DISK            0x00000004  
    7787                 : #define FILE_PERSISTENT_ACLS            0x00000008  
    7788                 : #define FILE_FILE_COMPRESSION           0x00000010  
    7789                 : #define FILE_VOLUME_QUOTAS              0x00000020  
    7790                 : #define FILE_SUPPORTS_SPARSE_FILES      0x00000040  
    7791                 : #define FILE_SUPPORTS_REPARSE_POINTS    0x00000080  
    7792                 : #define FILE_SUPPORTS_REMOTE_STORAGE    0x00000100  
    7793                 : #define FILE_VOLUME_IS_COMPRESSED       0x00008000  
    7794                 : #define FILE_SUPPORTS_OBJECT_IDS        0x00010000  
    7795                 : #define FILE_SUPPORTS_ENCRYPTION        0x00020000  
    7796                 : #define FILE_NAMED_STREAMS              0x00040000  
    7797                 : #define FILE_READ_ONLY_VOLUME           0x00080000  
    7798                 : #define FILE_SEQUENTIAL_WRITE_ONCE      0x00100000  
    7799                 : #define FILE_SUPPORTS_TRANSACTIONS      0x00200000  
    7800                 : 
    7801                 : //
    7802                 : // Define the file notification information structure
    7803                 : //
    7804                 : 
    7805                 : typedef struct _FILE_NOTIFY_INFORMATION {
    7806                 :     DWORD NextEntryOffset;
    7807                 :     DWORD Action;
    7808                 :     DWORD FileNameLength;
    7809                 :     WCHAR FileName[1];
    7810                 : } FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
    7811                 : 
    7812                 : 
    7813                 : //
    7814                 : // Define segement buffer structure for scatter/gather read/write.
    7815                 : //
    7816                 : 
    7817                 : typedef union _FILE_SEGMENT_ELEMENT {
    7818                 :     PVOID64 Buffer;
    7819                 :     ULONGLONG Alignment;
    7820                 : }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
    7821                 : 
    7822                 : //
    7823                 : // The reparse GUID structure is used by all 3rd party layered drivers to
    7824                 : // store data in a reparse point. For non-Microsoft tags, The GUID field
    7825                 : // cannot be GUID_NULL.
    7826                 : // The constraints on reparse tags are defined below.
    7827                 : // Microsoft tags can also be used with this format of the reparse point buffer.
    7828                 : //
    7829                 : 
    7830                 : typedef struct _REPARSE_GUID_DATA_BUFFER {
    7831                 :     DWORD  ReparseTag;
    7832                 :     WORD   ReparseDataLength;
    7833                 :     WORD   Reserved;
    7834                 :     GUID   ReparseGuid;
    7835                 :     struct {
    7836                 :         BYTE   DataBuffer[1];
    7837                 :     } GenericReparseBuffer;
    7838                 : } REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
    7839                 : 
    7840                 : #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
    7841                 : 
    7842                 : 
    7843                 : 
    7844                 : //
    7845                 : // Maximum allowed size of the reparse data.
    7846                 : //
    7847                 : 
    7848                 : #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE      ( 16 * 1024 )
    7849                 : 
    7850                 : //
    7851                 : // Predefined reparse tags.
    7852                 : // These tags need to avoid conflicting with IO_REMOUNT defined in ntos\inc\io.h
    7853                 : //
    7854                 : 
    7855                 : #define IO_REPARSE_TAG_RESERVED_ZERO             (0)
    7856                 : #define IO_REPARSE_TAG_RESERVED_ONE              (1)
    7857                 : 
    7858                 : //
    7859                 : // The value of the following constant needs to satisfy the following conditions:
    7860                 : //  (1) Be at least as large as the largest of the reserved tags.
    7861                 : //  (2) Be strictly smaller than all the tags in use.
    7862                 : //
    7863                 : 
    7864                 : #define IO_REPARSE_TAG_RESERVED_RANGE            IO_REPARSE_TAG_RESERVED_ONE
    7865                 : 
    7866                 : //
    7867                 : // The reparse tags are a DWORD. The 32 bits are laid out as follows:
    7868                 : //
    7869                 : //   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    7870                 : //   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
    7871                 : //  +-+-+-+-+-----------------------+-------------------------------+
    7872                 : //  |M|R|N|R|     Reserved bits     |       Reparse Tag Value       |
    7873                 : //  +-+-+-+-+-----------------------+-------------------------------+
    7874                 : //
    7875                 : // M is the Microsoft bit. When set to 1, it denotes a tag owned by Microsoft.
    7876                 : //   All ISVs must use a tag with a 0 in this position.
    7877                 : //   Note: If a Microsoft tag is used by non-Microsoft software, the
    7878                 : //   behavior is not defined.
    7879                 : //
    7880                 : // R is reserved.  Must be zero for non-Microsoft tags.
    7881                 : //
    7882                 : // N is name surrogate. When set to 1, the file represents another named
    7883                 : //   entity in the system.
    7884                 : //
    7885                 : // The M and N bits are OR-able.
    7886                 : // The following macros check for the M and N bit values:
    7887                 : //
    7888                 : 
    7889                 : //
    7890                 : // Macro to determine whether a reparse point tag corresponds to a tag
    7891                 : // owned by Microsoft.
    7892                 : //
    7893                 : 
    7894                 : #define IsReparseTagMicrosoft(_tag) (              \
    7895                 :                            ((_tag) & 0x80000000)   \
    7896                 :                            )
    7897                 : 
    7898                 : //
    7899                 : // Macro to determine whether a reparse point tag is a name surrogate
    7900                 : //
    7901                 : 
    7902                 : #define IsReparseTagNameSurrogate(_tag) (          \
    7903                 :                            ((_tag) & 0x20000000)   \
    7904                 :                            )
    7905                 : 
    7906                 : #define IO_REPARSE_TAG_MOUNT_POINT              (0xA0000003L)       
    7907                 : #define IO_REPARSE_TAG_HSM                      (0xC0000004L)       
    7908                 : #define IO_REPARSE_TAG_SIS                      (0x80000007L)       
    7909                 : #define IO_REPARSE_TAG_DFS                      (0x8000000AL)       
    7910                 : #define IO_REPARSE_TAG_SYMLINK                  (0xA000000CL)       
    7911                 : #define IO_REPARSE_TAG_DFSR                     (0x80000012L)       
    7912                 : 
    7913                 : //
    7914                 : // I/O Completion Specific Access Rights.
    7915                 : //
    7916                 : 
    7917                 : #define IO_COMPLETION_MODIFY_STATE  0x0002  
    7918                 : #define IO_COMPLETION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) 
    7919                 : 
    7920                 : //
    7921                 : // Object Manager Symbolic Link Specific Access Rights.
    7922                 : //
    7923                 : 
    7924                 : #define DUPLICATE_CLOSE_SOURCE      0x00000001  
    7925                 : #define DUPLICATE_SAME_ACCESS       0x00000002  
    7926                 : 
    7927                 : //
    7928                 : // =========================================
    7929                 : // Define GUIDs which represent well-known power schemes
    7930                 : // =========================================
    7931                 : //
    7932                 : 
    7933                 : //
    7934                 : // Maximum Power Savings - indicates that very aggressive power savings measures will be used to help
    7935                 : //                         stretch battery life.
    7936                 : //
    7937                 : // {a1841308-3541-4fab-bc81-f71556f20b4a}
    7938                 : //
    7939                 : DEFINE_GUID( GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A );
    7940                 : 
    7941                 : //
    7942                 : // No Power Savings - indicates that almost no power savings measures will be used.
    7943                 : //
    7944                 : // {8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c}
    7945                 : //
    7946                 : DEFINE_GUID( GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C );
    7947                 : 
    7948                 : //
    7949                 : // Typical Power Savings - indicates that fairly aggressive power savings measures will be used.
    7950                 : //
    7951                 : // {381b4222-f694-41f0-9685-ff5bb260df2e}
    7952                 : //
    7953                 : DEFINE_GUID( GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E );
    7954                 : 
    7955                 : //
    7956                 : // This is a special GUID that represents "no subgroup" of settings.  That is, it indicates
    7957                 : // that settings that are in the root of the power policy hierarchy as opposed to settings
    7958                 : // that are buried under a subgroup of settings.  This should be used when querying for
    7959                 : // power settings that may not fall into a subgroup.
    7960                 : //
    7961                 : DEFINE_GUID( NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94 );
    7962                 : 
    7963                 : //
    7964                 : // This is a special GUID that represents "every power scheme".  That is, it indicates
    7965                 : // that any write to this power scheme should be reflected to every scheme present.
    7966                 : // This allows users to write a single setting once and have it apply to all schemes.  They
    7967                 : // can then apply custom settings to specific power schemes that they care about.
    7968                 : //
    7969                 : DEFINE_GUID( ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0 );
    7970                 : 
    7971                 : //
    7972                 : // This is a special GUID that represents a 'personality' that each power scheme will have.
    7973                 : // In other words, each power scheme will have this key indicating "I'm most like *this* base
    7974                 : // power scheme."  This individual setting will have one of three settings:
    7975                 : // GUID_MAX_POWER_SAVINGS
    7976                 : // GUID_MIN_POWER_SAVINGS
    7977                 : // GUID_TYPICAL_POWER_SAVINGS
    7978                 : //
    7979                 : // This allows several features:
    7980                 : // 1. Drivers and applications can register for notification of this GUID.  So when this power
    7981                 : //    scheme is activiated, this GUID's setting will be sent across the system and drivers/applications
    7982                 : //    can see "GUID_MAX_POWER_SAVINGS" which will tell them in a generic fashion "get real aggressive
    7983                 : //    about conserving power".
    7984                 : // 2. UserB may install a driver or application which creates power settings, and UserB may modify
    7985                 : //    those power settings.  Now UserA logs in.  How does he see those settings?  They simply don't
    7986                 : //    exist in his private power key.  Well they do exist over in the system power key.  When we
    7987                 : //    enumerate all the power settings in this system power key and don't find a corresponding entry
    7988                 : //    in the user's private power key, then we can go look at this "personality" key in the users
    7989                 : //    power scheme.  We can then go get a default value for the power setting, depending on which
    7990                 : //    "personality" power scheme is being operated on.  Here's an example:
    7991                 : //    A. UserB installs an application that creates a power setting Seetting1
    7992                 : //    B. UserB changes Setting1 to have a value of 50 because that's one of the possible settings
    7993                 : //       available for setting1.
    7994                 : //    C. UserB logs out
    7995                 : //    D. UserA logs in and his active power scheme is some custom scheme that was derived from
    7996                 : //       the GUID_TYPICAL_POWER_SAVINGS.  But remember that UserA has no setting1 in his 
    7997                 : //       private power key.
    7998                 : //    E. When activating UserA's selected power scheme, all power settings in the system power key will
    7999                 : //       be enumerated (including Setting1).
    8000                 : //    F. The power manager will see that UserA has no Setting1 power setting in his private power scheme.
    8001                 : //    G. The power manager will query UserA's power scheme for its personality and retrieve
    8002                 : //       GUID_TYPICAL_POWER_SAVINGS.
    8003                 : //    H. The power manager then looks in Setting1 in the system power key and looks in its set of default
    8004                 : //       values for the corresponding value for GUID_TYPICAL_POWER_SAVINGS power schemes.
    8005                 : //    I. This derived power setting is applied.
    8006                 : DEFINE_GUID( GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7 );
    8007                 : 
    8008                 : //
    8009                 : // Define a special GUID which will be used to define the active power scheme.
    8010                 : // User will register for this power setting GUID, and when the active power
    8011                 : // scheme changes, they'll get a callback where the payload is the GUID
    8012                 : // representing the active powerscheme.
    8013                 : // ( 31F9F286-5084-42FE-B720-2B0264993763 }
    8014                 : //
    8015                 : DEFINE_GUID( GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63 );
    8016                 : 
    8017                 : //
    8018                 : // =========================================
    8019                 : // Define GUIDs which represent well-known power settings
    8020                 : // =========================================
    8021                 : //
    8022                 : 
    8023                 : // Video settings
    8024                 : // --------------
    8025                 : //
    8026                 : // Specifies the subgroup which will contain all of the video
    8027                 : // settings for a single policy.
    8028                 : //
    8029                 : DEFINE_GUID( GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99 );
    8030                 : 
    8031                 : //
    8032                 : // Specifies (in seconds) how long we wait after the last user input has been
    8033                 : // recieved before we power off the video.
    8034                 : //
    8035                 : DEFINE_GUID( GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E );
    8036                 : 
    8037                 : //
    8038                 : // Specifies if the operating system should use adaptive timers (based on
    8039                 : // previous behavior) to power down the video,
    8040                 : //
    8041                 : DEFINE_GUID( GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B );
    8042                 : 
    8043                 : //
    8044                 : // Specifies if the monitor is currently being powered or not.
    8045                 : // 02731015-4510-4526-99E6-E5A17EBD1AEA
    8046                 : //
    8047                 : DEFINE_GUID( GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA );
    8048                 : 
    8049                 : 
    8050                 : 
    8051                 : // Harddisk settings
    8052                 : // -----------------
    8053                 : //
    8054                 : // Specifies the subgroup which will contain all of the harddisk
    8055                 : // settings for a single policy.
    8056                 : //
    8057                 : DEFINE_GUID( GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42 );
    8058                 : 
    8059                 : //
    8060                 : // Specifies (in seconds) how long we wait after the last disk access
    8061                 : // before we power off the disk.
    8062                 : //
    8063                 : DEFINE_GUID( GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E );
    8064                 : 
    8065                 : //
    8066                 : // Specifies if the operating system should use adaptive timers (based on
    8067                 : // previous behavior) to power down the disk,
    8068                 : //
    8069                 : DEFINE_GUID( GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67 );
    8070                 : 
    8071                 : 
    8072                 : 
    8073                 : 
    8074                 : // System sleep settings
    8075                 : // ---------------------
    8076                 : //
    8077                 : // Specifies the subgroup which will contain all of the sleep
    8078                 : // settings for a single policy.
    8079                 : // { 238C9FA8-0AAD-41ED-83F4-97BE242C8F20 }
    8080                 : //
    8081                 : DEFINE_GUID( GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20 );
    8082                 : 
    8083                 : //
    8084                 : // Specifies an idle treshold percentage (0-100). The system must be this idle
    8085                 : // over a period of time in order to idle to sleep.
    8086                 : //
    8087                 : DEFINE_GUID( GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70 );
    8088                 :                                   
    8089                 : //
    8090                 : // Specifies (in seconds) how long we wait after the system is deemed
    8091                 : // "idle" before moving to standby (S1, S2 or S3).
    8092                 : //
    8093                 : DEFINE_GUID( GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA );
    8094                 : 
    8095                 : //
    8096                 : // Specifies (in seconds) how long we wait after the system is deemed
    8097                 : // "idle" before moving to hibernate (S4).
    8098                 : //
    8099                 : DEFINE_GUID( GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64 );
    8100                 : 
    8101                 : //
    8102                 : // Specifies whether or not Fast S4 should be enabled if the system supports it
    8103                 : // 94AC6D29-73CE-41A6-809F-6363BA21B47E
    8104                 : //
    8105                 : DEFINE_GUID( GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E );
    8106                 : 
    8107                 : //
    8108                 : // Define a GUID for controlling the criticality of sleep state transitions.
    8109                 : // Critical sleep transitions do not query applications, services or drivers
    8110                 : // before transitioning the platform to a sleep state.
    8111                 : //
    8112                 : // {B7A27025-E569-46c2-A504-2B96CAD225A1}
    8113                 : //
    8114                 : DEFINE_GUID( GUID_CRITICAL_POWER_TRANSITION,  0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
    8115                 : 
    8116                 : //
    8117                 : // Specifies if the system is entering or exiting 'away mode'.
    8118                 : // 98A7F580-01F7-48AA-9C0F-44352C29E5C0
    8119                 : //
    8120                 : DEFINE_GUID( GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0 );
    8121                 : 
    8122                 : // Specify whether away mode is allowed 
    8123                 : //
    8124                 : // {25DFA149-5DD1-4736-B5AB-E8A37B5B8187}
    8125                 : //
    8126                 : DEFINE_GUID( GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87 );
    8127                 : 
    8128                 : //
    8129                 : // Defines a guid for enabling/disabling standby (S1-S3) states. This does not
    8130                 : // affect hibernation (S4).
    8131                 : //
    8132                 : // {abfc2519-3608-4c2a-94ea-171b0ed546ab}
    8133                 : //
    8134                 : DEFINE_GUID( GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab );
    8135                 : 
    8136                 : //
    8137                 : // Defines a guid for enabling/disabling the ability to wake via RTC.
    8138                 : //
    8139                 : // {BD3B718A-0680-4D9D-8AB2-E1D2B4AC806D}
    8140                 : //
    8141                 : DEFINE_GUID( GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D );
    8142                 : 
    8143                 : // System button actions
    8144                 : // ---------------------
    8145                 : //
    8146                 : //
    8147                 : // Specifies the subgroup which will contain all of the system button
    8148                 : // settings for a single policy.
    8149                 : //
    8150                 : DEFINE_GUID( GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47 );
    8151                 : 
    8152                 : // Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to
    8153                 : // take when the system power button is pressed.
    8154                 : //
    8155                 : DEFINE_GUID( GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80 );
    8156                 : DEFINE_GUID( GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78 );
    8157                 : 
    8158                 : //
    8159                 : // Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to
    8160                 : // take when the system sleep button is pressed.
    8161                 : //
    8162                 : DEFINE_GUID( GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB );
    8163                 : DEFINE_GUID( GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93 );
    8164                 : 
    8165                 : //
    8166                 : // Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to
    8167                 : // take when the system sleep button is pressed.
    8168                 : // { A7066653-8D6C-40A8-910E-A1F54B84C7E5 }
    8169                 : //
    8170                 : DEFINE_GUID( GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5 );
    8171                 : 
    8172                 : //
    8173                 : // Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to
    8174                 : // take when the system lid is closed.
    8175                 : //
    8176                 : DEFINE_GUID( GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36 );
    8177                 : DEFINE_GUID( GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B );
    8178                 : DEFINE_GUID( GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4 );
    8179                 : 
    8180                 : 
    8181                 : // Battery Discharge Settings
    8182                 : // --------------------------
    8183                 : //
    8184                 : // Specifies the subgroup which will contain all of the battery discharge
    8185                 : // settings for a single policy.
    8186                 : //
    8187                 : DEFINE_GUID( GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F );
    8188                 : 
    8189                 : //
    8190                 : // 4 battery discharge alarm settings.
    8191                 : //
    8192                 : // GUID_BATTERY_DISCHARGE_ACTION_x - This is the action to take.  It is a value
    8193                 : //                                   of type POWER_ACTION
    8194                 : // GUID_BATTERY_DISCHARGE_LEVEL_x  - This is the battery level (%)
    8195                 : // GUID_BATTERY_DISCHARGE_FLAGS_x  - Flags defined below:
    8196                 : //                                   POWER_ACTION_POLICY->EventCode flags
    8197                 : //                                   BATTERY_DISCHARGE_FLAGS_EVENTCODE_MASK
    8198                 : //                                   BATTERY_DISCHARGE_FLAGS_ENABLE
    8199                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46 );
    8200                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69 );
    8201                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f );
    8202                 : 
    8203                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06 );
    8204                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A );
    8205                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58 );
    8206                 : 
    8207                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4 );
    8208                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA );
    8209                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82 );
    8210                 : 
    8211                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8 );
    8212                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65 );
    8213                 : DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3 );
    8214                 : 
    8215                 : // Processor power settings
    8216                 : // ------------------------
    8217                 : //
    8218                 : 
    8219                 : // Specifies the subgroup which will contain all of the processor
    8220                 : // settings for a single policy.
    8221                 : //
    8222                 : DEFINE_GUID( GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00 );
    8223                 : 
    8224                 : 
    8225                 : DEFINE_GUID( GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36 );
    8226                 : 
    8227                 : //
    8228                 : // Specifies a percentage (between 0 and 100) that the processor frequency
    8229                 : // should never go above.  For example, if this value is set to 80, then
    8230                 : // the processor frequency will never be throttled above 80 percent of its 
    8231                 : // maximum frequency by the system.
    8232                 : // 
    8233                 : DEFINE_GUID( GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC );
    8234                 : 
    8235                 : //
    8236                 : // Specifies a percentage (between 0 and 100) that the processor frequency
    8237                 : // should not drop below.  For example, if this value is set to 50, then the
    8238                 : // processor frequency will never be throttled below 50 percent of its
    8239                 : // maximum frequency by the system.
    8240                 : //
    8241                 : DEFINE_GUID( GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C );
    8242                 : 
    8243                 : //
    8244                 : // Specifies processor power settings for CState policy data
    8245                 : // {68F262A7-F621-4069-B9A5-4874169BE23C}
    8246                 : //
    8247                 : DEFINE_GUID( GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
    8248                 : 
    8249                 : //
    8250                 : // Specifies processor power settings for PerfState policy data
    8251                 : // {BBDC3814-18E9-4463-8A55-D197327C45C0}
    8252                 : //
    8253                 : DEFINE_GUID( GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
    8254                 : 
    8255                 : //
    8256                 : // Specifies active vs passive cooling.  Although not directly related to
    8257                 : // processor settings, it is the processor that gets throttled if we're doing
    8258                 : // passive cooling, so it is fairly strongly related.
    8259                 : // {94D3A615-A899-4AC5-AE2B-E4D8F634367F}
    8260                 : //
    8261                 : DEFINE_GUID( GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
    8262                 : 
    8263                 : 
    8264                 : 
    8265                 : // Lock Console on Wake
    8266                 : // --------------------
    8267                 : //
    8268                 : 
    8269                 : // Specifies the behavior of the system when we wake from standby or
    8270                 : // hibernate.  If this is set, then we will cause the console to lock
    8271                 : // after we resume.
    8272                 : //
    8273                 : DEFINE_GUID( GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51 );
    8274                 : 
    8275                 : 
    8276                 : 
    8277                 : // AC/DC power source
    8278                 : // ------------------
    8279                 : //
    8280                 : 
    8281                 : // Specifies the power source for the system.  consumers may register for
    8282                 : // notification when the power source changes and will be notified with
    8283                 : // one of 3 values:
    8284                 : // 0 - Indicates the system is being powered by an AC power source.
    8285                 : // 1 - Indicates the system is being powered by a DC power source.
    8286                 : // 2 - Indicates the system is being powered by a short-term DC power
    8287                 : //     source.  For example, this would be the case if the system is
    8288                 : //     being powed by a short-term battery supply in a backing UPS
    8289                 : //     system.  When this value is recieved, the consumer should make
    8290                 : //     preparations for either a system hibernate or system shutdown.
    8291                 : //
    8292                 : // { 5D3E9A59-E9D5-4B00-A6BD-FF34FF516548 }
    8293                 : DEFINE_GUID( GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48 );
    8294                 : 
    8295                 : // Lid state changes
    8296                 : // -----------------
    8297                 : //
    8298                 : // Specifies the current state of the lid (open or closed). The callback won't
    8299                 : // be called at all until a lid device is found and its current state is known.
    8300                 : //
    8301                 : // Values:
    8302                 : //
    8303                 : // 0 - closed
    8304                 : // 1 - opened
    8305                 : //
    8306                 : // { BA3E0F4D-B817-4094-A2D1-D56379E6A0F3 }
    8307                 : //
    8308                 : 
    8309                 : DEFINE_GUID( GUID_LIDSWITCH_STATE_CHANGE,  0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3 );
    8310                 : 
    8311                 : // Battery life remaining
    8312                 : // ----------------------
    8313                 : //
    8314                 : 
    8315                 : // Specifies the percentage of battery life remaining.  The consumer
    8316                 : // may register for notification in order to track battery life in
    8317                 : // a fine-grained manner.
    8318                 : //
    8319                 : // Once registered, the consumer can expect to be notified as the battery
    8320                 : // life percentage changes.
    8321                 : // 
    8322                 : // The consumer will recieve a value between 0 and 100 (inclusive) which
    8323                 : // indicates percent battery life remaining.
    8324                 : //
    8325                 : // { A7AD8041-B45A-4CAE-87A3-EECBB468A9E1 }
    8326                 : DEFINE_GUID( GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1 );
    8327                 : 
    8328                 : 
    8329                 : // Notification to listeners that the system is fairly busy and won't be moving
    8330                 : // into an idle state any time soon.  This can be used as a hint to listeners
    8331                 : // that now might be a good time to do background tasks.
    8332                 : //
    8333                 : DEFINE_GUID( GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1 );
    8334                 : 
    8335                 : // Notification to listeners that the system is fairly busy and won't be moving
    8336                 : // into an idle state any time soon.  This can be used as a hint to listeners
    8337                 : // that now might be a good time to do background tasks.
    8338                 : //
    8339                 : // { CF23F240-2A54-48D8-B114-DE1518FF052E }
    8340                 : DEFINE_GUID( GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E );
    8341                 : 
    8342                 : // Define a GUID that will represent the action of a direct experience button
    8343                 : // on the platform.  Users will register for this DPPE setting and recieve
    8344                 : // notification when the h/w button is pressed.
    8345                 : //
    8346                 : // { 1A689231-7399-4E9A-8F99-B71F999DB3FA }
    8347                 : //
    8348                 : DEFINE_GUID( GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA );
    8349                 : 
    8350                 : // PCI Express power settings
    8351                 : // ------------------------
    8352                 : //
    8353                 : 
    8354                 : // Specifies the subgroup which will contain all of the PCI Express
    8355                 : // settings for a single policy.
    8356                 : // 
    8357                 : // {501a4d13-42af-4429-9fd1-a8218c268e20}
    8358                 : // 
    8359                 : DEFINE_GUID( GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20 );
    8360                 : 
    8361                 : // Specifies the PCI Express ASPM power policy.
    8362                 : //
    8363                 : // {ee12f906-d277-404b-b6da-e5fa1a576df5}
    8364                 : //
    8365                 : DEFINE_GUID( GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5 );
    8366                 : 
    8367                 : 
    8368                 : typedef enum _SYSTEM_POWER_STATE {
    8369                 :     PowerSystemUnspecified = 0,
    8370                 :     PowerSystemWorking     = 1,
    8371                 :     PowerSystemSleeping1   = 2,
    8372                 :     PowerSystemSleeping2   = 3,
    8373                 :     PowerSystemSleeping3   = 4,
    8374                 :     PowerSystemHibernate   = 5,
    8375                 :     PowerSystemShutdown    = 6,
    8376                 :     PowerSystemMaximum     = 7
    8377                 : } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
    8378                 : 
    8379                 : #define POWER_SYSTEM_MAXIMUM 7
    8380                 : 
    8381                 : typedef enum {
    8382                 :     PowerActionNone = 0,
    8383                 :     PowerActionReserved,
    8384                 :     PowerActionSleep,
    8385                 :     PowerActionHibernate,
    8386                 :     PowerActionShutdown,
    8387                 :     PowerActionShutdownReset,
    8388                 :     PowerActionShutdownOff,
    8389                 :     PowerActionWarmEject
    8390                 : } POWER_ACTION, *PPOWER_ACTION;
    8391                 : 
    8392                 : typedef enum _DEVICE_POWER_STATE {
    8393                 :     PowerDeviceUnspecified = 0,
    8394                 :     PowerDeviceD0,
    8395                 :     PowerDeviceD1,
    8396                 :     PowerDeviceD2,
    8397                 :     PowerDeviceD3,
    8398                 :     PowerDeviceMaximum
    8399                 : } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
    8400                 : 
    8401                 : 
    8402                 : 
    8403                 : #define ES_SYSTEM_REQUIRED   ((DWORD)0x00000001)
    8404                 : #define ES_DISPLAY_REQUIRED  ((DWORD)0x00000002)
    8405                 : #define ES_USER_PRESENT      ((DWORD)0x00000004)
    8406                 : #define ES_AWAYMODE_REQUIRED ((DWORD)0x00000040)
    8407                 : #define ES_CONTINUOUS        ((DWORD)0x80000000)
    8408                 : 
    8409                 : typedef DWORD EXECUTION_STATE;
    8410                 : 
    8411                 : typedef enum {
    8412                 :     LT_DONT_CARE,
    8413                 :     LT_LOWEST_LATENCY
    8414                 : } LATENCY_TIME;
    8415                 : 
    8416                 : // end_ntminiport 
    8417                 : 
    8418                 : #if (NTDDI_VERSION >= NTDDI_WINXP)
    8419                 : 
    8420                 : //-----------------------------------------------------------------------------
    8421                 : // Device Power Information
    8422                 : // Accessable via CM_Get_DevInst_Registry_Property_Ex(CM_DRP_DEVICE_POWER_DATA)
    8423                 : //-----------------------------------------------------------------------------
    8424                 : 
    8425                 : #define PDCAP_D0_SUPPORTED              0x00000001
    8426                 : #define PDCAP_D1_SUPPORTED              0x00000002
    8427                 : #define PDCAP_D2_SUPPORTED              0x00000004
    8428                 : #define PDCAP_D3_SUPPORTED              0x00000008
    8429                 : #define PDCAP_WAKE_FROM_D0_SUPPORTED    0x00000010
    8430                 : #define PDCAP_WAKE_FROM_D1_SUPPORTED    0x00000020
    8431                 : #define PDCAP_WAKE_FROM_D2_SUPPORTED    0x00000040
    8432                 : #define PDCAP_WAKE_FROM_D3_SUPPORTED    0x00000080
    8433                 : #define PDCAP_WARM_EJECT_SUPPORTED      0x00000100
    8434                 : 
    8435                 : typedef struct CM_Power_Data_s {
    8436                 :     DWORD               PD_Size;
    8437                 :     DEVICE_POWER_STATE  PD_MostRecentPowerState;
    8438                 :     DWORD               PD_Capabilities;
    8439                 :     DWORD               PD_D1Latency;
    8440                 :     DWORD               PD_D2Latency;
    8441                 :     DWORD               PD_D3Latency;
    8442                 :     DEVICE_POWER_STATE  PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM];
    8443                 :     SYSTEM_POWER_STATE  PD_DeepestSystemWake;
    8444                 : } CM_POWER_DATA, *PCM_POWER_DATA;
    8445                 : 
    8446                 : #endif // (NTDDI_VERSION >= NTDDI_WINXP)
    8447                 : 
    8448                 : // begin_wdm
    8449                 : 
    8450                 : typedef enum {
    8451                 :     SystemPowerPolicyAc,
    8452                 :     SystemPowerPolicyDc,
    8453                 :     VerifySystemPolicyAc,
    8454                 :     VerifySystemPolicyDc,
    8455                 :     SystemPowerCapabilities,
    8456                 :     SystemBatteryState,
    8457                 :     SystemPowerStateHandler,
    8458                 :     ProcessorStateHandler,
    8459                 :     SystemPowerPolicyCurrent,
    8460                 :     AdministratorPowerPolicy,
    8461                 :     SystemReserveHiberFile,
    8462                 :     ProcessorInformation,
    8463                 :     SystemPowerInformation,
    8464                 :     ProcessorStateHandler2,
    8465                 :     LastWakeTime,                                   // Compare with KeQueryInterruptTime()
    8466                 :     LastSleepTime,                                  // Compare with KeQueryInterruptTime()
    8467                 :     SystemExecutionState,
    8468                 :     SystemPowerStateNotifyHandler,
    8469                 :     ProcessorPowerPolicyAc,
    8470                 :     ProcessorPowerPolicyDc,
    8471                 :     VerifyProcessorPowerPolicyAc,
    8472                 :     VerifyProcessorPowerPolicyDc,
    8473                 :     ProcessorPowerPolicyCurrent,
    8474                 :     SystemPowerStateLogging,
    8475                 :     SystemPowerLoggingEntry,
    8476                 :     SetPowerSettingValue,
    8477                 :     NotifyUserPowerSetting,
    8478                 :     GetPowerTransitionVetoes,
    8479                 :     SetPowerTransitionVeto,
    8480                 :     SystemVideoState,
    8481                 :     TraceApplicationPowerMessage,
    8482                 :     TraceApplicationPowerMessageEnd,
    8483                 :     ProcessorPerfStates,
    8484                 :     ProcessorIdleStates,
    8485                 :     ProcessorThrottleStates,
    8486                 :     SystemWakeSource,
    8487                 :     SystemHiberFileInformation,
    8488                 :     TraceServicePowerMessage,
    8489                 :     ProcessorLoad,
    8490                 :     PowerShutdownNotification
    8491                 : } POWER_INFORMATION_LEVEL;
    8492                 : 
    8493                 : //
    8494                 : // Power Transition Vetos
    8495                 : //
    8496                 : 
    8497                 : #define PO_TRANSITION_VETO_TYPE_WINDOW  0x00000001
    8498                 : #define PO_TRANSITION_VETO_TYPE_SERVICE 0x00000002
    8499                 : //#define PO_TRANSITION_VETO_TYPE_DRIVER  0x00000004
    8500                 : 
    8501                 : #define PO_TRANSITION_VETO_TYPE_ALL     \
    8502                 :     (PO_TRANSITION_VETO_TYPE_WINDOW | PO_TRANSITION_VETO_TYPE_SERVICE)
    8503                 :     
    8504                 : typedef struct _PO_TRANSITION_VETO_REASON {
    8505                 :     DWORD ResourceId;
    8506                 :     DWORD ModuleNameOffset;
    8507                 : } PO_TRANSITION_VETO_REASON, *PPO_TRANSITION_VETO_REASON;
    8508                 : 
    8509                 : typedef struct _PO_TRANSITION_VETO_WINDOW {
    8510                 :     HANDLE Handle;
    8511                 : } PO_TRANSITION_VETO_WINDOW, *PPO_TRANSITION_VETO_WINDOW;
    8512                 : 
    8513                 : typedef struct _PO_TRANSITION_VETO_SERVICE {
    8514                 :     DWORD ServiceNameOffset;
    8515                 : } PO_TRANSITION_VETO_SERVICE, *PPO_TRANSITION_VETO_SERVICE;
    8516                 : 
    8517                 : /*
    8518                 : 
    8519                 : typedef struct _PO_TRANSITION_VETO_DRIVER {
    8520                 :     DWORD InstancePathOffset;
    8521                 :     DWORD DriverNameOffset;
    8522                 : } PO_TRANSITION_VETO_DRIVER, *PPO_TRANSITION_VETO_DRIVER;
    8523                 : 
    8524                 : */
    8525                 : 
    8526                 : typedef struct _PO_TRANSITION_VETO {
    8527                 :     DWORD Type;
    8528                 :     PO_TRANSITION_VETO_REASON Reason;
    8529                 :     DWORD ProcessId;    
    8530                 : 
    8531                 :     union {
    8532                 :         PO_TRANSITION_VETO_WINDOW Window;
    8533                 :         PO_TRANSITION_VETO_SERVICE Service;
    8534                 :         //PO_TRANSITION_VETO_DRIVER Driver;
    8535                 :     };
    8536                 : } PO_TRANSITION_VETO, *PPO_TRANSITION_VETO;
    8537                 : 
    8538                 : typedef struct _PO_TRANSITION_VETOES {
    8539                 :     DWORD Count;
    8540                 :     PO_TRANSITION_VETO Vetoes[ANYSIZE_ARRAY];
    8541                 : } PO_TRANSITION_VETOES, *PPO_TRANSITION_VETOES;
    8542                 : 
    8543                 : //
    8544                 : // Power Setting definitions
    8545                 : //
    8546                 : 
    8547                 : typedef enum {
    8548                 :     PoAc,
    8549                 :     PoDc,
    8550                 :     PoHot,
    8551                 :     PoConditionMaximum
    8552                 : } SYSTEM_POWER_CONDITION;
    8553                 : 
    8554                 : typedef struct {
    8555                 :     
    8556                 :     //
    8557                 :     // Version of this structure.  Currently should be set to
    8558                 :     // POWER_SETTING_VALUE_VERSION.
    8559                 :     //
    8560                 :     DWORD       Version;
    8561                 :     
    8562                 :     
    8563                 :     //
    8564                 :     // GUID representing the power setting being applied.
    8565                 :     //
    8566                 :     GUID        Guid;
    8567                 :     
    8568                 :     
    8569                 :     //
    8570                 :     // What power state should this setting be applied to?  E.g.
    8571                 :     // AC, DC, thermal, ...
    8572                 :     //
    8573                 :     SYSTEM_POWER_CONDITION PowerCondition;
    8574                 :     
    8575                 :     //
    8576                 :     // Length (in bytes) of the 'Data' member.
    8577                 :     //
    8578                 :     DWORD       DataLength;
    8579                 :     
    8580                 :     //
    8581                 :     // Data which contains the actual setting value.
    8582                 :     // 
    8583                 :     BYTE    Data[ANYSIZE_ARRAY];
    8584                 : } SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE;
    8585                 : 
    8586                 : #define POWER_SETTING_VALUE_VERSION (0x1)
    8587                 : 
    8588                 : typedef struct {
    8589                 :     GUID Guid;
    8590                 : } NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;
    8591                 : 
    8592                 : //
    8593                 : // Package definition for an experience button device notification.  When
    8594                 : // someone registers for GUID_EXPERIENCE_BUTTON, this is the definition of
    8595                 : // the setting data they'll get.
    8596                 : //
    8597                 : typedef struct _APPLICATIONLAUNCH_SETTING_VALUE {
    8598                 : 
    8599                 :     //
    8600                 :     // System time when the most recent button press ocurred.  Note that this is
    8601                 :     // specified in 100ns internvals since January 1, 1601.
    8602                 :     //    
    8603                 :     LARGE_INTEGER       ActivationTime;
    8604                 :     
    8605                 :     //
    8606                 :     // Reserved for internal use.
    8607                 :     //
    8608                 :     DWORD               Flags;
    8609                 : 
    8610                 :     //
    8611                 :     // which instance of this device was pressed?
    8612                 :     //
    8613                 :     DWORD               ButtonInstanceID;
    8614                 : 
    8615                 : 
    8616                 : } APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE;
    8617                 : 
    8618                 : //
    8619                 : // define platform roles
    8620                 : //
    8621                 : 
    8622                 : typedef enum {
    8623                 :     PlatformRoleUnspecified = 0,
    8624                 :     PlatformRoleDesktop,
    8625                 :     PlatformRoleMobile,
    8626                 :     PlatformRoleWorkstation,
    8627                 :     PlatformRoleEnterpriseServer,
    8628                 :     PlatformRoleSOHOServer,
    8629                 :     PlatformRoleAppliancePC,
    8630                 :     PlatformRolePerformanceServer,
    8631                 :     PlatformRoleMaximum
    8632                 : } POWER_PLATFORM_ROLE;
    8633                 : 
    8634                 : //
    8635                 : // Wake source tracking
    8636                 : //
    8637                 : 
    8638                 : typedef enum {
    8639                 :     DeviceWakeSourceType,
    8640                 :     FixedWakeSourceType
    8641                 : } PO_WAKE_SOURCE_TYPE, *PPO_WAKE_SOURCE_TYPE;
    8642                 : 
    8643                 : typedef enum {
    8644                 :     FixedWakeSourcePowerButton,
    8645                 :     FixedWakeSourceSleepButton,
    8646                 :     FixedWakeSourceRtc
    8647                 : } PO_FIXED_WAKE_SOURCE_TYPE, *PPO_FIXED_WAKE_SOURCE_TYPE;
    8648                 : 
    8649                 : typedef struct _PO_WAKE_SOURCE_HEADER {
    8650                 :     PO_WAKE_SOURCE_TYPE Type;
    8651                 :     DWORD Size;
    8652                 : } PO_WAKE_SOURCE_HEADER, *PPO_WAKE_SOURCE_HEADER;
    8653                 : 
    8654                 : typedef struct _PO_WAKE_SOURCE_DEVICE {
    8655                 :     PO_WAKE_SOURCE_HEADER Header;
    8656                 :     WCHAR InstancePath[ANYSIZE_ARRAY];
    8657                 : } PO_WAKE_SOURCE_DEVICE, *PPO_WAKE_SOURCE_DEVICE;
    8658                 : 
    8659                 : typedef struct _PO_WAKE_SOURCE_FIXED {
    8660                 :     PO_WAKE_SOURCE_HEADER Header;
    8661                 :     PO_FIXED_WAKE_SOURCE_TYPE FixedWakeSourceType;
    8662                 : } PO_WAKE_SOURCE_FIXED, *PPO_WAKE_SOURCE_FIXED;
    8663                 : 
    8664                 : typedef struct _PO_WAKE_SOURCE_INFO {
    8665                 :     DWORD Count;
    8666                 :     DWORD Offsets[ANYSIZE_ARRAY];
    8667                 : } PO_WAKE_SOURCE_INFO, *PPO_WAKE_SOURCE_INFO;
    8668                 : 
    8669                 : typedef struct _PO_WAKE_SOURCE_HISTORY {
    8670                 :     DWORD Count;
    8671                 :     DWORD Offsets[ANYSIZE_ARRAY];
    8672                 : } PO_WAKE_SOURCE_HISTORY, *PPO_WAKE_SOURCE_HISTORY;
    8673                 : 
    8674                 : //
    8675                 : // System power manager capabilities
    8676                 : //
    8677                 : 
    8678                 : #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
    8679                 : typedef struct {
    8680                 :     DWORD       Granularity;
    8681                 :     DWORD       Capacity;
    8682                 : } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
    8683                 : #endif // (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
    8684                 : 
    8685                 : //
    8686                 : 
    8687                 : typedef struct {
    8688                 :     BOOLEAN Enabled;
    8689                 :     BYTE  PercentBusy[MAXIMUM_PROCESSORS];
    8690                 : } PPM_SIMULATED_PROCESSOR_LOAD, *PPPM_SIMULATED_PROCESSOR_LOAD;
    8691                 : 
    8692                 : typedef struct {
    8693                 :     DWORD   Frequency;
    8694                 :     DWORD   Flags;
    8695                 :     DWORD   PercentFrequency;
    8696                 : } PPM_WMI_LEGACY_PERFSTATE, *PPPM_WMI_LEGACY_PERFSTATE;
    8697                 : 
    8698                 : typedef struct {
    8699                 :     DWORD Latency;
    8700                 :     DWORD Power;
    8701                 :     DWORD TimeCheck;
    8702                 :     BYTE  PromotePercent;
    8703                 :     BYTE  DemotePercent;
    8704                 :     BYTE  StateType;
    8705                 :     BYTE  Reserved;
    8706                 :     DWORD StateFlags;
    8707                 :     DWORD Context;
    8708                 :     DWORD IdleHandler;
    8709                 :     DWORD Reserved1;            // reserved for future use
    8710                 : } PPM_WMI_IDLE_STATE, *PPPM_WMI_IDLE_STATE;
    8711                 : 
    8712                 : typedef struct {
    8713                 :     DWORD Type;
    8714                 :     DWORD Count;
    8715                 :     DWORD TargetState;          // current idle state
    8716                 :     DWORD OldState;             // previous idle state
    8717                 :     DWORD64 TargetProcessors;
    8718                 :     PPM_WMI_IDLE_STATE State[ANYSIZE_ARRAY];
    8719                 : } PPM_WMI_IDLE_STATES, *PPPM_WMI_IDLE_STATES;
    8720                 : 
    8721                 : typedef struct {
    8722                 :     DWORD Frequency;            // in Mhz
    8723                 :     DWORD Power;                // in milliwatts
    8724                 :     BYTE  PercentFrequency;
    8725                 :     BYTE  IncreaseLevel;        // goto higher state
    8726                 :     BYTE  DecreaseLevel;        // goto lower state
    8727                 :     BYTE  Type;                 // performance or throttle
    8728                 :     DWORD IncreaseTime;         // in tick counts
    8729                 :     DWORD DecreaseTime;         // in tick counts
    8730                 :     DWORD64 Control;            // control value
    8731                 :     DWORD64 Status;             // control value
    8732                 :     DWORD HitCount;
    8733                 :     DWORD Reserved1;            // reserved for future use
    8734                 :     DWORD64 Reserved2;
    8735                 :     DWORD64 Reserved3;
    8736                 : } PPM_WMI_PERF_STATE, *PPPM_WMI_PERF_STATE;
    8737                 : 
    8738                 : typedef struct {
    8739                 :     DWORD Count;
    8740                 :     DWORD MaxFrequency;
    8741                 :     DWORD CurrentState;         // current state
    8742                 :     DWORD MaxPerfState;         // fastest state considering policy restrictions
    8743                 :     DWORD MinPerfState;         // slowest state considering policy restrictions
    8744                 :     DWORD LowestPerfState;      // slowest perf state, fixed, aka the "knee"
    8745                 :     DWORD ThermalConstraint;
    8746                 :     BYTE  BusyAdjThreshold;
    8747                 :     BYTE  PolicyType;           // domain coordination
    8748                 :     BYTE  Type;
    8749                 :     BYTE  Reserved;
    8750                 :     DWORD TimerInterval;
    8751                 :     DWORD64 TargetProcessors;   // domain affinity
    8752                 :     DWORD PStateHandler;
    8753                 :     DWORD PStateContext;
    8754                 :     DWORD TStateHandler;
    8755                 :     DWORD TStateContext;
    8756                 :     DWORD FeedbackHandler;
    8757                 :     DWORD Reserved1;
    8758                 :     DWORD64 Reserved2;
    8759                 :     PPM_WMI_PERF_STATE State[ANYSIZE_ARRAY];
    8760                 : } PPM_WMI_PERF_STATES, *PPPM_WMI_PERF_STATES;
    8761                 : 
    8762                 : //
    8763                 : // Accounting info.
    8764                 : //
    8765                 : 
    8766                 : #define PROC_IDLE_BUCKET_COUNT  6
    8767                 : 
    8768                 : typedef struct {
    8769                 :     DWORD IdleTransitions;
    8770                 :     DWORD FailedTransitions;
    8771                 :     DWORD InvalidBucketIndex;
    8772                 :     DWORD64 TotalTime;
    8773                 :     DWORD IdleTimeBuckets[PROC_IDLE_BUCKET_COUNT];
    8774                 : } PPM_IDLE_STATE_ACCOUNTING, *PPPM_IDLE_STATE_ACCOUNTING;
    8775                 : 
    8776                 : typedef struct {
    8777                 :     DWORD StateCount;
    8778                 :     DWORD TotalTransitions;
    8779                 :     DWORD ResetCount;
    8780                 :     DWORD64 StartTime;
    8781                 :     PPM_IDLE_STATE_ACCOUNTING State[ANYSIZE_ARRAY];
    8782                 : } PPM_IDLE_ACCOUNTING, *PPPM_IDLE_ACCOUNTING;
    8783                 : 
    8784                 : //
    8785                 : // Definitions of coordination types for _PSD, _TSD, and _CSD BIOS objects from
    8786                 : // the Acpi 3.0 specification
    8787                 : //
    8788                 : 
    8789                 : #define ACPI_PPM_SOFTWARE_ALL     0xFC
    8790                 : #define ACPI_PPM_SOFTWARE_ANY     0xFD
    8791                 : #define ACPI_PPM_HARDWARE_ALL     0xFE
    8792                 : 
    8793                 : //
    8794                 : // Definition of Microsoft PPM coordination types.
    8795                 : //
    8796                 : 
    8797                 : #define MS_PPM_SOFTWARE_ALL       0x1
    8798                 : 
    8799                 : 
    8800                 : 
    8801                 : //
    8802                 : // Processor Power Management WMI interface.
    8803                 : //
    8804                 : 
    8805                 : // {A5B32DDD-7F39-4abc-B892-900E43B59EBB}
    8806                 : DEFINE_GUID(PPM_PERFSTATE_CHANGE_GUID, 
    8807                 : 0xa5b32ddd, 0x7f39, 0x4abc, 0xb8, 0x92, 0x90, 0xe, 0x43, 0xb5, 0x9e, 0xbb);
    8808                 : 
    8809                 : // {995e6b7f-d653-497a-b978-36a30c29bf01}
    8810                 : DEFINE_GUID(PPM_PERFSTATE_DOMAIN_CHANGE_GUID,
    8811                 : 0x995e6b7f, 0xd653, 0x497a, 0xb9, 0x78, 0x36, 0xa3, 0xc, 0x29, 0xbf, 0x1);
    8812                 : 
    8813                 : // {4838fe4f-f71c-4e51-9ecc-8430a7ac4c6c}
    8814                 : DEFINE_GUID(PPM_IDLESTATE_CHANGE_GUID, 
    8815                 : 0x4838fe4f, 0xf71c, 0x4e51, 0x9e, 0xcc, 0x84, 0x30, 0xa7, 0xac, 0x4c, 0x6c);
    8816                 : 
    8817                 : // {5708cc20-7d40-4bf4-b4aa-2b01338d0126}
    8818                 : DEFINE_GUID(PPM_PERFSTATES_DATA_GUID, 
    8819                 : 0x5708cc20, 0x7d40, 0x4bf4, 0xb4, 0xaa, 0x2b, 0x01, 0x33, 0x8d, 0x01, 0x26);
    8820                 : 
    8821                 : // {ba138e10-e250-4ad7-8616-cf1a7ad410e7}
    8822                 : DEFINE_GUID(PPM_IDLESTATES_DATA_GUID, 
    8823                 : 0xba138e10, 0xe250, 0x4ad7, 0x86, 0x16, 0xcf, 0x1a, 0x7a, 0xd4, 0x10, 0xe7);
    8824                 : 
    8825                 : // {e2a26f78-ae07-4ee0-a30f-ce354f5a94cd}
    8826                 : DEFINE_GUID(PPM_IDLE_ACCOUNTING_GUID, 
    8827                 : 0xe2a26f78, 0xae07, 0x4ee0, 0xa3, 0x0f, 0xce, 0x54, 0xf5, 0x5a, 0x94, 0xcd);
    8828                 : 
    8829                 : // {a852c2c8-1a4c-423b-8c2c-f30d82931a88}
    8830                 : DEFINE_GUID(PPM_THERMALCONSTRAINT_GUID, 
    8831                 : 0xa852c2c8, 0x1a4c, 0x423b, 0x8c, 0x2c, 0xf3, 0x0d, 0x82, 0x93, 0x1a, 0x88);
    8832                 : 
    8833                 : // {7fd18652-0cfe-40d2-b0a1-0b066a87759e}
    8834                 : DEFINE_GUID(PPM_PERFMON_PERFSTATE_GUID, 
    8835                 : 0x7fd18652, 0xcfe, 0x40d2, 0xb0, 0xa1, 0xb, 0x6, 0x6a, 0x87, 0x75, 0x9e);
    8836                 : 
    8837                 : // {48f377b8-6880-4c7b-8bdc-380176c6654d}
    8838                 : DEFINE_GUID(PPM_THERMAL_POLICY_CHANGE_GUID, 
    8839                 : 0x48f377b8, 0x6880, 0x4c7b, 0x8b, 0xdc, 0x38, 0x1, 0x76, 0xc6, 0x65, 0x4d);
    8840                 : 
    8841                 : 
    8842                 : typedef struct {
    8843                 :     DWORD State;
    8844                 :     DWORD Status;
    8845                 :     DWORD Latency;
    8846                 :     DWORD Speed;
    8847                 :     DWORD Processor;
    8848                 : } PPM_PERFSTATE_EVENT, *PPPM_PERFSTATE_EVENT;
    8849                 : 
    8850                 : typedef struct {
    8851                 :     DWORD State;
    8852                 :     DWORD Latency;
    8853                 :     DWORD Speed;
    8854                 :     DWORD64 Processors;
    8855                 : } PPM_PERFSTATE_DOMAIN_EVENT, *PPPM_PERFSTATE_DOMAIN_EVENT;
    8856                 : 
    8857                 : typedef struct {
    8858                 :     DWORD NewState;
    8859                 :     DWORD OldState;
    8860                 :     DWORD64 Processors;
    8861                 : } PPM_IDLESTATE_EVENT, *PPPM_IDLESTATE_EVENT;
    8862                 : 
    8863                 : typedef struct {
    8864                 :     DWORD ThermalConstraint;
    8865                 :     DWORD64 Processors;
    8866                 : } PPM_THERMALCHANGE_EVENT, *PPPM_THERMALCHANGE_EVENT;
    8867                 : 
    8868                 : #pragma warning(push)
    8869                 : #pragma warning(disable:4121)
    8870                 : 
    8871                 : typedef struct {
    8872                 :     BYTE  Mode;
    8873                 :     DWORD64 Processors;
    8874                 : } PPM_THERMAL_POLICY_EVENT, *PPPM_THERMAL_POLICY_EVENT;
    8875                 : 
    8876                 : #pragma warning(pop)
    8877                 :        
    8878                 : // Power Policy Management interfaces
    8879                 : //
    8880                 : 
    8881                 : typedef struct {
    8882                 :     POWER_ACTION    Action;
    8883                 :     DWORD           Flags;
    8884                 :     DWORD           EventCode;
    8885                 : } POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;
    8886                 : 
    8887                 : // POWER_ACTION_POLICY->Flags:
    8888                 : #define POWER_ACTION_QUERY_ALLOWED      0x00000001
    8889                 : #define POWER_ACTION_UI_ALLOWED         0x00000002
    8890                 : #define POWER_ACTION_OVERRIDE_APPS      0x00000004
    8891                 : #define POWER_ACTION_LIGHTEST_FIRST     0x10000000
    8892                 : #define POWER_ACTION_LOCK_CONSOLE       0x20000000
    8893                 : #define POWER_ACTION_DISABLE_WAKES      0x40000000
    8894                 : #define POWER_ACTION_CRITICAL           0x80000000
    8895                 : 
    8896                 : // POWER_ACTION_POLICY->EventCode flags
    8897                 : #define POWER_LEVEL_USER_NOTIFY_TEXT    0x00000001
    8898                 : #define POWER_LEVEL_USER_NOTIFY_SOUND   0x00000002
    8899                 : #define POWER_LEVEL_USER_NOTIFY_EXEC    0x00000004
    8900                 : #define POWER_USER_NOTIFY_BUTTON        0x00000008
    8901                 : #define POWER_USER_NOTIFY_SHUTDOWN      0x00000010
    8902                 : #define POWER_FORCE_TRIGGER_RESET       0x80000000
    8903                 : 
    8904                 : // Note: for battery alarm EventCodes, the ID of the battery alarm << 16 is ORed
    8905                 : // into the flags.  For example: DISCHARGE_POLICY_LOW << 16
    8906                 : 
    8907                 : //
    8908                 : // The GUID_BATTERY_DISCHARGE_FLAGS_x power settings use a subset of EventCode
    8909                 : // flags.  The POWER_FORCE_TRIGGER_RESET flag doesn't make sense for a battery
    8910                 : // alarm so it is overloaded for other purposes (gerneral enable/disable).
    8911                 : #define BATTERY_DISCHARGE_FLAGS_EVENTCODE_MASK  0x00000007
    8912                 : #define BATTERY_DISCHARGE_FLAGS_ENABLE  0x80000000
    8913                 : 
    8914                 : // system battery drain policies
    8915                 : typedef struct {
    8916                 :     BOOLEAN                 Enable;
    8917                 :     BYTE                    Spare[3];
    8918                 :     DWORD                   BatteryLevel;
    8919                 :     POWER_ACTION_POLICY     PowerPolicy;
    8920                 :     SYSTEM_POWER_STATE      MinSystemState;
    8921                 : } SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;
    8922                 : 
    8923                 : // Discharge policy constants
    8924                 : #define NUM_DISCHARGE_POLICIES      4
    8925                 : #define DISCHARGE_POLICY_CRITICAL   0
    8926                 : #define DISCHARGE_POLICY_LOW        1
    8927                 : 
    8928                 : 
    8929                 : // system power policies
    8930                 : typedef struct _SYSTEM_POWER_POLICY {
    8931                 :     DWORD                   Revision;       // 1
    8932                 : 
    8933                 :     // events
    8934                 :     POWER_ACTION_POLICY     PowerButton;
    8935                 :     POWER_ACTION_POLICY     SleepButton;
    8936                 :     POWER_ACTION_POLICY     LidClose;
    8937                 :     SYSTEM_POWER_STATE      LidOpenWake;
    8938                 :     DWORD                   Reserved;
    8939                 : 
    8940                 :     // "system idle" detection
    8941                 :     POWER_ACTION_POLICY     Idle;
    8942                 :     DWORD                   IdleTimeout;
    8943                 :     BYTE                    IdleSensitivity;
    8944                 : 
    8945                 :     BYTE                    DynamicThrottle;
    8946                 :     BYTE                    Spare2[2];
    8947                 : 
    8948                 :     // meaning of power action "sleep"
    8949                 :     SYSTEM_POWER_STATE      MinSleep;
    8950                 :     SYSTEM_POWER_STATE      MaxSleep;
    8951                 :     SYSTEM_POWER_STATE      ReducedLatencySleep;
    8952                 :     DWORD                   WinLogonFlags;
    8953                 : 
    8954                 :     DWORD                   Spare3;
    8955                 : 
    8956                 :     // parameters for dozing
    8957                 :     //
    8958                 :     DWORD                   DozeS4Timeout;
    8959                 : 
    8960                 :     // battery policies
    8961                 :     DWORD                   BroadcastCapacityResolution;
    8962                 :     SYSTEM_POWER_LEVEL      DischargePolicy[NUM_DISCHARGE_POLICIES];
    8963                 : 
    8964                 :     // video policies
    8965                 :     DWORD                   VideoTimeout;
    8966                 :     BOOLEAN                 VideoDimDisplay;
    8967                 :     DWORD                   VideoReserved[3];
    8968                 : 
    8969                 :     // hard disk policies
    8970                 :     DWORD                   SpindownTimeout;
    8971                 : 
    8972                 :     // processor policies
    8973                 :     BOOLEAN                 OptimizeForPower;
    8974                 :     BYTE                    FanThrottleTolerance;
    8975                 :     BYTE                    ForcedThrottle;
    8976                 :     BYTE                    MinThrottle;
    8977                 :     POWER_ACTION_POLICY     OverThrottled;
    8978                 : 
    8979                 : } SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;
    8980                 : 
    8981                 : 
    8982                 : // processor power policy state
    8983                 : 
    8984                 : //
    8985                 : // Processor Idle State Policy.
    8986                 : //
    8987                 : 
    8988                 : #define PROCESSOR_IDLESTATE_POLICY_COUNT 0x3
    8989                 : 
    8990                 : typedef struct {
    8991                 :     DWORD TimeCheck;
    8992                 :     BYTE  DemotePercent;
    8993                 :     BYTE  PromotePercent;
    8994                 :     BYTE  Spare[2];
    8995                 : } PROCESSOR_IDLESTATE_INFO, *PPROCESSOR_IDLESTATE_INFO;
    8996                 : 
    8997                 : typedef struct {
    8998                 :     WORD   Revision;
    8999                 :     union {
    9000                 :         WORD   AsWORD  ;
    9001                 :         struct {
    9002                 :             WORD   AllowScaling : 1;
    9003                 :             WORD   Disabled : 1;
    9004                 :             WORD   Reserved : 14;
    9005                 :         };
    9006                 :     } Flags;
    9007                 : 
    9008                 :     DWORD PolicyCount;
    9009                 :     PROCESSOR_IDLESTATE_INFO Policy[PROCESSOR_IDLESTATE_POLICY_COUNT];
    9010                 : } PROCESSOR_IDLESTATE_POLICY, *PPROCESSOR_IDLESTATE_POLICY;
    9011                 : 
    9012                 : //
    9013                 : // Legacy Processor Policy.  This is only provided to allow legacy 
    9014                 : // applications to compile.  New applications must use 
    9015                 : // PROCESSOR_IDLESTATE_POLICY.
    9016                 : //
    9017                 : 
    9018                 : #define PO_THROTTLE_NONE            0
    9019                 : #define PO_THROTTLE_CONSTANT        1
    9020                 : #define PO_THROTTLE_DEGRADE         2
    9021                 : #define PO_THROTTLE_ADAPTIVE        3
    9022                 : #define PO_THROTTLE_MAXIMUM         4   // not a policy, just a limit
    9023                 : 
    9024                 : 
    9025                 : typedef struct _PROCESSOR_POWER_POLICY_INFO {
    9026                 : 
    9027                 :     // Time based information (will be converted to kernel units)
    9028                 :     DWORD                   TimeCheck;                      // in US
    9029                 :     DWORD                   DemoteLimit;                    // in US
    9030                 :     DWORD                   PromoteLimit;                   // in US
    9031                 : 
    9032                 :     // Percentage based information
    9033                 :     BYTE                    DemotePercent;
    9034                 :     BYTE                    PromotePercent;
    9035                 :     BYTE                    Spare[2];
    9036                 : 
    9037                 :     // Flags
    9038                 :     DWORD                   AllowDemotion:1;
    9039                 :     DWORD                   AllowPromotion:1;
    9040                 :     DWORD                   Reserved:30;
    9041                 : 
    9042                 : } PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;
    9043                 : 
    9044                 : // processor power policy
    9045                 : typedef struct _PROCESSOR_POWER_POLICY {
    9046                 :     DWORD                       Revision;       // 1
    9047                 : 
    9048                 :     // Dynamic Throttling Policy
    9049                 :     BYTE                        DynamicThrottle;
    9050                 :     BYTE                        Spare[3];
    9051                 : 
    9052                 :     // Flags
    9053                 :     DWORD                       DisableCStates:1;
    9054                 :     DWORD                       Reserved:31;
    9055                 : 
    9056                 :     // System policy information
    9057                 :     // The Array is last, in case it needs to be grown and the structure
    9058                 :     // revision incremented.
    9059                 :     DWORD                       PolicyCount;
    9060                 :     PROCESSOR_POWER_POLICY_INFO Policy[3];
    9061                 : 
    9062                 : } PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;
    9063                 : 
    9064                 : //
    9065                 : // Processor Perf State Policy.
    9066                 : //
    9067                 : 
    9068                 : #define PERFSTATE_POLICY_CHANGE_IDEAL  0x00
    9069                 : #define PERFSTATE_POLICY_CHANGE_SINGLE 0x01
    9070                 : #define PERFSTATE_POLICY_CHANGE_ROCKET 0x02
    9071                 : #define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKET
    9072                 : 
    9073                 : typedef struct {
    9074                 :     DWORD Revision;
    9075                 :     BYTE  MaxThrottle;
    9076                 :     BYTE  MinThrottle;
    9077                 :     BYTE  BusyAdjThreshold;
    9078                 :     union {
    9079                 :         BYTE  Spare;
    9080                 :         union {
    9081                 :             BYTE  AsBYTE ;
    9082                 :             struct {
    9083                 :                 BYTE  NoDomainAccounting : 1;
    9084                 :                 BYTE  IncreasePolicy: 2;
    9085                 :                 BYTE  DecreasePolicy: 2;
    9086                 :                 BYTE  Reserved : 3;
    9087                 :             };
    9088                 :         } Flags;
    9089                 :     };
    9090                 :     
    9091                 :     DWORD TimeCheck;
    9092                 :     DWORD IncreaseTime;
    9093                 :     DWORD DecreaseTime;
    9094                 :     DWORD IncreasePercent;
    9095                 :     DWORD DecreasePercent;
    9096                 : } PROCESSOR_PERFSTATE_POLICY, *PPROCESSOR_PERFSTATE_POLICY;
    9097                 : 
    9098                 : // administrator power policy overrides
    9099                 : typedef struct _ADMINISTRATOR_POWER_POLICY {
    9100                 : 
    9101                 :     // meaning of power action "sleep"
    9102                 :     SYSTEM_POWER_STATE      MinSleep;
    9103                 :     SYSTEM_POWER_STATE      MaxSleep;
    9104                 : 
    9105                 :     // video policies
    9106                 :     DWORD                   MinVideoTimeout;
    9107                 :     DWORD                   MaxVideoTimeout;
    9108                 : 
    9109                 :     // disk policies
    9110                 :     DWORD                   MinSpindownTimeout;
    9111                 :     DWORD                   MaxSpindownTimeout;
    9112                 : } ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;
    9113                 : 
    9114                 : 
    9115                 : 
    9116                 : 
    9117                 : typedef struct {
    9118                 :     // Misc supported system features
    9119                 :     BOOLEAN             PowerButtonPresent;
    9120                 :     BOOLEAN             SleepButtonPresent;
    9121                 :     BOOLEAN             LidPresent;
    9122                 :     BOOLEAN             SystemS1;
    9123                 :     BOOLEAN             SystemS2;
    9124                 :     BOOLEAN             SystemS3;
    9125                 :     BOOLEAN             SystemS4;           // hibernate
    9126                 :     BOOLEAN             SystemS5;           // off
    9127                 :     BOOLEAN             HiberFilePresent;
    9128                 :     BOOLEAN             FullWake;
    9129                 :     BOOLEAN             VideoDimPresent;
    9130                 :     BOOLEAN             ApmPresent;
    9131                 :     BOOLEAN             UpsPresent;
    9132                 : 
    9133                 :     // Processors
    9134                 :     BOOLEAN             ThermalControl;
    9135                 :     BOOLEAN             ProcessorThrottle;
    9136                 :     BYTE                ProcessorMinThrottle;
    9137                 :     
    9138                 : #if (NTDDI_VERSION < NTDDI_WINXP)
    9139                 :     BYTE                ProcessorThrottleScale;
    9140                 :     BYTE                spare2[4];
    9141                 : #else
    9142                 :     BYTE                ProcessorMaxThrottle;
    9143                 :     BOOLEAN             FastSystemS4;
    9144                 :     BYTE                spare2[3];
    9145                 : #endif // (NTDDI_VERSION < NTDDI_WINXP)
    9146                 : 
    9147                 :     // Disk
    9148                 :     BOOLEAN             DiskSpinDown;
    9149                 :     BYTE                spare3[8];
    9150                 : 
    9151                 :     // System Battery
    9152                 :     BOOLEAN             SystemBatteriesPresent;
    9153                 :     BOOLEAN             BatteriesAreShortTerm;
    9154                 :     BATTERY_REPORTING_SCALE BatteryScale[3];
    9155                 : 
    9156                 :     // Wake
    9157                 :     SYSTEM_POWER_STATE  AcOnLineWake;
    9158                 :     SYSTEM_POWER_STATE  SoftLidWake;
    9159                 :     SYSTEM_POWER_STATE  RtcWake;
    9160                 :     SYSTEM_POWER_STATE  MinDeviceWakeState; // note this may change on driver load
    9161                 :     SYSTEM_POWER_STATE  DefaultLowLatencyWake;
    9162                 : } SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;
    9163                 : 
    9164                 : typedef struct {
    9165                 :     BOOLEAN             AcOnLine;
    9166                 :     BOOLEAN             BatteryPresent;
    9167                 :     BOOLEAN             Charging;
    9168                 :     BOOLEAN             Discharging;
    9169                 :     BOOLEAN             Spare1[4];
    9170                 : 
    9171                 :     DWORD               MaxCapacity;
    9172                 :     DWORD               RemainingCapacity;
    9173                 :     DWORD               Rate;
    9174                 :     DWORD               EstimatedTime;
    9175                 : 
    9176                 :     DWORD               DefaultAlert1;
    9177                 :     DWORD               DefaultAlert2;
    9178                 : } SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
    9179                 : 
    9180                 : 
    9181                 : 
    9182                 : //
    9183                 : // Image Format
    9184                 : //
    9185                 : 
    9186                 : 
    9187                 : #ifndef _MAC
    9188                 : 
    9189                 : #include "pshpack4.h"                   // 4 byte packing is the default
    9190                 : 
    9191                 : #define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ
    9192                 : #define IMAGE_OS2_SIGNATURE                 0x454E      // NE
    9193                 : #define IMAGE_OS2_SIGNATURE_LE              0x454C      // LE
    9194                 : #define IMAGE_VXD_SIGNATURE                 0x454C      // LE
    9195                 : #define IMAGE_NT_SIGNATURE                  0x00004550  // PE00
    9196                 : 
    9197                 : #include "pshpack2.h"                   // 16 bit headers are 2 byte packed
    9198                 : 
    9199                 : #else
    9200                 : 
    9201                 : #include "pshpack1.h"
    9202                 : 
    9203                 : #define IMAGE_DOS_SIGNATURE                 0x4D5A      // MZ
    9204                 : #define IMAGE_OS2_SIGNATURE                 0x4E45      // NE
    9205                 : #define IMAGE_OS2_SIGNATURE_LE              0x4C45      // LE
    9206                 : #define IMAGE_NT_SIGNATURE                  0x50450000  // PE00
    9207                 : #endif
    9208                 : 
    9209                 : typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
    9210                 :     WORD   e_magic;                     // Magic number
    9211                 :     WORD   e_cblp;                      // Bytes on last page of file
    9212                 :     WORD   e_cp;                        // Pages in file
    9213                 :     WORD   e_crlc;                      // Relocations
    9214                 :     WORD   e_cparhdr;                   // Size of header in paragraphs
    9215                 :     WORD   e_minalloc;                  // Minimum extra paragraphs needed
    9216                 :     WORD   e_maxalloc;                  // Maximum extra paragraphs needed
    9217                 :     WORD   e_ss;                        // Initial (relative) SS value
    9218                 :     WORD   e_sp;                        // Initial SP value
    9219                 :     WORD   e_csum;                      // Checksum
    9220                 :     WORD   e_ip;                        // Initial IP value
    9221                 :     WORD   e_cs;                        // Initial (relative) CS value
    9222                 :     WORD   e_lfarlc;                    // File address of relocation table
    9223                 :     WORD   e_ovno;                      // Overlay number
    9224                 :     WORD   e_res[4];                    // Reserved words
    9225                 :     WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
    9226                 :     WORD   e_oeminfo;                   // OEM information; e_oemid specific
    9227                 :     WORD   e_res2[10];                  // Reserved words
    9228                 :     LONG   e_lfanew;                    // File address of new exe header
    9229                 :   } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
    9230                 : 
    9231                 : typedef struct _IMAGE_OS2_HEADER {      // OS/2 .EXE header
    9232                 :     WORD   ne_magic;                    // Magic number
    9233                 :     CHAR   ne_ver;                      // Version number
    9234                 :     CHAR   ne_rev;                      // Revision number
    9235                 :     WORD   ne_enttab;                   // Offset of Entry Table
    9236                 :     WORD   ne_cbenttab;                 // Number of bytes in Entry Table
    9237                 :     LONG   ne_crc;                      // Checksum of whole file
    9238                 :     WORD   ne_flags;                    // Flag word
    9239                 :     WORD   ne_autodata;                 // Automatic data segment number
    9240                 :     WORD   ne_heap;                     // Initial heap allocation
    9241                 :     WORD   ne_stack;                    // Initial stack allocation
    9242                 :     LONG   ne_csip;                     // Initial CS:IP setting
    9243                 :     LONG   ne_sssp;                     // Initial SS:SP setting
    9244                 :     WORD   ne_cseg;                     // Count of file segments
    9245                 :     WORD   ne_cmod;                     // Entries in Module Reference Table
    9246                 :     WORD   ne_cbnrestab;                // Size of non-resident name table
    9247                 :     WORD   ne_segtab;                   // Offset of Segment Table
    9248                 :     WORD   ne_rsrctab;                  // Offset of Resource Table
    9249                 :     WORD   ne_restab;                   // Offset of resident name table
    9250                 :     WORD   ne_modtab;                   // Offset of Module Reference Table
    9251                 :     WORD   ne_imptab;                   // Offset of Imported Names Table
    9252                 :     LONG   ne_nrestab;                  // Offset of Non-resident Names Table
    9253                 :     WORD   ne_cmovent;                  // Count of movable entries
    9254                 :     WORD   ne_align;                    // Segment alignment shift count
    9255                 :     WORD   ne_cres;                     // Count of resource segments
    9256                 :     BYTE   ne_exetyp;                   // Target Operating system
    9257                 :     BYTE   ne_flagsothers;              // Other .EXE flags
    9258                 :     WORD   ne_pretthunks;               // offset to return thunks
    9259                 :     WORD   ne_psegrefbytes;             // offset to segment ref. bytes
    9260                 :     WORD   ne_swaparea;                 // Minimum code swap area size
    9261                 :     WORD   ne_expver;                   // Expected Windows version number
    9262                 :   } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
    9263                 : 
    9264                 : typedef struct _IMAGE_VXD_HEADER {      // Windows VXD header
    9265                 :     WORD   e32_magic;                   // Magic number
    9266                 :     BYTE   e32_border;                  // The byte ordering for the VXD
    9267                 :     BYTE   e32_worder;                  // The word ordering for the VXD
    9268                 :     DWORD  e32_level;                   // The EXE format level for now = 0
    9269                 :     WORD   e32_cpu;                     // The CPU type
    9270                 :     WORD   e32_os;                      // The OS type
    9271                 :     DWORD  e32_ver;                     // Module version
    9272                 :     DWORD  e32_mflags;                  // Module flags
    9273                 :     DWORD  e32_mpages;                  // Module # pages
    9274                 :     DWORD  e32_startobj;                // Object # for instruction pointer
    9275                 :     DWORD  e32_eip;                     // Extended instruction pointer
    9276                 :     DWORD  e32_stackobj;                // Object # for stack pointer
    9277                 :     DWORD  e32_esp;                     // Extended stack pointer
    9278                 :     DWORD  e32_pagesize;                // VXD page size
    9279                 :     DWORD  e32_lastpagesize;            // Last page size in VXD
    9280                 :     DWORD  e32_fixupsize;               // Fixup section size
    9281                 :     DWORD  e32_fixupsum;                // Fixup section checksum
    9282                 :     DWORD  e32_ldrsize;                 // Loader section size
    9283                 :     DWORD  e32_ldrsum;                  // Loader section checksum
    9284                 :     DWORD  e32_objtab;                  // Object table offset
    9285                 :     DWORD  e32_objcnt;                  // Number of objects in module
    9286                 :     DWORD  e32_objmap;                  // Object page map offset
    9287                 :     DWORD  e32_itermap;                 // Object iterated data map offset
    9288                 :     DWORD  e32_rsrctab;                 // Offset of Resource Table
    9289                 :     DWORD  e32_rsrccnt;                 // Number of resource entries
    9290                 :     DWORD  e32_restab;                  // Offset of resident name table
    9291                 :     DWORD  e32_enttab;                  // Offset of Entry Table
    9292                 :     DWORD  e32_dirtab;                  // Offset of Module Directive Table
    9293                 :     DWORD  e32_dircnt;                  // Number of module directives
    9294                 :     DWORD  e32_fpagetab;                // Offset of Fixup Page Table
    9295                 :     DWORD  e32_frectab;                 // Offset of Fixup Record Table
    9296                 :     DWORD  e32_impmod;                  // Offset of Import Module Name Table
    9297                 :     DWORD  e32_impmodcnt;               // Number of entries in Import Module Name Table
    9298                 :     DWORD  e32_impproc;                 // Offset of Import Procedure Name Table
    9299                 :     DWORD  e32_pagesum;                 // Offset of Per-Page Checksum Table
    9300                 :     DWORD  e32_datapage;                // Offset of Enumerated Data Pages
    9301                 :     DWORD  e32_preload;                 // Number of preload pages
    9302                 :     DWORD  e32_nrestab;                 // Offset of Non-resident Names Table
    9303                 :     DWORD  e32_cbnrestab;               // Size of Non-resident Name Table
    9304                 :     DWORD  e32_nressum;                 // Non-resident Name Table Checksum
    9305                 :     DWORD  e32_autodata;                // Object # for automatic data object
    9306                 :     DWORD  e32_debuginfo;               // Offset of the debugging information
    9307                 :     DWORD  e32_debuglen;                // The length of the debugging info. in bytes
    9308                 :     DWORD  e32_instpreload;             // Number of instance pages in preload section of VXD file
    9309                 :     DWORD  e32_instdemand;              // Number of instance pages in demand load section of VXD file
    9310                 :     DWORD  e32_heapsize;                // Size of heap - for 16-bit apps
    9311                 :     BYTE   e32_res3[12];                // Reserved words
    9312                 :     DWORD  e32_winresoff;
    9313                 :     DWORD  e32_winreslen;
    9314                 :     WORD   e32_devid;                   // Device ID for VxD
    9315                 :     WORD   e32_ddkver;                  // DDK version for VxD
    9316                 :   } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
    9317                 : 
    9318                 : #ifndef _MAC
    9319                 : #include "poppack.h"                    // Back to 4 byte packing
    9320                 : #endif
    9321                 : 
    9322                 : //
    9323                 : // File header format.
    9324                 : //
    9325                 : 
    9326                 : typedef struct _IMAGE_FILE_HEADER {
    9327                 :     WORD    Machine;
    9328                 :     WORD    NumberOfSections;
    9329                 :     DWORD   TimeDateStamp;
    9330                 :     DWORD   PointerToSymbolTable;
    9331                 :     DWORD   NumberOfSymbols;
    9332                 :     WORD    SizeOfOptionalHeader;
    9333                 :     WORD    Characteristics;
    9334                 : } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
    9335                 : 
    9336                 : #define IMAGE_SIZEOF_FILE_HEADER             20
    9337                 : 
    9338                 : #define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
    9339                 : #define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references).
    9340                 : #define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
    9341                 : #define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
    9342                 : #define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set
    9343                 : #define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses
    9344                 : #define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
    9345                 : #define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
    9346                 : #define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
    9347                 : #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file.
    9348                 : #define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // If Image is on Net, copy and run from the swap file.
    9349                 : #define IMAGE_FILE_SYSTEM                    0x1000  // System File.
    9350                 : #define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
    9351                 : #define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // File should only be run on a UP machine
    9352                 : #define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
    9353                 : 
    9354                 : #define IMAGE_FILE_MACHINE_UNKNOWN           0
    9355                 : #define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
    9356                 : #define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
    9357                 : #define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
    9358                 : #define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
    9359                 : #define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2
    9360                 : #define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP
    9361                 : #define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian
    9362                 : #define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
    9363                 : #define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
    9364                 : #define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
    9365                 : #define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5
    9366                 : #define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
    9367                 : #define IMAGE_FILE_MACHINE_THUMB             0x01c2
    9368                 : #define IMAGE_FILE_MACHINE_AM33              0x01d3
    9369                 : #define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
    9370                 : #define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
    9371                 : #define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
    9372                 : #define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
    9373                 : #define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
    9374                 : #define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
    9375                 : #define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
    9376                 : #define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
    9377                 : #define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon
    9378                 : #define IMAGE_FILE_MACHINE_CEF               0x0CEF
    9379                 : #define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code
    9380                 : #define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
    9381                 : #define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
    9382                 : #define IMAGE_FILE_MACHINE_CEE               0xC0EE
    9383                 : 
    9384                 : //
    9385                 : // Directory format.
    9386                 : //
    9387                 : 
    9388                 : typedef struct _IMAGE_DATA_DIRECTORY {
    9389                 :     DWORD   VirtualAddress;
    9390                 :     DWORD   Size;
    9391                 : } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
    9392                 : 
    9393                 : #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
    9394                 : 
    9395                 : //
    9396                 : // Optional header format.
    9397                 : //
    9398                 : 
    9399                 : typedef struct _IMAGE_OPTIONAL_HEADER {
    9400                 :     //
    9401                 :     // Standard fields.
    9402                 :     //
    9403                 : 
    9404                 :     WORD    Magic;
    9405                 :     BYTE    MajorLinkerVersion;
    9406                 :     BYTE    MinorLinkerVersion;
    9407                 :     DWORD   SizeOfCode;
    9408                 :     DWORD   SizeOfInitializedData;
    9409                 :     DWORD   SizeOfUninitializedData;
    9410                 :     DWORD   AddressOfEntryPoint;
    9411                 :     DWORD   BaseOfCode;
    9412                 :     DWORD   BaseOfData;
    9413                 : 
    9414                 :     //
    9415                 :     // NT additional fields.
    9416                 :     //
    9417                 : 
    9418                 :     DWORD   ImageBase;
    9419                 :     DWORD   SectionAlignment;
    9420                 :     DWORD   FileAlignment;
    9421                 :     WORD    MajorOperatingSystemVersion;
    9422                 :     WORD    MinorOperatingSystemVersion;
    9423                 :     WORD    MajorImageVersion;
    9424                 :     WORD    MinorImageVersion;
    9425                 :     WORD    MajorSubsystemVersion;
    9426                 :     WORD    MinorSubsystemVersion;
    9427                 :     DWORD   Win32VersionValue;
    9428                 :     DWORD   SizeOfImage;
    9429                 :     DWORD   SizeOfHeaders;
    9430                 :     DWORD   CheckSum;
    9431                 :     WORD    Subsystem;
    9432                 :     WORD    DllCharacteristics;
    9433                 :     DWORD   SizeOfStackReserve;
    9434                 :     DWORD   SizeOfStackCommit;
    9435                 :     DWORD   SizeOfHeapReserve;
    9436                 :     DWORD   SizeOfHeapCommit;
    9437                 :     DWORD   LoaderFlags;
    9438                 :     DWORD   NumberOfRvaAndSizes;
    9439                 :     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    9440                 : } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
    9441                 : 
    9442                 : typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
    9443                 :     WORD   Magic;
    9444                 :     BYTE   MajorLinkerVersion;
    9445                 :     BYTE   MinorLinkerVersion;
    9446                 :     DWORD  SizeOfCode;
    9447                 :     DWORD  SizeOfInitializedData;
    9448                 :     DWORD  SizeOfUninitializedData;
    9449                 :     DWORD  AddressOfEntryPoint;
    9450                 :     DWORD  BaseOfCode;
    9451                 :     DWORD  BaseOfData;
    9452                 :     DWORD  BaseOfBss;
    9453                 :     DWORD  GprMask;
    9454                 :     DWORD  CprMask[4];
    9455                 :     DWORD  GpValue;
    9456                 : } IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
    9457                 : 
    9458                 : typedef struct _IMAGE_OPTIONAL_HEADER64 {
    9459                 :     WORD        Magic;
    9460                 :     BYTE        MajorLinkerVersion;
    9461                 :     BYTE        MinorLinkerVersion;
    9462                 :     DWORD       SizeOfCode;
    9463                 :     DWORD       SizeOfInitializedData;
    9464                 :     DWORD       SizeOfUninitializedData;
    9465                 :     DWORD       AddressOfEntryPoint;
    9466                 :     DWORD       BaseOfCode;
    9467                 :     ULONGLONG   ImageBase;
    9468                 :     DWORD       SectionAlignment;
    9469                 :     DWORD       FileAlignment;
    9470                 :     WORD        MajorOperatingSystemVersion;
    9471                 :     WORD        MinorOperatingSystemVersion;
    9472                 :     WORD        MajorImageVersion;
    9473                 :     WORD        MinorImageVersion;
    9474                 :     WORD        MajorSubsystemVersion;
    9475                 :     WORD        MinorSubsystemVersion;
    9476                 :     DWORD       Win32VersionValue;
    9477                 :     DWORD       SizeOfImage;
    9478                 :     DWORD       SizeOfHeaders;
    9479                 :     DWORD       CheckSum;
    9480                 :     WORD        Subsystem;
    9481                 :     WORD        DllCharacteristics;
    9482                 :     ULONGLONG   SizeOfStackReserve;
    9483                 :     ULONGLONG   SizeOfStackCommit;
    9484                 :     ULONGLONG   SizeOfHeapReserve;
    9485                 :     ULONGLONG   SizeOfHeapCommit;
    9486                 :     DWORD       LoaderFlags;
    9487                 :     DWORD       NumberOfRvaAndSizes;
    9488                 :     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    9489                 : } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
    9490                 : 
    9491                 : #define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10b
    9492                 : #define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
    9493                 : #define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
    9494                 : 
    9495                 : #ifdef _WIN64
    9496                 : typedef IMAGE_OPTIONAL_HEADER64             IMAGE_OPTIONAL_HEADER;
    9497                 : typedef PIMAGE_OPTIONAL_HEADER64            PIMAGE_OPTIONAL_HEADER;
    9498                 : #define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR64_MAGIC
    9499                 : #else
    9500                 : typedef IMAGE_OPTIONAL_HEADER32             IMAGE_OPTIONAL_HEADER;
    9501                 : typedef PIMAGE_OPTIONAL_HEADER32            PIMAGE_OPTIONAL_HEADER;
    9502                 : #define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR32_MAGIC
    9503                 : #endif
    9504                 : 
    9505                 : typedef struct _IMAGE_NT_HEADERS64 {
    9506                 :     DWORD Signature;
    9507                 :     IMAGE_FILE_HEADER FileHeader;
    9508                 :     IMAGE_OPTIONAL_HEADER64 OptionalHeader;
    9509                 : } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
    9510                 : 
    9511                 : typedef struct _IMAGE_NT_HEADERS {
    9512                 :     DWORD Signature;
    9513                 :     IMAGE_FILE_HEADER FileHeader;
    9514                 :     IMAGE_OPTIONAL_HEADER32 OptionalHeader;
    9515                 : } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
    9516                 : 
    9517                 : typedef struct _IMAGE_ROM_HEADERS {
    9518                 :     IMAGE_FILE_HEADER FileHeader;
    9519                 :     IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
    9520                 : } IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
    9521                 : 
    9522                 : #ifdef _WIN64
    9523                 : typedef IMAGE_NT_HEADERS64                  IMAGE_NT_HEADERS;
    9524                 : typedef PIMAGE_NT_HEADERS64                 PIMAGE_NT_HEADERS;
    9525                 : #else
    9526                 : typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
    9527                 : typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;
    9528                 : #endif
    9529                 : 
    9530                 : // IMAGE_FIRST_SECTION doesn't need 32/64 versions since the file header is the same either way.
    9531                 : 
    9532                 : #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)        \
    9533                 :     ((ULONG_PTR)ntheader +                                              \
    9534                 :      FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +                 \
    9535                 :      ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader   \
    9536                 :     ))
    9537                 : 
    9538                 : // Subsystem Values
    9539                 : 
    9540                 : #define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.
    9541                 : #define IMAGE_SUBSYSTEM_NATIVE               1   // Image doesn't require a subsystem.
    9542                 : #define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Image runs in the Windows GUI subsystem.
    9543                 : #define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Image runs in the Windows character subsystem.
    9544                 : #define IMAGE_SUBSYSTEM_OS2_CUI              5   // image runs in the OS/2 character subsystem.
    9545                 : #define IMAGE_SUBSYSTEM_POSIX_CUI            7   // image runs in the Posix character subsystem.
    9546                 : #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // image is a native Win9x driver.
    9547                 : #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Image runs in the Windows CE subsystem.
    9548                 : #define IMAGE_SUBSYSTEM_EFI_APPLICATION      10  //
    9549                 : #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER  11   //
    9550                 : #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER   12  //
    9551                 : #define IMAGE_SUBSYSTEM_EFI_ROM              13
    9552                 : #define IMAGE_SUBSYSTEM_XBOX                 14
    9553                 : #define IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION 16
    9554                 : 
    9555                 : // DllCharacteristics Entries
    9556                 : 
    9557                 : //      IMAGE_LIBRARY_PROCESS_INIT            0x0001     // Reserved.
    9558                 : //      IMAGE_LIBRARY_PROCESS_TERM            0x0002     // Reserved.
    9559                 : //      IMAGE_LIBRARY_THREAD_INIT             0x0004     // Reserved.
    9560                 : //      IMAGE_LIBRARY_THREAD_TERM             0x0008     // Reserved.
    9561                 : #define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040     // DLL can move.
    9562                 : #define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY    0x0080     // Code Integrity Image
    9563                 : #define IMAGE_DLLCHARACTERISTICS_NX_COMPAT    0x0100     // Image is NX compatible
    9564                 : #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200     // Image understands isolation and doesn't want it
    9565                 : #define IMAGE_DLLCHARACTERISTICS_NO_SEH       0x0400     // Image does not use SEH.  No SE handler may reside in this image
    9566                 : #define IMAGE_DLLCHARACTERISTICS_NO_BIND      0x0800     // Do not bind this image.
    9567                 : //                                            0x1000     // Reserved.
    9568                 : #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER   0x2000     // Driver uses WDM model
    9569                 : //                                            0x4000     // Reserved.
    9570                 : #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE     0x8000
    9571                 : 
    9572                 : // Directory Entries
    9573                 : 
    9574                 : #define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory
    9575                 : #define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory
    9576                 : #define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory
    9577                 : #define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory
    9578                 : #define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory
    9579                 : #define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table
    9580                 : #define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory
    9581                 : //      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)
    9582                 : #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
    9583                 : #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP
    9584                 : #define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory
    9585                 : #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory
    9586                 : #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers
    9587                 : #define IMAGE_DIRECTORY_ENTRY_IAT            12   // Import Address Table
    9588                 : #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
    9589                 : #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor
    9590                 : 
    9591                 : //
    9592                 : // Non-COFF Object file header
    9593                 : //
    9594                 : 
    9595                 : typedef struct ANON_OBJECT_HEADER {
    9596                 :     WORD    Sig1;            // Must be IMAGE_FILE_MACHINE_UNKNOWN
    9597                 :     WORD    Sig2;            // Must be 0xffff
    9598                 :     WORD    Version;         // >= 1 (implies the CLSID field is present)
    9599                 :     WORD    Machine;
    9600                 :     DWORD   TimeDateStamp;
    9601                 :     CLSID   ClassID;         // Used to invoke CoCreateInstance
    9602                 :     DWORD   SizeOfData;      // Size of data that follows the header
    9603                 : } ANON_OBJECT_HEADER;
    9604                 : 
    9605                 : typedef struct ANON_OBJECT_HEADER_V2 {
    9606                 :     WORD    Sig1;            // Must be IMAGE_FILE_MACHINE_UNKNOWN
    9607                 :     WORD    Sig2;            // Must be 0xffff
    9608                 :     WORD    Version;         // >= 2 (implies the Flags field is present - otherwise V1)
    9609                 :     WORD    Machine;
    9610                 :     DWORD   TimeDateStamp;
    9611                 :     CLSID   ClassID;         // Used to invoke CoCreateInstance
    9612                 :     DWORD   SizeOfData;      // Size of data that follows the header
    9613                 :     DWORD   Flags;           // 0x1 -> contains metadata
    9614                 :     DWORD   MetaDataSize;    // Size of CLR metadata
    9615                 :     DWORD   MetaDataOffset;  // Offset of CLR metadata
    9616                 : } ANON_OBJECT_HEADER_V2;
    9617                 : //
    9618                 : // Section header format.
    9619                 : //
    9620                 : 
    9621                 : #define IMAGE_SIZEOF_SHORT_NAME              8
    9622                 : 
    9623                 : typedef struct _IMAGE_SECTION_HEADER {
    9624                 :     BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
    9625                 :     union {
    9626                 :             DWORD   PhysicalAddress;
    9627                 :             DWORD   VirtualSize;
    9628                 :     } Misc;
    9629                 :     DWORD   VirtualAddress;
    9630                 :     DWORD   SizeOfRawData;
    9631                 :     DWORD   PointerToRawData;
    9632                 :     DWORD   PointerToRelocations;
    9633                 :     DWORD   PointerToLinenumbers;
    9634                 :     WORD    NumberOfRelocations;
    9635                 :     WORD    NumberOfLinenumbers;
    9636                 :     DWORD   Characteristics;
    9637                 : } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
    9638                 : 
    9639                 : #define IMAGE_SIZEOF_SECTION_HEADER          40
    9640                 : 
    9641                 : //
    9642                 : // Section characteristics.
    9643                 : //
    9644                 : //      IMAGE_SCN_TYPE_REG                   0x00000000  // Reserved.
    9645                 : //      IMAGE_SCN_TYPE_DSECT                 0x00000001  // Reserved.
    9646                 : //      IMAGE_SCN_TYPE_NOLOAD                0x00000002  // Reserved.
    9647                 : //      IMAGE_SCN_TYPE_GROUP                 0x00000004  // Reserved.
    9648                 : #define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
    9649                 : //      IMAGE_SCN_TYPE_COPY                  0x00000010  // Reserved.
    9650                 : 
    9651                 : #define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
    9652                 : #define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
    9653                 : #define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.
    9654                 : 
    9655                 : #define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
    9656                 : #define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
    9657                 : //      IMAGE_SCN_TYPE_OVER                  0x00000400  // Reserved.
    9658                 : #define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
    9659                 : #define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
    9660                 : //                                           0x00002000  // Reserved.
    9661                 : //      IMAGE_SCN_MEM_PROTECTED - Obsolete   0x00004000
    9662                 : #define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000  // Reset speculative exceptions handling bits in the TLB entries for this section.
    9663                 : #define IMAGE_SCN_GPREL                      0x00008000  // Section content can be accessed relative to GP
    9664                 : #define IMAGE_SCN_MEM_FARDATA                0x00008000
    9665                 : //      IMAGE_SCN_MEM_SYSHEAP  - Obsolete    0x00010000
    9666                 : #define IMAGE_SCN_MEM_PURGEABLE              0x00020000
    9667                 : #define IMAGE_SCN_MEM_16BIT                  0x00020000
    9668                 : #define IMAGE_SCN_MEM_LOCKED                 0x00040000
    9669                 : #define IMAGE_SCN_MEM_PRELOAD                0x00080000
    9670                 : 
    9671                 : #define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
    9672                 : #define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
    9673                 : #define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
    9674                 : #define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
    9675                 : #define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
    9676                 : #define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
    9677                 : #define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
    9678                 : #define IMAGE_SCN_ALIGN_128BYTES             0x00800000  //
    9679                 : #define IMAGE_SCN_ALIGN_256BYTES             0x00900000  //
    9680                 : #define IMAGE_SCN_ALIGN_512BYTES             0x00A00000  //
    9681                 : #define IMAGE_SCN_ALIGN_1024BYTES            0x00B00000  //
    9682                 : #define IMAGE_SCN_ALIGN_2048BYTES            0x00C00000  //
    9683                 : #define IMAGE_SCN_ALIGN_4096BYTES            0x00D00000  //
    9684                 : #define IMAGE_SCN_ALIGN_8192BYTES            0x00E00000  //
    9685                 : // Unused                                    0x00F00000
    9686                 : #define IMAGE_SCN_ALIGN_MASK                 0x00F00000
    9687                 : 
    9688                 : #define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  // Section contains extended relocations.
    9689                 : #define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
    9690                 : #define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
    9691                 : #define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
    9692                 : #define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
    9693                 : #define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
    9694                 : #define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
    9695                 : #define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.
    9696                 : 
    9697                 : //
    9698                 : // TLS Chaacteristic Flags
    9699                 : //
    9700                 : #define IMAGE_SCN_SCALE_INDEX                0x00000001  // Tls index is scaled
    9701                 : 
    9702                 : #ifndef _MAC
    9703                 : #include "pshpack2.h"                       // Symbols, relocs, and linenumbers are 2 byte packed
    9704                 : #endif
    9705                 : 
    9706                 : //
    9707                 : // Symbol format.
    9708                 : //
    9709                 : 
    9710                 : typedef struct _IMAGE_SYMBOL {
    9711                 :     union {
    9712                 :         BYTE    ShortName[8];
    9713                 :         struct {
    9714                 :             DWORD   Short;     // if 0, use LongName
    9715                 :             DWORD   Long;      // offset into string table
    9716                 :         } Name;
    9717                 :         DWORD   LongName[2];    // PBYTE [2]
    9718                 :     } N;
    9719                 :     DWORD   Value;
    9720                 :     SHORT   SectionNumber;
    9721                 :     WORD    Type;
    9722                 :     BYTE    StorageClass;
    9723                 :     BYTE    NumberOfAuxSymbols;
    9724                 : } IMAGE_SYMBOL;
    9725                 : typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;
    9726                 : 
    9727                 : 
    9728                 : #define IMAGE_SIZEOF_SYMBOL                  18
    9729                 : 
    9730                 : //
    9731                 : // Section values.
    9732                 : //
    9733                 : // Symbols have a section number of the section in which they are
    9734                 : // defined. Otherwise, section numbers have the following meanings:
    9735                 : //
    9736                 : 
    9737                 : #define IMAGE_SYM_UNDEFINED           (SHORT)0          // Symbol is undefined or is common.
    9738                 : #define IMAGE_SYM_ABSOLUTE            (SHORT)-1         // Symbol is an absolute value.
    9739                 : #define IMAGE_SYM_DEBUG               (SHORT)-2         // Symbol is a special debug item.
    9740                 : #define IMAGE_SYM_SECTION_MAX         0xFEFF            // Values 0xFF00-0xFFFF are special
    9741                 : 
    9742                 : //
    9743                 : // Type (fundamental) values.
    9744                 : //
    9745                 : 
    9746                 : #define IMAGE_SYM_TYPE_NULL                 0x0000  // no type.
    9747                 : #define IMAGE_SYM_TYPE_VOID                 0x0001  //
    9748                 : #define IMAGE_SYM_TYPE_CHAR                 0x0002  // type character.
    9749                 : #define IMAGE_SYM_TYPE_SHORT                0x0003  // type short integer.
    9750                 : #define IMAGE_SYM_TYPE_INT                  0x0004  //
    9751                 : #define IMAGE_SYM_TYPE_LONG                 0x0005  //
    9752                 : #define IMAGE_SYM_TYPE_FLOAT                0x0006  //
    9753                 : #define IMAGE_SYM_TYPE_DOUBLE               0x0007  //
    9754                 : #define IMAGE_SYM_TYPE_STRUCT               0x0008  //
    9755                 : #define IMAGE_SYM_TYPE_UNION                0x0009  //
    9756                 : #define IMAGE_SYM_TYPE_ENUM                 0x000A  // enumeration.
    9757                 : #define IMAGE_SYM_TYPE_MOE                  0x000B  // member of enumeration.
    9758                 : #define IMAGE_SYM_TYPE_BYTE                 0x000C  //
    9759                 : #define IMAGE_SYM_TYPE_WORD                 0x000D  //
    9760                 : #define IMAGE_SYM_TYPE_UINT                 0x000E  //
    9761                 : #define IMAGE_SYM_TYPE_DWORD                0x000F  //
    9762                 : #define IMAGE_SYM_TYPE_PCODE                0x8000  //
    9763                 : //
    9764                 : // Type (derived) values.
    9765                 : //
    9766                 : 
    9767                 : #define IMAGE_SYM_DTYPE_NULL                0       // no derived type.
    9768                 : #define IMAGE_SYM_DTYPE_POINTER             1       // pointer.
    9769                 : #define IMAGE_SYM_DTYPE_FUNCTION            2       // function.
    9770                 : #define IMAGE_SYM_DTYPE_ARRAY               3       // array.
    9771                 : 
    9772                 : //
    9773                 : // Storage classes.
    9774                 : //
    9775                 : #define IMAGE_SYM_CLASS_END_OF_FUNCTION     (BYTE )-1
    9776                 : #define IMAGE_SYM_CLASS_NULL                0x0000
    9777                 : #define IMAGE_SYM_CLASS_AUTOMATIC           0x0001
    9778                 : #define IMAGE_SYM_CLASS_EXTERNAL            0x0002
    9779                 : #define IMAGE_SYM_CLASS_STATIC              0x0003
    9780                 : #define IMAGE_SYM_CLASS_REGISTER            0x0004
    9781                 : #define IMAGE_SYM_CLASS_EXTERNAL_DEF        0x0005
    9782                 : #define IMAGE_SYM_CLASS_LABEL               0x0006
    9783                 : #define IMAGE_SYM_CLASS_UNDEFINED_LABEL     0x0007
    9784                 : #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT    0x0008
    9785                 : #define IMAGE_SYM_CLASS_ARGUMENT            0x0009
    9786                 : #define IMAGE_SYM_CLASS_STRUCT_TAG          0x000A
    9787                 : #define IMAGE_SYM_CLASS_MEMBER_OF_UNION     0x000B
    9788                 : #define IMAGE_SYM_CLASS_UNION_TAG           0x000C
    9789                 : #define IMAGE_SYM_CLASS_TYPE_DEFINITION     0x000D
    9790                 : #define IMAGE_SYM_CLASS_UNDEFINED_STATIC    0x000E
    9791                 : #define IMAGE_SYM_CLASS_ENUM_TAG            0x000F
    9792                 : #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM      0x0010
    9793                 : #define IMAGE_SYM_CLASS_REGISTER_PARAM      0x0011
    9794                 : #define IMAGE_SYM_CLASS_BIT_FIELD           0x0012
    9795                 : 
    9796                 : #define IMAGE_SYM_CLASS_FAR_EXTERNAL        0x0044  //
    9797                 : 
    9798                 : #define IMAGE_SYM_CLASS_BLOCK               0x0064
    9799                 : #define IMAGE_SYM_CLASS_FUNCTION            0x0065
    9800                 : #define IMAGE_SYM_CLASS_END_OF_STRUCT       0x0066
    9801                 : #define IMAGE_SYM_CLASS_FILE                0x0067
    9802                 : // new
    9803                 : #define IMAGE_SYM_CLASS_SECTION             0x0068
    9804                 : #define IMAGE_SYM_CLASS_WEAK_EXTERNAL       0x0069
    9805                 : 
    9806                 : #define IMAGE_SYM_CLASS_CLR_TOKEN           0x006B
    9807                 : 
    9808                 : // type packing constants
    9809                 : 
    9810                 : #define N_BTMASK                            0x000F
    9811                 : #define N_TMASK                             0x0030
    9812                 : #define N_TMASK1                            0x00C0
    9813                 : #define N_TMASK2                            0x00F0
    9814                 : #define N_BTSHFT                            4
    9815                 : #define N_TSHIFT                            2
    9816                 : // MACROS
    9817                 : 
    9818                 : // Basic Type of  x
    9819                 : #define BTYPE(x) ((x) & N_BTMASK)
    9820                 : 
    9821                 : // Is x a pointer?
    9822                 : #ifndef ISPTR
    9823                 : #define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
    9824                 : #endif
    9825                 : 
    9826                 : // Is x a function?
    9827                 : #ifndef ISFCN
    9828                 : #define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
    9829                 : #endif
    9830                 : 
    9831                 : // Is x an array?
    9832                 : 
    9833                 : #ifndef ISARY
    9834                 : #define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))
    9835                 : #endif
    9836                 : 
    9837                 : // Is x a structure, union, or enumeration TAG?
    9838                 : #ifndef ISTAG
    9839                 : #define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)
    9840                 : #endif
    9841                 : 
    9842                 : #ifndef INCREF
    9843                 : #define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
    9844                 : #endif
    9845                 : #ifndef DECREF
    9846                 : #define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
    9847                 : #endif
    9848                 : 
    9849                 : //
    9850                 : // Auxiliary entry format.
    9851                 : //
    9852                 : 
    9853                 : typedef union _IMAGE_AUX_SYMBOL {
    9854                 :     struct {
    9855                 :         DWORD    TagIndex;                      // struct, union, or enum tag index
    9856                 :         union {
    9857                 :             struct {
    9858                 :                 WORD    Linenumber;             // declaration line number
    9859                 :                 WORD    Size;                   // size of struct, union, or enum
    9860                 :             } LnSz;
    9861                 :            DWORD    TotalSize;
    9862                 :         } Misc;
    9863                 :         union {
    9864                 :             struct {                            // if ISFCN, tag, or .bb
    9865                 :                 DWORD    PointerToLinenumber;
    9866                 :                 DWORD    PointerToNextFunction;
    9867                 :             } Function;
    9868                 :             struct {                            // if ISARY, up to 4 dimen.
    9869                 :                 WORD     Dimension[4];
    9870                 :             } Array;
    9871                 :         } FcnAry;
    9872                 :         WORD    TvIndex;                        // tv index
    9873                 :     } Sym;
    9874                 :     struct {
    9875                 :         BYTE    Name[IMAGE_SIZEOF_SYMBOL];
    9876                 :     } File;
    9877                 :     struct {
    9878                 :         DWORD   Length;                         // section length
    9879                 :         WORD    NumberOfRelocations;            // number of relocation entries
    9880                 :         WORD    NumberOfLinenumbers;            // number of line numbers
    9881                 :         DWORD   CheckSum;                       // checksum for communal
    9882                 :         SHORT   Number;                         // section number to associate with
    9883                 :         BYTE    Selection;                      // communal selection type
    9884                 :     } Section;
    9885                 : } IMAGE_AUX_SYMBOL;
    9886                 : typedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL;
    9887                 : 
    9888                 : typedef enum IMAGE_AUX_SYMBOL_TYPE {
    9889                 :     IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1,
    9890                 : } IMAGE_AUX_SYMBOL_TYPE;
    9891                 : 
    9892                 : #include <pshpack2.h>
    9893                 : 
    9894                 : typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {
    9895                 :     BYTE  bAuxType;                  // IMAGE_AUX_SYMBOL_TYPE
    9896                 :     BYTE  bReserved;                 // Must be 0
    9897                 :     DWORD SymbolTableIndex;
    9898                 :     BYTE  rgbReserved[12];           // Must be 0
    9899                 : } IMAGE_AUX_SYMBOL_TOKEN_DEF;
    9900                 : 
    9901                 : typedef IMAGE_AUX_SYMBOL_TOKEN_DEF UNALIGNED *PIMAGE_AUX_SYMBOL_TOKEN_DEF;
    9902                 : 
    9903                 : #include <poppack.h>
    9904                 : 
    9905                 : //
    9906                 : // Communal selection types.
    9907                 : //
    9908                 : 
    9909                 : #define IMAGE_COMDAT_SELECT_NODUPLICATES    1
    9910                 : #define IMAGE_COMDAT_SELECT_ANY             2
    9911                 : #define IMAGE_COMDAT_SELECT_SAME_SIZE       3
    9912                 : #define IMAGE_COMDAT_SELECT_EXACT_MATCH     4
    9913                 : #define IMAGE_COMDAT_SELECT_ASSOCIATIVE     5
    9914                 : #define IMAGE_COMDAT_SELECT_LARGEST         6
    9915                 : #define IMAGE_COMDAT_SELECT_NEWEST          7
    9916                 : 
    9917                 : #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY  1
    9918                 : #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY    2
    9919                 : #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS      3
    9920                 : 
    9921                 : //
    9922                 : // Relocation format.
    9923                 : //
    9924                 : 
    9925                 : typedef struct _IMAGE_RELOCATION {
    9926                 :     union {
    9927                 :         DWORD   VirtualAddress;
    9928                 :         DWORD   RelocCount;             // Set to the real count when IMAGE_SCN_LNK_NRELOC_OVFL is set
    9929                 :     };
    9930                 :     DWORD   SymbolTableIndex;
    9931                 :     WORD    Type;
    9932                 : } IMAGE_RELOCATION;
    9933                 : typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;
    9934                 : 
    9935                 : //
    9936                 : // I386 relocation types.
    9937                 : //
    9938                 : #define IMAGE_REL_I386_ABSOLUTE         0x0000  // Reference is absolute, no relocation is necessary
    9939                 : #define IMAGE_REL_I386_DIR16            0x0001  // Direct 16-bit reference to the symbols virtual address
    9940                 : #define IMAGE_REL_I386_REL16            0x0002  // PC-relative 16-bit reference to the symbols virtual address
    9941                 : #define IMAGE_REL_I386_DIR32            0x0006  // Direct 32-bit reference to the symbols virtual address
    9942                 : #define IMAGE_REL_I386_DIR32NB          0x0007  // Direct 32-bit reference to the symbols virtual address, base not included
    9943                 : #define IMAGE_REL_I386_SEG12            0x0009  // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
    9944                 : #define IMAGE_REL_I386_SECTION          0x000A
    9945                 : #define IMAGE_REL_I386_SECREL           0x000B
    9946                 : #define IMAGE_REL_I386_TOKEN            0x000C  // clr token
    9947                 : #define IMAGE_REL_I386_SECREL7          0x000D  // 7 bit offset from base of section containing target
    9948                 : #define IMAGE_REL_I386_REL32            0x0014  // PC-relative 32-bit reference to the symbols virtual address
    9949                 : 
    9950                 : //
    9951                 : // MIPS relocation types.
    9952                 : //
    9953                 : #define IMAGE_REL_MIPS_ABSOLUTE         0x0000  // Reference is absolute, no relocation is necessary
    9954                 : #define IMAGE_REL_MIPS_REFHALF          0x0001
    9955                 : #define IMAGE_REL_MIPS_REFWORD          0x0002
    9956                 : #define IMAGE_REL_MIPS_JMPADDR          0x0003
    9957                 : #define IMAGE_REL_MIPS_REFHI            0x0004
    9958                 : #define IMAGE_REL_MIPS_REFLO            0x0005
    9959                 : #define IMAGE_REL_MIPS_GPREL            0x0006
    9960                 : #define IMAGE_REL_MIPS_LITERAL          0x0007
    9961                 : #define IMAGE_REL_MIPS_SECTION          0x000A
    9962                 : #define IMAGE_REL_MIPS_SECREL           0x000B
    9963                 : #define IMAGE_REL_MIPS_SECRELLO         0x000C  // Low 16-bit section relative referemce (used for >32k TLS)
    9964                 : #define IMAGE_REL_MIPS_SECRELHI         0x000D  // High 16-bit section relative reference (used for >32k TLS)
    9965                 : #define IMAGE_REL_MIPS_TOKEN            0x000E  // clr token
    9966                 : #define IMAGE_REL_MIPS_JMPADDR16        0x0010
    9967                 : #define IMAGE_REL_MIPS_REFWORDNB        0x0022
    9968                 : #define IMAGE_REL_MIPS_PAIR             0x0025
    9969                 : 
    9970                 : //
    9971                 : // Alpha Relocation types.
    9972                 : //
    9973                 : #define IMAGE_REL_ALPHA_ABSOLUTE        0x0000
    9974                 : #define IMAGE_REL_ALPHA_REFLONG         0x0001
    9975                 : #define IMAGE_REL_ALPHA_REFQUAD         0x0002
    9976                 : #define IMAGE_REL_ALPHA_GPREL32         0x0003
    9977                 : #define IMAGE_REL_ALPHA_LITERAL         0x0004
    9978                 : #define IMAGE_REL_ALPHA_LITUSE          0x0005
    9979                 : #define IMAGE_REL_ALPHA_GPDISP          0x0006
    9980                 : #define IMAGE_REL_ALPHA_BRADDR          0x0007
    9981                 : #define IMAGE_REL_ALPHA_HINT            0x0008
    9982                 : #define IMAGE_REL_ALPHA_INLINE_REFLONG  0x0009
    9983                 : #define IMAGE_REL_ALPHA_REFHI           0x000A
    9984                 : #define IMAGE_REL_ALPHA_REFLO           0x000B
    9985                 : #define IMAGE_REL_ALPHA_PAIR            0x000C
    9986                 : #define IMAGE_REL_ALPHA_MATCH           0x000D
    9987                 : #define IMAGE_REL_ALPHA_SECTION         0x000E
    9988                 : #define IMAGE_REL_ALPHA_SECREL          0x000F
    9989                 : #define IMAGE_REL_ALPHA_REFLONGNB       0x0010
    9990                 : #define IMAGE_REL_ALPHA_SECRELLO        0x0011  // Low 16-bit section relative reference
    9991                 : #define IMAGE_REL_ALPHA_SECRELHI        0x0012  // High 16-bit section relative reference
    9992                 : #define IMAGE_REL_ALPHA_REFQ3           0x0013  // High 16 bits of 48 bit reference
    9993                 : #define IMAGE_REL_ALPHA_REFQ2           0x0014  // Middle 16 bits of 48 bit reference
    9994                 : #define IMAGE_REL_ALPHA_REFQ1           0x0015  // Low 16 bits of 48 bit reference
    9995                 : #define IMAGE_REL_ALPHA_GPRELLO         0x0016  // Low 16-bit GP relative reference
    9996                 : #define IMAGE_REL_ALPHA_GPRELHI         0x0017  // High 16-bit GP relative reference
    9997                 : 
    9998                 : //
    9999                 : // IBM PowerPC relocation types.
   10000                 : //
   10001                 : #define IMAGE_REL_PPC_ABSOLUTE          0x0000  // NOP
   10002                 : #define IMAGE_REL_PPC_ADDR64            0x0001  // 64-bit address
   10003                 : #define IMAGE_REL_PPC_ADDR32            0x0002  // 32-bit address
   10004                 : #define IMAGE_REL_PPC_ADDR24            0x0003  // 26-bit address, shifted left 2 (branch absolute)
   10005                 : #define IMAGE_REL_PPC_ADDR16            0x0004  // 16-bit address
   10006                 : #define IMAGE_REL_PPC_ADDR14            0x0005  // 16-bit address, shifted left 2 (load doubleword)
   10007                 : #define IMAGE_REL_PPC_REL24             0x0006  // 26-bit PC-relative offset, shifted left 2 (branch relative)
   10008                 : #define IMAGE_REL_PPC_REL14             0x0007  // 16-bit PC-relative offset, shifted left 2 (br cond relative)
   10009                 : #define IMAGE_REL_PPC_TOCREL16          0x0008  // 16-bit offset from TOC base
   10010                 : #define IMAGE_REL_PPC_TOCREL14          0x0009  // 16-bit offset from TOC base, shifted left 2 (load doubleword)
   10011                 : 
   10012                 : #define IMAGE_REL_PPC_ADDR32NB          0x000A  // 32-bit addr w/o image base
   10013                 : #define IMAGE_REL_PPC_SECREL            0x000B  // va of containing section (as in an image sectionhdr)
   10014                 : #define IMAGE_REL_PPC_SECTION           0x000C  // sectionheader number
   10015                 : #define IMAGE_REL_PPC_IFGLUE            0x000D  // substitute TOC restore instruction iff symbol is glue code
   10016                 : #define IMAGE_REL_PPC_IMGLUE            0x000E  // symbol is glue code; virtual address is TOC restore instruction
   10017                 : #define IMAGE_REL_PPC_SECREL16          0x000F  // va of containing section (limited to 16 bits)
   10018                 : #define IMAGE_REL_PPC_REFHI             0x0010
   10019                 : #define IMAGE_REL_PPC_REFLO             0x0011
   10020                 : #define IMAGE_REL_PPC_PAIR              0x0012
   10021                 : #define IMAGE_REL_PPC_SECRELLO          0x0013  // Low 16-bit section relative reference (used for >32k TLS)
   10022                 : #define IMAGE_REL_PPC_SECRELHI          0x0014  // High 16-bit section relative reference (used for >32k TLS)
   10023                 : #define IMAGE_REL_PPC_GPREL             0x0015
   10024                 : #define IMAGE_REL_PPC_TOKEN             0x0016  // clr token
   10025                 : 
   10026                 : #define IMAGE_REL_PPC_TYPEMASK          0x00FF  // mask to isolate above values in IMAGE_RELOCATION.Type
   10027                 : 
   10028                 : // Flag bits in IMAGE_RELOCATION.TYPE
   10029                 : 
   10030                 : #define IMAGE_REL_PPC_NEG               0x0100  // subtract reloc value rather than adding it
   10031                 : #define IMAGE_REL_PPC_BRTAKEN           0x0200  // fix branch prediction bit to predict branch taken
   10032                 : #define IMAGE_REL_PPC_BRNTAKEN          0x0400  // fix branch prediction bit to predict branch not taken
   10033                 : #define IMAGE_REL_PPC_TOCDEFN           0x0800  // toc slot defined in file (or, data in toc)
   10034                 : 
   10035                 : //
   10036                 : // Hitachi SH3 relocation types.
   10037                 : //
   10038                 : #define IMAGE_REL_SH3_ABSOLUTE          0x0000  // No relocation
   10039                 : #define IMAGE_REL_SH3_DIRECT16          0x0001  // 16 bit direct
   10040                 : #define IMAGE_REL_SH3_DIRECT32          0x0002  // 32 bit direct
   10041                 : #define IMAGE_REL_SH3_DIRECT8           0x0003  // 8 bit direct, -128..255
   10042                 : #define IMAGE_REL_SH3_DIRECT8_WORD      0x0004  // 8 bit direct .W (0 ext.)
   10043                 : #define IMAGE_REL_SH3_DIRECT8_LONG      0x0005  // 8 bit direct .L (0 ext.)
   10044                 : #define IMAGE_REL_SH3_DIRECT4           0x0006  // 4 bit direct (0 ext.)
   10045                 : #define IMAGE_REL_SH3_DIRECT4_WORD      0x0007  // 4 bit direct .W (0 ext.)
   10046                 : #define IMAGE_REL_SH3_DIRECT4_LONG      0x0008  // 4 bit direct .L (0 ext.)
   10047                 : #define IMAGE_REL_SH3_PCREL8_WORD       0x0009  // 8 bit PC relative .W
   10048                 : #define IMAGE_REL_SH3_PCREL8_LONG       0x000A  // 8 bit PC relative .L
   10049                 : #define IMAGE_REL_SH3_PCREL12_WORD      0x000B  // 12 LSB PC relative .W
   10050                 : #define IMAGE_REL_SH3_STARTOF_SECTION   0x000C  // Start of EXE section
   10051                 : #define IMAGE_REL_SH3_SIZEOF_SECTION    0x000D  // Size of EXE section
   10052                 : #define IMAGE_REL_SH3_SECTION           0x000E  // Section table index
   10053                 : #define IMAGE_REL_SH3_SECREL            0x000F  // Offset within section
   10054                 : #define IMAGE_REL_SH3_DIRECT32_NB       0x0010  // 32 bit direct not based
   10055                 : #define IMAGE_REL_SH3_GPREL4_LONG       0x0011  // GP-relative addressing
   10056                 : #define IMAGE_REL_SH3_TOKEN             0x0012  // clr token
   10057                 : #define IMAGE_REL_SHM_PCRELPT           0x0013  // Offset from current
   10058                 :                                                 //  instruction in longwords
   10059                 :                                                 //  if not NOMODE, insert the
   10060                 :                                                 //  inverse of the low bit at
   10061                 :                                                 //  bit 32 to select PTA/PTB
   10062                 : #define IMAGE_REL_SHM_REFLO             0x0014  // Low bits of 32-bit address
   10063                 : #define IMAGE_REL_SHM_REFHALF           0x0015  // High bits of 32-bit address
   10064                 : #define IMAGE_REL_SHM_RELLO             0x0016  // Low bits of relative reference
   10065                 : #define IMAGE_REL_SHM_RELHALF           0x0017  // High bits of relative reference
   10066                 : #define IMAGE_REL_SHM_PAIR              0x0018  // offset operand for relocation
   10067                 : 
   10068                 : #define IMAGE_REL_SH_NOMODE             0x8000  // relocation ignores section mode
   10069                 : 
   10070                 : 
   10071                 : #define IMAGE_REL_ARM_ABSOLUTE          0x0000  // No relocation required
   10072                 : #define IMAGE_REL_ARM_ADDR32            0x0001  // 32 bit address
   10073                 : #define IMAGE_REL_ARM_ADDR32NB          0x0002  // 32 bit address w/o image base
   10074                 : #define IMAGE_REL_ARM_BRANCH24          0x0003  // 24 bit offset << 2 & sign ext.
   10075                 : #define IMAGE_REL_ARM_BRANCH11          0x0004  // Thumb: 2 11 bit offsets
   10076                 : #define IMAGE_REL_ARM_TOKEN             0x0005  // clr token
   10077                 : #define IMAGE_REL_ARM_GPREL12           0x0006  // GP-relative addressing (ARM)
   10078                 : #define IMAGE_REL_ARM_GPREL7            0x0007  // GP-relative addressing (Thumb)
   10079                 : #define IMAGE_REL_ARM_BLX24             0x0008
   10080                 : #define IMAGE_REL_ARM_BLX11             0x0009
   10081                 : #define IMAGE_REL_ARM_SECTION           0x000E  // Section table index
   10082                 : #define IMAGE_REL_ARM_SECREL            0x000F  // Offset within section
   10083                 : 
   10084                 : #define IMAGE_REL_AM_ABSOLUTE           0x0000
   10085                 : #define IMAGE_REL_AM_ADDR32             0x0001
   10086                 : #define IMAGE_REL_AM_ADDR32NB           0x0002
   10087                 : #define IMAGE_REL_AM_CALL32             0x0003
   10088                 : #define IMAGE_REL_AM_FUNCINFO           0x0004
   10089                 : #define IMAGE_REL_AM_REL32_1            0x0005
   10090                 : #define IMAGE_REL_AM_REL32_2            0x0006
   10091                 : #define IMAGE_REL_AM_SECREL             0x0007
   10092                 : #define IMAGE_REL_AM_SECTION            0x0008
   10093                 : #define IMAGE_REL_AM_TOKEN              0x0009
   10094                 : 
   10095                 : //
   10096                 : // x64 relocations
   10097                 : //
   10098                 : #define IMAGE_REL_AMD64_ABSOLUTE        0x0000  // Reference is absolute, no relocation is necessary
   10099                 : #define IMAGE_REL_AMD64_ADDR64          0x0001  // 64-bit address (VA).
   10100                 : #define IMAGE_REL_AMD64_ADDR32          0x0002  // 32-bit address (VA).
   10101                 : #define IMAGE_REL_AMD64_ADDR32NB        0x0003  // 32-bit address w/o image base (RVA).
   10102                 : #define IMAGE_REL_AMD64_REL32           0x0004  // 32-bit relative address from byte following reloc
   10103                 : #define IMAGE_REL_AMD64_REL32_1         0x0005  // 32-bit relative address from byte distance 1 from reloc
   10104                 : #define IMAGE_REL_AMD64_REL32_2         0x0006  // 32-bit relative address from byte distance 2 from reloc
   10105                 : #define IMAGE_REL_AMD64_REL32_3         0x0007  // 32-bit relative address from byte distance 3 from reloc
   10106                 : #define IMAGE_REL_AMD64_REL32_4         0x0008  // 32-bit relative address from byte distance 4 from reloc
   10107                 : #define IMAGE_REL_AMD64_REL32_5         0x0009  // 32-bit relative address from byte distance 5 from reloc
   10108                 : #define IMAGE_REL_AMD64_SECTION         0x000A  // Section index
   10109                 : #define IMAGE_REL_AMD64_SECREL          0x000B  // 32 bit offset from base of section containing target
   10110                 : #define IMAGE_REL_AMD64_SECREL7         0x000C  // 7 bit unsigned offset from base of section containing target
   10111                 : #define IMAGE_REL_AMD64_TOKEN           0x000D  // 32 bit metadata token
   10112                 : #define IMAGE_REL_AMD64_SREL32          0x000E  // 32 bit signed span-dependent value emitted into object
   10113                 : #define IMAGE_REL_AMD64_PAIR            0x000F
   10114                 : #define IMAGE_REL_AMD64_SSPAN32         0x0010  // 32 bit signed span-dependent value applied at link time
   10115                 : 
   10116                 : //
   10117                 : // IA64 relocation types.
   10118                 : //
   10119                 : #define IMAGE_REL_IA64_ABSOLUTE         0x0000
   10120                 : #define IMAGE_REL_IA64_IMM14            0x0001
   10121                 : #define IMAGE_REL_IA64_IMM22            0x0002
   10122                 : #define IMAGE_REL_IA64_IMM64            0x0003
   10123                 : #define IMAGE_REL_IA64_DIR32            0x0004
   10124                 : #define IMAGE_REL_IA64_DIR64            0x0005
   10125                 : #define IMAGE_REL_IA64_PCREL21B         0x0006
   10126                 : #define IMAGE_REL_IA64_PCREL21M         0x0007
   10127                 : #define IMAGE_REL_IA64_PCREL21F         0x0008
   10128                 : #define IMAGE_REL_IA64_GPREL22          0x0009
   10129                 : #define IMAGE_REL_IA64_LTOFF22          0x000A
   10130                 : #define IMAGE_REL_IA64_SECTION          0x000B
   10131                 : #define IMAGE_REL_IA64_SECREL22         0x000C
   10132                 : #define IMAGE_REL_IA64_SECREL64I        0x000D
   10133                 : #define IMAGE_REL_IA64_SECREL32         0x000E
   10134                 : //
   10135                 : #define IMAGE_REL_IA64_DIR32NB          0x0010
   10136                 : #define IMAGE_REL_IA64_SREL14           0x0011
   10137                 : #define IMAGE_REL_IA64_SREL22           0x0012
   10138                 : #define IMAGE_REL_IA64_SREL32           0x0013
   10139                 : #define IMAGE_REL_IA64_UREL32           0x0014
   10140                 : #define IMAGE_REL_IA64_PCREL60X         0x0015  // This is always a BRL and never converted
   10141                 : #define IMAGE_REL_IA64_PCREL60B         0x0016  // If possible, convert to MBB bundle with NOP.B in slot 1
   10142                 : #define IMAGE_REL_IA64_PCREL60F         0x0017  // If possible, convert to MFB bundle with NOP.F in slot 1
   10143                 : #define IMAGE_REL_IA64_PCREL60I         0x0018  // If possible, convert to MIB bundle with NOP.I in slot 1
   10144                 : #define IMAGE_REL_IA64_PCREL60M         0x0019  // If possible, convert to MMB bundle with NOP.M in slot 1
   10145                 : #define IMAGE_REL_IA64_IMMGPREL64       0x001A
   10146                 : #define IMAGE_REL_IA64_TOKEN            0x001B  // clr token
   10147                 : #define IMAGE_REL_IA64_GPREL32          0x001C
   10148                 : #define IMAGE_REL_IA64_ADDEND           0x001F
   10149                 : 
   10150                 : //
   10151                 : // CEF relocation types.
   10152                 : //
   10153                 : #define IMAGE_REL_CEF_ABSOLUTE          0x0000  // Reference is absolute, no relocation is necessary
   10154                 : #define IMAGE_REL_CEF_ADDR32            0x0001  // 32-bit address (VA).
   10155                 : #define IMAGE_REL_CEF_ADDR64            0x0002  // 64-bit address (VA).
   10156                 : #define IMAGE_REL_CEF_ADDR32NB          0x0003  // 32-bit address w/o image base (RVA).
   10157                 : #define IMAGE_REL_CEF_SECTION           0x0004  // Section index
   10158                 : #define IMAGE_REL_CEF_SECREL            0x0005  // 32 bit offset from base of section containing target
   10159                 : #define IMAGE_REL_CEF_TOKEN             0x0006  // 32 bit metadata token
   10160                 : 
   10161                 : //
   10162                 : // clr relocation types.
   10163                 : //
   10164                 : #define IMAGE_REL_CEE_ABSOLUTE          0x0000  // Reference is absolute, no relocation is necessary
   10165                 : #define IMAGE_REL_CEE_ADDR32            0x0001  // 32-bit address (VA).
   10166                 : #define IMAGE_REL_CEE_ADDR64            0x0002  // 64-bit address (VA).
   10167                 : #define IMAGE_REL_CEE_ADDR32NB          0x0003  // 32-bit address w/o image base (RVA).
   10168                 : #define IMAGE_REL_CEE_SECTION           0x0004  // Section index
   10169                 : #define IMAGE_REL_CEE_SECREL            0x0005  // 32 bit offset from base of section containing target
   10170                 : #define IMAGE_REL_CEE_TOKEN             0x0006  // 32 bit metadata token
   10171                 : 
   10172                 : 
   10173                 : #define IMAGE_REL_M32R_ABSOLUTE         0x0000  // No relocation required
   10174                 : #define IMAGE_REL_M32R_ADDR32           0x0001  // 32 bit address
   10175                 : #define IMAGE_REL_M32R_ADDR32NB         0x0002  // 32 bit address w/o image base
   10176                 : #define IMAGE_REL_M32R_ADDR24           0x0003  // 24 bit address
   10177                 : #define IMAGE_REL_M32R_GPREL16          0x0004  // GP relative addressing
   10178                 : #define IMAGE_REL_M32R_PCREL24          0x0005  // 24 bit offset << 2 & sign ext.
   10179                 : #define IMAGE_REL_M32R_PCREL16          0x0006  // 16 bit offset << 2 & sign ext.
   10180                 : #define IMAGE_REL_M32R_PCREL8           0x0007  // 8 bit offset << 2 & sign ext.
   10181                 : #define IMAGE_REL_M32R_REFHALF          0x0008  // 16 MSBs
   10182                 : #define IMAGE_REL_M32R_REFHI            0x0009  // 16 MSBs; adj for LSB sign ext.
   10183                 : #define IMAGE_REL_M32R_REFLO            0x000A  // 16 LSBs
   10184                 : #define IMAGE_REL_M32R_PAIR             0x000B  // Link HI and LO
   10185                 : #define IMAGE_REL_M32R_SECTION          0x000C  // Section table index
   10186                 : #define IMAGE_REL_M32R_SECREL32         0x000D  // 32 bit section relative reference
   10187                 : #define IMAGE_REL_M32R_TOKEN            0x000E  // clr token
   10188                 : 
   10189                 : #define IMAGE_REL_EBC_ABSOLUTE          0x0000  // No relocation required
   10190                 : #define IMAGE_REL_EBC_ADDR32NB          0x0001  // 32 bit address w/o image base
   10191                 : #define IMAGE_REL_EBC_REL32             0x0002  // 32-bit relative address from byte following reloc
   10192                 : #define IMAGE_REL_EBC_SECTION           0x0003  // Section table index
   10193                 : #define IMAGE_REL_EBC_SECREL            0x0004  // Offset within section
   10194                 : 
   10195                 : #define EXT_IMM64(Value, Address, Size, InstPos, ValPos)  /* Intel-IA64-Filler */           \
   10196                 :     Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos)  // Intel-IA64-Filler
   10197                 : 
   10198                 : #define INS_IMM64(Value, Address, Size, InstPos, ValPos)  /* Intel-IA64-Filler */\
   10199                 :     *(PDWORD)Address = (*(PDWORD)Address & ~(((1 << Size) - 1) << InstPos)) | /* Intel-IA64-Filler */\
   10200                 :           ((DWORD)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos)  // Intel-IA64-Filler
   10201                 : 
   10202                 : #define EMARCH_ENC_I17_IMM7B_INST_WORD_X         3  // Intel-IA64-Filler
   10203                 : #define EMARCH_ENC_I17_IMM7B_SIZE_X              7  // Intel-IA64-Filler
   10204                 : #define EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X     4  // Intel-IA64-Filler
   10205                 : #define EMARCH_ENC_I17_IMM7B_VAL_POS_X           0  // Intel-IA64-Filler
   10206                 : 
   10207                 : #define EMARCH_ENC_I17_IMM9D_INST_WORD_X         3  // Intel-IA64-Filler
   10208                 : #define EMARCH_ENC_I17_IMM9D_SIZE_X              9  // Intel-IA64-Filler
   10209                 : #define EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X     18 // Intel-IA64-Filler
   10210                 : #define EMARCH_ENC_I17_IMM9D_VAL_POS_X           7  // Intel-IA64-Filler
   10211                 : 
   10212                 : #define EMARCH_ENC_I17_IMM5C_INST_WORD_X         3  // Intel-IA64-Filler
   10213                 : #define EMARCH_ENC_I17_IMM5C_SIZE_X              5  // Intel-IA64-Filler
   10214                 : #define EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X     13 // Intel-IA64-Filler
   10215                 : #define EMARCH_ENC_I17_IMM5C_VAL_POS_X           16 // Intel-IA64-Filler
   10216                 : 
   10217                 : #define EMARCH_ENC_I17_IC_INST_WORD_X            3  // Intel-IA64-Filler
   10218                 : #define EMARCH_ENC_I17_IC_SIZE_X                 1  // Intel-IA64-Filler
   10219                 : #define EMARCH_ENC_I17_IC_INST_WORD_POS_X        12 // Intel-IA64-Filler
   10220                 : #define EMARCH_ENC_I17_IC_VAL_POS_X              21 // Intel-IA64-Filler
   10221                 : 
   10222                 : #define EMARCH_ENC_I17_IMM41a_INST_WORD_X        1  // Intel-IA64-Filler
   10223                 : #define EMARCH_ENC_I17_IMM41a_SIZE_X             10 // Intel-IA64-Filler
   10224                 : #define EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X    14 // Intel-IA64-Filler
   10225                 : #define EMARCH_ENC_I17_IMM41a_VAL_POS_X          22 // Intel-IA64-Filler
   10226                 : 
   10227                 : #define EMARCH_ENC_I17_IMM41b_INST_WORD_X        1  // Intel-IA64-Filler
   10228                 : #define EMARCH_ENC_I17_IMM41b_SIZE_X             8  // Intel-IA64-Filler
   10229                 : #define EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X    24 // Intel-IA64-Filler
   10230                 : #define EMARCH_ENC_I17_IMM41b_VAL_POS_X          32 // Intel-IA64-Filler
   10231                 : 
   10232                 : #define EMARCH_ENC_I17_IMM41c_INST_WORD_X        2  // Intel-IA64-Filler
   10233                 : #define EMARCH_ENC_I17_IMM41c_SIZE_X             23 // Intel-IA64-Filler
   10234                 : #define EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X    0  // Intel-IA64-Filler
   10235                 : #define EMARCH_ENC_I17_IMM41c_VAL_POS_X          40 // Intel-IA64-Filler
   10236                 : 
   10237                 : #define EMARCH_ENC_I17_SIGN_INST_WORD_X          3  // Intel-IA64-Filler
   10238                 : #define EMARCH_ENC_I17_SIGN_SIZE_X               1  // Intel-IA64-Filler
   10239                 : #define EMARCH_ENC_I17_SIGN_INST_WORD_POS_X      27 // Intel-IA64-Filler
   10240                 : #define EMARCH_ENC_I17_SIGN_VAL_POS_X            63 // Intel-IA64-Filler
   10241                 : 
   10242                 : #define X3_OPCODE_INST_WORD_X                    3  // Intel-IA64-Filler
   10243                 : #define X3_OPCODE_SIZE_X                         4  // Intel-IA64-Filler
   10244                 : #define X3_OPCODE_INST_WORD_POS_X                28 // Intel-IA64-Filler
   10245                 : #define X3_OPCODE_SIGN_VAL_POS_X                 0  // Intel-IA64-Filler
   10246                 : 
   10247                 : #define X3_I_INST_WORD_X                         3  // Intel-IA64-Filler
   10248                 : #define X3_I_SIZE_X                              1  // Intel-IA64-Filler
   10249                 : #define X3_I_INST_WORD_POS_X                     27 // Intel-IA64-Filler
   10250                 : #define X3_I_SIGN_VAL_POS_X                      59 // Intel-IA64-Filler
   10251                 : 
   10252                 : #define X3_D_WH_INST_WORD_X                      3  // Intel-IA64-Filler
   10253                 : #define X3_D_WH_SIZE_X                           3  // Intel-IA64-Filler
   10254                 : #define X3_D_WH_INST_WORD_POS_X                  24 // Intel-IA64-Filler
   10255                 : #define X3_D_WH_SIGN_VAL_POS_X                   0  // Intel-IA64-Filler
   10256                 : 
   10257                 : #define X3_IMM20_INST_WORD_X                     3  // Intel-IA64-Filler
   10258                 : #define X3_IMM20_SIZE_X                          20 // Intel-IA64-Filler
   10259                 : #define X3_IMM20_INST_WORD_POS_X                 4  // Intel-IA64-Filler
   10260                 : #define X3_IMM20_SIGN_VAL_POS_X                  0  // Intel-IA64-Filler
   10261                 : 
   10262                 : #define X3_IMM39_1_INST_WORD_X                   2  // Intel-IA64-Filler
   10263                 : #define X3_IMM39_1_SIZE_X                        23 // Intel-IA64-Filler
   10264                 : #define X3_IMM39_1_INST_WORD_POS_X               0  // Intel-IA64-Filler
   10265                 : #define X3_IMM39_1_SIGN_VAL_POS_X                36 // Intel-IA64-Filler
   10266                 : 
   10267                 : #define X3_IMM39_2_INST_WORD_X                   1  // Intel-IA64-Filler
   10268                 : #define X3_IMM39_2_SIZE_X                        16 // Intel-IA64-Filler
   10269                 : #define X3_IMM39_2_INST_WORD_POS_X               16 // Intel-IA64-Filler
   10270                 : #define X3_IMM39_2_SIGN_VAL_POS_X                20 // Intel-IA64-Filler
   10271                 : 
   10272                 : #define X3_P_INST_WORD_X                         3  // Intel-IA64-Filler
   10273                 : #define X3_P_SIZE_X                              4  // Intel-IA64-Filler
   10274                 : #define X3_P_INST_WORD_POS_X                     0  // Intel-IA64-Filler
   10275                 : #define X3_P_SIGN_VAL_POS_X                      0  // Intel-IA64-Filler
   10276                 : 
   10277                 : #define X3_TMPLT_INST_WORD_X                     0  // Intel-IA64-Filler
   10278                 : #define X3_TMPLT_SIZE_X                          4  // Intel-IA64-Filler
   10279                 : #define X3_TMPLT_INST_WORD_POS_X                 0  // Intel-IA64-Filler
   10280                 : #define X3_TMPLT_SIGN_VAL_POS_X                  0  // Intel-IA64-Filler
   10281                 : 
   10282                 : #define X3_BTYPE_QP_INST_WORD_X                  2  // Intel-IA64-Filler
   10283                 : #define X3_BTYPE_QP_SIZE_X                       9  // Intel-IA64-Filler
   10284                 : #define X3_BTYPE_QP_INST_WORD_POS_X              23 // Intel-IA64-Filler
   10285                 : #define X3_BTYPE_QP_INST_VAL_POS_X               0  // Intel-IA64-Filler
   10286                 : 
   10287                 : #define X3_EMPTY_INST_WORD_X                     1  // Intel-IA64-Filler
   10288                 : #define X3_EMPTY_SIZE_X                          2  // Intel-IA64-Filler
   10289                 : #define X3_EMPTY_INST_WORD_POS_X                 14 // Intel-IA64-Filler
   10290                 : #define X3_EMPTY_INST_VAL_POS_X                  0  // Intel-IA64-Filler
   10291                 : 
   10292                 : //
   10293                 : // Line number format.
   10294                 : //
   10295                 : 
   10296                 : typedef struct _IMAGE_LINENUMBER {
   10297                 :     union {
   10298                 :         DWORD   SymbolTableIndex;               // Symbol table index of function name if Linenumber is 0.
   10299                 :         DWORD   VirtualAddress;                 // Virtual address of line number.
   10300                 :     } Type;
   10301                 :     WORD    Linenumber;                         // Line number.
   10302                 : } IMAGE_LINENUMBER;
   10303                 : typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;
   10304                 : 
   10305                 : #ifndef _MAC
   10306                 : #include "poppack.h"                        // Back to 4 byte packing
   10307                 : #endif
   10308                 : 
   10309                 : //
   10310                 : // Based relocation format.
   10311                 : //
   10312                 : 
   10313                 : typedef struct _IMAGE_BASE_RELOCATION {
   10314                 :     DWORD   VirtualAddress;
   10315                 :     DWORD   SizeOfBlock;
   10316                 : //  WORD    TypeOffset[1];
   10317                 : } IMAGE_BASE_RELOCATION;
   10318                 : typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
   10319                 : 
   10320                 : //
   10321                 : // Based relocation types.
   10322                 : //
   10323                 : 
   10324                 : #define IMAGE_REL_BASED_ABSOLUTE              0
   10325                 : #define IMAGE_REL_BASED_HIGH                  1
   10326                 : #define IMAGE_REL_BASED_LOW                   2
   10327                 : #define IMAGE_REL_BASED_HIGHLOW               3
   10328                 : #define IMAGE_REL_BASED_HIGHADJ               4
   10329                 : #define IMAGE_REL_BASED_MIPS_JMPADDR          5
   10330                 : #define IMAGE_REL_BASED_MIPS_JMPADDR16        9
   10331                 : #define IMAGE_REL_BASED_IA64_IMM64            9
   10332                 : #define IMAGE_REL_BASED_DIR64                 10
   10333                 : 
   10334                 : 
   10335                 : //
   10336                 : // Archive format.
   10337                 : //
   10338                 : 
   10339                 : #define IMAGE_ARCHIVE_START_SIZE             8
   10340                 : #define IMAGE_ARCHIVE_START                  "!<arch>\n"
   10341                 : #define IMAGE_ARCHIVE_END                    "`\n"
   10342                 : #define IMAGE_ARCHIVE_PAD                    "\n"
   10343                 : #define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "
   10344                 : #define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "
   10345                 : 
   10346                 : typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
   10347                 :     BYTE     Name[16];                          // File member name - `/' terminated.
   10348                 :     BYTE     Date[12];                          // File member date - decimal.
   10349                 :     BYTE     UserID[6];                         // File member user id - decimal.
   10350                 :     BYTE     GroupID[6];                        // File member group id - decimal.
   10351                 :     BYTE     Mode[8];                           // File member mode - octal.
   10352                 :     BYTE     Size[10];                          // File member size - decimal.
   10353                 :     BYTE     EndHeader[2];                      // String to end header.
   10354                 : } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
   10355                 : 
   10356                 : #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60
   10357                 : 
   10358                 : //
   10359                 : // DLL support.
   10360                 : //
   10361                 : 
   10362                 : //
   10363                 : // Export Format
   10364                 : //
   10365                 : 
   10366                 : typedef struct _IMAGE_EXPORT_DIRECTORY {
   10367                 :     DWORD   Characteristics;
   10368                 :     DWORD   TimeDateStamp;
   10369                 :     WORD    MajorVersion;
   10370                 :     WORD    MinorVersion;
   10371                 :     DWORD   Name;
   10372                 :     DWORD   Base;
   10373                 :     DWORD   NumberOfFunctions;
   10374                 :     DWORD   NumberOfNames;
   10375                 :     DWORD   AddressOfFunctions;     // RVA from base of image
   10376                 :     DWORD   AddressOfNames;         // RVA from base of image
   10377                 :     DWORD   AddressOfNameOrdinals;  // RVA from base of image
   10378                 : } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
   10379                 : 
   10380                 : //
   10381                 : // Import Format
   10382                 : //
   10383                 : 
   10384                 : typedef struct _IMAGE_IMPORT_BY_NAME {
   10385                 :     WORD    Hint;
   10386                 :     BYTE    Name[1];
   10387                 : } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
   10388                 : 
   10389                 : #include "pshpack8.h"                       // Use align 8 for the 64-bit IAT.
   10390                 : 
   10391                 : typedef struct _IMAGE_THUNK_DATA64 {
   10392                 :     union {
   10393                 :         ULONGLONG ForwarderString;  // PBYTE 
   10394                 :         ULONGLONG Function;         // PDWORD
   10395                 :         ULONGLONG Ordinal;
   10396                 :         ULONGLONG AddressOfData;    // PIMAGE_IMPORT_BY_NAME
   10397                 :     } u1;
   10398                 : } IMAGE_THUNK_DATA64;
   10399                 : typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;
   10400                 : 
   10401                 : #include "poppack.h"                        // Back to 4 byte packing
   10402                 : 
   10403                 : typedef struct _IMAGE_THUNK_DATA32 {
   10404                 :     union {
   10405                 :         DWORD ForwarderString;      // PBYTE 
   10406                 :         DWORD Function;             // PDWORD
   10407                 :         DWORD Ordinal;
   10408                 :         DWORD AddressOfData;        // PIMAGE_IMPORT_BY_NAME
   10409                 :     } u1;
   10410                 : } IMAGE_THUNK_DATA32;
   10411                 : typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;
   10412                 : 
   10413                 : #define IMAGE_ORDINAL_FLAG64 0x8000000000000000
   10414                 : #define IMAGE_ORDINAL_FLAG32 0x80000000
   10415                 : #define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)
   10416                 : #define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)
   10417                 : #define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)
   10418                 : #define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)
   10419                 : 
   10420                 : //
   10421                 : // Thread Local Storage
   10422                 : //
   10423                 : 
   10424                 : typedef VOID
   10425                 : (NTAPI *PIMAGE_TLS_CALLBACK) (
   10426                 :     PVOID DllHandle,
   10427                 :     DWORD Reason,
   10428                 :     PVOID Reserved
   10429                 :     );
   10430                 : 
   10431                 : typedef struct _IMAGE_TLS_DIRECTORY64 {
   10432                 :     ULONGLONG   StartAddressOfRawData;
   10433                 :     ULONGLONG   EndAddressOfRawData;
   10434                 :     ULONGLONG   AddressOfIndex;         // PDWORD
   10435                 :     ULONGLONG   AddressOfCallBacks;     // PIMAGE_TLS_CALLBACK *;
   10436                 :     DWORD   SizeOfZeroFill;
   10437                 :     DWORD   Characteristics;
   10438                 : } IMAGE_TLS_DIRECTORY64;
   10439                 : typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;
   10440                 : 
   10441                 : typedef struct _IMAGE_TLS_DIRECTORY32 {
   10442                 :     DWORD   StartAddressOfRawData;
   10443                 :     DWORD   EndAddressOfRawData;
   10444                 :     DWORD   AddressOfIndex;             // PDWORD
   10445                 :     DWORD   AddressOfCallBacks;         // PIMAGE_TLS_CALLBACK *
   10446                 :     DWORD   SizeOfZeroFill;
   10447                 :     DWORD   Characteristics;
   10448                 : } IMAGE_TLS_DIRECTORY32;
   10449                 : typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;
   10450                 : 
   10451                 : #ifdef _WIN64
   10452                 : #define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG64
   10453                 : #define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL64(Ordinal)
   10454                 : typedef IMAGE_THUNK_DATA64              IMAGE_THUNK_DATA;
   10455                 : typedef PIMAGE_THUNK_DATA64             PIMAGE_THUNK_DATA;
   10456                 : #define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL64(Ordinal)
   10457                 : typedef IMAGE_TLS_DIRECTORY64           IMAGE_TLS_DIRECTORY;
   10458                 : typedef PIMAGE_TLS_DIRECTORY64          PIMAGE_TLS_DIRECTORY;
   10459                 : #else
   10460                 : #define IMAGE_ORDINAL_FLAG              IMAGE_ORDINAL_FLAG32
   10461                 : #define IMAGE_ORDINAL(Ordinal)          IMAGE_ORDINAL32(Ordinal)
   10462                 : typedef IMAGE_THUNK_DATA32              IMAGE_THUNK_DATA;
   10463                 : typedef PIMAGE_THUNK_DATA32             PIMAGE_THUNK_DATA;
   10464                 : #define IMAGE_SNAP_BY_ORDINAL(Ordinal)  IMAGE_SNAP_BY_ORDINAL32(Ordinal)
   10465                 : typedef IMAGE_TLS_DIRECTORY32           IMAGE_TLS_DIRECTORY;
   10466                 : typedef PIMAGE_TLS_DIRECTORY32          PIMAGE_TLS_DIRECTORY;
   10467                 : #endif
   10468                 : 
   10469                 : typedef struct _IMAGE_IMPORT_DESCRIPTOR {
   10470                 :     union {
   10471                 :         DWORD   Characteristics;            // 0 for terminating null import descriptor
   10472                 :         DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
   10473                 :     };
   10474                 :     DWORD   TimeDateStamp;                  // 0 if not bound,
   10475                 :                                             // -1 if bound, and real date\time stamp
   10476                 :                                             //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
   10477                 :                                             // O.W. date/time stamp of DLL bound to (Old BIND)
   10478                 : 
   10479                 :     DWORD   ForwarderChain;                 // -1 if no forwarders
   10480                 :     DWORD   Name;
   10481                 :     DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
   10482                 : } IMAGE_IMPORT_DESCRIPTOR;
   10483                 : typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
   10484                 : 
   10485                 : //
   10486                 : // New format import descriptors pointed to by DataDirectory[ IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ]
   10487                 : //
   10488                 : 
   10489                 : typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
   10490                 :     DWORD   TimeDateStamp;
   10491                 :     WORD    OffsetModuleName;
   10492                 :     WORD    NumberOfModuleForwarderRefs;
   10493                 : // Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
   10494                 : } IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
   10495                 : 
   10496                 : typedef struct _IMAGE_BOUND_FORWARDER_REF {
   10497                 :     DWORD   TimeDateStamp;
   10498                 :     WORD    OffsetModuleName;
   10499                 :     WORD    Reserved;
   10500                 : } IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
   10501                 : 
   10502                 : //
   10503                 : // Resource Format.
   10504                 : //
   10505                 : 
   10506                 : //
   10507                 : // Resource directory consists of two counts, following by a variable length
   10508                 : // array of directory entries.  The first count is the number of entries at
   10509                 : // beginning of the array that have actual names associated with each entry.
   10510                 : // The entries are in ascending order, case insensitive strings.  The second
   10511                 : // count is the number of entries that immediately follow the named entries.
   10512                 : // This second count identifies the number of entries that have 16-bit integer
   10513                 : // Ids as their name.  These entries are also sorted in ascending order.
   10514                 : //
   10515                 : // This structure allows fast lookup by either name or number, but for any
   10516                 : // given resource entry only one form of lookup is supported, not both.
   10517                 : // This is consistant with the syntax of the .RC file and the .RES file.
   10518                 : //
   10519                 : 
   10520                 : typedef struct _IMAGE_RESOURCE_DIRECTORY {
   10521                 :     DWORD   Characteristics;
   10522                 :     DWORD   TimeDateStamp;
   10523                 :     WORD    MajorVersion;
   10524                 :     WORD    MinorVersion;
   10525                 :     WORD    NumberOfNamedEntries;
   10526                 :     WORD    NumberOfIdEntries;
   10527                 : //  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
   10528                 : } IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
   10529                 : 
   10530                 : #define IMAGE_RESOURCE_NAME_IS_STRING        0x80000000
   10531                 : #define IMAGE_RESOURCE_DATA_IS_DIRECTORY     0x80000000
   10532                 : //
   10533                 : // Each directory contains the 32-bit Name of the entry and an offset,
   10534                 : // relative to the beginning of the resource directory of the data associated
   10535                 : // with this directory entry.  If the name of the entry is an actual text
   10536                 : // string instead of an integer Id, then the high order bit of the name field
   10537                 : // is set to one and the low order 31-bits are an offset, relative to the
   10538                 : // beginning of the resource directory of the string, which is of type
   10539                 : // IMAGE_RESOURCE_DIRECTORY_STRING.  Otherwise the high bit is clear and the
   10540                 : // low-order 16-bits are the integer Id that identify this resource directory
   10541                 : // entry. If the directory entry is yet another resource directory (i.e. a
   10542                 : // subdirectory), then the high order bit of the offset field will be
   10543                 : // set to indicate this.  Otherwise the high bit is clear and the offset
   10544                 : // field points to a resource data entry.
   10545                 : //
   10546                 : 
   10547                 : typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
   10548                 :     union {
   10549                 :         struct {
   10550                 :             DWORD NameOffset:31;
   10551                 :             DWORD NameIsString:1;
   10552                 :         };
   10553                 :         DWORD   Name;
   10554                 :         WORD    Id;
   10555                 :     };
   10556                 :     union {
   10557                 :         DWORD   OffsetToData;
   10558                 :         struct {
   10559                 :             DWORD   OffsetToDirectory:31;
   10560                 :             DWORD   DataIsDirectory:1;
   10561                 :         };
   10562                 :     };
   10563                 : } IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
   10564                 : 
   10565                 : //
   10566                 : // For resource directory entries that have actual string names, the Name
   10567                 : // field of the directory entry points to an object of the following type.
   10568                 : // All of these string objects are stored together after the last resource
   10569                 : // directory entry and before the first resource data object.  This minimizes
   10570                 : // the impact of these variable length objects on the alignment of the fixed
   10571                 : // size directory entry objects.
   10572                 : //
   10573                 : 
   10574                 : typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
   10575                 :     WORD    Length;
   10576                 :     CHAR    NameString[ 1 ];
   10577                 : } IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
   10578                 : 
   10579                 : 
   10580                 : typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
   10581                 :     WORD    Length;
   10582                 :     WCHAR   NameString[ 1 ];
   10583                 : } IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
   10584                 : 
   10585                 : 
   10586                 : //
   10587                 : // Each resource data entry describes a leaf node in the resource directory
   10588                 : // tree.  It contains an offset, relative to the beginning of the resource
   10589                 : // directory of the data for the resource, a size field that gives the number
   10590                 : // of bytes of data at that offset, a CodePage that should be used when
   10591                 : // decoding code point values within the resource data.  Typically for new
   10592                 : // applications the code page would be the unicode code page.
   10593                 : //
   10594                 : 
   10595                 : typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
   10596                 :     DWORD   OffsetToData;
   10597                 :     DWORD   Size;
   10598                 :     DWORD   CodePage;
   10599                 :     DWORD   Reserved;
   10600                 : } IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
   10601                 : 
   10602                 : //
   10603                 : // Load Configuration Directory Entry
   10604                 : //
   10605                 : 
   10606                 : typedef struct {
   10607                 :     DWORD   Size;
   10608                 :     DWORD   TimeDateStamp;
   10609                 :     WORD    MajorVersion;
   10610                 :     WORD    MinorVersion;
   10611                 :     DWORD   GlobalFlagsClear;
   10612                 :     DWORD   GlobalFlagsSet;
   10613                 :     DWORD   CriticalSectionDefaultTimeout;
   10614                 :     DWORD   DeCommitFreeBlockThreshold;
   10615                 :     DWORD   DeCommitTotalFreeThreshold;
   10616                 :     DWORD   LockPrefixTable;            // VA
   10617                 :     DWORD   MaximumAllocationSize;
   10618                 :     DWORD   VirtualMemoryThreshold;
   10619                 :     DWORD   ProcessHeapFlags;
   10620                 :     DWORD   ProcessAffinityMask;
   10621                 :     WORD    CSDVersion;
   10622                 :     WORD    Reserved1;
   10623                 :     DWORD   EditList;                   // VA
   10624                 :     DWORD   SecurityCookie;             // VA
   10625                 :     DWORD   SEHandlerTable;             // VA
   10626                 :     DWORD   SEHandlerCount;
   10627                 : } IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
   10628                 : 
   10629                 : typedef struct {
   10630                 :     DWORD      Size;
   10631                 :     DWORD      TimeDateStamp;
   10632                 :     WORD       MajorVersion;
   10633                 :     WORD       MinorVersion;
   10634                 :     DWORD      GlobalFlagsClear;
   10635                 :     DWORD      GlobalFlagsSet;
   10636                 :     DWORD      CriticalSectionDefaultTimeout;
   10637                 :     ULONGLONG  DeCommitFreeBlockThreshold;
   10638                 :     ULONGLONG  DeCommitTotalFreeThreshold;
   10639                 :     ULONGLONG  LockPrefixTable;         // VA
   10640                 :     ULONGLONG  MaximumAllocationSize;
   10641                 :     ULONGLONG  VirtualMemoryThreshold;
   10642                 :     ULONGLONG  ProcessAffinityMask;
   10643                 :     DWORD      ProcessHeapFlags;
   10644                 :     WORD       CSDVersion;
   10645                 :     WORD       Reserved1;
   10646                 :     ULONGLONG  EditList;                // VA
   10647                 :     ULONGLONG  SecurityCookie;          // VA
   10648                 :     ULONGLONG  SEHandlerTable;          // VA
   10649                 :     ULONGLONG  SEHandlerCount;
   10650                 : } IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
   10651                 : 
   10652                 : #ifdef _WIN64
   10653                 : typedef IMAGE_LOAD_CONFIG_DIRECTORY64     IMAGE_LOAD_CONFIG_DIRECTORY;
   10654                 : typedef PIMAGE_LOAD_CONFIG_DIRECTORY64    PIMAGE_LOAD_CONFIG_DIRECTORY;
   10655                 : #else
   10656                 : typedef IMAGE_LOAD_CONFIG_DIRECTORY32     IMAGE_LOAD_CONFIG_DIRECTORY;
   10657                 : typedef PIMAGE_LOAD_CONFIG_DIRECTORY32    PIMAGE_LOAD_CONFIG_DIRECTORY;
   10658                 : #endif
   10659                 : 
   10660                 : //
   10661                 : // WIN CE Exception table format
   10662                 : //
   10663                 : 
   10664                 : //
   10665                 : // Function table entry format.  Function table is pointed to by the
   10666                 : // IMAGE_DIRECTORY_ENTRY_EXCEPTION directory entry.
   10667                 : //
   10668                 : 
   10669                 : typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
   10670                 :     DWORD FuncStart;
   10671                 :     DWORD PrologLen : 8;
   10672                 :     DWORD FuncLen : 22;
   10673                 :     DWORD ThirtyTwoBit : 1;
   10674                 :     DWORD ExceptionFlag : 1;
   10675                 : } IMAGE_CE_RUNTIME_FUNCTION_ENTRY, * PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;
   10676                 : 
   10677                 : typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {
   10678                 :     ULONGLONG BeginAddress;
   10679                 :     ULONGLONG EndAddress;
   10680                 :     ULONGLONG ExceptionHandler;
   10681                 :     ULONGLONG HandlerData;
   10682                 :     ULONGLONG PrologEndAddress;
   10683                 : } IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;
   10684                 : 
   10685                 : typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {
   10686                 :     DWORD BeginAddress;
   10687                 :     DWORD EndAddress;
   10688                 :     DWORD ExceptionHandler;
   10689                 :     DWORD HandlerData;
   10690                 :     DWORD PrologEndAddress;
   10691                 : } IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;
   10692                 : 
   10693                 : typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
   10694                 :     DWORD BeginAddress;
   10695                 :     DWORD EndAddress;
   10696                 :     DWORD UnwindInfoAddress;
   10697                 : } _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;
   10698                 : 
   10699                 : typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
   10700                 : typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
   10701                 : 
   10702                 : #if defined(_AXP64_)
   10703                 : 
   10704                 : typedef  IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY  IMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;
   10705                 : typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;
   10706                 : typedef  IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
   10707                 : typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
   10708                 : 
   10709                 : #elif defined(_ALPHA_)
   10710                 : 
   10711                 : typedef  IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
   10712                 : typedef PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
   10713                 : 
   10714                 : #else
   10715                 : 
   10716                 : typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
   10717                 : typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
   10718                 : 
   10719                 : #endif
   10720                 : 
   10721                 : //
   10722                 : // Debug Format
   10723                 : //
   10724                 : 
   10725                 : typedef struct _IMAGE_DEBUG_DIRECTORY {
   10726                 :     DWORD   Characteristics;
   10727                 :     DWORD   TimeDateStamp;
   10728                 :     WORD    MajorVersion;
   10729                 :     WORD    MinorVersion;
   10730                 :     DWORD   Type;
   10731                 :     DWORD   SizeOfData;
   10732                 :     DWORD   AddressOfRawData;
   10733                 :     DWORD   PointerToRawData;
   10734                 : } IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
   10735                 : 
   10736                 : #define IMAGE_DEBUG_TYPE_UNKNOWN          0
   10737                 : #define IMAGE_DEBUG_TYPE_COFF             1
   10738                 : #define IMAGE_DEBUG_TYPE_CODEVIEW         2
   10739                 : #define IMAGE_DEBUG_TYPE_FPO              3
   10740                 : #define IMAGE_DEBUG_TYPE_MISC             4
   10741                 : #define IMAGE_DEBUG_TYPE_EXCEPTION        5
   10742                 : #define IMAGE_DEBUG_TYPE_FIXUP            6
   10743                 : #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC      7
   10744                 : #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC    8
   10745                 : #define IMAGE_DEBUG_TYPE_BORLAND          9
   10746                 : #define IMAGE_DEBUG_TYPE_RESERVED10       10
   10747                 : #define IMAGE_DEBUG_TYPE_CLSID            11
   10748                 : 
   10749                 : 
   10750                 : typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
   10751                 :     DWORD   NumberOfSymbols;
   10752                 :     DWORD   LvaToFirstSymbol;
   10753                 :     DWORD   NumberOfLinenumbers;
   10754                 :     DWORD   LvaToFirstLinenumber;
   10755                 :     DWORD   RvaToFirstByteOfCode;
   10756                 :     DWORD   RvaToLastByteOfCode;
   10757                 :     DWORD   RvaToFirstByteOfData;
   10758                 :     DWORD   RvaToLastByteOfData;
   10759                 : } IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
   10760                 : 
   10761                 : #define FRAME_FPO       0
   10762                 : #define FRAME_TRAP      1
   10763                 : #define FRAME_TSS       2
   10764                 : #define FRAME_NONFPO    3
   10765                 : 
   10766                 : typedef struct _FPO_DATA {
   10767                 :     DWORD       ulOffStart;             // offset 1st byte of function code
   10768                 :     DWORD       cbProcSize;             // # bytes in function
   10769                 :     DWORD       cdwLocals;              // # bytes in locals/4
   10770                 :     WORD        cdwParams;              // # bytes in params/4
   10771                 :     WORD        cbProlog : 8;           // # bytes in prolog
   10772                 :     WORD        cbRegs   : 3;           // # regs saved
   10773                 :     WORD        fHasSEH  : 1;           // TRUE if SEH in func
   10774                 :     WORD        fUseBP   : 1;           // TRUE if EBP has been allocated
   10775                 :     WORD        reserved : 1;           // reserved for future use
   10776                 :     WORD        cbFrame  : 2;           // frame type
   10777                 : } FPO_DATA, *PFPO_DATA;
   10778                 : #define SIZEOF_RFPO_DATA 16
   10779                 : 
   10780                 : 
   10781                 : #define IMAGE_DEBUG_MISC_EXENAME    1
   10782                 : 
   10783                 : typedef struct _IMAGE_DEBUG_MISC {
   10784                 :     DWORD       DataType;               // type of misc data, see defines
   10785                 :     DWORD       Length;                 // total length of record, rounded to four
   10786                 :                                         // byte multiple.
   10787                 :     BOOLEAN     Unicode;                // TRUE if data is unicode string
   10788                 :     BYTE        Reserved[ 3 ];
   10789                 :     BYTE        Data[ 1 ];              // Actual data
   10790                 : } IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
   10791                 : 
   10792                 : 
   10793                 : //
   10794                 : // Function table extracted from MIPS/ALPHA/IA64 images.  Does not contain
   10795                 : // information needed only for runtime support.  Just those fields for
   10796                 : // each entry needed by a debugger.
   10797                 : //
   10798                 : 
   10799                 : typedef struct _IMAGE_FUNCTION_ENTRY {
   10800                 :     DWORD   StartingAddress;
   10801                 :     DWORD   EndingAddress;
   10802                 :     DWORD   EndOfPrologue;
   10803                 : } IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
   10804                 : 
   10805                 : typedef struct _IMAGE_FUNCTION_ENTRY64 {
   10806                 :     ULONGLONG   StartingAddress;
   10807                 :     ULONGLONG   EndingAddress;
   10808                 :     union {
   10809                 :         ULONGLONG   EndOfPrologue;
   10810                 :         ULONGLONG   UnwindInfoAddress;
   10811                 :     };
   10812                 : } IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;
   10813                 : 
   10814                 : //
   10815                 : // Debugging information can be stripped from an image file and placed
   10816                 : // in a separate .DBG file, whose file name part is the same as the
   10817                 : // image file name part (e.g. symbols for CMD.EXE could be stripped
   10818                 : // and placed in CMD.DBG).  This is indicated by the IMAGE_FILE_DEBUG_STRIPPED
   10819                 : // flag in the Characteristics field of the file header.  The beginning of
   10820                 : // the .DBG file contains the following structure which captures certain
   10821                 : // information from the image file.  This allows a debug to proceed even if
   10822                 : // the original image file is not accessable.  This header is followed by
   10823                 : // zero of more IMAGE_SECTION_HEADER structures, followed by zero or more
   10824                 : // IMAGE_DEBUG_DIRECTORY structures.  The latter structures and those in
   10825                 : // the image file contain file offsets relative to the beginning of the
   10826                 : // .DBG file.
   10827                 : //
   10828                 : // If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure
   10829                 : // is left in the image file, but not mapped.  This allows a debugger to
   10830                 : // compute the name of the .DBG file, from the name of the image in the
   10831                 : // IMAGE_DEBUG_MISC structure.
   10832                 : //
   10833                 : 
   10834                 : typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
   10835                 :     WORD        Signature;
   10836                 :     WORD        Flags;
   10837                 :     WORD        Machine;
   10838                 :     WORD        Characteristics;
   10839                 :     DWORD       TimeDateStamp;
   10840                 :     DWORD       CheckSum;
   10841                 :     DWORD       ImageBase;
   10842                 :     DWORD       SizeOfImage;
   10843                 :     DWORD       NumberOfSections;
   10844                 :     DWORD       ExportedNamesSize;
   10845                 :     DWORD       DebugDirectorySize;
   10846                 :     DWORD       SectionAlignment;
   10847                 :     DWORD       Reserved[2];
   10848                 : } IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
   10849                 : 
   10850                 : typedef struct _NON_PAGED_DEBUG_INFO {
   10851                 :     WORD        Signature;
   10852                 :     WORD        Flags;
   10853                 :     DWORD       Size;
   10854                 :     WORD        Machine;
   10855                 :     WORD        Characteristics;
   10856                 :     DWORD       TimeDateStamp;
   10857                 :     DWORD       CheckSum;
   10858                 :     DWORD       SizeOfImage;
   10859                 :     ULONGLONG   ImageBase;
   10860                 :     //DebugDirectorySize
   10861                 :     //IMAGE_DEBUG_DIRECTORY
   10862                 : } NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;
   10863                 : 
   10864                 : #ifndef _MAC
   10865                 : #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
   10866                 : #define NON_PAGED_DEBUG_SIGNATURE      0x494E
   10867                 : #else
   10868                 : #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4449  // DI
   10869                 : #define NON_PAGED_DEBUG_SIGNATURE      0x4E49  // NI
   10870                 : #endif
   10871                 : 
   10872                 : #define IMAGE_SEPARATE_DEBUG_FLAGS_MASK 0x8000
   10873                 : #define IMAGE_SEPARATE_DEBUG_MISMATCH   0x8000  // when DBG was updated, the
   10874                 :                                                 // old checksum didn't match.
   10875                 : 
   10876                 : //
   10877                 : //  The .arch section is made up of headers, each describing an amask position/value
   10878                 : //  pointing to an array of IMAGE_ARCHITECTURE_ENTRY's.  Each "array" (both the header
   10879                 : //  and entry arrays) are terminiated by a quadword of 0xffffffffL.
   10880                 : //
   10881                 : //  NOTE: There may be quadwords of 0 sprinkled around and must be skipped.
   10882                 : //
   10883                 : 
   10884                 : typedef struct _ImageArchitectureHeader {
   10885                 :     unsigned int AmaskValue: 1;                 // 1 -> code section depends on mask bit
   10886                 :                                                 // 0 -> new instruction depends on mask bit
   10887                 :     int :7;                                     // MBZ
   10888                 :     unsigned int AmaskShift: 8;                 // Amask bit in question for this fixup
   10889                 :     int :16;                                    // MBZ
   10890                 :     DWORD FirstEntryRVA;                        // RVA into .arch section to array of ARCHITECTURE_ENTRY's
   10891                 : } IMAGE_ARCHITECTURE_HEADER, *PIMAGE_ARCHITECTURE_HEADER;
   10892                 : 
   10893                 : typedef struct _ImageArchitectureEntry {
   10894                 :     DWORD FixupInstRVA;                         // RVA of instruction to fixup
   10895                 :     DWORD NewInst;                              // fixup instruction (see alphaops.h)
   10896                 : } IMAGE_ARCHITECTURE_ENTRY, *PIMAGE_ARCHITECTURE_ENTRY;
   10897                 : 
   10898                 : #include "poppack.h"                // Back to the initial value
   10899                 : 
   10900                 : // The following structure defines the new import object.  Note the values of the first two fields,
   10901                 : // which must be set as stated in order to differentiate old and new import members.
   10902                 : // Following this structure, the linker emits two null-terminated strings used to recreate the
   10903                 : // import at the time of use.  The first string is the import's name, the second is the dll's name.
   10904                 : 
   10905                 : #define IMPORT_OBJECT_HDR_SIG2  0xffff
   10906                 : 
   10907                 : typedef struct IMPORT_OBJECT_HEADER {
   10908                 :     WORD    Sig1;                       // Must be IMAGE_FILE_MACHINE_UNKNOWN
   10909                 :     WORD    Sig2;                       // Must be IMPORT_OBJECT_HDR_SIG2.
   10910                 :     WORD    Version;
   10911                 :     WORD    Machine;
   10912                 :     DWORD   TimeDateStamp;              // Time/date stamp
   10913                 :     DWORD   SizeOfData;                 // particularly useful for incremental links
   10914                 : 
   10915                 :     union {
   10916                 :         WORD    Ordinal;                // if grf & IMPORT_OBJECT_ORDINAL
   10917                 :         WORD    Hint;
   10918                 :     };
   10919                 : 
   10920                 :     WORD    Type : 2;                   // IMPORT_TYPE
   10921                 :     WORD    NameType : 3;               // IMPORT_NAME_TYPE
   10922                 :     WORD    Reserved : 11;              // Reserved. Must be zero.
   10923                 : } IMPORT_OBJECT_HEADER;
   10924                 : 
   10925                 : typedef enum IMPORT_OBJECT_TYPE
   10926                 : {
   10927                 :     IMPORT_OBJECT_CODE = 0,
   10928                 :     IMPORT_OBJECT_DATA = 1,
   10929                 :     IMPORT_OBJECT_CONST = 2,
   10930                 : } IMPORT_OBJECT_TYPE;
   10931                 : 
   10932                 : typedef enum IMPORT_OBJECT_NAME_TYPE
   10933                 : {
   10934                 :     IMPORT_OBJECT_ORDINAL = 0,          // Import by ordinal
   10935                 :     IMPORT_OBJECT_NAME = 1,             // Import name == public symbol name.
   10936                 :     IMPORT_OBJECT_NAME_NO_PREFIX = 2,   // Import name == public symbol name skipping leading ?, @, or optionally _.
   10937                 :     IMPORT_OBJECT_NAME_UNDECORATE = 3,  // Import name == public symbol name skipping leading ?, @, or optionally _
   10938                 :                                         // and truncating at first @
   10939                 : } IMPORT_OBJECT_NAME_TYPE;
   10940                 : 
   10941                 : 
   10942                 : #ifndef __IMAGE_COR20_HEADER_DEFINED__
   10943                 : #define __IMAGE_COR20_HEADER_DEFINED__
   10944                 : 
   10945                 : typedef enum ReplacesCorHdrNumericDefines
   10946                 : {
   10947                 : // COM+ Header entry point flags.
   10948                 :     COMIMAGE_FLAGS_ILONLY               =0x00000001,
   10949                 :     COMIMAGE_FLAGS_32BITREQUIRED        =0x00000002,
   10950                 :     COMIMAGE_FLAGS_IL_LIBRARY           =0x00000004,
   10951                 :     COMIMAGE_FLAGS_STRONGNAMESIGNED     =0x00000008,
   10952                 :     COMIMAGE_FLAGS_TRACKDEBUGDATA       =0x00010000,
   10953                 : 
   10954                 : // Version flags for image.
   10955                 :     COR_VERSION_MAJOR_V2                =2,
   10956                 :     COR_VERSION_MAJOR                   =COR_VERSION_MAJOR_V2,
   10957                 :     COR_VERSION_MINOR                   =0,
   10958                 :     COR_DELETED_NAME_LENGTH             =8,
   10959                 :     COR_VTABLEGAP_NAME_LENGTH           =8,
   10960                 : 
   10961                 : // Maximum size of a NativeType descriptor.
   10962                 :     NATIVE_TYPE_MAX_CB                  =1,
   10963                 :     COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,
   10964                 : 
   10965                 : // #defines for the MIH FLAGS
   10966                 :     IMAGE_COR_MIH_METHODRVA             =0x01,
   10967                 :     IMAGE_COR_MIH_EHRVA                 =0x02,
   10968                 :     IMAGE_COR_MIH_BASICBLOCK            =0x08,
   10969                 : 
   10970                 : // V-table constants
   10971                 :     COR_VTABLE_32BIT                    =0x01,          // V-table slots are 32-bits in size.
   10972                 :     COR_VTABLE_64BIT                    =0x02,          // V-table slots are 64-bits in size.
   10973                 :     COR_VTABLE_FROM_UNMANAGED           =0x04,          // If set, transition from unmanaged.
   10974                 :     COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN  =0x08,  // If set, transition from unmanaged with keeping the current appdomain.
   10975                 :     COR_VTABLE_CALL_MOST_DERIVED        =0x10,          // Call most derived method described by
   10976                 : 
   10977                 : // EATJ constants
   10978                 :     IMAGE_COR_EATJ_THUNK_SIZE           =32,            // Size of a jump thunk reserved range.
   10979                 : 
   10980                 : // Max name lengths
   10981                 :     //@todo: Change to unlimited name lengths.
   10982                 :     MAX_CLASS_NAME                      =1024,
   10983                 :     MAX_PACKAGE_NAME                    =1024,
   10984                 : } ReplacesCorHdrNumericDefines;
   10985                 : 
   10986                 : // CLR 2.0 header structure.
   10987                 : typedef struct IMAGE_COR20_HEADER
   10988                 : {
   10989                 :     // Header versioning
   10990                 :     DWORD                   cb;
   10991                 :     WORD                    MajorRuntimeVersion;
   10992                 :     WORD                    MinorRuntimeVersion;
   10993                 : 
   10994                 :     // Symbol table and startup information
   10995                 :     IMAGE_DATA_DIRECTORY    MetaData;
   10996                 :     DWORD                   Flags;
   10997                 :     DWORD                   EntryPointToken;
   10998                 : 
   10999                 :     // Binding information
   11000                 :     IMAGE_DATA_DIRECTORY    Resources;
   11001                 :     IMAGE_DATA_DIRECTORY    StrongNameSignature;
   11002                 : 
   11003                 :     // Regular fixup and binding information
   11004                 :     IMAGE_DATA_DIRECTORY    CodeManagerTable;
   11005                 :     IMAGE_DATA_DIRECTORY    VTableFixups;
   11006                 :     IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;
   11007                 : 
   11008                 :     // Precompiled image info (internal use only - set to zero)
   11009                 :     IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
   11010                 : 
   11011                 : } IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;
   11012                 : 
   11013                 : #endif // __IMAGE_COR20_HEADER_DEFINED__
   11014                 : 
   11015                 : //
   11016                 : // End Image Format
   11017                 : //
   11018                 : 
   11019                 : //
   11020                 : // for move macros
   11021                 : //
   11022                 : #ifdef _MAC
   11023                 : #ifndef _INC_STRING
   11024                 : #include <string.h>
   11025                 : #endif /* _INC_STRING */
   11026                 : #else
   11027                 : #include <string.h>
   11028                 : #endif // _MAC
   11029                 : 
   11030                 : 
   11031                 : #ifndef _SLIST_HEADER_
   11032                 : #define _SLIST_HEADER_
   11033                 : 
   11034                 : #if defined(_WIN64)
   11035                 : 
   11036                 : //
   11037                 : // The type SINGLE_LIST_ENTRY is not suitable for use with SLISTs.  For
   11038                 : // WIN64, an entry on an SLIST is required to be 16-byte aligned, while a
   11039                 : // SINGLE_LIST_ENTRY structure has only 8 byte alignment.
   11040                 : //
   11041                 : // Therefore, all SLIST code should use the SLIST_ENTRY type instead of the
   11042                 : // SINGLE_LIST_ENTRY type.
   11043                 : //
   11044                 : 
   11045                 : #pragma warning(push)
   11046                 : #pragma warning(disable:4324)   // structure padded due to align()
   11047                 : typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
   11048                 : typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
   11049                 :     PSLIST_ENTRY Next;
   11050                 : } SLIST_ENTRY;
   11051                 : #pragma warning(pop)
   11052                 : 
   11053                 : #else
   11054                 : 
   11055                 : #define SLIST_ENTRY SINGLE_LIST_ENTRY
   11056                 : #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
   11057                 : #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
   11058                 : 
   11059                 : #endif // _WIN64
   11060                 : 
   11061                 : #if defined(_WIN64)
   11062                 : 
   11063                 : typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
   11064                 :     struct {  // original struct
   11065                 :         ULONGLONG Alignment;
   11066                 :         ULONGLONG Region;
   11067                 :     };
   11068                 :     struct {  // 8-byte header
   11069                 :         ULONGLONG Depth:16;
   11070                 :         ULONGLONG Sequence:9;
   11071                 :         ULONGLONG NextEntry:39;
   11072                 :         ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
   11073                 :         ULONGLONG Init:1;       // 0: uninitialized; 1: initialized
   11074                 :         ULONGLONG Reserved:59;
   11075                 :         ULONGLONG Region:3;
   11076                 :     } Header8;
   11077                 :     struct {  // 16-byte header
   11078                 :         ULONGLONG Depth:16;
   11079                 :         ULONGLONG Sequence:48;
   11080                 :         ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
   11081                 :         ULONGLONG Init:1;       // 0: uninitialized; 1: initialized
   11082                 :         ULONGLONG Reserved:2;
   11083                 :         ULONGLONG NextEntry:60; // last 4 bits are always 0's
   11084                 :     } Header16;
   11085                 : } SLIST_HEADER, *PSLIST_HEADER;
   11086                 : 
   11087                 : #else
   11088                 : 
   11089                 : typedef union _SLIST_HEADER {
   11090                 :     ULONGLONG Alignment;
   11091                 :     struct {
   11092                 :         SLIST_ENTRY Next;
   11093                 :         WORD   Depth;
   11094                 :         WORD   Sequence;
   11095                 :     };
   11096                 : } SLIST_HEADER, *PSLIST_HEADER;
   11097                 : 
   11098                 : #endif // _WIN64
   11099                 : 
   11100                 : #endif // _SLIST_HEADER_
   11101                 : 
   11102                 : 
   11103                 : NTSYSAPI
   11104                 : VOID
   11105                 : NTAPI
   11106                 : RtlInitializeSListHead (
   11107                 :     IN PSLIST_HEADER ListHead
   11108                 :     );
   11109                 : 
   11110                 : NTSYSAPI
   11111                 : PSLIST_ENTRY
   11112                 : NTAPI
   11113                 : RtlFirstEntrySList (
   11114                 :     IN const SLIST_HEADER *ListHead
   11115                 :     );
   11116                 : 
   11117                 : NTSYSAPI
   11118                 : PSLIST_ENTRY
   11119                 : NTAPI
   11120                 : RtlInterlockedPopEntrySList (
   11121                 :     IN PSLIST_HEADER ListHead
   11122                 :     );
   11123                 : 
   11124                 : NTSYSAPI
   11125                 : PSLIST_ENTRY
   11126                 : NTAPI
   11127                 : RtlInterlockedPushEntrySList (
   11128                 :     IN PSLIST_HEADER ListHead,
   11129                 :     IN PSLIST_ENTRY ListEntry
   11130                 :     );
   11131                 : 
   11132                 : NTSYSAPI
   11133                 : PSLIST_ENTRY
   11134                 : NTAPI
   11135                 : RtlInterlockedFlushSList (
   11136                 :     IN PSLIST_HEADER ListHead
   11137                 :     );
   11138                 : 
   11139                 : NTSYSAPI
   11140                 : WORD  
   11141                 : NTAPI
   11142                 : RtlQueryDepthSList (
   11143                 :     IN PSLIST_HEADER ListHead
   11144                 :     );
   11145                 : 
   11146                 : // begin_ntddk
   11147                 : 
   11148                 : #ifndef _RTL_RUN_ONCE_DEF
   11149                 : #define _RTL_RUN_ONCE_DEF
   11150                 : 
   11151                 : //
   11152                 : // Run once
   11153                 : //
   11154                 : 
   11155                 : #define RTL_RUN_ONCE_INIT {0}   // Static initializer
   11156                 : 
   11157                 : //
   11158                 : // Run once flags
   11159                 : //
   11160                 : 
   11161                 : #define RTL_RUN_ONCE_CHECK_ONLY     0x00000001UL
   11162                 : #define RTL_RUN_ONCE_ASYNC          0x00000002UL
   11163                 : #define RTL_RUN_ONCE_INIT_FAILED    0x00000004UL
   11164                 : 
   11165                 : //
   11166                 : // The context stored in the run once structure must leave the following number
   11167                 : // of low order bits unused.
   11168                 : //
   11169                 : 
   11170                 : #define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
   11171                 : 
   11172                 : typedef union _RTL_RUN_ONCE {       
   11173                 :     PVOID Ptr;                      
   11174                 : } RTL_RUN_ONCE, *PRTL_RUN_ONCE;     
   11175                 : 
   11176                 : typedef
   11177                 : DWORD /* LOGICAL */
   11178                 : (NTAPI *PRTL_RUN_ONCE_INIT_FN) (
   11179                 :     __inout PRTL_RUN_ONCE RunOnce,
   11180                 :     __inout_opt PVOID Parameter,
   11181                 :     __deref_opt_out_opt PVOID *Context
   11182                 :     );
   11183                 : 
   11184                 : #endif // _RTL_RUN_ONCE_DEF
   11185                 : 
   11186                 : #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
   11187                 : 
   11188                 : VOID
   11189                 : //FORCEINLINE
   11190                 : RtlRunOnceInitialize (
   11191                 :     __out PRTL_RUN_ONCE RunOnce
   11192                 :     );
   11193                 : 
   11194                 : #endif // !defined(MIDL_PASS) && !defined(SORTPP_PASS)
   11195                 : 
   11196                 : DWORD   
   11197                 : RtlRunOnceExecuteOnce (
   11198                 :     __inout PRTL_RUN_ONCE RunOnce,
   11199                 :     __in __callback PRTL_RUN_ONCE_INIT_FN InitFn,
   11200                 :     __inout_opt PVOID Parameter,
   11201                 :     __deref_opt_out_opt PVOID *Context
   11202                 :     );
   11203                 : 
   11204                 : DWORD   
   11205                 : RtlRunOnceBeginInitialize (
   11206                 :     __inout PRTL_RUN_ONCE RunOnce,
   11207                 :     __in DWORD Flags,
   11208                 :     __deref_opt_out_opt PVOID *Context
   11209                 :     );
   11210                 : 
   11211                 : DWORD   
   11212                 : RtlRunOnceComplete (
   11213                 :     __inout PRTL_RUN_ONCE RunOnce,
   11214                 :     __in DWORD Flags,
   11215                 :     __in_opt PVOID Context
   11216                 :     );
   11217                 : 
   11218                 : #define HEAP_NO_SERIALIZE               0x00000001      
   11219                 : #define HEAP_GROWABLE                   0x00000002      
   11220                 : #define HEAP_GENERATE_EXCEPTIONS        0x00000004      
   11221                 : #define HEAP_ZERO_MEMORY                0x00000008      
   11222                 : #define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010      
   11223                 : #define HEAP_TAIL_CHECKING_ENABLED      0x00000020      
   11224                 : #define HEAP_FREE_CHECKING_ENABLED      0x00000040      
   11225                 : #define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080      
   11226                 : #define HEAP_CREATE_ALIGN_16            0x00010000      
   11227                 : #define HEAP_CREATE_ENABLE_TRACING      0x00020000      
   11228                 : #define HEAP_CREATE_ENABLE_EXECUTE      0x00040000      
   11229                 : #define HEAP_MAXIMUM_TAG                0x0FFF              
   11230                 : #define HEAP_PSEUDO_TAG_FLAG            0x8000              
   11231                 : #define HEAP_TAG_SHIFT                  18                  
   11232                 : #if !defined(MIDL_PASS)
   11233                 : FORCEINLINE
   11234                 : DWORD
   11235                 : HEAP_MAKE_TAG_FLAGS (
   11236                 :     IN DWORD TagBase,
   11237                 :     IN DWORD Tag
   11238                 :     )
   11239                 : 
   11240                 : {
   11241                 :     __assume_bound(TagBase);
   11242                 :     return ((DWORD)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
   11243                 : }
   11244                 : #endif
   11245                 : 
   11246                 : #if (NTDDI_VERSION > NTDDI_WINXP)
   11247                 : NTSYSAPI
   11248                 : WORD  
   11249                 : NTAPI
   11250                 : RtlCaptureStackBackTrace(
   11251                 :     __in DWORD FramesToSkip,
   11252                 :     __in DWORD FramesToCapture,
   11253                 :     __out_ecount(FramesToCapture) PVOID *BackTrace,
   11254                 :     __out_opt PDWORD BackTraceHash
   11255                 :    );
   11256                 : #endif
   11257                 : 
   11258                 : #if (NTDDI_VERSION > NTDDI_WIN2K)
   11259                 : NTSYSAPI
   11260                 : VOID
   11261                 : NTAPI
   11262                 : RtlCaptureContext (
   11263                 :     __out PCONTEXT ContextRecord
   11264                 :     );
   11265                 : #endif
   11266                 : 
   11267                 : 
   11268                 : #define IS_TEXT_UNICODE_ASCII16               0x0001
   11269                 : #define IS_TEXT_UNICODE_REVERSE_ASCII16       0x0010
   11270                 : 
   11271                 : #define IS_TEXT_UNICODE_STATISTICS            0x0002
   11272                 : #define IS_TEXT_UNICODE_REVERSE_STATISTICS    0x0020
   11273                 : 
   11274                 : #define IS_TEXT_UNICODE_CONTROLS              0x0004
   11275                 : #define IS_TEXT_UNICODE_REVERSE_CONTROLS      0x0040
   11276                 : 
   11277                 : #define IS_TEXT_UNICODE_SIGNATURE             0x0008
   11278                 : #define IS_TEXT_UNICODE_REVERSE_SIGNATURE     0x0080
   11279                 : 
   11280                 : #define IS_TEXT_UNICODE_ILLEGAL_CHARS         0x0100
   11281                 : #define IS_TEXT_UNICODE_ODD_LENGTH            0x0200
   11282                 : #define IS_TEXT_UNICODE_DBCS_LEADBYTE         0x0400
   11283                 : #define IS_TEXT_UNICODE_NULL_BYTES            0x1000
   11284                 : 
   11285                 : #define IS_TEXT_UNICODE_UNICODE_MASK          0x000F
   11286                 : #define IS_TEXT_UNICODE_REVERSE_MASK          0x00F0
   11287                 : #define IS_TEXT_UNICODE_NOT_UNICODE_MASK      0x0F00
   11288                 : #define IS_TEXT_UNICODE_NOT_ASCII_MASK        0xF000
   11289                 : 
   11290                 : #define COMPRESSION_FORMAT_NONE          (0x0000)   
   11291                 : #define COMPRESSION_FORMAT_DEFAULT       (0x0001)   
   11292                 : #define COMPRESSION_FORMAT_LZNT1         (0x0002)   
   11293                 : #define COMPRESSION_ENGINE_STANDARD      (0x0000)   
   11294                 : #define COMPRESSION_ENGINE_MAXIMUM       (0x0100)   
   11295                 : #define COMPRESSION_ENGINE_HIBER         (0x0200)   
   11296                 : 
   11297                 : #if _DBG_MEMCPY_INLINE_ && !defined(MIDL_PASS) && !defined(_MEMCPY_INLINE_) && !defined(_CRTBLD)
   11298                 : #define _MEMCPY_INLINE_
   11299                 : FORCEINLINE
   11300                 : PVOID
   11301                 : __cdecl
   11302                 : memcpy_inline (
   11303                 :     void *dst,
   11304                 :     const void *src,
   11305                 :     size_t size
   11306                 :     )
   11307                 : {
   11308                 :     //
   11309                 :     // Make sure the source and destination do not overlap such that the
   11310                 :     // move destroys the destination.
   11311                 :     //
   11312                 :     if (((char *)dst > (char *)src) &&
   11313                 :         ((char *)dst < ((char *)src + size))) {
   11314                 :         __debugbreak();
   11315                 :     }
   11316                 :     return memcpy(dst, src, size);
   11317                 : }
   11318                 : #define memcpy memcpy_inline
   11319                 : #endif
   11320                 : 
   11321                 : #if (NTDDI_VERSION >= NTDDI_WIN2K)
   11322                 : NTSYSAPI
   11323                 : SIZE_T
   11324                 : NTAPI
   11325                 : RtlCompareMemory (
   11326                 :     const VOID *Source1,
   11327                 :     const VOID *Source2,
   11328                 :     SIZE_T Length
   11329                 :     );
   11330                 : 
   11331                 : #endif
   11332                 : 
   11333                 : #define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
   11334                 : #define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
   11335                 : #define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
   11336                 : #define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
   11337                 : #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
   11338                 : 
   11339                 : 
   11340                 : #if !defined(MIDL_PASS)
   11341                 : 
   11342                 : FORCEINLINE
   11343                 : PVOID
   11344                 : RtlSecureZeroMemory(
   11345                 :     __in_bcount(cnt) PVOID ptr,
   11346                 :     __in SIZE_T cnt
   11347                 :     )
   11348              11 : {

   11349              11 :     volatile char *vptr = (volatile char *)ptr;

   11350                 : 
   11351                 : #if defined(_M_AMD64)
   11352                 : 
   11353                 :         __stosb((PBYTE )((DWORD64)vptr), 0, cnt);
   11354                 : 
   11355                 : #else
   11356                 : 
   11357              11 :     while (cnt) {

   11358              11 :         *vptr = 0;

   11359              11 :         vptr++;

   11360              11 :         cnt--;

   11361              11 :     }

   11362                 : 
   11363                 : #endif
   11364                 : 
   11365              11 :     return ptr;

   11366              11 : }

   11367                 : 
   11368                 : #endif
   11369                 : 
   11370                 : 
   11371                 : #define SEF_DACL_AUTO_INHERIT             0x01
   11372                 : #define SEF_SACL_AUTO_INHERIT             0x02
   11373                 : #define SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT 0x04
   11374                 : #define SEF_AVOID_PRIVILEGE_CHECK         0x08
   11375                 : #define SEF_AVOID_OWNER_CHECK             0x10
   11376                 : #define SEF_DEFAULT_OWNER_FROM_PARENT     0x20
   11377                 : #define SEF_DEFAULT_GROUP_FROM_PARENT     0x40
   11378                 : #define SEF_MACL_NO_WRITE_UP              0x100
   11379                 : #define SEF_MACL_NO_READ_UP               0x200
   11380                 : #define SEF_MACL_NO_EXECUTE_UP            0x400
   11381                 : #define SEF_AVOID_OWNER_RESTRICTION       0x1000
   11382                 : 
   11383                 : #define SEF_MACL_VALID_FLAGS              (SEF_MACL_NO_WRITE_UP   | \
   11384                 :                                            SEF_MACL_NO_READ_UP    | \
   11385                 :                                            SEF_MACL_NO_EXECUTE_UP)
   11386                 : 
   11387                 : 
   11388                 : typedef struct _MESSAGE_RESOURCE_ENTRY {
   11389                 :     WORD   Length;
   11390                 :     WORD   Flags;
   11391                 :     BYTE  Text[ 1 ];
   11392                 : } MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
   11393                 : 
   11394                 : #define MESSAGE_RESOURCE_UNICODE 0x0001
   11395                 : 
   11396                 : typedef struct _MESSAGE_RESOURCE_BLOCK {
   11397                 :     DWORD LowId;
   11398                 :     DWORD HighId;
   11399                 :     DWORD OffsetToEntries;
   11400                 : } MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
   11401                 : 
   11402                 : typedef struct _MESSAGE_RESOURCE_DATA {
   11403                 :     DWORD NumberOfBlocks;
   11404                 :     MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
   11405                 : } MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
   11406                 : 
   11407                 : typedef struct _OSVERSIONINFOA {
   11408                 :     DWORD dwOSVersionInfoSize;
   11409                 :     DWORD dwMajorVersion;
   11410                 :     DWORD dwMinorVersion;
   11411                 :     DWORD dwBuildNumber;
   11412                 :     DWORD dwPlatformId;
   11413                 :     CHAR   szCSDVersion[ 128 ];     // Maintenance string for PSS usage
   11414                 : } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
   11415                 : 
   11416                 : typedef struct _OSVERSIONINFOW {
   11417                 :     DWORD dwOSVersionInfoSize;
   11418                 :     DWORD dwMajorVersion;
   11419                 :     DWORD dwMinorVersion;
   11420                 :     DWORD dwBuildNumber;
   11421                 :     DWORD dwPlatformId;
   11422                 :     WCHAR  szCSDVersion[ 128 ];     // Maintenance string for PSS usage
   11423                 : } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
   11424                 : #ifdef UNICODE
   11425                 : typedef OSVERSIONINFOW OSVERSIONINFO;
   11426                 : typedef POSVERSIONINFOW POSVERSIONINFO;
   11427                 : typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
   11428                 : #else
   11429                 : typedef OSVERSIONINFOA OSVERSIONINFO;
   11430                 : typedef POSVERSIONINFOA POSVERSIONINFO;
   11431                 : typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
   11432                 : #endif // UNICODE
   11433                 : 
   11434                 : typedef struct _OSVERSIONINFOEXA {
   11435                 :     DWORD dwOSVersionInfoSize;
   11436                 :     DWORD dwMajorVersion;
   11437                 :     DWORD dwMinorVersion;
   11438                 :     DWORD dwBuildNumber;
   11439                 :     DWORD dwPlatformId;
   11440                 :     CHAR   szCSDVersion[ 128 ];     // Maintenance string for PSS usage
   11441                 :     WORD   wServicePackMajor;
   11442                 :     WORD   wServicePackMinor;
   11443                 :     WORD   wSuiteMask;
   11444                 :     BYTE  wProductType;
   11445                 :     BYTE  wReserved;
   11446                 : } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
   11447                 : typedef struct _OSVERSIONINFOEXW {
   11448                 :     DWORD dwOSVersionInfoSize;
   11449                 :     DWORD dwMajorVersion;
   11450                 :     DWORD dwMinorVersion;
   11451                 :     DWORD dwBuildNumber;
   11452                 :     DWORD dwPlatformId;
   11453                 :     WCHAR  szCSDVersion[ 128 ];     // Maintenance string for PSS usage
   11454                 :     WORD   wServicePackMajor;
   11455                 :     WORD   wServicePackMinor;
   11456                 :     WORD   wSuiteMask;
   11457                 :     BYTE  wProductType;
   11458                 :     BYTE  wReserved;
   11459                 : } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
   11460                 : #ifdef UNICODE
   11461                 : typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
   11462                 : typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
   11463                 : typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
   11464                 : #else
   11465                 : typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
   11466                 : typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
   11467                 : typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
   11468                 : #endif // UNICODE
   11469                 : 
   11470                 : //
   11471                 : // RtlVerifyVersionInfo() conditions
   11472                 : //
   11473                 : 
   11474                 : #define VER_EQUAL                       1
   11475                 : #define VER_GREATER                     2
   11476                 : #define VER_GREATER_EQUAL               3
   11477                 : #define VER_LESS                        4
   11478                 : #define VER_LESS_EQUAL                  5
   11479                 : #define VER_AND                         6
   11480                 : #define VER_OR                          7
   11481                 : 
   11482                 : #define VER_CONDITION_MASK              7
   11483                 : #define VER_NUM_BITS_PER_CONDITION_MASK 3
   11484                 : 
   11485                 : //
   11486                 : // RtlVerifyVersionInfo() type mask bits
   11487                 : //
   11488                 : 
   11489                 : #define VER_MINORVERSION                0x0000001
   11490                 : #define VER_MAJORVERSION                0x0000002
   11491                 : #define VER_BUILDNUMBER                 0x0000004
   11492                 : #define VER_PLATFORMID                  0x0000008
   11493                 : #define VER_SERVICEPACKMINOR            0x0000010
   11494                 : #define VER_SERVICEPACKMAJOR            0x0000020
   11495                 : #define VER_SUITENAME                   0x0000040
   11496                 : #define VER_PRODUCT_TYPE                0x0000080
   11497                 : 
   11498                 : //
   11499                 : // RtlVerifyVersionInfo() os product type values
   11500                 : //
   11501                 : 
   11502                 : #define VER_NT_WORKSTATION              0x0000001
   11503                 : #define VER_NT_DOMAIN_CONTROLLER        0x0000002
   11504                 : #define VER_NT_SERVER                   0x0000003
   11505                 : 
   11506                 : //
   11507                 : // dwPlatformId defines:
   11508                 : //
   11509                 : 
   11510                 : #define VER_PLATFORM_WIN32s             0
   11511                 : #define VER_PLATFORM_WIN32_WINDOWS      1
   11512                 : #define VER_PLATFORM_WIN32_NT           2
   11513                 : 
   11514                 : 
   11515                 : //
   11516                 : //
   11517                 : // VerifyVersionInfo() macro to set the condition mask
   11518                 : //
   11519                 : // For documentation sakes here's the old version of the macro that got
   11520                 : // changed to call an API
   11521                 : // #define VER_SET_CONDITION(_m_,_t_,_c_)  _m_=(_m_|(_c_<<(1<<_t_)))
   11522                 : //
   11523                 : 
   11524                 : #define VER_SET_CONDITION(_m_,_t_,_c_)  \
   11525                 :         ((_m_)=VerSetConditionMask((_m_),(_t_),(_c_)))
   11526                 : 
   11527                 : #if (NTDDI_VERSION >= NTDDI_WIN2K)
   11528                 : NTSYSAPI
   11529                 : ULONGLONG
   11530                 : NTAPI
   11531                 : VerSetConditionMask(
   11532                 :         IN  ULONGLONG   ConditionMask,
   11533                 :         IN  DWORD   TypeMask,
   11534                 :         IN  BYTE    Condition
   11535                 :         );
   11536                 : #endif
   11537                 : 
   11538                 : //
   11539                 : 
   11540                 : #if (NTDDI_VERSION >= NTDDI_LONGHORN)
   11541                 : 
   11542                 : NTSYSAPI
   11543                 : BOOLEAN
   11544                 : NTAPI
   11545                 : RtlGetProductInfo(
   11546                 :     __in  DWORD  OSMajorVersion,
   11547                 :     __in  DWORD  OSMinorVersion,
   11548                 :     __in  DWORD  SpMajorVersion,
   11549                 :     __in  DWORD  SpMinorVersion,
   11550                 :     __out PDWORD ReturnedProductType
   11551                 :     );
   11552                 : 
   11553                 : #endif
   11554                 : 
   11555                 : 
   11556                 : typedef struct _RTL_CRITICAL_SECTION_DEBUG {
   11557                 :     WORD   Type;
   11558                 :     WORD   CreatorBackTraceIndex;
   11559                 :     struct _RTL_CRITICAL_SECTION *CriticalSection;
   11560                 :     LIST_ENTRY ProcessLocksList;
   11561                 :     DWORD EntryCount;
   11562                 :     DWORD ContentionCount;
   11563                 :     DWORD Flags;
   11564                 :     WORD   CreatorBackTraceIndexHigh;
   11565                 :     WORD   SpareWORD  ;
   11566                 : } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
   11567                 : 
   11568                 : #define RTL_CRITSECT_TYPE 0
   11569                 : #define RTL_RESOURCE_TYPE 1
   11570                 : 
   11571                 : //
   11572                 : // These flags define the upper byte of the critical section SpinCount field
   11573                 : //
   11574                 : #define RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO         0x01000000
   11575                 : #define RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN          0x02000000
   11576                 : #define RTL_CRITICAL_SECTION_FLAG_STATIC_INIT           0x04000000
   11577                 : #define RTL_CRITICAL_SECTION_ALL_FLAG_BITS              0xFF000000
   11578                 : #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)))
   11579                 : 
   11580                 : //
   11581                 : // These flags define possible values stored in the Flags field of a critsec debuginfo.
   11582                 : //
   11583                 : #define RTL_CRITICAL_SECTION_DEBUG_FLAG_STATIC_INIT     0x00000001
   11584                 : 
   11585                 : #pragma pack(push, 8)
   11586                 : 
   11587                 : typedef struct _RTL_CRITICAL_SECTION {
   11588                 :     PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
   11589                 : 
   11590                 :     //
   11591                 :     //  The following three fields control entering and exiting the critical
   11592                 :     //  section for the resource
   11593                 :     //
   11594                 : 
   11595                 :     LONG LockCount;
   11596                 :     LONG RecursionCount;
   11597                 :     HANDLE OwningThread;        // from the thread's ClientId->UniqueThread
   11598                 :     HANDLE LockSemaphore;
   11599                 :     ULONG_PTR SpinCount;        // force size on 64-bit systems when packed
   11600                 : } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
   11601                 : 
   11602                 : #pragma pack(pop)
   11603                 : 
   11604                 : typedef struct _RTL_SRWLOCK {                            
   11605                 :         PVOID Ptr;                                       
   11606                 : } RTL_SRWLOCK, *PRTL_SRWLOCK;                            
   11607                 : #define RTL_SRWLOCK_INIT {0}                            
   11608                 : typedef struct _RTL_CONDITION_VARIABLE {                    
   11609                 :         PVOID Ptr;                                       
   11610                 : } RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE;      
   11611                 : #define RTL_CONDITION_VARIABLE_INIT {0}                 
   11612                 : #define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED  0x1     
   11613                 : typedef LONG (NTAPI *PVECTORED_EXCEPTION_HANDLER)(
   11614                 :     struct _EXCEPTION_POINTERS *ExceptionInfo
   11615                 :     );
   11616                 : 
   11617                 : typedef enum _HEAP_INFORMATION_CLASS {
   11618                 : 
   11619                 :     HeapCompatibilityInformation,
   11620                 :     HeapEnableTerminationOnCorruption
   11621                 : 
   11622                 : 
   11623                 : } HEAP_INFORMATION_CLASS;
   11624                 : 
   11625                 : 
   11626                 : #define WT_EXECUTEDEFAULT       0x00000000                           
   11627                 : #define WT_EXECUTEINIOTHREAD    0x00000001                           
   11628                 : #define WT_EXECUTEINUITHREAD    0x00000002                           
   11629                 : #define WT_EXECUTEINWAITTHREAD  0x00000004                           
   11630                 : #define WT_EXECUTEONLYONCE      0x00000008                           
   11631                 : #define WT_EXECUTEINTIMERTHREAD 0x00000020                           
   11632                 : #define WT_EXECUTELONGFUNCTION  0x00000010                           
   11633                 : #define WT_EXECUTEINPERSISTENTIOTHREAD  0x00000040                   
   11634                 : #define WT_EXECUTEINPERSISTENTTHREAD 0x00000080                      
   11635                 : #define WT_TRANSFER_IMPERSONATION 0x00000100                         
   11636                 : #define WT_SET_MAX_THREADPOOL_THREADS(Flags, Limit)  ((Flags) |= (Limit)<<16) 
   11637                 : typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );   
   11638                 : typedef VOID (NTAPI * WORKERCALLBACKFUNC) (PVOID );                 
   11639                 : typedef VOID (NTAPI * APC_CALLBACK_FUNCTION) (DWORD   , PVOID, PVOID); 
   11640                 : typedef
   11641                 : VOID
   11642                 : (NTAPI *PFLS_CALLBACK_FUNCTION) (
   11643                 :     IN PVOID lpFlsData
   11644                 :     );
   11645                 : #define WT_EXECUTEINLONGTHREAD  0x00000010                           
   11646                 : #define WT_EXECUTEDELETEWAIT    0x00000008                           
   11647                 : 
   11648                 : typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {
   11649                 :     ActivationContextBasicInformation                       = 1,
   11650                 :     ActivationContextDetailedInformation                    = 2,
   11651                 :     AssemblyDetailedInformationInActivationContext          = 3,
   11652                 :     FileInformationInAssemblyOfAssemblyInActivationContext  = 4,
   11653                 :     RunlevelInformationInActivationContext                  = 5,
   11654                 :     MaxActivationContextInfoClass,
   11655                 : 
   11656                 :     //
   11657                 :     // compatibility with old names
   11658                 :     //
   11659                 :     AssemblyDetailedInformationInActivationContxt           = 3,
   11660                 :     FileInformationInAssemblyOfAssemblyInActivationContxt   = 4
   11661                 : } ACTIVATION_CONTEXT_INFO_CLASS;
   11662                 : 
   11663                 : #define ACTIVATIONCONTEXTINFOCLASS ACTIVATION_CONTEXT_INFO_CLASS
   11664                 : 
   11665                 : 
   11666                 : typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {
   11667                 :     DWORD ulAssemblyIndex;
   11668                 :     DWORD ulFileIndexInAssembly;
   11669                 : } ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;
   11670                 : 
   11671                 : typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;
   11672                 : 
   11673                 : 
   11674                 : #define ACTIVATION_CONTEXT_PATH_TYPE_NONE (1)
   11675                 : #define ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE (2)
   11676                 : #define ACTIVATION_CONTEXT_PATH_TYPE_URL (3)
   11677                 : #define ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF (4)
   11678                 : 
   11679                 : typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
   11680                 :     DWORD ulFlags;
   11681                 :     DWORD ulFilenameLength;
   11682                 :     DWORD ulPathLength;
   11683                 : 
   11684                 :     PCWSTR lpFileName;
   11685                 :     PCWSTR lpFilePath;
   11686                 : } ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;
   11687                 : typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
   11688                 : 
   11689                 : //
   11690                 : // compatibility with old names
   11691                 : // The new names use "file" consistently.
   11692                 : //
   11693                 : #define  _ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION  _ASSEMBLY_FILE_DETAILED_INFORMATION
   11694                 : #define   ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION   ASSEMBLY_FILE_DETAILED_INFORMATION
   11695                 : #define  PASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION  PASSEMBLY_FILE_DETAILED_INFORMATION
   11696                 : #define PCASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PCASSEMBLY_FILE_DETAILED_INFORMATION
   11697                 : 
   11698                 : typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
   11699                 :     DWORD ulFlags;
   11700                 :     DWORD ulEncodedAssemblyIdentityLength;      // in bytes
   11701                 :     DWORD ulManifestPathType;                   // ACTIVATION_CONTEXT_PATH_TYPE_*
   11702                 :     DWORD ulManifestPathLength;                 // in bytes
   11703                 :     LARGE_INTEGER liManifestLastWriteTime;      // FILETIME
   11704                 :     DWORD ulPolicyPathType;                     // ACTIVATION_CONTEXT_PATH_TYPE_*
   11705                 :     DWORD ulPolicyPathLength;                   // in bytes
   11706                 :     LARGE_INTEGER liPolicyLastWriteTime;        // FILETIME
   11707                 :     DWORD ulMetadataSatelliteRosterIndex;
   11708                 : 
   11709                 :     DWORD ulManifestVersionMajor;               // 1
   11710                 :     DWORD ulManifestVersionMinor;               // 0
   11711                 :     DWORD ulPolicyVersionMajor;                 // 0
   11712                 :     DWORD ulPolicyVersionMinor;                 // 0
   11713                 :     DWORD ulAssemblyDirectoryNameLength;        // in bytes
   11714                 : 
   11715                 :     PCWSTR lpAssemblyEncodedAssemblyIdentity;
   11716                 :     PCWSTR lpAssemblyManifestPath;
   11717                 :     PCWSTR lpAssemblyPolicyPath;
   11718                 :     PCWSTR lpAssemblyDirectoryName;
   11719                 : 
   11720                 :     DWORD  ulFileCount;
   11721                 : } ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
   11722                 : 
   11723                 : typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;
   11724                 : 
   11725                 : typedef enum
   11726                 : {
   11727                 :     ACTCTX_RUN_LEVEL_UNSPECIFIED = 0,
   11728                 :     ACTCTX_RUN_LEVEL_AS_INVOKER,
   11729                 :     ACTCTX_RUN_LEVEL_HIGHEST_AVAILABLE,
   11730                 :     ACTCTX_RUN_LEVEL_REQUIRE_ADMIN,
   11731                 :     ACTCTX_RUN_LEVEL_NUMBERS
   11732                 : } ACTCTX_REQUESTED_RUN_LEVEL;
   11733                 : 
   11734                 : typedef struct _ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION {
   11735                 :     DWORD ulFlags;
   11736                 :     ACTCTX_REQUESTED_RUN_LEVEL  RunLevel;
   11737                 :     DWORD UiAccess;
   11738                 : } ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION, * PACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION;
   11739                 : 
   11740                 : typedef const struct _ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION * PCACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION ;
   11741                 : 
   11742                 : typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
   11743                 :     DWORD dwFlags;
   11744                 :     DWORD ulFormatVersion;
   11745                 :     DWORD ulAssemblyCount;
   11746                 :     DWORD ulRootManifestPathType;
   11747                 :     DWORD ulRootManifestPathChars;
   11748                 :     DWORD ulRootConfigurationPathType;
   11749                 :     DWORD ulRootConfigurationPathChars;
   11750                 :     DWORD ulAppDirPathType;
   11751                 :     DWORD ulAppDirPathChars;
   11752                 :     PCWSTR lpRootManifestPath;
   11753                 :     PCWSTR lpRootConfigurationPath;
   11754                 :     PCWSTR lpAppDirPath;
   11755                 : } ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
   11756                 : 
   11757                 : typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
   11758                 : 
   11759                 : #define DLL_PROCESS_ATTACH   1    
   11760                 : #define DLL_THREAD_ATTACH    2    
   11761                 : #define DLL_THREAD_DETACH    3    
   11762                 : #define DLL_PROCESS_DETACH   0    
   11763                 : 
   11764                 : //
   11765                 : // Defines for the READ flags for Eventlogging
   11766                 : //
   11767                 : #define EVENTLOG_SEQUENTIAL_READ        0x0001
   11768                 : #define EVENTLOG_SEEK_READ              0x0002
   11769                 : #define EVENTLOG_FORWARDS_READ          0x0004
   11770                 : #define EVENTLOG_BACKWARDS_READ         0x0008
   11771                 : 
   11772                 : //
   11773                 : // The types of events that can be logged.
   11774                 : //
   11775                 : #define EVENTLOG_SUCCESS                0x0000
   11776                 : #define EVENTLOG_ERROR_TYPE             0x0001
   11777                 : #define EVENTLOG_WARNING_TYPE           0x0002
   11778                 : #define EVENTLOG_INFORMATION_TYPE       0x0004
   11779                 : #define EVENTLOG_AUDIT_SUCCESS          0x0008
   11780                 : #define EVENTLOG_AUDIT_FAILURE          0x0010
   11781                 : 
   11782                 : //
   11783                 : // Defines for the WRITE flags used by Auditing for paired events
   11784                 : // These are not implemented in Product 1
   11785                 : //
   11786                 : 
   11787                 : #define EVENTLOG_START_PAIRED_EVENT    0x0001
   11788                 : #define EVENTLOG_END_PAIRED_EVENT      0x0002
   11789                 : #define EVENTLOG_END_ALL_PAIRED_EVENTS 0x0004
   11790                 : #define EVENTLOG_PAIRED_EVENT_ACTIVE   0x0008
   11791                 : #define EVENTLOG_PAIRED_EVENT_INACTIVE 0x0010
   11792                 : 
   11793                 : //
   11794                 : // Structure that defines the header of the Eventlog record. This is the
   11795                 : // fixed-sized portion before all the variable-length strings, binary
   11796                 : // data and pad bytes.
   11797                 : //
   11798                 : // TimeGenerated is the time it was generated at the client.
   11799                 : // TimeWritten is the time it was put into the log at the server end.
   11800                 : //
   11801                 : 
   11802                 : typedef struct _EVENTLOGRECORD {
   11803                 :     DWORD  Length;        // Length of full record
   11804                 :     DWORD  Reserved;      // Used by the service
   11805                 :     DWORD  RecordNumber;  // Absolute record number
   11806                 :     DWORD  TimeGenerated; // Seconds since 1-1-1970
   11807                 :     DWORD  TimeWritten;   // Seconds since 1-1-1970
   11808                 :     DWORD  EventID;
   11809                 :     WORD   EventType;
   11810                 :     WORD   NumStrings;
   11811                 :     WORD   EventCategory;
   11812                 :     WORD   ReservedFlags; // For use with paired events (auditing)
   11813                 :     DWORD  ClosingRecordNumber; // For use with paired events (auditing)
   11814                 :     DWORD  StringOffset;  // Offset from beginning of record
   11815                 :     DWORD  UserSidLength;
   11816                 :     DWORD  UserSidOffset;
   11817                 :     DWORD  DataLength;
   11818                 :     DWORD  DataOffset;    // Offset from beginning of record
   11819                 :     //
   11820                 :     // Then follow:
   11821                 :     //
   11822                 :     // WCHAR SourceName[]
   11823                 :     // WCHAR Computername[]
   11824                 :     // SID   UserSid
   11825                 :     // WCHAR Strings[]
   11826                 :     // BYTE  Data[]
   11827                 :     // CHAR  Pad[]
   11828                 :     // DWORD Length;
   11829                 :     //
   11830                 : } EVENTLOGRECORD, *PEVENTLOGRECORD;
   11831                 : 
   11832                 : //SS: start of changes to support clustering
   11833                 : //SS: ideally the
   11834                 : #define MAXLOGICALLOGNAMESIZE   256
   11835                 : 
   11836                 : #if _MSC_VER >= 1200
   11837                 : #pragma warning(push)
   11838                 : #endif
   11839                 : #pragma warning(disable : 4200)
   11840                 : typedef struct _EVENTSFORLOGFILE{
   11841                 :     DWORD           ulSize;
   11842                 :     WCHAR           szLogicalLogFile[MAXLOGICALLOGNAMESIZE];        //name of the logical file-security/application/system
   11843                 :     DWORD           ulNumRecords;
   11844                 :     EVENTLOGRECORD  pEventLogRecords[];
   11845                 : }EVENTSFORLOGFILE, *PEVENTSFORLOGFILE;
   11846                 : 
   11847                 : typedef struct _PACKEDEVENTINFO{
   11848                 :     DWORD               ulSize;  //total size of the structure
   11849                 :     DWORD               ulNumEventsForLogFile; //number of EventsForLogFile structure that follow
   11850                 :     DWORD               ulOffsets[];           //the offsets from the start of this structure to the EVENTSFORLOGFILE structure
   11851                 : }PACKEDEVENTINFO, *PPACKEDEVENTINFO;
   11852                 : 
   11853                 : #if _MSC_VER >= 1200
   11854                 : #pragma warning(pop)
   11855                 : #else
   11856                 : #pragma warning(default : 4200)
   11857                 : #endif
   11858                 : //SS: end of changes to support clustering
   11859                 : //
   11860                 : 
   11861                 : // begin_wdm 
   11862                 : //
   11863                 : // Registry Specific Access Rights.
   11864                 : //
   11865                 : 
   11866                 : #define KEY_QUERY_VALUE         (0x0001)
   11867                 : #define KEY_SET_VALUE           (0x0002)
   11868                 : #define KEY_CREATE_SUB_KEY      (0x0004)
   11869                 : #define KEY_ENUMERATE_SUB_KEYS  (0x0008)
   11870                 : #define KEY_NOTIFY              (0x0010)
   11871                 : #define KEY_CREATE_LINK         (0x0020)
   11872                 : #define KEY_WOW64_32KEY         (0x0200)
   11873                 : #define KEY_WOW64_64KEY         (0x0100)
   11874                 : #define KEY_WOW64_RES           (0x0300)
   11875                 : 
   11876                 : #define KEY_READ                ((STANDARD_RIGHTS_READ       |\
   11877                 :                                   KEY_QUERY_VALUE            |\
   11878                 :                                   KEY_ENUMERATE_SUB_KEYS     |\
   11879                 :                                   KEY_NOTIFY)                 \
   11880                 :                                   &                           \
   11881                 :                                  (~SYNCHRONIZE))
   11882                 : 
   11883                 : 
   11884                 : #define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
   11885                 :                                   KEY_SET_VALUE              |\
   11886                 :                                   KEY_CREATE_SUB_KEY)         \
   11887                 :                                   &                           \
   11888                 :                                  (~SYNCHRONIZE))
   11889                 : 
   11890                 : #define KEY_EXECUTE             ((KEY_READ)                   \
   11891                 :                                   &                           \
   11892                 :                                  (~SYNCHRONIZE))
   11893                 : 
   11894                 : #define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
   11895                 :                                   KEY_QUERY_VALUE            |\
   11896                 :                                   KEY_SET_VALUE              |\
   11897                 :                                   KEY_CREATE_SUB_KEY         |\
   11898                 :                                   KEY_ENUMERATE_SUB_KEYS     |\
   11899                 :                                   KEY_NOTIFY                 |\
   11900                 :                                   KEY_CREATE_LINK)            \
   11901                 :                                   &                           \
   11902                 :                                  (~SYNCHRONIZE))
   11903                 : 
   11904                 : //
   11905                 : // Open/Create Options
   11906                 : //
   11907                 : 
   11908                 : #define REG_OPTION_RESERVED         (0x00000000L)   // Parameter is reserved
   11909                 : 
   11910                 : #define REG_OPTION_NON_VOLATILE     (0x00000000L)   // Key is preserved
   11911                 :                                                     // when system is rebooted
   11912                 : 
   11913                 : #define REG_OPTION_VOLATILE         (0x00000001L)   // Key is not preserved
   11914                 :                                                     // when system is rebooted
   11915                 : 
   11916                 : #define REG_OPTION_CREATE_LINK      (0x00000002L)   // Created key is a
   11917                 :                                                     // symbolic link
   11918                 : 
   11919                 : #define REG_OPTION_BACKUP_RESTORE   (0x00000004L)   // open for backup or restore
   11920                 :                                                     // special access rules
   11921                 :                                                     // privilege required
   11922                 : 
   11923                 : #define REG_OPTION_OPEN_LINK        (0x00000008L)   // Open symbolic link
   11924                 : 
   11925                 : #define REG_LEGAL_OPTION            \
   11926                 :                 (REG_OPTION_RESERVED            |\
   11927                 :                  REG_OPTION_NON_VOLATILE        |\
   11928                 :                  REG_OPTION_VOLATILE            |\
   11929                 :                  REG_OPTION_CREATE_LINK         |\
   11930                 :                  REG_OPTION_BACKUP_RESTORE      |\
   11931                 :                  REG_OPTION_OPEN_LINK)
   11932                 : 
   11933                 : //
   11934                 : // Key creation/open disposition
   11935                 : //
   11936                 : 
   11937                 : #define REG_CREATED_NEW_KEY         (0x00000001L)   // New Registry Key created
   11938                 : #define REG_OPENED_EXISTING_KEY     (0x00000002L)   // Existing Key opened
   11939                 : 
   11940                 : //
   11941                 : // hive format to be used by Reg(Nt)SaveKeyEx
   11942                 : //
   11943                 : #define REG_STANDARD_FORMAT     1
   11944                 : #define REG_LATEST_FORMAT       2
   11945                 : #define REG_NO_COMPRESSION      4
   11946                 : 
   11947                 : //
   11948                 : // Key restore & hive load flags
   11949                 : //
   11950                 : 
   11951                 : #define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)   // Restore whole hive volatile
   11952                 : #define REG_REFRESH_HIVE                (0x00000002L)   // Unwind changes to last flush
   11953                 : #define REG_NO_LAZY_FLUSH               (0x00000004L)   // Never lazy flush this hive
   11954                 : #define REG_FORCE_RESTORE               (0x00000008L)   // Force the restore process even when we have open handles on subkeys
   11955                 : #define REG_APP_HIVE                    (0x00000010L)   // Loads the hive visible to the calling process
   11956                 : #define REG_PROCESS_PRIVATE             (0x00000020L)   // Hive cannot be mounted by any other process while in use
   11957                 : #define REG_START_JOURNAL               (0x00000040L)   // Starts Hive Journal
   11958                 : #define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)   // Grow hive file in exact 4k increments
   11959                 : #define REG_HIVE_NO_RM                  (0x00000100L)   // No RM is started for this hive (no transactions)
   11960                 : #define REG_HIVE_SINGLE_LOG             (0x00000200L)   // Legacy single logging is used for this hive
   11961                 : 
   11962                 : //
   11963                 : // Unload Flags
   11964                 : //
   11965                 : #define REG_FORCE_UNLOAD            1
   11966                 : 
   11967                 : //
   11968                 : // Notify filter values
   11969                 : //
   11970                 : 
   11971                 : #define REG_NOTIFY_CHANGE_NAME          (0x00000001L) // Create or delete (child)
   11972                 : #define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)
   11973                 : #define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L) // time stamp
   11974                 : #define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)
   11975                 : 
   11976                 : #define REG_LEGAL_CHANGE_FILTER                 \
   11977                 :                 (REG_NOTIFY_CHANGE_NAME          |\
   11978                 :                  REG_NOTIFY_CHANGE_ATTRIBUTES    |\
   11979                 :                  REG_NOTIFY_CHANGE_LAST_SET      |\
   11980                 :                  REG_NOTIFY_CHANGE_SECURITY)
   11981                 :  
   11982                 : // end_wdm 
   11983                 : 
   11984                 : //
   11985                 : //
   11986                 : // Predefined Value Types.
   11987                 : //
   11988                 : 
   11989                 : #define REG_NONE                    ( 0 )   // No value type
   11990                 : #define REG_SZ                      ( 1 )   // Unicode nul terminated string
   11991                 : #define REG_EXPAND_SZ               ( 2 )   // Unicode nul terminated string
   11992                 :                                             // (with environment variable references)
   11993                 : #define REG_BINARY                  ( 3 )   // Free form binary
   11994                 : #define REG_DWORD                   ( 4 )   // 32-bit number
   11995                 : #define REG_DWORD_LITTLE_ENDIAN     ( 4 )   // 32-bit number (same as REG_DWORD)
   11996                 : #define REG_DWORD_BIG_ENDIAN        ( 5 )   // 32-bit number
   11997                 : #define REG_LINK                    ( 6 )   // Symbolic Link (unicode)
   11998                 : #define REG_MULTI_SZ                ( 7 )   // Multiple Unicode strings
   11999                 : #define REG_RESOURCE_LIST           ( 8 )   // Resource list in the resource map
   12000                 : #define REG_FULL_RESOURCE_DESCRIPTOR ( 9 )  // Resource list in the hardware description
   12001                 : #define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )
   12002                 : #define REG_QWORD                   ( 11 )  // 64-bit number
   12003                 : #define REG_QWORD_LITTLE_ENDIAN     ( 11 )  // 64-bit number (same as REG_QWORD)
   12004                 : 
   12005                 : // end_wdm
   12006                 : 
   12007                 : // begin_wdm
   12008                 : //
   12009                 : // Service Types (Bit Mask)
   12010                 : //
   12011                 : #define SERVICE_KERNEL_DRIVER          0x00000001
   12012                 : #define SERVICE_FILE_SYSTEM_DRIVER     0x00000002
   12013                 : #define SERVICE_ADAPTER                0x00000004
   12014                 : #define SERVICE_RECOGNIZER_DRIVER      0x00000008
   12015                 : 
   12016                 : #define SERVICE_DRIVER                 (SERVICE_KERNEL_DRIVER | \
   12017                 :                                         SERVICE_FILE_SYSTEM_DRIVER | \
   12018                 :                                         SERVICE_RECOGNIZER_DRIVER)
   12019                 : 
   12020                 : #define SERVICE_WIN32_OWN_PROCESS      0x00000010
   12021                 : #define SERVICE_WIN32_SHARE_PROCESS    0x00000020
   12022                 : #define SERVICE_WIN32                  (SERVICE_WIN32_OWN_PROCESS | \
   12023                 :                                         SERVICE_WIN32_SHARE_PROCESS)
   12024                 : 
   12025                 : #define SERVICE_INTERACTIVE_PROCESS    0x00000100
   12026                 : 
   12027                 : #define SERVICE_TYPE_ALL               (SERVICE_WIN32  | \
   12028                 :                                         SERVICE_ADAPTER | \
   12029                 :                                         SERVICE_DRIVER  | \
   12030                 :                                         SERVICE_INTERACTIVE_PROCESS)
   12031                 : 
   12032                 : //
   12033                 : // Start Type
   12034                 : //
   12035                 : 
   12036                 : #define SERVICE_BOOT_START             0x00000000
   12037                 : #define SERVICE_SYSTEM_START           0x00000001
   12038                 : #define SERVICE_AUTO_START             0x00000002
   12039                 : #define SERVICE_DEMAND_START           0x00000003
   12040                 : #define SERVICE_DISABLED               0x00000004
   12041                 : 
   12042                 : //
   12043                 : // Error control type
   12044                 : //
   12045                 : #define SERVICE_ERROR_IGNORE           0x00000000
   12046                 : #define SERVICE_ERROR_NORMAL           0x00000001
   12047                 : #define SERVICE_ERROR_SEVERE           0x00000002
   12048                 : #define SERVICE_ERROR_CRITICAL         0x00000003
   12049                 : 
   12050                 : //
   12051                 : //
   12052                 : // Define the registry driver node enumerations
   12053                 : //
   12054                 : 
   12055                 : typedef enum _CM_SERVICE_NODE_TYPE {
   12056                 :     DriverType               = SERVICE_KERNEL_DRIVER,
   12057                 :     FileSystemType           = SERVICE_FILE_SYSTEM_DRIVER,
   12058                 :     Win32ServiceOwnProcess   = SERVICE_WIN32_OWN_PROCESS,
   12059                 :     Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
   12060                 :     AdapterType              = SERVICE_ADAPTER,
   12061                 :     RecognizerType           = SERVICE_RECOGNIZER_DRIVER
   12062                 : } SERVICE_NODE_TYPE;
   12063                 : 
   12064                 : typedef enum _CM_SERVICE_LOAD_TYPE {
   12065                 :     BootLoad    = SERVICE_BOOT_START,
   12066                 :     SystemLoad  = SERVICE_SYSTEM_START,
   12067                 :     AutoLoad    = SERVICE_AUTO_START,
   12068                 :     DemandLoad  = SERVICE_DEMAND_START,
   12069                 :     DisableLoad = SERVICE_DISABLED
   12070                 : } SERVICE_LOAD_TYPE;
   12071                 : 
   12072                 : typedef enum _CM_ERROR_CONTROL_TYPE {
   12073                 :     IgnoreError   = SERVICE_ERROR_IGNORE,
   12074                 :     NormalError   = SERVICE_ERROR_NORMAL,
   12075                 :     SevereError   = SERVICE_ERROR_SEVERE,
   12076                 :     CriticalError = SERVICE_ERROR_CRITICAL
   12077                 : } SERVICE_ERROR_TYPE;
   12078                 : 
   12079                 : 
   12080                 : 
   12081                 : //
   12082                 : // IOCTL_TAPE_ERASE definitions
   12083                 : //
   12084                 : 
   12085                 : #define TAPE_ERASE_SHORT            0L
   12086                 : #define TAPE_ERASE_LONG             1L
   12087                 : 
   12088                 : typedef struct _TAPE_ERASE {
   12089                 :     DWORD Type;
   12090                 :     BOOLEAN Immediate;
   12091                 : } TAPE_ERASE, *PTAPE_ERASE;
   12092                 : 
   12093                 : //
   12094                 : // IOCTL_TAPE_PREPARE definitions
   12095                 : //
   12096                 : 
   12097                 : #define TAPE_LOAD                   0L
   12098                 : #define TAPE_UNLOAD                 1L
   12099                 : #define TAPE_TENSION                2L
   12100                 : #define TAPE_LOCK                   3L
   12101                 : #define TAPE_UNLOCK                 4L
   12102                 : #define TAPE_FORMAT                 5L
   12103                 : 
   12104                 : typedef struct _TAPE_PREPARE {
   12105                 :     DWORD Operation;
   12106                 :     BOOLEAN Immediate;
   12107                 : } TAPE_PREPARE, *PTAPE_PREPARE;
   12108                 : 
   12109                 : //
   12110                 : // IOCTL_TAPE_WRITE_MARKS definitions
   12111                 : //
   12112                 : 
   12113                 : #define TAPE_SETMARKS               0L
   12114                 : #define TAPE_FILEMARKS              1L
   12115                 : #define TAPE_SHORT_FILEMARKS        2L
   12116                 : #define TAPE_LONG_FILEMARKS         3L
   12117                 : 
   12118                 : typedef struct _TAPE_WRITE_MARKS {
   12119                 :     DWORD Type;
   12120                 :     DWORD Count;
   12121                 :     BOOLEAN Immediate;
   12122                 : } TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;
   12123                 : 
   12124                 : //
   12125                 : // IOCTL_TAPE_GET_POSITION definitions
   12126                 : //
   12127                 : 
   12128                 : #define TAPE_ABSOLUTE_POSITION       0L
   12129                 : #define TAPE_LOGICAL_POSITION        1L
   12130                 : #define TAPE_PSEUDO_LOGICAL_POSITION 2L
   12131                 : 
   12132                 : typedef struct _TAPE_GET_POSITION {
   12133                 :     DWORD Type;
   12134                 :     DWORD Partition;
   12135                 :     LARGE_INTEGER Offset;
   12136                 : } TAPE_GET_POSITION, *PTAPE_GET_POSITION;
   12137                 : 
   12138                 : //
   12139                 : // IOCTL_TAPE_SET_POSITION definitions
   12140                 : //
   12141                 : 
   12142                 : #define TAPE_REWIND                 0L
   12143                 : #define TAPE_ABSOLUTE_BLOCK         1L
   12144                 : #define TAPE_LOGICAL_BLOCK          2L
   12145                 : #define TAPE_PSEUDO_LOGICAL_BLOCK   3L
   12146                 : #define TAPE_SPACE_END_OF_DATA      4L
   12147                 : #define TAPE_SPACE_RELATIVE_BLOCKS  5L
   12148                 : #define TAPE_SPACE_FILEMARKS        6L
   12149                 : #define TAPE_SPACE_SEQUENTIAL_FMKS  7L
   12150                 : #define TAPE_SPACE_SETMARKS         8L
   12151                 : #define TAPE_SPACE_SEQUENTIAL_SMKS  9L
   12152                 : 
   12153                 : typedef struct _TAPE_SET_POSITION {
   12154                 :     DWORD Method;
   12155                 :     DWORD Partition;
   12156                 :     LARGE_INTEGER Offset;
   12157                 :     BOOLEAN Immediate;
   12158                 : } TAPE_SET_POSITION, *PTAPE_SET_POSITION;
   12159                 : 
   12160                 : //
   12161                 : // IOCTL_TAPE_GET_DRIVE_PARAMS definitions
   12162                 : //
   12163                 : 
   12164                 : //
   12165                 : // Definitions for FeaturesLow parameter
   12166                 : //
   12167                 : 
   12168                 : #define TAPE_DRIVE_FIXED            0x00000001
   12169                 : #define TAPE_DRIVE_SELECT           0x00000002
   12170                 : #define TAPE_DRIVE_INITIATOR        0x00000004
   12171                 : 
   12172                 : #define TAPE_DRIVE_ERASE_SHORT      0x00000010
   12173                 : #define TAPE_DRIVE_ERASE_LONG       0x00000020
   12174                 : #define TAPE_DRIVE_ERASE_BOP_ONLY   0x00000040
   12175                 : #define TAPE_DRIVE_ERASE_IMMEDIATE  0x00000080
   12176                 : 
   12177                 : #define TAPE_DRIVE_TAPE_CAPACITY    0x00000100
   12178                 : #define TAPE_DRIVE_TAPE_REMAINING   0x00000200
   12179                 : #define TAPE_DRIVE_FIXED_BLOCK      0x00000400
   12180                 : #define TAPE_DRIVE_VARIABLE_BLOCK   0x00000800
   12181                 : 
   12182                 : #define TAPE_DRIVE_WRITE_PROTECT    0x00001000
   12183                 : #define TAPE_DRIVE_EOT_WZ_SIZE      0x00002000
   12184                 : 
   12185                 : #define TAPE_DRIVE_ECC              0x00010000
   12186                 : #define TAPE_DRIVE_COMPRESSION      0x00020000
   12187                 : #define TAPE_DRIVE_PADDING          0x00040000
   12188                 : #define TAPE_DRIVE_REPORT_SMKS      0x00080000
   12189                 : 
   12190                 : #define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x00100000
   12191                 : #define TAPE_DRIVE_GET_LOGICAL_BLK  0x00200000
   12192                 : #define TAPE_DRIVE_SET_EOT_WZ_SIZE  0x00400000
   12193                 : 
   12194                 : #define TAPE_DRIVE_EJECT_MEDIA      0x01000000
   12195                 : #define TAPE_DRIVE_CLEAN_REQUESTS   0x02000000
   12196                 : #define TAPE_DRIVE_SET_CMP_BOP_ONLY 0x04000000
   12197                 : 
   12198                 : #define TAPE_DRIVE_RESERVED_BIT     0x80000000  //don't use this bit!
   12199                 : //                                              //can't be a low features bit!
   12200                 : //                                              //reserved; high features only
   12201                 : 
   12202                 : //
   12203                 : // Definitions for FeaturesHigh parameter
   12204                 : //
   12205                 : 
   12206                 : #define TAPE_DRIVE_LOAD_UNLOAD      0x80000001
   12207                 : #define TAPE_DRIVE_TENSION          0x80000002
   12208                 : #define TAPE_DRIVE_LOCK_UNLOCK      0x80000004
   12209                 : #define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008
   12210                 : 
   12211                 : #define TAPE_DRIVE_SET_BLOCK_SIZE   0x80000010
   12212                 : #define TAPE_DRIVE_LOAD_UNLD_IMMED  0x80000020
   12213                 : #define TAPE_DRIVE_TENSION_IMMED    0x80000040
   12214                 : #define TAPE_DRIVE_LOCK_UNLK_IMMED  0x80000080
   12215                 : 
   12216                 : #define TAPE_DRIVE_SET_ECC          0x80000100
   12217                 : #define TAPE_DRIVE_SET_COMPRESSION  0x80000200
   12218                 : #define TAPE_DRIVE_SET_PADDING      0x80000400
   12219                 : #define TAPE_DRIVE_SET_REPORT_SMKS  0x80000800
   12220                 : 
   12221                 : #define TAPE_DRIVE_ABSOLUTE_BLK     0x80001000
   12222                 : #define TAPE_DRIVE_ABS_BLK_IMMED    0x80002000
   12223                 : #define TAPE_DRIVE_LOGICAL_BLK      0x80004000
   12224                 : #define TAPE_DRIVE_LOG_BLK_IMMED    0x80008000
   12225                 : 
   12226                 : #define TAPE_DRIVE_END_OF_DATA      0x80010000
   12227                 : #define TAPE_DRIVE_RELATIVE_BLKS    0x80020000
   12228                 : #define TAPE_DRIVE_FILEMARKS        0x80040000
   12229                 : #define TAPE_DRIVE_SEQUENTIAL_FMKS  0x80080000
   12230                 : 
   12231                 : #define TAPE_DRIVE_SETMARKS         0x80100000
   12232                 : #define TAPE_DRIVE_SEQUENTIAL_SMKS  0x80200000
   12233                 : #define TAPE_DRIVE_REVERSE_POSITION 0x80400000
   12234                 : #define TAPE_DRIVE_SPACE_IMMEDIATE  0x80800000
   12235                 : 
   12236                 : #define TAPE_DRIVE_WRITE_SETMARKS   0x81000000
   12237                 : #define TAPE_DRIVE_WRITE_FILEMARKS  0x82000000
   12238                 : #define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000
   12239                 : #define TAPE_DRIVE_WRITE_LONG_FMKS  0x88000000
   12240                 : 
   12241                 : #define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000
   12242                 : #define TAPE_DRIVE_FORMAT           0xA0000000
   12243                 : #define TAPE_DRIVE_FORMAT_IMMEDIATE 0xC0000000
   12244                 : #define TAPE_DRIVE_HIGH_FEATURES    0x80000000  //mask for high features flag
   12245                 : 
   12246                 : typedef struct _TAPE_GET_DRIVE_PARAMETERS {
   12247                 :     BOOLEAN ECC;
   12248                 :     BOOLEAN Compression;
   12249                 :     BOOLEAN DataPadding;
   12250                 :     BOOLEAN ReportSetmarks;
   12251                 :     DWORD DefaultBlockSize;
   12252                 :     DWORD MaximumBlockSize;
   12253                 :     DWORD MinimumBlockSize;
   12254                 :     DWORD MaximumPartitionCount;
   12255                 :     DWORD FeaturesLow;
   12256                 :     DWORD FeaturesHigh;
   12257                 :     DWORD EOTWarningZoneSize;
   12258                 : } TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;
   12259                 : 
   12260                 : //
   12261                 : // IOCTL_TAPE_SET_DRIVE_PARAMETERS definitions
   12262                 : //
   12263                 : 
   12264                 : typedef struct _TAPE_SET_DRIVE_PARAMETERS {
   12265                 :     BOOLEAN ECC;
   12266                 :     BOOLEAN Compression;
   12267                 :     BOOLEAN DataPadding;
   12268                 :     BOOLEAN ReportSetmarks;
   12269                 :     DWORD EOTWarningZoneSize;
   12270                 : } TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;
   12271                 : 
   12272                 : //
   12273                 : // IOCTL_TAPE_GET_MEDIA_PARAMETERS definitions
   12274                 : //
   12275                 : 
   12276                 : typedef struct _TAPE_GET_MEDIA_PARAMETERS {
   12277                 :     LARGE_INTEGER Capacity;
   12278                 :     LARGE_INTEGER Remaining;
   12279                 :     DWORD BlockSize;
   12280                 :     DWORD PartitionCount;
   12281                 :     BOOLEAN WriteProtected;
   12282                 : } TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;
   12283                 : 
   12284                 : //
   12285                 : // IOCTL_TAPE_SET_MEDIA_PARAMETERS definitions
   12286                 : //
   12287                 : 
   12288                 : typedef struct _TAPE_SET_MEDIA_PARAMETERS {
   12289                 :     DWORD BlockSize;
   12290                 : } TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;
   12291                 : 
   12292                 : //
   12293                 : // IOCTL_TAPE_CREATE_PARTITION definitions
   12294                 : //
   12295                 : 
   12296                 : #define TAPE_FIXED_PARTITIONS       0L
   12297                 : #define TAPE_SELECT_PARTITIONS      1L
   12298                 : #define TAPE_INITIATOR_PARTITIONS   2L
   12299                 : 
   12300                 : typedef struct _TAPE_CREATE_PARTITION {
   12301                 :     DWORD Method;
   12302                 :     DWORD Count;
   12303                 :     DWORD Size;
   12304                 : } TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;
   12305                 : 
   12306                 : 
   12307                 : //
   12308                 : // WMI Methods
   12309                 : //
   12310                 : #define TAPE_QUERY_DRIVE_PARAMETERS       0L
   12311                 : #define TAPE_QUERY_MEDIA_CAPACITY         1L
   12312                 : #define TAPE_CHECK_FOR_DRIVE_PROBLEM      2L
   12313                 : #define TAPE_QUERY_IO_ERROR_DATA          3L
   12314                 : #define TAPE_QUERY_DEVICE_ERROR_DATA      4L
   12315                 : 
   12316                 : typedef struct _TAPE_WMI_OPERATIONS {
   12317                 :    DWORD Method;
   12318                 :    DWORD DataBufferSize;
   12319                 :    PVOID DataBuffer;
   12320                 : } TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
   12321                 : 
   12322                 : //
   12323                 : // Type of drive errors
   12324                 : //
   12325                 : typedef enum _TAPE_DRIVE_PROBLEM_TYPE {
   12326                 :    TapeDriveProblemNone, TapeDriveReadWriteWarning,
   12327                 :    TapeDriveReadWriteError, TapeDriveReadWarning,
   12328                 :    TapeDriveWriteWarning, TapeDriveReadError,
   12329                 :    TapeDriveWriteError, TapeDriveHardwareError,
   12330                 :    TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError,
   12331                 :    TapeDriveTimetoClean, TapeDriveCleanDriveNow,
   12332                 :    TapeDriveMediaLifeExpired, TapeDriveSnappedTape
   12333                 : } TAPE_DRIVE_PROBLEM_TYPE;
   12334                 : 
   12335                 : #ifndef _NTTMAPI_
   12336                 : #define _NTTMAPI_
   12337                 : 
   12338                 : 
   12339                 : #ifdef __cplusplus
   12340                 : extern "C" {
   12341                 : #endif
   12342                 : 
   12343                 : 
   12344                 : #include <ktmtypes.h>
   12345                 : 
   12346                 : //
   12347                 : // Types for Nt level TM calls
   12348                 : //
   12349                 : 
   12350                 : //
   12351                 : // KTM Tm object rights
   12352                 : //
   12353                 : #define TRANSACTIONMANAGER_QUERY_INFORMATION     ( 0x0001 )
   12354                 : #define TRANSACTIONMANAGER_SET_INFORMATION       ( 0x0002 )
   12355                 : #define TRANSACTIONMANAGER_RECOVER               ( 0x0004 )
   12356                 : #define TRANSACTIONMANAGER_RENAME                ( 0x0008 )
   12357                 : #define TRANSACTIONMANAGER_CREATE_RM             ( 0x0010 )
   12358                 : 
   12359                 : // The following right is intended for DTC's use only; it will be
   12360                 : // deprecated, and no one else should take a dependency on it.
   12361                 : #define TRANSACTIONMANAGER_BIND_TRANSACTION      ( 0x0020 )
   12362                 : 
   12363                 : //
   12364                 : // Generic mappings for transaction manager rights.
   12365                 : //
   12366                 : 
   12367                 : #define TRANSACTIONMANAGER_GENERIC_READ            (STANDARD_RIGHTS_READ            |\
   12368                 :                                                     TRANSACTIONMANAGER_QUERY_INFORMATION)
   12369                 : 
   12370                 : #define TRANSACTIONMANAGER_GENERIC_WRITE           (STANDARD_RIGHTS_WRITE           |\
   12371                 :                                                     TRANSACTIONMANAGER_SET_INFORMATION     |\
   12372                 :                                                     TRANSACTIONMANAGER_RECOVER             |\
   12373                 :                                                     TRANSACTIONMANAGER_RENAME              |\
   12374                 :                                                     TRANSACTIONMANAGER_CREATE_RM)
   12375                 : 
   12376                 : #define TRANSACTIONMANAGER_GENERIC_EXECUTE         (STANDARD_RIGHTS_EXECUTE)
   12377                 : 
   12378                 : #define TRANSACTIONMANAGER_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED        |\
   12379                 :                                                     TRANSACTIONMANAGER_GENERIC_READ        |\
   12380                 :                                                     TRANSACTIONMANAGER_GENERIC_WRITE       |\
   12381                 :                                                     TRANSACTIONMANAGER_GENERIC_EXECUTE     |\
   12382                 :                                                     TRANSACTIONMANAGER_BIND_TRANSACTION)
   12383                 : 
   12384                 : 
   12385                 : //
   12386                 : // KTM transaction object rights.
   12387                 : //
   12388                 : #define TRANSACTION_QUERY_INFORMATION     ( 0x0001 )
   12389                 : #define TRANSACTION_SET_INFORMATION       ( 0x0002 )
   12390                 : #define TRANSACTION_ENLIST                ( 0x0004 )
   12391                 : #define TRANSACTION_COMMIT                ( 0x0008 )
   12392                 : #define TRANSACTION_ROLLBACK              ( 0x0010 )
   12393                 : #define TRANSACTION_PROPAGATE             ( 0x0020 )
   12394                 : #define TRANSACTION_SAVEPOINT             ( 0x0040 )
   12395                 : #define TRANSACTION_MARSHALL              ( TRANSACTION_QUERY_INFORMATION )
   12396                 : 
   12397                 : //
   12398                 : // Generic mappings for transaction rights.
   12399                 : // Resource managers, when enlisting, should generally use the macro
   12400                 : // TRANSACTION_RESOURCE_MANAGER_RIGHTS when opening a transaction.
   12401                 : // It's the same as generic read and write except that it does not allow
   12402                 : // a commit decision to be made.
   12403                 : //
   12404                 : 
   12405                 : #define TRANSACTION_GENERIC_READ            (STANDARD_RIGHTS_READ            |\
   12406                 :                                              TRANSACTION_QUERY_INFORMATION   |\
   12407                 :                                              SYNCHRONIZE)
   12408                 : 
   12409                 : #define TRANSACTION_GENERIC_WRITE           (STANDARD_RIGHTS_WRITE           |\
   12410                 :                                              TRANSACTION_SET_INFORMATION     |\
   12411                 :                                              TRANSACTION_COMMIT              |\
   12412                 :                                              TRANSACTION_ENLIST              |\
   12413                 :                                              TRANSACTION_ROLLBACK            |\
   12414                 :                                              TRANSACTION_PROPAGATE           |\
   12415                 :                                              TRANSACTION_SAVEPOINT           |\
   12416                 :                                              SYNCHRONIZE)
   12417                 : 
   12418                 : #define TRANSACTION_GENERIC_EXECUTE         (STANDARD_RIGHTS_EXECUTE         |\
   12419                 :                                              TRANSACTION_COMMIT              |\
   12420                 :                                              TRANSACTION_ROLLBACK            |\
   12421                 :                                              SYNCHRONIZE)
   12422                 : 
   12423                 : #define TRANSACTION_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED        |\
   12424                 :                                              TRANSACTION_GENERIC_READ        |\
   12425                 :                                              TRANSACTION_GENERIC_WRITE       |\
   12426                 :                                              TRANSACTION_GENERIC_EXECUTE)
   12427                 : 
   12428                 : #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ        |\
   12429                 :                                              STANDARD_RIGHTS_WRITE           |\
   12430                 :                                              TRANSACTION_SET_INFORMATION     |\
   12431                 :                                              TRANSACTION_ENLIST              |\
   12432                 :                                              TRANSACTION_ROLLBACK            |\
   12433                 :                                              TRANSACTION_PROPAGATE           |\
   12434                 :                                              SYNCHRONIZE)
   12435                 : 
   12436                 : //
   12437                 : // KTM resource manager object rights.
   12438                 : //
   12439                 : #define RESOURCEMANAGER_QUERY_INFORMATION     ( 0x0001 )
   12440                 : #define RESOURCEMANAGER_SET_INFORMATION       ( 0x0002 )
   12441                 : #define RESOURCEMANAGER_RECOVER               ( 0x0004 )
   12442                 : #define RESOURCEMANAGER_ENLIST                ( 0x0008 )
   12443                 : #define RESOURCEMANAGER_GET_NOTIFICATION      ( 0x0010 )
   12444                 : #define RESOURCEMANAGER_REGISTER_PROTOCOL     ( 0x0020 )
   12445                 : #define RESOURCEMANAGER_COMPLETE_PROPAGATION  ( 0x0040 )
   12446                 : 
   12447                 : //
   12448                 : // Generic mappings for resource manager rights.
   12449                 : //
   12450                 : #define RESOURCEMANAGER_GENERIC_READ        (STANDARD_RIGHTS_READ                 |\
   12451                 :                                              RESOURCEMANAGER_QUERY_INFORMATION    |\
   12452                 :                                              SYNCHRONIZE)
   12453                 : 
   12454                 : #define RESOURCEMANAGER_GENERIC_WRITE       (STANDARD_RIGHTS_WRITE                |\
   12455                 :                                              RESOURCEMANAGER_SET_INFORMATION      |\
   12456                 :                                              RESOURCEMANAGER_RECOVER              |\
   12457                 :                                              RESOURCEMANAGER_ENLIST               |\
   12458                 :                                              RESOURCEMANAGER_GET_NOTIFICATION     |\
   12459                 :                                              RESOURCEMANAGER_REGISTER_PROTOCOL    |\
   12460                 :                                              RESOURCEMANAGER_COMPLETE_PROPAGATION |\
   12461                 :                                              SYNCHRONIZE)
   12462                 : 
   12463                 : #define RESOURCEMANAGER_GENERIC_EXECUTE     (STANDARD_RIGHTS_EXECUTE              |\
   12464                 :                                              RESOURCEMANAGER_RECOVER              |\
   12465                 :                                              RESOURCEMANAGER_ENLIST               |\
   12466                 :                                              RESOURCEMANAGER_GET_NOTIFICATION     |\
   12467                 :                                              RESOURCEMANAGER_COMPLETE_PROPAGATION |\
   12468                 :                                              SYNCHRONIZE)
   12469                 : 
   12470                 : #define RESOURCEMANAGER_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED             |\
   12471                 :                                              RESOURCEMANAGER_GENERIC_READ         |\
   12472                 :                                              RESOURCEMANAGER_GENERIC_WRITE        |\
   12473                 :                                              RESOURCEMANAGER_GENERIC_EXECUTE)
   12474                 : 
   12475                 : 
   12476                 : //
   12477                 : // KTM enlistment object rights.
   12478                 : //
   12479                 : #define ENLISTMENT_QUERY_INFORMATION     ( 0x0001 )
   12480                 : #define ENLISTMENT_SET_INFORMATION       ( 0x0002 )
   12481                 : #define ENLISTMENT_RECOVER               ( 0x0004 )
   12482                 : #define ENLISTMENT_SUBORDINATE_RIGHTS    ( 0x0008 )
   12483                 : #define ENLISTMENT_SUPERIOR_RIGHTS       ( 0x0010 )
   12484                 : 
   12485                 : //
   12486                 : // Generic mappings for enlistment rights.
   12487                 : //
   12488                 : #define ENLISTMENT_GENERIC_READ        (STANDARD_RIGHTS_READ           |\
   12489                 :                                         ENLISTMENT_QUERY_INFORMATION)
   12490                 : 
   12491                 : #define ENLISTMENT_GENERIC_WRITE       (STANDARD_RIGHTS_WRITE          |\
   12492                 :                                         ENLISTMENT_SET_INFORMATION     |\
   12493                 :                                         ENLISTMENT_RECOVER             |\
   12494                 :                                         ENLISTMENT_SUBORDINATE_RIGHTS  |\
   12495                 :                                         ENLISTMENT_SUPERIOR_RIGHTS)
   12496                 : 
   12497                 : #define ENLISTMENT_GENERIC_EXECUTE     (STANDARD_RIGHTS_EXECUTE        |\
   12498                 :                                         ENLISTMENT_RECOVER             |\
   12499                 :                                         ENLISTMENT_SUBORDINATE_RIGHTS  |\
   12500                 :                                         ENLISTMENT_SUPERIOR_RIGHTS)
   12501                 : 
   12502                 : #define ENLISTMENT_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED       |\
   12503                 :                                         ENLISTMENT_GENERIC_READ        |\
   12504                 :                                         ENLISTMENT_GENERIC_WRITE       |\
   12505                 :                                         ENLISTMENT_GENERIC_EXECUTE)
   12506                 : 
   12507                 : 
   12508                 : //
   12509                 : // Transaction outcomes.
   12510                 : //
   12511                 : // TODO: warning, must match values in KTRANSACTION_OUTCOME duplicated def 
   12512                 : // in tm.h.
   12513                 : //
   12514                 : 
   12515                 : typedef enum _TRANSACTION_OUTCOME {
   12516                 :     TransactionOutcomeUndetermined = 1,
   12517                 :     TransactionOutcomeCommitted,
   12518                 :     TransactionOutcomeAborted,
   12519                 : } TRANSACTION_OUTCOME;
   12520                 : 
   12521                 : 
   12522                 : typedef enum _TRANSACTION_STATE {
   12523                 :     TransactionStateNormal = 1,
   12524                 :     TransactionStateIndoubt,
   12525                 :     TransactionStateCommittedNotify,
   12526                 : } TRANSACTION_STATE;
   12527                 : 
   12528                 : 
   12529                 : typedef struct _TRANSACTION_BASIC_INFORMATION {
   12530                 :     GUID    TransactionId;
   12531                 :     DWORD   State;
   12532                 :     DWORD   Outcome;
   12533                 : } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
   12534                 : 
   12535                 : typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
   12536                 :     GUID    TmIdentity;
   12537                 :     LARGE_INTEGER VirtualClock;
   12538                 : } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
   12539                 : 
   12540                 : typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
   12541                 :     GUID  LogIdentity;
   12542                 : } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
   12543                 : 
   12544                 : typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
   12545                 :     DWORD LogPathLength;
   12546                 :     __field_ecount(LogPathLength) WCHAR LogPath[1]; // Variable size
   12547                 : //  Data[1];                                        // Variable size data not declared
   12548                 : } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
   12549                 : 
   12550                 : typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
   12551                 :     DWORD              IsolationLevel;
   12552                 :     DWORD              IsolationFlags;
   12553                 :     LARGE_INTEGER      Timeout;
   12554                 :     DWORD              Outcome;
   12555                 :     DWORD              DescriptionLength;
   12556                 :     WCHAR              Description[1];            // Variable size
   12557                 : //          Data[1];            // Variable size data not declared
   12558                 : } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
   12559                 : 
   12560                 : // The following info-class is intended for DTC's use only; it will be
   12561                 : // deprecated, and no one else should take a dependency on it.
   12562                 : typedef struct _TRANSACTION_BIND_INFORMATION {
   12563                 :     HANDLE TmHandle;
   12564                 : } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
   12565                 : 
   12566                 : typedef struct _TRANSACTION_ENLISTMENT_PAIR {
   12567                 :     GUID   EnlistmentId;
   12568                 :     GUID   ResourceManagerId;
   12569                 : } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
   12570                 : 
   12571                 : typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
   12572                 :     DWORD                       NumberOfEnlistments;
   12573                 :     TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; // Variable size
   12574                 : } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
   12575                 : 
   12576                 : typedef struct _TRANSACTION_FULL_INFORMATION {
   12577                 : // Not currently defined
   12578                 :     DWORD   NameLength;
   12579                 : } TRANSACTION_FULL_INFORMATION, *PTRANSACTION_FULL_INFORMATION;
   12580                 : 
   12581                 : 
   12582                 : typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
   12583                 :     GUID    ResourceManagerId;
   12584                 :     DWORD   DescriptionLength;
   12585                 :     WCHAR   Description[1];            // Variable size
   12586                 : } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
   12587                 : 
   12588                 : typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
   12589                 :     HANDLE    IoCompletionPortHandle;
   12590                 :     ULONG_PTR CompletionKey;
   12591                 : } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
   12592                 : 
   12593                 : // end_wdm
   12594                 : typedef struct _TRANSACTION_NAME_INFORMATION {
   12595                 :     DWORD   NameLength;
   12596                 :     WCHAR   Name[1];            // Variable length string
   12597                 : } TRANSACTION_NAME_INFORMATION, *PTRANSACTION_NAME_INFORMATION;
   12598                 : 
   12599                 : 
   12600                 : // begin_wdm
   12601                 : typedef enum _TRANSACTION_INFORMATION_CLASS {
   12602                 :     TransactionBasicInformation,
   12603                 :     TransactionPropertiesInformation,
   12604                 :     TransactionEnlistmentInformation,
   12605                 :     TransactionFullInformation
   12606                 : // end_wdm
   12607                 :     ,
   12608                 : // The following info-class is intended for DTC's use only; it will be
   12609                 : // deprecated, and no one else should take a dependency on it.
   12610                 :     TransactionBindInformation // private and deprecated
   12611                 :     ,
   12612                 : //    TransactionNameInformation
   12613                 : // begin_wdm
   12614                 : } TRANSACTION_INFORMATION_CLASS;
   12615                 : 
   12616                 : // begin_wdm
   12617                 : typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
   12618                 :     TransactionManagerBasicInformation,
   12619                 :     TransactionManagerLogInformation,
   12620                 :     TransactionManagerLogPathInformation,
   12621                 :     TransactionManagerOnlineProbeInformation
   12622                 : // end_wdm
   12623                 : 
   12624                 : // begin_wdm
   12625                 : } TRANSACTIONMANAGER_INFORMATION_CLASS;
   12626                 : 
   12627                 : 
   12628                 : // begin_wdm
   12629                 : typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
   12630                 :     ResourceManagerBasicInformation,
   12631                 :     ResourceManagerCompletionInformation,
   12632                 :     ResourceManagerFullInformation
   12633                 : // end_wdm
   12634                 :     ,
   12635                 :     ResourceManagerNameInformation
   12636                 : // begin_wdm
   12637                 : } RESOURCEMANAGER_INFORMATION_CLASS;
   12638                 : 
   12639                 : 
   12640                 : typedef struct _ENLISTMENT_BASIC_INFORMATION {
   12641                 :     GUID    EnlistmentId;
   12642                 :     GUID    TransactionId;
   12643                 :     GUID    ResourceManagerId;
   12644                 : } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
   12645                 : 
   12646                 : // begin_wdm
   12647                 : typedef enum _ENLISTMENT_INFORMATION_CLASS {
   12648                 :     EnlistmentBasicInformation,
   12649                 :     EnlistmentRecoveryInformation,
   12650                 :     EnlistmentFullInformation
   12651                 : // end_wdm
   12652                 :     ,
   12653                 :     EnlistmentNameInformation
   12654                 : // begin_wdm
   12655                 : } ENLISTMENT_INFORMATION_CLASS;
   12656                 : 
   12657                 : typedef struct _TRANSACTION_LIST_ENTRY {
   12658                 :     UOW    UOW;
   12659                 : } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
   12660                 : 
   12661                 : typedef struct _TRANSACTION_LIST_INFORMATION {
   12662                 :     DWORD   NumberOfTransactions;
   12663                 :     TRANSACTION_LIST_ENTRY TransactionInformation[1]; // Var size
   12664                 : } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
   12665                 : 
   12666                 : 
   12667                 : //
   12668                 : // Types of objects known to the kernel transaction manager.
   12669                 : //
   12670                 : 
   12671                 : typedef enum _KTMOBJECT_TYPE {
   12672                 : 
   12673                 :     KTMOBJECT_TRANSACTION,
   12674                 :     KTMOBJECT_TRANSACTION_MANAGER,
   12675                 :     KTMOBJECT_RESOURCE_MANAGER,
   12676                 :     KTMOBJECT_ENLISTMENT,
   12677                 :     KTMOBJECT_INVALID
   12678                 : 
   12679                 : } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
   12680                 : 
   12681                 : 
   12682                 : //
   12683                 : // KTMOBJECT_CURSOR
   12684                 : //
   12685                 : // Used by NtEnumerateTransactionObject to enumerate a transaction
   12686                 : // object namespace (e.g. enlistments in a resource manager).
   12687                 : //
   12688                 : 
   12689                 : typedef struct _KTMOBJECT_CURSOR {
   12690                 : 
   12691                 :     //
   12692                 :     // The last GUID enumerated; zero if beginning enumeration.
   12693                 :     // 
   12694                 : 
   12695                 :     GUID    LastQuery;
   12696                 : 
   12697                 :     //
   12698                 :     // A count of GUIDs filled in by this last enumeration.
   12699                 :     // 
   12700                 : 
   12701                 :     DWORD   ObjectIdCount;
   12702                 : 
   12703                 :     //
   12704                 :     // ObjectIdCount GUIDs from the namespace specified.
   12705                 :     // 
   12706                 : 
   12707                 :     GUID    ObjectIds[1];
   12708                 : 
   12709                 : } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
   12710                 : 
   12711                 : // begin_wdm
   12712                 : 
   12713                 : #ifdef __cplusplus
   12714                 : }
   12715                 : #endif
   12716                 : 
   12717                 : #endif // _NTTMAPI_
   12718                 : typedef DWORD TP_VERSION, *PTP_VERSION; 
   12719                 : 
   12720                 : typedef struct _TP_CALLBACK_INSTANCE TP_CALLBACK_INSTANCE, *PTP_CALLBACK_INSTANCE;
   12721                 : 
   12722                 : typedef VOID (NTAPI *PTP_SIMPLE_CALLBACK)(
   12723                 :     __inout     PTP_CALLBACK_INSTANCE Instance,
   12724                 :     __inout_opt PVOID                 Context
   12725                 :     );
   12726                 : 
   12727                 : typedef struct _TP_POOL TP_POOL, *PTP_POOL; 
   12728                 : typedef struct _TP_CLEANUP_GROUP TP_CLEANUP_GROUP, *PTP_CLEANUP_GROUP; 
   12729                 : 
   12730                 : typedef VOID (NTAPI *PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(
   12731                 :     __inout_opt PVOID ObjectContext,
   12732                 :     __inout_opt PVOID CleanupContext
   12733                 :     );
   12734                 : 
   12735                 : //
   12736                 : // Do not manipulate this structure directly!  Allocate space for it
   12737                 : // and use the inline interfaces below.
   12738                 : //
   12739                 : 
   12740                 : typedef struct _TP_CALLBACK_ENVIRON {
   12741                 :     TP_VERSION                         Version;
   12742                 :     PTP_POOL                           Pool;
   12743                 :     PTP_CLEANUP_GROUP                  CleanupGroup;
   12744                 :     PTP_CLEANUP_GROUP_CANCEL_CALLBACK  CleanupGroupCancelCallback;
   12745                 :     PVOID                              RaceDll;
   12746                 :     struct _ACTIVATION_CONTEXT        *ActivationContext;
   12747                 :     PTP_SIMPLE_CALLBACK                FinalizationCallback;
   12748                 :     union {
   12749                 :         DWORD                          Flags;
   12750                 :         struct {
   12751                 :             DWORD                      LongFunction :  1;
   12752                 :             DWORD                      Private      : 31;
   12753                 :         } s;
   12754                 :     } u;
   12755                 : } TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON;
   12756                 : 
   12757                 : #if !defined(MIDL_PASS)
   12758                 : 
   12759                 : FORCEINLINE
   12760                 : VOID
   12761                 : TpInitializeCallbackEnviron(
   12762                 :     __out PTP_CALLBACK_ENVIRON CallbackEnviron
   12763                 :     )
   12764                 : {
   12765                 :     CallbackEnviron->Version = 1;
   12766                 :     CallbackEnviron->Pool = NULL;
   12767                 :     CallbackEnviron->CleanupGroup = NULL;
   12768                 :     CallbackEnviron->CleanupGroupCancelCallback = NULL;
   12769                 :     CallbackEnviron->RaceDll = NULL;
   12770                 :     CallbackEnviron->ActivationContext = NULL;
   12771                 :     CallbackEnviron->FinalizationCallback = NULL;
   12772                 :     CallbackEnviron->u.Flags = 0;
   12773                 : }
   12774                 : 
   12775                 : FORCEINLINE
   12776                 : VOID
   12777                 : TpSetCallbackThreadpool(
   12778                 :     __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
   12779                 :     __in    PTP_POOL             Pool
   12780                 :     )
   12781                 : {
   12782                 :     CallbackEnviron->Pool = Pool;
   12783                 : }
   12784                 : 
   12785                 : FORCEINLINE
   12786                 : VOID
   12787                 : TpSetCallbackCleanupGroup(
   12788                 :     __inout  PTP_CALLBACK_ENVIRON              CallbackEnviron,
   12789                 :     __in     PTP_CLEANUP_GROUP                 CleanupGroup,
   12790                 :     __in_opt PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback
   12791                 :     )
   12792                 : {
   12793                 :     CallbackEnviron->CleanupGroup = CleanupGroup;
   12794                 :     CallbackEnviron->CleanupGroupCancelCallback = CleanupGroupCancelCallback;
   12795                 : }
   12796                 : 
   12797                 : FORCEINLINE
   12798                 : VOID
   12799                 : TpSetCallbackActivationContext(
   12800                 :     __inout  PTP_CALLBACK_ENVIRON CallbackEnviron,
   12801                 :     __in_opt struct _ACTIVATION_CONTEXT *ActivationContext
   12802                 :     )
   12803                 : {
   12804                 :     CallbackEnviron->ActivationContext = ActivationContext;
   12805                 : }
   12806                 : 
   12807                 : FORCEINLINE
   12808                 : VOID
   12809                 : TpSetCallbackNoActivationContext(
   12810                 :     __inout PTP_CALLBACK_ENVIRON CallbackEnviron
   12811                 :     )
   12812                 : {
   12813                 :     CallbackEnviron->ActivationContext = (struct _ACTIVATION_CONTEXT *)(LONG_PTR) -1; // INVALID_ACTIVATION_CONTEXT
   12814                 : }
   12815                 : 
   12816                 : FORCEINLINE
   12817                 : VOID
   12818                 : TpSetCallbackLongFunction(
   12819                 :     __inout PTP_CALLBACK_ENVIRON CallbackEnviron
   12820                 :     )
   12821                 : {
   12822                 :     CallbackEnviron->u.s.LongFunction = 1;
   12823                 : }
   12824                 : 
   12825                 : FORCEINLINE
   12826                 : VOID
   12827                 : TpSetCallbackRaceWithDll(
   12828                 :     __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
   12829                 :     __in    PVOID                DllHandle
   12830                 :     )
   12831                 : {
   12832                 :     CallbackEnviron->RaceDll = DllHandle;
   12833                 : }
   12834                 : 
   12835                 : FORCEINLINE
   12836                 : VOID
   12837                 : TpSetCallbackFinalizationCallback(
   12838                 :     __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
   12839                 :     __in    PTP_SIMPLE_CALLBACK  FinalizationCallback
   12840                 :     )
   12841                 : {
   12842                 :     CallbackEnviron->FinalizationCallback = FinalizationCallback;
   12843                 : }
   12844                 : 
   12845                 : FORCEINLINE
   12846                 : VOID
   12847                 : TpDestroyCallbackEnviron(
   12848                 :     __in PTP_CALLBACK_ENVIRON CallbackEnviron
   12849                 :     )
   12850                 : {
   12851                 :     //
   12852                 :     // For the current version of the callback environment, no actions
   12853                 :     // need to be taken to tear down an initialized structure.  This
   12854                 :     // may change in a future release.
   12855                 :     //
   12856                 :     
   12857                 :     UNREFERENCED_PARAMETER(CallbackEnviron);
   12858                 : }
   12859                 : 
   12860                 : #endif // !defined(MIDL_PASS)
   12861                 : 
   12862                 : 
   12863                 : typedef struct _TP_WORK TP_WORK, *PTP_WORK;
   12864                 : 
   12865                 : typedef VOID (NTAPI *PTP_WORK_CALLBACK)(
   12866                 :     __inout     PTP_CALLBACK_INSTANCE Instance,
   12867                 :     __inout_opt PVOID                 Context,
   12868                 :     __inout     PTP_WORK              Work
   12869                 :     );
   12870                 : 
   12871                 : typedef struct _TP_TIMER TP_TIMER, *PTP_TIMER;
   12872                 : 
   12873                 : typedef VOID (NTAPI *PTP_TIMER_CALLBACK)(
   12874                 :     __inout     PTP_CALLBACK_INSTANCE Instance,
   12875                 :     __inout_opt PVOID                 Context,
   12876                 :     __inout     PTP_TIMER             Timer
   12877                 :     );
   12878                 : 
   12879                 : typedef DWORD    TP_WAIT_RESULT;
   12880                 : 
   12881                 : typedef struct _TP_WAIT TP_WAIT, *PTP_WAIT;
   12882                 : 
   12883                 : typedef VOID (NTAPI *PTP_WAIT_CALLBACK)(
   12884                 :     __inout     PTP_CALLBACK_INSTANCE Instance,
   12885                 :     __inout_opt PVOID                 Context,
   12886                 :     __inout     PTP_WAIT              Wait,
   12887                 :     __in        TP_WAIT_RESULT        WaitResult
   12888                 :     );
   12889                 : 
   12890                 : typedef struct _TP_IO TP_IO, *PTP_IO;
   12891                 : 
   12892                 : #if defined(_M_AMD64) && !defined(__midl)
   12893                 : 
   12894                 : __forceinline
   12895                 : struct _TEB *
   12896                 : NtCurrentTeb (
   12897                 :     VOID
   12898                 :     )
   12899                 : 
   12900                 : {
   12901                 :     return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB, Self));
   12902                 : }
   12903                 : 
   12904                 : __forceinline
   12905                 : PVOID
   12906                 : GetCurrentFiber (
   12907                 :     VOID
   12908                 :     )
   12909                 : 
   12910                 : {
   12911                 : 
   12912                 :     return (PVOID)__readgsqword(FIELD_OFFSET(NT_TIB, FiberData));
   12913                 : }
   12914                 : 
   12915                 : __forceinline
   12916                 : PVOID
   12917                 : GetFiberData (
   12918                 :     VOID
   12919                 :     )
   12920                 : 
   12921                 : {
   12922                 : 
   12923                 :     return *(PVOID *)GetCurrentFiber();
   12924                 : }
   12925                 : 
   12926                 : #endif // _M_AMD64 && !defined(__midl)
   12927                 : 
   12928                 : 
   12929                 : #if defined(_M_IX86) && !defined(MIDL_PASS)
   12930                 : 
   12931                 : #define PcTeb 0x18
   12932                 : 
   12933                 : #if (_MSC_FULL_VER >= 13012035)
   12934                 : 
   12935                 : __inline struct _TEB * NtCurrentTeb( void ) { return (struct _TEB *) (ULONG_PTR) __readfsdword (PcTeb); }
   12936                 : 
   12937                 : #else
   12938                 : 
   12939                 : #if _MSC_VER >= 1200
   12940                 : #pragma warning(push)
   12941                 : #endif
   12942                 : 
   12943                 : #pragma warning (disable:4035)        // disable 4035 (function must return something)
   12944                 : 
   12945                 : __inline struct _TEB * NtCurrentTeb( void ) { __asm mov eax, fs:[PcTeb] }
   12946                 : 
   12947                 : #if _MSC_VER >= 1200
   12948                 : #pragma warning(pop)
   12949                 : #else
   12950                 : #pragma warning (default:4035)        // reenable it
   12951                 : #endif
   12952                 : 
   12953                 : #endif
   12954                 : 
   12955                 : #endif // defined(_M_IX86) && !defined(MIDL_PASS)
   12956                 : 
   12957                 : #if (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100) || ISOLATION_AWARE_ENABLED // winnt_only
   12958                 : #define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION         (1)
   12959                 : #define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION              (2)
   12960                 : #define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION     (3)
   12961                 : #define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION       (4)
   12962                 : #define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION    (5)
   12963                 : #define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION (6)
   12964                 : #define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION       (7)
   12965                 : #define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE   (8)
   12966                 : #define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES               (9)
   12967                 : #define ACTIVATION_CONTEXT_SECTION_APPLICATION_SETTINGS         (10)
   12968                 : #endif // winnt_only
   12969                 : 
   12970                 : #ifdef __cplusplus
   12971                 : }
   12972                 : #endif
   12973                 : 
   12974                 : #endif /* _WINNT_ */
   12975                 : 
   12976                 : 

Generated by: LCOV version 1.7