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