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