· 10 years ago · Aug 30, 2016, 05:36 PM
1/*++ BUILD Version: 0091 Increment this if a change has global effects
2
3Copyright (c) Microsoft Corporation. All rights reserved.
4
5Module Name:
6
7 winnt.h
8
9Abstract:
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
14Revision History:
15
16--*/
17
18#ifndef _WINNT_
19#define _WINNT_
20
21#if _MSC_VER >= 1200
22#pragma warning(push)
23#endif
24#pragma warning(disable:4201) // named type definition in parentheses
25#pragma warning(disable:4214) // bit field types other than int
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31#include <ctype.h>
32#define ANYSIZE_ARRAY 1
33
34//
35// For compilers that don't support nameless unions/structs
36//
37#ifndef DUMMYUNIONNAME
38#if defined(NONAMELESSUNION) || !defined(_MSC_EXTENSIONS)
39#define DUMMYUNIONNAME u
40#define DUMMYUNIONNAME2 u2
41#define DUMMYUNIONNAME3 u3
42#define DUMMYUNIONNAME4 u4
43#define DUMMYUNIONNAME5 u5
44#define DUMMYUNIONNAME6 u6
45#define DUMMYUNIONNAME7 u7
46#define DUMMYUNIONNAME8 u8
47#define DUMMYUNIONNAME9 u9
48#else
49#define DUMMYUNIONNAME
50#define DUMMYUNIONNAME2
51#define DUMMYUNIONNAME3
52#define DUMMYUNIONNAME4
53#define DUMMYUNIONNAME5
54#define DUMMYUNIONNAME6
55#define DUMMYUNIONNAME7
56#define DUMMYUNIONNAME8
57#define DUMMYUNIONNAME9
58#endif
59#endif // DUMMYUNIONNAME
60
61#ifndef DUMMYSTRUCTNAME
62#if defined(NONAMELESSUNION) || !defined(_MSC_EXTENSIONS)
63#define DUMMYSTRUCTNAME s
64#define DUMMYSTRUCTNAME2 s2
65#define DUMMYSTRUCTNAME3 s3
66#define DUMMYSTRUCTNAME4 s4
67#define DUMMYSTRUCTNAME5 s5
68#else
69#define DUMMYSTRUCTNAME
70#define DUMMYSTRUCTNAME2
71#define DUMMYSTRUCTNAME3
72#define DUMMYSTRUCTNAME4
73#define DUMMYSTRUCTNAME5
74#endif
75#endif // DUMMYSTRUCTNAME
76
77#include <specstrings.h>
78#include <kernelspecs.h>
79
80#if defined(STRICT_GS_ENABLED)
81#pragma strict_gs_check(push, on)
82#endif
83
84#if defined(_M_MRX000) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) && defined(ENABLE_RESTRICTED)
85#define RESTRICTED_POINTER __restrict
86#else
87#define RESTRICTED_POINTER
88#endif
89
90#if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64)
91#define ALIGNMENT_MACHINE
92#define UNALIGNED __unaligned
93#if defined(_WIN64)
94#define UNALIGNED64 __unaligned
95#else
96#define UNALIGNED64
97#endif
98#else
99#undef ALIGNMENT_MACHINE
100#define UNALIGNED
101#define UNALIGNED64
102#endif
103
104
105#if defined(_WIN64) || defined(_M_ALPHA)
106#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
107#define MEMORY_ALLOCATION_ALIGNMENT 16
108#else
109#define MAX_NATURAL_ALIGNMENT sizeof(DWORD)
110#define MEMORY_ALLOCATION_ALIGNMENT 8
111#endif
112
113//
114// TYPE_ALIGNMENT will return the alignment requirements of a given type for
115// the current platform.
116//
117
118#ifdef __cplusplus
119#if _MSC_VER >= 1300
120#define TYPE_ALIGNMENT( t ) __alignof(t)
121#endif
122#else
123#define TYPE_ALIGNMENT( t ) \
124 FIELD_OFFSET( struct { char x; t test; }, test )
125#endif
126
127#if defined(_WIN64)
128
129#if defined(_AMD64_)
130#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
131#elif defined(_IA64_)
132#define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? \
133 TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD ))
134#else
135#error "No Target Architecture"
136#endif
137
138#define PROBE_ALIGNMENT32( _s ) TYPE_ALIGNMENT( DWORD )
139
140#else
141
142#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
143
144#endif
145
146//
147// C_ASSERT() can be used to perform many compile-time assertions:
148// type sizes, field offsets, etc.
149//
150// An assertion failure results in error C2118: negative subscript.
151//
152
153#ifndef SORTPP_PASS
154#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
155#else
156#define C_ASSERT(e) /* nothing */
157#endif
158
159#include <basetsd.h>
160
161
162#if (defined(_M_IX86) || defined(_M_IA64) || defined(_M_AMD64)) && !defined(MIDL_PASS)
163#define DECLSPEC_IMPORT __declspec(dllimport)
164#else
165#define DECLSPEC_IMPORT
166#endif
167
168#ifndef DECLSPEC_NORETURN
169#if (_MSC_VER >= 1200) && !defined(MIDL_PASS)
170#define DECLSPEC_NORETURN __declspec(noreturn)
171#else
172#define DECLSPEC_NORETURN
173#endif
174#endif
175
176#ifndef DECLSPEC_NOTHROW
177#if (_MSC_VER >= 1200) && !defined(MIDL_PASS)
178#define DECLSPEC_NOTHROW __declspec(nothrow)
179#else
180#define DECLSPEC_NOTHROW
181#endif
182#endif
183
184#ifndef DECLSPEC_ALIGN
185#if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
186#define DECLSPEC_ALIGN(x) __declspec(align(x))
187#else
188#define DECLSPEC_ALIGN(x)
189#endif
190#endif
191
192#ifndef SYSTEM_CACHE_ALIGNMENT_SIZE
193#if defined(_AMD64_) || defined(_X86_)
194#define SYSTEM_CACHE_ALIGNMENT_SIZE 64
195#else
196#define SYSTEM_CACHE_ALIGNMENT_SIZE 128
197#endif
198#endif
199
200#ifndef DECLSPEC_CACHEALIGN
201#define DECLSPEC_CACHEALIGN DECLSPEC_ALIGN(SYSTEM_CACHE_ALIGNMENT_SIZE)
202#endif
203
204#ifndef DECLSPEC_UUID
205#if (_MSC_VER >= 1100) && defined (__cplusplus)
206#define DECLSPEC_UUID(x) __declspec(uuid(x))
207#else
208#define DECLSPEC_UUID(x)
209#endif
210#endif
211
212#ifndef DECLSPEC_NOVTABLE
213#if (_MSC_VER >= 1100) && defined(__cplusplus)
214#define DECLSPEC_NOVTABLE __declspec(novtable)
215#else
216#define DECLSPEC_NOVTABLE
217#endif
218#endif
219
220#ifndef DECLSPEC_SELECTANY
221#if (_MSC_VER >= 1100)
222#define DECLSPEC_SELECTANY __declspec(selectany)
223#else
224#define DECLSPEC_SELECTANY
225#endif
226#endif
227
228#ifndef NOP_FUNCTION
229#if (_MSC_VER >= 1210)
230#define NOP_FUNCTION __noop
231#else
232#define NOP_FUNCTION (void)0
233#endif
234#endif
235
236#ifndef DECLSPEC_ADDRSAFE
237#if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
238#define DECLSPEC_ADDRSAFE __declspec(address_safe)
239#else
240#define DECLSPEC_ADDRSAFE
241#endif
242#endif
243
244#ifndef DECLSPEC_NOINLINE
245#if (_MSC_VER >= 1300)
246#define DECLSPEC_NOINLINE __declspec(noinline)
247#else
248#define DECLSPEC_NOINLINE
249#endif
250#endif
251
252#ifndef FORCEINLINE
253#if (_MSC_VER >= 1200)
254#define FORCEINLINE __forceinline
255#else
256#define FORCEINLINE __inline
257#endif
258#endif
259
260#ifndef DECLSPEC_DEPRECATED
261#if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
262#define DECLSPEC_DEPRECATED __declspec(deprecated)
263#define DEPRECATE_SUPPORTED
264#else
265#define DECLSPEC_DEPRECATED
266#undef DEPRECATE_SUPPORTED
267#endif
268#endif
269
270#ifdef DEPRECATE_DDK_FUNCTIONS
271#ifdef _NTDDK_
272#define DECLSPEC_DEPRECATED_DDK DECLSPEC_DEPRECATED
273#ifdef DEPRECATE_SUPPORTED
274#define PRAGMA_DEPRECATED_DDK 1
275#endif
276#else
277#define DECLSPEC_DEPRECATED_DDK
278#define PRAGMA_DEPRECATED_DDK 1
279#endif
280#else
281#define DECLSPEC_DEPRECATED_DDK
282#define PRAGMA_DEPRECATED_DDK 0
283#endif
284
285//
286// Void
287//
288
289typedef void *PVOID;
290typedef void * POINTER_64 PVOID64;
291
292
293#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
294#define NTAPI __stdcall
295#else
296#define _cdecl
297#define __cdecl
298#define NTAPI
299#endif
300
301#if !defined(_M_CEE_PURE)
302#define NTAPI_INLINE NTAPI
303#else
304#define NTAPI_INLINE
305#endif
306
307//
308// Define API decoration for direct importing system DLL references.
309//
310
311#if !defined(_NTSYSTEM_)
312#define NTSYSAPI DECLSPEC_IMPORT
313#define NTSYSCALLAPI DECLSPEC_IMPORT
314#else
315#define NTSYSAPI
316#if defined(_NTDLLBUILD_)
317#define NTSYSCALLAPI
318#else
319#define NTSYSCALLAPI DECLSPEC_ADDRSAFE
320#endif
321
322#endif
323
324
325//
326// Basics
327//
328
329#ifndef VOID
330#define VOID void
331typedef char CHAR;
332typedef short SHORT;
333typedef long LONG;
334#if !defined(MIDL_PASS)
335typedef int INT;
336#endif
337#endif
338
339//
340// UNICODE (Wide Character) types
341//
342
343#ifndef _MAC
344typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
345#else
346// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
347typedef unsigned short WCHAR; // wc, 16-bit UNICODE character
348#endif
349
350typedef WCHAR *PWCHAR, *LPWCH, *PWCH;
351typedef CONST WCHAR *LPCWCH, *PCWCH;
352
353typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
354typedef __nullterminated PWSTR *PZPWSTR;
355typedef __nullterminated CONST PWSTR *PCZPWSTR;
356typedef __nullterminated WCHAR UNALIGNED *LPUWSTR, *PUWSTR;
357typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;
358typedef __nullterminated PCWSTR *PZPCWSTR;
359typedef __nullterminated CONST WCHAR UNALIGNED *LPCUWSTR, *PCUWSTR;
360
361typedef __nullnullterminated WCHAR *PZZWSTR;
362typedef __nullnullterminated CONST WCHAR *PCZZWSTR;
363typedef __nullnullterminated WCHAR UNALIGNED *PUZZWSTR;
364typedef __nullnullterminated CONST WCHAR UNALIGNED *PCUZZWSTR;
365
366typedef __possibly_notnullterminated WCHAR *PNZWCH;
367typedef __possibly_notnullterminated CONST WCHAR *PCNZWCH;
368typedef __possibly_notnullterminated WCHAR UNALIGNED *PUNZWCH;
369typedef __possibly_notnullterminated CONST WCHAR UNALIGNED *PCUNZWCH;
370
371#if _WIN32_WINNT >= 0x0600 || (defined(__cplusplus) && defined(WINDOWS_ENABLE_CPLUSPLUS))
372
373typedef CONST WCHAR *LPCWCHAR, *PCWCHAR;
374typedef CONST WCHAR UNALIGNED *LPCUWCHAR, *PCUWCHAR;
375
376//
377// UCS (Universal Character Set) types
378//
379
380typedef unsigned long UCSCHAR;
381
382//
383// Even pre-Unicode agreement, UCS values are always in the
384// range U+00000000 to U+7FFFFFFF, so we'll pick an obvious
385// value.
386
387#define UCSCHAR_INVALID_CHARACTER (0xffffffff)
388
389#define MIN_UCSCHAR (0)
390
391//
392// We'll assume here that the ISO-10646 / Unicode agreement
393// not to assign code points after U+0010FFFF holds so that
394// we do not have to have separate "UCSCHAR" and "UNICODECHAR"
395// types.
396//
397
398#define MAX_UCSCHAR (0x0010FFFF)
399
400typedef UCSCHAR *PUCSCHAR;
401typedef const UCSCHAR *PCUCSCHAR;
402
403typedef UCSCHAR *PUCSSTR;
404typedef UCSCHAR UNALIGNED *PUUCSSTR;
405
406typedef const UCSCHAR *PCUCSSTR;
407typedef const UCSCHAR UNALIGNED *PCUUCSSTR;
408
409typedef UCSCHAR UNALIGNED *PUUCSCHAR;
410typedef const UCSCHAR UNALIGNED *PCUUCSCHAR;
411
412#endif // _WIN32_WINNT >= 0x0600
413
414
415//
416// ANSI (Multi-byte Character) types
417//
418typedef CHAR *PCHAR, *LPCH, *PCH;
419typedef CONST CHAR *LPCCH, *PCCH;
420
421typedef __nullterminated CHAR *NPSTR, *LPSTR, *PSTR;
422typedef __nullterminated PSTR *PZPSTR;
423typedef __nullterminated CONST PSTR *PCZPSTR;
424typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
425typedef __nullterminated PCSTR *PZPCSTR;
426
427typedef __nullnullterminated CHAR *PZZSTR;
428typedef __nullnullterminated CONST CHAR *PCZZSTR;
429
430typedef __possibly_notnullterminated CHAR *PNZCH;
431typedef __possibly_notnullterminated CONST CHAR *PCNZCH;
432
433//
434// Neutral ANSI/UNICODE types and macros
435//
436#ifdef UNICODE // r_winnt
437
438#ifndef _TCHAR_DEFINED
439typedef WCHAR TCHAR, *PTCHAR;
440typedef WCHAR TBYTE , *PTBYTE ;
441#define _TCHAR_DEFINED
442#endif /* !_TCHAR_DEFINED */
443
444typedef LPWCH LPTCH, PTCH;
445typedef LPCWCH LPCTCH, PCTCH;
446typedef LPWSTR PTSTR, LPTSTR;
447typedef LPCWSTR PCTSTR, LPCTSTR;
448typedef LPUWSTR PUTSTR, LPUTSTR;
449typedef LPCUWSTR PCUTSTR, LPCUTSTR;
450typedef LPWSTR LP;
451typedef PZZWSTR PZZTSTR;
452typedef PCZZWSTR PCZZTSTR;
453typedef PUZZWSTR PUZZTSTR;
454typedef PCUZZWSTR PCUZZTSTR;
455typedef PNZWCH PNZTCH;
456typedef PCNZWCH PCNZTCH;
457typedef PUNZWCH PUNZTCH;
458typedef PCUNZWCH PCUNZTCH;
459#define __TEXT(quote) L##quote // r_winnt
460
461#else /* UNICODE */ // r_winnt
462
463#ifndef _TCHAR_DEFINED
464typedef char TCHAR, *PTCHAR;
465typedef unsigned char TBYTE , *PTBYTE ;
466#define _TCHAR_DEFINED
467#endif /* !_TCHAR_DEFINED */
468
469typedef LPCH LPTCH, PTCH;
470typedef LPCCH LPCTCH, PCTCH;
471typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
472typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
473typedef PZZSTR PZZTSTR, PUZZTSTR;
474typedef PCZZSTR PCZZTSTR, PCUZZTSTR;
475typedef PNZCH PNZTCH, PUNZTCH;
476typedef PCNZCH PCNZTCH, PCUNZTCH;
477#define __TEXT(quote) quote // r_winnt
478
479#endif /* UNICODE */ // r_winnt
480#define TEXT(quote) __TEXT(quote) // r_winnt
481
482
483typedef SHORT *PSHORT;
484typedef LONG *PLONG;
485
486#define ALL_PROCESSOR_GROUPS 0xffff
487
488//
489// Structure to represent a system wide processor number. It contains a
490// group number and relative processor number within the group.
491//
492
493typedef struct _PROCESSOR_NUMBER {
494 WORD Group;
495 BYTE Number;
496 BYTE Reserved;
497} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER;
498
499//
500// Structure to represent a group-specific affinity, such as that of a
501// thread. Specifies the group number and the affinity within that group.
502//
503
504typedef struct _GROUP_AFFINITY {
505 KAFFINITY Mask;
506 WORD Group;
507 WORD Reserved[3];
508} GROUP_AFFINITY, *PGROUP_AFFINITY;
509
510//
511// Handle to an Object
512//
513
514#ifdef STRICT
515typedef void *HANDLE;
516#if 0 && (_MSC_VER > 1000)
517#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
518#else
519#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
520#endif
521#else
522typedef PVOID HANDLE;
523#define DECLARE_HANDLE(name) typedef HANDLE name
524#endif
525typedef HANDLE *PHANDLE;
526
527//
528// Flag (bit) fields
529//
530
531typedef BYTE FCHAR;
532typedef WORD FSHORT;
533typedef DWORD FLONG;
534
535// Component Object Model defines, and macros
536
537#ifndef _HRESULT_DEFINED
538#define _HRESULT_DEFINED
539#ifdef __midl
540typedef LONG HRESULT;
541#else
542typedef __success(return >= 0) long HRESULT;
543#endif // __midl
544#endif // !_HRESULT_DEFINED
545
546#ifdef __cplusplus
547 #define EXTERN_C extern "C"
548#else
549 #define EXTERN_C extern
550#endif
551
552#if defined(_WIN32) || defined(_MPPC_)
553
554// Win32 doesn't support __export
555
556#ifdef _68K_
557#define STDMETHODCALLTYPE __cdecl
558#else
559#define STDMETHODCALLTYPE __stdcall
560#endif
561#define STDMETHODVCALLTYPE __cdecl
562
563#define STDAPICALLTYPE __stdcall
564#define STDAPIVCALLTYPE __cdecl
565
566#else
567
568#define STDMETHODCALLTYPE __export __stdcall
569#define STDMETHODVCALLTYPE __export __cdecl
570
571#define STDAPICALLTYPE __export __stdcall
572#define STDAPIVCALLTYPE __export __cdecl
573
574#endif
575
576
577#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
578#define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
579
580#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
581#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
582
583#define STDOVERRIDEMETHODIMP __override STDMETHODIMP
584#define STDOVERRIDEMETHODIMP_(type) __override STDMETHODIMP_(type)
585
586#define IFACEMETHODIMP __override STDMETHODIMP
587#define IFACEMETHODIMP_(type) __override STDMETHODIMP_(type)
588
589// The 'V' versions allow Variable Argument lists.
590
591#define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE
592#define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE
593
594#define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
595#define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE
596
597#define STDOVERRIDEMETHODIMPV __override STDMETHODIMPV
598#define STDOVERRIDEMETHODIMPV_(type) __override STDMETHODIMPV_(type)
599
600#define IFACEMETHODIMPV __override STDMETHODIMPV
601#define IFACEMETHODIMPV_(type) __override STDMETHODIMPV_(type)
602
603typedef char CCHAR;
604typedef DWORD LCID;
605typedef PDWORD PLCID;
606typedef WORD LANGID;
607#define APPLICATION_ERROR_MASK 0x20000000
608#define ERROR_SEVERITY_SUCCESS 0x00000000
609#define ERROR_SEVERITY_INFORMATIONAL 0x40000000
610#define ERROR_SEVERITY_WARNING 0x80000000
611#define ERROR_SEVERITY_ERROR 0xC0000000
612
613//
614// _M_IX86 included so that EM CONTEXT structure compiles with
615// x86 programs. *** TBD should this be for all architectures?
616//
617
618//
619// 16 byte aligned type for 128 bit floats
620//
621
622//
623// For we define a 128 bit structure and use __declspec(align(16)) pragma to
624// align to 128 bits.
625//
626
627#if defined(_M_IA64) && !defined(MIDL_PASS)
628__declspec(align(16))
629#endif
630typedef struct _FLOAT128 {
631 __int64 LowPart;
632 __int64 HighPart;
633} FLOAT128;
634
635typedef FLOAT128 *PFLOAT128;
636
637
638//
639// __int64 is only supported by 2.0 and later midl.
640// __midl is set by the 2.0 midl and not by 1.0 midl.
641//
642
643#define _ULONGLONG_
644#if (!defined (_MAC) && (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))
645typedef __int64 LONGLONG;
646typedef unsigned __int64 ULONGLONG;
647
648#define MAXLONGLONG (0x7fffffffffffffff)
649
650
651#else
652
653#if defined(_MAC) && defined(_MAC_INT_64)
654typedef __int64 LONGLONG;
655typedef unsigned __int64 ULONGLONG;
656
657#define MAXLONGLONG (0x7fffffffffffffff)
658
659
660#else
661typedef double LONGLONG;
662typedef double ULONGLONG;
663#endif //_MAC and int64
664
665#endif
666
667typedef LONGLONG *PLONGLONG;
668typedef ULONGLONG *PULONGLONG;
669
670// Update Sequence Number
671
672typedef LONGLONG USN;
673
674#if defined(MIDL_PASS)
675typedef struct _LARGE_INTEGER {
676#else // MIDL_PASS
677typedef union _LARGE_INTEGER {
678 struct {
679 DWORD LowPart;
680 LONG HighPart;
681 } DUMMYSTRUCTNAME;
682 struct {
683 DWORD LowPart;
684 LONG HighPart;
685 } u;
686#endif //MIDL_PASS
687 LONGLONG QuadPart;
688} LARGE_INTEGER;
689
690typedef LARGE_INTEGER *PLARGE_INTEGER;
691
692#if defined(MIDL_PASS)
693typedef struct _ULARGE_INTEGER {
694#else // MIDL_PASS
695typedef union _ULARGE_INTEGER {
696 struct {
697 DWORD LowPart;
698 DWORD HighPart;
699 } DUMMYSTRUCTNAME;
700 struct {
701 DWORD LowPart;
702 DWORD HighPart;
703 } u;
704#endif //MIDL_PASS
705 ULONGLONG QuadPart;
706} ULARGE_INTEGER;
707
708typedef ULARGE_INTEGER *PULARGE_INTEGER;
709
710// end_ntminiport end_ntndis end_ntminitape
711
712
713//
714// Locally Unique Identifier
715//
716
717typedef struct _LUID {
718 DWORD LowPart;
719 LONG HighPart;
720} LUID, *PLUID;
721
722#define _DWORDLONG_
723typedef ULONGLONG DWORDLONG;
724typedef DWORDLONG *PDWORDLONG;
725
726
727//
728// Define operations to logically shift an int64 by 0..31 bits and to multiply
729// 32-bits by 32-bits to form a 64-bit product.
730//
731
732#if defined(MIDL_PASS) || defined(RC_INVOKED) || defined(_M_CEE_PURE) \
733 || defined(_68K_) || defined(_MPPC_) \
734 || defined(_M_IA64) || defined(_M_AMD64)
735
736//
737// Midl does not understand inline assembler. Therefore, the Rtl functions
738// are used for shifts by 0..31 and multiplies of 32-bits times 32-bits to
739// form a 64-bit product.
740//
741//
742// IA64 and AMD64 have native 64-bit operations that are just as fast as their
743// 32-bit counter parts. Therefore, the int64 data type is used directly to form
744// shifts of 0..31 and multiplies of 32-bits times 32-bits to form a 64-bit
745// product.
746//
747
748#define Int32x32To64(a, b) (((__int64)((long)(a))) * ((__int64)((long)(b))))
749#define UInt32x32To64(a, b) (((unsigned __int64)((unsigned int)(a))) * ((unsigned __int64)((unsigned int)(b))))
750
751#define Int64ShllMod32(a, b) (((unsigned __int64)(a)) << (b))
752#define Int64ShraMod32(a, b) (((__int64)(a)) >> (b))
753#define Int64ShrlMod32(a, b) (((unsigned __int64)(a)) >> (b))
754
755
756#elif defined(_M_IX86)
757
758//
759// The x86 C compiler understands inline assembler. Therefore, inline functions
760// that employ inline assembler are used for shifts of 0..31. The multiplies
761// rely on the compiler recognizing the cast of the multiplicand to int64 to
762// generate the optimal code inline.
763//
764
765#define Int32x32To64(a, b) ((__int64)(((__int64)((long)(a))) * ((long)(b))))
766#define UInt32x32To64(a, b) ((unsigned __int64)(((unsigned __int64)((unsigned int)(a))) * ((unsigned int)(b))))
767
768
769ULONGLONG
770NTAPI
771Int64ShllMod32 (
772 __in ULONGLONG Value,
773 __in DWORD ShiftCount
774 );
775
776LONGLONG
777NTAPI
778Int64ShraMod32 (
779 __in LONGLONG Value,
780 __in DWORD ShiftCount
781 );
782
783ULONGLONG
784NTAPI
785Int64ShrlMod32 (
786 __in ULONGLONG Value,
787 __in DWORD ShiftCount
788 );
789
790#if _MSC_VER >= 1200
791#pragma warning(push)
792#endif
793#pragma warning(disable:4035 4793) // re-enable below
794
795__inline ULONGLONG
796NTAPI
797Int64ShllMod32 (
798 __in ULONGLONG Value,
799 __in DWORD ShiftCount
800 )
801{
802 __asm {
803 mov ecx, ShiftCount
804 mov eax, dword ptr [Value]
805 mov edx, dword ptr [Value+4]
806 shld edx, eax, cl
807 shl eax, cl
808 }
809}
810
811__inline LONGLONG
812NTAPI
813Int64ShraMod32 (
814 __in LONGLONG Value,
815 __in DWORD ShiftCount
816 )
817{
818 __asm {
819 mov ecx, ShiftCount
820 mov eax, dword ptr [Value]
821 mov edx, dword ptr [Value+4]
822 shrd eax, edx, cl
823 sar edx, cl
824 }
825}
826
827__inline ULONGLONG
828NTAPI
829Int64ShrlMod32 (
830 __in ULONGLONG Value,
831 __in DWORD ShiftCount
832 )
833{
834 __asm {
835 mov ecx, ShiftCount
836 mov eax, dword ptr [Value]
837 mov edx, dword ptr [Value+4]
838 shrd eax, edx, cl
839 shr edx, cl
840 }
841}
842
843#if _MSC_VER >= 1200
844#pragma warning(pop)
845#else
846#pragma warning(default:4035 4793)
847#endif
848
849#else
850
851#error Must define a target architecture.
852
853#endif
854
855//
856// Define rotate intrinsics.
857//
858
859#ifdef __cplusplus
860extern "C" {
861#endif
862
863#if defined(_M_AMD64)
864
865#define RotateLeft8 _rotl8
866#define RotateLeft16 _rotl16
867#define RotateRight8 _rotr8
868#define RotateRight16 _rotr16
869
870unsigned char
871__cdecl
872_rotl8 (
873 __in unsigned char Value,
874 __in unsigned char Shift
875 );
876
877unsigned short
878__cdecl
879_rotl16 (
880 __in unsigned short Value,
881 __in unsigned char Shift
882 );
883
884unsigned char
885__cdecl
886_rotr8 (
887 __in unsigned char Value,
888 __in unsigned char Shift
889 );
890
891unsigned short
892__cdecl
893_rotr16 (
894 __in unsigned short Value,
895 __in unsigned char Shift
896 );
897
898#pragma intrinsic(_rotl8)
899#pragma intrinsic(_rotl16)
900#pragma intrinsic(_rotr8)
901#pragma intrinsic(_rotr16)
902
903#endif /* _M_AMD64 */
904
905#if _MSC_VER >= 1300
906
907#define RotateLeft32 _rotl
908#define RotateLeft64 _rotl64
909#define RotateRight32 _rotr
910#define RotateRight64 _rotr64
911
912__checkReturn
913unsigned int
914__cdecl
915_rotl (
916 __in unsigned int Value,
917 __in int Shift
918 );
919
920__checkReturn
921unsigned __int64
922__cdecl
923_rotl64 (
924 __in unsigned __int64 Value,
925 __in int Shift
926 );
927
928__checkReturn
929unsigned int
930__cdecl
931_rotr (
932 __in unsigned int Value,
933 __in int Shift
934 );
935
936__checkReturn
937unsigned __int64
938__cdecl
939_rotr64 (
940 __in unsigned __int64 Value,
941 __in int Shift
942 );
943
944#pragma intrinsic(_rotl)
945#pragma intrinsic(_rotl64)
946#pragma intrinsic(_rotr)
947#pragma intrinsic(_rotr64)
948
949#endif /* _MSC_VER >= 1300 */
950
951#ifdef __cplusplus
952}
953#endif
954
955#define ANSI_NULL ((CHAR)0)
956#define UNICODE_NULL ((WCHAR)0)
957#define UNICODE_STRING_MAX_BYTES ((WORD ) 65534)
958#define UNICODE_STRING_MAX_CHARS (32767)
959typedef BYTE BOOLEAN;
960typedef BOOLEAN *PBOOLEAN;
961//
962// Doubly linked list structure. Can be used as either a list head, or
963// as link words.
964//
965
966typedef struct _LIST_ENTRY {
967 struct _LIST_ENTRY *Flink;
968 struct _LIST_ENTRY *Blink;
969} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
970
971//
972// Singly linked list structure. Can be used as either a list head, or
973// as link words.
974//
975
976typedef struct _SINGLE_LIST_ENTRY {
977 struct _SINGLE_LIST_ENTRY *Next;
978} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
979
980
981//
982// These are needed for portable debugger support.
983//
984
985typedef struct LIST_ENTRY32 {
986 DWORD Flink;
987 DWORD Blink;
988} LIST_ENTRY32;
989typedef LIST_ENTRY32 *PLIST_ENTRY32;
990
991typedef struct LIST_ENTRY64 {
992 ULONGLONG Flink;
993 ULONGLONG Blink;
994} LIST_ENTRY64;
995typedef LIST_ENTRY64 *PLIST_ENTRY64;
996
997
998#include <guiddef.h>
999
1000#ifndef __OBJECTID_DEFINED
1001#define __OBJECTID_DEFINED
1002
1003typedef struct _OBJECTID { // size is 20
1004 GUID Lineage;
1005 DWORD Uniquifier;
1006} OBJECTID;
1007#endif // !_OBJECTID_DEFINED
1008
1009#define MINCHAR 0x80
1010#define MAXCHAR 0x7f
1011#define MINSHORT 0x8000
1012#define MAXSHORT 0x7fff
1013#define MINLONG 0x80000000
1014#define MAXLONG 0x7fffffff
1015#define MAXBYTE 0xff
1016#define MAXWORD 0xffff
1017#define MAXDWORD 0xffffffff
1018//
1019// Calculate the byte offset of a field in a structure of type type.
1020//
1021
1022#define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field))
1023
1024//
1025// Calculate the size of a field in a structure of type type, without
1026// knowing or stating the type of the field.
1027//
1028#define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
1029
1030//
1031// Calculate the size of a structure of type type up through and
1032// including a field.
1033//
1034#define RTL_SIZEOF_THROUGH_FIELD(type, field) \
1035 (FIELD_OFFSET(type, field) + RTL_FIELD_SIZE(type, field))
1036
1037//
1038// RTL_CONTAINS_FIELD usage:
1039//
1040// if (RTL_CONTAINS_FIELD(pBlock, pBlock->cbSize, dwMumble)) { // safe to use pBlock->dwMumble
1041//
1042#define RTL_CONTAINS_FIELD(Struct, Size, Field) \
1043 ( (((PCHAR)(&(Struct)->Field)) + sizeof((Struct)->Field)) <= (((PCHAR)(Struct))+(Size)) )
1044
1045//
1046// Return the number of elements in a statically sized array.
1047// DWORD Buffer[100];
1048// RTL_NUMBER_OF(Buffer) == 100
1049// This is also popularly known as: NUMBER_OF, ARRSIZE, _countof, NELEM, etc.
1050//
1051#define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0]))
1052
1053#if defined(__cplusplus) && \
1054 !defined(MIDL_PASS) && \
1055 !defined(RC_INVOKED) && \
1056 !defined(_PREFAST_) && \
1057 (_MSC_FULL_VER >= 13009466) && \
1058 !defined(SORTPP_PASS)
1059//
1060// RtlpNumberOf is a function that takes a reference to an array of N Ts.
1061//
1062// typedef T array_of_T[N];
1063// typedef array_of_T &reference_to_array_of_T;
1064//
1065// RtlpNumberOf returns a pointer to an array of N chars.
1066// We could return a reference instead of a pointer but older compilers do not accept that.
1067//
1068// typedef char array_of_char[N];
1069// typedef array_of_char *pointer_to_array_of_char;
1070//
1071// sizeof(array_of_char) == N
1072// sizeof(*pointer_to_array_of_char) == N
1073//
1074// pointer_to_array_of_char RtlpNumberOf(reference_to_array_of_T);
1075//
1076// We never even call RtlpNumberOf, we just take the size of dereferencing its return type.
1077// We do not even implement RtlpNumberOf, we just decare it.
1078//
1079// Attempts to pass pointers instead of arrays to this macro result in compile time errors.
1080// That is the point.
1081//
1082extern "C++" // templates cannot be declared to have 'C' linkage
1083template <typename T, size_t N>
1084char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];
1085
1086#define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A)))
1087
1088//
1089// This does not work with:
1090//
1091// void Foo()
1092// {
1093// struct { int x; } y[2];
1094// RTL_NUMBER_OF_V2(y); // illegal use of anonymous local type in template instantiation
1095// }
1096//
1097// You must instead do:
1098//
1099// struct Foo1 { int x; };
1100//
1101// void Foo()
1102// {
1103// Foo1 y[2];
1104// RTL_NUMBER_OF_V2(y); // ok
1105// }
1106//
1107// OR
1108//
1109// void Foo()
1110// {
1111// struct { int x; } y[2];
1112// RTL_NUMBER_OF_V1(y); // ok
1113// }
1114//
1115// OR
1116//
1117// void Foo()
1118// {
1119// struct { int x; } y[2];
1120// _ARRAYSIZE(y); // ok
1121// }
1122//
1123
1124#else
1125#define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A)
1126#endif
1127
1128#ifdef ENABLE_RTL_NUMBER_OF_V2
1129#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A)
1130#else
1131#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A)
1132#endif
1133
1134//
1135// ARRAYSIZE is more readable version of RTL_NUMBER_OF_V2, and uses
1136// it regardless of ENABLE_RTL_NUMBER_OF_V2
1137//
1138// _ARRAYSIZE is a version useful for anonymous types
1139//
1140#define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
1141#define _ARRAYSIZE(A) RTL_NUMBER_OF_V1(A)
1142
1143//
1144// An expression that yields the type of a field in a struct.
1145//
1146#define RTL_FIELD_TYPE(type, field) (((type*)0)->field)
1147
1148// RTL_ to avoid collisions in the global namespace.
1149//
1150// Given typedef struct _FOO { BYTE Bar[123]; } FOO;
1151// RTL_NUMBER_OF_FIELD(FOO, Bar) == 123
1152//
1153#define RTL_NUMBER_OF_FIELD(type, field) (RTL_NUMBER_OF(RTL_FIELD_TYPE(type, field)))
1154
1155//
1156// eg:
1157// typedef struct FOO {
1158// DWORD Integer;
1159// PVOID Pointer;
1160// } FOO;
1161//
1162// RTL_PADDING_BETWEEN_FIELDS(FOO, Integer, Pointer) == 0 for Win32, 4 for Win64
1163//
1164#define RTL_PADDING_BETWEEN_FIELDS(T, F1, F2) \
1165 ((FIELD_OFFSET(T, F2) > FIELD_OFFSET(T, F1)) \
1166 ? (FIELD_OFFSET(T, F2) - FIELD_OFFSET(T, F1) - RTL_FIELD_SIZE(T, F1)) \
1167 : (FIELD_OFFSET(T, F1) - FIELD_OFFSET(T, F2) - RTL_FIELD_SIZE(T, F2)))
1168
1169// RTL_ to avoid collisions in the global namespace.
1170#if defined(__cplusplus)
1171#define RTL_CONST_CAST(type) const_cast<type>
1172#else
1173#define RTL_CONST_CAST(type) (type)
1174#endif
1175
1176
1177// like sizeof
1178// usually this would be * CHAR_BIT, but we don't necessarily have #include <limits.h>
1179#define RTL_BITS_OF(sizeOfArg) (sizeof(sizeOfArg) * 8)
1180
1181#define RTL_BITS_OF_FIELD(type, field) (RTL_BITS_OF(RTL_FIELD_TYPE(type, field)))
1182
1183//
1184// Calculate the address of the base of the structure given its type, and an
1185// address of a field within the structure.
1186//
1187
1188#define CONTAINING_RECORD(address, type, field) ((type *)( \
1189 (PCHAR)(address) - \
1190 (ULONG_PTR)(&((type *)0)->field)))
1191
1192// end_ntminiport end_ntndis
1193
1194//
1195// Exception handler routine definition.
1196//
1197
1198#include <excpt.h>
1199
1200typedef
1201__drv_sameIRQL
1202__drv_functionClass(EXCEPTION_ROUTINE)
1203EXCEPTION_DISPOSITION
1204NTAPI
1205EXCEPTION_ROUTINE (
1206 __inout struct _EXCEPTION_RECORD *ExceptionRecord,
1207 __in PVOID EstablisherFrame,
1208 __inout struct _CONTEXT *ContextRecord,
1209 __in PVOID DispatcherContext
1210 );
1211
1212typedef EXCEPTION_ROUTINE *PEXCEPTION_ROUTINE;
1213
1214
1215#define VER_SERVER_NT 0x80000000
1216#define VER_WORKSTATION_NT 0x40000000
1217#define VER_SUITE_SMALLBUSINESS 0x00000001
1218#define VER_SUITE_ENTERPRISE 0x00000002
1219#define VER_SUITE_BACKOFFICE 0x00000004
1220#define VER_SUITE_COMMUNICATIONS 0x00000008
1221#define VER_SUITE_TERMINAL 0x00000010
1222#define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020
1223#define VER_SUITE_EMBEDDEDNT 0x00000040
1224#define VER_SUITE_DATACENTER 0x00000080
1225#define VER_SUITE_SINGLEUSERTS 0x00000100
1226#define VER_SUITE_PERSONAL 0x00000200
1227#define VER_SUITE_BLADE 0x00000400
1228#define VER_SUITE_EMBEDDED_RESTRICTED 0x00000800
1229#define VER_SUITE_SECURITY_APPLIANCE 0x00001000
1230#define VER_SUITE_STORAGE_SERVER 0x00002000
1231#define VER_SUITE_COMPUTE_SERVER 0x00004000
1232#define VER_SUITE_WH_SERVER 0x00008000
1233
1234
1235//
1236// Product types
1237// This list grows with each OS release.
1238//
1239// There is no ordering of values to ensure callers
1240// do an equality test i.e. greater-than and less-than
1241// comparisons are not useful.
1242//
1243// NOTE: Values in this list should never be deleted.
1244// When a product-type 'X' gets dropped from a
1245// OS release onwards, the value of 'X' continues
1246// to be used in the mapping table of GetProductInfo.
1247//
1248
1249#define PRODUCT_UNDEFINED 0x00000000
1250
1251#define PRODUCT_ULTIMATE 0x00000001
1252#define PRODUCT_HOME_BASIC 0x00000002
1253#define PRODUCT_HOME_PREMIUM 0x00000003
1254#define PRODUCT_ENTERPRISE 0x00000004
1255#define PRODUCT_HOME_BASIC_N 0x00000005
1256#define PRODUCT_BUSINESS 0x00000006
1257#define PRODUCT_STANDARD_SERVER 0x00000007
1258#define PRODUCT_DATACENTER_SERVER 0x00000008
1259#define PRODUCT_SMALLBUSINESS_SERVER 0x00000009
1260#define PRODUCT_ENTERPRISE_SERVER 0x0000000A
1261#define PRODUCT_STARTER 0x0000000B
1262#define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C
1263#define PRODUCT_STANDARD_SERVER_CORE 0x0000000D
1264#define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E
1265#define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F
1266#define PRODUCT_BUSINESS_N 0x00000010
1267#define PRODUCT_WEB_SERVER 0x00000011
1268#define PRODUCT_CLUSTER_SERVER 0x00000012
1269#define PRODUCT_HOME_SERVER 0x00000013
1270#define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014
1271#define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015
1272#define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016
1273#define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017
1274#define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018
1275#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019
1276#define PRODUCT_HOME_PREMIUM_N 0x0000001A
1277#define PRODUCT_ENTERPRISE_N 0x0000001B
1278#define PRODUCT_ULTIMATE_N 0x0000001C
1279#define PRODUCT_WEB_SERVER_CORE 0x0000001D
1280#define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT 0x0000001E
1281#define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY 0x0000001F
1282#define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING 0x00000020
1283#define PRODUCT_SERVER_FOUNDATION 0x00000021
1284#define PRODUCT_HOME_PREMIUM_SERVER 0x00000022
1285#define PRODUCT_SERVER_FOR_SMALLBUSINESS_V 0x00000023
1286#define PRODUCT_STANDARD_SERVER_V 0x00000024
1287#define PRODUCT_DATACENTER_SERVER_V 0x00000025
1288#define PRODUCT_ENTERPRISE_SERVER_V 0x00000026
1289#define PRODUCT_DATACENTER_SERVER_CORE_V 0x00000027
1290#define PRODUCT_STANDARD_SERVER_CORE_V 0x00000028
1291#define PRODUCT_ENTERPRISE_SERVER_CORE_V 0x00000029
1292#define PRODUCT_HYPERV 0x0000002A
1293#define PRODUCT_STORAGE_EXPRESS_SERVER_CORE 0x0000002B
1294#define PRODUCT_STORAGE_STANDARD_SERVER_CORE 0x0000002C
1295#define PRODUCT_STORAGE_WORKGROUP_SERVER_CORE 0x0000002D
1296#define PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE 0x0000002E
1297#define PRODUCT_STARTER_N 0x0000002F
1298#define PRODUCT_PROFESSIONAL 0x00000030
1299#define PRODUCT_PROFESSIONAL_N 0x00000031
1300#define PRODUCT_SB_SOLUTION_SERVER 0x00000032
1301#define PRODUCT_SERVER_FOR_SB_SOLUTIONS 0x00000033
1302#define PRODUCT_STANDARD_SERVER_SOLUTIONS 0x00000034
1303#define PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE 0x00000035
1304#define PRODUCT_SB_SOLUTION_SERVER_EM 0x00000036
1305#define PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM 0x00000037
1306#define PRODUCT_SOLUTION_EMBEDDEDSERVER 0x00000038
1307#define PRODUCT_SOLUTION_EMBEDDEDSERVER_CORE 0x00000039
1308#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE 0x0000003F
1309#define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT 0x0000003B
1310#define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL 0x0000003C
1311#define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC 0x0000003D
1312#define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC 0x0000003E
1313#define PRODUCT_CLUSTER_SERVER_V 0x00000040
1314#define PRODUCT_EMBEDDED 0x00000041
1315#define PRODUCT_STARTER_E 0x00000042
1316#define PRODUCT_HOME_BASIC_E 0x00000043
1317#define PRODUCT_HOME_PREMIUM_E 0x00000044
1318#define PRODUCT_PROFESSIONAL_E 0x00000045
1319#define PRODUCT_ENTERPRISE_E 0x00000046
1320#define PRODUCT_ULTIMATE_E 0x00000047
1321
1322#define PRODUCT_UNLICENSED 0xABCDABCD
1323
1324#include <sdkddkver.h>
1325
1326//
1327// Language IDs.
1328//
1329// Note that the named locale APIs (eg GetLocaleInfoEx) are preferred.
1330//
1331// Not all locales have unique Language IDs
1332//
1333// The following two combinations of primary language ID and
1334// sublanguage ID have special semantics:
1335//
1336// Primary Language ID Sublanguage ID Result
1337// ------------------- --------------- ------------------------
1338// LANG_NEUTRAL SUBLANG_NEUTRAL Language neutral
1339// LANG_NEUTRAL SUBLANG_DEFAULT User default language
1340// LANG_NEUTRAL SUBLANG_SYS_DEFAULT System default language
1341// LANG_INVARIANT SUBLANG_NEUTRAL Invariant locale
1342//
1343// It is recommended that applications test for locale names instead of
1344// Language IDs / LCIDs.
1345
1346//
1347// Primary language IDs.
1348//
1349// WARNING: These aren't always unique. Bosnian, Serbian & Croation for example.
1350//
1351// It is recommended that applications test for locale names or actual LCIDs.
1352//
1353// Note that the LANG, SUBLANG construction is not always consistent.
1354// The named locale APIs (eg GetLocaleInfoEx) are recommended.
1355//
1356#define LANG_NEUTRAL 0x00
1357#define LANG_INVARIANT 0x7f
1358
1359#define LANG_AFRIKAANS 0x36
1360#define LANG_ALBANIAN 0x1c
1361#define LANG_ALSATIAN 0x84
1362#define LANG_AMHARIC 0x5e
1363#define LANG_ARABIC 0x01
1364#define LANG_ARMENIAN 0x2b
1365#define LANG_ASSAMESE 0x4d
1366#define LANG_AZERI 0x2c
1367#define LANG_BASHKIR 0x6d
1368#define LANG_BASQUE 0x2d
1369#define LANG_BELARUSIAN 0x23
1370#define LANG_BENGALI 0x45
1371#define LANG_BRETON 0x7e
1372#define LANG_BOSNIAN 0x1a // Use with SUBLANG_BOSNIAN_* Sublanguage IDs
1373#define LANG_BOSNIAN_NEUTRAL 0x781a // Use with the ConvertDefaultLocale function
1374#define LANG_BULGARIAN 0x02
1375#define LANG_CATALAN 0x03
1376#define LANG_CHINESE 0x04 // Use with SUBLANG_CHINESE_* Sublanguage IDs
1377#define LANG_CHINESE_SIMPLIFIED 0x04 // Use with the ConvertDefaultLocale function
1378#define LANG_CHINESE_TRADITIONAL 0x7c04 // Use with the ConvertDefaultLocale function
1379#define LANG_CORSICAN 0x83
1380#define LANG_CROATIAN 0x1a
1381#define LANG_CZECH 0x05
1382#define LANG_DANISH 0x06
1383#define LANG_DARI 0x8c
1384#define LANG_DIVEHI 0x65
1385#define LANG_DUTCH 0x13
1386#define LANG_ENGLISH 0x09
1387#define LANG_ESTONIAN 0x25
1388#define LANG_FAEROESE 0x38
1389#define LANG_FARSI 0x29 // Deprecated: use LANG_PERSIAN instead
1390#define LANG_FILIPINO 0x64
1391#define LANG_FINNISH 0x0b
1392#define LANG_FRENCH 0x0c
1393#define LANG_FRISIAN 0x62
1394#define LANG_GALICIAN 0x56
1395#define LANG_GEORGIAN 0x37
1396#define LANG_GERMAN 0x07
1397#define LANG_GREEK 0x08
1398#define LANG_GREENLANDIC 0x6f
1399#define LANG_GUJARATI 0x47
1400#define LANG_HAUSA 0x68
1401#define LANG_HEBREW 0x0d
1402#define LANG_HINDI 0x39
1403#define LANG_HUNGARIAN 0x0e
1404#define LANG_ICELANDIC 0x0f
1405#define LANG_IGBO 0x70
1406#define LANG_INDONESIAN 0x21
1407#define LANG_INUKTITUT 0x5d
1408#define LANG_IRISH 0x3c // Use with the SUBLANG_IRISH_IRELAND Sublanguage ID
1409#define LANG_ITALIAN 0x10
1410#define LANG_JAPANESE 0x11
1411#define LANG_KANNADA 0x4b
1412#define LANG_KASHMIRI 0x60
1413#define LANG_KAZAK 0x3f
1414#define LANG_KHMER 0x53
1415#define LANG_KICHE 0x86
1416#define LANG_KINYARWANDA 0x87
1417#define LANG_KONKANI 0x57
1418#define LANG_KOREAN 0x12
1419#define LANG_KYRGYZ 0x40
1420#define LANG_LAO 0x54
1421#define LANG_LATVIAN 0x26
1422#define LANG_LITHUANIAN 0x27
1423#define LANG_LOWER_SORBIAN 0x2e
1424#define LANG_LUXEMBOURGISH 0x6e
1425#define LANG_MACEDONIAN 0x2f // the Former Yugoslav Republic of Macedonia
1426#define LANG_MALAY 0x3e
1427#define LANG_MALAYALAM 0x4c
1428#define LANG_MALTESE 0x3a
1429#define LANG_MANIPURI 0x58
1430#define LANG_MAORI 0x81
1431#define LANG_MAPUDUNGUN 0x7a
1432#define LANG_MARATHI 0x4e
1433#define LANG_MOHAWK 0x7c
1434#define LANG_MONGOLIAN 0x50
1435#define LANG_NEPALI 0x61
1436#define LANG_NORWEGIAN 0x14
1437#define LANG_OCCITAN 0x82
1438#define LANG_ORIYA 0x48
1439#define LANG_PASHTO 0x63
1440#define LANG_PERSIAN 0x29
1441#define LANG_POLISH 0x15
1442#define LANG_PORTUGUESE 0x16
1443#define LANG_PUNJABI 0x46
1444#define LANG_QUECHUA 0x6b
1445#define LANG_ROMANIAN 0x18
1446#define LANG_ROMANSH 0x17
1447#define LANG_RUSSIAN 0x19
1448#define LANG_SAMI 0x3b
1449#define LANG_SANSKRIT 0x4f
1450#define LANG_SCOTTISH_GAELIC 0x91
1451#define LANG_SERBIAN 0x1a // Use with the SUBLANG_SERBIAN_* Sublanguage IDs
1452#define LANG_SERBIAN_NEUTRAL 0x7c1a // Use with the ConvertDefaultLocale function
1453#define LANG_SINDHI 0x59
1454#define LANG_SINHALESE 0x5b
1455#define LANG_SLOVAK 0x1b
1456#define LANG_SLOVENIAN 0x24
1457#define LANG_SOTHO 0x6c
1458#define LANG_SPANISH 0x0a
1459#define LANG_SWAHILI 0x41
1460#define LANG_SWEDISH 0x1d
1461#define LANG_SYRIAC 0x5a
1462#define LANG_TAJIK 0x28
1463#define LANG_TAMAZIGHT 0x5f
1464#define LANG_TAMIL 0x49
1465#define LANG_TATAR 0x44
1466#define LANG_TELUGU 0x4a
1467#define LANG_THAI 0x1e
1468#define LANG_TIBETAN 0x51
1469#define LANG_TIGRIGNA 0x73
1470#define LANG_TSWANA 0x32
1471#define LANG_TURKISH 0x1f
1472#define LANG_TURKMEN 0x42
1473#define LANG_UIGHUR 0x80
1474#define LANG_UKRAINIAN 0x22
1475#define LANG_UPPER_SORBIAN 0x2e
1476#define LANG_URDU 0x20
1477#define LANG_UZBEK 0x43
1478#define LANG_VIETNAMESE 0x2a
1479#define LANG_WELSH 0x52
1480#define LANG_WOLOF 0x88
1481#define LANG_XHOSA 0x34
1482#define LANG_YAKUT 0x85
1483#define LANG_YI 0x78
1484#define LANG_YORUBA 0x6a
1485#define LANG_ZULU 0x35
1486
1487//
1488// Sublanguage IDs.
1489//
1490// The name immediately following SUBLANG_ dictates which primary
1491// language ID that sublanguage ID can be combined with to form a
1492// valid language ID.
1493//
1494// Note that the LANG, SUBLANG construction is not always consistent.
1495// The named locale APIs (eg GetLocaleInfoEx) are recommended.
1496//
1497
1498#define SUBLANG_NEUTRAL 0x00 // language neutral
1499#define SUBLANG_DEFAULT 0x01 // user default
1500#define SUBLANG_SYS_DEFAULT 0x02 // system default
1501#define SUBLANG_CUSTOM_DEFAULT 0x03 // default custom language/locale
1502#define SUBLANG_CUSTOM_UNSPECIFIED 0x04 // custom language/locale
1503#define SUBLANG_UI_CUSTOM_DEFAULT 0x05 // Default custom MUI language/locale
1504
1505
1506#define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01 // Afrikaans (South Africa) 0x0436 af-ZA
1507#define SUBLANG_ALBANIAN_ALBANIA 0x01 // Albanian (Albania) 0x041c sq-AL
1508#define SUBLANG_ALSATIAN_FRANCE 0x01 // Alsatian (France) 0x0484
1509#define SUBLANG_AMHARIC_ETHIOPIA 0x01 // Amharic (Ethiopia) 0x045e
1510#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 // Arabic (Saudi Arabia)
1511#define SUBLANG_ARABIC_IRAQ 0x02 // Arabic (Iraq)
1512#define SUBLANG_ARABIC_EGYPT 0x03 // Arabic (Egypt)
1513#define SUBLANG_ARABIC_LIBYA 0x04 // Arabic (Libya)
1514#define SUBLANG_ARABIC_ALGERIA 0x05 // Arabic (Algeria)
1515#define SUBLANG_ARABIC_MOROCCO 0x06 // Arabic (Morocco)
1516#define SUBLANG_ARABIC_TUNISIA 0x07 // Arabic (Tunisia)
1517#define SUBLANG_ARABIC_OMAN 0x08 // Arabic (Oman)
1518#define SUBLANG_ARABIC_YEMEN 0x09 // Arabic (Yemen)
1519#define SUBLANG_ARABIC_SYRIA 0x0a // Arabic (Syria)
1520#define SUBLANG_ARABIC_JORDAN 0x0b // Arabic (Jordan)
1521#define SUBLANG_ARABIC_LEBANON 0x0c // Arabic (Lebanon)
1522#define SUBLANG_ARABIC_KUWAIT 0x0d // Arabic (Kuwait)
1523#define SUBLANG_ARABIC_UAE 0x0e // Arabic (U.A.E)
1524#define SUBLANG_ARABIC_BAHRAIN 0x0f // Arabic (Bahrain)
1525#define SUBLANG_ARABIC_QATAR 0x10 // Arabic (Qatar)
1526#define SUBLANG_ARMENIAN_ARMENIA 0x01 // Armenian (Armenia) 0x042b hy-AM
1527#define SUBLANG_ASSAMESE_INDIA 0x01 // Assamese (India) 0x044d
1528#define SUBLANG_AZERI_LATIN 0x01 // Azeri (Latin)
1529#define SUBLANG_AZERI_CYRILLIC 0x02 // Azeri (Cyrillic)
1530#define SUBLANG_BASHKIR_RUSSIA 0x01 // Bashkir (Russia) 0x046d ba-RU
1531#define SUBLANG_BASQUE_BASQUE 0x01 // Basque (Basque) 0x042d eu-ES
1532#define SUBLANG_BELARUSIAN_BELARUS 0x01 // Belarusian (Belarus) 0x0423 be-BY
1533#define SUBLANG_BENGALI_INDIA 0x01 // Bengali (India)
1534#define SUBLANG_BENGALI_BANGLADESH 0x02 // Bengali (Bangladesh)
1535#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 // Bosnian (Bosnia and Herzegovina - Latin) 0x141a bs-BA-Latn
1536#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08 // Bosnian (Bosnia and Herzegovina - Cyrillic) 0x201a bs-BA-Cyrl
1537#define SUBLANG_BRETON_FRANCE 0x01 // Breton (France) 0x047e
1538#define SUBLANG_BULGARIAN_BULGARIA 0x01 // Bulgarian (Bulgaria) 0x0402
1539#define SUBLANG_CATALAN_CATALAN 0x01 // Catalan (Catalan) 0x0403
1540#define SUBLANG_CHINESE_TRADITIONAL 0x01 // Chinese (Taiwan) 0x0404 zh-TW
1541#define SUBLANG_CHINESE_SIMPLIFIED 0x02 // Chinese (PR China) 0x0804 zh-CN
1542#define SUBLANG_CHINESE_HONGKONG 0x03 // Chinese (Hong Kong S.A.R., P.R.C.) 0x0c04 zh-HK
1543#define SUBLANG_CHINESE_SINGAPORE 0x04 // Chinese (Singapore) 0x1004 zh-SG
1544#define SUBLANG_CHINESE_MACAU 0x05 // Chinese (Macau S.A.R.) 0x1404 zh-MO
1545#define SUBLANG_CORSICAN_FRANCE 0x01 // Corsican (France) 0x0483
1546#define SUBLANG_CZECH_CZECH_REPUBLIC 0x01 // Czech (Czech Republic) 0x0405
1547#define SUBLANG_CROATIAN_CROATIA 0x01 // Croatian (Croatia)
1548#define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 // Croatian (Bosnia and Herzegovina - Latin) 0x101a hr-BA
1549#define SUBLANG_DANISH_DENMARK 0x01 // Danish (Denmark) 0x0406
1550#define SUBLANG_DARI_AFGHANISTAN 0x01 // Dari (Afghanistan)
1551#define SUBLANG_DIVEHI_MALDIVES 0x01 // Divehi (Maldives) 0x0465 div-MV
1552#define SUBLANG_DUTCH 0x01 // Dutch
1553#define SUBLANG_DUTCH_BELGIAN 0x02 // Dutch (Belgian)
1554#define SUBLANG_ENGLISH_US 0x01 // English (USA)
1555#define SUBLANG_ENGLISH_UK 0x02 // English (UK)
1556#define SUBLANG_ENGLISH_AUS 0x03 // English (Australian)
1557#define SUBLANG_ENGLISH_CAN 0x04 // English (Canadian)
1558#define SUBLANG_ENGLISH_NZ 0x05 // English (New Zealand)
1559#define SUBLANG_ENGLISH_EIRE 0x06 // English (Irish)
1560#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 // English (South Africa)
1561#define SUBLANG_ENGLISH_JAMAICA 0x08 // English (Jamaica)
1562#define SUBLANG_ENGLISH_CARIBBEAN 0x09 // English (Caribbean)
1563#define SUBLANG_ENGLISH_BELIZE 0x0a // English (Belize)
1564#define SUBLANG_ENGLISH_TRINIDAD 0x0b // English (Trinidad)
1565#define SUBLANG_ENGLISH_ZIMBABWE 0x0c // English (Zimbabwe)
1566#define SUBLANG_ENGLISH_PHILIPPINES 0x0d // English (Philippines)
1567#define SUBLANG_ENGLISH_INDIA 0x10 // English (India)
1568#define SUBLANG_ENGLISH_MALAYSIA 0x11 // English (Malaysia)
1569#define SUBLANG_ENGLISH_SINGAPORE 0x12 // English (Singapore)
1570#define SUBLANG_ESTONIAN_ESTONIA 0x01 // Estonian (Estonia) 0x0425 et-EE
1571#define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01 // Faroese (Faroe Islands) 0x0438 fo-FO
1572#define SUBLANG_FILIPINO_PHILIPPINES 0x01 // Filipino (Philippines) 0x0464 fil-PH
1573#define SUBLANG_FINNISH_FINLAND 0x01 // Finnish (Finland) 0x040b
1574#define SUBLANG_FRENCH 0x01 // French
1575#define SUBLANG_FRENCH_BELGIAN 0x02 // French (Belgian)
1576#define SUBLANG_FRENCH_CANADIAN 0x03 // French (Canadian)
1577#define SUBLANG_FRENCH_SWISS 0x04 // French (Swiss)
1578#define SUBLANG_FRENCH_LUXEMBOURG 0x05 // French (Luxembourg)
1579#define SUBLANG_FRENCH_MONACO 0x06 // French (Monaco)
1580#define SUBLANG_FRISIAN_NETHERLANDS 0x01 // Frisian (Netherlands) 0x0462 fy-NL
1581#define SUBLANG_GALICIAN_GALICIAN 0x01 // Galician (Galician) 0x0456 gl-ES
1582#define SUBLANG_GEORGIAN_GEORGIA 0x01 // Georgian (Georgia) 0x0437 ka-GE
1583#define SUBLANG_GERMAN 0x01 // German
1584#define SUBLANG_GERMAN_SWISS 0x02 // German (Swiss)
1585#define SUBLANG_GERMAN_AUSTRIAN 0x03 // German (Austrian)
1586#define SUBLANG_GERMAN_LUXEMBOURG 0x04 // German (Luxembourg)
1587#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 // German (Liechtenstein)
1588#define SUBLANG_GREEK_GREECE 0x01 // Greek (Greece)
1589#define SUBLANG_GREENLANDIC_GREENLAND 0x01 // Greenlandic (Greenland) 0x046f kl-GL
1590#define SUBLANG_GUJARATI_INDIA 0x01 // Gujarati (India (Gujarati Script)) 0x0447 gu-IN
1591#define SUBLANG_HAUSA_NIGERIA_LATIN 0x01 // Hausa (Latin, Nigeria) 0x0468 ha-NG-Latn
1592#define SUBLANG_HEBREW_ISRAEL 0x01 // Hebrew (Israel) 0x040d
1593#define SUBLANG_HINDI_INDIA 0x01 // Hindi (India) 0x0439 hi-IN
1594#define SUBLANG_HUNGARIAN_HUNGARY 0x01 // Hungarian (Hungary) 0x040e
1595#define SUBLANG_ICELANDIC_ICELAND 0x01 // Icelandic (Iceland) 0x040f
1596#define SUBLANG_IGBO_NIGERIA 0x01 // Igbo (Nigeria) 0x0470 ig-NG
1597#define SUBLANG_INDONESIAN_INDONESIA 0x01 // Indonesian (Indonesia) 0x0421 id-ID
1598#define SUBLANG_INUKTITUT_CANADA 0x01 // Inuktitut (Syllabics) (Canada) 0x045d iu-CA-Cans
1599#define SUBLANG_INUKTITUT_CANADA_LATIN 0x02 // Inuktitut (Canada - Latin)
1600#define SUBLANG_IRISH_IRELAND 0x02 // Irish (Ireland)
1601#define SUBLANG_ITALIAN 0x01 // Italian
1602#define SUBLANG_ITALIAN_SWISS 0x02 // Italian (Swiss)
1603#define SUBLANG_JAPANESE_JAPAN 0x01 // Japanese (Japan) 0x0411
1604#define SUBLANG_KANNADA_INDIA 0x01 // Kannada (India (Kannada Script)) 0x044b kn-IN
1605#define SUBLANG_KASHMIRI_SASIA 0x02 // Kashmiri (South Asia)
1606#define SUBLANG_KASHMIRI_INDIA 0x02 // For app compatibility only
1607#define SUBLANG_KAZAK_KAZAKHSTAN 0x01 // Kazakh (Kazakhstan) 0x043f kk-KZ
1608#define SUBLANG_KHMER_CAMBODIA 0x01 // Khmer (Cambodia) 0x0453 kh-KH
1609#define SUBLANG_KICHE_GUATEMALA 0x01 // K'iche (Guatemala)
1610#define SUBLANG_KINYARWANDA_RWANDA 0x01 // Kinyarwanda (Rwanda) 0x0487 rw-RW
1611#define SUBLANG_KONKANI_INDIA 0x01 // Konkani (India) 0x0457 kok-IN
1612#define SUBLANG_KOREAN 0x01 // Korean (Extended Wansung)
1613#define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01 // Kyrgyz (Kyrgyzstan) 0x0440 ky-KG
1614#define SUBLANG_LAO_LAO 0x01 // Lao (Lao PDR) 0x0454 lo-LA
1615#define SUBLANG_LATVIAN_LATVIA 0x01 // Latvian (Latvia) 0x0426 lv-LV
1616#define SUBLANG_LITHUANIAN 0x01 // Lithuanian
1617#define SUBLANG_LOWER_SORBIAN_GERMANY 0x02 // Lower Sorbian (Germany) 0x082e wee-DE
1618#define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01 // Luxembourgish (Luxembourg) 0x046e lb-LU
1619#define SUBLANG_MACEDONIAN_MACEDONIA 0x01 // Macedonian (Macedonia (FYROM)) 0x042f mk-MK
1620#define SUBLANG_MALAY_MALAYSIA 0x01 // Malay (Malaysia)
1621#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 // Malay (Brunei Darussalam)
1622#define SUBLANG_MALAYALAM_INDIA 0x01 // Malayalam (India (Malayalam Script) ) 0x044c ml-IN
1623#define SUBLANG_MALTESE_MALTA 0x01 // Maltese (Malta) 0x043a mt-MT
1624#define SUBLANG_MAORI_NEW_ZEALAND 0x01 // Maori (New Zealand) 0x0481 mi-NZ
1625#define SUBLANG_MAPUDUNGUN_CHILE 0x01 // Mapudungun (Chile) 0x047a arn-CL
1626#define SUBLANG_MARATHI_INDIA 0x01 // Marathi (India) 0x044e mr-IN
1627#define SUBLANG_MOHAWK_MOHAWK 0x01 // Mohawk (Mohawk) 0x047c moh-CA
1628#define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01 // Mongolian (Cyrillic, Mongolia)
1629#define SUBLANG_MONGOLIAN_PRC 0x02 // Mongolian (PRC)
1630#define SUBLANG_NEPALI_INDIA 0x02 // Nepali (India)
1631#define SUBLANG_NEPALI_NEPAL 0x01 // Nepali (Nepal) 0x0461 ne-NP
1632#define SUBLANG_NORWEGIAN_BOKMAL 0x01 // Norwegian (Bokmal)
1633#define SUBLANG_NORWEGIAN_NYNORSK 0x02 // Norwegian (Nynorsk)
1634#define SUBLANG_OCCITAN_FRANCE 0x01 // Occitan (France) 0x0482 oc-FR
1635#define SUBLANG_ORIYA_INDIA 0x01 // Oriya (India (Oriya Script)) 0x0448 or-IN
1636#define SUBLANG_PASHTO_AFGHANISTAN 0x01 // Pashto (Afghanistan)
1637#define SUBLANG_PERSIAN_IRAN 0x01 // Persian (Iran) 0x0429 fa-IR
1638#define SUBLANG_POLISH_POLAND 0x01 // Polish (Poland) 0x0415
1639#define SUBLANG_PORTUGUESE 0x02 // Portuguese
1640#define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 // Portuguese (Brazilian)
1641#define SUBLANG_PUNJABI_INDIA 0x01 // Punjabi (India (Gurmukhi Script)) 0x0446 pa-IN
1642#define SUBLANG_QUECHUA_BOLIVIA 0x01 // Quechua (Bolivia)
1643#define SUBLANG_QUECHUA_ECUADOR 0x02 // Quechua (Ecuador)
1644#define SUBLANG_QUECHUA_PERU 0x03 // Quechua (Peru)
1645#define SUBLANG_ROMANIAN_ROMANIA 0x01 // Romanian (Romania) 0x0418
1646#define SUBLANG_ROMANSH_SWITZERLAND 0x01 // Romansh (Switzerland) 0x0417 rm-CH
1647#define SUBLANG_RUSSIAN_RUSSIA 0x01 // Russian (Russia) 0x0419
1648#define SUBLANG_SAMI_NORTHERN_NORWAY 0x01 // Northern Sami (Norway)
1649#define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02 // Northern Sami (Sweden)
1650#define SUBLANG_SAMI_NORTHERN_FINLAND 0x03 // Northern Sami (Finland)
1651#define SUBLANG_SAMI_LULE_NORWAY 0x04 // Lule Sami (Norway)
1652#define SUBLANG_SAMI_LULE_SWEDEN 0x05 // Lule Sami (Sweden)
1653#define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06 // Southern Sami (Norway)
1654#define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07 // Southern Sami (Sweden)
1655#define SUBLANG_SAMI_SKOLT_FINLAND 0x08 // Skolt Sami (Finland)
1656#define SUBLANG_SAMI_INARI_FINLAND 0x09 // Inari Sami (Finland)
1657#define SUBLANG_SANSKRIT_INDIA 0x01 // Sanskrit (India) 0x044f sa-IN
1658#define SUBLANG_SCOTTISH_GAELIC 0x01 // Scottish Gaelic (United Kingdom) 0x0491 gd-GB
1659#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN 0x06 // Serbian (Bosnia and Herzegovina - Latin)
1660#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07 // Serbian (Bosnia and Herzegovina - Cyrillic)
1661#define SUBLANG_SERBIAN_MONTENEGRO_LATIN 0x0b // Serbian (Montenegro - Latn)
1662#define SUBLANG_SERBIAN_MONTENEGRO_CYRILLIC 0x0c // Serbian (Montenegro - Cyrillic)
1663#define SUBLANG_SERBIAN_SERBIA_LATIN 0x09 // Serbian (Serbia - Latin)
1664#define SUBLANG_SERBIAN_SERBIA_CYRILLIC 0x0a // Serbian (Serbia - Cyrillic)
1665#define SUBLANG_SERBIAN_CROATIA 0x01 // Croatian (Croatia) 0x041a hr-HR
1666#define SUBLANG_SERBIAN_LATIN 0x02 // Serbian (Latin)
1667#define SUBLANG_SERBIAN_CYRILLIC 0x03 // Serbian (Cyrillic)
1668#define SUBLANG_SINDHI_INDIA 0x01 // Sindhi (India) reserved 0x0459
1669#define SUBLANG_SINDHI_PAKISTAN 0x02 // Sindhi (Pakistan) reserved 0x0859
1670#define SUBLANG_SINDHI_AFGHANISTAN 0x02 // For app compatibility only
1671#define SUBLANG_SINHALESE_SRI_LANKA 0x01 // Sinhalese (Sri Lanka)
1672#define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA 0x01 // Northern Sotho (South Africa)
1673#define SUBLANG_SLOVAK_SLOVAKIA 0x01 // Slovak (Slovakia) 0x041b sk-SK
1674#define SUBLANG_SLOVENIAN_SLOVENIA 0x01 // Slovenian (Slovenia) 0x0424 sl-SI
1675#define SUBLANG_SPANISH 0x01 // Spanish (Castilian)
1676#define SUBLANG_SPANISH_MEXICAN 0x02 // Spanish (Mexican)
1677#define SUBLANG_SPANISH_MODERN 0x03 // Spanish (Modern)
1678#define SUBLANG_SPANISH_GUATEMALA 0x04 // Spanish (Guatemala)
1679#define SUBLANG_SPANISH_COSTA_RICA 0x05 // Spanish (Costa Rica)
1680#define SUBLANG_SPANISH_PANAMA 0x06 // Spanish (Panama)
1681#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 // Spanish (Dominican Republic)
1682#define SUBLANG_SPANISH_VENEZUELA 0x08 // Spanish (Venezuela)
1683#define SUBLANG_SPANISH_COLOMBIA 0x09 // Spanish (Colombia)
1684#define SUBLANG_SPANISH_PERU 0x0a // Spanish (Peru)
1685#define SUBLANG_SPANISH_ARGENTINA 0x0b // Spanish (Argentina)
1686#define SUBLANG_SPANISH_ECUADOR 0x0c // Spanish (Ecuador)
1687#define SUBLANG_SPANISH_CHILE 0x0d // Spanish (Chile)
1688#define SUBLANG_SPANISH_URUGUAY 0x0e // Spanish (Uruguay)
1689#define SUBLANG_SPANISH_PARAGUAY 0x0f // Spanish (Paraguay)
1690#define SUBLANG_SPANISH_BOLIVIA 0x10 // Spanish (Bolivia)
1691#define SUBLANG_SPANISH_EL_SALVADOR 0x11 // Spanish (El Salvador)
1692#define SUBLANG_SPANISH_HONDURAS 0x12 // Spanish (Honduras)
1693#define SUBLANG_SPANISH_NICARAGUA 0x13 // Spanish (Nicaragua)
1694#define SUBLANG_SPANISH_PUERTO_RICO 0x14 // Spanish (Puerto Rico)
1695#define SUBLANG_SPANISH_US 0x15 // Spanish (United States)
1696#define SUBLANG_SWAHILI_KENYA 0x01 // Swahili (Kenya) 0x0441 sw-KE
1697#define SUBLANG_SWEDISH 0x01 // Swedish
1698#define SUBLANG_SWEDISH_FINLAND 0x02 // Swedish (Finland)
1699#define SUBLANG_SYRIAC_SYRIA 0x01 // Syriac (Syria) 0x045a syr-SY
1700#define SUBLANG_TAJIK_TAJIKISTAN 0x01 // Tajik (Tajikistan) 0x0428 tg-TJ-Cyrl
1701#define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02 // Tamazight (Latin, Algeria) 0x085f tmz-DZ-Latn
1702#define SUBLANG_TAMIL_INDIA 0x01 // Tamil (India)
1703#define SUBLANG_TATAR_RUSSIA 0x01 // Tatar (Russia) 0x0444 tt-RU
1704#define SUBLANG_TELUGU_INDIA 0x01 // Telugu (India (Telugu Script)) 0x044a te-IN
1705#define SUBLANG_THAI_THAILAND 0x01 // Thai (Thailand) 0x041e th-TH
1706#define SUBLANG_TIBETAN_PRC 0x01 // Tibetan (PRC)
1707#define SUBLANG_TIGRIGNA_ERITREA 0x02 // Tigrigna (Eritrea)
1708#define SUBLANG_TSWANA_SOUTH_AFRICA 0x01 // Setswana / Tswana (South Africa) 0x0432 tn-ZA
1709#define SUBLANG_TURKISH_TURKEY 0x01 // Turkish (Turkey) 0x041f tr-TR
1710#define SUBLANG_TURKMEN_TURKMENISTAN 0x01 // Turkmen (Turkmenistan) 0x0442 tk-TM
1711#define SUBLANG_UIGHUR_PRC 0x01 // Uighur (PRC) 0x0480 ug-CN
1712#define SUBLANG_UKRAINIAN_UKRAINE 0x01 // Ukrainian (Ukraine) 0x0422 uk-UA
1713#define SUBLANG_UPPER_SORBIAN_GERMANY 0x01 // Upper Sorbian (Germany) 0x042e wen-DE
1714#define SUBLANG_URDU_PAKISTAN 0x01 // Urdu (Pakistan)
1715#define SUBLANG_URDU_INDIA 0x02 // Urdu (India)
1716#define SUBLANG_UZBEK_LATIN 0x01 // Uzbek (Latin)
1717#define SUBLANG_UZBEK_CYRILLIC 0x02 // Uzbek (Cyrillic)
1718#define SUBLANG_VIETNAMESE_VIETNAM 0x01 // Vietnamese (Vietnam) 0x042a vi-VN
1719#define SUBLANG_WELSH_UNITED_KINGDOM 0x01 // Welsh (United Kingdom) 0x0452 cy-GB
1720#define SUBLANG_WOLOF_SENEGAL 0x01 // Wolof (Senegal)
1721#define SUBLANG_XHOSA_SOUTH_AFRICA 0x01 // isiXhosa / Xhosa (South Africa) 0x0434 xh-ZA
1722#define SUBLANG_YAKUT_RUSSIA 0x01 // Yakut (Russia) 0x0485 sah-RU
1723#define SUBLANG_YI_PRC 0x01 // Yi (PRC)) 0x0478
1724#define SUBLANG_YORUBA_NIGERIA 0x01 // Yoruba (Nigeria) 046a yo-NG
1725#define SUBLANG_ZULU_SOUTH_AFRICA 0x01 // isiZulu / Zulu (South Africa) 0x0435 zu-ZA
1726
1727
1728
1729
1730//
1731// Sorting IDs.
1732//
1733// Note that the named locale APIs (eg CompareStringExEx) are recommended.
1734//
1735
1736#define SORT_DEFAULT 0x0 // sorting default
1737
1738#define SORT_INVARIANT_MATH 0x1 // Invariant (Mathematical Symbols)
1739
1740#define SORT_JAPANESE_XJIS 0x0 // Japanese XJIS order
1741#define SORT_JAPANESE_UNICODE 0x1 // Japanese Unicode order (no longer supported)
1742#define SORT_JAPANESE_RADICALSTROKE 0x4 // Japanese radical/stroke order
1743
1744#define SORT_CHINESE_BIG5 0x0 // Chinese BIG5 order
1745#define SORT_CHINESE_PRCP 0x0 // PRC Chinese Phonetic order
1746#define SORT_CHINESE_UNICODE 0x1 // Chinese Unicode order (no longer supported)
1747#define SORT_CHINESE_PRC 0x2 // PRC Chinese Stroke Count order
1748#define SORT_CHINESE_BOPOMOFO 0x3 // Traditional Chinese Bopomofo order
1749#define SORT_CHINESE_RADICALSTROKE 0x4 // Traditional Chinese radical/stroke order.
1750
1751#define SORT_KOREAN_KSC 0x0 // Korean KSC order
1752#define SORT_KOREAN_UNICODE 0x1 // Korean Unicode order (no longer supported)
1753
1754#define SORT_GERMAN_PHONE_BOOK 0x1 // German Phone Book order
1755
1756#define SORT_HUNGARIAN_DEFAULT 0x0 // Hungarian Default order
1757#define SORT_HUNGARIAN_TECHNICAL 0x1 // Hungarian Technical order
1758
1759#define SORT_GEORGIAN_TRADITIONAL 0x0 // Georgian Traditional order
1760#define SORT_GEORGIAN_MODERN 0x1 // Georgian Modern order
1761
1762// end_r_winnt
1763
1764//
1765// A language ID is a 16 bit value which is the combination of a
1766// primary language ID and a secondary language ID. The bits are
1767// allocated as follows:
1768//
1769// +-----------------------+-------------------------+
1770// | Sublanguage ID | Primary Language ID |
1771// +-----------------------+-------------------------+
1772// 15 10 9 0 bit
1773//
1774// WARNING: This pattern isn't always follows, Serbina, Bosnian & Croation
1775// for example.
1776//
1777// It is recommended that applications test for locale names or actual LCIDs.
1778//
1779// Language ID creation/extraction macros:
1780//
1781// MAKELANGID - construct language id from a primary language id and
1782// a sublanguage id.
1783// PRIMARYLANGID - extract primary language id from a language id.
1784// SUBLANGID - extract sublanguage id from a language id.
1785//
1786// Note that the LANG, SUBLANG construction is not always consistent.
1787// The named locale APIs (eg GetLocaleInfoEx) are recommended.
1788//
1789// Language IDs do not exist for all locales
1790//
1791#define MAKELANGID(p, s) ((((WORD )(s)) << 10) | (WORD )(p))
1792#define PRIMARYLANGID(lgid) ((WORD )(lgid) & 0x3ff)
1793#define SUBLANGID(lgid) ((WORD )(lgid) >> 10)
1794
1795
1796//
1797// A locale ID is a 32 bit value which is the combination of a
1798// language ID, a sort ID, and a reserved area. The bits are
1799// allocated as follows:
1800//
1801// +-------------+---------+-------------------------+
1802// | Reserved | Sort ID | Language ID |
1803// +-------------+---------+-------------------------+
1804// 31 20 19 16 15 0 bit
1805//
1806// WARNING: This pattern isn't always followed (es-ES_tradnl vs es-ES for example)
1807//
1808// It is recommended that applications test for locale names or actual LCIDs.
1809//
1810// Locale ID creation/extraction macros:
1811//
1812// MAKELCID - construct the locale id from a language id and a sort id.
1813// MAKESORTLCID - construct the locale id from a language id, sort id, and sort version.
1814// LANGIDFROMLCID - extract the language id from a locale id.
1815// SORTIDFROMLCID - extract the sort id from a locale id.
1816// SORTVERSIONFROMLCID - extract the sort version from a locale id.
1817//
1818// Note that the LANG, SUBLANG construction is not always consistent.
1819// The named locale APIs (eg GetLocaleInfoEx) are recommended.
1820//
1821// LCIDs do not exist for all locales.
1822//
1823#define NLS_VALID_LOCALE_MASK 0x000fffff
1824
1825#define MAKELCID(lgid, srtid) ((DWORD)((((DWORD)((WORD )(srtid))) << 16) | \
1826 ((DWORD)((WORD )(lgid)))))
1827#define MAKESORTLCID(lgid, srtid, ver) \
1828 ((DWORD)((MAKELCID(lgid, srtid)) | \
1829 (((DWORD)((WORD )(ver))) << 20)))
1830#define LANGIDFROMLCID(lcid) ((WORD )(lcid))
1831#define SORTIDFROMLCID(lcid) ((WORD )((((DWORD)(lcid)) >> 16) & 0xf))
1832#define SORTVERSIONFROMLCID(lcid) ((WORD )((((DWORD)(lcid)) >> 20) & 0xf))
1833
1834// 8 characters for language
1835// 8 characters for region
1836// 64 characters for suffix (script)
1837// 2 characters for '-' separators
1838// 2 characters for prefix like "i-" or "x-"
1839// 1 null termination
1840#define LOCALE_NAME_MAX_LENGTH 85
1841
1842//
1843// Default System and User IDs for language and locale.
1844// Locale names such as LOCALE_NAME_SYSTEM_DEFAULT, LOCALE_NAME_USER_DEFAULT,
1845// and LOCALE_NAME_INVARIANT are preferred.
1846//
1847
1848#define LANG_SYSTEM_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))
1849#define LANG_USER_DEFAULT (MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
1850
1851#define LOCALE_SYSTEM_DEFAULT (MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))
1852#define LOCALE_USER_DEFAULT (MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT))
1853
1854//
1855// Other special IDs for language and locale.
1856//
1857#define LOCALE_CUSTOM_DEFAULT \
1858 (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_CUSTOM_DEFAULT), SORT_DEFAULT))
1859
1860#define LOCALE_CUSTOM_UNSPECIFIED \
1861 (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_CUSTOM_UNSPECIFIED), SORT_DEFAULT))
1862
1863#define LOCALE_CUSTOM_UI_DEFAULT \
1864 (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_UI_CUSTOM_DEFAULT), SORT_DEFAULT))
1865
1866#define LOCALE_NEUTRAL \
1867 (MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT))
1868
1869#define LOCALE_INVARIANT \
1870 (MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT))
1871
1872// begin_ntminiport begin_ntndis begin_ntminitape
1873
1874//
1875// Macros used to eliminate compiler warning generated when formal
1876// parameters or local variables are not declared.
1877//
1878// Use DBG_UNREFERENCED_PARAMETER() when a parameter is not yet
1879// referenced but will be once the module is completely developed.
1880//
1881// Use DBG_UNREFERENCED_LOCAL_VARIABLE() when a local variable is not yet
1882// referenced but will be once the module is completely developed.
1883//
1884// Use UNREFERENCED_PARAMETER() if a parameter will never be referenced.
1885//
1886// DBG_UNREFERENCED_PARAMETER and DBG_UNREFERENCED_LOCAL_VARIABLE will
1887// eventually be made into a null macro to help determine whether there
1888// is unfinished work.
1889//
1890
1891#if ! defined(lint)
1892#define UNREFERENCED_PARAMETER(P) (P)
1893#define DBG_UNREFERENCED_PARAMETER(P) (P)
1894#define DBG_UNREFERENCED_LOCAL_VARIABLE(V) (V)
1895
1896#else // lint
1897
1898// Note: lint -e530 says don't complain about uninitialized variables for
1899// this varible. Error 527 has to do with unreachable code.
1900// -restore restores checking to the -save state
1901
1902#define UNREFERENCED_PARAMETER(P) \
1903 /*lint -save -e527 -e530 */ \
1904 { \
1905 (P) = (P); \
1906 } \
1907 /*lint -restore */
1908#define DBG_UNREFERENCED_PARAMETER(P) \
1909 /*lint -save -e527 -e530 */ \
1910 { \
1911 (P) = (P); \
1912 } \
1913 /*lint -restore */
1914#define DBG_UNREFERENCED_LOCAL_VARIABLE(V) \
1915 /*lint -save -e527 -e530 */ \
1916 { \
1917 (V) = (V); \
1918 } \
1919 /*lint -restore */
1920
1921#endif // lint
1922
1923//
1924// Macro used to eliminate compiler warning 4715 within a switch statement
1925// when all possible cases have already been accounted for.
1926//
1927// switch (a & 3) {
1928// case 0: return 1;
1929// case 1: return Foo();
1930// case 2: return Bar();
1931// case 3: return 1;
1932// DEFAULT_UNREACHABLE;
1933//
1934
1935#if (_MSC_VER > 1200)
1936#define DEFAULT_UNREACHABLE default: __assume(0)
1937#else
1938
1939//
1940// Older compilers do not support __assume(), and there is no other free
1941// method of eliminating the warning.
1942//
1943
1944#define DEFAULT_UNREACHABLE
1945
1946#endif
1947
1948#ifdef __cplusplus
1949
1950// Define operator overloads to enable bit operations on enum values that are
1951// used to define flags. Use DEFINE_ENUM_FLAG_OPERATORS(YOUR_TYPE) to enable these
1952// operators on YOUR_TYPE.
1953
1954// Moved here from objbase.w.
1955
1956#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \
1957extern "C++" { \
1958inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) | ((int)b)); } \
1959inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) |= ((int)b)); } \
1960inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) & ((int)b)); } \
1961inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) &= ((int)b)); } \
1962inline ENUMTYPE operator ~ (ENUMTYPE a) { return ENUMTYPE(~((int)a)); } \
1963inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) ^ ((int)b)); } \
1964inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) ^= ((int)b)); } \
1965}
1966#else
1967#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) // NOP, C allows these operators.
1968#endif
1969
1970// Compile-time macros for initializing flag values in const data.
1971//
1972// When using DEFINE_ENUM_FLAG_OPERATORS for enum values you should use the macros below
1973// when you need to initialize global const data. Without these macros the inline operators
1974// from DEFINE_ENUM_FLAG_OPERATORS force a runtime initialization rather than a
1975// compile time initialization. This applies even if you have declared the data as const.
1976#define COMPILETIME_OR_2FLAGS(a,b) ((UINT)(a)|(UINT)(b))
1977#define COMPILETIME_OR_3FLAGS(a,b,c) ((UINT)(a)|(UINT)(b)|(UINT)(c))
1978#define COMPILETIME_OR_4FLAGS(a,b,c,d) ((UINT)(a)|(UINT)(b)|(UINT)(c)|(UINT)(d))
1979#define COMPILETIME_OR_5FLAGS(a,b,c,d,e) ((UINT)(a)|(UINT)(b)|(UINT)(c)|(UINT)(d)|(UINT)(e))
1980
1981#ifndef WIN32_NO_STATUS
1982/*lint -save -e767 */
1983#define STATUS_WAIT_0 ((DWORD )0x00000000L)
1984#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L)
1985#define STATUS_USER_APC ((DWORD )0x000000C0L)
1986#define STATUS_TIMEOUT ((DWORD )0x00000102L)
1987#define STATUS_PENDING ((DWORD )0x00000103L)
1988#define DBG_EXCEPTION_HANDLED ((DWORD )0x00010001L)
1989#define DBG_CONTINUE ((DWORD )0x00010002L)
1990#define STATUS_SEGMENT_NOTIFICATION ((DWORD )0x40000005L)
1991#define DBG_TERMINATE_THREAD ((DWORD )0x40010003L)
1992#define DBG_TERMINATE_PROCESS ((DWORD )0x40010004L)
1993#define DBG_CONTROL_C ((DWORD )0x40010005L)
1994#define DBG_PRINTEXCEPTION_C ((DWORD )0x40010006L)
1995#define DBG_RIPEXCEPTION ((DWORD )0x40010007L)
1996#define DBG_CONTROL_BREAK ((DWORD )0x40010008L)
1997#define DBG_COMMAND_EXCEPTION ((DWORD )0x40010009L)
1998#define STATUS_GUARD_PAGE_VIOLATION ((DWORD )0x80000001L)
1999#define STATUS_DATATYPE_MISALIGNMENT ((DWORD )0x80000002L)
2000#define STATUS_BREAKPOINT ((DWORD )0x80000003L)
2001#define STATUS_SINGLE_STEP ((DWORD )0x80000004L)
2002#define STATUS_LONGJUMP ((DWORD )0x80000026L)
2003#define STATUS_UNWIND_CONSOLIDATE ((DWORD )0x80000029L)
2004#define DBG_EXCEPTION_NOT_HANDLED ((DWORD )0x80010001L)
2005#define STATUS_ACCESS_VIOLATION ((DWORD )0xC0000005L)
2006#define STATUS_IN_PAGE_ERROR ((DWORD )0xC0000006L)
2007#define STATUS_INVALID_HANDLE ((DWORD )0xC0000008L)
2008#define STATUS_INVALID_PARAMETER ((DWORD )0xC000000DL)
2009#define STATUS_NO_MEMORY ((DWORD )0xC0000017L)
2010#define STATUS_ILLEGAL_INSTRUCTION ((DWORD )0xC000001DL)
2011#define STATUS_NONCONTINUABLE_EXCEPTION ((DWORD )0xC0000025L)
2012#define STATUS_INVALID_DISPOSITION ((DWORD )0xC0000026L)
2013#define STATUS_ARRAY_BOUNDS_EXCEEDED ((DWORD )0xC000008CL)
2014#define STATUS_FLOAT_DENORMAL_OPERAND ((DWORD )0xC000008DL)
2015#define STATUS_FLOAT_DIVIDE_BY_ZERO ((DWORD )0xC000008EL)
2016#define STATUS_FLOAT_INEXACT_RESULT ((DWORD )0xC000008FL)
2017#define STATUS_FLOAT_INVALID_OPERATION ((DWORD )0xC0000090L)
2018#define STATUS_FLOAT_OVERFLOW ((DWORD )0xC0000091L)
2019#define STATUS_FLOAT_STACK_CHECK ((DWORD )0xC0000092L)
2020#define STATUS_FLOAT_UNDERFLOW ((DWORD )0xC0000093L)
2021#define STATUS_INTEGER_DIVIDE_BY_ZERO ((DWORD )0xC0000094L)
2022#define STATUS_INTEGER_OVERFLOW ((DWORD )0xC0000095L)
2023#define STATUS_PRIVILEGED_INSTRUCTION ((DWORD )0xC0000096L)
2024#define STATUS_STACK_OVERFLOW ((DWORD )0xC00000FDL)
2025#define STATUS_DLL_NOT_FOUND ((DWORD )0xC0000135L)
2026#define STATUS_ORDINAL_NOT_FOUND ((DWORD )0xC0000138L)
2027#define STATUS_ENTRYPOINT_NOT_FOUND ((DWORD )0xC0000139L)
2028#define STATUS_CONTROL_C_EXIT ((DWORD )0xC000013AL)
2029#define STATUS_DLL_INIT_FAILED ((DWORD )0xC0000142L)
2030#define STATUS_FLOAT_MULTIPLE_FAULTS ((DWORD )0xC00002B4L)
2031#define STATUS_FLOAT_MULTIPLE_TRAPS ((DWORD )0xC00002B5L)
2032#define STATUS_REG_NAT_CONSUMPTION ((DWORD )0xC00002C9L)
2033#define STATUS_STACK_BUFFER_OVERRUN ((DWORD )0xC0000409L)
2034#define STATUS_INVALID_CRUNTIME_PARAMETER ((DWORD )0xC0000417L)
2035#define STATUS_ASSERTION_FAILURE ((DWORD )0xC0000420L)
2036#if defined(STATUS_SUCCESS) || (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100)
2037#define STATUS_SXS_EARLY_DEACTIVATION ((DWORD )0xC015000FL)
2038#define STATUS_SXS_INVALID_DEACTIVATION ((DWORD )0xC0150010L)
2039#endif
2040/*lint -restore */
2041#endif
2042#define MAXIMUM_WAIT_OBJECTS 64 // Maximum number of wait objects
2043
2044#define MAXIMUM_SUSPEND_COUNT MAXCHAR // Maximum times thread can be suspended
2045
2046typedef ULONG_PTR KSPIN_LOCK;
2047typedef KSPIN_LOCK *PKSPIN_LOCK;
2048
2049
2050//
2051// Define 128-bit 16-byte aligned xmm register type.
2052//
2053
2054typedef struct DECLSPEC_ALIGN(16) _M128A {
2055 ULONGLONG Low;
2056 LONGLONG High;
2057} M128A, *PM128A;
2058
2059//
2060// Format of data for (F)XSAVE/(F)XRSTOR instruction
2061//
2062
2063typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
2064 WORD ControlWord;
2065 WORD StatusWord;
2066 BYTE TagWord;
2067 BYTE Reserved1;
2068 WORD ErrorOpcode;
2069 DWORD ErrorOffset;
2070 WORD ErrorSelector;
2071 WORD Reserved2;
2072 DWORD DataOffset;
2073 WORD DataSelector;
2074 WORD Reserved3;
2075 DWORD MxCsr;
2076 DWORD MxCsr_Mask;
2077 M128A FloatRegisters[8];
2078
2079#if defined(_WIN64)
2080
2081 M128A XmmRegisters[16];
2082 BYTE Reserved4[96];
2083
2084#else
2085
2086 M128A XmmRegisters[8];
2087 BYTE Reserved4[192];
2088
2089 //
2090 // The fields below are not part of XSAVE/XRSTOR format.
2091 // They are written by the OS which is relying on a fact that
2092 // neither (FX)SAVE nor (F)XSTOR used this area.
2093 //
2094
2095 DWORD StackControl[7]; // KERNEL_STACK_CONTROL structure actualy
2096 DWORD Cr0NpxState;
2097
2098#endif
2099
2100} XSAVE_FORMAT, *PXSAVE_FORMAT;
2101
2102typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER {
2103 DWORD64 Mask;
2104 DWORD64 Reserved[7];
2105} XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER;
2106
2107typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA {
2108 XSAVE_FORMAT LegacyState;
2109 XSAVE_AREA_HEADER Header;
2110} XSAVE_AREA, *PXSAVE_AREA;
2111
2112typedef struct _XSTATE_CONTEXT {
2113 DWORD64 Mask;
2114 DWORD Length;
2115 DWORD Reserved1;
2116 __field_bcount_opt(Length) PXSAVE_AREA Area;
2117
2118#if defined(_X86_)
2119 DWORD Reserved2;
2120#endif
2121
2122 PVOID Buffer;
2123
2124#if defined(_X86_)
2125 DWORD Reserved3;
2126#endif
2127
2128} XSTATE_CONTEXT, *PXSTATE_CONTEXT;
2129
2130
2131#define XSAVE_ALIGN 64
2132#define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
2133
2134
2135//
2136// This structure specifies an offset (from the beginning of CONTEXT_EX
2137// structure) and size of a single chunk of an extended context structure.
2138//
2139// N.B. Offset may be negative.
2140//
2141
2142typedef struct _CONTEXT_CHUNK {
2143 LONG Offset;
2144 DWORD Length;
2145} CONTEXT_CHUNK, *PCONTEXT_CHUNK;
2146
2147//
2148// CONTEXT_EX structure is an extension to CONTEXT structure. It defines
2149// a context record as a set of disjoint variable-sized buffers (chunks)
2150// each containing a portion of processor state. Currently there are only
2151// two buffers (chunks) are defined:
2152//
2153// - Legacy, that stores traditional CONTEXT structure;
2154// - XState, that stores XSAVE save area buffer starting from
2155// XSAVE_AREA_HEADER, i.e. without the first 512 bytes.
2156//
2157// There a few assumptions exists that simplify conversion of PCONTEXT
2158// pointer to PCONTEXT_EX pointer.
2159//
2160// 1. APIs that work with PCONTEXT pointers assume that CONTEXT_EX is
2161// stored right after the CONTEXT structure. It is also assumed that
2162// CONTEXT_EX is present if and only if corresponding CONTEXT_XXX
2163// flags are set in CONTEXT.ContextFlags.
2164//
2165// 2. CONTEXT_EX.Legacy is always present if CONTEXT_EX structure is
2166// present. All other chunks are optional.
2167//
2168// 3. CONTEXT.ContextFlags unambigiously define which chunks are
2169// present. I.e. if CONTEXT_XSTATE is set CONTEXT_EX.XState is valid.
2170//
2171
2172typedef struct _CONTEXT_EX {
2173
2174 //
2175 // The total length of the structure starting from the chunk with
2176 // the smallest offset. N.B. that the offset may be negative.
2177 //
2178
2179 CONTEXT_CHUNK All;
2180
2181 //
2182 // Wrapper for the traditional CONTEXT structure. N.B. the size of
2183 // the chunk may be less than sizeof(CONTEXT) is some cases (when
2184 // CONTEXT_EXTENDED_REGISTERS is not set on x86 for instance).
2185 //
2186
2187 CONTEXT_CHUNK Legacy;
2188
2189 //
2190 // CONTEXT_XSTATE: Extended processor state chunk. The state is
2191 // stored in the same format XSAVE operation strores it with
2192 // exception of the first 512 bytes, i.e. staring from
2193 // XSAVE_AREA_HEADER. The lower two bits corresponding FP and
2194 // SSE state must be zero.
2195 //
2196
2197 CONTEXT_CHUNK XState;
2198
2199} CONTEXT_EX, *PCONTEXT_EX;
2200
2201#define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
2202
2203//
2204// These macros make context chunks manupulations easier.
2205//
2206
2207#define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) \
2208 ((ContextEx)->Chunk.Offset)
2209
2210#define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) \
2211 ((ContextEx)->Chunk.Length)
2212
2213#define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
2214 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
2215
2216#define RTL_CONTEXT_OFFSET(Context, Chunk) \
2217 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
2218
2219#define RTL_CONTEXT_LENGTH(Context, Chunk) \
2220 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
2221
2222#define RTL_CONTEXT_CHUNK(Context, Chunk) \
2223 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
2224 (PCONTEXT_EX)(Context + 1), \
2225 Chunk)
2226
2227
2228#if !defined(__midl) && !defined(MIDL_PASS)
2229
2230//
2231// XSAVE/XRSTOR save area should be aligned on 64 byte boundary
2232//
2233
2234C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0);
2235C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0);
2236
2237// XSAVE_AREA structure must be sized uniformly on all architectures
2238C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64);
2239
2240#endif
2241
2242
2243#ifdef _AMD64_
2244
2245
2246#if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
2247
2248//
2249// Define bit test intrinsics.
2250//
2251
2252#ifdef __cplusplus
2253extern "C" {
2254#endif
2255
2256#define BitTest _bittest
2257#define BitTestAndComplement _bittestandcomplement
2258#define BitTestAndSet _bittestandset
2259#define BitTestAndReset _bittestandreset
2260#define InterlockedBitTestAndSet _interlockedbittestandset
2261#define InterlockedBitTestAndReset _interlockedbittestandreset
2262
2263#define BitTest64 _bittest64
2264#define BitTestAndComplement64 _bittestandcomplement64
2265#define BitTestAndSet64 _bittestandset64
2266#define BitTestAndReset64 _bittestandreset64
2267#define InterlockedBitTestAndSet64 _interlockedbittestandset64
2268#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
2269
2270__checkReturn
2271BOOLEAN
2272_bittest (
2273 __in_bcount((Offset+7)/8) LONG const *Base,
2274 __in LONG Offset
2275 );
2276
2277BOOLEAN
2278_bittestandcomplement (
2279 __inout_bcount((Offset+7)/8) LONG *Base,
2280 __in LONG Offset
2281 );
2282
2283BOOLEAN
2284_bittestandset (
2285 __inout_bcount((Offset+7)/8) LONG *Base,
2286 __in LONG Offset
2287 );
2288
2289BOOLEAN
2290_bittestandreset (
2291 __inout_bcount((Offset+7)/8) LONG *Base,
2292 __in LONG Offset
2293 );
2294
2295BOOLEAN
2296_interlockedbittestandset (
2297 __inout_bcount((Offset+7)/8) __drv_interlocked LONG volatile *Base,
2298 __in LONG Offset
2299 );
2300
2301BOOLEAN
2302_interlockedbittestandreset (
2303 __inout_bcount((Offset+7)/8) __drv_interlocked LONG volatile *Base,
2304 __in LONG Offset
2305 );
2306
2307BOOLEAN
2308_bittest64 (
2309 __in_bcount((Offset+7)/8) LONG64 const *Base,
2310 __in LONG64 Offset
2311 );
2312
2313BOOLEAN
2314_bittestandcomplement64 (
2315 __inout_bcount((Offset+7)/8) LONG64 *Base,
2316 __in LONG64 Offset
2317 );
2318
2319BOOLEAN
2320_bittestandset64 (
2321 __inout_bcount((Offset+7)/8) LONG64 *Base,
2322 __in LONG64 Offset
2323 );
2324
2325BOOLEAN
2326_bittestandreset64 (
2327 __inout_bcount((Offset+7)/8) LONG64 *Base,
2328 __in LONG64 Offset
2329 );
2330
2331BOOLEAN
2332_interlockedbittestandset64 (
2333 __inout_bcount((Offset+7)/8) __drv_interlocked LONG64 volatile *Base,
2334 __in LONG64 Offset
2335 );
2336
2337BOOLEAN
2338_interlockedbittestandreset64 (
2339 __inout_bcount((Offset+7)/8) __drv_interlocked LONG64 volatile *Base,
2340 __in LONG64 Offset
2341 );
2342
2343#pragma intrinsic(_bittest)
2344#pragma intrinsic(_bittestandcomplement)
2345#pragma intrinsic(_bittestandset)
2346#pragma intrinsic(_bittestandreset)
2347#pragma intrinsic(_interlockedbittestandset)
2348#pragma intrinsic(_interlockedbittestandreset)
2349
2350#pragma intrinsic(_bittest64)
2351#pragma intrinsic(_bittestandcomplement64)
2352#pragma intrinsic(_bittestandset64)
2353#pragma intrinsic(_bittestandreset64)
2354#pragma intrinsic(_interlockedbittestandset64)
2355#pragma intrinsic(_interlockedbittestandreset64)
2356
2357//
2358// Define bit scan intrinsics.
2359//
2360
2361#define BitScanForward _BitScanForward
2362#define BitScanReverse _BitScanReverse
2363#define BitScanForward64 _BitScanForward64
2364#define BitScanReverse64 _BitScanReverse64
2365
2366__success(return!=0)
2367BOOLEAN
2368_BitScanForward (
2369 __out DWORD *Index,
2370 __in DWORD Mask
2371 );
2372
2373__success(return!=0)
2374BOOLEAN
2375_BitScanReverse (
2376 __out DWORD *Index,
2377 __in DWORD Mask
2378 );
2379
2380__success(return!=0)
2381BOOLEAN
2382_BitScanForward64 (
2383 __out DWORD *Index,
2384 __in DWORD64 Mask
2385 );
2386
2387__success(return!=0)
2388BOOLEAN
2389_BitScanReverse64 (
2390 __out DWORD *Index,
2391 __in DWORD64 Mask
2392 );
2393
2394#pragma intrinsic(_BitScanForward)
2395#pragma intrinsic(_BitScanReverse)
2396#pragma intrinsic(_BitScanForward64)
2397#pragma intrinsic(_BitScanReverse64)
2398
2399//
2400// Interlocked intrinsic functions.
2401//
2402
2403#define InterlockedIncrement16 _InterlockedIncrement16
2404#define InterlockedDecrement16 _InterlockedDecrement16
2405#define InterlockedCompareExchange16 _InterlockedCompareExchange16
2406
2407#define InterlockedAnd _InterlockedAnd
2408#define InterlockedAndAcquire _InterlockedAnd
2409#define InterlockedAndRelease _InterlockedAnd
2410#define InterlockedOr _InterlockedOr
2411#define InterlockedOrAcquire _InterlockedOr
2412#define InterlockedOrRelease _InterlockedOr
2413#define InterlockedXor _InterlockedXor
2414#define InterlockedIncrement _InterlockedIncrement
2415#define InterlockedIncrementAcquire InterlockedIncrement
2416#define InterlockedIncrementRelease InterlockedIncrement
2417#define InterlockedDecrement _InterlockedDecrement
2418#define InterlockedDecrementAcquire InterlockedDecrement
2419#define InterlockedDecrementRelease InterlockedDecrement
2420#define InterlockedAdd _InterlockedAdd
2421#define InterlockedExchange _InterlockedExchange
2422#define InterlockedExchangeAdd _InterlockedExchangeAdd
2423#define InterlockedCompareExchange _InterlockedCompareExchange
2424#define InterlockedCompareExchangeAcquire InterlockedCompareExchange
2425#define InterlockedCompareExchangeRelease InterlockedCompareExchange
2426
2427#define InterlockedAnd64 _InterlockedAnd64
2428#define InterlockedAnd64Acquire _InterlockedAnd64
2429#define InterlockedAnd64Release _InterlockedAnd64
2430#define InterlockedAndAffinity InterlockedAnd64
2431#define InterlockedOr64 _InterlockedOr64
2432#define InterlockedOr64Acquire _InterlockedOr64
2433#define InterlockedOr64Release _InterlockedOr64
2434#define InterlockedOrAffinity InterlockedOr64
2435#define InterlockedXor64 _InterlockedXor64
2436#define InterlockedIncrement64 _InterlockedIncrement64
2437#define InterlockedDecrement64 _InterlockedDecrement64
2438#define InterlockedAdd64 _InterlockedAdd64
2439#define InterlockedExchange64 _InterlockedExchange64
2440#define InterlockedExchangeAcquire64 InterlockedExchange64
2441#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
2442#define InterlockedCompareExchange64 _InterlockedCompareExchange64
2443#define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64
2444#define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64
2445
2446#define InterlockedExchangePointer _InterlockedExchangePointer
2447#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
2448#define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer
2449#define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer
2450
2451#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
2452#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)
2453#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)
2454
2455SHORT
2456InterlockedIncrement16 (
2457 __inout __drv_interlocked SHORT volatile *Addend
2458 );
2459
2460SHORT
2461InterlockedDecrement16 (
2462 __inout __drv_interlocked SHORT volatile *Addend
2463 );
2464
2465SHORT
2466InterlockedCompareExchange16 (
2467 __inout __drv_interlocked SHORT volatile *Destination,
2468 __in SHORT ExChange,
2469 __in SHORT Comperand
2470 );
2471
2472LONG
2473InterlockedAnd (
2474 __inout __drv_interlocked LONG volatile *Destination,
2475 __in LONG Value
2476 );
2477
2478LONG
2479InterlockedOr (
2480 __inout __drv_interlocked LONG volatile *Destination,
2481 __in LONG Value
2482 );
2483
2484LONG
2485InterlockedXor (
2486 __inout __drv_interlocked LONG volatile *Destination,
2487 __in LONG Value
2488 );
2489
2490LONG64
2491InterlockedAnd64 (
2492 __inout __drv_interlocked LONG64 volatile *Destination,
2493 __in LONG64 Value
2494 );
2495
2496LONG64
2497InterlockedOr64 (
2498 __inout __drv_interlocked LONG64 volatile *Destination,
2499 __in LONG64 Value
2500 );
2501
2502LONG64
2503InterlockedXor64 (
2504 __inout __drv_interlocked LONG64 volatile *Destination,
2505 __in LONG64 Value
2506 );
2507
2508LONG
2509InterlockedIncrement(
2510 __inout __drv_interlocked LONG volatile *Addend
2511 );
2512
2513LONG
2514InterlockedDecrement(
2515 __inout __drv_interlocked LONG volatile *Addend
2516 );
2517
2518LONG
2519InterlockedExchange(
2520 __inout __drv_interlocked LONG volatile *Target,
2521 __in LONG Value
2522 );
2523
2524LONG
2525InterlockedExchangeAdd(
2526 __inout __drv_interlocked LONG volatile *Addend,
2527 __in LONG Value
2528 );
2529
2530#if !defined(_X86AMD64_)
2531
2532__forceinline
2533LONG
2534InterlockedAdd(
2535 __inout __drv_interlocked LONG volatile *Addend,
2536 __in LONG Value
2537 )
2538
2539{
2540 return InterlockedExchangeAdd(Addend, Value) + Value;
2541}
2542
2543#endif
2544
2545LONG
2546InterlockedCompareExchange (
2547 __inout __drv_interlocked LONG volatile *Destination,
2548 __in LONG ExChange,
2549 __in LONG Comperand
2550 );
2551
2552LONG64
2553InterlockedIncrement64(
2554 __inout __drv_interlocked LONG64 volatile *Addend
2555 );
2556
2557LONG64
2558InterlockedDecrement64(
2559 __inout __drv_interlocked LONG64 volatile *Addend
2560 );
2561
2562LONG64
2563InterlockedExchange64(
2564 __inout __drv_interlocked LONG64 volatile *Target,
2565 __in LONG64 Value
2566 );
2567
2568LONG64
2569InterlockedExchangeAdd64(
2570 __inout __drv_interlocked LONG64 volatile *Addend,
2571 __in LONG64 Value
2572 );
2573
2574#if !defined(_X86AMD64_)
2575
2576__forceinline
2577LONG64
2578InterlockedAdd64(
2579 __inout __drv_interlocked LONG64 volatile *Addend,
2580 __in LONG64 Value
2581 )
2582
2583{
2584 return InterlockedExchangeAdd64(Addend, Value) + Value;
2585}
2586
2587#endif
2588
2589LONG64
2590InterlockedCompareExchange64 (
2591 __inout __drv_interlocked LONG64 volatile *Destination,
2592 __in LONG64 ExChange,
2593 __in LONG64 Comperand
2594 );
2595
2596PVOID
2597InterlockedCompareExchangePointer (
2598 __inout __drv_interlocked PVOID volatile *Destination,
2599 __in_opt PVOID Exchange,
2600 __in_opt PVOID Comperand
2601 );
2602
2603PVOID
2604InterlockedExchangePointer(
2605 __inout __drv_interlocked PVOID volatile *Target,
2606 __in_opt PVOID Value
2607 );
2608
2609#pragma intrinsic(_InterlockedIncrement16)
2610#pragma intrinsic(_InterlockedDecrement16)
2611#pragma intrinsic(_InterlockedCompareExchange16)
2612#pragma intrinsic(_InterlockedAnd)
2613#pragma intrinsic(_InterlockedOr)
2614#pragma intrinsic(_InterlockedXor)
2615#pragma intrinsic(_InterlockedIncrement)
2616#pragma intrinsic(_InterlockedDecrement)
2617#pragma intrinsic(_InterlockedExchange)
2618#pragma intrinsic(_InterlockedExchangeAdd)
2619#pragma intrinsic(_InterlockedCompareExchange)
2620#pragma intrinsic(_InterlockedAnd64)
2621#pragma intrinsic(_InterlockedOr64)
2622#pragma intrinsic(_InterlockedXor64)
2623#pragma intrinsic(_InterlockedIncrement64)
2624#pragma intrinsic(_InterlockedDecrement64)
2625#pragma intrinsic(_InterlockedExchange64)
2626#pragma intrinsic(_InterlockedExchangeAdd64)
2627#pragma intrinsic(_InterlockedCompareExchange64)
2628#pragma intrinsic(_InterlockedExchangePointer)
2629#pragma intrinsic(_InterlockedCompareExchangePointer)
2630
2631#if _MSC_FULL_VER >= 140041204
2632
2633#define InterlockedAnd8 _InterlockedAnd8
2634#define InterlockedOr8 _InterlockedOr8
2635#define InterlockedXor8 _InterlockedXor8
2636#define InterlockedAnd16 _InterlockedAnd16
2637#define InterlockedOr16 _InterlockedOr16
2638#define InterlockedXor16 _InterlockedXor16
2639
2640char
2641InterlockedAnd8 (
2642 __inout __drv_interlocked char volatile *Destination,
2643 __in char Value
2644 );
2645
2646char
2647InterlockedOr8 (
2648 __inout __drv_interlocked char volatile *Destination,
2649 __in char Value
2650 );
2651
2652char
2653InterlockedXor8 (
2654 __inout __drv_interlocked char volatile *Destination,
2655 __in char Value
2656 );
2657
2658SHORT
2659InterlockedAnd16(
2660 __inout __drv_interlocked SHORT volatile *Destination,
2661 __in SHORT Value
2662 );
2663
2664SHORT
2665InterlockedOr16(
2666 __inout __drv_interlocked SHORT volatile *Destination,
2667 __in SHORT Value
2668 );
2669
2670SHORT
2671InterlockedXor16(
2672 __inout __drv_interlocked SHORT volatile *Destination,
2673 __in SHORT Value
2674 );
2675
2676#pragma intrinsic (_InterlockedAnd8)
2677#pragma intrinsic (_InterlockedOr8)
2678#pragma intrinsic (_InterlockedXor8)
2679#pragma intrinsic (_InterlockedAnd16)
2680#pragma intrinsic (_InterlockedOr16)
2681#pragma intrinsic (_InterlockedXor16)
2682
2683#endif
2684
2685//
2686// Define function to flush a cache line.
2687//
2688
2689#define CacheLineFlush(Address) _mm_clflush(Address)
2690
2691VOID
2692_mm_clflush (
2693 __in VOID const *Address
2694 );
2695
2696#pragma intrinsic(_mm_clflush)
2697
2698VOID
2699_ReadWriteBarrier (
2700 VOID
2701 );
2702
2703#pragma intrinsic(_ReadWriteBarrier)
2704
2705//
2706// Define memory fence intrinsics
2707//
2708
2709#define FastFence __faststorefence
2710#define LoadFence _mm_lfence
2711#define MemoryFence _mm_mfence
2712#define StoreFence _mm_sfence
2713
2714VOID
2715__faststorefence (
2716 VOID
2717 );
2718
2719VOID
2720_mm_lfence (
2721 VOID
2722 );
2723
2724VOID
2725_mm_mfence (
2726 VOID
2727 );
2728
2729VOID
2730_mm_sfence (
2731 VOID
2732 );
2733
2734VOID
2735_mm_pause (
2736 VOID
2737 );
2738
2739VOID
2740_mm_prefetch (
2741 __in CHAR CONST *a,
2742 __in int sel
2743 );
2744
2745VOID
2746_m_prefetchw (
2747 __in volatile CONST VOID *Source
2748 );
2749
2750//
2751// Define constants for use with _mm_prefetch.
2752//
2753
2754#define _MM_HINT_T0 1
2755#define _MM_HINT_T1 2
2756#define _MM_HINT_T2 3
2757#define _MM_HINT_NTA 0
2758
2759#pragma intrinsic(__faststorefence)
2760#pragma intrinsic(_mm_pause)
2761#pragma intrinsic(_mm_prefetch)
2762#pragma intrinsic(_mm_lfence)
2763#pragma intrinsic(_mm_mfence)
2764#pragma intrinsic(_mm_sfence)
2765#pragma intrinsic(_m_prefetchw)
2766
2767#define YieldProcessor _mm_pause
2768#define MemoryBarrier __faststorefence
2769#define PreFetchCacheLine(l, a) _mm_prefetch((CHAR CONST *) a, l)
2770#define PrefetchForWrite(p) _m_prefetchw(p)
2771#define ReadForWriteAccess(p) (_m_prefetchw(p), *(p))
2772
2773//
2774// PreFetchCacheLine level defines.
2775//
2776
2777#define PF_TEMPORAL_LEVEL_1 _MM_HINT_T0
2778#define PF_TEMPORAL_LEVEL_2 _MM_HINT_T1
2779#define PF_TEMPORAL_LEVEL_3 _MM_HINT_T2
2780#define PF_NON_TEMPORAL_LEVEL_ALL _MM_HINT_NTA
2781
2782//
2783// Define get/set MXCSR intrinsics.
2784//
2785
2786#define ReadMxCsr _mm_getcsr
2787#define WriteMxCsr _mm_setcsr
2788
2789unsigned int
2790_mm_getcsr (
2791 VOID
2792 );
2793
2794VOID
2795_mm_setcsr (
2796 __in unsigned int MxCsr
2797 );
2798
2799#pragma intrinsic(_mm_getcsr)
2800#pragma intrinsic(_mm_setcsr)
2801
2802//
2803// Assert exception.
2804//
2805
2806VOID
2807__int2c (
2808 VOID
2809 );
2810
2811#pragma intrinsic(__int2c)
2812
2813__analysis_noreturn
2814FORCEINLINE
2815VOID
2816DbgRaiseAssertionFailure (
2817 VOID
2818 )
2819
2820{
2821 __int2c();
2822}
2823
2824//
2825// Define function to get the caller's EFLAGs value.
2826//
2827
2828#define GetCallersEflags() __getcallerseflags()
2829
2830unsigned __int32
2831__getcallerseflags (
2832 VOID
2833 );
2834
2835#pragma intrinsic(__getcallerseflags)
2836
2837//
2838// Define function to get segment limit.
2839//
2840
2841#define GetSegmentLimit __segmentlimit
2842
2843DWORD
2844__segmentlimit (
2845 __in DWORD Selector
2846 );
2847
2848#pragma intrinsic(__segmentlimit)
2849
2850//
2851// Define function to read the value of a performance counter.
2852//
2853
2854#define ReadPMC __readpmc
2855
2856DWORD64
2857__readpmc (
2858 __in DWORD Counter
2859 );
2860
2861#pragma intrinsic(__readpmc)
2862
2863//
2864// Define function to read the value of the time stamp counter
2865//
2866
2867#define ReadTimeStampCounter() __rdtsc()
2868
2869DWORD64
2870__rdtsc (
2871 VOID
2872 );
2873
2874#pragma intrinsic(__rdtsc)
2875
2876//
2877// Define functions to move strings as bytes, words, dwords, and qwords.
2878//
2879
2880VOID
2881__movsb (
2882 __out_ecount_full(Count) PBYTE Destination,
2883 __in_ecount(Count) BYTE const *Source,
2884 __in SIZE_T Count
2885 );
2886
2887VOID
2888__movsw (
2889 __out_ecount_full(Count) PWORD Destination,
2890 __in_ecount(Count) WORD const *Source,
2891 __in SIZE_T Count
2892 );
2893
2894VOID
2895__movsd (
2896 __out_ecount_full(Count) PDWORD Destination,
2897 __in_ecount(Count) DWORD const *Source,
2898 __in SIZE_T Count
2899 );
2900
2901VOID
2902__movsq (
2903 __out_ecount_full(Count) PDWORD64 Destination,
2904 __in_ecount(Count) DWORD64 const *Source,
2905 __in SIZE_T Count
2906 );
2907
2908#pragma intrinsic(__movsb)
2909#pragma intrinsic(__movsw)
2910#pragma intrinsic(__movsd)
2911#pragma intrinsic(__movsq)
2912
2913//
2914// Define functions to store strings as bytes, words, dwords, and qwords.
2915//
2916
2917VOID
2918__stosb (
2919 __out_ecount_full(Count) PBYTE Destination,
2920 __in BYTE Value,
2921 __in SIZE_T Count
2922 );
2923
2924VOID
2925__stosw (
2926 __out_ecount_full(Count) PWORD Destination,
2927 __in WORD Value,
2928 __in SIZE_T Count
2929 );
2930
2931VOID
2932__stosd (
2933 __out_ecount_full(Count) PDWORD Destination,
2934 __in DWORD Value,
2935 __in SIZE_T Count
2936 );
2937
2938VOID
2939__stosq (
2940 __out_ecount_full(Count) PDWORD64 Destination,
2941 __in DWORD64 Value,
2942 __in SIZE_T Count
2943 );
2944
2945#pragma intrinsic(__stosb)
2946#pragma intrinsic(__stosw)
2947#pragma intrinsic(__stosd)
2948#pragma intrinsic(__stosq)
2949
2950//
2951// Define functions to capture the high 64-bits of a 128-bit multiply.
2952//
2953
2954#define MultiplyHigh __mulh
2955#define UnsignedMultiplyHigh __umulh
2956
2957LONGLONG
2958MultiplyHigh (
2959 __in LONG64 Multiplier,
2960 __in LONG64 Multiplicand
2961 );
2962
2963ULONGLONG
2964UnsignedMultiplyHigh (
2965 __in DWORD64 Multiplier,
2966 __in DWORD64 Multiplicand
2967 );
2968
2969#pragma intrinsic(__mulh)
2970#pragma intrinsic(__umulh)
2971
2972//
2973// Define functions to perform 128-bit shifts
2974//
2975
2976#define ShiftLeft128 __shiftleft128
2977#define ShiftRight128 __shiftright128
2978
2979DWORD64
2980ShiftLeft128 (
2981 __in DWORD64 LowPart,
2982 __in DWORD64 HighPart,
2983 __in BYTE Shift
2984 );
2985
2986DWORD64
2987ShiftRight128 (
2988 __in DWORD64 LowPart,
2989 __in DWORD64 HighPart,
2990 __in BYTE Shift
2991 );
2992
2993#pragma intrinsic(__shiftleft128)
2994#pragma intrinsic(__shiftright128)
2995
2996//
2997// Define functions to perform 128-bit multiplies.
2998//
2999
3000#define Multiply128 _mul128
3001
3002LONG64
3003Multiply128 (
3004 __in LONG64 Multiplier,
3005 __in LONG64 Multiplicand,
3006 __out LONG64 *HighProduct
3007 );
3008
3009#pragma intrinsic(_mul128)
3010
3011#ifndef UnsignedMultiply128
3012
3013#define UnsignedMultiply128 _umul128
3014
3015DWORD64
3016UnsignedMultiply128 (
3017 __in DWORD64 Multiplier,
3018 __in DWORD64 Multiplicand,
3019 __out DWORD64 *HighProduct
3020 );
3021
3022#pragma intrinsic(_umul128)
3023
3024#endif
3025
3026__forceinline
3027LONG64
3028MultiplyExtract128 (
3029 __in LONG64 Multiplier,
3030 __in LONG64 Multiplicand,
3031 __in BYTE Shift
3032 )
3033
3034{
3035
3036 LONG64 extractedProduct;
3037 LONG64 highProduct;
3038 LONG64 lowProduct;
3039 BOOLEAN negate;
3040 DWORD64 uhighProduct;
3041 DWORD64 ulowProduct;
3042
3043 lowProduct = Multiply128(Multiplier, Multiplicand, &highProduct);
3044 negate = FALSE;
3045 uhighProduct = (DWORD64)highProduct;
3046 ulowProduct = (DWORD64)lowProduct;
3047 if (highProduct < 0) {
3048 negate = TRUE;
3049 uhighProduct = (DWORD64)(-highProduct);
3050 ulowProduct = (DWORD64)(-lowProduct);
3051 if (ulowProduct != 0) {
3052 uhighProduct -= 1;
3053 }
3054 }
3055
3056 extractedProduct = (LONG64)ShiftRight128(ulowProduct, uhighProduct, Shift);
3057 if (negate != FALSE) {
3058 extractedProduct = -extractedProduct;
3059 }
3060
3061 return extractedProduct;
3062}
3063
3064__forceinline
3065DWORD64
3066UnsignedMultiplyExtract128 (
3067 __in DWORD64 Multiplier,
3068 __in DWORD64 Multiplicand,
3069 __in BYTE Shift
3070 )
3071
3072{
3073
3074 DWORD64 extractedProduct;
3075 DWORD64 highProduct;
3076 DWORD64 lowProduct;
3077
3078 lowProduct = UnsignedMultiply128(Multiplier, Multiplicand, &highProduct);
3079 extractedProduct = ShiftRight128(lowProduct, highProduct, Shift);
3080 return extractedProduct;
3081}
3082
3083//
3084// Define functions to read and write the uer TEB and the system PCR/PRCB.
3085//
3086
3087BYTE
3088__readgsbyte (
3089 __in DWORD Offset
3090 );
3091
3092WORD
3093__readgsword (
3094 __in DWORD Offset
3095 );
3096
3097DWORD
3098__readgsdword (
3099 __in DWORD Offset
3100 );
3101
3102DWORD64
3103__readgsqword (
3104 __in DWORD Offset
3105 );
3106
3107VOID
3108__writegsbyte (
3109 __in DWORD Offset,
3110 __in BYTE Data
3111 );
3112
3113VOID
3114__writegsword (
3115 __in DWORD Offset,
3116 __in WORD Data
3117 );
3118
3119VOID
3120__writegsdword (
3121 __in DWORD Offset,
3122 __in DWORD Data
3123 );
3124
3125VOID
3126__writegsqword (
3127 __in DWORD Offset,
3128 __in DWORD64 Data
3129 );
3130
3131#pragma intrinsic(__readgsbyte)
3132#pragma intrinsic(__readgsword)
3133#pragma intrinsic(__readgsdword)
3134#pragma intrinsic(__readgsqword)
3135#pragma intrinsic(__writegsbyte)
3136#pragma intrinsic(__writegsword)
3137#pragma intrinsic(__writegsdword)
3138#pragma intrinsic(__writegsqword)
3139
3140#if !defined(_MANAGED)
3141
3142VOID
3143__incgsbyte (
3144 __in DWORD Offset
3145 );
3146
3147VOID
3148__addgsbyte (
3149 __in DWORD Offset,
3150 __in BYTE Value
3151 );
3152
3153VOID
3154__incgsword (
3155 __in DWORD Offset
3156 );
3157
3158VOID
3159__addgsword (
3160 __in DWORD Offset,
3161 __in WORD Value
3162 );
3163
3164VOID
3165__incgsdword (
3166 __in DWORD Offset
3167 );
3168
3169VOID
3170__addgsdword (
3171 __in DWORD Offset,
3172 __in DWORD Value
3173 );
3174
3175VOID
3176__incgsqword (
3177 __in DWORD Offset
3178 );
3179
3180VOID
3181__addgsqword (
3182 __in DWORD Offset,
3183 __in DWORD64 Value
3184 );
3185
3186#if 0
3187#pragma intrinsic(__incgsbyte)
3188#pragma intrinsic(__addgsbyte)
3189#pragma intrinsic(__incgsword)
3190#pragma intrinsic(__addgsword)
3191#pragma intrinsic(__incgsdword)
3192#pragma intrinsic(__addgsdword)
3193#pragma intrinsic(__incgsqword)
3194#pragma intrinsic(__addgsqword)
3195#endif
3196
3197#endif
3198
3199#ifdef __cplusplus
3200}
3201#endif
3202
3203#endif // defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
3204
3205//
3206// The following values specify the type of access in the first parameter
3207// of the exception record whan the exception code specifies an access
3208// violation.
3209//
3210
3211#define EXCEPTION_READ_FAULT 0 // exception caused by a read
3212#define EXCEPTION_WRITE_FAULT 1 // exception caused by a write
3213#define EXCEPTION_EXECUTE_FAULT 8 // exception caused by an instruction fetch
3214
3215// begin_wx86
3216//
3217// The following flags control the contents of the CONTEXT structure.
3218//
3219
3220#if !defined(RC_INVOKED)
3221
3222#define CONTEXT_AMD64 0x100000
3223
3224// end_wx86
3225
3226#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
3227#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
3228#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
3229#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
3230#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
3231
3232#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
3233
3234#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
3235
3236#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
3237
3238#define CONTEXT_EXCEPTION_ACTIVE 0x8000000
3239#define CONTEXT_SERVICE_ACTIVE 0x10000000
3240#define CONTEXT_EXCEPTION_REQUEST 0x40000000
3241#define CONTEXT_EXCEPTION_REPORTING 0x80000000
3242
3243// begin_wx86
3244
3245#endif // !defined(RC_INVOKED)
3246
3247//
3248// Define initial MxCsr and FpCsr control.
3249//
3250
3251#define INITIAL_MXCSR 0x1f80 // initial MXCSR value
3252#define INITIAL_FPCSR 0x027f // initial FPCSR value
3253
3254// end_ntddk
3255// begin_wdm begin_ntosp
3256
3257typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
3258
3259// end_wdm end_ntosp
3260// begin_ntddk
3261
3262//
3263// Context Frame
3264//
3265// This frame has a several purposes: 1) it is used as an argument to
3266// NtContinue, 2) it is used to constuct a call frame for APC delivery,
3267// and 3) it is used in the user level thread creation routines.
3268//
3269//
3270// The flags field within this record controls the contents of a CONTEXT
3271// record.
3272//
3273// If the context record is used as an input parameter, then for each
3274// portion of the context record controlled by a flag whose value is
3275// set, it is assumed that that portion of the context record contains
3276// valid context. If the context record is being used to modify a threads
3277// context, then only that portion of the threads context is modified.
3278//
3279// If the context record is used as an output parameter to capture the
3280// context of a thread, then only those portions of the thread's context
3281// corresponding to set flags will be returned.
3282//
3283// CONTEXT_CONTROL specifies SegSs, Rsp, SegCs, Rip, and EFlags.
3284//
3285// CONTEXT_INTEGER specifies Rax, Rcx, Rdx, Rbx, Rbp, Rsi, Rdi, and R8-R15.
3286//
3287// CONTEXT_SEGMENTS specifies SegDs, SegEs, SegFs, and SegGs.
3288//
3289// CONTEXT_FLOATING_POINT specifies Xmm0-Xmm15.
3290//
3291// CONTEXT_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7.
3292//
3293
3294typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
3295
3296 //
3297 // Register parameter home addresses.
3298 //
3299 // N.B. These fields are for convience - they could be used to extend the
3300 // context record in the future.
3301 //
3302
3303 DWORD64 P1Home;
3304 DWORD64 P2Home;
3305 DWORD64 P3Home;
3306 DWORD64 P4Home;
3307 DWORD64 P5Home;
3308 DWORD64 P6Home;
3309
3310 //
3311 // Control flags.
3312 //
3313
3314 DWORD ContextFlags;
3315 DWORD MxCsr;
3316
3317 //
3318 // Segment Registers and processor flags.
3319 //
3320
3321 WORD SegCs;
3322 WORD SegDs;
3323 WORD SegEs;
3324 WORD SegFs;
3325 WORD SegGs;
3326 WORD SegSs;
3327 DWORD EFlags;
3328
3329 //
3330 // Debug registers
3331 //
3332
3333 DWORD64 Dr0;
3334 DWORD64 Dr1;
3335 DWORD64 Dr2;
3336 DWORD64 Dr3;
3337 DWORD64 Dr6;
3338 DWORD64 Dr7;
3339
3340 //
3341 // Integer registers.
3342 //
3343
3344 DWORD64 Rax;
3345 DWORD64 Rcx;
3346 DWORD64 Rdx;
3347 DWORD64 Rbx;
3348 DWORD64 Rsp;
3349 DWORD64 Rbp;
3350 DWORD64 Rsi;
3351 DWORD64 Rdi;
3352 DWORD64 R8;
3353 DWORD64 R9;
3354 DWORD64 R10;
3355 DWORD64 R11;
3356 DWORD64 R12;
3357 DWORD64 R13;
3358 DWORD64 R14;
3359 DWORD64 R15;
3360
3361 //
3362 // Program counter.
3363 //
3364
3365 DWORD64 Rip;
3366
3367 //
3368 // Floating point state.
3369 //
3370
3371 union {
3372 XMM_SAVE_AREA32 FltSave;
3373 struct {
3374 M128A Header[2];
3375 M128A Legacy[8];
3376 M128A Xmm0;
3377 M128A Xmm1;
3378 M128A Xmm2;
3379 M128A Xmm3;
3380 M128A Xmm4;
3381 M128A Xmm5;
3382 M128A Xmm6;
3383 M128A Xmm7;
3384 M128A Xmm8;
3385 M128A Xmm9;
3386 M128A Xmm10;
3387 M128A Xmm11;
3388 M128A Xmm12;
3389 M128A Xmm13;
3390 M128A Xmm14;
3391 M128A Xmm15;
3392 } DUMMYSTRUCTNAME;
3393 } DUMMYUNIONNAME;
3394
3395 //
3396 // Vector registers.
3397 //
3398
3399 M128A VectorRegister[26];
3400 DWORD64 VectorControl;
3401
3402 //
3403 // Special debug control registers.
3404 //
3405
3406 DWORD64 DebugControl;
3407 DWORD64 LastBranchToRip;
3408 DWORD64 LastBranchFromRip;
3409 DWORD64 LastExceptionToRip;
3410 DWORD64 LastExceptionFromRip;
3411} CONTEXT, *PCONTEXT;
3412
3413//
3414// Define function table entry - a function table entry is generated for
3415// each frame function.
3416//
3417
3418#define RUNTIME_FUNCTION_INDIRECT 0x1
3419
3420typedef struct _RUNTIME_FUNCTION {
3421 DWORD BeginAddress;
3422 DWORD EndAddress;
3423 DWORD UnwindData;
3424} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
3425
3426//
3427// Define unwind history table structure.
3428//
3429
3430#define UNWIND_HISTORY_TABLE_SIZE 12
3431
3432typedef struct _UNWIND_HISTORY_TABLE_ENTRY {
3433 DWORD64 ImageBase;
3434 PRUNTIME_FUNCTION FunctionEntry;
3435} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
3436
3437typedef struct _UNWIND_HISTORY_TABLE {
3438 DWORD Count;
3439 BYTE LocalHint;
3440 BYTE GlobalHint;
3441 BYTE Search;
3442 BYTE Once;
3443 DWORD64 LowAddress;
3444 DWORD64 HighAddress;
3445 UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
3446} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
3447
3448//
3449// Define dynamic function table entry.
3450//
3451
3452typedef
3453__drv_functionClass(GET_RUNTIME_FUNCTION_CALLBACK)
3454PRUNTIME_FUNCTION
3455GET_RUNTIME_FUNCTION_CALLBACK (
3456 __in DWORD64 ControlPc,
3457 __in_opt PVOID Context
3458 );
3459typedef GET_RUNTIME_FUNCTION_CALLBACK *PGET_RUNTIME_FUNCTION_CALLBACK;
3460
3461typedef
3462__drv_functionClass(OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK)
3463DWORD
3464OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK (
3465 __in HANDLE Process,
3466 __in PVOID TableAddress,
3467 __out PDWORD Entries,
3468 __out PRUNTIME_FUNCTION* Functions
3469 );
3470typedef OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK *POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK;
3471
3472#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \
3473 "OutOfProcessFunctionTableCallback"
3474
3475//
3476// Define runtime exception handling prototypes.
3477//
3478
3479NTSYSAPI
3480VOID
3481__cdecl
3482RtlRestoreContext (
3483 __in PCONTEXT ContextRecord,
3484 __in_opt struct _EXCEPTION_RECORD *ExceptionRecord
3485 );
3486
3487
3488NTSYSAPI
3489BOOLEAN
3490__cdecl
3491RtlAddFunctionTable (
3492 __in_ecount(EntryCount) PRUNTIME_FUNCTION FunctionTable,
3493 __in DWORD EntryCount,
3494 __in DWORD64 BaseAddress
3495 );
3496
3497NTSYSAPI
3498PRUNTIME_FUNCTION
3499NTAPI
3500RtlLookupFunctionEntry (
3501 __in DWORD64 ControlPc,
3502 __out PDWORD64 ImageBase,
3503 __inout_opt PUNWIND_HISTORY_TABLE HistoryTable
3504 );
3505
3506//
3507// Nonvolatile context pointer record.
3508//
3509
3510typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
3511 union {
3512 PM128A FloatingContext[16];
3513 struct {
3514 PM128A Xmm0;
3515 PM128A Xmm1;
3516 PM128A Xmm2;
3517 PM128A Xmm3;
3518 PM128A Xmm4;
3519 PM128A Xmm5;
3520 PM128A Xmm6;
3521 PM128A Xmm7;
3522 PM128A Xmm8;
3523 PM128A Xmm9;
3524 PM128A Xmm10;
3525 PM128A Xmm11;
3526 PM128A Xmm12;
3527 PM128A Xmm13;
3528 PM128A Xmm14;
3529 PM128A Xmm15;
3530 } DUMMYSTRUCTNAME;
3531 } DUMMYUNIONNAME;
3532
3533 union {
3534 PDWORD64 IntegerContext[16];
3535 struct {
3536 PDWORD64 Rax;
3537 PDWORD64 Rcx;
3538 PDWORD64 Rdx;
3539 PDWORD64 Rbx;
3540 PDWORD64 Rsp;
3541 PDWORD64 Rbp;
3542 PDWORD64 Rsi;
3543 PDWORD64 Rdi;
3544 PDWORD64 R8;
3545 PDWORD64 R9;
3546 PDWORD64 R10;
3547 PDWORD64 R11;
3548 PDWORD64 R12;
3549 PDWORD64 R13;
3550 PDWORD64 R14;
3551 PDWORD64 R15;
3552 } DUMMYSTRUCTNAME;
3553 } DUMMYUNIONNAME2;
3554
3555} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
3556
3557NTSYSAPI
3558PEXCEPTION_ROUTINE
3559NTAPI
3560RtlVirtualUnwind (
3561 __in DWORD HandlerType,
3562 __in DWORD64 ImageBase,
3563 __in DWORD64 ControlPc,
3564 __in PRUNTIME_FUNCTION FunctionEntry,
3565 __inout PCONTEXT ContextRecord,
3566 __out PVOID *HandlerData,
3567 __out PDWORD64 EstablisherFrame,
3568 __inout_opt PKNONVOLATILE_CONTEXT_POINTERS ContextPointers
3569 );
3570
3571NTSYSAPI
3572BOOLEAN
3573__cdecl
3574RtlInstallFunctionTableCallback (
3575 __in DWORD64 TableIdentifier,
3576 __in DWORD64 BaseAddress,
3577 __in DWORD Length,
3578 __in PGET_RUNTIME_FUNCTION_CALLBACK Callback,
3579 __in_opt PVOID Context,
3580 __in_opt PCWSTR OutOfProcessCallbackDll
3581 );
3582
3583NTSYSAPI
3584BOOLEAN
3585__cdecl
3586RtlDeleteFunctionTable (
3587 __in PRUNTIME_FUNCTION FunctionTable
3588 );
3589
3590#endif // _AMD64_
3591
3592
3593#ifdef _X86_
3594
3595//
3596// Disable these two pragmas that evaluate to "sti" "cli" on x86 so that driver
3597// writers to not leave them inadvertantly in their code.
3598//
3599
3600#if !defined(MIDL_PASS)
3601#if !defined(RC_INVOKED)
3602
3603#if _MSC_VER >= 1200
3604#pragma warning(push)
3605#endif
3606#pragma warning(disable:4164) // disable C4164 warning so that apps that
3607 // build with /Od don't get weird errors !
3608#ifdef _M_IX86
3609#pragma function(_enable)
3610#pragma function(_disable)
3611#endif
3612
3613#if _MSC_VER >= 1200
3614#pragma warning(pop)
3615#else
3616#pragma warning(default:4164) // reenable C4164 warning
3617#endif
3618
3619#endif
3620#endif
3621
3622// end_ntddk end_nthal
3623#if defined(_M_IX86) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
3624
3625#ifdef __cplusplus
3626extern "C" {
3627#endif
3628
3629
3630
3631#if (_MSC_FULL_VER >= 14000101)
3632
3633
3634//
3635// Define bit test intrinsics.
3636//
3637
3638#define BitTest _bittest
3639#define BitTestAndComplement _bittestandcomplement
3640#define BitTestAndSet _bittestandset
3641#define BitTestAndReset _bittestandreset
3642#define InterlockedBitTestAndSet _interlockedbittestandset
3643#define InterlockedBitTestAndReset _interlockedbittestandreset
3644
3645__checkReturn
3646BOOLEAN
3647_bittest (
3648 __in_bcount((Offset+7)/8) LONG const *Base,
3649 __in LONG Offset
3650 );
3651
3652BOOLEAN
3653_bittestandcomplement (
3654 __inout_bcount((Offset+7)/8) LONG *Base,
3655 __in LONG Offset
3656 );
3657
3658BOOLEAN
3659_bittestandset (
3660 __inout_bcount((Offset+7)/8) LONG *Base,
3661 __in LONG Offset
3662 );
3663
3664BOOLEAN
3665_bittestandreset (
3666 __inout_bcount((Offset+7)/8) LONG *Base,
3667 __in LONG Offset
3668 );
3669
3670BOOLEAN
3671_interlockedbittestandset (
3672 __inout_bcount((Offset+7)/8) __drv_interlocked LONG volatile *Base,
3673 __in LONG Offset
3674 );
3675
3676BOOLEAN
3677_interlockedbittestandreset (
3678 __inout_bcount((Offset+7)/8) __drv_interlocked LONG volatile *Base,
3679 __in LONG Offset
3680 );
3681
3682#pragma intrinsic(_bittest)
3683#pragma intrinsic(_bittestandcomplement)
3684#pragma intrinsic(_bittestandset)
3685#pragma intrinsic(_bittestandreset)
3686#pragma intrinsic(_interlockedbittestandset)
3687#pragma intrinsic(_interlockedbittestandreset)
3688
3689//
3690// Define bit scan intrinsics.
3691//
3692
3693#define BitScanForward _BitScanForward
3694#define BitScanReverse _BitScanReverse
3695
3696__success(return != 0)
3697BOOLEAN
3698_BitScanForward (
3699 __out DWORD *Index,
3700 __in DWORD Mask
3701 );
3702
3703__success(return != 0)
3704BOOLEAN
3705_BitScanReverse (
3706 __out DWORD *Index,
3707 __in DWORD Mask
3708 );
3709
3710#pragma intrinsic(_BitScanForward)
3711#pragma intrinsic(_BitScanReverse)
3712
3713#else
3714
3715#pragma warning(push)
3716#pragma warning(disable:4035 4793)
3717
3718FORCEINLINE
3719BOOLEAN
3720InterlockedBitTestAndSet (
3721 __inout_bcount((Bit+7)/8) __drv_interlocked LONG volatile *Base,
3722 __in LONG Bit
3723 )
3724{
3725 __asm {
3726 mov eax, Bit
3727 mov ecx, Base
3728 lock bts [ecx], eax
3729 setc al
3730 };
3731}
3732
3733FORCEINLINE
3734BOOLEAN
3735InterlockedBitTestAndReset (
3736 __inout_bcount((Bit+7)/8) __drv_interlocked LONG volatile *Base,
3737 __in LONG Bit
3738 )
3739{
3740 __asm {
3741 mov eax, Bit
3742 mov ecx, Base
3743 lock btr [ecx], eax
3744 setc al
3745 };
3746}
3747#pragma warning(pop)
3748
3749#endif /* _MSC_FULL_VER >= 14000101 */
3750
3751//
3752// [pfx_parse] - guard against PREfix intrinsic error
3753//
3754#if (_MSC_FULL_VER >= 140040816) || (defined(_PREFAST_) && (_MSC_VER >= 1400))
3755
3756#define InterlockedAnd16 _InterlockedAnd16
3757#define InterlockedCompareExchange16 _InterlockedCompareExchange16
3758#define InterlockedOr16 _InterlockedOr16
3759
3760SHORT
3761_InterlockedAnd16 (
3762 __inout __drv_interlocked SHORT volatile *Destination,
3763 __in SHORT Value
3764 );
3765
3766SHORT
3767_InterlockedCompareExchange16 (
3768 __inout __drv_interlocked SHORT volatile *Destination,
3769 __in SHORT ExChange,
3770 __in SHORT Comperand
3771 );
3772
3773SHORT
3774_InterlockedOr16 (
3775 __inout __drv_interlocked SHORT volatile *Destination,
3776 __in SHORT Value
3777 );
3778
3779#pragma intrinsic(_InterlockedAnd16)
3780#pragma intrinsic(_InterlockedCompareExchange16)
3781#pragma intrinsic(_InterlockedOr16)
3782
3783#endif /* _MSC_FULL_VER >= 140040816 */
3784
3785#if !defined(_M_CEE_PURE)
3786#pragma warning(push)
3787#pragma warning(disable:4035 4793)
3788
3789FORCEINLINE
3790BOOLEAN
3791InterlockedBitTestAndComplement (
3792 __inout_bcount((Bit+7)/8) __drv_interlocked LONG volatile *Base,
3793 __in LONG Bit
3794 )
3795{
3796 __asm {
3797 mov eax, Bit
3798 mov ecx, Base
3799 lock btc [ecx], eax
3800 setc al
3801 };
3802}
3803#pragma warning(pop)
3804#endif /* _M_CEE_PURE */
3805
3806//
3807// [pfx_parse]
3808// guard against __readfsbyte parsing error
3809//
3810#if (_MSC_FULL_VER >= 13012035) || defined(_PREFIX_) || defined(_PREFAST_)
3811
3812//
3813// Define FS referencing intrinsics
3814//
3815
3816BYTE
3817__readfsbyte (
3818 __in DWORD Offset
3819 );
3820
3821WORD
3822__readfsword (
3823 __in DWORD Offset
3824 );
3825
3826DWORD
3827__readfsdword (
3828 __in DWORD Offset
3829 );
3830
3831VOID
3832__writefsbyte (
3833 __in DWORD Offset,
3834 __in BYTE Data
3835 );
3836
3837VOID
3838__writefsword (
3839 __in DWORD Offset,
3840 __in WORD Data
3841 );
3842
3843VOID
3844__writefsdword (
3845 __in DWORD Offset,
3846 __in DWORD Data
3847 );
3848
3849#pragma intrinsic(__readfsbyte)
3850#pragma intrinsic(__readfsword)
3851#pragma intrinsic(__readfsdword)
3852#pragma intrinsic(__writefsbyte)
3853#pragma intrinsic(__writefsword)
3854#pragma intrinsic(__writefsdword)
3855
3856#endif /* _MSC_FULL_VER >= 13012035 */
3857
3858#if (_MSC_FULL_VER >= 140050727) || defined(_PREFIX_) || defined(_PREFAST_)
3859
3860#if !defined(_MANAGED)
3861
3862VOID
3863__incfsbyte (
3864 __in DWORD Offset
3865 );
3866
3867VOID
3868__addfsbyte (
3869 __in DWORD Offset,
3870 __in BYTE Value
3871 );
3872
3873VOID
3874__incfsword (
3875 __in DWORD Offset
3876 );
3877
3878VOID
3879__addfsword (
3880 __in DWORD Offset,
3881 __in WORD Value
3882 );
3883
3884VOID
3885__incfsdword (
3886 __in DWORD Offset
3887 );
3888
3889VOID
3890__addfsdword (
3891 __in DWORD Offset,
3892 __in DWORD Value
3893 );
3894
3895#pragma intrinsic(__incfsbyte)
3896#pragma intrinsic(__addfsbyte)
3897#pragma intrinsic(__incfsword)
3898#pragma intrinsic(__addfsword)
3899#pragma intrinsic(__incfsdword)
3900#pragma intrinsic(__addfsdword)
3901
3902#endif
3903
3904#endif /* _MSC_FULL_VER >= 140050727 */
3905
3906#if (_MSC_FULL_VER >= 140041204) || defined(_PREFIX_) || defined(_PREFAST_)
3907
3908VOID
3909_mm_pause (
3910 VOID
3911 );
3912
3913#pragma intrinsic(_mm_pause)
3914
3915#define YieldProcessor _mm_pause
3916
3917#else
3918
3919#if !defined(_M_CEE_PURE)
3920#define YieldProcessor() __asm { rep nop }
3921#endif // !defined(_M_CEE_PURE)
3922
3923#endif // (_MSC_FULL_VER >= 140041204)
3924
3925#ifdef __cplusplus
3926}
3927#endif
3928
3929#endif /* !defined(MIDL_PASS) || defined(_M_IX86) */
3930
3931#if !defined(MIDL_PASS) && defined(_M_IX86)
3932
3933#if !defined(_M_CEE_PURE)
3934
3935#pragma warning( push )
3936#pragma warning( disable : 4793 )
3937FORCEINLINE
3938VOID
3939MemoryBarrier (
3940 VOID
3941 )
3942{
3943 LONG Barrier;
3944 __asm {
3945 xchg Barrier, eax
3946 }
3947}
3948#pragma warning( pop )
3949
3950#endif /* _M_CEE_PURE */
3951//
3952// Prefetch is not supported on all x86 procssors.
3953//
3954
3955#define PreFetchCacheLine(l, a)
3956#define PrefetchForWrite(p)
3957#define ReadForWriteAccess(p) (*(p))
3958
3959//
3960// PreFetchCacheLine level defines.
3961//
3962
3963#define PF_TEMPORAL_LEVEL_1
3964#define PF_NON_TEMPORAL_LEVEL_ALL
3965
3966//
3967// Define function to read the value of a performance counter.
3968//
3969
3970#if _MSC_FULL_VER >= 140050727
3971
3972#define ReadPMC __readpmc
3973
3974DWORD64
3975__readpmc (
3976 __in DWORD Counter
3977 );
3978
3979#pragma intrinsic(__readpmc)
3980
3981#else
3982
3983FORCEINLINE
3984DWORD64
3985ReadPMC (
3986 __in DWORD Counter
3987 )
3988
3989{
3990 __asm {
3991 mov ecx, Counter
3992 rdpmc
3993 };
3994}
3995
3996#endif
3997
3998//
3999// Define function to read the value of the time stamp counter
4000//
4001
4002#if _MSC_FULL_VER >= 140040310
4003
4004#define ReadTimeStampCounter() __rdtsc()
4005
4006DWORD64
4007__rdtsc (
4008 VOID
4009 );
4010
4011#pragma intrinsic(__rdtsc)
4012
4013#else
4014
4015FORCEINLINE
4016DWORD64
4017ReadTimeStampCounter (
4018 VOID
4019 )
4020
4021{
4022 __asm rdtsc
4023}
4024
4025#endif
4026
4027// end_ntddk
4028// begin_wdm
4029
4030#if defined(_X86_) && defined(_M_IX86) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
4031
4032#if _MSC_FULL_VER >= 140030222
4033
4034VOID
4035__int2c (
4036 VOID
4037 );
4038
4039#pragma intrinsic(__int2c)
4040
4041__analysis_noreturn
4042FORCEINLINE
4043VOID
4044DbgRaiseAssertionFailure (
4045 VOID
4046 )
4047
4048{
4049 __int2c();
4050}
4051
4052#else
4053#pragma warning( push )
4054#pragma warning( disable : 4793 )
4055
4056__analysis_noreturn
4057FORCEINLINE
4058VOID
4059DbgRaiseAssertionFailure (
4060 VOID
4061 )
4062
4063{
4064 __asm int 0x2c
4065}
4066
4067#pragma warning( pop )
4068
4069#endif
4070
4071#endif
4072
4073// end_wdm
4074
4075#if (_MSC_FULL_VER >= 13012035)
4076
4077__inline PVOID GetFiberData( void ) { return *(PVOID *) (ULONG_PTR) __readfsdword (0x10);}
4078__inline PVOID GetCurrentFiber( void ) { return (PVOID) (ULONG_PTR) __readfsdword (0x10);}
4079
4080#else
4081#if _MSC_VER >= 1200
4082#pragma warning(push)
4083#endif
4084#pragma warning (disable:4035 4793) // disable 4035 (function must return something)
4085__inline PVOID GetFiberData( void ) { __asm {
4086 mov eax, fs:[0x10]
4087 mov eax,[eax]
4088 }
4089 }
4090__inline PVOID GetCurrentFiber( void ) { __asm mov eax, fs:[0x10] }
4091
4092#if _MSC_VER >= 1200
4093#pragma warning(pop)
4094#else
4095#pragma warning (default:4035 4793) // Reenable it
4096#endif
4097#endif // (_MSC_FULL_VER >= 13012035)
4098
4099// begin_ntddk
4100#endif // !defined(MIDL_PASS) && defined(_M_IX86)
4101// end_ntddk
4102
4103//
4104// The following values specify the type of failing access when the status is
4105// STATUS_ACCESS_VIOLATION and the first parameter in the execpetion record.
4106//
4107
4108#define EXCEPTION_READ_FAULT 0 // Access violation was caused by a read
4109#define EXCEPTION_WRITE_FAULT 1 // Access violation was caused by a write
4110#define EXCEPTION_EXECUTE_FAULT 8 // Access violation was caused by an instruction fetch
4111
4112// begin_wx86
4113// begin_ntddk
4114
4115//
4116// Define the size of the 80387 save area, which is in the context frame.
4117//
4118
4119#define SIZE_OF_80387_REGISTERS 80
4120
4121//
4122// The following flags control the contents of the CONTEXT structure.
4123//
4124
4125#if !defined(RC_INVOKED)
4126
4127#define CONTEXT_i386 0x00010000 // this assumes that i386 and
4128#define CONTEXT_i486 0x00010000 // i486 have identical context records
4129
4130// end_wx86
4131
4132#define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
4133#define CONTEXT_INTEGER (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
4134#define CONTEXT_SEGMENTS (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
4135#define CONTEXT_FLOATING_POINT (CONTEXT_i386 | 0x00000008L) // 387 state
4136#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
4137#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x00000020L) // cpu specific extensions
4138
4139#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER |\
4140 CONTEXT_SEGMENTS)
4141
4142#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
4143 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
4144 CONTEXT_EXTENDED_REGISTERS)
4145
4146#define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
4147
4148// begin_wx86
4149
4150#endif // !defined(RC_INVOKED)
4151
4152typedef struct _FLOATING_SAVE_AREA {
4153 DWORD ControlWord;
4154 DWORD StatusWord;
4155 DWORD TagWord;
4156 DWORD ErrorOffset;
4157 DWORD ErrorSelector;
4158 DWORD DataOffset;
4159 DWORD DataSelector;
4160 BYTE RegisterArea[SIZE_OF_80387_REGISTERS];
4161 DWORD Cr0NpxState;
4162} FLOATING_SAVE_AREA;
4163
4164typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
4165
4166
4167// end_ntddk
4168// begin_wdm begin_ntosp
4169
4170#define MAXIMUM_SUPPORTED_EXTENSION 512
4171
4172#if !defined(__midl) && !defined(MIDL_PASS)
4173
4174C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION);
4175
4176#endif
4177
4178// end_wdm end_ntosp
4179// begin_ntddk
4180
4181#include "pshpack4.h"
4182
4183//
4184// Context Frame
4185//
4186// This frame has a several purposes: 1) it is used as an argument to
4187// NtContinue, 2) is is used to constuct a call frame for APC delivery,
4188// and 3) it is used in the user level thread creation routines.
4189//
4190// The layout of the record conforms to a standard call frame.
4191//
4192
4193typedef struct _CONTEXT {
4194
4195 //
4196 // The flags values within this flag control the contents of
4197 // a CONTEXT record.
4198 //
4199 // If the context record is used as an input parameter, then
4200 // for each portion of the context record controlled by a flag
4201 // whose value is set, it is assumed that that portion of the
4202 // context record contains valid context. If the context record
4203 // is being used to modify a threads context, then only that
4204 // portion of the threads context will be modified.
4205 //
4206 // If the context record is used as an IN OUT parameter to capture
4207 // the context of a thread, then only those portions of the thread's
4208 // context corresponding to set flags will be returned.
4209 //
4210 // The context record is never used as an OUT only parameter.
4211 //
4212
4213 DWORD ContextFlags;
4214
4215 //
4216 // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
4217 // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
4218 // included in CONTEXT_FULL.
4219 //
4220
4221 DWORD Dr0;
4222 DWORD Dr1;
4223 DWORD Dr2;
4224 DWORD Dr3;
4225 DWORD Dr6;
4226 DWORD Dr7;
4227
4228 //
4229 // This section is specified/returned if the
4230 // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
4231 //
4232
4233 FLOATING_SAVE_AREA FloatSave;
4234
4235 //
4236 // This section is specified/returned if the
4237 // ContextFlags word contians the flag CONTEXT_SEGMENTS.
4238 //
4239
4240 DWORD SegGs;
4241 DWORD SegFs;
4242 DWORD SegEs;
4243 DWORD SegDs;
4244
4245 //
4246 // This section is specified/returned if the
4247 // ContextFlags word contians the flag CONTEXT_INTEGER.
4248 //
4249
4250 DWORD Edi;
4251 DWORD Esi;
4252 DWORD Ebx;
4253 DWORD Edx;
4254 DWORD Ecx;
4255 DWORD Eax;
4256
4257 //
4258 // This section is specified/returned if the
4259 // ContextFlags word contians the flag CONTEXT_CONTROL.
4260 //
4261
4262 DWORD Ebp;
4263 DWORD Eip;
4264 DWORD SegCs; // MUST BE SANITIZED
4265 DWORD EFlags; // MUST BE SANITIZED
4266 DWORD Esp;
4267 DWORD SegSs;
4268
4269 //
4270 // This section is specified/returned if the ContextFlags word
4271 // contains the flag CONTEXT_EXTENDED_REGISTERS.
4272 // The format and contexts are processor specific
4273 //
4274
4275 BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
4276
4277} CONTEXT;
4278
4279typedef CONTEXT *PCONTEXT;
4280
4281#include "poppack.h"
4282
4283// begin_ntminiport
4284#endif //_X86_
4285
4286
4287#ifndef _LDT_ENTRY_DEFINED
4288#define _LDT_ENTRY_DEFINED
4289
4290typedef struct _LDT_ENTRY {
4291 WORD LimitLow;
4292 WORD BaseLow;
4293 union {
4294 struct {
4295 BYTE BaseMid;
4296 BYTE Flags1; // Declare as bytes to avoid alignment
4297 BYTE Flags2; // Problems.
4298 BYTE BaseHi;
4299 } Bytes;
4300 struct {
4301 DWORD BaseMid : 8;
4302 DWORD Type : 5;
4303 DWORD Dpl : 2;
4304 DWORD Pres : 1;
4305 DWORD LimitHi : 4;
4306 DWORD Sys : 1;
4307 DWORD Reserved_0 : 1;
4308 DWORD Default_Big : 1;
4309 DWORD Granularity : 1;
4310 DWORD BaseHi : 8;
4311 } Bits;
4312 } HighWord;
4313} LDT_ENTRY, *PLDT_ENTRY;
4314
4315#endif
4316
4317
4318#if defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
4319
4320#ifdef __cplusplus
4321extern "C" {
4322#endif
4323
4324//
4325// Define bit test intrinsics.
4326//
4327
4328#define BitTest _bittest
4329#define BitTestAndComplement _bittestandcomplement
4330#define BitTestAndSet _bittestandset
4331#define BitTestAndReset _bittestandreset
4332
4333#define BitTest64 _bittest64
4334#define BitTestAndComplement64 _bittestandcomplement64
4335#define BitTestAndSet64 _bittestandset64
4336#define BitTestAndReset64 _bittestandreset64
4337
4338__checkReturn
4339BOOLEAN
4340_bittest (
4341 __in_bcount((Offset+7)/8) LONG const *Base,
4342 __in LONG Offset
4343 );
4344
4345BOOLEAN
4346_bittestandcomplement (
4347 __inout_bcount((Offset+7)/8) LONG *Base,
4348 __in LONG Offset
4349 );
4350
4351BOOLEAN
4352_bittestandset (
4353 __inout_bcount((Offset+7)/8) LONG *Base,
4354 __in LONG Offset
4355 );
4356
4357BOOLEAN
4358_bittestandreset (
4359 __inout_bcount((Offset+7)/8) LONG *Base,
4360 __in LONG Offset
4361 );
4362
4363__checkReturn
4364BOOLEAN
4365_bittest64 (
4366 __in_bcount((Offset+7)/8) LONG64 const *Base,
4367 __in LONG64 Offset
4368 );
4369
4370BOOLEAN
4371_bittestandcomplement64 (
4372 __inout_bcount((Offset+7)/8) LONG64 *Base,
4373 __in LONG64 Offset
4374 );
4375
4376BOOLEAN
4377_bittestandset64 (
4378 __inout_bcount((Offset+7)/8) LONG64 *Base,
4379 __in LONG64 Offset
4380 );
4381
4382BOOLEAN
4383_bittestandreset64 (
4384 __inout_bcount((Offset+7)/8) LONG64 *Base,
4385 __in LONG64 Offset
4386 );
4387
4388#pragma intrinsic(_bittest)
4389#pragma intrinsic(_bittestandcomplement)
4390#pragma intrinsic(_bittestandset)
4391#pragma intrinsic(_bittestandreset)
4392
4393#pragma intrinsic(_bittest64)
4394#pragma intrinsic(_bittestandcomplement64)
4395#pragma intrinsic(_bittestandset64)
4396#pragma intrinsic(_bittestandreset64)
4397
4398//
4399// Define bit scan intrinsics.
4400//
4401
4402#define BitScanForward _BitScanForward
4403#define BitScanReverse _BitScanReverse
4404#define BitScanForward64 _BitScanForward64
4405#define BitScanReverse64 _BitScanReverse64
4406
4407__success(return!=0)
4408BOOLEAN
4409_BitScanForward (
4410 __out DWORD *Index,
4411 __in DWORD Mask
4412 );
4413
4414__success(return!=0)
4415BOOLEAN
4416_BitScanReverse (
4417 __out DWORD *Index,
4418 __in DWORD Mask
4419 );
4420
4421__success(return!=0)
4422BOOLEAN
4423_BitScanForward64 (
4424 __out DWORD *Index,
4425 __in DWORD64 Mask
4426 );
4427
4428__success(return!=0)
4429BOOLEAN
4430_BitScanReverse64 (
4431 __out DWORD *Index,
4432 __in DWORD64 Mask
4433 );
4434
4435#pragma intrinsic(_BitScanForward)
4436#pragma intrinsic(_BitScanReverse)
4437#pragma intrinsic(_BitScanForward64)
4438#pragma intrinsic(_BitScanReverse64)
4439
4440#define InterlockedCompareExchange16 _InterlockedCompareExchange16
4441
4442SHORT
4443_InterlockedCompareExchange16 (
4444 __inout __drv_interlocked SHORT volatile *Destination,
4445 __in SHORT ExChange,
4446 __in SHORT Comperand
4447 );
4448
4449#pragma intrinsic(_InterlockedCompareExchange16)
4450
4451#ifdef __cplusplus
4452}
4453#endif
4454
4455#define InterlockedAdd _InterlockedAdd
4456#define InterlockedAddAcquire _InterlockedAdd_acq
4457#define InterlockedAddRelease _InterlockedAdd_rel
4458
4459#define InterlockedIncrement _InterlockedIncrement
4460#define InterlockedIncrementAcquire _InterlockedIncrement_acq
4461#define InterlockedIncrementRelease _InterlockedIncrement_rel
4462
4463#define InterlockedDecrement _InterlockedDecrement
4464#define InterlockedDecrementAcquire _InterlockedDecrement_acq
4465#define InterlockedDecrementRelease _InterlockedDecrement_rel
4466
4467#define InterlockedExchange _InterlockedExchange
4468#define InterlockedExchangeAcquire _InterlockedExchange_acq
4469
4470#define InterlockedExchangeAdd _InterlockedExchangeAdd
4471#define InterlockedExchangeAddAcquire _InterlockedExchangeAdd_acq
4472#define InterlockedExchangeAddRelease _InterlockedExchangeAdd_rel
4473
4474#define InterlockedAdd64 _InterlockedAdd64
4475#define InterlockedAddAcquire64 _InterlockedAdd64_acq
4476#define InterlockedAddRelease64 _InterlockedAdd64_rel
4477
4478#define InterlockedIncrement64 _InterlockedIncrement64
4479#define InterlockedIncrementAcquire64 _InterlockedIncrement64_acq
4480#define InterlockedIncrementRelease64 _InterlockedIncrement64_rel
4481
4482#define InterlockedDecrement64 _InterlockedDecrement64
4483#define InterlockedDecrementAcquire64 _InterlockedDecrement64_acq
4484#define InterlockedDecrementRelease64 _InterlockedDecrement64_rel
4485
4486#define InterlockedExchange64 _InterlockedExchange64
4487#define InterlockedExchangeAcquire64 _InterlockedExchange64_acq
4488
4489#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
4490#define InterlockedExchangeAddAcquire64 _InterlockedExchangeAdd64_acq
4491#define InterlockedExchangeAddRelease64 _InterlockedExchangeAdd64_rel
4492
4493#define InterlockedCompareExchange64 _InterlockedCompareExchange64
4494#define InterlockedCompareExchangeAcquire64 _InterlockedCompareExchange64_acq
4495#define InterlockedCompareExchangeRelease64 _InterlockedCompareExchange64_rel
4496
4497#define InterlockedCompare64Exchange128 _InterlockedCompare64Exchange128
4498#define InterlockedCompare64ExchangeAcquire128 _InterlockedCompare64Exchange128_acq
4499#define InterlockedCompare64ExchangeRelease128 _InterlockedCompare64Exchange128_rel
4500
4501#define InterlockedCompareExchange _InterlockedCompareExchange
4502#define InterlockedCompareExchangeAcquire _InterlockedCompareExchange_acq
4503#define InterlockedCompareExchangeRelease _InterlockedCompareExchange_rel
4504
4505#define InterlockedExchangePointer _InterlockedExchangePointer
4506#define InterlockedExchangePointerAcquire _InterlockedExchangePointer_acq
4507
4508#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
4509#define InterlockedCompareExchangePointerRelease _InterlockedCompareExchangePointer_rel
4510#define InterlockedCompareExchangePointerAcquire _InterlockedCompareExchangePointer_acq
4511
4512
4513#define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
4514#define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)
4515#define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)
4516
4517#define InterlockedOr _InterlockedOr
4518#define InterlockedOrAcquire _InterlockedOr_acq
4519#define InterlockedOrRelease _InterlockedOr_rel
4520#define InterlockedOr8 _InterlockedOr8
4521#define InterlockedOr8Acquire _InterlockedOr8_acq
4522#define InterlockedOr8Release _InterlockedOr8_rel
4523#define InterlockedOr16 _InterlockedOr16
4524#define InterlockedOr16Acquire _InterlockedOr16_acq
4525#define InterlockedOr16Release _InterlockedOr16_rel
4526#define InterlockedOr64 _InterlockedOr64
4527#define InterlockedOr64Acquire _InterlockedOr64_acq
4528#define InterlockedOr64Release _InterlockedOr64_rel
4529#define InterlockedXor _InterlockedXor
4530#define InterlockedXorAcquire _InterlockedXor_acq
4531#define InterlockedXorRelease _InterlockedXor_rel
4532#define InterlockedXor8 _InterlockedXor8
4533#define InterlockedXor8Acquire _InterlockedXor8_acq
4534#define InterlockedXor8Release _InterlockedXor8_rel
4535#define InterlockedXor16 _InterlockedXor16
4536#define InterlockedXor16Acquire _InterlockedXor16_acq
4537#define InterlockedXor16Release _InterlockedXor16_rel
4538#define InterlockedXor64 _InterlockedXor64
4539#define InterlockedXor64Acquire _InterlockedXor64_acq
4540#define InterlockedXor64Release _InterlockedXor64_rel
4541#define InterlockedAnd _InterlockedAnd
4542#define InterlockedAndAcquire _InterlockedAnd_acq
4543#define InterlockedAndRelease _InterlockedAnd_rel
4544#define InterlockedAnd8 _InterlockedAnd8
4545#define InterlockedAnd8Acquire _InterlockedAnd8_acq
4546#define InterlockedAnd8Release _InterlockedAnd8_rel
4547#define InterlockedAnd16 _InterlockedAnd16
4548#define InterlockedAnd16Acquire _InterlockedAnd16_acq
4549#define InterlockedAnd16Release _InterlockedAnd16_rel
4550#define InterlockedAnd64 _InterlockedAnd64
4551#define InterlockedAnd64Acquire _InterlockedAnd64_acq
4552#define InterlockedAnd64Release _InterlockedAnd64_rel
4553
4554#ifdef __cplusplus
4555extern "C" {
4556#endif
4557
4558LONG
4559__cdecl
4560InterlockedAdd (
4561 __inout __drv_interlocked LONG volatile *Addend,
4562 __in LONG Value
4563 );
4564
4565LONG
4566__cdecl
4567InterlockedAddAcquire (
4568 __inout __drv_interlocked LONG volatile *Addend,
4569 __in LONG Value
4570 );
4571
4572LONG
4573__cdecl
4574InterlockedAddRelease (
4575 __inout __drv_interlocked LONG volatile *Addend,
4576 __in LONG Value
4577 );
4578
4579LONGLONG
4580__cdecl
4581InterlockedAdd64 (
4582 __inout __drv_interlocked LONGLONG volatile *Addend,
4583 __in LONGLONG Value
4584 );
4585
4586LONGLONG
4587__cdecl
4588InterlockedAddAcquire64 (
4589 __inout __drv_interlocked LONGLONG volatile *Addend,
4590 __in LONGLONG Value
4591 );
4592
4593
4594LONGLONG
4595__cdecl
4596InterlockedAddRelease64 (
4597 __inout __drv_interlocked LONGLONG volatile *Addend,
4598 __in LONGLONG Value
4599 );
4600
4601LONG
4602__cdecl
4603InterlockedIncrement(
4604 __inout __drv_interlocked LONG volatile *Addend
4605 );
4606
4607LONG
4608__cdecl
4609InterlockedDecrement(
4610 __inout __drv_interlocked LONG volatile *Addend
4611 );
4612
4613LONG
4614__cdecl
4615InterlockedIncrementAcquire(
4616 __inout __drv_interlocked LONG volatile *Addend
4617 );
4618
4619LONG
4620__cdecl
4621InterlockedDecrementAcquire(
4622 __inout __drv_interlocked LONG volatile *Addend
4623 );
4624
4625LONG
4626__cdecl
4627InterlockedIncrementRelease(
4628 __inout __drv_interlocked LONG volatile *Addend
4629 );
4630
4631LONG
4632__cdecl
4633InterlockedDecrementRelease(
4634 __inout __drv_interlocked LONG volatile *Addend
4635 );
4636
4637LONG
4638__cdecl
4639InterlockedExchange(
4640 __inout __drv_interlocked LONG volatile *Target,
4641 __in LONG Value
4642 );
4643
4644LONG
4645__cdecl
4646InterlockedExchangeAcquire(
4647 __inout __drv_interlocked LONG volatile *Target,
4648 __in LONG Value
4649 );
4650
4651LONG
4652__cdecl
4653InterlockedExchangeAdd(
4654 __inout __drv_interlocked LONG volatile *Addend,
4655 __in LONG Value
4656 );
4657
4658LONG
4659__cdecl
4660InterlockedExchangeAddAcquire(
4661 __inout __drv_interlocked LONG volatile *Addend,
4662 __in LONG Value
4663 );
4664
4665LONG
4666__cdecl
4667InterlockedExchangeAddRelease(
4668 __inout __drv_interlocked LONG volatile *Addend,
4669 __in LONG Value
4670 );
4671
4672LONG
4673__cdecl
4674InterlockedCompareExchange (
4675 __inout __drv_interlocked LONG volatile *Destination,
4676 __in LONG ExChange,
4677 __in LONG Comperand
4678 );
4679
4680
4681LONG
4682__cdecl
4683InterlockedCompareExchangeRelease (
4684 __inout __drv_interlocked LONG volatile *Destination,
4685 __in LONG ExChange,
4686 __in LONG Comperand
4687 );
4688
4689
4690LONG
4691__cdecl
4692InterlockedCompareExchangeAcquire (
4693 __inout __drv_interlocked LONG volatile *Destination,
4694 __in LONG ExChange,
4695 __in LONG Comperand
4696 );
4697
4698
4699LONGLONG
4700__cdecl
4701InterlockedIncrement64(
4702 __inout __drv_interlocked LONGLONG volatile *Addend
4703 );
4704
4705LONGLONG
4706__cdecl
4707InterlockedIncrementAcquire64(
4708 __inout __drv_interlocked LONGLONG volatile *Addend
4709 );
4710
4711LONGLONG
4712__cdecl
4713InterlockedIncrementRelease64(
4714 __inout __drv_interlocked LONGLONG volatile *Addend
4715 );
4716
4717LONGLONG
4718__cdecl
4719InterlockedDecrement64(
4720 __inout __drv_interlocked LONGLONG volatile *Addend
4721 );
4722
4723LONGLONG
4724__cdecl
4725InterlockedDecrementAcquire64(
4726 __inout __drv_interlocked LONGLONG volatile *Addend
4727 );
4728
4729LONGLONG
4730__cdecl
4731InterlockedDecrementRelease64(
4732 __inout __drv_interlocked LONGLONG volatile *Addend
4733 );
4734
4735LONGLONG
4736__cdecl
4737InterlockedExchange64(
4738 __inout __drv_interlocked LONGLONG volatile *Target,
4739 __in LONGLONG Value
4740 );
4741
4742LONGLONG
4743__cdecl
4744InterlockedExchangeAcquire64(
4745 __inout __drv_interlocked LONGLONG volatile *Target,
4746 __in LONGLONG Value
4747 );
4748
4749LONGLONG
4750__cdecl
4751InterlockedExchangeAdd64(
4752 __inout __drv_interlocked LONGLONG volatile *Addend,
4753 __in LONGLONG Value
4754 );
4755
4756LONGLONG
4757__cdecl
4758InterlockedExchangeAddAcquire64(
4759 __inout __drv_interlocked LONGLONG volatile *Addend,
4760 __in LONGLONG Value
4761 );
4762
4763LONGLONG
4764__cdecl
4765InterlockedExchangeAddRelease64(
4766 __inout __drv_interlocked LONGLONG volatile *Addend,
4767 __in LONGLONG Value
4768 );
4769
4770LONGLONG
4771__cdecl
4772InterlockedCompareExchange64 (
4773 __inout __drv_interlocked LONGLONG volatile *Destination,
4774 __in LONGLONG ExChange,
4775 __in LONGLONG Comperand
4776 );
4777
4778LONGLONG
4779__cdecl
4780InterlockedCompareExchangeAcquire64 (
4781 __inout __drv_interlocked LONGLONG volatile *Destination,
4782 __in LONGLONG ExChange,
4783 __in LONGLONG Comperand
4784 );
4785
4786LONGLONG
4787__cdecl
4788InterlockedCompareExchangeRelease64 (
4789 __inout __drv_interlocked LONGLONG volatile *Destination,
4790 __in LONGLONG ExChange,
4791 __in LONGLONG Comperand
4792 );
4793
4794LONG64
4795__cdecl
4796InterlockedCompare64Exchange128(
4797 __inout_bcount(16) __drv_interlocked LONG64 volatile *Destination,
4798 __in LONG64 ExchangeHigh,
4799 __in LONG64 ExchangeLow,
4800 __in LONG64 Comperand
4801 );
4802
4803LONG64
4804__cdecl
4805InterlockedCompare64ExchangeAcquire128(
4806 __inout_bcount(16) __drv_interlocked LONG64 volatile *Destination,
4807 __in LONG64 ExchangeHigh,
4808 __in LONG64 ExchangeLow,
4809 __in LONG64 Comperand
4810 );
4811
4812LONG64
4813__cdecl
4814InterlockedCompare64ExchangeRelease128(
4815 __inout_bcount(16) __drv_interlocked LONG64 volatile *Destination,
4816 __in LONG64 ExchangeHigh,
4817 __in LONG64 ExchangeLow,
4818 __in LONG64 Comperand
4819 );
4820
4821PVOID
4822__cdecl
4823InterlockedCompareExchangePointer (
4824 __inout __drv_interlocked PVOID volatile *Destination,
4825 __in PVOID Exchange,
4826 __in PVOID Comperand
4827 );
4828
4829PVOID
4830__cdecl
4831InterlockedCompareExchangePointerAcquire (
4832 __inout __drv_interlocked PVOID volatile *Destination,
4833 __in PVOID Exchange,
4834 __in PVOID Comperand
4835 );
4836
4837PVOID
4838__cdecl
4839InterlockedCompareExchangePointerRelease (
4840 __inout __drv_interlocked PVOID volatile *Destination,
4841 __in PVOID Exchange,
4842 __in PVOID Comperand
4843 );
4844
4845PVOID
4846__cdecl
4847InterlockedExchangePointer(
4848 __inout __drv_interlocked PVOID volatile *Target,
4849 __in PVOID Value
4850 );
4851
4852PVOID
4853__cdecl
4854InterlockedExchangePointerAcquire(
4855 __inout __drv_interlocked PVOID volatile *Target,
4856 __in PVOID Value
4857 );
4858
4859LONG
4860__cdecl
4861InterlockedOr (
4862 __inout __drv_interlocked LONG volatile *Destination,
4863 __in LONG Value
4864 );
4865
4866LONG
4867__cdecl
4868InterlockedOrAcquire (
4869 __inout __drv_interlocked LONG volatile *Destination,
4870 __in LONG Value
4871 );
4872
4873LONG
4874__cdecl
4875InterlockedOrRelease (
4876 __inout __drv_interlocked LONG volatile *Destination,
4877 __in LONG Value
4878 );
4879
4880CHAR
4881__cdecl
4882InterlockedOr8 (
4883 __inout __drv_interlocked CHAR volatile *Destination,
4884 __in CHAR Value
4885 );
4886
4887CHAR
4888__cdecl
4889InterlockedOr8Acquire (
4890 __inout __drv_interlocked CHAR volatile *Destination,
4891 __in CHAR Value
4892 );
4893
4894CHAR
4895__cdecl
4896InterlockedOr8Release (
4897 __inout __drv_interlocked CHAR volatile *Destination,
4898 __in CHAR Value
4899 );
4900
4901SHORT
4902__cdecl
4903InterlockedOr16(
4904 __inout __drv_interlocked SHORT volatile *Destination,
4905 __in SHORT Value
4906 );
4907
4908SHORT
4909__cdecl
4910InterlockedOr16Acquire (
4911 __inout __drv_interlocked SHORT volatile *Destination,
4912 __in SHORT Value
4913 );
4914
4915SHORT
4916__cdecl
4917InterlockedOr16Release (
4918 __inout __drv_interlocked SHORT volatile *Destination,
4919 __in SHORT Value
4920 );
4921
4922LONGLONG
4923__cdecl
4924InterlockedOr64 (
4925 __inout __drv_interlocked LONGLONG volatile *Destination,
4926 __in LONGLONG Value
4927 );
4928
4929LONGLONG
4930__cdecl
4931InterlockedOr64Acquire (
4932 __inout __drv_interlocked LONGLONG volatile *Destination,
4933 __in LONGLONG Value
4934 );
4935
4936LONGLONG
4937__cdecl
4938InterlockedOr64Release (
4939 __inout __drv_interlocked LONGLONG volatile *Destination,
4940 __in LONGLONG Value
4941 );
4942
4943LONG
4944__cdecl
4945InterlockedXor (
4946 __inout __drv_interlocked LONG volatile *Destination,
4947 __in LONG Value
4948 );
4949
4950LONG
4951__cdecl
4952InterlockedXorAcquire (
4953 __inout __drv_interlocked LONG volatile *Destination,
4954 __in LONG Value
4955 );
4956
4957LONG
4958__cdecl
4959InterlockedXorRelease (
4960 __inout __drv_interlocked LONG volatile *Destination,
4961 __in LONG Value
4962 );
4963
4964CHAR
4965__cdecl
4966InterlockedXor8 (
4967 __inout __drv_interlocked CHAR volatile *Destination,
4968 __in CHAR Value
4969 );
4970
4971CHAR
4972__cdecl
4973InterlockedXor8Acquire (
4974 __inout __drv_interlocked CHAR volatile *Destination,
4975 __in CHAR Value
4976 );
4977
4978CHAR
4979__cdecl
4980InterlockedXor8Release (
4981 __inout __drv_interlocked CHAR volatile *Destination,
4982 __in CHAR Value
4983 );
4984
4985SHORT
4986__cdecl
4987InterlockedXor16(
4988 __inout __drv_interlocked SHORT volatile *Destination,
4989 __in SHORT Value
4990 );
4991
4992SHORT
4993__cdecl
4994InterlockedXor16Acquire (
4995 __inout __drv_interlocked SHORT volatile *Destination,
4996 __in SHORT Value
4997 );
4998
4999SHORT
5000__cdecl
5001InterlockedXor16Release (
5002 __inout __drv_interlocked SHORT volatile *Destination,
5003 __in SHORT Value
5004 );
5005
5006LONGLONG
5007__cdecl
5008InterlockedXor64 (
5009 __inout __drv_interlocked LONGLONG volatile *Destination,
5010 __in LONGLONG Value
5011 );
5012
5013LONGLONG
5014__cdecl
5015InterlockedXor64Acquire (
5016 __inout __drv_interlocked LONGLONG volatile *Destination,
5017 __in LONGLONG Value
5018 );
5019
5020LONGLONG
5021__cdecl
5022InterlockedXor64Release (
5023 __inout __drv_interlocked LONGLONG volatile *Destination,
5024 __in LONGLONG Value
5025 );
5026
5027LONG
5028__cdecl
5029InterlockedAnd (
5030 __inout __drv_interlocked LONG volatile *Destination,
5031 __in LONG Value
5032 );
5033
5034LONG
5035__cdecl
5036InterlockedAndAcquire (
5037 __inout __drv_interlocked LONG volatile *Destination,
5038 __in LONG Value
5039 );
5040
5041LONG
5042__cdecl
5043InterlockedAndRelease (
5044 __inout __drv_interlocked LONG volatile *Destination,
5045 __in LONG Value
5046 );
5047
5048CHAR
5049__cdecl
5050InterlockedAnd8 (
5051 __inout __drv_interlocked CHAR volatile *Destination,
5052 __in CHAR Value
5053 );
5054
5055CHAR
5056__cdecl
5057InterlockedAnd8Acquire (
5058 __inout __drv_interlocked CHAR volatile *Destination,
5059 __in CHAR Value
5060 );
5061
5062CHAR
5063__cdecl
5064InterlockedAnd8Release (
5065 __inout __drv_interlocked CHAR volatile *Destination,
5066 __in CHAR Value
5067 );
5068
5069SHORT
5070__cdecl
5071InterlockedAnd16(
5072 __inout __drv_interlocked SHORT volatile *Destination,
5073 __in SHORT Value
5074 );
5075
5076SHORT
5077__cdecl
5078InterlockedAnd16Acquire (
5079 __inout __drv_interlocked SHORT volatile *Destination,
5080 __in SHORT Value
5081 );
5082
5083SHORT
5084__cdecl
5085InterlockedAnd16Release (
5086 __inout __drv_interlocked SHORT volatile *Destination,
5087 __in SHORT Value
5088 );
5089
5090LONGLONG
5091__cdecl
5092InterlockedAnd64 (
5093 __inout __drv_interlocked LONGLONG volatile *Destination,
5094 __in LONGLONG Value
5095 );
5096
5097LONGLONG
5098__cdecl
5099InterlockedAnd64Acquire (
5100 __inout __drv_interlocked LONGLONG volatile *Destination,
5101 __in LONGLONG Value
5102 );
5103
5104LONGLONG
5105__cdecl
5106InterlockedAnd64Release (
5107 __inout __drv_interlocked LONGLONG volatile *Destination,
5108 __in LONGLONG Value
5109 );
5110
5111#pragma intrinsic(_InterlockedAdd)
5112#pragma intrinsic(_InterlockedIncrement)
5113#pragma intrinsic(_InterlockedIncrement_acq)
5114#pragma intrinsic(_InterlockedIncrement_rel)
5115#pragma intrinsic(_InterlockedDecrement)
5116#pragma intrinsic(_InterlockedDecrement_acq)
5117#pragma intrinsic(_InterlockedDecrement_rel)
5118#pragma intrinsic(_InterlockedExchange)
5119#pragma intrinsic(_InterlockedCompareExchange)
5120#pragma intrinsic(_InterlockedCompareExchange_acq)
5121#pragma intrinsic(_InterlockedCompareExchange_rel)
5122#pragma intrinsic(_InterlockedExchangeAdd)
5123#pragma intrinsic(_InterlockedAdd64)
5124#pragma intrinsic(_InterlockedIncrement64)
5125#pragma intrinsic(_InterlockedDecrement64)
5126#pragma intrinsic(_InterlockedExchange64)
5127#pragma intrinsic(_InterlockedExchange64_acq)
5128#pragma intrinsic(_InterlockedCompareExchange64)
5129#pragma intrinsic(_InterlockedCompareExchange64_acq)
5130#pragma intrinsic(_InterlockedCompareExchange64_rel)
5131#pragma intrinsic(_InterlockedCompare64Exchange128)
5132#pragma intrinsic(_InterlockedCompare64Exchange128_acq)
5133#pragma intrinsic(_InterlockedCompare64Exchange128_rel)
5134#pragma intrinsic(_InterlockedExchangeAdd64)
5135#pragma intrinsic(_InterlockedExchangePointer)
5136#pragma intrinsic(_InterlockedCompareExchangePointer)
5137#pragma intrinsic(_InterlockedCompareExchangePointer_acq)
5138#pragma intrinsic(_InterlockedCompareExchangePointer_rel)
5139#pragma intrinsic(_InterlockedAdd_acq)
5140#pragma intrinsic(_InterlockedAdd_rel)
5141#pragma intrinsic(_InterlockedExchange_acq)
5142#pragma intrinsic(_InterlockedExchangeAdd_acq)
5143#pragma intrinsic(_InterlockedExchangeAdd_rel)
5144#pragma intrinsic(_InterlockedAdd64_acq)
5145#pragma intrinsic(_InterlockedAdd64_rel)
5146#pragma intrinsic(_InterlockedIncrement64_acq)
5147#pragma intrinsic(_InterlockedIncrement64_rel)
5148#pragma intrinsic(_InterlockedDecrement64_acq)
5149#pragma intrinsic(_InterlockedDecrement64_rel)
5150#pragma intrinsic(_InterlockedExchangeAdd64_acq)
5151#pragma intrinsic(_InterlockedExchangeAdd64_rel)
5152#pragma intrinsic(_InterlockedExchangePointer_acq)
5153#pragma intrinsic (_InterlockedOr)
5154#pragma intrinsic (_InterlockedOr_acq)
5155#pragma intrinsic (_InterlockedOr_rel)
5156#pragma intrinsic (_InterlockedOr8)
5157#pragma intrinsic (_InterlockedOr8_acq)
5158#pragma intrinsic (_InterlockedOr8_rel)
5159#pragma intrinsic (_InterlockedOr16)
5160#pragma intrinsic (_InterlockedOr16_acq)
5161#pragma intrinsic (_InterlockedOr16_rel)
5162#pragma intrinsic (_InterlockedOr64)
5163#pragma intrinsic (_InterlockedOr64_acq)
5164#pragma intrinsic (_InterlockedOr64_rel)
5165#pragma intrinsic (_InterlockedXor)
5166#pragma intrinsic (_InterlockedXor_acq)
5167#pragma intrinsic (_InterlockedXor_rel)
5168#pragma intrinsic (_InterlockedXor8)
5169#pragma intrinsic (_InterlockedXor8_acq)
5170#pragma intrinsic (_InterlockedXor8_rel)
5171#pragma intrinsic (_InterlockedXor16)
5172#pragma intrinsic (_InterlockedXor16_acq)
5173#pragma intrinsic (_InterlockedXor16_rel)
5174#pragma intrinsic (_InterlockedXor64)
5175#pragma intrinsic (_InterlockedXor64_acq)
5176#pragma intrinsic (_InterlockedXor64_rel)
5177#pragma intrinsic (_InterlockedAnd)
5178#pragma intrinsic (_InterlockedAnd_acq)
5179#pragma intrinsic (_InterlockedAnd_rel)
5180#pragma intrinsic (_InterlockedAnd8)
5181#pragma intrinsic (_InterlockedAnd8_acq)
5182#pragma intrinsic (_InterlockedAnd8_rel)
5183#pragma intrinsic (_InterlockedAnd16)
5184#pragma intrinsic (_InterlockedAnd16_acq)
5185#pragma intrinsic (_InterlockedAnd16_rel)
5186#pragma intrinsic (_InterlockedAnd64)
5187#pragma intrinsic (_InterlockedAnd64_acq)
5188#pragma intrinsic (_InterlockedAnd64_rel)
5189
5190#if !defined (InterlockedAnd64)
5191
5192#define InterlockedAnd64 InterlockedAnd64_Inline
5193
5194LONGLONG
5195FORCEINLINE
5196InterlockedAnd64_Inline (
5197 __inout __drv_interlocked LONGLONG volatile *Destination,
5198 __in LONGLONG Value
5199 )
5200{
5201 LONGLONG Old;
5202
5203 do {
5204 Old = *Destination;
5205 } while (InterlockedCompareExchange64(Destination,
5206 Old & Value,
5207 Old) != Old);
5208
5209 return Old;
5210}
5211
5212#endif
5213
5214#define InterlockedAndAffinity InterlockedAnd64
5215
5216#if !defined (InterlockedOr64)
5217
5218#define InterlockedOr64 InterlockedOr64_Inline
5219
5220LONGLONG
5221FORCEINLINE
5222InterlockedOr64_Inline (
5223 __inout __drv_interlocked LONGLONG volatile *Destination,
5224 __in LONGLONG Value
5225 )
5226{
5227 LONGLONG Old;
5228
5229 do {
5230 Old = *Destination;
5231 } while (InterlockedCompareExchange64(Destination,
5232 Old | Value,
5233 Old) != Old);
5234
5235 return Old;
5236}
5237
5238#endif
5239
5240#define InterlockedOrAffinity InterlockedOr64
5241
5242#if !defined (InterlockedXor64)
5243
5244#define InterlockedXor64 InterlockedXor64_Inline
5245
5246LONGLONG
5247FORCEINLINE
5248InterlockedXor64_Inline (
5249 __inout __drv_interlocked LONGLONG volatile *Destination,
5250 __in LONGLONG Value
5251 )
5252{
5253 LONGLONG Old;
5254
5255 do {
5256 Old = *Destination;
5257 } while (InterlockedCompareExchange64(Destination,
5258 Old ^ Value,
5259 Old) != Old);
5260
5261 return Old;
5262}
5263
5264#endif
5265
5266#if !defined (InterlockedBitTestAndSet)
5267
5268#define InterlockedBitTestAndSet InterlockedBitTestAndSet_Inline
5269
5270BOOLEAN
5271FORCEINLINE
5272InterlockedBitTestAndSet_Inline (
5273 __inout __drv_interlocked LONG volatile *Base,
5274 __in LONG Bit
5275 )
5276{
5277 LONG tBit;
5278
5279 tBit = 1<<(Bit & (sizeof (*Base)*8-1));
5280 return (BOOLEAN) ((InterlockedOr (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);
5281}
5282
5283#endif
5284
5285#if !defined (InterlockedBitTestAndReset)
5286
5287#define InterlockedBitTestAndReset InterlockedBitTestAndReset_Inline
5288
5289BOOLEAN
5290FORCEINLINE
5291InterlockedBitTestAndReset_Inline (
5292 __inout __drv_interlocked LONG volatile *Base,
5293 __in LONG Bit
5294 )
5295{
5296 LONG tBit;
5297
5298 tBit = 1<<(Bit & (sizeof (*Base)*8-1));
5299 return (BOOLEAN) ((InterlockedAnd (&Base[Bit/(sizeof (*Base)*8)], ~tBit)&tBit) != 0);
5300}
5301
5302#endif
5303
5304#if !defined (InterlockedBitTestAndSet64)
5305
5306#define InterlockedBitTestAndSet64 InterlockedBitTestAndSet64_Inline
5307
5308BOOLEAN
5309FORCEINLINE
5310InterlockedBitTestAndSet64_Inline (
5311 __inout __drv_interlocked LONG64 volatile *Base,
5312 __in LONG64 Bit
5313 )
5314{
5315 LONG64 tBit;
5316
5317 tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));
5318 return (BOOLEAN) ((InterlockedOr64 (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);
5319}
5320
5321#endif
5322
5323#if !defined (InterlockedBitTestAndReset64)
5324
5325#define InterlockedBitTestAndReset64 InterlockedBitTestAndReset64_Inline
5326
5327BOOLEAN
5328FORCEINLINE
5329InterlockedBitTestAndReset64_Inline (
5330 __inout __drv_interlocked LONG64 volatile *Base,
5331 __in LONG64 Bit
5332 )
5333{
5334 LONG64 tBit;
5335
5336 tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));
5337 return (BOOLEAN) ((InterlockedAnd64 (&Base[Bit/(sizeof (*Base)*8)], ~tBit)&tBit) != 0);
5338}
5339
5340#endif
5341
5342#if !defined (InterlockedBitTestAndComplement)
5343
5344#define InterlockedBitTestAndComplement InterlockedBitTestAndComplement_Inline
5345
5346BOOLEAN
5347FORCEINLINE
5348InterlockedBitTestAndComplement_Inline (
5349 __inout __drv_interlocked LONG volatile *Base,
5350 __in LONG Bit
5351 )
5352{
5353 LONG tBit;
5354
5355 tBit = 1<<(Bit & (sizeof (*Base)*8-1));
5356 return (BOOLEAN) ((InterlockedXor (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);
5357}
5358
5359#endif
5360
5361#if !defined (InterlockedBitTestAndComplement64)
5362
5363#define InterlockedBitTestAndComplement64 InterlockedBitTestAndComplement64_Inline
5364
5365BOOLEAN
5366FORCEINLINE
5367InterlockedBitTestAndComplement64_Inline (
5368 __inout __drv_interlocked LONG64 volatile *Base,
5369 __in LONG64 Bit
5370 )
5371{
5372 LONG64 tBit;
5373
5374 tBit = 1i64<<(Bit & (sizeof (*Base)*8-1));
5375 return (BOOLEAN) ((InterlockedXor64 (&Base[Bit/(sizeof (*Base)*8)], tBit)&tBit) != 0);
5376}
5377
5378#endif
5379
5380#ifdef __cplusplus
5381}
5382#endif
5383
5384#endif /* defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS) */
5385
5386
5387#if !defined(__midl) && !defined(GENUTIL) && !defined(_GENIA64_) && defined(_IA64_)
5388
5389void * __cdecl _rdteb(void);
5390void * __cdecl _rdtebex(void);
5391#ifdef _M_IA64
5392
5393#pragma intrinsic(_rdteb)
5394// _rdtebex() is a kernel safe version of _rdteb()
5395#pragma intrinsic(_rdtebex)
5396#define NtCurrentTeb() ((struct _TEB *)_rdtebex())
5397
5398//
5399// Define functions to get the address of the current fiber and the
5400// current fiber data.
5401//
5402
5403#define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)
5404#define GetFiberData() (*(PVOID *)(GetCurrentFiber()))
5405
5406
5407// begin_ntddk
5408
5409#ifdef __cplusplus
5410extern "C" {
5411#endif
5412
5413// end_ntddk
5414// begin_wdm
5415
5416#if defined(_IA64_) && defined(_M_IA64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
5417
5418void
5419__break(
5420 __in int StIIM
5421 );
5422
5423#pragma intrinsic (__break)
5424
5425#define BREAK_DEBUG_BASE 0x080000
5426#define ASSERT_BREAKPOINT (BREAK_DEBUG_BASE+3) // Cause a STATUS_ASSERTION_FAILURE exception to be raised.
5427
5428__analysis_noreturn
5429FORCEINLINE
5430VOID
5431DbgRaiseAssertionFailure (
5432 VOID
5433 )
5434
5435{
5436 __break(ASSERT_BREAKPOINT);
5437}
5438
5439#endif
5440
5441// end_wdm
5442// begin_ntddk
5443
5444void
5445__yield(
5446 void
5447 );
5448
5449void
5450__mf(
5451 void
5452 );
5453
5454void
5455__lfetch(
5456 int Level,
5457 __in volatile VOID CONST *Address
5458 );
5459
5460void
5461__lfetchfault(
5462 __in int Level,
5463 __in volatile VOID CONST *Address
5464 );
5465
5466void
5467__lfetch_excl(
5468 __in int Level,
5469 __in volatile VOID CONST *Address
5470 );
5471
5472void
5473__lfetchfault_excl(
5474 __in int Level,
5475 __in volatile VOID CONST *Address
5476 );
5477
5478//
5479// __lfetch control defines.
5480//
5481
5482#define MD_LFHINT_NONE 0x00
5483#define MD_LFHINT_NT1 0x01
5484#define MD_LFHINT_NT2 0x02
5485#define MD_LFHINT_NTA 0x03
5486
5487#pragma intrinsic (__yield)
5488#pragma intrinsic (__lfetch)
5489#pragma intrinsic (__lfetchfault)
5490#pragma intrinsic (__lfetchfault_excl)
5491#pragma intrinsic (__lfetch_excl)
5492#pragma intrinsic (__mf)
5493
5494//
5495// Define function to read the value of the time stamp counter
5496//
5497// N.B. The register number for the time stamp counter is CV_IA64_ApITC which
5498// is 3116.
5499//
5500
5501#define ReadTimeStampCounter() __getReg(3116)
5502
5503unsigned __int64
5504__getReg (
5505 __in int Number
5506 );
5507
5508#pragma intrinsic(__getReg)
5509
5510#define YieldProcessor __yield
5511#define MemoryBarrier __mf
5512#define PreFetchCacheLine __lfetch
5513#define PrefetchForWrite(p)
5514#define ReadForWriteAccess(p) (__lfetch_excl(MD_LFHINT_NONE, (p)), (*(p)))
5515
5516
5517//
5518// PreFetchCacheLine level defines.
5519//
5520
5521#define PF_TEMPORAL_LEVEL_1 MD_LFHINT_NONE
5522#define PF_TEMPORAL_LEVEL_2 MD_LFHINT_NT1
5523#define PF_TEMPORAL_LEVEL_3 MD_LFHINT_NT2
5524#define PF_NON_TEMPORAL_LEVEL_ALL MD_LFHINT_NTA
5525
5526//
5527// Define functions to capture the high 64-bits of a 128-bit multiply.
5528//
5529
5530#define UnsignedMultiplyHigh __UMULH
5531
5532ULONGLONG
5533UnsignedMultiplyHigh (
5534 __in ULONGLONG Multiplier,
5535 __in ULONGLONG Multiplicand
5536 );
5537
5538#pragma intrinsic(__UMULH)
5539
5540#if (_MSC_VER >= 1400)
5541
5542#define UnsignedMultiply128 _umul128
5543
5544DWORD64
5545UnsignedMultiply128 (
5546 __in unsigned __int64 Multiplier,
5547 __in unsigned __int64 Multiplicand,
5548 __out __deref_out_range(==,Multiplier * Multiplicand) unsigned __int64 *HighProduct
5549 );
5550
5551#pragma intrinsic(_umul128)
5552
5553#endif
5554
5555#ifdef __cplusplus
5556}
5557#endif
5558
5559// end_ntddk
5560
5561#else
5562struct _TEB *
5563NtCurrentTeb(void);
5564#endif
5565
5566#endif // !defined(__midl) && !defined(GENUTIL) && !defined(_GENIA64_) && defined(_M_IA64)
5567
5568#ifdef _IA64_
5569
5570// begin_ntddk
5571
5572//
5573// The following values specify the type of failing access when the status is
5574// STATUS_ACCESS_VIOLATION and the first parameter in the exception record.
5575//
5576
5577#define EXCEPTION_READ_FAULT 0 // Access violation was caused by a read
5578#define EXCEPTION_WRITE_FAULT 1 // Access violation was caused by a write
5579#define EXCEPTION_EXECUTE_FAULT 2 // Access violation was caused by an instruction fetch
5580
5581//
5582// The following flags control the contents of the CONTEXT structure.
5583//
5584
5585#if !defined(RC_INVOKED)
5586
5587#define CONTEXT_IA64 0x00080000
5588
5589#define CONTEXT_CONTROL (CONTEXT_IA64 | 0x00000001L)
5590#define CONTEXT_LOWER_FLOATING_POINT (CONTEXT_IA64 | 0x00000002L)
5591#define CONTEXT_HIGHER_FLOATING_POINT (CONTEXT_IA64 | 0x00000004L)
5592#define CONTEXT_INTEGER (CONTEXT_IA64 | 0x00000008L)
5593#define CONTEXT_DEBUG (CONTEXT_IA64 | 0x00000010L)
5594#define CONTEXT_IA32_CONTROL (CONTEXT_IA64 | 0x00000020L) // Includes StIPSR
5595
5596
5597#define CONTEXT_FLOATING_POINT (CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT)
5598#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_IA32_CONTROL)
5599#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_DEBUG | CONTEXT_IA32_CONTROL)
5600
5601#define CONTEXT_EXCEPTION_ACTIVE 0x8000000
5602#define CONTEXT_SERVICE_ACTIVE 0x10000000
5603#define CONTEXT_EXCEPTION_REQUEST 0x40000000
5604#define CONTEXT_EXCEPTION_REPORTING 0x80000000
5605
5606#endif // !defined(RC_INVOKED)
5607
5608//
5609// Context Frame
5610//
5611// This frame has a several purposes: 1) it is used as an argument to
5612// NtContinue, 2) it is used to construct a call frame for APC delivery,
5613// 3) it is used to construct a call frame for exception dispatching
5614// in user mode, 4) it is used in the user level thread creation
5615// routines, and 5) it is used to to pass thread state to debuggers.
5616//
5617// N.B. Because this record is used as a call frame, it must be EXACTLY
5618// a multiple of 16 bytes in length and aligned on a 16-byte boundary.
5619//
5620
5621typedef struct _CONTEXT {
5622
5623 //
5624 // The flags values within this flag control the contents of
5625 // a CONTEXT record.
5626 //
5627 // If the context record is used as an input parameter, then
5628 // for each portion of the context record controlled by a flag
5629 // whose value is set, it is assumed that that portion of the
5630 // context record contains valid context. If the context record
5631 // is being used to modify a thread's context, then only that
5632 // portion of the threads context will be modified.
5633 //
5634 // If the context record is used as an __inout parameter to capture
5635 // the context of a thread, then only those portions of the thread's
5636 // context corresponding to set flags will be returned.
5637 //
5638 // The context record is never used as an __out only parameter.
5639 //
5640
5641 DWORD ContextFlags;
5642 DWORD Fill1[3]; // for alignment of following on 16-byte boundary
5643
5644 //
5645 // This section is specified/returned if the ContextFlags word contains
5646 // the flag CONTEXT_DEBUG.
5647 //
5648 // N.B. CONTEXT_DEBUG is *not* part of CONTEXT_FULL.
5649 //
5650
5651 ULONGLONG DbI0;
5652 ULONGLONG DbI1;
5653 ULONGLONG DbI2;
5654 ULONGLONG DbI3;
5655 ULONGLONG DbI4;
5656 ULONGLONG DbI5;
5657 ULONGLONG DbI6;
5658 ULONGLONG DbI7;
5659
5660 ULONGLONG DbD0;
5661 ULONGLONG DbD1;
5662 ULONGLONG DbD2;
5663 ULONGLONG DbD3;
5664 ULONGLONG DbD4;
5665 ULONGLONG DbD5;
5666 ULONGLONG DbD6;
5667 ULONGLONG DbD7;
5668
5669 //
5670 // This section is specified/returned if the ContextFlags word contains
5671 // the flag CONTEXT_LOWER_FLOATING_POINT.
5672 //
5673
5674 FLOAT128 FltS0;
5675 FLOAT128 FltS1;
5676 FLOAT128 FltS2;
5677 FLOAT128 FltS3;
5678 FLOAT128 FltT0;
5679 FLOAT128 FltT1;
5680 FLOAT128 FltT2;
5681 FLOAT128 FltT3;
5682 FLOAT128 FltT4;
5683 FLOAT128 FltT5;
5684 FLOAT128 FltT6;
5685 FLOAT128 FltT7;
5686 FLOAT128 FltT8;
5687 FLOAT128 FltT9;
5688
5689 //
5690 // This section is specified/returned if the ContextFlags word contains
5691 // the flag CONTEXT_HIGHER_FLOATING_POINT.
5692 //
5693
5694 FLOAT128 FltS4;
5695 FLOAT128 FltS5;
5696 FLOAT128 FltS6;
5697 FLOAT128 FltS7;
5698 FLOAT128 FltS8;
5699 FLOAT128 FltS9;
5700 FLOAT128 FltS10;
5701 FLOAT128 FltS11;
5702 FLOAT128 FltS12;
5703 FLOAT128 FltS13;
5704 FLOAT128 FltS14;
5705 FLOAT128 FltS15;
5706 FLOAT128 FltS16;
5707 FLOAT128 FltS17;
5708 FLOAT128 FltS18;
5709 FLOAT128 FltS19;
5710
5711 FLOAT128 FltF32;
5712 FLOAT128 FltF33;
5713 FLOAT128 FltF34;
5714 FLOAT128 FltF35;
5715 FLOAT128 FltF36;
5716 FLOAT128 FltF37;
5717 FLOAT128 FltF38;
5718 FLOAT128 FltF39;
5719
5720 FLOAT128 FltF40;
5721 FLOAT128 FltF41;
5722 FLOAT128 FltF42;
5723 FLOAT128 FltF43;
5724 FLOAT128 FltF44;
5725 FLOAT128 FltF45;
5726 FLOAT128 FltF46;
5727 FLOAT128 FltF47;
5728 FLOAT128 FltF48;
5729 FLOAT128 FltF49;
5730
5731 FLOAT128 FltF50;
5732 FLOAT128 FltF51;
5733 FLOAT128 FltF52;
5734 FLOAT128 FltF53;
5735 FLOAT128 FltF54;
5736 FLOAT128 FltF55;
5737 FLOAT128 FltF56;
5738 FLOAT128 FltF57;
5739 FLOAT128 FltF58;
5740 FLOAT128 FltF59;
5741
5742 FLOAT128 FltF60;
5743 FLOAT128 FltF61;
5744 FLOAT128 FltF62;
5745 FLOAT128 FltF63;
5746 FLOAT128 FltF64;
5747 FLOAT128 FltF65;
5748 FLOAT128 FltF66;
5749 FLOAT128 FltF67;
5750 FLOAT128 FltF68;
5751 FLOAT128 FltF69;
5752
5753 FLOAT128 FltF70;
5754 FLOAT128 FltF71;
5755 FLOAT128 FltF72;
5756 FLOAT128 FltF73;
5757 FLOAT128 FltF74;
5758 FLOAT128 FltF75;
5759 FLOAT128 FltF76;
5760 FLOAT128 FltF77;
5761 FLOAT128 FltF78;
5762 FLOAT128 FltF79;
5763
5764 FLOAT128 FltF80;
5765 FLOAT128 FltF81;
5766 FLOAT128 FltF82;
5767 FLOAT128 FltF83;
5768 FLOAT128 FltF84;
5769 FLOAT128 FltF85;
5770 FLOAT128 FltF86;
5771 FLOAT128 FltF87;
5772 FLOAT128 FltF88;
5773 FLOAT128 FltF89;
5774
5775 FLOAT128 FltF90;
5776 FLOAT128 FltF91;
5777 FLOAT128 FltF92;
5778 FLOAT128 FltF93;
5779 FLOAT128 FltF94;
5780 FLOAT128 FltF95;
5781 FLOAT128 FltF96;
5782 FLOAT128 FltF97;
5783 FLOAT128 FltF98;
5784 FLOAT128 FltF99;
5785
5786 FLOAT128 FltF100;
5787 FLOAT128 FltF101;
5788 FLOAT128 FltF102;
5789 FLOAT128 FltF103;
5790 FLOAT128 FltF104;
5791 FLOAT128 FltF105;
5792 FLOAT128 FltF106;
5793 FLOAT128 FltF107;
5794 FLOAT128 FltF108;
5795 FLOAT128 FltF109;
5796
5797 FLOAT128 FltF110;
5798 FLOAT128 FltF111;
5799 FLOAT128 FltF112;
5800 FLOAT128 FltF113;
5801 FLOAT128 FltF114;
5802 FLOAT128 FltF115;
5803 FLOAT128 FltF116;
5804 FLOAT128 FltF117;
5805 FLOAT128 FltF118;
5806 FLOAT128 FltF119;
5807
5808 FLOAT128 FltF120;
5809 FLOAT128 FltF121;
5810 FLOAT128 FltF122;
5811 FLOAT128 FltF123;
5812 FLOAT128 FltF124;
5813 FLOAT128 FltF125;
5814 FLOAT128 FltF126;
5815 FLOAT128 FltF127;
5816
5817 //
5818 // This section is specified/returned if the ContextFlags word contains
5819 // the flag CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT | CONTEXT_CONTROL.
5820 //
5821
5822 ULONGLONG StFPSR; // FP status
5823
5824 //
5825 // This section is specified/returned if the ContextFlags word contains
5826 // the flag CONTEXT_INTEGER.
5827 //
5828 // N.B. The registers gp, sp, rp are part of the control context
5829 //
5830
5831 ULONGLONG IntGp; // r1, volatile
5832 ULONGLONG IntT0; // r2-r3, volatile
5833 ULONGLONG IntT1; //
5834 ULONGLONG IntS0; // r4-r7, preserved
5835 ULONGLONG IntS1;
5836 ULONGLONG IntS2;
5837 ULONGLONG IntS3;
5838 ULONGLONG IntV0; // r8, volatile
5839 ULONGLONG IntT2; // r9-r11, volatile
5840 ULONGLONG IntT3;
5841 ULONGLONG IntT4;
5842 ULONGLONG IntSp; // stack pointer (r12), special
5843 ULONGLONG IntTeb; // teb (r13), special
5844 ULONGLONG IntT5; // r14-r31, volatile
5845 ULONGLONG IntT6;
5846 ULONGLONG IntT7;
5847 ULONGLONG IntT8;
5848 ULONGLONG IntT9;
5849 ULONGLONG IntT10;
5850 ULONGLONG IntT11;
5851 ULONGLONG IntT12;
5852 ULONGLONG IntT13;
5853 ULONGLONG IntT14;
5854 ULONGLONG IntT15;
5855 ULONGLONG IntT16;
5856 ULONGLONG IntT17;
5857 ULONGLONG IntT18;
5858 ULONGLONG IntT19;
5859 ULONGLONG IntT20;
5860 ULONGLONG IntT21;
5861 ULONGLONG IntT22;
5862
5863 ULONGLONG IntNats; // Nat bits for r1-r31
5864 // r1-r31 in bits 1 thru 31.
5865 ULONGLONG Preds; // predicates, preserved
5866
5867 ULONGLONG BrRp; // return pointer, b0, preserved
5868 ULONGLONG BrS0; // b1-b5, preserved
5869 ULONGLONG BrS1;
5870 ULONGLONG BrS2;
5871 ULONGLONG BrS3;
5872 ULONGLONG BrS4;
5873 ULONGLONG BrT0; // b6-b7, volatile
5874 ULONGLONG BrT1;
5875
5876 //
5877 // This section is specified/returned if the ContextFlags word contains
5878 // the flag CONTEXT_CONTROL.
5879 //
5880
5881 // Other application registers
5882 ULONGLONG ApUNAT; // User Nat collection register, preserved
5883 ULONGLONG ApLC; // Loop counter register, preserved
5884 ULONGLONG ApEC; // Epilog counter register, preserved
5885 ULONGLONG ApCCV; // CMPXCHG value register, volatile
5886 ULONGLONG ApDCR; // Default control register (TBD)
5887
5888 // Register stack info
5889 ULONGLONG RsPFS; // Previous function state, preserved
5890 ULONGLONG RsBSP; // Backing store pointer, preserved
5891 ULONGLONG RsBSPSTORE;
5892 ULONGLONG RsRSC; // RSE configuration, volatile
5893 ULONGLONG RsRNAT; // RSE Nat collection register, preserved
5894
5895 // Trap Status Information
5896 ULONGLONG StIPSR; // Interruption Processor Status
5897 ULONGLONG StIIP; // Interruption IP
5898 ULONGLONG StIFS; // Interruption Function State
5899
5900 // iA32 related control registers
5901 ULONGLONG StFCR; // copy of Ar21
5902 ULONGLONG Eflag; // Eflag copy of Ar24
5903 ULONGLONG SegCSD; // iA32 CSDescriptor (Ar25)
5904 ULONGLONG SegSSD; // iA32 SSDescriptor (Ar26)
5905 ULONGLONG Cflag; // Cr0+Cr4 copy of Ar27
5906 ULONGLONG StFSR; // x86 FP status (copy of AR28)
5907 ULONGLONG StFIR; // x86 FP status (copy of AR29)
5908 ULONGLONG StFDR; // x86 FP status (copy of AR30)
5909
5910 ULONGLONG UNUSEDPACK; // added to pack StFDR to 16-bytes
5911
5912} CONTEXT, *PCONTEXT;
5913
5914//
5915// Plabel descriptor structure definition
5916//
5917
5918typedef struct _PLABEL_DESCRIPTOR {
5919 ULONGLONG EntryPoint;
5920 ULONGLONG GlobalPointer;
5921} PLABEL_DESCRIPTOR, *PPLABEL_DESCRIPTOR;
5922
5923//
5924// Function table entry structure definition.
5925//
5926
5927typedef struct _RUNTIME_FUNCTION {
5928 DWORD BeginAddress;
5929 DWORD EndAddress;
5930 DWORD UnwindInfoAddress;
5931} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
5932
5933//
5934// Define unwind history table structure.
5935//
5936
5937#define UNWIND_HISTORY_TABLE_SIZE 12
5938
5939typedef struct _UNWIND_HISTORY_TABLE_ENTRY {
5940 DWORD64 ImageBase;
5941 DWORD64 Gp;
5942 PRUNTIME_FUNCTION FunctionEntry;
5943} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
5944
5945typedef struct _UNWIND_HISTORY_TABLE {
5946 DWORD Count;
5947 BYTE LocalHint;
5948 BYTE GlobalHint;
5949 BYTE Search;
5950 BYTE Once;
5951 DWORD64 LowAddress;
5952 DWORD64 HighAddress;
5953 UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
5954} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
5955
5956//
5957// Define dynamic function table entry.
5958//
5959
5960typedef
5961__drv_functionClass(GET_RUNTIME_FUNCTION_CALLBACK)
5962PRUNTIME_FUNCTION
5963GET_RUNTIME_FUNCTION_CALLBACK (
5964 __in DWORD64 ControlPc,
5965 __in_opt PVOID Context
5966 );
5967typedef GET_RUNTIME_FUNCTION_CALLBACK *PGET_RUNTIME_FUNCTION_CALLBACK;
5968
5969typedef
5970__drv_functionClass(OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK)
5971__checkReturn
5972DWORD
5973OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK (
5974 __in HANDLE Process,
5975 __in PVOID TableAddress,
5976 __out PDWORD Entries,
5977 __deref_out PRUNTIME_FUNCTION* Functions
5978 );
5979typedef OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK *POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK;
5980
5981#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME \
5982 "OutOfProcessFunctionTableCallback"
5983
5984__drv_maxIRQL(PASSIVE_LEVEL)
5985__success(return!=0)
5986NTSYSAPI
5987BOOLEAN
5988NTAPI
5989RtlAddFunctionTable(
5990 __in_ecount(EntryCount) PRUNTIME_FUNCTION FunctionTable,
5991 __in DWORD EntryCount,
5992 __in ULONGLONG BaseAddress,
5993 __in ULONGLONG TargetGp
5994 );
5995
5996__drv_maxIRQL(PASSIVE_LEVEL)
5997__success(return!=0)
5998NTSYSAPI
5999BOOLEAN
6000NTAPI
6001RtlInstallFunctionTableCallback (
6002 __in DWORD64 TableIdentifier,
6003 __in DWORD64 BaseAddress,
6004 __in DWORD Length,
6005 __in DWORD64 TargetGp,
6006 __in PGET_RUNTIME_FUNCTION_CALLBACK Callback,
6007 __in_opt PVOID Context,
6008 __in_opt PCWSTR OutOfProcessCallbackDll
6009 );
6010
6011__drv_maxIRQL(PASSIVE_LEVEL)
6012__success(return!=0)
6013NTSYSAPI
6014BOOLEAN
6015NTAPI
6016RtlDeleteFunctionTable (
6017 __in PRUNTIME_FUNCTION FunctionTable
6018 );
6019
6020__drv_maxIRQL(SYNCH_LEVEL)
6021__drv_minIRQL(PASSIVE_LEVEL)
6022NTSYSAPI
6023PRUNTIME_FUNCTION
6024NTAPI
6025RtlLookupFunctionEntry (
6026 __in ULONGLONG ControlPc,
6027 __out PULONGLONG ImageBase,
6028 __out PULONGLONG TargetGp
6029 );
6030
6031//
6032// Nonvolatile context pointer record.
6033//
6034// The IA64 architecture currently doesn't have any nonvolatile kernel context
6035// as we capture everything in either the trap or exception frames on
6036// transition from user to kernel mode. We allocate a single bogus
6037// pointer field as usually this structure is made up of pointers to
6038// places in the kernel stack where the various nonvolatile items were
6039// pushed on to the kernel stack.
6040//
6041// TBD *** Need to fill in this structure with the relevant fields
6042// when we start storing the nonvolatile information only when
6043// necessary.
6044//
6045
6046typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
6047 PFLOAT128 FltS0;
6048 PFLOAT128 FltS1;
6049 PFLOAT128 FltS2;
6050 PFLOAT128 FltS3;
6051 PFLOAT128 HighFloatingContext[10];
6052 PFLOAT128 FltS4;
6053 PFLOAT128 FltS5;
6054 PFLOAT128 FltS6;
6055 PFLOAT128 FltS7;
6056 PFLOAT128 FltS8;
6057 PFLOAT128 FltS9;
6058 PFLOAT128 FltS10;
6059 PFLOAT128 FltS11;
6060 PFLOAT128 FltS12;
6061 PFLOAT128 FltS13;
6062 PFLOAT128 FltS14;
6063 PFLOAT128 FltS15;
6064 PFLOAT128 FltS16;
6065 PFLOAT128 FltS17;
6066 PFLOAT128 FltS18;
6067 PFLOAT128 FltS19;
6068
6069 PULONGLONG IntS0;
6070 PULONGLONG IntS1;
6071 PULONGLONG IntS2;
6072 PULONGLONG IntS3;
6073 PULONGLONG IntSp;
6074 PULONGLONG IntS0Nat;
6075 PULONGLONG IntS1Nat;
6076 PULONGLONG IntS2Nat;
6077 PULONGLONG IntS3Nat;
6078 PULONGLONG IntSpNat;
6079
6080 PULONGLONG Preds;
6081
6082 PULONGLONG BrRp;
6083 PULONGLONG BrS0;
6084 PULONGLONG BrS1;
6085 PULONGLONG BrS2;
6086 PULONGLONG BrS3;
6087 PULONGLONG BrS4;
6088
6089 PULONGLONG ApUNAT;
6090 PULONGLONG ApLC;
6091 PULONGLONG ApEC;
6092 PULONGLONG RsPFS;
6093
6094 PULONGLONG StFSR;
6095 PULONGLONG StFIR;
6096 PULONGLONG StFDR;
6097 PULONGLONG Cflag;
6098
6099 PULONGLONG StFPSR;
6100
6101} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
6102
6103typedef struct _FRAME_POINTERS {
6104 ULONGLONG MemoryStackFp;
6105 ULONGLONG BackingStoreFp;
6106} FRAME_POINTERS, *PFRAME_POINTERS;
6107
6108NTSYSAPI
6109ULONGLONG
6110NTAPI
6111RtlVirtualUnwind (
6112 __in ULONGLONG ImageBase,
6113 __in ULONGLONG ControlPc,
6114 __in PRUNTIME_FUNCTION FunctionEntry,
6115 __inout PCONTEXT ContextRecord,
6116 __out PBOOLEAN InFunction,
6117 __out PFRAME_POINTERS EstablisherFrame,
6118 __inout_opt PKNONVOLATILE_CONTEXT_POINTERS ContextPointers
6119 );
6120
6121NTSYSAPI
6122VOID
6123NTAPI
6124RtlRestoreContext (
6125 __in PCONTEXT ContextRecord,
6126 __in_opt struct _EXCEPTION_RECORD *ExceptionRecord
6127 );
6128
6129NTSYSAPI
6130VOID
6131NTAPI
6132__jump_unwind (
6133 ULONGLONG TargetMsFrame,
6134 ULONGLONG TargetBsFrame,
6135 ULONGLONG TargetPc
6136 );
6137
6138#endif // _IA64_
6139
6140
6141#if !defined(RC_INVOKED)
6142
6143#define WOW64_CONTEXT_i386 0x00010000 // this assumes that i386 and
6144#define WOW64_CONTEXT_i486 0x00010000 // i486 have identical context records
6145
6146#define WOW64_CONTEXT_CONTROL (WOW64_CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
6147#define WOW64_CONTEXT_INTEGER (WOW64_CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
6148#define WOW64_CONTEXT_SEGMENTS (WOW64_CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
6149#define WOW64_CONTEXT_FLOATING_POINT (WOW64_CONTEXT_i386 | 0x00000008L) // 387 state
6150#define WOW64_CONTEXT_DEBUG_REGISTERS (WOW64_CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
6151#define WOW64_CONTEXT_EXTENDED_REGISTERS (WOW64_CONTEXT_i386 | 0x00000020L) // cpu specific extensions
6152
6153#define WOW64_CONTEXT_FULL (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS)
6154
6155#define WOW64_CONTEXT_ALL (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS | \
6156 WOW64_CONTEXT_FLOATING_POINT | WOW64_CONTEXT_DEBUG_REGISTERS | \
6157 WOW64_CONTEXT_EXTENDED_REGISTERS)
6158
6159#define WOW64_CONTEXT_XSTATE (WOW64_CONTEXT_i386 | 0x00000040L)
6160
6161#endif // !defined(RC_INVOKED)
6162
6163//
6164// Define the size of the 80387 save area, which is in the context frame.
6165//
6166
6167#define WOW64_SIZE_OF_80387_REGISTERS 80
6168
6169#define WOW64_MAXIMUM_SUPPORTED_EXTENSION 512
6170
6171typedef struct _WOW64_FLOATING_SAVE_AREA {
6172 DWORD ControlWord;
6173 DWORD StatusWord;
6174 DWORD TagWord;
6175 DWORD ErrorOffset;
6176 DWORD ErrorSelector;
6177 DWORD DataOffset;
6178 DWORD DataSelector;
6179 BYTE RegisterArea[WOW64_SIZE_OF_80387_REGISTERS];
6180 DWORD Cr0NpxState;
6181} WOW64_FLOATING_SAVE_AREA;
6182
6183typedef WOW64_FLOATING_SAVE_AREA *PWOW64_FLOATING_SAVE_AREA;
6184
6185#include "pshpack4.h"
6186
6187//
6188// Context Frame
6189//
6190// This frame has a several purposes: 1) it is used as an argument to
6191// NtContinue, 2) is is used to constuct a call frame for APC delivery,
6192// and 3) it is used in the user level thread creation routines.
6193//
6194// The layout of the record conforms to a standard call frame.
6195//
6196
6197typedef struct _WOW64_CONTEXT {
6198
6199 //
6200 // The flags values within this flag control the contents of
6201 // a CONTEXT record.
6202 //
6203 // If the context record is used as an input parameter, then
6204 // for each portion of the context record controlled by a flag
6205 // whose value is set, it is assumed that that portion of the
6206 // context record contains valid context. If the context record
6207 // is being used to modify a threads context, then only that
6208 // portion of the threads context will be modified.
6209 //
6210 // If the context record is used as an IN OUT parameter to capture
6211 // the context of a thread, then only those portions of the thread's
6212 // context corresponding to set flags will be returned.
6213 //
6214 // The context record is never used as an OUT only parameter.
6215 //
6216
6217 DWORD ContextFlags;
6218
6219 //
6220 // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
6221 // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
6222 // included in CONTEXT_FULL.
6223 //
6224
6225 DWORD Dr0;
6226 DWORD Dr1;
6227 DWORD Dr2;
6228 DWORD Dr3;
6229 DWORD Dr6;
6230 DWORD Dr7;
6231
6232 //
6233 // This section is specified/returned if the
6234 // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
6235 //
6236
6237 WOW64_FLOATING_SAVE_AREA FloatSave;
6238
6239 //
6240 // This section is specified/returned if the
6241 // ContextFlags word contians the flag CONTEXT_SEGMENTS.
6242 //
6243
6244 DWORD SegGs;
6245 DWORD SegFs;
6246 DWORD SegEs;
6247 DWORD SegDs;
6248
6249 //
6250 // This section is specified/returned if the
6251 // ContextFlags word contians the flag CONTEXT_INTEGER.
6252 //
6253
6254 DWORD Edi;
6255 DWORD Esi;
6256 DWORD Ebx;
6257 DWORD Edx;
6258 DWORD Ecx;
6259 DWORD Eax;
6260
6261 //
6262 // This section is specified/returned if the
6263 // ContextFlags word contians the flag CONTEXT_CONTROL.
6264 //
6265
6266 DWORD Ebp;
6267 DWORD Eip;
6268 DWORD SegCs; // MUST BE SANITIZED
6269 DWORD EFlags; // MUST BE SANITIZED
6270 DWORD Esp;
6271 DWORD SegSs;
6272
6273 //
6274 // This section is specified/returned if the ContextFlags word
6275 // contains the flag CONTEXT_EXTENDED_REGISTERS.
6276 // The format and contexts are processor specific
6277 //
6278
6279 BYTE ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
6280
6281} WOW64_CONTEXT;
6282
6283typedef WOW64_CONTEXT *PWOW64_CONTEXT;
6284
6285#include "poppack.h"
6286
6287
6288typedef struct _WOW64_LDT_ENTRY {
6289 WORD LimitLow;
6290 WORD BaseLow;
6291 union {
6292 struct {
6293 BYTE BaseMid;
6294 BYTE Flags1; // Declare as bytes to avoid alignment
6295 BYTE Flags2; // Problems.
6296 BYTE BaseHi;
6297 } Bytes;
6298 struct {
6299 DWORD BaseMid : 8;
6300 DWORD Type : 5;
6301 DWORD Dpl : 2;
6302 DWORD Pres : 1;
6303 DWORD LimitHi : 4;
6304 DWORD Sys : 1;
6305 DWORD Reserved_0 : 1;
6306 DWORD Default_Big : 1;
6307 DWORD Granularity : 1;
6308 DWORD BaseHi : 8;
6309 } Bits;
6310 } HighWord;
6311} WOW64_LDT_ENTRY, *PWOW64_LDT_ENTRY;
6312
6313typedef struct _WOW64_DESCRIPTOR_TABLE_ENTRY {
6314 DWORD Selector;
6315 WOW64_LDT_ENTRY Descriptor;
6316} WOW64_DESCRIPTOR_TABLE_ENTRY, *PWOW64_DESCRIPTOR_TABLE_ENTRY;
6317
6318#define EXCEPTION_NONCONTINUABLE 0x1 // Noncontinuable exception
6319#define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters
6320
6321//
6322// Exception record definition.
6323//
6324
6325typedef struct _EXCEPTION_RECORD {
6326 DWORD ExceptionCode;
6327 DWORD ExceptionFlags;
6328 struct _EXCEPTION_RECORD *ExceptionRecord;
6329 PVOID ExceptionAddress;
6330 DWORD NumberParameters;
6331 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
6332 } EXCEPTION_RECORD;
6333
6334typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
6335
6336typedef struct _EXCEPTION_RECORD32 {
6337 DWORD ExceptionCode;
6338 DWORD ExceptionFlags;
6339 DWORD ExceptionRecord;
6340 DWORD ExceptionAddress;
6341 DWORD NumberParameters;
6342 DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
6343} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
6344
6345typedef struct _EXCEPTION_RECORD64 {
6346 DWORD ExceptionCode;
6347 DWORD ExceptionFlags;
6348 DWORD64 ExceptionRecord;
6349 DWORD64 ExceptionAddress;
6350 DWORD NumberParameters;
6351 DWORD __unusedAlignment;
6352 DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
6353} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
6354
6355//
6356// Typedef for pointer returned by exception_info()
6357//
6358
6359typedef struct _EXCEPTION_POINTERS {
6360 PEXCEPTION_RECORD ExceptionRecord;
6361 PCONTEXT ContextRecord;
6362} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
6363
6364// end_wdm
6365
6366NTSYSAPI
6367VOID
6368NTAPI
6369RtlUnwind (
6370 __in_opt PVOID TargetFrame,
6371 __in_opt PVOID TargetIp,
6372 __in_opt PEXCEPTION_RECORD ExceptionRecord,
6373 __in PVOID ReturnValue
6374 );
6375
6376#if defined(_IA64_)
6377
6378NTSYSAPI
6379VOID
6380NTAPI
6381RtlUnwind2 (
6382 __in_opt FRAME_POINTERS TargetFrame,
6383 __in_opt PVOID TargetIp,
6384 __in_opt PEXCEPTION_RECORD ExceptionRecord,
6385 __in PVOID ReturnValue,
6386 __in PCONTEXT ContextRecord
6387 );
6388
6389#endif
6390
6391#if defined(_AMD64_)
6392
6393NTSYSAPI
6394VOID
6395NTAPI
6396RtlUnwindEx (
6397 __in_opt PVOID TargetFrame,
6398 __in_opt PVOID TargetIp,
6399 __in_opt PEXCEPTION_RECORD ExceptionRecord,
6400 __in PVOID ReturnValue,
6401 __in PCONTEXT ContextRecord,
6402 __in_opt PUNWIND_HISTORY_TABLE HistoryTable
6403 );
6404
6405#elif defined(_IA64_)
6406
6407NTSYSAPI
6408VOID
6409NTAPI
6410RtlUnwindEx (
6411 __in_opt FRAME_POINTERS TargetFrame,
6412 __in_opt PVOID TargetIp,
6413 __in_opt PEXCEPTION_RECORD ExceptionRecord,
6414 __in PVOID ReturnValue,
6415 __in PCONTEXT ContextRecord,
6416 __in_opt PUNWIND_HISTORY_TABLE HistoryTable
6417 );
6418
6419#endif
6420
6421typedef PVOID PACCESS_TOKEN;
6422typedef PVOID PSECURITY_DESCRIPTOR;
6423typedef PVOID PSID;
6424////////////////////////////////////////////////////////////////////////
6425// //
6426// ACCESS MASK //
6427// //
6428////////////////////////////////////////////////////////////////////////
6429
6430//
6431// Define the access mask as a longword sized structure divided up as
6432// follows:
6433//
6434// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
6435// 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
6436// +---------------+---------------+-------------------------------+
6437// |G|G|G|G|Res'd|A| StandardRights| SpecificRights |
6438// |R|W|E|A| |S| | |
6439// +-+-------------+---------------+-------------------------------+
6440//
6441// typedef struct _ACCESS_MASK {
6442// WORD SpecificRights;
6443// BYTE StandardRights;
6444// BYTE AccessSystemAcl : 1;
6445// BYTE Reserved : 3;
6446// BYTE GenericAll : 1;
6447// BYTE GenericExecute : 1;
6448// BYTE GenericWrite : 1;
6449// BYTE GenericRead : 1;
6450// } ACCESS_MASK;
6451// typedef ACCESS_MASK *PACCESS_MASK;
6452//
6453// but to make life simple for programmer's we'll allow them to specify
6454// a desired access mask by simply OR'ing together mulitple single rights
6455// and treat an access mask as a DWORD. For example
6456//
6457// DesiredAccess = DELETE | READ_CONTROL
6458//
6459// So we'll declare ACCESS_MASK as DWORD
6460//
6461
6462// begin_wdm
6463typedef DWORD ACCESS_MASK;
6464typedef ACCESS_MASK *PACCESS_MASK;
6465
6466////////////////////////////////////////////////////////////////////////
6467// //
6468// ACCESS TYPES //
6469// //
6470////////////////////////////////////////////////////////////////////////
6471
6472
6473// begin_wdm
6474//
6475// The following are masks for the predefined standard access types
6476//
6477
6478#define DELETE (0x00010000L)
6479#define READ_CONTROL (0x00020000L)
6480#define WRITE_DAC (0x00040000L)
6481#define WRITE_OWNER (0x00080000L)
6482#define SYNCHRONIZE (0x00100000L)
6483
6484#define STANDARD_RIGHTS_REQUIRED (0x000F0000L)
6485
6486#define STANDARD_RIGHTS_READ (READ_CONTROL)
6487#define STANDARD_RIGHTS_WRITE (READ_CONTROL)
6488#define STANDARD_RIGHTS_EXECUTE (READ_CONTROL)
6489
6490#define STANDARD_RIGHTS_ALL (0x001F0000L)
6491
6492#define SPECIFIC_RIGHTS_ALL (0x0000FFFFL)
6493
6494//
6495// AccessSystemAcl access type
6496//
6497
6498#define ACCESS_SYSTEM_SECURITY (0x01000000L)
6499
6500//
6501// MaximumAllowed access type
6502//
6503
6504#define MAXIMUM_ALLOWED (0x02000000L)
6505
6506//
6507// These are the generic rights.
6508//
6509
6510#define GENERIC_READ (0x80000000L)
6511#define GENERIC_WRITE (0x40000000L)
6512#define GENERIC_EXECUTE (0x20000000L)
6513#define GENERIC_ALL (0x10000000L)
6514
6515
6516//
6517// Define the generic mapping array. This is used to denote the
6518// mapping of each generic access right to a specific access mask.
6519//
6520
6521typedef struct _GENERIC_MAPPING {
6522 ACCESS_MASK GenericRead;
6523 ACCESS_MASK GenericWrite;
6524 ACCESS_MASK GenericExecute;
6525 ACCESS_MASK GenericAll;
6526} GENERIC_MAPPING;
6527typedef GENERIC_MAPPING *PGENERIC_MAPPING;
6528
6529
6530
6531////////////////////////////////////////////////////////////////////////
6532// //
6533// LUID_AND_ATTRIBUTES //
6534// //
6535////////////////////////////////////////////////////////////////////////
6536//
6537//
6538
6539
6540#include <pshpack4.h>
6541
6542typedef struct _LUID_AND_ATTRIBUTES {
6543 LUID Luid;
6544 DWORD Attributes;
6545 } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
6546typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
6547typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
6548
6549#include <poppack.h>
6550
6551
6552////////////////////////////////////////////////////////////////////////
6553// //
6554// Security Id (SID) //
6555// //
6556////////////////////////////////////////////////////////////////////////
6557//
6558//
6559// Pictorially the structure of an SID is as follows:
6560//
6561// 1 1 1 1 1 1
6562// 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
6563// +---------------------------------------------------------------+
6564// | SubAuthorityCount |Reserved1 (SBZ)| Revision |
6565// +---------------------------------------------------------------+
6566// | IdentifierAuthority[0] |
6567// +---------------------------------------------------------------+
6568// | IdentifierAuthority[1] |
6569// +---------------------------------------------------------------+
6570// | IdentifierAuthority[2] |
6571// +---------------------------------------------------------------+
6572// | |
6573// +- - - - - - - - SubAuthority[] - - - - - - - - -+
6574// | |
6575// +---------------------------------------------------------------+
6576//
6577//
6578
6579
6580// begin_ntifs
6581
6582#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
6583#define SID_IDENTIFIER_AUTHORITY_DEFINED
6584typedef struct _SID_IDENTIFIER_AUTHORITY {
6585 BYTE Value[6];
6586} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
6587#endif
6588
6589
6590#ifndef SID_DEFINED
6591#define SID_DEFINED
6592typedef struct _SID {
6593 BYTE Revision;
6594 BYTE SubAuthorityCount;
6595 SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
6596#ifdef MIDL_PASS
6597 [size_is(SubAuthorityCount)] DWORD SubAuthority[*];
6598#else // MIDL_PASS
6599 DWORD SubAuthority[ANYSIZE_ARRAY];
6600#endif // MIDL_PASS
6601} SID, *PISID;
6602#endif
6603
6604#define SID_REVISION (1) // Current revision level
6605#define SID_MAX_SUB_AUTHORITIES (15)
6606#define SID_RECOMMENDED_SUB_AUTHORITIES (1) // Will change to around 6
6607
6608 // in a future release.
6609#ifndef MIDL_PASS
6610#define SECURITY_MAX_SID_SIZE \
6611 (sizeof(SID) - sizeof(DWORD) + (SID_MAX_SUB_AUTHORITIES * sizeof(DWORD)))
6612#endif // MIDL_PASS
6613
6614
6615typedef enum _SID_NAME_USE {
6616 SidTypeUser = 1,
6617 SidTypeGroup,
6618 SidTypeDomain,
6619 SidTypeAlias,
6620 SidTypeWellKnownGroup,
6621 SidTypeDeletedAccount,
6622 SidTypeInvalid,
6623 SidTypeUnknown,
6624 SidTypeComputer,
6625 SidTypeLabel
6626} SID_NAME_USE, *PSID_NAME_USE;
6627
6628typedef struct _SID_AND_ATTRIBUTES {
6629#ifdef MIDL_PASS
6630 PISID Sid;
6631#else // MIDL_PASS
6632 PSID Sid;
6633#endif // MIDL_PASS
6634 DWORD Attributes;
6635 } SID_AND_ATTRIBUTES, * PSID_AND_ATTRIBUTES;
6636
6637typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
6638typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
6639
6640#define SID_HASH_SIZE 32
6641typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY;
6642
6643typedef struct _SID_AND_ATTRIBUTES_HASH {
6644 DWORD SidCount;
6645 PSID_AND_ATTRIBUTES SidAttr;
6646 SID_HASH_ENTRY Hash[SID_HASH_SIZE];
6647} SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;
6648
6649
6650/////////////////////////////////////////////////////////////////////////////
6651// //
6652// Universal well-known SIDs //
6653// //
6654// Null SID S-1-0-0 //
6655// World S-1-1-0 //
6656// Local S-1-2-0 //
6657// Creator Owner ID S-1-3-0 //
6658// Creator Group ID S-1-3-1 //
6659// Creator Owner Server ID S-1-3-2 //
6660// Creator Group Server ID S-1-3-3 //
6661// //
6662// (Non-unique IDs) S-1-4 //
6663// //
6664/////////////////////////////////////////////////////////////////////////////
6665
6666#define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0}
6667#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1}
6668#define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2}
6669#define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3}
6670#define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4}
6671#define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}
6672
6673
6674#define SECURITY_NULL_RID (0x00000000L)
6675#define SECURITY_WORLD_RID (0x00000000L)
6676#define SECURITY_LOCAL_RID (0x00000000L)
6677#define SECURITY_LOCAL_LOGON_RID (0x00000001L)
6678
6679#define SECURITY_CREATOR_OWNER_RID (0x00000000L)
6680#define SECURITY_CREATOR_GROUP_RID (0x00000001L)
6681
6682#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
6683#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
6684
6685#define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L)
6686
6687///////////////////////////////////////////////////////////////////////////////
6688// //
6689// NT well-known SIDs //
6690// //
6691// NT Authority S-1-5 //
6692// Dialup S-1-5-1 //
6693// //
6694// Network S-1-5-2 //
6695// Batch S-1-5-3 //
6696// Interactive S-1-5-4 //
6697// (Logon IDs) S-1-5-5-X-Y //
6698// Service S-1-5-6 //
6699// AnonymousLogon S-1-5-7 (aka null logon session) //
6700// Proxy S-1-5-8 //
6701// Enterprise DC (EDC) S-1-5-9 (aka domain controller account) //
6702// Self S-1-5-10 (self RID) //
6703// Authenticated User S-1-5-11 (Authenticated user somewhere) //
6704// Restricted Code S-1-5-12 (Running restricted code) //
6705// Terminal Server S-1-5-13 (Running on Terminal Server) //
6706// Remote Logon S-1-5-14 (Remote Interactive Logon) //
6707// This Organization S-1-5-15 //
6708// //
6709// IUser S-1-5-17
6710// Local System S-1-5-18 //
6711// Local Service S-1-5-19 //
6712// Network Service S-1-5-20 //
6713// //
6714// (NT non-unique IDs) S-1-5-0x15-... (NT Domain Sids) //
6715// //
6716// (Built-in domain) S-1-5-0x20 //
6717// //
6718// (Security Package IDs) S-1-5-0x40 //
6719// NTLM Authentication S-1-5-0x40-10 //
6720// SChannel Authentication S-1-5-0x40-14 //
6721// Digest Authentication S-1-5-0x40-21 //
6722// //
6723// Other Organization S-1-5-1000 (>=1000 can not be filtered) //
6724// //
6725// //
6726// NOTE: the relative identifier values (RIDs) determine which security //
6727// boundaries the SID is allowed to cross. Before adding new RIDs, //
6728// a determination needs to be made regarding which range they should //
6729// be added to in order to ensure proper "SID filtering" //
6730// //
6731///////////////////////////////////////////////////////////////////////////////
6732
6733
6734#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5} // ntifs
6735
6736#define SECURITY_DIALUP_RID (0x00000001L)
6737#define SECURITY_NETWORK_RID (0x00000002L)
6738#define SECURITY_BATCH_RID (0x00000003L)
6739#define SECURITY_INTERACTIVE_RID (0x00000004L)
6740#define SECURITY_LOGON_IDS_RID (0x00000005L)
6741#define SECURITY_LOGON_IDS_RID_COUNT (3L)
6742#define SECURITY_SERVICE_RID (0x00000006L)
6743#define SECURITY_ANONYMOUS_LOGON_RID (0x00000007L)
6744#define SECURITY_PROXY_RID (0x00000008L)
6745#define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)
6746#define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID
6747#define SECURITY_PRINCIPAL_SELF_RID (0x0000000AL)
6748#define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)
6749#define SECURITY_RESTRICTED_CODE_RID (0x0000000CL)
6750#define SECURITY_TERMINAL_SERVER_RID (0x0000000DL)
6751#define SECURITY_REMOTE_LOGON_RID (0x0000000EL)
6752#define SECURITY_THIS_ORGANIZATION_RID (0x0000000FL)
6753#define SECURITY_IUSER_RID (0x00000011L)
6754#define SECURITY_LOCAL_SYSTEM_RID (0x00000012L)
6755#define SECURITY_LOCAL_SERVICE_RID (0x00000013L)
6756#define SECURITY_NETWORK_SERVICE_RID (0x00000014L)
6757
6758#define SECURITY_NT_NON_UNIQUE (0x00000015L)
6759#define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT (3L)
6760
6761#define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)
6762
6763#define SECURITY_BUILTIN_DOMAIN_RID (0x00000020L)
6764#define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)
6765
6766
6767#define SECURITY_PACKAGE_BASE_RID (0x00000040L)
6768#define SECURITY_PACKAGE_RID_COUNT (2L)
6769#define SECURITY_PACKAGE_NTLM_RID (0x0000000AL)
6770#define SECURITY_PACKAGE_SCHANNEL_RID (0x0000000EL)
6771#define SECURITY_PACKAGE_DIGEST_RID (0x00000015L)
6772
6773#define SECURITY_CRED_TYPE_BASE_RID (0x00000041L)
6774#define SECURITY_CRED_TYPE_RID_COUNT (2L)
6775#define SECURITY_CRED_TYPE_THIS_ORG_CERT_RID (0x00000001L)
6776
6777#define SECURITY_MIN_BASE_RID (0x00000050L)
6778
6779#define SECURITY_SERVICE_ID_BASE_RID (0x00000050L)
6780#define SECURITY_SERVICE_ID_RID_COUNT (6L)
6781
6782#define SECURITY_RESERVED_ID_BASE_RID (0x00000051L)
6783
6784#define SECURITY_APPPOOL_ID_BASE_RID (0x00000052L)
6785#define SECURITY_APPPOOL_ID_RID_COUNT (6L)
6786
6787#define SECURITY_VIRTUALSERVER_ID_BASE_RID (0x00000053L)
6788#define SECURITY_VIRTUALSERVER_ID_RID_COUNT (6L)
6789
6790#define SECURITY_USERMODEDRIVERHOST_ID_BASE_RID (0x00000054L)
6791#define SECURITY_USERMODEDRIVERHOST_ID_RID_COUNT (6L)
6792
6793#define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_BASE_RID (0x00000055L)
6794#define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_RID_COUNT (6L)
6795
6796#define SECURITY_WMIHOST_ID_BASE_RID (0x00000056L)
6797#define SECURITY_WMIHOST_ID_RID_COUNT (6L)
6798
6799#define SECURITY_TASK_ID_BASE_RID (0x00000057L)
6800
6801#define SECURITY_NFS_ID_BASE_RID (0x00000058L)
6802
6803#define SECURITY_COM_ID_BASE_RID (0x00000059L)
6804
6805#define SECURITY_VIRTUALACCOUNT_ID_RID_COUNT (6L)
6806
6807#define SECURITY_MAX_BASE_RID (0x0000006FL)
6808#define SECURITY_MAX_ALWAYS_FILTERED (0x000003E7L)
6809#define SECURITY_MIN_NEVER_FILTERED (0x000003E8L)
6810
6811#define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)
6812
6813//
6814//Service SID type RIDs are in the range 0x50- 0x6F. Therefore, we are giving the next available RID to Windows Mobile team.
6815//
6816#define SECURITY_WINDOWSMOBILE_ID_BASE_RID (0x00000070L)
6817
6818
6819/////////////////////////////////////////////////////////////////////////////
6820// //
6821// well-known domain relative sub-authority values (RIDs)... //
6822// //
6823/////////////////////////////////////////////////////////////////////////////
6824
6825
6826
6827#define DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS (0x000001F2L)
6828
6829#define FOREST_USER_RID_MAX (0x000001F3L)
6830
6831// Well-known users ...
6832
6833#define DOMAIN_USER_RID_ADMIN (0x000001F4L)
6834#define DOMAIN_USER_RID_GUEST (0x000001F5L)
6835#define DOMAIN_USER_RID_KRBTGT (0x000001F6L)
6836
6837#define DOMAIN_USER_RID_MAX (0x000003E7L)
6838
6839
6840// well-known groups ...
6841
6842#define DOMAIN_GROUP_RID_ADMINS (0x00000200L)
6843#define DOMAIN_GROUP_RID_USERS (0x00000201L)
6844#define DOMAIN_GROUP_RID_GUESTS (0x00000202L)
6845#define DOMAIN_GROUP_RID_COMPUTERS (0x00000203L)
6846#define DOMAIN_GROUP_RID_CONTROLLERS (0x00000204L)
6847#define DOMAIN_GROUP_RID_CERT_ADMINS (0x00000205L)
6848#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)
6849#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)
6850#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)
6851#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)
6852
6853// well-known aliases ...
6854
6855#define DOMAIN_ALIAS_RID_ADMINS (0x00000220L)
6856#define DOMAIN_ALIAS_RID_USERS (0x00000221L)
6857#define DOMAIN_ALIAS_RID_GUESTS (0x00000222L)
6858#define DOMAIN_ALIAS_RID_POWER_USERS (0x00000223L)
6859
6860#define DOMAIN_ALIAS_RID_ACCOUNT_OPS (0x00000224L)
6861#define DOMAIN_ALIAS_RID_SYSTEM_OPS (0x00000225L)
6862#define DOMAIN_ALIAS_RID_PRINT_OPS (0x00000226L)
6863#define DOMAIN_ALIAS_RID_BACKUP_OPS (0x00000227L)
6864
6865#define DOMAIN_ALIAS_RID_REPLICATOR (0x00000228L)
6866#define DOMAIN_ALIAS_RID_RAS_SERVERS (0x00000229L)
6867#define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS (0x0000022AL)
6868#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS (0x0000022BL)
6869#define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS (0x0000022CL)
6870#define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)
6871
6872#define DOMAIN_ALIAS_RID_MONITORING_USERS (0x0000022EL)
6873#define DOMAIN_ALIAS_RID_LOGGING_USERS (0x0000022FL)
6874#define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS (0x00000230L)
6875#define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS (0x00000231L)
6876#define DOMAIN_ALIAS_RID_DCOM_USERS (0x00000232L)
6877#define DOMAIN_ALIAS_RID_IUSERS (0x00000238L)
6878#define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS (0x00000239L)
6879#define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP (0x0000023BL)
6880#define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)
6881#define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP (0x0000023DL)
6882#define DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP (0x0000023EL)
6883
6884
6885#define SECURITY_MANDATORY_LABEL_AUTHORITY {0,0,0,0,0,16}
6886#define SECURITY_MANDATORY_UNTRUSTED_RID (0x00000000L)
6887#define SECURITY_MANDATORY_LOW_RID (0x00001000L)
6888#define SECURITY_MANDATORY_MEDIUM_RID (0x00002000L)
6889#define SECURITY_MANDATORY_MEDIUM_PLUS_RID (SECURITY_MANDATORY_MEDIUM_RID + 0x100)
6890#define SECURITY_MANDATORY_HIGH_RID (0x00003000L)
6891#define SECURITY_MANDATORY_SYSTEM_RID (0x00004000L)
6892#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID (0x00005000L)
6893
6894//
6895// SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that
6896// can be set by a usermode caller.
6897//
6898
6899#define SECURITY_MANDATORY_MAXIMUM_USER_RID SECURITY_MANDATORY_SYSTEM_RID
6900
6901#define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)
6902
6903
6904
6905//
6906// Well known SID definitions for lookup.
6907//
6908
6909typedef enum {
6910
6911 WinNullSid = 0,
6912 WinWorldSid = 1,
6913 WinLocalSid = 2,
6914 WinCreatorOwnerSid = 3,
6915 WinCreatorGroupSid = 4,
6916 WinCreatorOwnerServerSid = 5,
6917 WinCreatorGroupServerSid = 6,
6918 WinNtAuthoritySid = 7,
6919 WinDialupSid = 8,
6920 WinNetworkSid = 9,
6921 WinBatchSid = 10,
6922 WinInteractiveSid = 11,
6923 WinServiceSid = 12,
6924 WinAnonymousSid = 13,
6925 WinProxySid = 14,
6926 WinEnterpriseControllersSid = 15,
6927 WinSelfSid = 16,
6928 WinAuthenticatedUserSid = 17,
6929 WinRestrictedCodeSid = 18,
6930 WinTerminalServerSid = 19,
6931 WinRemoteLogonIdSid = 20,
6932 WinLogonIdsSid = 21,
6933 WinLocalSystemSid = 22,
6934 WinLocalServiceSid = 23,
6935 WinNetworkServiceSid = 24,
6936 WinBuiltinDomainSid = 25,
6937 WinBuiltinAdministratorsSid = 26,
6938 WinBuiltinUsersSid = 27,
6939 WinBuiltinGuestsSid = 28,
6940 WinBuiltinPowerUsersSid = 29,
6941 WinBuiltinAccountOperatorsSid = 30,
6942 WinBuiltinSystemOperatorsSid = 31,
6943 WinBuiltinPrintOperatorsSid = 32,
6944 WinBuiltinBackupOperatorsSid = 33,
6945 WinBuiltinReplicatorSid = 34,
6946 WinBuiltinPreWindows2000CompatibleAccessSid = 35,
6947 WinBuiltinRemoteDesktopUsersSid = 36,
6948 WinBuiltinNetworkConfigurationOperatorsSid = 37,
6949 WinAccountAdministratorSid = 38,
6950 WinAccountGuestSid = 39,
6951 WinAccountKrbtgtSid = 40,
6952 WinAccountDomainAdminsSid = 41,
6953 WinAccountDomainUsersSid = 42,
6954 WinAccountDomainGuestsSid = 43,
6955 WinAccountComputersSid = 44,
6956 WinAccountControllersSid = 45,
6957 WinAccountCertAdminsSid = 46,
6958 WinAccountSchemaAdminsSid = 47,
6959 WinAccountEnterpriseAdminsSid = 48,
6960 WinAccountPolicyAdminsSid = 49,
6961 WinAccountRasAndIasServersSid = 50,
6962 WinNTLMAuthenticationSid = 51,
6963 WinDigestAuthenticationSid = 52,
6964 WinSChannelAuthenticationSid = 53,
6965 WinThisOrganizationSid = 54,
6966 WinOtherOrganizationSid = 55,
6967 WinBuiltinIncomingForestTrustBuildersSid = 56,
6968 WinBuiltinPerfMonitoringUsersSid = 57,
6969 WinBuiltinPerfLoggingUsersSid = 58,
6970 WinBuiltinAuthorizationAccessSid = 59,
6971 WinBuiltinTerminalServerLicenseServersSid = 60,
6972 WinBuiltinDCOMUsersSid = 61,
6973 WinBuiltinIUsersSid = 62,
6974 WinIUserSid = 63,
6975 WinBuiltinCryptoOperatorsSid = 64,
6976 WinUntrustedLabelSid = 65,
6977 WinLowLabelSid = 66,
6978 WinMediumLabelSid = 67,
6979 WinHighLabelSid = 68,
6980 WinSystemLabelSid = 69,
6981 WinWriteRestrictedCodeSid = 70,
6982 WinCreatorOwnerRightsSid = 71,
6983 WinCacheablePrincipalsGroupSid = 72,
6984 WinNonCacheablePrincipalsGroupSid = 73,
6985 WinEnterpriseReadonlyControllersSid = 74,
6986 WinAccountReadonlyControllersSid = 75,
6987 WinBuiltinEventLogReadersGroup = 76,
6988 WinNewEnterpriseReadonlyControllersSid = 77,
6989 WinBuiltinCertSvcDComAccessGroup = 78,
6990 WinMediumPlusLabelSid = 79,
6991 WinLocalLogonSid = 80,
6992 WinConsoleLogonSid = 81,
6993 WinThisOrganizationCertificateSid = 82,
6994} WELL_KNOWN_SID_TYPE;
6995
6996//
6997// Allocate the System Luid. The first 1000 LUIDs are reserved.
6998// Use #999 here (0x3e7 = 999)
6999//
7000
7001#define SYSTEM_LUID { 0x3e7, 0x0 }
7002#define ANONYMOUS_LOGON_LUID { 0x3e6, 0x0 }
7003#define LOCALSERVICE_LUID { 0x3e5, 0x0 }
7004#define NETWORKSERVICE_LUID { 0x3e4, 0x0 }
7005#define IUSER_LUID { 0x3e3, 0x0 }
7006
7007// end_ntifs
7008
7009////////////////////////////////////////////////////////////////////////
7010// //
7011// User and Group related SID attributes //
7012// //
7013////////////////////////////////////////////////////////////////////////
7014
7015//
7016// Group attributes
7017//
7018
7019#define SE_GROUP_MANDATORY (0x00000001L)
7020#define SE_GROUP_ENABLED_BY_DEFAULT (0x00000002L)
7021#define SE_GROUP_ENABLED (0x00000004L)
7022#define SE_GROUP_OWNER (0x00000008L)
7023#define SE_GROUP_USE_FOR_DENY_ONLY (0x00000010L)
7024#define SE_GROUP_INTEGRITY (0x00000020L)
7025#define SE_GROUP_INTEGRITY_ENABLED (0x00000040L)
7026#define SE_GROUP_LOGON_ID (0xC0000000L)
7027#define SE_GROUP_RESOURCE (0x20000000L)
7028
7029#define SE_GROUP_VALID_ATTRIBUTES (SE_GROUP_MANDATORY | \
7030 SE_GROUP_ENABLED_BY_DEFAULT | \
7031 SE_GROUP_ENABLED | \
7032 SE_GROUP_OWNER | \
7033 SE_GROUP_USE_FOR_DENY_ONLY | \
7034 SE_GROUP_LOGON_ID | \
7035 SE_GROUP_RESOURCE | \
7036 SE_GROUP_INTEGRITY | \
7037 SE_GROUP_INTEGRITY_ENABLED)
7038
7039//
7040// User attributes
7041//
7042
7043// (None yet defined.)
7044
7045
7046
7047
7048////////////////////////////////////////////////////////////////////////
7049// //
7050// ACL and ACE //
7051// //
7052////////////////////////////////////////////////////////////////////////
7053
7054//
7055// Define an ACL and the ACE format. The structure of an ACL header
7056// followed by one or more ACEs. Pictorally the structure of an ACL header
7057// is as follows:
7058//
7059// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7060// 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
7061// +-------------------------------+---------------+---------------+
7062// | AclSize | Sbz1 | AclRevision |
7063// +-------------------------------+---------------+---------------+
7064// | Sbz2 | AceCount |
7065// +-------------------------------+-------------------------------+
7066//
7067// The current AclRevision is defined to be ACL_REVISION.
7068//
7069// AclSize is the size, in bytes, allocated for the ACL. This includes
7070// the ACL header, ACES, and remaining free space in the buffer.
7071//
7072// AceCount is the number of ACES in the ACL.
7073//
7074
7075// begin_wdm
7076// This is the *current* ACL revision
7077
7078#define ACL_REVISION (2)
7079#define ACL_REVISION_DS (4)
7080
7081// This is the history of ACL revisions. Add a new one whenever
7082// ACL_REVISION is updated
7083
7084#define ACL_REVISION1 (1)
7085#define MIN_ACL_REVISION ACL_REVISION2
7086#define ACL_REVISION2 (2)
7087#define ACL_REVISION3 (3)
7088#define ACL_REVISION4 (4)
7089#define MAX_ACL_REVISION ACL_REVISION4
7090
7091typedef struct _ACL {
7092 BYTE AclRevision;
7093 BYTE Sbz1;
7094 WORD AclSize;
7095 WORD AceCount;
7096 WORD Sbz2;
7097} ACL;
7098typedef ACL *PACL;
7099
7100// end_wdm
7101// begin_ntifs
7102
7103//
7104// The structure of an ACE is a common ace header followed by ace type
7105// specific data. Pictorally the structure of the common ace header is
7106// as follows:
7107//
7108// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7109// 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
7110// +---------------+-------+-------+---------------+---------------+
7111// | AceSize | AceFlags | AceType |
7112// +---------------+-------+-------+---------------+---------------+
7113//
7114// AceType denotes the type of the ace, there are some predefined ace
7115// types
7116//
7117// AceSize is the size, in bytes, of ace.
7118//
7119// AceFlags are the Ace flags for audit and inheritance, defined shortly.
7120
7121typedef struct _ACE_HEADER {
7122 BYTE AceType;
7123 BYTE AceFlags;
7124 WORD AceSize;
7125} ACE_HEADER;
7126typedef ACE_HEADER *PACE_HEADER;
7127
7128//
7129// The following are the predefined ace types that go into the AceType
7130// field of an Ace header.
7131//
7132
7133#define ACCESS_MIN_MS_ACE_TYPE (0x0)
7134#define ACCESS_ALLOWED_ACE_TYPE (0x0)
7135#define ACCESS_DENIED_ACE_TYPE (0x1)
7136#define SYSTEM_AUDIT_ACE_TYPE (0x2)
7137#define SYSTEM_ALARM_ACE_TYPE (0x3)
7138#define ACCESS_MAX_MS_V2_ACE_TYPE (0x3)
7139
7140#define ACCESS_ALLOWED_COMPOUND_ACE_TYPE (0x4)
7141#define ACCESS_MAX_MS_V3_ACE_TYPE (0x4)
7142
7143#define ACCESS_MIN_MS_OBJECT_ACE_TYPE (0x5)
7144#define ACCESS_ALLOWED_OBJECT_ACE_TYPE (0x5)
7145#define ACCESS_DENIED_OBJECT_ACE_TYPE (0x6)
7146#define SYSTEM_AUDIT_OBJECT_ACE_TYPE (0x7)
7147#define SYSTEM_ALARM_OBJECT_ACE_TYPE (0x8)
7148#define ACCESS_MAX_MS_OBJECT_ACE_TYPE (0x8)
7149
7150#define ACCESS_MAX_MS_V4_ACE_TYPE (0x8)
7151#define ACCESS_MAX_MS_ACE_TYPE (0x8)
7152
7153#define ACCESS_ALLOWED_CALLBACK_ACE_TYPE (0x9)
7154#define ACCESS_DENIED_CALLBACK_ACE_TYPE (0xA)
7155#define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)
7156#define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE (0xC)
7157#define SYSTEM_AUDIT_CALLBACK_ACE_TYPE (0xD)
7158#define SYSTEM_ALARM_CALLBACK_ACE_TYPE (0xE)
7159#define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE (0xF)
7160#define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE (0x10)
7161
7162#define SYSTEM_MANDATORY_LABEL_ACE_TYPE (0x11)
7163#define ACCESS_MAX_MS_V5_ACE_TYPE (0x11)
7164
7165
7166//
7167// The following are the inherit flags that go into the AceFlags field
7168// of an Ace header.
7169//
7170
7171#define OBJECT_INHERIT_ACE (0x1)
7172#define CONTAINER_INHERIT_ACE (0x2)
7173#define NO_PROPAGATE_INHERIT_ACE (0x4)
7174#define INHERIT_ONLY_ACE (0x8)
7175#define INHERITED_ACE (0x10)
7176#define VALID_INHERIT_FLAGS (0x1F)
7177
7178
7179// The following are the currently defined ACE flags that go into the
7180// AceFlags field of an ACE header. Each ACE type has its own set of
7181// AceFlags.
7182//
7183// SUCCESSFUL_ACCESS_ACE_FLAG - used only with system audit and alarm ACE
7184// types to indicate that a message is generated for successful accesses.
7185//
7186// FAILED_ACCESS_ACE_FLAG - used only with system audit and alarm ACE types
7187// to indicate that a message is generated for failed accesses.
7188//
7189
7190//
7191// SYSTEM_AUDIT and SYSTEM_ALARM AceFlags
7192//
7193// These control the signaling of audit and alarms for success or failure.
7194//
7195
7196#define SUCCESSFUL_ACCESS_ACE_FLAG (0x40)
7197#define FAILED_ACCESS_ACE_FLAG (0x80)
7198
7199
7200//
7201// We'll define the structure of the predefined ACE types. Pictorally
7202// the structure of the predefined ACE's is as follows:
7203//
7204// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7205// 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
7206// +---------------+-------+-------+---------------+---------------+
7207// | AceFlags | Resd |Inherit| AceSize | AceType |
7208// +---------------+-------+-------+---------------+---------------+
7209// | Mask |
7210// +---------------------------------------------------------------+
7211// | |
7212// + +
7213// | |
7214// + Sid +
7215// | |
7216// + +
7217// | |
7218// +---------------------------------------------------------------+
7219//
7220// Mask is the access mask associated with the ACE. This is either the
7221// access allowed, access denied, audit, or alarm mask.
7222//
7223// Sid is the Sid associated with the ACE.
7224//
7225
7226// The following are the four predefined ACE types.
7227
7228// Examine the AceType field in the Header to determine
7229// which structure is appropriate to use for casting.
7230
7231
7232typedef struct _ACCESS_ALLOWED_ACE {
7233 ACE_HEADER Header;
7234 ACCESS_MASK Mask;
7235 DWORD SidStart;
7236} ACCESS_ALLOWED_ACE;
7237
7238typedef ACCESS_ALLOWED_ACE *PACCESS_ALLOWED_ACE;
7239
7240typedef struct _ACCESS_DENIED_ACE {
7241 ACE_HEADER Header;
7242 ACCESS_MASK Mask;
7243 DWORD SidStart;
7244} ACCESS_DENIED_ACE;
7245typedef ACCESS_DENIED_ACE *PACCESS_DENIED_ACE;
7246
7247typedef struct _SYSTEM_AUDIT_ACE {
7248 ACE_HEADER Header;
7249 ACCESS_MASK Mask;
7250 DWORD SidStart;
7251} SYSTEM_AUDIT_ACE;
7252typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;
7253
7254typedef struct _SYSTEM_ALARM_ACE {
7255 ACE_HEADER Header;
7256 ACCESS_MASK Mask;
7257 DWORD SidStart;
7258} SYSTEM_ALARM_ACE;
7259typedef SYSTEM_ALARM_ACE *PSYSTEM_ALARM_ACE;
7260
7261typedef struct _SYSTEM_MANDATORY_LABEL_ACE {
7262 ACE_HEADER Header;
7263 ACCESS_MASK Mask;
7264 DWORD SidStart;
7265} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
7266
7267#define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP 0x1
7268#define SYSTEM_MANDATORY_LABEL_NO_READ_UP 0x2
7269#define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP 0x4
7270
7271#define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP | \
7272 SYSTEM_MANDATORY_LABEL_NO_READ_UP | \
7273 SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)
7274// end_ntifs
7275
7276
7277typedef struct _ACCESS_ALLOWED_OBJECT_ACE {
7278 ACE_HEADER Header;
7279 ACCESS_MASK Mask;
7280 DWORD Flags;
7281 GUID ObjectType;
7282 GUID InheritedObjectType;
7283 DWORD SidStart;
7284} ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;
7285
7286typedef struct _ACCESS_DENIED_OBJECT_ACE {
7287 ACE_HEADER Header;
7288 ACCESS_MASK Mask;
7289 DWORD Flags;
7290 GUID ObjectType;
7291 GUID InheritedObjectType;
7292 DWORD SidStart;
7293} ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;
7294
7295typedef struct _SYSTEM_AUDIT_OBJECT_ACE {
7296 ACE_HEADER Header;
7297 ACCESS_MASK Mask;
7298 DWORD Flags;
7299 GUID ObjectType;
7300 GUID InheritedObjectType;
7301 DWORD SidStart;
7302} SYSTEM_AUDIT_OBJECT_ACE, *PSYSTEM_AUDIT_OBJECT_ACE;
7303
7304typedef struct _SYSTEM_ALARM_OBJECT_ACE {
7305 ACE_HEADER Header;
7306 ACCESS_MASK Mask;
7307 DWORD Flags;
7308 GUID ObjectType;
7309 GUID InheritedObjectType;
7310 DWORD SidStart;
7311} SYSTEM_ALARM_OBJECT_ACE, *PSYSTEM_ALARM_OBJECT_ACE;
7312
7313//
7314// Callback ace support in post Win2000.
7315// Resource managers can put their own data after Sidstart + Length of the sid
7316//
7317
7318typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {
7319 ACE_HEADER Header;
7320 ACCESS_MASK Mask;
7321 DWORD SidStart;
7322 // Opaque resouce manager specific data
7323} ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;
7324
7325typedef struct _ACCESS_DENIED_CALLBACK_ACE {
7326 ACE_HEADER Header;
7327 ACCESS_MASK Mask;
7328 DWORD SidStart;
7329 // Opaque resouce manager specific data
7330} ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;
7331
7332typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {
7333 ACE_HEADER Header;
7334 ACCESS_MASK Mask;
7335 DWORD SidStart;
7336 // Opaque resouce manager specific data
7337} SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;
7338
7339typedef struct _SYSTEM_ALARM_CALLBACK_ACE {
7340 ACE_HEADER Header;
7341 ACCESS_MASK Mask;
7342 DWORD SidStart;
7343 // Opaque resouce manager specific data
7344} SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;
7345
7346typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
7347 ACE_HEADER Header;
7348 ACCESS_MASK Mask;
7349 DWORD Flags;
7350 GUID ObjectType;
7351 GUID InheritedObjectType;
7352 DWORD SidStart;
7353 // Opaque resouce manager specific data
7354} ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;
7355
7356typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {
7357 ACE_HEADER Header;
7358 ACCESS_MASK Mask;
7359 DWORD Flags;
7360 GUID ObjectType;
7361 GUID InheritedObjectType;
7362 DWORD SidStart;
7363 // Opaque resouce manager specific data
7364} ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;
7365
7366typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {
7367 ACE_HEADER Header;
7368 ACCESS_MASK Mask;
7369 DWORD Flags;
7370 GUID ObjectType;
7371 GUID InheritedObjectType;
7372 DWORD SidStart;
7373 // Opaque resouce manager specific data
7374} SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;
7375
7376typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
7377 ACE_HEADER Header;
7378 ACCESS_MASK Mask;
7379 DWORD Flags;
7380 GUID ObjectType;
7381 GUID InheritedObjectType;
7382 DWORD SidStart;
7383 // Opaque resouce manager specific data
7384} SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;
7385
7386//
7387// Currently define Flags for "OBJECT" ACE types.
7388//
7389
7390#define ACE_OBJECT_TYPE_PRESENT 0x1
7391#define ACE_INHERITED_OBJECT_TYPE_PRESENT 0x2
7392
7393
7394//
7395// The following declarations are used for setting and querying information
7396// about and ACL. First are the various information classes available to
7397// the user.
7398//
7399
7400typedef enum _ACL_INFORMATION_CLASS {
7401 AclRevisionInformation = 1,
7402 AclSizeInformation
7403} ACL_INFORMATION_CLASS;
7404
7405//
7406// This record is returned/sent if the user is requesting/setting the
7407// AclRevisionInformation
7408//
7409
7410typedef struct _ACL_REVISION_INFORMATION {
7411 DWORD AclRevision;
7412} ACL_REVISION_INFORMATION;
7413typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;
7414
7415//
7416// This record is returned if the user is requesting AclSizeInformation
7417//
7418
7419typedef struct _ACL_SIZE_INFORMATION {
7420 DWORD AceCount;
7421 DWORD AclBytesInUse;
7422 DWORD AclBytesFree;
7423} ACL_SIZE_INFORMATION;
7424typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;
7425
7426
7427////////////////////////////////////////////////////////////////////////
7428// //
7429// SECURITY_DESCRIPTOR //
7430// //
7431////////////////////////////////////////////////////////////////////////
7432//
7433// Define the Security Descriptor and related data types.
7434// This is an opaque data structure.
7435//
7436
7437// begin_wdm
7438//
7439// Current security descriptor revision value
7440//
7441
7442#define SECURITY_DESCRIPTOR_REVISION (1)
7443#define SECURITY_DESCRIPTOR_REVISION1 (1)
7444
7445// end_wdm
7446// begin_ntifs
7447
7448#define SECURITY_DESCRIPTOR_MIN_LENGTH (sizeof(SECURITY_DESCRIPTOR))
7449
7450
7451typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
7452
7453#define SE_OWNER_DEFAULTED (0x0001)
7454#define SE_GROUP_DEFAULTED (0x0002)
7455#define SE_DACL_PRESENT (0x0004)
7456#define SE_DACL_DEFAULTED (0x0008)
7457#define SE_SACL_PRESENT (0x0010)
7458#define SE_SACL_DEFAULTED (0x0020)
7459#define SE_DACL_AUTO_INHERIT_REQ (0x0100)
7460#define SE_SACL_AUTO_INHERIT_REQ (0x0200)
7461#define SE_DACL_AUTO_INHERITED (0x0400)
7462#define SE_SACL_AUTO_INHERITED (0x0800)
7463#define SE_DACL_PROTECTED (0x1000)
7464#define SE_SACL_PROTECTED (0x2000)
7465#define SE_RM_CONTROL_VALID (0x4000)
7466#define SE_SELF_RELATIVE (0x8000)
7467
7468//
7469// Where:
7470//
7471// SE_OWNER_DEFAULTED - This boolean flag, when set, indicates that the
7472// SID pointed to by the Owner field was provided by a
7473// defaulting mechanism rather than explicitly provided by the
7474// original provider of the security descriptor. This may
7475// affect the treatment of the SID with respect to inheritence
7476// of an owner.
7477//
7478// SE_GROUP_DEFAULTED - This boolean flag, when set, indicates that the
7479// SID in the Group field was provided by a defaulting mechanism
7480// rather than explicitly provided by the original provider of
7481// the security descriptor. This may affect the treatment of
7482// the SID with respect to inheritence of a primary group.
7483//
7484// SE_DACL_PRESENT - This boolean flag, when set, indicates that the
7485// security descriptor contains a discretionary ACL. If this
7486// flag is set and the Dacl field of the SECURITY_DESCRIPTOR is
7487// null, then a null ACL is explicitly being specified.
7488//
7489// SE_DACL_DEFAULTED - This boolean flag, when set, indicates that the
7490// ACL pointed to by the Dacl field was provided by a defaulting
7491// mechanism rather than explicitly provided by the original
7492// provider of the security descriptor. This may affect the
7493// treatment of the ACL with respect to inheritence of an ACL.
7494// This flag is ignored if the DaclPresent flag is not set.
7495//
7496// SE_SACL_PRESENT - This boolean flag, when set, indicates that the
7497// security descriptor contains a system ACL pointed to by the
7498// Sacl field. If this flag is set and the Sacl field of the
7499// SECURITY_DESCRIPTOR is null, then an empty (but present)
7500// ACL is being specified.
7501//
7502// SE_SACL_DEFAULTED - This boolean flag, when set, indicates that the
7503// ACL pointed to by the Sacl field was provided by a defaulting
7504// mechanism rather than explicitly provided by the original
7505// provider of the security descriptor. This may affect the
7506// treatment of the ACL with respect to inheritence of an ACL.
7507// This flag is ignored if the SaclPresent flag is not set.
7508//
7509// SE_SELF_RELATIVE - This boolean flag, when set, indicates that the
7510// security descriptor is in self-relative form. In this form,
7511// all fields of the security descriptor are contiguous in memory
7512// and all pointer fields are expressed as offsets from the
7513// beginning of the security descriptor. This form is useful
7514// for treating security descriptors as opaque data structures
7515// for transmission in communication protocol or for storage on
7516// secondary media.
7517//
7518//
7519//
7520// Pictorially the structure of a security descriptor is as follows:
7521//
7522// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7523// 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
7524// +---------------------------------------------------------------+
7525// | Control |Reserved1 (SBZ)| Revision |
7526// +---------------------------------------------------------------+
7527// | Owner |
7528// +---------------------------------------------------------------+
7529// | Group |
7530// +---------------------------------------------------------------+
7531// | Sacl |
7532// +---------------------------------------------------------------+
7533// | Dacl |
7534// +---------------------------------------------------------------+
7535//
7536// In general, this data structure should be treated opaquely to ensure future
7537// compatibility.
7538//
7539//
7540
7541typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
7542 BYTE Revision;
7543 BYTE Sbz1;
7544 SECURITY_DESCRIPTOR_CONTROL Control;
7545 DWORD Owner;
7546 DWORD Group;
7547 DWORD Sacl;
7548 DWORD Dacl;
7549 } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
7550
7551typedef struct _SECURITY_DESCRIPTOR {
7552 BYTE Revision;
7553 BYTE Sbz1;
7554 SECURITY_DESCRIPTOR_CONTROL Control;
7555 PSID Owner;
7556 PSID Group;
7557 PACL Sacl;
7558 PACL Dacl;
7559
7560 } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
7561
7562// end_ntifs
7563
7564// Where:
7565//
7566// Revision - Contains the revision level of the security
7567// descriptor. This allows this structure to be passed between
7568// systems or stored on disk even though it is expected to
7569// change in the future.
7570//
7571// Control - A set of flags which qualify the meaning of the
7572// security descriptor or individual fields of the security
7573// descriptor.
7574//
7575// Owner - is a pointer to an SID representing an object's owner.
7576// If this field is null, then no owner SID is present in the
7577// security descriptor. If the security descriptor is in
7578// self-relative form, then this field contains an offset to
7579// the SID, rather than a pointer.
7580//
7581// Group - is a pointer to an SID representing an object's primary
7582// group. If this field is null, then no primary group SID is
7583// present in the security descriptor. If the security descriptor
7584// is in self-relative form, then this field contains an offset to
7585// the SID, rather than a pointer.
7586//
7587// Sacl - is a pointer to a system ACL. This field value is only
7588// valid if the DaclPresent control flag is set. If the
7589// SaclPresent flag is set and this field is null, then a null
7590// ACL is specified. If the security descriptor is in
7591// self-relative form, then this field contains an offset to
7592// the ACL, rather than a pointer.
7593//
7594// Dacl - is a pointer to a discretionary ACL. This field value is
7595// only valid if the DaclPresent control flag is set. If the
7596// DaclPresent flag is set and this field is null, then a null
7597// ACL (unconditionally granting access) is specified. If the
7598// security descriptor is in self-relative form, then this field
7599// contains an offset to the ACL, rather than a pointer.
7600//
7601
7602
7603
7604
7605////////////////////////////////////////////////////////////////////////
7606// //
7607// Object Type list for AccessCheckByType //
7608// //
7609////////////////////////////////////////////////////////////////////////
7610
7611typedef struct _OBJECT_TYPE_LIST {
7612 WORD Level;
7613 WORD Sbz;
7614 GUID *ObjectType;
7615} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
7616
7617//
7618// DS values for Level
7619//
7620
7621#define ACCESS_OBJECT_GUID 0
7622#define ACCESS_PROPERTY_SET_GUID 1
7623#define ACCESS_PROPERTY_GUID 2
7624
7625#define ACCESS_MAX_LEVEL 4
7626
7627//
7628// Parameters to NtAccessCheckByTypeAndAditAlarm
7629//
7630
7631typedef enum _AUDIT_EVENT_TYPE {
7632 AuditEventObjectAccess,
7633 AuditEventDirectoryServiceAccess
7634} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
7635
7636#define AUDIT_ALLOW_NO_PRIVILEGE 0x1
7637
7638//
7639// DS values for Source and ObjectTypeName
7640//
7641
7642#define ACCESS_DS_SOURCE_A "DS"
7643#define ACCESS_DS_SOURCE_W L"DS"
7644#define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object"
7645#define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object"
7646
7647////////////////////////////////////////////////////////////////////////
7648// //
7649// Privilege Related Data Structures //
7650// //
7651////////////////////////////////////////////////////////////////////////
7652
7653// end_ntifs
7654// begin_wdm
7655//
7656// Privilege attributes
7657//
7658
7659#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
7660#define SE_PRIVILEGE_ENABLED (0x00000002L)
7661#define SE_PRIVILEGE_REMOVED (0X00000004L)
7662#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
7663
7664#define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
7665 SE_PRIVILEGE_ENABLED | \
7666 SE_PRIVILEGE_REMOVED | \
7667 SE_PRIVILEGE_USED_FOR_ACCESS)
7668
7669
7670//
7671// Privilege Set Control flags
7672//
7673
7674#define PRIVILEGE_SET_ALL_NECESSARY (1)
7675
7676//
7677// Privilege Set - This is defined for a privilege set of one.
7678// If more than one privilege is needed, then this structure
7679// will need to be allocated with more space.
7680//
7681// Note: don't change this structure without fixing the INITIAL_PRIVILEGE_SET
7682// structure (defined in se.h)
7683//
7684
7685typedef struct _PRIVILEGE_SET {
7686 DWORD PrivilegeCount;
7687 DWORD Control;
7688 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
7689 } PRIVILEGE_SET, * PPRIVILEGE_SET;
7690
7691
7692
7693
7694//
7695// Values for different access granted\denied reasons:
7696// AccessReasonAceN = AccessReasonAce + N.
7697// AccessReasonPrivilegeN = AccessReasonPrivilege + N.
7698//
7699
7700#define ACCESS_REASON_TYPE_MASK 0xffff0000
7701#define ACCESS_REASON_DATA_MASK 0x0000ffff
7702
7703typedef enum _ACCESS_REASON_TYPE{
7704
7705 AccessReasonNone = 0x00000000, // Indicate no reason for the bit. The bit may not be checked, or just no known reason.
7706
7707 //
7708 // The lowest 2 bytes store the index of the ACE that grant/deny this bit.
7709 // If the corresponding access maskt is zero, then it is deny ACE; otherwise,
7710 // it is allow ACE.
7711 //
7712 AccessReasonAllowedAce = 0x00010000, // Granted a permission.
7713 AccessReasonDeniedAce = 0x00020000, // Denied a permission.
7714
7715 AccessReasonAllowedParentAce = 0x00030000, // Granted a permission from parent ACE
7716 AccessReasonDeniedParentAce = 0x00040000, // Denied a permission from parent ACE
7717
7718 AccessReasonMissingPrivilege = 0x00100000,
7719 AccessReasonFromPrivilege = 0x00200000,
7720
7721
7722 AccessReasonIntegrityLevel = 0x00300000,
7723
7724 AccessReasonOwnership = 0x00400000,
7725
7726 AccessReasonNullDacl = 0x00500000,
7727 AccessReasonEmptyDacl = 0x00600000,
7728
7729 AccessReasonNoSD = 0x00700000,
7730 AccessReasonNoGrant = 0x00800000 // this access bit is not granted by any ACE.
7731} ACCESS_REASON_TYPE;
7732
7733 //
7734// Structure to hold access denied\granted reason for every bit of ACCESS_MASK.
7735// There are 32-bits in ACCESS_MASK and only 27-bits are actually valid on
7736// return from AccessCheck because MAXIMUM_ALLOWED, GENERIC_READ,
7737// GENERIC_WRITE, GENERIC_EXECUTE, and GENERIC_ALL are never returned.
7738//
7739// The content in Data fields depends on the Access Reason, for example,
7740// if the reason is AccessReasonAce, the Data will be the ACE ID.
7741// If there are more than one reason (more than one bit is set), the array size
7742// of the Data is equal to the number of bits set (or number of reasons).
7743// The Data could be null for a particular reason.
7744//
7745
7746typedef DWORD ACCESS_REASON;
7747
7748typedef struct _ACCESS_REASONS{
7749 ACCESS_REASON Data[32];
7750} ACCESS_REASONS, *PACCESS_REASONS;
7751
7752
7753/*
7754The following data structures are defined to consolidate various falvors of
7755access check functions. In particular for Windows 7, the new access check
7756function will enable security attribute check, plus returning the reason
7757for a access check result.
7758
7759The new access check function based on these data structures will
7760form the foundation to reimplement other flavors of access check
7761functions.
7762
7763*/
7764
7765//
7766// Structure to hold pointer to security descriptor and its unique id, which
7767// can be used for caching access check results.
7768// (NOTE NOTE) The cache key can be constructed by SecurityDescriptorId, Token and
7769// PrincipalSelfSid. Watch how GenericMapping affects the cache results.
7770//
7771#define SE_SECURITY_DESCRIPTOR_FLAG_NO_OWNER_ACE 0x00000001
7772#define SE_SECURITY_DESCRIPTOR_FLAG_NO_LABEL_ACE 0x00000002
7773#define SE_SECURITY_DESCRIPTOR_VALID_FLAGS 0x00000003
7774
7775typedef struct _SE_SECURITY_DESCRIPTOR
7776{
7777 DWORD Size;
7778 DWORD Flags;
7779 PSECURITY_DESCRIPTOR SecurityDescriptor;
7780} SE_SECURITY_DESCRIPTOR, *PSE_SECURITY_DESCRIPTOR;
7781
7782typedef struct _SE_ACCESS_REQUEST
7783{
7784 DWORD Size;
7785 PSE_SECURITY_DESCRIPTOR SeSecurityDescriptor;
7786 ACCESS_MASK DesiredAccess;
7787 ACCESS_MASK PreviouslyGrantedAccess;
7788 PSID PrincipalSelfSid; // Need to watch how this field affects the cache.
7789 PGENERIC_MAPPING GenericMapping;
7790 DWORD ObjectTypeListCount;
7791 POBJECT_TYPE_LIST ObjectTypeList;
7792} SE_ACCESS_REQUEST, *PSE_ACCESS_REQUEST;
7793
7794
7795typedef struct _SE_ACCESS_REPLY
7796{
7797 DWORD Size;
7798 DWORD ResultListCount; // Indicate the array size of GrantedAccess and AccessStatus, it only can be either 1 or ObjectTypeListCount.
7799 PACCESS_MASK GrantedAccess;
7800 PDWORD AccessStatus;
7801 PACCESS_REASONS AccessReason;
7802 PPRIVILEGE_SET* Privileges;
7803} SE_ACCESS_REPLY, *PSE_ACCESS_REPLY;
7804
7805
7806////////////////////////////////////////////////////////////////////////
7807// //
7808// NT Defined Privileges //
7809// //
7810////////////////////////////////////////////////////////////////////////
7811
7812#define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege")
7813#define SE_ASSIGNPRIMARYTOKEN_NAME TEXT("SeAssignPrimaryTokenPrivilege")
7814#define SE_LOCK_MEMORY_NAME TEXT("SeLockMemoryPrivilege")
7815#define SE_INCREASE_QUOTA_NAME TEXT("SeIncreaseQuotaPrivilege")
7816#define SE_UNSOLICITED_INPUT_NAME TEXT("SeUnsolicitedInputPrivilege")
7817#define SE_MACHINE_ACCOUNT_NAME TEXT("SeMachineAccountPrivilege")
7818#define SE_TCB_NAME TEXT("SeTcbPrivilege")
7819#define SE_SECURITY_NAME TEXT("SeSecurityPrivilege")
7820#define SE_TAKE_OWNERSHIP_NAME TEXT("SeTakeOwnershipPrivilege")
7821#define SE_LOAD_DRIVER_NAME TEXT("SeLoadDriverPrivilege")
7822#define SE_SYSTEM_PROFILE_NAME TEXT("SeSystemProfilePrivilege")
7823#define SE_SYSTEMTIME_NAME TEXT("SeSystemtimePrivilege")
7824#define SE_PROF_SINGLE_PROCESS_NAME TEXT("SeProfileSingleProcessPrivilege")
7825#define SE_INC_BASE_PRIORITY_NAME TEXT("SeIncreaseBasePriorityPrivilege")
7826#define SE_CREATE_PAGEFILE_NAME TEXT("SeCreatePagefilePrivilege")
7827#define SE_CREATE_PERMANENT_NAME TEXT("SeCreatePermanentPrivilege")
7828#define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
7829#define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
7830#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")
7831#define SE_DEBUG_NAME TEXT("SeDebugPrivilege")
7832#define SE_AUDIT_NAME TEXT("SeAuditPrivilege")
7833#define SE_SYSTEM_ENVIRONMENT_NAME TEXT("SeSystemEnvironmentPrivilege")
7834#define SE_CHANGE_NOTIFY_NAME TEXT("SeChangeNotifyPrivilege")
7835#define SE_REMOTE_SHUTDOWN_NAME TEXT("SeRemoteShutdownPrivilege")
7836#define SE_UNDOCK_NAME TEXT("SeUndockPrivilege")
7837#define SE_SYNC_AGENT_NAME TEXT("SeSyncAgentPrivilege")
7838#define SE_ENABLE_DELEGATION_NAME TEXT("SeEnableDelegationPrivilege")
7839#define SE_MANAGE_VOLUME_NAME TEXT("SeManageVolumePrivilege")
7840#define SE_IMPERSONATE_NAME TEXT("SeImpersonatePrivilege")
7841#define SE_CREATE_GLOBAL_NAME TEXT("SeCreateGlobalPrivilege")
7842#define SE_TRUSTED_CREDMAN_ACCESS_NAME TEXT("SeTrustedCredManAccessPrivilege")
7843#define SE_RELABEL_NAME TEXT("SeRelabelPrivilege")
7844#define SE_INC_WORKING_SET_NAME TEXT("SeIncreaseWorkingSetPrivilege")
7845#define SE_TIME_ZONE_NAME TEXT("SeTimeZonePrivilege")
7846#define SE_CREATE_SYMBOLIC_LINK_NAME TEXT("SeCreateSymbolicLinkPrivilege")
7847
7848
7849
7850////////////////////////////////////////////////////////////////////
7851// //
7852// Security Quality Of Service //
7853// //
7854// //
7855////////////////////////////////////////////////////////////////////
7856
7857// begin_wdm
7858//
7859// Impersonation Level
7860//
7861// Impersonation level is represented by a pair of bits in Windows.
7862// If a new impersonation level is added or lowest value is changed from
7863// 0 to something else, fix the Windows CreateFile call.
7864//
7865
7866typedef enum _SECURITY_IMPERSONATION_LEVEL {
7867 SecurityAnonymous,
7868 SecurityIdentification,
7869 SecurityImpersonation,
7870 SecurityDelegation
7871 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
7872
7873#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
7874#define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
7875#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
7876#define VALID_IMPERSONATION_LEVEL(L) (((L) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((L) <= SECURITY_MAX_IMPERSONATION_LEVEL))
7877
7878
7879////////////////////////////////////////////////////////////////////
7880// //
7881// Token Object Definitions //
7882// //
7883// //
7884////////////////////////////////////////////////////////////////////
7885
7886
7887//
7888// Token Specific Access Rights.
7889//
7890
7891#define TOKEN_ASSIGN_PRIMARY (0x0001)
7892#define TOKEN_DUPLICATE (0x0002)
7893#define TOKEN_IMPERSONATE (0x0004)
7894#define TOKEN_QUERY (0x0008)
7895#define TOKEN_QUERY_SOURCE (0x0010)
7896#define TOKEN_ADJUST_PRIVILEGES (0x0020)
7897#define TOKEN_ADJUST_GROUPS (0x0040)
7898#define TOKEN_ADJUST_DEFAULT (0x0080)
7899#define TOKEN_ADJUST_SESSIONID (0x0100)
7900
7901#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED |\
7902 TOKEN_ASSIGN_PRIMARY |\
7903 TOKEN_DUPLICATE |\
7904 TOKEN_IMPERSONATE |\
7905 TOKEN_QUERY |\
7906 TOKEN_QUERY_SOURCE |\
7907 TOKEN_ADJUST_PRIVILEGES |\
7908 TOKEN_ADJUST_GROUPS |\
7909 TOKEN_ADJUST_DEFAULT )
7910
7911#if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))
7912#define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P |\
7913 TOKEN_ADJUST_SESSIONID )
7914#else
7915#define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P)
7916#endif
7917
7918#define TOKEN_READ (STANDARD_RIGHTS_READ |\
7919 TOKEN_QUERY)
7920
7921
7922#define TOKEN_WRITE (STANDARD_RIGHTS_WRITE |\
7923 TOKEN_ADJUST_PRIVILEGES |\
7924 TOKEN_ADJUST_GROUPS |\
7925 TOKEN_ADJUST_DEFAULT)
7926
7927#define TOKEN_EXECUTE (STANDARD_RIGHTS_EXECUTE)
7928
7929//
7930//
7931// Token Types
7932//
7933
7934typedef enum _TOKEN_TYPE {
7935 TokenPrimary = 1,
7936 TokenImpersonation
7937 } TOKEN_TYPE;
7938typedef TOKEN_TYPE *PTOKEN_TYPE;
7939
7940//
7941// Token elevation values describe the relative strength of a given token.
7942// A full token is a token with all groups and privileges to which the principal
7943// is authorized. A limited token is one with some groups or privileges removed.
7944//
7945
7946typedef enum _TOKEN_ELEVATION_TYPE {
7947 TokenElevationTypeDefault = 1,
7948 TokenElevationTypeFull,
7949 TokenElevationTypeLimited,
7950} TOKEN_ELEVATION_TYPE, *PTOKEN_ELEVATION_TYPE;
7951
7952//
7953// Token Information Classes.
7954//
7955
7956
7957typedef enum _TOKEN_INFORMATION_CLASS {
7958 TokenUser = 1,
7959 TokenGroups,
7960 TokenPrivileges,
7961 TokenOwner,
7962 TokenPrimaryGroup,
7963 TokenDefaultDacl,
7964 TokenSource,
7965 TokenType,
7966 TokenImpersonationLevel,
7967 TokenStatistics,
7968 TokenRestrictedSids,
7969 TokenSessionId,
7970 TokenGroupsAndPrivileges,
7971 TokenSessionReference,
7972 TokenSandBoxInert,
7973 TokenAuditPolicy,
7974 TokenOrigin,
7975 TokenElevationType,
7976 TokenLinkedToken,
7977 TokenElevation,
7978 TokenHasRestrictions,
7979 TokenAccessInformation,
7980 TokenVirtualizationAllowed,
7981 TokenVirtualizationEnabled,
7982 TokenIntegrityLevel,
7983 TokenUIAccess,
7984 TokenMandatoryPolicy,
7985 TokenLogonSid,
7986 MaxTokenInfoClass // MaxTokenInfoClass should always be the last enum
7987} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
7988
7989//
7990// Token information class structures
7991//
7992
7993
7994typedef struct _TOKEN_USER {
7995 SID_AND_ATTRIBUTES User;
7996} TOKEN_USER, *PTOKEN_USER;
7997
7998typedef struct _TOKEN_GROUPS {
7999 DWORD GroupCount;
8000#ifdef MIDL_PASS
8001 [size_is(GroupCount)] SID_AND_ATTRIBUTES Groups[*];
8002#else // MIDL_PASS
8003 SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
8004#endif // MIDL_PASS
8005} TOKEN_GROUPS, *PTOKEN_GROUPS;
8006
8007
8008typedef struct _TOKEN_PRIVILEGES {
8009 DWORD PrivilegeCount;
8010 LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
8011} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
8012
8013
8014typedef struct _TOKEN_OWNER {
8015 PSID Owner;
8016} TOKEN_OWNER, *PTOKEN_OWNER;
8017
8018
8019typedef struct _TOKEN_PRIMARY_GROUP {
8020 PSID PrimaryGroup;
8021} TOKEN_PRIMARY_GROUP, *PTOKEN_PRIMARY_GROUP;
8022
8023
8024typedef struct _TOKEN_DEFAULT_DACL {
8025 PACL DefaultDacl;
8026} TOKEN_DEFAULT_DACL, *PTOKEN_DEFAULT_DACL;
8027
8028typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
8029 DWORD SidCount;
8030 DWORD SidLength;
8031 PSID_AND_ATTRIBUTES Sids;
8032 DWORD RestrictedSidCount;
8033 DWORD RestrictedSidLength;
8034 PSID_AND_ATTRIBUTES RestrictedSids;
8035 DWORD PrivilegeCount;
8036 DWORD PrivilegeLength;
8037 PLUID_AND_ATTRIBUTES Privileges;
8038 LUID AuthenticationId;
8039} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
8040
8041typedef struct _TOKEN_LINKED_TOKEN {
8042 HANDLE LinkedToken;
8043} TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN;
8044
8045typedef struct _TOKEN_ELEVATION {
8046 DWORD TokenIsElevated;
8047} TOKEN_ELEVATION, *PTOKEN_ELEVATION;
8048
8049typedef struct _TOKEN_MANDATORY_LABEL {
8050 SID_AND_ATTRIBUTES Label;
8051} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
8052
8053#define TOKEN_MANDATORY_POLICY_OFF 0x0
8054#define TOKEN_MANDATORY_POLICY_NO_WRITE_UP 0x1
8055#define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN 0x2
8056
8057#define TOKEN_MANDATORY_POLICY_VALID_MASK (TOKEN_MANDATORY_POLICY_NO_WRITE_UP | \
8058 TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN)
8059
8060typedef struct _TOKEN_MANDATORY_POLICY {
8061 DWORD Policy;
8062} TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY;
8063
8064typedef struct _TOKEN_ACCESS_INFORMATION {
8065 PSID_AND_ATTRIBUTES_HASH SidHash;
8066 PSID_AND_ATTRIBUTES_HASH RestrictedSidHash;
8067 PTOKEN_PRIVILEGES Privileges;
8068 LUID AuthenticationId;
8069 TOKEN_TYPE TokenType;
8070 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
8071 TOKEN_MANDATORY_POLICY MandatoryPolicy;
8072 DWORD Flags;
8073} TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION;
8074
8075//
8076// Valid bits for each TOKEN_AUDIT_POLICY policy mask field.
8077//
8078
8079#define POLICY_AUDIT_SUBCATEGORY_COUNT (53)
8080
8081typedef struct _TOKEN_AUDIT_POLICY {
8082 BYTE PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT) >> 1) + 1];
8083} TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
8084
8085#define TOKEN_SOURCE_LENGTH 8
8086
8087typedef struct _TOKEN_SOURCE {
8088 CHAR SourceName[TOKEN_SOURCE_LENGTH];
8089 LUID SourceIdentifier;
8090} TOKEN_SOURCE, *PTOKEN_SOURCE;
8091
8092
8093typedef struct _TOKEN_STATISTICS {
8094 LUID TokenId;
8095 LUID AuthenticationId;
8096 LARGE_INTEGER ExpirationTime;
8097 TOKEN_TYPE TokenType;
8098 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
8099 DWORD DynamicCharged;
8100 DWORD DynamicAvailable;
8101 DWORD GroupCount;
8102 DWORD PrivilegeCount;
8103 LUID ModifiedId;
8104} TOKEN_STATISTICS, *PTOKEN_STATISTICS;
8105
8106
8107
8108typedef struct _TOKEN_CONTROL {
8109 LUID TokenId;
8110 LUID AuthenticationId;
8111 LUID ModifiedId;
8112 TOKEN_SOURCE TokenSource;
8113} TOKEN_CONTROL, *PTOKEN_CONTROL;
8114
8115typedef struct _TOKEN_ORIGIN {
8116 LUID OriginatingLogonSession ;
8117} TOKEN_ORIGIN, * PTOKEN_ORIGIN ;
8118
8119
8120typedef enum _MANDATORY_LEVEL {
8121 MandatoryLevelUntrusted = 0,
8122 MandatoryLevelLow,
8123 MandatoryLevelMedium,
8124 MandatoryLevelHigh,
8125 MandatoryLevelSystem,
8126 MandatoryLevelSecureProcess,
8127 MandatoryLevelCount
8128} MANDATORY_LEVEL, *PMANDATORY_LEVEL;
8129
8130
8131
8132
8133//
8134// Security Tracking Mode
8135//
8136
8137#define SECURITY_DYNAMIC_TRACKING (TRUE)
8138#define SECURITY_STATIC_TRACKING (FALSE)
8139
8140typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
8141 * PSECURITY_CONTEXT_TRACKING_MODE;
8142
8143
8144
8145//
8146// Quality Of Service
8147//
8148
8149typedef struct _SECURITY_QUALITY_OF_SERVICE {
8150 DWORD Length;
8151 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
8152 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
8153 BOOLEAN EffectiveOnly;
8154 } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;
8155
8156
8157//
8158// Used to represent information related to a thread impersonation
8159//
8160
8161typedef struct _SE_IMPERSONATION_STATE {
8162 PACCESS_TOKEN Token;
8163 BOOLEAN CopyOnOpen;
8164 BOOLEAN EffectiveOnly;
8165 SECURITY_IMPERSONATION_LEVEL Level;
8166} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
8167
8168#define DISABLE_MAX_PRIVILEGE 0x1
8169#define SANDBOX_INERT 0x2
8170#define LUA_TOKEN 0x4
8171#define WRITE_RESTRICTED 0x8
8172
8173typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
8174
8175#define OWNER_SECURITY_INFORMATION (0x00000001L)
8176#define GROUP_SECURITY_INFORMATION (0x00000002L)
8177#define DACL_SECURITY_INFORMATION (0x00000004L)
8178#define SACL_SECURITY_INFORMATION (0x00000008L)
8179#define LABEL_SECURITY_INFORMATION (0x00000010L)
8180
8181#define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
8182#define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
8183#define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
8184#define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
8185
8186#define PROCESS_TERMINATE (0x0001)
8187#define PROCESS_CREATE_THREAD (0x0002)
8188#define PROCESS_SET_SESSIONID (0x0004)
8189#define PROCESS_VM_OPERATION (0x0008)
8190#define PROCESS_VM_READ (0x0010)
8191#define PROCESS_VM_WRITE (0x0020)
8192#define PROCESS_DUP_HANDLE (0x0040)
8193#define PROCESS_CREATE_PROCESS (0x0080)
8194#define PROCESS_SET_QUOTA (0x0100)
8195#define PROCESS_SET_INFORMATION (0x0200)
8196#define PROCESS_QUERY_INFORMATION (0x0400)
8197#define PROCESS_SUSPEND_RESUME (0x0800)
8198#define PROCESS_QUERY_LIMITED_INFORMATION (0x1000)
8199#if (NTDDI_VERSION >= NTDDI_VISTA)
8200#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
8201 0xFFFF)
8202#else
8203#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
8204 0xFFF)
8205#endif
8206
8207#if defined(_WIN64)
8208
8209#define MAXIMUM_PROC_PER_GROUP 64
8210
8211#else
8212
8213#define MAXIMUM_PROC_PER_GROUP 32
8214
8215#endif
8216
8217#define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
8218
8219#define THREAD_TERMINATE (0x0001)
8220#define THREAD_SUSPEND_RESUME (0x0002)
8221#define THREAD_GET_CONTEXT (0x0008)
8222#define THREAD_SET_CONTEXT (0x0010)
8223#define THREAD_QUERY_INFORMATION (0x0040)
8224#define THREAD_SET_INFORMATION (0x0020)
8225#define THREAD_SET_THREAD_TOKEN (0x0080)
8226#define THREAD_IMPERSONATE (0x0100)
8227#define THREAD_DIRECT_IMPERSONATION (0x0200)
8228// begin_wdm
8229#define THREAD_SET_LIMITED_INFORMATION (0x0400) // winnt
8230#define THREAD_QUERY_LIMITED_INFORMATION (0x0800) // winnt
8231#if (NTDDI_VERSION >= NTDDI_VISTA)
8232#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
8233 0xFFFF)
8234#else
8235#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
8236 0x3FF)
8237#endif
8238#define JOB_OBJECT_ASSIGN_PROCESS (0x0001)
8239#define JOB_OBJECT_SET_ATTRIBUTES (0x0002)
8240#define JOB_OBJECT_QUERY (0x0004)
8241#define JOB_OBJECT_TERMINATE (0x0008)
8242#define JOB_OBJECT_SET_SECURITY_ATTRIBUTES (0x0010)
8243#define JOB_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
8244 0x1F )
8245
8246typedef struct _JOB_SET_ARRAY {
8247 HANDLE JobHandle; // Handle to job object to insert
8248 DWORD MemberLevel; // Level of this job in the set. Must be > 0. Can be sparse.
8249 DWORD Flags; // Unused. Must be zero
8250} JOB_SET_ARRAY, *PJOB_SET_ARRAY;
8251
8252#define FLS_MAXIMUM_AVAILABLE 128
8253#define TLS_MINIMUM_AVAILABLE 64
8254
8255typedef struct _NT_TIB {
8256 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
8257 PVOID StackBase;
8258 PVOID StackLimit;
8259 PVOID SubSystemTib;
8260#if defined(_MSC_EXTENSIONS)
8261 union {
8262 PVOID FiberData;
8263 DWORD Version;
8264 };
8265#else
8266 PVOID FiberData;
8267#endif
8268 PVOID ArbitraryUserPointer;
8269 struct _NT_TIB *Self;
8270} NT_TIB;
8271typedef NT_TIB *PNT_TIB;
8272
8273//
8274// 32 and 64 bit specific version for wow64 and the debugger
8275//
8276typedef struct _NT_TIB32 {
8277 DWORD ExceptionList;
8278 DWORD StackBase;
8279 DWORD StackLimit;
8280 DWORD SubSystemTib;
8281
8282#if defined(_MSC_EXTENSIONS)
8283 union {
8284 DWORD FiberData;
8285 DWORD Version;
8286 };
8287#else
8288 DWORD FiberData;
8289#endif
8290
8291 DWORD ArbitraryUserPointer;
8292 DWORD Self;
8293} NT_TIB32, *PNT_TIB32;
8294
8295typedef struct _NT_TIB64 {
8296 DWORD64 ExceptionList;
8297 DWORD64 StackBase;
8298 DWORD64 StackLimit;
8299 DWORD64 SubSystemTib;
8300
8301#if defined(_MSC_EXTENSIONS)
8302 union {
8303 DWORD64 FiberData;
8304 DWORD Version;
8305 };
8306
8307#else
8308 DWORD64 FiberData;
8309#endif
8310
8311 DWORD64 ArbitraryUserPointer;
8312 DWORD64 Self;
8313} NT_TIB64, *PNT_TIB64;
8314
8315
8316
8317#define THREAD_BASE_PRIORITY_LOWRT 15 // value that gets a thread to LowRealtime-1
8318#define THREAD_BASE_PRIORITY_MAX 2 // maximum thread base priority boost
8319#define THREAD_BASE_PRIORITY_MIN (-2) // minimum thread base priority boost
8320#define THREAD_BASE_PRIORITY_IDLE (-15) // value that gets a thread to idle
8321
8322typedef struct _UMS_CREATE_THREAD_ATTRIBUTES {
8323 DWORD UmsVersion;
8324 PVOID UmsContext;
8325 PVOID UmsCompletionList;
8326} UMS_CREATE_THREAD_ATTRIBUTES, *PUMS_CREATE_THREAD_ATTRIBUTES;
8327
8328typedef struct _QUOTA_LIMITS {
8329 SIZE_T PagedPoolLimit;
8330 SIZE_T NonPagedPoolLimit;
8331 SIZE_T MinimumWorkingSetSize;
8332 SIZE_T MaximumWorkingSetSize;
8333 SIZE_T PagefileLimit;
8334 LARGE_INTEGER TimeLimit;
8335} QUOTA_LIMITS, *PQUOTA_LIMITS;
8336
8337#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
8338#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
8339#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
8340#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
8341#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
8342
8343typedef union _RATE_QUOTA_LIMIT {
8344 DWORD RateData;
8345 struct {
8346 DWORD RatePercent : 7;
8347 DWORD Reserved0 : 25;
8348 } DUMMYSTRUCTNAME;
8349} RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT;
8350
8351typedef struct _QUOTA_LIMITS_EX {
8352 SIZE_T PagedPoolLimit;
8353 SIZE_T NonPagedPoolLimit;
8354 SIZE_T MinimumWorkingSetSize;
8355 SIZE_T MaximumWorkingSetSize;
8356 SIZE_T PagefileLimit; // Limit expressed in pages
8357 LARGE_INTEGER TimeLimit;
8358 SIZE_T WorkingSetLimit; // Limit expressed in pages
8359 SIZE_T Reserved2;
8360 SIZE_T Reserved3;
8361 SIZE_T Reserved4;
8362 DWORD Flags;
8363 RATE_QUOTA_LIMIT CpuRateLimit;
8364} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
8365
8366typedef struct _IO_COUNTERS {
8367 ULONGLONG ReadOperationCount;
8368 ULONGLONG WriteOperationCount;
8369 ULONGLONG OtherOperationCount;
8370 ULONGLONG ReadTransferCount;
8371 ULONGLONG WriteTransferCount;
8372 ULONGLONG OtherTransferCount;
8373} IO_COUNTERS;
8374typedef IO_COUNTERS *PIO_COUNTERS;
8375
8376#define MAX_HW_COUNTERS 16
8377#define THREAD_PROFILING_FLAG_DISPATCH 0x00000001
8378
8379typedef enum _HARDWARE_COUNTER_TYPE {
8380 PMCCounter,
8381 MaxHardwareCounterType
8382} HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE;
8383
8384typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
8385 LARGE_INTEGER TotalUserTime;
8386 LARGE_INTEGER TotalKernelTime;
8387 LARGE_INTEGER ThisPeriodTotalUserTime;
8388 LARGE_INTEGER ThisPeriodTotalKernelTime;
8389 DWORD TotalPageFaultCount;
8390 DWORD TotalProcesses;
8391 DWORD ActiveProcesses;
8392 DWORD TotalTerminatedProcesses;
8393} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
8394
8395typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
8396 LARGE_INTEGER PerProcessUserTimeLimit;
8397 LARGE_INTEGER PerJobUserTimeLimit;
8398 DWORD LimitFlags;
8399 SIZE_T MinimumWorkingSetSize;
8400 SIZE_T MaximumWorkingSetSize;
8401 DWORD ActiveProcessLimit;
8402 ULONG_PTR Affinity;
8403 DWORD PriorityClass;
8404 DWORD SchedulingClass;
8405} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
8406
8407typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
8408 JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
8409 IO_COUNTERS IoInfo;
8410 SIZE_T ProcessMemoryLimit;
8411 SIZE_T JobMemoryLimit;
8412 SIZE_T PeakProcessMemoryUsed;
8413 SIZE_T PeakJobMemoryUsed;
8414} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
8415
8416typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
8417 DWORD NumberOfAssignedProcesses;
8418 DWORD NumberOfProcessIdsInList;
8419 ULONG_PTR ProcessIdList[1];
8420} JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;
8421
8422typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
8423 DWORD UIRestrictionsClass;
8424} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
8425
8426//
8427// N.B. The JOBOBJECT_SECURITY_LIMIT_INFORMATION information class is no longer supported.
8428//
8429
8430typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
8431 DWORD SecurityLimitFlags ;
8432 HANDLE JobToken ;
8433 PTOKEN_GROUPS SidsToDisable ;
8434 PTOKEN_PRIVILEGES PrivilegesToDelete ;
8435 PTOKEN_GROUPS RestrictedSids ;
8436} JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;
8437
8438typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
8439 DWORD EndOfJobTimeAction;
8440} JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
8441
8442typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
8443 PVOID CompletionKey;
8444 HANDLE CompletionPort;
8445} JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
8446
8447typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
8448 JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
8449 IO_COUNTERS IoInfo;
8450} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
8451
8452typedef struct _JOBOBJECT_JOBSET_INFORMATION {
8453 DWORD MemberLevel;
8454} JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;
8455
8456#define JOB_OBJECT_TERMINATE_AT_END_OF_JOB 0
8457#define JOB_OBJECT_POST_AT_END_OF_JOB 1
8458
8459//
8460// Completion Port Messages for job objects
8461//
8462// These values are returned via the lpNumberOfBytesTransferred parameter
8463//
8464
8465#define JOB_OBJECT_MSG_END_OF_JOB_TIME 1
8466#define JOB_OBJECT_MSG_END_OF_PROCESS_TIME 2
8467#define JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT 3
8468#define JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO 4
8469#define JOB_OBJECT_MSG_NEW_PROCESS 6
8470#define JOB_OBJECT_MSG_EXIT_PROCESS 7
8471#define JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS 8
8472#define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT 9
8473#define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT 10
8474
8475//
8476// Basic Limits
8477//
8478#define JOB_OBJECT_LIMIT_WORKINGSET 0x00000001
8479#define JOB_OBJECT_LIMIT_PROCESS_TIME 0x00000002
8480#define JOB_OBJECT_LIMIT_JOB_TIME 0x00000004
8481#define JOB_OBJECT_LIMIT_ACTIVE_PROCESS 0x00000008
8482#define JOB_OBJECT_LIMIT_AFFINITY 0x00000010
8483#define JOB_OBJECT_LIMIT_PRIORITY_CLASS 0x00000020
8484#define JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME 0x00000040
8485#define JOB_OBJECT_LIMIT_SCHEDULING_CLASS 0x00000080
8486
8487//
8488// Extended Limits
8489//
8490#define JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x00000100
8491#define JOB_OBJECT_LIMIT_JOB_MEMORY 0x00000200
8492#define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400
8493#define JOB_OBJECT_LIMIT_BREAKAWAY_OK 0x00000800
8494#define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 0x00001000
8495#define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000
8496
8497#define JOB_OBJECT_LIMIT_SUBSET_AFFINITY 0x00004000
8498#define JOB_OBJECT_LIMIT_RESERVED3 0x00008000
8499#define JOB_OBJECT_LIMIT_RESERVED4 0x00010000
8500#define JOB_OBJECT_LIMIT_RESERVED5 0x00020000
8501#define JOB_OBJECT_LIMIT_RESERVED6 0x00040000
8502
8503
8504#define JOB_OBJECT_LIMIT_VALID_FLAGS 0x0007ffff
8505
8506#define JOB_OBJECT_BASIC_LIMIT_VALID_FLAGS 0x000000ff
8507#define JOB_OBJECT_EXTENDED_LIMIT_VALID_FLAGS 0x00007fff
8508#define JOB_OBJECT_RESERVED_LIMIT_VALID_FLAGS 0x0007ffff
8509
8510//
8511// UI restrictions for jobs
8512//
8513
8514#define JOB_OBJECT_UILIMIT_NONE 0x00000000
8515
8516#define JOB_OBJECT_UILIMIT_HANDLES 0x00000001
8517#define JOB_OBJECT_UILIMIT_READCLIPBOARD 0x00000002
8518#define JOB_OBJECT_UILIMIT_WRITECLIPBOARD 0x00000004
8519#define JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x00000008
8520#define JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 0x00000010
8521#define JOB_OBJECT_UILIMIT_GLOBALATOMS 0x00000020
8522#define JOB_OBJECT_UILIMIT_DESKTOP 0x00000040
8523#define JOB_OBJECT_UILIMIT_EXITWINDOWS 0x00000080
8524
8525#define JOB_OBJECT_UILIMIT_ALL 0x000000FF
8526
8527#define JOB_OBJECT_UI_VALID_FLAGS 0x000000FF
8528
8529#define JOB_OBJECT_SECURITY_NO_ADMIN 0x00000001
8530#define JOB_OBJECT_SECURITY_RESTRICTED_TOKEN 0x00000002
8531#define JOB_OBJECT_SECURITY_ONLY_TOKEN 0x00000004
8532#define JOB_OBJECT_SECURITY_FILTER_TOKENS 0x00000008
8533
8534#define JOB_OBJECT_SECURITY_VALID_FLAGS 0x0000000f
8535
8536typedef enum _JOBOBJECTINFOCLASS {
8537 JobObjectBasicAccountingInformation = 1,
8538 JobObjectBasicLimitInformation,
8539 JobObjectBasicProcessIdList,
8540 JobObjectBasicUIRestrictions,
8541 JobObjectSecurityLimitInformation, // deprecated
8542 JobObjectEndOfJobTimeInformation,
8543 JobObjectAssociateCompletionPortInformation,
8544 JobObjectBasicAndIoAccountingInformation,
8545 JobObjectExtendedLimitInformation,
8546 JobObjectJobSetInformation,
8547 JobObjectGroupInformation,
8548 MaxJobObjectInfoClass
8549 } JOBOBJECTINFOCLASS;
8550
8551//
8552#define EVENT_MODIFY_STATE 0x0002
8553#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
8554
8555#define MUTANT_QUERY_STATE 0x0001
8556
8557#define MUTANT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|\
8558 MUTANT_QUERY_STATE)
8559
8560#define SEMAPHORE_MODIFY_STATE 0x0002
8561#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
8562
8563//
8564// Timer Specific Access Rights.
8565//
8566
8567#define TIMER_QUERY_STATE 0x0001
8568#define TIMER_MODIFY_STATE 0x0002
8569
8570#define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|\
8571 TIMER_QUERY_STATE|TIMER_MODIFY_STATE)
8572
8573
8574#define TIME_ZONE_ID_UNKNOWN 0
8575#define TIME_ZONE_ID_STANDARD 1
8576#define TIME_ZONE_ID_DAYLIGHT 2
8577
8578
8579typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
8580 RelationProcessorCore,
8581 RelationNumaNode,
8582 RelationCache,
8583 RelationProcessorPackage,
8584 RelationGroup,
8585 RelationAll = 0xffff
8586} LOGICAL_PROCESSOR_RELATIONSHIP;
8587
8588#define LTP_PC_SMT 0x1
8589
8590typedef enum _PROCESSOR_CACHE_TYPE {
8591 CacheUnified,
8592 CacheInstruction,
8593 CacheData,
8594 CacheTrace
8595} PROCESSOR_CACHE_TYPE;
8596
8597#define CACHE_FULLY_ASSOCIATIVE 0xFF
8598
8599typedef struct _CACHE_DESCRIPTOR {
8600 BYTE Level;
8601 BYTE Associativity;
8602 WORD LineSize;
8603 DWORD Size;
8604 PROCESSOR_CACHE_TYPE Type;
8605} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
8606
8607typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
8608 ULONG_PTR ProcessorMask;
8609 LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
8610 union {
8611 struct {
8612 BYTE Flags;
8613 } ProcessorCore;
8614 struct {
8615 DWORD NodeNumber;
8616 } NumaNode;
8617 CACHE_DESCRIPTOR Cache;
8618 ULONGLONG Reserved[2];
8619 } DUMMYUNIONNAME;
8620} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
8621
8622typedef struct _PROCESSOR_RELATIONSHIP {
8623 BYTE Flags;
8624 BYTE Reserved[21];
8625 WORD GroupCount;
8626 __field_ecount(GroupCount) GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
8627} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
8628
8629typedef struct _NUMA_NODE_RELATIONSHIP {
8630 DWORD NodeNumber;
8631 BYTE Reserved[20];
8632 GROUP_AFFINITY GroupMask;
8633} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP;
8634
8635typedef struct _CACHE_RELATIONSHIP {
8636 BYTE Level;
8637 BYTE Associativity;
8638 WORD LineSize;
8639 DWORD CacheSize;
8640 PROCESSOR_CACHE_TYPE Type;
8641 BYTE Reserved[20];
8642 GROUP_AFFINITY GroupMask;
8643} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP;
8644
8645typedef struct _PROCESSOR_GROUP_INFO {
8646 BYTE MaximumProcessorCount;
8647 BYTE ActiveProcessorCount;
8648 BYTE Reserved[38];
8649 KAFFINITY ActiveProcessorMask;
8650} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO;
8651
8652typedef struct _GROUP_RELATIONSHIP {
8653 WORD MaximumGroupCount;
8654 WORD ActiveGroupCount;
8655 BYTE Reserved[20];
8656 PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY];
8657} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP;
8658
8659__struct_bcount(Size) struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
8660 LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
8661 DWORD Size;
8662 union {
8663 PROCESSOR_RELATIONSHIP Processor;
8664 NUMA_NODE_RELATIONSHIP NumaNode;
8665 CACHE_RELATIONSHIP Cache;
8666 GROUP_RELATIONSHIP Group;
8667 } DUMMYUNIONNAME;
8668};
8669
8670typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;
8671
8672// end_wdm end_ntminiport
8673
8674typedef struct _SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION {
8675 DWORD64 CycleTime;
8676} SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION, *PSYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION;
8677
8678
8679#define PROCESSOR_INTEL_386 386
8680#define PROCESSOR_INTEL_486 486
8681#define PROCESSOR_INTEL_PENTIUM 586
8682#define PROCESSOR_INTEL_IA64 2200
8683#define PROCESSOR_AMD_X8664 8664
8684#define PROCESSOR_MIPS_R4000 4000 // incl R4101 & R3910 for Windows CE
8685#define PROCESSOR_ALPHA_21064 21064
8686#define PROCESSOR_PPC_601 601
8687#define PROCESSOR_PPC_603 603
8688#define PROCESSOR_PPC_604 604
8689#define PROCESSOR_PPC_620 620
8690#define PROCESSOR_HITACHI_SH3 10003 // Windows CE
8691#define PROCESSOR_HITACHI_SH3E 10004 // Windows CE
8692#define PROCESSOR_HITACHI_SH4 10005 // Windows CE
8693#define PROCESSOR_MOTOROLA_821 821 // Windows CE
8694#define PROCESSOR_SHx_SH3 103 // Windows CE
8695#define PROCESSOR_SHx_SH4 104 // Windows CE
8696#define PROCESSOR_STRONGARM 2577 // Windows CE - 0xA11
8697#define PROCESSOR_ARM720 1824 // Windows CE - 0x720
8698#define PROCESSOR_ARM820 2080 // Windows CE - 0x820
8699#define PROCESSOR_ARM920 2336 // Windows CE - 0x920
8700#define PROCESSOR_ARM_7TDMI 70001 // Windows CE
8701#define PROCESSOR_OPTIL 0x494f // MSIL
8702
8703#define PROCESSOR_ARCHITECTURE_INTEL 0
8704#define PROCESSOR_ARCHITECTURE_MIPS 1
8705#define PROCESSOR_ARCHITECTURE_ALPHA 2
8706#define PROCESSOR_ARCHITECTURE_PPC 3
8707#define PROCESSOR_ARCHITECTURE_SHX 4
8708#define PROCESSOR_ARCHITECTURE_ARM 5
8709#define PROCESSOR_ARCHITECTURE_IA64 6
8710#define PROCESSOR_ARCHITECTURE_ALPHA64 7
8711#define PROCESSOR_ARCHITECTURE_MSIL 8
8712#define PROCESSOR_ARCHITECTURE_AMD64 9
8713#define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
8714
8715#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
8716
8717#define PF_FLOATING_POINT_PRECISION_ERRATA 0
8718#define PF_FLOATING_POINT_EMULATED 1
8719#define PF_COMPARE_EXCHANGE_DOUBLE 2
8720#define PF_MMX_INSTRUCTIONS_AVAILABLE 3
8721#define PF_PPC_MOVEMEM_64BIT_OK 4
8722#define PF_ALPHA_BYTE_INSTRUCTIONS 5
8723#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
8724#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
8725#define PF_RDTSC_INSTRUCTION_AVAILABLE 8
8726#define PF_PAE_ENABLED 9
8727#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
8728#define PF_SSE_DAZ_MODE_AVAILABLE 11
8729#define PF_NX_ENABLED 12
8730#define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
8731#define PF_COMPARE_EXCHANGE128 14
8732#define PF_COMPARE64_EXCHANGE128 15
8733#define PF_CHANNELS_ENABLED 16
8734#define PF_XSAVE_ENABLED 17
8735
8736//
8737// Known extended CPU state feature IDs
8738//
8739
8740#define XSTATE_LEGACY_FLOATING_POINT 0
8741#define XSTATE_LEGACY_SSE 1
8742#define XSTATE_GSSE 2
8743
8744#define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT))
8745#define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE))
8746#define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
8747#define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE))
8748
8749#define MAXIMUM_XSTATE_FEATURES 64
8750
8751//
8752// Extended processor state configuration
8753//
8754
8755typedef struct _XSTATE_FEATURE {
8756 DWORD Offset;
8757 DWORD Size;
8758} XSTATE_FEATURE, *PXSTATE_FEATURE;
8759
8760typedef struct _XSTATE_CONFIGURATION {
8761 // Mask of enabled features
8762 DWORD64 EnabledFeatures;
8763
8764 // Total size of the save area
8765 DWORD Size;
8766
8767 DWORD OptimizedSave : 1;
8768
8769 // List of features (
8770 XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES];
8771
8772} XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION;
8773
8774
8775typedef struct _MEMORY_BASIC_INFORMATION {
8776 PVOID BaseAddress;
8777 PVOID AllocationBase;
8778 DWORD AllocationProtect;
8779 SIZE_T RegionSize;
8780 DWORD State;
8781 DWORD Protect;
8782 DWORD Type;
8783} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
8784
8785typedef struct _MEMORY_BASIC_INFORMATION32 {
8786 DWORD BaseAddress;
8787 DWORD AllocationBase;
8788 DWORD AllocationProtect;
8789 DWORD RegionSize;
8790 DWORD State;
8791 DWORD Protect;
8792 DWORD Type;
8793} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;
8794
8795typedef struct DECLSPEC_ALIGN(16) _MEMORY_BASIC_INFORMATION64 {
8796 ULONGLONG BaseAddress;
8797 ULONGLONG AllocationBase;
8798 DWORD AllocationProtect;
8799 DWORD __alignment1;
8800 ULONGLONG RegionSize;
8801 DWORD State;
8802 DWORD Protect;
8803 DWORD Type;
8804 DWORD __alignment2;
8805} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;
8806
8807#define SECTION_QUERY 0x0001
8808#define SECTION_MAP_WRITE 0x0002
8809#define SECTION_MAP_READ 0x0004
8810#define SECTION_MAP_EXECUTE 0x0008
8811#define SECTION_EXTEND_SIZE 0x0010
8812#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 // not included in SECTION_ALL_ACCESS
8813
8814#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
8815 SECTION_MAP_WRITE | \
8816 SECTION_MAP_READ | \
8817 SECTION_MAP_EXECUTE | \
8818 SECTION_EXTEND_SIZE)
8819
8820#define SESSION_QUERY_ACCESS 0x0001
8821#define SESSION_MODIFY_ACCESS 0x0002
8822
8823#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
8824 SESSION_QUERY_ACCESS | \
8825 SESSION_MODIFY_ACCESS)
8826
8827#define PAGE_NOACCESS 0x01
8828#define PAGE_READONLY 0x02
8829#define PAGE_READWRITE 0x04
8830#define PAGE_WRITECOPY 0x08
8831#define PAGE_EXECUTE 0x10
8832#define PAGE_EXECUTE_READ 0x20
8833#define PAGE_EXECUTE_READWRITE 0x40
8834#define PAGE_EXECUTE_WRITECOPY 0x80
8835#define PAGE_GUARD 0x100
8836#define PAGE_NOCACHE 0x200
8837#define PAGE_WRITECOMBINE 0x400
8838#define MEM_COMMIT 0x1000
8839#define MEM_RESERVE 0x2000
8840#define MEM_DECOMMIT 0x4000
8841#define MEM_RELEASE 0x8000
8842#define MEM_FREE 0x10000
8843#define MEM_PRIVATE 0x20000
8844#define MEM_MAPPED 0x40000
8845#define MEM_RESET 0x80000
8846#define MEM_TOP_DOWN 0x100000
8847#define MEM_WRITE_WATCH 0x200000
8848#define MEM_PHYSICAL 0x400000
8849#define MEM_ROTATE 0x800000
8850#define MEM_LARGE_PAGES 0x20000000
8851#define MEM_4MB_PAGES 0x80000000
8852#define SEC_FILE 0x800000
8853#define SEC_IMAGE 0x1000000
8854#define SEC_PROTECTED_IMAGE 0x2000000
8855#define SEC_RESERVE 0x4000000
8856#define SEC_COMMIT 0x8000000
8857#define SEC_NOCACHE 0x10000000
8858#define SEC_WRITECOMBINE 0x40000000
8859#define SEC_LARGE_PAGES 0x80000000
8860#define MEM_IMAGE SEC_IMAGE
8861#define WRITE_WATCH_FLAG_RESET 0x01
8862
8863//
8864// Define access rights to files and directories
8865//
8866
8867//
8868// The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in
8869// devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these
8870// constants *MUST* always be in sync.
8871// The values are redefined in devioctl.h because they must be available to
8872// both DOS and NT.
8873//
8874
8875#define FILE_READ_DATA ( 0x0001 ) // file & pipe
8876#define FILE_LIST_DIRECTORY ( 0x0001 ) // directory
8877
8878#define FILE_WRITE_DATA ( 0x0002 ) // file & pipe
8879#define FILE_ADD_FILE ( 0x0002 ) // directory
8880
8881#define FILE_APPEND_DATA ( 0x0004 ) // file
8882#define FILE_ADD_SUBDIRECTORY ( 0x0004 ) // directory
8883#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) // named pipe
8884
8885
8886#define FILE_READ_EA ( 0x0008 ) // file & directory
8887
8888#define FILE_WRITE_EA ( 0x0010 ) // file & directory
8889
8890#define FILE_EXECUTE ( 0x0020 ) // file
8891#define FILE_TRAVERSE ( 0x0020 ) // directory
8892
8893#define FILE_DELETE_CHILD ( 0x0040 ) // directory
8894
8895#define FILE_READ_ATTRIBUTES ( 0x0080 ) // all
8896
8897#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) // all
8898
8899#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
8900
8901#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
8902 FILE_READ_DATA |\
8903 FILE_READ_ATTRIBUTES |\
8904 FILE_READ_EA |\
8905 SYNCHRONIZE)
8906
8907
8908#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
8909 FILE_WRITE_DATA |\
8910 FILE_WRITE_ATTRIBUTES |\
8911 FILE_WRITE_EA |\
8912 FILE_APPEND_DATA |\
8913 SYNCHRONIZE)
8914
8915
8916#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
8917 FILE_READ_ATTRIBUTES |\
8918 FILE_EXECUTE |\
8919 SYNCHRONIZE)
8920
8921#define FILE_SHARE_READ 0x00000001
8922#define FILE_SHARE_WRITE 0x00000002
8923#define FILE_SHARE_DELETE 0x00000004
8924#define FILE_ATTRIBUTE_READONLY 0x00000001
8925#define FILE_ATTRIBUTE_HIDDEN 0x00000002
8926#define FILE_ATTRIBUTE_SYSTEM 0x00000004
8927#define FILE_ATTRIBUTE_DIRECTORY 0x00000010
8928#define FILE_ATTRIBUTE_ARCHIVE 0x00000020
8929#define FILE_ATTRIBUTE_DEVICE 0x00000040
8930#define FILE_ATTRIBUTE_NORMAL 0x00000080
8931#define FILE_ATTRIBUTE_TEMPORARY 0x00000100
8932#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
8933#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
8934#define FILE_ATTRIBUTE_COMPRESSED 0x00000800
8935#define FILE_ATTRIBUTE_OFFLINE 0x00001000
8936#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
8937#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
8938#define FILE_ATTRIBUTE_VIRTUAL 0x00010000
8939#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
8940#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
8941#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
8942#define FILE_NOTIFY_CHANGE_SIZE 0x00000008
8943#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
8944#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
8945#define FILE_NOTIFY_CHANGE_CREATION 0x00000040
8946#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
8947#define FILE_ACTION_ADDED 0x00000001
8948#define FILE_ACTION_REMOVED 0x00000002
8949#define FILE_ACTION_MODIFIED 0x00000003
8950#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
8951#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
8952#define MAILSLOT_NO_MESSAGE ((DWORD)-1)
8953#define MAILSLOT_WAIT_FOREVER ((DWORD)-1)
8954#define FILE_CASE_SENSITIVE_SEARCH 0x00000001
8955#define FILE_CASE_PRESERVED_NAMES 0x00000002
8956#define FILE_UNICODE_ON_DISK 0x00000004
8957#define FILE_PERSISTENT_ACLS 0x00000008
8958#define FILE_FILE_COMPRESSION 0x00000010
8959#define FILE_VOLUME_QUOTAS 0x00000020
8960#define FILE_SUPPORTS_SPARSE_FILES 0x00000040
8961#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
8962#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
8963#define FILE_VOLUME_IS_COMPRESSED 0x00008000
8964#define FILE_SUPPORTS_OBJECT_IDS 0x00010000
8965#define FILE_SUPPORTS_ENCRYPTION 0x00020000
8966#define FILE_NAMED_STREAMS 0x00040000
8967#define FILE_READ_ONLY_VOLUME 0x00080000
8968#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
8969#define FILE_SUPPORTS_TRANSACTIONS 0x00200000
8970#define FILE_SUPPORTS_HARD_LINKS 0x00400000
8971#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
8972#define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
8973#define FILE_SUPPORTS_USN_JOURNAL 0x02000000
8974
8975//
8976// Define the file notification information structure
8977//
8978
8979typedef struct _FILE_NOTIFY_INFORMATION {
8980 DWORD NextEntryOffset;
8981 DWORD Action;
8982 DWORD FileNameLength;
8983 WCHAR FileName[1];
8984} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
8985
8986
8987//
8988// Define segement buffer structure for scatter/gather read/write.
8989//
8990
8991typedef union _FILE_SEGMENT_ELEMENT {
8992 PVOID64 Buffer;
8993 ULONGLONG Alignment;
8994}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
8995
8996//
8997// The reparse GUID structure is used by all 3rd party layered drivers to
8998// store data in a reparse point. For non-Microsoft tags, The GUID field
8999// cannot be GUID_NULL.
9000// The constraints on reparse tags are defined below.
9001// Microsoft tags can also be used with this format of the reparse point buffer.
9002//
9003
9004typedef struct _REPARSE_GUID_DATA_BUFFER {
9005 DWORD ReparseTag;
9006 WORD ReparseDataLength;
9007 WORD Reserved;
9008 GUID ReparseGuid;
9009 struct {
9010 BYTE DataBuffer[1];
9011 } GenericReparseBuffer;
9012} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
9013
9014#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
9015
9016
9017
9018//
9019// Maximum allowed size of the reparse data.
9020//
9021
9022#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 )
9023
9024//
9025// Predefined reparse tags.
9026// These tags need to avoid conflicting with IO_REMOUNT defined in ntos\inc\io.h
9027//
9028
9029#define IO_REPARSE_TAG_RESERVED_ZERO (0)
9030#define IO_REPARSE_TAG_RESERVED_ONE (1)
9031
9032//
9033// The value of the following constant needs to satisfy the following conditions:
9034// (1) Be at least as large as the largest of the reserved tags.
9035// (2) Be strictly smaller than all the tags in use.
9036//
9037
9038#define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE
9039
9040//
9041// The reparse tags are a DWORD. The 32 bits are laid out as follows:
9042//
9043// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
9044// 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
9045// +-+-+-+-+-----------------------+-------------------------------+
9046// |M|R|N|R| Reserved bits | Reparse Tag Value |
9047// +-+-+-+-+-----------------------+-------------------------------+
9048//
9049// M is the Microsoft bit. When set to 1, it denotes a tag owned by Microsoft.
9050// All ISVs must use a tag with a 0 in this position.
9051// Note: If a Microsoft tag is used by non-Microsoft software, the
9052// behavior is not defined.
9053//
9054// R is reserved. Must be zero for non-Microsoft tags.
9055//
9056// N is name surrogate. When set to 1, the file represents another named
9057// entity in the system.
9058//
9059// The M and N bits are OR-able.
9060// The following macros check for the M and N bit values:
9061//
9062
9063//
9064// Macro to determine whether a reparse point tag corresponds to a tag
9065// owned by Microsoft.
9066//
9067
9068#define IsReparseTagMicrosoft(_tag) ( \
9069 ((_tag) & 0x80000000) \
9070 )
9071
9072//
9073// Macro to determine whether a reparse point tag is a name surrogate
9074//
9075
9076#define IsReparseTagNameSurrogate(_tag) ( \
9077 ((_tag) & 0x20000000) \
9078 )
9079
9080#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
9081#define IO_REPARSE_TAG_HSM (0xC0000004L)
9082#define IO_REPARSE_TAG_HSM2 (0x80000006L)
9083#define IO_REPARSE_TAG_SIS (0x80000007L)
9084#define IO_REPARSE_TAG_WIM (0x80000008L)
9085#define IO_REPARSE_TAG_CSV (0x80000009L)
9086#define IO_REPARSE_TAG_DFS (0x8000000AL)
9087#define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
9088#define IO_REPARSE_TAG_DFSR (0x80000012L)
9089
9090//
9091// I/O Completion Specific Access Rights.
9092//
9093
9094#define IO_COMPLETION_MODIFY_STATE 0x0002
9095#define IO_COMPLETION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)
9096
9097//
9098// Object Manager Symbolic Link Specific Access Rights.
9099//
9100
9101#define DUPLICATE_CLOSE_SOURCE 0x00000001
9102#define DUPLICATE_SAME_ACCESS 0x00000002
9103
9104//
9105// =========================================
9106// Define GUIDs which represent well-known power schemes
9107// =========================================
9108//
9109
9110//
9111// Maximum Power Savings - indicates that very aggressive power savings measures will be used to help
9112// stretch battery life.
9113//
9114// {a1841308-3541-4fab-bc81-f71556f20b4a}
9115//
9116DEFINE_GUID( GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A );
9117
9118//
9119// No Power Savings - indicates that almost no power savings measures will be used.
9120//
9121// {8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c}
9122//
9123DEFINE_GUID( GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C );
9124
9125//
9126// Typical Power Savings - indicates that fairly aggressive power savings measures will be used.
9127//
9128// {381b4222-f694-41f0-9685-ff5bb260df2e}
9129//
9130DEFINE_GUID( GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E );
9131
9132//
9133// This is a special GUID that represents "no subgroup" of settings. That is, it indicates
9134// that settings that are in the root of the power policy hierarchy as opposed to settings
9135// that are buried under a subgroup of settings. This should be used when querying for
9136// power settings that may not fall into a subgroup.
9137//
9138DEFINE_GUID( NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94 );
9139
9140//
9141// This is a special GUID that represents "every power scheme". That is, it indicates
9142// that any write to this power scheme should be reflected to every scheme present.
9143// This allows users to write a single setting once and have it apply to all schemes. They
9144// can then apply custom settings to specific power schemes that they care about.
9145//
9146DEFINE_GUID( ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0 );
9147
9148//
9149// This is a special GUID that represents a 'personality' that each power scheme will have.
9150// In other words, each power scheme will have this key indicating "I'm most like *this* base
9151// power scheme." This individual setting will have one of three settings:
9152// GUID_MAX_POWER_SAVINGS
9153// GUID_MIN_POWER_SAVINGS
9154// GUID_TYPICAL_POWER_SAVINGS
9155//
9156// This allows several features:
9157// 1. Drivers and applications can register for notification of this GUID. So when this power
9158// scheme is activiated, this GUID's setting will be sent across the system and drivers/applications
9159// can see "GUID_MAX_POWER_SAVINGS" which will tell them in a generic fashion "get real aggressive
9160// about conserving power".
9161// 2. UserB may install a driver or application which creates power settings, and UserB may modify
9162// those power settings. Now UserA logs in. How does he see those settings? They simply don't
9163// exist in his private power key. Well they do exist over in the system power key. When we
9164// enumerate all the power settings in this system power key and don't find a corresponding entry
9165// in the user's private power key, then we can go look at this "personality" key in the users
9166// power scheme. We can then go get a default value for the power setting, depending on which
9167// "personality" power scheme is being operated on. Here's an example:
9168// A. UserB installs an application that creates a power setting Seetting1
9169// B. UserB changes Setting1 to have a value of 50 because that's one of the possible settings
9170// available for setting1.
9171// C. UserB logs out
9172// D. UserA logs in and his active power scheme is some custom scheme that was derived from
9173// the GUID_TYPICAL_POWER_SAVINGS. But remember that UserA has no setting1 in his
9174// private power key.
9175// E. When activating UserA's selected power scheme, all power settings in the system power key will
9176// be enumerated (including Setting1).
9177// F. The power manager will see that UserA has no Setting1 power setting in his private power scheme.
9178// G. The power manager will query UserA's power scheme for its personality and retrieve
9179// GUID_TYPICAL_POWER_SAVINGS.
9180// H. The power manager then looks in Setting1 in the system power key and looks in its set of default
9181// values for the corresponding value for GUID_TYPICAL_POWER_SAVINGS power schemes.
9182// I. This derived power setting is applied.
9183DEFINE_GUID( GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7 );
9184
9185//
9186// Define a special GUID which will be used to define the active power scheme.
9187// User will register for this power setting GUID, and when the active power
9188// scheme changes, they'll get a callback where the payload is the GUID
9189// representing the active powerscheme.
9190// ( 31F9F286-5084-42FE-B720-2B0264993763 }
9191//
9192DEFINE_GUID( GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63 );
9193
9194//
9195// =========================================
9196// Define GUIDs which represent well-known power settings
9197// =========================================
9198//
9199
9200// Video settings
9201// --------------
9202//
9203// Specifies the subgroup which will contain all of the video
9204// settings for a single policy.
9205//
9206DEFINE_GUID( GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99 );
9207
9208//
9209// Specifies (in seconds) how long we wait after the last user input has been
9210// recieved before we power off the video.
9211//
9212DEFINE_GUID( GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E );
9213
9214//
9215// Specifies whether adaptive display dimming is turned on or off.
9216// 82DBCF2D-CD67-40C5-BFDC-9F1A5CCD4663
9217//
9218DEFINE_GUID( GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63 );
9219
9220//
9221// Specifies how much adaptive dim time out will be increased by.
9222// EED904DF-B142-4183-B10B-5A1197A37864
9223//
9224DEFINE_GUID( GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64 );
9225
9226//
9227// Specifies (in seconds) how long we wait after the last user input has been
9228// recieved before we dim the video.
9229//
9230DEFINE_GUID( GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
9231
9232//
9233// Specifies if the operating system should use adaptive timers (based on
9234// previous behavior) to power down the video,
9235//
9236DEFINE_GUID( GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B );
9237
9238//
9239// Specifies if the monitor is currently being powered or not.
9240// 02731015-4510-4526-99E6-E5A17EBD1AEA
9241//
9242DEFINE_GUID( GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA );
9243
9244//
9245// Monitor brightness policy when in normal state
9246// {aded5e82-b909-4619-9949-f5d71dac0bcb}
9247DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
9248
9249//
9250//
9251// Monitor brightness policy when in dim state
9252// {f1fbfde2-a960-4165-9f88-50667911ce96}
9253DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
9254
9255//
9256// Current Monitor brightness
9257// {8ffee2c6-2d01-46be-adb9-398addc5b4ff}
9258DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
9259
9260
9261//
9262// Specifies if the operating system should use ambient light sensor to change
9263// disply brightness adatively.
9264// {FBD9AA66-9553-4097-BA44-ED6E9D65EAB8}
9265DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
9266
9267//
9268// Specifies a change in the session's display state.
9269// 73A5E93A-5BB1-4F93-895B-DBD0DA855967
9270//
9271// N.B. This is a session-specific notification, sent only to interactive
9272// session registrants. Session 0 and kernel mode consumers do not receive
9273// this notification.
9274DEFINE_GUID( GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67 );
9275
9276//
9277// Specifies a change in the current monitor's display state.
9278// 6fe69556-704a-47a0-8f24-c28d936fda47
9279//
9280DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
9281
9282//
9283// Defines a guid for enabling/disabling the ability to create display required
9284// power requests.
9285//
9286// {A9CEB8DA-CD46-44FB-A98B-02AF69DE4623}
9287//
9288DEFINE_GUID( GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23 );
9289
9290// Harddisk settings
9291// -----------------
9292//
9293// Specifies the subgroup which will contain all of the harddisk
9294// settings for a single policy.
9295//
9296DEFINE_GUID( GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42 );
9297
9298//
9299// Specifies (in seconds) how long we wait after the last disk access
9300// before we power off the disk.
9301//
9302DEFINE_GUID( GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E );
9303
9304//
9305// Specifies the amount of contiguous disk activity time to ignore when
9306// calculating disk idleness.
9307//
9308// 80e3c60e-bb94-4ad8-bbe0-0d3195efc663
9309//
9310
9311DEFINE_GUID( GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63 );
9312
9313//
9314// Specifies if the operating system should use adaptive timers (based on
9315// previous behavior) to power down the disk,
9316//
9317DEFINE_GUID( GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67 );
9318
9319// System sleep settings
9320// ---------------------
9321//
9322// Specifies the subgroup which will contain all of the sleep
9323// settings for a single policy.
9324// { 238C9FA8-0AAD-41ED-83F4-97BE242C8F20 }
9325//
9326DEFINE_GUID( GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20 );
9327
9328//
9329// Specifies an idle treshold percentage (0-100). The system must be this idle
9330// over a period of time in order to idle to sleep.
9331//
9332// N.B. DEPRECATED IN WINDOWS 6.1
9333//
9334DEFINE_GUID( GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70 );
9335
9336//
9337// Specifies (in seconds) how long we wait after the system is deemed
9338// "idle" before moving to standby (S1, S2 or S3).
9339//
9340DEFINE_GUID( GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA );
9341
9342//
9343// Specifies (in seconds) how long the system should go back to sleep after
9344// waking unattended. 0 indicates that the standard standby/hibernate idle
9345// policy should be used instead.
9346//
9347// {7bc4a2f9-d8fc-4469-b07b-33eb785aaca0}
9348//
9349DEFINE_GUID( GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0 );
9350
9351//
9352// Specifies (in seconds) how long we wait after the system is deemed
9353// "idle" before moving to hibernate (S4).
9354//
9355DEFINE_GUID( GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64 );
9356
9357//
9358// Specifies whether or not Fast S4 should be enabled if the system supports it
9359// 94AC6D29-73CE-41A6-809F-6363BA21B47E
9360//
9361DEFINE_GUID( GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E );
9362
9363//
9364// Define a GUID for controlling the criticality of sleep state transitions.
9365// Critical sleep transitions do not query applications, services or drivers
9366// before transitioning the platform to a sleep state.
9367//
9368// {B7A27025-E569-46c2-A504-2B96CAD225A1}
9369//
9370DEFINE_GUID( GUID_CRITICAL_POWER_TRANSITION, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
9371
9372//
9373// Specifies if the system is entering or exiting 'away mode'.
9374// 98A7F580-01F7-48AA-9C0F-44352C29E5C0
9375//
9376DEFINE_GUID( GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0 );
9377
9378// Specify whether away mode is allowed
9379//
9380// {25DFA149-5DD1-4736-B5AB-E8A37B5B8187}
9381//
9382DEFINE_GUID( GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87 );
9383
9384//
9385// Defines a guid for enabling/disabling standby (S1-S3) states. This does not
9386// affect hibernation (S4).
9387//
9388// {abfc2519-3608-4c2a-94ea-171b0ed546ab}
9389//
9390DEFINE_GUID( GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab );
9391
9392//
9393// Defines a guid for enabling/disabling the ability to wake via RTC.
9394//
9395// {BD3B718A-0680-4D9D-8AB2-E1D2B4AC806D}
9396//
9397DEFINE_GUID( GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D );
9398
9399//
9400// Defines a guid for enabling/disabling the ability to create system required
9401// power requests.
9402//
9403// {A4B195F5-8225-47D8-8012-9D41369786E2}
9404//
9405DEFINE_GUID( GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2 );
9406
9407// System button actions
9408// ---------------------
9409//
9410//
9411// Specifies the subgroup which will contain all of the system button
9412// settings for a single policy.
9413//
9414DEFINE_GUID( GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47 );
9415
9416// Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to
9417// take when the system power button is pressed.
9418//
9419DEFINE_GUID( GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80 );
9420DEFINE_GUID( GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78 );
9421
9422//
9423// Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to
9424// take when the system sleep button is pressed.
9425//
9426DEFINE_GUID( GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB );
9427DEFINE_GUID( GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93 );
9428
9429//
9430// Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to
9431// take when the system sleep button is pressed.
9432// { A7066653-8D6C-40A8-910E-A1F54B84C7E5 }
9433//
9434DEFINE_GUID( GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5 );
9435
9436//
9437// Specifies (in a POWER_ACTION_POLICY structure) the appropriate action to
9438// take when the system lid is closed.
9439//
9440DEFINE_GUID( GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36 );
9441DEFINE_GUID( GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B );
9442DEFINE_GUID( GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4 );
9443
9444
9445// Battery Discharge Settings
9446// --------------------------
9447//
9448// Specifies the subgroup which will contain all of the battery discharge
9449// settings for a single policy.
9450//
9451DEFINE_GUID( GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F );
9452
9453//
9454// 4 battery discharge alarm settings.
9455//
9456// GUID_BATTERY_DISCHARGE_ACTION_x - This is the action to take. It is a value
9457// of type POWER_ACTION
9458// GUID_BATTERY_DISCHARGE_LEVEL_x - This is the battery level (%)
9459// GUID_BATTERY_DISCHARGE_FLAGS_x - Flags defined below:
9460// POWER_ACTION_POLICY->EventCode flags
9461// BATTERY_DISCHARGE_FLAGS_EVENTCODE_MASK
9462// BATTERY_DISCHARGE_FLAGS_ENABLE
9463DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46 );
9464DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69 );
9465DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f );
9466
9467DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06 );
9468DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A );
9469DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58 );
9470
9471DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4 );
9472DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA );
9473DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82 );
9474
9475DEFINE_GUID( GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8 );
9476DEFINE_GUID( GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65 );
9477DEFINE_GUID( GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3 );
9478
9479// Processor power settings
9480// ------------------------
9481//
9482
9483// Specifies the subgroup which will contain all of the processor
9484// settings for a single policy.
9485//
9486DEFINE_GUID( GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00 );
9487
9488//
9489// Specifies various attributes that control processor performance/throttle
9490// states.
9491//
9492DEFINE_GUID( GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36 );
9493
9494#define PERFSTATE_POLICY_CHANGE_IDEAL 0
9495#define PERFSTATE_POLICY_CHANGE_SINGLE 1
9496#define PERFSTATE_POLICY_CHANGE_ROCKET 2
9497#define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKET
9498
9499//
9500// Specifies a percentage (between 0 and 100) that the processor frequency
9501// should never go above. For example, if this value is set to 80, then
9502// the processor frequency will never be throttled above 80 percent of its
9503// maximum frequency by the system.
9504//
9505DEFINE_GUID( GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC );
9506
9507//
9508// Specifies a percentage (between 0 and 100) that the processor frequency
9509// should not drop below. For example, if this value is set to 50, then the
9510// processor frequency will never be throttled below 50 percent of its
9511// maximum frequency by the system.
9512//
9513DEFINE_GUID( GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C );
9514
9515//
9516// Specifies whether throttle states are allowed to be used even when
9517// performance states are available.
9518//
9519// {3b04d4fd-1cc7-4f23-ab1c-d1337819c4bb}
9520//
9521DEFINE_GUID( GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb );
9522
9523//
9524// Specifies processor power settings for CState policy data
9525// {68F262A7-F621-4069-B9A5-4874169BE23C}
9526//
9527DEFINE_GUID( GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
9528
9529//
9530// Specifies processor power settings for PerfState policy data
9531// {BBDC3814-18E9-4463-8A55-D197327C45C0}
9532//
9533DEFINE_GUID( GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
9534
9535//
9536// Specifies the increase busy percentage threshold that must be met before
9537// increasing the processor performance state.
9538//
9539// {06cadf0e-64ed-448a-8927-ce7bf90eb35d}
9540//
9541DEFINE_GUID( GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d );
9542
9543//
9544// Specifies the decrease busy percentage threshold that must be met before
9545// decreasing the processor performance state.
9546//
9547// {12a0ab44-fe28-4fa9-b3bd-4b64f44960a6}
9548//
9549DEFINE_GUID( GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6 );
9550
9551//
9552// Specifies, either as ideal, single or rocket, how aggressive performance
9553// states should be selected when increasing the processor performance state.
9554//
9555// {465E1F50-B610-473a-AB58-00D1077DC418}
9556//
9557DEFINE_GUID( GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
9558
9559//
9560// Specifies, either as ideal, single or rocket, how aggressive performance
9561// states should be selected when decreasing the processor performance state.
9562//
9563// {40FBEFC7-2E9D-4d25-A185-0CFD8574BAC6}
9564//
9565DEFINE_GUID( GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
9566
9567//
9568// Specifies, in milliseconds, the minimum amount of time that must elapse after
9569// the last processor performance state change before increasing the processor
9570// performance state.
9571//
9572// {984CF492-3BED-4488-A8F9-4286C97BF5AA}
9573//
9574DEFINE_GUID( GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
9575
9576//
9577// Specifies, in milliseconds, the minimum amount of time that must elapse after
9578// the last processor performance state change before increasing the processor
9579// performance state.
9580//
9581// {D8EDEB9B-95CF-4f95-A73C-B061973693C8}
9582//
9583DEFINE_GUID( GUID_PROCESSOR_PERF_DECREASE_TIME, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
9584
9585//
9586// Specifies the time, in milliseconds, that must expire before considering
9587// a change in the processor performance states or parked core set.
9588//
9589// {4D2B0152-7D5C-498b-88E2-34345392A2C5}
9590//
9591DEFINE_GUID( GUID_PROCESSOR_PERF_TIME_CHECK, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
9592
9593//
9594// Specifies whether a processor may opportunistically increase frequency above
9595// the maximum when operating contitions allow it to do so safely.
9596//
9597// {45BCC044-D885-43e2-8605-EE0EC6E96B59}
9598//
9599DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY,
96000x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
9601
9602#define PROCESSOR_PERF_BOOST_POLICY_DISABLED 0
9603#define PROCESSOR_PERF_BOOST_POLICY_MAX 100
9604
9605//
9606// Specifies if idle state promotion and demotion values should be scaled based
9607// on the current peformance state.
9608//
9609// {6C2993B0-8F48-481f-BCC6-00DD2742AA06}
9610//
9611DEFINE_GUID( GUID_PROCESSOR_IDLE_ALLOW_SCALING, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
9612
9613//
9614// Specifies if idle states should be disabled.
9615//
9616// {5D76A2CA-E8C0-402f-A133-2158492D58AD}
9617//
9618DEFINE_GUID( GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
9619
9620//
9621// Specifies the time that elapsed since the last idle state promotion or
9622// demotion before idle states may be promoted or demoted again (in
9623// microseconds).
9624//
9625// {C4581C31-89AB-4597-8E2B-9C9CAB440E6B}
9626//
9627DEFINE_GUID( GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
9628
9629
9630//
9631// Specifies the upper busy threshold that must be met before demoting the
9632// processor to a lighter idle state (in percentage).
9633//
9634// {4B92D758-5A24-4851-A470-815D78AEE119}
9635//
9636DEFINE_GUID( GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
9637
9638//
9639// Specifies the lower busy threshold that must be met before promoting the
9640// processor to a deeper idle state (in percentage).
9641//
9642// {7B224883-B3CC-4d79-819F-8374152CBE7C}
9643//
9644DEFINE_GUID( GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
9645
9646//
9647// Specifies the utilization threshold in percent that must be crossed in order to un-park cores.
9648//
9649// {df142941-20f3-4edf-9a4a-9c83d3d717d1}
9650//
9651DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1 );
9652
9653//
9654// Specifies the utilization threshold in percent that must be crossed in order to park cores.
9655//
9656// {68dd2f27-a4ce-4e11-8487-3794e4135dfa}
9657//
9658DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
9659
9660//
9661// Specifies, either as ideal, single or rocket, how aggressive core parking is when cores must be unparked.
9662//
9663// {c7be0679-2817-4d69-9d02-519a537ed0c6}
9664//
9665DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
9666
9667#define CORE_PARKING_POLICY_CHANGE_IDEAL 0
9668#define CORE_PARKING_POLICY_CHANGE_SINGLE 1
9669#define CORE_PARKING_POLICY_CHANGE_ROCKET 2
9670#define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
9671
9672//
9673// Specifies, either as ideal, single or rocket, how aggressive core parking is when cores must be parked.
9674//
9675// {71021b41-c749-4d21-be74-a00f335d582b}
9676//
9677DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
9678
9679//
9680// Specifies, on a per processor group basis, the maximum number of cores that can be kept unparked.
9681//
9682// {ea062031-0e34-4ff1-9b6d-eb1059334028}
9683//
9684DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_MAX_CORES, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
9685
9686//
9687// Specifies, on a per processor group basis, the minimum number of cores that must be kept unparked.
9688//
9689// {0cc5b647-c1df-4637-891a-dec35c318583}
9690//
9691DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_MIN_CORES, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
9692
9693//
9694// Specifies, in milliseconds, the minimum amount of time a core must be parked before it can be unparked.
9695//
9696// {2ddd5a84-5a71-437e-912a-db0b8c788732}
9697//
9698DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
9699
9700//
9701// Specifies, in milliseconds, the minimum amount of time a core must be unparked before it can be parked.
9702//
9703// {dfd10d17-d5eb-45dd-877a-9a34ddd15c82}
9704//
9705DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
9706
9707//
9708// Specifies the factor by which to decrease affinity history on each core after each check.
9709//
9710// {8f7b45e3-c393-480a-878c-f67ac3d07082}
9711//
9712DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
9713
9714//
9715// Specifies the threshold above which a core is considered to have had significant affinitized work scheduled to it while parked.
9716//
9717// {5b33697b-e89d-4d38-aa46-9e7dfb7cd2f9}
9718//
9719DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
9720
9721//
9722// Specifies the weighting given to each occurence where affinitized work was scheduled to a parked core.
9723//
9724// {e70867f1-fa2f-4f4e-aea1-4d8a0ba23b20}
9725//
9726DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
9727
9728//
9729// Specifies the factor by which to decrease the over utilization history on each core after the current performance check.
9730//
9731// {1299023c-bc28-4f0a-81ec-d3295a8d815d}
9732//
9733DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
9734
9735//
9736// Specifies the threshold above which a core is considered to have been recently over utilized while parked.
9737//
9738// {9ac18e92-aa3c-4e27-b307-01ae37307129}
9739//
9740DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
9741
9742//
9743// Specifies the weighting given to each occurence where a parked core is found to be over utilized.
9744//
9745// {8809c2d8-b155-42d4-bcda-0d345651b1db}
9746//
9747DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
9748
9749//
9750// Specifies, in percentage, the busy threshold that must be met before a parked core is considered over utilized.
9751//
9752// {943c8cb6-6f93-4227-ad87-e9a3feec08d1}
9753//
9754DEFINE_GUID( GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
9755
9756//
9757// Specifies if at least one processor per core should always remain unparked.
9758//
9759// {a55612aa-f624-42c6-a443-7397d064c04f}
9760//
9761
9762DEFINE_GUID( GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
9763
9764//
9765// Specifies what performance state a processor should enter when first parked.
9766//
9767// {447235c7-6a8d-4cc0-8e24-9eaf70b96e2b}
9768//
9769
9770DEFINE_GUID( GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
9771
9772//
9773// Specifies the number of perf time check intervals to average utility over.
9774//
9775// {7d24baa7-0b84-480f-840c-1b0743c00f5f}
9776//
9777DEFINE_GUID( GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
9778
9779//
9780// Specifies active vs passive cooling. Although not directly related to
9781// processor settings, it is the processor that gets throttled if we're doing
9782// passive cooling, so it is fairly strongly related.
9783// {94D3A615-A899-4AC5-AE2B-E4D8F634367F}
9784//
9785DEFINE_GUID( GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
9786
9787// Lock Console on Wake
9788// --------------------
9789//
9790
9791// Specifies the behavior of the system when we wake from standby or
9792// hibernate. If this is set, then we will cause the console to lock
9793// after we resume.
9794//
9795DEFINE_GUID( GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51 );
9796
9797// Device idle characteristics
9798// ---------------------------
9799//
9800// Specifies whether to use the "performance" or "conservative" timeouts for
9801// device idle management.
9802//
9803// 4faab71a-92e5-4726-b531-224559672d19
9804//
9805DEFINE_GUID( GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19 );
9806
9807#define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0
9808#define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1
9809
9810// AC/DC power source
9811// ------------------
9812//
9813
9814// Specifies the power source for the system. consumers may register for
9815// notification when the power source changes and will be notified with
9816// one of 3 values:
9817// 0 - Indicates the system is being powered by an AC power source.
9818// 1 - Indicates the system is being powered by a DC power source.
9819// 2 - Indicates the system is being powered by a short-term DC power
9820// source. For example, this would be the case if the system is
9821// being powed by a short-term battery supply in a backing UPS
9822// system. When this value is recieved, the consumer should make
9823// preparations for either a system hibernate or system shutdown.
9824//
9825// { 5D3E9A59-E9D5-4B00-A6BD-FF34FF516548 }
9826DEFINE_GUID( GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48 );
9827
9828// Lid state changes
9829// -----------------
9830//
9831// Specifies the current state of the lid (open or closed). The callback won't
9832// be called at all until a lid device is found and its current state is known.
9833//
9834// Values:
9835//
9836// 0 - closed
9837// 1 - opened
9838//
9839// { BA3E0F4D-B817-4094-A2D1-D56379E6A0F3 }
9840//
9841
9842DEFINE_GUID( GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3 );
9843
9844// Battery life remaining
9845// ----------------------
9846//
9847
9848// Specifies the percentage of battery life remaining. The consumer
9849// may register for notification in order to track battery life in
9850// a fine-grained manner.
9851//
9852// Once registered, the consumer can expect to be notified as the battery
9853// life percentage changes.
9854//
9855// The consumer will recieve a value between 0 and 100 (inclusive) which
9856// indicates percent battery life remaining.
9857//
9858// { A7AD8041-B45A-4CAE-87A3-EECBB468A9E1 }
9859DEFINE_GUID( GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1 );
9860
9861
9862// Notification to listeners that the system is fairly busy and won't be moving
9863// into an idle state any time soon. This can be used as a hint to listeners
9864// that now might be a good time to do background tasks.
9865//
9866DEFINE_GUID( GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1 );
9867
9868// Notification to listeners that the system is fairly busy and won't be moving
9869// into an idle state any time soon. This can be used as a hint to listeners
9870// that now might be a good time to do background tasks.
9871//
9872// { CF23F240-2A54-48D8-B114-DE1518FF052E }
9873DEFINE_GUID( GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E );
9874
9875// Define a GUID that will represent the action of a direct experience button
9876// on the platform. Users will register for this DPPE setting and recieve
9877// notification when the h/w button is pressed.
9878//
9879// { 1A689231-7399-4E9A-8F99-B71F999DB3FA }
9880//
9881DEFINE_GUID( GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA );
9882
9883// PCI Express power settings
9884// ------------------------
9885//
9886
9887// Specifies the subgroup which will contain all of the PCI Express
9888// settings for a single policy.
9889//
9890// {501a4d13-42af-4429-9fd1-a8218c268e20}
9891//
9892DEFINE_GUID( GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20 );
9893
9894// Specifies the PCI Express ASPM power policy.
9895//
9896// {ee12f906-d277-404b-b6da-e5fa1a576df5}
9897//
9898DEFINE_GUID( GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5 );
9899
9900// POWER Shutdown settings
9901// ------------------------
9902//
9903
9904// Specifies if forced shutdown should be used for all button and lid initiated
9905// shutdown actions.
9906//
9907// {833a6b62-dfa4-46d1-82f8-e09e34d029d6}
9908//
9909
9910DEFINE_GUID( GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6 );
9911
9912
9913typedef enum _SYSTEM_POWER_STATE {
9914 PowerSystemUnspecified = 0,
9915 PowerSystemWorking = 1,
9916 PowerSystemSleeping1 = 2,
9917 PowerSystemSleeping2 = 3,
9918 PowerSystemSleeping3 = 4,
9919 PowerSystemHibernate = 5,
9920 PowerSystemShutdown = 6,
9921 PowerSystemMaximum = 7
9922} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
9923
9924#define POWER_SYSTEM_MAXIMUM 7
9925
9926typedef enum {
9927 PowerActionNone = 0,
9928 PowerActionReserved,
9929 PowerActionSleep,
9930 PowerActionHibernate,
9931 PowerActionShutdown,
9932 PowerActionShutdownReset,
9933 PowerActionShutdownOff,
9934 PowerActionWarmEject
9935} POWER_ACTION, *PPOWER_ACTION;
9936
9937typedef enum _DEVICE_POWER_STATE {
9938 PowerDeviceUnspecified = 0,
9939 PowerDeviceD0,
9940 PowerDeviceD1,
9941 PowerDeviceD2,
9942 PowerDeviceD3,
9943 PowerDeviceMaximum
9944} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
9945
9946typedef enum _MONITOR_DISPLAY_STATE {
9947 PowerMonitorOff = 0,
9948 PowerMonitorOn,
9949 PowerMonitorDim
9950} MONITOR_DISPLAY_STATE, *PMONITOR_DISPLAY_STATE;
9951
9952
9953#define ES_SYSTEM_REQUIRED ((DWORD)0x00000001)
9954#define ES_DISPLAY_REQUIRED ((DWORD)0x00000002)
9955#define ES_USER_PRESENT ((DWORD)0x00000004)
9956#define ES_AWAYMODE_REQUIRED ((DWORD)0x00000040)
9957#define ES_CONTINUOUS ((DWORD)0x80000000)
9958
9959typedef DWORD EXECUTION_STATE, *PEXECUTION_STATE;
9960
9961typedef enum {
9962 LT_DONT_CARE,
9963 LT_LOWEST_LATENCY
9964} LATENCY_TIME;
9965
9966#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
9967
9968#define DIAGNOSTIC_REASON_VERSION 0
9969
9970#define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001
9971#define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002
9972#define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000
9973#define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003)
9974
9975#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
9976
9977//
9978// Defines for power request APIs
9979//
9980
9981#define POWER_REQUEST_CONTEXT_VERSION 0
9982
9983#define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001
9984#define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002
9985
9986//
9987// N.B. The maximum is a macro (rather than part of enum) for cgen to be able
9988// to parse power.h correctly. When a new power request type is added, the
9989// PowerRequestMaximum should be manually incremented.
9990//
9991
9992typedef enum _POWER_REQUEST_TYPE {
9993 PowerRequestDisplayRequired,
9994 PowerRequestSystemRequired,
9995 PowerRequestAwayModeRequired
9996} POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE;
9997
9998#define PowerRequestMaximum 3
9999
10000// end_ntminiport
10001
10002#if (NTDDI_VERSION >= NTDDI_WINXP)
10003
10004//-----------------------------------------------------------------------------
10005// Device Power Information
10006// Accessable via CM_Get_DevInst_Registry_Property_Ex(CM_DRP_DEVICE_POWER_DATA)
10007//-----------------------------------------------------------------------------
10008
10009#define PDCAP_D0_SUPPORTED 0x00000001
10010#define PDCAP_D1_SUPPORTED 0x00000002
10011#define PDCAP_D2_SUPPORTED 0x00000004
10012#define PDCAP_D3_SUPPORTED 0x00000008
10013#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
10014#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
10015#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
10016#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
10017#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
10018
10019typedef struct CM_Power_Data_s {
10020 DWORD PD_Size;
10021 DEVICE_POWER_STATE PD_MostRecentPowerState;
10022 DWORD PD_Capabilities;
10023 DWORD PD_D1Latency;
10024 DWORD PD_D2Latency;
10025 DWORD PD_D3Latency;
10026 DEVICE_POWER_STATE PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM];
10027 SYSTEM_POWER_STATE PD_DeepestSystemWake;
10028} CM_POWER_DATA, *PCM_POWER_DATA;
10029
10030#endif // (NTDDI_VERSION >= NTDDI_WINXP)
10031
10032// begin_wdm
10033
10034typedef enum {
10035 SystemPowerPolicyAc,
10036 SystemPowerPolicyDc,
10037 VerifySystemPolicyAc,
10038 VerifySystemPolicyDc,
10039 SystemPowerCapabilities,
10040 SystemBatteryState,
10041 SystemPowerStateHandler,
10042 ProcessorStateHandler,
10043 SystemPowerPolicyCurrent,
10044 AdministratorPowerPolicy,
10045 SystemReserveHiberFile,
10046 ProcessorInformation,
10047 SystemPowerInformation,
10048 ProcessorStateHandler2,
10049 LastWakeTime, // Compare with KeQueryInterruptTime()
10050 LastSleepTime, // Compare with KeQueryInterruptTime()
10051 SystemExecutionState,
10052 SystemPowerStateNotifyHandler,
10053 ProcessorPowerPolicyAc,
10054 ProcessorPowerPolicyDc,
10055 VerifyProcessorPowerPolicyAc,
10056 VerifyProcessorPowerPolicyDc,
10057 ProcessorPowerPolicyCurrent,
10058 SystemPowerStateLogging,
10059 SystemPowerLoggingEntry,
10060 SetPowerSettingValue,
10061 NotifyUserPowerSetting,
10062 PowerInformationLevelUnused0,
10063 PowerInformationLevelUnused1,
10064 SystemVideoState,
10065 TraceApplicationPowerMessage,
10066 TraceApplicationPowerMessageEnd,
10067 ProcessorPerfStates,
10068 ProcessorIdleStates,
10069 ProcessorCap,
10070 SystemWakeSource,
10071 SystemHiberFileInformation,
10072 TraceServicePowerMessage,
10073 ProcessorLoad,
10074 PowerShutdownNotification,
10075 MonitorCapabilities,
10076 SessionPowerInit,
10077 SessionDisplayState,
10078 PowerRequestCreate,
10079 PowerRequestAction,
10080 GetPowerRequestList,
10081 ProcessorInformationEx,
10082 NotifyUserModeLegacyPowerEvent,
10083 GroupPark,
10084 ProcessorIdleDomains,
10085 WakeTimerList,
10086 SystemHiberFileSize,
10087 PowerInformationLevelMaximum
10088} POWER_INFORMATION_LEVEL;
10089
10090//
10091// Power Setting definitions
10092//
10093
10094typedef enum {
10095 PoAc,
10096 PoDc,
10097 PoHot,
10098 PoConditionMaximum
10099} SYSTEM_POWER_CONDITION;
10100
10101typedef struct {
10102
10103 //
10104 // Version of this structure. Currently should be set to
10105 // POWER_SETTING_VALUE_VERSION.
10106 //
10107 DWORD Version;
10108
10109
10110 //
10111 // GUID representing the power setting being applied.
10112 //
10113 GUID Guid;
10114
10115
10116 //
10117 // What power state should this setting be applied to? E.g.
10118 // AC, DC, thermal, ...
10119 //
10120 SYSTEM_POWER_CONDITION PowerCondition;
10121
10122 //
10123 // Length (in bytes) of the 'Data' member.
10124 //
10125 DWORD DataLength;
10126
10127 //
10128 // Data which contains the actual setting value.
10129 //
10130 BYTE Data[ANYSIZE_ARRAY];
10131} SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE;
10132
10133#define POWER_SETTING_VALUE_VERSION (0x1)
10134
10135typedef struct {
10136 GUID Guid;
10137} NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;
10138
10139//
10140// Package definition for an experience button device notification. When
10141// someone registers for GUID_EXPERIENCE_BUTTON, this is the definition of
10142// the setting data they'll get.
10143//
10144typedef struct _APPLICATIONLAUNCH_SETTING_VALUE {
10145
10146 //
10147 // System time when the most recent button press ocurred. Note that this is
10148 // specified in 100ns internvals since January 1, 1601.
10149 //
10150 LARGE_INTEGER ActivationTime;
10151
10152 //
10153 // Reserved for internal use.
10154 //
10155 DWORD Flags;
10156
10157 //
10158 // which instance of this device was pressed?
10159 //
10160 DWORD ButtonInstanceID;
10161
10162
10163} APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE;
10164
10165//
10166// define platform roles
10167//
10168
10169typedef enum {
10170 PlatformRoleUnspecified = 0,
10171 PlatformRoleDesktop,
10172 PlatformRoleMobile,
10173 PlatformRoleWorkstation,
10174 PlatformRoleEnterpriseServer,
10175 PlatformRoleSOHOServer,
10176 PlatformRoleAppliancePC,
10177 PlatformRolePerformanceServer,
10178 PlatformRoleMaximum
10179} POWER_PLATFORM_ROLE;
10180
10181//
10182// System power manager capabilities
10183//
10184
10185#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
10186typedef struct {
10187 DWORD Granularity;
10188 DWORD Capacity;
10189} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
10190#endif // (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
10191
10192//
10193
10194typedef struct {
10195 DWORD Frequency;
10196 DWORD Flags;
10197 DWORD PercentFrequency;
10198} PPM_WMI_LEGACY_PERFSTATE, *PPPM_WMI_LEGACY_PERFSTATE;
10199
10200typedef struct {
10201 DWORD Latency;
10202 DWORD Power;
10203 DWORD TimeCheck;
10204 BYTE PromotePercent;
10205 BYTE DemotePercent;
10206 BYTE StateType;
10207 BYTE Reserved;
10208 DWORD StateFlags;
10209 DWORD Context;
10210 DWORD IdleHandler;
10211 DWORD Reserved1; // reserved for future use
10212} PPM_WMI_IDLE_STATE, *PPPM_WMI_IDLE_STATE;
10213
10214typedef struct {
10215 DWORD Type;
10216 DWORD Count;
10217 DWORD TargetState; // current idle state
10218 DWORD OldState; // previous idle state
10219 DWORD64 TargetProcessors;
10220 PPM_WMI_IDLE_STATE State[ANYSIZE_ARRAY];
10221} PPM_WMI_IDLE_STATES, *PPPM_WMI_IDLE_STATES;
10222
10223typedef struct {
10224 DWORD Type;
10225 DWORD Count;
10226 DWORD TargetState; // current idle state
10227 DWORD OldState; // previous idle state
10228 PVOID TargetProcessors;
10229 PPM_WMI_IDLE_STATE State[ANYSIZE_ARRAY];
10230} PPM_WMI_IDLE_STATES_EX, *PPPM_WMI_IDLE_STATES_EX;
10231
10232typedef struct {
10233 DWORD Frequency; // in Mhz
10234 DWORD Power; // in milliwatts
10235 BYTE PercentFrequency;
10236 BYTE IncreaseLevel; // goto higher state
10237 BYTE DecreaseLevel; // goto lower state
10238 BYTE Type; // performance or throttle
10239 DWORD IncreaseTime; // in tick counts
10240 DWORD DecreaseTime; // in tick counts
10241 DWORD64 Control; // control value
10242 DWORD64 Status; // control value
10243 DWORD HitCount;
10244 DWORD Reserved1; // reserved for future use
10245 DWORD64 Reserved2;
10246 DWORD64 Reserved3;
10247} PPM_WMI_PERF_STATE, *PPPM_WMI_PERF_STATE;
10248
10249typedef struct {
10250 DWORD Count;
10251 DWORD MaxFrequency;
10252 DWORD CurrentState; // current state
10253 DWORD MaxPerfState; // fastest state considering policy restrictions
10254 DWORD MinPerfState; // slowest state considering policy restrictions
10255 DWORD LowestPerfState; // slowest perf state, fixed, aka the "knee"
10256 DWORD ThermalConstraint;
10257 BYTE BusyAdjThreshold;
10258 BYTE PolicyType; // domain coordination
10259 BYTE Type;
10260 BYTE Reserved;
10261 DWORD TimerInterval;
10262 DWORD64 TargetProcessors; // domain affinity
10263 DWORD PStateHandler;
10264 DWORD PStateContext;
10265 DWORD TStateHandler;
10266 DWORD TStateContext;
10267 DWORD FeedbackHandler;
10268 DWORD Reserved1;
10269 DWORD64 Reserved2;
10270 PPM_WMI_PERF_STATE State[ANYSIZE_ARRAY];
10271} PPM_WMI_PERF_STATES, *PPPM_WMI_PERF_STATES;
10272
10273typedef struct {
10274 DWORD Count;
10275 DWORD MaxFrequency;
10276 DWORD CurrentState; // current state
10277 DWORD MaxPerfState; // fastest state considering policy restrictions
10278 DWORD MinPerfState; // slowest state considering policy restrictions
10279 DWORD LowestPerfState; // slowest perf state, fixed, aka the "knee"
10280 DWORD ThermalConstraint;
10281 BYTE BusyAdjThreshold;
10282 BYTE PolicyType; // domain coordination
10283 BYTE Type;
10284 BYTE Reserved;
10285 DWORD TimerInterval;
10286 PVOID TargetProcessors; // domain affinity
10287 DWORD PStateHandler;
10288 DWORD PStateContext;
10289 DWORD TStateHandler;
10290 DWORD TStateContext;
10291 DWORD FeedbackHandler;
10292 DWORD Reserved1;
10293 DWORD64 Reserved2;
10294 PPM_WMI_PERF_STATE State[ANYSIZE_ARRAY];
10295} PPM_WMI_PERF_STATES_EX, *PPPM_WMI_PERF_STATES_EX;
10296
10297//
10298// Legacy processor idle accounting.
10299//
10300
10301#define PROC_IDLE_BUCKET_COUNT 6
10302
10303typedef struct {
10304 DWORD IdleTransitions;
10305 DWORD FailedTransitions;
10306 DWORD InvalidBucketIndex;
10307 DWORD64 TotalTime;
10308 DWORD IdleTimeBuckets[PROC_IDLE_BUCKET_COUNT];
10309} PPM_IDLE_STATE_ACCOUNTING, *PPPM_IDLE_STATE_ACCOUNTING;
10310
10311typedef struct {
10312 DWORD StateCount;
10313 DWORD TotalTransitions;
10314 DWORD ResetCount;
10315 DWORD64 StartTime;
10316 PPM_IDLE_STATE_ACCOUNTING State[ANYSIZE_ARRAY];
10317} PPM_IDLE_ACCOUNTING, *PPPM_IDLE_ACCOUNTING;
10318
10319//
10320// Processor idle accounting.
10321//
10322
10323#define PROC_IDLE_BUCKET_COUNT_EX 16
10324
10325typedef struct {
10326 DWORD64 TotalTimeUs;
10327 DWORD MinTimeUs;
10328 DWORD MaxTimeUs;
10329 DWORD Count;
10330} PPM_IDLE_STATE_BUCKET_EX, *PPPM_IDLE_STATE_BUCKET_EX;
10331
10332typedef struct {
10333 DWORD64 TotalTime;
10334 DWORD IdleTransitions;
10335 DWORD FailedTransitions;
10336 DWORD InvalidBucketIndex;
10337 DWORD MinTimeUs;
10338 DWORD MaxTimeUs;
10339 PPM_IDLE_STATE_BUCKET_EX IdleTimeBuckets[PROC_IDLE_BUCKET_COUNT_EX];
10340} PPM_IDLE_STATE_ACCOUNTING_EX, *PPPM_IDLE_STATE_ACCOUNTING_EX;
10341
10342typedef struct {
10343 DWORD StateCount;
10344 DWORD TotalTransitions;
10345 DWORD ResetCount;
10346 DWORD64 StartTime;
10347 __field_ecount(StateCount) PPM_IDLE_STATE_ACCOUNTING_EX State[ANYSIZE_ARRAY];
10348} PPM_IDLE_ACCOUNTING_EX, *PPPM_IDLE_ACCOUNTING_EX;
10349
10350//
10351// Definitions of coordination types for _PSD, _TSD, and _CSD BIOS objects from
10352// the Acpi 3.0 specification
10353//
10354
10355#define ACPI_PPM_SOFTWARE_ALL 0xFC
10356#define ACPI_PPM_SOFTWARE_ANY 0xFD
10357#define ACPI_PPM_HARDWARE_ALL 0xFE
10358
10359//
10360// Definition of Microsoft PPM coordination types.
10361//
10362
10363#define MS_PPM_SOFTWARE_ALL 0x1
10364
10365//
10366// Processor firmware rundown feature bit definitions.
10367//
10368
10369#define PPM_FIRMWARE_ACPI1C2 0x00000001
10370#define PPM_FIRMWARE_ACPI1C3 0x00000002
10371#define PPM_FIRMWARE_ACPI1TSTATES 0x00000004
10372#define PPM_FIRMWARE_CST 0x00000008
10373#define PPM_FIRMWARE_CSD 0x00000010
10374#define PPM_FIRMWARE_PCT 0x00000020
10375#define PPM_FIRMWARE_PSS 0x00000040
10376#define PPM_FIRMWARE_XPSS 0x00000080
10377#define PPM_FIRMWARE_PPC 0x00000100
10378#define PPM_FIRMWARE_PSD 0x00000200
10379#define PPM_FIRMWARE_PTC 0x00000400
10380#define PPM_FIRMWARE_TSS 0x00000800
10381#define PPM_FIRMWARE_TPC 0x00001000
10382#define PPM_FIRMWARE_TSD 0x00002000
10383#define PPM_FIRMWARE_PCCH 0x00004000
10384#define PPM_FIRMWARE_PCCP 0x00008000
10385
10386//
10387// Processor Power Management WMI interface.
10388//
10389
10390// {A5B32DDD-7F39-4abc-B892-900E43B59EBB}
10391DEFINE_GUID(PPM_PERFSTATE_CHANGE_GUID,
103920xa5b32ddd, 0x7f39, 0x4abc, 0xb8, 0x92, 0x90, 0xe, 0x43, 0xb5, 0x9e, 0xbb);
10393
10394// {995e6b7f-d653-497a-b978-36a30c29bf01}
10395DEFINE_GUID(PPM_PERFSTATE_DOMAIN_CHANGE_GUID,
103960x995e6b7f, 0xd653, 0x497a, 0xb9, 0x78, 0x36, 0xa3, 0xc, 0x29, 0xbf, 0x1);
10397
10398// {4838fe4f-f71c-4e51-9ecc-8430a7ac4c6c}
10399DEFINE_GUID(PPM_IDLESTATE_CHANGE_GUID,
104000x4838fe4f, 0xf71c, 0x4e51, 0x9e, 0xcc, 0x84, 0x30, 0xa7, 0xac, 0x4c, 0x6c);
10401
10402// {5708cc20-7d40-4bf4-b4aa-2b01338d0126}
10403DEFINE_GUID(PPM_PERFSTATES_DATA_GUID,
104040x5708cc20, 0x7d40, 0x4bf4, 0xb4, 0xaa, 0x2b, 0x01, 0x33, 0x8d, 0x01, 0x26);
10405
10406// {ba138e10-e250-4ad7-8616-cf1a7ad410e7}
10407DEFINE_GUID(PPM_IDLESTATES_DATA_GUID,
104080xba138e10, 0xe250, 0x4ad7, 0x86, 0x16, 0xcf, 0x1a, 0x7a, 0xd4, 0x10, 0xe7);
10409
10410// {e2a26f78-ae07-4ee0-a30f-ce354f5a94cd}
10411DEFINE_GUID(PPM_IDLE_ACCOUNTING_GUID,
104120xe2a26f78, 0xae07, 0x4ee0, 0xa3, 0x0f, 0xce, 0x54, 0xf5, 0x5a, 0x94, 0xcd);
10413
10414// {d67abd39-81f8-4a5e-8152-72e31ec912ee}
10415DEFINE_GUID(PPM_IDLE_ACCOUNTING_EX_GUID,
104160xd67abd39, 0x81f8, 0x4a5e, 0x81, 0x52, 0x72, 0xe3, 0x1e, 0xc9, 0x12, 0xee);
10417
10418// {a852c2c8-1a4c-423b-8c2c-f30d82931a88}
10419DEFINE_GUID(PPM_THERMALCONSTRAINT_GUID,
104200xa852c2c8, 0x1a4c, 0x423b, 0x8c, 0x2c, 0xf3, 0x0d, 0x82, 0x93, 0x1a, 0x88);
10421
10422// {7fd18652-0cfe-40d2-b0a1-0b066a87759e}
10423DEFINE_GUID(PPM_PERFMON_PERFSTATE_GUID,
104240x7fd18652, 0xcfe, 0x40d2, 0xb0, 0xa1, 0xb, 0x6, 0x6a, 0x87, 0x75, 0x9e);
10425
10426// {48f377b8-6880-4c7b-8bdc-380176c6654d}
10427DEFINE_GUID(PPM_THERMAL_POLICY_CHANGE_GUID,
104280x48f377b8, 0x6880, 0x4c7b, 0x8b, 0xdc, 0x38, 0x1, 0x76, 0xc6, 0x65, 0x4d);
10429
10430
10431typedef struct {
10432 DWORD State;
10433 DWORD Status;
10434 DWORD Latency;
10435 DWORD Speed;
10436 DWORD Processor;
10437} PPM_PERFSTATE_EVENT, *PPPM_PERFSTATE_EVENT;
10438
10439typedef struct {
10440 DWORD State;
10441 DWORD Latency;
10442 DWORD Speed;
10443 DWORD64 Processors;
10444} PPM_PERFSTATE_DOMAIN_EVENT, *PPPM_PERFSTATE_DOMAIN_EVENT;
10445
10446typedef struct {
10447 DWORD NewState;
10448 DWORD OldState;
10449 DWORD64 Processors;
10450} PPM_IDLESTATE_EVENT, *PPPM_IDLESTATE_EVENT;
10451
10452typedef struct {
10453 DWORD ThermalConstraint;
10454 DWORD64 Processors;
10455} PPM_THERMALCHANGE_EVENT, *PPPM_THERMALCHANGE_EVENT;
10456
10457#pragma warning(push)
10458#pragma warning(disable:4121)
10459
10460typedef struct {
10461 BYTE Mode;
10462 DWORD64 Processors;
10463} PPM_THERMAL_POLICY_EVENT, *PPPM_THERMAL_POLICY_EVENT;
10464
10465#pragma warning(pop)
10466
10467// Power Policy Management interfaces
10468//
10469
10470typedef struct {
10471 POWER_ACTION Action;
10472 DWORD Flags;
10473 DWORD EventCode;
10474} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;
10475
10476// POWER_ACTION_POLICY->Flags:
10477#define POWER_ACTION_QUERY_ALLOWED 0x00000001
10478#define POWER_ACTION_UI_ALLOWED 0x00000002
10479#define POWER_ACTION_OVERRIDE_APPS 0x00000004
10480#define POWER_ACTION_PSEUDO_TRANSITION 0x08000000
10481#define POWER_ACTION_LIGHTEST_FIRST 0x10000000
10482#define POWER_ACTION_LOCK_CONSOLE 0x20000000
10483#define POWER_ACTION_DISABLE_WAKES 0x40000000
10484#define POWER_ACTION_CRITICAL 0x80000000
10485
10486// POWER_ACTION_POLICY->EventCode flags
10487#define POWER_LEVEL_USER_NOTIFY_TEXT 0x00000001
10488#define POWER_LEVEL_USER_NOTIFY_SOUND 0x00000002
10489#define POWER_LEVEL_USER_NOTIFY_EXEC 0x00000004
10490#define POWER_USER_NOTIFY_BUTTON 0x00000008
10491#define POWER_USER_NOTIFY_SHUTDOWN 0x00000010
10492#define POWER_USER_NOTIFY_FORCED_SHUTDOWN 0x00000020
10493#define POWER_FORCE_TRIGGER_RESET 0x80000000
10494
10495// Note: for battery alarm EventCodes, the ID of the battery alarm << 16 is ORed
10496// into the flags. For example: DISCHARGE_POLICY_LOW << 16
10497
10498//
10499// The GUID_BATTERY_DISCHARGE_FLAGS_x power settings use a subset of EventCode
10500// flags. The POWER_FORCE_TRIGGER_RESET flag doesn't make sense for a battery
10501// alarm so it is overloaded for other purposes (gerneral enable/disable).
10502#define BATTERY_DISCHARGE_FLAGS_EVENTCODE_MASK 0x00000007
10503#define BATTERY_DISCHARGE_FLAGS_ENABLE 0x80000000
10504
10505// system battery drain policies
10506typedef struct {
10507 BOOLEAN Enable;
10508 BYTE Spare[3];
10509 DWORD BatteryLevel;
10510 POWER_ACTION_POLICY PowerPolicy;
10511 SYSTEM_POWER_STATE MinSystemState;
10512} SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;
10513
10514// Discharge policy constants
10515#define NUM_DISCHARGE_POLICIES 4
10516#define DISCHARGE_POLICY_CRITICAL 0
10517#define DISCHARGE_POLICY_LOW 1
10518
10519
10520// system power policies
10521typedef struct _SYSTEM_POWER_POLICY {
10522 DWORD Revision; // 1
10523
10524 // events
10525 POWER_ACTION_POLICY PowerButton;
10526 POWER_ACTION_POLICY SleepButton;
10527 POWER_ACTION_POLICY LidClose;
10528 SYSTEM_POWER_STATE LidOpenWake;
10529 DWORD Reserved;
10530
10531 // "system idle" detection
10532 POWER_ACTION_POLICY Idle;
10533 DWORD IdleTimeout;
10534 BYTE IdleSensitivity;
10535
10536 BYTE DynamicThrottle;
10537 BYTE Spare2[2];
10538
10539 // meaning of power action "sleep"
10540 SYSTEM_POWER_STATE MinSleep;
10541 SYSTEM_POWER_STATE MaxSleep;
10542 SYSTEM_POWER_STATE ReducedLatencySleep;
10543 DWORD WinLogonFlags;
10544
10545 DWORD Spare3;
10546
10547 // parameters for dozing
10548 //
10549 DWORD DozeS4Timeout;
10550
10551 // battery policies
10552 DWORD BroadcastCapacityResolution;
10553 SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES];
10554
10555 // video policies
10556 DWORD VideoTimeout;
10557 BOOLEAN VideoDimDisplay;
10558 DWORD VideoReserved[3];
10559
10560 // hard disk policies
10561 DWORD SpindownTimeout;
10562
10563 // processor policies
10564 BOOLEAN OptimizeForPower;
10565 BYTE FanThrottleTolerance;
10566 BYTE ForcedThrottle;
10567 BYTE MinThrottle;
10568 POWER_ACTION_POLICY OverThrottled;
10569
10570} SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;
10571
10572
10573// processor power policy state
10574
10575//
10576// Processor Idle State Policy.
10577//
10578
10579#define PROCESSOR_IDLESTATE_POLICY_COUNT 0x3
10580
10581typedef struct {
10582 DWORD TimeCheck;
10583 BYTE DemotePercent;
10584 BYTE PromotePercent;
10585 BYTE Spare[2];
10586} PROCESSOR_IDLESTATE_INFO, *PPROCESSOR_IDLESTATE_INFO;
10587
10588typedef struct {
10589 WORD Revision;
10590 union {
10591 WORD AsWORD ;
10592 struct {
10593 WORD AllowScaling : 1;
10594 WORD Disabled : 1;
10595 WORD Reserved : 14;
10596 } DUMMYSTRUCTNAME;
10597 } Flags;
10598
10599 DWORD PolicyCount;
10600 PROCESSOR_IDLESTATE_INFO Policy[PROCESSOR_IDLESTATE_POLICY_COUNT];
10601} PROCESSOR_IDLESTATE_POLICY, *PPROCESSOR_IDLESTATE_POLICY;
10602
10603//
10604// Legacy Processor Policy. This is only provided to allow legacy
10605// applications to compile. New applications must use
10606// PROCESSOR_IDLESTATE_POLICY.
10607//
10608
10609#define PO_THROTTLE_NONE 0
10610#define PO_THROTTLE_CONSTANT 1
10611#define PO_THROTTLE_DEGRADE 2
10612#define PO_THROTTLE_ADAPTIVE 3
10613#define PO_THROTTLE_MAXIMUM 4 // not a policy, just a limit
10614
10615
10616typedef struct _PROCESSOR_POWER_POLICY_INFO {
10617
10618 // Time based information (will be converted to kernel units)
10619 DWORD TimeCheck; // in US
10620 DWORD DemoteLimit; // in US
10621 DWORD PromoteLimit; // in US
10622
10623 // Percentage based information
10624 BYTE DemotePercent;
10625 BYTE PromotePercent;
10626 BYTE Spare[2];
10627
10628 // Flags
10629 DWORD AllowDemotion:1;
10630 DWORD AllowPromotion:1;
10631 DWORD Reserved:30;
10632
10633} PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;
10634
10635// processor power policy
10636typedef struct _PROCESSOR_POWER_POLICY {
10637 DWORD Revision; // 1
10638
10639 // Dynamic Throttling Policy
10640 BYTE DynamicThrottle;
10641 BYTE Spare[3];
10642
10643 // Flags
10644 DWORD DisableCStates:1;
10645 DWORD Reserved:31;
10646
10647 // System policy information
10648 // The Array is last, in case it needs to be grown and the structure
10649 // revision incremented.
10650 DWORD PolicyCount;
10651 PROCESSOR_POWER_POLICY_INFO Policy[3];
10652
10653} PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;
10654
10655//
10656// Processor Perf State Policy.
10657//
10658
10659typedef struct {
10660 DWORD Revision;
10661 BYTE MaxThrottle;
10662 BYTE MinThrottle;
10663 BYTE BusyAdjThreshold;
10664 union {
10665 BYTE Spare;
10666 union {
10667 BYTE AsBYTE ;
10668 struct {
10669 BYTE NoDomainAccounting : 1;
10670 BYTE IncreasePolicy: 2;
10671 BYTE DecreasePolicy: 2;
10672 BYTE Reserved : 3;
10673 } DUMMYSTRUCTNAME;
10674 } Flags;
10675 } DUMMYUNIONNAME;
10676
10677 DWORD TimeCheck;
10678 DWORD IncreaseTime;
10679 DWORD DecreaseTime;
10680 DWORD IncreasePercent;
10681 DWORD DecreasePercent;
10682} PROCESSOR_PERFSTATE_POLICY, *PPROCESSOR_PERFSTATE_POLICY;
10683
10684// administrator power policy overrides
10685typedef struct _ADMINISTRATOR_POWER_POLICY {
10686
10687 // meaning of power action "sleep"
10688 SYSTEM_POWER_STATE MinSleep;
10689 SYSTEM_POWER_STATE MaxSleep;
10690
10691 // video policies
10692 DWORD MinVideoTimeout;
10693 DWORD MaxVideoTimeout;
10694
10695 // disk policies
10696 DWORD MinSpindownTimeout;
10697 DWORD MaxSpindownTimeout;
10698} ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;
10699
10700
10701typedef struct {
10702 // Misc supported system features
10703 BOOLEAN PowerButtonPresent;
10704 BOOLEAN SleepButtonPresent;
10705 BOOLEAN LidPresent;
10706 BOOLEAN SystemS1;
10707 BOOLEAN SystemS2;
10708 BOOLEAN SystemS3;
10709 BOOLEAN SystemS4; // hibernate
10710 BOOLEAN SystemS5; // off
10711 BOOLEAN HiberFilePresent;
10712 BOOLEAN FullWake;
10713 BOOLEAN VideoDimPresent;
10714 BOOLEAN ApmPresent;
10715 BOOLEAN UpsPresent;
10716
10717 // Processors
10718 BOOLEAN ThermalControl;
10719 BOOLEAN ProcessorThrottle;
10720 BYTE ProcessorMinThrottle;
10721
10722#if (NTDDI_VERSION < NTDDI_WINXP)
10723 BYTE ProcessorThrottleScale;
10724 BYTE spare2[4];
10725#else
10726 BYTE ProcessorMaxThrottle;
10727 BOOLEAN FastSystemS4;
10728 BYTE spare2[3];
10729#endif // (NTDDI_VERSION < NTDDI_WINXP)
10730
10731 // Disk
10732 BOOLEAN DiskSpinDown;
10733 BYTE spare3[8];
10734
10735 // System Battery
10736 BOOLEAN SystemBatteriesPresent;
10737 BOOLEAN BatteriesAreShortTerm;
10738 BATTERY_REPORTING_SCALE BatteryScale[3];
10739
10740 // Wake
10741 SYSTEM_POWER_STATE AcOnLineWake;
10742 SYSTEM_POWER_STATE SoftLidWake;
10743 SYSTEM_POWER_STATE RtcWake;
10744 SYSTEM_POWER_STATE MinDeviceWakeState; // note this may change on driver load
10745 SYSTEM_POWER_STATE DefaultLowLatencyWake;
10746} SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;
10747
10748typedef struct {
10749 BOOLEAN AcOnLine;
10750 BOOLEAN BatteryPresent;
10751 BOOLEAN Charging;
10752 BOOLEAN Discharging;
10753 BOOLEAN Spare1[4];
10754
10755 DWORD MaxCapacity;
10756 DWORD RemainingCapacity;
10757 DWORD Rate;
10758 DWORD EstimatedTime;
10759
10760 DWORD DefaultAlert1;
10761 DWORD DefaultAlert2;
10762} SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
10763
10764
10765
10766//
10767// Image Format
10768//
10769
10770
10771#ifndef _MAC
10772
10773#include "pshpack4.h" // 4 byte packing is the default
10774
10775#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
10776#define IMAGE_OS2_SIGNATURE 0x454E // NE
10777#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
10778#define IMAGE_VXD_SIGNATURE 0x454C // LE
10779#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
10780
10781#include "pshpack2.h" // 16 bit headers are 2 byte packed
10782
10783#else
10784
10785#include "pshpack1.h"
10786
10787#define IMAGE_DOS_SIGNATURE 0x4D5A // MZ
10788#define IMAGE_OS2_SIGNATURE 0x4E45 // NE
10789#define IMAGE_OS2_SIGNATURE_LE 0x4C45 // LE
10790#define IMAGE_NT_SIGNATURE 0x50450000 // PE00
10791#endif
10792
10793typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
10794 WORD e_magic; // Magic number
10795 WORD e_cblp; // Bytes on last page of file
10796 WORD e_cp; // Pages in file
10797 WORD e_crlc; // Relocations
10798 WORD e_cparhdr; // Size of header in paragraphs
10799 WORD e_minalloc; // Minimum extra paragraphs needed
10800 WORD e_maxalloc; // Maximum extra paragraphs needed
10801 WORD e_ss; // Initial (relative) SS value
10802 WORD e_sp; // Initial SP value
10803 WORD e_csum; // Checksum
10804 WORD e_ip; // Initial IP value
10805 WORD e_cs; // Initial (relative) CS value
10806 WORD e_lfarlc; // File address of relocation table
10807 WORD e_ovno; // Overlay number
10808 WORD e_res[4]; // Reserved words
10809 WORD e_oemid; // OEM identifier (for e_oeminfo)
10810 WORD e_oeminfo; // OEM information; e_oemid specific
10811 WORD e_res2[10]; // Reserved words
10812 LONG e_lfanew; // File address of new exe header
10813 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
10814
10815typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header
10816 WORD ne_magic; // Magic number
10817 CHAR ne_ver; // Version number
10818 CHAR ne_rev; // Revision number
10819 WORD ne_enttab; // Offset of Entry Table
10820 WORD ne_cbenttab; // Number of bytes in Entry Table
10821 LONG ne_crc; // Checksum of whole file
10822 WORD ne_flags; // Flag word
10823 WORD ne_autodata; // Automatic data segment number
10824 WORD ne_heap; // Initial heap allocation
10825 WORD ne_stack; // Initial stack allocation
10826 LONG ne_csip; // Initial CS:IP setting
10827 LONG ne_sssp; // Initial SS:SP setting
10828 WORD ne_cseg; // Count of file segments
10829 WORD ne_cmod; // Entries in Module Reference Table
10830 WORD ne_cbnrestab; // Size of non-resident name table
10831 WORD ne_segtab; // Offset of Segment Table
10832 WORD ne_rsrctab; // Offset of Resource Table
10833 WORD ne_restab; // Offset of resident name table
10834 WORD ne_modtab; // Offset of Module Reference Table
10835 WORD ne_imptab; // Offset of Imported Names Table
10836 LONG ne_nrestab; // Offset of Non-resident Names Table
10837 WORD ne_cmovent; // Count of movable entries
10838 WORD ne_align; // Segment alignment shift count
10839 WORD ne_cres; // Count of resource segments
10840 BYTE ne_exetyp; // Target Operating system
10841 BYTE ne_flagsothers; // Other .EXE flags
10842 WORD ne_pretthunks; // offset to return thunks
10843 WORD ne_psegrefbytes; // offset to segment ref. bytes
10844 WORD ne_swaparea; // Minimum code swap area size
10845 WORD ne_expver; // Expected Windows version number
10846 } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
10847
10848typedef struct _IMAGE_VXD_HEADER { // Windows VXD header
10849 WORD e32_magic; // Magic number
10850 BYTE e32_border; // The byte ordering for the VXD
10851 BYTE e32_worder; // The word ordering for the VXD
10852 DWORD e32_level; // The EXE format level for now = 0
10853 WORD e32_cpu; // The CPU type
10854 WORD e32_os; // The OS type
10855 DWORD e32_ver; // Module version
10856 DWORD e32_mflags; // Module flags
10857 DWORD e32_mpages; // Module # pages
10858 DWORD e32_startobj; // Object # for instruction pointer
10859 DWORD e32_eip; // Extended instruction pointer
10860 DWORD e32_stackobj; // Object # for stack pointer
10861 DWORD e32_esp; // Extended stack pointer
10862 DWORD e32_pagesize; // VXD page size
10863 DWORD e32_lastpagesize; // Last page size in VXD
10864 DWORD e32_fixupsize; // Fixup section size
10865 DWORD e32_fixupsum; // Fixup section checksum
10866 DWORD e32_ldrsize; // Loader section size
10867 DWORD e32_ldrsum; // Loader section checksum
10868 DWORD e32_objtab; // Object table offset
10869 DWORD e32_objcnt; // Number of objects in module
10870 DWORD e32_objmap; // Object page map offset
10871 DWORD e32_itermap; // Object iterated data map offset
10872 DWORD e32_rsrctab; // Offset of Resource Table
10873 DWORD e32_rsrccnt; // Number of resource entries
10874 DWORD e32_restab; // Offset of resident name table
10875 DWORD e32_enttab; // Offset of Entry Table
10876 DWORD e32_dirtab; // Offset of Module Directive Table
10877 DWORD e32_dircnt; // Number of module directives
10878 DWORD e32_fpagetab; // Offset of Fixup Page Table
10879 DWORD e32_frectab; // Offset of Fixup Record Table
10880 DWORD e32_impmod; // Offset of Import Module Name Table
10881 DWORD e32_impmodcnt; // Number of entries in Import Module Name Table
10882 DWORD e32_impproc; // Offset of Import Procedure Name Table
10883 DWORD e32_pagesum; // Offset of Per-Page Checksum Table
10884 DWORD e32_datapage; // Offset of Enumerated Data Pages
10885 DWORD e32_preload; // Number of preload pages
10886 DWORD e32_nrestab; // Offset of Non-resident Names Table
10887 DWORD e32_cbnrestab; // Size of Non-resident Name Table
10888 DWORD e32_nressum; // Non-resident Name Table Checksum
10889 DWORD e32_autodata; // Object # for automatic data object
10890 DWORD e32_debuginfo; // Offset of the debugging information
10891 DWORD e32_debuglen; // The length of the debugging info. in bytes
10892 DWORD e32_instpreload; // Number of instance pages in preload section of VXD file
10893 DWORD e32_instdemand; // Number of instance pages in demand load section of VXD file
10894 DWORD e32_heapsize; // Size of heap - for 16-bit apps
10895 BYTE e32_res3[12]; // Reserved words
10896 DWORD e32_winresoff;
10897 DWORD e32_winreslen;
10898 WORD e32_devid; // Device ID for VxD
10899 WORD e32_ddkver; // DDK version for VxD
10900 } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
10901
10902#ifndef _MAC
10903#include "poppack.h" // Back to 4 byte packing
10904#endif
10905
10906//
10907// File header format.
10908//
10909
10910typedef struct _IMAGE_FILE_HEADER {
10911 WORD Machine;
10912 WORD NumberOfSections;
10913 DWORD TimeDateStamp;
10914 DWORD PointerToSymbolTable;
10915 DWORD NumberOfSymbols;
10916 WORD SizeOfOptionalHeader;
10917 WORD Characteristics;
10918} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
10919
10920#define IMAGE_SIZEOF_FILE_HEADER 20
10921
10922#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.
10923#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references).
10924#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.
10925#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.
10926#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 // Agressively trim working set
10927#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // App can handle >2gb addresses
10928#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed.
10929#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
10930#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file
10931#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 // If Image is on removable media, copy and run from the swap file.
10932#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 // If Image is on Net, copy and run from the swap file.
10933#define IMAGE_FILE_SYSTEM 0x1000 // System File.
10934#define IMAGE_FILE_DLL 0x2000 // File is a DLL.
10935#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 // File should only be run on a UP machine
10936#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed.
10937
10938#define IMAGE_FILE_MACHINE_UNKNOWN 0
10939#define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386.
10940#define IMAGE_FILE_MACHINE_R3000 0x0162 // MIPS little-endian, 0x160 big-endian
10941#define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little-endian
10942#define IMAGE_FILE_MACHINE_R10000 0x0168 // MIPS little-endian
10943#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 // MIPS little-endian WCE v2
10944#define IMAGE_FILE_MACHINE_ALPHA 0x0184 // Alpha_AXP
10945#define IMAGE_FILE_MACHINE_SH3 0x01a2 // SH3 little-endian
10946#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
10947#define IMAGE_FILE_MACHINE_SH3E 0x01a4 // SH3E little-endian
10948#define IMAGE_FILE_MACHINE_SH4 0x01a6 // SH4 little-endian
10949#define IMAGE_FILE_MACHINE_SH5 0x01a8 // SH5
10950#define IMAGE_FILE_MACHINE_ARM 0x01c0 // ARM Little-Endian
10951#define IMAGE_FILE_MACHINE_THUMB 0x01c2
10952#define IMAGE_FILE_MACHINE_AM33 0x01d3
10953#define IMAGE_FILE_MACHINE_POWERPC 0x01F0 // IBM PowerPC Little-Endian
10954#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
10955#define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel 64
10956#define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS
10957#define IMAGE_FILE_MACHINE_ALPHA64 0x0284 // ALPHA64
10958#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS
10959#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS
10960#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
10961#define IMAGE_FILE_MACHINE_TRICORE 0x0520 // Infineon
10962#define IMAGE_FILE_MACHINE_CEF 0x0CEF
10963#define IMAGE_FILE_MACHINE_EBC 0x0EBC // EFI Byte Code
10964#define IMAGE_FILE_MACHINE_AMD64 0x8664 // AMD64 (K8)
10965#define IMAGE_FILE_MACHINE_M32R 0x9041 // M32R little-endian
10966#define IMAGE_FILE_MACHINE_CEE 0xC0EE
10967
10968//
10969// Directory format.
10970//
10971
10972typedef struct _IMAGE_DATA_DIRECTORY {
10973 DWORD VirtualAddress;
10974 DWORD Size;
10975} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
10976
10977#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
10978
10979//
10980// Optional header format.
10981//
10982
10983typedef struct _IMAGE_OPTIONAL_HEADER {
10984 //
10985 // Standard fields.
10986 //
10987
10988 WORD Magic;
10989 BYTE MajorLinkerVersion;
10990 BYTE MinorLinkerVersion;
10991 DWORD SizeOfCode;
10992 DWORD SizeOfInitializedData;
10993 DWORD SizeOfUninitializedData;
10994 DWORD AddressOfEntryPoint;
10995 DWORD BaseOfCode;
10996 DWORD BaseOfData;
10997
10998 //
10999 // NT additional fields.
11000 //
11001
11002 DWORD ImageBase;
11003 DWORD SectionAlignment;
11004 DWORD FileAlignment;
11005 WORD MajorOperatingSystemVersion;
11006 WORD MinorOperatingSystemVersion;
11007 WORD MajorImageVersion;
11008 WORD MinorImageVersion;
11009 WORD MajorSubsystemVersion;
11010 WORD MinorSubsystemVersion;
11011 DWORD Win32VersionValue;
11012 DWORD SizeOfImage;
11013 DWORD SizeOfHeaders;
11014 DWORD CheckSum;
11015 WORD Subsystem;
11016 WORD DllCharacteristics;
11017 DWORD SizeOfStackReserve;
11018 DWORD SizeOfStackCommit;
11019 DWORD SizeOfHeapReserve;
11020 DWORD SizeOfHeapCommit;
11021 DWORD LoaderFlags;
11022 DWORD NumberOfRvaAndSizes;
11023 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
11024} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
11025
11026typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
11027 WORD Magic;
11028 BYTE MajorLinkerVersion;
11029 BYTE MinorLinkerVersion;
11030 DWORD SizeOfCode;
11031 DWORD SizeOfInitializedData;
11032 DWORD SizeOfUninitializedData;
11033 DWORD AddressOfEntryPoint;
11034 DWORD BaseOfCode;
11035 DWORD BaseOfData;
11036 DWORD BaseOfBss;
11037 DWORD GprMask;
11038 DWORD CprMask[4];
11039 DWORD GpValue;
11040} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
11041
11042typedef struct _IMAGE_OPTIONAL_HEADER64 {
11043 WORD Magic;
11044 BYTE MajorLinkerVersion;
11045 BYTE MinorLinkerVersion;
11046 DWORD SizeOfCode;
11047 DWORD SizeOfInitializedData;
11048 DWORD SizeOfUninitializedData;
11049 DWORD AddressOfEntryPoint;
11050 DWORD BaseOfCode;
11051 ULONGLONG ImageBase;
11052 DWORD SectionAlignment;
11053 DWORD FileAlignment;
11054 WORD MajorOperatingSystemVersion;
11055 WORD MinorOperatingSystemVersion;
11056 WORD MajorImageVersion;
11057 WORD MinorImageVersion;
11058 WORD MajorSubsystemVersion;
11059 WORD MinorSubsystemVersion;
11060 DWORD Win32VersionValue;
11061 DWORD SizeOfImage;
11062 DWORD SizeOfHeaders;
11063 DWORD CheckSum;
11064 WORD Subsystem;
11065 WORD DllCharacteristics;
11066 ULONGLONG SizeOfStackReserve;
11067 ULONGLONG SizeOfStackCommit;
11068 ULONGLONG SizeOfHeapReserve;
11069 ULONGLONG SizeOfHeapCommit;
11070 DWORD LoaderFlags;
11071 DWORD NumberOfRvaAndSizes;
11072 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
11073} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
11074
11075#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
11076#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
11077#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
11078
11079#ifdef _WIN64
11080typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
11081typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
11082#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
11083#else
11084typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
11085typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
11086#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
11087#endif
11088
11089typedef struct _IMAGE_NT_HEADERS64 {
11090 DWORD Signature;
11091 IMAGE_FILE_HEADER FileHeader;
11092 IMAGE_OPTIONAL_HEADER64 OptionalHeader;
11093} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
11094
11095typedef struct _IMAGE_NT_HEADERS {
11096 DWORD Signature;
11097 IMAGE_FILE_HEADER FileHeader;
11098 IMAGE_OPTIONAL_HEADER32 OptionalHeader;
11099} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
11100
11101typedef struct _IMAGE_ROM_HEADERS {
11102 IMAGE_FILE_HEADER FileHeader;
11103 IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
11104} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
11105
11106#ifdef _WIN64
11107typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
11108typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
11109#else
11110typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
11111typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
11112#endif
11113
11114// IMAGE_FIRST_SECTION doesn't need 32/64 versions since the file header is the same either way.
11115
11116#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \
11117 ((ULONG_PTR)(ntheader) + \
11118 FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
11119 ((ntheader))->FileHeader.SizeOfOptionalHeader \
11120 ))
11121
11122// Subsystem Values
11123
11124#define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
11125#define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem.
11126#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem.
11127#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem.
11128#define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem.
11129#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image runs in the Posix character subsystem.
11130#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver.
11131#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem.
11132#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 //
11133#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 //
11134#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 //
11135#define IMAGE_SUBSYSTEM_EFI_ROM 13
11136#define IMAGE_SUBSYSTEM_XBOX 14
11137#define IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION 16
11138
11139// DllCharacteristics Entries
11140
11141// IMAGE_LIBRARY_PROCESS_INIT 0x0001 // Reserved.
11142// IMAGE_LIBRARY_PROCESS_TERM 0x0002 // Reserved.
11143// IMAGE_LIBRARY_THREAD_INIT 0x0004 // Reserved.
11144// IMAGE_LIBRARY_THREAD_TERM 0x0008 // Reserved.
11145#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 // DLL can move.
11146#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080 // Code Integrity Image
11147#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 // Image is NX compatible
11148#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 // Image understands isolation and doesn't want it
11149#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 // Image does not use SEH. No SE handler may reside in this image
11150#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 // Do not bind this image.
11151// 0x1000 // Reserved.
11152#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 // Driver uses WDM model
11153// 0x4000 // Reserved.
11154#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
11155
11156// Directory Entries
11157
11158#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
11159#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
11160#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
11161#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
11162#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
11163#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
11164#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
11165// IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage)
11166#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data
11167#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP
11168#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
11169#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
11170#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
11171#define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table
11172#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors
11173#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
11174
11175//
11176// Non-COFF Object file header
11177//
11178
11179typedef struct ANON_OBJECT_HEADER {
11180 WORD Sig1; // Must be IMAGE_FILE_MACHINE_UNKNOWN
11181 WORD Sig2; // Must be 0xffff
11182 WORD Version; // >= 1 (implies the CLSID field is present)
11183 WORD Machine;
11184 DWORD TimeDateStamp;
11185 CLSID ClassID; // Used to invoke CoCreateInstance
11186 DWORD SizeOfData; // Size of data that follows the header
11187} ANON_OBJECT_HEADER;
11188
11189typedef struct ANON_OBJECT_HEADER_V2 {
11190 WORD Sig1; // Must be IMAGE_FILE_MACHINE_UNKNOWN
11191 WORD Sig2; // Must be 0xffff
11192 WORD Version; // >= 2 (implies the Flags field is present - otherwise V1)
11193 WORD Machine;
11194 DWORD TimeDateStamp;
11195 CLSID ClassID; // Used to invoke CoCreateInstance
11196 DWORD SizeOfData; // Size of data that follows the header
11197 DWORD Flags; // 0x1 -> contains metadata
11198 DWORD MetaDataSize; // Size of CLR metadata
11199 DWORD MetaDataOffset; // Offset of CLR metadata
11200} ANON_OBJECT_HEADER_V2;
11201
11202typedef struct ANON_OBJECT_HEADER_BIGOBJ {
11203 /* same as ANON_OBJECT_HEADER_V2 */
11204 WORD Sig1; // Must be IMAGE_FILE_MACHINE_UNKNOWN
11205 WORD Sig2; // Must be 0xffff
11206 WORD Version; // >= 2 (implies the Flags field is present)
11207 WORD Machine; // Actual machine - IMAGE_FILE_MACHINE_xxx
11208 DWORD TimeDateStamp;
11209 CLSID ClassID; // {D1BAA1C7-BAEE-4ba9-AF20-FAF66AA4DCB8}
11210 DWORD SizeOfData; // Size of data that follows the header
11211 DWORD Flags; // 0x1 -> contains metadata
11212 DWORD MetaDataSize; // Size of CLR metadata
11213 DWORD MetaDataOffset; // Offset of CLR metadata
11214
11215 /* bigobj specifics */
11216 DWORD NumberOfSections; // extended from WORD
11217 DWORD PointerToSymbolTable;
11218 DWORD NumberOfSymbols;
11219} ANON_OBJECT_HEADER_BIGOBJ;
11220
11221//
11222// Section header format.
11223//
11224
11225#define IMAGE_SIZEOF_SHORT_NAME 8
11226
11227typedef struct _IMAGE_SECTION_HEADER {
11228 BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
11229 union {
11230 DWORD PhysicalAddress;
11231 DWORD VirtualSize;
11232 } Misc;
11233 DWORD VirtualAddress;
11234 DWORD SizeOfRawData;
11235 DWORD PointerToRawData;
11236 DWORD PointerToRelocations;
11237 DWORD PointerToLinenumbers;
11238 WORD NumberOfRelocations;
11239 WORD NumberOfLinenumbers;
11240 DWORD Characteristics;
11241} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
11242
11243#define IMAGE_SIZEOF_SECTION_HEADER 40
11244
11245//
11246// Section characteristics.
11247//
11248// IMAGE_SCN_TYPE_REG 0x00000000 // Reserved.
11249// IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved.
11250// IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved.
11251// IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved.
11252#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.
11253// IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved.
11254
11255#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
11256#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
11257#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
11258
11259#define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved.
11260#define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.
11261// IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved.
11262#define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.
11263#define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat.
11264// 0x00002000 // Reserved.
11265// IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000
11266#define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 // Reset speculative exceptions handling bits in the TLB entries for this section.
11267#define IMAGE_SCN_GPREL 0x00008000 // Section content can be accessed relative to GP
11268#define IMAGE_SCN_MEM_FARDATA 0x00008000
11269// IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000
11270#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
11271#define IMAGE_SCN_MEM_16BIT 0x00020000
11272#define IMAGE_SCN_MEM_LOCKED 0x00040000
11273#define IMAGE_SCN_MEM_PRELOAD 0x00080000
11274
11275#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 //
11276#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 //
11277#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 //
11278#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 //
11279#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified.
11280#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 //
11281#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 //
11282#define IMAGE_SCN_ALIGN_128BYTES 0x00800000 //
11283#define IMAGE_SCN_ALIGN_256BYTES 0x00900000 //
11284#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 //
11285#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 //
11286#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 //
11287#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 //
11288#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 //
11289// Unused 0x00F00000
11290#define IMAGE_SCN_ALIGN_MASK 0x00F00000
11291
11292#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // Section contains extended relocations.
11293#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
11294#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
11295#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
11296#define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
11297#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
11298#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
11299#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
11300
11301//
11302// TLS Chaacteristic Flags
11303//
11304#define IMAGE_SCN_SCALE_INDEX 0x00000001 // Tls index is scaled
11305
11306#ifndef _MAC
11307#include "pshpack2.h" // Symbols, relocs, and linenumbers are 2 byte packed
11308#endif
11309
11310//
11311// Symbol format.
11312//
11313
11314typedef struct _IMAGE_SYMBOL {
11315 union {
11316 BYTE ShortName[8];
11317 struct {
11318 DWORD Short; // if 0, use LongName
11319 DWORD Long; // offset into string table
11320 } Name;
11321 DWORD LongName[2]; // PBYTE [2]
11322 } N;
11323 DWORD Value;
11324 SHORT SectionNumber;
11325 WORD Type;
11326 BYTE StorageClass;
11327 BYTE NumberOfAuxSymbols;
11328} IMAGE_SYMBOL;
11329typedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;
11330
11331#define IMAGE_SIZEOF_SYMBOL 18
11332
11333typedef struct _IMAGE_SYMBOL_EX {
11334 union {
11335 BYTE ShortName[8];
11336 struct {
11337 DWORD Short; // if 0, use LongName
11338 DWORD Long; // offset into string table
11339 } Name;
11340 DWORD LongName[2]; // PBYTE [2]
11341 } N;
11342 DWORD Value;
11343 LONG SectionNumber;
11344 WORD Type;
11345 BYTE StorageClass;
11346 BYTE NumberOfAuxSymbols;
11347} IMAGE_SYMBOL_EX;
11348typedef IMAGE_SYMBOL_EX UNALIGNED *PIMAGE_SYMBOL_EX;
11349
11350//
11351// Section values.
11352//
11353// Symbols have a section number of the section in which they are
11354// defined. Otherwise, section numbers have the following meanings:
11355//
11356
11357#define IMAGE_SYM_UNDEFINED (SHORT)0 // Symbol is undefined or is common.
11358#define IMAGE_SYM_ABSOLUTE (SHORT)-1 // Symbol is an absolute value.
11359#define IMAGE_SYM_DEBUG (SHORT)-2 // Symbol is a special debug item.
11360#define IMAGE_SYM_SECTION_MAX 0xFEFF // Values 0xFF00-0xFFFF are special
11361#define IMAGE_SYM_SECTION_MAX_EX MAXLONG
11362
11363//
11364// Type (fundamental) values.
11365//
11366
11367#define IMAGE_SYM_TYPE_NULL 0x0000 // no type.
11368#define IMAGE_SYM_TYPE_VOID 0x0001 //
11369#define IMAGE_SYM_TYPE_CHAR 0x0002 // type character.
11370#define IMAGE_SYM_TYPE_SHORT 0x0003 // type short integer.
11371#define IMAGE_SYM_TYPE_INT 0x0004 //
11372#define IMAGE_SYM_TYPE_LONG 0x0005 //
11373#define IMAGE_SYM_TYPE_FLOAT 0x0006 //
11374#define IMAGE_SYM_TYPE_DOUBLE 0x0007 //
11375#define IMAGE_SYM_TYPE_STRUCT 0x0008 //
11376#define IMAGE_SYM_TYPE_UNION 0x0009 //
11377#define IMAGE_SYM_TYPE_ENUM 0x000A // enumeration.
11378#define IMAGE_SYM_TYPE_MOE 0x000B // member of enumeration.
11379#define IMAGE_SYM_TYPE_BYTE 0x000C //
11380#define IMAGE_SYM_TYPE_WORD 0x000D //
11381#define IMAGE_SYM_TYPE_UINT 0x000E //
11382#define IMAGE_SYM_TYPE_DWORD 0x000F //
11383#define IMAGE_SYM_TYPE_PCODE 0x8000 //
11384//
11385// Type (derived) values.
11386//
11387
11388#define IMAGE_SYM_DTYPE_NULL 0 // no derived type.
11389#define IMAGE_SYM_DTYPE_POINTER 1 // pointer.
11390#define IMAGE_SYM_DTYPE_FUNCTION 2 // function.
11391#define IMAGE_SYM_DTYPE_ARRAY 3 // array.
11392
11393//
11394// Storage classes.
11395//
11396#define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1
11397#define IMAGE_SYM_CLASS_NULL 0x0000
11398#define IMAGE_SYM_CLASS_AUTOMATIC 0x0001
11399#define IMAGE_SYM_CLASS_EXTERNAL 0x0002
11400#define IMAGE_SYM_CLASS_STATIC 0x0003
11401#define IMAGE_SYM_CLASS_REGISTER 0x0004
11402#define IMAGE_SYM_CLASS_EXTERNAL_DEF 0x0005
11403#define IMAGE_SYM_CLASS_LABEL 0x0006
11404#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 0x0007
11405#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 0x0008
11406#define IMAGE_SYM_CLASS_ARGUMENT 0x0009
11407#define IMAGE_SYM_CLASS_STRUCT_TAG 0x000A
11408#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 0x000B
11409#define IMAGE_SYM_CLASS_UNION_TAG 0x000C
11410#define IMAGE_SYM_CLASS_TYPE_DEFINITION 0x000D
11411#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 0x000E
11412#define IMAGE_SYM_CLASS_ENUM_TAG 0x000F
11413#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 0x0010
11414#define IMAGE_SYM_CLASS_REGISTER_PARAM 0x0011
11415#define IMAGE_SYM_CLASS_BIT_FIELD 0x0012
11416
11417#define IMAGE_SYM_CLASS_FAR_EXTERNAL 0x0044 //
11418
11419#define IMAGE_SYM_CLASS_BLOCK 0x0064
11420#define IMAGE_SYM_CLASS_FUNCTION 0x0065
11421#define IMAGE_SYM_CLASS_END_OF_STRUCT 0x0066
11422#define IMAGE_SYM_CLASS_FILE 0x0067
11423// new
11424#define IMAGE_SYM_CLASS_SECTION 0x0068
11425#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 0x0069
11426
11427#define IMAGE_SYM_CLASS_CLR_TOKEN 0x006B
11428
11429// type packing constants
11430
11431#define N_BTMASK 0x000F
11432#define N_TMASK 0x0030
11433#define N_TMASK1 0x00C0
11434#define N_TMASK2 0x00F0
11435#define N_BTSHFT 4
11436#define N_TSHIFT 2
11437// MACROS
11438
11439// Basic Type of x
11440#define BTYPE(x) ((x) & N_BTMASK)
11441
11442// Is x a pointer?
11443#ifndef ISPTR
11444#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
11445#endif
11446
11447// Is x a function?
11448#ifndef ISFCN
11449#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
11450#endif
11451
11452// Is x an array?
11453
11454#ifndef ISARY
11455#define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))
11456#endif
11457
11458// Is x a structure, union, or enumeration TAG?
11459#ifndef ISTAG
11460#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)
11461#endif
11462
11463#ifndef INCREF
11464#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))
11465#endif
11466#ifndef DECREF
11467#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))
11468#endif
11469
11470#include <pshpack2.h>
11471
11472typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {
11473 BYTE bAuxType; // IMAGE_AUX_SYMBOL_TYPE
11474 BYTE bReserved; // Must be 0
11475 DWORD SymbolTableIndex;
11476 BYTE rgbReserved[12]; // Must be 0
11477} IMAGE_AUX_SYMBOL_TOKEN_DEF;
11478
11479typedef IMAGE_AUX_SYMBOL_TOKEN_DEF UNALIGNED *PIMAGE_AUX_SYMBOL_TOKEN_DEF;
11480
11481#include <poppack.h>
11482
11483//
11484// Auxiliary entry format.
11485//
11486
11487typedef union _IMAGE_AUX_SYMBOL {
11488 struct {
11489 DWORD TagIndex; // struct, union, or enum tag index
11490 union {
11491 struct {
11492 WORD Linenumber; // declaration line number
11493 WORD Size; // size of struct, union, or enum
11494 } LnSz;
11495 DWORD TotalSize;
11496 } Misc;
11497 union {
11498 struct { // if ISFCN, tag, or .bb
11499 DWORD PointerToLinenumber;
11500 DWORD PointerToNextFunction;
11501 } Function;
11502 struct { // if ISARY, up to 4 dimen.
11503 WORD Dimension[4];
11504 } Array;
11505 } FcnAry;
11506 WORD TvIndex; // tv index
11507 } Sym;
11508 struct {
11509 BYTE Name[IMAGE_SIZEOF_SYMBOL];
11510 } File;
11511 struct {
11512 DWORD Length; // section length
11513 WORD NumberOfRelocations; // number of relocation entries
11514 WORD NumberOfLinenumbers; // number of line numbers
11515 DWORD CheckSum; // checksum for communal
11516 SHORT Number; // section number to associate with
11517 BYTE Selection; // communal selection type
11518 BYTE bReserved;
11519 SHORT HighNumber; // high bits of the section number
11520 } Section;
11521 IMAGE_AUX_SYMBOL_TOKEN_DEF TokenDef;
11522 struct {
11523 DWORD crc;
11524 BYTE rgbReserved[14];
11525 } CRC;
11526} IMAGE_AUX_SYMBOL;
11527typedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL;
11528
11529typedef union _IMAGE_AUX_SYMBOL_EX {
11530 struct {
11531 DWORD WeakDefaultSymIndex; // the weak extern default symbol index
11532 DWORD WeakSearchType;
11533 BYTE rgbReserved[12];
11534 } Sym;
11535 struct {
11536 BYTE Name[sizeof(IMAGE_SYMBOL_EX)];
11537 } File;
11538 struct {
11539 DWORD Length; // section length
11540 WORD NumberOfRelocations; // number of relocation entries
11541 WORD NumberOfLinenumbers; // number of line numbers
11542 DWORD CheckSum; // checksum for communal
11543 SHORT Number; // section number to associate with
11544 BYTE Selection; // communal selection type
11545 BYTE bReserved;
11546 SHORT HighNumber; // high bits of the section number
11547 BYTE rgbReserved[2];
11548 } Section;
11549 struct{
11550 IMAGE_AUX_SYMBOL_TOKEN_DEF TokenDef;
11551 BYTE rgbReserved[2];
11552 };
11553 struct {
11554 DWORD crc;
11555 BYTE rgbReserved[16];
11556 } CRC;
11557} IMAGE_AUX_SYMBOL_EX;
11558typedef IMAGE_AUX_SYMBOL_EX UNALIGNED *PIMAGE_AUX_SYMBOL_EX;
11559
11560typedef enum IMAGE_AUX_SYMBOL_TYPE {
11561 IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1,
11562} IMAGE_AUX_SYMBOL_TYPE;
11563
11564
11565//
11566// Communal selection types.
11567//
11568
11569#define IMAGE_COMDAT_SELECT_NODUPLICATES 1
11570#define IMAGE_COMDAT_SELECT_ANY 2
11571#define IMAGE_COMDAT_SELECT_SAME_SIZE 3
11572#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4
11573#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5
11574#define IMAGE_COMDAT_SELECT_LARGEST 6
11575#define IMAGE_COMDAT_SELECT_NEWEST 7
11576
11577#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1
11578#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
11579#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3
11580
11581//
11582// Relocation format.
11583//
11584
11585typedef struct _IMAGE_RELOCATION {
11586 union {
11587 DWORD VirtualAddress;
11588 DWORD RelocCount; // Set to the real count when IMAGE_SCN_LNK_NRELOC_OVFL is set
11589 } DUMMYUNIONNAME;
11590 DWORD SymbolTableIndex;
11591 WORD Type;
11592} IMAGE_RELOCATION;
11593typedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;
11594
11595//
11596// I386 relocation types.
11597//
11598#define IMAGE_REL_I386_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
11599#define IMAGE_REL_I386_DIR16 0x0001 // Direct 16-bit reference to the symbols virtual address
11600#define IMAGE_REL_I386_REL16 0x0002 // PC-relative 16-bit reference to the symbols virtual address
11601#define IMAGE_REL_I386_DIR32 0x0006 // Direct 32-bit reference to the symbols virtual address
11602#define IMAGE_REL_I386_DIR32NB 0x0007 // Direct 32-bit reference to the symbols virtual address, base not included
11603#define IMAGE_REL_I386_SEG12 0x0009 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address
11604#define IMAGE_REL_I386_SECTION 0x000A
11605#define IMAGE_REL_I386_SECREL 0x000B
11606#define IMAGE_REL_I386_TOKEN 0x000C // clr token
11607#define IMAGE_REL_I386_SECREL7 0x000D // 7 bit offset from base of section containing target
11608#define IMAGE_REL_I386_REL32 0x0014 // PC-relative 32-bit reference to the symbols virtual address
11609
11610//
11611// MIPS relocation types.
11612//
11613#define IMAGE_REL_MIPS_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
11614#define IMAGE_REL_MIPS_REFHALF 0x0001
11615#define IMAGE_REL_MIPS_REFWORD 0x0002
11616#define IMAGE_REL_MIPS_JMPADDR 0x0003
11617#define IMAGE_REL_MIPS_REFHI 0x0004
11618#define IMAGE_REL_MIPS_REFLO 0x0005
11619#define IMAGE_REL_MIPS_GPREL 0x0006
11620#define IMAGE_REL_MIPS_LITERAL 0x0007
11621#define IMAGE_REL_MIPS_SECTION 0x000A
11622#define IMAGE_REL_MIPS_SECREL 0x000B
11623#define IMAGE_REL_MIPS_SECRELLO 0x000C // Low 16-bit section relative referemce (used for >32k TLS)
11624#define IMAGE_REL_MIPS_SECRELHI 0x000D // High 16-bit section relative reference (used for >32k TLS)
11625#define IMAGE_REL_MIPS_TOKEN 0x000E // clr token
11626#define IMAGE_REL_MIPS_JMPADDR16 0x0010
11627#define IMAGE_REL_MIPS_REFWORDNB 0x0022
11628#define IMAGE_REL_MIPS_PAIR 0x0025
11629
11630//
11631// Alpha Relocation types.
11632//
11633#define IMAGE_REL_ALPHA_ABSOLUTE 0x0000
11634#define IMAGE_REL_ALPHA_REFLONG 0x0001
11635#define IMAGE_REL_ALPHA_REFQUAD 0x0002
11636#define IMAGE_REL_ALPHA_GPREL32 0x0003
11637#define IMAGE_REL_ALPHA_LITERAL 0x0004
11638#define IMAGE_REL_ALPHA_LITUSE 0x0005
11639#define IMAGE_REL_ALPHA_GPDISP 0x0006
11640#define IMAGE_REL_ALPHA_BRADDR 0x0007
11641#define IMAGE_REL_ALPHA_HINT 0x0008
11642#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009
11643#define IMAGE_REL_ALPHA_REFHI 0x000A
11644#define IMAGE_REL_ALPHA_REFLO 0x000B
11645#define IMAGE_REL_ALPHA_PAIR 0x000C
11646#define IMAGE_REL_ALPHA_MATCH 0x000D
11647#define IMAGE_REL_ALPHA_SECTION 0x000E
11648#define IMAGE_REL_ALPHA_SECREL 0x000F
11649#define IMAGE_REL_ALPHA_REFLONGNB 0x0010
11650#define IMAGE_REL_ALPHA_SECRELLO 0x0011 // Low 16-bit section relative reference
11651#define IMAGE_REL_ALPHA_SECRELHI 0x0012 // High 16-bit section relative reference
11652#define IMAGE_REL_ALPHA_REFQ3 0x0013 // High 16 bits of 48 bit reference
11653#define IMAGE_REL_ALPHA_REFQ2 0x0014 // Middle 16 bits of 48 bit reference
11654#define IMAGE_REL_ALPHA_REFQ1 0x0015 // Low 16 bits of 48 bit reference
11655#define IMAGE_REL_ALPHA_GPRELLO 0x0016 // Low 16-bit GP relative reference
11656#define IMAGE_REL_ALPHA_GPRELHI 0x0017 // High 16-bit GP relative reference
11657
11658//
11659// IBM PowerPC relocation types.
11660//
11661#define IMAGE_REL_PPC_ABSOLUTE 0x0000 // NOP
11662#define IMAGE_REL_PPC_ADDR64 0x0001 // 64-bit address
11663#define IMAGE_REL_PPC_ADDR32 0x0002 // 32-bit address
11664#define IMAGE_REL_PPC_ADDR24 0x0003 // 26-bit address, shifted left 2 (branch absolute)
11665#define IMAGE_REL_PPC_ADDR16 0x0004 // 16-bit address
11666#define IMAGE_REL_PPC_ADDR14 0x0005 // 16-bit address, shifted left 2 (load doubleword)
11667#define IMAGE_REL_PPC_REL24 0x0006 // 26-bit PC-relative offset, shifted left 2 (branch relative)
11668#define IMAGE_REL_PPC_REL14 0x0007 // 16-bit PC-relative offset, shifted left 2 (br cond relative)
11669#define IMAGE_REL_PPC_TOCREL16 0x0008 // 16-bit offset from TOC base
11670#define IMAGE_REL_PPC_TOCREL14 0x0009 // 16-bit offset from TOC base, shifted left 2 (load doubleword)
11671
11672#define IMAGE_REL_PPC_ADDR32NB 0x000A // 32-bit addr w/o image base
11673#define IMAGE_REL_PPC_SECREL 0x000B // va of containing section (as in an image sectionhdr)
11674#define IMAGE_REL_PPC_SECTION 0x000C // sectionheader number
11675#define IMAGE_REL_PPC_IFGLUE 0x000D // substitute TOC restore instruction iff symbol is glue code
11676#define IMAGE_REL_PPC_IMGLUE 0x000E // symbol is glue code; virtual address is TOC restore instruction
11677#define IMAGE_REL_PPC_SECREL16 0x000F // va of containing section (limited to 16 bits)
11678#define IMAGE_REL_PPC_REFHI 0x0010
11679#define IMAGE_REL_PPC_REFLO 0x0011
11680#define IMAGE_REL_PPC_PAIR 0x0012
11681#define IMAGE_REL_PPC_SECRELLO 0x0013 // Low 16-bit section relative reference (used for >32k TLS)
11682#define IMAGE_REL_PPC_SECRELHI 0x0014 // High 16-bit section relative reference (used for >32k TLS)
11683#define IMAGE_REL_PPC_GPREL 0x0015
11684#define IMAGE_REL_PPC_TOKEN 0x0016 // clr token
11685
11686#define IMAGE_REL_PPC_TYPEMASK 0x00FF // mask to isolate above values in IMAGE_RELOCATION.Type
11687
11688// Flag bits in IMAGE_RELOCATION.TYPE
11689
11690#define IMAGE_REL_PPC_NEG 0x0100 // subtract reloc value rather than adding it
11691#define IMAGE_REL_PPC_BRTAKEN 0x0200 // fix branch prediction bit to predict branch taken
11692#define IMAGE_REL_PPC_BRNTAKEN 0x0400 // fix branch prediction bit to predict branch not taken
11693#define IMAGE_REL_PPC_TOCDEFN 0x0800 // toc slot defined in file (or, data in toc)
11694
11695//
11696// Hitachi SH3 relocation types.
11697//
11698#define IMAGE_REL_SH3_ABSOLUTE 0x0000 // No relocation
11699#define IMAGE_REL_SH3_DIRECT16 0x0001 // 16 bit direct
11700#define IMAGE_REL_SH3_DIRECT32 0x0002 // 32 bit direct
11701#define IMAGE_REL_SH3_DIRECT8 0x0003 // 8 bit direct, -128..255
11702#define IMAGE_REL_SH3_DIRECT8_WORD 0x0004 // 8 bit direct .W (0 ext.)
11703#define IMAGE_REL_SH3_DIRECT8_LONG 0x0005 // 8 bit direct .L (0 ext.)
11704#define IMAGE_REL_SH3_DIRECT4 0x0006 // 4 bit direct (0 ext.)
11705#define IMAGE_REL_SH3_DIRECT4_WORD 0x0007 // 4 bit direct .W (0 ext.)
11706#define IMAGE_REL_SH3_DIRECT4_LONG 0x0008 // 4 bit direct .L (0 ext.)
11707#define IMAGE_REL_SH3_PCREL8_WORD 0x0009 // 8 bit PC relative .W
11708#define IMAGE_REL_SH3_PCREL8_LONG 0x000A // 8 bit PC relative .L
11709#define IMAGE_REL_SH3_PCREL12_WORD 0x000B // 12 LSB PC relative .W
11710#define IMAGE_REL_SH3_STARTOF_SECTION 0x000C // Start of EXE section
11711#define IMAGE_REL_SH3_SIZEOF_SECTION 0x000D // Size of EXE section
11712#define IMAGE_REL_SH3_SECTION 0x000E // Section table index
11713#define IMAGE_REL_SH3_SECREL 0x000F // Offset within section
11714#define IMAGE_REL_SH3_DIRECT32_NB 0x0010 // 32 bit direct not based
11715#define IMAGE_REL_SH3_GPREL4_LONG 0x0011 // GP-relative addressing
11716#define IMAGE_REL_SH3_TOKEN 0x0012 // clr token
11717#define IMAGE_REL_SHM_PCRELPT 0x0013 // Offset from current
11718 // instruction in longwords
11719 // if not NOMODE, insert the
11720 // inverse of the low bit at
11721 // bit 32 to select PTA/PTB
11722#define IMAGE_REL_SHM_REFLO 0x0014 // Low bits of 32-bit address
11723#define IMAGE_REL_SHM_REFHALF 0x0015 // High bits of 32-bit address
11724#define IMAGE_REL_SHM_RELLO 0x0016 // Low bits of relative reference
11725#define IMAGE_REL_SHM_RELHALF 0x0017 // High bits of relative reference
11726#define IMAGE_REL_SHM_PAIR 0x0018 // offset operand for relocation
11727
11728#define IMAGE_REL_SH_NOMODE 0x8000 // relocation ignores section mode
11729
11730
11731#define IMAGE_REL_ARM_ABSOLUTE 0x0000 // No relocation required
11732#define IMAGE_REL_ARM_ADDR32 0x0001 // 32 bit address
11733#define IMAGE_REL_ARM_ADDR32NB 0x0002 // 32 bit address w/o image base
11734#define IMAGE_REL_ARM_BRANCH24 0x0003 // 24 bit offset << 2 & sign ext.
11735#define IMAGE_REL_ARM_BRANCH11 0x0004 // Thumb: 2 11 bit offsets
11736#define IMAGE_REL_ARM_TOKEN 0x0005 // clr token
11737#define IMAGE_REL_ARM_GPREL12 0x0006 // GP-relative addressing (ARM)
11738#define IMAGE_REL_ARM_GPREL7 0x0007 // GP-relative addressing (Thumb)
11739#define IMAGE_REL_ARM_BLX24 0x0008
11740#define IMAGE_REL_ARM_BLX11 0x0009
11741#define IMAGE_REL_ARM_SECTION 0x000E // Section table index
11742#define IMAGE_REL_ARM_SECREL 0x000F // Offset within section
11743
11744#define IMAGE_REL_AM_ABSOLUTE 0x0000
11745#define IMAGE_REL_AM_ADDR32 0x0001
11746#define IMAGE_REL_AM_ADDR32NB 0x0002
11747#define IMAGE_REL_AM_CALL32 0x0003
11748#define IMAGE_REL_AM_FUNCINFO 0x0004
11749#define IMAGE_REL_AM_REL32_1 0x0005
11750#define IMAGE_REL_AM_REL32_2 0x0006
11751#define IMAGE_REL_AM_SECREL 0x0007
11752#define IMAGE_REL_AM_SECTION 0x0008
11753#define IMAGE_REL_AM_TOKEN 0x0009
11754
11755//
11756// x64 relocations
11757//
11758#define IMAGE_REL_AMD64_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
11759#define IMAGE_REL_AMD64_ADDR64 0x0001 // 64-bit address (VA).
11760#define IMAGE_REL_AMD64_ADDR32 0x0002 // 32-bit address (VA).
11761#define IMAGE_REL_AMD64_ADDR32NB 0x0003 // 32-bit address w/o image base (RVA).
11762#define IMAGE_REL_AMD64_REL32 0x0004 // 32-bit relative address from byte following reloc
11763#define IMAGE_REL_AMD64_REL32_1 0x0005 // 32-bit relative address from byte distance 1 from reloc
11764#define IMAGE_REL_AMD64_REL32_2 0x0006 // 32-bit relative address from byte distance 2 from reloc
11765#define IMAGE_REL_AMD64_REL32_3 0x0007 // 32-bit relative address from byte distance 3 from reloc
11766#define IMAGE_REL_AMD64_REL32_4 0x0008 // 32-bit relative address from byte distance 4 from reloc
11767#define IMAGE_REL_AMD64_REL32_5 0x0009 // 32-bit relative address from byte distance 5 from reloc
11768#define IMAGE_REL_AMD64_SECTION 0x000A // Section index
11769#define IMAGE_REL_AMD64_SECREL 0x000B // 32 bit offset from base of section containing target
11770#define IMAGE_REL_AMD64_SECREL7 0x000C // 7 bit unsigned offset from base of section containing target
11771#define IMAGE_REL_AMD64_TOKEN 0x000D // 32 bit metadata token
11772#define IMAGE_REL_AMD64_SREL32 0x000E // 32 bit signed span-dependent value emitted into object
11773#define IMAGE_REL_AMD64_PAIR 0x000F
11774#define IMAGE_REL_AMD64_SSPAN32 0x0010 // 32 bit signed span-dependent value applied at link time
11775
11776//
11777// IA64 relocation types.
11778//
11779#define IMAGE_REL_IA64_ABSOLUTE 0x0000
11780#define IMAGE_REL_IA64_IMM14 0x0001
11781#define IMAGE_REL_IA64_IMM22 0x0002
11782#define IMAGE_REL_IA64_IMM64 0x0003
11783#define IMAGE_REL_IA64_DIR32 0x0004
11784#define IMAGE_REL_IA64_DIR64 0x0005
11785#define IMAGE_REL_IA64_PCREL21B 0x0006
11786#define IMAGE_REL_IA64_PCREL21M 0x0007
11787#define IMAGE_REL_IA64_PCREL21F 0x0008
11788#define IMAGE_REL_IA64_GPREL22 0x0009
11789#define IMAGE_REL_IA64_LTOFF22 0x000A
11790#define IMAGE_REL_IA64_SECTION 0x000B
11791#define IMAGE_REL_IA64_SECREL22 0x000C
11792#define IMAGE_REL_IA64_SECREL64I 0x000D
11793#define IMAGE_REL_IA64_SECREL32 0x000E
11794//
11795#define IMAGE_REL_IA64_DIR32NB 0x0010
11796#define IMAGE_REL_IA64_SREL14 0x0011
11797#define IMAGE_REL_IA64_SREL22 0x0012
11798#define IMAGE_REL_IA64_SREL32 0x0013
11799#define IMAGE_REL_IA64_UREL32 0x0014
11800#define IMAGE_REL_IA64_PCREL60X 0x0015 // This is always a BRL and never converted
11801#define IMAGE_REL_IA64_PCREL60B 0x0016 // If possible, convert to MBB bundle with NOP.B in slot 1
11802#define IMAGE_REL_IA64_PCREL60F 0x0017 // If possible, convert to MFB bundle with NOP.F in slot 1
11803#define IMAGE_REL_IA64_PCREL60I 0x0018 // If possible, convert to MIB bundle with NOP.I in slot 1
11804#define IMAGE_REL_IA64_PCREL60M 0x0019 // If possible, convert to MMB bundle with NOP.M in slot 1
11805#define IMAGE_REL_IA64_IMMGPREL64 0x001A
11806#define IMAGE_REL_IA64_TOKEN 0x001B // clr token
11807#define IMAGE_REL_IA64_GPREL32 0x001C
11808#define IMAGE_REL_IA64_ADDEND 0x001F
11809
11810//
11811// CEF relocation types.
11812//
11813#define IMAGE_REL_CEF_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
11814#define IMAGE_REL_CEF_ADDR32 0x0001 // 32-bit address (VA).
11815#define IMAGE_REL_CEF_ADDR64 0x0002 // 64-bit address (VA).
11816#define IMAGE_REL_CEF_ADDR32NB 0x0003 // 32-bit address w/o image base (RVA).
11817#define IMAGE_REL_CEF_SECTION 0x0004 // Section index
11818#define IMAGE_REL_CEF_SECREL 0x0005 // 32 bit offset from base of section containing target
11819#define IMAGE_REL_CEF_TOKEN 0x0006 // 32 bit metadata token
11820
11821//
11822// clr relocation types.
11823//
11824#define IMAGE_REL_CEE_ABSOLUTE 0x0000 // Reference is absolute, no relocation is necessary
11825#define IMAGE_REL_CEE_ADDR32 0x0001 // 32-bit address (VA).
11826#define IMAGE_REL_CEE_ADDR64 0x0002 // 64-bit address (VA).
11827#define IMAGE_REL_CEE_ADDR32NB 0x0003 // 32-bit address w/o image base (RVA).
11828#define IMAGE_REL_CEE_SECTION 0x0004 // Section index
11829#define IMAGE_REL_CEE_SECREL 0x0005 // 32 bit offset from base of section containing target
11830#define IMAGE_REL_CEE_TOKEN 0x0006 // 32 bit metadata token
11831
11832
11833#define IMAGE_REL_M32R_ABSOLUTE 0x0000 // No relocation required
11834#define IMAGE_REL_M32R_ADDR32 0x0001 // 32 bit address
11835#define IMAGE_REL_M32R_ADDR32NB 0x0002 // 32 bit address w/o image base
11836#define IMAGE_REL_M32R_ADDR24 0x0003 // 24 bit address
11837#define IMAGE_REL_M32R_GPREL16 0x0004 // GP relative addressing
11838#define IMAGE_REL_M32R_PCREL24 0x0005 // 24 bit offset << 2 & sign ext.
11839#define IMAGE_REL_M32R_PCREL16 0x0006 // 16 bit offset << 2 & sign ext.
11840#define IMAGE_REL_M32R_PCREL8 0x0007 // 8 bit offset << 2 & sign ext.
11841#define IMAGE_REL_M32R_REFHALF 0x0008 // 16 MSBs
11842#define IMAGE_REL_M32R_REFHI 0x0009 // 16 MSBs; adj for LSB sign ext.
11843#define IMAGE_REL_M32R_REFLO 0x000A // 16 LSBs
11844#define IMAGE_REL_M32R_PAIR 0x000B // Link HI and LO
11845#define IMAGE_REL_M32R_SECTION 0x000C // Section table index
11846#define IMAGE_REL_M32R_SECREL32 0x000D // 32 bit section relative reference
11847#define IMAGE_REL_M32R_TOKEN 0x000E // clr token
11848
11849#define IMAGE_REL_EBC_ABSOLUTE 0x0000 // No relocation required
11850#define IMAGE_REL_EBC_ADDR32NB 0x0001 // 32 bit address w/o image base
11851#define IMAGE_REL_EBC_REL32 0x0002 // 32-bit relative address from byte following reloc
11852#define IMAGE_REL_EBC_SECTION 0x0003 // Section table index
11853#define IMAGE_REL_EBC_SECREL 0x0004 // Offset within section
11854
11855#define EXT_IMM64(Value, Address, Size, InstPos, ValPos) /* Intel-IA64-Filler */ \
11856 Value |= (((ULONGLONG)((*(Address) >> InstPos) & (((ULONGLONG)1 << Size) - 1))) << ValPos) // Intel-IA64-Filler
11857
11858#define INS_IMM64(Value, Address, Size, InstPos, ValPos) /* Intel-IA64-Filler */\
11859 *(PDWORD)Address = (*(PDWORD)Address & ~(((1 << Size) - 1) << InstPos)) | /* Intel-IA64-Filler */\
11860 ((DWORD)((((ULONGLONG)Value >> ValPos) & (((ULONGLONG)1 << Size) - 1))) << InstPos) // Intel-IA64-Filler
11861
11862#define EMARCH_ENC_I17_IMM7B_INST_WORD_X 3 // Intel-IA64-Filler
11863#define EMARCH_ENC_I17_IMM7B_SIZE_X 7 // Intel-IA64-Filler
11864#define EMARCH_ENC_I17_IMM7B_INST_WORD_POS_X 4 // Intel-IA64-Filler
11865#define EMARCH_ENC_I17_IMM7B_VAL_POS_X 0 // Intel-IA64-Filler
11866
11867#define EMARCH_ENC_I17_IMM9D_INST_WORD_X 3 // Intel-IA64-Filler
11868#define EMARCH_ENC_I17_IMM9D_SIZE_X 9 // Intel-IA64-Filler
11869#define EMARCH_ENC_I17_IMM9D_INST_WORD_POS_X 18 // Intel-IA64-Filler
11870#define EMARCH_ENC_I17_IMM9D_VAL_POS_X 7 // Intel-IA64-Filler
11871
11872#define EMARCH_ENC_I17_IMM5C_INST_WORD_X 3 // Intel-IA64-Filler
11873#define EMARCH_ENC_I17_IMM5C_SIZE_X 5 // Intel-IA64-Filler
11874#define EMARCH_ENC_I17_IMM5C_INST_WORD_POS_X 13 // Intel-IA64-Filler
11875#define EMARCH_ENC_I17_IMM5C_VAL_POS_X 16 // Intel-IA64-Filler
11876
11877#define EMARCH_ENC_I17_IC_INST_WORD_X 3 // Intel-IA64-Filler
11878#define EMARCH_ENC_I17_IC_SIZE_X 1 // Intel-IA64-Filler
11879#define EMARCH_ENC_I17_IC_INST_WORD_POS_X 12 // Intel-IA64-Filler
11880#define EMARCH_ENC_I17_IC_VAL_POS_X 21 // Intel-IA64-Filler
11881
11882#define EMARCH_ENC_I17_IMM41a_INST_WORD_X 1 // Intel-IA64-Filler
11883#define EMARCH_ENC_I17_IMM41a_SIZE_X 10 // Intel-IA64-Filler
11884#define EMARCH_ENC_I17_IMM41a_INST_WORD_POS_X 14 // Intel-IA64-Filler
11885#define EMARCH_ENC_I17_IMM41a_VAL_POS_X 22 // Intel-IA64-Filler
11886
11887#define EMARCH_ENC_I17_IMM41b_INST_WORD_X 1 // Intel-IA64-Filler
11888#define EMARCH_ENC_I17_IMM41b_SIZE_X 8 // Intel-IA64-Filler
11889#define EMARCH_ENC_I17_IMM41b_INST_WORD_POS_X 24 // Intel-IA64-Filler
11890#define EMARCH_ENC_I17_IMM41b_VAL_POS_X 32 // Intel-IA64-Filler
11891
11892#define EMARCH_ENC_I17_IMM41c_INST_WORD_X 2 // Intel-IA64-Filler
11893#define EMARCH_ENC_I17_IMM41c_SIZE_X 23 // Intel-IA64-Filler
11894#define EMARCH_ENC_I17_IMM41c_INST_WORD_POS_X 0 // Intel-IA64-Filler
11895#define EMARCH_ENC_I17_IMM41c_VAL_POS_X 40 // Intel-IA64-Filler
11896
11897#define EMARCH_ENC_I17_SIGN_INST_WORD_X 3 // Intel-IA64-Filler
11898#define EMARCH_ENC_I17_SIGN_SIZE_X 1 // Intel-IA64-Filler
11899#define EMARCH_ENC_I17_SIGN_INST_WORD_POS_X 27 // Intel-IA64-Filler
11900#define EMARCH_ENC_I17_SIGN_VAL_POS_X 63 // Intel-IA64-Filler
11901
11902#define X3_OPCODE_INST_WORD_X 3 // Intel-IA64-Filler
11903#define X3_OPCODE_SIZE_X 4 // Intel-IA64-Filler
11904#define X3_OPCODE_INST_WORD_POS_X 28 // Intel-IA64-Filler
11905#define X3_OPCODE_SIGN_VAL_POS_X 0 // Intel-IA64-Filler
11906
11907#define X3_I_INST_WORD_X 3 // Intel-IA64-Filler
11908#define X3_I_SIZE_X 1 // Intel-IA64-Filler
11909#define X3_I_INST_WORD_POS_X 27 // Intel-IA64-Filler
11910#define X3_I_SIGN_VAL_POS_X 59 // Intel-IA64-Filler
11911
11912#define X3_D_WH_INST_WORD_X 3 // Intel-IA64-Filler
11913#define X3_D_WH_SIZE_X 3 // Intel-IA64-Filler
11914#define X3_D_WH_INST_WORD_POS_X 24 // Intel-IA64-Filler
11915#define X3_D_WH_SIGN_VAL_POS_X 0 // Intel-IA64-Filler
11916
11917#define X3_IMM20_INST_WORD_X 3 // Intel-IA64-Filler
11918#define X3_IMM20_SIZE_X 20 // Intel-IA64-Filler
11919#define X3_IMM20_INST_WORD_POS_X 4 // Intel-IA64-Filler
11920#define X3_IMM20_SIGN_VAL_POS_X 0 // Intel-IA64-Filler
11921
11922#define X3_IMM39_1_INST_WORD_X 2 // Intel-IA64-Filler
11923#define X3_IMM39_1_SIZE_X 23 // Intel-IA64-Filler
11924#define X3_IMM39_1_INST_WORD_POS_X 0 // Intel-IA64-Filler
11925#define X3_IMM39_1_SIGN_VAL_POS_X 36 // Intel-IA64-Filler
11926
11927#define X3_IMM39_2_INST_WORD_X 1 // Intel-IA64-Filler
11928#define X3_IMM39_2_SIZE_X 16 // Intel-IA64-Filler
11929#define X3_IMM39_2_INST_WORD_POS_X 16 // Intel-IA64-Filler
11930#define X3_IMM39_2_SIGN_VAL_POS_X 20 // Intel-IA64-Filler
11931
11932#define X3_P_INST_WORD_X 3 // Intel-IA64-Filler
11933#define X3_P_SIZE_X 4 // Intel-IA64-Filler
11934#define X3_P_INST_WORD_POS_X 0 // Intel-IA64-Filler
11935#define X3_P_SIGN_VAL_POS_X 0 // Intel-IA64-Filler
11936
11937#define X3_TMPLT_INST_WORD_X 0 // Intel-IA64-Filler
11938#define X3_TMPLT_SIZE_X 4 // Intel-IA64-Filler
11939#define X3_TMPLT_INST_WORD_POS_X 0 // Intel-IA64-Filler
11940#define X3_TMPLT_SIGN_VAL_POS_X 0 // Intel-IA64-Filler
11941
11942#define X3_BTYPE_QP_INST_WORD_X 2 // Intel-IA64-Filler
11943#define X3_BTYPE_QP_SIZE_X 9 // Intel-IA64-Filler
11944#define X3_BTYPE_QP_INST_WORD_POS_X 23 // Intel-IA64-Filler
11945#define X3_BTYPE_QP_INST_VAL_POS_X 0 // Intel-IA64-Filler
11946
11947#define X3_EMPTY_INST_WORD_X 1 // Intel-IA64-Filler
11948#define X3_EMPTY_SIZE_X 2 // Intel-IA64-Filler
11949#define X3_EMPTY_INST_WORD_POS_X 14 // Intel-IA64-Filler
11950#define X3_EMPTY_INST_VAL_POS_X 0 // Intel-IA64-Filler
11951
11952//
11953// Line number format.
11954//
11955
11956typedef struct _IMAGE_LINENUMBER {
11957 union {
11958 DWORD SymbolTableIndex; // Symbol table index of function name if Linenumber is 0.
11959 DWORD VirtualAddress; // Virtual address of line number.
11960 } Type;
11961 WORD Linenumber; // Line number.
11962} IMAGE_LINENUMBER;
11963typedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;
11964
11965#ifndef _MAC
11966#include "poppack.h" // Back to 4 byte packing
11967#endif
11968
11969//
11970// Based relocation format.
11971//
11972
11973typedef struct _IMAGE_BASE_RELOCATION {
11974 DWORD VirtualAddress;
11975 DWORD SizeOfBlock;
11976// WORD TypeOffset[1];
11977} IMAGE_BASE_RELOCATION;
11978typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
11979
11980//
11981// Based relocation types.
11982//
11983
11984#define IMAGE_REL_BASED_ABSOLUTE 0
11985#define IMAGE_REL_BASED_HIGH 1
11986#define IMAGE_REL_BASED_LOW 2
11987#define IMAGE_REL_BASED_HIGHLOW 3
11988#define IMAGE_REL_BASED_HIGHADJ 4
11989#define IMAGE_REL_BASED_MIPS_JMPADDR 5
11990#define IMAGE_REL_BASED_MIPS_JMPADDR16 9
11991#define IMAGE_REL_BASED_IA64_IMM64 9
11992#define IMAGE_REL_BASED_DIR64 10
11993
11994
11995//
11996// Archive format.
11997//
11998
11999#define IMAGE_ARCHIVE_START_SIZE 8
12000#define IMAGE_ARCHIVE_START "!<arch>\n"
12001#define IMAGE_ARCHIVE_END "`\n"
12002#define IMAGE_ARCHIVE_PAD "\n"
12003#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
12004#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
12005
12006typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
12007 BYTE Name[16]; // File member name - `/' terminated.
12008 BYTE Date[12]; // File member date - decimal.
12009 BYTE UserID[6]; // File member user id - decimal.
12010 BYTE GroupID[6]; // File member group id - decimal.
12011 BYTE Mode[8]; // File member mode - octal.
12012 BYTE Size[10]; // File member size - decimal.
12013 BYTE EndHeader[2]; // String to end header.
12014} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
12015
12016#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
12017
12018//
12019// DLL support.
12020//
12021
12022//
12023// Export Format
12024//
12025
12026typedef struct _IMAGE_EXPORT_DIRECTORY {
12027 DWORD Characteristics;
12028 DWORD TimeDateStamp;
12029 WORD MajorVersion;
12030 WORD MinorVersion;
12031 DWORD Name;
12032 DWORD Base;
12033 DWORD NumberOfFunctions;
12034 DWORD NumberOfNames;
12035 DWORD AddressOfFunctions; // RVA from base of image
12036 DWORD AddressOfNames; // RVA from base of image
12037 DWORD AddressOfNameOrdinals; // RVA from base of image
12038} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
12039
12040//
12041// Import Format
12042//
12043
12044typedef struct _IMAGE_IMPORT_BY_NAME {
12045 WORD Hint;
12046 BYTE Name[1];
12047} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
12048
12049#include "pshpack8.h" // Use align 8 for the 64-bit IAT.
12050
12051typedef struct _IMAGE_THUNK_DATA64 {
12052 union {
12053 ULONGLONG ForwarderString; // PBYTE
12054 ULONGLONG Function; // PDWORD
12055 ULONGLONG Ordinal;
12056 ULONGLONG AddressOfData; // PIMAGE_IMPORT_BY_NAME
12057 } u1;
12058} IMAGE_THUNK_DATA64;
12059typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;
12060
12061#include "poppack.h" // Back to 4 byte packing
12062
12063typedef struct _IMAGE_THUNK_DATA32 {
12064 union {
12065 DWORD ForwarderString; // PBYTE
12066 DWORD Function; // PDWORD
12067 DWORD Ordinal;
12068 DWORD AddressOfData; // PIMAGE_IMPORT_BY_NAME
12069 } u1;
12070} IMAGE_THUNK_DATA32;
12071typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;
12072
12073#define IMAGE_ORDINAL_FLAG64 0x8000000000000000
12074#define IMAGE_ORDINAL_FLAG32 0x80000000
12075#define IMAGE_ORDINAL64(Ordinal) (Ordinal & 0xffff)
12076#define IMAGE_ORDINAL32(Ordinal) (Ordinal & 0xffff)
12077#define IMAGE_SNAP_BY_ORDINAL64(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG64) != 0)
12078#define IMAGE_SNAP_BY_ORDINAL32(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG32) != 0)
12079
12080//
12081// Thread Local Storage
12082//
12083
12084typedef VOID
12085(NTAPI *PIMAGE_TLS_CALLBACK) (
12086 PVOID DllHandle,
12087 DWORD Reason,
12088 PVOID Reserved
12089 );
12090
12091typedef struct _IMAGE_TLS_DIRECTORY64 {
12092 ULONGLONG StartAddressOfRawData;
12093 ULONGLONG EndAddressOfRawData;
12094 ULONGLONG AddressOfIndex; // PDWORD
12095 ULONGLONG AddressOfCallBacks; // PIMAGE_TLS_CALLBACK *;
12096 DWORD SizeOfZeroFill;
12097 DWORD Characteristics;
12098} IMAGE_TLS_DIRECTORY64;
12099typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;
12100
12101typedef struct _IMAGE_TLS_DIRECTORY32 {
12102 DWORD StartAddressOfRawData;
12103 DWORD EndAddressOfRawData;
12104 DWORD AddressOfIndex; // PDWORD
12105 DWORD AddressOfCallBacks; // PIMAGE_TLS_CALLBACK *
12106 DWORD SizeOfZeroFill;
12107 DWORD Characteristics;
12108} IMAGE_TLS_DIRECTORY32;
12109typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;
12110
12111#ifdef _WIN64
12112#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64
12113#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL64(Ordinal)
12114typedef IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA;
12115typedef PIMAGE_THUNK_DATA64 PIMAGE_THUNK_DATA;
12116#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL64(Ordinal)
12117typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY;
12118typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY;
12119#else
12120#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG32
12121#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL32(Ordinal)
12122typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;
12123typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA;
12124#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL32(Ordinal)
12125typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY;
12126typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY;
12127#endif
12128
12129typedef struct _IMAGE_IMPORT_DESCRIPTOR {
12130 union {
12131 DWORD Characteristics; // 0 for terminating null import descriptor
12132 DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
12133 } DUMMYUNIONNAME;
12134 DWORD TimeDateStamp; // 0 if not bound,
12135 // -1 if bound, and real date\time stamp
12136 // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
12137 // O.W. date/time stamp of DLL bound to (Old BIND)
12138
12139 DWORD ForwarderChain; // -1 if no forwarders
12140 DWORD Name;
12141 DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)
12142} IMAGE_IMPORT_DESCRIPTOR;
12143typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
12144
12145//
12146// New format import descriptors pointed to by DataDirectory[ IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ]
12147//
12148
12149typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
12150 DWORD TimeDateStamp;
12151 WORD OffsetModuleName;
12152 WORD NumberOfModuleForwarderRefs;
12153// Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
12154} IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
12155
12156typedef struct _IMAGE_BOUND_FORWARDER_REF {
12157 DWORD TimeDateStamp;
12158 WORD OffsetModuleName;
12159 WORD Reserved;
12160} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
12161
12162//
12163// Resource Format.
12164//
12165
12166//
12167// Resource directory consists of two counts, following by a variable length
12168// array of directory entries. The first count is the number of entries at
12169// beginning of the array that have actual names associated with each entry.
12170// The entries are in ascending order, case insensitive strings. The second
12171// count is the number of entries that immediately follow the named entries.
12172// This second count identifies the number of entries that have 16-bit integer
12173// Ids as their name. These entries are also sorted in ascending order.
12174//
12175// This structure allows fast lookup by either name or number, but for any
12176// given resource entry only one form of lookup is supported, not both.
12177// This is consistant with the syntax of the .RC file and the .RES file.
12178//
12179
12180typedef struct _IMAGE_RESOURCE_DIRECTORY {
12181 DWORD Characteristics;
12182 DWORD TimeDateStamp;
12183 WORD MajorVersion;
12184 WORD MinorVersion;
12185 WORD NumberOfNamedEntries;
12186 WORD NumberOfIdEntries;
12187// IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
12188} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
12189
12190#define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000
12191#define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000
12192//
12193// Each directory contains the 32-bit Name of the entry and an offset,
12194// relative to the beginning of the resource directory of the data associated
12195// with this directory entry. If the name of the entry is an actual text
12196// string instead of an integer Id, then the high order bit of the name field
12197// is set to one and the low order 31-bits are an offset, relative to the
12198// beginning of the resource directory of the string, which is of type
12199// IMAGE_RESOURCE_DIRECTORY_STRING. Otherwise the high bit is clear and the
12200// low-order 16-bits are the integer Id that identify this resource directory
12201// entry. If the directory entry is yet another resource directory (i.e. a
12202// subdirectory), then the high order bit of the offset field will be
12203// set to indicate this. Otherwise the high bit is clear and the offset
12204// field points to a resource data entry.
12205//
12206
12207typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
12208 union {
12209 struct {
12210 DWORD NameOffset:31;
12211 DWORD NameIsString:1;
12212 } DUMMYSTRUCTNAME;
12213 DWORD Name;
12214 WORD Id;
12215 } DUMMYUNIONNAME;
12216 union {
12217 DWORD OffsetToData;
12218 struct {
12219 DWORD OffsetToDirectory:31;
12220 DWORD DataIsDirectory:1;
12221 } DUMMYSTRUCTNAME2;
12222 } DUMMYUNIONNAME2;
12223} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
12224
12225//
12226// For resource directory entries that have actual string names, the Name
12227// field of the directory entry points to an object of the following type.
12228// All of these string objects are stored together after the last resource
12229// directory entry and before the first resource data object. This minimizes
12230// the impact of these variable length objects on the alignment of the fixed
12231// size directory entry objects.
12232//
12233
12234typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
12235 WORD Length;
12236 CHAR NameString[ 1 ];
12237} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
12238
12239
12240typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
12241 WORD Length;
12242 WCHAR NameString[ 1 ];
12243} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
12244
12245
12246//
12247// Each resource data entry describes a leaf node in the resource directory
12248// tree. It contains an offset, relative to the beginning of the resource
12249// directory of the data for the resource, a size field that gives the number
12250// of bytes of data at that offset, a CodePage that should be used when
12251// decoding code point values within the resource data. Typically for new
12252// applications the code page would be the unicode code page.
12253//
12254
12255typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
12256 DWORD OffsetToData;
12257 DWORD Size;
12258 DWORD CodePage;
12259 DWORD Reserved;
12260} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
12261
12262//
12263// Load Configuration Directory Entry
12264//
12265
12266typedef struct {
12267 DWORD Size;
12268 DWORD TimeDateStamp;
12269 WORD MajorVersion;
12270 WORD MinorVersion;
12271 DWORD GlobalFlagsClear;
12272 DWORD GlobalFlagsSet;
12273 DWORD CriticalSectionDefaultTimeout;
12274 DWORD DeCommitFreeBlockThreshold;
12275 DWORD DeCommitTotalFreeThreshold;
12276 DWORD LockPrefixTable; // VA
12277 DWORD MaximumAllocationSize;
12278 DWORD VirtualMemoryThreshold;
12279 DWORD ProcessHeapFlags;
12280 DWORD ProcessAffinityMask;
12281 WORD CSDVersion;
12282 WORD Reserved1;
12283 DWORD EditList; // VA
12284 DWORD SecurityCookie; // VA
12285 DWORD SEHandlerTable; // VA
12286 DWORD SEHandlerCount;
12287} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
12288
12289typedef struct {
12290 DWORD Size;
12291 DWORD TimeDateStamp;
12292 WORD MajorVersion;
12293 WORD MinorVersion;
12294 DWORD GlobalFlagsClear;
12295 DWORD GlobalFlagsSet;
12296 DWORD CriticalSectionDefaultTimeout;
12297 ULONGLONG DeCommitFreeBlockThreshold;
12298 ULONGLONG DeCommitTotalFreeThreshold;
12299 ULONGLONG LockPrefixTable; // VA
12300 ULONGLONG MaximumAllocationSize;
12301 ULONGLONG VirtualMemoryThreshold;
12302 ULONGLONG ProcessAffinityMask;
12303 DWORD ProcessHeapFlags;
12304 WORD CSDVersion;
12305 WORD Reserved1;
12306 ULONGLONG EditList; // VA
12307 ULONGLONG SecurityCookie; // VA
12308 ULONGLONG SEHandlerTable; // VA
12309 ULONGLONG SEHandlerCount;
12310} IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
12311
12312#ifdef _WIN64
12313typedef IMAGE_LOAD_CONFIG_DIRECTORY64 IMAGE_LOAD_CONFIG_DIRECTORY;
12314typedef PIMAGE_LOAD_CONFIG_DIRECTORY64 PIMAGE_LOAD_CONFIG_DIRECTORY;
12315#else
12316typedef IMAGE_LOAD_CONFIG_DIRECTORY32 IMAGE_LOAD_CONFIG_DIRECTORY;
12317typedef PIMAGE_LOAD_CONFIG_DIRECTORY32 PIMAGE_LOAD_CONFIG_DIRECTORY;
12318#endif
12319
12320//
12321// WIN CE Exception table format
12322//
12323
12324//
12325// Function table entry format. Function table is pointed to by the
12326// IMAGE_DIRECTORY_ENTRY_EXCEPTION directory entry.
12327//
12328
12329typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
12330 DWORD FuncStart;
12331 DWORD PrologLen : 8;
12332 DWORD FuncLen : 22;
12333 DWORD ThirtyTwoBit : 1;
12334 DWORD ExceptionFlag : 1;
12335} IMAGE_CE_RUNTIME_FUNCTION_ENTRY, * PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;
12336
12337typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {
12338 ULONGLONG BeginAddress;
12339 ULONGLONG EndAddress;
12340 ULONGLONG ExceptionHandler;
12341 ULONGLONG HandlerData;
12342 ULONGLONG PrologEndAddress;
12343} IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;
12344
12345typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {
12346 DWORD BeginAddress;
12347 DWORD EndAddress;
12348 DWORD ExceptionHandler;
12349 DWORD HandlerData;
12350 DWORD PrologEndAddress;
12351} IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;
12352
12353typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
12354 DWORD BeginAddress;
12355 DWORD EndAddress;
12356 DWORD UnwindInfoAddress;
12357} _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;
12358
12359typedef _IMAGE_RUNTIME_FUNCTION_ENTRY IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
12360typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
12361
12362#if defined(_AXP64_)
12363
12364typedef IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY IMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;
12365typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_AXP64_RUNTIME_FUNCTION_ENTRY;
12366typedef IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY IMAGE_RUNTIME_FUNCTION_ENTRY;
12367typedef PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
12368
12369#elif defined(_ALPHA_)
12370
12371typedef IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY IMAGE_RUNTIME_FUNCTION_ENTRY;
12372typedef PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
12373
12374#else
12375
12376typedef _IMAGE_RUNTIME_FUNCTION_ENTRY IMAGE_RUNTIME_FUNCTION_ENTRY;
12377typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
12378
12379#endif
12380
12381//
12382// Debug Format
12383//
12384
12385typedef struct _IMAGE_DEBUG_DIRECTORY {
12386 DWORD Characteristics;
12387 DWORD TimeDateStamp;
12388 WORD MajorVersion;
12389 WORD MinorVersion;
12390 DWORD Type;
12391 DWORD SizeOfData;
12392 DWORD AddressOfRawData;
12393 DWORD PointerToRawData;
12394} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
12395
12396#define IMAGE_DEBUG_TYPE_UNKNOWN 0
12397#define IMAGE_DEBUG_TYPE_COFF 1
12398#define IMAGE_DEBUG_TYPE_CODEVIEW 2
12399#define IMAGE_DEBUG_TYPE_FPO 3
12400#define IMAGE_DEBUG_TYPE_MISC 4
12401#define IMAGE_DEBUG_TYPE_EXCEPTION 5
12402#define IMAGE_DEBUG_TYPE_FIXUP 6
12403#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7
12404#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8
12405#define IMAGE_DEBUG_TYPE_BORLAND 9
12406#define IMAGE_DEBUG_TYPE_RESERVED10 10
12407#define IMAGE_DEBUG_TYPE_CLSID 11
12408
12409
12410typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
12411 DWORD NumberOfSymbols;
12412 DWORD LvaToFirstSymbol;
12413 DWORD NumberOfLinenumbers;
12414 DWORD LvaToFirstLinenumber;
12415 DWORD RvaToFirstByteOfCode;
12416 DWORD RvaToLastByteOfCode;
12417 DWORD RvaToFirstByteOfData;
12418 DWORD RvaToLastByteOfData;
12419} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
12420
12421#define FRAME_FPO 0
12422#define FRAME_TRAP 1
12423#define FRAME_TSS 2
12424#define FRAME_NONFPO 3
12425
12426typedef struct _FPO_DATA {
12427 DWORD ulOffStart; // offset 1st byte of function code
12428 DWORD cbProcSize; // # bytes in function
12429 DWORD cdwLocals; // # bytes in locals/4
12430 WORD cdwParams; // # bytes in params/4
12431 WORD cbProlog : 8; // # bytes in prolog
12432 WORD cbRegs : 3; // # regs saved
12433 WORD fHasSEH : 1; // TRUE if SEH in func
12434 WORD fUseBP : 1; // TRUE if EBP has been allocated
12435 WORD reserved : 1; // reserved for future use
12436 WORD cbFrame : 2; // frame type
12437} FPO_DATA, *PFPO_DATA;
12438#define SIZEOF_RFPO_DATA 16
12439
12440
12441#define IMAGE_DEBUG_MISC_EXENAME 1
12442
12443typedef struct _IMAGE_DEBUG_MISC {
12444 DWORD DataType; // type of misc data, see defines
12445 DWORD Length; // total length of record, rounded to four
12446 // byte multiple.
12447 BOOLEAN Unicode; // TRUE if data is unicode string
12448 BYTE Reserved[ 3 ];
12449 BYTE Data[ 1 ]; // Actual data
12450} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
12451
12452
12453//
12454// Function table extracted from MIPS/ALPHA/IA64 images. Does not contain
12455// information needed only for runtime support. Just those fields for
12456// each entry needed by a debugger.
12457//
12458
12459typedef struct _IMAGE_FUNCTION_ENTRY {
12460 DWORD StartingAddress;
12461 DWORD EndingAddress;
12462 DWORD EndOfPrologue;
12463} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
12464
12465typedef struct _IMAGE_FUNCTION_ENTRY64 {
12466 ULONGLONG StartingAddress;
12467 ULONGLONG EndingAddress;
12468 union {
12469 ULONGLONG EndOfPrologue;
12470 ULONGLONG UnwindInfoAddress;
12471 } DUMMYUNIONNAME;
12472} IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;
12473
12474//
12475// Debugging information can be stripped from an image file and placed
12476// in a separate .DBG file, whose file name part is the same as the
12477// image file name part (e.g. symbols for CMD.EXE could be stripped
12478// and placed in CMD.DBG). This is indicated by the IMAGE_FILE_DEBUG_STRIPPED
12479// flag in the Characteristics field of the file header. The beginning of
12480// the .DBG file contains the following structure which captures certain
12481// information from the image file. This allows a debug to proceed even if
12482// the original image file is not accessable. This header is followed by
12483// zero of more IMAGE_SECTION_HEADER structures, followed by zero or more
12484// IMAGE_DEBUG_DIRECTORY structures. The latter structures and those in
12485// the image file contain file offsets relative to the beginning of the
12486// .DBG file.
12487//
12488// If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure
12489// is left in the image file, but not mapped. This allows a debugger to
12490// compute the name of the .DBG file, from the name of the image in the
12491// IMAGE_DEBUG_MISC structure.
12492//
12493
12494typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
12495 WORD Signature;
12496 WORD Flags;
12497 WORD Machine;
12498 WORD Characteristics;
12499 DWORD TimeDateStamp;
12500 DWORD CheckSum;
12501 DWORD ImageBase;
12502 DWORD SizeOfImage;
12503 DWORD NumberOfSections;
12504 DWORD ExportedNamesSize;
12505 DWORD DebugDirectorySize;
12506 DWORD SectionAlignment;
12507 DWORD Reserved[2];
12508} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
12509
12510typedef struct _NON_PAGED_DEBUG_INFO {
12511 WORD Signature;
12512 WORD Flags;
12513 DWORD Size;
12514 WORD Machine;
12515 WORD Characteristics;
12516 DWORD TimeDateStamp;
12517 DWORD CheckSum;
12518 DWORD SizeOfImage;
12519 ULONGLONG ImageBase;
12520 //DebugDirectorySize
12521 //IMAGE_DEBUG_DIRECTORY
12522} NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;
12523
12524#ifndef _MAC
12525#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944
12526#define NON_PAGED_DEBUG_SIGNATURE 0x494E
12527#else
12528#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4449 // DI
12529#define NON_PAGED_DEBUG_SIGNATURE 0x4E49 // NI
12530#endif
12531
12532#define IMAGE_SEPARATE_DEBUG_FLAGS_MASK 0x8000
12533#define IMAGE_SEPARATE_DEBUG_MISMATCH 0x8000 // when DBG was updated, the
12534 // old checksum didn't match.
12535
12536//
12537// The .arch section is made up of headers, each describing an amask position/value
12538// pointing to an array of IMAGE_ARCHITECTURE_ENTRY's. Each "array" (both the header
12539// and entry arrays) are terminiated by a quadword of 0xffffffffL.
12540//
12541// NOTE: There may be quadwords of 0 sprinkled around and must be skipped.
12542//
12543
12544typedef struct _ImageArchitectureHeader {
12545 unsigned int AmaskValue: 1; // 1 -> code section depends on mask bit
12546 // 0 -> new instruction depends on mask bit
12547 int :7; // MBZ
12548 unsigned int AmaskShift: 8; // Amask bit in question for this fixup
12549 int :16; // MBZ
12550 DWORD FirstEntryRVA; // RVA into .arch section to array of ARCHITECTURE_ENTRY's
12551} IMAGE_ARCHITECTURE_HEADER, *PIMAGE_ARCHITECTURE_HEADER;
12552
12553typedef struct _ImageArchitectureEntry {
12554 DWORD FixupInstRVA; // RVA of instruction to fixup
12555 DWORD NewInst; // fixup instruction (see alphaops.h)
12556} IMAGE_ARCHITECTURE_ENTRY, *PIMAGE_ARCHITECTURE_ENTRY;
12557
12558#include "poppack.h" // Back to the initial value
12559
12560// The following structure defines the new import object. Note the values of the first two fields,
12561// which must be set as stated in order to differentiate old and new import members.
12562// Following this structure, the linker emits two null-terminated strings used to recreate the
12563// import at the time of use. The first string is the import's name, the second is the dll's name.
12564
12565#define IMPORT_OBJECT_HDR_SIG2 0xffff
12566
12567typedef struct IMPORT_OBJECT_HEADER {
12568 WORD Sig1; // Must be IMAGE_FILE_MACHINE_UNKNOWN
12569 WORD Sig2; // Must be IMPORT_OBJECT_HDR_SIG2.
12570 WORD Version;
12571 WORD Machine;
12572 DWORD TimeDateStamp; // Time/date stamp
12573 DWORD SizeOfData; // particularly useful for incremental links
12574
12575 union {
12576 WORD Ordinal; // if grf & IMPORT_OBJECT_ORDINAL
12577 WORD Hint;
12578 } DUMMYUNIONNAME;
12579
12580 WORD Type : 2; // IMPORT_TYPE
12581 WORD NameType : 3; // IMPORT_NAME_TYPE
12582 WORD Reserved : 11; // Reserved. Must be zero.
12583} IMPORT_OBJECT_HEADER;
12584
12585typedef enum IMPORT_OBJECT_TYPE
12586{
12587 IMPORT_OBJECT_CODE = 0,
12588 IMPORT_OBJECT_DATA = 1,
12589 IMPORT_OBJECT_CONST = 2,
12590} IMPORT_OBJECT_TYPE;
12591
12592typedef enum IMPORT_OBJECT_NAME_TYPE
12593{
12594 IMPORT_OBJECT_ORDINAL = 0, // Import by ordinal
12595 IMPORT_OBJECT_NAME = 1, // Import name == public symbol name.
12596 IMPORT_OBJECT_NAME_NO_PREFIX = 2, // Import name == public symbol name skipping leading ?, @, or optionally _.
12597 IMPORT_OBJECT_NAME_UNDECORATE = 3, // Import name == public symbol name skipping leading ?, @, or optionally _
12598 // and truncating at first @
12599} IMPORT_OBJECT_NAME_TYPE;
12600
12601
12602#ifndef __IMAGE_COR20_HEADER_DEFINED__
12603#define __IMAGE_COR20_HEADER_DEFINED__
12604
12605typedef enum ReplacesCorHdrNumericDefines
12606{
12607// COM+ Header entry point flags.
12608 COMIMAGE_FLAGS_ILONLY =0x00000001,
12609 COMIMAGE_FLAGS_32BITREQUIRED =0x00000002,
12610 COMIMAGE_FLAGS_IL_LIBRARY =0x00000004,
12611 COMIMAGE_FLAGS_STRONGNAMESIGNED =0x00000008,
12612 COMIMAGE_FLAGS_NATIVE_ENTRYPOINT =0x00000010,
12613 COMIMAGE_FLAGS_TRACKDEBUGDATA =0x00010000,
12614
12615// Version flags for image.
12616 COR_VERSION_MAJOR_V2 =2,
12617 COR_VERSION_MAJOR =COR_VERSION_MAJOR_V2,
12618 COR_VERSION_MINOR =0,
12619 COR_DELETED_NAME_LENGTH =8,
12620 COR_VTABLEGAP_NAME_LENGTH =8,
12621
12622// Maximum size of a NativeType descriptor.
12623 NATIVE_TYPE_MAX_CB =1,
12624 COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,
12625
12626// #defines for the MIH FLAGS
12627 IMAGE_COR_MIH_METHODRVA =0x01,
12628 IMAGE_COR_MIH_EHRVA =0x02,
12629 IMAGE_COR_MIH_BASICBLOCK =0x08,
12630
12631// V-table constants
12632 COR_VTABLE_32BIT =0x01, // V-table slots are 32-bits in size.
12633 COR_VTABLE_64BIT =0x02, // V-table slots are 64-bits in size.
12634 COR_VTABLE_FROM_UNMANAGED =0x04, // If set, transition from unmanaged.
12635 COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN =0x08, // If set, transition from unmanaged with keeping the current appdomain.
12636 COR_VTABLE_CALL_MOST_DERIVED =0x10, // Call most derived method described by
12637
12638// EATJ constants
12639 IMAGE_COR_EATJ_THUNK_SIZE =32, // Size of a jump thunk reserved range.
12640
12641// Max name lengths
12642 //@todo: Change to unlimited name lengths.
12643 MAX_CLASS_NAME =1024,
12644 MAX_PACKAGE_NAME =1024,
12645} ReplacesCorHdrNumericDefines;
12646
12647// CLR 2.0 header structure.
12648typedef struct IMAGE_COR20_HEADER
12649{
12650 // Header versioning
12651 DWORD cb;
12652 WORD MajorRuntimeVersion;
12653 WORD MinorRuntimeVersion;
12654
12655 // Symbol table and startup information
12656 IMAGE_DATA_DIRECTORY MetaData;
12657 DWORD Flags;
12658
12659 // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is not set, EntryPointToken represents a managed entrypoint.
12660 // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is set, EntryPointRVA represents an RVA to a native entrypoint.
12661 union {
12662 DWORD EntryPointToken;
12663 DWORD EntryPointRVA;
12664 } DUMMYUNIONNAME;
12665
12666 // Binding information
12667 IMAGE_DATA_DIRECTORY Resources;
12668 IMAGE_DATA_DIRECTORY StrongNameSignature;
12669
12670 // Regular fixup and binding information
12671 IMAGE_DATA_DIRECTORY CodeManagerTable;
12672 IMAGE_DATA_DIRECTORY VTableFixups;
12673 IMAGE_DATA_DIRECTORY ExportAddressTableJumps;
12674
12675 // Precompiled image info (internal use only - set to zero)
12676 IMAGE_DATA_DIRECTORY ManagedNativeHeader;
12677
12678} IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;
12679
12680#endif // __IMAGE_COR20_HEADER_DEFINED__
12681
12682//
12683// End Image Format
12684//
12685
12686//
12687// for move macros
12688//
12689#ifdef _MAC
12690#ifndef _INC_STRING
12691#include <string.h>
12692#endif /* _INC_STRING */
12693#else
12694#include <string.h>
12695#endif // _MAC
12696
12697
12698#ifndef _SLIST_HEADER_
12699#define _SLIST_HEADER_
12700
12701#if defined(_WIN64)
12702
12703//
12704// The type SINGLE_LIST_ENTRY is not suitable for use with SLISTs. For
12705// WIN64, an entry on an SLIST is required to be 16-byte aligned, while a
12706// SINGLE_LIST_ENTRY structure has only 8 byte alignment.
12707//
12708// Therefore, all SLIST code should use the SLIST_ENTRY type instead of the
12709// SINGLE_LIST_ENTRY type.
12710//
12711
12712#pragma warning(push)
12713#pragma warning(disable:4324) // structure padded due to align()
12714typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
12715typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
12716 PSLIST_ENTRY Next;
12717} SLIST_ENTRY;
12718#pragma warning(pop)
12719
12720typedef struct _SLIST_ENTRY32 {
12721 DWORD Next;
12722} SLIST_ENTRY32, *PSLIST_ENTRY32;
12723
12724#else
12725
12726#define SLIST_ENTRY SINGLE_LIST_ENTRY
12727#define _SLIST_ENTRY _SINGLE_LIST_ENTRY
12728#define PSLIST_ENTRY PSINGLE_LIST_ENTRY
12729
12730typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
12731
12732#endif // _WIN64
12733
12734#if defined(_WIN64)
12735
12736typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
12737 struct { // original struct
12738 ULONGLONG Alignment;
12739 ULONGLONG Region;
12740 } DUMMYSTRUCTNAME;
12741 struct { // 8-byte header
12742 ULONGLONG Depth:16;
12743 ULONGLONG Sequence:9;
12744 ULONGLONG NextEntry:39;
12745 ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
12746 ULONGLONG Init:1; // 0: uninitialized; 1: initialized
12747 ULONGLONG Reserved:59;
12748 ULONGLONG Region:3;
12749 } Header8;
12750 struct { // ia64 16-byte header
12751 ULONGLONG Depth:16;
12752 ULONGLONG Sequence:48;
12753 ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
12754 ULONGLONG Init:1; // 0: uninitialized; 1: initialized
12755 ULONGLONG Reserved:2;
12756 ULONGLONG NextEntry:60; // last 4 bits are always 0's
12757 } Header16;
12758 struct { // x64 16-byte header
12759 ULONGLONG Depth:16;
12760 ULONGLONG Sequence:48;
12761 ULONGLONG HeaderType:1; // 0: 8-byte; 1: 16-byte
12762 ULONGLONG Reserved:3;
12763 ULONGLONG NextEntry:60; // last 4 bits are always 0's
12764 } HeaderX64;
12765} SLIST_HEADER, *PSLIST_HEADER;
12766
12767typedef union _SLIST_HEADER32{
12768 ULONGLONG Alignment;
12769 struct {
12770 SLIST_ENTRY32 Next;
12771 WORD Depth;
12772 WORD Sequence;
12773 } DUMMYSTRUCTNAME;
12774} SLIST_HEADER32, *PSLIST_HEADER32;
12775
12776#else
12777
12778typedef union _SLIST_HEADER {
12779 ULONGLONG Alignment;
12780 struct {
12781 SLIST_ENTRY Next;
12782 WORD Depth;
12783 WORD Sequence;
12784 } DUMMYSTRUCTNAME;
12785} SLIST_HEADER, *PSLIST_HEADER;
12786
12787typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
12788
12789#endif // _WIN64
12790
12791#endif // _SLIST_HEADER_
12792
12793
12794NTSYSAPI
12795VOID
12796NTAPI
12797RtlInitializeSListHead (
12798 __out PSLIST_HEADER ListHead
12799 );
12800
12801__checkReturn
12802NTSYSAPI
12803PSLIST_ENTRY
12804NTAPI
12805RtlFirstEntrySList (
12806 __in const SLIST_HEADER *ListHead
12807 );
12808
12809NTSYSAPI
12810PSLIST_ENTRY
12811NTAPI
12812RtlInterlockedPopEntrySList (
12813 __inout PSLIST_HEADER ListHead
12814 );
12815
12816NTSYSAPI
12817PSLIST_ENTRY
12818NTAPI
12819RtlInterlockedPushEntrySList (
12820 __inout PSLIST_HEADER ListHead,
12821 __inout __drv_aliasesMem PSLIST_ENTRY ListEntry
12822 );
12823
12824NTSYSAPI
12825PSLIST_ENTRY
12826NTAPI
12827RtlInterlockedFlushSList (
12828 __inout PSLIST_HEADER ListHead
12829 );
12830
12831NTSYSAPI
12832WORD
12833NTAPI
12834RtlQueryDepthSList (
12835 __in PSLIST_HEADER ListHead
12836 );
12837
12838#if defined(_IA64_)
12839
12840NTSYSAPI
12841PSLIST_ENTRY32
12842NTAPI
12843RtlInterlockedPopEntrySList32 (
12844 __inout PSLIST_HEADER32 ListHead
12845 );
12846
12847#endif
12848
12849// begin_ntddk
12850
12851#ifndef _RTL_RUN_ONCE_DEF
12852#define _RTL_RUN_ONCE_DEF
12853
12854//
12855// Run once
12856//
12857
12858#define RTL_RUN_ONCE_INIT {0} // Static initializer
12859
12860//
12861// Run once flags
12862//
12863
12864#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001UL
12865#define RTL_RUN_ONCE_ASYNC 0x00000002UL
12866#define RTL_RUN_ONCE_INIT_FAILED 0x00000004UL
12867
12868//
12869// The context stored in the run once structure must leave the following number
12870// of low order bits unused.
12871//
12872
12873#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
12874
12875typedef union _RTL_RUN_ONCE {
12876 PVOID Ptr;
12877} RTL_RUN_ONCE, *PRTL_RUN_ONCE;
12878
12879typedef
12880__drv_functionClass(RTL_RUN_ONCE_INIT_FN)
12881__drv_sameIRQL
12882DWORD /* LOGICAL */
12883NTAPI
12884RTL_RUN_ONCE_INIT_FN (
12885 __inout PRTL_RUN_ONCE RunOnce,
12886 __inout_opt PVOID Parameter,
12887 __deref_opt_inout_opt PVOID *Context
12888 );
12889typedef RTL_RUN_ONCE_INIT_FN *PRTL_RUN_ONCE_INIT_FN;
12890
12891#endif // _RTL_RUN_ONCE_DEF
12892
12893#if (NTDDI_VERSION >= NTDDI_LONGHORN)
12894
12895__drv_maxIRQL(APC_LEVEL)
12896NTSYSAPI
12897VOID
12898NTAPI
12899RtlRunOnceInitialize (
12900 __out PRTL_RUN_ONCE RunOnce
12901 );
12902
12903__drv_maxIRQL(APC_LEVEL)
12904__drv_inTry
12905NTSYSAPI
12906DWORD
12907NTAPI
12908RtlRunOnceExecuteOnce (
12909 __inout PRTL_RUN_ONCE RunOnce,
12910 __in __callback PRTL_RUN_ONCE_INIT_FN InitFn,
12911 __inout_opt PVOID Parameter,
12912 __deref_opt_out_opt PVOID *Context
12913 );
12914
12915__drv_maxIRQL(APC_LEVEL)
12916__checkReturn
12917NTSYSAPI
12918DWORD
12919NTAPI
12920RtlRunOnceBeginInitialize (
12921 __inout PRTL_RUN_ONCE RunOnce,
12922 __in DWORD Flags,
12923 __deref_opt_out_opt PVOID *Context
12924 );
12925
12926__drv_maxIRQL(APC_LEVEL)
12927NTSYSAPI
12928DWORD
12929NTAPI
12930RtlRunOnceComplete (
12931 __inout PRTL_RUN_ONCE RunOnce,
12932 __in DWORD Flags,
12933 __in_opt PVOID Context
12934 );
12935
12936#endif // NTDDI_VERSION >= NTDDI_LONGHORN
12937
12938#define HEAP_NO_SERIALIZE 0x00000001
12939#define HEAP_GROWABLE 0x00000002
12940#define HEAP_GENERATE_EXCEPTIONS 0x00000004
12941#define HEAP_ZERO_MEMORY 0x00000008
12942#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010
12943#define HEAP_TAIL_CHECKING_ENABLED 0x00000020
12944#define HEAP_FREE_CHECKING_ENABLED 0x00000040
12945#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080
12946#define HEAP_CREATE_ALIGN_16 0x00010000
12947#define HEAP_CREATE_ENABLE_TRACING 0x00020000
12948#define HEAP_CREATE_ENABLE_EXECUTE 0x00040000
12949#define HEAP_MAXIMUM_TAG 0x0FFF
12950#define HEAP_PSEUDO_TAG_FLAG 0x8000
12951#define HEAP_TAG_SHIFT 18
12952#if !defined(MIDL_PASS)
12953FORCEINLINE
12954DWORD
12955HEAP_MAKE_TAG_FLAGS (
12956 __in DWORD TagBase,
12957 __in DWORD Tag
12958 )
12959
12960{
12961 __assume_bound(TagBase);
12962 return ((DWORD)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
12963}
12964#endif
12965
12966#if (NTDDI_VERSION > NTDDI_WINXP)
12967NTSYSAPI
12968WORD
12969NTAPI
12970RtlCaptureStackBackTrace(
12971 __in DWORD FramesToSkip,
12972 __in DWORD FramesToCapture,
12973 __out_ecount(FramesToCapture) PVOID *BackTrace,
12974 __out_opt PDWORD BackTraceHash
12975 );
12976#endif
12977
12978#if (NTDDI_VERSION > NTDDI_WIN2K)
12979NTSYSAPI
12980VOID
12981NTAPI
12982RtlCaptureContext (
12983 __out PCONTEXT ContextRecord
12984 );
12985#endif
12986
12987
12988#define IS_TEXT_UNICODE_ASCII16 0x0001
12989#define IS_TEXT_UNICODE_REVERSE_ASCII16 0x0010
12990
12991#define IS_TEXT_UNICODE_STATISTICS 0x0002
12992#define IS_TEXT_UNICODE_REVERSE_STATISTICS 0x0020
12993
12994#define IS_TEXT_UNICODE_CONTROLS 0x0004
12995#define IS_TEXT_UNICODE_REVERSE_CONTROLS 0x0040
12996
12997#define IS_TEXT_UNICODE_SIGNATURE 0x0008
12998#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 0x0080
12999
13000#define IS_TEXT_UNICODE_ILLEGAL_CHARS 0x0100
13001#define IS_TEXT_UNICODE_ODD_LENGTH 0x0200
13002#define IS_TEXT_UNICODE_DBCS_LEADBYTE 0x0400
13003#define IS_TEXT_UNICODE_NULL_BYTES 0x1000
13004
13005#define IS_TEXT_UNICODE_UNICODE_MASK 0x000F
13006#define IS_TEXT_UNICODE_REVERSE_MASK 0x00F0
13007#define IS_TEXT_UNICODE_NOT_UNICODE_MASK 0x0F00
13008#define IS_TEXT_UNICODE_NOT_ASCII_MASK 0xF000
13009
13010#define COMPRESSION_FORMAT_NONE (0x0000)
13011#define COMPRESSION_FORMAT_DEFAULT (0x0001)
13012#define COMPRESSION_FORMAT_LZNT1 (0x0002)
13013#define COMPRESSION_ENGINE_STANDARD (0x0000)
13014#define COMPRESSION_ENGINE_MAXIMUM (0x0100)
13015#define COMPRESSION_ENGINE_HIBER (0x0200)
13016
13017#if _DBG_MEMCPY_INLINE_ && !defined(MIDL_PASS) && !defined(_MEMCPY_INLINE_) && !defined(_CRTBLD)
13018#define _MEMCPY_INLINE_
13019FORCEINLINE
13020PVOID
13021__cdecl
13022memcpy_inline (
13023 __out_bcount_full(size) void *dst,
13024 __in_bcount(size) const void *src,
13025 __in size_t size
13026 )
13027{
13028 //
13029 // Make sure the source and destination do not overlap such that the
13030 // move destroys the destination.
13031 //
13032 if (((char *)dst > (char *)src) &&
13033 ((char *)dst < ((char *)src + size))) {
13034 __debugbreak();
13035 }
13036 return memcpy(dst, src, size);
13037}
13038#define memcpy memcpy_inline
13039#endif
13040
13041#if (NTDDI_VERSION >= NTDDI_WIN2K)
13042__checkReturn
13043NTSYSAPI
13044SIZE_T
13045NTAPI
13046RtlCompareMemory (
13047 __in const VOID *Source1,
13048 __in const VOID *Source2,
13049 __in SIZE_T Length
13050 );
13051
13052#endif
13053
13054#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
13055#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
13056#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
13057#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
13058#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
13059
13060
13061#if !defined(MIDL_PASS)
13062
13063FORCEINLINE
13064PVOID
13065RtlSecureZeroMemory(
13066 __out_bcount_full(cnt) PVOID ptr,
13067 __in SIZE_T cnt
13068 )
13069{
13070 volatile char *vptr = (volatile char *)ptr;
13071
13072#if defined(_M_AMD64)
13073
13074 __stosb((PBYTE )((DWORD64)vptr), 0, cnt);
13075
13076#else
13077
13078 while (cnt) {
13079 *vptr = 0;
13080 vptr++;
13081 cnt--;
13082 }
13083
13084#endif
13085
13086 return ptr;
13087}
13088
13089#endif
13090
13091
13092#define SEF_DACL_AUTO_INHERIT 0x01
13093#define SEF_SACL_AUTO_INHERIT 0x02
13094#define SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT 0x04
13095#define SEF_AVOID_PRIVILEGE_CHECK 0x08
13096#define SEF_AVOID_OWNER_CHECK 0x10
13097#define SEF_DEFAULT_OWNER_FROM_PARENT 0x20
13098#define SEF_DEFAULT_GROUP_FROM_PARENT 0x40
13099#define SEF_MACL_NO_WRITE_UP 0x100
13100#define SEF_MACL_NO_READ_UP 0x200
13101#define SEF_MACL_NO_EXECUTE_UP 0x400
13102#define SEF_AVOID_OWNER_RESTRICTION 0x1000
13103
13104#define SEF_MACL_VALID_FLAGS (SEF_MACL_NO_WRITE_UP | \
13105 SEF_MACL_NO_READ_UP | \
13106 SEF_MACL_NO_EXECUTE_UP)
13107
13108
13109typedef struct _MESSAGE_RESOURCE_ENTRY {
13110 WORD Length;
13111 WORD Flags;
13112 BYTE Text[ 1 ];
13113} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
13114
13115#define MESSAGE_RESOURCE_UNICODE 0x0001
13116
13117typedef struct _MESSAGE_RESOURCE_BLOCK {
13118 DWORD LowId;
13119 DWORD HighId;
13120 DWORD OffsetToEntries;
13121} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
13122
13123typedef struct _MESSAGE_RESOURCE_DATA {
13124 DWORD NumberOfBlocks;
13125 MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
13126} MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
13127
13128
13129NTSYSAPI
13130PVOID
13131NTAPI
13132RtlPcToFileHeader(
13133 __in PVOID PcValue,
13134 __out PVOID *BaseOfImage
13135 );
13136
13137typedef struct _OSVERSIONINFOA {
13138 DWORD dwOSVersionInfoSize;
13139 DWORD dwMajorVersion;
13140 DWORD dwMinorVersion;
13141 DWORD dwBuildNumber;
13142 DWORD dwPlatformId;
13143 CHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
13144} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
13145
13146typedef struct _OSVERSIONINFOW {
13147 DWORD dwOSVersionInfoSize;
13148 DWORD dwMajorVersion;
13149 DWORD dwMinorVersion;
13150 DWORD dwBuildNumber;
13151 DWORD dwPlatformId;
13152 WCHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
13153} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
13154#ifdef UNICODE
13155typedef OSVERSIONINFOW OSVERSIONINFO;
13156typedef POSVERSIONINFOW POSVERSIONINFO;
13157typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
13158#else
13159typedef OSVERSIONINFOA OSVERSIONINFO;
13160typedef POSVERSIONINFOA POSVERSIONINFO;
13161typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
13162#endif // UNICODE
13163
13164typedef struct _OSVERSIONINFOEXA {
13165 DWORD dwOSVersionInfoSize;
13166 DWORD dwMajorVersion;
13167 DWORD dwMinorVersion;
13168 DWORD dwBuildNumber;
13169 DWORD dwPlatformId;
13170 CHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
13171 WORD wServicePackMajor;
13172 WORD wServicePackMinor;
13173 WORD wSuiteMask;
13174 BYTE wProductType;
13175 BYTE wReserved;
13176} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
13177typedef struct _OSVERSIONINFOEXW {
13178 DWORD dwOSVersionInfoSize;
13179 DWORD dwMajorVersion;
13180 DWORD dwMinorVersion;
13181 DWORD dwBuildNumber;
13182 DWORD dwPlatformId;
13183 WCHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
13184 WORD wServicePackMajor;
13185 WORD wServicePackMinor;
13186 WORD wSuiteMask;
13187 BYTE wProductType;
13188 BYTE wReserved;
13189} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
13190#ifdef UNICODE
13191typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
13192typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
13193typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
13194#else
13195typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
13196typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
13197typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
13198#endif // UNICODE
13199
13200//
13201// RtlVerifyVersionInfo() conditions
13202//
13203
13204#define VER_EQUAL 1
13205#define VER_GREATER 2
13206#define VER_GREATER_EQUAL 3
13207#define VER_LESS 4
13208#define VER_LESS_EQUAL 5
13209#define VER_AND 6
13210#define VER_OR 7
13211
13212#define VER_CONDITION_MASK 7
13213#define VER_NUM_BITS_PER_CONDITION_MASK 3
13214
13215//
13216// RtlVerifyVersionInfo() type mask bits
13217//
13218
13219#define VER_MINORVERSION 0x0000001
13220#define VER_MAJORVERSION 0x0000002
13221#define VER_BUILDNUMBER 0x0000004
13222#define VER_PLATFORMID 0x0000008
13223#define VER_SERVICEPACKMINOR 0x0000010
13224#define VER_SERVICEPACKMAJOR 0x0000020
13225#define VER_SUITENAME 0x0000040
13226#define VER_PRODUCT_TYPE 0x0000080
13227
13228//
13229// RtlVerifyVersionInfo() os product type values
13230//
13231
13232#define VER_NT_WORKSTATION 0x0000001
13233#define VER_NT_DOMAIN_CONTROLLER 0x0000002
13234#define VER_NT_SERVER 0x0000003
13235
13236//
13237// dwPlatformId defines:
13238//
13239
13240#define VER_PLATFORM_WIN32s 0
13241#define VER_PLATFORM_WIN32_WINDOWS 1
13242#define VER_PLATFORM_WIN32_NT 2
13243
13244
13245//
13246//
13247// VerifyVersionInfo() macro to set the condition mask
13248//
13249// For documentation sakes here's the old version of the macro that got
13250// changed to call an API
13251// #define VER_SET_CONDITION(_m_,_t_,_c_) _m_=(_m_|(_c_<<(1<<_t_)))
13252//
13253
13254#define VER_SET_CONDITION(_m_,_t_,_c_) \
13255 ((_m_)=VerSetConditionMask((_m_),(_t_),(_c_)))
13256
13257#if (NTDDI_VERSION >= NTDDI_WIN2K)
13258NTSYSAPI
13259ULONGLONG
13260NTAPI
13261VerSetConditionMask(
13262 __in ULONGLONG ConditionMask,
13263 __in DWORD TypeMask,
13264 __in BYTE Condition
13265 );
13266#endif
13267
13268//
13269
13270#if (NTDDI_VERSION >= NTDDI_VISTA)
13271
13272NTSYSAPI
13273BOOLEAN
13274NTAPI
13275RtlGetProductInfo(
13276 __in DWORD OSMajorVersion,
13277 __in DWORD OSMinorVersion,
13278 __in DWORD SpMajorVersion,
13279 __in DWORD SpMinorVersion,
13280 __out PDWORD ReturnedProductType
13281 );
13282
13283#endif
13284
13285#define RTL_UMS_VERSION (0x0100)
13286
13287typedef enum _RTL_UMS_THREAD_INFO_CLASS {
13288 UmsThreadInvalidInfoClass = 0,
13289 UmsThreadUserContext,
13290 UmsThreadPriority,
13291 UmsThreadAffinity,
13292 UmsThreadTeb,
13293 UmsThreadIsSuspended,
13294 UmsThreadIsTerminated,
13295 UmsThreadMaxInfoClass
13296} RTL_UMS_THREAD_INFO_CLASS, *PRTL_UMS_THREAD_INFO_CLASS;
13297
13298typedef enum _RTL_UMS_SCHEDULER_REASON {
13299 UmsSchedulerStartup = 0,
13300 UmsSchedulerThreadBlocked,
13301 UmsSchedulerThreadYield,
13302} RTL_UMS_SCHEDULER_REASON, *PRTL_UMS_SCHEDULER_REASON;
13303
13304typedef
13305__drv_functionClass(RTL_UMS_SCHEDULER_ENTRY_POINT)
13306VOID
13307NTAPI
13308RTL_UMS_SCHEDULER_ENTRY_POINT(
13309 __in RTL_UMS_SCHEDULER_REASON Reason,
13310 __in ULONG_PTR ActivationPayload,
13311 __in PVOID SchedulerParam
13312 );
13313
13314typedef RTL_UMS_SCHEDULER_ENTRY_POINT *PRTL_UMS_SCHEDULER_ENTRY_POINT;
13315
13316
13317#if (NTDDI_VERSION >= NTDDI_WIN7)
13318
13319
13320NTSYSAPI
13321DWORD
13322NTAPI
13323RtlCopyExtendedContext (
13324 __out PCONTEXT_EX Destination,
13325 __in DWORD ContextFlags,
13326 __in PCONTEXT_EX Source
13327 );
13328
13329NTSYSAPI
13330DWORD
13331NTAPI
13332RtlInitializeExtendedContext (
13333 __out PVOID Context,
13334 __in DWORD ContextFlags,
13335 __out PCONTEXT_EX* ContextEx
13336 );
13337
13338NTSYSAPI
13339DWORD64
13340NTAPI
13341RtlGetEnabledExtendedFeatures (
13342 __in DWORD64 FeatureMask
13343 );
13344
13345
13346NTSYSAPI
13347DWORD
13348NTAPI
13349RtlGetExtendedContextLength (
13350 __in DWORD ContextFlags,
13351 __out PDWORD ContextLength
13352 );
13353
13354NTSYSAPI
13355DWORD64
13356NTAPI
13357RtlGetExtendedFeaturesMask (
13358 __in PCONTEXT_EX ContextEx
13359 );
13360
13361NTSYSAPI
13362PVOID
13363NTAPI
13364RtlLocateExtendedFeature (
13365 __in PCONTEXT_EX ContextEx,
13366 __in DWORD FeatureId,
13367 __out_opt PDWORD Length
13368 );
13369
13370NTSYSAPI
13371PCONTEXT
13372NTAPI
13373RtlLocateLegacyContext (
13374 __in PCONTEXT_EX ContextEx,
13375 __out_opt PDWORD Length
13376 );
13377
13378NTSYSAPI
13379VOID
13380NTAPI
13381RtlSetExtendedFeaturesMask (
13382 __out PCONTEXT_EX ContextEx,
13383 __in DWORD64 FeatureMask
13384 );
13385
13386#endif
13387
13388
13389typedef struct _RTL_CRITICAL_SECTION_DEBUG {
13390 WORD Type;
13391 WORD CreatorBackTraceIndex;
13392 struct _RTL_CRITICAL_SECTION *CriticalSection;
13393 LIST_ENTRY ProcessLocksList;
13394 DWORD EntryCount;
13395 DWORD ContentionCount;
13396 DWORD Flags;
13397 WORD CreatorBackTraceIndexHigh;
13398 WORD SpareWORD ;
13399} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
13400
13401#define RTL_CRITSECT_TYPE 0
13402#define RTL_RESOURCE_TYPE 1
13403
13404//
13405// These flags define the upper byte of the critical section SpinCount field
13406//
13407#define RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO 0x01000000
13408#define RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN 0x02000000
13409#define RTL_CRITICAL_SECTION_FLAG_STATIC_INIT 0x04000000
13410#define RTL_CRITICAL_SECTION_ALL_FLAG_BITS 0xFF000000
13411#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)))
13412
13413//
13414// These flags define possible values stored in the Flags field of a critsec debuginfo.
13415//
13416#define RTL_CRITICAL_SECTION_DEBUG_FLAG_STATIC_INIT 0x00000001
13417
13418#pragma pack(push, 8)
13419
13420typedef struct _RTL_CRITICAL_SECTION {
13421 PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
13422
13423 //
13424 // The following three fields control entering and exiting the critical
13425 // section for the resource
13426 //
13427
13428 LONG LockCount;
13429 LONG RecursionCount;
13430 HANDLE OwningThread; // from the thread's ClientId->UniqueThread
13431 HANDLE LockSemaphore;
13432 ULONG_PTR SpinCount; // force size on 64-bit systems when packed
13433} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
13434
13435#pragma pack(pop)
13436
13437typedef struct _RTL_SRWLOCK {
13438 PVOID Ptr;
13439} RTL_SRWLOCK, *PRTL_SRWLOCK;
13440#define RTL_SRWLOCK_INIT {0}
13441typedef struct _RTL_CONDITION_VARIABLE {
13442 PVOID Ptr;
13443} RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE;
13444#define RTL_CONDITION_VARIABLE_INIT {0}
13445#define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED 0x1
13446typedef
13447VOID
13448(NTAPI *PAPCFUNC)(
13449 __in ULONG_PTR Parameter
13450 );
13451typedef LONG (NTAPI *PVECTORED_EXCEPTION_HANDLER)(
13452 struct _EXCEPTION_POINTERS *ExceptionInfo
13453 );
13454
13455typedef enum _HEAP_INFORMATION_CLASS {
13456
13457 HeapCompatibilityInformation,
13458 HeapEnableTerminationOnCorruption
13459
13460
13461} HEAP_INFORMATION_CLASS;
13462
13463
13464#define WT_EXECUTEDEFAULT 0x00000000
13465#define WT_EXECUTEINIOTHREAD 0x00000001
13466#define WT_EXECUTEINUITHREAD 0x00000002
13467#define WT_EXECUTEINWAITTHREAD 0x00000004
13468#define WT_EXECUTEONLYONCE 0x00000008
13469#define WT_EXECUTEINTIMERTHREAD 0x00000020
13470#define WT_EXECUTELONGFUNCTION 0x00000010
13471#define WT_EXECUTEINPERSISTENTIOTHREAD 0x00000040
13472#define WT_EXECUTEINPERSISTENTTHREAD 0x00000080
13473#define WT_TRANSFER_IMPERSONATION 0x00000100
13474#define WT_SET_MAX_THREADPOOL_THREADS(Flags, Limit) ((Flags) |= (Limit)<<16)
13475typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );
13476typedef VOID (NTAPI * WORKERCALLBACKFUNC) (PVOID );
13477typedef VOID (NTAPI * APC_CALLBACK_FUNCTION) (DWORD , PVOID, PVOID);
13478typedef
13479VOID
13480(NTAPI *PFLS_CALLBACK_FUNCTION) (
13481 IN PVOID lpFlsData
13482 );
13483
13484typedef
13485BOOLEAN
13486(NTAPI *PSECURE_MEMORY_CACHE_CALLBACK) (
13487 __in_bcount(Range) PVOID Addr,
13488 __in SIZE_T Range
13489 );
13490
13491#define WT_EXECUTEINLONGTHREAD 0x00000010
13492#define WT_EXECUTEDELETEWAIT 0x00000008
13493
13494typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {
13495 ActivationContextBasicInformation = 1,
13496 ActivationContextDetailedInformation = 2,
13497 AssemblyDetailedInformationInActivationContext = 3,
13498 FileInformationInAssemblyOfAssemblyInActivationContext = 4,
13499 RunlevelInformationInActivationContext = 5,
13500 CompatibilityInformationInActivationContext = 6,
13501 ActivationContextManifestResourceName = 7,
13502 MaxActivationContextInfoClass,
13503
13504 //
13505 // compatibility with old names
13506 //
13507 AssemblyDetailedInformationInActivationContxt = 3,
13508 FileInformationInAssemblyOfAssemblyInActivationContxt = 4
13509} ACTIVATION_CONTEXT_INFO_CLASS;
13510
13511#define ACTIVATIONCONTEXTINFOCLASS ACTIVATION_CONTEXT_INFO_CLASS
13512
13513
13514typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {
13515 DWORD ulAssemblyIndex;
13516 DWORD ulFileIndexInAssembly;
13517} ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;
13518
13519typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;
13520
13521
13522#define ACTIVATION_CONTEXT_PATH_TYPE_NONE (1)
13523#define ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE (2)
13524#define ACTIVATION_CONTEXT_PATH_TYPE_URL (3)
13525#define ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF (4)
13526
13527typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
13528 DWORD ulFlags;
13529 DWORD ulFilenameLength;
13530 DWORD ulPathLength;
13531
13532 PCWSTR lpFileName;
13533 PCWSTR lpFilePath;
13534} ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;
13535typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
13536
13537//
13538// compatibility with old names
13539// The new names use "file" consistently.
13540//
13541#define _ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION _ASSEMBLY_FILE_DETAILED_INFORMATION
13542#define ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION ASSEMBLY_FILE_DETAILED_INFORMATION
13543#define PASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PASSEMBLY_FILE_DETAILED_INFORMATION
13544#define PCASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PCASSEMBLY_FILE_DETAILED_INFORMATION
13545
13546typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
13547 DWORD ulFlags;
13548 DWORD ulEncodedAssemblyIdentityLength; // in bytes
13549 DWORD ulManifestPathType; // ACTIVATION_CONTEXT_PATH_TYPE_*
13550 DWORD ulManifestPathLength; // in bytes
13551 LARGE_INTEGER liManifestLastWriteTime; // FILETIME
13552 DWORD ulPolicyPathType; // ACTIVATION_CONTEXT_PATH_TYPE_*
13553 DWORD ulPolicyPathLength; // in bytes
13554 LARGE_INTEGER liPolicyLastWriteTime; // FILETIME
13555 DWORD ulMetadataSatelliteRosterIndex;
13556
13557 DWORD ulManifestVersionMajor; // 1
13558 DWORD ulManifestVersionMinor; // 0
13559 DWORD ulPolicyVersionMajor; // 0
13560 DWORD ulPolicyVersionMinor; // 0
13561 DWORD ulAssemblyDirectoryNameLength; // in bytes
13562
13563 PCWSTR lpAssemblyEncodedAssemblyIdentity;
13564 PCWSTR lpAssemblyManifestPath;
13565 PCWSTR lpAssemblyPolicyPath;
13566 PCWSTR lpAssemblyDirectoryName;
13567
13568 DWORD ulFileCount;
13569} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
13570
13571typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;
13572
13573typedef enum
13574{
13575 ACTCTX_RUN_LEVEL_UNSPECIFIED = 0,
13576 ACTCTX_RUN_LEVEL_AS_INVOKER,
13577 ACTCTX_RUN_LEVEL_HIGHEST_AVAILABLE,
13578 ACTCTX_RUN_LEVEL_REQUIRE_ADMIN,
13579 ACTCTX_RUN_LEVEL_NUMBERS
13580} ACTCTX_REQUESTED_RUN_LEVEL;
13581
13582typedef struct _ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION {
13583 DWORD ulFlags;
13584 ACTCTX_REQUESTED_RUN_LEVEL RunLevel;
13585 DWORD UiAccess;
13586} ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION, * PACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION;
13587
13588typedef const struct _ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION * PCACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION ;
13589
13590typedef enum
13591{
13592 ACTCTX_COMPATIBILITY_ELEMENT_TYPE_UNKNOWN = 0,
13593 ACTCTX_COMPATIBILITY_ELEMENT_TYPE_OS,
13594 ACTCTX_COMPATIBILITY_ELEMENT_TYPE_MITIGATION
13595} ACTCTX_COMPATIBILITY_ELEMENT_TYPE;
13596
13597typedef struct _COMPATIBILITY_CONTEXT_ELEMENT {
13598 GUID Id;
13599 ACTCTX_COMPATIBILITY_ELEMENT_TYPE Type;
13600} COMPATIBILITY_CONTEXT_ELEMENT, *PCOMPATIBILITY_CONTEXT_ELEMENT;
13601
13602typedef const struct _COMPATIBILITY_CONTEXT_ELEMENT *PCCOMPATIBILITY_CONTEXT_ELEMENT;
13603
13604#pragma warning(push)
13605#pragma warning(disable:4200)
13606
13607typedef struct _ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION {
13608 DWORD ElementCount;
13609 COMPATIBILITY_CONTEXT_ELEMENT Elements[];
13610} ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION, * PACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION;
13611
13612#pragma warning(pop)
13613
13614typedef const struct _ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION * PCACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION;
13615
13616#define MAX_SUPPORTED_OS_NUM (4)
13617#define INVALID_OS_COUNT (0xffff)
13618
13619typedef struct _SUPPORTED_OS_INFO {
13620 WORD OsCount;
13621 WORD MitigationExist;
13622 WORD OsList[MAX_SUPPORTED_OS_NUM];
13623} SUPPORTED_OS_INFO, *PSUPPORTED_OS_INFO;
13624
13625typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
13626 DWORD dwFlags;
13627 DWORD ulFormatVersion;
13628 DWORD ulAssemblyCount;
13629 DWORD ulRootManifestPathType;
13630 DWORD ulRootManifestPathChars;
13631 DWORD ulRootConfigurationPathType;
13632 DWORD ulRootConfigurationPathChars;
13633 DWORD ulAppDirPathType;
13634 DWORD ulAppDirPathChars;
13635 PCWSTR lpRootManifestPath;
13636 PCWSTR lpRootConfigurationPath;
13637 PCWSTR lpAppDirPath;
13638} ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
13639
13640typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
13641
13642typedef struct _HARDWARE_COUNTER_DATA {
13643 HARDWARE_COUNTER_TYPE Type;
13644 DWORD Reserved;
13645 DWORD64 Value;
13646} HARDWARE_COUNTER_DATA, *PHARDWARE_COUNTER_DATA;
13647
13648#define PERFORMANCE_DATA_VERSION 1
13649
13650typedef struct _PERFORMANCE_DATA {
13651 WORD Size;
13652 BYTE Version;
13653 BYTE HwCountersCount;
13654 DWORD ContextSwitchCount;
13655 DWORD64 WaitReasonBitMap;
13656 DWORD64 CycleTime;
13657 DWORD RetryCount;
13658 DWORD Reserved;
13659 HARDWARE_COUNTER_DATA HwCounters[MAX_HW_COUNTERS];
13660} PERFORMANCE_DATA, *PPERFORMANCE_DATA;
13661
13662#define READ_THREAD_PROFILING_FLAG_DISPATCHING 0x00000001
13663#define READ_THREAD_PROFILING_FLAG_HARDWARE_COUNTERS 0x00000002
13664#define DLL_PROCESS_ATTACH 1
13665#define DLL_THREAD_ATTACH 2
13666#define DLL_THREAD_DETACH 3
13667#define DLL_PROCESS_DETACH 0
13668
13669//
13670// Defines for the READ flags for Eventlogging
13671//
13672#define EVENTLOG_SEQUENTIAL_READ 0x0001
13673#define EVENTLOG_SEEK_READ 0x0002
13674#define EVENTLOG_FORWARDS_READ 0x0004
13675#define EVENTLOG_BACKWARDS_READ 0x0008
13676
13677//
13678// The types of events that can be logged.
13679//
13680#define EVENTLOG_SUCCESS 0x0000
13681#define EVENTLOG_ERROR_TYPE 0x0001
13682#define EVENTLOG_WARNING_TYPE 0x0002
13683#define EVENTLOG_INFORMATION_TYPE 0x0004
13684#define EVENTLOG_AUDIT_SUCCESS 0x0008
13685#define EVENTLOG_AUDIT_FAILURE 0x0010
13686
13687//
13688// Defines for the WRITE flags used by Auditing for paired events
13689// These are not implemented in Product 1
13690//
13691
13692#define EVENTLOG_START_PAIRED_EVENT 0x0001
13693#define EVENTLOG_END_PAIRED_EVENT 0x0002
13694#define EVENTLOG_END_ALL_PAIRED_EVENTS 0x0004
13695#define EVENTLOG_PAIRED_EVENT_ACTIVE 0x0008
13696#define EVENTLOG_PAIRED_EVENT_INACTIVE 0x0010
13697
13698//
13699// Structure that defines the header of the Eventlog record. This is the
13700// fixed-sized portion before all the variable-length strings, binary
13701// data and pad bytes.
13702//
13703// TimeGenerated is the time it was generated at the client.
13704// TimeWritten is the time it was put into the log at the server end.
13705//
13706
13707typedef struct _EVENTLOGRECORD {
13708 DWORD Length; // Length of full record
13709 DWORD Reserved; // Used by the service
13710 DWORD RecordNumber; // Absolute record number
13711 DWORD TimeGenerated; // Seconds since 1-1-1970
13712 DWORD TimeWritten; // Seconds since 1-1-1970
13713 DWORD EventID;
13714 WORD EventType;
13715 WORD NumStrings;
13716 WORD EventCategory;
13717 WORD ReservedFlags; // For use with paired events (auditing)
13718 DWORD ClosingRecordNumber; // For use with paired events (auditing)
13719 DWORD StringOffset; // Offset from beginning of record
13720 DWORD UserSidLength;
13721 DWORD UserSidOffset;
13722 DWORD DataLength;
13723 DWORD DataOffset; // Offset from beginning of record
13724 //
13725 // Then follow:
13726 //
13727 // WCHAR SourceName[]
13728 // WCHAR Computername[]
13729 // SID UserSid
13730 // WCHAR Strings[]
13731 // BYTE Data[]
13732 // CHAR Pad[]
13733 // DWORD Length;
13734 //
13735} EVENTLOGRECORD, *PEVENTLOGRECORD;
13736
13737//SS: start of changes to support clustering
13738//SS: ideally the
13739#define MAXLOGICALLOGNAMESIZE 256
13740
13741#if _MSC_VER >= 1200
13742#pragma warning(push)
13743#endif
13744#pragma warning(disable : 4200) /* nonstandard extension used : zero-sized array in struct/union */
13745
13746struct _EVENTSFORLOGFILE;
13747typedef struct _EVENTSFORLOGFILE EVENTSFORLOGFILE, *PEVENTSFORLOGFILE;
13748
13749struct _PACKEDEVENTINFO;
13750typedef struct _PACKEDEVENTINFO PACKEDEVENTINFO, *PPACKEDEVENTINFO;
13751
13752#if defined(_MSC_EXTENSIONS)
13753
13754struct _EVENTSFORLOGFILE
13755{
13756 DWORD ulSize;
13757 WCHAR szLogicalLogFile[MAXLOGICALLOGNAMESIZE]; //name of the logical file-security/application/system
13758 DWORD ulNumRecords;
13759 EVENTLOGRECORD pEventLogRecords[];
13760};
13761
13762struct _PACKEDEVENTINFO
13763{
13764 DWORD ulSize; //total size of the structure
13765 DWORD ulNumEventsForLogFile; //number of EventsForLogFile structure that follow
13766 DWORD ulOffsets[]; //the offsets from the start of this structure to the EVENTSFORLOGFILE structure
13767};
13768
13769#endif
13770
13771#if _MSC_VER >= 1200
13772#pragma warning(pop)
13773#else
13774#pragma warning(default : 4200) /* nonstandard extension used : zero-sized array in struct/union */
13775#endif
13776//SS: end of changes to support clustering
13777//
13778
13779// begin_wdm
13780//
13781// Registry Specific Access Rights.
13782//
13783
13784#define KEY_QUERY_VALUE (0x0001)
13785#define KEY_SET_VALUE (0x0002)
13786#define KEY_CREATE_SUB_KEY (0x0004)
13787#define KEY_ENUMERATE_SUB_KEYS (0x0008)
13788#define KEY_NOTIFY (0x0010)
13789#define KEY_CREATE_LINK (0x0020)
13790#define KEY_WOW64_32KEY (0x0200)
13791#define KEY_WOW64_64KEY (0x0100)
13792#define KEY_WOW64_RES (0x0300)
13793
13794#define KEY_READ ((STANDARD_RIGHTS_READ |\
13795 KEY_QUERY_VALUE |\
13796 KEY_ENUMERATE_SUB_KEYS |\
13797 KEY_NOTIFY) \
13798 & \
13799 (~SYNCHRONIZE))
13800
13801
13802#define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
13803 KEY_SET_VALUE |\
13804 KEY_CREATE_SUB_KEY) \
13805 & \
13806 (~SYNCHRONIZE))
13807
13808#define KEY_EXECUTE ((KEY_READ) \
13809 & \
13810 (~SYNCHRONIZE))
13811
13812#define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
13813 KEY_QUERY_VALUE |\
13814 KEY_SET_VALUE |\
13815 KEY_CREATE_SUB_KEY |\
13816 KEY_ENUMERATE_SUB_KEYS |\
13817 KEY_NOTIFY |\
13818 KEY_CREATE_LINK) \
13819 & \
13820 (~SYNCHRONIZE))
13821
13822//
13823// Open/Create Options
13824//
13825
13826#define REG_OPTION_RESERVED (0x00000000L) // Parameter is reserved
13827
13828#define REG_OPTION_NON_VOLATILE (0x00000000L) // Key is preserved
13829 // when system is rebooted
13830
13831#define REG_OPTION_VOLATILE (0x00000001L) // Key is not preserved
13832 // when system is rebooted
13833
13834#define REG_OPTION_CREATE_LINK (0x00000002L) // Created key is a
13835 // symbolic link
13836
13837#define REG_OPTION_BACKUP_RESTORE (0x00000004L) // open for backup or restore
13838 // special access rules
13839 // privilege required
13840
13841#define REG_OPTION_OPEN_LINK (0x00000008L) // Open symbolic link
13842
13843#define REG_LEGAL_OPTION \
13844 (REG_OPTION_RESERVED |\
13845 REG_OPTION_NON_VOLATILE |\
13846 REG_OPTION_VOLATILE |\
13847 REG_OPTION_CREATE_LINK |\
13848 REG_OPTION_BACKUP_RESTORE |\
13849 REG_OPTION_OPEN_LINK)
13850
13851#define REG_OPEN_LEGAL_OPTION \
13852 (REG_OPTION_RESERVED |\
13853 REG_OPTION_BACKUP_RESTORE |\
13854 REG_OPTION_OPEN_LINK)
13855
13856//
13857// Key creation/open disposition
13858//
13859
13860#define REG_CREATED_NEW_KEY (0x00000001L) // New Registry Key created
13861#define REG_OPENED_EXISTING_KEY (0x00000002L) // Existing Key opened
13862
13863//
13864// hive format to be used by Reg(Nt)SaveKeyEx
13865//
13866#define REG_STANDARD_FORMAT 1
13867#define REG_LATEST_FORMAT 2
13868#define REG_NO_COMPRESSION 4
13869
13870//
13871// Key restore & hive load flags
13872//
13873
13874#define REG_WHOLE_HIVE_VOLATILE (0x00000001L) // Restore whole hive volatile
13875#define REG_REFRESH_HIVE (0x00000002L) // Unwind changes to last flush
13876#define REG_NO_LAZY_FLUSH (0x00000004L) // Never lazy flush this hive
13877#define REG_FORCE_RESTORE (0x00000008L) // Force the restore process even when we have open handles on subkeys
13878#define REG_APP_HIVE (0x00000010L) // Loads the hive visible to the calling process
13879#define REG_PROCESS_PRIVATE (0x00000020L) // Hive cannot be mounted by any other process while in use
13880#define REG_START_JOURNAL (0x00000040L) // Starts Hive Journal
13881#define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L) // Grow hive file in exact 4k increments
13882#define REG_HIVE_NO_RM (0x00000100L) // No RM is started for this hive (no transactions)
13883#define REG_HIVE_SINGLE_LOG (0x00000200L) // Legacy single logging is used for this hive
13884#define REG_BOOT_HIVE (0x00000400L) // This hive might be used by the OS loader
13885
13886//
13887// Unload Flags
13888//
13889#define REG_FORCE_UNLOAD 1
13890
13891//
13892// Notify filter values
13893//
13894
13895#define REG_NOTIFY_CHANGE_NAME (0x00000001L) // Create or delete (child)
13896#define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
13897#define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L) // time stamp
13898#define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
13899
13900#define REG_LEGAL_CHANGE_FILTER \
13901 (REG_NOTIFY_CHANGE_NAME |\
13902 REG_NOTIFY_CHANGE_ATTRIBUTES |\
13903 REG_NOTIFY_CHANGE_LAST_SET |\
13904 REG_NOTIFY_CHANGE_SECURITY)
13905
13906// end_wdm
13907
13908//
13909//
13910// Predefined Value Types.
13911//
13912
13913#define REG_NONE ( 0 ) // No value type
13914#define REG_SZ ( 1 ) // Unicode nul terminated string
13915#define REG_EXPAND_SZ ( 2 ) // Unicode nul terminated string
13916 // (with environment variable references)
13917#define REG_BINARY ( 3 ) // Free form binary
13918#define REG_DWORD ( 4 ) // 32-bit number
13919#define REG_DWORD_LITTLE_ENDIAN ( 4 ) // 32-bit number (same as REG_DWORD)
13920#define REG_DWORD_BIG_ENDIAN ( 5 ) // 32-bit number
13921#define REG_LINK ( 6 ) // Symbolic Link (unicode)
13922#define REG_MULTI_SZ ( 7 ) // Multiple Unicode strings
13923#define REG_RESOURCE_LIST ( 8 ) // Resource list in the resource map
13924#define REG_FULL_RESOURCE_DESCRIPTOR ( 9 ) // Resource list in the hardware description
13925#define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )
13926#define REG_QWORD ( 11 ) // 64-bit number
13927#define REG_QWORD_LITTLE_ENDIAN ( 11 ) // 64-bit number (same as REG_QWORD)
13928
13929// end_wdm
13930
13931// begin_wdm
13932//
13933// Service Types (Bit Mask)
13934//
13935#define SERVICE_KERNEL_DRIVER 0x00000001
13936#define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
13937#define SERVICE_ADAPTER 0x00000004
13938#define SERVICE_RECOGNIZER_DRIVER 0x00000008
13939
13940#define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \
13941 SERVICE_FILE_SYSTEM_DRIVER | \
13942 SERVICE_RECOGNIZER_DRIVER)
13943
13944#define SERVICE_WIN32_OWN_PROCESS 0x00000010
13945#define SERVICE_WIN32_SHARE_PROCESS 0x00000020
13946#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \
13947 SERVICE_WIN32_SHARE_PROCESS)
13948
13949#define SERVICE_INTERACTIVE_PROCESS 0x00000100
13950
13951#define SERVICE_TYPE_ALL (SERVICE_WIN32 | \
13952 SERVICE_ADAPTER | \
13953 SERVICE_DRIVER | \
13954 SERVICE_INTERACTIVE_PROCESS)
13955
13956//
13957// Start Type
13958//
13959
13960#define SERVICE_BOOT_START 0x00000000
13961#define SERVICE_SYSTEM_START 0x00000001
13962#define SERVICE_AUTO_START 0x00000002
13963#define SERVICE_DEMAND_START 0x00000003
13964#define SERVICE_DISABLED 0x00000004
13965
13966//
13967// Error control type
13968//
13969#define SERVICE_ERROR_IGNORE 0x00000000
13970#define SERVICE_ERROR_NORMAL 0x00000001
13971#define SERVICE_ERROR_SEVERE 0x00000002
13972#define SERVICE_ERROR_CRITICAL 0x00000003
13973
13974//
13975//
13976// Define the registry driver node enumerations
13977//
13978
13979typedef enum _CM_SERVICE_NODE_TYPE {
13980 DriverType = SERVICE_KERNEL_DRIVER,
13981 FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
13982 Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
13983 Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
13984 AdapterType = SERVICE_ADAPTER,
13985 RecognizerType = SERVICE_RECOGNIZER_DRIVER
13986} SERVICE_NODE_TYPE;
13987
13988typedef enum _CM_SERVICE_LOAD_TYPE {
13989 BootLoad = SERVICE_BOOT_START,
13990 SystemLoad = SERVICE_SYSTEM_START,
13991 AutoLoad = SERVICE_AUTO_START,
13992 DemandLoad = SERVICE_DEMAND_START,
13993 DisableLoad = SERVICE_DISABLED
13994} SERVICE_LOAD_TYPE;
13995
13996typedef enum _CM_ERROR_CONTROL_TYPE {
13997 IgnoreError = SERVICE_ERROR_IGNORE,
13998 NormalError = SERVICE_ERROR_NORMAL,
13999 SevereError = SERVICE_ERROR_SEVERE,
14000 CriticalError = SERVICE_ERROR_CRITICAL
14001} SERVICE_ERROR_TYPE;
14002
14003//
14004// Service node Flags. These flags are used by the OS loader to promote
14005// a driver's start type to boot start if the system is booting using
14006// the specified mechanism. The flags should be set in the driver's
14007// registry configuration.
14008//
14009// CM_SERVICE_NETWORK_BOOT_LOAD - Specified if a driver should be
14010// promoted on network boot.
14011//
14012// CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD - Specified if a driver should be
14013// promoted on booting from a VHD.
14014//
14015// CM_SERVICE_USB_DISK_BOOT_LOAD - Specified if a driver should be promoted
14016// while booting from a USB disk.
14017//
14018
14019#define CM_SERVICE_NETWORK_BOOT_LOAD 0x00000001
14020#define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
14021#define CM_SERVICE_USB_DISK_BOOT_LOAD 0x00000004
14022
14023//
14024// Mask defining the legal promotion flag values.
14025//
14026
14027#define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD | \
14028 CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \
14029 CM_SERVICE_USB_DISK_BOOT_LOAD)
14030
14031
14032
14033//
14034// IOCTL_TAPE_ERASE definitions
14035//
14036
14037#define TAPE_ERASE_SHORT 0L
14038#define TAPE_ERASE_LONG 1L
14039
14040typedef struct _TAPE_ERASE {
14041 DWORD Type;
14042 BOOLEAN Immediate;
14043} TAPE_ERASE, *PTAPE_ERASE;
14044
14045//
14046// IOCTL_TAPE_PREPARE definitions
14047//
14048
14049#define TAPE_LOAD 0L
14050#define TAPE_UNLOAD 1L
14051#define TAPE_TENSION 2L
14052#define TAPE_LOCK 3L
14053#define TAPE_UNLOCK 4L
14054#define TAPE_FORMAT 5L
14055
14056typedef struct _TAPE_PREPARE {
14057 DWORD Operation;
14058 BOOLEAN Immediate;
14059} TAPE_PREPARE, *PTAPE_PREPARE;
14060
14061//
14062// IOCTL_TAPE_WRITE_MARKS definitions
14063//
14064
14065#define TAPE_SETMARKS 0L
14066#define TAPE_FILEMARKS 1L
14067#define TAPE_SHORT_FILEMARKS 2L
14068#define TAPE_LONG_FILEMARKS 3L
14069
14070typedef struct _TAPE_WRITE_MARKS {
14071 DWORD Type;
14072 DWORD Count;
14073 BOOLEAN Immediate;
14074} TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;
14075
14076//
14077// IOCTL_TAPE_GET_POSITION definitions
14078//
14079
14080#define TAPE_ABSOLUTE_POSITION 0L
14081#define TAPE_LOGICAL_POSITION 1L
14082#define TAPE_PSEUDO_LOGICAL_POSITION 2L
14083
14084typedef struct _TAPE_GET_POSITION {
14085 DWORD Type;
14086 DWORD Partition;
14087 LARGE_INTEGER Offset;
14088} TAPE_GET_POSITION, *PTAPE_GET_POSITION;
14089
14090//
14091// IOCTL_TAPE_SET_POSITION definitions
14092//
14093
14094#define TAPE_REWIND 0L
14095#define TAPE_ABSOLUTE_BLOCK 1L
14096#define TAPE_LOGICAL_BLOCK 2L
14097#define TAPE_PSEUDO_LOGICAL_BLOCK 3L
14098#define TAPE_SPACE_END_OF_DATA 4L
14099#define TAPE_SPACE_RELATIVE_BLOCKS 5L
14100#define TAPE_SPACE_FILEMARKS 6L
14101#define TAPE_SPACE_SEQUENTIAL_FMKS 7L
14102#define TAPE_SPACE_SETMARKS 8L
14103#define TAPE_SPACE_SEQUENTIAL_SMKS 9L
14104
14105typedef struct _TAPE_SET_POSITION {
14106 DWORD Method;
14107 DWORD Partition;
14108 LARGE_INTEGER Offset;
14109 BOOLEAN Immediate;
14110} TAPE_SET_POSITION, *PTAPE_SET_POSITION;
14111
14112//
14113// IOCTL_TAPE_GET_DRIVE_PARAMS definitions
14114//
14115
14116//
14117// Definitions for FeaturesLow parameter
14118//
14119
14120#define TAPE_DRIVE_FIXED 0x00000001
14121#define TAPE_DRIVE_SELECT 0x00000002
14122#define TAPE_DRIVE_INITIATOR 0x00000004
14123
14124#define TAPE_DRIVE_ERASE_SHORT 0x00000010
14125#define TAPE_DRIVE_ERASE_LONG 0x00000020
14126#define TAPE_DRIVE_ERASE_BOP_ONLY 0x00000040
14127#define TAPE_DRIVE_ERASE_IMMEDIATE 0x00000080
14128
14129#define TAPE_DRIVE_TAPE_CAPACITY 0x00000100
14130#define TAPE_DRIVE_TAPE_REMAINING 0x00000200
14131#define TAPE_DRIVE_FIXED_BLOCK 0x00000400
14132#define TAPE_DRIVE_VARIABLE_BLOCK 0x00000800
14133
14134#define TAPE_DRIVE_WRITE_PROTECT 0x00001000
14135#define TAPE_DRIVE_EOT_WZ_SIZE 0x00002000
14136
14137#define TAPE_DRIVE_ECC 0x00010000
14138#define TAPE_DRIVE_COMPRESSION 0x00020000
14139#define TAPE_DRIVE_PADDING 0x00040000
14140#define TAPE_DRIVE_REPORT_SMKS 0x00080000
14141
14142#define TAPE_DRIVE_GET_ABSOLUTE_BLK 0x00100000
14143#define TAPE_DRIVE_GET_LOGICAL_BLK 0x00200000
14144#define TAPE_DRIVE_SET_EOT_WZ_SIZE 0x00400000
14145
14146#define TAPE_DRIVE_EJECT_MEDIA 0x01000000
14147#define TAPE_DRIVE_CLEAN_REQUESTS 0x02000000
14148#define TAPE_DRIVE_SET_CMP_BOP_ONLY 0x04000000
14149
14150#define TAPE_DRIVE_RESERVED_BIT 0x80000000 //don't use this bit!
14151// //can't be a low features bit!
14152// //reserved; high features only
14153
14154//
14155// Definitions for FeaturesHigh parameter
14156//
14157
14158#define TAPE_DRIVE_LOAD_UNLOAD 0x80000001
14159#define TAPE_DRIVE_TENSION 0x80000002
14160#define TAPE_DRIVE_LOCK_UNLOCK 0x80000004
14161#define TAPE_DRIVE_REWIND_IMMEDIATE 0x80000008
14162
14163#define TAPE_DRIVE_SET_BLOCK_SIZE 0x80000010
14164#define TAPE_DRIVE_LOAD_UNLD_IMMED 0x80000020
14165#define TAPE_DRIVE_TENSION_IMMED 0x80000040
14166#define TAPE_DRIVE_LOCK_UNLK_IMMED 0x80000080
14167
14168#define TAPE_DRIVE_SET_ECC 0x80000100
14169#define TAPE_DRIVE_SET_COMPRESSION 0x80000200
14170#define TAPE_DRIVE_SET_PADDING 0x80000400
14171#define TAPE_DRIVE_SET_REPORT_SMKS 0x80000800
14172
14173#define TAPE_DRIVE_ABSOLUTE_BLK 0x80001000
14174#define TAPE_DRIVE_ABS_BLK_IMMED 0x80002000
14175#define TAPE_DRIVE_LOGICAL_BLK 0x80004000
14176#define TAPE_DRIVE_LOG_BLK_IMMED 0x80008000
14177
14178#define TAPE_DRIVE_END_OF_DATA 0x80010000
14179#define TAPE_DRIVE_RELATIVE_BLKS 0x80020000
14180#define TAPE_DRIVE_FILEMARKS 0x80040000
14181#define TAPE_DRIVE_SEQUENTIAL_FMKS 0x80080000
14182
14183#define TAPE_DRIVE_SETMARKS 0x80100000
14184#define TAPE_DRIVE_SEQUENTIAL_SMKS 0x80200000
14185#define TAPE_DRIVE_REVERSE_POSITION 0x80400000
14186#define TAPE_DRIVE_SPACE_IMMEDIATE 0x80800000
14187
14188#define TAPE_DRIVE_WRITE_SETMARKS 0x81000000
14189#define TAPE_DRIVE_WRITE_FILEMARKS 0x82000000
14190#define TAPE_DRIVE_WRITE_SHORT_FMKS 0x84000000
14191#define TAPE_DRIVE_WRITE_LONG_FMKS 0x88000000
14192
14193#define TAPE_DRIVE_WRITE_MARK_IMMED 0x90000000
14194#define TAPE_DRIVE_FORMAT 0xA0000000
14195#define TAPE_DRIVE_FORMAT_IMMEDIATE 0xC0000000
14196#define TAPE_DRIVE_HIGH_FEATURES 0x80000000 //mask for high features flag
14197
14198typedef struct _TAPE_GET_DRIVE_PARAMETERS {
14199 BOOLEAN ECC;
14200 BOOLEAN Compression;
14201 BOOLEAN DataPadding;
14202 BOOLEAN ReportSetmarks;
14203 DWORD DefaultBlockSize;
14204 DWORD MaximumBlockSize;
14205 DWORD MinimumBlockSize;
14206 DWORD MaximumPartitionCount;
14207 DWORD FeaturesLow;
14208 DWORD FeaturesHigh;
14209 DWORD EOTWarningZoneSize;
14210} TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;
14211
14212//
14213// IOCTL_TAPE_SET_DRIVE_PARAMETERS definitions
14214//
14215
14216typedef struct _TAPE_SET_DRIVE_PARAMETERS {
14217 BOOLEAN ECC;
14218 BOOLEAN Compression;
14219 BOOLEAN DataPadding;
14220 BOOLEAN ReportSetmarks;
14221 DWORD EOTWarningZoneSize;
14222} TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;
14223
14224//
14225// IOCTL_TAPE_GET_MEDIA_PARAMETERS definitions
14226//
14227
14228typedef struct _TAPE_GET_MEDIA_PARAMETERS {
14229 LARGE_INTEGER Capacity;
14230 LARGE_INTEGER Remaining;
14231 DWORD BlockSize;
14232 DWORD PartitionCount;
14233 BOOLEAN WriteProtected;
14234} TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;
14235
14236//
14237// IOCTL_TAPE_SET_MEDIA_PARAMETERS definitions
14238//
14239
14240typedef struct _TAPE_SET_MEDIA_PARAMETERS {
14241 DWORD BlockSize;
14242} TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;
14243
14244//
14245// IOCTL_TAPE_CREATE_PARTITION definitions
14246//
14247
14248#define TAPE_FIXED_PARTITIONS 0L
14249#define TAPE_SELECT_PARTITIONS 1L
14250#define TAPE_INITIATOR_PARTITIONS 2L
14251
14252typedef struct _TAPE_CREATE_PARTITION {
14253 DWORD Method;
14254 DWORD Count;
14255 DWORD Size;
14256} TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;
14257
14258
14259//
14260// WMI Methods
14261//
14262#define TAPE_QUERY_DRIVE_PARAMETERS 0L
14263#define TAPE_QUERY_MEDIA_CAPACITY 1L
14264#define TAPE_CHECK_FOR_DRIVE_PROBLEM 2L
14265#define TAPE_QUERY_IO_ERROR_DATA 3L
14266#define TAPE_QUERY_DEVICE_ERROR_DATA 4L
14267
14268typedef struct _TAPE_WMI_OPERATIONS {
14269 DWORD Method;
14270 DWORD DataBufferSize;
14271 PVOID DataBuffer;
14272} TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
14273
14274//
14275// Type of drive errors
14276//
14277typedef enum _TAPE_DRIVE_PROBLEM_TYPE {
14278 TapeDriveProblemNone, TapeDriveReadWriteWarning,
14279 TapeDriveReadWriteError, TapeDriveReadWarning,
14280 TapeDriveWriteWarning, TapeDriveReadError,
14281 TapeDriveWriteError, TapeDriveHardwareError,
14282 TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError,
14283 TapeDriveTimetoClean, TapeDriveCleanDriveNow,
14284 TapeDriveMediaLifeExpired, TapeDriveSnappedTape
14285} TAPE_DRIVE_PROBLEM_TYPE;
14286
14287#ifndef _NTTMAPI_
14288#define _NTTMAPI_
14289
14290
14291#ifdef __cplusplus
14292extern "C" {
14293#endif
14294
14295
14296#include <ktmtypes.h>
14297
14298//
14299// Types for Nt level TM calls
14300//
14301
14302//
14303// KTM Tm object rights
14304//
14305#define TRANSACTIONMANAGER_QUERY_INFORMATION ( 0x0001 )
14306#define TRANSACTIONMANAGER_SET_INFORMATION ( 0x0002 )
14307#define TRANSACTIONMANAGER_RECOVER ( 0x0004 )
14308#define TRANSACTIONMANAGER_RENAME ( 0x0008 )
14309#define TRANSACTIONMANAGER_CREATE_RM ( 0x0010 )
14310
14311// The following right is intended for DTC's use only; it will be
14312// deprecated, and no one else should take a dependency on it.
14313#define TRANSACTIONMANAGER_BIND_TRANSACTION ( 0x0020 )
14314
14315//
14316// Generic mappings for transaction manager rights.
14317//
14318
14319#define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
14320 TRANSACTIONMANAGER_QUERY_INFORMATION)
14321
14322#define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14323 TRANSACTIONMANAGER_SET_INFORMATION |\
14324 TRANSACTIONMANAGER_RECOVER |\
14325 TRANSACTIONMANAGER_RENAME |\
14326 TRANSACTIONMANAGER_CREATE_RM)
14327
14328#define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
14329
14330#define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14331 TRANSACTIONMANAGER_GENERIC_READ |\
14332 TRANSACTIONMANAGER_GENERIC_WRITE |\
14333 TRANSACTIONMANAGER_GENERIC_EXECUTE |\
14334 TRANSACTIONMANAGER_BIND_TRANSACTION)
14335
14336
14337//
14338// KTM transaction object rights.
14339//
14340#define TRANSACTION_QUERY_INFORMATION ( 0x0001 )
14341#define TRANSACTION_SET_INFORMATION ( 0x0002 )
14342#define TRANSACTION_ENLIST ( 0x0004 )
14343#define TRANSACTION_COMMIT ( 0x0008 )
14344#define TRANSACTION_ROLLBACK ( 0x0010 )
14345#define TRANSACTION_PROPAGATE ( 0x0020 )
14346#define TRANSACTION_RIGHT_RESERVED1 ( 0x0040 )
14347
14348//
14349// Generic mappings for transaction rights.
14350// Resource managers, when enlisting, should generally use the macro
14351// TRANSACTION_RESOURCE_MANAGER_RIGHTS when opening a transaction.
14352// It's the same as generic read and write except that it does not allow
14353// a commit decision to be made.
14354//
14355
14356#define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
14357 TRANSACTION_QUERY_INFORMATION |\
14358 SYNCHRONIZE)
14359
14360#define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14361 TRANSACTION_SET_INFORMATION |\
14362 TRANSACTION_COMMIT |\
14363 TRANSACTION_ENLIST |\
14364 TRANSACTION_ROLLBACK |\
14365 TRANSACTION_PROPAGATE |\
14366 SYNCHRONIZE)
14367
14368#define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14369 TRANSACTION_COMMIT |\
14370 TRANSACTION_ROLLBACK |\
14371 SYNCHRONIZE)
14372
14373#define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14374 TRANSACTION_GENERIC_READ |\
14375 TRANSACTION_GENERIC_WRITE |\
14376 TRANSACTION_GENERIC_EXECUTE)
14377
14378#define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
14379 STANDARD_RIGHTS_WRITE |\
14380 TRANSACTION_SET_INFORMATION |\
14381 TRANSACTION_ENLIST |\
14382 TRANSACTION_ROLLBACK |\
14383 TRANSACTION_PROPAGATE |\
14384 SYNCHRONIZE)
14385
14386//
14387// KTM resource manager object rights.
14388//
14389#define RESOURCEMANAGER_QUERY_INFORMATION ( 0x0001 )
14390#define RESOURCEMANAGER_SET_INFORMATION ( 0x0002 )
14391#define RESOURCEMANAGER_RECOVER ( 0x0004 )
14392#define RESOURCEMANAGER_ENLIST ( 0x0008 )
14393#define RESOURCEMANAGER_GET_NOTIFICATION ( 0x0010 )
14394#define RESOURCEMANAGER_REGISTER_PROTOCOL ( 0x0020 )
14395#define RESOURCEMANAGER_COMPLETE_PROPAGATION ( 0x0040 )
14396
14397//
14398// Generic mappings for resource manager rights.
14399//
14400#define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
14401 RESOURCEMANAGER_QUERY_INFORMATION |\
14402 SYNCHRONIZE)
14403
14404#define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14405 RESOURCEMANAGER_SET_INFORMATION |\
14406 RESOURCEMANAGER_RECOVER |\
14407 RESOURCEMANAGER_ENLIST |\
14408 RESOURCEMANAGER_GET_NOTIFICATION |\
14409 RESOURCEMANAGER_REGISTER_PROTOCOL |\
14410 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14411 SYNCHRONIZE)
14412
14413#define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14414 RESOURCEMANAGER_RECOVER |\
14415 RESOURCEMANAGER_ENLIST |\
14416 RESOURCEMANAGER_GET_NOTIFICATION |\
14417 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14418 SYNCHRONIZE)
14419
14420#define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14421 RESOURCEMANAGER_GENERIC_READ |\
14422 RESOURCEMANAGER_GENERIC_WRITE |\
14423 RESOURCEMANAGER_GENERIC_EXECUTE)
14424
14425
14426//
14427// KTM enlistment object rights.
14428//
14429#define ENLISTMENT_QUERY_INFORMATION ( 0x0001 )
14430#define ENLISTMENT_SET_INFORMATION ( 0x0002 )
14431#define ENLISTMENT_RECOVER ( 0x0004 )
14432#define ENLISTMENT_SUBORDINATE_RIGHTS ( 0x0008 )
14433#define ENLISTMENT_SUPERIOR_RIGHTS ( 0x0010 )
14434
14435//
14436// Generic mappings for enlistment rights.
14437//
14438#define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
14439 ENLISTMENT_QUERY_INFORMATION)
14440
14441#define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
14442 ENLISTMENT_SET_INFORMATION |\
14443 ENLISTMENT_RECOVER |\
14444 ENLISTMENT_SUBORDINATE_RIGHTS |\
14445 ENLISTMENT_SUPERIOR_RIGHTS)
14446
14447#define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
14448 ENLISTMENT_RECOVER |\
14449 ENLISTMENT_SUBORDINATE_RIGHTS |\
14450 ENLISTMENT_SUPERIOR_RIGHTS)
14451
14452#define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
14453 ENLISTMENT_GENERIC_READ |\
14454 ENLISTMENT_GENERIC_WRITE |\
14455 ENLISTMENT_GENERIC_EXECUTE)
14456
14457
14458//
14459// Transaction outcomes.
14460//
14461// TODO: warning, must match values in KTRANSACTION_OUTCOME duplicated def
14462// in tm.h.
14463//
14464
14465typedef enum _TRANSACTION_OUTCOME {
14466 TransactionOutcomeUndetermined = 1,
14467 TransactionOutcomeCommitted,
14468 TransactionOutcomeAborted,
14469} TRANSACTION_OUTCOME;
14470
14471
14472typedef enum _TRANSACTION_STATE {
14473 TransactionStateNormal = 1,
14474 TransactionStateIndoubt,
14475 TransactionStateCommittedNotify,
14476} TRANSACTION_STATE;
14477
14478
14479typedef struct _TRANSACTION_BASIC_INFORMATION {
14480 GUID TransactionId;
14481 DWORD State;
14482 DWORD Outcome;
14483} TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
14484
14485typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
14486 GUID TmIdentity;
14487 LARGE_INTEGER VirtualClock;
14488} TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
14489
14490typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
14491 GUID LogIdentity;
14492} TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
14493
14494typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
14495 DWORD LogPathLength;
14496 __field_ecount(LogPathLength) WCHAR LogPath[1]; // Variable size
14497// Data[1]; // Variable size data not declared
14498} TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
14499
14500typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
14501 ULONGLONG LastRecoveredLsn;
14502} TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
14503
14504
14505// end_wdm
14506typedef struct _TRANSACTIONMANAGER_OLDEST_INFORMATION {
14507 GUID OldestTransactionGuid;
14508} TRANSACTIONMANAGER_OLDEST_INFORMATION, *PTRANSACTIONMANAGER_OLDEST_INFORMATION;
14509// begin_wdm
14510
14511
14512typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
14513 DWORD IsolationLevel;
14514 DWORD IsolationFlags;
14515 LARGE_INTEGER Timeout;
14516 DWORD Outcome;
14517 DWORD DescriptionLength;
14518 WCHAR Description[1]; // Variable size
14519// Data[1]; // Variable size data not declared
14520} TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
14521
14522// The following info-class is intended for DTC's use only; it will be
14523// deprecated, and no one else should take a dependency on it.
14524typedef struct _TRANSACTION_BIND_INFORMATION {
14525 HANDLE TmHandle;
14526} TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
14527
14528typedef struct _TRANSACTION_ENLISTMENT_PAIR {
14529 GUID EnlistmentId;
14530 GUID ResourceManagerId;
14531} TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
14532
14533typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
14534 DWORD NumberOfEnlistments;
14535 TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; // Variable size
14536} TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
14537
14538typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
14539 TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
14540} TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
14541
14542
14543typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
14544 GUID ResourceManagerId;
14545 DWORD DescriptionLength;
14546 WCHAR Description[1]; // Variable size
14547} RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
14548
14549typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
14550 HANDLE IoCompletionPortHandle;
14551 ULONG_PTR CompletionKey;
14552} RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
14553
14554// end_wdm
14555
14556// begin_wdm
14557typedef enum _TRANSACTION_INFORMATION_CLASS {
14558 TransactionBasicInformation,
14559 TransactionPropertiesInformation,
14560 TransactionEnlistmentInformation,
14561 TransactionSuperiorEnlistmentInformation
14562// end_wdm
14563 ,
14564// The following info-classes are intended for DTC's use only; it will be
14565// deprecated, and no one else should take a dependency on it.
14566 TransactionBindInformation, // private and deprecated
14567 TransactionDTCPrivateInformation // private and deprecated
14568 ,
14569// begin_wdm
14570} TRANSACTION_INFORMATION_CLASS;
14571
14572// begin_wdm
14573typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
14574 TransactionManagerBasicInformation,
14575 TransactionManagerLogInformation,
14576 TransactionManagerLogPathInformation,
14577 TransactionManagerRecoveryInformation = 4
14578// end_wdm
14579 ,
14580// The following info-classes are intended for internal use only; they
14581// are considered deprecated, and no one else should take a dependency
14582// on them.
14583 TransactionManagerOnlineProbeInformation = 3,
14584 TransactionManagerOldestTransactionInformation = 5
14585// end_wdm
14586
14587// begin_wdm
14588} TRANSACTIONMANAGER_INFORMATION_CLASS;
14589
14590
14591// begin_wdm
14592typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
14593 ResourceManagerBasicInformation,
14594 ResourceManagerCompletionInformation,
14595} RESOURCEMANAGER_INFORMATION_CLASS;
14596
14597
14598typedef struct _ENLISTMENT_BASIC_INFORMATION {
14599 GUID EnlistmentId;
14600 GUID TransactionId;
14601 GUID ResourceManagerId;
14602} ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
14603
14604typedef struct _ENLISTMENT_CRM_INFORMATION {
14605 GUID CrmTransactionManagerId;
14606 GUID CrmResourceManagerId;
14607 GUID CrmEnlistmentId;
14608} ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
14609
14610
14611// begin_wdm
14612typedef enum _ENLISTMENT_INFORMATION_CLASS {
14613 EnlistmentBasicInformation,
14614 EnlistmentRecoveryInformation,
14615 EnlistmentCrmInformation
14616} ENLISTMENT_INFORMATION_CLASS;
14617
14618typedef struct _TRANSACTION_LIST_ENTRY {
14619 UOW UOW;
14620} TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
14621
14622typedef struct _TRANSACTION_LIST_INFORMATION {
14623 DWORD NumberOfTransactions;
14624 TRANSACTION_LIST_ENTRY TransactionInformation[1]; // Var size
14625} TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
14626
14627
14628//
14629// Types of objects known to the kernel transaction manager.
14630//
14631
14632typedef enum _KTMOBJECT_TYPE {
14633
14634 KTMOBJECT_TRANSACTION,
14635 KTMOBJECT_TRANSACTION_MANAGER,
14636 KTMOBJECT_RESOURCE_MANAGER,
14637 KTMOBJECT_ENLISTMENT,
14638 KTMOBJECT_INVALID
14639
14640} KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
14641
14642
14643//
14644// KTMOBJECT_CURSOR
14645//
14646// Used by NtEnumerateTransactionObject to enumerate a transaction
14647// object namespace (e.g. enlistments in a resource manager).
14648//
14649
14650typedef struct _KTMOBJECT_CURSOR {
14651
14652 //
14653 // The last GUID enumerated; zero if beginning enumeration.
14654 //
14655
14656 GUID LastQuery;
14657
14658 //
14659 // A count of GUIDs filled in by this last enumeration.
14660 //
14661
14662 DWORD ObjectIdCount;
14663
14664 //
14665 // ObjectIdCount GUIDs from the namespace specified.
14666 //
14667
14668 GUID ObjectIds[1];
14669
14670} KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
14671
14672// begin_wdm
14673
14674#ifdef __cplusplus
14675}
14676#endif
14677
14678#endif // _NTTMAPI_
14679typedef DWORD TP_VERSION, *PTP_VERSION;
14680
14681typedef struct _TP_CALLBACK_INSTANCE TP_CALLBACK_INSTANCE, *PTP_CALLBACK_INSTANCE;
14682
14683typedef VOID (NTAPI *PTP_SIMPLE_CALLBACK)(
14684 __inout PTP_CALLBACK_INSTANCE Instance,
14685 __inout_opt PVOID Context
14686 );
14687
14688typedef struct _TP_POOL TP_POOL, *PTP_POOL;
14689
14690typedef enum _TP_CALLBACK_PRIORITY {
14691 TP_CALLBACK_PRIORITY_HIGH,
14692 TP_CALLBACK_PRIORITY_NORMAL,
14693 TP_CALLBACK_PRIORITY_LOW,
14694 TP_CALLBACK_PRIORITY_INVALID
14695} TP_CALLBACK_PRIORITY;
14696
14697typedef struct _TP_POOL_STACK_INFORMATION {
14698 SIZE_T StackReserve;
14699 SIZE_T StackCommit;
14700}TP_POOL_STACK_INFORMATION, *PTP_POOL_STACK_INFORMATION;
14701
14702typedef struct _TP_CLEANUP_GROUP TP_CLEANUP_GROUP, *PTP_CLEANUP_GROUP;
14703
14704typedef VOID (NTAPI *PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(
14705 __inout_opt PVOID ObjectContext,
14706 __inout_opt PVOID CleanupContext
14707 );
14708
14709//
14710// Do not manipulate this structure directly! Allocate space for it
14711// and use the inline interfaces below.
14712//
14713
14714#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
14715
14716typedef struct _TP_CALLBACK_ENVIRON_V3 {
14717 TP_VERSION Version;
14718 PTP_POOL Pool;
14719 PTP_CLEANUP_GROUP CleanupGroup;
14720 PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback;
14721 PVOID RaceDll;
14722 struct _ACTIVATION_CONTEXT *ActivationContext;
14723 PTP_SIMPLE_CALLBACK FinalizationCallback;
14724 union {
14725 DWORD Flags;
14726 struct {
14727 DWORD LongFunction : 1;
14728 DWORD Persistent : 1;
14729 DWORD Private : 30;
14730 } s;
14731 } u;
14732 TP_CALLBACK_PRIORITY CallbackPriority;
14733 DWORD Size;
14734} TP_CALLBACK_ENVIRON_V3;
14735
14736typedef TP_CALLBACK_ENVIRON_V3 TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON;
14737
14738#else
14739
14740typedef struct _TP_CALLBACK_ENVIRON_V1 {
14741 TP_VERSION Version;
14742 PTP_POOL Pool;
14743 PTP_CLEANUP_GROUP CleanupGroup;
14744 PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback;
14745 PVOID RaceDll;
14746 struct _ACTIVATION_CONTEXT *ActivationContext;
14747 PTP_SIMPLE_CALLBACK FinalizationCallback;
14748 union {
14749 DWORD Flags;
14750 struct {
14751 DWORD LongFunction : 1;
14752 DWORD Persistent : 1;
14753 DWORD Private : 30;
14754 } s;
14755 } u;
14756} TP_CALLBACK_ENVIRON_V1;
14757
14758typedef TP_CALLBACK_ENVIRON_V1 TP_CALLBACK_ENVIRON, *PTP_CALLBACK_ENVIRON;
14759
14760#endif
14761
14762#if !defined(MIDL_PASS)
14763
14764FORCEINLINE
14765VOID
14766TpInitializeCallbackEnviron(
14767 __out PTP_CALLBACK_ENVIRON CallbackEnviron
14768 )
14769{
14770
14771#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
14772
14773 CallbackEnviron->Version = 3;
14774
14775#else
14776
14777 CallbackEnviron->Version = 1;
14778
14779#endif
14780
14781 CallbackEnviron->Pool = NULL;
14782 CallbackEnviron->CleanupGroup = NULL;
14783 CallbackEnviron->CleanupGroupCancelCallback = NULL;
14784 CallbackEnviron->RaceDll = NULL;
14785 CallbackEnviron->ActivationContext = NULL;
14786 CallbackEnviron->FinalizationCallback = NULL;
14787 CallbackEnviron->u.Flags = 0;
14788
14789#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
14790
14791 CallbackEnviron->CallbackPriority = TP_CALLBACK_PRIORITY_NORMAL;
14792 CallbackEnviron->Size = sizeof(TP_CALLBACK_ENVIRON);
14793
14794#endif
14795
14796}
14797
14798FORCEINLINE
14799VOID
14800TpSetCallbackThreadpool(
14801 __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
14802 __in PTP_POOL Pool
14803 )
14804{
14805 CallbackEnviron->Pool = Pool;
14806}
14807
14808FORCEINLINE
14809VOID
14810TpSetCallbackCleanupGroup(
14811 __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
14812 __in PTP_CLEANUP_GROUP CleanupGroup,
14813 __in_opt PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback
14814 )
14815{
14816 CallbackEnviron->CleanupGroup = CleanupGroup;
14817 CallbackEnviron->CleanupGroupCancelCallback = CleanupGroupCancelCallback;
14818}
14819
14820FORCEINLINE
14821VOID
14822TpSetCallbackActivationContext(
14823 __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
14824 __in_opt struct _ACTIVATION_CONTEXT *ActivationContext
14825 )
14826{
14827 CallbackEnviron->ActivationContext = ActivationContext;
14828}
14829
14830FORCEINLINE
14831VOID
14832TpSetCallbackNoActivationContext(
14833 __inout PTP_CALLBACK_ENVIRON CallbackEnviron
14834 )
14835{
14836 CallbackEnviron->ActivationContext = (struct _ACTIVATION_CONTEXT *)(LONG_PTR) -1; // INVALID_ACTIVATION_CONTEXT
14837}
14838
14839FORCEINLINE
14840VOID
14841TpSetCallbackLongFunction(
14842 __inout PTP_CALLBACK_ENVIRON CallbackEnviron
14843 )
14844{
14845 CallbackEnviron->u.s.LongFunction = 1;
14846}
14847
14848FORCEINLINE
14849VOID
14850TpSetCallbackRaceWithDll(
14851 __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
14852 __in PVOID DllHandle
14853 )
14854{
14855 CallbackEnviron->RaceDll = DllHandle;
14856}
14857
14858FORCEINLINE
14859VOID
14860TpSetCallbackFinalizationCallback(
14861 __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
14862 __in PTP_SIMPLE_CALLBACK FinalizationCallback
14863 )
14864{
14865 CallbackEnviron->FinalizationCallback = FinalizationCallback;
14866}
14867
14868#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
14869
14870FORCEINLINE
14871VOID
14872TpSetCallbackPriority(
14873 __inout PTP_CALLBACK_ENVIRON CallbackEnviron,
14874 __in TP_CALLBACK_PRIORITY Priority
14875 )
14876{
14877 CallbackEnviron->CallbackPriority = Priority;
14878}
14879
14880#endif
14881
14882FORCEINLINE
14883VOID
14884TpSetCallbackPersistent(
14885 __inout PTP_CALLBACK_ENVIRON CallbackEnviron
14886 )
14887{
14888 CallbackEnviron->u.s.Persistent = 1;
14889}
14890
14891
14892FORCEINLINE
14893VOID
14894TpDestroyCallbackEnviron(
14895 __in PTP_CALLBACK_ENVIRON CallbackEnviron
14896 )
14897{
14898 //
14899 // For the current version of the callback environment, no actions
14900 // need to be taken to tear down an initialized structure. This
14901 // may change in a future release.
14902 //
14903
14904 UNREFERENCED_PARAMETER(CallbackEnviron);
14905}
14906
14907#endif // !defined(MIDL_PASS)
14908
14909
14910typedef struct _TP_WORK TP_WORK, *PTP_WORK;
14911
14912typedef VOID (NTAPI *PTP_WORK_CALLBACK)(
14913 __inout PTP_CALLBACK_INSTANCE Instance,
14914 __inout_opt PVOID Context,
14915 __inout PTP_WORK Work
14916 );
14917
14918typedef struct _TP_TIMER TP_TIMER, *PTP_TIMER;
14919
14920typedef VOID (NTAPI *PTP_TIMER_CALLBACK)(
14921 __inout PTP_CALLBACK_INSTANCE Instance,
14922 __inout_opt PVOID Context,
14923 __inout PTP_TIMER Timer
14924 );
14925
14926typedef DWORD TP_WAIT_RESULT;
14927
14928typedef struct _TP_WAIT TP_WAIT, *PTP_WAIT;
14929
14930typedef VOID (NTAPI *PTP_WAIT_CALLBACK)(
14931 __inout PTP_CALLBACK_INSTANCE Instance,
14932 __inout_opt PVOID Context,
14933 __inout PTP_WAIT Wait,
14934 __in TP_WAIT_RESULT WaitResult
14935 );
14936
14937typedef struct _TP_IO TP_IO, *PTP_IO;
14938
14939#if defined(_M_AMD64) && !defined(__midl)
14940
14941__forceinline
14942struct _TEB *
14943NtCurrentTeb (
14944 VOID
14945 )
14946
14947{
14948 return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB, Self));
14949}
14950
14951__forceinline
14952PVOID
14953GetCurrentFiber (
14954 VOID
14955 )
14956
14957{
14958
14959 return (PVOID)__readgsqword(FIELD_OFFSET(NT_TIB, FiberData));
14960}
14961
14962__forceinline
14963PVOID
14964GetFiberData (
14965 VOID
14966 )
14967
14968{
14969
14970 return *(PVOID *)GetCurrentFiber();
14971}
14972
14973#endif // _M_AMD64 && !defined(__midl)
14974
14975
14976#if defined(_M_IX86) && !defined(MIDL_PASS)
14977
14978#define PcTeb 0x18
14979
14980#if (_MSC_FULL_VER >= 13012035)
14981
14982__inline struct _TEB * NtCurrentTeb( void ) { return (struct _TEB *) (ULONG_PTR) __readfsdword (PcTeb); }
14983
14984#else
14985
14986#if _MSC_VER >= 1200
14987#pragma warning(push)
14988#endif
14989
14990#pragma warning (disable:4035) // disable 4035 (function must return something)
14991
14992__inline struct _TEB * NtCurrentTeb( void ) { __asm mov eax, fs:[PcTeb] }
14993
14994#if _MSC_VER >= 1200
14995#pragma warning(pop)
14996#else
14997#pragma warning (default:4035) // reenable it
14998#endif
14999
15000#endif
15001
15002#endif // defined(_M_IX86) && !defined(MIDL_PASS)
15003
15004#if (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100) || ISOLATION_AWARE_ENABLED // winnt_only
15005#define ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION (1)
15006#define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION (2)
15007#define ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION (3)
15008#define ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION (4)
15009#define ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION (5)
15010#define ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION (6)
15011#define ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION (7)
15012#define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE (8)
15013#define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES (9)
15014#define ACTIVATION_CONTEXT_SECTION_APPLICATION_SETTINGS (10)
15015#define ACTIVATION_CONTEXT_SECTION_COMPATIBILITY_INFO (11)
15016#endif // winnt_only
15017
15018#ifdef __cplusplus
15019}
15020#endif
15021
15022#if _MSC_VER >= 1200
15023#pragma warning(pop)
15024#else
15025#pragma warning(default:4201)
15026#pragma warning(default:4214)
15027#endif
15028
15029#endif /* _WINNT_ */