1 /*
2  * wdm.h
3  *
4  * Windows NT WDM Driver Developer Kit
5  *
6  * This file is part of the ReactOS DDK package.
7  *
8  * Contributors:
9  *   Amine Khaldi
10  *   Timo Kreuzer (timo.kreuzer@reactos.org)
11  *
12  * THIS SOFTWARE IS NOT COPYRIGHTED
13  *
14  * This source code is offered for use in the public domain. You may
15  * use, modify or distribute it freely.
16  *
17  * This code is distributed in the hope that it will be useful but
18  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
19  * DISCLAIMED. This includes but is not limited to warranties of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21  *
22  */
23 #pragma once
24 
25 #ifndef _WDMDDK_
26 #define _WDMDDK_
27 
28 #define WDM_MAJORVERSION        0x06
29 #define WDM_MINORVERSION        0x00
30 
31 /* Included via ntddk.h? */
32 #ifndef _NTDDK_
33 #define _NTDDK_
34 #define _WDM_INCLUDED_
35 #define _DDK_DRIVER_
36 #define NO_INTERLOCKED_INTRINSICS
37 #endif /* _NTDDK_ */
38 
39 /* Dependencies */
40 #define NT_INCLUDED
41 #include <excpt.h>
42 #include <ntdef.h>
43 #include <ntstatus.h>
44 #include <ntiologc.h>
45 
46 #ifndef GUID_DEFINED
47 #include <guiddef.h>
48 #endif
49 
50 #ifdef _MAC
51 #ifndef _INC_STRING
52 #include <string.h>
53 #endif /* _INC_STRING */
54 #else
55 #include <string.h>
56 #endif /* _MAC */
57 
58 #ifndef _KTMTYPES_
59 typedef GUID UOW, *PUOW;
60 #endif
61 
62 typedef GUID *PGUID;
63 
64 #if (NTDDI_VERSION >= NTDDI_WINXP)
65 #include <dpfilter.h>
66 #endif
67 
68 #include "intrin.h"
69 
70 #ifdef __cplusplus
71 extern "C" {
72 #endif
73 
74 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
75 #define NTHALAPI DECLSPEC_IMPORT
76 #else
77 #define NTHALAPI
78 #endif
79 
80 /* For ReactOS */
81 #if !defined(_NTOSKRNL_) && !defined(_BLDR_)
82 #define NTKERNELAPI DECLSPEC_IMPORT
83 #else
84 #define NTKERNELAPI
85 #endif
86 
87 #if defined(_X86_) && !defined(_NTHAL_)
88 #define _DECL_HAL_KE_IMPORT  DECLSPEC_IMPORT
89 #elif defined(_X86_)
90 #define _DECL_HAL_KE_IMPORT
91 #else
92 #define _DECL_HAL_KE_IMPORT NTKERNELAPI
93 #endif
94 
95 #if defined(_WIN64)
96 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
97 #else
98 #define POINTER_ALIGNMENT
99 #endif
100 
101 #if defined(_MSC_VER)
102 /* Disable some warnings */
103 #pragma warning(disable:4115) /* Named type definition in parentheses */
104 #pragma warning(disable:4201) /* Nameless unions and structs */
105 #pragma warning(disable:4214) /* Bit fields of other types than int */
106 #pragma warning(disable:4820) /* Padding added, due to alignemnet requirement */
107 
108 /* Indicate if #pragma alloc_text() is supported */
109 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
110 #define ALLOC_PRAGMA 1
111 #endif
112 
113 /* Indicate if #pragma data_seg() is supported */
114 #if defined(_M_IX86) || defined(_M_AMD64)
115 #define ALLOC_DATA_PRAGMA 1
116 #endif
117 
118 #endif /* _MSC_VER */
119 
120 #if defined(_WIN64)
121 #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
122 #define USE_DMA_MACROS
123 #endif
124 #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__)
125 #define NO_LEGACY_DRIVERS
126 #endif
127 #endif /* defined(_WIN64) */
128 
129 /* Forward declarations */
130 struct _IRP;
131 struct _MDL;
132 struct _KAPC;
133 struct _KDPC;
134 struct _FILE_OBJECT;
135 struct _DMA_ADAPTER;
136 struct _DEVICE_OBJECT;
137 struct _DRIVER_OBJECT;
138 struct _IO_STATUS_BLOCK;
139 struct _DEVICE_DESCRIPTION;
140 struct _SCATTER_GATHER_LIST;
141 struct _DRIVE_LAYOUT_INFORMATION;
142 struct _COMPRESSED_DATA_INFO;
143 struct _IO_RESOURCE_DESCRIPTOR;
144 
145 /* Structures not exposed to drivers */
146 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
147 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
148 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
149 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
150 typedef struct _EPROCESS *PEPROCESS;
151 typedef struct _ETHREAD *PETHREAD;
152 typedef struct _IO_TIMER *PIO_TIMER;
153 typedef struct _KINTERRUPT *PKINTERRUPT;
154 typedef struct _KPROCESS *PKPROCESS;
155 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
156 typedef struct _CONTEXT *PCONTEXT;
157 
158 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
159 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
160 #elif defined(_WDM_INCLUDED_)
161 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
162 #else
163 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
164 #endif
165 
166 #ifndef DEFINE_GUIDEX
167 #ifdef _MSC_VER
168 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
169 #else
170 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
171 #endif
172 #endif /* DEFINE_GUIDEX */
173 
174 #ifndef STATICGUIDOF
175 #define STATICGUIDOF(guid) STATIC_##guid
176 #endif
177 
178 /* GUID Comparison */
179 #ifndef __IID_ALIGNED__
180 #define __IID_ALIGNED__
181 #ifdef __cplusplus
IsEqualGUIDAligned(REFGUID guid1,REFGUID guid2)182 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
183 {
184     return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) &&
185              (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
186 }
187 #else
188 #define IsEqualGUIDAligned(guid1, guid2) \
189            ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
190              (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
191 #endif /* __cplusplus */
192 #endif /* !__IID_ALIGNED__ */
193 
194 
195 /******************************************************************************
196  *                           INTERLOCKED Functions                            *
197  ******************************************************************************/
198 //
199 // Intrinsics (note: taken from our winnt.h)
200 // FIXME: 64-bit
201 //
202 #if defined(__GNUC__)
203 
204 static __inline__ BOOLEAN
InterlockedBitTestAndSet(IN LONG volatile * Base,IN LONG Bit)205 InterlockedBitTestAndSet(
206   IN LONG volatile *Base,
207   IN LONG Bit)
208 {
209 #if defined(_M_IX86)
210   LONG OldBit;
211   __asm__ __volatile__("lock "
212                        "btsl %2,%1\n\t"
213                        "sbbl %0,%0\n\t"
214                        :"=r" (OldBit),"+m" (*Base)
215                        :"Ir" (Bit)
216                        : "memory");
217   return OldBit;
218 #else
219   return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
220 #endif
221 }
222 
223 static __inline__ BOOLEAN
InterlockedBitTestAndReset(IN LONG volatile * Base,IN LONG Bit)224 InterlockedBitTestAndReset(
225   IN LONG volatile *Base,
226   IN LONG Bit)
227 {
228 #if defined(_M_IX86)
229   LONG OldBit;
230   __asm__ __volatile__("lock "
231                        "btrl %2,%1\n\t"
232                        "sbbl %0,%0\n\t"
233                        :"=r" (OldBit),"+m" (*Base)
234                        :"Ir" (Bit)
235                        : "memory");
236   return OldBit;
237 #else
238   return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
239 #endif
240 }
241 
242 #endif /* defined(__GNUC__) */
243 
244 #define BitScanForward _BitScanForward
245 #define BitScanReverse _BitScanReverse
246 #define BitTest _bittest
247 #define BitTestAndComplement _bittestandcomplement
248 #define BitTestAndSet _bittestandset
249 #define BitTestAndReset _bittestandreset
250 #define InterlockedBitTestAndSet _interlockedbittestandset
251 #define InterlockedBitTestAndReset _interlockedbittestandreset
252 
253 #ifdef _M_AMD64
254 #define BitTest64 _bittest64
255 #define BitTestAndComplement64 _bittestandcomplement64
256 #define BitTestAndSet64 _bittestandset64
257 #define BitTestAndReset64 _bittestandreset64
258 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
259 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
260 #endif
261 
262 #if !defined(__INTERLOCKED_DECLARED)
263 #define __INTERLOCKED_DECLARED
264 
265 #if defined (_X86_)
266 #if defined(NO_INTERLOCKED_INTRINSICS)
267 NTKERNELAPI
268 LONG
269 FASTCALL
270 InterlockedIncrement(
271   IN OUT LONG volatile *Addend);
272 
273 NTKERNELAPI
274 LONG
275 FASTCALL
276 InterlockedDecrement(
277   IN OUT LONG volatile *Addend);
278 
279 NTKERNELAPI
280 LONG
281 FASTCALL
282 InterlockedCompareExchange(
283   IN OUT LONG volatile *Destination,
284   IN LONG Exchange,
285   IN LONG Comparand);
286 
287 NTKERNELAPI
288 LONG
289 FASTCALL
290 InterlockedExchange(
291   IN OUT LONG volatile *Destination,
292   IN LONG Value);
293 
294 NTKERNELAPI
295 LONG
296 FASTCALL
297 InterlockedExchangeAdd(
298   IN OUT LONG volatile *Addend,
299   IN LONG  Value);
300 
301 #else /* !defined(NO_INTERLOCKED_INTRINSICS) */
302 
303 #define InterlockedExchange _InterlockedExchange
304 #define InterlockedIncrement _InterlockedIncrement
305 #define InterlockedDecrement _InterlockedDecrement
306 #define InterlockedExchangeAdd _InterlockedExchangeAdd
307 #define InterlockedCompareExchange _InterlockedCompareExchange
308 #define InterlockedOr _InterlockedOr
309 #define InterlockedAnd _InterlockedAnd
310 #define InterlockedXor _InterlockedXor
311 
312 #endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
313 
314 #endif /* defined (_X86_) */
315 
316 #if !defined (_WIN64)
317 /*
318  * PVOID
319  * InterlockedExchangePointer(
320  *   IN OUT PVOID volatile  *Target,
321  *   IN PVOID  Value)
322  */
323 #define InterlockedExchangePointer(Target, Value) \
324   ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
325 
326 /*
327  * PVOID
328  * InterlockedCompareExchangePointer(
329  *   IN OUT PVOID  *Destination,
330  *   IN PVOID  Exchange,
331  *   IN PVOID  Comparand)
332  */
333 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
334   ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
335 
336 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
337 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
338 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
339 
340 #endif // !defined (_WIN64)
341 
342 #if defined (_M_AMD64)
343 
344 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
345 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
346 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
347 #define InterlockedAnd _InterlockedAnd
348 #define InterlockedOr _InterlockedOr
349 #define InterlockedXor _InterlockedXor
350 #define InterlockedIncrement _InterlockedIncrement
351 #define InterlockedDecrement _InterlockedDecrement
352 #define InterlockedAdd _InterlockedAdd
353 #define InterlockedExchange _InterlockedExchange
354 #define InterlockedExchangeAdd _InterlockedExchangeAdd
355 #define InterlockedCompareExchange _InterlockedCompareExchange
356 #define InterlockedAnd64 _InterlockedAnd64
357 #define InterlockedOr64 _InterlockedOr64
358 #define InterlockedXor64 _InterlockedXor64
359 #define InterlockedIncrement64 _InterlockedIncrement64
360 #define InterlockedDecrement64 _InterlockedDecrement64
361 #define InterlockedAdd64 _InterlockedAdd64
362 #define InterlockedExchange64 _InterlockedExchange64
363 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
364 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
365 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
366 #define InterlockedExchangePointer _InterlockedExchangePointer
367 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
368 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
369 
370 #endif // _M_AMD64
371 
372 #endif /* !__INTERLOCKED_DECLARED */
373 
374 
375 /******************************************************************************
376  *                           Runtime Library Types                            *
377  ******************************************************************************/
378 
379 #define RTL_REGISTRY_ABSOLUTE             0
380 #define RTL_REGISTRY_SERVICES             1
381 #define RTL_REGISTRY_CONTROL              2
382 #define RTL_REGISTRY_WINDOWS_NT           3
383 #define RTL_REGISTRY_DEVICEMAP            4
384 #define RTL_REGISTRY_USER                 5
385 #define RTL_REGISTRY_MAXIMUM              6
386 #define RTL_REGISTRY_HANDLE               0x40000000
387 #define RTL_REGISTRY_OPTIONAL             0x80000000
388 
389 /* RTL_QUERY_REGISTRY_TABLE.Flags */
390 #define RTL_QUERY_REGISTRY_SUBKEY         0x00000001
391 #define RTL_QUERY_REGISTRY_TOPKEY         0x00000002
392 #define RTL_QUERY_REGISTRY_REQUIRED       0x00000004
393 #define RTL_QUERY_REGISTRY_NOVALUE        0x00000008
394 #define RTL_QUERY_REGISTRY_NOEXPAND       0x00000010
395 #define RTL_QUERY_REGISTRY_DIRECT         0x00000020
396 #define RTL_QUERY_REGISTRY_DELETE         0x00000040
397 
398 #define HASH_STRING_ALGORITHM_DEFAULT     0
399 #define HASH_STRING_ALGORITHM_X65599      1
400 #define HASH_STRING_ALGORITHM_INVALID     0xffffffff
401 
402 typedef struct _RTL_BITMAP {
403   ULONG SizeOfBitMap;
404   PULONG Buffer;
405 } RTL_BITMAP, *PRTL_BITMAP;
406 
407 typedef struct _RTL_BITMAP_RUN {
408   ULONG StartingIndex;
409   ULONG NumberOfBits;
410 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
411 
412 typedef NTSTATUS
413 (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
414   IN PWSTR ValueName,
415   IN ULONG ValueType,
416   IN PVOID ValueData,
417   IN ULONG ValueLength,
418   IN PVOID Context,
419   IN PVOID EntryContext);
420 
421 typedef struct _RTL_QUERY_REGISTRY_TABLE {
422   PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
423   ULONG Flags;
424   PCWSTR Name;
425   PVOID EntryContext;
426   ULONG DefaultType;
427   PVOID DefaultData;
428   ULONG DefaultLength;
429 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
430 
431 typedef struct _TIME_FIELDS {
432   CSHORT Year;
433   CSHORT Month;
434   CSHORT Day;
435   CSHORT Hour;
436   CSHORT Minute;
437   CSHORT Second;
438   CSHORT Milliseconds;
439   CSHORT Weekday;
440 } TIME_FIELDS, *PTIME_FIELDS;
441 
442 /* Slist Header */
443 #ifndef _SLIST_HEADER_
444 #define _SLIST_HEADER_
445 
446 #if defined(_WIN64)
447 
448 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
449   struct _SLIST_ENTRY *Next;
450 } SLIST_ENTRY, *PSLIST_ENTRY;
451 
452 typedef struct _SLIST_ENTRY32 {
453   ULONG Next;
454 } SLIST_ENTRY32, *PSLIST_ENTRY32;
455 
456 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
457   _ANONYMOUS_STRUCT struct {
458     ULONGLONG Alignment;
459     ULONGLONG Region;
460   } DUMMYSTRUCTNAME;
461   struct {
462     ULONGLONG Depth:16;
463     ULONGLONG Sequence:9;
464     ULONGLONG NextEntry:39;
465     ULONGLONG HeaderType:1;
466     ULONGLONG Init:1;
467     ULONGLONG Reserved:59;
468     ULONGLONG Region:3;
469   } Header8;
470   struct {
471     ULONGLONG Depth:16;
472     ULONGLONG Sequence:48;
473     ULONGLONG HeaderType:1;
474     ULONGLONG Init:1;
475     ULONGLONG Reserved:2;
476     ULONGLONG NextEntry:60;
477   } Header16;
478   struct {
479     ULONGLONG Depth:16;
480     ULONGLONG Sequence:48;
481     ULONGLONG HeaderType:1;
482     ULONGLONG Reserved:3;
483     ULONGLONG NextEntry:60;
484   } HeaderX64;
485 } SLIST_HEADER, *PSLIST_HEADER;
486 
487 typedef union _SLIST_HEADER32 {
488   ULONGLONG Alignment;
489   _ANONYMOUS_STRUCT struct {
490     SLIST_ENTRY32 Next;
491     USHORT Depth;
492     USHORT Sequence;
493   } DUMMYSTRUCTNAME;
494 } SLIST_HEADER32, *PSLIST_HEADER32;
495 
496 #else
497 
498 #define SLIST_ENTRY SINGLE_LIST_ENTRY
499 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
500 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
501 
502 typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
503 
504 typedef union _SLIST_HEADER {
505   ULONGLONG Alignment;
506   _ANONYMOUS_STRUCT struct {
507     SLIST_ENTRY Next;
508     USHORT Depth;
509     USHORT Sequence;
510   } DUMMYSTRUCTNAME;
511 } SLIST_HEADER, *PSLIST_HEADER;
512 
513 typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
514 
515 #endif /* defined(_WIN64) */
516 
517 #endif /* _SLIST_HEADER_ */
518 
519 /* MS definition is broken! */
520 extern BOOLEAN NTSYSAPI NlsMbCodePageTag;
521 extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag;
522 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
523 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
524 
525 #define SHORT_LEAST_SIGNIFICANT_BIT       0
526 #define SHORT_MOST_SIGNIFICANT_BIT        1
527 
528 #define LONG_LEAST_SIGNIFICANT_BIT        0
529 #define LONG_3RD_MOST_SIGNIFICANT_BIT     1
530 #define LONG_2ND_MOST_SIGNIFICANT_BIT     2
531 #define LONG_MOST_SIGNIFICANT_BIT         3
532 
533 #define RTLVERLIB_DDI(x) Wdmlib##x
534 
535 typedef BOOLEAN
536 (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)(
537   IN ULONG Version);
538 
539 typedef BOOLEAN
540 (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)(
541   IN ULONG Version);
542 
543 /******************************************************************************
544  *                              Kernel Types                                  *
545  ******************************************************************************/
546 
547 typedef UCHAR KIRQL, *PKIRQL;
548 typedef CCHAR KPROCESSOR_MODE;
549 typedef LONG KPRIORITY;
550 
551 typedef enum _MODE {
552   KernelMode,
553   UserMode,
554   MaximumMode
555 } MODE;
556 
557 #define CACHE_FULLY_ASSOCIATIVE 0xFF
558 #define MAXIMUM_SUSPEND_COUNT   MAXCHAR
559 
560 #define EVENT_QUERY_STATE (0x0001)
561 #define EVENT_MODIFY_STATE (0x0002)
562 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
563 
564 #define LTP_PC_SMT 0x1
565 
566 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
567 #define SINGLE_GROUP_LEGACY_API        1
568 #endif
569 
570 #define SEMAPHORE_QUERY_STATE (0x0001)
571 #define SEMAPHORE_MODIFY_STATE (0x0002)
572 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
573 
574 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
575   RelationProcessorCore,
576   RelationNumaNode,
577   RelationCache,
578   RelationProcessorPackage,
579   RelationGroup,
580   RelationAll = 0xffff
581 } LOGICAL_PROCESSOR_RELATIONSHIP;
582 
583 typedef enum _PROCESSOR_CACHE_TYPE {
584   CacheUnified,
585   CacheInstruction,
586   CacheData,
587   CacheTrace
588 } PROCESSOR_CACHE_TYPE;
589 
590 typedef struct _CACHE_DESCRIPTOR {
591   UCHAR Level;
592   UCHAR Associativity;
593   USHORT LineSize;
594   ULONG Size;
595   PROCESSOR_CACHE_TYPE Type;
596 } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
597 
598 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
599   ULONG_PTR ProcessorMask;
600   LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
601   _ANONYMOUS_UNION union {
602     struct {
603       UCHAR Flags;
604     } ProcessorCore;
605     struct {
606       ULONG NodeNumber;
607     } NumaNode;
608     CACHE_DESCRIPTOR Cache;
609     ULONGLONG Reserved[2];
610   } DUMMYUNIONNAME;
611 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
612 
613 typedef struct _PROCESSOR_RELATIONSHIP {
614   UCHAR Flags;
615   UCHAR Reserved[21];
616   USHORT GroupCount;
617   GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
618 } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
619 
620 typedef struct _NUMA_NODE_RELATIONSHIP {
621   ULONG NodeNumber;
622   UCHAR Reserved[20];
623   GROUP_AFFINITY GroupMask;
624 } NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP;
625 
626 typedef struct _CACHE_RELATIONSHIP {
627   UCHAR Level;
628   UCHAR Associativity;
629   USHORT LineSize;
630   ULONG CacheSize;
631   PROCESSOR_CACHE_TYPE Type;
632   UCHAR Reserved[20];
633   GROUP_AFFINITY GroupMask;
634 } CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP;
635 
636 typedef struct _PROCESSOR_GROUP_INFO {
637   UCHAR MaximumProcessorCount;
638   UCHAR ActiveProcessorCount;
639   UCHAR Reserved[38];
640   KAFFINITY ActiveProcessorMask;
641 } PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO;
642 
643 typedef struct _GROUP_RELATIONSHIP {
644   USHORT MaximumGroupCount;
645   USHORT ActiveGroupCount;
646   UCHAR Reserved[20];
647   PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY];
648 } GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP;
649 
650 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
651   LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
652   ULONG Size;
653   _ANONYMOUS_UNION union {
654     PROCESSOR_RELATIONSHIP Processor;
655     NUMA_NODE_RELATIONSHIP NumaNode;
656     CACHE_RELATIONSHIP Cache;
657     GROUP_RELATIONSHIP Group;
658   } DUMMYUNIONNAME;
659 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;
660 
661 /* Processor features */
662 #define PF_FLOATING_POINT_PRECISION_ERRATA  0
663 #define PF_FLOATING_POINT_EMULATED          1
664 #define PF_COMPARE_EXCHANGE_DOUBLE          2
665 #define PF_MMX_INSTRUCTIONS_AVAILABLE       3
666 #define PF_PPC_MOVEMEM_64BIT_OK             4
667 #define PF_ALPHA_BYTE_INSTRUCTIONS          5
668 #define PF_XMMI_INSTRUCTIONS_AVAILABLE      6
669 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE     7
670 #define PF_RDTSC_INSTRUCTION_AVAILABLE      8
671 #define PF_PAE_ENABLED                      9
672 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE   10
673 #define PF_SSE_DAZ_MODE_AVAILABLE          11
674 #define PF_NX_ENABLED                      12
675 #define PF_SSE3_INSTRUCTIONS_AVAILABLE     13
676 #define PF_COMPARE_EXCHANGE128             14
677 #define PF_COMPARE64_EXCHANGE128           15
678 #define PF_CHANNELS_ENABLED                16
679 #define PF_XSAVE_ENABLED                   17
680 
681 #define MAXIMUM_WAIT_OBJECTS              64
682 
683 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
684 
685 #define ASSERT_DPC(Object) \
686     ASSERT(((Object)->Type == 0) || \
687            ((Object)->Type == DpcObject) || \
688            ((Object)->Type == ThreadedDpcObject))
689 
690 #define ASSERT_GATE(object) \
691     NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
692               (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
693 
694 #define ASSERT_DEVICE_QUEUE(Object) \
695     NT_ASSERT((Object)->Type == DeviceQueueObject)
696 
697 #define ASSERT_TIMER(E) \
698     NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
699               ((E)->Header.Type == TimerSynchronizationObject))
700 
701 #define ASSERT_MUTANT(E) \
702     NT_ASSERT((E)->Header.Type == MutantObject)
703 
704 #define ASSERT_SEMAPHORE(E) \
705     NT_ASSERT((E)->Header.Type == SemaphoreObject)
706 
707 #define ASSERT_EVENT(E) \
708     NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
709               ((E)->Header.Type == SynchronizationEvent))
710 
711 #define DPC_NORMAL 0
712 #define DPC_THREADED 1
713 
714 #define GM_LOCK_BIT          0x1
715 #define GM_LOCK_BIT_V        0x0
716 #define GM_LOCK_WAITER_WOKEN 0x2
717 #define GM_LOCK_WAITER_INC   0x4
718 
719 #define LOCK_QUEUE_WAIT_BIT               0
720 #define LOCK_QUEUE_OWNER_BIT              1
721 
722 #define LOCK_QUEUE_WAIT                   1
723 #define LOCK_QUEUE_OWNER                  2
724 #define LOCK_QUEUE_TIMER_LOCK_SHIFT       4
725 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
726 
727 #define PROCESSOR_FEATURE_MAX 64
728 
729 #define DBG_STATUS_CONTROL_C              1
730 #define DBG_STATUS_SYSRQ                  2
731 #define DBG_STATUS_BUGCHECK_FIRST         3
732 #define DBG_STATUS_BUGCHECK_SECOND        4
733 #define DBG_STATUS_FATAL                  5
734 #define DBG_STATUS_DEBUG_CONTROL          6
735 #define DBG_STATUS_WORKER                 7
736 
737 #if defined(_WIN64)
738 #define MAXIMUM_PROC_PER_GROUP 64
739 #else
740 #define MAXIMUM_PROC_PER_GROUP 32
741 #endif
742 #define MAXIMUM_PROCESSORS          MAXIMUM_PROC_PER_GROUP
743 
744 /* Exception Records */
745 #define EXCEPTION_NONCONTINUABLE     1
746 #define EXCEPTION_MAXIMUM_PARAMETERS 15
747 
748 #define EXCEPTION_DIVIDED_BY_ZERO       0
749 #define EXCEPTION_DEBUG                 1
750 #define EXCEPTION_NMI                   2
751 #define EXCEPTION_INT3                  3
752 #define EXCEPTION_BOUND_CHECK           5
753 #define EXCEPTION_INVALID_OPCODE        6
754 #define EXCEPTION_NPX_NOT_AVAILABLE     7
755 #define EXCEPTION_DOUBLE_FAULT          8
756 #define EXCEPTION_NPX_OVERRUN           9
757 #define EXCEPTION_INVALID_TSS           0x0A
758 #define EXCEPTION_SEGMENT_NOT_PRESENT   0x0B
759 #define EXCEPTION_STACK_FAULT           0x0C
760 #define EXCEPTION_GP_FAULT              0x0D
761 #define EXCEPTION_RESERVED_TRAP         0x0F
762 #define EXCEPTION_NPX_ERROR             0x010
763 #define EXCEPTION_ALIGNMENT_CHECK       0x011
764 
765 typedef struct _EXCEPTION_RECORD {
766   NTSTATUS ExceptionCode;
767   ULONG ExceptionFlags;
768   struct _EXCEPTION_RECORD *ExceptionRecord;
769   PVOID ExceptionAddress;
770   ULONG NumberParameters;
771   ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
772 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
773 
774 typedef struct _EXCEPTION_RECORD32 {
775   NTSTATUS ExceptionCode;
776   ULONG ExceptionFlags;
777   ULONG ExceptionRecord;
778   ULONG ExceptionAddress;
779   ULONG NumberParameters;
780   ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
781 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
782 
783 typedef struct _EXCEPTION_RECORD64 {
784   NTSTATUS ExceptionCode;
785   ULONG ExceptionFlags;
786   ULONG64 ExceptionRecord;
787   ULONG64 ExceptionAddress;
788   ULONG NumberParameters;
789   ULONG __unusedAlignment;
790   ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
791 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
792 
793 typedef struct _EXCEPTION_POINTERS {
794   PEXCEPTION_RECORD ExceptionRecord;
795   PCONTEXT ContextRecord;
796 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
797 
798 typedef enum _KBUGCHECK_CALLBACK_REASON {
799   KbCallbackInvalid,
800   KbCallbackReserved1,
801   KbCallbackSecondaryDumpData,
802   KbCallbackDumpIo,
803   KbCallbackAddPages
804 } KBUGCHECK_CALLBACK_REASON;
805 
806 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
807 
808 typedef VOID
809 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)(
810   IN KBUGCHECK_CALLBACK_REASON Reason,
811   IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
812   IN OUT PVOID ReasonSpecificData,
813   IN ULONG ReasonSpecificDataLength);
814 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE;
815 
816 typedef struct _KBUGCHECK_ADD_PAGES {
817   IN OUT PVOID Context;
818   IN OUT ULONG Flags;
819   IN ULONG BugCheckCode;
820   OUT ULONG_PTR Address;
821   OUT ULONG_PTR Count;
822 } KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES;
823 
824 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA {
825   IN PVOID InBuffer;
826   IN ULONG InBufferLength;
827   IN ULONG MaximumAllowed;
828   OUT GUID Guid;
829   OUT PVOID OutBuffer;
830   OUT ULONG OutBufferLength;
831 } KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA;
832 
833 typedef enum _KBUGCHECK_DUMP_IO_TYPE {
834   KbDumpIoInvalid,
835   KbDumpIoHeader,
836   KbDumpIoBody,
837   KbDumpIoSecondaryData,
838   KbDumpIoComplete
839 } KBUGCHECK_DUMP_IO_TYPE;
840 
841 typedef struct _KBUGCHECK_DUMP_IO {
842   IN ULONG64 Offset;
843   IN PVOID Buffer;
844   IN ULONG BufferLength;
845   IN KBUGCHECK_DUMP_IO_TYPE Type;
846 } KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO;
847 
848 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS         0x00000001UL
849 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS        0x00000002UL
850 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
851 
852 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
853   LIST_ENTRY Entry;
854   PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
855   PUCHAR Component;
856   ULONG_PTR Checksum;
857   KBUGCHECK_CALLBACK_REASON Reason;
858   UCHAR State;
859 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
860 
861 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
862   BufferEmpty,
863   BufferInserted,
864   BufferStarted,
865   BufferFinished,
866   BufferIncomplete
867 } KBUGCHECK_BUFFER_DUMP_STATE;
868 
869 typedef VOID
870 (NTAPI KBUGCHECK_CALLBACK_ROUTINE)(
871   IN PVOID Buffer,
872   IN ULONG Length);
873 typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE;
874 
875 typedef struct _KBUGCHECK_CALLBACK_RECORD {
876   LIST_ENTRY Entry;
877   PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
878   PVOID Buffer;
879   ULONG Length;
880   PUCHAR Component;
881   ULONG_PTR Checksum;
882   UCHAR State;
883 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
884 
885 typedef BOOLEAN
886 (NTAPI NMI_CALLBACK)(
887   IN PVOID Context,
888   IN BOOLEAN Handled);
889 typedef NMI_CALLBACK *PNMI_CALLBACK;
890 
891 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE {
892   KeProcessorAddStartNotify = 0,
893   KeProcessorAddCompleteNotify,
894   KeProcessorAddFailureNotify
895 } KE_PROCESSOR_CHANGE_NOTIFY_STATE;
896 
897 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT {
898   KE_PROCESSOR_CHANGE_NOTIFY_STATE State;
899   ULONG NtNumber;
900   NTSTATUS Status;
901 #if (NTDDI_VERSION >= NTDDI_WIN7)
902   PROCESSOR_NUMBER ProcNumber;
903 #endif
904 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT;
905 
906 typedef VOID
907 (NTAPI PROCESSOR_CALLBACK_FUNCTION)(
908   IN PVOID CallbackContext,
909   IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
910   IN OUT PNTSTATUS OperationStatus);
911 typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION;
912 
913 #define KE_PROCESSOR_CHANGE_ADD_EXISTING         1
914 
915 #define INVALID_PROCESSOR_INDEX     0xffffffff
916 
917 typedef enum _KINTERRUPT_POLARITY {
918   InterruptPolarityUnknown,
919   InterruptActiveHigh,
920   InterruptActiveLow
921 } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
922 
923 typedef enum _KPROFILE_SOURCE {
924   ProfileTime,
925   ProfileAlignmentFixup,
926   ProfileTotalIssues,
927   ProfilePipelineDry,
928   ProfileLoadInstructions,
929   ProfilePipelineFrozen,
930   ProfileBranchInstructions,
931   ProfileTotalNonissues,
932   ProfileDcacheMisses,
933   ProfileIcacheMisses,
934   ProfileCacheMisses,
935   ProfileBranchMispredictions,
936   ProfileStoreInstructions,
937   ProfileFpInstructions,
938   ProfileIntegerInstructions,
939   Profile2Issue,
940   Profile3Issue,
941   Profile4Issue,
942   ProfileSpecialInstructions,
943   ProfileTotalCycles,
944   ProfileIcacheIssues,
945   ProfileDcacheAccesses,
946   ProfileMemoryBarrierCycles,
947   ProfileLoadLinkedIssues,
948   ProfileMaximum
949 } KPROFILE_SOURCE;
950 
951 typedef enum _KWAIT_REASON {
952   Executive,
953   FreePage,
954   PageIn,
955   PoolAllocation,
956   DelayExecution,
957   Suspended,
958   UserRequest,
959   WrExecutive,
960   WrFreePage,
961   WrPageIn,
962   WrPoolAllocation,
963   WrDelayExecution,
964   WrSuspended,
965   WrUserRequest,
966   WrEventPair,
967   WrQueue,
968   WrLpcReceive,
969   WrLpcReply,
970   WrVirtualMemory,
971   WrPageOut,
972   WrRendezvous,
973   WrKeyedEvent,
974   WrTerminated,
975   WrProcessInSwap,
976   WrCpuRateControl,
977   WrCalloutStack,
978   WrKernel,
979   WrResource,
980   WrPushLock,
981   WrMutex,
982   WrQuantumEnd,
983   WrDispatchInt,
984   WrPreempted,
985   WrYieldExecution,
986   WrFastMutex,
987   WrGuardedMutex,
988   WrRundown,
989   MaximumWaitReason
990 } KWAIT_REASON;
991 
992 typedef struct _KWAIT_BLOCK {
993   LIST_ENTRY WaitListEntry;
994   struct _KTHREAD *Thread;
995   PVOID Object;
996   struct _KWAIT_BLOCK *NextWaitBlock;
997   USHORT WaitKey;
998   UCHAR WaitType;
999   volatile UCHAR BlockState;
1000 #if defined(_WIN64)
1001   LONG SpareLong;
1002 #endif
1003 } KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
1004 
1005 typedef enum _KINTERRUPT_MODE {
1006   LevelSensitive,
1007   Latched
1008 } KINTERRUPT_MODE;
1009 
1010 #define THREAD_WAIT_OBJECTS 3
1011 
1012 typedef VOID
1013 (NTAPI KSTART_ROUTINE)(
1014   IN PVOID StartContext);
1015 typedef KSTART_ROUTINE *PKSTART_ROUTINE;
1016 
1017 typedef VOID
1018 (NTAPI *PKINTERRUPT_ROUTINE)(
1019   VOID);
1020 
1021 typedef BOOLEAN
1022 (NTAPI KSERVICE_ROUTINE)(
1023   IN struct _KINTERRUPT *Interrupt,
1024   IN PVOID ServiceContext);
1025 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
1026 
1027 typedef BOOLEAN
1028 (NTAPI KMESSAGE_SERVICE_ROUTINE)(
1029   IN struct _KINTERRUPT *Interrupt,
1030   IN PVOID ServiceContext,
1031   IN ULONG MessageID);
1032 typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE;
1033 
1034 typedef enum _KD_OPTION {
1035   KD_OPTION_SET_BLOCK_ENABLE,
1036 } KD_OPTION;
1037 
1038 typedef VOID
1039 (NTAPI *PKNORMAL_ROUTINE)(
1040   IN PVOID NormalContext OPTIONAL,
1041   IN PVOID SystemArgument1 OPTIONAL,
1042   IN PVOID SystemArgument2 OPTIONAL);
1043 
1044 typedef VOID
1045 (NTAPI *PKRUNDOWN_ROUTINE)(
1046   IN struct _KAPC *Apc);
1047 
1048 typedef VOID
1049 (NTAPI *PKKERNEL_ROUTINE)(
1050   IN struct _KAPC *Apc,
1051   IN OUT PKNORMAL_ROUTINE *NormalRoutine OPTIONAL,
1052   IN OUT PVOID *NormalContext OPTIONAL,
1053   IN OUT PVOID *SystemArgument1 OPTIONAL,
1054   IN OUT PVOID *SystemArgument2 OPTIONAL);
1055 
1056 typedef struct _KAPC {
1057   UCHAR Type;
1058   UCHAR SpareByte0;
1059   UCHAR Size;
1060   UCHAR SpareByte1;
1061   ULONG SpareLong0;
1062   struct _KTHREAD *Thread;
1063   LIST_ENTRY ApcListEntry;
1064   PKKERNEL_ROUTINE KernelRoutine;
1065   PKRUNDOWN_ROUTINE RundownRoutine;
1066   PKNORMAL_ROUTINE NormalRoutine;
1067   PVOID NormalContext;
1068   PVOID SystemArgument1;
1069   PVOID SystemArgument2;
1070   CCHAR ApcStateIndex;
1071   KPROCESSOR_MODE ApcMode;
1072   BOOLEAN Inserted;
1073 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
1074 
1075 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
1076 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
1077 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
1078 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
1079 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
1080 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
1081 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
1082 
1083 typedef struct _KDEVICE_QUEUE_ENTRY {
1084   LIST_ENTRY DeviceListEntry;
1085   ULONG SortKey;
1086   BOOLEAN Inserted;
1087 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
1088 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
1089 
1090 typedef PVOID PKIPI_CONTEXT;
1091 
1092 typedef VOID
1093 (NTAPI *PKIPI_WORKER)(
1094   IN OUT PKIPI_CONTEXT PacketContext,
1095   IN PVOID Parameter1 OPTIONAL,
1096   IN PVOID Parameter2 OPTIONAL,
1097   IN PVOID Parameter3 OPTIONAL);
1098 
1099 typedef struct _KIPI_COUNTS {
1100   ULONG Freeze;
1101   ULONG Packet;
1102   ULONG DPC;
1103   ULONG APC;
1104   ULONG FlushSingleTb;
1105   ULONG FlushMultipleTb;
1106   ULONG FlushEntireTb;
1107   ULONG GenericCall;
1108   ULONG ChangeColor;
1109   ULONG SweepDcache;
1110   ULONG SweepIcache;
1111   ULONG SweepIcacheRange;
1112   ULONG FlushIoBuffers;
1113   ULONG GratuitousDPC;
1114 } KIPI_COUNTS, *PKIPI_COUNTS;
1115 
1116 typedef ULONG_PTR
1117 (NTAPI KIPI_BROADCAST_WORKER)(
1118   IN ULONG_PTR Argument);
1119 typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER;
1120 
1121 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
1122 
1123 typedef struct _KSPIN_LOCK_QUEUE {
1124   struct _KSPIN_LOCK_QUEUE *volatile Next;
1125   PKSPIN_LOCK volatile Lock;
1126 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
1127 
1128 typedef struct _KLOCK_QUEUE_HANDLE {
1129   KSPIN_LOCK_QUEUE LockQueue;
1130   KIRQL OldIrql;
1131 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
1132 
1133 #if defined(_AMD64_)
1134 
1135 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
1136 
1137 #define LockQueueDispatcherLock 0
1138 #define LockQueueExpansionLock 1
1139 #define LockQueuePfnLock 2
1140 #define LockQueueSystemSpaceLock 3
1141 #define LockQueueVacbLock 4
1142 #define LockQueueMasterLock 5
1143 #define LockQueueNonPagedPoolLock 6
1144 #define LockQueueIoCancelLock 7
1145 #define LockQueueWorkQueueLock 8
1146 #define LockQueueIoVpbLock 9
1147 #define LockQueueIoDatabaseLock 10
1148 #define LockQueueIoCompletionLock 11
1149 #define LockQueueNtfsStructLock 12
1150 #define LockQueueAfdWorkQueueLock 13
1151 #define LockQueueBcbLock 14
1152 #define LockQueueMmNonPagedPoolLock 15
1153 #define LockQueueUnusedSpare16 16
1154 #define LockQueueTimerTableLock 17
1155 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
1156 
1157 #else
1158 
1159 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
1160   LockQueueDispatcherLock,
1161   LockQueueExpansionLock,
1162   LockQueuePfnLock,
1163   LockQueueSystemSpaceLock,
1164   LockQueueVacbLock,
1165   LockQueueMasterLock,
1166   LockQueueNonPagedPoolLock,
1167   LockQueueIoCancelLock,
1168   LockQueueWorkQueueLock,
1169   LockQueueIoVpbLock,
1170   LockQueueIoDatabaseLock,
1171   LockQueueIoCompletionLock,
1172   LockQueueNtfsStructLock,
1173   LockQueueAfdWorkQueueLock,
1174   LockQueueBcbLock,
1175   LockQueueMmNonPagedPoolLock,
1176   LockQueueUnusedSpare16,
1177   LockQueueTimerTableLock,
1178   LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
1179 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
1180 
1181 #endif /* defined(_AMD64_) */
1182 
1183 typedef VOID
1184 (NTAPI KDEFERRED_ROUTINE)(
1185   IN struct _KDPC *Dpc,
1186   IN PVOID DeferredContext OPTIONAL,
1187   IN PVOID SystemArgument1 OPTIONAL,
1188   IN PVOID SystemArgument2 OPTIONAL);
1189 typedef KDEFERRED_ROUTINE *PKDEFERRED_ROUTINE;
1190 
1191 typedef enum _KDPC_IMPORTANCE {
1192   LowImportance,
1193   MediumImportance,
1194   HighImportance,
1195   MediumHighImportance
1196 } KDPC_IMPORTANCE;
1197 
1198 typedef struct _KDPC {
1199   UCHAR Type;
1200   UCHAR Importance;
1201   volatile USHORT Number;
1202   LIST_ENTRY DpcListEntry;
1203   PKDEFERRED_ROUTINE DeferredRoutine;
1204   PVOID DeferredContext;
1205   PVOID SystemArgument1;
1206   PVOID SystemArgument2;
1207   volatile PVOID DpcData;
1208 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
1209 
1210 typedef struct _KDPC_WATCHDOG_INFORMATION {
1211   ULONG DpcTimeLimit;
1212   ULONG DpcTimeCount;
1213   ULONG DpcWatchdogLimit;
1214   ULONG DpcWatchdogCount;
1215   ULONG Reserved;
1216 } KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION;
1217 
1218 typedef struct _KDEVICE_QUEUE {
1219   CSHORT Type;
1220   CSHORT Size;
1221   LIST_ENTRY DeviceListHead;
1222   KSPIN_LOCK Lock;
1223 # if defined(_AMD64_)
1224   _ANONYMOUS_UNION union {
1225     BOOLEAN Busy;
1226     _ANONYMOUS_STRUCT struct {
1227       LONG64 Reserved:8;
1228       LONG64 Hint:56;
1229     } DUMMYSTRUCTNAME;
1230   } DUMMYUNIONNAME;
1231 # else
1232   BOOLEAN Busy;
1233 # endif
1234 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
1235 
1236 #define TIMER_EXPIRED_INDEX_BITS        6
1237 #define TIMER_PROCESSOR_INDEX_BITS      5
1238 
1239 typedef struct _DISPATCHER_HEADER {
1240   _ANONYMOUS_UNION union {
1241     _ANONYMOUS_STRUCT struct {
1242       UCHAR Type;
1243       _ANONYMOUS_UNION union {
1244         _ANONYMOUS_UNION union {
1245           UCHAR TimerControlFlags;
1246           _ANONYMOUS_STRUCT struct {
1247             UCHAR Absolute:1;
1248             UCHAR Coalescable:1;
1249             UCHAR KeepShifting:1;
1250             UCHAR EncodedTolerableDelay:5;
1251           } DUMMYSTRUCTNAME;
1252         } DUMMYUNIONNAME;
1253         UCHAR Abandoned;
1254 #if (NTDDI_VERSION < NTDDI_WIN7)
1255         UCHAR NpxIrql;
1256 #endif
1257         BOOLEAN Signalling;
1258       } DUMMYUNIONNAME;
1259       _ANONYMOUS_UNION union {
1260         _ANONYMOUS_UNION union {
1261           UCHAR ThreadControlFlags;
1262           _ANONYMOUS_STRUCT struct {
1263             UCHAR CpuThrottled:1;
1264             UCHAR CycleProfiling:1;
1265             UCHAR CounterProfiling:1;
1266             UCHAR Reserved:5;
1267           } DUMMYSTRUCTNAME;
1268         } DUMMYUNIONNAME;
1269         UCHAR Size;
1270         UCHAR Hand;
1271       } DUMMYUNIONNAME2;
1272       _ANONYMOUS_UNION union {
1273 #if (NTDDI_VERSION >= NTDDI_WIN7)
1274         _ANONYMOUS_UNION union {
1275           UCHAR TimerMiscFlags;
1276           _ANONYMOUS_STRUCT struct {
1277 #if !defined(_X86_)
1278             UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
1279 #else
1280             UCHAR Index:1;
1281             UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
1282 #endif
1283             UCHAR Inserted:1;
1284             volatile UCHAR Expired:1;
1285           } DUMMYSTRUCTNAME;
1286         } DUMMYUNIONNAME;
1287 #else
1288         /* Pre Win7 compatibility fix to latest WDK */
1289         UCHAR Inserted;
1290 #endif
1291         _ANONYMOUS_UNION union {
1292           BOOLEAN DebugActive;
1293           _ANONYMOUS_STRUCT struct {
1294             BOOLEAN ActiveDR7:1;
1295             BOOLEAN Instrumented:1;
1296             BOOLEAN Reserved2:4;
1297             BOOLEAN UmsScheduled:1;
1298             BOOLEAN UmsPrimary:1;
1299           } DUMMYSTRUCTNAME;
1300         } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
1301         BOOLEAN DpcActive;
1302       } DUMMYUNIONNAME3;
1303     } DUMMYSTRUCTNAME;
1304     volatile LONG Lock;
1305   } DUMMYUNIONNAME;
1306   LONG SignalState;
1307   LIST_ENTRY WaitListHead;
1308 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
1309 
1310 typedef struct _KEVENT {
1311   DISPATCHER_HEADER Header;
1312 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
1313 
1314 typedef struct _KSEMAPHORE {
1315   DISPATCHER_HEADER Header;
1316   LONG Limit;
1317 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
1318 
1319 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
1320 
1321 typedef struct _KGATE {
1322   DISPATCHER_HEADER Header;
1323 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
1324 
1325 typedef struct _KGUARDED_MUTEX {
1326   volatile LONG Count;
1327   PKTHREAD Owner;
1328   ULONG Contention;
1329   KGATE Gate;
1330   _ANONYMOUS_UNION union {
1331     _ANONYMOUS_STRUCT struct {
1332       SHORT KernelApcDisable;
1333       SHORT SpecialApcDisable;
1334     } DUMMYSTRUCTNAME;
1335     ULONG CombinedApcDisable;
1336   } DUMMYUNIONNAME;
1337 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
1338 
1339 typedef struct _KMUTANT {
1340   DISPATCHER_HEADER Header;
1341   LIST_ENTRY MutantListEntry;
1342   struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
1343   BOOLEAN Abandoned;
1344   UCHAR ApcDisable;
1345 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
1346 
1347 #define TIMER_TABLE_SIZE 512
1348 #define TIMER_TABLE_SHIFT 9
1349 
1350 typedef struct _KTIMER {
1351   DISPATCHER_HEADER Header;
1352   ULARGE_INTEGER DueTime;
1353   LIST_ENTRY TimerListEntry;
1354   struct _KDPC *Dpc;
1355 # if !defined(_X86_)
1356   ULONG Processor;
1357 # endif
1358   ULONG Period;
1359 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
1360 
1361 typedef enum _LOCK_OPERATION {
1362   IoReadAccess,
1363   IoWriteAccess,
1364   IoModifyAccess
1365 } LOCK_OPERATION;
1366 
1367 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
1368 
1369 typedef BOOLEAN (NTAPI KSYNCHRONIZE_ROUTINE)(PVOID SynchronizeContext);
1370 typedef KSYNCHRONIZE_ROUTINE *PKSYNCHRONIZE_ROUTINE;
1371 
1372 typedef enum _POOL_TYPE {
1373   NonPagedPool,
1374   PagedPool,
1375   NonPagedPoolMustSucceed,
1376   DontUseThisType,
1377   NonPagedPoolCacheAligned,
1378   PagedPoolCacheAligned,
1379   NonPagedPoolCacheAlignedMustS,
1380   MaxPoolType,
1381   NonPagedPoolSession = 32,
1382   PagedPoolSession,
1383   NonPagedPoolMustSucceedSession,
1384   DontUseThisTypeSession,
1385   NonPagedPoolCacheAlignedSession,
1386   PagedPoolCacheAlignedSession,
1387   NonPagedPoolCacheAlignedMustSSession
1388 } POOL_TYPE;
1389 
1390 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
1391   StandardDesign,
1392   NEC98x86,
1393   EndAlternatives
1394 } ALTERNATIVE_ARCHITECTURE_TYPE;
1395 
1396 #ifndef _X86_
1397 
1398 #ifndef IsNEC_98
1399 #define IsNEC_98 (FALSE)
1400 #endif
1401 
1402 #ifndef IsNotNEC_98
1403 #define IsNotNEC_98 (TRUE)
1404 #endif
1405 
1406 #ifndef SetNEC_98
1407 #define SetNEC_98
1408 #endif
1409 
1410 #ifndef SetNotNEC_98
1411 #define SetNotNEC_98
1412 #endif
1413 
1414 #endif
1415 
1416 typedef struct _KSYSTEM_TIME {
1417   ULONG LowPart;
1418   LONG High1Time;
1419   LONG High2Time;
1420 } KSYSTEM_TIME, *PKSYSTEM_TIME;
1421 
1422 typedef struct DECLSPEC_ALIGN(16) _M128A {
1423   ULONGLONG Low;
1424   LONGLONG High;
1425 } M128A, *PM128A;
1426 
1427 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
1428   USHORT ControlWord;
1429   USHORT StatusWord;
1430   UCHAR TagWord;
1431   UCHAR Reserved1;
1432   USHORT ErrorOpcode;
1433   ULONG ErrorOffset;
1434   USHORT ErrorSelector;
1435   USHORT Reserved2;
1436   ULONG DataOffset;
1437   USHORT DataSelector;
1438   USHORT Reserved3;
1439   ULONG MxCsr;
1440   ULONG MxCsr_Mask;
1441   M128A FloatRegisters[8];
1442 #if defined(_WIN64)
1443   M128A XmmRegisters[16];
1444   UCHAR Reserved4[96];
1445 #else
1446   M128A XmmRegisters[8];
1447   UCHAR Reserved4[192];
1448   ULONG StackControl[7];
1449   ULONG Cr0NpxState;
1450 #endif
1451 } XSAVE_FORMAT, *PXSAVE_FORMAT;
1452 
1453 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER {
1454   ULONG64 Mask;
1455   ULONG64 Reserved[7];
1456 } XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER;
1457 
1458 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA {
1459   XSAVE_FORMAT LegacyState;
1460   XSAVE_AREA_HEADER Header;
1461 } XSAVE_AREA, *PXSAVE_AREA;
1462 
1463 typedef struct _XSTATE_CONTEXT {
1464   ULONG64 Mask;
1465   ULONG Length;
1466   ULONG Reserved1;
1467   PXSAVE_AREA Area;
1468 #if defined(_X86_)
1469   ULONG Reserved2;
1470 #endif
1471   PVOID Buffer;
1472 #if defined(_X86_)
1473   ULONG Reserved3;
1474 #endif
1475 } XSTATE_CONTEXT, *PXSTATE_CONTEXT;
1476 
1477 typedef struct _XSTATE_SAVE {
1478 #if defined(_AMD64_)
1479   struct _XSTATE_SAVE* Prev;
1480   struct _KTHREAD* Thread;
1481   UCHAR Level;
1482   XSTATE_CONTEXT XStateContext;
1483 #elif defined(_IA64_)
1484   ULONG Dummy;
1485 #elif defined(_X86_)
1486   _ANONYMOUS_UNION union {
1487     _ANONYMOUS_STRUCT struct {
1488       LONG64 Reserved1;
1489       ULONG Reserved2;
1490       struct _XSTATE_SAVE* Prev;
1491       PXSAVE_AREA Reserved3;
1492       struct _KTHREAD* Thread;
1493       PVOID Reserved4;
1494       UCHAR Level;
1495     } DUMMYSTRUCTNAME;
1496     XSTATE_CONTEXT XStateContext;
1497   } DUMMYUNIONNAME;
1498 #endif
1499 } XSTATE_SAVE, *PXSTATE_SAVE;
1500 
1501 #ifdef _X86_
1502 
1503 #define MAXIMUM_SUPPORTED_EXTENSION  512
1504 
1505 #if !defined(__midl) && !defined(MIDL_PASS)
1506 C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION);
1507 #endif
1508 
1509 #endif /* _X86_ */
1510 
1511 #define XSAVE_ALIGN                    64
1512 #define MINIMAL_XSTATE_AREA_LENGTH     sizeof(XSAVE_AREA)
1513 
1514 #if !defined(__midl) && !defined(MIDL_PASS)
1515 C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0);
1516 C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0);
1517 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64);
1518 #endif
1519 
1520 typedef struct _CONTEXT_CHUNK {
1521   LONG Offset;
1522   ULONG Length;
1523 } CONTEXT_CHUNK, *PCONTEXT_CHUNK;
1524 
1525 typedef struct _CONTEXT_EX {
1526   CONTEXT_CHUNK All;
1527   CONTEXT_CHUNK Legacy;
1528   CONTEXT_CHUNK XState;
1529 } CONTEXT_EX, *PCONTEXT_EX;
1530 
1531 #define CONTEXT_EX_LENGTH         ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1532 
1533 #if (NTDDI_VERSION >= NTDDI_VISTA)
1534 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
1535 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1536 extern NTSYSAPI CCHAR KeNumberProcessors;
1537 #else
1538 extern PCCHAR KeNumberProcessors;
1539 #endif
1540 
1541 
1542 /******************************************************************************
1543  *                         Memory manager Types                               *
1544  ******************************************************************************/
1545 
1546 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1547 typedef ULONG NODE_REQUIREMENT;
1548 #define MM_ANY_NODE_OK                           0x80000000
1549 #endif
1550 
1551 #define MM_DONT_ZERO_ALLOCATION                  0x00000001
1552 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY         0x00000002
1553 #define MM_ALLOCATE_FULLY_REQUIRED               0x00000004
1554 #define MM_ALLOCATE_NO_WAIT                      0x00000008
1555 #define MM_ALLOCATE_PREFER_CONTIGUOUS            0x00000010
1556 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS    0x00000020
1557 
1558 #define MDL_MAPPED_TO_SYSTEM_VA     0x0001
1559 #define MDL_PAGES_LOCKED            0x0002
1560 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1561 #define MDL_ALLOCATED_FIXED_SIZE    0x0008
1562 #define MDL_PARTIAL                 0x0010
1563 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1564 #define MDL_IO_PAGE_READ            0x0040
1565 #define MDL_WRITE_OPERATION         0x0080
1566 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1567 #define MDL_FREE_EXTRA_PTES         0x0200
1568 #define MDL_DESCRIBES_AWE           0x0400
1569 #define MDL_IO_SPACE                0x0800
1570 #define MDL_NETWORK_HEADER          0x1000
1571 #define MDL_MAPPING_CAN_FAIL        0x2000
1572 #define MDL_ALLOCATED_MUST_SUCCEED  0x4000
1573 #define MDL_INTERNAL                0x8000
1574 
1575 #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA     | \
1576                            MDL_PAGES_LOCKED            | \
1577                            MDL_SOURCE_IS_NONPAGED_POOL | \
1578                            MDL_PARTIAL_HAS_BEEN_MAPPED | \
1579                            MDL_PARENT_MAPPED_SYSTEM_VA | \
1580                            MDL_SYSTEM_VA               | \
1581                            MDL_IO_SPACE)
1582 
1583 #define FLUSH_MULTIPLE_MAXIMUM       32
1584 
1585 /* Section access rights */
1586 #define SECTION_QUERY                0x0001
1587 #define SECTION_MAP_WRITE            0x0002
1588 #define SECTION_MAP_READ             0x0004
1589 #define SECTION_MAP_EXECUTE          0x0008
1590 #define SECTION_EXTEND_SIZE          0x0010
1591 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
1592 
1593 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
1594                             SECTION_MAP_WRITE |                     \
1595                             SECTION_MAP_READ |                      \
1596                             SECTION_MAP_EXECUTE |                   \
1597                             SECTION_EXTEND_SIZE)
1598 
1599 #define SESSION_QUERY_ACCESS         0x0001
1600 #define SESSION_MODIFY_ACCESS        0x0002
1601 
1602 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |  \
1603                             SESSION_QUERY_ACCESS     |  \
1604                             SESSION_MODIFY_ACCESS)
1605 
1606 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1607 
1608 #define PAGE_NOACCESS          0x01
1609 #define PAGE_READONLY          0x02
1610 #define PAGE_READWRITE         0x04
1611 #define PAGE_WRITECOPY         0x08
1612 #define PAGE_EXECUTE           0x10
1613 #define PAGE_EXECUTE_READ      0x20
1614 #define PAGE_EXECUTE_READWRITE 0x40
1615 #define PAGE_EXECUTE_WRITECOPY 0x80
1616 #define PAGE_GUARD            0x100
1617 #define PAGE_NOCACHE          0x200
1618 #define PAGE_WRITECOMBINE     0x400
1619 
1620 #define MEM_COMMIT           0x1000
1621 #define MEM_RESERVE          0x2000
1622 #define MEM_DECOMMIT         0x4000
1623 #define MEM_RELEASE          0x8000
1624 #define MEM_FREE            0x10000
1625 #define MEM_PRIVATE         0x20000
1626 #define MEM_MAPPED          0x40000
1627 #define MEM_RESET           0x80000
1628 #define MEM_TOP_DOWN       0x100000
1629 #define MEM_LARGE_PAGES  0x20000000
1630 #define MEM_4MB_PAGES    0x80000000
1631 
1632 #define SEC_RESERVE       0x4000000
1633 #define SEC_COMMIT        0x8000000
1634 #define SEC_LARGE_PAGES  0x80000000
1635 
1636 /* Section map options */
1637 typedef enum _SECTION_INHERIT {
1638   ViewShare = 1,
1639   ViewUnmap = 2
1640 } SECTION_INHERIT;
1641 
1642 typedef ULONG PFN_COUNT;
1643 typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
1644 typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
1645 
1646 typedef struct _MDL {
1647   struct _MDL *Next;
1648   CSHORT Size;
1649   CSHORT MdlFlags;
1650   struct _EPROCESS *Process;
1651   PVOID MappedSystemVa;
1652   PVOID StartVa;
1653   ULONG ByteCount;
1654   ULONG ByteOffset;
1655 } MDL, *PMDL;
1656 typedef MDL *PMDLX;
1657 
1658 typedef enum _MEMORY_CACHING_TYPE_ORIG {
1659   MmFrameBufferCached = 2
1660 } MEMORY_CACHING_TYPE_ORIG;
1661 
1662 typedef enum _MEMORY_CACHING_TYPE {
1663   MmNonCached = FALSE,
1664   MmCached = TRUE,
1665   MmWriteCombined = MmFrameBufferCached,
1666   MmHardwareCoherentCached,
1667   MmNonCachedUnordered,
1668   MmUSWCCached,
1669   MmMaximumCacheType
1670 } MEMORY_CACHING_TYPE;
1671 
1672 typedef enum _MM_PAGE_PRIORITY {
1673   LowPagePriority,
1674   NormalPagePriority = 16,
1675   HighPagePriority = 32
1676 } MM_PAGE_PRIORITY;
1677 
1678 typedef enum _MM_SYSTEM_SIZE {
1679   MmSmallSystem,
1680   MmMediumSystem,
1681   MmLargeSystem
1682 } MM_SYSTEMSIZE;
1683 
1684 extern NTKERNELAPI BOOLEAN Mm64BitPhysicalAddress;
1685 extern PVOID MmBadPointer;
1686 
1687 
1688 /******************************************************************************
1689  *                            Executive Types                                 *
1690  ******************************************************************************/
1691 #define EX_RUNDOWN_ACTIVE                 0x1
1692 #define EX_RUNDOWN_COUNT_SHIFT            0x1
1693 #define EX_RUNDOWN_COUNT_INC              (1 << EX_RUNDOWN_COUNT_SHIFT)
1694 
1695 typedef struct _FAST_MUTEX {
1696   volatile LONG Count;
1697   PKTHREAD Owner;
1698   ULONG Contention;
1699   KEVENT Event;
1700   ULONG OldIrql;
1701 } FAST_MUTEX, *PFAST_MUTEX;
1702 
1703 typedef enum _SUITE_TYPE {
1704   SmallBusiness,
1705   Enterprise,
1706   BackOffice,
1707   CommunicationServer,
1708   TerminalServer,
1709   SmallBusinessRestricted,
1710   EmbeddedNT,
1711   DataCenter,
1712   SingleUserTS,
1713   Personal,
1714   Blade,
1715   EmbeddedRestricted,
1716   SecurityAppliance,
1717   StorageServer,
1718   ComputeServer,
1719   WHServer,
1720   MaxSuiteType
1721 } SUITE_TYPE;
1722 
1723 typedef enum _EX_POOL_PRIORITY {
1724   LowPoolPriority,
1725   LowPoolPrioritySpecialPoolOverrun = 8,
1726   LowPoolPrioritySpecialPoolUnderrun = 9,
1727   NormalPoolPriority = 16,
1728   NormalPoolPrioritySpecialPoolOverrun = 24,
1729   NormalPoolPrioritySpecialPoolUnderrun = 25,
1730   HighPoolPriority = 32,
1731   HighPoolPrioritySpecialPoolOverrun = 40,
1732   HighPoolPrioritySpecialPoolUnderrun = 41
1733 } EX_POOL_PRIORITY;
1734 
1735 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
1736 #define LOOKASIDE_ALIGN
1737 #else
1738 #define LOOKASIDE_ALIGN DECLSPEC_CACHEALIGN
1739 #endif
1740 
1741 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
1742 
1743 typedef PVOID
1744 (NTAPI *PALLOCATE_FUNCTION)(
1745   IN POOL_TYPE PoolType,
1746   IN SIZE_T NumberOfBytes,
1747   IN ULONG Tag);
1748 
1749 typedef PVOID
1750 (NTAPI *PALLOCATE_FUNCTION_EX)(
1751   IN POOL_TYPE PoolType,
1752   IN SIZE_T NumberOfBytes,
1753   IN ULONG Tag,
1754   IN OUT PLOOKASIDE_LIST_EX Lookaside);
1755 
1756 typedef VOID
1757 (NTAPI *PFREE_FUNCTION)(
1758   IN PVOID Buffer);
1759 
1760 typedef VOID
1761 (NTAPI *PFREE_FUNCTION_EX)(
1762   IN PVOID Buffer,
1763   IN OUT PLOOKASIDE_LIST_EX Lookaside);
1764 
1765 typedef VOID
1766 (NTAPI CALLBACK_FUNCTION)(
1767   IN PVOID CallbackContext OPTIONAL,
1768   IN PVOID Argument1 OPTIONAL,
1769   IN PVOID Argument2 OPTIONAL);
1770 typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
1771 
1772 #define GENERAL_LOOKASIDE_LAYOUT                \
1773     _ANONYMOUS_UNION union {                    \
1774         SLIST_HEADER ListHead;                  \
1775         SINGLE_LIST_ENTRY SingleListHead;       \
1776     } DUMMYUNIONNAME;                           \
1777     USHORT Depth;                               \
1778     USHORT MaximumDepth;                        \
1779     ULONG TotalAllocates;                       \
1780     _ANONYMOUS_UNION union {                    \
1781         ULONG AllocateMisses;                   \
1782         ULONG AllocateHits;                     \
1783     } DUMMYUNIONNAME2;                          \
1784     ULONG TotalFrees;                           \
1785     _ANONYMOUS_UNION union {                    \
1786         ULONG FreeMisses;                       \
1787         ULONG FreeHits;                         \
1788     } DUMMYUNIONNAME3;                          \
1789     POOL_TYPE Type;                             \
1790     ULONG Tag;                                  \
1791     ULONG Size;                                 \
1792     _ANONYMOUS_UNION union {                    \
1793         PALLOCATE_FUNCTION_EX AllocateEx;       \
1794         PALLOCATE_FUNCTION Allocate;            \
1795     } DUMMYUNIONNAME4;                          \
1796     _ANONYMOUS_UNION union {                    \
1797         PFREE_FUNCTION_EX FreeEx;               \
1798         PFREE_FUNCTION Free;                    \
1799     } DUMMYUNIONNAME5;                          \
1800     LIST_ENTRY ListEntry;                       \
1801     ULONG LastTotalAllocates;                   \
1802     _ANONYMOUS_UNION union {                    \
1803         ULONG LastAllocateMisses;               \
1804         ULONG LastAllocateHits;                 \
1805     } DUMMYUNIONNAME6;                          \
1806     ULONG Future[2];
1807 
1808 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
1809   GENERAL_LOOKASIDE_LAYOUT
1810 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
1811 
1812 typedef struct _GENERAL_LOOKASIDE_POOL {
1813   GENERAL_LOOKASIDE_LAYOUT
1814 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
1815 
1816 #define LOOKASIDE_CHECK(f)  \
1817     C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
1818 
1819 LOOKASIDE_CHECK(TotalFrees);
1820 LOOKASIDE_CHECK(Tag);
1821 LOOKASIDE_CHECK(Future);
1822 
1823 typedef struct _PAGED_LOOKASIDE_LIST {
1824   GENERAL_LOOKASIDE L;
1825 #if !defined(_AMD64_) && !defined(_IA64_)
1826   FAST_MUTEX Lock__ObsoleteButDoNotDelete;
1827 #endif
1828 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
1829 
1830 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
1831   GENERAL_LOOKASIDE L;
1832 #if !defined(_AMD64_) && !defined(_IA64_)
1833   KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
1834 #endif
1835 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
1836 
1837 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
1838 
1839 typedef struct _LOOKASIDE_LIST_EX {
1840   GENERAL_LOOKASIDE_POOL L;
1841 } LOOKASIDE_LIST_EX;
1842 
1843 #if (NTDDI_VERSION >= NTDDI_VISTA)
1844 
1845 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
1846 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
1847 
1848 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE          256
1849 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT         1024
1850 
1851 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1852 
1853 typedef struct _EX_RUNDOWN_REF {
1854   _ANONYMOUS_UNION union {
1855     volatile ULONG_PTR Count;
1856     volatile PVOID Ptr;
1857   } DUMMYUNIONNAME;
1858 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
1859 
1860 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
1861 
1862 typedef enum _WORK_QUEUE_TYPE {
1863   CriticalWorkQueue,
1864   DelayedWorkQueue,
1865   HyperCriticalWorkQueue,
1866   MaximumWorkQueue
1867 } WORK_QUEUE_TYPE;
1868 
1869 typedef VOID
1870 (NTAPI WORKER_THREAD_ROUTINE)(
1871   IN PVOID Parameter);
1872 typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE;
1873 
1874 typedef struct _WORK_QUEUE_ITEM {
1875   LIST_ENTRY List;
1876   PWORKER_THREAD_ROUTINE WorkerRoutine;
1877   volatile PVOID Parameter;
1878 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
1879 
1880 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
1881 
1882 typedef struct _OWNER_ENTRY {
1883   ERESOURCE_THREAD OwnerThread;
1884   _ANONYMOUS_UNION union {
1885     _ANONYMOUS_STRUCT struct {
1886       ULONG IoPriorityBoosted:1;
1887       ULONG OwnerReferenced:1;
1888       ULONG OwnerCount:30;
1889     } DUMMYSTRUCTNAME;
1890     ULONG TableSize;
1891   } DUMMYUNIONNAME;
1892 } OWNER_ENTRY, *POWNER_ENTRY;
1893 
1894 typedef struct _ERESOURCE {
1895   LIST_ENTRY SystemResourcesList;
1896   POWNER_ENTRY OwnerTable;
1897   SHORT ActiveCount;
1898   USHORT Flag;
1899   volatile PKSEMAPHORE SharedWaiters;
1900   volatile PKEVENT ExclusiveWaiters;
1901   OWNER_ENTRY OwnerEntry;
1902   ULONG ActiveEntries;
1903   ULONG ContentionCount;
1904   ULONG NumberOfSharedWaiters;
1905   ULONG NumberOfExclusiveWaiters;
1906 #if defined(_WIN64)
1907   PVOID Reserved2;
1908 #endif
1909   _ANONYMOUS_UNION union {
1910     PVOID Address;
1911     ULONG_PTR CreatorBackTraceIndex;
1912   } DUMMYUNIONNAME;
1913   KSPIN_LOCK SpinLock;
1914 } ERESOURCE, *PERESOURCE;
1915 
1916 /* ERESOURCE.Flag */
1917 #define ResourceNeverExclusive            0x0010
1918 #define ResourceReleaseByOtherThread      0x0020
1919 #define ResourceOwnedExclusive            0x0080
1920 
1921 #define RESOURCE_HASH_TABLE_SIZE          64
1922 
1923 typedef struct _RESOURCE_HASH_ENTRY {
1924   LIST_ENTRY ListEntry;
1925   PVOID Address;
1926   ULONG ContentionCount;
1927   ULONG Number;
1928 } RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY;
1929 
1930 typedef struct _RESOURCE_PERFORMANCE_DATA {
1931   ULONG ActiveResourceCount;
1932   ULONG TotalResourceCount;
1933   ULONG ExclusiveAcquire;
1934   ULONG SharedFirstLevel;
1935   ULONG SharedSecondLevel;
1936   ULONG StarveFirstLevel;
1937   ULONG StarveSecondLevel;
1938   ULONG WaitForExclusive;
1939   ULONG OwnerTableExpands;
1940   ULONG MaximumTableExpand;
1941   LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE];
1942 } RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA;
1943 
1944 /* Global debug flag */
1945 #if DEVL
1946 extern ULONG NtGlobalFlag;
1947 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
1948 #else
1949 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
1950 #endif
1951 
1952 /******************************************************************************
1953  *                            Security Manager Types                          *
1954  ******************************************************************************/
1955 
1956 /* Simple types */
1957 typedef PVOID PSECURITY_DESCRIPTOR;
1958 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
1959 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
1960 typedef PVOID PACCESS_TOKEN;
1961 typedef PVOID PSID;
1962 
1963 #define DELETE                           0x00010000L
1964 #define READ_CONTROL                     0x00020000L
1965 #define WRITE_DAC                        0x00040000L
1966 #define WRITE_OWNER                      0x00080000L
1967 #define SYNCHRONIZE                      0x00100000L
1968 #define STANDARD_RIGHTS_REQUIRED         0x000F0000L
1969 #define STANDARD_RIGHTS_READ             READ_CONTROL
1970 #define STANDARD_RIGHTS_WRITE            READ_CONTROL
1971 #define STANDARD_RIGHTS_EXECUTE          READ_CONTROL
1972 #define STANDARD_RIGHTS_ALL              0x001F0000L
1973 #define SPECIFIC_RIGHTS_ALL              0x0000FFFFL
1974 #define ACCESS_SYSTEM_SECURITY           0x01000000L
1975 #define MAXIMUM_ALLOWED                  0x02000000L
1976 #define GENERIC_READ                     0x80000000L
1977 #define GENERIC_WRITE                    0x40000000L
1978 #define GENERIC_EXECUTE                  0x20000000L
1979 #define GENERIC_ALL                      0x10000000L
1980 
1981 typedef struct _GENERIC_MAPPING {
1982   ACCESS_MASK GenericRead;
1983   ACCESS_MASK GenericWrite;
1984   ACCESS_MASK GenericExecute;
1985   ACCESS_MASK GenericAll;
1986 } GENERIC_MAPPING, *PGENERIC_MAPPING;
1987 
1988 #define ACL_REVISION                      2
1989 #define ACL_REVISION_DS                   4
1990 
1991 #define ACL_REVISION1                     1
1992 #define ACL_REVISION2                     2
1993 #define ACL_REVISION3                     3
1994 #define ACL_REVISION4                     4
1995 #define MIN_ACL_REVISION                  ACL_REVISION2
1996 #define MAX_ACL_REVISION                  ACL_REVISION4
1997 
1998 typedef struct _ACL {
1999   UCHAR AclRevision;
2000   UCHAR Sbz1;
2001   USHORT AclSize;
2002   USHORT AceCount;
2003   USHORT Sbz2;
2004 } ACL, *PACL;
2005 
2006 /* Current security descriptor revision value */
2007 #define SECURITY_DESCRIPTOR_REVISION     (1)
2008 #define SECURITY_DESCRIPTOR_REVISION1    (1)
2009 
2010 /* Privilege attributes */
2011 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
2012 #define SE_PRIVILEGE_ENABLED            (0x00000002L)
2013 #define SE_PRIVILEGE_REMOVED            (0X00000004L)
2014 #define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)
2015 
2016 #define SE_PRIVILEGE_VALID_ATTRIBUTES   (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
2017                                          SE_PRIVILEGE_ENABLED            | \
2018                                          SE_PRIVILEGE_REMOVED            | \
2019                                          SE_PRIVILEGE_USED_FOR_ACCESS)
2020 
2021 #include <pshpack4.h>
2022 typedef struct _LUID_AND_ATTRIBUTES {
2023   LUID Luid;
2024   ULONG Attributes;
2025 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
2026 #include <poppack.h>
2027 
2028 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
2029 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
2030 
2031 /* Privilege sets */
2032 #define PRIVILEGE_SET_ALL_NECESSARY (1)
2033 
2034 typedef struct _PRIVILEGE_SET {
2035   ULONG PrivilegeCount;
2036   ULONG Control;
2037   LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
2038 } PRIVILEGE_SET,*PPRIVILEGE_SET;
2039 
2040 typedef enum _SECURITY_IMPERSONATION_LEVEL {
2041   SecurityAnonymous,
2042   SecurityIdentification,
2043   SecurityImpersonation,
2044   SecurityDelegation
2045 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
2046 
2047 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
2048 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
2049 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
2050 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
2051 
2052 #define SECURITY_DYNAMIC_TRACKING (TRUE)
2053 #define SECURITY_STATIC_TRACKING (FALSE)
2054 
2055 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
2056 
2057 typedef struct _SECURITY_QUALITY_OF_SERVICE {
2058   ULONG Length;
2059   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2060   SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
2061   BOOLEAN EffectiveOnly;
2062 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
2063 
2064 typedef struct _SE_IMPERSONATION_STATE {
2065   PACCESS_TOKEN Token;
2066   BOOLEAN CopyOnOpen;
2067   BOOLEAN EffectiveOnly;
2068   SECURITY_IMPERSONATION_LEVEL Level;
2069 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
2070 
2071 #define OWNER_SECURITY_INFORMATION       (0x00000001L)
2072 #define GROUP_SECURITY_INFORMATION       (0x00000002L)
2073 #define DACL_SECURITY_INFORMATION        (0x00000004L)
2074 #define SACL_SECURITY_INFORMATION        (0x00000008L)
2075 #define LABEL_SECURITY_INFORMATION       (0x00000010L)
2076 
2077 #define PROTECTED_DACL_SECURITY_INFORMATION     (0x80000000L)
2078 #define PROTECTED_SACL_SECURITY_INFORMATION     (0x40000000L)
2079 #define UNPROTECTED_DACL_SECURITY_INFORMATION   (0x20000000L)
2080 #define UNPROTECTED_SACL_SECURITY_INFORMATION   (0x10000000L)
2081 
2082 typedef enum _SECURITY_OPERATION_CODE {
2083   SetSecurityDescriptor,
2084   QuerySecurityDescriptor,
2085   DeleteSecurityDescriptor,
2086   AssignSecurityDescriptor
2087 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2088 
2089 #define INITIAL_PRIVILEGE_COUNT           3
2090 
2091 typedef struct _INITIAL_PRIVILEGE_SET {
2092   ULONG PrivilegeCount;
2093   ULONG Control;
2094   LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2095 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2096 
2097 #define SE_MIN_WELL_KNOWN_PRIVILEGE         2
2098 #define SE_CREATE_TOKEN_PRIVILEGE           2
2099 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE     3
2100 #define SE_LOCK_MEMORY_PRIVILEGE            4
2101 #define SE_INCREASE_QUOTA_PRIVILEGE         5
2102 #define SE_MACHINE_ACCOUNT_PRIVILEGE        6
2103 #define SE_TCB_PRIVILEGE                    7
2104 #define SE_SECURITY_PRIVILEGE               8
2105 #define SE_TAKE_OWNERSHIP_PRIVILEGE         9
2106 #define SE_LOAD_DRIVER_PRIVILEGE            10
2107 #define SE_SYSTEM_PROFILE_PRIVILEGE         11
2108 #define SE_SYSTEMTIME_PRIVILEGE             12
2109 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE    13
2110 #define SE_INC_BASE_PRIORITY_PRIVILEGE      14
2111 #define SE_CREATE_PAGEFILE_PRIVILEGE        15
2112 #define SE_CREATE_PERMANENT_PRIVILEGE       16
2113 #define SE_BACKUP_PRIVILEGE                 17
2114 #define SE_RESTORE_PRIVILEGE                18
2115 #define SE_SHUTDOWN_PRIVILEGE               19
2116 #define SE_DEBUG_PRIVILEGE                  20
2117 #define SE_AUDIT_PRIVILEGE                  21
2118 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE     22
2119 #define SE_CHANGE_NOTIFY_PRIVILEGE          23
2120 #define SE_REMOTE_SHUTDOWN_PRIVILEGE        24
2121 #define SE_UNDOCK_PRIVILEGE                 25
2122 #define SE_SYNC_AGENT_PRIVILEGE             26
2123 #define SE_ENABLE_DELEGATION_PRIVILEGE      27
2124 #define SE_MANAGE_VOLUME_PRIVILEGE          28
2125 #define SE_IMPERSONATE_PRIVILEGE            29
2126 #define SE_CREATE_GLOBAL_PRIVILEGE          30
2127 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
2128 #define SE_RELABEL_PRIVILEGE                32
2129 #define SE_INC_WORKING_SET_PRIVILEGE        33
2130 #define SE_TIME_ZONE_PRIVILEGE              34
2131 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE   35
2132 #define SE_MAX_WELL_KNOWN_PRIVILEGE         SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
2133 
2134 typedef struct _SECURITY_SUBJECT_CONTEXT {
2135   PACCESS_TOKEN ClientToken;
2136   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2137   PACCESS_TOKEN PrimaryToken;
2138   PVOID ProcessAuditId;
2139 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2140 
2141 typedef struct _ACCESS_STATE {
2142   LUID OperationID;
2143   BOOLEAN SecurityEvaluated;
2144   BOOLEAN GenerateAudit;
2145   BOOLEAN GenerateOnClose;
2146   BOOLEAN PrivilegesAllocated;
2147   ULONG Flags;
2148   ACCESS_MASK RemainingDesiredAccess;
2149   ACCESS_MASK PreviouslyGrantedAccess;
2150   ACCESS_MASK OriginalDesiredAccess;
2151   SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2152   PSECURITY_DESCRIPTOR SecurityDescriptor;
2153   PVOID AuxData;
2154   union {
2155     INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2156     PRIVILEGE_SET PrivilegeSet;
2157   } Privileges;
2158   BOOLEAN AuditPrivileges;
2159   UNICODE_STRING ObjectName;
2160   UNICODE_STRING ObjectTypeName;
2161 } ACCESS_STATE, *PACCESS_STATE;
2162 
2163 typedef VOID
2164 (NTAPI *PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR)(
2165   IN PVOID Vcb,
2166   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
2167 
2168 #ifndef _NTLSA_IFS_
2169 
2170 #ifndef _NTLSA_AUDIT_
2171 #define _NTLSA_AUDIT_
2172 
2173 #define SE_MAX_AUDIT_PARAMETERS 32
2174 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
2175 
2176 #define SE_ADT_OBJECT_ONLY 0x1
2177 
2178 #define SE_ADT_PARAMETERS_SELF_RELATIVE    0x00000001
2179 #define SE_ADT_PARAMETERS_SEND_TO_LSA      0x00000002
2180 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT  0x00000004
2181 #define SE_ADT_PARAMETER_GENERIC_AUDIT     0x00000008
2182 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
2183 
2184 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
2185   ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
2186     (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
2187 
2188 typedef enum _SE_ADT_PARAMETER_TYPE {
2189   SeAdtParmTypeNone = 0,
2190   SeAdtParmTypeString,
2191   SeAdtParmTypeFileSpec,
2192   SeAdtParmTypeUlong,
2193   SeAdtParmTypeSid,
2194   SeAdtParmTypeLogonId,
2195   SeAdtParmTypeNoLogonId,
2196   SeAdtParmTypeAccessMask,
2197   SeAdtParmTypePrivs,
2198   SeAdtParmTypeObjectTypes,
2199   SeAdtParmTypeHexUlong,
2200   SeAdtParmTypePtr,
2201   SeAdtParmTypeTime,
2202   SeAdtParmTypeGuid,
2203   SeAdtParmTypeLuid,
2204   SeAdtParmTypeHexInt64,
2205   SeAdtParmTypeStringList,
2206   SeAdtParmTypeSidList,
2207   SeAdtParmTypeDuration,
2208   SeAdtParmTypeUserAccountControl,
2209   SeAdtParmTypeNoUac,
2210   SeAdtParmTypeMessage,
2211   SeAdtParmTypeDateTime,
2212   SeAdtParmTypeSockAddr,
2213   SeAdtParmTypeSD,
2214   SeAdtParmTypeLogonHours,
2215   SeAdtParmTypeLogonIdNoSid,
2216   SeAdtParmTypeUlongNoConv,
2217   SeAdtParmTypeSockAddrNoPort,
2218   SeAdtParmTypeAccessReason
2219 } SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
2220 
2221 typedef struct _SE_ADT_OBJECT_TYPE {
2222   GUID ObjectType;
2223   USHORT Flags;
2224   USHORT Level;
2225   ACCESS_MASK AccessMask;
2226 } SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
2227 
2228 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
2229   SE_ADT_PARAMETER_TYPE Type;
2230   ULONG Length;
2231   ULONG_PTR Data[2];
2232   PVOID Address;
2233 } SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
2234 
2235 typedef struct _SE_ADT_ACCESS_REASON {
2236   ACCESS_MASK AccessMask;
2237   ULONG AccessReasons[32];
2238   ULONG ObjectTypeIndex;
2239   ULONG AccessGranted;
2240   PSECURITY_DESCRIPTOR SecurityDescriptor;
2241 } SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
2242 
2243 typedef struct _SE_ADT_PARAMETER_ARRAY {
2244   ULONG CategoryId;
2245   ULONG AuditId;
2246   ULONG ParameterCount;
2247   ULONG Length;
2248   USHORT FlatSubCategoryId;
2249   USHORT Type;
2250   ULONG Flags;
2251   SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
2252 } SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
2253 
2254 #endif /* !_NTLSA_AUDIT_ */
2255 #endif /* !_NTLSA_IFS_ */
2256 
2257 /******************************************************************************
2258  *                            Power Management Support Types                  *
2259  ******************************************************************************/
2260 
2261 #ifndef _PO_DDK_
2262 #define _PO_DDK_
2263 
2264 #define PO_CB_SYSTEM_POWER_POLICY                0
2265 #define PO_CB_AC_STATUS                          1
2266 #define PO_CB_BUTTON_COLLISION                   2
2267 #define PO_CB_SYSTEM_STATE_LOCK                  3
2268 #define PO_CB_LID_SWITCH_STATE                   4
2269 #define PO_CB_PROCESSOR_POWER_POLICY             5
2270 
2271 /* Power States/Levels */
2272 typedef enum _SYSTEM_POWER_STATE {
2273   PowerSystemUnspecified = 0,
2274   PowerSystemWorking,
2275   PowerSystemSleeping1,
2276   PowerSystemSleeping2,
2277   PowerSystemSleeping3,
2278   PowerSystemHibernate,
2279   PowerSystemShutdown,
2280   PowerSystemMaximum
2281 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
2282 
2283 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
2284 
2285 typedef enum _POWER_INFORMATION_LEVEL {
2286   SystemPowerPolicyAc,
2287   SystemPowerPolicyDc,
2288   VerifySystemPolicyAc,
2289   VerifySystemPolicyDc,
2290   SystemPowerCapabilities,
2291   SystemBatteryState,
2292   SystemPowerStateHandler,
2293   ProcessorStateHandler,
2294   SystemPowerPolicyCurrent,
2295   AdministratorPowerPolicy,
2296   SystemReserveHiberFile,
2297   ProcessorInformation,
2298   SystemPowerInformation,
2299   ProcessorStateHandler2,
2300   LastWakeTime,
2301   LastSleepTime,
2302   SystemExecutionState,
2303   SystemPowerStateNotifyHandler,
2304   ProcessorPowerPolicyAc,
2305   ProcessorPowerPolicyDc,
2306   VerifyProcessorPowerPolicyAc,
2307   VerifyProcessorPowerPolicyDc,
2308   ProcessorPowerPolicyCurrent,
2309   SystemPowerStateLogging,
2310   SystemPowerLoggingEntry,
2311   SetPowerSettingValue,
2312   NotifyUserPowerSetting,
2313   PowerInformationLevelUnused0,
2314   PowerInformationLevelUnused1,
2315   SystemVideoState,
2316   TraceApplicationPowerMessage,
2317   TraceApplicationPowerMessageEnd,
2318   ProcessorPerfStates,
2319   ProcessorIdleStates,
2320   ProcessorCap,
2321   SystemWakeSource,
2322   SystemHiberFileInformation,
2323   TraceServicePowerMessage,
2324   ProcessorLoad,
2325   PowerShutdownNotification,
2326   MonitorCapabilities,
2327   SessionPowerInit,
2328   SessionDisplayState,
2329   PowerRequestCreate,
2330   PowerRequestAction,
2331   GetPowerRequestList,
2332   ProcessorInformationEx,
2333   NotifyUserModeLegacyPowerEvent,
2334   GroupPark,
2335   ProcessorIdleDomains,
2336   WakeTimerList,
2337   SystemHiberFileSize,
2338   PowerInformationLevelMaximum
2339 } POWER_INFORMATION_LEVEL;
2340 
2341 typedef enum {
2342   PowerActionNone = 0,
2343   PowerActionReserved,
2344   PowerActionSleep,
2345   PowerActionHibernate,
2346   PowerActionShutdown,
2347   PowerActionShutdownReset,
2348   PowerActionShutdownOff,
2349   PowerActionWarmEject
2350 } POWER_ACTION, *PPOWER_ACTION;
2351 
2352 typedef enum _DEVICE_POWER_STATE {
2353   PowerDeviceUnspecified = 0,
2354   PowerDeviceD0,
2355   PowerDeviceD1,
2356   PowerDeviceD2,
2357   PowerDeviceD3,
2358   PowerDeviceMaximum
2359 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
2360 
2361 typedef enum _MONITOR_DISPLAY_STATE {
2362   PowerMonitorOff = 0,
2363   PowerMonitorOn,
2364   PowerMonitorDim
2365 } MONITOR_DISPLAY_STATE, *PMONITOR_DISPLAY_STATE;
2366 
2367 typedef union _POWER_STATE {
2368   SYSTEM_POWER_STATE SystemState;
2369   DEVICE_POWER_STATE DeviceState;
2370 } POWER_STATE, *PPOWER_STATE;
2371 
2372 typedef enum _POWER_STATE_TYPE {
2373   SystemPowerState = 0,
2374   DevicePowerState
2375 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
2376 
2377 #if (NTDDI_VERSION >= NTDDI_VISTA)
2378 typedef struct _SYSTEM_POWER_STATE_CONTEXT {
2379   _ANONYMOUS_UNION union {
2380     _ANONYMOUS_STRUCT struct {
2381       ULONG Reserved1:8;
2382       ULONG TargetSystemState:4;
2383       ULONG EffectiveSystemState:4;
2384       ULONG CurrentSystemState:4;
2385       ULONG IgnoreHibernationPath:1;
2386       ULONG PseudoTransition:1;
2387       ULONG Reserved2:10;
2388     } DUMMYSTRUCTNAME;
2389     ULONG ContextAsUlong;
2390   } DUMMYUNIONNAME;
2391 } SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT;
2392 #endif
2393 
2394 #if (NTDDI_VERSION >= NTDDI_WIN7)
2395 typedef struct _COUNTED_REASON_CONTEXT {
2396   ULONG Version;
2397   ULONG Flags;
2398   _ANONYMOUS_UNION union {
2399     _ANONYMOUS_STRUCT struct {
2400       UNICODE_STRING ResourceFileName;
2401       USHORT ResourceReasonId;
2402       ULONG StringCount;
2403       PUNICODE_STRING ReasonStrings;
2404     } DUMMYSTRUCTNAME;
2405     UNICODE_STRING SimpleString;
2406   } DUMMYUNIONNAME;
2407 } COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT;
2408 #endif
2409 
2410 #define IOCTL_QUERY_DEVICE_POWER_STATE  \
2411         CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS)
2412 
2413 #define IOCTL_SET_DEVICE_WAKE           \
2414         CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
2415 
2416 #define IOCTL_CANCEL_DEVICE_WAKE        \
2417         CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
2418 
2419 #define ES_SYSTEM_REQUIRED                       0x00000001
2420 #define ES_DISPLAY_REQUIRED                      0x00000002
2421 #define ES_USER_PRESENT                          0x00000004
2422 #define ES_CONTINUOUS                            0x80000000
2423 
2424 typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE;
2425 
2426 typedef enum {
2427   LT_DONT_CARE,
2428   LT_LOWEST_LATENCY
2429 } LATENCY_TIME;
2430 
2431 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
2432 #define DIAGNOSTIC_REASON_VERSION                0
2433 #define DIAGNOSTIC_REASON_SIMPLE_STRING          0x00000001
2434 #define DIAGNOSTIC_REASON_DETAILED_STRING        0x00000002
2435 #define DIAGNOSTIC_REASON_NOT_SPECIFIED          0x80000000
2436 #define DIAGNOSTIC_REASON_INVALID_FLAGS          (~0x80000003)
2437 #endif
2438 
2439 #define POWER_REQUEST_CONTEXT_VERSION            0
2440 #define POWER_REQUEST_CONTEXT_SIMPLE_STRING      0x00000001
2441 #define POWER_REQUEST_CONTEXT_DETAILED_STRING    0x00000002
2442 
2443 #define PowerRequestMaximum                      3
2444 
2445 typedef enum _POWER_REQUEST_TYPE {
2446   PowerRequestDisplayRequired,
2447   PowerRequestSystemRequired,
2448   PowerRequestAwayModeRequired
2449 } POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE;
2450 
2451 #if (NTDDI_VERSION >= NTDDI_WINXP)
2452 
2453 #define PDCAP_D0_SUPPORTED                       0x00000001
2454 #define PDCAP_D1_SUPPORTED                       0x00000002
2455 #define PDCAP_D2_SUPPORTED                       0x00000004
2456 #define PDCAP_D3_SUPPORTED                       0x00000008
2457 #define PDCAP_WAKE_FROM_D0_SUPPORTED             0x00000010
2458 #define PDCAP_WAKE_FROM_D1_SUPPORTED             0x00000020
2459 #define PDCAP_WAKE_FROM_D2_SUPPORTED             0x00000040
2460 #define PDCAP_WAKE_FROM_D3_SUPPORTED             0x00000080
2461 #define PDCAP_WARM_EJECT_SUPPORTED               0x00000100
2462 
2463 typedef struct CM_Power_Data_s {
2464   ULONG PD_Size;
2465   DEVICE_POWER_STATE PD_MostRecentPowerState;
2466   ULONG PD_Capabilities;
2467   ULONG PD_D1Latency;
2468   ULONG PD_D2Latency;
2469   ULONG PD_D3Latency;
2470   DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
2471   SYSTEM_POWER_STATE PD_DeepestSystemWake;
2472 } CM_POWER_DATA, *PCM_POWER_DATA;
2473 
2474 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2475 
2476 typedef enum _SYSTEM_POWER_CONDITION {
2477   PoAc,
2478   PoDc,
2479   PoHot,
2480   PoConditionMaximum
2481 } SYSTEM_POWER_CONDITION;
2482 
2483 typedef struct _SET_POWER_SETTING_VALUE {
2484   ULONG Version;
2485   GUID Guid;
2486   SYSTEM_POWER_CONDITION PowerCondition;
2487   ULONG DataLength;
2488   UCHAR Data[ANYSIZE_ARRAY];
2489 } SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE;
2490 
2491 #define POWER_SETTING_VALUE_VERSION              (0x1)
2492 
2493 typedef struct _NOTIFY_USER_POWER_SETTING {
2494   GUID Guid;
2495 } NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;
2496 
2497 typedef struct _APPLICATIONLAUNCH_SETTING_VALUE {
2498   LARGE_INTEGER ActivationTime;
2499   ULONG Flags;
2500   ULONG ButtonInstanceID;
2501 } APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE;
2502 
2503 typedef enum _POWER_PLATFORM_ROLE {
2504   PlatformRoleUnspecified = 0,
2505   PlatformRoleDesktop,
2506   PlatformRoleMobile,
2507   PlatformRoleWorkstation,
2508   PlatformRoleEnterpriseServer,
2509   PlatformRoleSOHOServer,
2510   PlatformRoleAppliancePC,
2511   PlatformRolePerformanceServer,
2512   PlatformRoleMaximum
2513 } POWER_PLATFORM_ROLE;
2514 
2515 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
2516 typedef struct {
2517   ULONG Granularity;
2518   ULONG Capacity;
2519 } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
2520 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
2521 
2522 #endif /* !_PO_DDK_ */
2523 
2524 #define CORE_PARKING_POLICY_CHANGE_IDEAL         0
2525 #define CORE_PARKING_POLICY_CHANGE_SINGLE        1
2526 #define CORE_PARKING_POLICY_CHANGE_ROCKET        2
2527 #define CORE_PARKING_POLICY_CHANGE_MAX           CORE_PARKING_POLICY_CHANGE_ROCKET
2528 
2529 DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
2530 DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
2531 DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
2532 DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
2533 DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
2534 DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
2535 DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
2536 DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
2537 DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
2538 DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
2539 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
2540 DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
2541 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
2542 DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
2543 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
2544 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
2545 DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
2546 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
2547 DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
2548 DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
2549 DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
2550 DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
2551 DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
2552 DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
2553 DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
2554 DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
2555 DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
2556 DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
2557 DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
2558 DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
2559 DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
2560 DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION,  0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
2561 DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
2562 DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
2563 DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
2564 DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
2565 DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
2566 DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
2567 DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
2568 DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
2569 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
2570 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
2571 DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
2572 DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
2573 DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
2574 DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
2575 DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
2576 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
2577 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
2578 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
2579 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
2580 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
2581 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
2582 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
2583 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
2584 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
2585 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
2586 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
2587 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
2588 DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
2589 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
2590 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
2591 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
2592 DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
2593 DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
2594 DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
2595 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
2596 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
2597 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
2598 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
2599 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
2600 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_TIME, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
2601 DEFINE_GUID(GUID_PROCESSOR_PERF_TIME_CHECK, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
2602 DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY, 0x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
2603 DEFINE_GUID(GUID_PROCESSOR_IDLE_ALLOW_SCALING, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
2604 DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
2605 DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
2606 DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
2607 DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
2608 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
2609 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
2610 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
2611 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
2612 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MAX_CORES, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
2613 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MIN_CORES, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
2614 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
2615 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
2616 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
2617 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
2618 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
2619 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
2620 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
2621 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
2622 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
2623 DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
2624 DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
2625 DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
2626 DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
2627 DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
2628 DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
2629 DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
2630 DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE,  0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
2631 DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
2632 DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
2633 DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
2634 DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
2635 DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
2636 DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
2637 DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
2638 
2639 #define PERFSTATE_POLICY_CHANGE_IDEAL            0
2640 #define PERFSTATE_POLICY_CHANGE_SINGLE           1
2641 #define PERFSTATE_POLICY_CHANGE_ROCKET           2
2642 #define PERFSTATE_POLICY_CHANGE_MAX              PERFSTATE_POLICY_CHANGE_ROCKET
2643 
2644 #define PROCESSOR_PERF_BOOST_POLICY_DISABLED     0
2645 #define PROCESSOR_PERF_BOOST_POLICY_MAX          100
2646 
2647 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE     0
2648 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE    1
2649 
2650 typedef VOID
2651 (NTAPI REQUEST_POWER_COMPLETE)(
2652   IN struct _DEVICE_OBJECT *DeviceObject,
2653   IN UCHAR MinorFunction,
2654   IN POWER_STATE PowerState,
2655   IN PVOID Context,
2656   IN struct _IO_STATUS_BLOCK *IoStatus);
2657 typedef REQUEST_POWER_COMPLETE *PREQUEST_POWER_COMPLETE;
2658 
2659 typedef
2660 NTSTATUS
2661 (NTAPI POWER_SETTING_CALLBACK)(
2662   IN LPCGUID SettingGuid,
2663   IN PVOID Value,
2664   IN ULONG ValueLength,
2665   IN OUT PVOID Context OPTIONAL);
2666 typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
2667 
2668 DECLARE_HANDLE(POHANDLE);
2669 
2670 #define PO_FX_VERSION_V1 1
2671 #define PO_FX_VERSION_V2 2
2672 #define PO_FX_VERSION PO_FX_VERSION_V2
2673 
2674 typedef void (NTAPI PO_FX_COMPONENT_ACTIVE_CONDITION_CALLBACK)(void *context, ULONG component);
2675 typedef PO_FX_COMPONENT_ACTIVE_CONDITION_CALLBACK *PPO_FX_COMPONENT_ACTIVE_CONDITION_CALLBACK;
2676 
2677 typedef void (NTAPI PO_FX_COMPONENT_IDLE_CONDITION_CALLBACK)(void *context, ULONG component);
2678 typedef PO_FX_COMPONENT_IDLE_CONDITION_CALLBACK *PPO_FX_COMPONENT_IDLE_CONDITION_CALLBACK;
2679 
2680 typedef void (NTAPI PO_FX_COMPONENT_IDLE_STATE_CALLBACK)(void *context, ULONG component, ULONG state);
2681 typedef PO_FX_COMPONENT_IDLE_STATE_CALLBACK *PPO_FX_COMPONENT_IDLE_STATE_CALLBACK;
2682 
2683 typedef NTSTATUS (NTAPI PO_FX_POWER_CONTROL_CALLBACK)(void *context, const GUID *code, void *in, SIZE_T in_size, void *out, SIZE_T out_size, SIZE_T *ret_size);
2684 typedef PO_FX_POWER_CONTROL_CALLBACK *PPO_FX_POWER_CONTROL_CALLBACK;
2685 
2686 typedef struct _PO_FX_COMPONENT_IDLE_STATE
2687 {
2688     ULONGLONG TransitionLatency;
2689     ULONGLONG ResidencyRequirement;
2690     ULONG NominalPower;
2691 } PO_FX_COMPONENT_IDLE_STATE, *PPO_FX_COMPONENT_IDLE_STATE;
2692 
2693 typedef struct _PO_FX_COMPONENT_V1
2694 {
2695     GUID Id;
2696     ULONG IdleStateCount;
2697     ULONG DeepestWakeableIdleState;
2698     PO_FX_COMPONENT_IDLE_STATE *IdleStates;
2699 } PO_FX_COMPONENT_V1, *PPO_FX_COMPONENT_V1;
2700 
2701 typedef struct _PO_FX_COMPONENT_V2
2702 {
2703     GUID Id;
2704     ULONGLONG Flags;
2705     ULONG DeepestWakeableIdleState;
2706     ULONG IdleStateCount;
2707     PO_FX_COMPONENT_IDLE_STATE *IdleStates;
2708     ULONG ProviderCount;
2709     ULONG *Providers;
2710 } PO_FX_COMPONENT_V2, *PPO_FX_COMPONENT_V2;
2711 
2712 #if PO_FX_VERSION == PO_FX_VERSION_V1
2713 typedef PO_FX_COMPONENT_V1 PO_FX_COMPONENT, *PPO_FX_COMPONENT;
2714 #else
2715 typedef PO_FX_COMPONENT_V2 PO_FX_COMPONENT, *PPO_FX_COMPONENT;
2716 #endif
2717 
2718 /******************************************************************************
2719  *                            Configuration Manager Types                     *
2720  ******************************************************************************/
2721 
2722 /* Resource list definitions */
2723 typedef int CM_RESOURCE_TYPE;
2724 
2725 #define CmResourceTypeNull              0
2726 #define CmResourceTypePort              1
2727 #define CmResourceTypeInterrupt         2
2728 #define CmResourceTypeMemory            3
2729 #define CmResourceTypeDma               4
2730 #define CmResourceTypeDeviceSpecific    5
2731 #define CmResourceTypeBusNumber         6
2732 #define CmResourceTypeNonArbitrated     128
2733 #define CmResourceTypeConfigData        128
2734 #define CmResourceTypeDevicePrivate     129
2735 #define CmResourceTypePcCardConfig      130
2736 #define CmResourceTypeMfCardConfig      131
2737 
2738 /* KEY_VALUE_Xxx.Type */
2739 #define REG_NONE                           0
2740 #define REG_SZ                             1
2741 #define REG_EXPAND_SZ                      2
2742 #define REG_BINARY                         3
2743 #define REG_DWORD                          4
2744 #define REG_DWORD_LITTLE_ENDIAN            4
2745 #define REG_DWORD_BIG_ENDIAN               5
2746 #define REG_LINK                           6
2747 #define REG_MULTI_SZ                       7
2748 #define REG_RESOURCE_LIST                  8
2749 #define REG_FULL_RESOURCE_DESCRIPTOR       9
2750 #define REG_RESOURCE_REQUIREMENTS_LIST     10
2751 #define REG_QWORD                          11
2752 #define REG_QWORD_LITTLE_ENDIAN            11
2753 
2754 /* Registry Access Rights */
2755 #define KEY_QUERY_VALUE         (0x0001)
2756 #define KEY_SET_VALUE           (0x0002)
2757 #define KEY_CREATE_SUB_KEY      (0x0004)
2758 #define KEY_ENUMERATE_SUB_KEYS  (0x0008)
2759 #define KEY_NOTIFY              (0x0010)
2760 #define KEY_CREATE_LINK         (0x0020)
2761 #define KEY_WOW64_32KEY         (0x0200)
2762 #define KEY_WOW64_64KEY         (0x0100)
2763 #define KEY_WOW64_RES           (0x0300)
2764 
2765 #define KEY_READ                ((STANDARD_RIGHTS_READ       |\
2766                                   KEY_QUERY_VALUE            |\
2767                                   KEY_ENUMERATE_SUB_KEYS     |\
2768                                   KEY_NOTIFY)                 \
2769                                   &                           \
2770                                  (~SYNCHRONIZE))
2771 
2772 #define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
2773                                   KEY_SET_VALUE              |\
2774                                   KEY_CREATE_SUB_KEY)         \
2775                                   &                           \
2776                                  (~SYNCHRONIZE))
2777 
2778 #define KEY_EXECUTE             ((KEY_READ)                   \
2779                                   &                           \
2780                                  (~SYNCHRONIZE))
2781 
2782 #define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
2783                                   KEY_QUERY_VALUE            |\
2784                                   KEY_SET_VALUE              |\
2785                                   KEY_CREATE_SUB_KEY         |\
2786                                   KEY_ENUMERATE_SUB_KEYS     |\
2787                                   KEY_NOTIFY                 |\
2788                                   KEY_CREATE_LINK)            \
2789                                   &                           \
2790                                  (~SYNCHRONIZE))
2791 
2792 /* Registry Open/Create Options */
2793 #define REG_OPTION_RESERVED         (0x00000000L)
2794 #define REG_OPTION_NON_VOLATILE     (0x00000000L)
2795 #define REG_OPTION_VOLATILE         (0x00000001L)
2796 #define REG_OPTION_CREATE_LINK      (0x00000002L)
2797 #define REG_OPTION_BACKUP_RESTORE   (0x00000004L)
2798 #define REG_OPTION_OPEN_LINK        (0x00000008L)
2799 
2800 #define REG_LEGAL_OPTION            \
2801                 (REG_OPTION_RESERVED            |\
2802                  REG_OPTION_NON_VOLATILE        |\
2803                  REG_OPTION_VOLATILE            |\
2804                  REG_OPTION_CREATE_LINK         |\
2805                  REG_OPTION_BACKUP_RESTORE      |\
2806                  REG_OPTION_OPEN_LINK)
2807 
2808 #define REG_OPEN_LEGAL_OPTION       \
2809                 (REG_OPTION_RESERVED            |\
2810                  REG_OPTION_BACKUP_RESTORE      |\
2811                  REG_OPTION_OPEN_LINK)
2812 
2813 #define REG_STANDARD_FORMAT            1
2814 #define REG_LATEST_FORMAT              2
2815 #define REG_NO_COMPRESSION             4
2816 
2817 /* Key creation/open disposition */
2818 #define REG_CREATED_NEW_KEY         (0x00000001L)
2819 #define REG_OPENED_EXISTING_KEY     (0x00000002L)
2820 
2821 /* Key restore & hive load flags */
2822 #define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)
2823 #define REG_REFRESH_HIVE                (0x00000002L)
2824 #define REG_NO_LAZY_FLUSH               (0x00000004L)
2825 #define REG_FORCE_RESTORE               (0x00000008L)
2826 #define REG_APP_HIVE                    (0x00000010L)
2827 #define REG_PROCESS_PRIVATE             (0x00000020L)
2828 #define REG_START_JOURNAL               (0x00000040L)
2829 #define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)
2830 #define REG_HIVE_NO_RM                  (0x00000100L)
2831 #define REG_HIVE_SINGLE_LOG             (0x00000200L)
2832 #define REG_BOOT_HIVE                   (0x00000400L)
2833 
2834 /* Unload Flags */
2835 #define REG_FORCE_UNLOAD            1
2836 
2837 /* Notify Filter Values */
2838 #define REG_NOTIFY_CHANGE_NAME          (0x00000001L)
2839 #define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)
2840 #define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L)
2841 #define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)
2842 
2843 #define REG_LEGAL_CHANGE_FILTER                 \
2844                 (REG_NOTIFY_CHANGE_NAME          |\
2845                  REG_NOTIFY_CHANGE_ATTRIBUTES    |\
2846                  REG_NOTIFY_CHANGE_LAST_SET      |\
2847                  REG_NOTIFY_CHANGE_SECURITY)
2848 
2849 #include <pshpack4.h>
2850 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
2851   UCHAR Type;
2852   UCHAR ShareDisposition;
2853   USHORT Flags;
2854   union {
2855     struct {
2856       PHYSICAL_ADDRESS Start;
2857       ULONG Length;
2858     } Generic;
2859     struct {
2860       PHYSICAL_ADDRESS Start;
2861       ULONG Length;
2862     } Port;
2863     struct {
2864 #if defined(NT_PROCESSOR_GROUPS)
2865       USHORT Level;
2866       USHORT Group;
2867 #else
2868       ULONG Level;
2869 #endif
2870       ULONG Vector;
2871       KAFFINITY Affinity;
2872     } Interrupt;
2873 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2874     struct {
2875       _ANONYMOUS_UNION union {
2876         struct {
2877 #if defined(NT_PROCESSOR_GROUPS)
2878           USHORT Group;
2879 #else
2880           USHORT Reserved;
2881 #endif
2882           USHORT MessageCount;
2883           ULONG Vector;
2884           KAFFINITY Affinity;
2885         } Raw;
2886         struct {
2887 #if defined(NT_PROCESSOR_GROUPS)
2888           USHORT Level;
2889           USHORT Group;
2890 #else
2891           ULONG Level;
2892 #endif
2893           ULONG Vector;
2894           KAFFINITY Affinity;
2895         } Translated;
2896       } DUMMYUNIONNAME;
2897     } MessageInterrupt;
2898 #endif
2899     struct {
2900       PHYSICAL_ADDRESS Start;
2901       ULONG Length;
2902     } Memory;
2903     struct {
2904       ULONG Channel;
2905       ULONG Port;
2906       ULONG Reserved1;
2907     } Dma;
2908     struct {
2909       ULONG Data[3];
2910     } DevicePrivate;
2911     struct {
2912       ULONG Start;
2913       ULONG Length;
2914       ULONG Reserved;
2915     } BusNumber;
2916     struct {
2917       ULONG DataSize;
2918       ULONG Reserved1;
2919       ULONG Reserved2;
2920     } DeviceSpecificData;
2921 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2922     struct {
2923       PHYSICAL_ADDRESS Start;
2924       ULONG Length40;
2925     } Memory40;
2926     struct {
2927       PHYSICAL_ADDRESS Start;
2928       ULONG Length48;
2929     } Memory48;
2930     struct {
2931       PHYSICAL_ADDRESS Start;
2932       ULONG Length64;
2933     } Memory64;
2934 #endif
2935   } u;
2936 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
2937 #include <poppack.h>
2938 
2939 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
2940 #define CmResourceTypeNull                0
2941 #define CmResourceTypePort                1
2942 #define CmResourceTypeInterrupt           2
2943 #define CmResourceTypeMemory              3
2944 #define CmResourceTypeDma                 4
2945 #define CmResourceTypeDeviceSpecific      5
2946 #define CmResourceTypeBusNumber           6
2947 #define CmResourceTypeMemoryLarge         7
2948 #define CmResourceTypeNonArbitrated       128
2949 #define CmResourceTypeConfigData          128
2950 #define CmResourceTypeDevicePrivate       129
2951 #define CmResourceTypePcCardConfig        130
2952 #define CmResourceTypeMfCardConfig        131
2953 
2954 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
2955 typedef enum _CM_SHARE_DISPOSITION {
2956   CmResourceShareUndetermined = 0,
2957   CmResourceShareDeviceExclusive,
2958   CmResourceShareDriverExclusive,
2959   CmResourceShareShared
2960 } CM_SHARE_DISPOSITION;
2961 
2962 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
2963 #define CM_RESOURCE_PORT_MEMORY           0x0000
2964 #define CM_RESOURCE_PORT_IO               0x0001
2965 #define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
2966 #define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
2967 #define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
2968 #define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
2969 #define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
2970 #define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
2971 #define CM_RESOURCE_PORT_BAR              0x0100
2972 
2973 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
2974 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
2975 #define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
2976 #define CM_RESOURCE_INTERRUPT_MESSAGE         0x0002
2977 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
2978 
2979 #define CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS 0x0001
2980 
2981 #define CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN   ((ULONG)-2)
2982 
2983 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
2984 #define CM_RESOURCE_MEMORY_READ_WRITE                    0x0000
2985 #define CM_RESOURCE_MEMORY_READ_ONLY                     0x0001
2986 #define CM_RESOURCE_MEMORY_WRITE_ONLY                    0x0002
2987 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK             0x0003
2988 #define CM_RESOURCE_MEMORY_PREFETCHABLE                  0x0004
2989 #define CM_RESOURCE_MEMORY_COMBINEDWRITE                 0x0008
2990 #define CM_RESOURCE_MEMORY_24                            0x0010
2991 #define CM_RESOURCE_MEMORY_CACHEABLE                     0x0020
2992 #define CM_RESOURCE_MEMORY_WINDOW_DECODE                 0x0040
2993 #define CM_RESOURCE_MEMORY_BAR                           0x0080
2994 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
2995 
2996 #define CM_RESOURCE_MEMORY_LARGE                         0x0E00
2997 #define CM_RESOURCE_MEMORY_LARGE_40                      0x0200
2998 #define CM_RESOURCE_MEMORY_LARGE_48                      0x0400
2999 #define CM_RESOURCE_MEMORY_LARGE_64                      0x0800
3000 
3001 #define CM_RESOURCE_MEMORY_LARGE_40_MAXLEN               0x000000FFFFFFFF00
3002 #define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN               0x0000FFFFFFFF0000
3003 #define CM_RESOURCE_MEMORY_LARGE_64_MAXLEN               0xFFFFFFFF00000000
3004 
3005 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
3006 #define CM_RESOURCE_DMA_8                 0x0000
3007 #define CM_RESOURCE_DMA_16                0x0001
3008 #define CM_RESOURCE_DMA_32                0x0002
3009 #define CM_RESOURCE_DMA_8_AND_16          0x0004
3010 #define CM_RESOURCE_DMA_BUS_MASTER        0x0008
3011 #define CM_RESOURCE_DMA_TYPE_A            0x0010
3012 #define CM_RESOURCE_DMA_TYPE_B            0x0020
3013 #define CM_RESOURCE_DMA_TYPE_F            0x0040
3014 
3015 typedef struct _DEVICE_FLAGS {
3016   ULONG Failed:1;
3017   ULONG ReadOnly:1;
3018   ULONG Removable:1;
3019   ULONG ConsoleIn:1;
3020   ULONG ConsoleOut:1;
3021   ULONG Input:1;
3022   ULONG Output:1;
3023 } DEVICE_FLAGS, *PDEVICE_FLAGS;
3024 
3025 typedef enum _INTERFACE_TYPE {
3026   InterfaceTypeUndefined = -1,
3027   Internal,
3028   Isa,
3029   Eisa,
3030   MicroChannel,
3031   TurboChannel,
3032   PCIBus,
3033   VMEBus,
3034   NuBus,
3035   PCMCIABus,
3036   CBus,
3037   MPIBus,
3038   MPSABus,
3039   ProcessorInternal,
3040   InternalPowerBus,
3041   PNPISABus,
3042   PNPBus,
3043   Vmcs,
3044   MaximumInterfaceType
3045 } INTERFACE_TYPE, *PINTERFACE_TYPE;
3046 
3047 typedef struct _CM_COMPONENT_INFORMATION {
3048   DEVICE_FLAGS Flags;
3049   ULONG Version;
3050   ULONG Key;
3051   KAFFINITY AffinityMask;
3052 } CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION;
3053 
3054 typedef struct _CM_ROM_BLOCK {
3055   ULONG Address;
3056   ULONG Size;
3057 } CM_ROM_BLOCK, *PCM_ROM_BLOCK;
3058 
3059 typedef struct _CM_PARTIAL_RESOURCE_LIST {
3060   USHORT Version;
3061   USHORT Revision;
3062   ULONG Count;
3063   CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
3064 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
3065 
3066 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
3067   INTERFACE_TYPE InterfaceType;
3068   ULONG BusNumber;
3069   CM_PARTIAL_RESOURCE_LIST PartialResourceList;
3070 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
3071 
3072 typedef struct _CM_RESOURCE_LIST {
3073   ULONG Count;
3074   CM_FULL_RESOURCE_DESCRIPTOR List[1];
3075 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
3076 
3077 typedef struct _PNP_BUS_INFORMATION {
3078   GUID BusTypeGuid;
3079   INTERFACE_TYPE LegacyBusType;
3080   ULONG BusNumber;
3081 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
3082 
3083 #include <pshpack1.h>
3084 
3085 typedef struct _CM_INT13_DRIVE_PARAMETER {
3086   USHORT DriveSelect;
3087   ULONG MaxCylinders;
3088   USHORT SectorsPerTrack;
3089   USHORT MaxHeads;
3090   USHORT NumberDrives;
3091 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
3092 
3093 typedef struct _CM_MCA_POS_DATA {
3094   USHORT AdapterId;
3095   UCHAR PosData1;
3096   UCHAR PosData2;
3097   UCHAR PosData3;
3098   UCHAR PosData4;
3099 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
3100 
3101 typedef struct _CM_PNP_BIOS_DEVICE_NODE {
3102   USHORT Size;
3103   UCHAR Node;
3104   ULONG ProductId;
3105   UCHAR DeviceType[3];
3106   USHORT DeviceAttributes;
3107 } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
3108 
3109 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
3110   UCHAR Signature[4];
3111   UCHAR Revision;
3112   UCHAR Length;
3113   USHORT ControlField;
3114   UCHAR Checksum;
3115   ULONG EventFlagAddress;
3116   USHORT RealModeEntryOffset;
3117   USHORT RealModeEntrySegment;
3118   USHORT ProtectedModeEntryOffset;
3119   ULONG ProtectedModeCodeBaseAddress;
3120   ULONG OemDeviceId;
3121   USHORT RealModeDataBaseAddress;
3122   ULONG ProtectedModeDataBaseAddress;
3123 } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
3124 
3125 #include <poppack.h>
3126 
3127 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
3128   ULONG BytesPerSector;
3129   ULONG NumberOfCylinders;
3130   ULONG SectorsPerTrack;
3131   ULONG NumberOfHeads;
3132 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
3133 
3134 typedef struct _CM_KEYBOARD_DEVICE_DATA {
3135   USHORT Version;
3136   USHORT Revision;
3137   UCHAR Type;
3138   UCHAR Subtype;
3139   USHORT KeyboardFlags;
3140 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
3141 
3142 typedef struct _CM_SCSI_DEVICE_DATA {
3143   USHORT Version;
3144   USHORT Revision;
3145   UCHAR HostIdentifier;
3146 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
3147 
3148 typedef struct _CM_VIDEO_DEVICE_DATA {
3149   USHORT Version;
3150   USHORT Revision;
3151   ULONG VideoClock;
3152 } CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA;
3153 
3154 typedef struct _CM_SONIC_DEVICE_DATA {
3155   USHORT Version;
3156   USHORT Revision;
3157   USHORT DataConfigurationRegister;
3158   UCHAR EthernetAddress[8];
3159 } CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA;
3160 
3161 typedef struct _CM_SERIAL_DEVICE_DATA {
3162   USHORT Version;
3163   USHORT Revision;
3164   ULONG BaudClock;
3165 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
3166 
3167 typedef struct _CM_MONITOR_DEVICE_DATA {
3168   USHORT Version;
3169   USHORT Revision;
3170   USHORT HorizontalScreenSize;
3171   USHORT VerticalScreenSize;
3172   USHORT HorizontalResolution;
3173   USHORT VerticalResolution;
3174   USHORT HorizontalDisplayTimeLow;
3175   USHORT HorizontalDisplayTime;
3176   USHORT HorizontalDisplayTimeHigh;
3177   USHORT HorizontalBackPorchLow;
3178   USHORT HorizontalBackPorch;
3179   USHORT HorizontalBackPorchHigh;
3180   USHORT HorizontalFrontPorchLow;
3181   USHORT HorizontalFrontPorch;
3182   USHORT HorizontalFrontPorchHigh;
3183   USHORT HorizontalSyncLow;
3184   USHORT HorizontalSync;
3185   USHORT HorizontalSyncHigh;
3186   USHORT VerticalBackPorchLow;
3187   USHORT VerticalBackPorch;
3188   USHORT VerticalBackPorchHigh;
3189   USHORT VerticalFrontPorchLow;
3190   USHORT VerticalFrontPorch;
3191   USHORT VerticalFrontPorchHigh;
3192   USHORT VerticalSyncLow;
3193   USHORT VerticalSync;
3194   USHORT VerticalSyncHigh;
3195 } CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA;
3196 
3197 typedef struct _CM_FLOPPY_DEVICE_DATA {
3198   USHORT Version;
3199   USHORT Revision;
3200   CHAR Size[8];
3201   ULONG MaxDensity;
3202   ULONG MountDensity;
3203   UCHAR StepRateHeadUnloadTime;
3204   UCHAR HeadLoadTime;
3205   UCHAR MotorOffTime;
3206   UCHAR SectorLengthCode;
3207   UCHAR SectorPerTrack;
3208   UCHAR ReadWriteGapLength;
3209   UCHAR DataTransferLength;
3210   UCHAR FormatGapLength;
3211   UCHAR FormatFillCharacter;
3212   UCHAR HeadSettleTime;
3213   UCHAR MotorSettleTime;
3214   UCHAR MaximumTrackValue;
3215   UCHAR DataTransferRate;
3216 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
3217 
3218 typedef enum _KEY_INFORMATION_CLASS {
3219   KeyBasicInformation,
3220   KeyNodeInformation,
3221   KeyFullInformation,
3222   KeyNameInformation,
3223   KeyCachedInformation,
3224   KeyFlagsInformation,
3225   KeyVirtualizationInformation,
3226   KeyHandleTagsInformation,
3227   MaxKeyInfoClass
3228 } KEY_INFORMATION_CLASS;
3229 
3230 typedef struct _KEY_BASIC_INFORMATION {
3231   LARGE_INTEGER LastWriteTime;
3232   ULONG TitleIndex;
3233   ULONG NameLength;
3234   WCHAR Name[1];
3235 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
3236 
3237 typedef struct _KEY_CONTROL_FLAGS_INFORMATION {
3238   ULONG ControlFlags;
3239 } KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION;
3240 
3241 typedef struct _KEY_FULL_INFORMATION {
3242   LARGE_INTEGER LastWriteTime;
3243   ULONG TitleIndex;
3244   ULONG ClassOffset;
3245   ULONG ClassLength;
3246   ULONG SubKeys;
3247   ULONG MaxNameLen;
3248   ULONG MaxClassLen;
3249   ULONG Values;
3250   ULONG MaxValueNameLen;
3251   ULONG MaxValueDataLen;
3252   WCHAR Class[1];
3253 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
3254 
3255 typedef struct _KEY_HANDLE_TAGS_INFORMATION {
3256   ULONG HandleTags;
3257 } KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION;
3258 
3259 typedef struct _KEY_NODE_INFORMATION {
3260   LARGE_INTEGER LastWriteTime;
3261   ULONG TitleIndex;
3262   ULONG ClassOffset;
3263   ULONG ClassLength;
3264   ULONG NameLength;
3265   WCHAR Name[1];
3266 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
3267 
3268 typedef enum _KEY_SET_INFORMATION_CLASS {
3269   KeyWriteTimeInformation,
3270   KeyWow64FlagsInformation,
3271   KeyControlFlagsInformation,
3272   KeySetVirtualizationInformation,
3273   KeySetDebugInformation,
3274   KeySetHandleTagsInformation,
3275   MaxKeySetInfoClass
3276 } KEY_SET_INFORMATION_CLASS;
3277 
3278 typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION {
3279   ULONG VirtualTarget:1;
3280   ULONG VirtualStore:1;
3281   ULONG VirtualSource:1;
3282   ULONG Reserved:29;
3283 } KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION;
3284 
3285 typedef struct _KEY_VALUE_BASIC_INFORMATION {
3286   ULONG TitleIndex;
3287   ULONG Type;
3288   ULONG NameLength;
3289   WCHAR Name[1];
3290 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
3291 
3292 typedef struct _KEY_VALUE_FULL_INFORMATION {
3293   ULONG TitleIndex;
3294   ULONG Type;
3295   ULONG DataOffset;
3296   ULONG DataLength;
3297   ULONG NameLength;
3298   WCHAR Name[1];
3299 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
3300 
3301 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
3302   ULONG TitleIndex;
3303   ULONG Type;
3304   ULONG DataLength;
3305   UCHAR Data[1];
3306 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
3307 
3308 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
3309   ULONG Type;
3310   ULONG DataLength;
3311   UCHAR Data[1];
3312 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
3313 
3314 typedef struct _KEY_VALUE_ENTRY {
3315   PUNICODE_STRING ValueName;
3316   ULONG DataLength;
3317   ULONG DataOffset;
3318   ULONG Type;
3319 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
3320 
3321 typedef enum _KEY_VALUE_INFORMATION_CLASS {
3322   KeyValueBasicInformation,
3323   KeyValueFullInformation,
3324   KeyValuePartialInformation,
3325   KeyValueFullInformationAlign64,
3326   KeyValuePartialInformationAlign64
3327 } KEY_VALUE_INFORMATION_CLASS;
3328 
3329 typedef struct _KEY_WOW64_FLAGS_INFORMATION {
3330   ULONG UserFlags;
3331 } KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION;
3332 
3333 typedef struct _KEY_WRITE_TIME_INFORMATION {
3334   LARGE_INTEGER LastWriteTime;
3335 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
3336 
3337 typedef enum _REG_NOTIFY_CLASS {
3338   RegNtDeleteKey,
3339   RegNtPreDeleteKey = RegNtDeleteKey,
3340   RegNtSetValueKey,
3341   RegNtPreSetValueKey = RegNtSetValueKey,
3342   RegNtDeleteValueKey,
3343   RegNtPreDeleteValueKey = RegNtDeleteValueKey,
3344   RegNtSetInformationKey,
3345   RegNtPreSetInformationKey = RegNtSetInformationKey,
3346   RegNtRenameKey,
3347   RegNtPreRenameKey = RegNtRenameKey,
3348   RegNtEnumerateKey,
3349   RegNtPreEnumerateKey = RegNtEnumerateKey,
3350   RegNtEnumerateValueKey,
3351   RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
3352   RegNtQueryKey,
3353   RegNtPreQueryKey = RegNtQueryKey,
3354   RegNtQueryValueKey,
3355   RegNtPreQueryValueKey = RegNtQueryValueKey,
3356   RegNtQueryMultipleValueKey,
3357   RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
3358   RegNtPreCreateKey,
3359   RegNtPostCreateKey,
3360   RegNtPreOpenKey,
3361   RegNtPostOpenKey,
3362   RegNtKeyHandleClose,
3363   RegNtPreKeyHandleClose = RegNtKeyHandleClose,
3364   RegNtPostDeleteKey,
3365   RegNtPostSetValueKey,
3366   RegNtPostDeleteValueKey,
3367   RegNtPostSetInformationKey,
3368   RegNtPostRenameKey,
3369   RegNtPostEnumerateKey,
3370   RegNtPostEnumerateValueKey,
3371   RegNtPostQueryKey,
3372   RegNtPostQueryValueKey,
3373   RegNtPostQueryMultipleValueKey,
3374   RegNtPostKeyHandleClose,
3375   RegNtPreCreateKeyEx,
3376   RegNtPostCreateKeyEx,
3377   RegNtPreOpenKeyEx,
3378   RegNtPostOpenKeyEx,
3379   RegNtPreFlushKey,
3380   RegNtPostFlushKey,
3381   RegNtPreLoadKey,
3382   RegNtPostLoadKey,
3383   RegNtPreUnLoadKey,
3384   RegNtPostUnLoadKey,
3385   RegNtPreQueryKeySecurity,
3386   RegNtPostQueryKeySecurity,
3387   RegNtPreSetKeySecurity,
3388   RegNtPostSetKeySecurity,
3389   RegNtCallbackObjectContextCleanup,
3390   RegNtPreRestoreKey,
3391   RegNtPostRestoreKey,
3392   RegNtPreSaveKey,
3393   RegNtPostSaveKey,
3394   RegNtPreReplaceKey,
3395   RegNtPostReplaceKey,
3396   MaxRegNtNotifyClass
3397 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
3398 
3399 typedef NTSTATUS
3400 (NTAPI EX_CALLBACK_FUNCTION)(
3401   IN PVOID CallbackContext,
3402   IN PVOID Argument1,
3403   IN PVOID Argument2);
3404 typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION;
3405 
3406 typedef struct _REG_DELETE_KEY_INFORMATION {
3407   PVOID Object;
3408   PVOID CallContext;
3409   PVOID ObjectContext;
3410   PVOID Reserved;
3411 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
3412 #if (NTDDI_VERSION >= NTDDI_VISTA)
3413 , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
3414 #endif
3415 ;
3416 
3417 typedef struct _REG_SET_VALUE_KEY_INFORMATION {
3418   PVOID Object;
3419   PUNICODE_STRING ValueName;
3420   ULONG TitleIndex;
3421   ULONG Type;
3422   PVOID Data;
3423   ULONG DataSize;
3424   PVOID CallContext;
3425   PVOID ObjectContext;
3426   PVOID Reserved;
3427 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
3428 
3429 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
3430   PVOID Object;
3431   PUNICODE_STRING ValueName;
3432   PVOID CallContext;
3433   PVOID ObjectContext;
3434   PVOID Reserved;
3435 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
3436 
3437 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
3438   PVOID Object;
3439   KEY_SET_INFORMATION_CLASS KeySetInformationClass;
3440   PVOID KeySetInformation;
3441   ULONG KeySetInformationLength;
3442   PVOID CallContext;
3443   PVOID ObjectContext;
3444   PVOID Reserved;
3445 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
3446 
3447 typedef struct _REG_ENUMERATE_KEY_INFORMATION {
3448   PVOID Object;
3449   ULONG Index;
3450   KEY_INFORMATION_CLASS KeyInformationClass;
3451   PVOID KeyInformation;
3452   ULONG Length;
3453   PULONG ResultLength;
3454   PVOID CallContext;
3455   PVOID ObjectContext;
3456   PVOID Reserved;
3457 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
3458 
3459 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
3460   PVOID Object;
3461   ULONG Index;
3462   KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3463   PVOID KeyValueInformation;
3464   ULONG Length;
3465   PULONG ResultLength;
3466   PVOID CallContext;
3467   PVOID ObjectContext;
3468   PVOID Reserved;
3469 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
3470 
3471 typedef struct _REG_QUERY_KEY_INFORMATION {
3472   PVOID Object;
3473   KEY_INFORMATION_CLASS KeyInformationClass;
3474   PVOID KeyInformation;
3475   ULONG Length;
3476   PULONG ResultLength;
3477   PVOID CallContext;
3478   PVOID ObjectContext;
3479   PVOID Reserved;
3480 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
3481 
3482 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
3483   PVOID Object;
3484   PUNICODE_STRING ValueName;
3485   KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3486   PVOID KeyValueInformation;
3487   ULONG Length;
3488   PULONG ResultLength;
3489   PVOID CallContext;
3490   PVOID ObjectContext;
3491   PVOID Reserved;
3492 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
3493 
3494 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
3495   PVOID Object;
3496   PKEY_VALUE_ENTRY ValueEntries;
3497   ULONG EntryCount;
3498   PVOID ValueBuffer;
3499   PULONG BufferLength;
3500   PULONG RequiredBufferLength;
3501   PVOID CallContext;
3502   PVOID ObjectContext;
3503   PVOID Reserved;
3504 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
3505 
3506 typedef struct _REG_RENAME_KEY_INFORMATION {
3507   PVOID Object;
3508   PUNICODE_STRING NewName;
3509   PVOID CallContext;
3510   PVOID ObjectContext;
3511   PVOID Reserved;
3512 } REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION;
3513 
3514 typedef struct _REG_CREATE_KEY_INFORMATION {
3515   PUNICODE_STRING CompleteName;
3516   PVOID RootObject;
3517   PVOID ObjectType;
3518   ULONG CreateOptions;
3519   PUNICODE_STRING Class;
3520   PVOID SecurityDescriptor;
3521   PVOID SecurityQualityOfService;
3522   ACCESS_MASK DesiredAccess;
3523   ACCESS_MASK GrantedAccess;
3524   PULONG Disposition;
3525   PVOID *ResultObject;
3526   PVOID CallContext;
3527   PVOID RootObjectContext;
3528   PVOID Transaction;
3529   PVOID Reserved;
3530 } REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION;
3531 
3532 typedef struct _REG_CREATE_KEY_INFORMATION_V1 {
3533   PUNICODE_STRING CompleteName;
3534   PVOID RootObject;
3535   PVOID ObjectType;
3536   ULONG Options;
3537   PUNICODE_STRING Class;
3538   PVOID SecurityDescriptor;
3539   PVOID SecurityQualityOfService;
3540   ACCESS_MASK DesiredAccess;
3541   ACCESS_MASK GrantedAccess;
3542   PULONG Disposition;
3543   PVOID *ResultObject;
3544   PVOID CallContext;
3545   PVOID RootObjectContext;
3546   PVOID Transaction;
3547   ULONG_PTR Version;
3548   PUNICODE_STRING RemainingName;
3549   ULONG Wow64Flags;
3550   ULONG Attributes;
3551   KPROCESSOR_MODE CheckAccessMode;
3552 } REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1;
3553 
3554 typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
3555   PUNICODE_STRING CompleteName;
3556 } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;
3557 
3558 typedef struct _REG_POST_CREATE_KEY_INFORMATION {
3559   PUNICODE_STRING CompleteName;
3560   PVOID Object;
3561   NTSTATUS Status;
3562 } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
3563 
3564 typedef struct _REG_POST_OPERATION_INFORMATION {
3565   PVOID Object;
3566   NTSTATUS Status;
3567   PVOID PreInformation;
3568   NTSTATUS ReturnStatus;
3569   PVOID CallContext;
3570   PVOID ObjectContext;
3571   PVOID Reserved;
3572 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
3573 
3574 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
3575   PVOID Object;
3576   PVOID CallContext;
3577   PVOID ObjectContext;
3578   PVOID Reserved;
3579 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
3580 
3581 #if (NTDDI_VERSION >= NTDDI_VISTA)
3582 
3583 typedef struct _REG_LOAD_KEY_INFORMATION {
3584   PVOID Object;
3585   PUNICODE_STRING KeyName;
3586   PUNICODE_STRING SourceFile;
3587   ULONG Flags;
3588   PVOID TrustClassObject;
3589   PVOID UserEvent;
3590   ACCESS_MASK DesiredAccess;
3591   PHANDLE RootHandle;
3592   PVOID CallContext;
3593   PVOID ObjectContext;
3594   PVOID Reserved;
3595 } REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION;
3596 
3597 typedef struct _REG_UNLOAD_KEY_INFORMATION {
3598   PVOID Object;
3599   PVOID UserEvent;
3600   PVOID CallContext;
3601   PVOID ObjectContext;
3602   PVOID Reserved;
3603 } REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION;
3604 
3605 typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION {
3606   PVOID Object;
3607   PVOID ObjectContext;
3608   PVOID Reserved;
3609 } REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION;
3610 
3611 typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION {
3612   PVOID Object;
3613   PSECURITY_INFORMATION SecurityInformation;
3614   PSECURITY_DESCRIPTOR SecurityDescriptor;
3615   PULONG Length;
3616   PVOID CallContext;
3617   PVOID ObjectContext;
3618   PVOID Reserved;
3619 } REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION;
3620 
3621 typedef struct _REG_SET_KEY_SECURITY_INFORMATION {
3622   PVOID Object;
3623   PSECURITY_INFORMATION SecurityInformation;
3624   PSECURITY_DESCRIPTOR SecurityDescriptor;
3625   PVOID CallContext;
3626   PVOID ObjectContext;
3627   PVOID Reserved;
3628 } REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION;
3629 
3630 typedef struct _REG_RESTORE_KEY_INFORMATION {
3631   PVOID Object;
3632   HANDLE FileHandle;
3633   ULONG Flags;
3634   PVOID CallContext;
3635   PVOID ObjectContext;
3636   PVOID Reserved;
3637 } REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION;
3638 
3639 typedef struct _REG_SAVE_KEY_INFORMATION {
3640   PVOID Object;
3641   HANDLE FileHandle;
3642   ULONG Format;
3643   PVOID CallContext;
3644   PVOID ObjectContext;
3645   PVOID Reserved;
3646 } REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION;
3647 
3648 typedef struct _REG_REPLACE_KEY_INFORMATION {
3649   PVOID Object;
3650   PUNICODE_STRING OldFileName;
3651   PUNICODE_STRING NewFileName;
3652   PVOID CallContext;
3653   PVOID ObjectContext;
3654   PVOID Reserved;
3655 } REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION;
3656 
3657 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
3658 
3659 #define SERVICE_KERNEL_DRIVER          0x00000001
3660 #define SERVICE_FILE_SYSTEM_DRIVER     0x00000002
3661 #define SERVICE_ADAPTER                0x00000004
3662 #define SERVICE_RECOGNIZER_DRIVER      0x00000008
3663 
3664 #define SERVICE_DRIVER                 (SERVICE_KERNEL_DRIVER | \
3665                                         SERVICE_FILE_SYSTEM_DRIVER | \
3666                                         SERVICE_RECOGNIZER_DRIVER)
3667 
3668 #define SERVICE_WIN32_OWN_PROCESS      0x00000010
3669 #define SERVICE_WIN32_SHARE_PROCESS    0x00000020
3670 #define SERVICE_WIN32                  (SERVICE_WIN32_OWN_PROCESS | \
3671                                         SERVICE_WIN32_SHARE_PROCESS)
3672 
3673 #define SERVICE_INTERACTIVE_PROCESS    0x00000100
3674 
3675 #define SERVICE_TYPE_ALL               (SERVICE_WIN32  | \
3676                                         SERVICE_ADAPTER | \
3677                                         SERVICE_DRIVER  | \
3678                                         SERVICE_INTERACTIVE_PROCESS)
3679 
3680 /* Service Start Types */
3681 #define SERVICE_BOOT_START             0x00000000
3682 #define SERVICE_SYSTEM_START           0x00000001
3683 #define SERVICE_AUTO_START             0x00000002
3684 #define SERVICE_DEMAND_START           0x00000003
3685 #define SERVICE_DISABLED               0x00000004
3686 
3687 #define SERVICE_ERROR_IGNORE           0x00000000
3688 #define SERVICE_ERROR_NORMAL           0x00000001
3689 #define SERVICE_ERROR_SEVERE           0x00000002
3690 #define SERVICE_ERROR_CRITICAL         0x00000003
3691 
3692 typedef enum _CM_SERVICE_NODE_TYPE {
3693   DriverType = SERVICE_KERNEL_DRIVER,
3694   FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
3695   Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
3696   Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
3697   AdapterType = SERVICE_ADAPTER,
3698   RecognizerType = SERVICE_RECOGNIZER_DRIVER
3699 } SERVICE_NODE_TYPE;
3700 
3701 typedef enum _CM_SERVICE_LOAD_TYPE {
3702   BootLoad = SERVICE_BOOT_START,
3703   SystemLoad = SERVICE_SYSTEM_START,
3704   AutoLoad = SERVICE_AUTO_START,
3705   DemandLoad = SERVICE_DEMAND_START,
3706   DisableLoad = SERVICE_DISABLED
3707 } SERVICE_LOAD_TYPE;
3708 
3709 typedef enum _CM_ERROR_CONTROL_TYPE {
3710   IgnoreError = SERVICE_ERROR_IGNORE,
3711   NormalError = SERVICE_ERROR_NORMAL,
3712   SevereError = SERVICE_ERROR_SEVERE,
3713   CriticalError = SERVICE_ERROR_CRITICAL
3714 } SERVICE_ERROR_TYPE;
3715 
3716 #define CM_SERVICE_NETWORK_BOOT_LOAD      0x00000001
3717 #define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
3718 #define CM_SERVICE_USB_DISK_BOOT_LOAD     0x00000004
3719 
3720 #define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD |       \
3721                                          CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD |  \
3722                                          CM_SERVICE_USB_DISK_BOOT_LOAD)
3723 
3724 
3725 /******************************************************************************
3726  *                         I/O Manager Types                                  *
3727  ******************************************************************************/
3728 
3729 #define STATUS_CONTINUE_COMPLETION      STATUS_SUCCESS
3730 
3731 #define CONNECT_FULLY_SPECIFIED         0x1
3732 #define CONNECT_LINE_BASED              0x2
3733 #define CONNECT_MESSAGE_BASED           0x3
3734 #define CONNECT_FULLY_SPECIFIED_GROUP   0x4
3735 #define CONNECT_CURRENT_VERSION         0x4
3736 
3737 #define POOL_COLD_ALLOCATION                256
3738 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE    8
3739 #define POOL_RAISE_IF_ALLOCATION_FAILURE    16
3740 
3741 #define IO_TYPE_ADAPTER                 1
3742 #define IO_TYPE_CONTROLLER              2
3743 #define IO_TYPE_DEVICE                  3
3744 #define IO_TYPE_DRIVER                  4
3745 #define IO_TYPE_FILE                    5
3746 #define IO_TYPE_IRP                     6
3747 #define IO_TYPE_MASTER_ADAPTER          7
3748 #define IO_TYPE_OPEN_PACKET             8
3749 #define IO_TYPE_TIMER                   9
3750 #define IO_TYPE_VPB                     10
3751 #define IO_TYPE_ERROR_LOG               11
3752 #define IO_TYPE_ERROR_MESSAGE           12
3753 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
3754 
3755 #define IO_TYPE_CSQ_IRP_CONTEXT 1
3756 #define IO_TYPE_CSQ 2
3757 #define IO_TYPE_CSQ_EX 3
3758 
3759 /* IO_RESOURCE_DESCRIPTOR.Option */
3760 #define IO_RESOURCE_PREFERRED             0x01
3761 #define IO_RESOURCE_DEFAULT               0x02
3762 #define IO_RESOURCE_ALTERNATIVE           0x08
3763 
3764 #define FILE_DEVICE_BEEP                  0x00000001
3765 #define FILE_DEVICE_CD_ROM                0x00000002
3766 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
3767 #define FILE_DEVICE_CONTROLLER            0x00000004
3768 #define FILE_DEVICE_DATALINK              0x00000005
3769 #define FILE_DEVICE_DFS                   0x00000006
3770 #define FILE_DEVICE_DISK                  0x00000007
3771 #define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
3772 #define FILE_DEVICE_FILE_SYSTEM           0x00000009
3773 #define FILE_DEVICE_INPORT_PORT           0x0000000a
3774 #define FILE_DEVICE_KEYBOARD              0x0000000b
3775 #define FILE_DEVICE_MAILSLOT              0x0000000c
3776 #define FILE_DEVICE_MIDI_IN               0x0000000d
3777 #define FILE_DEVICE_MIDI_OUT              0x0000000e
3778 #define FILE_DEVICE_MOUSE                 0x0000000f
3779 #define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
3780 #define FILE_DEVICE_NAMED_PIPE            0x00000011
3781 #define FILE_DEVICE_NETWORK               0x00000012
3782 #define FILE_DEVICE_NETWORK_BROWSER       0x00000013
3783 #define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
3784 #define FILE_DEVICE_NULL                  0x00000015
3785 #define FILE_DEVICE_PARALLEL_PORT         0x00000016
3786 #define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
3787 #define FILE_DEVICE_PRINTER               0x00000018
3788 #define FILE_DEVICE_SCANNER               0x00000019
3789 #define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
3790 #define FILE_DEVICE_SERIAL_PORT           0x0000001b
3791 #define FILE_DEVICE_SCREEN                0x0000001c
3792 #define FILE_DEVICE_SOUND                 0x0000001d
3793 #define FILE_DEVICE_STREAMS               0x0000001e
3794 #define FILE_DEVICE_TAPE                  0x0000001f
3795 #define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
3796 #define FILE_DEVICE_TRANSPORT             0x00000021
3797 #define FILE_DEVICE_UNKNOWN               0x00000022
3798 #define FILE_DEVICE_VIDEO                 0x00000023
3799 #define FILE_DEVICE_VIRTUAL_DISK          0x00000024
3800 #define FILE_DEVICE_WAVE_IN               0x00000025
3801 #define FILE_DEVICE_WAVE_OUT              0x00000026
3802 #define FILE_DEVICE_8042_PORT             0x00000027
3803 #define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
3804 #define FILE_DEVICE_BATTERY               0x00000029
3805 #define FILE_DEVICE_BUS_EXTENDER          0x0000002a
3806 #define FILE_DEVICE_MODEM                 0x0000002b
3807 #define FILE_DEVICE_VDM                   0x0000002c
3808 #define FILE_DEVICE_MASS_STORAGE          0x0000002d
3809 #define FILE_DEVICE_SMB                   0x0000002e
3810 #define FILE_DEVICE_KS                    0x0000002f
3811 #define FILE_DEVICE_CHANGER               0x00000030
3812 #define FILE_DEVICE_SMARTCARD             0x00000031
3813 #define FILE_DEVICE_ACPI                  0x00000032
3814 #define FILE_DEVICE_DVD                   0x00000033
3815 #define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
3816 #define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
3817 #define FILE_DEVICE_DFS_VOLUME            0x00000036
3818 #define FILE_DEVICE_SERENUM               0x00000037
3819 #define FILE_DEVICE_TERMSRV               0x00000038
3820 #define FILE_DEVICE_KSEC                  0x00000039
3821 #define FILE_DEVICE_FIPS                  0x0000003A
3822 #define FILE_DEVICE_INFINIBAND            0x0000003B
3823 #define FILE_DEVICE_VMBUS                 0x0000003E
3824 #define FILE_DEVICE_CRYPT_PROVIDER        0x0000003F
3825 #define FILE_DEVICE_WPD                   0x00000040
3826 #define FILE_DEVICE_BLUETOOTH             0x00000041
3827 #define FILE_DEVICE_MT_COMPOSITE          0x00000042
3828 #define FILE_DEVICE_MT_TRANSPORT          0x00000043
3829 #define FILE_DEVICE_BIOMETRIC             0x00000044
3830 #define FILE_DEVICE_PMI                   0x00000045
3831 
3832 #if defined(NT_PROCESSOR_GROUPS)
3833 
3834 typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
3835 
3836 typedef enum _IRQ_DEVICE_POLICY_USHORT {
3837   IrqPolicyMachineDefault = 0,
3838   IrqPolicyAllCloseProcessors = 1,
3839   IrqPolicyOneCloseProcessor = 2,
3840   IrqPolicyAllProcessorsInMachine = 3,
3841   IrqPolicyAllProcessorsInGroup = 3,
3842   IrqPolicySpecifiedProcessors = 4,
3843   IrqPolicySpreadMessagesAcrossAllProcessors = 5};
3844 
3845 #else /* defined(NT_PROCESSOR_GROUPS) */
3846 
3847 typedef enum _IRQ_DEVICE_POLICY {
3848   IrqPolicyMachineDefault = 0,
3849   IrqPolicyAllCloseProcessors,
3850   IrqPolicyOneCloseProcessor,
3851   IrqPolicyAllProcessorsInMachine,
3852   IrqPolicySpecifiedProcessors,
3853   IrqPolicySpreadMessagesAcrossAllProcessors
3854 } IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
3855 
3856 #endif
3857 
3858 typedef enum _IRQ_PRIORITY {
3859   IrqPriorityUndefined = 0,
3860   IrqPriorityLow,
3861   IrqPriorityNormal,
3862   IrqPriorityHigh
3863 } IRQ_PRIORITY, *PIRQ_PRIORITY;
3864 
3865 typedef enum _IRQ_GROUP_POLICY {
3866   GroupAffinityAllGroupZero = 0,
3867   GroupAffinityDontCare
3868 } IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY;
3869 
3870 #define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
3871 
3872 typedef struct _OBJECT_HANDLE_INFORMATION {
3873   ULONG HandleAttributes;
3874   ACCESS_MASK GrantedAccess;
3875 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
3876 
3877 typedef struct _CLIENT_ID {
3878   HANDLE UniqueProcess;
3879   HANDLE UniqueThread;
3880 } CLIENT_ID, *PCLIENT_ID;
3881 
3882 typedef struct _VPB {
3883   CSHORT Type;
3884   CSHORT Size;
3885   USHORT Flags;
3886   USHORT VolumeLabelLength;
3887   struct _DEVICE_OBJECT *DeviceObject;
3888   struct _DEVICE_OBJECT *RealDevice;
3889   ULONG SerialNumber;
3890   ULONG ReferenceCount;
3891   WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
3892 } VPB, *PVPB;
3893 
3894 typedef enum _IO_ALLOCATION_ACTION {
3895   KeepObject = 1,
3896   DeallocateObject,
3897   DeallocateObjectKeepRegisters
3898 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
3899 
3900 typedef IO_ALLOCATION_ACTION
3901 (NTAPI DRIVER_CONTROL)(
3902   IN struct _DEVICE_OBJECT *DeviceObject,
3903   IN struct _IRP *Irp,
3904   IN PVOID MapRegisterBase,
3905   IN PVOID Context);
3906 typedef DRIVER_CONTROL *PDRIVER_CONTROL;
3907 
3908 typedef struct _WAIT_CONTEXT_BLOCK {
3909   KDEVICE_QUEUE_ENTRY WaitQueueEntry;
3910   PDRIVER_CONTROL DeviceRoutine;
3911   PVOID DeviceContext;
3912   ULONG NumberOfMapRegisters;
3913   PVOID DeviceObject;
3914   PVOID CurrentIrp;
3915   PKDPC BufferChainingDpc;
3916 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
3917 
3918 /* DEVICE_OBJECT.Flags */
3919 #define DO_VERIFY_VOLUME                  0x00000002
3920 #define DO_BUFFERED_IO                    0x00000004
3921 #define DO_EXCLUSIVE                      0x00000008
3922 #define DO_DIRECT_IO                      0x00000010
3923 #define DO_MAP_IO_BUFFER                  0x00000020
3924 #define DO_DEVICE_INITIALIZING            0x00000080
3925 #define DO_SHUTDOWN_REGISTERED            0x00000800
3926 #define DO_BUS_ENUMERATED_DEVICE          0x00001000
3927 #define DO_POWER_PAGABLE                  0x00002000
3928 #define DO_POWER_INRUSH                   0x00004000
3929 
3930 /* DEVICE_OBJECT.Characteristics */
3931 #define FILE_REMOVABLE_MEDIA              0x00000001
3932 #define FILE_READ_ONLY_DEVICE             0x00000002
3933 #define FILE_FLOPPY_DISKETTE              0x00000004
3934 #define FILE_WRITE_ONCE_MEDIA             0x00000008
3935 #define FILE_REMOTE_DEVICE                0x00000010
3936 #define FILE_DEVICE_IS_MOUNTED            0x00000020
3937 #define FILE_VIRTUAL_VOLUME               0x00000040
3938 #define FILE_AUTOGENERATED_DEVICE_NAME    0x00000080
3939 #define FILE_DEVICE_SECURE_OPEN           0x00000100
3940 #define FILE_CHARACTERISTIC_PNP_DEVICE    0x00000800
3941 #define FILE_CHARACTERISTIC_TS_DEVICE     0x00001000
3942 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
3943 
3944 /* DEVICE_OBJECT.AlignmentRequirement */
3945 #define FILE_BYTE_ALIGNMENT             0x00000000
3946 #define FILE_WORD_ALIGNMENT             0x00000001
3947 #define FILE_LONG_ALIGNMENT             0x00000003
3948 #define FILE_QUAD_ALIGNMENT             0x00000007
3949 #define FILE_OCTA_ALIGNMENT             0x0000000f
3950 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
3951 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
3952 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
3953 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
3954 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
3955 
3956 /* DEVICE_OBJECT.DeviceType */
3957 #define DEVICE_TYPE ULONG
3958 
3959 typedef struct _DEVICE_OBJECT {
3960   CSHORT Type;
3961   USHORT Size;
3962   LONG ReferenceCount;
3963   struct _DRIVER_OBJECT *DriverObject;
3964   struct _DEVICE_OBJECT *NextDevice;
3965   struct _DEVICE_OBJECT *AttachedDevice;
3966   struct _IRP *CurrentIrp;
3967   PIO_TIMER Timer;
3968   ULONG Flags;
3969   ULONG Characteristics;
3970   volatile PVPB Vpb;
3971   PVOID DeviceExtension;
3972   DEVICE_TYPE DeviceType;
3973   CCHAR StackSize;
3974   union {
3975     LIST_ENTRY ListEntry;
3976     WAIT_CONTEXT_BLOCK Wcb;
3977   } Queue;
3978   ULONG AlignmentRequirement;
3979   KDEVICE_QUEUE DeviceQueue;
3980   KDPC Dpc;
3981   ULONG ActiveThreadCount;
3982   PSECURITY_DESCRIPTOR SecurityDescriptor;
3983   KEVENT DeviceLock;
3984   USHORT SectorSize;
3985   USHORT Spare1;
3986   struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
3987   PVOID Reserved;
3988 } DEVICE_OBJECT, *PDEVICE_OBJECT;
3989 
3990 typedef enum _IO_SESSION_STATE {
3991   IoSessionStateCreated = 1,
3992   IoSessionStateInitialized,
3993   IoSessionStateConnected,
3994   IoSessionStateDisconnected,
3995   IoSessionStateDisconnectedLoggedOn,
3996   IoSessionStateLoggedOn,
3997   IoSessionStateLoggedOff,
3998   IoSessionStateTerminated,
3999   IoSessionStateMax
4000 } IO_SESSION_STATE, *PIO_SESSION_STATE;
4001 
4002 typedef enum _IO_COMPLETION_ROUTINE_RESULT {
4003   ContinueCompletion = STATUS_CONTINUE_COMPLETION,
4004   StopCompletion = STATUS_MORE_PROCESSING_REQUIRED
4005 } IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT;
4006 
4007 typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY {
4008   PHYSICAL_ADDRESS MessageAddress;
4009   KAFFINITY TargetProcessorSet;
4010   PKINTERRUPT InterruptObject;
4011   ULONG MessageData;
4012   ULONG Vector;
4013   KIRQL Irql;
4014   KINTERRUPT_MODE Mode;
4015   KINTERRUPT_POLARITY Polarity;
4016 } IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY;
4017 
4018 typedef struct _IO_INTERRUPT_MESSAGE_INFO {
4019   KIRQL UnifiedIrql;
4020   ULONG MessageCount;
4021   IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1];
4022 } IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO;
4023 
4024 typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS {
4025   IN PDEVICE_OBJECT PhysicalDeviceObject;
4026   OUT PKINTERRUPT *InterruptObject;
4027   IN PKSERVICE_ROUTINE ServiceRoutine;
4028   IN PVOID ServiceContext;
4029   IN PKSPIN_LOCK SpinLock OPTIONAL;
4030   IN KIRQL SynchronizeIrql;
4031   IN BOOLEAN FloatingSave;
4032   IN BOOLEAN ShareVector;
4033   IN ULONG Vector;
4034   IN KIRQL Irql;
4035   IN KINTERRUPT_MODE InterruptMode;
4036   IN KAFFINITY ProcessorEnableMask;
4037   IN USHORT Group;
4038 } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS;
4039 
4040 typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS {
4041   IN PDEVICE_OBJECT PhysicalDeviceObject;
4042   OUT PKINTERRUPT *InterruptObject;
4043   IN PKSERVICE_ROUTINE ServiceRoutine;
4044   IN PVOID ServiceContext;
4045   IN PKSPIN_LOCK SpinLock OPTIONAL;
4046   IN KIRQL SynchronizeIrql OPTIONAL;
4047   IN BOOLEAN FloatingSave;
4048 } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS;
4049 
4050 typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
4051   IN PDEVICE_OBJECT PhysicalDeviceObject;
4052   union {
4053     OUT PVOID *Generic;
4054     OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable;
4055     OUT PKINTERRUPT *InterruptObject;
4056   } ConnectionContext;
4057   IN PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine;
4058   IN PVOID ServiceContext;
4059   IN PKSPIN_LOCK SpinLock OPTIONAL;
4060   IN KIRQL SynchronizeIrql OPTIONAL;
4061   IN BOOLEAN FloatingSave;
4062   IN PKSERVICE_ROUTINE FallBackServiceRoutine OPTIONAL;
4063 } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS;
4064 
4065 typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
4066   IN OUT ULONG Version;
4067   _ANONYMOUS_UNION union {
4068     IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
4069     IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
4070     IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
4071   } DUMMYUNIONNAME;
4072 } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
4073 
4074 typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
4075   IN ULONG Version;
4076   union {
4077     IN PVOID Generic;
4078     IN PKINTERRUPT InterruptObject;
4079     IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable;
4080   } ConnectionContext;
4081 } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS;
4082 
4083 typedef enum _IO_ACCESS_TYPE {
4084   ReadAccess,
4085   WriteAccess,
4086   ModifyAccess
4087 } IO_ACCESS_TYPE;
4088 
4089 typedef enum _IO_ACCESS_MODE {
4090   SequentialAccess,
4091   RandomAccess
4092 } IO_ACCESS_MODE;
4093 
4094 typedef enum _IO_CONTAINER_NOTIFICATION_CLASS {
4095   IoSessionStateNotification,
4096   IoMaxContainerNotificationClass
4097 } IO_CONTAINER_NOTIFICATION_CLASS;
4098 
4099 typedef struct _IO_SESSION_STATE_NOTIFICATION {
4100   ULONG Size;
4101   ULONG Flags;
4102   PVOID IoObject;
4103   ULONG EventMask;
4104   PVOID Context;
4105 } IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION;
4106 
4107 typedef enum _IO_CONTAINER_INFORMATION_CLASS {
4108   IoSessionStateInformation,
4109   IoMaxContainerInformationClass
4110 } IO_CONTAINER_INFORMATION_CLASS;
4111 
4112 typedef struct _IO_SESSION_STATE_INFORMATION {
4113   ULONG SessionId;
4114   IO_SESSION_STATE SessionState;
4115   BOOLEAN LocalSession;
4116 } IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION;
4117 
4118 #if (NTDDI_VERSION >= NTDDI_WIN7)
4119 
4120 typedef NTSTATUS
4121 (NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)(
4122   VOID);
4123 
4124 typedef NTSTATUS
4125 (NTAPI IO_SESSION_NOTIFICATION_FUNCTION)(
4126   IN PVOID SessionObject,
4127   IN PVOID IoObject,
4128   IN ULONG Event,
4129   IN PVOID Context,
4130   IN PVOID NotificationPayload,
4131   IN ULONG PayloadLength);
4132 
4133 typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION;
4134 
4135 #endif
4136 
4137 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
4138 
4139 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
4140   BOOLEAN Removed;
4141   BOOLEAN Reserved[3];
4142   volatile LONG IoCount;
4143   KEVENT RemoveEvent;
4144 } IO_REMOVE_LOCK_COMMON_BLOCK;
4145 
4146 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
4147   LONG Signature;
4148   LONG HighWatermark;
4149   LONGLONG MaxLockedTicks;
4150   LONG AllocateTag;
4151   LIST_ENTRY LockList;
4152   KSPIN_LOCK Spin;
4153   volatile LONG LowMemoryCount;
4154   ULONG Reserved1[4];
4155   PVOID Reserved2;
4156   PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
4157 } IO_REMOVE_LOCK_DBG_BLOCK;
4158 
4159 typedef struct _IO_REMOVE_LOCK {
4160   IO_REMOVE_LOCK_COMMON_BLOCK Common;
4161 #if DBG
4162   IO_REMOVE_LOCK_DBG_BLOCK Dbg;
4163 #endif
4164 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
4165 
4166 typedef struct _IO_WORKITEM *PIO_WORKITEM;
4167 
4168 typedef VOID
4169 (NTAPI IO_WORKITEM_ROUTINE)(
4170   IN PDEVICE_OBJECT DeviceObject,
4171   IN PVOID Context);
4172 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
4173 
4174 typedef VOID
4175 (NTAPI IO_WORKITEM_ROUTINE_EX)(
4176   IN PVOID IoObject,
4177   IN PVOID Context OPTIONAL,
4178   IN PIO_WORKITEM IoWorkItem);
4179 typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
4180 
4181 typedef struct _SHARE_ACCESS {
4182   ULONG OpenCount;
4183   ULONG Readers;
4184   ULONG Writers;
4185   ULONG Deleters;
4186   ULONG SharedRead;
4187   ULONG SharedWrite;
4188   ULONG SharedDelete;
4189 } SHARE_ACCESS, *PSHARE_ACCESS;
4190 
4191 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
4192    inheritance, even from a struct renders the type non-POD. So we use
4193    this hack */
4194 #define PCI_COMMON_HEADER_LAYOUT                \
4195   USHORT VendorID;                              \
4196   USHORT DeviceID;                              \
4197   USHORT Command;                               \
4198   USHORT Status;                                \
4199   UCHAR RevisionID;                             \
4200   UCHAR ProgIf;                                 \
4201   UCHAR SubClass;                               \
4202   UCHAR BaseClass;                              \
4203   UCHAR CacheLineSize;                          \
4204   UCHAR LatencyTimer;                           \
4205   UCHAR HeaderType;                             \
4206   UCHAR BIST;                                   \
4207   union {                                       \
4208     struct /* _PCI_HEADER_TYPE_0 */ {                 \
4209       ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
4210       ULONG CIS;                                \
4211       USHORT SubVendorID;                       \
4212       USHORT SubSystemID;                       \
4213       ULONG ROMBaseAddress;                     \
4214       UCHAR CapabilitiesPtr;                    \
4215       UCHAR Reserved1[3];                       \
4216       ULONG Reserved2;                          \
4217       UCHAR InterruptLine;                      \
4218       UCHAR InterruptPin;                       \
4219       UCHAR MinimumGrant;                       \
4220       UCHAR MaximumLatency;                     \
4221     } type0;                                    \
4222     struct /* _PCI_HEADER_TYPE_1 */ {                 \
4223       ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
4224       UCHAR PrimaryBus;                         \
4225       UCHAR SecondaryBus;                       \
4226       UCHAR SubordinateBus;                     \
4227       UCHAR SecondaryLatency;                   \
4228       UCHAR IOBase;                             \
4229       UCHAR IOLimit;                            \
4230       USHORT SecondaryStatus;                   \
4231       USHORT MemoryBase;                        \
4232       USHORT MemoryLimit;                       \
4233       USHORT PrefetchBase;                      \
4234       USHORT PrefetchLimit;                     \
4235       ULONG PrefetchBaseUpper32;                \
4236       ULONG PrefetchLimitUpper32;               \
4237       USHORT IOBaseUpper16;                     \
4238       USHORT IOLimitUpper16;                    \
4239       UCHAR CapabilitiesPtr;                    \
4240       UCHAR Reserved1[3];                       \
4241       ULONG ROMBaseAddress;                     \
4242       UCHAR InterruptLine;                      \
4243       UCHAR InterruptPin;                       \
4244       USHORT BridgeControl;                     \
4245     } type1;                                    \
4246     struct /* _PCI_HEADER_TYPE_2 */ {                 \
4247       ULONG SocketRegistersBaseAddress;         \
4248       UCHAR CapabilitiesPtr;                    \
4249       UCHAR Reserved;                           \
4250       USHORT SecondaryStatus;                   \
4251       UCHAR PrimaryBus;                         \
4252       UCHAR SecondaryBus;                       \
4253       UCHAR SubordinateBus;                     \
4254       UCHAR SecondaryLatency;                   \
4255       struct {                                  \
4256         ULONG Base;                             \
4257         ULONG Limit;                            \
4258       } Range[PCI_TYPE2_ADDRESSES-1];           \
4259       UCHAR InterruptLine;                      \
4260       UCHAR InterruptPin;                       \
4261       USHORT BridgeControl;                     \
4262     } type2;                                    \
4263   } u;
4264 
4265 typedef enum _CREATE_FILE_TYPE {
4266   CreateFileTypeNone,
4267   CreateFileTypeNamedPipe,
4268   CreateFileTypeMailslot
4269 } CREATE_FILE_TYPE;
4270 
4271 #define IO_FORCE_ACCESS_CHECK               0x001
4272 #define IO_NO_PARAMETER_CHECKING            0x100
4273 
4274 #define IO_REPARSE                      0x0
4275 #define IO_REMOUNT                      0x1
4276 
4277 typedef struct _IO_STATUS_BLOCK {
4278   _ANONYMOUS_UNION union {
4279     NTSTATUS Status;
4280     PVOID Pointer;
4281   } DUMMYUNIONNAME;
4282   ULONG_PTR Information;
4283 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
4284 
4285 #if defined(_WIN64)
4286 typedef struct _IO_STATUS_BLOCK32 {
4287   NTSTATUS Status;
4288   ULONG Information;
4289 } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
4290 #endif
4291 
4292 typedef VOID
4293 (NTAPI *PIO_APC_ROUTINE)(
4294   IN PVOID ApcContext,
4295   IN PIO_STATUS_BLOCK IoStatusBlock,
4296   IN ULONG Reserved);
4297 
4298 #define PIO_APC_ROUTINE_DEFINED
4299 
4300 typedef enum _IO_SESSION_EVENT {
4301   IoSessionEventIgnore = 0,
4302   IoSessionEventCreated,
4303   IoSessionEventTerminated,
4304   IoSessionEventConnected,
4305   IoSessionEventDisconnected,
4306   IoSessionEventLogon,
4307   IoSessionEventLogoff,
4308   IoSessionEventMax
4309 } IO_SESSION_EVENT, *PIO_SESSION_EVENT;
4310 
4311 #define IO_SESSION_STATE_ALL_EVENTS        0xffffffff
4312 #define IO_SESSION_STATE_CREATION_EVENT    0x00000001
4313 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
4314 #define IO_SESSION_STATE_CONNECT_EVENT     0x00000004
4315 #define IO_SESSION_STATE_DISCONNECT_EVENT  0x00000008
4316 #define IO_SESSION_STATE_LOGON_EVENT       0x00000010
4317 #define IO_SESSION_STATE_LOGOFF_EVENT      0x00000020
4318 
4319 #define IO_SESSION_STATE_VALID_EVENT_MASK  0x0000003f
4320 
4321 #define IO_SESSION_MAX_PAYLOAD_SIZE        256L
4322 
4323 typedef struct _IO_SESSION_CONNECT_INFO {
4324   ULONG SessionId;
4325   BOOLEAN LocalSession;
4326 } IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO;
4327 
4328 #define EVENT_INCREMENT                   1
4329 #define IO_NO_INCREMENT                   0
4330 #define IO_CD_ROM_INCREMENT               1
4331 #define IO_DISK_INCREMENT                 1
4332 #define IO_KEYBOARD_INCREMENT             6
4333 #define IO_MAILSLOT_INCREMENT             2
4334 #define IO_MOUSE_INCREMENT                6
4335 #define IO_NAMED_PIPE_INCREMENT           2
4336 #define IO_NETWORK_INCREMENT              2
4337 #define IO_PARALLEL_INCREMENT             1
4338 #define IO_SERIAL_INCREMENT               2
4339 #define IO_SOUND_INCREMENT                8
4340 #define IO_VIDEO_INCREMENT                1
4341 #define SEMAPHORE_INCREMENT               1
4342 
4343 #define MM_MAXIMUM_DISK_IO_SIZE          (0x10000)
4344 
4345 typedef struct _BOOTDISK_INFORMATION {
4346   LONGLONG BootPartitionOffset;
4347   LONGLONG SystemPartitionOffset;
4348   ULONG BootDeviceSignature;
4349   ULONG SystemDeviceSignature;
4350 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
4351 
4352 typedef struct _BOOTDISK_INFORMATION_EX {
4353   LONGLONG BootPartitionOffset;
4354   LONGLONG SystemPartitionOffset;
4355   ULONG BootDeviceSignature;
4356   ULONG SystemDeviceSignature;
4357   GUID BootDeviceGuid;
4358   GUID SystemDeviceGuid;
4359   BOOLEAN BootDeviceIsGpt;
4360   BOOLEAN SystemDeviceIsGpt;
4361 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
4362 
4363 #if (NTDDI_VERSION >= NTDDI_WIN7)
4364 
4365 typedef struct _LOADER_PARTITION_INFORMATION_EX {
4366   ULONG PartitionStyle;
4367   ULONG PartitionNumber;
4368   _ANONYMOUS_UNION union {
4369     ULONG Signature;
4370     GUID DeviceId;
4371   } DUMMYUNIONNAME;
4372   ULONG Flags;
4373 } LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
4374 
4375 typedef struct _BOOTDISK_INFORMATION_LITE {
4376   ULONG NumberEntries;
4377   LOADER_PARTITION_INFORMATION_EX Entries[1];
4378 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
4379 
4380 #else
4381 
4382 #if (NTDDI_VERSION >= NTDDI_VISTA)
4383 typedef struct _BOOTDISK_INFORMATION_LITE {
4384   ULONG BootDeviceSignature;
4385   ULONG SystemDeviceSignature;
4386   GUID BootDeviceGuid;
4387   GUID SystemDeviceGuid;
4388   BOOLEAN BootDeviceIsGpt;
4389   BOOLEAN SystemDeviceIsGpt;
4390 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
4391 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4392 
4393 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4394 
4395 #include <pshpack1.h>
4396 
4397 typedef struct _EISA_MEMORY_TYPE {
4398   UCHAR ReadWrite:1;
4399   UCHAR Cached:1;
4400   UCHAR Reserved0:1;
4401   UCHAR Type:2;
4402   UCHAR Shared:1;
4403   UCHAR Reserved1:1;
4404   UCHAR MoreEntries:1;
4405 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
4406 
4407 typedef struct _EISA_MEMORY_CONFIGURATION {
4408   EISA_MEMORY_TYPE ConfigurationByte;
4409   UCHAR DataSize;
4410   USHORT AddressLowWord;
4411   UCHAR AddressHighByte;
4412   USHORT MemorySize;
4413 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
4414 
4415 typedef struct _EISA_IRQ_DESCRIPTOR {
4416   UCHAR Interrupt:4;
4417   UCHAR Reserved:1;
4418   UCHAR LevelTriggered:1;
4419   UCHAR Shared:1;
4420   UCHAR MoreEntries:1;
4421 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
4422 
4423 typedef struct _EISA_IRQ_CONFIGURATION {
4424   EISA_IRQ_DESCRIPTOR ConfigurationByte;
4425   UCHAR Reserved;
4426 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
4427 
4428 typedef struct _DMA_CONFIGURATION_BYTE0 {
4429   UCHAR Channel:3;
4430   UCHAR Reserved:3;
4431   UCHAR Shared:1;
4432   UCHAR MoreEntries:1;
4433 } DMA_CONFIGURATION_BYTE0;
4434 
4435 typedef struct _DMA_CONFIGURATION_BYTE1 {
4436   UCHAR Reserved0:2;
4437   UCHAR TransferSize:2;
4438   UCHAR Timing:2;
4439   UCHAR Reserved1:2;
4440 } DMA_CONFIGURATION_BYTE1;
4441 
4442 typedef struct _EISA_DMA_CONFIGURATION {
4443   DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
4444   DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
4445 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
4446 
4447 typedef struct _EISA_PORT_DESCRIPTOR {
4448   UCHAR NumberPorts:5;
4449   UCHAR Reserved:1;
4450   UCHAR Shared:1;
4451   UCHAR MoreEntries:1;
4452 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
4453 
4454 typedef struct _EISA_PORT_CONFIGURATION {
4455   EISA_PORT_DESCRIPTOR Configuration;
4456   USHORT PortAddress;
4457 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
4458 
4459 typedef struct _CM_EISA_SLOT_INFORMATION {
4460   UCHAR ReturnCode;
4461   UCHAR ReturnFlags;
4462   UCHAR MajorRevision;
4463   UCHAR MinorRevision;
4464   USHORT Checksum;
4465   UCHAR NumberFunctions;
4466   UCHAR FunctionInformation;
4467   ULONG CompressedId;
4468 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
4469 
4470 typedef struct _CM_EISA_FUNCTION_INFORMATION {
4471   ULONG CompressedId;
4472   UCHAR IdSlotFlags1;
4473   UCHAR IdSlotFlags2;
4474   UCHAR MinorRevision;
4475   UCHAR MajorRevision;
4476   UCHAR Selections[26];
4477   UCHAR FunctionFlags;
4478   UCHAR TypeString[80];
4479   EISA_MEMORY_CONFIGURATION EisaMemory[9];
4480   EISA_IRQ_CONFIGURATION EisaIrq[7];
4481   EISA_DMA_CONFIGURATION EisaDma[4];
4482   EISA_PORT_CONFIGURATION EisaPort[20];
4483   UCHAR InitializationData[60];
4484 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
4485 
4486 #include <poppack.h>
4487 
4488 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
4489 
4490 #define EISA_FUNCTION_ENABLED           0x80
4491 #define EISA_FREE_FORM_DATA             0x40
4492 #define EISA_HAS_PORT_INIT_ENTRY        0x20
4493 #define EISA_HAS_PORT_RANGE             0x10
4494 #define EISA_HAS_DMA_ENTRY              0x08
4495 #define EISA_HAS_IRQ_ENTRY              0x04
4496 #define EISA_HAS_MEMORY_ENTRY           0x02
4497 #define EISA_HAS_TYPE_ENTRY             0x01
4498 #define EISA_HAS_INFORMATION \
4499   (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
4500   + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
4501 
4502 #define EISA_MORE_ENTRIES               0x80
4503 #define EISA_SYSTEM_MEMORY              0x00
4504 #define EISA_MEMORY_TYPE_RAM            0x01
4505 
4506 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
4507 
4508 #define EISA_INVALID_SLOT               0x80
4509 #define EISA_INVALID_FUNCTION           0x81
4510 #define EISA_INVALID_CONFIGURATION      0x82
4511 #define EISA_EMPTY_SLOT                 0x83
4512 #define EISA_INVALID_BIOS_CALL          0x86
4513 
4514 /*
4515 ** Plug and Play structures
4516 */
4517 
4518 typedef VOID
4519 (NTAPI *PINTERFACE_REFERENCE)(
4520   PVOID Context);
4521 
4522 typedef VOID
4523 (NTAPI *PINTERFACE_DEREFERENCE)(
4524   PVOID Context);
4525 
4526 typedef BOOLEAN
4527 (NTAPI TRANSLATE_BUS_ADDRESS)(
4528   IN PVOID Context,
4529   IN PHYSICAL_ADDRESS BusAddress,
4530   IN ULONG Length,
4531   IN OUT PULONG AddressSpace,
4532   OUT PPHYSICAL_ADDRESS  TranslatedAddress);
4533 typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
4534 
4535 typedef struct _DMA_ADAPTER*
4536 (NTAPI GET_DMA_ADAPTER)(
4537   IN PVOID Context,
4538   IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
4539   OUT PULONG NumberOfMapRegisters);
4540 typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
4541 
4542 typedef ULONG
4543 (NTAPI GET_SET_DEVICE_DATA)(
4544   IN PVOID Context,
4545   IN ULONG DataType,
4546   IN PVOID Buffer,
4547   IN ULONG Offset,
4548   IN ULONG Length);
4549 typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
4550 
4551 typedef enum _DEVICE_INSTALL_STATE {
4552   InstallStateInstalled,
4553   InstallStateNeedsReinstall,
4554   InstallStateFailedInstall,
4555   InstallStateFinishInstall
4556 } DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE;
4557 
4558 typedef struct _LEGACY_BUS_INFORMATION {
4559   GUID BusTypeGuid;
4560   INTERFACE_TYPE LegacyBusType;
4561   ULONG BusNumber;
4562 } LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
4563 
4564 typedef enum _DEVICE_REMOVAL_POLICY {
4565   RemovalPolicyExpectNoRemoval = 1,
4566   RemovalPolicyExpectOrderlyRemoval = 2,
4567   RemovalPolicyExpectSurpriseRemoval = 3
4568 } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY;
4569 
4570 typedef VOID
4571 (NTAPI*PREENUMERATE_SELF)(
4572   IN PVOID Context);
4573 
4574 typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD {
4575   USHORT Size;
4576   USHORT Version;
4577   PVOID Context;
4578   PINTERFACE_REFERENCE InterfaceReference;
4579   PINTERFACE_DEREFERENCE InterfaceDereference;
4580   PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf;
4581 } REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD;
4582 
4583 typedef VOID
4584 (NTAPI *PIO_DEVICE_EJECT_CALLBACK)(
4585   IN NTSTATUS Status,
4586   IN OUT PVOID Context OPTIONAL);
4587 
4588 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION     1
4589 
4590 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
4591 #define PCI_USE_SUBSYSTEM_IDS   0x00000001
4592 #define PCI_USE_REVISION        0x00000002
4593 #define PCI_USE_VENDEV_IDS      0x00000004
4594 #define PCI_USE_CLASS_SUBCLASS  0x00000008
4595 #define PCI_USE_PROGIF          0x00000010
4596 #define PCI_USE_LOCAL_BUS       0x00000020
4597 #define PCI_USE_LOCAL_DEVICE    0x00000040
4598 
4599 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
4600   ULONG Size;
4601   ULONG Flags;
4602   USHORT VendorID;
4603   USHORT DeviceID;
4604   UCHAR RevisionID;
4605   USHORT SubVendorID;
4606   USHORT SubSystemID;
4607   UCHAR BaseClass;
4608   UCHAR SubClass;
4609   UCHAR ProgIf;
4610 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
4611 
4612 typedef BOOLEAN
4613 (NTAPI PCI_IS_DEVICE_PRESENT)(
4614   IN USHORT VendorID,
4615   IN USHORT DeviceID,
4616   IN UCHAR RevisionID,
4617   IN USHORT SubVendorID,
4618   IN USHORT SubSystemID,
4619   IN ULONG Flags);
4620 typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
4621 
4622 typedef BOOLEAN
4623 (NTAPI PCI_IS_DEVICE_PRESENT_EX)(
4624   IN PVOID Context,
4625   IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
4626 typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
4627 
4628 typedef struct _BUS_INTERFACE_STANDARD {
4629   USHORT Size;
4630   USHORT Version;
4631   PVOID Context;
4632   PINTERFACE_REFERENCE InterfaceReference;
4633   PINTERFACE_DEREFERENCE InterfaceDereference;
4634   PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
4635   PGET_DMA_ADAPTER GetDmaAdapter;
4636   PGET_SET_DEVICE_DATA SetBusData;
4637   PGET_SET_DEVICE_DATA GetBusData;
4638 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
4639 
4640 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
4641   USHORT Size;
4642   USHORT Version;
4643   PVOID Context;
4644   PINTERFACE_REFERENCE InterfaceReference;
4645   PINTERFACE_DEREFERENCE InterfaceDereference;
4646   PPCI_IS_DEVICE_PRESENT IsDevicePresent;
4647   PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
4648 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
4649 
4650 typedef struct _DEVICE_CAPABILITIES {
4651   USHORT Size;
4652   USHORT Version;
4653   ULONG DeviceD1:1;
4654   ULONG DeviceD2:1;
4655   ULONG LockSupported:1;
4656   ULONG EjectSupported:1;
4657   ULONG Removable:1;
4658   ULONG DockDevice:1;
4659   ULONG UniqueID:1;
4660   ULONG SilentInstall:1;
4661   ULONG RawDeviceOK:1;
4662   ULONG SurpriseRemovalOK:1;
4663   ULONG WakeFromD0:1;
4664   ULONG WakeFromD1:1;
4665   ULONG WakeFromD2:1;
4666   ULONG WakeFromD3:1;
4667   ULONG HardwareDisabled:1;
4668   ULONG NonDynamic:1;
4669   ULONG WarmEjectSupported:1;
4670   ULONG NoDisplayInUI:1;
4671   ULONG Reserved:14;
4672   ULONG Address;
4673   ULONG UINumber;
4674   DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
4675   SYSTEM_POWER_STATE SystemWake;
4676   DEVICE_POWER_STATE DeviceWake;
4677   ULONG D1Latency;
4678   ULONG D2Latency;
4679   ULONG D3Latency;
4680 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
4681 
4682 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
4683   USHORT Version;
4684   USHORT Size;
4685   GUID Event;
4686   GUID InterfaceClassGuid;
4687   PUNICODE_STRING SymbolicLinkName;
4688 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
4689 
4690 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
4691   USHORT Version;
4692   USHORT Size;
4693   GUID Event;
4694 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
4695 
4696 #undef INTERFACE
4697 
4698 typedef struct _INTERFACE {
4699   USHORT Size;
4700   USHORT Version;
4701   PVOID Context;
4702   PINTERFACE_REFERENCE InterfaceReference;
4703   PINTERFACE_DEREFERENCE InterfaceDereference;
4704 } INTERFACE, *PINTERFACE;
4705 
4706 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
4707   USHORT Version;
4708   USHORT Size;
4709   GUID Event;
4710 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
4711 
4712 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
4713 
4714 /* PNP_DEVICE_STATE */
4715 
4716 #define PNP_DEVICE_DISABLED                      0x00000001
4717 #define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
4718 #define PNP_DEVICE_FAILED                        0x00000004
4719 #define PNP_DEVICE_REMOVED                       0x00000008
4720 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
4721 #define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
4722 
4723 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
4724   USHORT Version;
4725   USHORT Size;
4726   GUID Event;
4727   struct _FILE_OBJECT *FileObject;
4728   LONG NameBufferOffset;
4729   UCHAR CustomDataBuffer[1];
4730 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
4731 
4732 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
4733   USHORT Version;
4734   USHORT Size;
4735   GUID Event;
4736   struct _FILE_OBJECT *FileObject;
4737 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
4738 
4739 #if (NTDDI_VERSION >= NTDDI_VISTA)
4740 #include <devpropdef.h>
4741 #define PLUGPLAY_PROPERTY_PERSISTENT   0x00000001
4742 #endif
4743 
4744 #define PNP_REPLACE_NO_MAP             MAXLONGLONG
4745 
4746 typedef NTSTATUS
4747 (NTAPI *PREPLACE_MAP_MEMORY)(
4748   IN PHYSICAL_ADDRESS TargetPhysicalAddress,
4749   IN PHYSICAL_ADDRESS SparePhysicalAddress,
4750   IN OUT PLARGE_INTEGER NumberOfBytes,
4751   OUT PVOID *TargetAddress,
4752   OUT PVOID *SpareAddress);
4753 
4754 typedef struct _PNP_REPLACE_MEMORY_LIST {
4755   ULONG AllocatedCount;
4756   ULONG Count;
4757   ULONGLONG TotalLength;
4758   struct {
4759     PHYSICAL_ADDRESS Address;
4760     ULONGLONG Length;
4761   } Ranges[ANYSIZE_ARRAY];
4762 } PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST;
4763 
4764 typedef struct _PNP_REPLACE_PROCESSOR_LIST {
4765   PKAFFINITY Affinity;
4766   ULONG GroupCount;
4767   ULONG AllocatedCount;
4768   ULONG Count;
4769   ULONG ApicIds[ANYSIZE_ARRAY];
4770 } PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST;
4771 
4772 typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 {
4773   KAFFINITY AffinityMask;
4774   ULONG AllocatedCount;
4775   ULONG Count;
4776   ULONG ApicIds[ANYSIZE_ARRAY];
4777 } PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1;
4778 
4779 #define PNP_REPLACE_PARAMETERS_VERSION           2
4780 
4781 typedef struct _PNP_REPLACE_PARAMETERS {
4782   ULONG Size;
4783   ULONG Version;
4784   ULONG64 Target;
4785   ULONG64 Spare;
4786   PPNP_REPLACE_PROCESSOR_LIST TargetProcessors;
4787   PPNP_REPLACE_PROCESSOR_LIST SpareProcessors;
4788   PPNP_REPLACE_MEMORY_LIST TargetMemory;
4789   PPNP_REPLACE_MEMORY_LIST SpareMemory;
4790   PREPLACE_MAP_MEMORY MapMemory;
4791 } PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS;
4792 
4793 typedef VOID
4794 (NTAPI *PREPLACE_UNLOAD)(
4795   VOID);
4796 
4797 typedef NTSTATUS
4798 (NTAPI *PREPLACE_BEGIN)(
4799   IN PPNP_REPLACE_PARAMETERS Parameters,
4800   OUT PVOID *Context);
4801 
4802 typedef NTSTATUS
4803 (NTAPI *PREPLACE_END)(
4804   IN PVOID Context);
4805 
4806 typedef NTSTATUS
4807 (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)(
4808   IN PVOID Context,
4809   IN PHYSICAL_ADDRESS PhysicalAddress,
4810   IN LARGE_INTEGER ByteCount);
4811 
4812 typedef NTSTATUS
4813 (NTAPI *PREPLACE_SET_PROCESSOR_ID)(
4814   IN PVOID Context,
4815   IN ULONG ApicId,
4816   IN BOOLEAN Target);
4817 
4818 typedef NTSTATUS
4819 (NTAPI *PREPLACE_SWAP)(
4820   IN PVOID Context);
4821 
4822 typedef NTSTATUS
4823 (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)(
4824   IN PVOID Context);
4825 
4826 typedef NTSTATUS
4827 (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)(
4828   IN PVOID Context);
4829 
4830 typedef NTSTATUS
4831 (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)(
4832   IN PVOID Context,
4833   IN PHYSICAL_ADDRESS SourceAddress,
4834   OUT PPHYSICAL_ADDRESS DestinationAddress);
4835 
4836 typedef NTSTATUS
4837 (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)(
4838   IN PVOID Context,
4839   IN BOOLEAN Enable);
4840 
4841 #define PNP_REPLACE_DRIVER_INTERFACE_VERSION      1
4842 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
4843              FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
4844 
4845 #define PNP_REPLACE_MEMORY_SUPPORTED             0x0001
4846 #define PNP_REPLACE_PROCESSOR_SUPPORTED          0x0002
4847 #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING    0x0004
4848 #define PNP_REPLACE_HARDWARE_PAGE_COPY           0x0008
4849 #define PNP_REPLACE_HARDWARE_QUIESCE             0x0010
4850 
4851 typedef struct _PNP_REPLACE_DRIVER_INTERFACE {
4852   ULONG Size;
4853   ULONG Version;
4854   ULONG Flags;
4855   PREPLACE_UNLOAD Unload;
4856   PREPLACE_BEGIN BeginReplace;
4857   PREPLACE_END EndReplace;
4858   PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory;
4859   PREPLACE_SET_PROCESSOR_ID SetProcessorId;
4860   PREPLACE_SWAP Swap;
4861   PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror;
4862   PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory;
4863   PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination;
4864   PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce;
4865 } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE;
4866 
4867 typedef NTSTATUS
4868 (NTAPI *PREPLACE_DRIVER_INIT)(
4869   IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface,
4870   IN PVOID Unused);
4871 
4872 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
4873   DeviceUsageTypeUndefined,
4874   DeviceUsageTypePaging,
4875   DeviceUsageTypeHibernation,
4876   DeviceUsageTypeDumpFile
4877 } DEVICE_USAGE_NOTIFICATION_TYPE;
4878 
4879 typedef struct _POWER_SEQUENCE {
4880   ULONG SequenceD1;
4881   ULONG SequenceD2;
4882   ULONG SequenceD3;
4883 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
4884 
4885 typedef enum {
4886   DevicePropertyDeviceDescription = 0x0,
4887   DevicePropertyHardwareID = 0x1,
4888   DevicePropertyCompatibleIDs = 0x2,
4889   DevicePropertyBootConfiguration = 0x3,
4890   DevicePropertyBootConfigurationTranslated = 0x4,
4891   DevicePropertyClassName = 0x5,
4892   DevicePropertyClassGuid = 0x6,
4893   DevicePropertyDriverKeyName = 0x7,
4894   DevicePropertyManufacturer = 0x8,
4895   DevicePropertyFriendlyName = 0x9,
4896   DevicePropertyLocationInformation = 0xa,
4897   DevicePropertyPhysicalDeviceObjectName = 0xb,
4898   DevicePropertyBusTypeGuid = 0xc,
4899   DevicePropertyLegacyBusType = 0xd,
4900   DevicePropertyBusNumber = 0xe,
4901   DevicePropertyEnumeratorName = 0xf,
4902   DevicePropertyAddress = 0x10,
4903   DevicePropertyUINumber = 0x11,
4904   DevicePropertyInstallState = 0x12,
4905   DevicePropertyRemovalPolicy = 0x13,
4906   DevicePropertyResourceRequirements = 0x14,
4907   DevicePropertyAllocatedResources = 0x15,
4908   DevicePropertyContainerID = 0x16
4909 } DEVICE_REGISTRY_PROPERTY;
4910 
4911 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
4912   EventCategoryReserved,
4913   EventCategoryHardwareProfileChange,
4914   EventCategoryDeviceInterfaceChange,
4915   EventCategoryTargetDeviceChange
4916 } IO_NOTIFICATION_EVENT_CATEGORY;
4917 
4918 typedef enum _IO_PRIORITY_HINT {
4919   IoPriorityVeryLow = 0,
4920   IoPriorityLow,
4921   IoPriorityNormal,
4922   IoPriorityHigh,
4923   IoPriorityCritical,
4924   MaxIoPriorityTypes
4925 } IO_PRIORITY_HINT;
4926 
4927 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
4928 
4929 typedef NTSTATUS
4930 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
4931   IN PVOID NotificationStructure,
4932   IN PVOID Context);
4933 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE;
4934 
4935 typedef VOID
4936 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)(
4937   IN PVOID Context);
4938 typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK;
4939 
4940 typedef enum _FILE_INFORMATION_CLASS {
4941   FileDirectoryInformation = 1,
4942   FileFullDirectoryInformation,
4943   FileBothDirectoryInformation,
4944   FileBasicInformation,
4945   FileStandardInformation,
4946   FileInternalInformation,
4947   FileEaInformation,
4948   FileAccessInformation,
4949   FileNameInformation,
4950   FileRenameInformation,
4951   FileLinkInformation,
4952   FileNamesInformation,
4953   FileDispositionInformation,
4954   FilePositionInformation,
4955   FileFullEaInformation,
4956   FileModeInformation,
4957   FileAlignmentInformation,
4958   FileAllInformation,
4959   FileAllocationInformation,
4960   FileEndOfFileInformation,
4961   FileAlternateNameInformation,
4962   FileStreamInformation,
4963   FilePipeInformation,
4964   FilePipeLocalInformation,
4965   FilePipeRemoteInformation,
4966   FileMailslotQueryInformation,
4967   FileMailslotSetInformation,
4968   FileCompressionInformation,
4969   FileObjectIdInformation,
4970   FileCompletionInformation,
4971   FileMoveClusterInformation,
4972   FileQuotaInformation,
4973   FileReparsePointInformation,
4974   FileNetworkOpenInformation,
4975   FileAttributeTagInformation,
4976   FileTrackingInformation,
4977   FileIdBothDirectoryInformation,
4978   FileIdFullDirectoryInformation,
4979   FileValidDataLengthInformation,
4980   FileShortNameInformation,
4981   FileIoCompletionNotificationInformation,
4982   FileIoStatusBlockRangeInformation,
4983   FileIoPriorityHintInformation,
4984   FileSfioReserveInformation,
4985   FileSfioVolumeInformation,
4986   FileHardLinkInformation,
4987   FileProcessIdsUsingFileInformation,
4988   FileNormalizedNameInformation,
4989   FileNetworkPhysicalNameInformation,
4990   FileIdGlobalTxDirectoryInformation,
4991   FileIsRemoteDeviceInformation,
4992   FileAttributeCacheInformation,
4993   FileNumaNodeInformation,
4994   FileStandardLinkInformation,
4995   FileRemoteProtocolInformation,
4996   FileMaximumInformation
4997 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
4998 
4999 typedef struct _FILE_POSITION_INFORMATION {
5000   LARGE_INTEGER CurrentByteOffset;
5001 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
5002 
5003 typedef struct _FILE_BASIC_INFORMATION {
5004   LARGE_INTEGER CreationTime;
5005   LARGE_INTEGER LastAccessTime;
5006   LARGE_INTEGER LastWriteTime;
5007   LARGE_INTEGER ChangeTime;
5008   ULONG FileAttributes;
5009 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
5010 
5011 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
5012   IO_PRIORITY_HINT PriorityHint;
5013 } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
5014 
5015 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
5016   ULONG Flags;
5017 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
5018 
5019 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
5020   PUCHAR IoStatusBlockRange;
5021   ULONG Length;
5022 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
5023 
5024 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION {
5025   BOOLEAN IsRemote;
5026 } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
5027 
5028 typedef struct _FILE_NUMA_NODE_INFORMATION {
5029   USHORT NodeNumber;
5030 } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
5031 
5032 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
5033   ULONG NumberOfProcessIdsInList;
5034   ULONG_PTR ProcessIdList[1];
5035 } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
5036 
5037 typedef struct _FILE_STANDARD_INFORMATION {
5038   LARGE_INTEGER AllocationSize;
5039   LARGE_INTEGER EndOfFile;
5040   ULONG NumberOfLinks;
5041   BOOLEAN DeletePending;
5042   BOOLEAN Directory;
5043 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
5044 
5045 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
5046   LARGE_INTEGER CreationTime;
5047   LARGE_INTEGER LastAccessTime;
5048   LARGE_INTEGER LastWriteTime;
5049   LARGE_INTEGER ChangeTime;
5050   LARGE_INTEGER AllocationSize;
5051   LARGE_INTEGER EndOfFile;
5052   ULONG FileAttributes;
5053 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
5054 
5055 typedef enum _FSINFOCLASS {
5056   FileFsVolumeInformation = 1,
5057   FileFsLabelInformation,
5058   FileFsSizeInformation,
5059   FileFsDeviceInformation,
5060   FileFsAttributeInformation,
5061   FileFsControlInformation,
5062   FileFsFullSizeInformation,
5063   FileFsObjectIdInformation,
5064   FileFsDriverPathInformation,
5065   FileFsVolumeFlagsInformation,
5066   FileFsMaximumInformation
5067 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
5068 
5069 typedef struct _FILE_FS_DEVICE_INFORMATION {
5070   DEVICE_TYPE DeviceType;
5071   ULONG Characteristics;
5072 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
5073 
5074 typedef struct _FILE_FULL_EA_INFORMATION {
5075   ULONG NextEntryOffset;
5076   UCHAR Flags;
5077   UCHAR EaNameLength;
5078   USHORT EaValueLength;
5079   CHAR EaName[1];
5080 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
5081 
5082 typedef struct _FILE_SFIO_RESERVE_INFORMATION {
5083   ULONG RequestsPerPeriod;
5084   ULONG Period;
5085   BOOLEAN RetryFailures;
5086   BOOLEAN Discardable;
5087   ULONG RequestSize;
5088   ULONG NumOutstandingRequests;
5089 } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
5090 
5091 typedef struct _FILE_SFIO_VOLUME_INFORMATION {
5092   ULONG MaximumRequestsPerPeriod;
5093   ULONG MinimumPeriod;
5094   ULONG MinimumTransferSize;
5095 } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
5096 
5097 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS     0x1
5098 #define FILE_SKIP_SET_EVENT_ON_HANDLE            0x2
5099 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO      0x4
5100 
5101 #define FM_LOCK_BIT             (0x1)
5102 #define FM_LOCK_BIT_V           (0x0)
5103 #define FM_LOCK_WAITER_WOKEN    (0x2)
5104 #define FM_LOCK_WAITER_INC      (0x4)
5105 
5106 typedef BOOLEAN
5107 (NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
5108   IN struct _FILE_OBJECT *FileObject,
5109   IN PLARGE_INTEGER FileOffset,
5110   IN ULONG Length,
5111   IN BOOLEAN Wait,
5112   IN ULONG LockKey,
5113   IN BOOLEAN CheckForReadOperation,
5114   OUT PIO_STATUS_BLOCK IoStatus,
5115   IN struct _DEVICE_OBJECT *DeviceObject);
5116 typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
5117 
5118 typedef BOOLEAN
5119 (NTAPI FAST_IO_READ)(
5120   IN struct _FILE_OBJECT *FileObject,
5121   IN PLARGE_INTEGER FileOffset,
5122   IN ULONG Length,
5123   IN BOOLEAN Wait,
5124   IN ULONG LockKey,
5125   OUT PVOID Buffer,
5126   OUT PIO_STATUS_BLOCK IoStatus,
5127   IN struct _DEVICE_OBJECT *DeviceObject);
5128 typedef FAST_IO_READ *PFAST_IO_READ;
5129 
5130 typedef BOOLEAN
5131 (NTAPI FAST_IO_WRITE)(
5132   IN struct _FILE_OBJECT *FileObject,
5133   IN PLARGE_INTEGER FileOffset,
5134   IN ULONG Length,
5135   IN BOOLEAN Wait,
5136   IN ULONG LockKey,
5137   IN PVOID Buffer,
5138   OUT PIO_STATUS_BLOCK IoStatus,
5139   IN struct _DEVICE_OBJECT *DeviceObject);
5140 typedef FAST_IO_WRITE *PFAST_IO_WRITE;
5141 
5142 typedef BOOLEAN
5143 (NTAPI FAST_IO_QUERY_BASIC_INFO)(
5144   IN struct _FILE_OBJECT *FileObject,
5145   IN BOOLEAN Wait,
5146   OUT PFILE_BASIC_INFORMATION Buffer,
5147   OUT PIO_STATUS_BLOCK IoStatus,
5148   IN struct _DEVICE_OBJECT *DeviceObject);
5149 typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
5150 
5151 typedef BOOLEAN
5152 (NTAPI FAST_IO_QUERY_STANDARD_INFO)(
5153   IN struct _FILE_OBJECT *FileObject,
5154   IN BOOLEAN Wait,
5155   OUT PFILE_STANDARD_INFORMATION Buffer,
5156   OUT PIO_STATUS_BLOCK IoStatus,
5157   IN struct _DEVICE_OBJECT *DeviceObject);
5158 typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
5159 
5160 typedef BOOLEAN
5161 (NTAPI FAST_IO_LOCK)(
5162   IN struct _FILE_OBJECT *FileObject,
5163   IN PLARGE_INTEGER FileOffset,
5164   IN PLARGE_INTEGER Length,
5165   PEPROCESS ProcessId,
5166   ULONG Key,
5167   BOOLEAN FailImmediately,
5168   BOOLEAN ExclusiveLock,
5169   OUT PIO_STATUS_BLOCK IoStatus,
5170   IN struct _DEVICE_OBJECT *DeviceObject);
5171 typedef FAST_IO_LOCK *PFAST_IO_LOCK;
5172 
5173 typedef BOOLEAN
5174 (NTAPI FAST_IO_UNLOCK_SINGLE)(
5175   IN struct _FILE_OBJECT *FileObject,
5176   IN PLARGE_INTEGER FileOffset,
5177   IN PLARGE_INTEGER Length,
5178   PEPROCESS ProcessId,
5179   ULONG Key,
5180   OUT PIO_STATUS_BLOCK IoStatus,
5181   IN struct _DEVICE_OBJECT *DeviceObject);
5182 typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
5183 
5184 typedef BOOLEAN
5185 (NTAPI FAST_IO_UNLOCK_ALL)(
5186   IN struct _FILE_OBJECT *FileObject,
5187   PEPROCESS ProcessId,
5188   OUT PIO_STATUS_BLOCK IoStatus,
5189   IN struct _DEVICE_OBJECT *DeviceObject);
5190 typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
5191 
5192 typedef BOOLEAN
5193 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
5194   IN struct _FILE_OBJECT *FileObject,
5195   PVOID ProcessId,
5196   ULONG Key,
5197   OUT PIO_STATUS_BLOCK IoStatus,
5198   IN struct _DEVICE_OBJECT *DeviceObject);
5199 typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
5200 
5201 typedef BOOLEAN
5202 (NTAPI FAST_IO_DEVICE_CONTROL)(
5203   IN struct _FILE_OBJECT *FileObject,
5204   IN BOOLEAN Wait,
5205   IN PVOID InputBuffer OPTIONAL,
5206   IN ULONG InputBufferLength,
5207   OUT PVOID OutputBuffer OPTIONAL,
5208   IN ULONG OutputBufferLength,
5209   IN ULONG IoControlCode,
5210   OUT PIO_STATUS_BLOCK IoStatus,
5211   IN struct _DEVICE_OBJECT *DeviceObject);
5212 typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
5213 
5214 typedef VOID
5215 (NTAPI FAST_IO_ACQUIRE_FILE)(
5216   IN struct _FILE_OBJECT *FileObject);
5217 typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
5218 
5219 typedef VOID
5220 (NTAPI FAST_IO_RELEASE_FILE)(
5221   IN struct _FILE_OBJECT *FileObject);
5222 typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
5223 
5224 typedef VOID
5225 (NTAPI FAST_IO_DETACH_DEVICE)(
5226   IN struct _DEVICE_OBJECT *SourceDevice,
5227   IN struct _DEVICE_OBJECT *TargetDevice);
5228 typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
5229 
5230 typedef BOOLEAN
5231 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
5232   IN struct _FILE_OBJECT *FileObject,
5233   IN BOOLEAN Wait,
5234   OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
5235   OUT struct _IO_STATUS_BLOCK *IoStatus,
5236   IN struct _DEVICE_OBJECT *DeviceObject);
5237 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
5238 
5239 typedef NTSTATUS
5240 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
5241   IN struct _FILE_OBJECT *FileObject,
5242   IN PLARGE_INTEGER EndingOffset,
5243   OUT struct _ERESOURCE **ResourceToRelease,
5244   IN struct _DEVICE_OBJECT *DeviceObject);
5245 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
5246 
5247 typedef BOOLEAN
5248 (NTAPI FAST_IO_MDL_READ)(
5249   IN struct _FILE_OBJECT *FileObject,
5250   IN PLARGE_INTEGER FileOffset,
5251   IN ULONG Length,
5252   IN ULONG LockKey,
5253   OUT PMDL *MdlChain,
5254   OUT PIO_STATUS_BLOCK IoStatus,
5255   IN struct _DEVICE_OBJECT *DeviceObject);
5256 typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
5257 
5258 typedef BOOLEAN
5259 (NTAPI FAST_IO_MDL_READ_COMPLETE)(
5260   IN struct _FILE_OBJECT *FileObject,
5261   IN PMDL MdlChain,
5262   IN struct _DEVICE_OBJECT *DeviceObject);
5263 typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
5264 
5265 typedef BOOLEAN
5266 (NTAPI FAST_IO_PREPARE_MDL_WRITE)(
5267   IN struct _FILE_OBJECT *FileObject,
5268   IN PLARGE_INTEGER FileOffset,
5269   IN ULONG Length,
5270   IN ULONG LockKey,
5271   OUT PMDL *MdlChain,
5272   OUT PIO_STATUS_BLOCK IoStatus,
5273   IN struct _DEVICE_OBJECT *DeviceObject);
5274 typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
5275 
5276 typedef BOOLEAN
5277 (NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
5278   IN struct _FILE_OBJECT *FileObject,
5279   IN PLARGE_INTEGER FileOffset,
5280   IN PMDL MdlChain,
5281   IN struct _DEVICE_OBJECT *DeviceObject);
5282 typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
5283 
5284 typedef BOOLEAN
5285 (NTAPI FAST_IO_READ_COMPRESSED)(
5286   IN struct _FILE_OBJECT *FileObject,
5287   IN PLARGE_INTEGER FileOffset,
5288   IN ULONG Length,
5289   IN ULONG LockKey,
5290   OUT PVOID Buffer,
5291   OUT PMDL *MdlChain,
5292   OUT PIO_STATUS_BLOCK IoStatus,
5293   OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
5294   IN ULONG CompressedDataInfoLength,
5295   IN struct _DEVICE_OBJECT *DeviceObject);
5296 typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
5297 
5298 typedef BOOLEAN
5299 (NTAPI FAST_IO_WRITE_COMPRESSED)(
5300   IN struct _FILE_OBJECT *FileObject,
5301   IN PLARGE_INTEGER FileOffset,
5302   IN ULONG Length,
5303   IN ULONG LockKey,
5304   IN PVOID Buffer,
5305   OUT PMDL *MdlChain,
5306   OUT PIO_STATUS_BLOCK IoStatus,
5307   IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
5308   IN ULONG CompressedDataInfoLength,
5309   IN struct _DEVICE_OBJECT *DeviceObject);
5310 typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
5311 
5312 typedef BOOLEAN
5313 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
5314   IN struct _FILE_OBJECT *FileObject,
5315   IN PMDL MdlChain,
5316   IN struct _DEVICE_OBJECT *DeviceObject);
5317 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
5318 
5319 typedef BOOLEAN
5320 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
5321   IN struct _FILE_OBJECT *FileObject,
5322   IN PLARGE_INTEGER FileOffset,
5323   IN PMDL MdlChain,
5324   IN struct _DEVICE_OBJECT *DeviceObject);
5325 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
5326 
5327 typedef BOOLEAN
5328 (NTAPI FAST_IO_QUERY_OPEN)(
5329   IN struct _IRP *Irp,
5330   OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
5331   IN struct _DEVICE_OBJECT *DeviceObject);
5332 typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
5333 
5334 typedef NTSTATUS
5335 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
5336   IN struct _FILE_OBJECT *FileObject,
5337   IN struct _ERESOURCE *ResourceToRelease,
5338   IN struct _DEVICE_OBJECT *DeviceObject);
5339 typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
5340 
5341 typedef NTSTATUS
5342 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
5343   IN struct _FILE_OBJECT *FileObject,
5344   IN struct _DEVICE_OBJECT *DeviceObject);
5345 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
5346 
5347 typedef NTSTATUS
5348 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
5349   IN struct _FILE_OBJECT *FileObject,
5350   IN struct _DEVICE_OBJECT *DeviceObject);
5351 typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
5352 
5353 typedef struct _FAST_IO_DISPATCH {
5354   ULONG SizeOfFastIoDispatch;
5355   PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
5356   PFAST_IO_READ FastIoRead;
5357   PFAST_IO_WRITE FastIoWrite;
5358   PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
5359   PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
5360   PFAST_IO_LOCK FastIoLock;
5361   PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
5362   PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
5363   PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
5364   PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
5365   PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
5366   PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
5367   PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
5368   PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
5369   PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
5370   PFAST_IO_MDL_READ MdlRead;
5371   PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
5372   PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
5373   PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
5374   PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
5375   PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
5376   PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
5377   PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
5378   PFAST_IO_QUERY_OPEN FastIoQueryOpen;
5379   PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
5380   PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
5381   PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
5382 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
5383 
5384 typedef struct _SECTION_OBJECT_POINTERS {
5385   PVOID DataSectionObject;
5386   PVOID SharedCacheMap;
5387   PVOID ImageSectionObject;
5388 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
5389 
5390 typedef struct _IO_COMPLETION_CONTEXT {
5391   PVOID Port;
5392   PVOID Key;
5393 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
5394 
5395 /* FILE_OBJECT.Flags */
5396 #define FO_FILE_OPEN                 0x00000001
5397 #define FO_SYNCHRONOUS_IO            0x00000002
5398 #define FO_ALERTABLE_IO              0x00000004
5399 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
5400 #define FO_WRITE_THROUGH             0x00000010
5401 #define FO_SEQUENTIAL_ONLY           0x00000020
5402 #define FO_CACHE_SUPPORTED           0x00000040
5403 #define FO_NAMED_PIPE                0x00000080
5404 #define FO_STREAM_FILE               0x00000100
5405 #define FO_MAILSLOT                  0x00000200
5406 #define FO_GENERATE_AUDIT_ON_CLOSE   0x00000400
5407 #define FO_QUEUE_IRP_TO_THREAD       0x00000400
5408 #define FO_DIRECT_DEVICE_OPEN        0x00000800
5409 #define FO_FILE_MODIFIED             0x00001000
5410 #define FO_FILE_SIZE_CHANGED         0x00002000
5411 #define FO_CLEANUP_COMPLETE          0x00004000
5412 #define FO_TEMPORARY_FILE            0x00008000
5413 #define FO_DELETE_ON_CLOSE           0x00010000
5414 #define FO_OPENED_CASE_SENSITIVE     0x00020000
5415 #define FO_HANDLE_CREATED            0x00040000
5416 #define FO_FILE_FAST_IO_READ         0x00080000
5417 #define FO_RANDOM_ACCESS             0x00100000
5418 #define FO_FILE_OPEN_CANCELLED       0x00200000
5419 #define FO_VOLUME_OPEN               0x00400000
5420 #define FO_REMOTE_ORIGIN             0x01000000
5421 #define FO_DISALLOW_EXCLUSIVE        0x02000000
5422 #define FO_SKIP_COMPLETION_PORT      0x02000000
5423 #define FO_SKIP_SET_EVENT            0x04000000
5424 #define FO_SKIP_SET_FAST_IO          0x08000000
5425 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
5426 
5427 /* VPB.Flags */
5428 #define VPB_MOUNTED                       0x0001
5429 #define VPB_LOCKED                        0x0002
5430 #define VPB_PERSISTENT                    0x0004
5431 #define VPB_REMOVE_PENDING                0x0008
5432 #define VPB_RAW_MOUNT                     0x0010
5433 #define VPB_DIRECT_WRITES_ALLOWED         0x0020
5434 
5435 /* IRP.Flags */
5436 
5437 #define SL_FORCE_ACCESS_CHECK             0x01
5438 #define SL_OPEN_PAGING_FILE               0x02
5439 #define SL_OPEN_TARGET_DIRECTORY          0x04
5440 #define SL_STOP_ON_SYMLINK                0x08
5441 #define SL_CASE_SENSITIVE                 0x80
5442 
5443 #define SL_KEY_SPECIFIED                  0x01
5444 #define SL_OVERRIDE_VERIFY_VOLUME         0x02
5445 #define SL_WRITE_THROUGH                  0x04
5446 #define SL_FT_SEQUENTIAL_WRITE            0x08
5447 #define SL_FORCE_DIRECT_WRITE             0x10
5448 #define SL_REALTIME_STREAM                0x20
5449 
5450 #define SL_READ_ACCESS_GRANTED            0x01
5451 #define SL_WRITE_ACCESS_GRANTED           0x04
5452 
5453 #define SL_FAIL_IMMEDIATELY               0x01
5454 #define SL_EXCLUSIVE_LOCK                 0x02
5455 
5456 #define SL_RESTART_SCAN                   0x01
5457 #define SL_RETURN_SINGLE_ENTRY            0x02
5458 #define SL_INDEX_SPECIFIED                0x04
5459 
5460 #define SL_WATCH_TREE                     0x01
5461 
5462 #define SL_ALLOW_RAW_MOUNT                0x01
5463 
5464 #define CTL_CODE(DeviceType, Function, Method, Access) \
5465   (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
5466 
5467 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
5468 
5469 #define METHOD_FROM_CTL_CODE(ctrlCode)          ((ULONG)(ctrlCode & 3))
5470 
5471 #define IRP_NOCACHE                     0x00000001
5472 #define IRP_PAGING_IO                   0x00000002
5473 #define IRP_MOUNT_COMPLETION            0x00000002
5474 #define IRP_SYNCHRONOUS_API             0x00000004
5475 #define IRP_ASSOCIATED_IRP              0x00000008
5476 #define IRP_BUFFERED_IO                 0x00000010
5477 #define IRP_DEALLOCATE_BUFFER           0x00000020
5478 #define IRP_INPUT_OPERATION             0x00000040
5479 #define IRP_SYNCHRONOUS_PAGING_IO       0x00000040
5480 #define IRP_CREATE_OPERATION            0x00000080
5481 #define IRP_READ_OPERATION              0x00000100
5482 #define IRP_WRITE_OPERATION             0x00000200
5483 #define IRP_CLOSE_OPERATION             0x00000400
5484 #define IRP_DEFER_IO_COMPLETION         0x00000800
5485 #define IRP_OB_QUERY_NAME               0x00001000
5486 #define IRP_HOLD_DEVICE_QUEUE           0x00002000
5487 #define IRP_RETRY_IO_COMPLETION         0x00004000
5488 #define IRP_CLASS_CACHE_OPERATION       0x00008000
5489 
5490 #define IRP_QUOTA_CHARGED                 0x01
5491 #define IRP_ALLOCATED_MUST_SUCCEED        0x02
5492 #define IRP_ALLOCATED_FIXED_SIZE          0x04
5493 #define IRP_LOOKASIDE_ALLOCATION          0x08
5494 
5495 /*
5496 ** IRP function codes
5497 */
5498 
5499 #define IRP_MJ_CREATE                     0x00
5500 #define IRP_MJ_CREATE_NAMED_PIPE          0x01
5501 #define IRP_MJ_CLOSE                      0x02
5502 #define IRP_MJ_READ                       0x03
5503 #define IRP_MJ_WRITE                      0x04
5504 #define IRP_MJ_QUERY_INFORMATION          0x05
5505 #define IRP_MJ_SET_INFORMATION            0x06
5506 #define IRP_MJ_QUERY_EA                   0x07
5507 #define IRP_MJ_SET_EA                     0x08
5508 #define IRP_MJ_FLUSH_BUFFERS              0x09
5509 #define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
5510 #define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
5511 #define IRP_MJ_DIRECTORY_CONTROL          0x0c
5512 #define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
5513 #define IRP_MJ_DEVICE_CONTROL             0x0e
5514 #define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
5515 #define IRP_MJ_SCSI                       0x0f
5516 #define IRP_MJ_SHUTDOWN                   0x10
5517 #define IRP_MJ_LOCK_CONTROL               0x11
5518 #define IRP_MJ_CLEANUP                    0x12
5519 #define IRP_MJ_CREATE_MAILSLOT            0x13
5520 #define IRP_MJ_QUERY_SECURITY             0x14
5521 #define IRP_MJ_SET_SECURITY               0x15
5522 #define IRP_MJ_POWER                      0x16
5523 #define IRP_MJ_SYSTEM_CONTROL             0x17
5524 #define IRP_MJ_DEVICE_CHANGE              0x18
5525 #define IRP_MJ_QUERY_QUOTA                0x19
5526 #define IRP_MJ_SET_QUOTA                  0x1a
5527 #define IRP_MJ_PNP                        0x1b
5528 #define IRP_MJ_PNP_POWER                  0x1b
5529 #define IRP_MJ_MAXIMUM_FUNCTION           0x1b
5530 
5531 #define IRP_MN_SCSI_CLASS                 0x01
5532 
5533 #define IRP_MN_START_DEVICE               0x00
5534 #define IRP_MN_QUERY_REMOVE_DEVICE        0x01
5535 #define IRP_MN_REMOVE_DEVICE              0x02
5536 #define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
5537 #define IRP_MN_STOP_DEVICE                0x04
5538 #define IRP_MN_QUERY_STOP_DEVICE          0x05
5539 #define IRP_MN_CANCEL_STOP_DEVICE         0x06
5540 
5541 #define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
5542 #define IRP_MN_QUERY_INTERFACE              0x08
5543 #define IRP_MN_QUERY_CAPABILITIES           0x09
5544 #define IRP_MN_QUERY_RESOURCES              0x0A
5545 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
5546 #define IRP_MN_QUERY_DEVICE_TEXT            0x0C
5547 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
5548 
5549 #define IRP_MN_READ_CONFIG                  0x0F
5550 #define IRP_MN_WRITE_CONFIG                 0x10
5551 #define IRP_MN_EJECT                        0x11
5552 #define IRP_MN_SET_LOCK                     0x12
5553 #define IRP_MN_QUERY_ID                     0x13
5554 #define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
5555 #define IRP_MN_QUERY_BUS_INFORMATION        0x15
5556 #define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
5557 #define IRP_MN_SURPRISE_REMOVAL             0x17
5558 #if (NTDDI_VERSION >= NTDDI_WIN7)
5559 #define IRP_MN_DEVICE_ENUMERATED            0x19
5560 #endif
5561 
5562 #define IRP_MN_WAIT_WAKE                  0x00
5563 #define IRP_MN_POWER_SEQUENCE             0x01
5564 #define IRP_MN_SET_POWER                  0x02
5565 #define IRP_MN_QUERY_POWER                0x03
5566 
5567 #define IRP_MN_QUERY_ALL_DATA             0x00
5568 #define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
5569 #define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
5570 #define IRP_MN_CHANGE_SINGLE_ITEM         0x03
5571 #define IRP_MN_ENABLE_EVENTS              0x04
5572 #define IRP_MN_DISABLE_EVENTS             0x05
5573 #define IRP_MN_ENABLE_COLLECTION          0x06
5574 #define IRP_MN_DISABLE_COLLECTION         0x07
5575 #define IRP_MN_REGINFO                    0x08
5576 #define IRP_MN_EXECUTE_METHOD             0x09
5577 
5578 #define IRP_MN_REGINFO_EX                 0x0b
5579 
5580 typedef struct _FILE_OBJECT {
5581   CSHORT Type;
5582   CSHORT Size;
5583   PDEVICE_OBJECT DeviceObject;
5584   PVPB Vpb;
5585   PVOID FsContext;
5586   PVOID FsContext2;
5587   PSECTION_OBJECT_POINTERS SectionObjectPointer;
5588   PVOID PrivateCacheMap;
5589   NTSTATUS FinalStatus;
5590   struct _FILE_OBJECT *RelatedFileObject;
5591   BOOLEAN LockOperation;
5592   BOOLEAN DeletePending;
5593   BOOLEAN ReadAccess;
5594   BOOLEAN WriteAccess;
5595   BOOLEAN DeleteAccess;
5596   BOOLEAN SharedRead;
5597   BOOLEAN SharedWrite;
5598   BOOLEAN SharedDelete;
5599   ULONG Flags;
5600   UNICODE_STRING FileName;
5601   LARGE_INTEGER CurrentByteOffset;
5602   volatile ULONG Waiters;
5603   volatile ULONG Busy;
5604   PVOID LastLock;
5605   KEVENT Lock;
5606   KEVENT Event;
5607   volatile PIO_COMPLETION_CONTEXT CompletionContext;
5608   KSPIN_LOCK IrpListLock;
5609   LIST_ENTRY IrpList;
5610   volatile PVOID FileObjectExtension;
5611 } FILE_OBJECT, *PFILE_OBJECT;
5612 
5613 typedef struct _IO_ERROR_LOG_PACKET {
5614   UCHAR MajorFunctionCode;
5615   UCHAR RetryCount;
5616   USHORT DumpDataSize;
5617   USHORT NumberOfStrings;
5618   USHORT StringOffset;
5619   USHORT EventCategory;
5620   NTSTATUS ErrorCode;
5621   ULONG UniqueErrorValue;
5622   NTSTATUS FinalStatus;
5623   ULONG SequenceNumber;
5624   ULONG IoControlCode;
5625   LARGE_INTEGER DeviceOffset;
5626   ULONG DumpData[1];
5627 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
5628 
5629 typedef struct _IO_ERROR_LOG_MESSAGE {
5630   USHORT Type;
5631   USHORT Size;
5632   USHORT DriverNameLength;
5633   LARGE_INTEGER TimeStamp;
5634   ULONG DriverNameOffset;
5635   IO_ERROR_LOG_PACKET EntryData;
5636 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
5637 
5638 #define ERROR_LOG_LIMIT_SIZE               240
5639 
5640 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
5641                                             sizeof(IO_ERROR_LOG_PACKET) +  \
5642                                             (sizeof(WCHAR) * 40))
5643 
5644 #define ERROR_LOG_MESSAGE_LIMIT_SIZE                                       \
5645     (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5646 
5647 #define IO_ERROR_LOG_MESSAGE_LENGTH                                        \
5648     ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ?        \
5649         ERROR_LOG_MESSAGE_LIMIT_SIZE :                                     \
5650         PORT_MAXIMUM_MESSAGE_LENGTH)
5651 
5652 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH -              \
5653                                 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5654 
5655 #ifdef _WIN64
5656 #define PORT_MAXIMUM_MESSAGE_LENGTH    512
5657 #else
5658 #define PORT_MAXIMUM_MESSAGE_LENGTH    256
5659 #endif
5660 
5661 typedef enum _DMA_WIDTH {
5662   Width8Bits,
5663   Width16Bits,
5664   Width32Bits,
5665   MaximumDmaWidth
5666 } DMA_WIDTH, *PDMA_WIDTH;
5667 
5668 typedef enum _DMA_SPEED {
5669   Compatible,
5670   TypeA,
5671   TypeB,
5672   TypeC,
5673   TypeF,
5674   MaximumDmaSpeed
5675 } DMA_SPEED, *PDMA_SPEED;
5676 
5677 /* DEVICE_DESCRIPTION.Version */
5678 
5679 #define DEVICE_DESCRIPTION_VERSION        0x0000
5680 #define DEVICE_DESCRIPTION_VERSION1       0x0001
5681 #define DEVICE_DESCRIPTION_VERSION2       0x0002
5682 
5683 typedef struct _DEVICE_DESCRIPTION {
5684   ULONG Version;
5685   BOOLEAN Master;
5686   BOOLEAN ScatterGather;
5687   BOOLEAN DemandMode;
5688   BOOLEAN AutoInitialize;
5689   BOOLEAN Dma32BitAddresses;
5690   BOOLEAN IgnoreCount;
5691   BOOLEAN Reserved1;
5692   BOOLEAN Dma64BitAddresses;
5693   ULONG BusNumber;
5694   ULONG DmaChannel;
5695   INTERFACE_TYPE InterfaceType;
5696   DMA_WIDTH DmaWidth;
5697   DMA_SPEED DmaSpeed;
5698   ULONG MaximumLength;
5699   ULONG DmaPort;
5700 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
5701 
5702 typedef enum _DEVICE_RELATION_TYPE {
5703   BusRelations,
5704   EjectionRelations,
5705   PowerRelations,
5706   RemovalRelations,
5707   TargetDeviceRelation,
5708   SingleBusRelations,
5709   TransportRelations
5710 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
5711 
5712 typedef struct _DEVICE_RELATIONS {
5713   ULONG Count;
5714   PDEVICE_OBJECT Objects[1];
5715 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
5716 
5717 typedef struct _DEVOBJ_EXTENSION {
5718   CSHORT Type;
5719   USHORT Size;
5720   PDEVICE_OBJECT DeviceObject;
5721 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
5722 
5723 typedef struct _SCATTER_GATHER_ELEMENT {
5724   PHYSICAL_ADDRESS Address;
5725   ULONG Length;
5726   ULONG_PTR Reserved;
5727 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
5728 
5729 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
5730 
5731 #if defined(_MSC_VER)
5732 #if _MSC_VER >= 1200
5733 #pragma warning(push)
5734 #endif
5735 #pragma warning(disable:4200)
5736 #endif /* _MSC_VER */
5737 
5738 typedef struct _SCATTER_GATHER_LIST {
5739   ULONG NumberOfElements;
5740   ULONG_PTR Reserved;
5741   SCATTER_GATHER_ELEMENT Elements[1];
5742 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
5743 
5744 #if defined(_MSC_VER)
5745 #if _MSC_VER >= 1200
5746 #pragma warning(pop)
5747 #else
5748 #pragma warning(default:4200)
5749 #endif
5750 #endif /* _MSC_VER */
5751 
5752 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
5753 
5754 struct _SCATTER_GATHER_LIST;
5755 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
5756 
5757 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
5758 
5759 typedef NTSTATUS
5760 (NTAPI DRIVER_ADD_DEVICE)(
5761   IN struct _DRIVER_OBJECT *DriverObject,
5762   IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
5763 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
5764 
5765 typedef struct _DRIVER_EXTENSION {
5766   struct _DRIVER_OBJECT *DriverObject;
5767   PDRIVER_ADD_DEVICE AddDevice;
5768   ULONG Count;
5769   UNICODE_STRING ServiceKeyName;
5770 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
5771 
5772 #define DRVO_UNLOAD_INVOKED               0x00000001
5773 #define DRVO_LEGACY_DRIVER                0x00000002
5774 #define DRVO_BUILTIN_DRIVER               0x00000004
5775 
5776 typedef NTSTATUS
5777 (NTAPI DRIVER_INITIALIZE)(
5778   IN struct _DRIVER_OBJECT *DriverObject,
5779   IN PUNICODE_STRING RegistryPath);
5780 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
5781 
5782 typedef VOID
5783 (NTAPI DRIVER_STARTIO)(
5784   IN struct _DEVICE_OBJECT *DeviceObject,
5785   IN struct _IRP *Irp);
5786 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
5787 
5788 typedef VOID
5789 (NTAPI DRIVER_UNLOAD)(
5790   IN struct _DRIVER_OBJECT *DriverObject);
5791 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
5792 
5793 typedef NTSTATUS
5794 (NTAPI DRIVER_DISPATCH)(
5795   IN struct _DEVICE_OBJECT *DeviceObject,
5796   IN struct _IRP *Irp);
5797 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
5798 
5799 typedef struct _DRIVER_OBJECT {
5800   CSHORT Type;
5801   CSHORT Size;
5802   PDEVICE_OBJECT DeviceObject;
5803   ULONG Flags;
5804   PVOID DriverStart;
5805   ULONG DriverSize;
5806   PVOID DriverSection;
5807   PDRIVER_EXTENSION DriverExtension;
5808   UNICODE_STRING DriverName;
5809   PUNICODE_STRING HardwareDatabase;
5810   struct _FAST_IO_DISPATCH *FastIoDispatch;
5811   PDRIVER_INITIALIZE DriverInit;
5812   PDRIVER_STARTIO DriverStartIo;
5813   PDRIVER_UNLOAD DriverUnload;
5814   PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
5815 } DRIVER_OBJECT, *PDRIVER_OBJECT;
5816 
5817 typedef struct _DMA_ADAPTER {
5818   USHORT Version;
5819   USHORT Size;
5820   struct _DMA_OPERATIONS* DmaOperations;
5821 } DMA_ADAPTER, *PDMA_ADAPTER;
5822 
5823 typedef enum
5824 {
5825     DmaComplete,
5826     DmaAborted,
5827     DmaError,
5828     DmaCancelled,
5829 } DMA_COMPLETION_STATUS;
5830 
5831 typedef VOID
5832 (NTAPI *PPUT_DMA_ADAPTER)(
5833   IN PDMA_ADAPTER DmaAdapter);
5834 
5835 typedef PVOID
5836 (NTAPI *PALLOCATE_COMMON_BUFFER)(
5837   IN PDMA_ADAPTER DmaAdapter,
5838   IN ULONG Length,
5839   OUT PPHYSICAL_ADDRESS LogicalAddress,
5840   IN BOOLEAN CacheEnabled);
5841 
5842 typedef VOID
5843 (NTAPI *PFREE_COMMON_BUFFER)(
5844   IN PDMA_ADAPTER DmaAdapter,
5845   IN ULONG Length,
5846   IN PHYSICAL_ADDRESS LogicalAddress,
5847   IN PVOID VirtualAddress,
5848   IN BOOLEAN CacheEnabled);
5849 
5850 typedef NTSTATUS
5851 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
5852   IN PDMA_ADAPTER DmaAdapter,
5853   IN PDEVICE_OBJECT DeviceObject,
5854   IN ULONG NumberOfMapRegisters,
5855   IN PDRIVER_CONTROL ExecutionRoutine,
5856   IN PVOID Context);
5857 
5858 typedef BOOLEAN
5859 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
5860   IN PDMA_ADAPTER DmaAdapter,
5861   IN PMDL Mdl,
5862   IN PVOID MapRegisterBase,
5863   IN PVOID CurrentVa,
5864   IN ULONG Length,
5865   IN BOOLEAN WriteToDevice);
5866 
5867 typedef VOID
5868 (NTAPI *PFREE_ADAPTER_CHANNEL)(
5869   IN PDMA_ADAPTER DmaAdapter);
5870 
5871 typedef VOID
5872 (NTAPI *PFREE_MAP_REGISTERS)(
5873   IN PDMA_ADAPTER DmaAdapter,
5874   PVOID MapRegisterBase,
5875   ULONG NumberOfMapRegisters);
5876 
5877 typedef PHYSICAL_ADDRESS
5878 (NTAPI *PMAP_TRANSFER)(
5879   IN PDMA_ADAPTER DmaAdapter,
5880   IN PMDL Mdl,
5881   IN PVOID MapRegisterBase,
5882   IN PVOID CurrentVa,
5883   IN OUT PULONG Length,
5884   IN BOOLEAN WriteToDevice);
5885 
5886 typedef ULONG
5887 (NTAPI *PGET_DMA_ALIGNMENT)(
5888   IN PDMA_ADAPTER DmaAdapter);
5889 
5890 typedef ULONG
5891 (NTAPI *PREAD_DMA_COUNTER)(
5892   IN PDMA_ADAPTER DmaAdapter);
5893 
5894 typedef VOID
5895 (NTAPI DRIVER_LIST_CONTROL)(
5896   IN struct _DEVICE_OBJECT *DeviceObject,
5897   IN struct _IRP *Irp,
5898   IN struct _SCATTER_GATHER_LIST *ScatterGather,
5899   IN PVOID Context);
5900 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
5901 
5902 typedef NTSTATUS
5903 (NTAPI *PGET_SCATTER_GATHER_LIST)(
5904   IN PDMA_ADAPTER DmaAdapter,
5905   IN PDEVICE_OBJECT DeviceObject,
5906   IN PMDL Mdl,
5907   IN PVOID CurrentVa,
5908   IN ULONG Length,
5909   IN PDRIVER_LIST_CONTROL ExecutionRoutine,
5910   IN PVOID Context,
5911   IN BOOLEAN WriteToDevice);
5912 
5913 typedef VOID
5914 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
5915   IN PDMA_ADAPTER DmaAdapter,
5916   IN PSCATTER_GATHER_LIST ScatterGather,
5917   IN BOOLEAN WriteToDevice);
5918 
5919 typedef NTSTATUS
5920 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
5921   IN PDMA_ADAPTER DmaAdapter,
5922   IN PMDL Mdl OPTIONAL,
5923   IN PVOID CurrentVa,
5924   IN ULONG Length,
5925   OUT PULONG ScatterGatherListSize,
5926   OUT PULONG pNumberOfMapRegisters OPTIONAL);
5927 
5928 typedef NTSTATUS
5929 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
5930   IN PDMA_ADAPTER DmaAdapter,
5931   IN PDEVICE_OBJECT DeviceObject,
5932   IN PMDL Mdl,
5933   IN PVOID CurrentVa,
5934   IN ULONG Length,
5935   IN PDRIVER_LIST_CONTROL ExecutionRoutine,
5936   IN PVOID Context,
5937   IN BOOLEAN WriteToDevice,
5938   IN PVOID ScatterGatherBuffer,
5939   IN ULONG ScatterGatherLength);
5940 
5941 typedef NTSTATUS
5942 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
5943   IN PDMA_ADAPTER DmaAdapter,
5944   IN PSCATTER_GATHER_LIST ScatterGather,
5945   IN PMDL OriginalMdl,
5946   OUT PMDL *TargetMdl);
5947 
5948 typedef struct _DMA_OPERATIONS {
5949   ULONG Size;
5950   PPUT_DMA_ADAPTER PutDmaAdapter;
5951   PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
5952   PFREE_COMMON_BUFFER FreeCommonBuffer;
5953   PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
5954   PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
5955   PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
5956   PFREE_MAP_REGISTERS FreeMapRegisters;
5957   PMAP_TRANSFER MapTransfer;
5958   PGET_DMA_ALIGNMENT GetDmaAlignment;
5959   PREAD_DMA_COUNTER ReadDmaCounter;
5960   PGET_SCATTER_GATHER_LIST GetScatterGatherList;
5961   PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
5962   PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
5963   PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
5964   PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
5965 } DMA_OPERATIONS, *PDMA_OPERATIONS;
5966 
5967 typedef struct _IO_RESOURCE_DESCRIPTOR {
5968   UCHAR Option;
5969   UCHAR Type;
5970   UCHAR ShareDisposition;
5971   UCHAR Spare1;
5972   USHORT Flags;
5973   USHORT Spare2;
5974   union {
5975     struct {
5976       ULONG Length;
5977       ULONG Alignment;
5978       PHYSICAL_ADDRESS MinimumAddress;
5979       PHYSICAL_ADDRESS MaximumAddress;
5980     } Port;
5981     struct {
5982       ULONG Length;
5983       ULONG Alignment;
5984       PHYSICAL_ADDRESS MinimumAddress;
5985       PHYSICAL_ADDRESS MaximumAddress;
5986     } Memory;
5987     struct {
5988       ULONG MinimumVector;
5989       ULONG MaximumVector;
5990     } Interrupt;
5991     struct {
5992       ULONG MinimumChannel;
5993       ULONG MaximumChannel;
5994     } Dma;
5995     struct {
5996       ULONG Length;
5997       ULONG Alignment;
5998       PHYSICAL_ADDRESS MinimumAddress;
5999       PHYSICAL_ADDRESS MaximumAddress;
6000     } Generic;
6001     struct {
6002       ULONG Data[3];
6003     } DevicePrivate;
6004     struct {
6005       ULONG Length;
6006       ULONG MinBusNumber;
6007       ULONG MaxBusNumber;
6008       ULONG Reserved;
6009     } BusNumber;
6010     struct {
6011       ULONG Priority;
6012       ULONG Reserved1;
6013       ULONG Reserved2;
6014     } ConfigData;
6015   } u;
6016 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
6017 
6018 typedef struct _IO_RESOURCE_LIST {
6019   USHORT Version;
6020   USHORT Revision;
6021   ULONG Count;
6022   IO_RESOURCE_DESCRIPTOR Descriptors[1];
6023 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
6024 
6025 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
6026   ULONG ListSize;
6027   INTERFACE_TYPE InterfaceType;
6028   ULONG BusNumber;
6029   ULONG SlotNumber;
6030   ULONG Reserved[3];
6031   ULONG AlternativeLists;
6032   IO_RESOURCE_LIST List[1];
6033 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
6034 
6035 typedef VOID
6036 (NTAPI DRIVER_CANCEL)(
6037   IN struct _DEVICE_OBJECT *DeviceObject,
6038   IN struct _IRP *Irp);
6039 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
6040 
6041 typedef struct _IRP {
6042   CSHORT Type;
6043   USHORT Size;
6044   struct _MDL *MdlAddress;
6045   ULONG Flags;
6046   union {
6047     struct _IRP *MasterIrp;
6048     volatile LONG IrpCount;
6049     PVOID SystemBuffer;
6050   } AssociatedIrp;
6051   LIST_ENTRY ThreadListEntry;
6052   IO_STATUS_BLOCK IoStatus;
6053   KPROCESSOR_MODE RequestorMode;
6054   BOOLEAN PendingReturned;
6055   CHAR StackCount;
6056   CHAR CurrentLocation;
6057   BOOLEAN Cancel;
6058   KIRQL CancelIrql;
6059   CCHAR ApcEnvironment;
6060   UCHAR AllocationFlags;
6061   PIO_STATUS_BLOCK UserIosb;
6062   PKEVENT UserEvent;
6063   union {
6064     struct {
6065       _ANONYMOUS_UNION union {
6066         PIO_APC_ROUTINE UserApcRoutine;
6067         PVOID IssuingProcess;
6068       } DUMMYUNIONNAME;
6069       PVOID UserApcContext;
6070     } AsynchronousParameters;
6071     LARGE_INTEGER AllocationSize;
6072   } Overlay;
6073   volatile PDRIVER_CANCEL CancelRoutine;
6074   PVOID UserBuffer;
6075   union {
6076     struct {
6077       _ANONYMOUS_UNION union {
6078         KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
6079         _ANONYMOUS_STRUCT struct {
6080           PVOID DriverContext[4];
6081         } DUMMYSTRUCTNAME;
6082       } DUMMYUNIONNAME;
6083       PETHREAD Thread;
6084       PCHAR AuxiliaryBuffer;
6085       _ANONYMOUS_STRUCT struct {
6086         LIST_ENTRY ListEntry;
6087         _ANONYMOUS_UNION union {
6088           struct _IO_STACK_LOCATION *CurrentStackLocation;
6089           ULONG PacketType;
6090         } DUMMYUNIONNAME;
6091       } DUMMYSTRUCTNAME;
6092       struct _FILE_OBJECT *OriginalFileObject;
6093     } Overlay;
6094     KAPC Apc;
6095     PVOID CompletionKey;
6096   } Tail;
6097 } IRP, *PIRP;
6098 
6099 typedef enum _IO_PAGING_PRIORITY {
6100   IoPagingPriorityInvalid,
6101   IoPagingPriorityNormal,
6102   IoPagingPriorityHigh,
6103   IoPagingPriorityReserved1,
6104   IoPagingPriorityReserved2
6105 } IO_PAGING_PRIORITY;
6106 
6107 typedef NTSTATUS
6108 (NTAPI IO_COMPLETION_ROUTINE)(
6109   IN struct _DEVICE_OBJECT *DeviceObject,
6110   IN struct _IRP *Irp,
6111   IN PVOID Context);
6112 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
6113 
6114 typedef VOID
6115 (NTAPI IO_DPC_ROUTINE)(
6116   IN struct _KDPC *Dpc,
6117   IN struct _DEVICE_OBJECT *DeviceObject,
6118   IN struct _IRP *Irp,
6119   IN PVOID Context);
6120 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
6121 
6122 typedef NTSTATUS
6123 (NTAPI *PMM_DLL_INITIALIZE)(
6124   IN PUNICODE_STRING RegistryPath);
6125 
6126 typedef NTSTATUS
6127 (NTAPI *PMM_DLL_UNLOAD)(
6128   VOID);
6129 
6130 typedef VOID
6131 (NTAPI IO_TIMER_ROUTINE)(
6132   IN struct _DEVICE_OBJECT *DeviceObject,
6133   IN PVOID Context);
6134 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
6135 
6136 typedef struct _IO_SECURITY_CONTEXT {
6137   PSECURITY_QUALITY_OF_SERVICE SecurityQos;
6138   PACCESS_STATE AccessState;
6139   ACCESS_MASK DesiredAccess;
6140   ULONG FullCreateOptions;
6141 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
6142 
6143 struct _IO_CSQ;
6144 
6145 typedef struct _IO_CSQ_IRP_CONTEXT {
6146   ULONG Type;
6147   struct _IRP *Irp;
6148   struct _IO_CSQ *Csq;
6149 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
6150 
6151 typedef VOID
6152 (NTAPI *PIO_CSQ_INSERT_IRP)(
6153   IN struct _IO_CSQ *Csq,
6154   IN PIRP Irp);
6155 
6156 typedef NTSTATUS
6157 (NTAPI IO_CSQ_INSERT_IRP_EX)(
6158   IN struct _IO_CSQ *Csq,
6159   IN PIRP Irp,
6160   IN PVOID InsertContext);
6161 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
6162 
6163 typedef VOID
6164 (NTAPI *PIO_CSQ_REMOVE_IRP)(
6165   IN struct _IO_CSQ *Csq,
6166   IN PIRP Irp);
6167 
6168 typedef PIRP
6169 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
6170   IN struct _IO_CSQ *Csq,
6171   IN PIRP Irp,
6172   IN PVOID PeekContext);
6173 
6174 typedef VOID
6175 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
6176   IN struct _IO_CSQ *Csq,
6177   OUT PKIRQL Irql);
6178 
6179 typedef VOID
6180 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
6181   IN struct _IO_CSQ *Csq,
6182   IN KIRQL Irql);
6183 
6184 typedef VOID
6185 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
6186   IN struct _IO_CSQ *Csq,
6187   IN PIRP Irp);
6188 
6189 typedef struct _IO_CSQ {
6190   ULONG Type;
6191   PIO_CSQ_INSERT_IRP CsqInsertIrp;
6192   PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
6193   PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
6194   PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
6195   PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
6196   PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
6197   PVOID ReservePointer;
6198 } IO_CSQ, *PIO_CSQ;
6199 
6200 typedef enum _BUS_QUERY_ID_TYPE {
6201   BusQueryDeviceID,
6202   BusQueryHardwareIDs,
6203   BusQueryCompatibleIDs,
6204   BusQueryInstanceID,
6205   BusQueryDeviceSerialNumber
6206 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
6207 
6208 typedef enum _DEVICE_TEXT_TYPE {
6209   DeviceTextDescription,
6210   DeviceTextLocationInformation
6211 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
6212 
6213 typedef BOOLEAN
6214 (NTAPI *PGPE_SERVICE_ROUTINE)(
6215   PVOID,
6216   PVOID);
6217 
6218 typedef NTSTATUS
6219 (NTAPI *PGPE_CONNECT_VECTOR)(
6220   PDEVICE_OBJECT,
6221   ULONG,
6222   KINTERRUPT_MODE,
6223   BOOLEAN,
6224   PGPE_SERVICE_ROUTINE,
6225   PVOID,
6226   PVOID);
6227 
6228 typedef NTSTATUS
6229 (NTAPI *PGPE_DISCONNECT_VECTOR)(
6230   PVOID);
6231 
6232 typedef NTSTATUS
6233 (NTAPI *PGPE_ENABLE_EVENT)(
6234   PDEVICE_OBJECT,
6235   PVOID);
6236 
6237 typedef NTSTATUS
6238 (NTAPI *PGPE_DISABLE_EVENT)(
6239   PDEVICE_OBJECT,
6240   PVOID);
6241 
6242 typedef NTSTATUS
6243 (NTAPI *PGPE_CLEAR_STATUS)(
6244   PDEVICE_OBJECT,
6245   PVOID);
6246 
6247 typedef VOID
6248 (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
6249   PVOID,
6250   ULONG);
6251 
6252 typedef NTSTATUS
6253 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
6254   PDEVICE_OBJECT,
6255   PDEVICE_NOTIFY_CALLBACK,
6256   PVOID);
6257 
6258 typedef VOID
6259 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
6260   PDEVICE_OBJECT,
6261   PDEVICE_NOTIFY_CALLBACK);
6262 
6263 typedef struct _ACPI_INTERFACE_STANDARD {
6264   USHORT Size;
6265   USHORT Version;
6266   PVOID Context;
6267   PINTERFACE_REFERENCE InterfaceReference;
6268   PINTERFACE_DEREFERENCE InterfaceDereference;
6269   PGPE_CONNECT_VECTOR GpeConnectVector;
6270   PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
6271   PGPE_ENABLE_EVENT GpeEnableEvent;
6272   PGPE_DISABLE_EVENT GpeDisableEvent;
6273   PGPE_CLEAR_STATUS GpeClearStatus;
6274   PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
6275   PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
6276 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
6277 
6278 typedef BOOLEAN
6279 (NTAPI *PGPE_SERVICE_ROUTINE2)(
6280   PVOID ObjectContext,
6281   PVOID ServiceContext);
6282 
6283 typedef NTSTATUS
6284 (NTAPI *PGPE_CONNECT_VECTOR2)(
6285   PVOID Context,
6286   ULONG GpeNumber,
6287   KINTERRUPT_MODE Mode,
6288   BOOLEAN Shareable,
6289   PGPE_SERVICE_ROUTINE ServiceRoutine,
6290   PVOID ServiceContext,
6291   PVOID *ObjectContext);
6292 
6293 typedef NTSTATUS
6294 (NTAPI *PGPE_DISCONNECT_VECTOR2)(
6295   PVOID Context,
6296   PVOID ObjectContext);
6297 
6298 typedef NTSTATUS
6299 (NTAPI *PGPE_ENABLE_EVENT2)(
6300   PVOID Context,
6301   PVOID ObjectContext);
6302 
6303 typedef NTSTATUS
6304 (NTAPI *PGPE_DISABLE_EVENT2)(
6305   PVOID Context,
6306   PVOID ObjectContext);
6307 
6308 typedef NTSTATUS
6309 (NTAPI *PGPE_CLEAR_STATUS2)(
6310   PVOID Context,
6311   PVOID ObjectContext);
6312 
6313 typedef VOID
6314 (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
6315   PVOID NotificationContext,
6316   ULONG NotifyCode);
6317 
6318 typedef NTSTATUS
6319 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
6320   PVOID Context,
6321   PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
6322   PVOID NotificationContext);
6323 
6324 typedef VOID
6325 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
6326   PVOID Context);
6327 
6328 typedef struct _ACPI_INTERFACE_STANDARD2 {
6329   USHORT Size;
6330   USHORT Version;
6331   PVOID Context;
6332   PINTERFACE_REFERENCE InterfaceReference;
6333   PINTERFACE_DEREFERENCE InterfaceDereference;
6334   PGPE_CONNECT_VECTOR2 GpeConnectVector;
6335   PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
6336   PGPE_ENABLE_EVENT2 GpeEnableEvent;
6337   PGPE_DISABLE_EVENT2 GpeDisableEvent;
6338   PGPE_CLEAR_STATUS2 GpeClearStatus;
6339   PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
6340   PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
6341 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
6342 
6343 #if !defined(_AMD64_) && !defined(_IA64_)
6344 #include <pshpack4.h>
6345 #endif
6346 typedef struct _IO_STACK_LOCATION {
6347   UCHAR MajorFunction;
6348   UCHAR MinorFunction;
6349   UCHAR Flags;
6350   UCHAR Control;
6351   union {
6352     struct {
6353       PIO_SECURITY_CONTEXT SecurityContext;
6354       ULONG Options;
6355       USHORT POINTER_ALIGNMENT FileAttributes;
6356       USHORT ShareAccess;
6357       ULONG POINTER_ALIGNMENT EaLength;
6358     } Create;
6359     struct {
6360       ULONG Length;
6361       ULONG POINTER_ALIGNMENT Key;
6362       LARGE_INTEGER ByteOffset;
6363     } Read;
6364     struct {
6365       ULONG Length;
6366       ULONG POINTER_ALIGNMENT Key;
6367       LARGE_INTEGER ByteOffset;
6368     } Write;
6369     struct {
6370       ULONG Length;
6371       PUNICODE_STRING FileName;
6372       FILE_INFORMATION_CLASS FileInformationClass;
6373       ULONG FileIndex;
6374     } QueryDirectory;
6375     struct {
6376       ULONG Length;
6377       ULONG CompletionFilter;
6378     } NotifyDirectory;
6379     struct {
6380       ULONG Length;
6381       FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
6382     } QueryFile;
6383     struct {
6384       ULONG Length;
6385       FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
6386       PFILE_OBJECT FileObject;
6387       _ANONYMOUS_UNION union {
6388         _ANONYMOUS_STRUCT struct {
6389           BOOLEAN ReplaceIfExists;
6390           BOOLEAN AdvanceOnly;
6391         } DUMMYSTRUCTNAME;
6392         ULONG ClusterCount;
6393         HANDLE DeleteHandle;
6394       } DUMMYUNIONNAME;
6395     } SetFile;
6396     struct {
6397       ULONG Length;
6398       PVOID EaList;
6399       ULONG EaListLength;
6400       ULONG EaIndex;
6401     } QueryEa;
6402     struct {
6403       ULONG Length;
6404     } SetEa;
6405     struct {
6406       ULONG Length;
6407       FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
6408     } QueryVolume;
6409     struct {
6410       ULONG Length;
6411       FS_INFORMATION_CLASS FsInformationClass;
6412     } SetVolume;
6413     struct {
6414       ULONG OutputBufferLength;
6415       ULONG InputBufferLength;
6416       ULONG FsControlCode;
6417       PVOID Type3InputBuffer;
6418     } FileSystemControl;
6419     struct {
6420       PLARGE_INTEGER Length;
6421       ULONG Key;
6422       LARGE_INTEGER ByteOffset;
6423     } LockControl;
6424     struct {
6425       ULONG OutputBufferLength;
6426       ULONG POINTER_ALIGNMENT InputBufferLength;
6427       ULONG POINTER_ALIGNMENT IoControlCode;
6428       PVOID Type3InputBuffer;
6429     } DeviceIoControl;
6430     struct {
6431       SECURITY_INFORMATION SecurityInformation;
6432       ULONG POINTER_ALIGNMENT Length;
6433     } QuerySecurity;
6434     struct {
6435       SECURITY_INFORMATION SecurityInformation;
6436       PSECURITY_DESCRIPTOR SecurityDescriptor;
6437     } SetSecurity;
6438     struct {
6439       PVPB Vpb;
6440       PDEVICE_OBJECT DeviceObject;
6441     } MountVolume;
6442     struct {
6443       PVPB Vpb;
6444       PDEVICE_OBJECT DeviceObject;
6445     } VerifyVolume;
6446     struct {
6447       struct _SCSI_REQUEST_BLOCK *Srb;
6448     } Scsi;
6449     struct {
6450       ULONG Length;
6451       PSID StartSid;
6452       struct _FILE_GET_QUOTA_INFORMATION *SidList;
6453       ULONG SidListLength;
6454     } QueryQuota;
6455     struct {
6456       ULONG Length;
6457     } SetQuota;
6458     struct {
6459       DEVICE_RELATION_TYPE Type;
6460     } QueryDeviceRelations;
6461     struct {
6462       CONST GUID *InterfaceType;
6463       USHORT Size;
6464       USHORT Version;
6465       PINTERFACE Interface;
6466       PVOID InterfaceSpecificData;
6467     } QueryInterface;
6468     struct {
6469       PDEVICE_CAPABILITIES Capabilities;
6470     } DeviceCapabilities;
6471     struct {
6472       PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
6473     } FilterResourceRequirements;
6474     struct {
6475       ULONG WhichSpace;
6476       PVOID Buffer;
6477       ULONG Offset;
6478       ULONG POINTER_ALIGNMENT Length;
6479     } ReadWriteConfig;
6480     struct {
6481       BOOLEAN Lock;
6482     } SetLock;
6483     struct {
6484       BUS_QUERY_ID_TYPE IdType;
6485     } QueryId;
6486     struct {
6487       DEVICE_TEXT_TYPE DeviceTextType;
6488       LCID POINTER_ALIGNMENT LocaleId;
6489     } QueryDeviceText;
6490     struct {
6491       BOOLEAN InPath;
6492       BOOLEAN Reserved[3];
6493       DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
6494     } UsageNotification;
6495     struct {
6496       SYSTEM_POWER_STATE PowerState;
6497     } WaitWake;
6498     struct {
6499       PPOWER_SEQUENCE PowerSequence;
6500     } PowerSequence;
6501     struct {
6502       ULONG SystemContext;
6503       POWER_STATE_TYPE POINTER_ALIGNMENT Type;
6504       POWER_STATE POINTER_ALIGNMENT State;
6505       POWER_ACTION POINTER_ALIGNMENT ShutdownType;
6506     } Power;
6507     struct {
6508       PCM_RESOURCE_LIST AllocatedResources;
6509       PCM_RESOURCE_LIST AllocatedResourcesTranslated;
6510     } StartDevice;
6511     struct {
6512       ULONG_PTR ProviderId;
6513       PVOID DataPath;
6514       ULONG BufferSize;
6515       PVOID Buffer;
6516     } WMI;
6517     struct {
6518       PVOID Argument1;
6519       PVOID Argument2;
6520       PVOID Argument3;
6521       PVOID Argument4;
6522     } Others;
6523   } Parameters;
6524   PDEVICE_OBJECT DeviceObject;
6525   PFILE_OBJECT FileObject;
6526   PIO_COMPLETION_ROUTINE CompletionRoutine;
6527   PVOID Context;
6528 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
6529 #if !defined(_AMD64_) && !defined(_IA64_)
6530 #include <poppack.h>
6531 #endif
6532 
6533 /* IO_STACK_LOCATION.Control */
6534 
6535 #define SL_PENDING_RETURNED               0x01
6536 #define SL_ERROR_RETURNED                 0x02
6537 #define SL_INVOKE_ON_CANCEL               0x20
6538 #define SL_INVOKE_ON_SUCCESS              0x40
6539 #define SL_INVOKE_ON_ERROR                0x80
6540 
6541 #define METHOD_BUFFERED                   0
6542 #define METHOD_IN_DIRECT                  1
6543 #define METHOD_OUT_DIRECT                 2
6544 #define METHOD_NEITHER                    3
6545 
6546 #define METHOD_DIRECT_TO_HARDWARE       METHOD_IN_DIRECT
6547 #define METHOD_DIRECT_FROM_HARDWARE     METHOD_OUT_DIRECT
6548 
6549 #define FILE_SUPERSEDED                   0x00000000
6550 #define FILE_OPENED                       0x00000001
6551 #define FILE_CREATED                      0x00000002
6552 #define FILE_OVERWRITTEN                  0x00000003
6553 #define FILE_EXISTS                       0x00000004
6554 #define FILE_DOES_NOT_EXIST               0x00000005
6555 
6556 #define FILE_USE_FILE_POINTER_POSITION    0xfffffffe
6557 #define FILE_WRITE_TO_END_OF_FILE         0xffffffff
6558 
6559 /* also in winnt.h */
6560 #define FILE_LIST_DIRECTORY               0x00000001
6561 #define FILE_READ_DATA                    0x00000001
6562 #define FILE_ADD_FILE                     0x00000002
6563 #define FILE_WRITE_DATA                   0x00000002
6564 #define FILE_ADD_SUBDIRECTORY             0x00000004
6565 #define FILE_APPEND_DATA                  0x00000004
6566 #define FILE_CREATE_PIPE_INSTANCE         0x00000004
6567 #define FILE_READ_EA                      0x00000008
6568 #define FILE_WRITE_EA                     0x00000010
6569 #define FILE_EXECUTE                      0x00000020
6570 #define FILE_TRAVERSE                     0x00000020
6571 #define FILE_DELETE_CHILD                 0x00000040
6572 #define FILE_READ_ATTRIBUTES              0x00000080
6573 #define FILE_WRITE_ATTRIBUTES             0x00000100
6574 
6575 #define FILE_SHARE_READ                   0x00000001
6576 #define FILE_SHARE_WRITE                  0x00000002
6577 #define FILE_SHARE_DELETE                 0x00000004
6578 #define FILE_SHARE_VALID_FLAGS            0x00000007
6579 
6580 #define FILE_ATTRIBUTE_READONLY           0x00000001
6581 #define FILE_ATTRIBUTE_HIDDEN             0x00000002
6582 #define FILE_ATTRIBUTE_SYSTEM             0x00000004
6583 #define FILE_ATTRIBUTE_DIRECTORY          0x00000010
6584 #define FILE_ATTRIBUTE_ARCHIVE            0x00000020
6585 #define FILE_ATTRIBUTE_DEVICE             0x00000040
6586 #define FILE_ATTRIBUTE_NORMAL             0x00000080
6587 #define FILE_ATTRIBUTE_TEMPORARY          0x00000100
6588 #define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
6589 #define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
6590 #define FILE_ATTRIBUTE_COMPRESSED         0x00000800
6591 #define FILE_ATTRIBUTE_OFFLINE            0x00001000
6592 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
6593 #define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
6594 #define FILE_ATTRIBUTE_VIRTUAL            0x00010000
6595 
6596 #define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
6597 #define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
6598 
6599 #define FILE_VALID_OPTION_FLAGS           0x00ffffff
6600 #define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
6601 #define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
6602 #define FILE_VALID_SET_FLAGS              0x00000036
6603 
6604 #define FILE_SUPERSEDE                    0x00000000
6605 #define FILE_OPEN                         0x00000001
6606 #define FILE_CREATE                       0x00000002
6607 #define FILE_OPEN_IF                      0x00000003
6608 #define FILE_OVERWRITE                    0x00000004
6609 #define FILE_OVERWRITE_IF                 0x00000005
6610 #define FILE_MAXIMUM_DISPOSITION          0x00000005
6611 
6612 #define FILE_DIRECTORY_FILE               0x00000001
6613 #define FILE_WRITE_THROUGH                0x00000002
6614 #define FILE_SEQUENTIAL_ONLY              0x00000004
6615 #define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
6616 #define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
6617 #define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
6618 #define FILE_NON_DIRECTORY_FILE           0x00000040
6619 #define FILE_CREATE_TREE_CONNECTION       0x00000080
6620 #define FILE_COMPLETE_IF_OPLOCKED         0x00000100
6621 #define FILE_NO_EA_KNOWLEDGE              0x00000200
6622 #define FILE_OPEN_REMOTE_INSTANCE         0x00000400
6623 #define FILE_RANDOM_ACCESS                0x00000800
6624 #define FILE_DELETE_ON_CLOSE              0x00001000
6625 #define FILE_OPEN_BY_FILE_ID              0x00002000
6626 #define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
6627 #define FILE_NO_COMPRESSION               0x00008000
6628 #if (NTDDI_VERSION >= NTDDI_WIN7)
6629 #define FILE_OPEN_REQUIRING_OPLOCK        0x00010000
6630 #define FILE_DISALLOW_EXCLUSIVE           0x00020000
6631 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
6632 #define FILE_RESERVE_OPFILTER             0x00100000
6633 #define FILE_OPEN_REPARSE_POINT           0x00200000
6634 #define FILE_OPEN_NO_RECALL               0x00400000
6635 #define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
6636 
6637 #define FILE_ANY_ACCESS                   0x00000000
6638 #define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
6639 #define FILE_READ_ACCESS                  0x00000001
6640 #define FILE_WRITE_ACCESS                 0x00000002
6641 
6642 #define FILE_ALL_ACCESS \
6643   (STANDARD_RIGHTS_REQUIRED | \
6644    SYNCHRONIZE | \
6645    0x1FF)
6646 
6647 #define FILE_GENERIC_EXECUTE \
6648   (STANDARD_RIGHTS_EXECUTE | \
6649    FILE_READ_ATTRIBUTES | \
6650    FILE_EXECUTE | \
6651    SYNCHRONIZE)
6652 
6653 #define FILE_GENERIC_READ \
6654   (STANDARD_RIGHTS_READ | \
6655    FILE_READ_DATA | \
6656    FILE_READ_ATTRIBUTES | \
6657    FILE_READ_EA | \
6658    SYNCHRONIZE)
6659 
6660 #define FILE_GENERIC_WRITE \
6661   (STANDARD_RIGHTS_WRITE | \
6662    FILE_WRITE_DATA | \
6663    FILE_WRITE_ATTRIBUTES | \
6664    FILE_WRITE_EA | \
6665    FILE_APPEND_DATA | \
6666    SYNCHRONIZE)
6667 
6668 /* end winnt.h */
6669 
6670 #define WMIREG_ACTION_REGISTER      1
6671 #define WMIREG_ACTION_DEREGISTER    2
6672 #define WMIREG_ACTION_REREGISTER    3
6673 #define WMIREG_ACTION_UPDATE_GUIDS  4
6674 #define WMIREG_ACTION_BLOCK_IRPS    5
6675 
6676 #define WMIREGISTER                 0
6677 #define WMIUPDATE                   1
6678 
6679 typedef VOID
6680 (NTAPI FWMI_NOTIFICATION_CALLBACK)(
6681   PVOID Wnode,
6682   PVOID Context);
6683 typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
6684 
6685 #ifndef _PCI_X_
6686 #define _PCI_X_
6687 
6688 typedef struct _PCI_SLOT_NUMBER {
6689   union {
6690     struct {
6691       ULONG DeviceNumber:5;
6692       ULONG FunctionNumber:3;
6693       ULONG Reserved:24;
6694     } bits;
6695     ULONG AsULONG;
6696   } u;
6697 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
6698 
6699 #define PCI_TYPE0_ADDRESSES               6
6700 #define PCI_TYPE1_ADDRESSES               2
6701 #define PCI_TYPE2_ADDRESSES               5
6702 
6703 typedef struct _PCI_COMMON_HEADER {
6704   PCI_COMMON_HEADER_LAYOUT
6705 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
6706 
6707 #ifdef __cplusplus
6708 typedef struct _PCI_COMMON_CONFIG {
6709   PCI_COMMON_HEADER_LAYOUT
6710   UCHAR DeviceSpecific[192];
6711 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
6712 #else
6713 typedef struct _PCI_COMMON_CONFIG {
6714   __extension__ struct {
6715     PCI_COMMON_HEADER_LAYOUT
6716   };
6717   UCHAR DeviceSpecific[192];
6718 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
6719 #endif
6720 
6721 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
6722 
6723 #define PCI_EXTENDED_CONFIG_LENGTH               0x1000
6724 
6725 #define PCI_MAX_DEVICES        32
6726 #define PCI_MAX_FUNCTION       8
6727 #define PCI_MAX_BRIDGE_NUMBER  0xFF
6728 #define PCI_INVALID_VENDORID   0xFFFF
6729 
6730 /* PCI_COMMON_CONFIG.HeaderType */
6731 #define PCI_MULTIFUNCTION                 0x80
6732 #define PCI_DEVICE_TYPE                   0x00
6733 #define PCI_BRIDGE_TYPE                   0x01
6734 #define PCI_CARDBUS_BRIDGE_TYPE           0x02
6735 
6736 #define PCI_CONFIGURATION_TYPE(PciData) \
6737   (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
6738 
6739 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
6740   ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
6741 
6742 /* PCI_COMMON_CONFIG.Command */
6743 #define PCI_ENABLE_IO_SPACE               0x0001
6744 #define PCI_ENABLE_MEMORY_SPACE           0x0002
6745 #define PCI_ENABLE_BUS_MASTER             0x0004
6746 #define PCI_ENABLE_SPECIAL_CYCLES         0x0008
6747 #define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
6748 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
6749 #define PCI_ENABLE_PARITY                 0x0040
6750 #define PCI_ENABLE_WAIT_CYCLE             0x0080
6751 #define PCI_ENABLE_SERR                   0x0100
6752 #define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
6753 #define PCI_DISABLE_LEVEL_INTERRUPT       0x0400
6754 
6755 /* PCI_COMMON_CONFIG.Status */
6756 #define PCI_STATUS_INTERRUPT_PENDING      0x0008
6757 #define PCI_STATUS_CAPABILITIES_LIST      0x0010
6758 #define PCI_STATUS_66MHZ_CAPABLE          0x0020
6759 #define PCI_STATUS_UDF_SUPPORTED          0x0040
6760 #define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
6761 #define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
6762 #define PCI_STATUS_DEVSEL                 0x0600
6763 #define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
6764 #define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
6765 #define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
6766 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
6767 #define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
6768 
6769 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
6770 
6771 #define PCI_WHICHSPACE_CONFIG             0x0
6772 #define PCI_WHICHSPACE_ROM                0x52696350 /* 'PciR' */
6773 
6774 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT  0x01
6775 #define PCI_CAPABILITY_ID_AGP               0x02
6776 #define PCI_CAPABILITY_ID_VPD               0x03
6777 #define PCI_CAPABILITY_ID_SLOT_ID           0x04
6778 #define PCI_CAPABILITY_ID_MSI               0x05
6779 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP      0x06
6780 #define PCI_CAPABILITY_ID_PCIX              0x07
6781 #define PCI_CAPABILITY_ID_HYPERTRANSPORT    0x08
6782 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC   0x09
6783 #define PCI_CAPABILITY_ID_DEBUG_PORT        0x0A
6784 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL     0x0B
6785 #define PCI_CAPABILITY_ID_SHPC              0x0C
6786 #define PCI_CAPABILITY_ID_P2P_SSID          0x0D
6787 #define PCI_CAPABILITY_ID_AGP_TARGET        0x0E
6788 #define PCI_CAPABILITY_ID_SECURE            0x0F
6789 #define PCI_CAPABILITY_ID_PCI_EXPRESS       0x10
6790 #define PCI_CAPABILITY_ID_MSIX              0x11
6791 
6792 typedef struct _PCI_CAPABILITIES_HEADER {
6793   UCHAR CapabilityID;
6794   UCHAR Next;
6795 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
6796 
6797 typedef struct _PCI_PMC {
6798   UCHAR Version:3;
6799   UCHAR PMEClock:1;
6800   UCHAR Rsvd1:1;
6801   UCHAR DeviceSpecificInitialization:1;
6802   UCHAR Rsvd2:2;
6803   struct _PM_SUPPORT {
6804     UCHAR Rsvd2:1;
6805     UCHAR D1:1;
6806     UCHAR D2:1;
6807     UCHAR PMED0:1;
6808     UCHAR PMED1:1;
6809     UCHAR PMED2:1;
6810     UCHAR PMED3Hot:1;
6811     UCHAR PMED3Cold:1;
6812   } Support;
6813 } PCI_PMC, *PPCI_PMC;
6814 
6815 typedef struct _PCI_PMCSR {
6816   USHORT PowerState:2;
6817   USHORT Rsvd1:6;
6818   USHORT PMEEnable:1;
6819   USHORT DataSelect:4;
6820   USHORT DataScale:2;
6821   USHORT PMEStatus:1;
6822 } PCI_PMCSR, *PPCI_PMCSR;
6823 
6824 typedef struct _PCI_PMCSR_BSE {
6825   UCHAR Rsvd1:6;
6826   UCHAR D3HotSupportsStopClock:1;
6827   UCHAR BusPowerClockControlEnabled:1;
6828 } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
6829 
6830 typedef struct _PCI_PM_CAPABILITY {
6831   PCI_CAPABILITIES_HEADER Header;
6832   union {
6833     PCI_PMC Capabilities;
6834     USHORT AsUSHORT;
6835   } PMC;
6836     union {
6837       PCI_PMCSR ControlStatus;
6838       USHORT AsUSHORT;
6839     } PMCSR;
6840     union {
6841       PCI_PMCSR_BSE BridgeSupport;
6842       UCHAR AsUCHAR;
6843     } PMCSR_BSE;
6844   UCHAR Data;
6845 } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
6846 
6847 typedef struct {
6848   PCI_CAPABILITIES_HEADER Header;
6849   union {
6850     struct {
6851       USHORT DataParityErrorRecoveryEnable:1;
6852       USHORT EnableRelaxedOrdering:1;
6853       USHORT MaxMemoryReadByteCount:2;
6854       USHORT MaxOutstandingSplitTransactions:3;
6855       USHORT Reserved:9;
6856     } bits;
6857     USHORT AsUSHORT;
6858   } Command;
6859   union {
6860     struct {
6861       ULONG FunctionNumber:3;
6862       ULONG DeviceNumber:5;
6863       ULONG BusNumber:8;
6864       ULONG Device64Bit:1;
6865       ULONG Capable133MHz:1;
6866       ULONG SplitCompletionDiscarded:1;
6867       ULONG UnexpectedSplitCompletion:1;
6868       ULONG DeviceComplexity:1;
6869       ULONG DesignedMaxMemoryReadByteCount:2;
6870       ULONG DesignedMaxOutstandingSplitTransactions:3;
6871       ULONG DesignedMaxCumulativeReadSize:3;
6872       ULONG ReceivedSplitCompletionErrorMessage:1;
6873       ULONG CapablePCIX266:1;
6874       ULONG CapablePCIX533:1;
6875       } bits;
6876     ULONG AsULONG;
6877   } Status;
6878 } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
6879 
6880 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID                     0x0001
6881 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID                              0x0002
6882 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID                         0x0003
6883 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID                              0x0004
6884 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID                          0x0005
6885 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID                     0x0006
6886 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID      0x0007
6887 #define PCI_EXPRESS_MFVC_CAP_ID                                         0x0008
6888 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID                                  0x0009
6889 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID                                  0x000A
6890 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID                0x0010
6891 
6892 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
6893   USHORT CapabilityID;
6894   USHORT Version:4;
6895   USHORT Next:12;
6896 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
6897 
6898 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
6899   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
6900   ULONG LowSerialNumber;
6901   ULONG HighSerialNumber;
6902 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
6903 
6904 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
6905   _ANONYMOUS_STRUCT struct {
6906     ULONG Undefined:1;
6907     ULONG Reserved1:3;
6908     ULONG DataLinkProtocolError:1;
6909     ULONG SurpriseDownError:1;
6910     ULONG Reserved2:6;
6911     ULONG PoisonedTLP:1;
6912     ULONG FlowControlProtocolError:1;
6913     ULONG CompletionTimeout:1;
6914     ULONG CompleterAbort:1;
6915     ULONG UnexpectedCompletion:1;
6916     ULONG ReceiverOverflow:1;
6917     ULONG MalformedTLP:1;
6918     ULONG ECRCError:1;
6919     ULONG UnsupportedRequestError:1;
6920     ULONG Reserved3:11;
6921   } DUMMYSTRUCTNAME;
6922   ULONG AsULONG;
6923 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
6924 
6925 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
6926   _ANONYMOUS_STRUCT struct {
6927     ULONG Undefined:1;
6928     ULONG Reserved1:3;
6929     ULONG DataLinkProtocolError:1;
6930     ULONG SurpriseDownError:1;
6931     ULONG Reserved2:6;
6932     ULONG PoisonedTLP:1;
6933     ULONG FlowControlProtocolError:1;
6934     ULONG CompletionTimeout:1;
6935     ULONG CompleterAbort:1;
6936     ULONG UnexpectedCompletion:1;
6937     ULONG ReceiverOverflow:1;
6938     ULONG MalformedTLP:1;
6939     ULONG ECRCError:1;
6940     ULONG UnsupportedRequestError:1;
6941     ULONG Reserved3:11;
6942   } DUMMYSTRUCTNAME;
6943   ULONG AsULONG;
6944 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
6945 
6946 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
6947   _ANONYMOUS_STRUCT struct {
6948     ULONG Undefined:1;
6949     ULONG Reserved1:3;
6950     ULONG DataLinkProtocolError:1;
6951     ULONG SurpriseDownError:1;
6952     ULONG Reserved2:6;
6953     ULONG PoisonedTLP:1;
6954     ULONG FlowControlProtocolError:1;
6955     ULONG CompletionTimeout:1;
6956     ULONG CompleterAbort:1;
6957     ULONG UnexpectedCompletion:1;
6958     ULONG ReceiverOverflow:1;
6959     ULONG MalformedTLP:1;
6960     ULONG ECRCError:1;
6961     ULONG UnsupportedRequestError:1;
6962     ULONG Reserved3:11;
6963   } DUMMYSTRUCTNAME;
6964   ULONG AsULONG;
6965 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
6966 
6967 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
6968   _ANONYMOUS_STRUCT struct {
6969     ULONG ReceiverError:1;
6970     ULONG Reserved1:5;
6971     ULONG BadTLP:1;
6972     ULONG BadDLLP:1;
6973     ULONG ReplayNumRollover:1;
6974     ULONG Reserved2:3;
6975     ULONG ReplayTimerTimeout:1;
6976     ULONG AdvisoryNonFatalError:1;
6977     ULONG Reserved3:18;
6978   } DUMMYSTRUCTNAME;
6979   ULONG AsULONG;
6980 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
6981 
6982 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
6983   _ANONYMOUS_STRUCT struct {
6984     ULONG ReceiverError:1;
6985     ULONG Reserved1:5;
6986     ULONG BadTLP:1;
6987     ULONG BadDLLP:1;
6988     ULONG ReplayNumRollover:1;
6989     ULONG Reserved2:3;
6990     ULONG ReplayTimerTimeout:1;
6991     ULONG AdvisoryNonFatalError:1;
6992     ULONG Reserved3:18;
6993   } DUMMYSTRUCTNAME;
6994   ULONG AsULONG;
6995 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
6996 
6997 typedef union _PCI_EXPRESS_AER_CAPABILITIES {
6998   _ANONYMOUS_STRUCT struct {
6999     ULONG FirstErrorPointer:5;
7000     ULONG ECRCGenerationCapable:1;
7001     ULONG ECRCGenerationEnable:1;
7002     ULONG ECRCCheckCapable:1;
7003     ULONG ECRCCheckEnable:1;
7004     ULONG Reserved:23;
7005   } DUMMYSTRUCTNAME;
7006   ULONG AsULONG;
7007 } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
7008 
7009 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
7010   _ANONYMOUS_STRUCT struct {
7011     ULONG CorrectableErrorReportingEnable:1;
7012     ULONG NonFatalErrorReportingEnable:1;
7013     ULONG FatalErrorReportingEnable:1;
7014     ULONG Reserved:29;
7015   } DUMMYSTRUCTNAME;
7016   ULONG AsULONG;
7017 } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
7018 
7019 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
7020   _ANONYMOUS_STRUCT struct {
7021     ULONG CorrectableErrorReceived:1;
7022     ULONG MultipleCorrectableErrorsReceived:1;
7023     ULONG UncorrectableErrorReceived:1;
7024     ULONG MultipleUncorrectableErrorsReceived:1;
7025     ULONG FirstUncorrectableFatal:1;
7026     ULONG NonFatalErrorMessagesReceived:1;
7027     ULONG FatalErrorMessagesReceived:1;
7028     ULONG Reserved:20;
7029     ULONG AdvancedErrorInterruptMessageNumber:5;
7030   } DUMMYSTRUCTNAME;
7031   ULONG AsULONG;
7032 } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
7033 
7034 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
7035   _ANONYMOUS_STRUCT struct {
7036     USHORT CorrectableSourceIdFun:3;
7037     USHORT CorrectableSourceIdDev:5;
7038     USHORT CorrectableSourceIdBus:8;
7039     USHORT UncorrectableSourceIdFun:3;
7040     USHORT UncorrectableSourceIdDev:5;
7041     USHORT UncorrectableSourceIdBus:8;
7042   } DUMMYSTRUCTNAME;
7043   ULONG AsULONG;
7044 } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
7045 
7046 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
7047   _ANONYMOUS_STRUCT struct {
7048     ULONG TargetAbortOnSplitCompletion:1;
7049     ULONG MasterAbortOnSplitCompletion:1;
7050     ULONG ReceivedTargetAbort:1;
7051     ULONG ReceivedMasterAbort:1;
7052     ULONG RsvdZ:1;
7053     ULONG UnexpectedSplitCompletionError:1;
7054     ULONG UncorrectableSplitCompletion:1;
7055     ULONG UncorrectableDataError:1;
7056     ULONG UncorrectableAttributeError:1;
7057     ULONG UncorrectableAddressError:1;
7058     ULONG DelayedTransactionDiscardTimerExpired:1;
7059     ULONG PERRAsserted:1;
7060     ULONG SERRAsserted:1;
7061     ULONG InternalBridgeError:1;
7062     ULONG Reserved:18;
7063   } DUMMYSTRUCTNAME;
7064   ULONG AsULONG;
7065 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
7066 
7067 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
7068   _ANONYMOUS_STRUCT struct {
7069     ULONG TargetAbortOnSplitCompletion:1;
7070     ULONG MasterAbortOnSplitCompletion:1;
7071     ULONG ReceivedTargetAbort:1;
7072     ULONG ReceivedMasterAbort:1;
7073     ULONG RsvdZ:1;
7074     ULONG UnexpectedSplitCompletionError:1;
7075     ULONG UncorrectableSplitCompletion:1;
7076     ULONG UncorrectableDataError:1;
7077     ULONG UncorrectableAttributeError:1;
7078     ULONG UncorrectableAddressError:1;
7079     ULONG DelayedTransactionDiscardTimerExpired:1;
7080     ULONG PERRAsserted:1;
7081     ULONG SERRAsserted:1;
7082     ULONG InternalBridgeError:1;
7083     ULONG Reserved:18;
7084   } DUMMYSTRUCTNAME;
7085   ULONG AsULONG;
7086 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
7087 
7088 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
7089   _ANONYMOUS_STRUCT struct {
7090     ULONG TargetAbortOnSplitCompletion:1;
7091     ULONG MasterAbortOnSplitCompletion:1;
7092     ULONG ReceivedTargetAbort:1;
7093     ULONG ReceivedMasterAbort:1;
7094     ULONG RsvdZ:1;
7095     ULONG UnexpectedSplitCompletionError:1;
7096     ULONG UncorrectableSplitCompletion:1;
7097     ULONG UncorrectableDataError:1;
7098     ULONG UncorrectableAttributeError:1;
7099     ULONG UncorrectableAddressError:1;
7100     ULONG DelayedTransactionDiscardTimerExpired:1;
7101     ULONG PERRAsserted:1;
7102     ULONG SERRAsserted:1;
7103     ULONG InternalBridgeError:1;
7104     ULONG Reserved:18;
7105   } DUMMYSTRUCTNAME;
7106   ULONG AsULONG;
7107 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
7108 
7109 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
7110   _ANONYMOUS_STRUCT struct {
7111     ULONG SecondaryUncorrectableFirstErrorPtr:5;
7112     ULONG Reserved:27;
7113   } DUMMYSTRUCTNAME;
7114   ULONG AsULONG;
7115 } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
7116 
7117 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING  0x00000001
7118 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING     0x00000002
7119 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING        0x00000004
7120 
7121 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
7122     (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
7123      ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
7124      ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
7125 
7126 typedef struct _PCI_EXPRESS_AER_CAPABILITY {
7127   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7128   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7129   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7130   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7131   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7132   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7133   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7134   ULONG HeaderLog[4];
7135   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
7136   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
7137   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
7138   PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
7139   ULONG SecHeaderLog[4];
7140 } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
7141 
7142 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
7143   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7144   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7145   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7146   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7147   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7148   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7149   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7150   ULONG HeaderLog[4];
7151   PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
7152   PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
7153   PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
7154 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
7155 
7156 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
7157   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7158   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7159   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7160   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7161   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7162   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7163   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7164   ULONG HeaderLog[4];
7165   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
7166   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
7167   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
7168   PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
7169   ULONG SecHeaderLog[4];
7170 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
7171 
7172 typedef union _PCI_EXPRESS_SRIOV_CAPS {
7173   _ANONYMOUS_STRUCT struct {
7174     ULONG VFMigrationCapable:1;
7175     ULONG Reserved1:20;
7176     ULONG VFMigrationInterruptNumber:11;
7177   } DUMMYSTRUCTNAME;
7178   ULONG AsULONG;
7179 } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
7180 
7181 typedef union _PCI_EXPRESS_SRIOV_CONTROL {
7182   _ANONYMOUS_STRUCT struct {
7183     USHORT VFEnable:1;
7184     USHORT VFMigrationEnable:1;
7185     USHORT VFMigrationInterruptEnable:1;
7186     USHORT VFMemorySpaceEnable:1;
7187     USHORT ARICapableHierarchy:1;
7188     USHORT Reserved1:11;
7189   } DUMMYSTRUCTNAME;
7190   USHORT AsUSHORT;
7191 } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
7192 
7193 typedef union _PCI_EXPRESS_SRIOV_STATUS {
7194   _ANONYMOUS_STRUCT struct {
7195     USHORT VFMigrationStatus:1;
7196     USHORT Reserved1:15;
7197   } DUMMYSTRUCTNAME;
7198   USHORT AsUSHORT;
7199 } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
7200 
7201 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
7202   _ANONYMOUS_STRUCT struct {
7203     ULONG VFMigrationStateBIR:3;
7204     ULONG VFMigrationStateOffset:29;
7205   } DUMMYSTRUCTNAME;
7206   ULONG AsULONG;
7207 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
7208 
7209 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
7210   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7211   PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
7212   PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
7213   PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
7214   USHORT InitialVFs;
7215   USHORT TotalVFs;
7216   USHORT NumVFs;
7217   UCHAR FunctionDependencyLink;
7218   UCHAR RsvdP1;
7219   USHORT FirstVFOffset;
7220   USHORT VFStride;
7221   USHORT RsvdP2;
7222   USHORT VFDeviceId;
7223   ULONG SupportedPageSizes;
7224   ULONG SystemPageSize;
7225   ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
7226   PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
7227 } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
7228 
7229 /* PCI device classes */
7230 #define PCI_CLASS_PRE_20                    0x00
7231 #define PCI_CLASS_MASS_STORAGE_CTLR         0x01
7232 #define PCI_CLASS_NETWORK_CTLR              0x02
7233 #define PCI_CLASS_DISPLAY_CTLR              0x03
7234 #define PCI_CLASS_MULTIMEDIA_DEV            0x04
7235 #define PCI_CLASS_MEMORY_CTLR               0x05
7236 #define PCI_CLASS_BRIDGE_DEV                0x06
7237 #define PCI_CLASS_SIMPLE_COMMS_CTLR         0x07
7238 #define PCI_CLASS_BASE_SYSTEM_DEV           0x08
7239 #define PCI_CLASS_INPUT_DEV                 0x09
7240 #define PCI_CLASS_DOCKING_STATION           0x0a
7241 #define PCI_CLASS_PROCESSOR                 0x0b
7242 #define PCI_CLASS_SERIAL_BUS_CTLR           0x0c
7243 #define PCI_CLASS_WIRELESS_CTLR             0x0d
7244 #define PCI_CLASS_INTELLIGENT_IO_CTLR       0x0e
7245 #define PCI_CLASS_SATELLITE_COMMS_CTLR      0x0f
7246 #define PCI_CLASS_ENCRYPTION_DECRYPTION     0x10
7247 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC      0x11
7248 #define PCI_CLASS_NOT_DEFINED               0xff
7249 
7250 /* PCI device subclasses for class 0 */
7251 #define PCI_SUBCLASS_PRE_20_NON_VGA         0x00
7252 #define PCI_SUBCLASS_PRE_20_VGA             0x01
7253 
7254 /* PCI device subclasses for class 1 (mass storage controllers)*/
7255 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR      0x00
7256 #define PCI_SUBCLASS_MSC_IDE_CTLR           0x01
7257 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR        0x02
7258 #define PCI_SUBCLASS_MSC_IPI_CTLR           0x03
7259 #define PCI_SUBCLASS_MSC_RAID_CTLR          0x04
7260 #define PCI_SUBCLASS_MSC_OTHER              0x80
7261 
7262 /* PCI device subclasses for class 2 (network controllers)*/
7263 #define PCI_SUBCLASS_NET_ETHERNET_CTLR      0x00
7264 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR    0x01
7265 #define PCI_SUBCLASS_NET_FDDI_CTLR          0x02
7266 #define PCI_SUBCLASS_NET_ATM_CTLR           0x03
7267 #define PCI_SUBCLASS_NET_ISDN_CTLR          0x04
7268 #define PCI_SUBCLASS_NET_OTHER              0x80
7269 
7270 /* PCI device subclasses for class 3 (display controllers)*/
7271 #define PCI_SUBCLASS_VID_VGA_CTLR           0x00
7272 #define PCI_SUBCLASS_VID_XGA_CTLR           0x01
7273 #define PCI_SUBCLASS_VID_3D_CTLR            0x02
7274 #define PCI_SUBCLASS_VID_OTHER              0x80
7275 
7276 /* PCI device subclasses for class 4 (multimedia device)*/
7277 #define PCI_SUBCLASS_MM_VIDEO_DEV           0x00
7278 #define PCI_SUBCLASS_MM_AUDIO_DEV           0x01
7279 #define PCI_SUBCLASS_MM_TELEPHONY_DEV       0x02
7280 #define PCI_SUBCLASS_MM_OTHER               0x80
7281 
7282 /* PCI device subclasses for class 5 (memory controller)*/
7283 #define PCI_SUBCLASS_MEM_RAM                0x00
7284 #define PCI_SUBCLASS_MEM_FLASH              0x01
7285 #define PCI_SUBCLASS_MEM_OTHER              0x80
7286 
7287 /* PCI device subclasses for class 6 (bridge device)*/
7288 #define PCI_SUBCLASS_BR_HOST                0x00
7289 #define PCI_SUBCLASS_BR_ISA                 0x01
7290 #define PCI_SUBCLASS_BR_EISA                0x02
7291 #define PCI_SUBCLASS_BR_MCA                 0x03
7292 #define PCI_SUBCLASS_BR_PCI_TO_PCI          0x04
7293 #define PCI_SUBCLASS_BR_PCMCIA              0x05
7294 #define PCI_SUBCLASS_BR_NUBUS               0x06
7295 #define PCI_SUBCLASS_BR_CARDBUS             0x07
7296 #define PCI_SUBCLASS_BR_RACEWAY             0x08
7297 #define PCI_SUBCLASS_BR_OTHER               0x80
7298 
7299 #define PCI_SUBCLASS_COM_SERIAL             0x00
7300 #define PCI_SUBCLASS_COM_PARALLEL           0x01
7301 #define PCI_SUBCLASS_COM_MULTIPORT          0x02
7302 #define PCI_SUBCLASS_COM_MODEM              0x03
7303 #define PCI_SUBCLASS_COM_OTHER              0x80
7304 
7305 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR     0x00
7306 #define PCI_SUBCLASS_SYS_DMA_CTLR           0x01
7307 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER       0x02
7308 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK    0x03
7309 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR   0x04
7310 #define PCI_SUBCLASS_SYS_SDIO_CTRL          0x05
7311 #define PCI_SUBCLASS_SYS_OTHER              0x80
7312 
7313 #define PCI_SUBCLASS_INP_KEYBOARD           0x00
7314 #define PCI_SUBCLASS_INP_DIGITIZER          0x01
7315 #define PCI_SUBCLASS_INP_MOUSE              0x02
7316 #define PCI_SUBCLASS_INP_SCANNER            0x03
7317 #define PCI_SUBCLASS_INP_GAMEPORT           0x04
7318 #define PCI_SUBCLASS_INP_OTHER              0x80
7319 
7320 #define PCI_SUBCLASS_DOC_GENERIC            0x00
7321 #define PCI_SUBCLASS_DOC_OTHER              0x80
7322 
7323 #define PCI_SUBCLASS_PROC_386               0x00
7324 #define PCI_SUBCLASS_PROC_486               0x01
7325 #define PCI_SUBCLASS_PROC_PENTIUM           0x02
7326 #define PCI_SUBCLASS_PROC_ALPHA             0x10
7327 #define PCI_SUBCLASS_PROC_POWERPC           0x20
7328 #define PCI_SUBCLASS_PROC_COPROCESSOR       0x40
7329 
7330 /* PCI device subclasses for class C (serial bus controller)*/
7331 #define PCI_SUBCLASS_SB_IEEE1394            0x00
7332 #define PCI_SUBCLASS_SB_ACCESS              0x01
7333 #define PCI_SUBCLASS_SB_SSA                 0x02
7334 #define PCI_SUBCLASS_SB_USB                 0x03
7335 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL       0x04
7336 #define PCI_SUBCLASS_SB_SMBUS               0x05
7337 
7338 #define PCI_SUBCLASS_WIRELESS_IRDA          0x00
7339 #define PCI_SUBCLASS_WIRELESS_CON_IR        0x01
7340 #define PCI_SUBCLASS_WIRELESS_RF            0x10
7341 #define PCI_SUBCLASS_WIRELESS_OTHER         0x80
7342 
7343 #define PCI_SUBCLASS_INTIO_I2O              0x00
7344 
7345 #define PCI_SUBCLASS_SAT_TV                 0x01
7346 #define PCI_SUBCLASS_SAT_AUDIO              0x02
7347 #define PCI_SUBCLASS_SAT_VOICE              0x03
7348 #define PCI_SUBCLASS_SAT_DATA               0x04
7349 
7350 #define PCI_SUBCLASS_CRYPTO_NET_COMP        0x00
7351 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT   0x10
7352 #define PCI_SUBCLASS_CRYPTO_OTHER           0x80
7353 
7354 #define PCI_SUBCLASS_DASP_DPIO              0x00
7355 #define PCI_SUBCLASS_DASP_OTHER             0x80
7356 
7357 #define PCI_ADDRESS_IO_SPACE                0x00000001
7358 #define PCI_ADDRESS_MEMORY_TYPE_MASK        0x00000006
7359 #define PCI_ADDRESS_MEMORY_PREFETCHABLE     0x00000008
7360 #define PCI_ADDRESS_IO_ADDRESS_MASK         0xfffffffc
7361 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK     0xfffffff0
7362 #define PCI_ADDRESS_ROM_ADDRESS_MASK        0xfffff800
7363 
7364 #define PCI_TYPE_32BIT                      0
7365 #define PCI_TYPE_20BIT                      2
7366 #define PCI_TYPE_64BIT                      4
7367 
7368 #define PCI_ROMADDRESS_ENABLED              0x00000001
7369 
7370 #endif /* _PCI_X_ */
7371 
7372 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION       1
7373 
7374 typedef NTSTATUS
7375 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
7376   IN OUT PVOID Context);
7377 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
7378 
7379 typedef NTSTATUS
7380 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
7381   IN OUT PVOID Context);
7382 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
7383 
7384 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
7385   USHORT Size;
7386   USHORT Version;
7387   PVOID Context;
7388   PINTERFACE_REFERENCE InterfaceReference;
7389   PINTERFACE_DEREFERENCE InterfaceDereference;
7390   PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
7391   PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
7392 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
7393 
7394 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION            1
7395 
7396 typedef ULONG
7397 (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
7398   IN PVOID Context,
7399   OUT PVOID Buffer,
7400   IN ULONG Offset,
7401   IN ULONG Length);
7402 
7403 typedef ULONG
7404 (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
7405   IN PVOID Context,
7406   IN PVOID Buffer,
7407   IN ULONG Offset,
7408   IN ULONG Length);
7409 
7410 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
7411   USHORT Size;
7412   USHORT Version;
7413   PVOID Context;
7414   PINTERFACE_REFERENCE InterfaceReference;
7415   PINTERFACE_DEREFERENCE InterfaceDereference;
7416   PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
7417   PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
7418 } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
7419 
7420 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION            1
7421 
7422 typedef NTSTATUS
7423 (NTAPI PCI_MSIX_SET_ENTRY)(
7424   IN PVOID Context,
7425   IN ULONG TableEntry,
7426   IN ULONG MessageNumber);
7427 typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
7428 
7429 typedef NTSTATUS
7430 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
7431   IN PVOID Context,
7432   IN ULONG TableEntry);
7433 typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
7434 
7435 typedef NTSTATUS
7436 (NTAPI PCI_MSIX_GET_ENTRY)(
7437   IN PVOID Context,
7438   IN ULONG TableEntry,
7439   OUT PULONG MessageNumber,
7440   OUT PBOOLEAN Masked);
7441 typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
7442 
7443 typedef NTSTATUS
7444 (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
7445   IN PVOID Context,
7446   OUT PULONG TableSize);
7447 typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
7448 
7449 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
7450   USHORT Size;
7451   USHORT Version;
7452   PVOID Context;
7453   PINTERFACE_REFERENCE InterfaceReference;
7454   PINTERFACE_DEREFERENCE InterfaceDereference;
7455   PPCI_MSIX_SET_ENTRY SetTableEntry;
7456   PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
7457   PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
7458   PPCI_MSIX_GET_ENTRY GetTableEntry;
7459   PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
7460 } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
7461 
7462 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
7463         RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
7464 
7465 /******************************************************************************
7466  *                            Object Manager Types                            *
7467  ******************************************************************************/
7468 
7469 #define MAXIMUM_FILENAME_LENGTH           256
7470 #define OBJ_NAME_PATH_SEPARATOR           ((WCHAR)L'\\')
7471 
7472 #define OBJECT_TYPE_CREATE                0x0001
7473 #define OBJECT_TYPE_ALL_ACCESS            (STANDARD_RIGHTS_REQUIRED | 0x1)
7474 
7475 #define DIRECTORY_QUERY                   0x0001
7476 #define DIRECTORY_TRAVERSE                0x0002
7477 #define DIRECTORY_CREATE_OBJECT           0x0004
7478 #define DIRECTORY_CREATE_SUBDIRECTORY     0x0008
7479 #define DIRECTORY_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED | 0xF)
7480 
7481 #define SYMBOLIC_LINK_QUERY               0x0001
7482 #define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)
7483 
7484 #define DUPLICATE_CLOSE_SOURCE            0x00000001
7485 #define DUPLICATE_SAME_ACCESS             0x00000002
7486 #define DUPLICATE_SAME_ATTRIBUTES         0x00000004
7487 
7488 #define OB_FLT_REGISTRATION_VERSION_0100  0x0100
7489 #define OB_FLT_REGISTRATION_VERSION       OB_FLT_REGISTRATION_VERSION_0100
7490 
7491 typedef ULONG OB_OPERATION;
7492 
7493 #define OB_OPERATION_HANDLE_CREATE        0x00000001
7494 #define OB_OPERATION_HANDLE_DUPLICATE     0x00000002
7495 
7496 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {
7497   IN OUT ACCESS_MASK DesiredAccess;
7498   IN ACCESS_MASK OriginalDesiredAccess;
7499 } OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION;
7500 
7501 typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION {
7502   IN OUT ACCESS_MASK DesiredAccess;
7503   IN ACCESS_MASK OriginalDesiredAccess;
7504   IN PVOID SourceProcess;
7505   IN PVOID TargetProcess;
7506 } OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION;
7507 
7508 typedef union _OB_PRE_OPERATION_PARAMETERS {
7509   IN OUT OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation;
7510   IN OUT OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
7511 } OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS;
7512 
7513 typedef struct _OB_PRE_OPERATION_INFORMATION {
7514   IN OB_OPERATION Operation;
7515   _ANONYMOUS_UNION union {
7516     IN ULONG Flags;
7517     _ANONYMOUS_STRUCT struct {
7518       IN ULONG KernelHandle:1;
7519       IN ULONG Reserved:31;
7520     } DUMMYSTRUCTNAME;
7521   } DUMMYUNIONNAME;
7522   IN PVOID Object;
7523   IN POBJECT_TYPE ObjectType;
7524   OUT PVOID CallContext;
7525   IN POB_PRE_OPERATION_PARAMETERS Parameters;
7526 } OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION;
7527 
7528 typedef struct _OB_POST_CREATE_HANDLE_INFORMATION {
7529   IN ACCESS_MASK GrantedAccess;
7530 } OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION;
7531 
7532 typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION {
7533   IN ACCESS_MASK GrantedAccess;
7534 } OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION;
7535 
7536 typedef union _OB_POST_OPERATION_PARAMETERS {
7537   IN OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation;
7538   IN OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
7539 } OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS;
7540 
7541 typedef struct _OB_POST_OPERATION_INFORMATION {
7542   IN OB_OPERATION Operation;
7543   _ANONYMOUS_UNION union {
7544     IN ULONG Flags;
7545     _ANONYMOUS_STRUCT struct {
7546       IN ULONG KernelHandle:1;
7547       IN ULONG Reserved:31;
7548     } DUMMYSTRUCTNAME;
7549   } DUMMYUNIONNAME;
7550   IN PVOID Object;
7551   IN POBJECT_TYPE ObjectType;
7552   IN PVOID CallContext;
7553   IN NTSTATUS ReturnStatus;
7554   IN POB_POST_OPERATION_PARAMETERS Parameters;
7555 } OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION;
7556 
7557 typedef enum _OB_PREOP_CALLBACK_STATUS {
7558   OB_PREOP_SUCCESS
7559 } OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS;
7560 
7561 typedef OB_PREOP_CALLBACK_STATUS
7562 (NTAPI *POB_PRE_OPERATION_CALLBACK)(
7563   IN PVOID RegistrationContext,
7564   IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation);
7565 
7566 typedef VOID
7567 (NTAPI *POB_POST_OPERATION_CALLBACK)(
7568   IN PVOID RegistrationContext,
7569   IN POB_POST_OPERATION_INFORMATION OperationInformation);
7570 
7571 typedef struct _OB_OPERATION_REGISTRATION {
7572   IN POBJECT_TYPE *ObjectType;
7573   IN OB_OPERATION Operations;
7574   IN POB_PRE_OPERATION_CALLBACK PreOperation;
7575   IN POB_POST_OPERATION_CALLBACK PostOperation;
7576 } OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;
7577 
7578 typedef struct _OB_CALLBACK_REGISTRATION {
7579   IN USHORT Version;
7580   IN USHORT OperationRegistrationCount;
7581   IN UNICODE_STRING Altitude;
7582   IN PVOID RegistrationContext;
7583   IN OB_OPERATION_REGISTRATION *OperationRegistration;
7584 } OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
7585 
7586 typedef struct _OBJECT_NAME_INFORMATION {
7587   UNICODE_STRING Name;
7588 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
7589 
7590 /* Exported object types */
7591 extern POBJECT_TYPE NTSYSAPI *CmKeyObjectType;
7592 extern POBJECT_TYPE NTSYSAPI *ExEventObjectType;
7593 extern POBJECT_TYPE NTSYSAPI *ExSemaphoreObjectType;
7594 extern POBJECT_TYPE NTSYSAPI *IoFileObjectType;
7595 extern POBJECT_TYPE NTSYSAPI *PsThreadType;
7596 extern POBJECT_TYPE NTSYSAPI *SeTokenObjectType;
7597 extern POBJECT_TYPE NTSYSAPI *PsProcessType;
7598 extern POBJECT_TYPE NTSYSAPI *TmEnlistmentObjectType;
7599 extern POBJECT_TYPE NTSYSAPI *TmResourceManagerObjectType;
7600 extern POBJECT_TYPE NTSYSAPI *TmTransactionManagerObjectType;
7601 extern POBJECT_TYPE NTSYSAPI *TmTransactionObjectType;
7602 
7603 /******************************************************************************
7604  *                           Process Manager Types                            *
7605  ******************************************************************************/
7606 
7607 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001
7608 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
7609 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004
7610 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
7611 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
7612 
7613 /* Thread Access Rights */
7614 #define THREAD_TERMINATE                 0x0001
7615 #define THREAD_SUSPEND_RESUME            0x0002
7616 #define THREAD_ALERT                     0x0004
7617 #define THREAD_GET_CONTEXT               0x0008
7618 #define THREAD_SET_CONTEXT               0x0010
7619 #define THREAD_SET_INFORMATION           0x0020
7620 #define THREAD_SET_LIMITED_INFORMATION   0x0400
7621 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
7622 
7623 #define PROCESS_DUP_HANDLE               (0x0040)
7624 
7625 #if (NTDDI_VERSION >= NTDDI_VISTA)
7626 #define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
7627 #else
7628 #define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
7629 #endif
7630 
7631 #if (NTDDI_VERSION >= NTDDI_VISTA)
7632 #define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
7633 #else
7634 #define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
7635 #endif
7636 
7637 #define LOW_PRIORITY                      0
7638 #define LOW_REALTIME_PRIORITY             16
7639 #define HIGH_PRIORITY                     31
7640 #define MAXIMUM_PRIORITY                  32
7641 
7642 
7643 /******************************************************************************
7644  *                          WMI Library Support Types                         *
7645  ******************************************************************************/
7646 
7647 #ifdef RUN_WPP
7648 #include <evntrace.h>
7649 #include <stdarg.h>
7650 #endif
7651 
7652 #ifndef _TRACEHANDLE_DEFINED
7653 #define _TRACEHANDLE_DEFINED
7654 typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
7655 #endif
7656 
7657 #ifndef TRACE_INFORMATION_CLASS_DEFINE
7658 
7659 typedef struct _ETW_TRACE_SESSION_SETTINGS {
7660   ULONG Version;
7661   ULONG BufferSize;
7662   ULONG MinimumBuffers;
7663   ULONG MaximumBuffers;
7664   ULONG LoggerMode;
7665   ULONG FlushTimer;
7666   ULONG FlushThreshold;
7667   ULONG ClockType;
7668 } ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS;
7669 
7670 typedef enum _TRACE_INFORMATION_CLASS {
7671   TraceIdClass,
7672   TraceHandleClass,
7673   TraceEnableFlagsClass,
7674   TraceEnableLevelClass,
7675   GlobalLoggerHandleClass,
7676   EventLoggerHandleClass,
7677   AllLoggerHandlesClass,
7678   TraceHandleByNameClass,
7679   LoggerEventsLostClass,
7680   TraceSessionSettingsClass,
7681   LoggerEventsLoggedClass,
7682   MaxTraceInformationClass
7683 } TRACE_INFORMATION_CLASS;
7684 
7685 #endif /* TRACE_INFORMATION_CLASS_DEFINE */
7686 
7687 #ifndef _ETW_KM_
7688 #define _ETW_KM_
7689 #endif
7690 
7691 #include <evntprov.h>
7692 
7693 typedef VOID
7694 (NTAPI *PETWENABLECALLBACK)(
7695   IN LPCGUID SourceId,
7696   IN ULONG ControlCode,
7697   IN UCHAR Level,
7698   IN ULONGLONG MatchAnyKeyword,
7699   IN ULONGLONG MatchAllKeyword,
7700   IN PEVENT_FILTER_DESCRIPTOR FilterData OPTIONAL,
7701   IN OUT PVOID CallbackContext OPTIONAL);
7702 
7703 #define EVENT_WRITE_FLAG_NO_FAULTING             0x00000001
7704 
7705 
7706 #if defined(_M_IX86)
7707 /** Kernel definitions for x86 **/
7708 
7709 /* Interrupt request levels */
7710 #define PASSIVE_LEVEL           0
7711 #define LOW_LEVEL               0
7712 #define APC_LEVEL               1
7713 #define DISPATCH_LEVEL          2
7714 #define CMCI_LEVEL              5
7715 #define PROFILE_LEVEL           27
7716 #define CLOCK1_LEVEL            28
7717 #define CLOCK2_LEVEL            28
7718 #define IPI_LEVEL               29
7719 #define POWER_LEVEL             30
7720 #define HIGH_LEVEL              31
7721 #define CLOCK_LEVEL             CLOCK2_LEVEL
7722 
7723 #define KIP0PCRADDRESS          0xffdff000
7724 #define KI_USER_SHARED_DATA     0xffdf0000
7725 #define SharedUserData          ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
7726 
7727 #define PAGE_SIZE               0x1000
7728 #define PAGE_SHIFT              12L
7729 #define KeGetDcacheFillSize()   1L
7730 
7731 #define EFLAG_SIGN              0x8000
7732 #define EFLAG_ZERO              0x4000
7733 #define EFLAG_SELECT            (EFLAG_SIGN | EFLAG_ZERO)
7734 
7735 #define RESULT_NEGATIVE         ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
7736 #define RESULT_ZERO             ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
7737 #define RESULT_POSITIVE         ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
7738 
7739 
7740 typedef struct _KFLOATING_SAVE {
7741   ULONG ControlWord;
7742   ULONG StatusWord;
7743   ULONG ErrorOffset;
7744   ULONG ErrorSelector;
7745   ULONG DataOffset;
7746   ULONG DataSelector;
7747   ULONG Cr0NpxState;
7748   ULONG Spare1;
7749 } KFLOATING_SAVE, *PKFLOATING_SAVE;
7750 
7751 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
7752 
7753 #define YieldProcessor _mm_pause
7754 
7755 FORCEINLINE
7756 VOID
KeMemoryBarrier(VOID)7757 KeMemoryBarrier(VOID)
7758 {
7759   volatile LONG Barrier;
7760 #if defined(__GNUC__)
7761   __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
7762 #elif defined(_MSC_VER)
7763   __asm xchg [Barrier], eax
7764 #endif
7765 }
7766 
7767 NTHALAPI
7768 KIRQL
7769 NTAPI
7770 KeGetCurrentIrql(VOID);
7771 
7772 NTHALAPI
7773 VOID
7774 FASTCALL
7775 KfLowerIrql(
7776   IN KIRQL NewIrql);
7777 #define KeLowerIrql(a) KfLowerIrql(a)
7778 
7779 NTHALAPI
7780 KIRQL
7781 FASTCALL
7782 KfRaiseIrql(
7783   IN KIRQL NewIrql);
7784 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7785 
7786 NTHALAPI
7787 KIRQL
7788 NTAPI
7789 KeRaiseIrqlToDpcLevel(VOID);
7790 
7791 NTHALAPI
7792 KIRQL
7793 NTAPI
7794 KeRaiseIrqlToSynchLevel(VOID);
7795 
7796 NTHALAPI
7797 KIRQL
7798 FASTCALL
7799 KfAcquireSpinLock(
7800   IN OUT PKSPIN_LOCK SpinLock);
7801 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
7802 
7803 NTHALAPI
7804 VOID
7805 FASTCALL
7806 KfReleaseSpinLock(
7807   IN OUT PKSPIN_LOCK SpinLock,
7808   IN KIRQL NewIrql);
7809 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
7810 
7811 NTKERNELAPI
7812 VOID
7813 FASTCALL
7814 KefAcquireSpinLockAtDpcLevel(
7815   IN OUT PKSPIN_LOCK SpinLock);
7816 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
7817 
7818 NTKERNELAPI
7819 VOID
7820 FASTCALL
7821 KefReleaseSpinLockFromDpcLevel(
7822   IN OUT PKSPIN_LOCK SpinLock);
7823 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
7824 
7825 NTSYSAPI
7826 PKTHREAD
7827 NTAPI
7828 KeGetCurrentThread(VOID);
7829 
7830 NTKERNELAPI
7831 NTSTATUS
7832 NTAPI
7833 KeSaveFloatingPointState(
7834   OUT PKFLOATING_SAVE FloatSave);
7835 
7836 NTKERNELAPI
7837 NTSTATUS
7838 NTAPI
7839 KeRestoreFloatingPointState(
7840   IN PKFLOATING_SAVE FloatSave);
7841 
7842 /* VOID
7843  * KeFlushIoBuffers(
7844  *   IN PMDL Mdl,
7845  *   IN BOOLEAN ReadOperation,
7846  *   IN BOOLEAN DmaOperation)
7847  */
7848 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7849 
7850 /* x86 and x64 performs a 0x2C interrupt */
7851 #define DbgRaiseAssertionFailure __int2c
7852 
7853 FORCEINLINE
7854 VOID
_KeQueryTickCount(OUT PLARGE_INTEGER CurrentCount)7855 _KeQueryTickCount(
7856   OUT PLARGE_INTEGER CurrentCount)
7857 {
7858   for (;;) {
7859 #ifdef NONAMELESSUNION
7860     CurrentCount->s.HighPart = KeTickCount.High1Time;
7861     CurrentCount->s.LowPart = KeTickCount.LowPart;
7862     if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
7863 #else
7864     CurrentCount->HighPart = KeTickCount.High1Time;
7865     CurrentCount->LowPart = KeTickCount.LowPart;
7866     if (CurrentCount->HighPart == KeTickCount.High2Time) break;
7867 #endif
7868     YieldProcessor();
7869   }
7870 }
7871 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
7872 
7873 
7874 #elif defined(_M_AMD64)
7875 /** Kernel definitions for AMD64 **/
7876 
7877 /* Interrupt request levels */
7878 #define PASSIVE_LEVEL           0
7879 #define LOW_LEVEL               0
7880 #define APC_LEVEL               1
7881 #define DISPATCH_LEVEL          2
7882 #define CMCI_LEVEL              5
7883 #define CLOCK_LEVEL             13
7884 #define IPI_LEVEL               14
7885 #define DRS_LEVEL               14
7886 #define POWER_LEVEL             14
7887 #define PROFILE_LEVEL           15
7888 #define HIGH_LEVEL              15
7889 
7890 #define KI_USER_SHARED_DATA     0xFFFFF78000000000ULL
7891 #define SharedUserData          ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
7892 #define SharedInterruptTime     (KI_USER_SHARED_DATA + 0x8)
7893 #define SharedSystemTime        (KI_USER_SHARED_DATA + 0x14)
7894 #define SharedTickCount         (KI_USER_SHARED_DATA + 0x320)
7895 
7896 #define PAGE_SIZE               0x1000
7897 #define PAGE_SHIFT              12L
7898 
7899 #define EFLAG_SIGN              0x8000
7900 #define EFLAG_ZERO              0x4000
7901 #define EFLAG_SELECT            (EFLAG_SIGN | EFLAG_ZERO)
7902 
7903 typedef struct _KFLOATING_SAVE {
7904   ULONG Dummy;
7905 } KFLOATING_SAVE, *PKFLOATING_SAVE;
7906 
7907 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
7908 
7909 #define KeQueryInterruptTime() \
7910     (*(volatile ULONG64*)SharedInterruptTime)
7911 
7912 #define KeQuerySystemTime(CurrentCount) \
7913     *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
7914 
7915 #define KeQueryTickCount(CurrentCount) \
7916     *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
7917 
7918 #define KeGetDcacheFillSize() 1L
7919 
7920 #define YieldProcessor _mm_pause
7921 
7922 FORCEINLINE
7923 KIRQL
KeGetCurrentIrql(VOID)7924 KeGetCurrentIrql(VOID)
7925 {
7926   return (KIRQL)__readcr8();
7927 }
7928 
7929 FORCEINLINE
7930 VOID
KeLowerIrql(IN KIRQL NewIrql)7931 KeLowerIrql(IN KIRQL NewIrql)
7932 {
7933   //ASSERT(KeGetCurrentIrql() >= NewIrql);
7934   __writecr8(NewIrql);
7935 }
7936 
7937 FORCEINLINE
7938 KIRQL
KfRaiseIrql(IN KIRQL NewIrql)7939 KfRaiseIrql(IN KIRQL NewIrql)
7940 {
7941   KIRQL OldIrql;
7942 
7943   OldIrql = (KIRQL)__readcr8();
7944   //ASSERT(OldIrql <= NewIrql);
7945   __writecr8(NewIrql);
7946   return OldIrql;
7947 }
7948 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
7949 
7950 FORCEINLINE
7951 KIRQL
KeRaiseIrqlToDpcLevel(VOID)7952 KeRaiseIrqlToDpcLevel(VOID)
7953 {
7954   return KfRaiseIrql(DISPATCH_LEVEL);
7955 }
7956 
7957 FORCEINLINE
7958 KIRQL
KeRaiseIrqlToSynchLevel(VOID)7959 KeRaiseIrqlToSynchLevel(VOID)
7960 {
7961   return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
7962 }
7963 
7964 FORCEINLINE
7965 PKTHREAD
KeGetCurrentThread(VOID)7966 KeGetCurrentThread(VOID)
7967 {
7968   return (struct _KTHREAD *)__readgsqword(0x188);
7969 }
7970 
7971 /* VOID
7972  * KeFlushIoBuffers(
7973  *   IN PMDL Mdl,
7974  *   IN BOOLEAN ReadOperation,
7975  *   IN BOOLEAN DmaOperation)
7976  */
7977 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7978 
7979 /* x86 and x64 performs a 0x2C interrupt */
7980 #define DbgRaiseAssertionFailure __int2c
7981 
7982 #elif defined(_M_IA64)
7983 /** Kernel definitions for IA64 **/
7984 
7985 /* Interrupt request levels */
7986 #define PASSIVE_LEVEL           0
7987 #define LOW_LEVEL               0
7988 #define APC_LEVEL               1
7989 #define DISPATCH_LEVEL          2
7990 #define CMC_LEVEL               3
7991 #define DEVICE_LEVEL_BASE       4
7992 #define PC_LEVEL                12
7993 #define IPI_LEVEL               14
7994 #define DRS_LEVEL               14
7995 #define CLOCK_LEVEL             13
7996 #define POWER_LEVEL             15
7997 #define PROFILE_LEVEL           15
7998 #define HIGH_LEVEL              15
7999 
8000 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
8001 extern volatile LARGE_INTEGER KeTickCount;
8002 
8003 #define PAUSE_PROCESSOR __yield();
8004 
8005 FORCEINLINE
8006 VOID
KeFlushWriteBuffer(VOID)8007 KeFlushWriteBuffer(VOID)
8008 {
8009   __mf ();
8010   return;
8011 }
8012 
8013 NTSYSAPI
8014 PKTHREAD
8015 NTAPI
8016 KeGetCurrentThread(VOID);
8017 
8018 
8019 #elif defined(_M_PPC)
8020 
8021 /* Interrupt request levels */
8022 #define PASSIVE_LEVEL                      0
8023 #define LOW_LEVEL                          0
8024 #define APC_LEVEL                          1
8025 #define DISPATCH_LEVEL                     2
8026 #define PROFILE_LEVEL                     27
8027 #define CLOCK1_LEVEL                      28
8028 #define CLOCK2_LEVEL                      28
8029 #define IPI_LEVEL                         29
8030 #define POWER_LEVEL                       30
8031 #define HIGH_LEVEL                        31
8032 
8033 //
8034 // Used to contain PFNs and PFN counts
8035 //
8036 typedef ULONG PFN_COUNT;
8037 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
8038 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
8039 
8040 
8041 typedef struct _KFLOATING_SAVE {
8042   ULONG Dummy;
8043 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8044 
8045 typedef struct _KPCR_TIB {
8046   PVOID ExceptionList;         /* 00 */
8047   PVOID StackBase;             /* 04 */
8048   PVOID StackLimit;            /* 08 */
8049   PVOID SubSystemTib;          /* 0C */
8050   _ANONYMOUS_UNION union {
8051     PVOID FiberData;           /* 10 */
8052     ULONG Version;             /* 10 */
8053   } DUMMYUNIONNAME;
8054   PVOID ArbitraryUserPointer;  /* 14 */
8055   struct _KPCR_TIB *Self;       /* 18 */
8056 } KPCR_TIB, *PKPCR_TIB;         /* 1C */
8057 
8058 #define PCR_MINOR_VERSION 1
8059 #define PCR_MAJOR_VERSION 1
8060 
8061 typedef struct _KPCR {
8062   KPCR_TIB Tib;                /* 00 */
8063   struct _KPCR *Self;          /* 1C */
8064   struct _KPRCB *Prcb;         /* 20 */
8065   KIRQL Irql;                  /* 24 */
8066   ULONG IRR;                   /* 28 */
8067   ULONG IrrActive;             /* 2C */
8068   ULONG IDR;                   /* 30 */
8069   PVOID KdVersionBlock;        /* 34 */
8070   PUSHORT IDT;                 /* 38 */
8071   PUSHORT GDT;                 /* 3C */
8072   struct _KTSS *TSS;           /* 40 */
8073   USHORT MajorVersion;         /* 44 */
8074   USHORT MinorVersion;         /* 46 */
8075   KAFFINITY SetMember;         /* 48 */
8076   ULONG StallScaleFactor;      /* 4C */
8077   UCHAR SpareUnused;           /* 50 */
8078   UCHAR Number;                /* 51 */
8079 } KPCR, *PKPCR;                /* 54 */
8080 
8081 #define KeGetPcr()                      PCR
8082 
8083 #define YieldProcessor() __asm__ __volatile__("nop");
8084 
8085 FORCEINLINE
8086 ULONG
8087 NTAPI
KeGetCurrentProcessorNumber(VOID)8088 KeGetCurrentProcessorNumber(VOID)
8089 {
8090   ULONG Number;
8091   __asm__ __volatile__ (
8092     "lwz %0, %c1(12)\n"
8093     : "=r" (Number)
8094     : "i" (FIELD_OFFSET(KPCR, Number))
8095   );
8096   return Number;
8097 }
8098 
8099 NTHALAPI
8100 VOID
8101 FASTCALL
8102 KfLowerIrql(
8103   IN KIRQL NewIrql);
8104 #define KeLowerIrql(a) KfLowerIrql(a)
8105 
8106 NTHALAPI
8107 KIRQL
8108 FASTCALL
8109 KfRaiseIrql(
8110   IN KIRQL NewIrql);
8111 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8112 
8113 NTHALAPI
8114 KIRQL
8115 NTAPI
8116 KeRaiseIrqlToDpcLevel(VOID);
8117 
8118 NTHALAPI
8119 KIRQL
8120 NTAPI
8121 KeRaiseIrqlToSynchLevel(VOID);
8122 
8123 
8124 
8125 #elif defined(_M_MIPS)
8126 #error MIPS Headers are totally incorrect
8127 
8128 //
8129 // Used to contain PFNs and PFN counts
8130 //
8131 typedef ULONG PFN_COUNT;
8132 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
8133 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
8134 
8135 #define PASSIVE_LEVEL                      0
8136 #define APC_LEVEL                          1
8137 #define DISPATCH_LEVEL                     2
8138 #define PROFILE_LEVEL                     27
8139 #define IPI_LEVEL                         29
8140 #define HIGH_LEVEL                        31
8141 
8142 typedef struct _KPCR {
8143   struct _KPRCB *Prcb;         /* 20 */
8144   KIRQL Irql;                  /* 24 */
8145   ULONG IRR;                   /* 28 */
8146   ULONG IDR;                   /* 30 */
8147 } KPCR, *PKPCR;
8148 
8149 #define KeGetPcr()                      PCR
8150 
8151 typedef struct _KFLOATING_SAVE {
8152 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8153 
8154 static __inline
8155 ULONG
8156 NTAPI
KeGetCurrentProcessorNumber(VOID)8157 KeGetCurrentProcessorNumber(VOID)
8158 {
8159   return 0;
8160 }
8161 
8162 #define YieldProcessor() __asm__ __volatile__("nop");
8163 
8164 #define KeLowerIrql(a) KfLowerIrql(a)
8165 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8166 
8167 NTKERNELAPI
8168 VOID
8169 NTAPI
8170 KfLowerIrql(
8171   IN KIRQL NewIrql);
8172 
8173 NTKERNELAPI
8174 KIRQL
8175 NTAPI
8176 KfRaiseIrql(
8177   IN KIRQL NewIrql);
8178 
8179 NTKERNELAPI
8180 KIRQL
8181 NTAPI
8182 KeRaiseIrqlToDpcLevel(VOID);
8183 
8184 NTKERNELAPI
8185 KIRQL
8186 NTAPI
8187 KeRaiseIrqlToSynchLevel(VOID);
8188 
8189 
8190 #elif defined(_M_ARM)
8191 #include <armddk.h>
8192 #else
8193 #error Unknown Architecture
8194 #endif
8195 
8196 
8197 /******************************************************************************
8198  *                         Runtime Library Functions                          *
8199  ******************************************************************************/
8200 
8201 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
8202 
8203 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
8204 
8205 FORCEINLINE
8206 VOID
InitializeListHead(OUT PLIST_ENTRY ListHead)8207 InitializeListHead(
8208   OUT PLIST_ENTRY ListHead)
8209 {
8210   ListHead->Flink = ListHead->Blink = ListHead;
8211 }
8212 
8213 FORCEINLINE
8214 BOOLEAN
IsListEmpty(IN CONST LIST_ENTRY * ListHead)8215 IsListEmpty(
8216   IN CONST LIST_ENTRY * ListHead)
8217 {
8218   return (BOOLEAN)(ListHead->Flink == ListHead);
8219 }
8220 
8221 FORCEINLINE
8222 BOOLEAN
RemoveEntryList(IN PLIST_ENTRY Entry)8223 RemoveEntryList(
8224   IN PLIST_ENTRY Entry)
8225 {
8226   PLIST_ENTRY OldFlink;
8227   PLIST_ENTRY OldBlink;
8228 
8229   OldFlink = Entry->Flink;
8230   OldBlink = Entry->Blink;
8231   OldFlink->Blink = OldBlink;
8232   OldBlink->Flink = OldFlink;
8233   return (BOOLEAN)(OldFlink == OldBlink);
8234 }
8235 
8236 FORCEINLINE
8237 PLIST_ENTRY
RemoveHeadList(IN OUT PLIST_ENTRY ListHead)8238 RemoveHeadList(
8239   IN OUT PLIST_ENTRY ListHead)
8240 {
8241   PLIST_ENTRY Flink;
8242   PLIST_ENTRY Entry;
8243 
8244   Entry = ListHead->Flink;
8245   Flink = Entry->Flink;
8246   ListHead->Flink = Flink;
8247   Flink->Blink = ListHead;
8248   return Entry;
8249 }
8250 
8251 FORCEINLINE
8252 PLIST_ENTRY
RemoveTailList(IN OUT PLIST_ENTRY ListHead)8253 RemoveTailList(
8254   IN OUT PLIST_ENTRY ListHead)
8255 {
8256   PLIST_ENTRY Blink;
8257   PLIST_ENTRY Entry;
8258 
8259   Entry = ListHead->Blink;
8260   Blink = Entry->Blink;
8261   ListHead->Blink = Blink;
8262   Blink->Flink = ListHead;
8263   return Entry;
8264 }
8265 
8266 FORCEINLINE
8267 VOID
InsertTailList(IN OUT PLIST_ENTRY ListHead,IN OUT PLIST_ENTRY Entry)8268 InsertTailList(
8269   IN OUT PLIST_ENTRY ListHead,
8270   IN OUT PLIST_ENTRY Entry)
8271 {
8272   PLIST_ENTRY OldBlink;
8273   OldBlink = ListHead->Blink;
8274   Entry->Flink = ListHead;
8275   Entry->Blink = OldBlink;
8276   OldBlink->Flink = Entry;
8277   ListHead->Blink = Entry;
8278 }
8279 
8280 FORCEINLINE
8281 VOID
InsertHeadList(IN OUT PLIST_ENTRY ListHead,IN OUT PLIST_ENTRY Entry)8282 InsertHeadList(
8283   IN OUT PLIST_ENTRY ListHead,
8284   IN OUT PLIST_ENTRY Entry)
8285 {
8286   PLIST_ENTRY OldFlink;
8287   OldFlink = ListHead->Flink;
8288   Entry->Flink = OldFlink;
8289   Entry->Blink = ListHead;
8290   OldFlink->Blink = Entry;
8291   ListHead->Flink = Entry;
8292 }
8293 
8294 FORCEINLINE
8295 VOID
AppendTailList(IN OUT PLIST_ENTRY ListHead,IN OUT PLIST_ENTRY ListToAppend)8296 AppendTailList(
8297   IN OUT PLIST_ENTRY ListHead,
8298   IN OUT PLIST_ENTRY ListToAppend)
8299 {
8300   PLIST_ENTRY ListEnd = ListHead->Blink;
8301 
8302   ListHead->Blink->Flink = ListToAppend;
8303   ListHead->Blink = ListToAppend->Blink;
8304   ListToAppend->Blink->Flink = ListHead;
8305   ListToAppend->Blink = ListEnd;
8306 }
8307 
8308 FORCEINLINE
8309 PSINGLE_LIST_ENTRY
PopEntryList(IN OUT PSINGLE_LIST_ENTRY ListHead)8310 PopEntryList(
8311   IN OUT PSINGLE_LIST_ENTRY ListHead)
8312 {
8313   PSINGLE_LIST_ENTRY FirstEntry;
8314   FirstEntry = ListHead->Next;
8315   if (FirstEntry != NULL) {
8316     ListHead->Next = FirstEntry->Next;
8317   }
8318   return FirstEntry;
8319 }
8320 
8321 FORCEINLINE
8322 VOID
PushEntryList(IN OUT PSINGLE_LIST_ENTRY ListHead,IN OUT PSINGLE_LIST_ENTRY Entry)8323 PushEntryList(
8324   IN OUT PSINGLE_LIST_ENTRY ListHead,
8325   IN OUT PSINGLE_LIST_ENTRY Entry)
8326 {
8327   Entry->Next = ListHead->Next;
8328   ListHead->Next = Entry;
8329 }
8330 
8331 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
8332 
8333 NTSYSAPI
8334 VOID
8335 NTAPI
8336 RtlAssert(
8337   IN PVOID FailedAssertion,
8338   IN PVOID FileName,
8339   IN ULONG LineNumber,
8340   IN PSTR Message);
8341 
8342 /* VOID
8343  * RtlCopyMemory(
8344  *     IN VOID UNALIGNED *Destination,
8345  *     IN CONST VOID UNALIGNED *Source,
8346  *     IN SIZE_T Length)
8347  */
8348 #define RtlCopyMemory(Destination, Source, Length) \
8349     memcpy(Destination, Source, Length)
8350 
8351 #define RtlCopyBytes RtlCopyMemory
8352 
8353 #if defined(_M_AMD64)
8354 NTSYSAPI
8355 VOID
8356 NTAPI
8357 RtlCopyMemoryNonTemporal(
8358   VOID UNALIGNED *Destination,
8359   CONST VOID UNALIGNED *Source,
8360   SIZE_T Length);
8361 #else
8362 #define RtlCopyMemoryNonTemporal RtlCopyMemory
8363 #endif
8364 
8365 /* BOOLEAN
8366  * RtlEqualLuid(
8367  *     IN PLUID Luid1,
8368  *     IN PLUID Luid2)
8369  */
8370 #define RtlEqualLuid(Luid1, Luid2) \
8371     (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
8372 
8373 /* ULONG
8374  * RtlEqualMemory(
8375  *     IN VOID UNALIGNED *Destination,
8376  *     IN CONST VOID UNALIGNED *Source,
8377  *     IN SIZE_T Length)
8378  */
8379 #define RtlEqualMemory(Destination, Source, Length) \
8380     (!memcmp(Destination, Source, Length))
8381 
8382 /* VOID
8383  * RtlFillMemory(
8384  *     IN VOID UNALIGNED *Destination,
8385  *     IN SIZE_T Length,
8386  *     IN UCHAR Fill)
8387  */
8388 #define RtlFillMemory(Destination, Length, Fill) \
8389     memset(Destination, Fill, Length)
8390 
8391 #define RtlFillBytes RtlFillMemory
8392 
8393 NTSYSAPI
8394 VOID
8395 NTAPI
8396 RtlFreeUnicodeString(
8397   IN OUT PUNICODE_STRING UnicodeString);
8398 
8399 NTSYSAPI
8400 NTSTATUS
8401 NTAPI
8402 RtlGUIDFromString(
8403   IN PUNICODE_STRING GuidString,
8404   OUT GUID *Guid);
8405 
8406 NTSYSAPI
8407 VOID
8408 NTAPI
8409 RtlInitUnicodeString(
8410   IN OUT PUNICODE_STRING DestinationString,
8411   IN PCWSTR SourceString OPTIONAL);
8412 
8413 /* VOID
8414  * RtlMoveMemory(
8415  *    IN VOID UNALIGNED *Destination,
8416  *    IN CONST VOID UNALIGNED *Source,
8417  *    IN SIZE_T Length)
8418  */
8419 #define RtlMoveMemory(Destination, Source, Length) \
8420     memmove(Destination, Source, Length)
8421 
8422 NTSYSAPI
8423 NTSTATUS
8424 NTAPI
8425 RtlStringFromGUID(
8426   IN REFGUID Guid,
8427   OUT PUNICODE_STRING GuidString);
8428 
8429 /* VOID
8430  * RtlZeroMemory(
8431  *     IN VOID UNALIGNED *Destination,
8432  *     IN SIZE_T Length)
8433  */
8434 #define RtlZeroMemory(Destination, Length) \
8435     memset(Destination, 0, Length)
8436 
8437 #define RtlZeroBytes RtlZeroMemory
8438 
8439 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8440 
8441 NTSYSAPI
8442 BOOLEAN
8443 NTAPI
8444 RtlAreBitsClear(
8445   IN PRTL_BITMAP BitMapHeader,
8446   IN ULONG StartingIndex,
8447   IN ULONG Length);
8448 
8449 NTSYSAPI
8450 BOOLEAN
8451 NTAPI
8452 RtlAreBitsSet(
8453   IN PRTL_BITMAP BitMapHeader,
8454   IN ULONG StartingIndex,
8455   IN ULONG Length);
8456 
8457 NTSYSAPI
8458 NTSTATUS
8459 NTAPI
8460 RtlAnsiStringToUnicodeString(
8461   IN OUT PUNICODE_STRING DestinationString,
8462   IN PANSI_STRING SourceString,
8463   IN BOOLEAN AllocateDestinationString);
8464 
8465 NTSYSAPI
8466 ULONG
8467 NTAPI
8468 RtlxAnsiStringToUnicodeSize(
8469   IN PCANSI_STRING AnsiString);
8470 
8471 #define RtlAnsiStringToUnicodeSize(String) (               \
8472   NLS_MB_CODE_PAGE_TAG ?                                   \
8473   RtlxAnsiStringToUnicodeSize(String) :                    \
8474   ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
8475 )
8476 
8477 NTSYSAPI
8478 NTSTATUS
8479 NTAPI
8480 RtlAppendUnicodeStringToString(
8481   IN OUT PUNICODE_STRING Destination,
8482   IN PCUNICODE_STRING Source);
8483 
8484 NTSYSAPI
8485 NTSTATUS
8486 NTAPI
8487 RtlAppendUnicodeToString(
8488   IN OUT PUNICODE_STRING Destination,
8489   IN PCWSTR Source);
8490 
8491 NTSYSAPI
8492 NTSTATUS
8493 NTAPI
8494 RtlCheckRegistryKey(
8495   IN ULONG RelativeTo,
8496   IN PWSTR Path);
8497 
8498 NTSYSAPI
8499 VOID
8500 NTAPI
8501 RtlClearAllBits(
8502   IN PRTL_BITMAP BitMapHeader);
8503 
8504 NTSYSAPI
8505 VOID
8506 NTAPI
8507 RtlClearBits(
8508   IN PRTL_BITMAP BitMapHeader,
8509   IN ULONG StartingIndex,
8510   IN ULONG NumberToClear);
8511 
8512 NTSYSAPI
8513 SIZE_T
8514 NTAPI
8515 RtlCompareMemory(
8516   IN CONST VOID *Source1,
8517   IN CONST VOID *Source2,
8518   IN SIZE_T Length);
8519 
8520 NTSYSAPI
8521 LONG
8522 NTAPI
8523 RtlCompareUnicodeString(
8524   IN PCUNICODE_STRING String1,
8525   IN PCUNICODE_STRING String2,
8526   IN BOOLEAN CaseInSensitive);
8527 
8528 NTSYSAPI
8529 LONG
8530 NTAPI
8531 RtlCompareUnicodeStrings(
8532   IN PCWCH String1,
8533   IN SIZE_T String1Length,
8534   IN PCWCH String2,
8535   IN SIZE_T String2Length,
8536   IN BOOLEAN CaseInSensitive);
8537 
8538 NTSYSAPI
8539 VOID
8540 NTAPI
8541 RtlCopyUnicodeString(
8542   IN OUT PUNICODE_STRING DestinationString,
8543   IN PCUNICODE_STRING SourceString OPTIONAL);
8544 
8545 NTSYSAPI
8546 NTSTATUS
8547 NTAPI
8548 RtlCreateRegistryKey(
8549   IN ULONG RelativeTo,
8550   IN PWSTR Path);
8551 
8552 NTSYSAPI
8553 NTSTATUS
8554 NTAPI
8555 RtlCreateSecurityDescriptor(
8556   IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
8557   IN ULONG Revision);
8558 
8559 NTSYSAPI
8560 NTSTATUS
8561 NTAPI
8562 RtlDeleteRegistryValue(
8563   IN ULONG RelativeTo,
8564   IN PCWSTR Path,
8565   IN PCWSTR ValueName);
8566 
8567 NTSYSAPI
8568 BOOLEAN
8569 NTAPI
8570 RtlEqualUnicodeString(
8571   IN CONST UNICODE_STRING *String1,
8572   IN CONST UNICODE_STRING *String2,
8573   IN BOOLEAN CaseInSensitive);
8574 
8575 #if !defined(_AMD64_) && !defined(_IA64_)
8576 NTSYSAPI
8577 LARGE_INTEGER
8578 NTAPI
8579 RtlExtendedIntegerMultiply(
8580   IN LARGE_INTEGER Multiplicand,
8581   IN LONG Multiplier);
8582 
8583 NTSYSAPI
8584 LARGE_INTEGER
8585 NTAPI
8586 RtlExtendedLargeIntegerDivide(
8587   IN LARGE_INTEGER Dividend,
8588   IN ULONG Divisor,
8589   OUT PULONG Remainder OPTIONAL);
8590 #endif
8591 
8592 #if defined(_X86_) || defined(_IA64_)
8593 NTSYSAPI
8594 LARGE_INTEGER
8595 NTAPI
8596 RtlExtendedMagicDivide(
8597     IN LARGE_INTEGER Dividend,
8598     IN LARGE_INTEGER MagicDivisor,
8599     IN CCHAR  ShiftCount);
8600 #endif
8601 
8602 NTSYSAPI
8603 VOID
8604 NTAPI
8605 RtlFreeAnsiString(
8606   IN PANSI_STRING AnsiString);
8607 
8608 NTSYSAPI
8609 ULONG
8610 NTAPI
8611 RtlFindClearBits(
8612   IN PRTL_BITMAP BitMapHeader,
8613   IN ULONG NumberToFind,
8614   IN ULONG HintIndex);
8615 
8616 NTSYSAPI
8617 ULONG
8618 NTAPI
8619 RtlFindClearBitsAndSet(
8620   IN PRTL_BITMAP BitMapHeader,
8621   IN ULONG NumberToFind,
8622   IN ULONG HintIndex);
8623 
8624 NTSYSAPI
8625 ULONG
8626 NTAPI
8627 RtlFindFirstRunClear(
8628   IN PRTL_BITMAP BitMapHeader,
8629   OUT PULONG StartingIndex);
8630 
8631 NTSYSAPI
8632 ULONG
8633 NTAPI
8634 RtlFindClearRuns(
8635   IN PRTL_BITMAP BitMapHeader,
8636   OUT PRTL_BITMAP_RUN RunArray,
8637   IN ULONG SizeOfRunArray,
8638   IN BOOLEAN LocateLongestRuns);
8639 
8640 NTSYSAPI
8641 ULONG
8642 NTAPI
8643 RtlFindLastBackwardRunClear(
8644   IN PRTL_BITMAP BitMapHeader,
8645   IN ULONG FromIndex,
8646   OUT PULONG StartingRunIndex);
8647 
8648 NTSYSAPI
8649 CCHAR
8650 NTAPI
8651 RtlFindLeastSignificantBit(
8652   IN ULONGLONG Set);
8653 
8654 NTSYSAPI
8655 ULONG
8656 NTAPI
8657 RtlFindLongestRunClear(
8658   IN PRTL_BITMAP BitMapHeader,
8659   OUT PULONG StartingIndex);
8660 
8661 NTSYSAPI
8662 CCHAR
8663 NTAPI
8664 RtlFindMostSignificantBit(
8665   IN ULONGLONG Set);
8666 
8667 NTSYSAPI
8668 ULONG
8669 NTAPI
8670 RtlFindNextForwardRunClear(
8671   IN PRTL_BITMAP BitMapHeader,
8672   IN ULONG FromIndex,
8673   OUT PULONG StartingRunIndex);
8674 
8675 NTSYSAPI
8676 ULONG
8677 NTAPI
8678 RtlFindSetBits(
8679   IN PRTL_BITMAP BitMapHeader,
8680   IN ULONG NumberToFind,
8681   IN ULONG HintIndex);
8682 
8683 NTSYSAPI
8684 ULONG
8685 NTAPI
8686 RtlFindSetBitsAndClear(
8687   IN PRTL_BITMAP BitMapHeader,
8688   IN ULONG NumberToFind,
8689   IN ULONG HintIndex);
8690 
8691 NTSYSAPI
8692 VOID
8693 NTAPI
8694 RtlInitAnsiString(
8695   IN OUT PANSI_STRING DestinationString,
8696   IN PCSZ SourceString);
8697 
8698 NTSYSAPI
8699 VOID
8700 NTAPI
8701 RtlInitializeBitMap(
8702   IN PRTL_BITMAP BitMapHeader,
8703   IN PULONG BitMapBuffer,
8704   IN ULONG SizeOfBitMap);
8705 
8706 NTSYSAPI
8707 VOID
8708 NTAPI
8709 RtlInitString(
8710   IN OUT PSTRING DestinationString,
8711   IN PCSZ SourceString);
8712 
8713 NTSYSAPI
8714 NTSTATUS
8715 NTAPI
8716 RtlIntegerToUnicodeString(
8717   IN ULONG Value,
8718   IN ULONG Base OPTIONAL,
8719   IN OUT PUNICODE_STRING String);
8720 
8721 NTSYSAPI
8722 NTSTATUS
8723 NTAPI
8724 RtlInt64ToUnicodeString(
8725   IN ULONGLONG Value,
8726   IN ULONG Base OPTIONAL,
8727   IN OUT PUNICODE_STRING String);
8728 
8729 #ifdef _WIN64
8730 #define RtlIntPtrToUnicodeString(Value, Base, String) \
8731     RtlInt64ToUnicodeString(Value, Base, String)
8732 #else
8733 #define RtlIntPtrToUnicodeString(Value, Base, String) \
8734     RtlIntegerToUnicodeString(Value, Base, String)
8735 #endif
8736 
8737 /* BOOLEAN
8738  * RtlIsZeroLuid(
8739  *     IN PLUID L1);
8740  */
8741 #define RtlIsZeroLuid(_L1) \
8742     ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
8743 
8744 NTSYSAPI
8745 ULONG
8746 NTAPI
8747 RtlLengthSecurityDescriptor(
8748   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8749 
8750 NTSYSAPI
8751 ULONG
8752 NTAPI
8753 RtlNumberOfClearBits(
8754   IN PRTL_BITMAP BitMapHeader);
8755 
8756 NTSYSAPI
8757 ULONG
8758 NTAPI
8759 RtlNumberOfSetBits(
8760   IN PRTL_BITMAP BitMapHeader);
8761 
8762 NTSYSAPI
8763 NTSTATUS
8764 NTAPI
8765 RtlQueryRegistryValues(
8766   IN ULONG RelativeTo,
8767   IN PCWSTR Path,
8768   IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable,
8769   IN PVOID Context OPTIONAL,
8770   IN PVOID Environment OPTIONAL);
8771 
8772 #define SHORT_SIZE  (sizeof(USHORT))
8773 #define SHORT_MASK  (SHORT_SIZE - 1)
8774 #define LONG_SIZE (sizeof(LONG))
8775 #define LONGLONG_SIZE   (sizeof(LONGLONG))
8776 #define LONG_MASK (LONG_SIZE - 1)
8777 #define LONGLONG_MASK   (LONGLONG_SIZE - 1)
8778 #define LOWBYTE_MASK 0x00FF
8779 
8780 #define FIRSTBYTE(VALUE)  ((VALUE) & LOWBYTE_MASK)
8781 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
8782 #define THIRDBYTE(VALUE)  (((VALUE) >> 16) & LOWBYTE_MASK)
8783 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
8784 
8785 NTSYSAPI
8786 VOID
8787 NTAPI
8788 RtlSetAllBits(
8789   IN PRTL_BITMAP BitMapHeader);
8790 
8791 NTSYSAPI
8792 VOID
8793 NTAPI
8794 RtlSetBits(
8795   IN PRTL_BITMAP BitMapHeader,
8796   IN ULONG StartingIndex,
8797   IN ULONG NumberToSet);
8798 
8799 NTSYSAPI
8800 NTSTATUS
8801 NTAPI
8802 RtlSetDaclSecurityDescriptor(
8803   IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
8804   IN BOOLEAN DaclPresent,
8805   IN PACL Dacl OPTIONAL,
8806   IN BOOLEAN DaclDefaulted OPTIONAL);
8807 
8808 #if defined(_AMD64_)
8809 
8810 /* VOID
8811  * RtlStoreUlong(
8812  *     IN PULONG Address,
8813  *     IN ULONG Value);
8814  */
8815 #define RtlStoreUlong(Address,Value) \
8816     *(ULONG UNALIGNED *)(Address) = (Value)
8817 
8818 /* VOID
8819  * RtlStoreUlonglong(
8820  *     IN OUT PULONGLONG Address,
8821  *     ULONGLONG Value);
8822  */
8823 #define RtlStoreUlonglong(Address,Value) \
8824     *(ULONGLONG UNALIGNED *)(Address) = (Value)
8825 
8826 /* VOID
8827  * RtlStoreUshort(
8828  *     IN PUSHORT Address,
8829  *     IN USHORT Value);
8830  */
8831 #define RtlStoreUshort(Address,Value) \
8832     *(USHORT UNALIGNED *)(Address) = (Value)
8833 
8834 /* VOID
8835  * RtlRetrieveUshort(
8836  *     PUSHORT DestinationAddress,
8837  *    PUSHORT SourceAddress);
8838  */
8839 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
8840     *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
8841 
8842 /* VOID
8843  * RtlRetrieveUlong(
8844  *    PULONG DestinationAddress,
8845  *    PULONG SourceAddress);
8846  */
8847 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
8848     *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
8849 
8850 #else
8851 
8852 #define RtlStoreUlong(Address,Value)                      \
8853     if ((ULONG_PTR)(Address) & LONG_MASK) { \
8854         ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT]    = (UCHAR)(FIRSTBYTE(Value)); \
8855         ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
8856         ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
8857         ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT]     = (UCHAR)(FOURTHBYTE(Value)); \
8858     } \
8859     else { \
8860         *((PULONG)(Address)) = (ULONG) (Value); \
8861     }
8862 
8863 #define RtlStoreUlonglong(Address,Value) \
8864     if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
8865         RtlStoreUlong((ULONG_PTR)(Address), \
8866                       (ULONGLONG)(Value) & 0xFFFFFFFF); \
8867         RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
8868                       (ULONGLONG)(Value) >> 32); \
8869     } else { \
8870         *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
8871     }
8872 
8873 #define RtlStoreUshort(Address,Value) \
8874     if ((ULONG_PTR)(Address) & SHORT_MASK) { \
8875         ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
8876         ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
8877     } \
8878     else { \
8879         *((PUSHORT) (Address)) = (USHORT)Value; \
8880     }
8881 
8882 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
8883     if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
8884     { \
8885         ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
8886         ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
8887     } \
8888     else \
8889     { \
8890         *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
8891     }
8892 
8893 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
8894     if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
8895     { \
8896         ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
8897         ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
8898         ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
8899         ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
8900     } \
8901     else \
8902     { \
8903         *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
8904     }
8905 
8906 #endif /* defined(_AMD64_) */
8907 
8908 #ifdef _WIN64
8909 /* VOID
8910  * RtlStoreUlongPtr(
8911  *     IN OUT PULONG_PTR Address,
8912  *     IN ULONG_PTR Value);
8913  */
8914 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
8915 #else
8916 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
8917 #endif /* _WIN64 */
8918 
8919 NTSYSAPI
8920 BOOLEAN
8921 NTAPI
8922 RtlTimeFieldsToTime(
8923   IN PTIME_FIELDS TimeFields,
8924   IN PLARGE_INTEGER Time);
8925 
8926 NTSYSAPI
8927 VOID
8928 NTAPI
8929 RtlTimeToTimeFields(
8930   IN PLARGE_INTEGER Time,
8931   IN PTIME_FIELDS TimeFields);
8932 
8933 NTSYSAPI
8934 ULONG
8935 FASTCALL
8936 RtlUlongByteSwap(
8937   IN ULONG Source);
8938 
8939 NTSYSAPI
8940 ULONGLONG
8941 FASTCALL
8942 RtlUlonglongByteSwap(
8943   IN ULONGLONG Source);
8944 
8945 NTSYSAPI
8946 NTSTATUS
8947 NTAPI
8948 RtlUnicodeStringToAnsiString(
8949   IN OUT PANSI_STRING DestinationString,
8950   IN PCUNICODE_STRING SourceString,
8951   IN BOOLEAN AllocateDestinationString);
8952 
8953 NTSYSAPI
8954 ULONG
8955 NTAPI
8956 RtlxUnicodeStringToAnsiSize(
8957   IN PCUNICODE_STRING UnicodeString);
8958 
8959 #define RtlUnicodeStringToAnsiSize(String) (                  \
8960     NLS_MB_CODE_PAGE_TAG ?                                    \
8961     RtlxUnicodeStringToAnsiSize(String) :                     \
8962     ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
8963 )
8964 
8965 NTSYSAPI
8966 NTSTATUS
8967 NTAPI
8968 RtlUnicodeStringToInteger(
8969   IN PCUNICODE_STRING String,
8970   IN ULONG Base OPTIONAL,
8971   OUT PULONG Value);
8972 
8973 NTSYSAPI
8974 WCHAR
8975 NTAPI
8976 RtlUpcaseUnicodeChar(
8977   IN WCHAR SourceCharacter);
8978 
8979 NTSYSAPI
8980 USHORT
8981 FASTCALL
8982 RtlUshortByteSwap(
8983   IN USHORT Source);
8984 
8985 NTSYSAPI
8986 BOOLEAN
8987 NTAPI
8988 RtlValidRelativeSecurityDescriptor(
8989   IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
8990   IN ULONG SecurityDescriptorLength,
8991   IN SECURITY_INFORMATION RequiredInformation);
8992 
8993 NTSYSAPI
8994 BOOLEAN
8995 NTAPI
8996 RtlValidSecurityDescriptor(
8997   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
8998 
8999 NTSYSAPI
9000 NTSTATUS
9001 NTAPI
9002 RtlWriteRegistryValue(
9003   IN ULONG RelativeTo,
9004   IN PCWSTR Path,
9005   IN PCWSTR ValueName,
9006   IN ULONG ValueType,
9007   IN PVOID ValueData,
9008   IN ULONG ValueLength);
9009 
9010 
9011 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
9012 
9013 
9014 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
9015 NTSYSAPI
9016 VOID
9017 FASTCALL
9018 RtlPrefetchMemoryNonTemporal(
9019   IN PVOID Source,
9020   IN SIZE_T Length);
9021 #endif
9022 
9023 
9024 #if (NTDDI_VERSION >= NTDDI_WINXP)
9025 
9026 
9027 NTSYSAPI
9028 VOID
9029 NTAPI
9030 RtlClearBit(
9031   PRTL_BITMAP BitMapHeader,
9032   ULONG BitNumber);
9033 
9034 NTSYSAPI
9035 WCHAR
9036 NTAPI
9037 RtlDowncaseUnicodeChar(
9038   IN WCHAR SourceCharacter);
9039 
9040 NTSYSAPI
9041 VOID
9042 NTAPI
9043 RtlSetBit(
9044   PRTL_BITMAP BitMapHeader,
9045   ULONG BitNumber);
9046 
9047 NTSYSAPI
9048 BOOLEAN
9049 NTAPI
9050 RtlTestBit(
9051   IN PRTL_BITMAP BitMapHeader,
9052   IN ULONG BitNumber);
9053 
9054 NTSYSAPI
9055 NTSTATUS
9056 NTAPI
9057 RtlHashUnicodeString(
9058   IN CONST UNICODE_STRING *String,
9059   IN BOOLEAN CaseInSensitive,
9060   IN ULONG HashAlgorithm,
9061   OUT PULONG HashValue);
9062 
9063 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
9064 
9065 
9066 #if (NTDDI_VERSION >= NTDDI_VISTA)
9067 
9068 NTSYSAPI
9069 ULONG
9070 NTAPI
9071 RtlNumberOfSetBitsUlongPtr(
9072   IN ULONG_PTR Target);
9073 
9074 NTSYSAPI
9075 ULONGLONG
9076 NTAPI
9077 RtlIoDecodeMemIoResource(
9078   IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
9079   OUT PULONGLONG Alignment OPTIONAL,
9080   OUT PULONGLONG MinimumAddress OPTIONAL,
9081   OUT PULONGLONG MaximumAddress OPTIONAL);
9082 
9083 NTSYSAPI
9084 NTSTATUS
9085 NTAPI
9086 RtlIoEncodeMemIoResource(
9087   IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
9088   IN UCHAR Type,
9089   IN ULONGLONG Length,
9090   IN ULONGLONG Alignment,
9091   IN ULONGLONG MinimumAddress,
9092   IN ULONGLONG MaximumAddress);
9093 
9094 NTSYSAPI
9095 ULONGLONG
9096 NTAPI
9097 RtlCmDecodeMemIoResource(
9098   IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
9099   OUT PULONGLONG Start OPTIONAL);
9100 
9101 NTSYSAPI
9102 NTSTATUS
9103 NTAPI
9104 RtlFindClosestEncodableLength(
9105   IN ULONGLONG SourceLength,
9106   OUT PULONGLONG TargetLength);
9107 
9108 NTSYSAPI
9109 NTSTATUS
9110 NTAPI
9111 RtlCmEncodeMemIoResource(
9112   IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
9113   IN UCHAR Type,
9114   IN ULONGLONG Length,
9115   IN ULONGLONG Start);
9116 
9117 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
9118 
9119 #if (NTDDI_VERSION >= NTDDI_WIN7)
9120 
9121 NTSYSAPI
9122 NTSTATUS
9123 NTAPI
9124 RtlUnicodeToUTF8N(
9125   OUT PCHAR UTF8StringDestination,
9126   IN ULONG UTF8StringMaxByteCount,
9127   OUT PULONG UTF8StringActualByteCount,
9128   IN PCWCH UnicodeStringSource,
9129   IN ULONG UnicodeStringByteCount);
9130 
9131 NTSYSAPI
9132 NTSTATUS
9133 NTAPI
9134 RtlUTF8ToUnicodeN(
9135   OUT PWSTR UnicodeStringDestination,
9136   IN ULONG UnicodeStringMaxByteCount,
9137   OUT PULONG UnicodeStringActualByteCount,
9138   IN PCCH UTF8StringSource,
9139   IN ULONG UTF8StringByteCount);
9140 
9141 NTSYSAPI
9142 ULONG64
9143 NTAPI
9144 RtlGetEnabledExtendedFeatures(
9145   IN ULONG64 FeatureMask);
9146 
9147 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
9148 
9149 
9150 #if !defined(MIDL_PASS)
9151 /* inline funftions */
9152 //DECLSPEC_DEPRECATED_DDK_WINXP
9153 static __inline
9154 LARGE_INTEGER
9155 NTAPI_INLINE
RtlConvertLongToLargeInteger(IN LONG SignedInteger)9156 RtlConvertLongToLargeInteger(
9157   IN LONG SignedInteger)
9158 {
9159   LARGE_INTEGER ret;
9160   ret.QuadPart = SignedInteger;
9161   return ret;
9162 }
9163 
9164 //DECLSPEC_DEPRECATED_DDK_WINXP
9165 static __inline
9166 LARGE_INTEGER
9167 NTAPI_INLINE
RtlConvertUlongToLargeInteger(IN ULONG UnsignedInteger)9168 RtlConvertUlongToLargeInteger(
9169   IN ULONG UnsignedInteger)
9170 {
9171   LARGE_INTEGER ret;
9172   ret.QuadPart = UnsignedInteger;
9173   return ret;
9174 }
9175 
9176 //DECLSPEC_DEPRECATED_DDK_WINXP
9177 static __inline
9178 LARGE_INTEGER
9179 NTAPI_INLINE
RtlLargeIntegerShiftLeft(IN LARGE_INTEGER LargeInteger,IN CCHAR ShiftCount)9180 RtlLargeIntegerShiftLeft(
9181   IN LARGE_INTEGER LargeInteger,
9182   IN CCHAR ShiftCount)
9183 {
9184   LARGE_INTEGER Result;
9185 
9186   Result.QuadPart = LargeInteger.QuadPart << ShiftCount;
9187   return Result;
9188 }
9189 
9190 //DECLSPEC_DEPRECATED_DDK_WINXP
9191 static __inline
9192 LARGE_INTEGER
9193 NTAPI_INLINE
RtlLargeIntegerShiftRight(IN LARGE_INTEGER LargeInteger,IN CCHAR ShiftCount)9194 RtlLargeIntegerShiftRight(
9195   IN LARGE_INTEGER LargeInteger,
9196   IN CCHAR ShiftCount)
9197 {
9198   LARGE_INTEGER Result;
9199 
9200   Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount;
9201   return Result;
9202 }
9203 
9204 //DECLSPEC_DEPRECATED_DDK
9205 static __inline
9206 ULONG
9207 NTAPI_INLINE
RtlEnlargedUnsignedDivide(IN ULARGE_INTEGER Dividend,IN ULONG Divisor,IN OUT PULONG Remainder)9208 RtlEnlargedUnsignedDivide(
9209   IN ULARGE_INTEGER Dividend,
9210   IN ULONG Divisor,
9211   IN OUT PULONG Remainder)
9212 {
9213   if (Remainder)
9214     *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
9215   return (ULONG)(Dividend.QuadPart / Divisor);
9216 }
9217 
9218 //DECLSPEC_DEPRECATED_DDK
9219 static __inline
9220 LARGE_INTEGER
9221 NTAPI_INLINE
RtlLargeIntegerNegate(IN LARGE_INTEGER Subtrahend)9222 RtlLargeIntegerNegate(
9223   IN LARGE_INTEGER Subtrahend)
9224 {
9225   LARGE_INTEGER Difference;
9226 
9227   Difference.QuadPart = -Subtrahend.QuadPart;
9228   return Difference;
9229 }
9230 
9231 //DECLSPEC_DEPRECATED_DDK
9232 static __inline
9233 LARGE_INTEGER
9234 NTAPI_INLINE
RtlLargeIntegerSubtract(IN LARGE_INTEGER Minuend,IN LARGE_INTEGER Subtrahend)9235 RtlLargeIntegerSubtract(
9236   IN LARGE_INTEGER Minuend,
9237   IN LARGE_INTEGER Subtrahend)
9238 {
9239   LARGE_INTEGER Difference;
9240 
9241   Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
9242   return Difference;
9243 }
9244 
9245 //DECLSPEC_DEPRECATED_DDK
9246 static __inline
9247 LARGE_INTEGER
9248 NTAPI_INLINE
RtlEnlargedUnsignedMultiply(IN ULONG Multiplicand,IN ULONG Multiplier)9249 RtlEnlargedUnsignedMultiply(
9250   IN ULONG Multiplicand,
9251   IN ULONG Multiplier)
9252 {
9253   LARGE_INTEGER ret;
9254   ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
9255   return ret;
9256 }
9257 
9258 //DECLSPEC_DEPRECATED_DDK
9259 static __inline
9260 LARGE_INTEGER
9261 NTAPI_INLINE
RtlEnlargedIntegerMultiply(IN LONG Multiplicand,IN LONG Multiplier)9262 RtlEnlargedIntegerMultiply(
9263   IN LONG Multiplicand,
9264   IN LONG Multiplier)
9265 {
9266   LARGE_INTEGER ret;
9267   ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
9268   return ret;
9269 }
9270 
9271 FORCEINLINE
9272 VOID
RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,IN PCHAR Buffer,IN USHORT BufferSize)9273 RtlInitEmptyAnsiString(
9274   OUT PANSI_STRING AnsiString,
9275   IN PCHAR Buffer,
9276   IN USHORT BufferSize)
9277 {
9278   AnsiString->Length = 0;
9279   AnsiString->MaximumLength = BufferSize;
9280   AnsiString->Buffer = Buffer;
9281 }
9282 
9283 FORCEINLINE
9284 VOID
RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString,IN PWSTR Buffer,IN USHORT BufferSize)9285 RtlInitEmptyUnicodeString(
9286   OUT PUNICODE_STRING UnicodeString,
9287   IN PWSTR Buffer,
9288   IN USHORT BufferSize)
9289 {
9290   UnicodeString->Length = 0;
9291   UnicodeString->MaximumLength = BufferSize;
9292   UnicodeString->Buffer = Buffer;
9293 }
9294 
9295 #if defined(_AMD64_) || defined(_IA64_)
9296 
9297 static __inline
9298 LARGE_INTEGER
9299 NTAPI_INLINE
RtlExtendedIntegerMultiply(IN LARGE_INTEGER Multiplicand,IN LONG Multiplier)9300 RtlExtendedIntegerMultiply(
9301   IN LARGE_INTEGER Multiplicand,
9302   IN LONG Multiplier)
9303 {
9304   LARGE_INTEGER ret;
9305   ret.QuadPart = Multiplicand.QuadPart * Multiplier;
9306   return ret;
9307 }
9308 
9309 static __inline
9310 LARGE_INTEGER
9311 NTAPI_INLINE
RtlExtendedLargeIntegerDivide(IN LARGE_INTEGER Dividend,IN ULONG Divisor,OUT PULONG Remainder OPTIONAL)9312 RtlExtendedLargeIntegerDivide(
9313   IN LARGE_INTEGER Dividend,
9314   IN ULONG Divisor,
9315   OUT PULONG Remainder OPTIONAL)
9316 {
9317   LARGE_INTEGER ret;
9318   ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
9319   if (Remainder)
9320     *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
9321   return ret;
9322 }
9323 
9324 #endif /* defined(_AMD64_) || defined(_IA64_) */
9325 
9326 
9327 #if defined(_AMD64_)
9328 
9329 #define MultiplyHigh __mulh
9330 #define UnsignedMultiplyHigh __umulh
9331 
9332 //DECLSPEC_DEPRECATED_DDK
9333 static __inline
9334 LARGE_INTEGER
9335 NTAPI_INLINE
RtlExtendedMagicDivide(IN LARGE_INTEGER Dividend,IN LARGE_INTEGER MagicDivisor,IN CCHAR ShiftCount)9336 RtlExtendedMagicDivide(
9337   IN LARGE_INTEGER Dividend,
9338   IN LARGE_INTEGER MagicDivisor,
9339   IN CCHAR ShiftCount)
9340 {
9341   LARGE_INTEGER ret;
9342   ULONG64 ret64;
9343   BOOLEAN Pos;
9344   Pos = (Dividend.QuadPart >= 0);
9345   ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
9346                                MagicDivisor.QuadPart);
9347   ret64 >>= ShiftCount;
9348   ret.QuadPart = Pos ? ret64 : -(LONG64)ret64;
9349   return ret;
9350 }
9351 #endif
9352 
9353 //DECLSPEC_DEPRECATED_DDK
9354 static __inline
9355 LARGE_INTEGER
9356 NTAPI_INLINE
RtlLargeIntegerAdd(IN LARGE_INTEGER Addend1,IN LARGE_INTEGER Addend2)9357 RtlLargeIntegerAdd(
9358   IN LARGE_INTEGER Addend1,
9359   IN LARGE_INTEGER Addend2)
9360 {
9361   LARGE_INTEGER ret;
9362   ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
9363   return ret;
9364 }
9365 
9366 /* VOID
9367  * RtlLargeIntegerAnd(
9368  *     IN OUT LARGE_INTEGER Result,
9369  *     IN LARGE_INTEGER Source,
9370  *     IN LARGE_INTEGER Mask);
9371  */
9372 #define RtlLargeIntegerAnd(Result, Source, Mask) \
9373     Result.QuadPart = Source.QuadPart & Mask.QuadPart
9374 
9375 //DECLSPEC_DEPRECATED_DDK
9376 static __inline
9377 LARGE_INTEGER
9378 NTAPI_INLINE
RtlLargeIntegerArithmeticShift(IN LARGE_INTEGER LargeInteger,IN CCHAR ShiftCount)9379 RtlLargeIntegerArithmeticShift(
9380   IN LARGE_INTEGER LargeInteger,
9381   IN CCHAR ShiftCount)
9382 {
9383   LARGE_INTEGER ret;
9384   ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
9385   return ret;
9386 }
9387 
9388 /* BOOLEAN
9389  * RtlLargeIntegerEqualTo(
9390  *     IN LARGE_INTEGER  Operand1,
9391  *     IN LARGE_INTEGER  Operand2);
9392  */
9393 #define RtlLargeIntegerEqualTo(X,Y) \
9394     (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
9395 
9396 FORCEINLINE
9397 PVOID
RtlSecureZeroMemory(OUT PVOID Pointer,IN SIZE_T Size)9398 RtlSecureZeroMemory(
9399   OUT PVOID Pointer,
9400   IN SIZE_T Size)
9401 {
9402   volatile char* vptr = (volatile char*)Pointer;
9403 #if defined(_M_AMD64)
9404   __stosb((PUCHAR)vptr, 0, Size);
9405 #else
9406   char * endptr = (char *)vptr + Size;
9407   while (vptr < endptr) {
9408     *vptr = 0; vptr++;
9409   }
9410 #endif
9411    return Pointer;
9412 }
9413 
9414 #if defined(_M_AMD64)
9415 FORCEINLINE
9416 BOOLEAN
RtlCheckBit(IN PRTL_BITMAP BitMapHeader,IN ULONG BitPosition)9417 RtlCheckBit(
9418   IN PRTL_BITMAP BitMapHeader,
9419   IN ULONG BitPosition)
9420 {
9421   return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
9422 }
9423 #else
9424 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
9425 #endif /* defined(_M_AMD64) */
9426 
9427 #define RtlLargeIntegerGreaterThan(X,Y) (                              \
9428     (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
9429     ((X).HighPart > (Y).HighPart)                                      \
9430 )
9431 
9432 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) (                      \
9433     (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
9434     ((X).HighPart > (Y).HighPart)                                       \
9435 )
9436 
9437 #define RtlLargeIntegerNotEqualTo(X,Y) (                          \
9438     (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
9439 )
9440 
9441 #define RtlLargeIntegerLessThan(X,Y) (                                 \
9442     (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
9443     ((X).HighPart < (Y).HighPart)                                      \
9444 )
9445 
9446 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) (                         \
9447     (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
9448     ((X).HighPart < (Y).HighPart)                                       \
9449 )
9450 
9451 #define RtlLargeIntegerGreaterThanZero(X) (       \
9452     (((X).HighPart == 0) && ((X).LowPart > 0)) || \
9453     ((X).HighPart > 0 )                           \
9454 )
9455 
9456 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
9457 
9458 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
9459 
9460 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
9461 
9462 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
9463 
9464 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
9465 
9466 #endif /* !defined(MIDL_PASS) */
9467 
9468 /* Byte Swap Functions */
9469 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
9470     ((defined(_M_AMD64) || defined(_M_IA64)) \
9471         && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
9472 
9473 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
9474 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
9475 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
9476 
9477 #endif
9478 
9479 #if DBG
9480 
9481 #define ASSERT(exp) \
9482   (VOID)((!(exp)) ? \
9483     RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
9484 
9485 #define ASSERTMSG(msg, exp) \
9486   (VOID)((!(exp)) ? \
9487     RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
9488 
9489 #define RTL_SOFT_ASSERT(exp) \
9490   (VOID)((!(exp)) ? \
9491     DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
9492 
9493 #define RTL_SOFT_ASSERTMSG(msg, exp) \
9494   (VOID)((!(exp)) ? \
9495     DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n   Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
9496 
9497 #define RTL_VERIFY(exp) ASSERT(exp)
9498 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
9499 
9500 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
9501 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
9502 
9503 #if defined(_MSC_VER)
9504 
9505 #define NT_ASSERT(exp) \
9506    ((!(exp)) ? \
9507       (__annotation(L"Debug", L"AssertFail", L#exp), \
9508        DbgRaiseAssertionFailure(), FALSE) : TRUE)
9509 
9510 #define NT_ASSERTMSG(msg, exp) \
9511    ((!(exp)) ? \
9512       (__annotation(L"Debug", L"AssertFail", L##msg), \
9513       DbgRaiseAssertionFailure(), FALSE) : TRUE)
9514 
9515 #define NT_ASSERTMSGW(msg, exp) \
9516     ((!(exp)) ? \
9517         (__annotation(L"Debug", L"AssertFail", msg), \
9518          DbgRaiseAssertionFailure(), FALSE) : TRUE)
9519 
9520 #define NT_VERIFY     NT_ASSERT
9521 #define NT_VERIFYMSG  NT_ASSERTMSG
9522 #define NT_VERIFYMSGW NT_ASSERTMSGW
9523 
9524 #else
9525 
9526 /* GCC doesn't support __annotation (nor PDB) */
9527 #define NT_ASSERT(exp) \
9528    (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
9529 
9530 #define NT_ASSERTMSG NT_ASSERT
9531 #define NT_ASSERTMSGW NT_ASSERT
9532 
9533 #endif
9534 
9535 #else /* !DBG */
9536 
9537 #define ASSERT(exp) ((VOID) 0)
9538 #define ASSERTMSG(msg, exp) ((VOID) 0)
9539 
9540 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
9541 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
9542 
9543 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
9544 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9545 
9546 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
9547 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9548 
9549 #define NT_ASSERT(exp)          ((VOID)0)
9550 #define NT_ASSERTMSG(msg, exp)  ((VOID)0)
9551 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
9552 
9553 #define NT_VERIFY(_exp)           ((_exp) ? TRUE : FALSE)
9554 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
9555 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
9556 
9557 #endif /* DBG */
9558 
9559 #define InitializeListHead32(ListHead) (\
9560     (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
9561 
9562 #if !defined(_WINBASE_)
9563 
9564 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
9565 
9566 NTKERNELAPI
9567 VOID
9568 InitializeSListHead(
9569   OUT PSLIST_HEADER SListHead);
9570 
9571 #else
9572 
9573 FORCEINLINE
9574 VOID
InitializeSListHead(OUT PSLIST_HEADER SListHead)9575 InitializeSListHead(
9576   OUT PSLIST_HEADER SListHead)
9577 {
9578 #if defined(_IA64_)
9579   ULONG64 FeatureBits;
9580 #endif
9581 
9582 #if defined(_WIN64)
9583   if (((ULONG_PTR)SListHead & 0xf) != 0) {
9584     RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
9585   }
9586 #endif
9587   RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
9588 #if defined(_IA64_)
9589   FeatureBits = __getReg(CV_IA64_CPUID4);
9590   if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
9591     SListHead->Header16.HeaderType = 1;
9592     SListHead->Header16.Init = 1;
9593   }
9594 #endif
9595 }
9596 
9597 #endif
9598 
9599 #if defined(_WIN64)
9600 
9601 #define InterlockedPopEntrySList(Head) \
9602     ExpInterlockedPopEntrySList(Head)
9603 
9604 #define InterlockedPushEntrySList(Head, Entry) \
9605     ExpInterlockedPushEntrySList(Head, Entry)
9606 
9607 #define InterlockedFlushSList(Head) \
9608     ExpInterlockedFlushSList(Head)
9609 
9610 #define QueryDepthSList(Head) \
9611     ExQueryDepthSList(Head)
9612 
9613 #else /* !defined(_WIN64) */
9614 
9615 NTKERNELAPI
9616 PSLIST_ENTRY
9617 FASTCALL
9618 InterlockedPopEntrySList(
9619   IN PSLIST_HEADER ListHead);
9620 
9621 NTKERNELAPI
9622 PSLIST_ENTRY
9623 FASTCALL
9624 InterlockedPushEntrySList(
9625   IN PSLIST_HEADER ListHead,
9626   IN PSLIST_ENTRY ListEntry);
9627 
9628 #define InterlockedFlushSList(ListHead) \
9629     ExInterlockedFlushSList(ListHead)
9630 
9631 #define QueryDepthSList(Head) \
9632     ExQueryDepthSList(Head)
9633 
9634 #endif /* !defined(_WIN64) */
9635 
9636 #endif /* !defined(_WINBASE_) */
9637 
9638 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
9639 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
9640 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk)       \
9641     ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
9642 #define RTL_CONTEXT_OFFSET(Context, Chunk)              \
9643     RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
9644 #define RTL_CONTEXT_LENGTH(Context, Chunk)              \
9645     RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
9646 #define RTL_CONTEXT_CHUNK(Context, Chunk)               \
9647     RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1),    \
9648                          (PCONTEXT_EX)(Context + 1),    \
9649                          Chunk)
9650 
9651 BOOLEAN
9652 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)(
9653   IN ULONG Version);
9654 
9655 BOOLEAN
9656 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
9657   IN ULONG Version);
9658 
9659 #ifndef RtlIsNtDdiVersionAvailable
9660 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
9661 #endif
9662 
9663 #ifndef RtlIsServicePackVersionInstalled
9664 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
9665 #endif
9666 
9667 #define RtlInterlockedSetBits(Flags, Flag) \
9668     InterlockedOr((PLONG)(Flags), Flag)
9669 
9670 #define RtlInterlockedAndBits(Flags, Flag) \
9671     InterlockedAnd((PLONG)(Flags), Flag)
9672 
9673 #define RtlInterlockedClearBits(Flags, Flag) \
9674     RtlInterlockedAndBits(Flags, ~(Flag))
9675 
9676 #define RtlInterlockedXorBits(Flags, Flag) \
9677     InterlockedXor(Flags, Flag)
9678 
9679 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
9680     (VOID) RtlInterlockedSetBits(Flags, Flag)
9681 
9682 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
9683     (VOID) RtlInterlockedAndBits(Flags, Flag)
9684 
9685 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
9686     RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
9687 
9688 
9689 /******************************************************************************
9690  *                              Kernel Functions                              *
9691  ******************************************************************************/
9692 NTKERNELAPI
9693 VOID
9694 NTAPI
9695 KeInitializeEvent(
9696   OUT PRKEVENT Event,
9697   IN EVENT_TYPE Type,
9698   IN BOOLEAN State);
9699 
9700 NTKERNELAPI
9701 VOID
9702 NTAPI
9703 KeClearEvent(
9704   IN OUT PRKEVENT Event);
9705 
9706 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9707 
9708 #if defined(_NTDDK_) || defined(_NTIFS_)
9709 NTKERNELAPI
9710 VOID
9711 NTAPI
9712 ProbeForRead(
9713   IN CONST VOID *Address, /* CONST is added */
9714   IN SIZE_T Length,
9715   IN ULONG Alignment);
9716 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
9717 
9718 NTKERNELAPI
9719 VOID
9720 NTAPI
9721 ProbeForWrite(
9722   IN PVOID Address,
9723   IN SIZE_T Length,
9724   IN ULONG Alignment);
9725 
9726 #if defined(SINGLE_GROUP_LEGACY_API)
9727 
9728 NTKERNELAPI
9729 VOID
9730 NTAPI
9731 KeRevertToUserAffinityThread(VOID);
9732 
9733 NTKERNELAPI
9734 VOID
9735 NTAPI
9736 KeSetSystemAffinityThread(
9737   IN KAFFINITY Affinity);
9738 
9739 NTKERNELAPI
9740 VOID
9741 NTAPI
9742 KeSetTargetProcessorDpc(
9743   IN OUT PRKDPC Dpc,
9744   IN CCHAR Number);
9745 
9746 NTKERNELAPI
9747 KAFFINITY
9748 NTAPI
9749 KeQueryActiveProcessors(VOID);
9750 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
9751 
9752 #if !defined(_M_AMD64)
9753 NTKERNELAPI
9754 ULONGLONG
9755 NTAPI
9756 KeQueryInterruptTime(VOID);
9757 
9758 NTKERNELAPI
9759 VOID
9760 NTAPI
9761 KeQuerySystemTime(
9762   OUT PLARGE_INTEGER CurrentTime);
9763 #endif /* !_M_AMD64 */
9764 
9765 #if !defined(_X86_) && !defined(_M_ARM)
9766 NTKERNELAPI
9767 KIRQL
9768 NTAPI
9769 KeAcquireSpinLockRaiseToDpc(
9770   IN OUT PKSPIN_LOCK SpinLock);
9771 
9772 #define KeAcquireSpinLock(SpinLock, OldIrql) \
9773     *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
9774 
9775 NTKERNELAPI
9776 VOID
9777 NTAPI
9778 KeAcquireSpinLockAtDpcLevel(
9779   IN OUT PKSPIN_LOCK SpinLock);
9780 
9781 NTKERNELAPI
9782 VOID
9783 NTAPI
9784 KeReleaseSpinLock(
9785   IN OUT PKSPIN_LOCK SpinLock,
9786   IN KIRQL NewIrql);
9787 
9788 NTKERNELAPI
9789 VOID
9790 NTAPI
9791 KeReleaseSpinLockFromDpcLevel(
9792   IN OUT PKSPIN_LOCK SpinLock);
9793 #endif /* !_X86_ */
9794 
9795 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
9796 NTKERNELAPI
9797 VOID
9798 NTAPI
9799 KeInitializeSpinLock(
9800   IN PKSPIN_LOCK SpinLock);
9801 #else
9802 FORCEINLINE
9803 VOID
KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)9804 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
9805 {
9806   /* Clear the lock */
9807   *SpinLock = 0;
9808 }
9809 #endif
9810 
9811 NTKERNELAPI
9812 DECLSPEC_NORETURN
9813 VOID
9814 NTAPI
9815 KeBugCheckEx(
9816   IN ULONG BugCheckCode,
9817   IN ULONG_PTR BugCheckParameter1,
9818   IN ULONG_PTR BugCheckParameter2,
9819   IN ULONG_PTR BugCheckParameter3,
9820   IN ULONG_PTR BugCheckParameter4);
9821 
9822 NTKERNELAPI
9823 BOOLEAN
9824 NTAPI
9825 KeCancelTimer(
9826   IN OUT PKTIMER);
9827 
9828 NTKERNELAPI
9829 NTSTATUS
9830 NTAPI
9831 KeDelayExecutionThread(
9832   IN KPROCESSOR_MODE WaitMode,
9833   IN BOOLEAN Alertable,
9834   IN PLARGE_INTEGER Interval);
9835 
9836 NTKERNELAPI
9837 BOOLEAN
9838 NTAPI
9839 KeDeregisterBugCheckCallback(
9840   IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
9841 
9842 NTKERNELAPI
9843 VOID
9844 NTAPI
9845 KeEnterCriticalRegion(VOID);
9846 
9847 NTKERNELAPI
9848 VOID
9849 NTAPI
9850 KeInitializeDeviceQueue(
9851   OUT PKDEVICE_QUEUE DeviceQueue);
9852 
9853 NTKERNELAPI
9854 VOID
9855 NTAPI
9856 KeInitializeDpc(
9857   OUT PRKDPC Dpc,
9858   IN PKDEFERRED_ROUTINE DeferredRoutine,
9859   IN PVOID DeferredContext OPTIONAL);
9860 
9861 NTKERNELAPI
9862 VOID
9863 NTAPI
9864 KeInitializeMutex(
9865   OUT PRKMUTEX Mutex,
9866   IN ULONG Level);
9867 
9868 NTKERNELAPI
9869 VOID
9870 NTAPI
9871 KeInitializeSemaphore(
9872   OUT PRKSEMAPHORE Semaphore,
9873   IN LONG Count,
9874   IN LONG Limit);
9875 
9876 NTKERNELAPI
9877 VOID
9878 NTAPI
9879 KeInitializeTimer(
9880   OUT PKTIMER Timer);
9881 
9882 NTKERNELAPI
9883 VOID
9884 NTAPI
9885 KeInitializeTimerEx(
9886   OUT PKTIMER Timer,
9887   IN TIMER_TYPE Type);
9888 
9889 NTKERNELAPI
9890 BOOLEAN
9891 NTAPI
9892 KeInsertByKeyDeviceQueue(
9893   IN OUT PKDEVICE_QUEUE DeviceQueue,
9894   IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
9895   IN ULONG SortKey);
9896 
9897 NTKERNELAPI
9898 BOOLEAN
9899 NTAPI
9900 KeInsertDeviceQueue(
9901   IN OUT PKDEVICE_QUEUE DeviceQueue,
9902   IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9903 
9904 NTKERNELAPI
9905 BOOLEAN
9906 NTAPI
9907 KeInsertQueueDpc(
9908   IN OUT PRKDPC Dpc,
9909   IN PVOID SystemArgument1 OPTIONAL,
9910   IN PVOID SystemArgument2 OPTIONAL);
9911 
9912 NTKERNELAPI
9913 VOID
9914 NTAPI
9915 KeLeaveCriticalRegion(VOID);
9916 
9917 NTHALAPI
9918 LARGE_INTEGER
9919 NTAPI
9920 KeQueryPerformanceCounter(
9921   OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
9922 
9923 NTKERNELAPI
9924 KPRIORITY
9925 NTAPI
9926 KeQueryPriorityThread(
9927   IN PRKTHREAD Thread);
9928 
9929 NTKERNELAPI
9930 ULONG
9931 NTAPI
9932 KeQueryTimeIncrement(VOID);
9933 
9934 NTKERNELAPI
9935 LONG
9936 NTAPI
9937 KeReadStateEvent(
9938   IN PRKEVENT Event);
9939 
9940 NTKERNELAPI
9941 LONG
9942 NTAPI
9943 KeReadStateMutex(
9944   IN PRKMUTEX Mutex);
9945 
9946 NTKERNELAPI
9947 LONG
9948 NTAPI
9949 KeReadStateSemaphore(
9950   IN PRKSEMAPHORE Semaphore);
9951 
9952 NTKERNELAPI
9953 BOOLEAN
9954 NTAPI
9955 KeReadStateTimer(
9956   IN PKTIMER Timer);
9957 
9958 NTKERNELAPI
9959 BOOLEAN
9960 NTAPI
9961 KeRegisterBugCheckCallback(
9962   OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
9963   IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
9964   IN PVOID Buffer,
9965   IN ULONG Length,
9966   IN PUCHAR Component);
9967 
9968 NTKERNELAPI
9969 LONG
9970 NTAPI
9971 KeReleaseMutex(
9972   IN OUT PRKMUTEX Mutex,
9973   IN BOOLEAN Wait);
9974 
9975 NTKERNELAPI
9976 LONG
9977 NTAPI
9978 KeReleaseSemaphore(
9979   IN OUT PRKSEMAPHORE Semaphore,
9980   IN KPRIORITY Increment,
9981   IN LONG Adjustment,
9982   IN BOOLEAN Wait);
9983 
9984 NTKERNELAPI
9985 PKDEVICE_QUEUE_ENTRY
9986 NTAPI
9987 KeRemoveByKeyDeviceQueue(
9988   IN OUT PKDEVICE_QUEUE DeviceQueue,
9989   IN ULONG SortKey);
9990 
9991 NTKERNELAPI
9992 PKDEVICE_QUEUE_ENTRY
9993 NTAPI
9994 KeRemoveDeviceQueue(
9995   IN OUT PKDEVICE_QUEUE DeviceQueue);
9996 
9997 NTKERNELAPI
9998 BOOLEAN
9999 NTAPI
10000 KeRemoveEntryDeviceQueue(
10001   IN OUT PKDEVICE_QUEUE DeviceQueue,
10002   IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
10003 
10004 NTKERNELAPI
10005 BOOLEAN
10006 NTAPI
10007 KeRemoveQueueDpc(
10008   IN OUT PRKDPC Dpc);
10009 
10010 NTKERNELAPI
10011 LONG
10012 NTAPI
10013 KeResetEvent(
10014   IN OUT PRKEVENT Event);
10015 
10016 NTKERNELAPI
10017 LONG
10018 NTAPI
10019 KeSetEvent(
10020   IN OUT PRKEVENT Event,
10021   IN KPRIORITY Increment,
10022   IN BOOLEAN Wait);
10023 
10024 NTKERNELAPI
10025 VOID
10026 NTAPI
10027 KeSetImportanceDpc(
10028   IN OUT PRKDPC Dpc,
10029   IN KDPC_IMPORTANCE Importance);
10030 
10031 NTKERNELAPI
10032 KPRIORITY
10033 NTAPI
10034 KeSetPriorityThread(
10035   IN OUT PKTHREAD Thread,
10036   IN KPRIORITY Priority);
10037 
10038 NTKERNELAPI
10039 BOOLEAN
10040 NTAPI
10041 KeSetTimer(
10042   IN OUT PKTIMER Timer,
10043   IN LARGE_INTEGER DueTime,
10044   IN PKDPC Dpc OPTIONAL);
10045 
10046 NTKERNELAPI
10047 BOOLEAN
10048 NTAPI
10049 KeSetTimerEx(
10050   IN OUT PKTIMER Timer,
10051   IN LARGE_INTEGER DueTime,
10052   IN LONG Period OPTIONAL,
10053   IN PKDPC Dpc OPTIONAL);
10054 
10055 NTHALAPI
10056 VOID
10057 NTAPI
10058 KeStallExecutionProcessor(
10059   IN ULONG MicroSeconds);
10060 
10061 NTKERNELAPI
10062 BOOLEAN
10063 NTAPI
10064 KeSynchronizeExecution(
10065   IN OUT PKINTERRUPT Interrupt,
10066   IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
10067   IN PVOID SynchronizeContext OPTIONAL);
10068 
10069 NTKERNELAPI
10070 NTSTATUS
10071 NTAPI
10072 KeWaitForMultipleObjects(
10073   IN ULONG Count,
10074   IN PVOID Object[],
10075   IN WAIT_TYPE WaitType,
10076   IN KWAIT_REASON WaitReason,
10077   IN KPROCESSOR_MODE WaitMode,
10078   IN BOOLEAN Alertable,
10079   IN PLARGE_INTEGER Timeout OPTIONAL,
10080   OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
10081 
10082 #define KeWaitForMutexObject KeWaitForSingleObject
10083 
10084 NTKERNELAPI
10085 NTSTATUS
10086 NTAPI
10087 KeWaitForSingleObject(
10088   IN PVOID Object,
10089   IN KWAIT_REASON WaitReason,
10090   IN KPROCESSOR_MODE WaitMode,
10091   IN BOOLEAN Alertable,
10092   IN PLARGE_INTEGER Timeout OPTIONAL);
10093 
10094 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10095 
10096 #if (NTDDI_VERSION >= NTDDI_WINXP)
10097 
10098 _DECL_HAL_KE_IMPORT
10099 VOID
10100 FASTCALL
10101 KeAcquireInStackQueuedSpinLock(
10102   IN OUT PKSPIN_LOCK SpinLock,
10103   OUT PKLOCK_QUEUE_HANDLE LockHandle);
10104 
10105 NTKERNELAPI
10106 VOID
10107 FASTCALL
10108 KeAcquireInStackQueuedSpinLockAtDpcLevel(
10109   IN OUT PKSPIN_LOCK SpinLock,
10110   OUT PKLOCK_QUEUE_HANDLE LockHandle);
10111 
10112 NTKERNELAPI
10113 KIRQL
10114 NTAPI
10115 KeAcquireInterruptSpinLock(
10116   IN OUT PKINTERRUPT Interrupt);
10117 
10118 NTKERNELAPI
10119 BOOLEAN
10120 NTAPI
10121 KeAreApcsDisabled(VOID);
10122 
10123 NTKERNELAPI
10124 ULONG
10125 NTAPI
10126 KeGetRecommendedSharedDataAlignment(VOID);
10127 
10128 NTKERNELAPI
10129 ULONG
10130 NTAPI
10131 KeQueryRuntimeThread(
10132   IN PKTHREAD Thread,
10133   OUT PULONG UserTime);
10134 
10135 NTKERNELAPI
10136 VOID
10137 FASTCALL
10138 KeReleaseInStackQueuedSpinLockFromDpcLevel(
10139   IN PKLOCK_QUEUE_HANDLE LockHandle);
10140 
10141 NTKERNELAPI
10142 VOID
10143 NTAPI
10144 KeReleaseInterruptSpinLock(
10145   IN OUT PKINTERRUPT Interrupt,
10146   IN KIRQL OldIrql);
10147 
10148 NTKERNELAPI
10149 PKDEVICE_QUEUE_ENTRY
10150 NTAPI
10151 KeRemoveByKeyDeviceQueueIfBusy(
10152   IN OUT PKDEVICE_QUEUE DeviceQueue,
10153   IN ULONG SortKey);
10154 
10155 _DECL_HAL_KE_IMPORT
10156 VOID
10157 FASTCALL
10158 KeReleaseInStackQueuedSpinLock(
10159   IN PKLOCK_QUEUE_HANDLE LockHandle);
10160 
10161 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10162 
10163 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
10164 
10165 NTKERNELAPI
10166 BOOLEAN
10167 NTAPI
10168 KeDeregisterBugCheckReasonCallback(
10169   IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
10170 
10171 NTKERNELAPI
10172 BOOLEAN
10173 NTAPI
10174 KeRegisterBugCheckReasonCallback(
10175   OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
10176   IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
10177   IN KBUGCHECK_CALLBACK_REASON Reason,
10178   IN PUCHAR Component);
10179 
10180 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
10181 
10182 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
10183 NTKERNELAPI
10184 VOID
10185 NTAPI
10186 KeFlushQueuedDpcs(VOID);
10187 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
10188 #if (NTDDI_VERSION >= NTDDI_WS03)
10189 
10190 NTKERNELAPI
10191 PVOID
10192 NTAPI
10193 KeRegisterNmiCallback(
10194   IN PNMI_CALLBACK CallbackRoutine,
10195   IN PVOID Context OPTIONAL);
10196 
10197 NTKERNELAPI
10198 NTSTATUS
10199 NTAPI
10200 KeDeregisterNmiCallback(
10201   IN PVOID Handle);
10202 
10203 NTKERNELAPI
10204 VOID
10205 NTAPI
10206 KeInitializeThreadedDpc(
10207   OUT PRKDPC Dpc,
10208   IN PKDEFERRED_ROUTINE DeferredRoutine,
10209   IN PVOID DeferredContext OPTIONAL);
10210 
10211 NTKERNELAPI
10212 ULONG_PTR
10213 NTAPI
10214 KeIpiGenericCall(
10215   IN PKIPI_BROADCAST_WORKER BroadcastFunction,
10216   IN ULONG_PTR Context);
10217 
10218 NTKERNELAPI
10219 KIRQL
10220 FASTCALL
10221 KeAcquireSpinLockForDpc(
10222   IN OUT PKSPIN_LOCK SpinLock);
10223 
10224 NTKERNELAPI
10225 VOID
10226 FASTCALL
10227 KeReleaseSpinLockForDpc(
10228   IN OUT PKSPIN_LOCK SpinLock,
10229   IN KIRQL OldIrql);
10230 
10231 NTKERNELAPI
10232 BOOLEAN
10233 FASTCALL
10234 KeTestSpinLock(
10235   IN PKSPIN_LOCK SpinLock);
10236 
10237 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10238 
10239 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10240 
10241 NTKERNELAPI
10242 BOOLEAN
10243 FASTCALL
10244 KeTryToAcquireSpinLockAtDpcLevel(
10245   IN OUT PKSPIN_LOCK SpinLock);
10246 
10247 NTKERNELAPI
10248 BOOLEAN
10249 NTAPI
10250 KeAreAllApcsDisabled(VOID);
10251 
10252 NTKERNELAPI
10253 VOID
10254 FASTCALL
10255 KeAcquireGuardedMutex(
10256   IN OUT PKGUARDED_MUTEX GuardedMutex);
10257 
10258 NTKERNELAPI
10259 VOID
10260 FASTCALL
10261 KeAcquireGuardedMutexUnsafe(
10262   IN OUT PKGUARDED_MUTEX GuardedMutex);
10263 
10264 NTKERNELAPI
10265 VOID
10266 NTAPI
10267 KeEnterGuardedRegion(VOID);
10268 
10269 NTKERNELAPI
10270 VOID
10271 NTAPI
10272 KeLeaveGuardedRegion(VOID);
10273 
10274 NTKERNELAPI
10275 VOID
10276 FASTCALL
10277 KeInitializeGuardedMutex(
10278   OUT PKGUARDED_MUTEX GuardedMutex);
10279 
10280 NTKERNELAPI
10281 VOID
10282 FASTCALL
10283 KeReleaseGuardedMutexUnsafe(
10284   IN OUT PKGUARDED_MUTEX GuardedMutex);
10285 
10286 NTKERNELAPI
10287 VOID
10288 FASTCALL
10289 KeReleaseGuardedMutex(
10290   IN OUT PKGUARDED_MUTEX GuardedMutex);
10291 
10292 NTKERNELAPI
10293 BOOLEAN
10294 FASTCALL
10295 KeTryToAcquireGuardedMutex(
10296   IN OUT PKGUARDED_MUTEX GuardedMutex);
10297 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
10298 
10299 #if (NTDDI_VERSION >= NTDDI_VISTA)
10300 NTKERNELAPI
10301 VOID
10302 FASTCALL
10303 KeAcquireInStackQueuedSpinLockForDpc(
10304   IN OUT PKSPIN_LOCK SpinLock,
10305   OUT PKLOCK_QUEUE_HANDLE LockHandle);
10306 
10307 NTKERNELAPI
10308 VOID
10309 FASTCALL
10310 KeReleaseInStackQueuedSpinLockForDpc(
10311   IN PKLOCK_QUEUE_HANDLE LockHandle);
10312 
10313 NTKERNELAPI
10314 NTSTATUS
10315 NTAPI
10316 KeQueryDpcWatchdogInformation(
10317   OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
10318 #if defined(SINGLE_GROUP_LEGACY_API)
10319 
10320 NTKERNELAPI
10321 KAFFINITY
10322 NTAPI
10323 KeSetSystemAffinityThreadEx(
10324   IN KAFFINITY Affinity);
10325 
10326 NTKERNELAPI
10327 VOID
10328 NTAPI
10329 KeRevertToUserAffinityThreadEx(
10330   IN KAFFINITY Affinity);
10331 
10332 NTKERNELAPI
10333 ULONG
10334 NTAPI
10335 KeQueryActiveProcessorCount(
10336   OUT PKAFFINITY ActiveProcessors OPTIONAL);
10337 
10338 NTKERNELAPI
10339 ULONG
10340 NTAPI
10341 KeQueryMaximumProcessorCount(VOID);
10342 #endif /* SINGLE_GROUP_LEGACY_API */
10343 
10344 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10345 
10346 #if (NTDDI_VERSION >= NTDDI_WS08)
10347 
10348 PVOID
10349 KeRegisterProcessorChangeCallback(
10350   IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
10351   IN PVOID CallbackContext OPTIONAL,
10352   IN ULONG Flags);
10353 
10354 VOID
10355 KeDeregisterProcessorChangeCallback(
10356   IN PVOID CallbackHandle);
10357 
10358 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
10359 #if (NTDDI_VERSION >= NTDDI_WIN7)
10360 
10361 ULONG64
10362 NTAPI
10363 KeQueryTotalCycleTimeProcess(
10364   IN OUT PKPROCESS Process,
10365   OUT PULONG64 CycleTimeStamp);
10366 
10367 ULONG64
10368 NTAPI
10369 KeQueryTotalCycleTimeThread(
10370   IN OUT PKTHREAD Thread,
10371   OUT PULONG64 CycleTimeStamp);
10372 
10373 NTKERNELAPI
10374 NTSTATUS
10375 NTAPI
10376 KeSetTargetProcessorDpcEx(
10377   IN OUT PKDPC Dpc,
10378   IN PPROCESSOR_NUMBER ProcNumber);
10379 
10380 NTKERNELAPI
10381 VOID
10382 NTAPI
10383 KeSetSystemGroupAffinityThread(
10384   IN PGROUP_AFFINITY Affinity,
10385   OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
10386 
10387 NTKERNELAPI
10388 VOID
10389 NTAPI
10390 KeRevertToUserGroupAffinityThread(
10391   IN PGROUP_AFFINITY PreviousAffinity);
10392 
10393 NTKERNELAPI
10394 BOOLEAN
10395 NTAPI
10396 KeSetCoalescableTimer(
10397   IN OUT PKTIMER Timer,
10398   IN LARGE_INTEGER DueTime,
10399   IN ULONG Period,
10400   IN ULONG TolerableDelay,
10401   IN PKDPC Dpc OPTIONAL);
10402 
10403 NTKERNELAPI
10404 ULONGLONG
10405 NTAPI
10406 KeQueryUnbiasedInterruptTime(VOID);
10407 
10408 NTKERNELAPI
10409 ULONG
10410 NTAPI
10411 KeQueryActiveProcessorCountEx(
10412   IN USHORT GroupNumber);
10413 
10414 NTKERNELAPI
10415 ULONG
10416 NTAPI
10417 KeQueryMaximumProcessorCountEx(
10418   IN USHORT GroupNumber);
10419 
10420 NTKERNELAPI
10421 USHORT
10422 NTAPI
10423 KeQueryActiveGroupCount(VOID);
10424 
10425 NTKERNELAPI
10426 USHORT
10427 NTAPI
10428 KeQueryMaximumGroupCount(VOID);
10429 
10430 NTKERNELAPI
10431 KAFFINITY
10432 NTAPI
10433 KeQueryGroupAffinity(
10434   IN USHORT GroupNumber);
10435 
10436 NTKERNELAPI
10437 ULONG
10438 NTAPI
10439 KeGetCurrentProcessorNumberEx(
10440   OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
10441 
10442 NTKERNELAPI
10443 VOID
10444 NTAPI
10445 KeQueryNodeActiveAffinity(
10446   IN USHORT NodeNumber,
10447   OUT PGROUP_AFFINITY Affinity OPTIONAL,
10448   OUT PUSHORT Count OPTIONAL);
10449 
10450 NTKERNELAPI
10451 USHORT
10452 NTAPI
10453 KeQueryNodeMaximumProcessorCount(
10454   IN USHORT NodeNumber);
10455 
10456 NTKERNELAPI
10457 USHORT
10458 NTAPI
10459 KeQueryHighestNodeNumber(VOID);
10460 
10461 NTKERNELAPI
10462 USHORT
10463 NTAPI
10464 KeGetCurrentNodeNumber(VOID);
10465 
10466 NTKERNELAPI
10467 NTSTATUS
10468 NTAPI
10469 KeQueryLogicalProcessorRelationship(
10470   IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
10471   IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
10472   OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
10473   IN OUT PULONG Length);
10474 
10475 NTKERNELAPI
10476 NTSTATUS
10477 NTAPI
10478 KeSaveExtendedProcessorState(
10479   IN ULONG64 Mask,
10480   OUT PXSTATE_SAVE XStateSave);
10481 
10482 NTKERNELAPI
10483 VOID
10484 NTAPI
10485 KeRestoreExtendedProcessorState(
10486   IN PXSTATE_SAVE XStateSave);
10487 
10488 NTSTATUS
10489 NTAPI
10490 KeGetProcessorNumberFromIndex(
10491   IN ULONG ProcIndex,
10492   OUT PPROCESSOR_NUMBER ProcNumber);
10493 
10494 ULONG
10495 NTAPI
10496 KeGetProcessorIndexFromNumber(
10497   IN PPROCESSOR_NUMBER ProcNumber);
10498 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
10499 #if !defined(_IA64_)
10500 NTHALAPI
10501 VOID
10502 NTAPI
10503 KeFlushWriteBuffer(VOID);
10504 #endif
10505 
10506 /* VOID
10507  * KeInitializeCallbackRecord(
10508  *   IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
10509  */
10510 #define KeInitializeCallbackRecord(CallbackRecord) \
10511   CallbackRecord->State = BufferEmpty;
10512 
10513 #if DBG
10514 
10515 #if (NTDDI_VERSION >= NTDDI_VISTA)
10516 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
10517 #else
10518 #define PAGED_ASSERT( exp ) ASSERT( exp )
10519 #endif
10520 
10521 #define PAGED_CODE() { \
10522   if (KeGetCurrentIrql() > APC_LEVEL) { \
10523     KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
10524     PAGED_ASSERT(FALSE); \
10525   } \
10526 }
10527 
10528 #else
10529 
10530 #define PAGED_CODE()
10531 
10532 #endif /* DBG */
10533 
10534 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
10535 
10536 /******************************************************************************
10537  *                       Memory manager Functions                             *
10538  ******************************************************************************/
10539 /* Alignment Macros */
10540 #define ALIGN_DOWN_BY(size, align) \
10541     ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
10542 
10543 #define ALIGN_UP_BY(size, align) \
10544     (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
10545 
10546 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
10547     ((PVOID)ALIGN_DOWN_BY(ptr, align))
10548 
10549 #define ALIGN_UP_POINTER_BY(ptr, align) \
10550     ((PVOID)ALIGN_UP_BY(ptr, align))
10551 
10552 #define ALIGN_DOWN(size, type) \
10553     ALIGN_DOWN_BY(size, sizeof(type))
10554 
10555 #define ALIGN_UP(size, type) \
10556     ALIGN_UP_BY(size, sizeof(type))
10557 
10558 #define ALIGN_DOWN_POINTER(ptr, type) \
10559     ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
10560 
10561 #define ALIGN_UP_POINTER(ptr, type) \
10562     ALIGN_UP_POINTER_BY(ptr, sizeof(type))
10563 
10564 #ifndef FIELD_OFFSET
10565 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
10566 #endif
10567 
10568 #ifndef FIELD_SIZE
10569 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
10570 #endif
10571 
10572 #define POOL_TAGGING                             1
10573 
10574 #if DBG
10575 #define IF_DEBUG if (TRUE)
10576 #else
10577 #define IF_DEBUG if (FALSE)
10578 #endif /* DBG */
10579 
10580 /* ULONG
10581  * BYTE_OFFSET(
10582  *   IN PVOID Va)
10583  */
10584 #define BYTE_OFFSET(Va) \
10585   ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
10586 
10587 /* ULONG
10588  * BYTES_TO_PAGES(
10589  *   IN ULONG Size)
10590  *
10591  * Note: This needs to be like this to avoid overflows!
10592  */
10593 #define BYTES_TO_PAGES(Size) \
10594   (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
10595 
10596 /* PVOID
10597  * PAGE_ALIGN(
10598  *   IN PVOID Va)
10599  */
10600 #define PAGE_ALIGN(Va) \
10601   ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
10602 
10603 /* ULONG_PTR
10604  * ROUND_TO_PAGES(
10605  *   IN ULONG_PTR Size)
10606  */
10607 #define ROUND_TO_PAGES(Size) \
10608   (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
10609 
10610 /* ULONG
10611  * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
10612  *   IN PVOID Va,
10613  *   IN ULONG Size)
10614  */
10615 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
10616   ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
10617     + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
10618 
10619 #define COMPUTE_PAGES_SPANNED(Va, Size) \
10620     ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
10621 
10622 /*
10623  * ULONG
10624  * MmGetMdlByteCount(
10625  *   IN PMDL  Mdl)
10626  */
10627 #define MmGetMdlByteCount(_Mdl) \
10628   ((_Mdl)->ByteCount)
10629 
10630 /*
10631  * ULONG
10632  * MmGetMdlByteOffset(
10633  *   IN PMDL  Mdl)
10634  */
10635 #define MmGetMdlByteOffset(_Mdl) \
10636   ((_Mdl)->ByteOffset)
10637 
10638 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
10639 
10640 /*
10641  * PPFN_NUMBER
10642  * MmGetMdlPfnArray(
10643  *   IN PMDL  Mdl)
10644  */
10645 #define MmGetMdlPfnArray(_Mdl) \
10646   ((PPFN_NUMBER) ((_Mdl) + 1))
10647 
10648 /*
10649  * PVOID
10650  * MmGetMdlVirtualAddress(
10651  *   IN PMDL  Mdl)
10652  */
10653 #define MmGetMdlVirtualAddress(_Mdl) \
10654   ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
10655 
10656 #define MmGetProcedureAddress(Address) (Address)
10657 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
10658 
10659 /* PVOID MmGetSystemAddressForMdl(
10660  *     IN PMDL Mdl);
10661  */
10662 #define MmGetSystemAddressForMdl(Mdl) \
10663   (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
10664     MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10665       ((Mdl)->MappedSystemVa) : \
10666       (MmMapLockedPages((Mdl), KernelMode)))
10667 
10668 /* PVOID
10669  * MmGetSystemAddressForMdlSafe(
10670  *     IN PMDL Mdl,
10671  *     IN MM_PAGE_PRIORITY Priority)
10672  */
10673 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
10674   (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
10675     | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
10676     (_Mdl)->MappedSystemVa : \
10677     (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
10678       KernelMode, MmCached, NULL, FALSE, (_Priority)))
10679 
10680 /*
10681  * VOID
10682  * MmInitializeMdl(
10683  *   IN PMDL  MemoryDescriptorList,
10684  *   IN PVOID  BaseVa,
10685  *   IN SIZE_T  Length)
10686  */
10687 #define MmInitializeMdl(_MemoryDescriptorList, \
10688                         _BaseVa, \
10689                         _Length) \
10690 { \
10691   (_MemoryDescriptorList)->Next = (PMDL) NULL; \
10692   (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
10693     (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
10694   (_MemoryDescriptorList)->MdlFlags = 0; \
10695   (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
10696   (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
10697   (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
10698 }
10699 
10700 /*
10701  * VOID
10702  * MmPrepareMdlForReuse(
10703  *   IN PMDL  Mdl)
10704  */
10705 #define MmPrepareMdlForReuse(_Mdl) \
10706 { \
10707   if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
10708     ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
10709     MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
10710   } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
10711     ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
10712   } \
10713 }
10714 
10715 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10716 NTKERNELAPI
10717 PVOID
10718 NTAPI
10719 MmAllocateContiguousMemory(
10720   IN SIZE_T NumberOfBytes,
10721   IN PHYSICAL_ADDRESS HighestAcceptableAddress);
10722 
10723 NTKERNELAPI
10724 PVOID
10725 NTAPI
10726 MmAllocateContiguousMemorySpecifyCache(
10727   IN SIZE_T NumberOfBytes,
10728   IN PHYSICAL_ADDRESS LowestAcceptableAddress,
10729   IN PHYSICAL_ADDRESS HighestAcceptableAddress,
10730   IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
10731   IN MEMORY_CACHING_TYPE CacheType);
10732 
10733 NTKERNELAPI
10734 PMDL
10735 NTAPI
10736 MmAllocatePagesForMdl(
10737   IN PHYSICAL_ADDRESS LowAddress,
10738   IN PHYSICAL_ADDRESS HighAddress,
10739   IN PHYSICAL_ADDRESS SkipBytes,
10740   IN SIZE_T TotalBytes);
10741 
10742 NTKERNELAPI
10743 VOID
10744 NTAPI
10745 MmBuildMdlForNonPagedPool(
10746   IN OUT PMDLX MemoryDescriptorList);
10747 
10748 //DECLSPEC_DEPRECATED_DDK
10749 NTKERNELAPI
10750 PMDL
10751 NTAPI
10752 MmCreateMdl(
10753   IN PMDL MemoryDescriptorList OPTIONAL,
10754   IN PVOID Base,
10755   IN SIZE_T Length);
10756 
10757 NTKERNELAPI
10758 VOID
10759 NTAPI
10760 MmFreeContiguousMemory(
10761   IN PVOID BaseAddress);
10762 
10763 NTKERNELAPI
10764 VOID
10765 NTAPI
10766 MmFreeContiguousMemorySpecifyCache(
10767   IN PVOID BaseAddress,
10768   IN SIZE_T NumberOfBytes,
10769   IN MEMORY_CACHING_TYPE CacheType);
10770 
10771 NTKERNELAPI
10772 VOID
10773 NTAPI
10774 MmFreePagesFromMdl(
10775   IN PMDLX MemoryDescriptorList);
10776 
10777 NTKERNELAPI
10778 PVOID
10779 NTAPI
10780 MmGetSystemRoutineAddress(
10781   IN PUNICODE_STRING SystemRoutineName);
10782 
10783 NTKERNELAPI
10784 LOGICAL
10785 NTAPI
10786 MmIsDriverVerifying(
10787   IN struct _DRIVER_OBJECT *DriverObject);
10788 
10789 NTKERNELAPI
10790 PVOID
10791 NTAPI
10792 MmLockPagableDataSection(
10793   IN PVOID AddressWithinSection);
10794 
10795 NTKERNELAPI
10796 PVOID
10797 NTAPI
10798 MmMapIoSpace(
10799   IN PHYSICAL_ADDRESS PhysicalAddress,
10800   IN SIZE_T NumberOfBytes,
10801   IN MEMORY_CACHING_TYPE CacheEnable);
10802 
10803 NTKERNELAPI
10804 PVOID
10805 NTAPI
10806 MmMapLockedPages(
10807   IN PMDL MemoryDescriptorList,
10808   IN KPROCESSOR_MODE AccessMode);
10809 
10810 NTKERNELAPI
10811 PVOID
10812 NTAPI
10813 MmMapLockedPagesSpecifyCache(
10814   IN PMDLX MemoryDescriptorList,
10815   IN KPROCESSOR_MODE AccessMode,
10816   IN MEMORY_CACHING_TYPE CacheType,
10817   IN PVOID BaseAddress OPTIONAL,
10818   IN ULONG BugCheckOnFailure,
10819   IN MM_PAGE_PRIORITY Priority);
10820 
10821 NTKERNELAPI
10822 PVOID
10823 NTAPI
10824 MmPageEntireDriver(
10825   IN PVOID AddressWithinSection);
10826 
10827 NTKERNELAPI
10828 VOID
10829 NTAPI
10830 MmProbeAndLockPages(
10831   IN OUT PMDL MemoryDescriptorList,
10832   IN KPROCESSOR_MODE AccessMode,
10833   IN LOCK_OPERATION Operation);
10834 
10835 NTKERNELAPI
10836 MM_SYSTEMSIZE
10837 NTAPI
10838 MmQuerySystemSize(VOID);
10839 
10840 NTKERNELAPI
10841 VOID
10842 NTAPI
10843 MmResetDriverPaging(
10844   IN PVOID AddressWithinSection);
10845 
10846 NTKERNELAPI
10847 SIZE_T
10848 NTAPI
10849 MmSizeOfMdl(
10850   IN PVOID Base,
10851   IN SIZE_T Length);
10852 
10853 NTKERNELAPI
10854 VOID
10855 NTAPI
10856 MmUnlockPagableImageSection(
10857   IN PVOID ImageSectionHandle);
10858 
10859 NTKERNELAPI
10860 VOID
10861 NTAPI
10862 MmUnlockPages(
10863   IN OUT PMDL MemoryDescriptorList);
10864 
10865 NTKERNELAPI
10866 VOID
10867 NTAPI
10868 MmUnmapIoSpace(
10869   IN PVOID BaseAddress,
10870   IN SIZE_T NumberOfBytes);
10871 
10872 NTKERNELAPI
10873 VOID
10874 NTAPI
10875 MmProbeAndLockProcessPages(
10876   IN OUT PMDL MemoryDescriptorList,
10877   IN PEPROCESS Process,
10878   IN KPROCESSOR_MODE AccessMode,
10879   IN LOCK_OPERATION Operation);
10880 
10881 NTKERNELAPI
10882 VOID
10883 NTAPI
10884 MmUnmapLockedPages(
10885   IN PVOID BaseAddress,
10886   IN PMDL MemoryDescriptorList);
10887 
10888 NTKERNELAPI
10889 PVOID
10890 NTAPI
10891 MmAllocateContiguousMemorySpecifyCacheNode(
10892   IN SIZE_T NumberOfBytes,
10893   IN PHYSICAL_ADDRESS LowestAcceptableAddress,
10894   IN PHYSICAL_ADDRESS HighestAcceptableAddress,
10895   IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
10896   IN MEMORY_CACHING_TYPE CacheType,
10897   IN NODE_REQUIREMENT PreferredNode);
10898 
10899 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10900 
10901 #if (NTDDI_VERSION >= NTDDI_WINXP)
10902 
10903 NTKERNELAPI
10904 NTSTATUS
10905 NTAPI
10906 MmAdvanceMdl(
10907   IN OUT PMDL Mdl,
10908   IN ULONG NumberOfBytes);
10909 
10910 NTKERNELAPI
10911 PVOID
10912 NTAPI
10913 MmAllocateMappingAddress(
10914   IN SIZE_T NumberOfBytes,
10915   IN ULONG PoolTag);
10916 
10917 NTKERNELAPI
10918 VOID
10919 NTAPI
10920 MmFreeMappingAddress(
10921   IN PVOID BaseAddress,
10922   IN ULONG PoolTag);
10923 
10924 NTKERNELAPI
10925 NTSTATUS
10926 NTAPI
10927 MmIsVerifierEnabled(
10928   OUT PULONG VerifierFlags);
10929 
10930 NTKERNELAPI
10931 PVOID
10932 NTAPI
10933 MmMapLockedPagesWithReservedMapping(
10934   IN PVOID MappingAddress,
10935   IN ULONG PoolTag,
10936   IN PMDL MemoryDescriptorList,
10937   IN MEMORY_CACHING_TYPE CacheType);
10938 
10939 NTKERNELAPI
10940 NTSTATUS
10941 NTAPI
10942 MmProtectMdlSystemAddress(
10943   IN PMDL MemoryDescriptorList,
10944   IN ULONG NewProtect);
10945 
10946 NTKERNELAPI
10947 VOID
10948 NTAPI
10949 MmUnmapReservedMapping(
10950   IN PVOID BaseAddress,
10951   IN ULONG PoolTag,
10952   IN PMDL MemoryDescriptorList);
10953 
10954 NTKERNELAPI
10955 NTSTATUS
10956 NTAPI
10957 MmAddVerifierThunks(
10958   IN PVOID ThunkBuffer,
10959   IN ULONG ThunkBufferSize);
10960 
10961 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10962 
10963 #if (NTDDI_VERSION >= NTDDI_WS03)
10964 NTKERNELAPI
10965 LOGICAL
10966 NTAPI
10967 MmIsIoSpaceActive(
10968   IN PHYSICAL_ADDRESS StartAddress,
10969   IN SIZE_T NumberOfBytes);
10970 
10971 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10972 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10973 NTKERNELAPI
10974 PMDL
10975 NTAPI
10976 MmAllocatePagesForMdlEx(
10977   IN PHYSICAL_ADDRESS LowAddress,
10978   IN PHYSICAL_ADDRESS HighAddress,
10979   IN PHYSICAL_ADDRESS SkipBytes,
10980   IN SIZE_T TotalBytes,
10981   IN MEMORY_CACHING_TYPE CacheType,
10982   IN ULONG Flags);
10983 #endif
10984 
10985 #if (NTDDI_VERSION >= NTDDI_VISTA)
10986 NTKERNELAPI
10987 LOGICAL
10988 NTAPI
10989 MmIsDriverVerifyingByAddress(
10990   IN PVOID AddressWithinSection);
10991 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10992 
10993 /******************************************************************************
10994  *                            Security Manager Functions                      *
10995  ******************************************************************************/
10996 
10997 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10998 NTKERNELAPI
10999 BOOLEAN
11000 NTAPI
11001 SeAccessCheck(
11002   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
11003   IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
11004   IN BOOLEAN SubjectContextLocked,
11005   IN ACCESS_MASK DesiredAccess,
11006   IN ACCESS_MASK PreviouslyGrantedAccess,
11007   OUT PPRIVILEGE_SET *Privileges OPTIONAL,
11008   IN PGENERIC_MAPPING GenericMapping,
11009   IN KPROCESSOR_MODE AccessMode,
11010   OUT PACCESS_MASK GrantedAccess,
11011   OUT PNTSTATUS AccessStatus);
11012 
11013 NTKERNELAPI
11014 NTSTATUS
11015 NTAPI
11016 SeAssignSecurity(
11017   IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
11018   IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
11019   OUT PSECURITY_DESCRIPTOR *NewDescriptor,
11020   IN BOOLEAN IsDirectoryObject,
11021   IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
11022   IN PGENERIC_MAPPING GenericMapping,
11023   IN POOL_TYPE PoolType);
11024 
11025 NTKERNELAPI
11026 NTSTATUS
11027 NTAPI
11028 SeAssignSecurityEx(
11029   IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
11030   IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
11031   OUT PSECURITY_DESCRIPTOR *NewDescriptor,
11032   IN GUID *ObjectType OPTIONAL,
11033   IN BOOLEAN IsDirectoryObject,
11034   IN ULONG AutoInheritFlags,
11035   IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
11036   IN PGENERIC_MAPPING GenericMapping,
11037   IN POOL_TYPE PoolType);
11038 
11039 NTKERNELAPI
11040 NTSTATUS
11041 NTAPI
11042 SeDeassignSecurity(
11043   IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
11044 
11045 NTKERNELAPI
11046 BOOLEAN
11047 NTAPI
11048 SeValidSecurityDescriptor(
11049   IN ULONG Length,
11050   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
11051 
11052 NTKERNELAPI
11053 ULONG
11054 NTAPI
11055 SeObjectCreateSaclAccessBits(
11056   IN PSECURITY_DESCRIPTOR SecurityDescriptor);
11057 
11058 NTKERNELAPI
11059 VOID
11060 NTAPI
11061 SeReleaseSubjectContext(
11062   IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
11063 
11064 NTKERNELAPI
11065 VOID
11066 NTAPI
11067 SeUnlockSubjectContext(
11068   IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
11069 
11070 NTKERNELAPI
11071 VOID
11072 NTAPI
11073 SeCaptureSubjectContext(
11074   OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
11075 
11076 NTKERNELAPI
11077 VOID
11078 NTAPI
11079 SeLockSubjectContext(
11080   IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
11081 
11082 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11083 
11084 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11085 
11086 NTSTATUS
11087 NTAPI
11088 SeSetAuditParameter(
11089   IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
11090   IN SE_ADT_PARAMETER_TYPE Type,
11091   IN ULONG Index,
11092   IN PVOID Data);
11093 
11094 NTSTATUS
11095 NTAPI
11096 SeReportSecurityEvent(
11097   IN ULONG Flags,
11098   IN PUNICODE_STRING SourceName,
11099   IN PSID UserSid OPTIONAL,
11100   IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
11101 
11102 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11103 
11104 #if (NTDDI_VERSION >= NTDDI_VISTA)
11105 NTKERNELAPI
11106 ULONG
11107 NTAPI
11108 SeComputeAutoInheritByObjectType(
11109   IN PVOID ObjectType,
11110   IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
11111   IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
11112 
11113 #ifdef SE_NTFS_WORLD_CACHE
11114 VOID
11115 NTAPI
11116 SeGetWorldRights(
11117   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
11118   IN PGENERIC_MAPPING GenericMapping,
11119   OUT PACCESS_MASK GrantedAccess);
11120 #endif /* SE_NTFS_WORLD_CACHE */
11121 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11122 
11123 /******************************************************************************
11124  *                         Configuration Manager Functions                    *
11125  ******************************************************************************/
11126 
11127 #if (NTDDI_VERSION >= NTDDI_WINXP)
11128 NTKERNELAPI
11129 NTSTATUS
11130 NTAPI
11131 CmRegisterCallback(
11132   IN PEX_CALLBACK_FUNCTION Function,
11133   IN PVOID Context OPTIONAL,
11134   OUT PLARGE_INTEGER Cookie);
11135 
11136 NTKERNELAPI
11137 NTSTATUS
11138 NTAPI
11139 CmUnRegisterCallback(
11140   IN LARGE_INTEGER Cookie);
11141 #endif
11142 
11143 #if (NTDDI_VERSION >= NTDDI_VISTA)
11144 
11145 NTKERNELAPI
11146 NTSTATUS
11147 NTAPI
11148 CmRegisterCallbackEx(
11149   PEX_CALLBACK_FUNCTION Function,
11150   PCUNICODE_STRING Altitude,
11151   PVOID Driver,
11152   PVOID Context,
11153   PLARGE_INTEGER Cookie,
11154   PVOID Reserved);
11155 
11156 NTKERNELAPI
11157 VOID
11158 NTAPI
11159 CmGetCallbackVersion(
11160   OUT PULONG Major OPTIONAL,
11161   OUT PULONG Minor OPTIONAL);
11162 
11163 NTKERNELAPI
11164 NTSTATUS
11165 NTAPI
11166 CmSetCallbackObjectContext(
11167   IN OUT PVOID Object,
11168   IN PLARGE_INTEGER Cookie,
11169   IN PVOID NewContext,
11170   OUT PVOID *OldContext OPTIONAL);
11171 
11172 NTKERNELAPI
11173 NTSTATUS
11174 NTAPI
11175 CmCallbackGetKeyObjectID(
11176   IN PLARGE_INTEGER Cookie,
11177   IN PVOID Object,
11178   OUT PULONG_PTR ObjectID OPTIONAL,
11179   OUT PCUNICODE_STRING *ObjectName OPTIONAL);
11180 
11181 NTKERNELAPI
11182 PVOID
11183 NTAPI
11184 CmGetBoundTransaction(
11185   IN PLARGE_INTEGER Cookie,
11186   IN PVOID Object);
11187 
11188 #endif // NTDDI_VERSION >= NTDDI_VISTA
11189 
11190 
11191 /******************************************************************************
11192  *                         I/O Manager Functions                              *
11193  ******************************************************************************/
11194 
11195 /*
11196  * NTSTATUS
11197  * IoAcquireRemoveLock(
11198  *   IN PIO_REMOVE_LOCK  RemoveLock,
11199  *   IN OPTIONAL PVOID  Tag)
11200  */
11201 #if DBG
11202 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11203   IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
11204 #else
11205 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11206   IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
11207 #endif
11208 
11209 /*
11210  * VOID
11211  * IoAdjustPagingPathCount(
11212  *   IN PLONG  Count,
11213  *   IN BOOLEAN  Increment)
11214  */
11215 #define IoAdjustPagingPathCount(_Count, \
11216                                 _Increment) \
11217 { \
11218   if (_Increment) \
11219     { \
11220       InterlockedIncrement(_Count); \
11221     } \
11222   else \
11223     { \
11224       InterlockedDecrement(_Count); \
11225     } \
11226 }
11227 
11228 #if !defined(_M_AMD64)
11229 NTHALAPI
11230 VOID
11231 NTAPI
11232 READ_PORT_BUFFER_UCHAR(
11233   IN PUCHAR Port,
11234   IN PUCHAR Buffer,
11235   IN ULONG Count);
11236 
11237 NTHALAPI
11238 VOID
11239 NTAPI
11240 READ_PORT_BUFFER_ULONG(
11241   IN PULONG Port,
11242   IN PULONG Buffer,
11243   IN ULONG Count);
11244 
11245 NTHALAPI
11246 VOID
11247 NTAPI
11248 READ_PORT_BUFFER_USHORT(
11249   IN PUSHORT Port,
11250   IN PUSHORT Buffer,
11251   IN ULONG Count);
11252 
11253 NTHALAPI
11254 UCHAR
11255 NTAPI
11256 READ_PORT_UCHAR(
11257   IN PUCHAR Port);
11258 
11259 NTHALAPI
11260 ULONG
11261 NTAPI
11262 READ_PORT_ULONG(
11263   IN PULONG Port);
11264 
11265 NTHALAPI
11266 USHORT
11267 NTAPI
11268 READ_PORT_USHORT(
11269   IN PUSHORT Port);
11270 
11271 NTKERNELAPI
11272 VOID
11273 NTAPI
11274 READ_REGISTER_BUFFER_UCHAR(
11275   IN PUCHAR Register,
11276   IN PUCHAR Buffer,
11277   IN ULONG Count);
11278 
11279 NTKERNELAPI
11280 VOID
11281 NTAPI
11282 READ_REGISTER_BUFFER_ULONG(
11283   IN PULONG Register,
11284   IN PULONG Buffer,
11285   IN ULONG Count);
11286 
11287 NTKERNELAPI
11288 VOID
11289 NTAPI
11290 READ_REGISTER_BUFFER_USHORT(
11291   IN PUSHORT Register,
11292   IN PUSHORT Buffer,
11293   IN ULONG Count);
11294 
11295 NTKERNELAPI
11296 UCHAR
11297 NTAPI
11298 READ_REGISTER_UCHAR(
11299   IN PUCHAR Register);
11300 
11301 NTKERNELAPI
11302 ULONG
11303 NTAPI
11304 READ_REGISTER_ULONG(
11305   IN PULONG Register);
11306 
11307 NTKERNELAPI
11308 USHORT
11309 NTAPI
11310 READ_REGISTER_USHORT(
11311   IN PUSHORT Register);
11312 
11313 NTHALAPI
11314 VOID
11315 NTAPI
11316 WRITE_PORT_BUFFER_UCHAR(
11317   IN PUCHAR Port,
11318   IN PUCHAR Buffer,
11319   IN ULONG Count);
11320 
11321 NTHALAPI
11322 VOID
11323 NTAPI
11324 WRITE_PORT_BUFFER_ULONG(
11325   IN PULONG Port,
11326   IN PULONG Buffer,
11327   IN ULONG Count);
11328 
11329 NTHALAPI
11330 VOID
11331 NTAPI
11332 WRITE_PORT_BUFFER_USHORT(
11333   IN PUSHORT Port,
11334   IN PUSHORT Buffer,
11335   IN ULONG Count);
11336 
11337 NTHALAPI
11338 VOID
11339 NTAPI
11340 WRITE_PORT_UCHAR(
11341   IN PUCHAR Port,
11342   IN UCHAR Value);
11343 
11344 NTHALAPI
11345 VOID
11346 NTAPI
11347 WRITE_PORT_ULONG(
11348   IN PULONG Port,
11349   IN ULONG Value);
11350 
11351 NTHALAPI
11352 VOID
11353 NTAPI
11354 WRITE_PORT_USHORT(
11355   IN PUSHORT Port,
11356   IN USHORT Value);
11357 
11358 NTKERNELAPI
11359 VOID
11360 NTAPI
11361 WRITE_REGISTER_BUFFER_UCHAR(
11362   IN PUCHAR Register,
11363   IN PUCHAR Buffer,
11364   IN ULONG Count);
11365 
11366 NTKERNELAPI
11367 VOID
11368 NTAPI
11369 WRITE_REGISTER_BUFFER_ULONG(
11370   IN PULONG Register,
11371   IN PULONG Buffer,
11372   IN ULONG Count);
11373 
11374 NTKERNELAPI
11375 VOID
11376 NTAPI
11377 WRITE_REGISTER_BUFFER_USHORT(
11378   IN PUSHORT Register,
11379   IN PUSHORT Buffer,
11380   IN ULONG Count);
11381 
11382 NTKERNELAPI
11383 VOID
11384 NTAPI
11385 WRITE_REGISTER_UCHAR(
11386   IN PUCHAR Register,
11387   IN UCHAR Value);
11388 
11389 NTKERNELAPI
11390 VOID
11391 NTAPI
11392 WRITE_REGISTER_ULONG(
11393   IN PULONG Register,
11394   IN ULONG Value);
11395 
11396 NTKERNELAPI
11397 VOID
11398 NTAPI
11399 WRITE_REGISTER_USHORT(
11400   IN PUSHORT Register,
11401   IN USHORT Value);
11402 
11403 #else
11404 
11405 FORCEINLINE
11406 VOID
READ_PORT_BUFFER_UCHAR(IN PUCHAR Port,IN PUCHAR Buffer,IN ULONG Count)11407 READ_PORT_BUFFER_UCHAR(
11408   IN PUCHAR Port,
11409   IN PUCHAR Buffer,
11410   IN ULONG Count)
11411 {
11412   __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11413 }
11414 
11415 FORCEINLINE
11416 VOID
READ_PORT_BUFFER_ULONG(IN PULONG Port,IN PULONG Buffer,IN ULONG Count)11417 READ_PORT_BUFFER_ULONG(
11418   IN PULONG Port,
11419   IN PULONG Buffer,
11420   IN ULONG Count)
11421 {
11422   __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11423 }
11424 
11425 FORCEINLINE
11426 VOID
READ_PORT_BUFFER_USHORT(IN PUSHORT Port,IN PUSHORT Buffer,IN ULONG Count)11427 READ_PORT_BUFFER_USHORT(
11428   IN PUSHORT Port,
11429   IN PUSHORT Buffer,
11430   IN ULONG Count)
11431 {
11432   __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11433 }
11434 
11435 FORCEINLINE
11436 UCHAR
READ_PORT_UCHAR(IN PUCHAR Port)11437 READ_PORT_UCHAR(
11438   IN PUCHAR Port)
11439 {
11440   return __inbyte((USHORT)(ULONG_PTR)Port);
11441 }
11442 
11443 FORCEINLINE
11444 ULONG
READ_PORT_ULONG(IN PULONG Port)11445 READ_PORT_ULONG(
11446   IN PULONG Port)
11447 {
11448   return __indword((USHORT)(ULONG_PTR)Port);
11449 }
11450 
11451 FORCEINLINE
11452 USHORT
READ_PORT_USHORT(IN PUSHORT Port)11453 READ_PORT_USHORT(
11454   IN PUSHORT Port)
11455 {
11456   return __inword((USHORT)(ULONG_PTR)Port);
11457 }
11458 
11459 FORCEINLINE
11460 VOID
READ_REGISTER_BUFFER_UCHAR(IN PUCHAR Register,IN PUCHAR Buffer,IN ULONG Count)11461 READ_REGISTER_BUFFER_UCHAR(
11462   IN PUCHAR Register,
11463   IN PUCHAR Buffer,
11464   IN ULONG Count)
11465 {
11466   __movsb(Register, Buffer, Count);
11467 }
11468 
11469 FORCEINLINE
11470 VOID
READ_REGISTER_BUFFER_ULONG(IN PULONG Register,IN PULONG Buffer,IN ULONG Count)11471 READ_REGISTER_BUFFER_ULONG(
11472   IN PULONG Register,
11473   IN PULONG Buffer,
11474   IN ULONG Count)
11475 {
11476   __movsd(Register, Buffer, Count);
11477 }
11478 
11479 FORCEINLINE
11480 VOID
READ_REGISTER_BUFFER_USHORT(IN PUSHORT Register,IN PUSHORT Buffer,IN ULONG Count)11481 READ_REGISTER_BUFFER_USHORT(
11482   IN PUSHORT Register,
11483   IN PUSHORT Buffer,
11484   IN ULONG Count)
11485 {
11486   __movsw(Register, Buffer, Count);
11487 }
11488 
11489 FORCEINLINE
11490 UCHAR
READ_REGISTER_UCHAR(IN volatile UCHAR * Register)11491 READ_REGISTER_UCHAR(
11492   IN volatile UCHAR *Register)
11493 {
11494   return *Register;
11495 }
11496 
11497 FORCEINLINE
11498 ULONG
READ_REGISTER_ULONG(IN volatile ULONG * Register)11499 READ_REGISTER_ULONG(
11500   IN volatile ULONG *Register)
11501 {
11502   return *Register;
11503 }
11504 
11505 FORCEINLINE
11506 USHORT
READ_REGISTER_USHORT(IN volatile USHORT * Register)11507 READ_REGISTER_USHORT(
11508   IN volatile USHORT *Register)
11509 {
11510   return *Register;
11511 }
11512 
11513 FORCEINLINE
11514 VOID
WRITE_PORT_BUFFER_UCHAR(IN PUCHAR Port,IN PUCHAR Buffer,IN ULONG Count)11515 WRITE_PORT_BUFFER_UCHAR(
11516   IN PUCHAR Port,
11517   IN PUCHAR Buffer,
11518   IN ULONG Count)
11519 {
11520   __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11521 }
11522 
11523 FORCEINLINE
11524 VOID
WRITE_PORT_BUFFER_ULONG(IN PULONG Port,IN PULONG Buffer,IN ULONG Count)11525 WRITE_PORT_BUFFER_ULONG(
11526   IN PULONG Port,
11527   IN PULONG Buffer,
11528   IN ULONG Count)
11529 {
11530   __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11531 }
11532 
11533 FORCEINLINE
11534 VOID
WRITE_PORT_BUFFER_USHORT(IN PUSHORT Port,IN PUSHORT Buffer,IN ULONG Count)11535 WRITE_PORT_BUFFER_USHORT(
11536   IN PUSHORT Port,
11537   IN PUSHORT Buffer,
11538   IN ULONG Count)
11539 {
11540   __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
11541 }
11542 
11543 FORCEINLINE
11544 VOID
WRITE_PORT_UCHAR(IN PUCHAR Port,IN UCHAR Value)11545 WRITE_PORT_UCHAR(
11546   IN PUCHAR Port,
11547   IN UCHAR Value)
11548 {
11549   __outbyte((USHORT)(ULONG_PTR)Port, Value);
11550 }
11551 
11552 FORCEINLINE
11553 VOID
WRITE_PORT_ULONG(IN PULONG Port,IN ULONG Value)11554 WRITE_PORT_ULONG(
11555   IN PULONG Port,
11556   IN ULONG Value)
11557 {
11558   __outdword((USHORT)(ULONG_PTR)Port, Value);
11559 }
11560 
11561 FORCEINLINE
11562 VOID
WRITE_PORT_USHORT(IN PUSHORT Port,IN USHORT Value)11563 WRITE_PORT_USHORT(
11564   IN PUSHORT Port,
11565   IN USHORT Value)
11566 {
11567   __outword((USHORT)(ULONG_PTR)Port, Value);
11568 }
11569 
11570 FORCEINLINE
11571 VOID
WRITE_REGISTER_BUFFER_UCHAR(IN PUCHAR Register,IN PUCHAR Buffer,IN ULONG Count)11572 WRITE_REGISTER_BUFFER_UCHAR(
11573   IN PUCHAR Register,
11574   IN PUCHAR Buffer,
11575   IN ULONG Count)
11576 {
11577   LONG Synch;
11578   __movsb(Register, Buffer, Count);
11579   InterlockedOr(&Synch, 1);
11580 }
11581 
11582 FORCEINLINE
11583 VOID
WRITE_REGISTER_BUFFER_ULONG(IN PULONG Register,IN PULONG Buffer,IN ULONG Count)11584 WRITE_REGISTER_BUFFER_ULONG(
11585   IN PULONG Register,
11586   IN PULONG Buffer,
11587   IN ULONG Count)
11588 {
11589   LONG Synch;
11590   __movsd(Register, Buffer, Count);
11591   InterlockedOr(&Synch, 1);
11592 }
11593 
11594 FORCEINLINE
11595 VOID
WRITE_REGISTER_BUFFER_USHORT(IN PUSHORT Register,IN PUSHORT Buffer,IN ULONG Count)11596 WRITE_REGISTER_BUFFER_USHORT(
11597   IN PUSHORT Register,
11598   IN PUSHORT Buffer,
11599   IN ULONG Count)
11600 {
11601   LONG Synch;
11602   __movsw(Register, Buffer, Count);
11603   InterlockedOr(&Synch, 1);
11604 }
11605 
11606 FORCEINLINE
11607 VOID
WRITE_REGISTER_UCHAR(IN volatile UCHAR * Register,IN UCHAR Value)11608 WRITE_REGISTER_UCHAR(
11609   IN volatile UCHAR *Register,
11610   IN UCHAR Value)
11611 {
11612   LONG Synch;
11613   *Register = Value;
11614   InterlockedOr(&Synch, 1);
11615 }
11616 
11617 FORCEINLINE
11618 VOID
WRITE_REGISTER_ULONG(IN volatile ULONG * Register,IN ULONG Value)11619 WRITE_REGISTER_ULONG(
11620   IN volatile ULONG *Register,
11621   IN ULONG Value)
11622 {
11623   LONG Synch;
11624   *Register = Value;
11625   InterlockedOr(&Synch, 1);
11626 }
11627 
11628 FORCEINLINE
11629 VOID
WRITE_REGISTER_USHORT(IN volatile USHORT * Register,IN USHORT Value)11630 WRITE_REGISTER_USHORT(
11631   IN volatile USHORT *Register,
11632   IN USHORT Value)
11633 {
11634   LONG Sync;
11635   *Register = Value;
11636   InterlockedOr(&Sync, 1);
11637 }
11638 #endif
11639 
11640 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
11641    (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11642 
11643 #define DMA_MACROS_DEFINED
11644 
11645 FORCEINLINE
11646 NTSTATUS
IoAllocateAdapterChannel(IN PDMA_ADAPTER DmaAdapter,IN PDEVICE_OBJECT DeviceObject,IN ULONG NumberOfMapRegisters,IN PDRIVER_CONTROL ExecutionRoutine,IN PVOID Context)11647 IoAllocateAdapterChannel(
11648   IN PDMA_ADAPTER DmaAdapter,
11649   IN PDEVICE_OBJECT DeviceObject,
11650   IN ULONG NumberOfMapRegisters,
11651   IN PDRIVER_CONTROL ExecutionRoutine,
11652   IN PVOID Context)
11653 {
11654   PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
11655   AllocateAdapterChannel =
11656       *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
11657   ASSERT(AllocateAdapterChannel);
11658   return AllocateAdapterChannel(DmaAdapter,
11659                                 DeviceObject,
11660                                 NumberOfMapRegisters,
11661                                 ExecutionRoutine,
11662                                 Context );
11663 }
11664 
11665 FORCEINLINE
11666 BOOLEAN
11667 NTAPI
IoFlushAdapterBuffers(IN PDMA_ADAPTER DmaAdapter,IN PMDL Mdl,IN PVOID MapRegisterBase,IN PVOID CurrentVa,IN ULONG Length,IN BOOLEAN WriteToDevice)11668 IoFlushAdapterBuffers(
11669   IN PDMA_ADAPTER DmaAdapter,
11670   IN PMDL Mdl,
11671   IN PVOID MapRegisterBase,
11672   IN PVOID CurrentVa,
11673   IN ULONG Length,
11674   IN BOOLEAN WriteToDevice)
11675 {
11676   PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
11677   FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
11678   ASSERT(FlushAdapterBuffers);
11679   return FlushAdapterBuffers(DmaAdapter,
11680                              Mdl,
11681                              MapRegisterBase,
11682                              CurrentVa,
11683                              Length,
11684                              WriteToDevice);
11685 }
11686 
11687 FORCEINLINE
11688 VOID
11689 NTAPI
IoFreeAdapterChannel(IN PDMA_ADAPTER DmaAdapter)11690 IoFreeAdapterChannel(
11691   IN PDMA_ADAPTER DmaAdapter)
11692 {
11693   PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
11694   FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
11695   ASSERT(FreeAdapterChannel);
11696   FreeAdapterChannel(DmaAdapter);
11697 }
11698 
11699 FORCEINLINE
11700 VOID
11701 NTAPI
IoFreeMapRegisters(IN PDMA_ADAPTER DmaAdapter,IN PVOID MapRegisterBase,IN ULONG NumberOfMapRegisters)11702 IoFreeMapRegisters(
11703   IN PDMA_ADAPTER DmaAdapter,
11704   IN PVOID MapRegisterBase,
11705   IN ULONG NumberOfMapRegisters)
11706 {
11707   PFREE_MAP_REGISTERS FreeMapRegisters;
11708   FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
11709   ASSERT(FreeMapRegisters);
11710   FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
11711 }
11712 
11713 FORCEINLINE
11714 PHYSICAL_ADDRESS
11715 NTAPI
IoMapTransfer(IN PDMA_ADAPTER DmaAdapter,IN PMDL Mdl,IN PVOID MapRegisterBase,IN PVOID CurrentVa,IN OUT PULONG Length,IN BOOLEAN WriteToDevice)11716 IoMapTransfer(
11717   IN PDMA_ADAPTER DmaAdapter,
11718   IN PMDL Mdl,
11719   IN PVOID MapRegisterBase,
11720   IN PVOID CurrentVa,
11721   IN OUT PULONG Length,
11722   IN BOOLEAN WriteToDevice)
11723 {
11724   PMAP_TRANSFER MapTransfer;
11725 
11726   MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
11727   ASSERT(MapTransfer);
11728   return MapTransfer(DmaAdapter,
11729                      Mdl,
11730                      MapRegisterBase,
11731                      CurrentVa,
11732                      Length,
11733                      WriteToDevice);
11734 }
11735 #endif
11736 
11737 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11738 
11739 NTKERNELAPI
11740 VOID
11741 NTAPI
11742 IoAcquireCancelSpinLock(
11743   OUT PKIRQL Irql);
11744 
11745 NTKERNELAPI
11746 NTSTATUS
11747 NTAPI
11748 IoAcquireRemoveLockEx(
11749   IN PIO_REMOVE_LOCK RemoveLock,
11750   IN PVOID Tag OPTIONAL,
11751   IN PCSTR File,
11752   IN ULONG Line,
11753   IN ULONG RemlockSize);
11754 NTKERNELAPI
11755 NTSTATUS
11756 NTAPI
11757 IoAllocateDriverObjectExtension(
11758   IN PDRIVER_OBJECT DriverObject,
11759   IN PVOID ClientIdentificationAddress,
11760   IN ULONG DriverObjectExtensionSize,
11761   OUT PVOID *DriverObjectExtension);
11762 
11763 NTKERNELAPI
11764 PVOID
11765 NTAPI
11766 IoAllocateErrorLogEntry(
11767   IN PVOID IoObject,
11768   IN UCHAR EntrySize);
11769 
11770 NTKERNELAPI
11771 PIRP
11772 NTAPI
11773 IoAllocateIrp(
11774   IN CCHAR StackSize,
11775   IN BOOLEAN ChargeQuota);
11776 
11777 NTKERNELAPI
11778 PMDL
11779 NTAPI
11780 IoAllocateMdl(
11781   IN PVOID VirtualAddress OPTIONAL,
11782   IN ULONG Length,
11783   IN BOOLEAN SecondaryBuffer,
11784   IN BOOLEAN ChargeQuota,
11785   IN OUT PIRP Irp OPTIONAL);
11786 
11787 NTKERNELAPI
11788 PIO_WORKITEM
11789 NTAPI
11790 IoAllocateWorkItem(
11791   IN PDEVICE_OBJECT DeviceObject);
11792 
11793 NTKERNELAPI
11794 NTSTATUS
11795 NTAPI
11796 IoAttachDevice(
11797   IN PDEVICE_OBJECT SourceDevice,
11798   IN PUNICODE_STRING TargetDevice,
11799   OUT PDEVICE_OBJECT *AttachedDevice);
11800 
11801 NTKERNELAPI
11802 PDEVICE_OBJECT
11803 NTAPI
11804 IoAttachDeviceToDeviceStack(
11805   IN PDEVICE_OBJECT SourceDevice,
11806   IN PDEVICE_OBJECT TargetDevice);
11807 
11808 NTKERNELAPI
11809 PIRP
11810 NTAPI
11811 IoBuildAsynchronousFsdRequest(
11812   IN ULONG MajorFunction,
11813   IN PDEVICE_OBJECT DeviceObject,
11814   IN OUT PVOID Buffer OPTIONAL,
11815   IN ULONG Length OPTIONAL,
11816   IN PLARGE_INTEGER StartingOffset OPTIONAL,
11817   IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
11818 
11819 NTKERNELAPI
11820 PIRP
11821 NTAPI
11822 IoBuildDeviceIoControlRequest(
11823   IN ULONG IoControlCode,
11824   IN PDEVICE_OBJECT DeviceObject,
11825   IN PVOID InputBuffer OPTIONAL,
11826   IN ULONG InputBufferLength,
11827   OUT PVOID OutputBuffer OPTIONAL,
11828   IN ULONG OutputBufferLength,
11829   IN BOOLEAN InternalDeviceIoControl,
11830   IN PKEVENT Event,
11831   OUT PIO_STATUS_BLOCK IoStatusBlock);
11832 
11833 NTKERNELAPI
11834 VOID
11835 NTAPI
11836 IoBuildPartialMdl(
11837   IN PMDL SourceMdl,
11838   IN OUT PMDL TargetMdl,
11839   IN PVOID VirtualAddress,
11840   IN ULONG Length);
11841 
11842 NTKERNELAPI
11843 PIRP
11844 NTAPI
11845 IoBuildSynchronousFsdRequest(
11846   IN ULONG MajorFunction,
11847   IN PDEVICE_OBJECT DeviceObject,
11848   IN OUT PVOID Buffer OPTIONAL,
11849   IN ULONG Length OPTIONAL,
11850   IN PLARGE_INTEGER StartingOffset OPTIONAL,
11851   IN PKEVENT Event,
11852   OUT PIO_STATUS_BLOCK IoStatusBlock);
11853 
11854 NTKERNELAPI
11855 NTSTATUS
11856 FASTCALL
11857 IofCallDriver(
11858   IN PDEVICE_OBJECT DeviceObject,
11859   IN OUT PIRP Irp);
11860 #define IoCallDriver IofCallDriver
11861 
11862 NTKERNELAPI
11863 VOID
11864 FASTCALL
11865 IofCompleteRequest(
11866   IN PIRP Irp,
11867   IN CCHAR PriorityBoost);
11868 #define IoCompleteRequest IofCompleteRequest
11869 
11870 NTKERNELAPI
11871 BOOLEAN
11872 NTAPI
11873 IoCancelIrp(
11874   IN PIRP Irp);
11875 
11876 NTKERNELAPI
11877 NTSTATUS
11878 NTAPI
11879 IoCheckShareAccess(
11880   IN ACCESS_MASK DesiredAccess,
11881   IN ULONG DesiredShareAccess,
11882   IN OUT PFILE_OBJECT FileObject,
11883   IN OUT PSHARE_ACCESS ShareAccess,
11884   IN BOOLEAN Update);
11885 
11886 NTKERNELAPI
11887 VOID
11888 FASTCALL
11889 IofCompleteRequest(
11890   IN PIRP Irp,
11891   IN CCHAR PriorityBoost);
11892 
11893 NTKERNELAPI
11894 NTSTATUS
11895 NTAPI
11896 IoConnectInterrupt(
11897   OUT PKINTERRUPT *InterruptObject,
11898   IN PKSERVICE_ROUTINE ServiceRoutine,
11899   IN PVOID ServiceContext OPTIONAL,
11900   IN PKSPIN_LOCK SpinLock OPTIONAL,
11901   IN ULONG Vector,
11902   IN KIRQL Irql,
11903   IN KIRQL SynchronizeIrql,
11904   IN KINTERRUPT_MODE InterruptMode,
11905   IN BOOLEAN ShareVector,
11906   IN KAFFINITY ProcessorEnableMask,
11907   IN BOOLEAN FloatingSave);
11908 
11909 NTKERNELAPI
11910 NTSTATUS
11911 NTAPI
11912 IoCreateDevice(
11913   IN PDRIVER_OBJECT DriverObject,
11914   IN ULONG DeviceExtensionSize,
11915   IN PUNICODE_STRING DeviceName OPTIONAL,
11916   IN DEVICE_TYPE DeviceType,
11917   IN ULONG DeviceCharacteristics,
11918   IN BOOLEAN Exclusive,
11919   OUT PDEVICE_OBJECT *DeviceObject);
11920 
11921 NTKERNELAPI
11922 NTSTATUS
11923 NTAPI
11924 IoCreateFile(
11925   OUT PHANDLE FileHandle,
11926   IN ACCESS_MASK DesiredAccess,
11927   IN POBJECT_ATTRIBUTES ObjectAttributes,
11928   OUT PIO_STATUS_BLOCK IoStatusBlock,
11929   IN PLARGE_INTEGER AllocationSize OPTIONAL,
11930   IN ULONG FileAttributes,
11931   IN ULONG ShareAccess,
11932   IN ULONG Disposition,
11933   IN ULONG CreateOptions,
11934   IN PVOID EaBuffer OPTIONAL,
11935   IN ULONG EaLength,
11936   IN CREATE_FILE_TYPE CreateFileType,
11937   IN PVOID InternalParameters OPTIONAL,
11938   IN ULONG Options);
11939 
11940 NTKERNELAPI
11941 PKEVENT
11942 NTAPI
11943 IoCreateNotificationEvent(
11944   IN PUNICODE_STRING EventName,
11945   OUT PHANDLE EventHandle);
11946 
11947 NTKERNELAPI
11948 NTSTATUS
11949 NTAPI
11950 IoCreateSymbolicLink(
11951   IN PUNICODE_STRING SymbolicLinkName,
11952   IN PUNICODE_STRING DeviceName);
11953 
11954 NTKERNELAPI
11955 PKEVENT
11956 NTAPI
11957 IoCreateSynchronizationEvent(
11958   IN PUNICODE_STRING EventName,
11959   OUT PHANDLE EventHandle);
11960 
11961 NTKERNELAPI
11962 NTSTATUS
11963 NTAPI
11964 IoCreateUnprotectedSymbolicLink(
11965   IN PUNICODE_STRING SymbolicLinkName,
11966   IN PUNICODE_STRING DeviceName);
11967 
11968 NTKERNELAPI
11969 VOID
11970 NTAPI
11971 IoDeleteDevice(
11972   IN PDEVICE_OBJECT DeviceObject);
11973 
11974 NTKERNELAPI
11975 NTSTATUS
11976 NTAPI
11977 IoDeleteSymbolicLink(
11978   IN PUNICODE_STRING SymbolicLinkName);
11979 
11980 NTKERNELAPI
11981 VOID
11982 NTAPI
11983 IoDetachDevice(
11984   IN OUT PDEVICE_OBJECT TargetDevice);
11985 
11986 NTKERNELAPI
11987 VOID
11988 NTAPI
11989 IoDisconnectInterrupt(
11990   IN PKINTERRUPT InterruptObject);
11991 
11992 NTKERNELAPI
11993 VOID
11994 NTAPI
11995 IoFreeIrp(
11996   IN PIRP Irp);
11997 
11998 NTKERNELAPI
11999 VOID
12000 NTAPI
12001 IoFreeMdl(
12002   IN PMDL Mdl);
12003 
12004 NTKERNELAPI
12005 VOID
12006 NTAPI
12007 IoFreeWorkItem(
12008   IN PIO_WORKITEM IoWorkItem);
12009 
12010 NTKERNELAPI
12011 PDEVICE_OBJECT
12012 NTAPI
12013 IoGetAttachedDevice(
12014   IN PDEVICE_OBJECT DeviceObject);
12015 
12016 NTKERNELAPI
12017 PDEVICE_OBJECT
12018 NTAPI
12019 IoGetAttachedDeviceReference(
12020   IN PDEVICE_OBJECT DeviceObject);
12021 
12022 NTKERNELAPI
12023 NTSTATUS
12024 NTAPI
12025 IoGetBootDiskInformation(
12026   IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
12027   IN ULONG Size);
12028 
12029 NTKERNELAPI
12030 NTSTATUS
12031 NTAPI
12032 IoGetDeviceInterfaceAlias(
12033   IN PUNICODE_STRING SymbolicLinkName,
12034   IN CONST GUID *AliasInterfaceClassGuid,
12035   OUT PUNICODE_STRING AliasSymbolicLinkName);
12036 
12037 NTKERNELAPI
12038 PEPROCESS
12039 NTAPI
12040 IoGetCurrentProcess(VOID);
12041 
12042 NTKERNELAPI
12043 NTSTATUS
12044 NTAPI
12045 IoGetDeviceInterfaces(
12046   IN CONST GUID *InterfaceClassGuid,
12047   IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12048   IN ULONG Flags,
12049   OUT PWSTR *SymbolicLinkList);
12050 
12051 NTKERNELAPI
12052 NTSTATUS
12053 NTAPI
12054 IoGetDeviceObjectPointer(
12055   IN PUNICODE_STRING ObjectName,
12056   IN ACCESS_MASK DesiredAccess,
12057   OUT PFILE_OBJECT *FileObject,
12058   OUT PDEVICE_OBJECT *DeviceObject);
12059 
12060 NTKERNELAPI
12061 NTSTATUS
12062 NTAPI
12063 IoGetDeviceProperty(
12064   IN PDEVICE_OBJECT DeviceObject,
12065   IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
12066   IN ULONG BufferLength,
12067   OUT PVOID PropertyBuffer,
12068   OUT PULONG ResultLength);
12069 
12070 NTKERNELAPI
12071 PDMA_ADAPTER
12072 NTAPI
12073 IoGetDmaAdapter(
12074   IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12075   IN PDEVICE_DESCRIPTION DeviceDescription,
12076   IN OUT PULONG NumberOfMapRegisters);
12077 
12078 NTKERNELAPI
12079 PVOID
12080 NTAPI
12081 IoGetDriverObjectExtension(
12082   IN PDRIVER_OBJECT DriverObject,
12083   IN PVOID ClientIdentificationAddress);
12084 
12085 NTKERNELAPI
12086 PVOID
12087 NTAPI
12088 IoGetInitialStack(VOID);
12089 
12090 NTKERNELAPI
12091 PDEVICE_OBJECT
12092 NTAPI
12093 IoGetRelatedDeviceObject(
12094   IN PFILE_OBJECT FileObject);
12095 
12096 NTKERNELAPI
12097 VOID
12098 NTAPI
12099 IoQueueWorkItem(
12100   IN PIO_WORKITEM IoWorkItem,
12101   IN PIO_WORKITEM_ROUTINE WorkerRoutine,
12102   IN WORK_QUEUE_TYPE QueueType,
12103   IN PVOID Context OPTIONAL);
12104 
12105 NTKERNELAPI
12106 VOID
12107 NTAPI
12108 IoInitializeIrp(
12109   IN OUT PIRP Irp,
12110   IN USHORT PacketSize,
12111   IN CCHAR StackSize);
12112 
12113 NTKERNELAPI
12114 VOID
12115 NTAPI
12116 IoInitializeRemoveLockEx(
12117   IN PIO_REMOVE_LOCK Lock,
12118   IN ULONG AllocateTag,
12119   IN ULONG MaxLockedMinutes,
12120   IN ULONG HighWatermark,
12121   IN ULONG RemlockSize);
12122 
12123 NTKERNELAPI
12124 NTSTATUS
12125 NTAPI
12126 IoInitializeTimer(
12127   IN PDEVICE_OBJECT DeviceObject,
12128   IN PIO_TIMER_ROUTINE TimerRoutine,
12129   IN PVOID Context OPTIONAL);
12130 
12131 NTKERNELAPI
12132 VOID
12133 NTAPI
12134 IoInvalidateDeviceRelations(
12135   IN PDEVICE_OBJECT DeviceObject,
12136   IN DEVICE_RELATION_TYPE Type);
12137 
12138 NTKERNELAPI
12139 VOID
12140 NTAPI
12141 IoInvalidateDeviceState(
12142   IN PDEVICE_OBJECT PhysicalDeviceObject);
12143 
12144 NTKERNELAPI
12145 BOOLEAN
12146 NTAPI
12147 IoIsWdmVersionAvailable(
12148   IN UCHAR MajorVersion,
12149   IN UCHAR MinorVersion);
12150 
12151 NTKERNELAPI
12152 NTSTATUS
12153 NTAPI
12154 IoOpenDeviceInterfaceRegistryKey(
12155   IN PUNICODE_STRING SymbolicLinkName,
12156   IN ACCESS_MASK DesiredAccess,
12157   OUT PHANDLE DeviceInterfaceKey);
12158 
12159 NTKERNELAPI
12160 NTSTATUS
12161 NTAPI
12162 IoOpenDeviceRegistryKey(
12163   IN PDEVICE_OBJECT DeviceObject,
12164   IN ULONG DevInstKeyType,
12165   IN ACCESS_MASK DesiredAccess,
12166   OUT PHANDLE DevInstRegKey);
12167 
12168 NTKERNELAPI
12169 NTSTATUS
12170 NTAPI
12171 IoRegisterDeviceInterface(
12172   IN PDEVICE_OBJECT PhysicalDeviceObject,
12173   IN CONST GUID *InterfaceClassGuid,
12174   IN PUNICODE_STRING ReferenceString OPTIONAL,
12175   OUT PUNICODE_STRING SymbolicLinkName);
12176 
12177 NTKERNELAPI
12178 NTSTATUS
12179 NTAPI
12180 IoRegisterPlugPlayNotification(
12181   IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
12182   IN ULONG EventCategoryFlags,
12183   IN PVOID EventCategoryData OPTIONAL,
12184   IN PDRIVER_OBJECT DriverObject,
12185   IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
12186   IN OUT PVOID Context OPTIONAL,
12187   OUT PVOID *NotificationEntry);
12188 
12189 NTKERNELAPI
12190 NTSTATUS
12191 NTAPI
12192 IoRegisterShutdownNotification(
12193   IN PDEVICE_OBJECT DeviceObject);
12194 
12195 NTKERNELAPI
12196 VOID
12197 NTAPI
12198 IoReleaseCancelSpinLock(
12199   IN KIRQL Irql);
12200 
12201 NTKERNELAPI
12202 VOID
12203 NTAPI
12204 IoReleaseRemoveLockAndWaitEx(
12205   IN PIO_REMOVE_LOCK RemoveLock,
12206   IN PVOID Tag OPTIONAL,
12207   IN ULONG RemlockSize);
12208 
12209 NTKERNELAPI
12210 VOID
12211 NTAPI
12212 IoReleaseRemoveLockEx(
12213   IN PIO_REMOVE_LOCK RemoveLock,
12214   IN PVOID Tag OPTIONAL,
12215   IN ULONG RemlockSize);
12216 
12217 NTKERNELAPI
12218 VOID
12219 NTAPI
12220 IoRemoveShareAccess(
12221   IN PFILE_OBJECT FileObject,
12222   IN OUT PSHARE_ACCESS ShareAccess);
12223 
12224 NTKERNELAPI
12225 NTSTATUS
12226 NTAPI
12227 IoReportTargetDeviceChange(
12228   IN PDEVICE_OBJECT PhysicalDeviceObject,
12229   IN PVOID NotificationStructure);
12230 
12231 NTKERNELAPI
12232 NTSTATUS
12233 NTAPI
12234 IoReportTargetDeviceChangeAsynchronous(
12235   IN PDEVICE_OBJECT PhysicalDeviceObject,
12236   IN PVOID NotificationStructure,
12237   IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
12238   IN PVOID Context OPTIONAL);
12239 
12240 NTKERNELAPI
12241 VOID
12242 NTAPI
12243 IoRequestDeviceEject(
12244   IN PDEVICE_OBJECT PhysicalDeviceObject);
12245 
12246 NTKERNELAPI
12247 VOID
12248 NTAPI
12249 IoReuseIrp(
12250   IN OUT PIRP Irp,
12251   IN NTSTATUS Status);
12252 
12253 NTKERNELAPI
12254 NTSTATUS
12255 NTAPI
12256 IoSetDeviceInterfaceState(
12257   IN PUNICODE_STRING SymbolicLinkName,
12258   IN BOOLEAN Enable);
12259 
12260 NTKERNELAPI
12261 VOID
12262 NTAPI
12263 IoSetShareAccess(
12264   IN ACCESS_MASK DesiredAccess,
12265   IN ULONG DesiredShareAccess,
12266   IN OUT PFILE_OBJECT FileObject,
12267   OUT PSHARE_ACCESS ShareAccess);
12268 
12269 NTKERNELAPI
12270 VOID
12271 NTAPI
12272 IoStartNextPacket(
12273   IN PDEVICE_OBJECT DeviceObject,
12274   IN BOOLEAN Cancelable);
12275 
12276 NTKERNELAPI
12277 VOID
12278 NTAPI
12279 IoStartNextPacketByKey(
12280   IN PDEVICE_OBJECT DeviceObject,
12281   IN BOOLEAN Cancelable,
12282   IN ULONG Key);
12283 
12284 NTKERNELAPI
12285 VOID
12286 NTAPI
12287 IoStartPacket(
12288   IN PDEVICE_OBJECT DeviceObject,
12289   IN PIRP Irp,
12290   IN PULONG Key OPTIONAL,
12291   IN PDRIVER_CANCEL CancelFunction OPTIONAL);
12292 
12293 NTKERNELAPI
12294 VOID
12295 NTAPI
12296 IoStartTimer(
12297   IN PDEVICE_OBJECT DeviceObject);
12298 
12299 NTKERNELAPI
12300 VOID
12301 NTAPI
12302 IoStopTimer(
12303   IN PDEVICE_OBJECT DeviceObject);
12304 
12305 NTKERNELAPI
12306 NTSTATUS
12307 NTAPI
12308 IoUnregisterPlugPlayNotification(
12309   IN PVOID NotificationEntry);
12310 
12311 NTKERNELAPI
12312 VOID
12313 NTAPI
12314 IoUnregisterShutdownNotification(
12315   IN PDEVICE_OBJECT DeviceObject);
12316 
12317 NTKERNELAPI
12318 VOID
12319 NTAPI
12320 IoUpdateShareAccess(
12321   IN PFILE_OBJECT FileObject,
12322   IN OUT PSHARE_ACCESS ShareAccess);
12323 
12324 NTKERNELAPI
12325 NTSTATUS
12326 NTAPI
12327 IoWMIAllocateInstanceIds(
12328   IN GUID *Guid,
12329   IN ULONG InstanceCount,
12330   OUT ULONG *FirstInstanceId);
12331 
12332 NTKERNELAPI
12333 NTSTATUS
12334 NTAPI
12335 IoWMIQuerySingleInstanceMultiple(
12336   IN PVOID *DataBlockObjectList,
12337   IN PUNICODE_STRING InstanceNames,
12338   IN ULONG ObjectCount,
12339   IN OUT ULONG *InOutBufferSize,
12340   OUT PVOID OutBuffer);
12341 
12342 NTKERNELAPI
12343 NTSTATUS
12344 NTAPI
12345 IoWMIRegistrationControl(
12346   IN PDEVICE_OBJECT DeviceObject,
12347   IN ULONG Action);
12348 
12349 NTKERNELAPI
12350 NTSTATUS
12351 NTAPI
12352 IoWMISuggestInstanceName(
12353   IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
12354   IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
12355   IN BOOLEAN CombineNames,
12356   OUT PUNICODE_STRING SuggestedInstanceName);
12357 
12358 NTKERNELAPI
12359 NTSTATUS
12360 NTAPI
12361 IoWMIWriteEvent(
12362   IN OUT PVOID WnodeEventItem);
12363 
12364 NTKERNELAPI
12365 VOID
12366 NTAPI
12367 IoWriteErrorLogEntry(
12368   IN PVOID ElEntry);
12369 
12370 NTKERNELAPI
12371 PIRP
12372 NTAPI
12373 IoGetTopLevelIrp(VOID);
12374 
12375 NTKERNELAPI
12376 NTSTATUS
12377 NTAPI
12378 IoRegisterLastChanceShutdownNotification(
12379   IN PDEVICE_OBJECT DeviceObject);
12380 
12381 NTKERNELAPI
12382 VOID
12383 NTAPI
12384 IoSetTopLevelIrp(
12385   IN PIRP Irp OPTIONAL);
12386 
12387 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
12388 
12389 
12390 #if (NTDDI_VERSION >= NTDDI_WINXP)
12391 
12392 NTKERNELAPI
12393 NTSTATUS
12394 NTAPI
12395 IoCsqInitialize(
12396   IN PIO_CSQ Csq,
12397   IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
12398   IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
12399   IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
12400   IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
12401   IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
12402   IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
12403 
12404 NTKERNELAPI
12405 VOID
12406 NTAPI
12407 IoCsqInsertIrp(
12408   IN PIO_CSQ Csq,
12409   IN PIRP Irp,
12410   IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
12411 
12412 NTKERNELAPI
12413 PIRP
12414 NTAPI
12415 IoCsqRemoveIrp(
12416   IN PIO_CSQ Csq,
12417   IN PIO_CSQ_IRP_CONTEXT Context);
12418 
12419 NTKERNELAPI
12420 PIRP
12421 NTAPI
12422 IoCsqRemoveNextIrp(
12423   IN PIO_CSQ Csq,
12424   IN PVOID PeekContext OPTIONAL);
12425 
12426 NTKERNELAPI
12427 BOOLEAN
12428 NTAPI
12429 IoForwardIrpSynchronously(
12430   IN PDEVICE_OBJECT DeviceObject,
12431   IN PIRP Irp);
12432 
12433 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
12434 
12435 NTKERNELAPI
12436 VOID
12437 NTAPI
12438 IoFreeErrorLogEntry(
12439   PVOID ElEntry);
12440 
12441 NTKERNELAPI
12442 NTSTATUS
12443 NTAPI
12444 IoSetCompletionRoutineEx(
12445   IN PDEVICE_OBJECT DeviceObject,
12446   IN PIRP Irp,
12447   IN PIO_COMPLETION_ROUTINE CompletionRoutine,
12448   IN PVOID Context,
12449   IN BOOLEAN InvokeOnSuccess,
12450   IN BOOLEAN InvokeOnError,
12451   IN BOOLEAN InvokeOnCancel);
12452 
12453 VOID
12454 NTAPI
12455 IoSetStartIoAttributes(
12456   IN PDEVICE_OBJECT DeviceObject,
12457   IN BOOLEAN DeferredStartIo,
12458   IN BOOLEAN NonCancelable);
12459 
12460 NTKERNELAPI
12461 NTSTATUS
12462 NTAPI
12463 IoWMIDeviceObjectToInstanceName(
12464   IN PVOID DataBlockObject,
12465   IN PDEVICE_OBJECT DeviceObject,
12466   OUT PUNICODE_STRING InstanceName);
12467 
12468 NTKERNELAPI
12469 NTSTATUS
12470 NTAPI
12471 IoWMIExecuteMethod(
12472   IN PVOID DataBlockObject,
12473   IN PUNICODE_STRING InstanceName,
12474   IN ULONG MethodId,
12475   IN ULONG InBufferSize,
12476   IN OUT PULONG OutBufferSize,
12477   IN OUT  PUCHAR InOutBuffer);
12478 
12479 NTKERNELAPI
12480 NTSTATUS
12481 NTAPI
12482 IoWMIHandleToInstanceName(
12483   IN PVOID DataBlockObject,
12484   IN HANDLE FileHandle,
12485   OUT PUNICODE_STRING InstanceName);
12486 
12487 NTKERNELAPI
12488 NTSTATUS
12489 NTAPI
12490 IoWMIOpenBlock(
12491   IN GUID *DataBlockGuid,
12492   IN ULONG DesiredAccess,
12493   OUT PVOID *DataBlockObject);
12494 
12495 NTKERNELAPI
12496 NTSTATUS
12497 NTAPI
12498 IoWMIQueryAllData(
12499   IN PVOID DataBlockObject,
12500   IN OUT ULONG *InOutBufferSize,
12501   OUT PVOID OutBuffer);
12502 
12503 NTKERNELAPI
12504 NTSTATUS
12505 NTAPI
12506 IoWMIQueryAllDataMultiple(
12507   IN PVOID *DataBlockObjectList,
12508   IN ULONG ObjectCount,
12509   IN OUT ULONG *InOutBufferSize,
12510   OUT PVOID OutBuffer);
12511 
12512 NTKERNELAPI
12513 NTSTATUS
12514 NTAPI
12515 IoWMIQuerySingleInstance(
12516   IN PVOID DataBlockObject,
12517   IN PUNICODE_STRING InstanceName,
12518   IN OUT ULONG *InOutBufferSize,
12519   OUT PVOID OutBuffer);
12520 
12521 NTKERNELAPI
12522 NTSTATUS
12523 NTAPI
12524 IoWMISetNotificationCallback(
12525   IN OUT PVOID Object,
12526   IN WMI_NOTIFICATION_CALLBACK Callback,
12527   IN PVOID Context OPTIONAL);
12528 
12529 NTKERNELAPI
12530 NTSTATUS
12531 NTAPI
12532 IoWMISetSingleInstance(
12533   IN PVOID DataBlockObject,
12534   IN PUNICODE_STRING InstanceName,
12535   IN ULONG Version,
12536   IN ULONG ValueBufferSize,
12537   IN PVOID ValueBuffer);
12538 
12539 NTKERNELAPI
12540 NTSTATUS
12541 NTAPI
12542 IoWMISetSingleItem(
12543   IN PVOID DataBlockObject,
12544   IN PUNICODE_STRING InstanceName,
12545   IN ULONG DataItemId,
12546   IN ULONG Version,
12547   IN ULONG ValueBufferSize,
12548   IN PVOID ValueBuffer);
12549 
12550 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
12551 
12552 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
12553 NTKERNELAPI
12554 NTSTATUS
12555 NTAPI
12556 IoValidateDeviceIoControlAccess(
12557   IN PIRP Irp,
12558   IN ULONG RequiredAccess);
12559 #endif
12560 
12561 #if (NTDDI_VERSION >= NTDDI_WS03)
12562 NTKERNELAPI
12563 NTSTATUS
12564 NTAPI
12565 IoCsqInitializeEx(
12566   IN PIO_CSQ Csq,
12567   IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,
12568   IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
12569   IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
12570   IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
12571   IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
12572   IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
12573 
12574 NTKERNELAPI
12575 NTSTATUS
12576 NTAPI
12577 IoCsqInsertIrpEx(
12578   IN PIO_CSQ Csq,
12579   IN PIRP Irp,
12580   IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL,
12581   IN PVOID InsertContext OPTIONAL);
12582 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
12583 
12584 
12585 #if (NTDDI_VERSION >= NTDDI_VISTA)
12586 NTKERNELAPI
12587 NTSTATUS
12588 NTAPI
12589 IoGetBootDiskInformationLite(
12590   OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
12591 
12592 NTKERNELAPI
12593 NTSTATUS
12594 NTAPI
12595 IoCheckShareAccessEx(
12596   IN ACCESS_MASK DesiredAccess,
12597   IN ULONG DesiredShareAccess,
12598   IN OUT PFILE_OBJECT FileObject,
12599   IN OUT PSHARE_ACCESS ShareAccess,
12600   IN BOOLEAN Update,
12601   IN PBOOLEAN WritePermission);
12602 
12603 NTKERNELAPI
12604 NTSTATUS
12605 NTAPI
12606 IoConnectInterruptEx(
12607   IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
12608 
12609 NTKERNELAPI
12610 VOID
12611 NTAPI
12612 IoDisconnectInterruptEx(
12613   IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
12614 
12615 LOGICAL
12616 NTAPI
12617 IoWithinStackLimits(
12618   IN ULONG_PTR RegionStart,
12619   IN SIZE_T RegionSize);
12620 
12621 NTKERNELAPI
12622 VOID
12623 NTAPI
12624 IoSetShareAccessEx(
12625   IN ACCESS_MASK DesiredAccess,
12626   IN ULONG DesiredShareAccess,
12627   IN OUT PFILE_OBJECT FileObject,
12628   OUT PSHARE_ACCESS ShareAccess,
12629   IN PBOOLEAN WritePermission);
12630 
12631 ULONG
12632 NTAPI
12633 IoSizeofWorkItem(VOID);
12634 
12635 VOID
12636 NTAPI
12637 IoInitializeWorkItem(
12638   IN PVOID IoObject,
12639   IN PIO_WORKITEM IoWorkItem);
12640 
12641 VOID
12642 NTAPI
12643 IoUninitializeWorkItem(
12644   IN PIO_WORKITEM IoWorkItem);
12645 
12646 VOID
12647 NTAPI
12648 IoQueueWorkItemEx(
12649   IN PIO_WORKITEM IoWorkItem,
12650   IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
12651   IN WORK_QUEUE_TYPE QueueType,
12652   IN PVOID Context OPTIONAL);
12653 
12654 IO_PRIORITY_HINT
12655 NTAPI
12656 IoGetIoPriorityHint(
12657   IN PIRP Irp);
12658 
12659 NTSTATUS
12660 NTAPI
12661 IoSetIoPriorityHint(
12662   IN PIRP Irp,
12663   IN IO_PRIORITY_HINT PriorityHint);
12664 
12665 NTSTATUS
12666 NTAPI
12667 IoAllocateSfioStreamIdentifier(
12668   IN PFILE_OBJECT FileObject,
12669   IN ULONG Length,
12670   IN PVOID Signature,
12671   OUT PVOID *StreamIdentifier);
12672 
12673 PVOID
12674 NTAPI
12675 IoGetSfioStreamIdentifier(
12676   IN PFILE_OBJECT FileObject,
12677   IN PVOID Signature);
12678 
12679 NTSTATUS
12680 NTAPI
12681 IoFreeSfioStreamIdentifier(
12682   IN PFILE_OBJECT FileObject,
12683   IN PVOID Signature);
12684 
12685 NTKERNELAPI
12686 NTSTATUS
12687 NTAPI
12688 IoRequestDeviceEjectEx(
12689   IN PDEVICE_OBJECT PhysicalDeviceObject,
12690   IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL,
12691   IN PVOID Context OPTIONAL,
12692   IN PDRIVER_OBJECT DriverObject OPTIONAL);
12693 
12694 NTKERNELAPI
12695 NTSTATUS
12696 NTAPI
12697 IoSetDevicePropertyData(
12698   IN PDEVICE_OBJECT     Pdo,
12699   IN CONST DEVPROPKEY   *PropertyKey,
12700   IN LCID               Lcid,
12701   IN ULONG              Flags,
12702   IN DEVPROPTYPE        Type,
12703   IN ULONG              Size,
12704   IN PVOID          Data OPTIONAL);
12705 
12706 NTKERNELAPI
12707 NTSTATUS
12708 NTAPI
12709 IoGetDevicePropertyData(
12710   PDEVICE_OBJECT Pdo,
12711   CONST DEVPROPKEY *PropertyKey,
12712   LCID Lcid,
12713   ULONG Flags,
12714   ULONG Size,
12715   PVOID Data,
12716   PULONG RequiredSize,
12717   PDEVPROPTYPE Type);
12718 
12719 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
12720 
12721 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
12722 
12723 #if (NTDDI_VERSION >= NTDDI_WS08)
12724 NTKERNELAPI
12725 NTSTATUS
12726 NTAPI
12727 IoReplacePartitionUnit(
12728   IN PDEVICE_OBJECT TargetPdo,
12729   IN PDEVICE_OBJECT SparePdo,
12730   IN ULONG Flags);
12731 #endif
12732 
12733 #if (NTDDI_VERSION >= NTDDI_WIN7)
12734 
12735 NTKERNELAPI
12736 NTSTATUS
12737 NTAPI
12738 IoGetAffinityInterrupt(
12739   IN PKINTERRUPT InterruptObject,
12740   OUT PGROUP_AFFINITY GroupAffinity);
12741 
12742 NTSTATUS
12743 NTAPI
12744 IoGetContainerInformation(
12745   IN IO_CONTAINER_INFORMATION_CLASS InformationClass,
12746   IN PVOID ContainerObject OPTIONAL,
12747   IN OUT PVOID Buffer OPTIONAL,
12748   IN ULONG BufferLength);
12749 
12750 NTSTATUS
12751 NTAPI
12752 IoRegisterContainerNotification(
12753   IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass,
12754   IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction,
12755   IN PVOID NotificationInformation OPTIONAL,
12756   IN ULONG NotificationInformationLength,
12757   OUT PVOID CallbackRegistration);
12758 
12759 VOID
12760 NTAPI
12761 IoUnregisterContainerNotification(
12762   IN PVOID CallbackRegistration);
12763 
12764 NTKERNELAPI
12765 NTSTATUS
12766 NTAPI
12767 IoUnregisterPlugPlayNotificationEx(
12768   IN PVOID NotificationEntry);
12769 
12770 NTKERNELAPI
12771 NTSTATUS
12772 NTAPI
12773 IoGetDeviceNumaNode(
12774   IN PDEVICE_OBJECT Pdo,
12775   OUT PUSHORT NodeNumber);
12776 
12777 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
12778 
12779 #if defined(_WIN64)
12780 NTKERNELAPI
12781 ULONG
12782 NTAPI
12783 IoWMIDeviceObjectToProviderId(
12784   IN PDEVICE_OBJECT DeviceObject);
12785 #else
12786 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
12787 #endif
12788 
12789 /*
12790  * USHORT
12791  * IoSizeOfIrp(
12792  *   IN CCHAR  StackSize)
12793  */
12794 #define IoSizeOfIrp(_StackSize) \
12795   ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
12796 
12797 FORCEINLINE
12798 VOID
IoSkipCurrentIrpStackLocation(IN OUT PIRP Irp)12799 IoSkipCurrentIrpStackLocation(
12800   IN OUT PIRP Irp)
12801 {
12802   ASSERT(Irp->CurrentLocation <= Irp->StackCount);
12803   Irp->CurrentLocation++;
12804 #ifdef NONAMELESSUNION
12805   Irp->Tail.Overlay.s.u.CurrentStackLocation++;
12806 #else
12807   Irp->Tail.Overlay.CurrentStackLocation++;
12808 #endif
12809 }
12810 
12811 FORCEINLINE
12812 VOID
IoSetNextIrpStackLocation(IN OUT PIRP Irp)12813 IoSetNextIrpStackLocation(
12814   IN OUT PIRP Irp)
12815 {
12816   ASSERT(Irp->CurrentLocation > 0);
12817   Irp->CurrentLocation--;
12818 #ifdef NONAMELESSUNION
12819   Irp->Tail.Overlay.s.u.CurrentStackLocation--;
12820 #else
12821   Irp->Tail.Overlay.CurrentStackLocation--;
12822 #endif
12823 }
12824 
12825 FORCEINLINE
12826 PIO_STACK_LOCATION
IoGetNextIrpStackLocation(IN PIRP Irp)12827 IoGetNextIrpStackLocation(
12828   IN PIRP Irp)
12829 {
12830   ASSERT(Irp->CurrentLocation > 0);
12831 #ifdef NONAMELESSUNION
12832   return ((Irp)->Tail.Overlay.s.u.CurrentStackLocation - 1 );
12833 #else
12834   return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
12835 #endif
12836 }
12837 
12838 FORCEINLINE
12839 VOID
IoSetCompletionRoutine(IN PIRP Irp,IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,IN PVOID Context OPTIONAL,IN BOOLEAN InvokeOnSuccess,IN BOOLEAN InvokeOnError,IN BOOLEAN InvokeOnCancel)12840 IoSetCompletionRoutine(
12841   IN PIRP Irp,
12842   IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
12843   IN PVOID Context OPTIONAL,
12844   IN BOOLEAN InvokeOnSuccess,
12845   IN BOOLEAN InvokeOnError,
12846   IN BOOLEAN InvokeOnCancel)
12847 {
12848   PIO_STACK_LOCATION irpSp;
12849   ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
12850   irpSp = IoGetNextIrpStackLocation(Irp);
12851   irpSp->CompletionRoutine = CompletionRoutine;
12852   irpSp->Context = Context;
12853   irpSp->Control = 0;
12854 
12855   if (InvokeOnSuccess) {
12856     irpSp->Control = SL_INVOKE_ON_SUCCESS;
12857   }
12858 
12859   if (InvokeOnError) {
12860     irpSp->Control |= SL_INVOKE_ON_ERROR;
12861   }
12862 
12863   if (InvokeOnCancel) {
12864     irpSp->Control |= SL_INVOKE_ON_CANCEL;
12865   }
12866 }
12867 
12868 /*
12869  * PDRIVER_CANCEL
12870  * IoSetCancelRoutine(
12871  *   IN PIRP  Irp,
12872  *   IN PDRIVER_CANCEL  CancelRoutine)
12873  */
12874 #define IoSetCancelRoutine(_Irp, \
12875                            _CancelRoutine) \
12876   ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
12877     (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
12878 
12879 /*
12880  * VOID
12881  * IoRequestDpc(
12882  *   IN PDEVICE_OBJECT  DeviceObject,
12883  *   IN PIRP  Irp,
12884  *   IN PVOID  Context);
12885  */
12886 #define IoRequestDpc(DeviceObject, Irp, Context)( \
12887   KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
12888 
12889 /*
12890  * VOID
12891  * IoReleaseRemoveLock(
12892  *   IN PIO_REMOVE_LOCK  RemoveLock,
12893  *   IN PVOID  Tag)
12894  */
12895 #define IoReleaseRemoveLock(_RemoveLock, \
12896                             _Tag) \
12897   IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
12898 
12899 /*
12900  * VOID
12901  * IoReleaseRemoveLockAndWait(
12902  *   IN PIO_REMOVE_LOCK  RemoveLock,
12903  *   IN PVOID  Tag)
12904  */
12905 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
12906                                    _Tag) \
12907   IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
12908 
12909 #if defined(_WIN64)
12910 NTKERNELAPI
12911 BOOLEAN
12912 IoIs32bitProcess(
12913   IN PIRP Irp OPTIONAL);
12914 #endif
12915 
12916 #define PLUGPLAY_REGKEY_DEVICE                            1
12917 #define PLUGPLAY_REGKEY_DRIVER                            2
12918 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE                 4
12919 
12920 FORCEINLINE
12921 PIO_STACK_LOCATION
IoGetCurrentIrpStackLocation(IN PIRP Irp)12922 IoGetCurrentIrpStackLocation(
12923   IN PIRP Irp)
12924 {
12925   ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
12926 #ifdef NONAMELESSUNION
12927   return Irp->Tail.Overlay.s.u.CurrentStackLocation;
12928 #else
12929   return Irp->Tail.Overlay.CurrentStackLocation;
12930 #endif
12931 }
12932 
12933 FORCEINLINE
12934 VOID
IoMarkIrpPending(IN OUT PIRP Irp)12935 IoMarkIrpPending(
12936   IN OUT PIRP Irp)
12937 {
12938   IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
12939 }
12940 
12941 /*
12942  * BOOLEAN
12943  * IoIsErrorUserInduced(
12944  *   IN NTSTATUS  Status);
12945  */
12946 #define IoIsErrorUserInduced(Status) \
12947    ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
12948    ((Status) == STATUS_IO_TIMEOUT) || \
12949    ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
12950    ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
12951    ((Status) == STATUS_VERIFY_REQUIRED) || \
12952    ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
12953    ((Status) == STATUS_WRONG_VOLUME)))
12954 
12955 /* VOID
12956  * IoInitializeRemoveLock(
12957  *   IN PIO_REMOVE_LOCK  Lock,
12958  *   IN ULONG  AllocateTag,
12959  *   IN ULONG  MaxLockedMinutes,
12960  *   IN ULONG  HighWatermark)
12961  */
12962 #define IoInitializeRemoveLock( \
12963   Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
12964   IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
12965     HighWatermark, sizeof(IO_REMOVE_LOCK))
12966 
12967 FORCEINLINE
12968 VOID
IoInitializeDpcRequest(IN PDEVICE_OBJECT DeviceObject,IN PIO_DPC_ROUTINE DpcRoutine)12969 IoInitializeDpcRequest(
12970   IN PDEVICE_OBJECT DeviceObject,
12971   IN PIO_DPC_ROUTINE DpcRoutine)
12972 {
12973   KeInitializeDpc( &DeviceObject->Dpc,
12974                    (PKDEFERRED_ROUTINE) DpcRoutine,
12975                    DeviceObject );
12976 }
12977 
12978 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
12979 
12980 /*
12981  * ULONG
12982  * IoGetFunctionCodeFromCtlCode(
12983  *   IN ULONG  ControlCode)
12984  */
12985 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
12986   (((_ControlCode) >> 2) & 0x00000FFF)
12987 
12988 FORCEINLINE
12989 VOID
IoCopyCurrentIrpStackLocationToNext(IN OUT PIRP Irp)12990 IoCopyCurrentIrpStackLocationToNext(
12991   IN OUT PIRP Irp)
12992 {
12993   PIO_STACK_LOCATION irpSp;
12994   PIO_STACK_LOCATION nextIrpSp;
12995   irpSp = IoGetCurrentIrpStackLocation(Irp);
12996   nextIrpSp = IoGetNextIrpStackLocation(Irp);
12997   RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
12998   nextIrpSp->Control = 0;
12999 }
13000 
13001 NTKERNELAPI
13002 VOID
13003 NTAPI
13004 IoGetStackLimits(
13005   OUT PULONG_PTR LowLimit,
13006   OUT PULONG_PTR HighLimit);
13007 
13008 FORCEINLINE
13009 ULONG_PTR
IoGetRemainingStackSize(VOID)13010 IoGetRemainingStackSize(VOID)
13011 {
13012   ULONG_PTR End, Begin;
13013   ULONG_PTR Result;
13014 
13015   IoGetStackLimits(&Begin, &End);
13016   Result = (ULONG_PTR)(&End) - Begin;
13017   return Result;
13018 }
13019 
13020 #if (NTDDI_VERSION >= NTDDI_WS03)
13021 FORCEINLINE
13022 VOID
IoInitializeThreadedDpcRequest(IN PDEVICE_OBJECT DeviceObject,IN PIO_DPC_ROUTINE DpcRoutine)13023 IoInitializeThreadedDpcRequest(
13024   IN PDEVICE_OBJECT DeviceObject,
13025   IN PIO_DPC_ROUTINE DpcRoutine)
13026 {
13027   KeInitializeThreadedDpc(&DeviceObject->Dpc,
13028                           (PKDEFERRED_ROUTINE) DpcRoutine,
13029                           DeviceObject );
13030 }
13031 #endif
13032 
13033 /******************************************************************************
13034  *                     Power Management Support Functions                     *
13035  ******************************************************************************/
13036 
13037 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
13038 
13039 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13040 
13041 NTKERNELAPI
13042 NTSTATUS
13043 NTAPI
13044 PoCallDriver(
13045   IN struct _DEVICE_OBJECT *DeviceObject,
13046   IN OUT struct _IRP *Irp);
13047 
13048 NTKERNELAPI
13049 PULONG
13050 NTAPI
13051 PoRegisterDeviceForIdleDetection(
13052   IN struct _DEVICE_OBJECT *DeviceObject,
13053   IN ULONG ConservationIdleTime,
13054   IN ULONG PerformanceIdleTime,
13055   IN DEVICE_POWER_STATE State);
13056 
13057 NTKERNELAPI
13058 PVOID
13059 NTAPI
13060 PoRegisterSystemState(
13061   IN OUT PVOID StateHandle OPTIONAL,
13062   IN EXECUTION_STATE Flags);
13063 
13064 NTKERNELAPI
13065 NTSTATUS
13066 NTAPI
13067 PoRequestPowerIrp(
13068   IN struct _DEVICE_OBJECT *DeviceObject,
13069   IN UCHAR MinorFunction,
13070   IN POWER_STATE PowerState,
13071   IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
13072   IN PVOID Context OPTIONAL,
13073   OUT struct _IRP **Irp OPTIONAL);
13074 
13075 NTKERNELAPI
13076 POWER_STATE
13077 NTAPI
13078 PoSetPowerState(
13079   IN struct _DEVICE_OBJECT *DeviceObject,
13080   IN POWER_STATE_TYPE Type,
13081   IN POWER_STATE State);
13082 
13083 NTKERNELAPI
13084 VOID
13085 NTAPI
13086 PoSetSystemState(
13087   IN EXECUTION_STATE Flags);
13088 
13089 NTKERNELAPI
13090 VOID
13091 NTAPI
13092 PoStartNextPowerIrp(
13093   IN OUT struct _IRP *Irp);
13094 
13095 NTKERNELAPI
13096 VOID
13097 NTAPI
13098 PoUnregisterSystemState(
13099   IN OUT PVOID StateHandle);
13100 
13101 NTKERNELAPI
13102 NTSTATUS
13103 NTAPI
13104 PoRequestShutdownEvent(
13105   OUT PVOID *Event);
13106 
13107 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13108 
13109 #if (NTDDI_VERSION >= NTDDI_VISTA)
13110 
13111 NTKERNELAPI
13112 VOID
13113 NTAPI
13114 PoSetSystemWake(
13115   IN OUT struct _IRP *Irp);
13116 
13117 NTKERNELAPI
13118 BOOLEAN
13119 NTAPI
13120 PoGetSystemWake(
13121   IN struct _IRP *Irp);
13122 
13123 NTKERNELAPI
13124 NTSTATUS
13125 NTAPI
13126 PoRegisterPowerSettingCallback(
13127   IN PDEVICE_OBJECT DeviceObject OPTIONAL,
13128   IN LPCGUID SettingGuid,
13129   IN PPOWER_SETTING_CALLBACK Callback,
13130   IN PVOID Context OPTIONAL,
13131   OUT PVOID *Handle OPTIONAL);
13132 
13133 NTKERNELAPI
13134 NTSTATUS
13135 NTAPI
13136 PoUnregisterPowerSettingCallback(
13137   IN OUT PVOID Handle);
13138 
13139 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13140 
13141 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
13142 NTKERNELAPI
13143 VOID
13144 NTAPI
13145 PoSetDeviceBusyEx(
13146   IN OUT PULONG IdlePointer);
13147 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
13148 
13149 #if (NTDDI_VERSION >= NTDDI_WIN7)
13150 
13151 NTKERNELAPI
13152 VOID
13153 NTAPI
13154 PoStartDeviceBusy(
13155   IN OUT PULONG IdlePointer);
13156 
13157 NTKERNELAPI
13158 VOID
13159 NTAPI
13160 PoEndDeviceBusy(
13161   IN OUT PULONG IdlePointer);
13162 
13163 NTKERNELAPI
13164 BOOLEAN
13165 NTAPI
13166 PoQueryWatchdogTime(
13167   IN PDEVICE_OBJECT Pdo,
13168   OUT PULONG SecondsRemaining);
13169 
13170 NTKERNELAPI
13171 VOID
13172 NTAPI
13173 PoDeletePowerRequest(
13174   IN OUT PVOID PowerRequest);
13175 
13176 NTKERNELAPI
13177 NTSTATUS
13178 NTAPI
13179 PoSetPowerRequest(
13180   IN OUT PVOID PowerRequest,
13181   IN POWER_REQUEST_TYPE Type);
13182 
13183 NTKERNELAPI
13184 NTSTATUS
13185 NTAPI
13186 PoClearPowerRequest(
13187   IN OUT PVOID PowerRequest,
13188   IN POWER_REQUEST_TYPE Type);
13189 
13190 NTKERNELAPI
13191 NTSTATUS
13192 NTAPI
13193 PoCreatePowerRequest(
13194   OUT PVOID *PowerRequest,
13195   IN PDEVICE_OBJECT DeviceObject,
13196   IN PCOUNTED_REASON_CONTEXT Context);
13197 
13198 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13199 
13200 /******************************************************************************
13201  *                          Executive Functions                               *
13202  ******************************************************************************/
13203 
13204 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
13205 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
13206 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
13207 
13208 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
13209 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
13210 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
13211 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
13212 
13213 #define ExInitializeSListHead InitializeSListHead
13214 
13215 #if defined(_NTHAL_) && defined(_X86_)
13216 
13217 NTKERNELAPI
13218 VOID
13219 FASTCALL
13220 ExiAcquireFastMutex(
13221   IN OUT PFAST_MUTEX FastMutex);
13222 
13223 NTKERNELAPI
13224 VOID
13225 FASTCALL
13226 ExiReleaseFastMutex(
13227   IN OUT PFAST_MUTEX FastMutex);
13228 
13229 NTKERNELAPI
13230 BOOLEAN
13231 FASTCALL
13232 ExiTryToAcquireFastMutex(
13233     IN OUT PFAST_MUTEX FastMutex);
13234 
13235 #define ExAcquireFastMutex ExiAcquireFastMutex
13236 #define ExReleaseFastMutex ExiReleaseFastMutex
13237 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
13238 
13239 #else
13240 
13241 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13242 
13243 NTKERNELAPI
13244 VOID
13245 FASTCALL
13246 ExAcquireFastMutex(
13247   IN OUT PFAST_MUTEX FastMutex);
13248 
13249 NTKERNELAPI
13250 VOID
13251 FASTCALL
13252 ExReleaseFastMutex(
13253   IN OUT PFAST_MUTEX FastMutex);
13254 
13255 NTKERNELAPI
13256 BOOLEAN
13257 FASTCALL
13258 ExTryToAcquireFastMutex(
13259   IN OUT PFAST_MUTEX FastMutex);
13260 
13261 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13262 
13263 #endif /* defined(_NTHAL_) && defined(_X86_) */
13264 
13265 #if defined(_X86_)
13266 #define ExInterlockedAddUlong ExfInterlockedAddUlong
13267 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
13268 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
13269 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
13270 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
13271 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
13272 #endif /* defined(_X86_) */
13273 
13274 #if defined(_WIN64)
13275 
13276 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
13277     defined(_NTHAL_) || defined(_NTOSP_)
13278 NTKERNELAPI
13279 USHORT
13280 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
13281 #else
13282 FORCEINLINE
13283 USHORT
ExQueryDepthSList(IN PSLIST_HEADER ListHead)13284 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
13285 {
13286   return (USHORT)(ListHead->Alignment & 0xffff);
13287 }
13288 #endif
13289 
13290 NTKERNELAPI
13291 PSLIST_ENTRY
13292 ExpInterlockedFlushSList(
13293   PSLIST_HEADER ListHead);
13294 
13295 NTKERNELAPI
13296 PSLIST_ENTRY
13297 ExpInterlockedPopEntrySList(
13298   PSLIST_HEADER ListHead);
13299 
13300 NTKERNELAPI
13301 PSLIST_ENTRY
13302 ExpInterlockedPushEntrySList(
13303   PSLIST_HEADER ListHead,
13304   PSLIST_ENTRY ListEntry);
13305 
13306 #define ExInterlockedFlushSList(Head) \
13307     ExpInterlockedFlushSList(Head)
13308 #define ExInterlockedPopEntrySList(Head, Lock) \
13309     ExpInterlockedPopEntrySList(Head)
13310 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
13311     ExpInterlockedPushEntrySList(Head, Entry)
13312 
13313 #else /* !defined(_WIN64) */
13314 
13315 #ifdef NONAMELESSUNION
13316 #define ExQueryDepthSList(listhead) (listhead)->s.Depth
13317 #else
13318 #define ExQueryDepthSList(listhead) (listhead)->Depth
13319 #endif
13320 
13321 NTKERNELAPI
13322 PSINGLE_LIST_ENTRY
13323 FASTCALL
13324 ExInterlockedFlushSList(
13325   IN OUT PSLIST_HEADER ListHead);
13326 
13327 #endif /* !defined(_WIN64) */
13328 
13329 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
13330 
13331 NTKERNELAPI
13332 PSINGLE_LIST_ENTRY
13333 FASTCALL
13334 ExInterlockedPopEntrySList(
13335   IN PSLIST_HEADER ListHead,
13336   IN PKSPIN_LOCK Lock);
13337 
13338 NTKERNELAPI
13339 PSINGLE_LIST_ENTRY
13340 FASTCALL
13341 ExInterlockedPushEntrySList(
13342   IN PSLIST_HEADER ListHead,
13343   IN PSINGLE_LIST_ENTRY ListEntry,
13344   IN PKSPIN_LOCK Lock);
13345 
13346 NTKERNELAPI
13347 PVOID
13348 NTAPI
13349 ExAllocateFromPagedLookasideList(
13350   IN OUT PPAGED_LOOKASIDE_LIST Lookaside);
13351 
13352 NTKERNELAPI
13353 VOID
13354 NTAPI
13355 ExFreeToPagedLookasideList(
13356   IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
13357   IN PVOID Entry);
13358 
13359 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
13360 
13361 #if !defined(_WIN64)
13362 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
13363     InterlockedPopEntrySList(_ListHead)
13364 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
13365     InterlockedPushEntrySList(_ListHead, _ListEntry)
13366 #endif
13367 
13368 static __inline
13369 PVOID
ExAllocateFromPagedLookasideList(IN OUT PPAGED_LOOKASIDE_LIST Lookaside)13370 ExAllocateFromPagedLookasideList(
13371   IN OUT PPAGED_LOOKASIDE_LIST Lookaside)
13372 {
13373   PVOID Entry;
13374 
13375   Lookaside->L.TotalAllocates++;
13376 #ifdef NONAMELESSUNION
13377   Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
13378   if (Entry == NULL) {
13379     Lookaside->L.u2.AllocateMisses++;
13380     Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
13381                                        Lookaside->L.Size,
13382                                        Lookaside->L.Tag);
13383   }
13384 #else /* NONAMELESSUNION */
13385   Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
13386   if (Entry == NULL) {
13387     Lookaside->L.AllocateMisses++;
13388     Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
13389                                     Lookaside->L.Size,
13390                                     Lookaside->L.Tag);
13391   }
13392 #endif /* NONAMELESSUNION */
13393   return Entry;
13394 }
13395 
13396 static __inline
13397 VOID
ExFreeToPagedLookasideList(IN OUT PPAGED_LOOKASIDE_LIST Lookaside,IN PVOID Entry)13398 ExFreeToPagedLookasideList(
13399   IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
13400   IN PVOID Entry)
13401 {
13402   Lookaside->L.TotalFrees++;
13403 #ifdef NONAMELESSUNION
13404   if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
13405     Lookaside->L.u3.FreeMisses++;
13406     (Lookaside->L.u5.Free)(Entry);
13407   } else {
13408     InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
13409   }
13410 #else /* NONAMELESSUNION */
13411   if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
13412     Lookaside->L.FreeMisses++;
13413     (Lookaside->L.Free)(Entry);
13414   } else {
13415     InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
13416   }
13417 #endif /* NONAMELESSUNION */
13418 }
13419 
13420 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
13421 
13422 
13423 /* ERESOURCE_THREAD
13424  * ExGetCurrentResourceThread(
13425  *     VOID);
13426  */
13427 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
13428 
13429 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
13430 
13431 /* VOID
13432  * ExInitializeWorkItem(
13433  *     IN PWORK_QUEUE_ITEM Item,
13434  *     IN PWORKER_THREAD_ROUTINE Routine,
13435  *     IN PVOID Context)
13436  */
13437 #define ExInitializeWorkItem(Item, Routine, Context) \
13438 { \
13439   (Item)->WorkerRoutine = Routine; \
13440   (Item)->Parameter = Context; \
13441   (Item)->List.Flink = NULL; \
13442 }
13443 
13444 FORCEINLINE
13445 VOID
ExInitializeFastMutex(OUT PFAST_MUTEX FastMutex)13446 ExInitializeFastMutex(
13447   OUT PFAST_MUTEX FastMutex)
13448 {
13449   FastMutex->Count = FM_LOCK_BIT;
13450   FastMutex->Owner = NULL;
13451   FastMutex->Contention = 0;
13452   KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
13453   return;
13454 }
13455 
13456 typedef void *PEXT_CANCEL_PARAMETERS;
13457 
13458 typedef void (NTAPI EXT_DELETE_CALLBACK)(void *context);
13459 typedef EXT_DELETE_CALLBACK *PEXT_DELETE_CALLBACK;
13460 
13461 typedef struct _EXT_DELETE_PARAMETERS
13462 {
13463     ULONG Version;
13464     ULONG Reserved;
13465     PEXT_DELETE_CALLBACK DeleteCallback;
13466     void *DeleteContext;
13467 } EXT_DELETE_PARAMETERS, *PEXT_DELETE_PARAMETERS;
13468 
13469 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13470 
13471 typedef struct _EX_TIMER *PEX_TIMER;
13472 
13473 typedef void (NTAPI EXT_CALLBACK)(PEX_TIMER, PVOID);
13474 typedef EXT_CALLBACK *PEXT_CALLBACK;
13475 
13476 NTKERNELAPI
13477 VOID
13478 FASTCALL
13479 ExAcquireFastMutexUnsafe(
13480   IN OUT PFAST_MUTEX FastMutex);
13481 
13482 NTKERNELAPI
13483 VOID
13484 FASTCALL
13485 ExReleaseFastMutexUnsafe(
13486   IN OUT PFAST_MUTEX FastMutex);
13487 
13488 NTKERNELAPI
13489 BOOLEAN
13490 NTAPI
13491 ExAcquireResourceExclusiveLite(
13492   IN OUT PERESOURCE Resource,
13493   IN BOOLEAN Wait);
13494 
13495 NTKERNELAPI
13496 BOOLEAN
13497 NTAPI
13498 ExAcquireResourceSharedLite(
13499   IN OUT PERESOURCE Resource,
13500   IN BOOLEAN Wait);
13501 
13502 NTKERNELAPI
13503 BOOLEAN
13504 NTAPI
13505 ExAcquireSharedStarveExclusive(
13506   IN OUT PERESOURCE Resource,
13507   IN BOOLEAN Wait);
13508 
13509 NTKERNELAPI
13510 BOOLEAN
13511 NTAPI
13512 ExAcquireSharedWaitForExclusive(
13513   IN OUT PERESOURCE Resource,
13514   IN BOOLEAN Wait);
13515 
13516 NTKERNELAPI
13517 PVOID
13518 NTAPI
13519 ExAllocatePool(
13520   IN POOL_TYPE PoolType,
13521   IN SIZE_T NumberOfBytes);
13522 
13523 NTKERNELAPI
13524 PVOID
13525 NTAPI
13526 ExAllocatePoolWithQuota(
13527   IN POOL_TYPE PoolType,
13528   IN SIZE_T NumberOfBytes);
13529 
13530 NTKERNELAPI
13531 PVOID
13532 NTAPI
13533 ExAllocatePoolWithQuotaTag(
13534   IN POOL_TYPE PoolType,
13535   IN SIZE_T NumberOfBytes,
13536   IN ULONG Tag);
13537 
13538 #ifndef POOL_TAGGING
13539 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
13540 #endif
13541 
13542 NTKERNELAPI
13543 PVOID
13544 NTAPI
13545 ExAllocatePoolWithTag(
13546   IN POOL_TYPE PoolType,
13547   IN SIZE_T NumberOfBytes,
13548   IN ULONG Tag);
13549 
13550 #ifndef POOL_TAGGING
13551 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
13552 #endif
13553 
13554 NTKERNELAPI
13555 PVOID
13556 NTAPI
13557 ExAllocatePoolWithTagPriority(
13558   IN POOL_TYPE PoolType,
13559   IN SIZE_T NumberOfBytes,
13560   IN ULONG Tag,
13561   IN EX_POOL_PRIORITY Priority);
13562 
13563 NTKERNELAPI
13564 VOID
13565 NTAPI
13566 ExConvertExclusiveToSharedLite(
13567   IN OUT PERESOURCE Resource);
13568 
13569 NTKERNELAPI
13570 NTSTATUS
13571 NTAPI
13572 ExCreateCallback(
13573   OUT PCALLBACK_OBJECT *CallbackObject,
13574   IN POBJECT_ATTRIBUTES ObjectAttributes,
13575   IN BOOLEAN Create,
13576   IN BOOLEAN AllowMultipleCallbacks);
13577 
13578 NTKERNELAPI
13579 VOID
13580 NTAPI
13581 ExDeleteNPagedLookasideList(
13582   IN OUT PNPAGED_LOOKASIDE_LIST Lookaside);
13583 
13584 NTKERNELAPI
13585 VOID
13586 NTAPI
13587 ExDeletePagedLookasideList(
13588   IN PPAGED_LOOKASIDE_LIST Lookaside);
13589 
13590 NTKERNELAPI
13591 NTSTATUS
13592 NTAPI
13593 ExDeleteResourceLite(
13594   IN OUT PERESOURCE Resource);
13595 
13596 NTKERNELAPI
13597 VOID
13598 NTAPI
13599 ExFreePool(
13600   IN PVOID P);
13601 
13602 NTKERNELAPI
13603 VOID
13604 NTAPI
13605 ExFreePoolWithTag(
13606   IN PVOID P,
13607   IN ULONG Tag);
13608 
13609 NTKERNELAPI
13610 ULONG
13611 NTAPI
13612 ExGetExclusiveWaiterCount(
13613   IN PERESOURCE Resource);
13614 
13615 NTKERNELAPI
13616 KPROCESSOR_MODE
13617 NTAPI
13618 ExGetPreviousMode(VOID);
13619 
13620 NTKERNELAPI
13621 ULONG
13622 NTAPI
13623 ExGetSharedWaiterCount(
13624   IN PERESOURCE Resource);
13625 
13626 NTKERNELAPI
13627 VOID
13628 NTAPI
13629 ExInitializeNPagedLookasideList(
13630   IN PNPAGED_LOOKASIDE_LIST Lookaside,
13631   IN PALLOCATE_FUNCTION Allocate OPTIONAL,
13632   IN PFREE_FUNCTION Free OPTIONAL,
13633   IN ULONG Flags,
13634   IN SIZE_T Size,
13635   IN ULONG Tag,
13636   IN USHORT Depth);
13637 
13638 NTKERNELAPI
13639 VOID
13640 NTAPI
13641 ExInitializePagedLookasideList(
13642   IN PPAGED_LOOKASIDE_LIST Lookaside,
13643   IN PALLOCATE_FUNCTION Allocate OPTIONAL,
13644   IN PFREE_FUNCTION Free OPTIONAL,
13645   IN ULONG Flags,
13646   IN SIZE_T Size,
13647   IN ULONG Tag,
13648   IN USHORT Depth);
13649 
13650 NTKERNELAPI
13651 NTSTATUS
13652 NTAPI
13653 ExInitializeResourceLite(
13654   OUT PERESOURCE Resource);
13655 
13656 NTKERNELAPI
13657 LARGE_INTEGER
13658 NTAPI
13659 ExInterlockedAddLargeInteger(
13660   IN PLARGE_INTEGER Addend,
13661   IN LARGE_INTEGER Increment,
13662   IN PKSPIN_LOCK Lock);
13663 
13664 #if defined(_WIN64)
13665 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
13666     (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
13667 #else
13668 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
13669     _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
13670 #endif
13671 
13672 NTKERNELAPI
13673 ULONG
13674 FASTCALL
13675 ExInterlockedAddUlong(
13676   IN PULONG Addend,
13677   IN ULONG Increment,
13678   IN OUT PKSPIN_LOCK Lock);
13679 
13680 #if defined(_AMD64_) || defined(_IA64_)
13681 
13682 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
13683     InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
13684 
13685 #elif defined(_X86_)
13686 
13687 NTKERNELAPI
13688 LONGLONG
13689 FASTCALL
13690 ExfInterlockedCompareExchange64(
13691   IN OUT LONGLONG volatile *Destination,
13692   IN PLONGLONG Exchange,
13693   IN PLONGLONG Comperand);
13694 
13695 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
13696     ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
13697 
13698 #else
13699 
13700 NTKERNELAPI
13701 LONGLONG
13702 FASTCALL
13703 ExInterlockedCompareExchange64(
13704   IN OUT LONGLONG volatile *Destination,
13705   IN PLONGLONG Exchange,
13706   IN PLONGLONG Comparand,
13707   IN PKSPIN_LOCK Lock);
13708 
13709 #endif /* defined(_AMD64_) || defined(_IA64_) */
13710 
13711 NTKERNELAPI
13712 PLIST_ENTRY
13713 FASTCALL
13714 ExInterlockedInsertHeadList(
13715   IN OUT PLIST_ENTRY ListHead,
13716   IN OUT PLIST_ENTRY ListEntry,
13717   IN OUT PKSPIN_LOCK Lock);
13718 
13719 NTKERNELAPI
13720 PLIST_ENTRY
13721 FASTCALL
13722 ExInterlockedInsertTailList(
13723   IN OUT PLIST_ENTRY ListHead,
13724   IN OUT PLIST_ENTRY ListEntry,
13725   IN OUT PKSPIN_LOCK Lock);
13726 
13727 NTKERNELAPI
13728 PSINGLE_LIST_ENTRY
13729 FASTCALL
13730 ExInterlockedPopEntryList(
13731   IN OUT PSINGLE_LIST_ENTRY ListHead,
13732   IN OUT PKSPIN_LOCK Lock);
13733 
13734 NTKERNELAPI
13735 PSINGLE_LIST_ENTRY
13736 FASTCALL
13737 ExInterlockedPushEntryList(
13738   IN OUT PSINGLE_LIST_ENTRY ListHead,
13739   IN OUT PSINGLE_LIST_ENTRY ListEntry,
13740   IN OUT PKSPIN_LOCK Lock);
13741 
13742 NTKERNELAPI
13743 PLIST_ENTRY
13744 FASTCALL
13745 ExInterlockedRemoveHeadList(
13746   IN OUT PLIST_ENTRY ListHead,
13747   IN OUT PKSPIN_LOCK Lock);
13748 
13749 NTKERNELAPI
13750 BOOLEAN
13751 NTAPI
13752 ExIsProcessorFeaturePresent(
13753   IN ULONG ProcessorFeature);
13754 
13755 NTKERNELAPI
13756 BOOLEAN
13757 NTAPI
13758 ExIsResourceAcquiredExclusiveLite(
13759   IN PERESOURCE Resource);
13760 
13761 NTKERNELAPI
13762 ULONG
13763 NTAPI
13764 ExIsResourceAcquiredSharedLite(
13765   IN PERESOURCE Resource);
13766 
13767 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
13768 
13769 NTKERNELAPI
13770 VOID
13771 NTAPI
13772 ExLocalTimeToSystemTime(
13773   IN PLARGE_INTEGER LocalTime,
13774   OUT PLARGE_INTEGER SystemTime);
13775 
13776 NTKERNELAPI
13777 VOID
13778 NTAPI
13779 ExNotifyCallback(
13780   IN PCALLBACK_OBJECT CallbackObject,
13781   IN PVOID Argument1 OPTIONAL,
13782   IN PVOID Argument2 OPTIONAL);
13783 
13784 NTKERNELAPI
13785 VOID
13786 NTAPI
13787 ExQueueWorkItem(
13788   IN OUT PWORK_QUEUE_ITEM WorkItem,
13789   IN WORK_QUEUE_TYPE QueueType);
13790 
13791 NTKERNELAPI
13792 DECLSPEC_NORETURN
13793 VOID
13794 NTAPI
13795 ExRaiseStatus(
13796   IN NTSTATUS Status);
13797 
13798 NTKERNELAPI
13799 PVOID
13800 NTAPI
13801 ExRegisterCallback(
13802   IN PCALLBACK_OBJECT CallbackObject,
13803   IN PCALLBACK_FUNCTION CallbackFunction,
13804   IN PVOID CallbackContext OPTIONAL);
13805 
13806 NTKERNELAPI
13807 NTSTATUS
13808 NTAPI
13809 ExReinitializeResourceLite(
13810   IN OUT PERESOURCE Resource);
13811 
13812 NTKERNELAPI
13813 VOID
13814 NTAPI
13815 ExReleaseResourceForThreadLite(
13816   IN OUT PERESOURCE Resource,
13817   IN ERESOURCE_THREAD ResourceThreadId);
13818 
13819 NTKERNELAPI
13820 VOID
13821 FASTCALL
13822 ExReleaseResourceLite(
13823   IN OUT PERESOURCE Resource);
13824 
13825 NTKERNELAPI
13826 VOID
13827 NTAPI
13828 ExSetResourceOwnerPointer(
13829   IN OUT PERESOURCE Resource,
13830   IN PVOID OwnerPointer);
13831 
13832 NTKERNELAPI
13833 ULONG
13834 NTAPI
13835 ExSetTimerResolution(
13836   IN ULONG DesiredTime,
13837   IN BOOLEAN SetResolution);
13838 
13839 NTKERNELAPI
13840 VOID
13841 NTAPI
13842 ExSystemTimeToLocalTime(
13843   IN PLARGE_INTEGER SystemTime,
13844   OUT PLARGE_INTEGER LocalTime);
13845 
13846 NTKERNELAPI
13847 VOID
13848 NTAPI
13849 ExUnregisterCallback(
13850   IN OUT PVOID CbRegistration);
13851 
13852 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13853 
13854 #if (NTDDI_VERSION >= NTDDI_WINXP)
13855 
13856 NTKERNELAPI
13857 BOOLEAN
13858 FASTCALL
13859 ExAcquireRundownProtection(
13860   IN OUT PEX_RUNDOWN_REF RunRef);
13861 
13862 NTKERNELAPI
13863 VOID
13864 FASTCALL
13865 ExInitializeRundownProtection(
13866   OUT PEX_RUNDOWN_REF RunRef);
13867 
13868 NTKERNELAPI
13869 VOID
13870 FASTCALL
13871 ExReInitializeRundownProtection(
13872   IN OUT PEX_RUNDOWN_REF RunRef);
13873 
13874 NTKERNELAPI
13875 VOID
13876 FASTCALL
13877 ExReleaseRundownProtection(
13878   IN OUT PEX_RUNDOWN_REF RunRef);
13879 
13880 NTKERNELAPI
13881 VOID
13882 FASTCALL
13883 ExRundownCompleted(
13884   OUT PEX_RUNDOWN_REF RunRef);
13885 
13886 NTKERNELAPI
13887 BOOLEAN
13888 NTAPI
13889 ExVerifySuite(
13890   IN SUITE_TYPE SuiteType);
13891 
13892 NTKERNELAPI
13893 VOID
13894 FASTCALL
13895 ExWaitForRundownProtectionRelease(
13896   IN OUT PEX_RUNDOWN_REF RunRef);
13897 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
13898 
13899 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
13900 
13901 NTKERNELAPI
13902 BOOLEAN
13903 FASTCALL
13904 ExAcquireRundownProtectionEx(
13905   IN OUT PEX_RUNDOWN_REF RunRef,
13906   IN ULONG Count);
13907 
13908 NTKERNELAPI
13909 VOID
13910 FASTCALL
13911 ExReleaseRundownProtectionEx(
13912   IN OUT PEX_RUNDOWN_REF RunRef,
13913   IN ULONG Count);
13914 
13915 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
13916 
13917 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
13918 
13919 NTKERNELAPI
13920 PEX_RUNDOWN_REF_CACHE_AWARE
13921 NTAPI
13922 ExAllocateCacheAwareRundownProtection(
13923   IN POOL_TYPE PoolType,
13924   IN ULONG PoolTag);
13925 
13926 NTKERNELAPI
13927 SIZE_T
13928 NTAPI
13929 ExSizeOfRundownProtectionCacheAware(VOID);
13930 
13931 NTKERNELAPI
13932 PVOID
13933 NTAPI
13934 ExEnterCriticalRegionAndAcquireResourceShared(
13935   IN OUT PERESOURCE Resource);
13936 
13937 NTKERNELAPI
13938 PVOID
13939 NTAPI
13940 ExEnterCriticalRegionAndAcquireResourceExclusive(
13941   IN OUT PERESOURCE Resource);
13942 
13943 NTKERNELAPI
13944 PVOID
13945 NTAPI
13946 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
13947   IN OUT PERESOURCE Resource);
13948 
13949 NTKERNELAPI
13950 VOID
13951 FASTCALL
13952 ExReleaseResourceAndLeaveCriticalRegion(
13953   IN OUT PERESOURCE Resource);
13954 
13955 NTKERNELAPI
13956 VOID
13957 NTAPI
13958 ExInitializeRundownProtectionCacheAware(
13959   OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
13960   IN SIZE_T RunRefSize);
13961 
13962 NTKERNELAPI
13963 VOID
13964 NTAPI
13965 ExFreeCacheAwareRundownProtection(
13966   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13967 
13968 NTKERNELAPI
13969 BOOLEAN
13970 FASTCALL
13971 ExAcquireRundownProtectionCacheAware(
13972   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13973 
13974 NTKERNELAPI
13975 VOID
13976 FASTCALL
13977 ExReleaseRundownProtectionCacheAware(
13978   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
13979 
13980 NTKERNELAPI
13981 BOOLEAN
13982 FASTCALL
13983 ExAcquireRundownProtectionCacheAwareEx(
13984   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
13985   IN ULONG Count);
13986 
13987 NTKERNELAPI
13988 VOID
13989 FASTCALL
13990 ExReleaseRundownProtectionCacheAwareEx(
13991   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
13992   IN ULONG Count);
13993 
13994 NTKERNELAPI
13995 VOID
13996 FASTCALL
13997 ExWaitForRundownProtectionReleaseCacheAware(
13998   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
13999 
14000 NTKERNELAPI
14001 VOID
14002 FASTCALL
14003 ExReInitializeRundownProtectionCacheAware(
14004   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14005 
14006 NTKERNELAPI
14007 VOID
14008 FASTCALL
14009 ExRundownCompletedCacheAware(
14010   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14011 
14012 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
14013 
14014 #if (NTDDI_VERSION >= NTDDI_VISTA)
14015 
14016 NTKERNELAPI
14017 NTSTATUS
14018 NTAPI
14019 ExInitializeLookasideListEx(
14020   OUT PLOOKASIDE_LIST_EX Lookaside,
14021   IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
14022   IN PFREE_FUNCTION_EX Free OPTIONAL,
14023   IN POOL_TYPE PoolType,
14024   IN ULONG Flags,
14025   IN SIZE_T Size,
14026   IN ULONG Tag,
14027   IN USHORT Depth);
14028 
14029 NTKERNELAPI
14030 VOID
14031 NTAPI
14032 ExDeleteLookasideListEx(
14033   IN OUT PLOOKASIDE_LIST_EX Lookaside);
14034 
14035 NTKERNELAPI
14036 VOID
14037 NTAPI
14038 ExFlushLookasideListEx(
14039   IN OUT PLOOKASIDE_LIST_EX Lookaside);
14040 
14041 FORCEINLINE
14042 PVOID
ExAllocateFromLookasideListEx(IN OUT PLOOKASIDE_LIST_EX Lookaside)14043 ExAllocateFromLookasideListEx(
14044   IN OUT PLOOKASIDE_LIST_EX Lookaside)
14045 {
14046   PVOID Entry;
14047 
14048   Lookaside->L.TotalAllocates += 1;
14049 #ifdef NONAMELESSUNION
14050   Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
14051   if (Entry == NULL) {
14052     Lookaside->L.u2.AllocateMisses += 1;
14053     Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
14054                                          Lookaside->L.Size,
14055                                          Lookaside->L.Tag,
14056                                          Lookaside);
14057   }
14058 #else /* NONAMELESSUNION */
14059   Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14060   if (Entry == NULL) {
14061     Lookaside->L.AllocateMisses += 1;
14062     Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
14063                                       Lookaside->L.Size,
14064                                       Lookaside->L.Tag,
14065                                       Lookaside);
14066   }
14067 #endif /* NONAMELESSUNION */
14068   return Entry;
14069 }
14070 
14071 FORCEINLINE
14072 VOID
ExFreeToLookasideListEx(IN OUT PLOOKASIDE_LIST_EX Lookaside,IN PVOID Entry)14073 ExFreeToLookasideListEx(
14074   IN OUT PLOOKASIDE_LIST_EX Lookaside,
14075   IN PVOID Entry)
14076 {
14077   Lookaside->L.TotalFrees += 1;
14078   if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14079     Lookaside->L.FreeMisses += 1;
14080     (Lookaside->L.FreeEx)(Entry, Lookaside);
14081   } else {
14082     InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14083   }
14084   return;
14085 }
14086 
14087 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14088 
14089 #if (NTDDI_VERSION >= NTDDI_WIN7)
14090 
14091 typedef struct _EXT_SET_PARAMETERS_V0
14092 {
14093     ULONG Version;
14094     ULONG Reserved;
14095     LONGLONG NoWakeTolerance;
14096 } EXT_SET_PARAMETERS, *PEXT_SET_PARAMETERS, KT2_SET_PARAMETERS, *PKT2_SET_PARAMETERS;
14097 
14098 NTKERNELAPI
14099 VOID
14100 NTAPI
14101 ExSetResourceOwnerPointerEx(
14102   IN OUT PERESOURCE Resource,
14103   IN PVOID OwnerPointer,
14104   IN ULONG Flags);
14105 
14106 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
14107 
14108 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14109 
14110 #if NTDDI_VERSION >= NTDDI_WINBLUE
14111 
14112 #define EX_TIMER_HIGH_RESOLUTION 4
14113 #define EX_TIMER_NO_WAKE 8
14114 #define EX_TIMER_UNLIMITED_TOLERANCE ((LONGLONG)-1)
14115 #define EX_TIMER_NOTIFICATION (1ul << 31)
14116 
14117 NTKERNELAPI PEX_TIMER NTAPI ExAllocateTimer(PEXT_CALLBACK callback, void *context, ULONG attr);
14118 NTKERNELAPI BOOLEAN NTAPI ExCancelTimer(PEX_TIMER timer, PEXT_CANCEL_PARAMETERS params);
14119 NTKERNELAPI BOOLEAN NTAPI ExDeleteTimer(PEX_TIMER timer, BOOLEAN cancel, BOOLEAN wait, PEXT_DELETE_PARAMETERS params);
14120 NTKERNELAPI BOOLEAN NTAPI ExSetTimer(PEX_TIMER timer, LONGLONG due, LONGLONG period, EXT_SET_PARAMETERS *params);
14121 
KeInitializeTimer2SetParameters(KT2_SET_PARAMETERS * params)14122 FORCEINLINE void KeInitializeTimer2SetParameters(KT2_SET_PARAMETERS *params)
14123 {
14124     memset(params, 0, sizeof(*params));
14125 }
14126 
ExInitializeSetTimerParameters(EXT_SET_PARAMETERS * params)14127 FORCEINLINE void ExInitializeSetTimerParameters(EXT_SET_PARAMETERS *params)
14128 {
14129     KeInitializeTimer2SetParameters(params);
14130 }
14131 
14132 #endif
14133 
14134 static __inline PVOID
ExAllocateFromNPagedLookasideList(IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)14135 ExAllocateFromNPagedLookasideList(
14136   IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)
14137 {
14138   PVOID Entry;
14139 
14140   Lookaside->L.TotalAllocates++;
14141 #ifdef NONAMELESSUNION
14142 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14143   Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
14144                                      &Lookaside->Lock__ObsoleteButDoNotDelete);
14145 #else
14146   Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
14147 #endif
14148   if (Entry == NULL) {
14149     Lookaside->L.u2.AllocateMisses++;
14150     Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
14151                                        Lookaside->L.Size,
14152                                        Lookaside->L.Tag);
14153   }
14154 #else /* NONAMELESSUNION */
14155 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14156   Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
14157                                      &Lookaside->Lock__ObsoleteButDoNotDelete);
14158 #else
14159   Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14160 #endif
14161   if (Entry == NULL) {
14162     Lookaside->L.AllocateMisses++;
14163     Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
14164                                     Lookaside->L.Size,
14165                                     Lookaside->L.Tag);
14166   }
14167 #endif /* NONAMELESSUNION */
14168   return Entry;
14169 }
14170 
14171 static __inline VOID
ExFreeToNPagedLookasideList(IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,IN PVOID Entry)14172 ExFreeToNPagedLookasideList(
14173   IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
14174   IN PVOID Entry)
14175 {
14176   Lookaside->L.TotalFrees++;
14177 #ifdef NONAMELESSUNION
14178   if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
14179     Lookaside->L.u3.FreeMisses++;
14180     (Lookaside->L.u5.Free)(Entry);
14181   } else {
14182 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14183       ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
14184                                   (PSLIST_ENTRY)Entry,
14185                                   &Lookaside->Lock__ObsoleteButDoNotDelete);
14186 #else
14187       InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
14188 #endif
14189    }
14190 #else /* NONAMELESSUNION */
14191   if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14192     Lookaside->L.FreeMisses++;
14193     (Lookaside->L.Free)(Entry);
14194   } else {
14195 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14196       ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
14197                                   (PSLIST_ENTRY)Entry,
14198                                   &Lookaside->Lock__ObsoleteButDoNotDelete);
14199 #else
14200       InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14201 #endif
14202    }
14203 #endif /* NONAMELESSUNION */
14204 }
14205 
14206 /******************************************************************************
14207  *                          Object Manager Functions                          *
14208  ******************************************************************************/
14209 
14210 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14211 NTKERNELAPI
14212 LONG_PTR
14213 FASTCALL
14214 ObfDereferenceObject(
14215   IN PVOID Object);
14216 #define ObDereferenceObject ObfDereferenceObject
14217 
14218 NTKERNELAPI
14219 NTSTATUS
14220 NTAPI
14221 ObGetObjectSecurity(
14222   IN PVOID Object,
14223   OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
14224   OUT PBOOLEAN MemoryAllocated);
14225 
14226 NTKERNELAPI
14227 LONG_PTR
14228 FASTCALL
14229 ObfReferenceObject(
14230   IN PVOID Object);
14231 #define ObReferenceObject ObfReferenceObject
14232 
14233 NTKERNELAPI
14234 NTSTATUS
14235 NTAPI
14236 ObReferenceObjectByHandle(
14237   IN HANDLE Handle,
14238   IN ACCESS_MASK DesiredAccess,
14239   IN POBJECT_TYPE ObjectType OPTIONAL,
14240   IN KPROCESSOR_MODE AccessMode,
14241   OUT PVOID *Object,
14242   OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
14243 
14244 NTKERNELAPI
14245 NTSTATUS
14246 NTAPI
14247 ObReferenceObjectByPointer(
14248   IN PVOID Object,
14249   IN ACCESS_MASK DesiredAccess,
14250   IN POBJECT_TYPE ObjectType OPTIONAL,
14251   IN KPROCESSOR_MODE AccessMode);
14252 
14253 NTKERNELAPI
14254 VOID
14255 NTAPI
14256 ObReleaseObjectSecurity(
14257   IN PSECURITY_DESCRIPTOR SecurityDescriptor,
14258   IN BOOLEAN MemoryAllocated);
14259 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14260 
14261 #if (NTDDI_VERSION >= NTDDI_VISTA)
14262 NTKERNELAPI
14263 VOID
14264 NTAPI
14265 ObDereferenceObjectDeferDelete(
14266   IN PVOID Object);
14267 #endif
14268 
14269 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
14270 NTKERNELAPI
14271 NTSTATUS
14272 NTAPI
14273 ObRegisterCallbacks(
14274   IN POB_CALLBACK_REGISTRATION CallbackRegistration,
14275   OUT PVOID *RegistrationHandle);
14276 
14277 NTKERNELAPI
14278 VOID
14279 NTAPI
14280 ObUnRegisterCallbacks(
14281   IN PVOID RegistrationHandle);
14282 
14283 NTKERNELAPI
14284 USHORT
14285 NTAPI
14286 ObGetFilterVersion(VOID);
14287 
14288 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
14289 
14290 #if (NTDDI_VERSION >= NTDDI_WIN7)
14291 NTKERNELAPI
14292 NTSTATUS
14293 NTAPI
14294 ObReferenceObjectByHandleWithTag(
14295   IN HANDLE Handle,
14296   IN ACCESS_MASK DesiredAccess,
14297   IN POBJECT_TYPE ObjectType OPTIONAL,
14298   IN KPROCESSOR_MODE AccessMode,
14299   IN ULONG Tag,
14300   OUT PVOID *Object,
14301   OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
14302 
14303 NTKERNELAPI
14304 LONG_PTR
14305 FASTCALL
14306 ObfReferenceObjectWithTag(
14307   IN PVOID Object,
14308   IN ULONG Tag);
14309 
14310 NTKERNELAPI
14311 NTSTATUS
14312 NTAPI
14313 ObReferenceObjectByPointerWithTag(
14314   IN PVOID Object,
14315   IN ACCESS_MASK DesiredAccess,
14316   IN POBJECT_TYPE ObjectType OPTIONAL,
14317   IN KPROCESSOR_MODE AccessMode,
14318   IN ULONG Tag);
14319 
14320 NTKERNELAPI
14321 LONG_PTR
14322 FASTCALL
14323 ObfDereferenceObjectWithTag(
14324   IN PVOID Object,
14325   IN ULONG Tag);
14326 
14327 NTKERNELAPI
14328 VOID
14329 NTAPI
14330 ObDereferenceObjectDeferDeleteWithTag(
14331   IN PVOID Object,
14332   IN ULONG Tag);
14333 
14334 #define ObDereferenceObject ObfDereferenceObject
14335 #define ObReferenceObject ObfReferenceObject
14336 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
14337 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
14338 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14339 
14340 /******************************************************************************
14341  *                          Process Manager Functions                         *
14342  ******************************************************************************/
14343 
14344 NTKERNELAPI
14345 NTSTATUS
14346 NTAPI
14347 PsWrapApcWow64Thread(
14348   IN OUT PVOID *ApcContext,
14349   IN OUT PVOID *ApcRoutine);
14350 
14351 /*
14352  * PEPROCESS
14353  * PsGetCurrentProcess(VOID)
14354  */
14355 #define PsGetCurrentProcess IoGetCurrentProcess
14356 
14357 #if !defined(_PSGETCURRENTTHREAD_)
14358 #define _PSGETCURRENTTHREAD_
14359 FORCEINLINE
14360 PETHREAD
14361 NTAPI
PsGetCurrentThread(VOID)14362 PsGetCurrentThread(VOID)
14363 {
14364   return (PETHREAD)KeGetCurrentThread();
14365 }
14366 #endif /* !_PSGETCURRENTTHREAD_ */
14367 
14368 
14369 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14370 
14371 NTKERNELAPI
14372 NTSTATUS
14373 NTAPI
14374 PsCreateSystemThread(
14375   OUT PHANDLE ThreadHandle,
14376   IN ULONG DesiredAccess,
14377   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
14378   IN HANDLE ProcessHandle OPTIONAL,
14379   OUT PCLIENT_ID ClientId OPTIONAL,
14380   IN PKSTART_ROUTINE StartRoutine,
14381   IN PVOID StartContext OPTIONAL);
14382 
14383 NTKERNELAPI
14384 NTSTATUS
14385 NTAPI
14386 PsTerminateSystemThread(
14387   IN NTSTATUS ExitStatus);
14388 
14389 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14390 
14391 
14392 /******************************************************************************
14393  *                          WMI Library Support Functions                     *
14394  ******************************************************************************/
14395 
14396 #ifdef RUN_WPP
14397 #if (NTDDI_VERSION >= NTDDI_WINXP)
14398 NTKERNELAPI
14399 NTSTATUS
14400 __cdecl
14401 WmiTraceMessage(
14402   IN TRACEHANDLE LoggerHandle,
14403   IN ULONG MessageFlags,
14404   IN LPGUID MessageGuid,
14405   IN USHORT MessageNumber,
14406   IN ...);
14407 #endif
14408 #endif /* RUN_WPP */
14409 
14410 #if (NTDDI_VERSION >= NTDDI_WINXP)
14411 
14412 NTKERNELAPI
14413 NTSTATUS
14414 NTAPI
14415 WmiQueryTraceInformation(
14416   IN TRACE_INFORMATION_CLASS TraceInformationClass,
14417   OUT PVOID TraceInformation,
14418   IN ULONG TraceInformationLength,
14419   OUT PULONG RequiredLength OPTIONAL,
14420   IN PVOID Buffer OPTIONAL);
14421 
14422 #if 0
14423 /* FIXME: Get va_list from where? */
14424 NTKERNELAPI
14425 NTSTATUS
14426 NTAPI
14427 WmiTraceMessageVa(
14428   IN TRACEHANDLE LoggerHandle,
14429   IN ULONG MessageFlags,
14430   IN LPGUID MessageGuid,
14431   IN USHORT MessageNumber,
14432   IN va_list MessageArgList);
14433 #endif
14434 
14435 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14436 
14437 #ifndef TRACE_INFORMATION_CLASS_DEFINE
14438 
14439 #if (NTDDI_VERSION >= NTDDI_WINXP)
14440 NTKERNELAPI
14441 NTSTATUS
14442 NTAPI
14443 WmiQueryTraceInformation(
14444   IN TRACE_INFORMATION_CLASS TraceInformationClass,
14445   OUT PVOID TraceInformation,
14446   IN ULONG TraceInformationLength,
14447   OUT PULONG RequiredLength OPTIONAL,
14448   IN PVOID Buffer OPTIONAL);
14449 #endif
14450 
14451 #define TRACE_INFORMATION_CLASS_DEFINE
14452 
14453 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
14454 
14455 #if (NTDDI_VERSION >= NTDDI_VISTA)
14456 
14457 NTSTATUS
14458 NTKERNELAPI
14459 NTAPI
14460 EtwRegister(
14461   IN LPCGUID ProviderId,
14462   IN PETWENABLECALLBACK EnableCallback OPTIONAL,
14463   IN PVOID CallbackContext OPTIONAL,
14464   OUT PREGHANDLE RegHandle);
14465 
14466 NTSTATUS
14467 NTKERNELAPI
14468 NTAPI
14469 EtwUnregister(
14470   IN REGHANDLE RegHandle);
14471 
14472 BOOLEAN
14473 NTKERNELAPI
14474 NTAPI
14475 EtwEventEnabled(
14476   IN REGHANDLE RegHandle,
14477   IN PCEVENT_DESCRIPTOR EventDescriptor);
14478 
14479 BOOLEAN
14480 NTKERNELAPI
14481 NTAPI
14482 EtwProviderEnabled(
14483   IN REGHANDLE RegHandle,
14484   IN UCHAR Level,
14485   IN ULONGLONG Keyword);
14486 
14487 NTSTATUS
14488 NTKERNELAPI
14489 NTAPI
14490 EtwActivityIdControl(
14491   IN ULONG ControlCode,
14492   IN OUT LPGUID ActivityId);
14493 
14494 NTSTATUS
14495 NTKERNELAPI
14496 NTAPI
14497 EtwWrite(
14498   IN REGHANDLE RegHandle,
14499   IN PCEVENT_DESCRIPTOR EventDescriptor,
14500   IN LPCGUID ActivityId OPTIONAL,
14501   IN ULONG UserDataCount,
14502   IN PEVENT_DATA_DESCRIPTOR  UserData OPTIONAL);
14503 
14504 NTSTATUS
14505 NTKERNELAPI
14506 NTAPI
14507 EtwWriteTransfer(
14508   IN REGHANDLE RegHandle,
14509   IN PCEVENT_DESCRIPTOR EventDescriptor,
14510   IN LPCGUID ActivityId OPTIONAL,
14511   IN LPCGUID RelatedActivityId OPTIONAL,
14512   IN ULONG UserDataCount,
14513   IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14514 
14515 NTSTATUS
14516 NTKERNELAPI
14517 NTAPI
14518 EtwWriteString(
14519   IN REGHANDLE RegHandle,
14520   IN UCHAR Level,
14521   IN ULONGLONG Keyword,
14522   IN LPCGUID ActivityId OPTIONAL,
14523   IN PCWSTR String);
14524 
14525 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14526 
14527 #if (NTDDI_VERSION >= NTDDI_WIN7)
14528 NTSTATUS
14529 NTKERNELAPI
14530 NTAPI
14531 EtwWriteEx(
14532   IN REGHANDLE RegHandle,
14533   IN PCEVENT_DESCRIPTOR EventDescriptor,
14534   IN ULONG64 Filter,
14535   IN ULONG Flags,
14536   IN LPCGUID ActivityId OPTIONAL,
14537   IN LPCGUID RelatedActivityId OPTIONAL,
14538   IN ULONG UserDataCount,
14539   IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL);
14540 #endif
14541 
14542 
14543 
14544 /******************************************************************************
14545  *                          Kernel Debugger Functions                         *
14546  ******************************************************************************/
14547 
14548 #ifndef _DBGNT_
14549 
14550 ULONG
14551 __cdecl
14552 DbgPrint(
14553   IN PCSTR Format,
14554   IN ...);
14555 
14556 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14557 NTSYSAPI
14558 ULONG
14559 __cdecl
14560 DbgPrintReturnControlC(
14561   IN PCCH Format,
14562   IN ...);
14563 #endif
14564 
14565 #if (NTDDI_VERSION >= NTDDI_WINXP)
14566 
14567 NTSYSAPI
14568 ULONG
14569 __cdecl
14570 DbgPrintEx(
14571   IN ULONG ComponentId,
14572   IN ULONG Level,
14573   IN PCSTR Format,
14574   IN ...);
14575 
14576 #ifdef _VA_LIST_DEFINED
14577 
14578 NTSYSAPI
14579 ULONG
14580 NTAPI
14581 vDbgPrintEx(
14582   IN ULONG ComponentId,
14583   IN ULONG Level,
14584   IN PCCH Format,
14585   IN va_list ap);
14586 
14587 NTSYSAPI
14588 ULONG
14589 NTAPI
14590 vDbgPrintExWithPrefix(
14591   IN PCCH Prefix,
14592   IN ULONG ComponentId,
14593   IN ULONG Level,
14594   IN PCCH Format,
14595   IN va_list ap);
14596 
14597 #endif /* _VA_LIST_DEFINED */
14598 
14599 NTSYSAPI
14600 NTSTATUS
14601 NTAPI
14602 DbgQueryDebugFilterState(
14603   IN ULONG ComponentId,
14604   IN ULONG Level);
14605 
14606 NTSYSAPI
14607 NTSTATUS
14608 NTAPI
14609 DbgSetDebugFilterState(
14610   IN ULONG ComponentId,
14611   IN ULONG Level,
14612   IN BOOLEAN State);
14613 
14614 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14615 
14616 #if (NTDDI_VERSION >= NTDDI_VISTA)
14617 
14618 typedef VOID
14619 (*PDEBUG_PRINT_CALLBACK)(
14620   IN PSTRING Output,
14621   IN ULONG ComponentId,
14622   IN ULONG Level);
14623 
14624 NTSYSAPI
14625 NTSTATUS
14626 NTAPI
14627 DbgSetDebugPrintCallback(
14628   IN PDEBUG_PRINT_CALLBACK DebugPrintCallback,
14629   IN BOOLEAN Enable);
14630 
14631 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14632 
14633 #endif /* _DBGNT_ */
14634 
14635 #if DBG
14636 
14637 #define KdPrint(_x_) DbgPrint _x_
14638 #define KdPrintEx(_x_) DbgPrintEx _x_
14639 #define vKdPrintEx(_x_) vDbgPrintEx _x_
14640 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
14641 #define KdBreakPoint() DbgBreakPoint()
14642 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
14643 
14644 #else /* !DBG */
14645 
14646 #define KdPrint(_x_)
14647 #define KdPrintEx(_x_)
14648 #define vKdPrintEx(_x_)
14649 #define vKdPrintExWithPrefix(_x_)
14650 #define KdBreakPoint()
14651 #define KdBreakPointWithStatus(s)
14652 
14653 #endif /* !DBG */
14654 
14655 #if defined(__GNUC__)
14656 
14657 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
14658 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
14659 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
14660 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
14661 
14662 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
14663 
14664 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
14665 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
14666 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
14667 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
14668 
14669 #else
14670 
14671 extern BOOLEAN KdDebuggerNotPresent;
14672 extern BOOLEAN KdDebuggerEnabled;
14673 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
14674 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
14675 
14676 #endif
14677 
14678 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14679 
14680 NTKERNELAPI
14681 NTSTATUS
14682 NTAPI
14683 KdDisableDebugger(VOID);
14684 
14685 NTKERNELAPI
14686 NTSTATUS
14687 NTAPI
14688 KdEnableDebugger(VOID);
14689 
14690 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
14691 #define DbgBreakPoint __debugbreak
14692 #else
14693 VOID
14694 NTAPI
14695 DbgBreakPoint(VOID);
14696 #endif
14697 
14698 NTSYSAPI
14699 VOID
14700 NTAPI
14701 DbgBreakPointWithStatus(
14702   IN ULONG Status);
14703 
14704 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14705 
14706 #if (NTDDI_VERSION >= NTDDI_WS03)
14707 NTKERNELAPI
14708 BOOLEAN
14709 NTAPI
14710 KdRefreshDebuggerNotPresent(VOID);
14711 #endif
14712 
14713 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
14714 NTKERNELAPI
14715 NTSTATUS
14716 NTAPI
14717 KdChangeOption(
14718   IN KD_OPTION Option,
14719   IN ULONG InBufferBytes OPTIONAL,
14720   IN PVOID InBuffer,
14721   IN ULONG OutBufferBytes OPTIONAL,
14722   OUT PVOID OutBuffer,
14723   OUT PULONG OutBufferNeeded OPTIONAL);
14724 #endif
14725 /* Hardware Abstraction Layer Functions */
14726 
14727 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14728 
14729 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
14730 
14731 FORCEINLINE
14732 PVOID
14733 NTAPI
HalAllocateCommonBuffer(IN PDMA_ADAPTER DmaAdapter,IN ULONG Length,OUT PPHYSICAL_ADDRESS LogicalAddress,IN BOOLEAN CacheEnabled)14734 HalAllocateCommonBuffer(
14735   IN PDMA_ADAPTER DmaAdapter,
14736   IN ULONG Length,
14737   OUT PPHYSICAL_ADDRESS LogicalAddress,
14738   IN BOOLEAN CacheEnabled)
14739 {
14740   PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
14741   PVOID commonBuffer;
14742 
14743   allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
14744   ASSERT( allocateCommonBuffer != NULL );
14745   commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
14746   return commonBuffer;
14747 }
14748 
14749 FORCEINLINE
14750 VOID
14751 NTAPI
HalFreeCommonBuffer(IN PDMA_ADAPTER DmaAdapter,IN ULONG Length,IN PHYSICAL_ADDRESS LogicalAddress,IN PVOID VirtualAddress,IN BOOLEAN CacheEnabled)14752 HalFreeCommonBuffer(
14753   IN PDMA_ADAPTER DmaAdapter,
14754   IN ULONG Length,
14755   IN PHYSICAL_ADDRESS LogicalAddress,
14756   IN PVOID VirtualAddress,
14757   IN BOOLEAN CacheEnabled)
14758 {
14759   PFREE_COMMON_BUFFER freeCommonBuffer;
14760 
14761   freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
14762   ASSERT( freeCommonBuffer != NULL );
14763   freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
14764 }
14765 
14766 FORCEINLINE
14767 ULONG
14768 NTAPI
HalReadDmaCounter(IN PDMA_ADAPTER DmaAdapter)14769 HalReadDmaCounter(
14770   IN PDMA_ADAPTER DmaAdapter)
14771 {
14772   PREAD_DMA_COUNTER readDmaCounter;
14773   ULONG counter;
14774 
14775   readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
14776   ASSERT( readDmaCounter != NULL );
14777   counter = readDmaCounter( DmaAdapter );
14778   return counter;
14779 }
14780 
14781 FORCEINLINE
14782 ULONG
HalGetDmaAlignment(IN PDMA_ADAPTER DmaAdapter)14783 HalGetDmaAlignment(
14784   IN PDMA_ADAPTER DmaAdapter)
14785 {
14786   PGET_DMA_ALIGNMENT getDmaAlignment;
14787   ULONG alignment;
14788 
14789   getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
14790   ASSERT( getDmaAlignment != NULL );
14791   alignment = getDmaAlignment( DmaAdapter );
14792   return alignment;
14793 }
14794 
14795 #endif /* USE_DMA_MACROS ... */
14796 
14797 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14798 
14799 #ifndef _NTTMAPI_
14800 #define _NTTMAPI_
14801 
14802 #include <ktmtypes.h>
14803 
14804 #define TRANSACTIONMANAGER_QUERY_INFORMATION     (0x0001)
14805 #define TRANSACTIONMANAGER_SET_INFORMATION       (0x0002)
14806 #define TRANSACTIONMANAGER_RECOVER               (0x0004)
14807 #define TRANSACTIONMANAGER_RENAME                (0x0008)
14808 #define TRANSACTIONMANAGER_CREATE_RM             (0x0010)
14809 #define TRANSACTIONMANAGER_BIND_TRANSACTION      (0x0020)
14810 
14811 #define TRANSACTIONMANAGER_GENERIC_READ            (STANDARD_RIGHTS_READ            |\
14812                                                     TRANSACTIONMANAGER_QUERY_INFORMATION)
14813 
14814 #define TRANSACTIONMANAGER_GENERIC_WRITE           (STANDARD_RIGHTS_WRITE           |\
14815                                                     TRANSACTIONMANAGER_SET_INFORMATION     |\
14816                                                     TRANSACTIONMANAGER_RECOVER             |\
14817                                                     TRANSACTIONMANAGER_RENAME              |\
14818                                                     TRANSACTIONMANAGER_CREATE_RM)
14819 
14820 #define TRANSACTIONMANAGER_GENERIC_EXECUTE         (STANDARD_RIGHTS_EXECUTE)
14821 
14822 #define TRANSACTIONMANAGER_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED        |\
14823                                                     TRANSACTIONMANAGER_GENERIC_READ        |\
14824                                                     TRANSACTIONMANAGER_GENERIC_WRITE       |\
14825                                                     TRANSACTIONMANAGER_GENERIC_EXECUTE     |\
14826                                                     TRANSACTIONMANAGER_BIND_TRANSACTION)
14827 
14828 #define TRANSACTION_QUERY_INFORMATION     (0x0001)
14829 #define TRANSACTION_SET_INFORMATION       (0x0002)
14830 #define TRANSACTION_ENLIST                (0x0004)
14831 #define TRANSACTION_COMMIT                (0x0008)
14832 #define TRANSACTION_ROLLBACK              (0x0010)
14833 #define TRANSACTION_PROPAGATE             (0x0020)
14834 #define TRANSACTION_RIGHT_RESERVED1       (0x0040)
14835 
14836 #define TRANSACTION_GENERIC_READ            (STANDARD_RIGHTS_READ            |\
14837                                              TRANSACTION_QUERY_INFORMATION   |\
14838                                              SYNCHRONIZE)
14839 
14840 #define TRANSACTION_GENERIC_WRITE           (STANDARD_RIGHTS_WRITE           |\
14841                                              TRANSACTION_SET_INFORMATION     |\
14842                                              TRANSACTION_COMMIT              |\
14843                                              TRANSACTION_ENLIST              |\
14844                                              TRANSACTION_ROLLBACK            |\
14845                                              TRANSACTION_PROPAGATE           |\
14846                                              SYNCHRONIZE)
14847 
14848 #define TRANSACTION_GENERIC_EXECUTE         (STANDARD_RIGHTS_EXECUTE         |\
14849                                              TRANSACTION_COMMIT              |\
14850                                              TRANSACTION_ROLLBACK            |\
14851                                              SYNCHRONIZE)
14852 
14853 #define TRANSACTION_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED        |\
14854                                              TRANSACTION_GENERIC_READ        |\
14855                                              TRANSACTION_GENERIC_WRITE       |\
14856                                              TRANSACTION_GENERIC_EXECUTE)
14857 
14858 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ        |\
14859                                              STANDARD_RIGHTS_WRITE           |\
14860                                              TRANSACTION_SET_INFORMATION     |\
14861                                              TRANSACTION_ENLIST              |\
14862                                              TRANSACTION_ROLLBACK            |\
14863                                              TRANSACTION_PROPAGATE           |\
14864                                              SYNCHRONIZE)
14865 
14866 #define RESOURCEMANAGER_QUERY_INFORMATION        (0x0001)
14867 #define RESOURCEMANAGER_SET_INFORMATION          (0x0002)
14868 #define RESOURCEMANAGER_RECOVER                  (0x0004)
14869 #define RESOURCEMANAGER_ENLIST                   (0x0008)
14870 #define RESOURCEMANAGER_GET_NOTIFICATION         (0x0010)
14871 #define RESOURCEMANAGER_REGISTER_PROTOCOL        (0x0020)
14872 #define RESOURCEMANAGER_COMPLETE_PROPAGATION     (0x0040)
14873 
14874 #define RESOURCEMANAGER_GENERIC_READ        (STANDARD_RIGHTS_READ                 |\
14875                                              RESOURCEMANAGER_QUERY_INFORMATION    |\
14876                                              SYNCHRONIZE)
14877 
14878 #define RESOURCEMANAGER_GENERIC_WRITE       (STANDARD_RIGHTS_WRITE                |\
14879                                              RESOURCEMANAGER_SET_INFORMATION      |\
14880                                              RESOURCEMANAGER_RECOVER              |\
14881                                              RESOURCEMANAGER_ENLIST               |\
14882                                              RESOURCEMANAGER_GET_NOTIFICATION     |\
14883                                              RESOURCEMANAGER_REGISTER_PROTOCOL    |\
14884                                              RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14885                                              SYNCHRONIZE)
14886 
14887 #define RESOURCEMANAGER_GENERIC_EXECUTE     (STANDARD_RIGHTS_EXECUTE              |\
14888                                              RESOURCEMANAGER_RECOVER              |\
14889                                              RESOURCEMANAGER_ENLIST               |\
14890                                              RESOURCEMANAGER_GET_NOTIFICATION     |\
14891                                              RESOURCEMANAGER_COMPLETE_PROPAGATION |\
14892                                              SYNCHRONIZE)
14893 
14894 #define RESOURCEMANAGER_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED             |\
14895                                              RESOURCEMANAGER_GENERIC_READ         |\
14896                                              RESOURCEMANAGER_GENERIC_WRITE        |\
14897                                              RESOURCEMANAGER_GENERIC_EXECUTE)
14898 
14899 #define ENLISTMENT_QUERY_INFORMATION             (0x0001)
14900 #define ENLISTMENT_SET_INFORMATION               (0x0002)
14901 #define ENLISTMENT_RECOVER                       (0x0004)
14902 #define ENLISTMENT_SUBORDINATE_RIGHTS            (0x0008)
14903 #define ENLISTMENT_SUPERIOR_RIGHTS               (0x0010)
14904 
14905 #define ENLISTMENT_GENERIC_READ        (STANDARD_RIGHTS_READ           |\
14906                                         ENLISTMENT_QUERY_INFORMATION)
14907 
14908 #define ENLISTMENT_GENERIC_WRITE       (STANDARD_RIGHTS_WRITE          |\
14909                                         ENLISTMENT_SET_INFORMATION     |\
14910                                         ENLISTMENT_RECOVER             |\
14911                                         ENLISTMENT_SUBORDINATE_RIGHTS  |\
14912                                         ENLISTMENT_SUPERIOR_RIGHTS)
14913 
14914 #define ENLISTMENT_GENERIC_EXECUTE     (STANDARD_RIGHTS_EXECUTE        |\
14915                                         ENLISTMENT_RECOVER             |\
14916                                         ENLISTMENT_SUBORDINATE_RIGHTS  |\
14917                                         ENLISTMENT_SUPERIOR_RIGHTS)
14918 
14919 #define ENLISTMENT_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED       |\
14920                                         ENLISTMENT_GENERIC_READ        |\
14921                                         ENLISTMENT_GENERIC_WRITE       |\
14922                                         ENLISTMENT_GENERIC_EXECUTE)
14923 
14924 typedef enum _TRANSACTION_OUTCOME {
14925   TransactionOutcomeUndetermined = 1,
14926   TransactionOutcomeCommitted,
14927   TransactionOutcomeAborted,
14928 } TRANSACTION_OUTCOME;
14929 
14930 
14931 typedef enum _TRANSACTION_STATE {
14932   TransactionStateNormal = 1,
14933   TransactionStateIndoubt,
14934   TransactionStateCommittedNotify,
14935 } TRANSACTION_STATE;
14936 
14937 
14938 typedef struct _TRANSACTION_BASIC_INFORMATION {
14939   GUID TransactionId;
14940   ULONG State;
14941   ULONG Outcome;
14942 } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
14943 
14944 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
14945   GUID TmIdentity;
14946   LARGE_INTEGER VirtualClock;
14947 } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
14948 
14949 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
14950   GUID LogIdentity;
14951 } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
14952 
14953 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
14954   ULONG LogPathLength;
14955   WCHAR LogPath[1];
14956 } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
14957 
14958 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
14959   ULONGLONG LastRecoveredLsn;
14960 } TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
14961 
14962 typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
14963   ULONG IsolationLevel;
14964   ULONG IsolationFlags;
14965   LARGE_INTEGER Timeout;
14966   ULONG Outcome;
14967   ULONG DescriptionLength;
14968   WCHAR Description[1];
14969 } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
14970 
14971 typedef struct _TRANSACTION_BIND_INFORMATION {
14972   HANDLE TmHandle;
14973 } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
14974 
14975 typedef struct _TRANSACTION_ENLISTMENT_PAIR {
14976   GUID EnlistmentId;
14977   GUID ResourceManagerId;
14978 } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
14979 
14980 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
14981   ULONG NumberOfEnlistments;
14982   TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1];
14983 } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
14984 
14985 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
14986   TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
14987 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
14988 
14989 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
14990   GUID ResourceManagerId;
14991   ULONG DescriptionLength;
14992   WCHAR Description[1];
14993 } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
14994 
14995 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
14996   HANDLE IoCompletionPortHandle;
14997   ULONG_PTR CompletionKey;
14998 } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
14999 
15000 typedef enum _KTMOBJECT_TYPE {
15001   KTMOBJECT_TRANSACTION,
15002   KTMOBJECT_TRANSACTION_MANAGER,
15003   KTMOBJECT_RESOURCE_MANAGER,
15004   KTMOBJECT_ENLISTMENT,
15005   KTMOBJECT_INVALID
15006 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
15007 
15008 typedef struct _KTMOBJECT_CURSOR {
15009   GUID LastQuery;
15010   ULONG ObjectIdCount;
15011   GUID ObjectIds[1];
15012 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
15013 
15014 typedef enum _TRANSACTION_INFORMATION_CLASS {
15015   TransactionBasicInformation,
15016   TransactionPropertiesInformation,
15017   TransactionEnlistmentInformation,
15018   TransactionSuperiorEnlistmentInformation
15019 } TRANSACTION_INFORMATION_CLASS;
15020 
15021 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
15022   TransactionManagerBasicInformation,
15023   TransactionManagerLogInformation,
15024   TransactionManagerLogPathInformation,
15025   TransactionManagerRecoveryInformation = 4
15026 } TRANSACTIONMANAGER_INFORMATION_CLASS;
15027 
15028 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
15029   ResourceManagerBasicInformation,
15030   ResourceManagerCompletionInformation,
15031 } RESOURCEMANAGER_INFORMATION_CLASS;
15032 
15033 typedef struct _ENLISTMENT_BASIC_INFORMATION {
15034   GUID EnlistmentId;
15035   GUID TransactionId;
15036   GUID ResourceManagerId;
15037 } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
15038 
15039 typedef struct _ENLISTMENT_CRM_INFORMATION {
15040   GUID CrmTransactionManagerId;
15041   GUID CrmResourceManagerId;
15042   GUID CrmEnlistmentId;
15043 } ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
15044 
15045 typedef enum _ENLISTMENT_INFORMATION_CLASS {
15046   EnlistmentBasicInformation,
15047   EnlistmentRecoveryInformation,
15048   EnlistmentCrmInformation
15049 } ENLISTMENT_INFORMATION_CLASS;
15050 
15051 typedef struct _TRANSACTION_LIST_ENTRY {
15052 /* UOW is typedef'ed as GUID just above.  Changed type of UOW
15053  * member from UOW to GUID for C++ compat.  Using ::UOW for C++
15054  * works too but we were reported some problems in corner cases
15055  */
15056   GUID UOW;
15057 } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
15058 
15059 typedef struct _TRANSACTION_LIST_INFORMATION {
15060   ULONG NumberOfTransactions;
15061   TRANSACTION_LIST_ENTRY TransactionInformation[1];
15062 } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
15063 
15064 typedef NTSTATUS
15065 (NTAPI *PFN_NT_CREATE_TRANSACTION)(
15066   OUT PHANDLE TransactionHandle,
15067   IN ACCESS_MASK DesiredAccess,
15068   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15069   IN LPGUID Uow OPTIONAL,
15070   IN HANDLE TmHandle OPTIONAL,
15071   IN ULONG CreateOptions OPTIONAL,
15072   IN ULONG IsolationLevel OPTIONAL,
15073   IN ULONG IsolationFlags OPTIONAL,
15074   IN PLARGE_INTEGER Timeout OPTIONAL,
15075   IN PUNICODE_STRING Description OPTIONAL);
15076 
15077 typedef NTSTATUS
15078 (NTAPI *PFN_NT_OPEN_TRANSACTION)(
15079   OUT PHANDLE TransactionHandle,
15080   IN ACCESS_MASK DesiredAccess,
15081   IN POBJECT_ATTRIBUTES ObjectAttributes,
15082   IN LPGUID Uow OPTIONAL,
15083   IN HANDLE TmHandle OPTIONAL);
15084 
15085 typedef NTSTATUS
15086 (NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)(
15087   IN HANDLE TransactionHandle,
15088   IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15089   OUT PVOID TransactionInformation,
15090   IN ULONG TransactionInformationLength,
15091   OUT PULONG ReturnLength OPTIONAL);
15092 
15093 typedef NTSTATUS
15094 (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)(
15095   IN HANDLE TransactionHandle,
15096   IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15097   IN PVOID TransactionInformation,
15098   IN ULONG TransactionInformationLength);
15099 
15100 typedef NTSTATUS
15101 (NTAPI *PFN_NT_COMMIT_TRANSACTION)(
15102   IN HANDLE TransactionHandle,
15103   IN BOOLEAN Wait);
15104 
15105 typedef NTSTATUS
15106 (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)(
15107   IN HANDLE TransactionHandle,
15108   IN BOOLEAN Wait);
15109 
15110 #if (NTDDI_VERSION >= NTDDI_VISTA)
15111 
15112 NTSYSCALLAPI
15113 NTSTATUS
15114 NTAPI
15115 NtCreateTransactionManager(
15116   OUT PHANDLE TmHandle,
15117   IN ACCESS_MASK DesiredAccess,
15118   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15119   IN PUNICODE_STRING LogFileName OPTIONAL,
15120   IN ULONG CreateOptions OPTIONAL,
15121   IN ULONG CommitStrength OPTIONAL);
15122 
15123 NTSYSCALLAPI
15124 NTSTATUS
15125 NTAPI
15126 NtOpenTransactionManager(
15127   OUT PHANDLE TmHandle,
15128   IN ACCESS_MASK DesiredAccess,
15129   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15130   IN PUNICODE_STRING LogFileName OPTIONAL,
15131   IN LPGUID TmIdentity OPTIONAL,
15132   IN ULONG OpenOptions OPTIONAL);
15133 
15134 NTSYSCALLAPI
15135 NTSTATUS
15136 NTAPI
15137 NtRenameTransactionManager(
15138   IN PUNICODE_STRING LogFileName,
15139   IN LPGUID ExistingTransactionManagerGuid);
15140 
15141 NTSYSCALLAPI
15142 NTSTATUS
15143 NTAPI
15144 NtRollforwardTransactionManager(
15145   IN HANDLE TransactionManagerHandle,
15146   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15147 
15148 NTSYSCALLAPI
15149 NTSTATUS
15150 NTAPI
15151 NtRecoverTransactionManager(
15152   IN HANDLE TransactionManagerHandle);
15153 
15154 NTSYSCALLAPI
15155 NTSTATUS
15156 NTAPI
15157 NtQueryInformationTransactionManager(
15158   IN HANDLE TransactionManagerHandle,
15159   IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15160   OUT PVOID TransactionManagerInformation,
15161   IN ULONG TransactionManagerInformationLength,
15162   OUT PULONG ReturnLength);
15163 
15164 NTSYSCALLAPI
15165 NTSTATUS
15166 NTAPI
15167 NtSetInformationTransactionManager(
15168   IN HANDLE TmHandle OPTIONAL,
15169   IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15170   IN PVOID TransactionManagerInformation,
15171   IN ULONG TransactionManagerInformationLength);
15172 
15173 NTSYSCALLAPI
15174 NTSTATUS
15175 NTAPI
15176 NtEnumerateTransactionObject(
15177   IN HANDLE RootObjectHandle OPTIONAL,
15178   IN KTMOBJECT_TYPE QueryType,
15179   IN OUT PKTMOBJECT_CURSOR ObjectCursor,
15180   IN ULONG ObjectCursorLength,
15181   OUT PULONG ReturnLength);
15182 
15183 NTSYSCALLAPI
15184 NTSTATUS
15185 NTAPI
15186 NtCreateTransaction(
15187   OUT PHANDLE TransactionHandle,
15188   IN ACCESS_MASK DesiredAccess,
15189   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15190   IN LPGUID Uow OPTIONAL,
15191   IN HANDLE TmHandle OPTIONAL,
15192   IN ULONG CreateOptions OPTIONAL,
15193   IN ULONG IsolationLevel OPTIONAL,
15194   IN ULONG IsolationFlags OPTIONAL,
15195   IN PLARGE_INTEGER Timeout OPTIONAL,
15196   IN PUNICODE_STRING Description OPTIONAL);
15197 
15198 NTSYSCALLAPI
15199 NTSTATUS
15200 NTAPI
15201 NtOpenTransaction(
15202   OUT PHANDLE TransactionHandle,
15203   IN ACCESS_MASK DesiredAccess,
15204   IN POBJECT_ATTRIBUTES ObjectAttributes,
15205   IN LPGUID Uow,
15206   IN HANDLE TmHandle OPTIONAL);
15207 
15208 NTSYSCALLAPI
15209 NTSTATUS
15210 NTAPI
15211 NtQueryInformationTransaction(
15212   IN HANDLE TransactionHandle,
15213   IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15214   OUT PVOID TransactionInformation,
15215   IN ULONG TransactionInformationLength,
15216   OUT PULONG ReturnLength OPTIONAL);
15217 
15218 NTSYSCALLAPI
15219 NTSTATUS
15220 NTAPI
15221 NtSetInformationTransaction(
15222   IN HANDLE TransactionHandle,
15223   IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15224   IN PVOID TransactionInformation,
15225   IN ULONG TransactionInformationLength);
15226 
15227 NTSYSCALLAPI
15228 NTSTATUS
15229 NTAPI
15230 NtCommitTransaction(
15231   IN HANDLE TransactionHandle,
15232   IN BOOLEAN Wait);
15233 
15234 NTSYSCALLAPI
15235 NTSTATUS
15236 NTAPI
15237 NtRollbackTransaction(
15238   IN HANDLE TransactionHandle,
15239   IN BOOLEAN Wait);
15240 
15241 NTSYSCALLAPI
15242 NTSTATUS
15243 NTAPI
15244 NtCreateEnlistment(
15245   OUT PHANDLE EnlistmentHandle,
15246   IN ACCESS_MASK DesiredAccess,
15247   IN HANDLE ResourceManagerHandle,
15248   IN HANDLE TransactionHandle,
15249   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15250   IN ULONG CreateOptions OPTIONAL,
15251   IN NOTIFICATION_MASK NotificationMask,
15252   IN PVOID EnlistmentKey OPTIONAL);
15253 
15254 NTSYSCALLAPI
15255 NTSTATUS
15256 NTAPI
15257 NtOpenEnlistment(
15258   OUT PHANDLE EnlistmentHandle,
15259   IN ACCESS_MASK DesiredAccess,
15260   IN HANDLE ResourceManagerHandle,
15261   IN LPGUID EnlistmentGuid,
15262   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15263 
15264 NTSYSCALLAPI
15265 NTSTATUS
15266 NTAPI
15267 NtQueryInformationEnlistment(
15268   IN HANDLE EnlistmentHandle,
15269   IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15270   OUT PVOID EnlistmentInformation,
15271   IN ULONG EnlistmentInformationLength,
15272   OUT PULONG ReturnLength);
15273 
15274 NTSYSCALLAPI
15275 NTSTATUS
15276 NTAPI
15277 NtSetInformationEnlistment(
15278   IN HANDLE EnlistmentHandle OPTIONAL,
15279   IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15280   IN PVOID EnlistmentInformation,
15281   IN ULONG EnlistmentInformationLength);
15282 
15283 NTSYSCALLAPI
15284 NTSTATUS
15285 NTAPI
15286 NtRecoverEnlistment(
15287   IN HANDLE EnlistmentHandle,
15288   IN PVOID EnlistmentKey OPTIONAL);
15289 
15290 NTSYSCALLAPI
15291 NTSTATUS
15292 NTAPI
15293 NtPrePrepareEnlistment(
15294   IN HANDLE EnlistmentHandle,
15295   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15296 
15297 NTSYSCALLAPI
15298 NTSTATUS
15299 NTAPI
15300 NtPrepareEnlistment(
15301   IN HANDLE EnlistmentHandle,
15302   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15303 
15304 NTSYSCALLAPI
15305 NTSTATUS
15306 NTAPI
15307 NtCommitEnlistment(
15308   IN HANDLE EnlistmentHandle,
15309   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15310 
15311 NTSYSCALLAPI
15312 NTSTATUS
15313 NTAPI
15314 NtRollbackEnlistment(
15315   IN HANDLE EnlistmentHandle,
15316   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15317 
15318 NTSYSCALLAPI
15319 NTSTATUS
15320 NTAPI
15321 NtPrePrepareComplete(
15322   IN HANDLE EnlistmentHandle,
15323   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15324 
15325 NTSYSCALLAPI
15326 NTSTATUS
15327 NTAPI
15328 NtPrepareComplete(
15329   IN HANDLE EnlistmentHandle,
15330   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15331 
15332 NTSYSCALLAPI
15333 NTSTATUS
15334 NTAPI
15335 NtCommitComplete(
15336   IN HANDLE EnlistmentHandle,
15337   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15338 
15339 NTSYSCALLAPI
15340 NTSTATUS
15341 NTAPI
15342 NtReadOnlyEnlistment(
15343   IN HANDLE EnlistmentHandle,
15344   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15345 
15346 NTSYSCALLAPI
15347 NTSTATUS
15348 NTAPI
15349 NtRollbackComplete(
15350   IN HANDLE EnlistmentHandle,
15351   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15352 
15353 NTSYSCALLAPI
15354 NTSTATUS
15355 NTAPI
15356 NtSinglePhaseReject(
15357   IN HANDLE EnlistmentHandle,
15358   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15359 
15360 NTSYSCALLAPI
15361 NTSTATUS
15362 NTAPI
15363 NtCreateResourceManager(
15364   OUT PHANDLE ResourceManagerHandle,
15365   IN ACCESS_MASK DesiredAccess,
15366   IN HANDLE TmHandle,
15367   IN LPGUID RmGuid,
15368   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15369   IN ULONG CreateOptions OPTIONAL,
15370   IN PUNICODE_STRING Description OPTIONAL);
15371 
15372 NTSYSCALLAPI
15373 NTSTATUS
15374 NTAPI
15375 NtOpenResourceManager(
15376   OUT PHANDLE ResourceManagerHandle,
15377   IN ACCESS_MASK DesiredAccess,
15378   IN HANDLE TmHandle,
15379   IN LPGUID ResourceManagerGuid OPTIONAL,
15380   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15381 
15382 NTSYSCALLAPI
15383 NTSTATUS
15384 NTAPI
15385 NtRecoverResourceManager(
15386   IN HANDLE ResourceManagerHandle);
15387 
15388 NTSYSCALLAPI
15389 NTSTATUS
15390 NTAPI
15391 NtGetNotificationResourceManager(
15392   IN HANDLE ResourceManagerHandle,
15393   OUT PTRANSACTION_NOTIFICATION TransactionNotification,
15394   IN ULONG NotificationLength,
15395   IN PLARGE_INTEGER Timeout OPTIONAL,
15396   OUT PULONG ReturnLength OPTIONAL,
15397   IN ULONG Asynchronous,
15398   IN ULONG_PTR AsynchronousContext OPTIONAL);
15399 
15400 NTSYSCALLAPI
15401 NTSTATUS
15402 NTAPI
15403 NtQueryInformationResourceManager(
15404   IN HANDLE ResourceManagerHandle,
15405   IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15406   OUT PVOID ResourceManagerInformation,
15407   IN ULONG ResourceManagerInformationLength,
15408   OUT PULONG ReturnLength OPTIONAL);
15409 
15410 NTSYSCALLAPI
15411 NTSTATUS
15412 NTAPI
15413 NtSetInformationResourceManager(
15414   IN HANDLE ResourceManagerHandle,
15415   IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15416   IN PVOID ResourceManagerInformation,
15417   IN ULONG ResourceManagerInformationLength);
15418 
15419 NTSYSCALLAPI
15420 NTSTATUS
15421 NTAPI
15422 NtRegisterProtocolAddressInformation(
15423   IN HANDLE ResourceManager,
15424   IN PCRM_PROTOCOL_ID ProtocolId,
15425   IN ULONG ProtocolInformationSize,
15426   IN PVOID ProtocolInformation,
15427   IN ULONG CreateOptions OPTIONAL);
15428 
15429 NTSYSCALLAPI
15430 NTSTATUS
15431 NTAPI
15432 NtPropagationComplete(
15433   IN HANDLE ResourceManagerHandle,
15434   IN ULONG RequestCookie,
15435   IN ULONG BufferLength,
15436   IN PVOID Buffer);
15437 
15438 NTSYSCALLAPI
15439 NTSTATUS
15440 NTAPI
15441 NtPropagationFailed(
15442   IN HANDLE ResourceManagerHandle,
15443   IN ULONG RequestCookie,
15444   IN NTSTATUS PropStatus);
15445 
15446 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
15447 
15448 #endif /* !_NTTMAPI_ */
15449 
15450 /******************************************************************************
15451  *                            ZwXxx Functions                                 *
15452  ******************************************************************************/
15453 
15454 /* Constants */
15455 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
15456 #define ZwCurrentProcess() NtCurrentProcess()
15457 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
15458 #define ZwCurrentThread() NtCurrentThread()
15459 
15460 
15461 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15462 
15463 NTSYSAPI
15464 NTSTATUS
15465 NTAPI
15466 ZwClose(
15467   IN HANDLE Handle);
15468 
15469 NTSYSAPI
15470 NTSTATUS
15471 NTAPI
15472 ZwCreateDirectoryObject(
15473   OUT PHANDLE DirectoryHandle,
15474   IN ACCESS_MASK DesiredAccess,
15475   IN POBJECT_ATTRIBUTES ObjectAttributes);
15476 
15477 NTSYSAPI
15478 NTSTATUS
15479 NTAPI
15480 ZwCreateFile(
15481   OUT PHANDLE FileHandle,
15482   IN ACCESS_MASK DesiredAccess,
15483   IN POBJECT_ATTRIBUTES ObjectAttributes,
15484   OUT PIO_STATUS_BLOCK IoStatusBlock,
15485   IN PLARGE_INTEGER AllocationSize OPTIONAL,
15486   IN ULONG FileAttributes,
15487   IN ULONG ShareAccess,
15488   IN ULONG CreateDisposition,
15489   IN ULONG CreateOptions,
15490   IN PVOID EaBuffer OPTIONAL,
15491   IN ULONG EaLength);
15492 
15493 NTSYSAPI
15494 NTSTATUS
15495 NTAPI
15496 ZwCreateKey(
15497   OUT PHANDLE KeyHandle,
15498   IN ACCESS_MASK DesiredAccess,
15499   IN POBJECT_ATTRIBUTES ObjectAttributes,
15500   IN ULONG TitleIndex,
15501   IN PUNICODE_STRING Class OPTIONAL,
15502   IN ULONG CreateOptions,
15503   OUT PULONG Disposition OPTIONAL);
15504 
15505 NTSYSAPI
15506 NTSTATUS
15507 NTAPI
15508 ZwCreateSection(
15509   OUT PHANDLE SectionHandle,
15510   IN ACCESS_MASK DesiredAccess,
15511   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15512   IN PLARGE_INTEGER MaximumSize OPTIONAL,
15513   IN ULONG SectionPageProtection,
15514   IN ULONG AllocationAttributes,
15515   IN HANDLE FileHandle OPTIONAL);
15516 
15517 NTSYSAPI
15518 NTSTATUS
15519 NTAPI
15520 ZwDeleteKey(
15521   IN HANDLE KeyHandle);
15522 
15523 NTSYSAPI
15524 NTSTATUS
15525 NTAPI
15526 ZwDeleteValueKey(
15527   IN HANDLE KeyHandle,
15528   IN PUNICODE_STRING ValueName);
15529 
15530 NTSYSAPI
15531 NTSTATUS
15532 NTAPI
15533 ZwEnumerateKey(
15534   IN HANDLE KeyHandle,
15535   IN ULONG Index,
15536   IN KEY_INFORMATION_CLASS KeyInformationClass,
15537   OUT PVOID KeyInformation OPTIONAL,
15538   IN ULONG Length,
15539   OUT PULONG ResultLength);
15540 
15541 NTSYSAPI
15542 NTSTATUS
15543 NTAPI
15544 ZwEnumerateValueKey(
15545   IN HANDLE KeyHandle,
15546   IN ULONG Index,
15547   IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
15548   OUT PVOID KeyValueInformation OPTIONAL,
15549   IN ULONG Length,
15550   OUT PULONG ResultLength);
15551 
15552 NTSYSAPI
15553 NTSTATUS
15554 NTAPI
15555 ZwFlushKey(
15556   IN HANDLE KeyHandle);
15557 
15558 NTSYSAPI
15559 NTSTATUS
15560 NTAPI
15561 ZwLoadDriver(
15562   IN PUNICODE_STRING DriverServiceName);
15563 
15564 NTSYSAPI
15565 NTSTATUS
15566 NTAPI
15567 ZwMakeTemporaryObject(
15568   IN HANDLE Handle);
15569 
15570 NTSYSAPI
15571 NTSTATUS
15572 NTAPI
15573 ZwMapViewOfSection(
15574   IN HANDLE SectionHandle,
15575   IN HANDLE ProcessHandle,
15576   IN OUT PVOID *BaseAddress,
15577   IN ULONG_PTR ZeroBits,
15578   IN SIZE_T CommitSize,
15579   IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
15580   IN OUT PSIZE_T ViewSize,
15581   IN SECTION_INHERIT InheritDisposition,
15582   IN ULONG AllocationType,
15583   IN ULONG Protect);
15584 
15585 NTSYSAPI
15586 NTSTATUS
15587 NTAPI
15588 ZwOpenFile(
15589   OUT PHANDLE FileHandle,
15590   IN ACCESS_MASK DesiredAccess,
15591   IN POBJECT_ATTRIBUTES ObjectAttributes,
15592   OUT PIO_STATUS_BLOCK IoStatusBlock,
15593   IN ULONG ShareAccess,
15594   IN ULONG OpenOptions);
15595 
15596 NTSYSAPI
15597 NTSTATUS
15598 NTAPI
15599 ZwOpenKey(
15600   OUT PHANDLE KeyHandle,
15601   IN ACCESS_MASK DesiredAccess,
15602   IN POBJECT_ATTRIBUTES ObjectAttributes);
15603 
15604 NTSYSAPI
15605 NTSTATUS
15606 NTAPI
15607 ZwOpenSection(
15608   OUT PHANDLE SectionHandle,
15609   IN ACCESS_MASK DesiredAccess,
15610   IN POBJECT_ATTRIBUTES ObjectAttributes);
15611 
15612 NTSYSAPI
15613 NTSTATUS
15614 NTAPI
15615 ZwOpenSymbolicLinkObject(
15616   OUT PHANDLE LinkHandle,
15617   IN ACCESS_MASK DesiredAccess,
15618   IN POBJECT_ATTRIBUTES ObjectAttributes);
15619 
15620 NTSYSAPI
15621 NTSTATUS
15622 NTAPI
15623 ZwQueryInformationFile(
15624   IN HANDLE FileHandle,
15625   OUT PIO_STATUS_BLOCK IoStatusBlock,
15626   OUT PVOID FileInformation,
15627   IN ULONG Length,
15628   IN FILE_INFORMATION_CLASS FileInformationClass);
15629 
15630 NTSYSAPI
15631 NTSTATUS
15632 NTAPI
15633 ZwQueryKey(
15634   IN HANDLE KeyHandle,
15635   IN KEY_INFORMATION_CLASS KeyInformationClass,
15636   OUT PVOID KeyInformation OPTIONAL,
15637   IN ULONG Length,
15638   OUT PULONG ResultLength);
15639 
15640 NTSYSAPI
15641 NTSTATUS
15642 NTAPI
15643 ZwQuerySymbolicLinkObject(
15644   IN HANDLE LinkHandle,
15645   IN OUT PUNICODE_STRING LinkTarget,
15646   OUT PULONG ReturnedLength OPTIONAL);
15647 
15648 NTSYSAPI
15649 NTSTATUS
15650 NTAPI
15651 ZwQueryValueKey(
15652   IN HANDLE KeyHandle,
15653   IN PUNICODE_STRING ValueName,
15654   IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
15655   OUT PVOID KeyValueInformation OPTIONAL,
15656   IN ULONG Length,
15657   OUT PULONG ResultLength);
15658 
15659 NTSYSAPI
15660 NTSTATUS
15661 NTAPI
15662 ZwReadFile(
15663   IN HANDLE FileHandle,
15664   IN HANDLE Event OPTIONAL,
15665   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15666   IN PVOID ApcContext OPTIONAL,
15667   OUT PIO_STATUS_BLOCK IoStatusBlock,
15668   OUT PVOID Buffer,
15669   IN ULONG Length,
15670   IN PLARGE_INTEGER ByteOffset OPTIONAL,
15671   IN PULONG Key OPTIONAL);
15672 
15673 NTSYSAPI
15674 NTSTATUS
15675 NTAPI
15676 ZwSetInformationFile(
15677   IN HANDLE FileHandle,
15678   OUT PIO_STATUS_BLOCK IoStatusBlock,
15679   IN PVOID FileInformation,
15680   IN ULONG Length,
15681   IN FILE_INFORMATION_CLASS FileInformationClass);
15682 
15683 NTSYSAPI
15684 NTSTATUS
15685 NTAPI
15686 ZwSetValueKey(
15687   IN HANDLE KeyHandle,
15688   IN PUNICODE_STRING ValueName,
15689   IN ULONG TitleIndex OPTIONAL,
15690   IN ULONG Type,
15691   IN PVOID Data OPTIONAL,
15692   IN ULONG DataSize);
15693 
15694 NTSYSAPI
15695 NTSTATUS
15696 NTAPI
15697 ZwUnloadDriver(
15698   IN PUNICODE_STRING DriverServiceName);
15699 
15700 NTSYSAPI
15701 NTSTATUS
15702 NTAPI
15703 ZwUnmapViewOfSection(
15704   IN HANDLE ProcessHandle,
15705   IN PVOID BaseAddress OPTIONAL);
15706 
15707 NTSYSAPI
15708 NTSTATUS
15709 NTAPI
15710 ZwWriteFile(
15711   IN HANDLE FileHandle,
15712   IN HANDLE Event OPTIONAL,
15713   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
15714   IN PVOID ApcContext OPTIONAL,
15715   OUT PIO_STATUS_BLOCK IoStatusBlock,
15716   IN PVOID Buffer,
15717   IN ULONG Length,
15718   IN PLARGE_INTEGER ByteOffset OPTIONAL,
15719   IN PULONG Key OPTIONAL);
15720 
15721 NTSYSAPI
15722 NTSTATUS
15723 NTAPI
15724 ZwQueryFullAttributesFile(
15725   IN POBJECT_ATTRIBUTES ObjectAttributes,
15726   OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
15727 
15728 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15729 
15730 
15731 #if (NTDDI_VERSION >= NTDDI_WS03)
15732 NTSYSCALLAPI
15733 NTSTATUS
15734 NTAPI
15735 ZwOpenEvent(
15736   OUT PHANDLE EventHandle,
15737   IN ACCESS_MASK DesiredAccess,
15738   IN POBJECT_ATTRIBUTES ObjectAttributes);
15739 #endif
15740 
15741 #if (NTDDI_VERSION >= NTDDI_VISTA)
15742 
15743 NTSYSAPI
15744 NTSTATUS
15745 ZwCreateKeyTransacted(
15746   OUT PHANDLE KeyHandle,
15747   IN ACCESS_MASK DesiredAccess,
15748   IN POBJECT_ATTRIBUTES ObjectAttributes,
15749   IN ULONG TitleIndex,
15750   IN PUNICODE_STRING Class OPTIONAL,
15751   IN ULONG CreateOptions,
15752   IN HANDLE TransactionHandle,
15753   OUT PULONG Disposition OPTIONAL);
15754 
15755 NTSYSAPI
15756 NTSTATUS
15757 NTAPI
15758 ZwOpenKeyTransacted(
15759   OUT PHANDLE KeyHandle,
15760   IN ACCESS_MASK DesiredAccess,
15761   IN POBJECT_ATTRIBUTES ObjectAttributes,
15762   IN HANDLE TransactionHandle);
15763 
15764 NTSYSCALLAPI
15765 NTSTATUS
15766 NTAPI
15767 ZwCreateTransactionManager(
15768   OUT PHANDLE TmHandle,
15769   IN ACCESS_MASK DesiredAccess,
15770   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15771   IN PUNICODE_STRING LogFileName OPTIONAL,
15772   IN ULONG CreateOptions OPTIONAL,
15773   IN ULONG CommitStrength OPTIONAL);
15774 
15775 NTSYSCALLAPI
15776 NTSTATUS
15777 NTAPI
15778 ZwOpenTransactionManager(
15779   OUT PHANDLE TmHandle,
15780   IN ACCESS_MASK DesiredAccess,
15781   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15782   IN PUNICODE_STRING LogFileName OPTIONAL,
15783   IN LPGUID TmIdentity OPTIONAL,
15784   IN ULONG OpenOptions OPTIONAL);
15785 
15786 NTSYSCALLAPI
15787 NTSTATUS
15788 NTAPI
15789 ZwRollforwardTransactionManager(
15790   IN HANDLE TransactionManagerHandle,
15791   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
15792 
15793 NTSYSCALLAPI
15794 NTSTATUS
15795 NTAPI
15796 ZwRecoverTransactionManager(
15797   IN HANDLE TransactionManagerHandle);
15798 
15799 NTSYSCALLAPI
15800 NTSTATUS
15801 NTAPI
15802 ZwQueryInformationTransactionManager(
15803   IN HANDLE TransactionManagerHandle,
15804   IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15805   OUT PVOID TransactionManagerInformation,
15806   IN ULONG TransactionManagerInformationLength,
15807   OUT PULONG ReturnLength OPTIONAL);
15808 
15809 NTSYSCALLAPI
15810 NTSTATUS
15811 NTAPI
15812 ZwSetInformationTransactionManager(
15813   IN HANDLE TmHandle,
15814   IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
15815   IN PVOID TransactionManagerInformation,
15816   IN ULONG TransactionManagerInformationLength);
15817 
15818 NTSYSCALLAPI
15819 NTSTATUS
15820 NTAPI
15821 ZwEnumerateTransactionObject(
15822   IN HANDLE RootObjectHandle OPTIONAL,
15823   IN KTMOBJECT_TYPE QueryType,
15824   IN OUT PKTMOBJECT_CURSOR ObjectCursor,
15825   IN ULONG ObjectCursorLength,
15826   OUT PULONG ReturnLength);
15827 
15828 NTSYSCALLAPI
15829 NTSTATUS
15830 NTAPI
15831 ZwCreateTransaction(
15832   OUT PHANDLE TransactionHandle,
15833   IN ACCESS_MASK DesiredAccess,
15834   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15835   IN LPGUID Uow OPTIONAL,
15836   IN HANDLE TmHandle OPTIONAL,
15837   IN ULONG CreateOptions OPTIONAL,
15838   IN ULONG IsolationLevel OPTIONAL,
15839   IN ULONG IsolationFlags OPTIONAL,
15840   IN PLARGE_INTEGER Timeout OPTIONAL,
15841   IN PUNICODE_STRING Description OPTIONAL);
15842 
15843 NTSYSCALLAPI
15844 NTSTATUS
15845 NTAPI
15846 ZwOpenTransaction(
15847   OUT PHANDLE TransactionHandle,
15848   IN ACCESS_MASK DesiredAccess,
15849   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15850   IN LPGUID Uow,
15851   IN HANDLE TmHandle OPTIONAL);
15852 
15853 NTSYSCALLAPI
15854 NTSTATUS
15855 NTAPI
15856 ZwQueryInformationTransaction(
15857   IN HANDLE TransactionHandle,
15858   IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15859   OUT PVOID TransactionInformation,
15860   IN ULONG TransactionInformationLength,
15861   OUT PULONG ReturnLength OPTIONAL);
15862 
15863 NTSYSCALLAPI
15864 NTSTATUS
15865 NTAPI
15866 ZwSetInformationTransaction(
15867   IN HANDLE TransactionHandle,
15868   IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
15869   IN PVOID TransactionInformation,
15870   IN ULONG TransactionInformationLength);
15871 
15872 NTSYSCALLAPI
15873 NTSTATUS
15874 NTAPI
15875 ZwCommitTransaction(
15876   IN HANDLE TransactionHandle,
15877   IN BOOLEAN Wait);
15878 
15879 NTSYSCALLAPI
15880 NTSTATUS
15881 NTAPI
15882 ZwRollbackTransaction(
15883   IN HANDLE TransactionHandle,
15884   IN BOOLEAN Wait);
15885 
15886 NTSYSCALLAPI
15887 NTSTATUS
15888 NTAPI
15889 ZwCreateResourceManager(
15890   OUT PHANDLE ResourceManagerHandle,
15891   IN ACCESS_MASK DesiredAccess,
15892   IN HANDLE TmHandle,
15893   IN LPGUID ResourceManagerGuid OPTIONAL,
15894   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15895   IN ULONG CreateOptions OPTIONAL,
15896   IN PUNICODE_STRING Description OPTIONAL);
15897 
15898 NTSYSCALLAPI
15899 NTSTATUS
15900 NTAPI
15901 ZwOpenResourceManager(
15902   OUT PHANDLE ResourceManagerHandle,
15903   IN ACCESS_MASK DesiredAccess,
15904   IN HANDLE TmHandle,
15905   IN LPGUID ResourceManagerGuid,
15906   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15907 
15908 NTSYSCALLAPI
15909 NTSTATUS
15910 NTAPI
15911 ZwRecoverResourceManager(
15912   IN HANDLE ResourceManagerHandle);
15913 
15914 NTSYSCALLAPI
15915 NTSTATUS
15916 NTAPI
15917 ZwGetNotificationResourceManager(
15918   IN HANDLE ResourceManagerHandle,
15919   OUT PTRANSACTION_NOTIFICATION TransactionNotification,
15920   IN ULONG NotificationLength,
15921   IN PLARGE_INTEGER Timeout,
15922   IN PULONG ReturnLength OPTIONAL,
15923   IN ULONG Asynchronous,
15924   IN ULONG_PTR AsynchronousContext OPTIONAL);
15925 
15926 NTSYSCALLAPI
15927 NTSTATUS
15928 NTAPI
15929 ZwQueryInformationResourceManager(
15930   IN HANDLE ResourceManagerHandle,
15931   IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15932   OUT PVOID ResourceManagerInformation,
15933   IN ULONG ResourceManagerInformationLength,
15934   IN PULONG ReturnLength OPTIONAL);
15935 
15936 NTSYSCALLAPI
15937 NTSTATUS
15938 NTAPI
15939 ZwSetInformationResourceManager(
15940   IN HANDLE ResourceManagerHandle,
15941   IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
15942   IN PVOID ResourceManagerInformation,
15943   IN ULONG ResourceManagerInformationLength);
15944 
15945 NTSYSCALLAPI
15946 NTSTATUS
15947 NTAPI
15948 ZwCreateEnlistment(
15949   OUT PHANDLE EnlistmentHandle,
15950   IN ACCESS_MASK DesiredAccess,
15951   IN HANDLE ResourceManagerHandle,
15952   IN HANDLE TransactionHandle,
15953   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
15954   IN ULONG CreateOptions OPTIONAL,
15955   IN NOTIFICATION_MASK NotificationMask,
15956   IN PVOID EnlistmentKey OPTIONAL);
15957 
15958 NTSYSCALLAPI
15959 NTSTATUS
15960 NTAPI
15961 ZwOpenEnlistment(
15962   OUT PHANDLE EnlistmentHandle,
15963   IN ACCESS_MASK DesiredAccess,
15964   IN HANDLE RmHandle,
15965   IN LPGUID EnlistmentGuid,
15966   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
15967 
15968 NTSYSCALLAPI
15969 NTSTATUS
15970 NTAPI
15971 ZwQueryInformationEnlistment(
15972   IN HANDLE EnlistmentHandle,
15973   IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15974   OUT PVOID EnlistmentInformation,
15975   IN ULONG EnlistmentInformationLength,
15976   IN PULONG ReturnLength OPTIONAL);
15977 
15978 NTSYSCALLAPI
15979 NTSTATUS
15980 NTAPI
15981 ZwSetInformationEnlistment(
15982   IN HANDLE EnlistmentHandle,
15983   IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
15984   IN PVOID EnlistmentInformation,
15985   IN ULONG EnlistmentInformationLength);
15986 
15987 NTSYSCALLAPI
15988 NTSTATUS
15989 NTAPI
15990 ZwRecoverEnlistment(
15991   IN HANDLE EnlistmentHandle,
15992   IN PVOID EnlistmentKey OPTIONAL);
15993 
15994 NTSYSCALLAPI
15995 NTSTATUS
15996 NTAPI
15997 ZwPrePrepareEnlistment(
15998   IN HANDLE EnlistmentHandle,
15999   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16000 
16001 NTSYSCALLAPI
16002 NTSTATUS
16003 NTAPI
16004 ZwPrepareEnlistment(
16005   IN HANDLE EnlistmentHandle,
16006   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16007 
16008 NTSYSCALLAPI
16009 NTSTATUS
16010 NTAPI
16011 ZwCommitEnlistment(
16012   IN HANDLE EnlistmentHandle,
16013   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16014 
16015 NTSYSCALLAPI
16016 NTSTATUS
16017 NTAPI
16018 ZwRollbackEnlistment(
16019   IN HANDLE EnlistmentHandle,
16020   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16021 
16022 NTSYSCALLAPI
16023 NTSTATUS
16024 NTAPI
16025 ZwPrePrepareComplete(
16026   IN HANDLE EnlistmentHandle,
16027   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16028 
16029 NTSYSCALLAPI
16030 NTSTATUS
16031 NTAPI
16032 ZwPrepareComplete(
16033   IN HANDLE EnlistmentHandle,
16034   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16035 
16036 NTSYSCALLAPI
16037 NTSTATUS
16038 NTAPI
16039 ZwCommitComplete(
16040   IN HANDLE EnlistmentHandle,
16041   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16042 
16043 NTSYSCALLAPI
16044 NTSTATUS
16045 NTAPI
16046 ZwReadOnlyEnlistment(
16047   IN HANDLE EnlistmentHandle,
16048   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16049 
16050 NTSYSCALLAPI
16051 NTSTATUS
16052 NTAPI
16053 ZwRollbackComplete(
16054   IN HANDLE EnlistmentHandle,
16055   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16056 
16057 NTSYSCALLAPI
16058 NTSTATUS
16059 NTAPI
16060 ZwSinglePhaseReject(
16061   IN HANDLE EnlistmentHandle,
16062   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
16063 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
16064 
16065 #if (NTDDI_VERSION >= NTDDI_WIN7)
16066 NTSYSAPI
16067 NTSTATUS
16068 NTAPI
16069 ZwOpenKeyEx(
16070   OUT PHANDLE KeyHandle,
16071   IN ACCESS_MASK DesiredAccess,
16072   IN POBJECT_ATTRIBUTES ObjectAttributes,
16073   IN ULONG OpenOptions);
16074 
16075 NTSYSAPI
16076 NTSTATUS
16077 NTAPI
16078 ZwOpenKeyTransactedEx(
16079   OUT PHANDLE KeyHandle,
16080   IN ACCESS_MASK DesiredAccess,
16081   IN POBJECT_ATTRIBUTES ObjectAttributes,
16082   IN ULONG OpenOptions,
16083   IN HANDLE TransactionHandle);
16084 
16085 NTSYSAPI
16086 NTSTATUS
16087 NTAPI
16088 ZwNotifyChangeMultipleKeys(
16089   IN HANDLE MasterKeyHandle,
16090   IN ULONG Count OPTIONAL,
16091   IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
16092   IN HANDLE Event OPTIONAL,
16093   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
16094   IN PVOID ApcContext OPTIONAL,
16095   OUT PIO_STATUS_BLOCK IoStatusBlock,
16096   IN ULONG CompletionFilter,
16097   IN BOOLEAN WatchTree,
16098   OUT PVOID Buffer OPTIONAL,
16099   IN ULONG BufferSize,
16100   IN BOOLEAN Asynchronous);
16101 
16102 NTSYSAPI
16103 NTSTATUS
16104 NTAPI
16105 ZwQueryMultipleValueKey(
16106   IN HANDLE KeyHandle,
16107   IN OUT PKEY_VALUE_ENTRY ValueEntries,
16108   IN ULONG EntryCount,
16109   OUT PVOID ValueBuffer,
16110   IN OUT PULONG BufferLength,
16111   OUT PULONG RequiredBufferLength OPTIONAL);
16112 
16113 NTSYSAPI
16114 NTSTATUS
16115 NTAPI
16116 ZwRenameKey(
16117   IN HANDLE KeyHandle,
16118   IN PUNICODE_STRING NewName);
16119 
16120 NTSYSAPI
16121 NTSTATUS
16122 NTAPI
16123 ZwSetInformationKey(
16124   IN HANDLE KeyHandle,
16125   IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
16126   IN PVOID KeySetInformation,
16127   IN ULONG KeySetInformationLength);
16128 
16129 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
16130 
16131 #ifdef __cplusplus
16132 }
16133 #endif
16134 
16135 #endif /* !_WDMDDK_ */
16136