ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

wdm.h
Go to the documentation of this file.
00001 /*
00002  * wdm.h
00003  *
00004  * Windows NT WDM Driver Developer Kit
00005  *
00006  * This file is part of the ReactOS DDK package.
00007  *
00008  * Contributors:
00009  *   Amine Khaldi (amine.khaldi@reactos.org)
00010  *   Timo Kreuzer (timo.kreuzer@reactos.org)
00011  *
00012  * THIS SOFTWARE IS NOT COPYRIGHTED
00013  *
00014  * This source code is offered for use in the public domain. You may
00015  * use, modify or distribute it freely.
00016  *
00017  * This code is distributed in the hope that it will be useful but
00018  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
00019  * DISCLAIMED. This includes but is not limited to warranties of
00020  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00021  *
00022  */
00023 #pragma once
00024 
00025 #ifndef _WDMDDK_
00026 #define _WDMDDK_
00027 
00028 #define WDM_MAJORVERSION        0x06
00029 #define WDM_MINORVERSION        0x00
00030 
00031 /* Included via ntddk.h? */
00032 #ifndef _NTDDK_
00033 #define _NTDDK_
00034 #define _WDM_INCLUDED_
00035 #define _DDK_DRIVER_
00036 #define NO_INTERLOCKED_INTRINSICS
00037 #endif /* _NTDDK_ */
00038 
00039 /* Dependencies */
00040 #define NT_INCLUDED
00041 #include <excpt.h>
00042 #include <ntdef.h>
00043 #include <ntstatus.h>
00044 #include <ntiologc.h>
00045 
00046 #ifndef GUID_DEFINED
00047 #include <guiddef.h>
00048 #endif
00049 
00050 #ifdef _MAC
00051 #ifndef _INC_STRING
00052 #include <string.h>
00053 #endif /* _INC_STRING */
00054 #else
00055 #include <string.h>
00056 #endif /* _MAC */
00057 
00058 #ifndef _KTMTYPES_
00059 typedef GUID UOW, *PUOW;
00060 #endif
00061 
00062 typedef GUID *PGUID;
00063 
00064 #if (NTDDI_VERSION >= NTDDI_WINXP)
00065 #include <dpfilter.h>
00066 #endif
00067 
00068 #include "intrin.h"
00069 
00070 __internal_kernel_driver
00071 __drv_Mode_impl(WDM_INCLUDED)
00072 
00073 #ifdef __cplusplus
00074 extern "C" {
00075 #endif
00076 
00077 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
00078 #define NTHALAPI DECLSPEC_IMPORT
00079 #else
00080 #define NTHALAPI
00081 #endif
00082 
00083 /* For ReactOS */
00084 #if !defined(_NTOSKRNL_) && !defined(_BLDR_)
00085 #define NTKERNELAPI DECLSPEC_IMPORT
00086 #else
00087 #define NTKERNELAPI
00088 #endif
00089 
00090 #if defined(_X86_) && !defined(_NTHAL_)
00091 #define _DECL_HAL_KE_IMPORT  DECLSPEC_IMPORT
00092 #elif defined(_X86_)
00093 #define _DECL_HAL_KE_IMPORT
00094 #else
00095 #define _DECL_HAL_KE_IMPORT NTKERNELAPI
00096 #endif
00097 
00098 #if defined(_WIN64)
00099 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
00100 #else
00101 #define POINTER_ALIGNMENT
00102 #endif
00103 
00104 /* Helper macro to enable gcc's extension.  */
00105 #ifndef __GNU_EXTENSION
00106 #ifdef __GNUC__
00107 #define __GNU_EXTENSION __extension__
00108 #else
00109 #define __GNU_EXTENSION
00110 #endif
00111 #endif
00112 
00113 #if defined(_MSC_VER)
00114 
00115 /* Disable some warnings */
00116 #pragma warning(disable:4115) /* Named type definition in parentheses */
00117 #pragma warning(disable:4201) /* Nameless unions and structs */
00118 #pragma warning(disable:4214) /* Bit fields of other types than int */
00119 #pragma warning(disable:4820) /* Padding added, due to alignemnet requirement */
00120 
00121 /* Indicate if #pragma alloc_text() is supported */
00122 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
00123 #define ALLOC_PRAGMA 1
00124 #endif
00125 
00126 /* Indicate if #pragma data_seg() is supported */
00127 #if defined(_M_IX86) || defined(_M_AMD64)
00128 #define ALLOC_DATA_PRAGMA 1
00129 #endif
00130 
00131 #endif
00132 
00133 #if defined(_WIN64)
00134 #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
00135 #define USE_DMA_MACROS
00136 #endif
00137 #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__)
00138 #define NO_LEGACY_DRIVERS
00139 #endif
00140 #endif /* defined(_WIN64) */
00141 
00142 /* Forward declarations */
00143 struct _IRP;
00144 struct _MDL;
00145 struct _KAPC;
00146 struct _KDPC;
00147 struct _FILE_OBJECT;
00148 struct _DMA_ADAPTER;
00149 struct _DEVICE_OBJECT;
00150 struct _DRIVER_OBJECT;
00151 struct _IO_STATUS_BLOCK;
00152 struct _DEVICE_DESCRIPTION;
00153 struct _SCATTER_GATHER_LIST;
00154 struct _DRIVE_LAYOUT_INFORMATION;
00155 struct _COMPRESSED_DATA_INFO;
00156 struct _IO_RESOURCE_DESCRIPTOR;
00157 
00158 /* Structures not exposed to drivers */
00159 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
00160 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
00161 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
00162 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
00163 typedef struct _EPROCESS *PEPROCESS;
00164 typedef struct _ETHREAD *PETHREAD;
00165 typedef struct _IO_TIMER *PIO_TIMER;
00166 typedef struct _KINTERRUPT *PKINTERRUPT;
00167 typedef struct _KPROCESS *PKPROCESS;
00168 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
00169 typedef struct _CONTEXT *PCONTEXT;
00170 
00171 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
00172 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
00173 #elif defined(_WDM_INCLUDED_)
00174 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
00175 #else
00176 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
00177 #endif
00178 
00179 #ifndef DEFINE_GUIDEX
00180 #ifdef _MSC_VER
00181 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
00182 #else
00183 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
00184 #endif
00185 #endif /* DEFINE_GUIDEX */
00186 
00187 #ifndef STATICGUIDOF
00188 #define STATICGUIDOF(guid) STATIC_##guid
00189 #endif
00190 
00191 /* GUID Comparison */
00192 #ifndef __IID_ALIGNED__
00193 #define __IID_ALIGNED__
00194 #ifdef __cplusplus
00195 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
00196 {
00197     return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) &&
00198              (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
00199 }
00200 #else
00201 #define IsEqualGUIDAligned(guid1, guid2) \
00202            ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
00203              (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
00204 #endif /* __cplusplus */
00205 #endif /* !__IID_ALIGNED__ */
00206 
00207 
00208 /******************************************************************************
00209  *                           INTERLOCKED Functions                            *
00210  ******************************************************************************/
00211 //
00212 // Intrinsics (note: taken from our winnt.h)
00213 // FIXME: 64-bit
00214 //
00215 #if defined(__GNUC__)
00216 
00217 static __inline__ BOOLEAN
00218 InterlockedBitTestAndSet(
00219     _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base,
00220     _In_ LONG Bit)
00221 {
00222 #if defined(_M_IX86)
00223   LONG OldBit;
00224   __asm__ __volatile__("lock "
00225                        "btsl %2,%1\n\t"
00226                        "sbbl %0,%0\n\t"
00227                        :"=r" (OldBit),"+m" (*Base)
00228                        :"Ir" (Bit)
00229                        : "memory");
00230   return OldBit;
00231 #else
00232   return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
00233 #endif
00234 }
00235 
00236 static __inline__ BOOLEAN
00237 InterlockedBitTestAndReset(
00238     _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base,
00239     _In_ LONG Bit)
00240 {
00241 #if defined(_M_IX86)
00242   LONG OldBit;
00243   __asm__ __volatile__("lock "
00244                        "btrl %2,%1\n\t"
00245                        "sbbl %0,%0\n\t"
00246                        :"=r" (OldBit),"+m" (*Base)
00247                        :"Ir" (Bit)
00248                        : "memory");
00249   return OldBit;
00250 #else
00251   return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
00252 #endif
00253 }
00254 
00255 #endif /* defined(__GNUC__) */
00256 
00257 #define BitScanForward _BitScanForward
00258 #define BitScanReverse _BitScanReverse
00259 #define BitTest _bittest
00260 #define BitTestAndComplement _bittestandcomplement
00261 #define BitTestAndSet _bittestandset
00262 #define BitTestAndReset _bittestandreset
00263 #define InterlockedBitTestAndSet _interlockedbittestandset
00264 #define InterlockedBitTestAndReset _interlockedbittestandreset
00265 
00266 #ifdef _M_AMD64
00267 #define BitTest64 _bittest64
00268 #define BitTestAndComplement64 _bittestandcomplement64
00269 #define BitTestAndSet64 _bittestandset64
00270 #define BitTestAndReset64 _bittestandreset64
00271 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
00272 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
00273 #endif
00274 
00275 #if !defined(__INTERLOCKED_DECLARED)
00276 #define __INTERLOCKED_DECLARED
00277 
00278 #if defined (_X86_)
00279 #if defined(NO_INTERLOCKED_INTRINSICS)
00280 NTKERNELAPI
00281 LONG
00282 FASTCALL
00283 InterlockedIncrement(
00284     _Inout_ _Interlocked_operand_ LONG volatile *Addend);
00285 
00286 NTKERNELAPI
00287 LONG
00288 FASTCALL
00289 InterlockedDecrement(
00290     _Inout_ _Interlocked_operand_ LONG volatile *Addend);
00291 
00292 NTKERNELAPI
00293 LONG
00294 FASTCALL
00295 InterlockedCompareExchange(
00296     _Inout_ _Interlocked_operand_ LONG volatile *Destination,
00297   _In_ LONG Exchange,
00298   _In_ LONG Comparand);
00299 
00300 NTKERNELAPI
00301 LONG
00302 FASTCALL
00303 InterlockedExchange(
00304     _Inout_ _Interlocked_operand_ LONG volatile *Destination,
00305     _In_ LONG Value);
00306 
00307 NTKERNELAPI
00308 LONG
00309 FASTCALL
00310 InterlockedExchangeAdd(
00311     _Inout_ _Interlocked_operand_ LONG volatile *Addend,
00312     _In_ LONG Value);
00313 
00314 #else /* !defined(NO_INTERLOCKED_INTRINSICS) */
00315 
00316 #define InterlockedExchange _InterlockedExchange
00317 #define InterlockedIncrement _InterlockedIncrement
00318 #define InterlockedDecrement _InterlockedDecrement
00319 #define InterlockedExchangeAdd _InterlockedExchangeAdd
00320 #define InterlockedCompareExchange _InterlockedCompareExchange
00321 #define InterlockedOr _InterlockedOr
00322 #define InterlockedAnd _InterlockedAnd
00323 #define InterlockedXor _InterlockedXor
00324 
00325 #endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
00326 
00327 #endif /* defined (_X86_) */
00328 
00329 #if !defined (_WIN64)
00330 /*
00331  * PVOID
00332  * InterlockedExchangePointer(
00333  *   IN OUT PVOID volatile  *Target,
00334  *   IN PVOID  Value)
00335  */
00336 #define InterlockedExchangePointer(Target, Value) \
00337   ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
00338 
00339 /*
00340  * PVOID
00341  * InterlockedCompareExchangePointer(
00342  *   IN OUT PVOID  *Destination,
00343  *   IN PVOID  Exchange,
00344  *   IN PVOID  Comparand)
00345  */
00346 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
00347   ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
00348 
00349 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
00350 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
00351 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
00352 
00353 #endif // !defined (_WIN64)
00354 
00355 #if defined (_M_AMD64)
00356 
00357 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
00358 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
00359 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
00360 #define InterlockedAnd _InterlockedAnd
00361 #define InterlockedOr _InterlockedOr
00362 #define InterlockedXor _InterlockedXor
00363 #define InterlockedIncrement _InterlockedIncrement
00364 #define InterlockedDecrement _InterlockedDecrement
00365 #define InterlockedAdd _InterlockedAdd
00366 #define InterlockedExchange _InterlockedExchange
00367 #define InterlockedExchangeAdd _InterlockedExchangeAdd
00368 #define InterlockedCompareExchange _InterlockedCompareExchange
00369 #define InterlockedAnd64 _InterlockedAnd64
00370 #define InterlockedOr64 _InterlockedOr64
00371 #define InterlockedXor64 _InterlockedXor64
00372 #define InterlockedIncrement64 _InterlockedIncrement64
00373 #define InterlockedDecrement64 _InterlockedDecrement64
00374 #define InterlockedAdd64 _InterlockedAdd64
00375 #define InterlockedExchange64 _InterlockedExchange64
00376 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
00377 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
00378 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
00379 #define InterlockedExchangePointer _InterlockedExchangePointer
00380 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
00381 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
00382 
00383 #endif // _M_AMD64
00384 
00385 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
00386 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
00387 FORCEINLINE
00388 LONG64
00389 InterlockedAdd64(
00390     _Inout_ _Interlocked_operand_ LONG64 volatile *Addend,
00391     _In_ LONG64 Value)
00392 {
00393   return InterlockedExchangeAdd64(Addend, Value) + Value;
00394 }
00395 //#endif
00396 #endif
00397 
00398 #endif /* !__INTERLOCKED_DECLARED */
00399 
00400 
00401 /******************************************************************************
00402  *                           Runtime Library Types                            *
00403  ******************************************************************************/
00404 
00405 #define RTL_REGISTRY_ABSOLUTE             0
00406 #define RTL_REGISTRY_SERVICES             1
00407 #define RTL_REGISTRY_CONTROL              2
00408 #define RTL_REGISTRY_WINDOWS_NT           3
00409 #define RTL_REGISTRY_DEVICEMAP            4
00410 #define RTL_REGISTRY_USER                 5
00411 #define RTL_REGISTRY_MAXIMUM              6
00412 #define RTL_REGISTRY_HANDLE               0x40000000
00413 #define RTL_REGISTRY_OPTIONAL             0x80000000
00414 
00415 /* RTL_QUERY_REGISTRY_TABLE.Flags */
00416 #define RTL_QUERY_REGISTRY_SUBKEY         0x00000001
00417 #define RTL_QUERY_REGISTRY_TOPKEY         0x00000002
00418 #define RTL_QUERY_REGISTRY_REQUIRED       0x00000004
00419 #define RTL_QUERY_REGISTRY_NOVALUE        0x00000008
00420 #define RTL_QUERY_REGISTRY_NOEXPAND       0x00000010
00421 #define RTL_QUERY_REGISTRY_DIRECT         0x00000020
00422 #define RTL_QUERY_REGISTRY_DELETE         0x00000040
00423 
00424 #define HASH_STRING_ALGORITHM_DEFAULT     0
00425 #define HASH_STRING_ALGORITHM_X65599      1
00426 #define HASH_STRING_ALGORITHM_INVALID     0xffffffff
00427 
00428 typedef struct _RTL_BITMAP {
00429   ULONG SizeOfBitMap;
00430   PULONG Buffer;
00431 } RTL_BITMAP, *PRTL_BITMAP;
00432 
00433 typedef struct _RTL_BITMAP_RUN {
00434   ULONG StartingIndex;
00435   ULONG NumberOfBits;
00436 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
00437 
00438 _Function_class_(RTL_QUERY_REGISTRY_ROUTINE)
00439 _IRQL_requires_max_(PASSIVE_LEVEL)
00440 _IRQL_requires_same_
00441 typedef NTSTATUS
00442 (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
00443   _In_z_ PWSTR ValueName,
00444   _In_ ULONG ValueType,
00445   _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
00446   _In_ ULONG ValueLength,
00447   _In_opt_ PVOID Context,
00448   _In_opt_ PVOID EntryContext);
00449 
00450 typedef struct _RTL_QUERY_REGISTRY_TABLE {
00451   PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
00452   ULONG Flags;
00453   PCWSTR Name;
00454   PVOID EntryContext;
00455   ULONG DefaultType;
00456   PVOID DefaultData;
00457   ULONG DefaultLength;
00458 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
00459 
00460 typedef struct _TIME_FIELDS {
00461   CSHORT Year;
00462   CSHORT Month;
00463   CSHORT Day;
00464   CSHORT Hour;
00465   CSHORT Minute;
00466   CSHORT Second;
00467   CSHORT Milliseconds;
00468   CSHORT Weekday;
00469 } TIME_FIELDS, *PTIME_FIELDS;
00470 
00471 /* Slist Header */
00472 #ifndef _SLIST_HEADER_
00473 #define _SLIST_HEADER_
00474 
00475 #if defined(_WIN64)
00476 
00477 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
00478   struct _SLIST_ENTRY *Next;
00479 } SLIST_ENTRY, *PSLIST_ENTRY;
00480 
00481 typedef struct _SLIST_ENTRY32 {
00482   ULONG Next;
00483 } SLIST_ENTRY32, *PSLIST_ENTRY32;
00484 
00485 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
00486   _ANONYMOUS_STRUCT struct {
00487     ULONGLONG Alignment;
00488     ULONGLONG Region;
00489   } DUMMYSTRUCTNAME;
00490   struct {
00491     ULONGLONG Depth:16;
00492     ULONGLONG Sequence:9;
00493     ULONGLONG NextEntry:39;
00494     ULONGLONG HeaderType:1;
00495     ULONGLONG Init:1;
00496     ULONGLONG Reserved:59;
00497     ULONGLONG Region:3;
00498   } Header8;
00499   struct {
00500     ULONGLONG Depth:16;
00501     ULONGLONG Sequence:48;
00502     ULONGLONG HeaderType:1;
00503     ULONGLONG Init:1;
00504     ULONGLONG Reserved:2;
00505     ULONGLONG NextEntry:60;
00506   } Header16;
00507   struct {
00508     ULONGLONG Depth:16;
00509     ULONGLONG Sequence:48;
00510     ULONGLONG HeaderType:1;
00511     ULONGLONG Reserved:3;
00512     ULONGLONG NextEntry:60;
00513   } HeaderX64;
00514 } SLIST_HEADER, *PSLIST_HEADER;
00515 
00516 typedef union _SLIST_HEADER32 {
00517   ULONGLONG Alignment;
00518   _ANONYMOUS_STRUCT struct {
00519     SLIST_ENTRY32 Next;
00520     USHORT Depth;
00521     USHORT Sequence;
00522   } DUMMYSTRUCTNAME;
00523 } SLIST_HEADER32, *PSLIST_HEADER32;
00524 
00525 #else
00526 
00527 #define SLIST_ENTRY SINGLE_LIST_ENTRY
00528 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
00529 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
00530 
00531 typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
00532 
00533 typedef union _SLIST_HEADER {
00534   ULONGLONG Alignment;
00535   _ANONYMOUS_STRUCT struct {
00536     SLIST_ENTRY Next;
00537     USHORT Depth;
00538     USHORT Sequence;
00539   } DUMMYSTRUCTNAME;
00540 } SLIST_HEADER, *PSLIST_HEADER;
00541 
00542 typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
00543 
00544 #endif /* defined(_WIN64) */
00545 
00546 #endif /* _SLIST_HEADER_ */
00547 
00548 /* MS definition is broken! */
00549 extern BOOLEAN NTSYSAPI NlsMbCodePageTag;
00550 extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag;
00551 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
00552 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
00553 
00554 #define SHORT_LEAST_SIGNIFICANT_BIT       0
00555 #define SHORT_MOST_SIGNIFICANT_BIT        1
00556 
00557 #define LONG_LEAST_SIGNIFICANT_BIT        0
00558 #define LONG_3RD_MOST_SIGNIFICANT_BIT     1
00559 #define LONG_2ND_MOST_SIGNIFICANT_BIT     2
00560 #define LONG_MOST_SIGNIFICANT_BIT         3
00561 
00562 #define RTLVERLIB_DDI(x) Wdmlib##x
00563 
00564 typedef BOOLEAN
00565 (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)(
00566   _In_ ULONG Version);
00567 
00568 typedef BOOLEAN
00569 (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)(
00570   _In_ ULONG Version);
00571 
00572 /******************************************************************************
00573  *                              Kernel Types                                  *
00574  ******************************************************************************/
00575 
00576 typedef UCHAR KIRQL, *PKIRQL;
00577 typedef CCHAR KPROCESSOR_MODE;
00578 typedef LONG KPRIORITY;
00579 
00580 typedef enum _MODE {
00581   KernelMode,
00582   UserMode,
00583   MaximumMode
00584 } MODE;
00585 
00586 #define CACHE_FULLY_ASSOCIATIVE 0xFF
00587 #define MAXIMUM_SUSPEND_COUNT   MAXCHAR
00588 
00589 #define EVENT_QUERY_STATE (0x0001)
00590 #define EVENT_MODIFY_STATE (0x0002)
00591 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
00592 
00593 #define LTP_PC_SMT 0x1
00594 
00595 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
00596 #define SINGLE_GROUP_LEGACY_API        1
00597 #endif
00598 
00599 #define SEMAPHORE_QUERY_STATE (0x0001)
00600 #define SEMAPHORE_MODIFY_STATE (0x0002)
00601 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
00602 
00603 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
00604   RelationProcessorCore,
00605   RelationNumaNode,
00606   RelationCache,
00607   RelationProcessorPackage,
00608   RelationGroup,
00609   RelationAll = 0xffff
00610 } LOGICAL_PROCESSOR_RELATIONSHIP;
00611 
00612 typedef enum _PROCESSOR_CACHE_TYPE {
00613   CacheUnified,
00614   CacheInstruction,
00615   CacheData,
00616   CacheTrace
00617 } PROCESSOR_CACHE_TYPE;
00618 
00619 typedef struct _CACHE_DESCRIPTOR {
00620   UCHAR Level;
00621   UCHAR Associativity;
00622   USHORT LineSize;
00623   ULONG Size;
00624   PROCESSOR_CACHE_TYPE Type;
00625 } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
00626 
00627 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
00628   ULONG_PTR ProcessorMask;
00629   LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
00630   _ANONYMOUS_UNION union {
00631     struct {
00632       UCHAR Flags;
00633     } ProcessorCore;
00634     struct {
00635       ULONG NodeNumber;
00636     } NumaNode;
00637     CACHE_DESCRIPTOR Cache;
00638     ULONGLONG Reserved[2];
00639   } DUMMYUNIONNAME;
00640 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
00641 
00642 typedef struct _PROCESSOR_RELATIONSHIP {
00643   UCHAR Flags;
00644   UCHAR Reserved[21];
00645   USHORT GroupCount;
00646   _Field_size_(GroupCount) GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
00647 } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
00648 
00649 typedef struct _NUMA_NODE_RELATIONSHIP {
00650   ULONG NodeNumber;
00651   UCHAR Reserved[20];
00652   GROUP_AFFINITY GroupMask;
00653 } NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP;
00654 
00655 typedef struct _CACHE_RELATIONSHIP {
00656   UCHAR Level;
00657   UCHAR Associativity;
00658   USHORT LineSize;
00659   ULONG CacheSize;
00660   PROCESSOR_CACHE_TYPE Type;
00661   UCHAR Reserved[20];
00662   GROUP_AFFINITY GroupMask;
00663 } CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP;
00664 
00665 typedef struct _PROCESSOR_GROUP_INFO {
00666   UCHAR MaximumProcessorCount;
00667   UCHAR ActiveProcessorCount;
00668   UCHAR Reserved[38];
00669   KAFFINITY ActiveProcessorMask;
00670 } PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO;
00671 
00672 typedef struct _GROUP_RELATIONSHIP {
00673   USHORT MaximumGroupCount;
00674   USHORT ActiveGroupCount;
00675   UCHAR Reserved[20];
00676   PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY];
00677 } GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP;
00678 
00679 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
00680   LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
00681   ULONG Size;
00682   _ANONYMOUS_UNION union {
00683     PROCESSOR_RELATIONSHIP Processor;
00684     NUMA_NODE_RELATIONSHIP NumaNode;
00685     CACHE_RELATIONSHIP Cache;
00686     GROUP_RELATIONSHIP Group;
00687   } DUMMYUNIONNAME;
00688 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;;
00689 
00690 /* Processor features */
00691 #define PF_FLOATING_POINT_PRECISION_ERRATA  0
00692 #define PF_FLOATING_POINT_EMULATED          1
00693 #define PF_COMPARE_EXCHANGE_DOUBLE          2
00694 #define PF_MMX_INSTRUCTIONS_AVAILABLE       3
00695 #define PF_PPC_MOVEMEM_64BIT_OK             4
00696 #define PF_ALPHA_BYTE_INSTRUCTIONS          5
00697 #define PF_XMMI_INSTRUCTIONS_AVAILABLE      6
00698 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE     7
00699 #define PF_RDTSC_INSTRUCTION_AVAILABLE      8
00700 #define PF_PAE_ENABLED                      9
00701 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE   10
00702 #define PF_SSE_DAZ_MODE_AVAILABLE          11
00703 #define PF_NX_ENABLED                      12
00704 #define PF_SSE3_INSTRUCTIONS_AVAILABLE     13
00705 #define PF_COMPARE_EXCHANGE128             14
00706 #define PF_COMPARE64_EXCHANGE128           15
00707 #define PF_CHANNELS_ENABLED                16
00708 #define PF_XSAVE_ENABLED                   17
00709 
00710 #define MAXIMUM_WAIT_OBJECTS              64
00711 
00712 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
00713 
00714 #define ASSERT_DPC(Object) \
00715     ASSERT(((Object)->Type == 0) || \
00716            ((Object)->Type == DpcObject) || \
00717            ((Object)->Type == ThreadedDpcObject))
00718 
00719 #define ASSERT_GATE(object) \
00720     NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
00721               (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
00722 
00723 #define ASSERT_DEVICE_QUEUE(Object) \
00724     NT_ASSERT((Object)->Type == DeviceQueueObject)
00725 
00726 #define ASSERT_TIMER(E) \
00727     NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
00728               ((E)->Header.Type == TimerSynchronizationObject))
00729 
00730 #define ASSERT_MUTANT(E) \
00731     NT_ASSERT((E)->Header.Type == MutantObject)
00732 
00733 #define ASSERT_SEMAPHORE(E) \
00734     NT_ASSERT((E)->Header.Type == SemaphoreObject)
00735 
00736 #define ASSERT_EVENT(E) \
00737     NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
00738               ((E)->Header.Type == SynchronizationEvent))
00739 
00740 #define DPC_NORMAL 0
00741 #define DPC_THREADED 1
00742 
00743 #define GM_LOCK_BIT          0x1
00744 #define GM_LOCK_BIT_V        0x0
00745 #define GM_LOCK_WAITER_WOKEN 0x2
00746 #define GM_LOCK_WAITER_INC   0x4
00747 
00748 #define LOCK_QUEUE_WAIT_BIT               0
00749 #define LOCK_QUEUE_OWNER_BIT              1
00750 
00751 #define LOCK_QUEUE_WAIT                   1
00752 #define LOCK_QUEUE_OWNER                  2
00753 #define LOCK_QUEUE_TIMER_LOCK_SHIFT       4
00754 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
00755 
00756 #define PROCESSOR_FEATURE_MAX 64
00757 
00758 #define DBG_STATUS_CONTROL_C              1
00759 #define DBG_STATUS_SYSRQ                  2
00760 #define DBG_STATUS_BUGCHECK_FIRST         3
00761 #define DBG_STATUS_BUGCHECK_SECOND        4
00762 #define DBG_STATUS_FATAL                  5
00763 #define DBG_STATUS_DEBUG_CONTROL          6
00764 #define DBG_STATUS_WORKER                 7
00765 
00766 #if defined(_WIN64)
00767 #define MAXIMUM_PROC_PER_GROUP 64
00768 #else
00769 #define MAXIMUM_PROC_PER_GROUP 32
00770 #endif
00771 #define MAXIMUM_PROCESSORS          MAXIMUM_PROC_PER_GROUP
00772 
00773 /* Exception Records */
00774 #define EXCEPTION_NONCONTINUABLE     1
00775 #define EXCEPTION_MAXIMUM_PARAMETERS 15
00776 
00777 #define EXCEPTION_DIVIDED_BY_ZERO       0
00778 #define EXCEPTION_DEBUG                 1
00779 #define EXCEPTION_NMI                   2
00780 #define EXCEPTION_INT3                  3
00781 #define EXCEPTION_BOUND_CHECK           5
00782 #define EXCEPTION_INVALID_OPCODE        6
00783 #define EXCEPTION_NPX_NOT_AVAILABLE     7
00784 #define EXCEPTION_DOUBLE_FAULT          8
00785 #define EXCEPTION_NPX_OVERRUN           9
00786 #define EXCEPTION_INVALID_TSS           0x0A
00787 #define EXCEPTION_SEGMENT_NOT_PRESENT   0x0B
00788 #define EXCEPTION_STACK_FAULT           0x0C
00789 #define EXCEPTION_GP_FAULT              0x0D
00790 #define EXCEPTION_RESERVED_TRAP         0x0F
00791 #define EXCEPTION_NPX_ERROR             0x010
00792 #define EXCEPTION_ALIGNMENT_CHECK       0x011
00793 
00794 typedef struct _EXCEPTION_RECORD {
00795   NTSTATUS ExceptionCode;
00796   ULONG ExceptionFlags;
00797   struct _EXCEPTION_RECORD *ExceptionRecord;
00798   PVOID ExceptionAddress;
00799   ULONG NumberParameters;
00800   ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
00801 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
00802 
00803 typedef struct _EXCEPTION_RECORD32 {
00804   NTSTATUS ExceptionCode;
00805   ULONG ExceptionFlags;
00806   ULONG ExceptionRecord;
00807   ULONG ExceptionAddress;
00808   ULONG NumberParameters;
00809   ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
00810 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
00811 
00812 typedef struct _EXCEPTION_RECORD64 {
00813   NTSTATUS ExceptionCode;
00814   ULONG ExceptionFlags;
00815   ULONG64 ExceptionRecord;
00816   ULONG64 ExceptionAddress;
00817   ULONG NumberParameters;
00818   ULONG __unusedAlignment;
00819   ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
00820 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
00821 
00822 typedef struct _EXCEPTION_POINTERS {
00823   PEXCEPTION_RECORD ExceptionRecord;
00824   PCONTEXT ContextRecord;
00825 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
00826 
00827 typedef enum _KBUGCHECK_CALLBACK_REASON {
00828   KbCallbackInvalid,
00829   KbCallbackReserved1,
00830   KbCallbackSecondaryDumpData,
00831   KbCallbackDumpIo,
00832   KbCallbackAddPages
00833 } KBUGCHECK_CALLBACK_REASON;
00834 
00835 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
00836 
00837 _Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE)
00838 _IRQL_requires_same_
00839 typedef VOID
00840 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)(
00841     _In_ KBUGCHECK_CALLBACK_REASON Reason,
00842     _In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
00843     _Inout_ PVOID ReasonSpecificData,
00844     _In_ ULONG ReasonSpecificDataLength);
00845 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE;
00846 
00847 typedef struct _KBUGCHECK_ADD_PAGES {
00848   _Inout_ PVOID Context;
00849   _Inout_ ULONG Flags;
00850   _In_ ULONG BugCheckCode;
00851   _Out_ ULONG_PTR Address;
00852   _Out_ ULONG_PTR Count;
00853 } KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES;
00854 
00855 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA {
00856   _In_ PVOID InBuffer;
00857   _In_ ULONG InBufferLength;
00858   _In_ ULONG MaximumAllowed;
00859   _Out_ GUID Guid;
00860   _Out_ PVOID OutBuffer;
00861   _Out_ ULONG OutBufferLength;
00862 } KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA;
00863 
00864 typedef enum _KBUGCHECK_DUMP_IO_TYPE {
00865   KbDumpIoInvalid,
00866   KbDumpIoHeader,
00867   KbDumpIoBody,
00868   KbDumpIoSecondaryData,
00869   KbDumpIoComplete
00870 } KBUGCHECK_DUMP_IO_TYPE;
00871 
00872 typedef struct _KBUGCHECK_DUMP_IO {
00873   _In_ ULONG64 Offset;
00874   _In_ PVOID Buffer;
00875   _In_ ULONG BufferLength;
00876   _In_ KBUGCHECK_DUMP_IO_TYPE Type;
00877 } KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO;
00878 
00879 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS         0x00000001UL
00880 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS        0x00000002UL
00881 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
00882 
00883 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
00884   LIST_ENTRY Entry;
00885   PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
00886   PUCHAR Component;
00887   ULONG_PTR Checksum;
00888   KBUGCHECK_CALLBACK_REASON Reason;
00889   UCHAR State;
00890 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
00891 
00892 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
00893   BufferEmpty,
00894   BufferInserted,
00895   BufferStarted,
00896   BufferFinished,
00897   BufferIncomplete
00898 } KBUGCHECK_BUFFER_DUMP_STATE;
00899 
00900 _Function_class_(KBUGCHECK_CALLBACK_ROUTINE)
00901 _IRQL_requires_same_
00902 typedef VOID
00903 (NTAPI KBUGCHECK_CALLBACK_ROUTINE)(
00904   IN PVOID Buffer,
00905   IN ULONG Length);
00906 typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE;
00907 
00908 typedef struct _KBUGCHECK_CALLBACK_RECORD {
00909   LIST_ENTRY Entry;
00910   PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
00911   _Field_size_bytes_opt_(Length) PVOID Buffer;
00912   ULONG Length;
00913   PUCHAR Component;
00914   ULONG_PTR Checksum;
00915   UCHAR State;
00916 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
00917 
00918 _Function_class_(NMI_CALLBACK)
00919 _IRQL_requires_same_
00920 typedef BOOLEAN
00921 (NTAPI NMI_CALLBACK)(
00922   _In_opt_ PVOID Context,
00923   _In_ BOOLEAN Handled);
00924 typedef NMI_CALLBACK *PNMI_CALLBACK;
00925 
00926 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE {
00927   KeProcessorAddStartNotify = 0,
00928   KeProcessorAddCompleteNotify,
00929   KeProcessorAddFailureNotify
00930 } KE_PROCESSOR_CHANGE_NOTIFY_STATE;
00931 
00932 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT {
00933   KE_PROCESSOR_CHANGE_NOTIFY_STATE State;
00934   ULONG NtNumber;
00935   NTSTATUS Status;
00936 #if (NTDDI_VERSION >= NTDDI_WIN7)
00937   PROCESSOR_NUMBER ProcNumber;
00938 #endif
00939 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT;
00940 
00941 _IRQL_requires_same_
00942 _Function_class_(PROCESSOR_CALLBACK_FUNCTION)
00943 typedef VOID
00944 (NTAPI PROCESSOR_CALLBACK_FUNCTION)(
00945   _In_ PVOID CallbackContext,
00946   _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
00947   _Inout_ PNTSTATUS OperationStatus);
00948 typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION;
00949 
00950 #define KE_PROCESSOR_CHANGE_ADD_EXISTING         1
00951 
00952 #define INVALID_PROCESSOR_INDEX     0xffffffff
00953 
00954 typedef enum _KINTERRUPT_POLARITY {
00955   InterruptPolarityUnknown,
00956   InterruptActiveHigh,
00957   InterruptActiveLow
00958 } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
00959 
00960 typedef enum _KPROFILE_SOURCE {
00961   ProfileTime,
00962   ProfileAlignmentFixup,
00963   ProfileTotalIssues,
00964   ProfilePipelineDry,
00965   ProfileLoadInstructions,
00966   ProfilePipelineFrozen,
00967   ProfileBranchInstructions,
00968   ProfileTotalNonissues,
00969   ProfileDcacheMisses,
00970   ProfileIcacheMisses,
00971   ProfileCacheMisses,
00972   ProfileBranchMispredictions,
00973   ProfileStoreInstructions,
00974   ProfileFpInstructions,
00975   ProfileIntegerInstructions,
00976   Profile2Issue,
00977   Profile3Issue,
00978   Profile4Issue,
00979   ProfileSpecialInstructions,
00980   ProfileTotalCycles,
00981   ProfileIcacheIssues,
00982   ProfileDcacheAccesses,
00983   ProfileMemoryBarrierCycles,
00984   ProfileLoadLinkedIssues,
00985   ProfileMaximum
00986 } KPROFILE_SOURCE;
00987 
00988 typedef enum _KWAIT_REASON {
00989   Executive,
00990   FreePage,
00991   PageIn,
00992   PoolAllocation,
00993   DelayExecution,
00994   Suspended,
00995   UserRequest,
00996   WrExecutive,
00997   WrFreePage,
00998   WrPageIn,
00999   WrPoolAllocation,
01000   WrDelayExecution,
01001   WrSuspended,
01002   WrUserRequest,
01003   WrEventPair,
01004   WrQueue,
01005   WrLpcReceive,
01006   WrLpcReply,
01007   WrVirtualMemory,
01008   WrPageOut,
01009   WrRendezvous,
01010   WrKeyedEvent,
01011   WrTerminated,
01012   WrProcessInSwap,
01013   WrCpuRateControl,
01014   WrCalloutStack,
01015   WrKernel,
01016   WrResource,
01017   WrPushLock,
01018   WrMutex,
01019   WrQuantumEnd,
01020   WrDispatchInt,
01021   WrPreempted,
01022   WrYieldExecution,
01023   WrFastMutex,
01024   WrGuardedMutex,
01025   WrRundown,
01026   MaximumWaitReason
01027 } KWAIT_REASON;
01028 
01029 typedef struct _KWAIT_BLOCK {
01030   LIST_ENTRY WaitListEntry;
01031   struct _KTHREAD *Thread;
01032   PVOID Object;
01033   struct _KWAIT_BLOCK *NextWaitBlock;
01034   USHORT WaitKey;
01035   UCHAR WaitType;
01036 #if (NTDDI_VERSION >= NTDDI_WIN7)
01037   volatile UCHAR BlockState;
01038 #else
01039   UCHAR SpareByte;
01040 #endif
01041 #if defined(_WIN64)
01042   LONG SpareLong;
01043 #endif
01044 } KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
01045 
01046 typedef enum _KINTERRUPT_MODE {
01047   LevelSensitive,
01048   Latched
01049 } KINTERRUPT_MODE;
01050 
01051 #define THREAD_WAIT_OBJECTS 3
01052 
01053 _IRQL_requires_same_
01054 _Function_class_(KSTART_ROUTINE)
01055 typedef VOID
01056 (NTAPI KSTART_ROUTINE)(
01057   _In_ PVOID StartContext);
01058 typedef KSTART_ROUTINE *PKSTART_ROUTINE;
01059 
01060 typedef VOID
01061 (NTAPI *PKINTERRUPT_ROUTINE)(
01062   VOID);
01063 
01064 _Function_class_(KSERVICE_ROUTINE)
01065 _IRQL_requires_(HIGH_LEVEL)
01066 _IRQL_requires_same_
01067 typedef BOOLEAN
01068 (NTAPI KSERVICE_ROUTINE)(
01069   _In_ struct _KINTERRUPT *Interrupt,
01070   _In_ PVOID ServiceContext);
01071 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
01072 
01073 _Function_class_(KMESSAGE_SERVICE_ROUTINE)
01074 _IRQL_requires_same_
01075 typedef BOOLEAN
01076 (NTAPI KMESSAGE_SERVICE_ROUTINE)(
01077   _In_ struct _KINTERRUPT *Interrupt,
01078   _In_ PVOID ServiceContext,
01079   _In_ ULONG MessageID);
01080 typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE;
01081 
01082 typedef enum _KD_OPTION {
01083   KD_OPTION_SET_BLOCK_ENABLE,
01084 } KD_OPTION;
01085 
01086 typedef VOID
01087 (NTAPI *PKNORMAL_ROUTINE)(
01088   IN PVOID NormalContext OPTIONAL,
01089   IN PVOID SystemArgument1 OPTIONAL,
01090   IN PVOID SystemArgument2 OPTIONAL);
01091 
01092 typedef VOID
01093 (NTAPI *PKRUNDOWN_ROUTINE)(
01094   IN struct _KAPC *Apc);
01095 
01096 typedef VOID
01097 (NTAPI *PKKERNEL_ROUTINE)(
01098   IN struct _KAPC *Apc,
01099   IN OUT PKNORMAL_ROUTINE *NormalRoutine OPTIONAL,
01100   IN OUT PVOID *NormalContext OPTIONAL,
01101   IN OUT PVOID *SystemArgument1 OPTIONAL,
01102   IN OUT PVOID *SystemArgument2 OPTIONAL);
01103 
01104 typedef struct _KAPC {
01105   UCHAR Type;
01106   UCHAR SpareByte0;
01107   UCHAR Size;
01108   UCHAR SpareByte1;
01109   ULONG SpareLong0;
01110   struct _KTHREAD *Thread;
01111   LIST_ENTRY ApcListEntry;
01112   PKKERNEL_ROUTINE KernelRoutine;
01113   PKRUNDOWN_ROUTINE RundownRoutine;
01114   PKNORMAL_ROUTINE NormalRoutine;
01115   PVOID NormalContext;
01116   PVOID SystemArgument1;
01117   PVOID SystemArgument2;
01118   CCHAR ApcStateIndex;
01119   KPROCESSOR_MODE ApcMode;
01120   BOOLEAN Inserted;
01121 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
01122 
01123 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
01124 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
01125 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
01126 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
01127 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
01128 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
01129 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
01130 
01131 typedef struct _KDEVICE_QUEUE_ENTRY {
01132   LIST_ENTRY DeviceListEntry;
01133   ULONG SortKey;
01134   BOOLEAN Inserted;
01135 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
01136 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
01137 
01138 typedef PVOID PKIPI_CONTEXT;
01139 
01140 typedef VOID
01141 (NTAPI *PKIPI_WORKER)(
01142   IN OUT PKIPI_CONTEXT PacketContext,
01143   IN PVOID Parameter1 OPTIONAL,
01144   IN PVOID Parameter2 OPTIONAL,
01145   IN PVOID Parameter3 OPTIONAL);
01146 
01147 typedef struct _KIPI_COUNTS {
01148   ULONG Freeze;
01149   ULONG Packet;
01150   ULONG DPC;
01151   ULONG APC;
01152   ULONG FlushSingleTb;
01153   ULONG FlushMultipleTb;
01154   ULONG FlushEntireTb;
01155   ULONG GenericCall;
01156   ULONG ChangeColor;
01157   ULONG SweepDcache;
01158   ULONG SweepIcache;
01159   ULONG SweepIcacheRange;
01160   ULONG FlushIoBuffers;
01161   ULONG GratuitousDPC;
01162 } KIPI_COUNTS, *PKIPI_COUNTS;
01163 
01164 _IRQL_requires_same_
01165 _Function_class_(KIPI_BROADCAST_WORKER)
01166 _IRQL_requires_(IPI_LEVEL)
01167 typedef ULONG_PTR
01168 (NTAPI KIPI_BROADCAST_WORKER)(
01169   _In_ ULONG_PTR Argument);
01170 typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER;
01171 
01172 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
01173 
01174 typedef struct _KSPIN_LOCK_QUEUE {
01175   struct _KSPIN_LOCK_QUEUE *volatile Next;
01176   PKSPIN_LOCK volatile Lock;
01177 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
01178 
01179 typedef struct _KLOCK_QUEUE_HANDLE {
01180   KSPIN_LOCK_QUEUE LockQueue;
01181   KIRQL OldIrql;
01182 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
01183 
01184 #if defined(_AMD64_)
01185 
01186 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
01187 
01188 #define LockQueueDispatcherLock 0
01189 #define LockQueueExpansionLock 1
01190 #define LockQueuePfnLock 2
01191 #define LockQueueSystemSpaceLock 3
01192 #define LockQueueVacbLock 4
01193 #define LockQueueMasterLock 5
01194 #define LockQueueNonPagedPoolLock 6
01195 #define LockQueueIoCancelLock 7
01196 #define LockQueueWorkQueueLock 8
01197 #define LockQueueIoVpbLock 9
01198 #define LockQueueIoDatabaseLock 10
01199 #define LockQueueIoCompletionLock 11
01200 #define LockQueueNtfsStructLock 12
01201 #define LockQueueAfdWorkQueueLock 13
01202 #define LockQueueBcbLock 14
01203 #define LockQueueMmNonPagedPoolLock 15
01204 #define LockQueueUnusedSpare16 16
01205 #define LockQueueTimerTableLock 17
01206 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
01207 
01208 #else
01209 
01210 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
01211   LockQueueDispatcherLock,
01212   LockQueueExpansionLock,
01213   LockQueuePfnLock,
01214   LockQueueSystemSpaceLock,
01215   LockQueueVacbLock,
01216   LockQueueMasterLock,
01217   LockQueueNonPagedPoolLock,
01218   LockQueueIoCancelLock,
01219   LockQueueWorkQueueLock,
01220   LockQueueIoVpbLock,
01221   LockQueueIoDatabaseLock,
01222   LockQueueIoCompletionLock,
01223   LockQueueNtfsStructLock,
01224   LockQueueAfdWorkQueueLock,
01225   LockQueueBcbLock,
01226   LockQueueMmNonPagedPoolLock,
01227   LockQueueUnusedSpare16,
01228   LockQueueTimerTableLock,
01229   LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
01230 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
01231 
01232 #endif /* defined(_AMD64_) */
01233 
01234 _Function_class_(KDEFERRED_ROUTINE)
01235 _IRQL_requires_(DISPATCH_LEVEL)
01236 _IRQL_requires_same_
01237 typedef VOID
01238 (NTAPI KDEFERRED_ROUTINE)(
01239   _In_ struct _KDPC *Dpc,
01240   _In_opt_ PVOID DeferredContext,
01241   _In_opt_ PVOID SystemArgument1,
01242   _In_opt_ PVOID SystemArgument2);
01243 typedef KDEFERRED_ROUTINE *PKDEFERRED_ROUTINE;
01244 
01245 typedef enum _KDPC_IMPORTANCE {
01246   LowImportance,
01247   MediumImportance,
01248   HighImportance,
01249   MediumHighImportance
01250 } KDPC_IMPORTANCE;
01251 
01252 typedef struct _KDPC {
01253   UCHAR Type;
01254   UCHAR Importance;
01255   volatile USHORT Number;
01256   LIST_ENTRY DpcListEntry;
01257   PKDEFERRED_ROUTINE DeferredRoutine;
01258   PVOID DeferredContext;
01259   PVOID SystemArgument1;
01260   PVOID SystemArgument2;
01261   volatile PVOID DpcData;
01262 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
01263 
01264 typedef struct _KDPC_WATCHDOG_INFORMATION {
01265   ULONG DpcTimeLimit;
01266   ULONG DpcTimeCount;
01267   ULONG DpcWatchdogLimit;
01268   ULONG DpcWatchdogCount;
01269   ULONG Reserved;
01270 } KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION;
01271 
01272 typedef struct _KDEVICE_QUEUE {
01273   CSHORT Type;
01274   CSHORT Size;
01275   LIST_ENTRY DeviceListHead;
01276   KSPIN_LOCK Lock;
01277 # if defined(_AMD64_)
01278   _ANONYMOUS_UNION union {
01279     BOOLEAN Busy;
01280     _ANONYMOUS_STRUCT struct {
01281       LONG64 Reserved:8;
01282       LONG64 Hint:56;
01283     } DUMMYSTRUCTNAME;
01284   } DUMMYUNIONNAME;
01285 # else
01286   BOOLEAN Busy;
01287 # endif
01288 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
01289 
01290 #define TIMER_EXPIRED_INDEX_BITS        6
01291 #define TIMER_PROCESSOR_INDEX_BITS      5
01292 
01293 typedef struct _DISPATCHER_HEADER {
01294   _ANONYMOUS_UNION union {
01295     _ANONYMOUS_STRUCT struct {
01296       UCHAR Type;
01297       _ANONYMOUS_UNION union {
01298         _ANONYMOUS_UNION union {
01299           UCHAR TimerControlFlags;
01300           _ANONYMOUS_STRUCT struct {
01301             UCHAR Absolute:1;
01302             UCHAR Coalescable:1;
01303             UCHAR KeepShifting:1;
01304             UCHAR EncodedTolerableDelay:5;
01305           } DUMMYSTRUCTNAME;
01306         } DUMMYUNIONNAME;
01307         UCHAR Abandoned;
01308 #if (NTDDI_VERSION < NTDDI_WIN7)
01309         UCHAR NpxIrql;
01310 #endif
01311         BOOLEAN Signalling;
01312       } DUMMYUNIONNAME;
01313       _ANONYMOUS_UNION union {
01314         _ANONYMOUS_UNION union {
01315           UCHAR ThreadControlFlags;
01316           _ANONYMOUS_STRUCT struct {
01317             UCHAR CpuThrottled:1;
01318             UCHAR CycleProfiling:1;
01319             UCHAR CounterProfiling:1;
01320             UCHAR Reserved:5;
01321           } DUMMYSTRUCTNAME;
01322         } DUMMYUNIONNAME;
01323         UCHAR Size;
01324         UCHAR Hand;
01325       } DUMMYUNIONNAME2;
01326       _ANONYMOUS_UNION union {
01327 #if (NTDDI_VERSION >= NTDDI_WIN7)
01328         _ANONYMOUS_UNION union {
01329           UCHAR TimerMiscFlags;
01330           _ANONYMOUS_STRUCT struct {
01331 #if !defined(_X86_)
01332             UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
01333 #else
01334             UCHAR Index:1;
01335             UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
01336 #endif
01337             UCHAR Inserted:1;
01338             volatile UCHAR Expired:1;
01339           } DUMMYSTRUCTNAME;
01340         } DUMMYUNIONNAME;
01341 #else
01342         /* Pre Win7 compatibility fix to latest WDK */
01343         UCHAR Inserted;
01344 #endif
01345         _ANONYMOUS_UNION union {
01346           BOOLEAN DebugActive;
01347           _ANONYMOUS_STRUCT struct {
01348             BOOLEAN ActiveDR7:1;
01349             BOOLEAN Instrumented:1;
01350             BOOLEAN Reserved2:4;
01351             BOOLEAN UmsScheduled:1;
01352             BOOLEAN UmsPrimary:1;
01353           } DUMMYSTRUCTNAME;
01354         } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
01355         BOOLEAN DpcActive;
01356       } DUMMYUNIONNAME3;
01357     } DUMMYSTRUCTNAME;
01358     volatile LONG Lock;
01359   } DUMMYUNIONNAME;
01360   LONG SignalState;
01361   LIST_ENTRY WaitListHead;
01362 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
01363 
01364 typedef struct _KEVENT {
01365   DISPATCHER_HEADER Header;
01366 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
01367 
01368 typedef struct _KSEMAPHORE {
01369   DISPATCHER_HEADER Header;
01370   LONG Limit;
01371 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
01372 
01373 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
01374 
01375 typedef struct _KGATE {
01376   DISPATCHER_HEADER Header;
01377 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
01378 
01379 typedef struct _KGUARDED_MUTEX {
01380   volatile LONG Count;
01381   PKTHREAD Owner;
01382   ULONG Contention;
01383   KGATE Gate;
01384   _ANONYMOUS_UNION union {
01385     _ANONYMOUS_STRUCT struct {
01386       SHORT KernelApcDisable;
01387       SHORT SpecialApcDisable;
01388     } DUMMYSTRUCTNAME;
01389     ULONG CombinedApcDisable;
01390   } DUMMYUNIONNAME;
01391 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
01392 
01393 typedef struct _KMUTANT {
01394   DISPATCHER_HEADER Header;
01395   LIST_ENTRY MutantListEntry;
01396   struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
01397   BOOLEAN Abandoned;
01398   UCHAR ApcDisable;
01399 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
01400 
01401 #define TIMER_TABLE_SIZE 512
01402 #define TIMER_TABLE_SHIFT 9
01403 
01404 typedef struct _KTIMER {
01405   DISPATCHER_HEADER Header;
01406   ULARGE_INTEGER DueTime;
01407   LIST_ENTRY TimerListEntry;
01408   struct _KDPC *Dpc;
01409 #if (NTDDI_VERSION >= NTDDI_WIN7) && !defined(_X86_)
01410   ULONG Processor;
01411 #endif
01412   ULONG Period;
01413 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
01414 
01415 typedef enum _LOCK_OPERATION {
01416   IoReadAccess,
01417   IoWriteAccess,
01418   IoModifyAccess
01419 } LOCK_OPERATION;
01420 
01421 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
01422 
01423 _Function_class_(KSYNCHRONIZE_ROUTINE)
01424 _IRQL_requires_same_
01425 typedef BOOLEAN
01426 (NTAPI KSYNCHRONIZE_ROUTINE)(
01427   _In_ PVOID SynchronizeContext);
01428 typedef KSYNCHRONIZE_ROUTINE *PKSYNCHRONIZE_ROUTINE;
01429 
01430 typedef enum _POOL_TYPE {
01431   NonPagedPool,
01432   PagedPool,
01433   NonPagedPoolMustSucceed,
01434   DontUseThisType,
01435   NonPagedPoolCacheAligned,
01436   PagedPoolCacheAligned,
01437   NonPagedPoolCacheAlignedMustS,
01438   MaxPoolType,
01439   NonPagedPoolSession = 32,
01440   PagedPoolSession,
01441   NonPagedPoolMustSucceedSession,
01442   DontUseThisTypeSession,
01443   NonPagedPoolCacheAlignedSession,
01444   PagedPoolCacheAlignedSession,
01445   NonPagedPoolCacheAlignedMustSSession
01446 } POOL_TYPE;
01447 
01448 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
01449   StandardDesign,
01450   NEC98x86,
01451   EndAlternatives
01452 } ALTERNATIVE_ARCHITECTURE_TYPE;
01453 
01454 #ifndef _X86_
01455 
01456 #ifndef IsNEC_98
01457 #define IsNEC_98 (FALSE)
01458 #endif
01459 
01460 #ifndef IsNotNEC_98
01461 #define IsNotNEC_98 (TRUE)
01462 #endif
01463 
01464 #ifndef SetNEC_98
01465 #define SetNEC_98
01466 #endif
01467 
01468 #ifndef SetNotNEC_98
01469 #define SetNotNEC_98
01470 #endif
01471 
01472 #endif
01473 
01474 typedef struct _KSYSTEM_TIME {
01475   ULONG LowPart;
01476   LONG High1Time;
01477   LONG High2Time;
01478 } KSYSTEM_TIME, *PKSYSTEM_TIME;
01479 
01480 typedef struct DECLSPEC_ALIGN(16) _M128A {
01481   ULONGLONG Low;
01482   LONGLONG High;
01483 } M128A, *PM128A;
01484 
01485 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
01486   USHORT ControlWord;
01487   USHORT StatusWord;
01488   UCHAR TagWord;
01489   UCHAR Reserved1;
01490   USHORT ErrorOpcode;
01491   ULONG ErrorOffset;
01492   USHORT ErrorSelector;
01493   USHORT Reserved2;
01494   ULONG DataOffset;
01495   USHORT DataSelector;
01496   USHORT Reserved3;
01497   ULONG MxCsr;
01498   ULONG MxCsr_Mask;
01499   M128A FloatRegisters[8];
01500 #if defined(_WIN64)
01501   M128A XmmRegisters[16];
01502   UCHAR Reserved4[96];
01503 #else
01504   M128A XmmRegisters[8];
01505   UCHAR Reserved4[192];
01506   ULONG StackControl[7];
01507   ULONG Cr0NpxState;
01508 #endif
01509 } XSAVE_FORMAT, *PXSAVE_FORMAT;
01510 
01511 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER {
01512   ULONG64 Mask;
01513   ULONG64 Reserved[7];
01514 } XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER;
01515 
01516 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA {
01517   XSAVE_FORMAT LegacyState;
01518   XSAVE_AREA_HEADER Header;
01519 } XSAVE_AREA, *PXSAVE_AREA;
01520 
01521 typedef struct _XSTATE_CONTEXT {
01522   ULONG64 Mask;
01523   ULONG Length;
01524   ULONG Reserved1;
01525   _Field_size_bytes_opt_(Length) PXSAVE_AREA Area;
01526 #if defined(_X86_)
01527   ULONG Reserved2;
01528 #endif
01529   PVOID Buffer;
01530 #if defined(_X86_)
01531   ULONG Reserved3;
01532 #endif
01533 } XSTATE_CONTEXT, *PXSTATE_CONTEXT;
01534 
01535 typedef struct _XSTATE_SAVE {
01536 #if defined(_AMD64_)
01537   struct _XSTATE_SAVE* Prev;
01538   struct _KTHREAD* Thread;
01539   UCHAR Level;
01540   XSTATE_CONTEXT XStateContext;
01541 #elif defined(_IA64_)
01542   ULONG Dummy;
01543 #elif defined(_X86_)
01544   _ANONYMOUS_UNION union {
01545     _ANONYMOUS_STRUCT struct {
01546       LONG64 Reserved1;
01547       ULONG Reserved2;
01548       struct _XSTATE_SAVE* Prev;
01549       PXSAVE_AREA Reserved3;
01550       struct _KTHREAD* Thread;
01551       PVOID Reserved4;
01552       UCHAR Level;
01553     } DUMMYSTRUCTNAME;
01554     XSTATE_CONTEXT XStateContext;
01555   } DUMMYUNIONNAME;
01556 #endif
01557 } XSTATE_SAVE, *PXSTATE_SAVE;
01558 
01559 #ifdef _X86_
01560 
01561 #define MAXIMUM_SUPPORTED_EXTENSION  512
01562 
01563 #if !defined(__midl) && !defined(MIDL_PASS)
01564 C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION);
01565 #endif
01566 
01567 #endif /* _X86_ */
01568 
01569 #define XSAVE_ALIGN                    64
01570 #define MINIMAL_XSTATE_AREA_LENGTH     sizeof(XSAVE_AREA)
01571 
01572 #if !defined(__midl) && !defined(MIDL_PASS)
01573 C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0);
01574 C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0);
01575 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64);
01576 #endif
01577 
01578 typedef struct _CONTEXT_CHUNK {
01579   LONG Offset;
01580   ULONG Length;
01581 } CONTEXT_CHUNK, *PCONTEXT_CHUNK;
01582 
01583 typedef struct _CONTEXT_EX {
01584   CONTEXT_CHUNK All;
01585   CONTEXT_CHUNK Legacy;
01586   CONTEXT_CHUNK XState;
01587 } CONTEXT_EX, *PCONTEXT_EX;
01588 
01589 #define CONTEXT_EX_LENGTH         ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
01590 
01591 #if (NTDDI_VERSION >= NTDDI_VISTA)
01592 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
01593 #elif (NTDDI_VERSION >= NTDDI_WINXP)
01594 extern NTSYSAPI CCHAR KeNumberProcessors;
01595 #else
01596 extern PCCHAR KeNumberProcessors;
01597 #endif
01598 
01599 
01600 /******************************************************************************
01601  *                         Memory manager Types                               *
01602  ******************************************************************************/
01603 
01604 #if (NTDDI_VERSION >= NTDDI_WIN2K)
01605 typedef ULONG NODE_REQUIREMENT;
01606 #define MM_ANY_NODE_OK                           0x80000000
01607 #endif
01608 
01609 #define MM_DONT_ZERO_ALLOCATION                  0x00000001
01610 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY         0x00000002
01611 #define MM_ALLOCATE_FULLY_REQUIRED               0x00000004
01612 #define MM_ALLOCATE_NO_WAIT                      0x00000008
01613 #define MM_ALLOCATE_PREFER_CONTIGUOUS            0x00000010
01614 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS    0x00000020
01615 
01616 #define MDL_MAPPED_TO_SYSTEM_VA     0x0001
01617 #define MDL_PAGES_LOCKED            0x0002
01618 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
01619 #define MDL_ALLOCATED_FIXED_SIZE    0x0008
01620 #define MDL_PARTIAL                 0x0010
01621 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
01622 #define MDL_IO_PAGE_READ            0x0040
01623 #define MDL_WRITE_OPERATION         0x0080
01624 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
01625 #define MDL_FREE_EXTRA_PTES         0x0200
01626 #define MDL_DESCRIBES_AWE           0x0400
01627 #define MDL_IO_SPACE                0x0800
01628 #define MDL_NETWORK_HEADER          0x1000
01629 #define MDL_MAPPING_CAN_FAIL        0x2000
01630 #define MDL_ALLOCATED_MUST_SUCCEED  0x4000
01631 #define MDL_INTERNAL                0x8000
01632 
01633 #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA     | \
01634                            MDL_PAGES_LOCKED            | \
01635                            MDL_SOURCE_IS_NONPAGED_POOL | \
01636                            MDL_PARTIAL_HAS_BEEN_MAPPED | \
01637                            MDL_PARENT_MAPPED_SYSTEM_VA | \
01638                            MDL_SYSTEM_VA               | \
01639                            MDL_IO_SPACE)
01640 
01641 #define FLUSH_MULTIPLE_MAXIMUM       32
01642 
01643 /* Section access rights */
01644 #define SECTION_QUERY                0x0001
01645 #define SECTION_MAP_WRITE            0x0002
01646 #define SECTION_MAP_READ             0x0004
01647 #define SECTION_MAP_EXECUTE          0x0008
01648 #define SECTION_EXTEND_SIZE          0x0010
01649 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
01650 
01651 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
01652                             SECTION_MAP_WRITE |                     \
01653                             SECTION_MAP_READ |                      \
01654                             SECTION_MAP_EXECUTE |                   \
01655                             SECTION_EXTEND_SIZE)
01656 
01657 #define SESSION_QUERY_ACCESS         0x0001
01658 #define SESSION_MODIFY_ACCESS        0x0002
01659 
01660 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |  \
01661                             SESSION_QUERY_ACCESS     |  \
01662                             SESSION_MODIFY_ACCESS)
01663 
01664 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
01665 
01666 #define PAGE_NOACCESS          0x01
01667 #define PAGE_READONLY          0x02
01668 #define PAGE_READWRITE         0x04
01669 #define PAGE_WRITECOPY         0x08
01670 #define PAGE_EXECUTE           0x10
01671 #define PAGE_EXECUTE_READ      0x20
01672 #define PAGE_EXECUTE_READWRITE 0x40
01673 #define PAGE_EXECUTE_WRITECOPY 0x80
01674 #define PAGE_GUARD            0x100
01675 #define PAGE_NOCACHE          0x200
01676 #define PAGE_WRITECOMBINE     0x400
01677 
01678 #define MEM_COMMIT           0x1000
01679 #define MEM_RESERVE          0x2000
01680 #define MEM_DECOMMIT         0x4000
01681 #define MEM_RELEASE          0x8000
01682 #define MEM_FREE            0x10000
01683 #define MEM_PRIVATE         0x20000
01684 #define MEM_MAPPED          0x40000
01685 #define MEM_RESET           0x80000
01686 #define MEM_TOP_DOWN       0x100000
01687 #define MEM_LARGE_PAGES  0x20000000
01688 #define MEM_4MB_PAGES    0x80000000
01689 
01690 #define SEC_RESERVE       0x4000000
01691 #define SEC_COMMIT        0x8000000
01692 #define SEC_LARGE_PAGES  0x80000000
01693 
01694 /* Section map options */
01695 typedef enum _SECTION_INHERIT {
01696   ViewShare = 1,
01697   ViewUnmap = 2
01698 } SECTION_INHERIT;
01699 
01700 typedef ULONG PFN_COUNT;
01701 typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
01702 typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
01703 
01704 _Struct_size_bytes_(_Inexpressible_(sizeof(struct _MDL) +
01705     (ByteOffset + ByteCount + PAGE_SIZE-1) / PAGE_SIZE * sizeof(PFN_NUMBER)))
01706 typedef struct _MDL {
01707   struct _MDL *Next;
01708   CSHORT Size;
01709   CSHORT MdlFlags;
01710   struct _EPROCESS *Process;
01711   PVOID MappedSystemVa;
01712   PVOID StartVa;
01713   ULONG ByteCount;
01714   ULONG ByteOffset;
01715 } MDL, *PMDL;
01716 #if (_MSC_VER >= 1600)
01717 typedef _Readable_bytes_(_Inexpressible_(polymorphism)) MDL *PMDLX;
01718 #else
01719 typedef MDL *PMDLX;
01720 #endif
01721 
01722 typedef enum _MEMORY_CACHING_TYPE_ORIG {
01723   MmFrameBufferCached = 2
01724 } MEMORY_CACHING_TYPE_ORIG;
01725 
01726 typedef enum _MEMORY_CACHING_TYPE {
01727   MmNonCached = FALSE,
01728   MmCached = TRUE,
01729   MmWriteCombined = MmFrameBufferCached,
01730   MmHardwareCoherentCached,
01731   MmNonCachedUnordered,
01732   MmUSWCCached,
01733   MmMaximumCacheType
01734 } MEMORY_CACHING_TYPE;
01735 
01736 typedef enum _MM_PAGE_PRIORITY {
01737   LowPagePriority,
01738   NormalPagePriority = 16,
01739   HighPagePriority = 32
01740 } MM_PAGE_PRIORITY;
01741 
01742 typedef enum _MM_SYSTEM_SIZE {
01743   MmSmallSystem,
01744   MmMediumSystem,
01745   MmLargeSystem
01746 } MM_SYSTEMSIZE;
01747 
01748 extern NTKERNELAPI BOOLEAN Mm64BitPhysicalAddress;
01749 extern PVOID MmBadPointer;
01750 
01751 
01752 /******************************************************************************
01753  *                            Executive Types                                 *
01754  ******************************************************************************/
01755 #define EX_RUNDOWN_ACTIVE                 0x1
01756 #define EX_RUNDOWN_COUNT_SHIFT            0x1
01757 #define EX_RUNDOWN_COUNT_INC              (1 << EX_RUNDOWN_COUNT_SHIFT)
01758 
01759 typedef struct _FAST_MUTEX {
01760   volatile LONG Count;
01761   PKTHREAD Owner;
01762   ULONG Contention;
01763   KEVENT Event;
01764   ULONG OldIrql;
01765 } FAST_MUTEX, *PFAST_MUTEX;
01766 
01767 typedef enum _SUITE_TYPE {
01768   SmallBusiness,
01769   Enterprise,
01770   BackOffice,
01771   CommunicationServer,
01772   TerminalServer,
01773   SmallBusinessRestricted,
01774   EmbeddedNT,
01775   DataCenter,
01776   SingleUserTS,
01777   Personal,
01778   Blade,
01779   EmbeddedRestricted,
01780   SecurityAppliance,
01781   StorageServer,
01782   ComputeServer,
01783   WHServer,
01784   MaxSuiteType
01785 } SUITE_TYPE;
01786 
01787 typedef enum _EX_POOL_PRIORITY {
01788   LowPoolPriority,
01789   LowPoolPrioritySpecialPoolOverrun = 8,
01790   LowPoolPrioritySpecialPoolUnderrun = 9,
01791   NormalPoolPriority = 16,
01792   NormalPoolPrioritySpecialPoolOverrun = 24,
01793   NormalPoolPrioritySpecialPoolUnderrun = 25,
01794   HighPoolPriority = 32,
01795   HighPoolPrioritySpecialPoolOverrun = 40,
01796   HighPoolPrioritySpecialPoolUnderrun = 41
01797 } EX_POOL_PRIORITY;
01798 
01799 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
01800 #define LOOKASIDE_ALIGN
01801 #else
01802 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
01803 #endif
01804 
01805 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
01806 
01807 _IRQL_requires_same_
01808 _Function_class_(ALLOCATE_FUNCTION)
01809 typedef PVOID
01810 (NTAPI *PALLOCATE_FUNCTION)(
01811     _In_ POOL_TYPE PoolType,
01812     _In_ SIZE_T NumberOfBytes,
01813     _In_ ULONG Tag);
01814 
01815 _IRQL_requires_same_
01816 _Function_class_(ALLOCATE_FUNCTION_EX)
01817 typedef PVOID
01818 (NTAPI *PALLOCATE_FUNCTION_EX)(
01819     _In_ POOL_TYPE PoolType,
01820     _In_ SIZE_T NumberOfBytes,
01821     _In_ ULONG Tag,
01822     _Inout_ PLOOKASIDE_LIST_EX Lookaside);
01823 
01824 _IRQL_requires_same_
01825 _Function_class_(FREE_FUNCTION)
01826 typedef VOID
01827 (NTAPI *PFREE_FUNCTION)(
01828     _In_ PVOID Buffer);
01829 
01830 _IRQL_requires_same_
01831 _Function_class_(FREE_FUNCTION_EX)
01832 typedef VOID
01833 (NTAPI *PFREE_FUNCTION_EX)(
01834     _In_ PVOID Buffer,
01835     _Inout_ PLOOKASIDE_LIST_EX Lookaside);
01836 
01837 _IRQL_requires_same_
01838 _Function_class_(CALLBACK_FUNCTION)
01839 typedef VOID
01840 (NTAPI CALLBACK_FUNCTION)(
01841   _In_opt_ PVOID CallbackContext,
01842   _In_opt_ PVOID Argument1,
01843   _In_opt_ PVOID Argument2);
01844 typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
01845 
01846 #define GENERAL_LOOKASIDE_LAYOUT                \
01847     _ANONYMOUS_UNION union {                    \
01848         SLIST_HEADER ListHead;                  \
01849         SINGLE_LIST_ENTRY SingleListHead;       \
01850     } DUMMYUNIONNAME;                           \
01851     USHORT Depth;                               \
01852     USHORT MaximumDepth;                        \
01853     ULONG TotalAllocates;                       \
01854     _ANONYMOUS_UNION union {                    \
01855         ULONG AllocateMisses;                   \
01856         ULONG AllocateHits;                     \
01857     } DUMMYUNIONNAME2;                          \
01858     ULONG TotalFrees;                           \
01859     _ANONYMOUS_UNION union {                    \
01860         ULONG FreeMisses;                       \
01861         ULONG FreeHits;                         \
01862     } DUMMYUNIONNAME3;                          \
01863     POOL_TYPE Type;                             \
01864     ULONG Tag;                                  \
01865     ULONG Size;                                 \
01866     _ANONYMOUS_UNION union {                    \
01867         PALLOCATE_FUNCTION_EX AllocateEx;       \
01868         PALLOCATE_FUNCTION Allocate;            \
01869     } DUMMYUNIONNAME4;                          \
01870     _ANONYMOUS_UNION union {                    \
01871         PFREE_FUNCTION_EX FreeEx;               \
01872         PFREE_FUNCTION Free;                    \
01873     } DUMMYUNIONNAME5;                          \
01874     LIST_ENTRY ListEntry;                       \
01875     ULONG LastTotalAllocates;                   \
01876     _ANONYMOUS_UNION union {                    \
01877         ULONG LastAllocateMisses;               \
01878         ULONG LastAllocateHits;                 \
01879     } DUMMYUNIONNAME6;                          \
01880     ULONG Future[2];
01881 
01882 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
01883   GENERAL_LOOKASIDE_LAYOUT
01884 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
01885 
01886 typedef struct _GENERAL_LOOKASIDE_POOL {
01887   GENERAL_LOOKASIDE_LAYOUT
01888 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
01889 
01890 #define LOOKASIDE_CHECK(f)  \
01891     C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
01892 
01893 LOOKASIDE_CHECK(TotalFrees);
01894 LOOKASIDE_CHECK(Tag);
01895 LOOKASIDE_CHECK(Future);
01896 
01897 typedef struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST {
01898   GENERAL_LOOKASIDE L;
01899 #if !defined(_AMD64_) && !defined(_IA64_)
01900   FAST_MUTEX Lock__ObsoleteButDoNotDelete;
01901 #endif
01902 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
01903 
01904 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
01905   GENERAL_LOOKASIDE L;
01906 #if !defined(_AMD64_) && !defined(_IA64_)
01907   KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
01908 #endif
01909 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
01910 
01911 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
01912 
01913 typedef struct _LOOKASIDE_LIST_EX {
01914   GENERAL_LOOKASIDE_POOL L;
01915 } LOOKASIDE_LIST_EX;
01916 
01917 #if (NTDDI_VERSION >= NTDDI_VISTA)
01918 
01919 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
01920 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
01921 
01922 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE          256
01923 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT         1024
01924 
01925 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
01926 
01927 typedef struct _EX_RUNDOWN_REF {
01928   _ANONYMOUS_UNION union {
01929     volatile ULONG_PTR Count;
01930     volatile PVOID Ptr;
01931   } DUMMYUNIONNAME;
01932 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
01933 
01934 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
01935 
01936 typedef enum _WORK_QUEUE_TYPE {
01937   CriticalWorkQueue,
01938   DelayedWorkQueue,
01939   HyperCriticalWorkQueue,
01940   MaximumWorkQueue
01941 } WORK_QUEUE_TYPE;
01942 
01943 _IRQL_requires_same_
01944 _Function_class_(WORKER_THREAD_ROUTINE)
01945 typedef VOID
01946 (NTAPI WORKER_THREAD_ROUTINE)(
01947   _In_ PVOID Parameter);
01948 typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE;
01949 
01950 typedef struct _WORK_QUEUE_ITEM {
01951   LIST_ENTRY List;
01952   PWORKER_THREAD_ROUTINE WorkerRoutine;
01953   volatile PVOID Parameter;
01954 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
01955 
01956 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
01957 
01958 typedef struct _OWNER_ENTRY {
01959   ERESOURCE_THREAD OwnerThread;
01960   _ANONYMOUS_UNION union {
01961     _ANONYMOUS_STRUCT struct {
01962       ULONG IoPriorityBoosted:1;
01963       ULONG OwnerReferenced:1;
01964       ULONG OwnerCount:30;
01965     } DUMMYSTRUCTNAME;
01966     ULONG TableSize;
01967   } DUMMYUNIONNAME;
01968 } OWNER_ENTRY, *POWNER_ENTRY;
01969 
01970 typedef struct _ERESOURCE {
01971   LIST_ENTRY SystemResourcesList;
01972   POWNER_ENTRY OwnerTable;
01973   SHORT ActiveCount;
01974   USHORT Flag;
01975   volatile PKSEMAPHORE SharedWaiters;
01976   volatile PKEVENT ExclusiveWaiters;
01977   OWNER_ENTRY OwnerEntry;
01978   ULONG ActiveEntries;
01979   ULONG ContentionCount;
01980   ULONG NumberOfSharedWaiters;
01981   ULONG NumberOfExclusiveWaiters;
01982 #if defined(_WIN64)
01983   PVOID Reserved2;
01984 #endif
01985   _ANONYMOUS_UNION union {
01986     PVOID Address;
01987     ULONG_PTR CreatorBackTraceIndex;
01988   } DUMMYUNIONNAME;
01989   KSPIN_LOCK SpinLock;
01990 } ERESOURCE, *PERESOURCE;
01991 
01992 /* ERESOURCE.Flag */
01993 #define ResourceNeverExclusive            0x0010
01994 #define ResourceReleaseByOtherThread      0x0020
01995 #define ResourceOwnedExclusive            0x0080
01996 
01997 #define RESOURCE_HASH_TABLE_SIZE          64
01998 
01999 typedef struct _RESOURCE_HASH_ENTRY {
02000   LIST_ENTRY ListEntry;
02001   PVOID Address;
02002   ULONG ContentionCount;
02003   ULONG Number;
02004 } RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY;
02005 
02006 typedef struct _RESOURCE_PERFORMANCE_DATA {
02007   ULONG ActiveResourceCount;
02008   ULONG TotalResourceCount;
02009   ULONG ExclusiveAcquire;
02010   ULONG SharedFirstLevel;
02011   ULONG SharedSecondLevel;
02012   ULONG StarveFirstLevel;
02013   ULONG StarveSecondLevel;
02014   ULONG WaitForExclusive;
02015   ULONG OwnerTableExpands;
02016   ULONG MaximumTableExpand;
02017   LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE];
02018 } RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA;
02019 
02020 /* Global debug flag */
02021 #if DEVL
02022 extern ULONG NtGlobalFlag;
02023 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
02024 #else
02025 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
02026 #endif
02027 
02028 /******************************************************************************
02029  *                            Security Manager Types                          *
02030  ******************************************************************************/
02031 
02032 /* Simple types */
02033 typedef PVOID PSECURITY_DESCRIPTOR;
02034 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
02035 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
02036 typedef PVOID PACCESS_TOKEN;
02037 typedef PVOID PSID;
02038 
02039 #define DELETE                           0x00010000L
02040 #define READ_CONTROL                     0x00020000L
02041 #define WRITE_DAC                        0x00040000L
02042 #define WRITE_OWNER                      0x00080000L
02043 #define SYNCHRONIZE                      0x00100000L
02044 #define STANDARD_RIGHTS_REQUIRED         0x000F0000L
02045 #define STANDARD_RIGHTS_READ             READ_CONTROL
02046 #define STANDARD_RIGHTS_WRITE            READ_CONTROL
02047 #define STANDARD_RIGHTS_EXECUTE          READ_CONTROL
02048 #define STANDARD_RIGHTS_ALL              0x001F0000L
02049 #define SPECIFIC_RIGHTS_ALL              0x0000FFFFL
02050 #define ACCESS_SYSTEM_SECURITY           0x01000000L
02051 #define MAXIMUM_ALLOWED                  0x02000000L
02052 #define GENERIC_READ                     0x80000000L
02053 #define GENERIC_WRITE                    0x40000000L
02054 #define GENERIC_EXECUTE                  0x20000000L
02055 #define GENERIC_ALL                      0x10000000L
02056 
02057 typedef struct _GENERIC_MAPPING {
02058   ACCESS_MASK GenericRead;
02059   ACCESS_MASK GenericWrite;
02060   ACCESS_MASK GenericExecute;
02061   ACCESS_MASK GenericAll;
02062 } GENERIC_MAPPING, *PGENERIC_MAPPING;
02063 
02064 #define ACL_REVISION                      2
02065 #define ACL_REVISION_DS                   4
02066 
02067 #define ACL_REVISION1                     1
02068 #define ACL_REVISION2                     2
02069 #define ACL_REVISION3                     3
02070 #define ACL_REVISION4                     4
02071 #define MIN_ACL_REVISION                  ACL_REVISION2
02072 #define MAX_ACL_REVISION                  ACL_REVISION4
02073 
02074 typedef struct _ACL {
02075   UCHAR AclRevision;
02076   UCHAR Sbz1;
02077   USHORT AclSize;
02078   USHORT AceCount;
02079   USHORT Sbz2;
02080 } ACL, *PACL;
02081 
02082 /* Current security descriptor revision value */
02083 #define SECURITY_DESCRIPTOR_REVISION     (1)
02084 #define SECURITY_DESCRIPTOR_REVISION1    (1)
02085 
02086 /* Privilege attributes */
02087 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
02088 #define SE_PRIVILEGE_ENABLED            (0x00000002L)
02089 #define SE_PRIVILEGE_REMOVED            (0X00000004L)
02090 #define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)
02091 
02092 #define SE_PRIVILEGE_VALID_ATTRIBUTES   (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
02093                                          SE_PRIVILEGE_ENABLED            | \
02094                                          SE_PRIVILEGE_REMOVED            | \
02095                                          SE_PRIVILEGE_USED_FOR_ACCESS)
02096 
02097 #include <pshpack4.h>
02098 typedef struct _LUID_AND_ATTRIBUTES {
02099   LUID Luid;
02100   ULONG Attributes;
02101 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
02102 #include <poppack.h>
02103 
02104 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
02105 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
02106 
02107 /* Privilege sets */
02108 #define PRIVILEGE_SET_ALL_NECESSARY (1)
02109 
02110 typedef struct _PRIVILEGE_SET {
02111   ULONG PrivilegeCount;
02112   ULONG Control;
02113   LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
02114 } PRIVILEGE_SET,*PPRIVILEGE_SET;
02115 
02116 typedef enum _SECURITY_IMPERSONATION_LEVEL {
02117   SecurityAnonymous,
02118   SecurityIdentification,
02119   SecurityImpersonation,
02120   SecurityDelegation
02121 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
02122 
02123 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
02124 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
02125 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
02126 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
02127 
02128 #define SECURITY_DYNAMIC_TRACKING (TRUE)
02129 #define SECURITY_STATIC_TRACKING (FALSE)
02130 
02131 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
02132 
02133 typedef struct _SECURITY_QUALITY_OF_SERVICE {
02134   ULONG Length;
02135   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
02136   SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
02137   BOOLEAN EffectiveOnly;
02138 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
02139 
02140 typedef struct _SE_IMPERSONATION_STATE {
02141   PACCESS_TOKEN Token;
02142   BOOLEAN CopyOnOpen;
02143   BOOLEAN EffectiveOnly;
02144   SECURITY_IMPERSONATION_LEVEL Level;
02145 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
02146 
02147 #define OWNER_SECURITY_INFORMATION       (0x00000001L)
02148 #define GROUP_SECURITY_INFORMATION       (0x00000002L)
02149 #define DACL_SECURITY_INFORMATION        (0x00000004L)
02150 #define SACL_SECURITY_INFORMATION        (0x00000008L)
02151 #define LABEL_SECURITY_INFORMATION       (0x00000010L)
02152 
02153 #define PROTECTED_DACL_SECURITY_INFORMATION     (0x80000000L)
02154 #define PROTECTED_SACL_SECURITY_INFORMATION     (0x40000000L)
02155 #define UNPROTECTED_DACL_SECURITY_INFORMATION   (0x20000000L)
02156 #define UNPROTECTED_SACL_SECURITY_INFORMATION   (0x10000000L)
02157 
02158 typedef enum _SECURITY_OPERATION_CODE {
02159   SetSecurityDescriptor,
02160   QuerySecurityDescriptor,
02161   DeleteSecurityDescriptor,
02162   AssignSecurityDescriptor
02163 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
02164 
02165 #define INITIAL_PRIVILEGE_COUNT           3
02166 
02167 typedef struct _INITIAL_PRIVILEGE_SET {
02168   ULONG PrivilegeCount;
02169   ULONG Control;
02170   LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
02171 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
02172 
02173 #define SE_MIN_WELL_KNOWN_PRIVILEGE         2
02174 #define SE_CREATE_TOKEN_PRIVILEGE           2
02175 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE     3
02176 #define SE_LOCK_MEMORY_PRIVILEGE            4
02177 #define SE_INCREASE_QUOTA_PRIVILEGE         5
02178 #define SE_MACHINE_ACCOUNT_PRIVILEGE        6
02179 #define SE_TCB_PRIVILEGE                    7
02180 #define SE_SECURITY_PRIVILEGE               8
02181 #define SE_TAKE_OWNERSHIP_PRIVILEGE         9
02182 #define SE_LOAD_DRIVER_PRIVILEGE            10
02183 #define SE_SYSTEM_PROFILE_PRIVILEGE         11
02184 #define SE_SYSTEMTIME_PRIVILEGE             12
02185 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE    13
02186 #define SE_INC_BASE_PRIORITY_PRIVILEGE      14
02187 #define SE_CREATE_PAGEFILE_PRIVILEGE        15
02188 #define SE_CREATE_PERMANENT_PRIVILEGE       16
02189 #define SE_BACKUP_PRIVILEGE                 17
02190 #define SE_RESTORE_PRIVILEGE                18
02191 #define SE_SHUTDOWN_PRIVILEGE               19
02192 #define SE_DEBUG_PRIVILEGE                  20
02193 #define SE_AUDIT_PRIVILEGE                  21
02194 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE     22
02195 #define SE_CHANGE_NOTIFY_PRIVILEGE          23
02196 #define SE_REMOTE_SHUTDOWN_PRIVILEGE        24
02197 #define SE_UNDOCK_PRIVILEGE                 25
02198 #define SE_SYNC_AGENT_PRIVILEGE             26
02199 #define SE_ENABLE_DELEGATION_PRIVILEGE      27
02200 #define SE_MANAGE_VOLUME_PRIVILEGE          28
02201 #define SE_IMPERSONATE_PRIVILEGE            29
02202 #define SE_CREATE_GLOBAL_PRIVILEGE          30
02203 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
02204 #define SE_RELABEL_PRIVILEGE                32
02205 #define SE_INC_WORKING_SET_PRIVILEGE        33
02206 #define SE_TIME_ZONE_PRIVILEGE              34
02207 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE   35
02208 #define SE_MAX_WELL_KNOWN_PRIVILEGE         SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
02209 
02210 typedef struct _SECURITY_SUBJECT_CONTEXT {
02211   PACCESS_TOKEN ClientToken;
02212   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
02213   PACCESS_TOKEN PrimaryToken;
02214   PVOID ProcessAuditId;
02215 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
02216 
02217 typedef struct _ACCESS_STATE {
02218   LUID OperationID;
02219   BOOLEAN SecurityEvaluated;
02220   BOOLEAN GenerateAudit;
02221   BOOLEAN GenerateOnClose;
02222   BOOLEAN PrivilegesAllocated;
02223   ULONG Flags;
02224   ACCESS_MASK RemainingDesiredAccess;
02225   ACCESS_MASK PreviouslyGrantedAccess;
02226   ACCESS_MASK OriginalDesiredAccess;
02227   SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
02228   PSECURITY_DESCRIPTOR SecurityDescriptor;
02229   PVOID AuxData;
02230   union {
02231     INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
02232     PRIVILEGE_SET PrivilegeSet;
02233   } Privileges;
02234   BOOLEAN AuditPrivileges;
02235   UNICODE_STRING ObjectName;
02236   UNICODE_STRING ObjectTypeName;
02237 } ACCESS_STATE, *PACCESS_STATE;
02238 
02239 typedef VOID
02240 (NTAPI *PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR)(
02241   _In_ PVOID Vcb,
02242   _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
02243 
02244 #ifndef _NTLSA_IFS_
02245 
02246 #ifndef _NTLSA_AUDIT_
02247 #define _NTLSA_AUDIT_
02248 
02249 #define SE_MAX_AUDIT_PARAMETERS 32
02250 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
02251 
02252 #define SE_ADT_OBJECT_ONLY 0x1
02253 
02254 #define SE_ADT_PARAMETERS_SELF_RELATIVE    0x00000001
02255 #define SE_ADT_PARAMETERS_SEND_TO_LSA      0x00000002
02256 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT  0x00000004
02257 #define SE_ADT_PARAMETER_GENERIC_AUDIT     0x00000008
02258 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
02259 
02260 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
02261   ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
02262     (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
02263 
02264 typedef enum _SE_ADT_PARAMETER_TYPE {
02265   SeAdtParmTypeNone = 0,
02266   SeAdtParmTypeString,
02267   SeAdtParmTypeFileSpec,
02268   SeAdtParmTypeUlong,
02269   SeAdtParmTypeSid,
02270   SeAdtParmTypeLogonId,
02271   SeAdtParmTypeNoLogonId,
02272   SeAdtParmTypeAccessMask,
02273   SeAdtParmTypePrivs,
02274   SeAdtParmTypeObjectTypes,
02275   SeAdtParmTypeHexUlong,
02276   SeAdtParmTypePtr,
02277   SeAdtParmTypeTime,
02278   SeAdtParmTypeGuid,
02279   SeAdtParmTypeLuid,
02280   SeAdtParmTypeHexInt64,
02281   SeAdtParmTypeStringList,
02282   SeAdtParmTypeSidList,
02283   SeAdtParmTypeDuration,
02284   SeAdtParmTypeUserAccountControl,
02285   SeAdtParmTypeNoUac,
02286   SeAdtParmTypeMessage,
02287   SeAdtParmTypeDateTime,
02288   SeAdtParmTypeSockAddr,
02289   SeAdtParmTypeSD,
02290   SeAdtParmTypeLogonHours,
02291   SeAdtParmTypeLogonIdNoSid,
02292   SeAdtParmTypeUlongNoConv,
02293   SeAdtParmTypeSockAddrNoPort,
02294   SeAdtParmTypeAccessReason
02295 } SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
02296 
02297 typedef struct _SE_ADT_OBJECT_TYPE {
02298   GUID ObjectType;
02299   USHORT Flags;
02300   USHORT Level;
02301   ACCESS_MASK AccessMask;
02302 } SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
02303 
02304 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
02305   SE_ADT_PARAMETER_TYPE Type;
02306   ULONG Length;
02307   ULONG_PTR Data[2];
02308   PVOID Address;
02309 } SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
02310 
02311 typedef struct _SE_ADT_ACCESS_REASON {
02312   ACCESS_MASK AccessMask;
02313   ULONG AccessReasons[32];
02314   ULONG ObjectTypeIndex;
02315   ULONG AccessGranted;
02316   PSECURITY_DESCRIPTOR SecurityDescriptor;
02317 } SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
02318 
02319 typedef struct _SE_ADT_PARAMETER_ARRAY {
02320   ULONG CategoryId;
02321   ULONG AuditId;
02322   ULONG ParameterCount;
02323   ULONG Length;
02324   USHORT FlatSubCategoryId;
02325   USHORT Type;
02326   ULONG Flags;
02327   SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
02328 } SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
02329 
02330 #endif /* !_NTLSA_AUDIT_ */
02331 #endif /* !_NTLSA_IFS_ */
02332 /******************************************************************************
02333  *                            Power Management Support Types                  *
02334  ******************************************************************************/
02335 
02336 #ifndef _PO_DDK_
02337 #define _PO_DDK_
02338 
02339 #define PO_CB_SYSTEM_POWER_POLICY                0
02340 #define PO_CB_AC_STATUS                          1
02341 #define PO_CB_BUTTON_COLLISION                   2
02342 #define PO_CB_SYSTEM_STATE_LOCK                  3
02343 #define PO_CB_LID_SWITCH_STATE                   4
02344 #define PO_CB_PROCESSOR_POWER_POLICY             5
02345 
02346 /* Power States/Levels */
02347 typedef enum _SYSTEM_POWER_STATE {
02348   PowerSystemUnspecified = 0,
02349   PowerSystemWorking,
02350   PowerSystemSleeping1,
02351   PowerSystemSleeping2,
02352   PowerSystemSleeping3,
02353   PowerSystemHibernate,
02354   PowerSystemShutdown,
02355   PowerSystemMaximum
02356 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
02357 
02358 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
02359 
02360 typedef enum _POWER_INFORMATION_LEVEL {
02361   SystemPowerPolicyAc,
02362   SystemPowerPolicyDc,
02363   VerifySystemPolicyAc,
02364   VerifySystemPolicyDc,
02365   SystemPowerCapabilities,
02366   SystemBatteryState,
02367   SystemPowerStateHandler,
02368   ProcessorStateHandler,
02369   SystemPowerPolicyCurrent,
02370   AdministratorPowerPolicy,
02371   SystemReserveHiberFile,
02372   ProcessorInformation,
02373   SystemPowerInformation,
02374   ProcessorStateHandler2,
02375   LastWakeTime,
02376   LastSleepTime,
02377   SystemExecutionState,
02378   SystemPowerStateNotifyHandler,
02379   ProcessorPowerPolicyAc,
02380   ProcessorPowerPolicyDc,
02381   VerifyProcessorPowerPolicyAc,
02382   VerifyProcessorPowerPolicyDc,
02383   ProcessorPowerPolicyCurrent,
02384   SystemPowerStateLogging,
02385   SystemPowerLoggingEntry,
02386   SetPowerSettingValue,
02387   NotifyUserPowerSetting,
02388   PowerInformationLevelUnused0,
02389   PowerInformationLevelUnused1,
02390   SystemVideoState,
02391   TraceApplicationPowerMessage,
02392   TraceApplicationPowerMessageEnd,
02393   ProcessorPerfStates,
02394   ProcessorIdleStates,
02395   ProcessorCap,
02396   SystemWakeSource,
02397   SystemHiberFileInformation,
02398   TraceServicePowerMessage,
02399   ProcessorLoad,
02400   PowerShutdownNotification,
02401   MonitorCapabilities,
02402   SessionPowerInit,
02403   SessionDisplayState,
02404   PowerRequestCreate,
02405   PowerRequestAction,
02406   GetPowerRequestList,
02407   ProcessorInformationEx,
02408   NotifyUserModeLegacyPowerEvent,
02409   GroupPark,
02410   ProcessorIdleDomains,
02411   WakeTimerList,
02412   SystemHiberFileSize,
02413   PowerInformationLevelMaximum
02414 } POWER_INFORMATION_LEVEL;
02415 
02416 typedef enum {
02417   PowerActionNone = 0,
02418   PowerActionReserved,
02419   PowerActionSleep,
02420   PowerActionHibernate,
02421   PowerActionShutdown,
02422   PowerActionShutdownReset,
02423   PowerActionShutdownOff,
02424   PowerActionWarmEject
02425 } POWER_ACTION, *PPOWER_ACTION;
02426 
02427 typedef enum _DEVICE_POWER_STATE {
02428   PowerDeviceUnspecified = 0,
02429   PowerDeviceD0,
02430   PowerDeviceD1,
02431   PowerDeviceD2,
02432   PowerDeviceD3,
02433   PowerDeviceMaximum
02434 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
02435 
02436 typedef enum _MONITOR_DISPLAY_STATE {
02437   PowerMonitorOff = 0,
02438   PowerMonitorOn,
02439   PowerMonitorDim
02440 } MONITOR_DISPLAY_STATE, *PMONITOR_DISPLAY_STATE;
02441 
02442 typedef union _POWER_STATE {
02443   SYSTEM_POWER_STATE SystemState;
02444   DEVICE_POWER_STATE DeviceState;
02445 } POWER_STATE, *PPOWER_STATE;
02446 
02447 typedef enum _POWER_STATE_TYPE {
02448   SystemPowerState = 0,
02449   DevicePowerState
02450 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
02451 
02452 #if (NTDDI_VERSION >= NTDDI_VISTA)
02453 typedef struct _SYSTEM_POWER_STATE_CONTEXT {
02454   _ANONYMOUS_UNION union {
02455     _ANONYMOUS_STRUCT struct {
02456       ULONG Reserved1:8;
02457       ULONG TargetSystemState:4;
02458       ULONG EffectiveSystemState:4;
02459       ULONG CurrentSystemState:4;
02460       ULONG IgnoreHibernationPath:1;
02461       ULONG PseudoTransition:1;
02462       ULONG Reserved2:10;
02463     } DUMMYSTRUCTNAME;
02464     ULONG ContextAsUlong;
02465   } DUMMYUNIONNAME;
02466 } SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT;
02467 #endif
02468 
02469 #if (NTDDI_VERSION >= NTDDI_WIN7)
02470 typedef struct _COUNTED_REASON_CONTEXT {
02471   ULONG Version;
02472   ULONG Flags;
02473   _ANONYMOUS_UNION union {
02474     _ANONYMOUS_STRUCT struct {
02475       UNICODE_STRING ResourceFileName;
02476       USHORT ResourceReasonId;
02477       ULONG StringCount;
02478       PUNICODE_STRING ReasonStrings;
02479     } DUMMYSTRUCTNAME;
02480     UNICODE_STRING SimpleString;
02481   } DUMMYUNIONNAME;
02482 } COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT;
02483 #endif
02484 
02485 #define IOCTL_QUERY_DEVICE_POWER_STATE  \
02486         CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS)
02487 
02488 #define IOCTL_SET_DEVICE_WAKE           \
02489         CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
02490 
02491 #define IOCTL_CANCEL_DEVICE_WAKE        \
02492         CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
02493 
02494 #define ES_SYSTEM_REQUIRED                       0x00000001
02495 #define ES_DISPLAY_REQUIRED                      0x00000002
02496 #define ES_USER_PRESENT                          0x00000004
02497 #define ES_CONTINUOUS                            0x80000000
02498 
02499 typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE;
02500 
02501 typedef enum {
02502   LT_DONT_CARE,
02503   LT_LOWEST_LATENCY
02504 } LATENCY_TIME;
02505 
02506 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
02507 #define DIAGNOSTIC_REASON_VERSION                0
02508 #define DIAGNOSTIC_REASON_SIMPLE_STRING          0x00000001
02509 #define DIAGNOSTIC_REASON_DETAILED_STRING        0x00000002
02510 #define DIAGNOSTIC_REASON_NOT_SPECIFIED          0x80000000
02511 #define DIAGNOSTIC_REASON_INVALID_FLAGS          (~0x80000003)
02512 #endif
02513 
02514 #define POWER_REQUEST_CONTEXT_VERSION            0
02515 #define POWER_REQUEST_CONTEXT_SIMPLE_STRING      0x00000001
02516 #define POWER_REQUEST_CONTEXT_DETAILED_STRING    0x00000002
02517 
02518 #define PowerRequestMaximum                      3
02519 
02520 typedef enum _POWER_REQUEST_TYPE {
02521   PowerRequestDisplayRequired,
02522   PowerRequestSystemRequired,
02523   PowerRequestAwayModeRequired
02524 } POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE;
02525 
02526 #if (NTDDI_VERSION >= NTDDI_WINXP)
02527 
02528 #define PDCAP_D0_SUPPORTED                       0x00000001
02529 #define PDCAP_D1_SUPPORTED                       0x00000002
02530 #define PDCAP_D2_SUPPORTED                       0x00000004
02531 #define PDCAP_D3_SUPPORTED                       0x00000008
02532 #define PDCAP_WAKE_FROM_D0_SUPPORTED             0x00000010
02533 #define PDCAP_WAKE_FROM_D1_SUPPORTED             0x00000020
02534 #define PDCAP_WAKE_FROM_D2_SUPPORTED             0x00000040
02535 #define PDCAP_WAKE_FROM_D3_SUPPORTED             0x00000080
02536 #define PDCAP_WARM_EJECT_SUPPORTED               0x00000100
02537 
02538 typedef struct CM_Power_Data_s {
02539   ULONG PD_Size;
02540   DEVICE_POWER_STATE PD_MostRecentPowerState;
02541   ULONG PD_Capabilities;
02542   ULONG PD_D1Latency;
02543   ULONG PD_D2Latency;
02544   ULONG PD_D3Latency;
02545   DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
02546   SYSTEM_POWER_STATE PD_DeepestSystemWake;
02547 } CM_POWER_DATA, *PCM_POWER_DATA;
02548 
02549 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
02550 
02551 typedef enum _SYSTEM_POWER_CONDITION {
02552   PoAc,
02553   PoDc,
02554   PoHot,
02555   PoConditionMaximum
02556 } SYSTEM_POWER_CONDITION;
02557 
02558 typedef struct _SET_POWER_SETTING_VALUE {
02559   ULONG Version;
02560   GUID Guid;
02561   SYSTEM_POWER_CONDITION PowerCondition;
02562   ULONG DataLength;
02563   UCHAR Data[ANYSIZE_ARRAY];
02564 } SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE;
02565 
02566 #define POWER_SETTING_VALUE_VERSION              (0x1)
02567 
02568 typedef struct _NOTIFY_USER_POWER_SETTING {
02569   GUID Guid;
02570 } NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;
02571 
02572 typedef struct _APPLICATIONLAUNCH_SETTING_VALUE {
02573   LARGE_INTEGER ActivationTime;
02574   ULONG Flags;
02575   ULONG ButtonInstanceID;
02576 } APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE;
02577 
02578 typedef enum _POWER_PLATFORM_ROLE {
02579   PlatformRoleUnspecified = 0,
02580   PlatformRoleDesktop,
02581   PlatformRoleMobile,
02582   PlatformRoleWorkstation,
02583   PlatformRoleEnterpriseServer,
02584   PlatformRoleSOHOServer,
02585   PlatformRoleAppliancePC,
02586   PlatformRolePerformanceServer,
02587   PlatformRoleMaximum
02588 } POWER_PLATFORM_ROLE;
02589 
02590 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
02591 typedef struct {
02592   ULONG Granularity;
02593   ULONG Capacity;
02594 } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
02595 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
02596 
02597 #endif /* !_PO_DDK_ */
02598 
02599 #define CORE_PARKING_POLICY_CHANGE_IDEAL         0
02600 #define CORE_PARKING_POLICY_CHANGE_SINGLE        1
02601 #define CORE_PARKING_POLICY_CHANGE_ROCKET        2
02602 #define CORE_PARKING_POLICY_CHANGE_MAX           CORE_PARKING_POLICY_CHANGE_ROCKET
02603 
02604 DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
02605 DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
02606 DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
02607 DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
02608 DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
02609 DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
02610 DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
02611 DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
02612 DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
02613 DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
02614 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
02615 DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
02616 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
02617 DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
02618 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
02619 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
02620 DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
02621 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
02622 DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
02623 DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
02624 DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
02625 DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
02626 DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
02627 DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
02628 DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
02629 DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
02630 DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
02631 DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
02632 DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
02633 DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
02634 DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
02635 DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION,  0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
02636 DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
02637 DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
02638 DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
02639 DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
02640 DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
02641 DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
02642 DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
02643 DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
02644 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
02645 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
02646 DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
02647 DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
02648 DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
02649 DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
02650 DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
02651 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
02652 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
02653 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
02654 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
02655 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
02656 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
02657 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
02658 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
02659 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
02660 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
02661 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
02662 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
02663 DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
02664 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
02665 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
02666 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
02667 DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
02668 DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
02669 DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
02670 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
02671 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
02672 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
02673 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
02674 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
02675 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_TIME, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
02676 DEFINE_GUID(GUID_PROCESSOR_PERF_TIME_CHECK, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
02677 DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY, 0x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
02678 DEFINE_GUID(GUID_PROCESSOR_IDLE_ALLOW_SCALING, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
02679 DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
02680 DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
02681 DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
02682 DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
02683 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
02684 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
02685 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
02686 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
02687 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MAX_CORES, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
02688 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MIN_CORES, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
02689 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
02690 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
02691 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
02692 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
02693 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
02694 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
02695 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
02696 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
02697 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
02698 DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
02699 DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
02700 DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
02701 DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
02702 DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
02703 DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
02704 DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
02705 DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE,  0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
02706 DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
02707 DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
02708 DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
02709 DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
02710 DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
02711 DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
02712 DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
02713 
02714 #define PERFSTATE_POLICY_CHANGE_IDEAL            0
02715 #define PERFSTATE_POLICY_CHANGE_SINGLE           1
02716 #define PERFSTATE_POLICY_CHANGE_ROCKET           2
02717 #define PERFSTATE_POLICY_CHANGE_MAX              PERFSTATE_POLICY_CHANGE_ROCKET
02718 
02719 #define PROCESSOR_PERF_BOOST_POLICY_DISABLED     0
02720 #define PROCESSOR_PERF_BOOST_POLICY_MAX          100
02721 
02722 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE     0
02723 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE    1
02724 
02725 _Function_class_(REQUEST_POWER_COMPLETE)
02726 _IRQL_requires_same_
02727 typedef VOID
02728 (NTAPI REQUEST_POWER_COMPLETE)(
02729   _In_ struct _DEVICE_OBJECT *DeviceObject,
02730   _In_ UCHAR MinorFunction,
02731   _In_ POWER_STATE PowerState,
02732   _In_opt_ PVOID Context,
02733   _In_ struct _IO_STATUS_BLOCK *IoStatus);
02734 typedef REQUEST_POWER_COMPLETE *PREQUEST_POWER_COMPLETE;
02735 
02736 _Function_class_(POWER_SETTING_CALLBACK)
02737 _IRQL_requires_same_
02738 typedef NTSTATUS
02739 (NTAPI POWER_SETTING_CALLBACK)(
02740   _In_ LPCGUID SettingGuid,
02741   _In_reads_bytes_(ValueLength) PVOID Value,
02742   _In_ ULONG ValueLength,
02743   _Inout_opt_ PVOID Context);
02744 typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
02745 
02746 /******************************************************************************
02747  *                            Configuration Manager Types                     *
02748  ******************************************************************************/
02749 
02750 /* Resource list definitions */
02751 typedef int CM_RESOURCE_TYPE;
02752 
02753 #define CmResourceTypeNull              0
02754 #define CmResourceTypePort              1
02755 #define CmResourceTypeInterrupt         2
02756 #define CmResourceTypeMemory            3
02757 #define CmResourceTypeDma               4
02758 #define CmResourceTypeDeviceSpecific    5
02759 #define CmResourceTypeBusNumber         6
02760 #define CmResourceTypeNonArbitrated     128
02761 #define CmResourceTypeConfigData        128
02762 #define CmResourceTypeDevicePrivate     129
02763 #define CmResourceTypePcCardConfig      130
02764 #define CmResourceTypeMfCardConfig      131
02765 
02766 /* KEY_VALUE_Xxx.Type */
02767 #define REG_NONE                           0
02768 #define REG_SZ                             1
02769 #define REG_EXPAND_SZ                      2
02770 #define REG_BINARY                         3
02771 #define REG_DWORD                          4
02772 #define REG_DWORD_LITTLE_ENDIAN            4
02773 #define REG_DWORD_BIG_ENDIAN               5
02774 #define REG_LINK                           6
02775 #define REG_MULTI_SZ                       7
02776 #define REG_RESOURCE_LIST                  8
02777 #define REG_FULL_RESOURCE_DESCRIPTOR       9
02778 #define REG_RESOURCE_REQUIREMENTS_LIST     10
02779 #define REG_QWORD                          11
02780 #define REG_QWORD_LITTLE_ENDIAN            11
02781 
02782 /* Registry Access Rights */
02783 #define KEY_QUERY_VALUE         (0x0001)
02784 #define KEY_SET_VALUE           (0x0002)
02785 #define KEY_CREATE_SUB_KEY      (0x0004)
02786 #define KEY_ENUMERATE_SUB_KEYS  (0x0008)
02787 #define KEY_NOTIFY              (0x0010)
02788 #define KEY_CREATE_LINK         (0x0020)
02789 #define KEY_WOW64_32KEY         (0x0200)
02790 #define KEY_WOW64_64KEY         (0x0100)
02791 #define KEY_WOW64_RES           (0x0300)
02792 
02793 #define KEY_READ                ((STANDARD_RIGHTS_READ       |\
02794                                   KEY_QUERY_VALUE            |\
02795                                   KEY_ENUMERATE_SUB_KEYS     |\
02796                                   KEY_NOTIFY)                 \
02797                                   &                           \
02798                                  (~SYNCHRONIZE))
02799 
02800 #define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
02801                                   KEY_SET_VALUE              |\
02802                                   KEY_CREATE_SUB_KEY)         \
02803                                   &                           \
02804                                  (~SYNCHRONIZE))
02805 
02806 #define KEY_EXECUTE             ((KEY_READ)                   \
02807                                   &                           \
02808                                  (~SYNCHRONIZE))
02809 
02810 #define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
02811                                   KEY_QUERY_VALUE            |\
02812                                   KEY_SET_VALUE              |\
02813                                   KEY_CREATE_SUB_KEY         |\
02814                                   KEY_ENUMERATE_SUB_KEYS     |\
02815                                   KEY_NOTIFY                 |\
02816                                   KEY_CREATE_LINK)            \
02817                                   &                           \
02818                                  (~SYNCHRONIZE))
02819 
02820 /* Registry Open/Create Options */
02821 #define REG_OPTION_RESERVED         (0x00000000L)
02822 #define REG_OPTION_NON_VOLATILE     (0x00000000L)
02823 #define REG_OPTION_VOLATILE         (0x00000001L)
02824 #define REG_OPTION_CREATE_LINK      (0x00000002L)
02825 #define REG_OPTION_BACKUP_RESTORE   (0x00000004L)
02826 #define REG_OPTION_OPEN_LINK        (0x00000008L)
02827 
02828 #define REG_LEGAL_OPTION            \
02829                 (REG_OPTION_RESERVED            |\
02830                  REG_OPTION_NON_VOLATILE        |\
02831                  REG_OPTION_VOLATILE            |\
02832                  REG_OPTION_CREATE_LINK         |\
02833                  REG_OPTION_BACKUP_RESTORE      |\
02834                  REG_OPTION_OPEN_LINK)
02835 
02836 #define REG_OPEN_LEGAL_OPTION       \
02837                 (REG_OPTION_RESERVED            |\
02838                  REG_OPTION_BACKUP_RESTORE      |\
02839                  REG_OPTION_OPEN_LINK)
02840 
02841 #define REG_STANDARD_FORMAT            1
02842 #define REG_LATEST_FORMAT              2
02843 #define REG_NO_COMPRESSION             4
02844 
02845 /* Key creation/open disposition */
02846 #define REG_CREATED_NEW_KEY         (0x00000001L)
02847 #define REG_OPENED_EXISTING_KEY     (0x00000002L)
02848 
02849 /* Key restore & hive load flags */
02850 #define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)
02851 #define REG_REFRESH_HIVE                (0x00000002L)
02852 #define REG_NO_LAZY_FLUSH               (0x00000004L)
02853 #define REG_FORCE_RESTORE               (0x00000008L)
02854 #define REG_APP_HIVE                    (0x00000010L)
02855 #define REG_PROCESS_PRIVATE             (0x00000020L)
02856 #define REG_START_JOURNAL               (0x00000040L)
02857 #define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)
02858 #define REG_HIVE_NO_RM                  (0x00000100L)
02859 #define REG_HIVE_SINGLE_LOG             (0x00000200L)
02860 #define REG_BOOT_HIVE                   (0x00000400L)
02861 
02862 /* Unload Flags */
02863 #define REG_FORCE_UNLOAD            1
02864 
02865 /* Notify Filter Values */
02866 #define REG_NOTIFY_CHANGE_NAME          (0x00000001L)
02867 #define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)
02868 #define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L)
02869 #define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)
02870 
02871 #define REG_LEGAL_CHANGE_FILTER                 \
02872                 (REG_NOTIFY_CHANGE_NAME          |\
02873                  REG_NOTIFY_CHANGE_ATTRIBUTES    |\
02874                  REG_NOTIFY_CHANGE_LAST_SET      |\
02875                  REG_NOTIFY_CHANGE_SECURITY)
02876 
02877 #include <pshpack4.h>
02878 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
02879   UCHAR Type;
02880   UCHAR ShareDisposition;
02881   USHORT Flags;
02882   union {
02883     struct {
02884       PHYSICAL_ADDRESS Start;
02885       ULONG Length;
02886     } Generic;
02887     struct {
02888       PHYSICAL_ADDRESS Start;
02889       ULONG Length;
02890     } Port;
02891     struct {
02892 #if defined(NT_PROCESSOR_GROUPS)
02893       USHORT Level;
02894       USHORT Group;
02895 #else
02896       ULONG Level;
02897 #endif
02898       ULONG Vector;
02899       KAFFINITY Affinity;
02900     } Interrupt;
02901 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
02902     struct {
02903       _ANONYMOUS_UNION union {
02904         struct {
02905 #if defined(NT_PROCESSOR_GROUPS)
02906           USHORT Group;
02907 #else
02908           USHORT Reserved;
02909 #endif
02910           USHORT MessageCount;
02911           ULONG Vector;
02912           KAFFINITY Affinity;
02913         } Raw;
02914         struct {
02915 #if defined(NT_PROCESSOR_GROUPS)
02916           USHORT Level;
02917           USHORT Group;
02918 #else
02919           ULONG Level;
02920 #endif
02921           ULONG Vector;
02922           KAFFINITY Affinity;
02923         } Translated;
02924       } DUMMYUNIONNAME;
02925     } MessageInterrupt;
02926 #endif
02927     struct {
02928       PHYSICAL_ADDRESS Start;
02929       ULONG Length;
02930     } Memory;
02931     struct {
02932       ULONG Channel;
02933       ULONG Port;
02934       ULONG Reserved1;
02935     } Dma;
02936     struct {
02937       ULONG Data[3];
02938     } DevicePrivate;
02939     struct {
02940       ULONG Start;
02941       ULONG Length;
02942       ULONG Reserved;
02943     } BusNumber;
02944     struct {
02945       ULONG DataSize;
02946       ULONG Reserved1;
02947       ULONG Reserved2;
02948     } DeviceSpecificData;
02949 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
02950     struct {
02951       PHYSICAL_ADDRESS Start;
02952       ULONG Length40;
02953     } Memory40;
02954     struct {
02955       PHYSICAL_ADDRESS Start;
02956       ULONG Length48;
02957     } Memory48;
02958     struct {
02959       PHYSICAL_ADDRESS Start;
02960       ULONG Length64;
02961     } Memory64;
02962 #endif
02963   } u;
02964 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
02965 #include <poppack.h>
02966 
02967 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
02968 #define CmResourceTypeNull                0
02969 #define CmResourceTypePort                1
02970 #define CmResourceTypeInterrupt           2
02971 #define CmResourceTypeMemory              3
02972 #define CmResourceTypeDma                 4
02973 #define CmResourceTypeDeviceSpecific      5
02974 #define CmResourceTypeBusNumber           6
02975 #define CmResourceTypeMemoryLarge         7
02976 #define CmResourceTypeNonArbitrated       128
02977 #define CmResourceTypeConfigData          128
02978 #define CmResourceTypeDevicePrivate       129
02979 #define CmResourceTypePcCardConfig        130
02980 #define CmResourceTypeMfCardConfig        131
02981 
02982 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
02983 typedef enum _CM_SHARE_DISPOSITION {
02984   CmResourceShareUndetermined = 0,
02985   CmResourceShareDeviceExclusive,
02986   CmResourceShareDriverExclusive,
02987   CmResourceShareShared
02988 } CM_SHARE_DISPOSITION;
02989 
02990 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
02991 #define CM_RESOURCE_PORT_MEMORY           0x0000
02992 #define CM_RESOURCE_PORT_IO               0x0001
02993 #define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
02994 #define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
02995 #define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
02996 #define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
02997 #define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
02998 #define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
02999 #define CM_RESOURCE_PORT_BAR              0x0100
03000 
03001 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
03002 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
03003 #define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
03004 #define CM_RESOURCE_INTERRUPT_MESSAGE         0x0002
03005 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
03006 
03007 #define CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS 0x0001
03008 
03009 #define CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN   ((ULONG)-2)
03010 
03011 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
03012 #define CM_RESOURCE_MEMORY_READ_WRITE                    0x0000
03013 #define CM_RESOURCE_MEMORY_READ_ONLY                     0x0001
03014 #define CM_RESOURCE_MEMORY_WRITE_ONLY                    0x0002
03015 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK             0x0003
03016 #define CM_RESOURCE_MEMORY_PREFETCHABLE                  0x0004
03017 #define CM_RESOURCE_MEMORY_COMBINEDWRITE                 0x0008
03018 #define CM_RESOURCE_MEMORY_24                            0x0010
03019 #define CM_RESOURCE_MEMORY_CACHEABLE                     0x0020
03020 #define CM_RESOURCE_MEMORY_WINDOW_DECODE                 0x0040
03021 #define CM_RESOURCE_MEMORY_BAR                           0x0080
03022 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
03023 
03024 #define CM_RESOURCE_MEMORY_LARGE                         0x0E00
03025 #define CM_RESOURCE_MEMORY_LARGE_40                      0x0200
03026 #define CM_RESOURCE_MEMORY_LARGE_48                      0x0400
03027 #define CM_RESOURCE_MEMORY_LARGE_64                      0x0800
03028 
03029 #define CM_RESOURCE_MEMORY_LARGE_40_MAXLEN               0x000000FFFFFFFF00
03030 #define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN               0x0000FFFFFFFF0000
03031 #define CM_RESOURCE_MEMORY_LARGE_64_MAXLEN               0xFFFFFFFF00000000
03032 
03033 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
03034 #define CM_RESOURCE_DMA_8                 0x0000
03035 #define CM_RESOURCE_DMA_16                0x0001
03036 #define CM_RESOURCE_DMA_32                0x0002
03037 #define CM_RESOURCE_DMA_8_AND_16          0x0004
03038 #define CM_RESOURCE_DMA_BUS_MASTER        0x0008
03039 #define CM_RESOURCE_DMA_TYPE_A            0x0010
03040 #define CM_RESOURCE_DMA_TYPE_B            0x0020
03041 #define CM_RESOURCE_DMA_TYPE_F            0x0040
03042 
03043 typedef struct _DEVICE_FLAGS {
03044   ULONG Failed:1;
03045   ULONG ReadOnly:1;
03046   ULONG Removable:1;
03047   ULONG ConsoleIn:1;
03048   ULONG ConsoleOut:1;
03049   ULONG Input:1;
03050   ULONG Output:1;
03051 } DEVICE_FLAGS, *PDEVICE_FLAGS;
03052 
03053 typedef enum _INTERFACE_TYPE {
03054   InterfaceTypeUndefined = -1,
03055   Internal,
03056   Isa,
03057   Eisa,
03058   MicroChannel,
03059   TurboChannel,
03060   PCIBus,
03061   VMEBus,
03062   NuBus,
03063   PCMCIABus,
03064   CBus,
03065   MPIBus,
03066   MPSABus,
03067   ProcessorInternal,
03068   InternalPowerBus,
03069   PNPISABus,
03070   PNPBus,
03071   Vmcs,
03072   MaximumInterfaceType
03073 } INTERFACE_TYPE, *PINTERFACE_TYPE;
03074 
03075 typedef struct _CM_COMPONENT_INFORMATION {
03076   DEVICE_FLAGS Flags;
03077   ULONG Version;
03078   ULONG Key;
03079   KAFFINITY AffinityMask;
03080 } CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION;
03081 
03082 typedef struct _CM_ROM_BLOCK {
03083   ULONG Address;
03084   ULONG Size;
03085 } CM_ROM_BLOCK, *PCM_ROM_BLOCK;
03086 
03087 typedef struct _CM_PARTIAL_RESOURCE_LIST {
03088   USHORT Version;
03089   USHORT Revision;
03090   ULONG Count;
03091   CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
03092 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
03093 
03094 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
03095   INTERFACE_TYPE InterfaceType;
03096   ULONG BusNumber;
03097   CM_PARTIAL_RESOURCE_LIST PartialResourceList;
03098 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
03099 
03100 typedef struct _CM_RESOURCE_LIST {
03101   ULONG Count;
03102   CM_FULL_RESOURCE_DESCRIPTOR List[1];
03103 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
03104 
03105 typedef struct _PNP_BUS_INFORMATION {
03106   GUID BusTypeGuid;
03107   INTERFACE_TYPE LegacyBusType;
03108   ULONG BusNumber;
03109 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
03110 
03111 #include <pshpack1.h>
03112 
03113 typedef struct _CM_INT13_DRIVE_PARAMETER {
03114   USHORT DriveSelect;
03115   ULONG MaxCylinders;
03116   USHORT SectorsPerTrack;
03117   USHORT MaxHeads;
03118   USHORT NumberDrives;
03119 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
03120 
03121 typedef struct _CM_MCA_POS_DATA {
03122   USHORT AdapterId;
03123   UCHAR PosData1;
03124   UCHAR PosData2;
03125   UCHAR PosData3;
03126   UCHAR PosData4;
03127 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
03128 
03129 typedef struct _CM_PNP_BIOS_DEVICE_NODE {
03130   USHORT Size;
03131   UCHAR Node;
03132   ULONG ProductId;
03133   UCHAR DeviceType[3];
03134   USHORT DeviceAttributes;
03135 } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
03136 
03137 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
03138   UCHAR Signature[4];
03139   UCHAR Revision;
03140   UCHAR Length;
03141   USHORT ControlField;
03142   UCHAR Checksum;
03143   ULONG EventFlagAddress;
03144   USHORT RealModeEntryOffset;
03145   USHORT RealModeEntrySegment;
03146   USHORT ProtectedModeEntryOffset;
03147   ULONG ProtectedModeCodeBaseAddress;
03148   ULONG OemDeviceId;
03149   USHORT RealModeDataBaseAddress;
03150   ULONG ProtectedModeDataBaseAddress;
03151 } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
03152 
03153 #include <poppack.h>
03154 
03155 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
03156   ULONG BytesPerSector;
03157   ULONG NumberOfCylinders;
03158   ULONG SectorsPerTrack;
03159   ULONG NumberOfHeads;
03160 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
03161 
03162 typedef struct _CM_KEYBOARD_DEVICE_DATA {
03163   USHORT Version;
03164   USHORT Revision;
03165   UCHAR Type;
03166   UCHAR Subtype;
03167   USHORT KeyboardFlags;
03168 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
03169 
03170 typedef struct _CM_SCSI_DEVICE_DATA {
03171   USHORT Version;
03172   USHORT Revision;
03173   UCHAR HostIdentifier;
03174 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
03175 
03176 typedef struct _CM_VIDEO_DEVICE_DATA {
03177   USHORT Version;
03178   USHORT Revision;
03179   ULONG VideoClock;
03180 } CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA;
03181 
03182 typedef struct _CM_SONIC_DEVICE_DATA {
03183   USHORT Version;
03184   USHORT Revision;
03185   USHORT DataConfigurationRegister;
03186   UCHAR EthernetAddress[8];
03187 } CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA;
03188 
03189 typedef struct _CM_SERIAL_DEVICE_DATA {
03190   USHORT Version;
03191   USHORT Revision;
03192   ULONG BaudClock;
03193 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
03194 
03195 typedef struct _CM_MONITOR_DEVICE_DATA {
03196   USHORT Version;
03197   USHORT Revision;
03198   USHORT HorizontalScreenSize;
03199   USHORT VerticalScreenSize;
03200   USHORT HorizontalResolution;
03201   USHORT VerticalResolution;
03202   USHORT HorizontalDisplayTimeLow;
03203   USHORT HorizontalDisplayTime;
03204   USHORT HorizontalDisplayTimeHigh;
03205   USHORT HorizontalBackPorchLow;
03206   USHORT HorizontalBackPorch;
03207   USHORT HorizontalBackPorchHigh;
03208   USHORT HorizontalFrontPorchLow;
03209   USHORT HorizontalFrontPorch;
03210   USHORT HorizontalFrontPorchHigh;
03211   USHORT HorizontalSyncLow;
03212   USHORT HorizontalSync;
03213   USHORT HorizontalSyncHigh;
03214   USHORT VerticalBackPorchLow;
03215   USHORT VerticalBackPorch;
03216   USHORT VerticalBackPorchHigh;
03217   USHORT VerticalFrontPorchLow;
03218   USHORT VerticalFrontPorch;
03219   USHORT VerticalFrontPorchHigh;
03220   USHORT VerticalSyncLow;
03221   USHORT VerticalSync;
03222   USHORT VerticalSyncHigh;
03223 } CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA;
03224 
03225 typedef struct _CM_FLOPPY_DEVICE_DATA {
03226   USHORT Version;
03227   USHORT Revision;
03228   CHAR Size[8];
03229   ULONG MaxDensity;
03230   ULONG MountDensity;
03231   UCHAR StepRateHeadUnloadTime;
03232   UCHAR HeadLoadTime;
03233   UCHAR MotorOffTime;
03234   UCHAR SectorLengthCode;
03235   UCHAR SectorPerTrack;
03236   UCHAR ReadWriteGapLength;
03237   UCHAR DataTransferLength;
03238   UCHAR FormatGapLength;
03239   UCHAR FormatFillCharacter;
03240   UCHAR HeadSettleTime;
03241   UCHAR MotorSettleTime;
03242   UCHAR MaximumTrackValue;
03243   UCHAR DataTransferRate;
03244 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
03245 
03246 typedef enum _KEY_INFORMATION_CLASS {
03247   KeyBasicInformation,
03248   KeyNodeInformation,
03249   KeyFullInformation,
03250   KeyNameInformation,
03251   KeyCachedInformation,
03252   KeyFlagsInformation,
03253   KeyVirtualizationInformation,
03254   KeyHandleTagsInformation,
03255   MaxKeyInfoClass
03256 } KEY_INFORMATION_CLASS;
03257 
03258 typedef struct _KEY_BASIC_INFORMATION {
03259   LARGE_INTEGER LastWriteTime;
03260   ULONG TitleIndex;
03261   ULONG NameLength;
03262   WCHAR Name[1];
03263 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
03264 
03265 typedef struct _KEY_CONTROL_FLAGS_INFORMATION {
03266   ULONG ControlFlags;
03267 } KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION;
03268 
03269 typedef struct _KEY_FULL_INFORMATION {
03270   LARGE_INTEGER LastWriteTime;
03271   ULONG TitleIndex;
03272   ULONG ClassOffset;
03273   ULONG ClassLength;
03274   ULONG SubKeys;
03275   ULONG MaxNameLen;
03276   ULONG MaxClassLen;
03277   ULONG Values;
03278   ULONG MaxValueNameLen;
03279   ULONG MaxValueDataLen;
03280   WCHAR Class[1];
03281 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
03282 
03283 typedef struct _KEY_HANDLE_TAGS_INFORMATION {
03284   ULONG HandleTags;
03285 } KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION;
03286 
03287 typedef struct _KEY_NODE_INFORMATION {
03288   LARGE_INTEGER LastWriteTime;
03289   ULONG TitleIndex;
03290   ULONG ClassOffset;
03291   ULONG ClassLength;
03292   ULONG NameLength;
03293   WCHAR Name[1];
03294 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
03295 
03296 typedef enum _KEY_SET_INFORMATION_CLASS {
03297   KeyWriteTimeInformation,
03298   KeyWow64FlagsInformation,
03299   KeyControlFlagsInformation,
03300   KeySetVirtualizationInformation,
03301   KeySetDebugInformation,
03302   KeySetHandleTagsInformation,
03303   MaxKeySetInfoClass
03304 } KEY_SET_INFORMATION_CLASS;
03305 
03306 typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION {
03307   ULONG VirtualTarget:1;
03308   ULONG VirtualStore:1;
03309   ULONG VirtualSource:1;
03310   ULONG Reserved:29;
03311 } KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION;
03312 
03313 typedef struct _KEY_VALUE_BASIC_INFORMATION {
03314   ULONG TitleIndex;
03315   ULONG Type;
03316   ULONG NameLength;
03317   WCHAR Name[1];
03318 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
03319 
03320 typedef struct _KEY_VALUE_FULL_INFORMATION {
03321   ULONG TitleIndex;
03322   ULONG Type;
03323   ULONG DataOffset;
03324   ULONG DataLength;
03325   ULONG NameLength;
03326   WCHAR Name[1];
03327 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
03328 
03329 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
03330   ULONG TitleIndex;
03331   ULONG Type;
03332   ULONG DataLength;
03333   _Field_size_bytes_(DataLength) UCHAR Data[1];
03334 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
03335 
03336 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
03337   ULONG Type;
03338   ULONG DataLength;
03339   _Field_size_bytes_(DataLength) UCHAR Data[1];
03340 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
03341 
03342 typedef struct _KEY_VALUE_ENTRY {
03343   PUNICODE_STRING ValueName;
03344   ULONG DataLength;
03345   ULONG DataOffset;
03346   ULONG Type;
03347 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
03348 
03349 typedef enum _KEY_VALUE_INFORMATION_CLASS {
03350   KeyValueBasicInformation,
03351   KeyValueFullInformation,
03352   KeyValuePartialInformation,
03353   KeyValueFullInformationAlign64,
03354   KeyValuePartialInformationAlign64
03355 } KEY_VALUE_INFORMATION_CLASS;
03356 
03357 typedef struct _KEY_WOW64_FLAGS_INFORMATION {
03358   ULONG UserFlags;
03359 } KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION;
03360 
03361 typedef struct _KEY_WRITE_TIME_INFORMATION {
03362   LARGE_INTEGER LastWriteTime;
03363 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
03364 
03365 typedef enum _REG_NOTIFY_CLASS {
03366   RegNtDeleteKey,
03367   RegNtPreDeleteKey = RegNtDeleteKey,
03368   RegNtSetValueKey,
03369   RegNtPreSetValueKey = RegNtSetValueKey,
03370   RegNtDeleteValueKey,
03371   RegNtPreDeleteValueKey = RegNtDeleteValueKey,
03372   RegNtSetInformationKey,
03373   RegNtPreSetInformationKey = RegNtSetInformationKey,
03374   RegNtRenameKey,
03375   RegNtPreRenameKey = RegNtRenameKey,
03376   RegNtEnumerateKey,
03377   RegNtPreEnumerateKey = RegNtEnumerateKey,
03378   RegNtEnumerateValueKey,
03379   RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
03380   RegNtQueryKey,
03381   RegNtPreQueryKey = RegNtQueryKey,
03382   RegNtQueryValueKey,
03383   RegNtPreQueryValueKey = RegNtQueryValueKey,
03384   RegNtQueryMultipleValueKey,
03385   RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
03386   RegNtPreCreateKey,
03387   RegNtPostCreateKey,
03388   RegNtPreOpenKey,
03389   RegNtPostOpenKey,
03390   RegNtKeyHandleClose,
03391   RegNtPreKeyHandleClose = RegNtKeyHandleClose,
03392   RegNtPostDeleteKey,
03393   RegNtPostSetValueKey,
03394   RegNtPostDeleteValueKey,
03395   RegNtPostSetInformationKey,
03396   RegNtPostRenameKey,
03397   RegNtPostEnumerateKey,
03398   RegNtPostEnumerateValueKey,
03399   RegNtPostQueryKey,
03400   RegNtPostQueryValueKey,
03401   RegNtPostQueryMultipleValueKey,
03402   RegNtPostKeyHandleClose,
03403   RegNtPreCreateKeyEx,
03404   RegNtPostCreateKeyEx,
03405   RegNtPreOpenKeyEx,
03406   RegNtPostOpenKeyEx,
03407   RegNtPreFlushKey,
03408   RegNtPostFlushKey,
03409   RegNtPreLoadKey,
03410   RegNtPostLoadKey,
03411   RegNtPreUnLoadKey,
03412   RegNtPostUnLoadKey,
03413   RegNtPreQueryKeySecurity,
03414   RegNtPostQueryKeySecurity,
03415   RegNtPreSetKeySecurity,
03416   RegNtPostSetKeySecurity,
03417   RegNtCallbackObjectContextCleanup,
03418   RegNtPreRestoreKey,
03419   RegNtPostRestoreKey,
03420   RegNtPreSaveKey,
03421   RegNtPostSaveKey,
03422   RegNtPreReplaceKey,
03423   RegNtPostReplaceKey,
03424   MaxRegNtNotifyClass
03425 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
03426 
03427 _IRQL_requires_same_
03428 _Function_class_(EX_CALLBACK_FUNCTION)
03429 typedef NTSTATUS
03430 (NTAPI EX_CALLBACK_FUNCTION)(
03431   _In_ PVOID CallbackContext,
03432   _In_opt_ PVOID Argument1,
03433   _In_opt_ PVOID Argument2);
03434 typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION;
03435 
03436 typedef struct _REG_DELETE_KEY_INFORMATION {
03437   PVOID Object;
03438   PVOID CallContext;
03439   PVOID ObjectContext;
03440   PVOID Reserved;
03441 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
03442 #if (NTDDI_VERSION >= NTDDI_VISTA)
03443 , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
03444 #endif
03445 ;
03446 
03447 typedef struct _REG_SET_VALUE_KEY_INFORMATION {
03448   PVOID Object;
03449   PUNICODE_STRING ValueName;
03450   ULONG TitleIndex;
03451   ULONG Type;
03452   PVOID Data;
03453   ULONG DataSize;
03454   PVOID CallContext;
03455   PVOID ObjectContext;
03456   PVOID Reserved;
03457 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
03458 
03459 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
03460   PVOID Object;
03461   PUNICODE_STRING ValueName;
03462   PVOID CallContext;
03463   PVOID ObjectContext;
03464   PVOID Reserved;
03465 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
03466 
03467 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
03468   PVOID Object;
03469   KEY_SET_INFORMATION_CLASS KeySetInformationClass;
03470   PVOID KeySetInformation;
03471   ULONG KeySetInformationLength;
03472   PVOID CallContext;
03473   PVOID ObjectContext;
03474   PVOID Reserved;
03475 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
03476 
03477 typedef struct _REG_ENUMERATE_KEY_INFORMATION {
03478   PVOID Object;
03479   ULONG Index;
03480   KEY_INFORMATION_CLASS KeyInformationClass;
03481   PVOID KeyInformation;
03482   ULONG Length;
03483   PULONG ResultLength;
03484   PVOID CallContext;
03485   PVOID ObjectContext;
03486   PVOID Reserved;
03487 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
03488 
03489 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
03490   PVOID Object;
03491   ULONG Index;
03492   KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
03493   PVOID KeyValueInformation;
03494   ULONG Length;
03495   PULONG ResultLength;
03496   PVOID CallContext;
03497   PVOID ObjectContext;
03498   PVOID Reserved;
03499 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
03500 
03501 typedef struct _REG_QUERY_KEY_INFORMATION {
03502   PVOID Object;
03503   KEY_INFORMATION_CLASS KeyInformationClass;
03504   PVOID KeyInformation;
03505   ULONG Length;
03506   PULONG ResultLength;
03507   PVOID CallContext;
03508   PVOID ObjectContext;
03509   PVOID Reserved;
03510 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
03511 
03512 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
03513   PVOID Object;
03514   PUNICODE_STRING ValueName;
03515   KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
03516   PVOID KeyValueInformation;
03517   ULONG Length;
03518   PULONG ResultLength;
03519   PVOID CallContext;
03520   PVOID ObjectContext;
03521   PVOID Reserved;
03522 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
03523 
03524 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
03525   PVOID Object;
03526   PKEY_VALUE_ENTRY ValueEntries;
03527   ULONG EntryCount;
03528   PVOID ValueBuffer;
03529   PULONG BufferLength;
03530   PULONG RequiredBufferLength;
03531   PVOID CallContext;
03532   PVOID ObjectContext;
03533   PVOID Reserved;
03534 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
03535 
03536 typedef struct _REG_RENAME_KEY_INFORMATION {
03537   PVOID Object;
03538   PUNICODE_STRING NewName;
03539   PVOID CallContext;
03540   PVOID ObjectContext;
03541   PVOID Reserved;
03542 } REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION;
03543 
03544 typedef struct _REG_CREATE_KEY_INFORMATION {
03545   PUNICODE_STRING CompleteName;
03546   PVOID RootObject;
03547   PVOID ObjectType;
03548   ULONG CreateOptions;
03549   PUNICODE_STRING Class;
03550   PVOID SecurityDescriptor;
03551   PVOID SecurityQualityOfService;
03552   ACCESS_MASK DesiredAccess;
03553   ACCESS_MASK GrantedAccess;
03554   PULONG Disposition;
03555   PVOID *ResultObject;
03556   PVOID CallContext;
03557   PVOID RootObjectContext;
03558   PVOID Transaction;
03559   PVOID Reserved;
03560 } REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION;
03561 
03562 typedef struct _REG_CREATE_KEY_INFORMATION_V1 {
03563   PUNICODE_STRING CompleteName;
03564   PVOID RootObject;
03565   PVOID ObjectType;
03566   ULONG Options;
03567   PUNICODE_STRING Class;
03568   PVOID SecurityDescriptor;
03569   PVOID SecurityQualityOfService;
03570   ACCESS_MASK DesiredAccess;
03571   ACCESS_MASK GrantedAccess;
03572   PULONG Disposition;
03573   PVOID *ResultObject;
03574   PVOID CallContext;
03575   PVOID RootObjectContext;
03576   PVOID Transaction;
03577   ULONG_PTR Version;
03578   PUNICODE_STRING RemainingName;
03579   ULONG Wow64Flags;
03580   ULONG Attributes;
03581   KPROCESSOR_MODE CheckAccessMode;
03582 } REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1;
03583 
03584 typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
03585   PUNICODE_STRING CompleteName;
03586 } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
03587 
03588 typedef struct _REG_POST_CREATE_KEY_INFORMATION {
03589   PUNICODE_STRING CompleteName;
03590   PVOID Object;
03591   NTSTATUS Status;
03592 } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
03593 
03594 typedef struct _REG_POST_OPERATION_INFORMATION {
03595   PVOID Object;
03596   NTSTATUS Status;
03597   PVOID PreInformation;
03598   NTSTATUS ReturnStatus;
03599   PVOID CallContext;
03600   PVOID ObjectContext;
03601   PVOID Reserved;
03602 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
03603 
03604 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
03605   PVOID Object;
03606   PVOID CallContext;
03607   PVOID ObjectContext;
03608   PVOID Reserved;
03609 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
03610 
03611 #if (NTDDI_VERSION >= NTDDI_VISTA)
03612 
03613 typedef struct _REG_LOAD_KEY_INFORMATION {
03614   PVOID Object;
03615   PUNICODE_STRING KeyName;
03616   PUNICODE_STRING SourceFile;
03617   ULONG Flags;
03618   PVOID TrustClassObject;
03619   PVOID UserEvent;
03620   ACCESS_MASK DesiredAccess;
03621   PHANDLE RootHandle;
03622   PVOID CallContext;
03623   PVOID ObjectContext;
03624   PVOID Reserved;
03625 } REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION;
03626 
03627 typedef struct _REG_UNLOAD_KEY_INFORMATION {
03628   PVOID Object;
03629   PVOID UserEvent;
03630   PVOID CallContext;
03631   PVOID ObjectContext;
03632   PVOID Reserved;
03633 } REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION;
03634 
03635 typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION {
03636   PVOID Object;
03637   PVOID ObjectContext;
03638   PVOID Reserved;
03639 } REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION;
03640 
03641 typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION {
03642   PVOID Object;
03643   PSECURITY_INFORMATION SecurityInformation;
03644   PSECURITY_DESCRIPTOR SecurityDescriptor;
03645   PULONG Length;
03646   PVOID CallContext;
03647   PVOID ObjectContext;
03648   PVOID Reserved;
03649 } REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION;
03650 
03651 typedef struct _REG_SET_KEY_SECURITY_INFORMATION {
03652   PVOID Object;
03653   PSECURITY_INFORMATION SecurityInformation;
03654   PSECURITY_DESCRIPTOR SecurityDescriptor;
03655   PVOID CallContext;
03656   PVOID ObjectContext;
03657   PVOID Reserved;
03658 } REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION;
03659 
03660 typedef struct _REG_RESTORE_KEY_INFORMATION {
03661   PVOID Object;
03662   HANDLE FileHandle;
03663   ULONG Flags;
03664   PVOID CallContext;
03665   PVOID ObjectContext;
03666   PVOID Reserved;
03667 } REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION;
03668 
03669 typedef struct _REG_SAVE_KEY_INFORMATION {
03670   PVOID Object;
03671   HANDLE FileHandle;
03672   ULONG Format;
03673   PVOID CallContext;
03674   PVOID ObjectContext;
03675   PVOID Reserved;
03676 } REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION;
03677 
03678 typedef struct _REG_REPLACE_KEY_INFORMATION {
03679   PVOID Object;
03680   PUNICODE_STRING OldFileName;
03681   PUNICODE_STRING NewFileName;
03682   PVOID CallContext;
03683   PVOID ObjectContext;
03684   PVOID Reserved;
03685 } REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION;
03686 
03687 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
03688 
03689 #define SERVICE_KERNEL_DRIVER          0x00000001
03690 #define SERVICE_FILE_SYSTEM_DRIVER     0x00000002
03691 #define SERVICE_ADAPTER                0x00000004
03692 #define SERVICE_RECOGNIZER_DRIVER      0x00000008
03693 
03694 #define SERVICE_DRIVER                 (SERVICE_KERNEL_DRIVER | \
03695                                         SERVICE_FILE_SYSTEM_DRIVER | \
03696                                         SERVICE_RECOGNIZER_DRIVER)
03697 
03698 #define SERVICE_WIN32_OWN_PROCESS      0x00000010
03699 #define SERVICE_WIN32_SHARE_PROCESS    0x00000020
03700 #define SERVICE_WIN32                  (SERVICE_WIN32_OWN_PROCESS | \
03701                                         SERVICE_WIN32_SHARE_PROCESS)
03702 
03703 #define SERVICE_INTERACTIVE_PROCESS    0x00000100
03704 
03705 #define SERVICE_TYPE_ALL               (SERVICE_WIN32  | \
03706                                         SERVICE_ADAPTER | \
03707                                         SERVICE_DRIVER  | \
03708                                         SERVICE_INTERACTIVE_PROCESS)
03709 
03710 /* Service Start Types */
03711 #define SERVICE_BOOT_START             0x00000000
03712 #define SERVICE_SYSTEM_START           0x00000001
03713 #define SERVICE_AUTO_START             0x00000002
03714 #define SERVICE_DEMAND_START           0x00000003
03715 #define SERVICE_DISABLED               0x00000004
03716 
03717 #define SERVICE_ERROR_IGNORE           0x00000000
03718 #define SERVICE_ERROR_NORMAL           0x00000001
03719 #define SERVICE_ERROR_SEVERE           0x00000002
03720 #define SERVICE_ERROR_CRITICAL         0x00000003
03721 
03722 typedef enum _CM_SERVICE_NODE_TYPE {
03723   DriverType = SERVICE_KERNEL_DRIVER,
03724   FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
03725   Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
03726   Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
03727   AdapterType = SERVICE_ADAPTER,
03728   RecognizerType = SERVICE_RECOGNIZER_DRIVER
03729 } SERVICE_NODE_TYPE;
03730 
03731 typedef enum _CM_SERVICE_LOAD_TYPE {
03732   BootLoad = SERVICE_BOOT_START,
03733   SystemLoad = SERVICE_SYSTEM_START,
03734   AutoLoad = SERVICE_AUTO_START,
03735   DemandLoad = SERVICE_DEMAND_START,
03736   DisableLoad = SERVICE_DISABLED
03737 } SERVICE_LOAD_TYPE;
03738 
03739 typedef enum _CM_ERROR_CONTROL_TYPE {
03740   IgnoreError = SERVICE_ERROR_IGNORE,
03741   NormalError = SERVICE_ERROR_NORMAL,
03742   SevereError = SERVICE_ERROR_SEVERE,
03743   CriticalError = SERVICE_ERROR_CRITICAL
03744 } SERVICE_ERROR_TYPE;
03745 
03746 #define CM_SERVICE_NETWORK_BOOT_LOAD      0x00000001
03747 #define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
03748 #define CM_SERVICE_USB_DISK_BOOT_LOAD     0x00000004
03749 
03750 #define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD |       \
03751                                          CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD |  \
03752                                          CM_SERVICE_USB_DISK_BOOT_LOAD)
03753 
03754 /******************************************************************************
03755  *                         I/O Manager Types                                  *
03756  ******************************************************************************/
03757 
03758 
03759 #define STATUS_CONTINUE_COMPLETION      STATUS_SUCCESS
03760 
03761 #define CONNECT_FULLY_SPECIFIED         0x1
03762 #define CONNECT_LINE_BASED              0x2
03763 #define CONNECT_MESSAGE_BASED           0x3
03764 #define CONNECT_FULLY_SPECIFIED_GROUP   0x4
03765 #define CONNECT_CURRENT_VERSION         0x4
03766 
03767 #define POOL_COLD_ALLOCATION                256
03768 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE    8
03769 #define POOL_RAISE_IF_ALLOCATION_FAILURE    16
03770 
03771 #define IO_TYPE_ADAPTER                 1
03772 #define IO_TYPE_CONTROLLER              2
03773 #define IO_TYPE_DEVICE                  3
03774 #define IO_TYPE_DRIVER                  4
03775 #define IO_TYPE_FILE                    5
03776 #define IO_TYPE_IRP                     6
03777 #define IO_TYPE_MASTER_ADAPTER          7
03778 #define IO_TYPE_OPEN_PACKET             8
03779 #define IO_TYPE_TIMER                   9
03780 #define IO_TYPE_VPB                     10
03781 #define IO_TYPE_ERROR_LOG               11
03782 #define IO_TYPE_ERROR_MESSAGE           12
03783 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
03784 
03785 #define IO_TYPE_CSQ_IRP_CONTEXT 1
03786 #define IO_TYPE_CSQ 2
03787 #define IO_TYPE_CSQ_EX 3
03788 
03789 /* IO_RESOURCE_DESCRIPTOR.Option */
03790 #define IO_RESOURCE_PREFERRED             0x01
03791 #define IO_RESOURCE_DEFAULT               0x02
03792 #define IO_RESOURCE_ALTERNATIVE           0x08
03793 
03794 #define FILE_DEVICE_BEEP                  0x00000001
03795 #define FILE_DEVICE_CD_ROM                0x00000002
03796 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
03797 #define FILE_DEVICE_CONTROLLER            0x00000004
03798 #define FILE_DEVICE_DATALINK              0x00000005
03799 #define FILE_DEVICE_DFS                   0x00000006
03800 #define FILE_DEVICE_DISK                  0x00000007
03801 #define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
03802 #define FILE_DEVICE_FILE_SYSTEM           0x00000009
03803 #define FILE_DEVICE_INPORT_PORT           0x0000000a
03804 #define FILE_DEVICE_KEYBOARD              0x0000000b
03805 #define FILE_DEVICE_MAILSLOT              0x0000000c
03806 #define FILE_DEVICE_MIDI_IN               0x0000000d
03807 #define FILE_DEVICE_MIDI_OUT              0x0000000e
03808 #define FILE_DEVICE_MOUSE                 0x0000000f
03809 #define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
03810 #define FILE_DEVICE_NAMED_PIPE            0x00000011
03811 #define FILE_DEVICE_NETWORK               0x00000012
03812 #define FILE_DEVICE_NETWORK_BROWSER       0x00000013
03813 #define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
03814 #define FILE_DEVICE_NULL                  0x00000015
03815 #define FILE_DEVICE_PARALLEL_PORT         0x00000016
03816 #define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
03817 #define FILE_DEVICE_PRINTER               0x00000018
03818 #define FILE_DEVICE_SCANNER               0x00000019
03819 #define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
03820 #define FILE_DEVICE_SERIAL_PORT           0x0000001b
03821 #define FILE_DEVICE_SCREEN                0x0000001c
03822 #define FILE_DEVICE_SOUND                 0x0000001d
03823 #define FILE_DEVICE_STREAMS               0x0000001e
03824 #define FILE_DEVICE_TAPE                  0x0000001f
03825 #define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
03826 #define FILE_DEVICE_TRANSPORT             0x00000021
03827 #define FILE_DEVICE_UNKNOWN               0x00000022
03828 #define FILE_DEVICE_VIDEO                 0x00000023
03829 #define FILE_DEVICE_VIRTUAL_DISK          0x00000024
03830 #define FILE_DEVICE_WAVE_IN               0x00000025
03831 #define FILE_DEVICE_WAVE_OUT              0x00000026
03832 #define FILE_DEVICE_8042_PORT             0x00000027
03833 #define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
03834 #define FILE_DEVICE_BATTERY               0x00000029
03835 #define FILE_DEVICE_BUS_EXTENDER          0x0000002a
03836 #define FILE_DEVICE_MODEM                 0x0000002b
03837 #define FILE_DEVICE_VDM                   0x0000002c
03838 #define FILE_DEVICE_MASS_STORAGE          0x0000002d
03839 #define FILE_DEVICE_SMB                   0x0000002e
03840 #define FILE_DEVICE_KS                    0x0000002f
03841 #define FILE_DEVICE_CHANGER               0x00000030
03842 #define FILE_DEVICE_SMARTCARD             0x00000031
03843 #define FILE_DEVICE_ACPI                  0x00000032
03844 #define FILE_DEVICE_DVD                   0x00000033
03845 #define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
03846 #define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
03847 #define FILE_DEVICE_DFS_VOLUME            0x00000036
03848 #define FILE_DEVICE_SERENUM               0x00000037
03849 #define FILE_DEVICE_TERMSRV               0x00000038
03850 #define FILE_DEVICE_KSEC                  0x00000039
03851 #define FILE_DEVICE_FIPS                  0x0000003A
03852 #define FILE_DEVICE_INFINIBAND            0x0000003B
03853 #define FILE_DEVICE_VMBUS                 0x0000003E
03854 #define FILE_DEVICE_CRYPT_PROVIDER        0x0000003F
03855 #define FILE_DEVICE_WPD                   0x00000040
03856 #define FILE_DEVICE_BLUETOOTH             0x00000041
03857 #define FILE_DEVICE_MT_COMPOSITE          0x00000042
03858 #define FILE_DEVICE_MT_TRANSPORT          0x00000043
03859 #define FILE_DEVICE_BIOMETRIC             0x00000044
03860 #define FILE_DEVICE_PMI                   0x00000045
03861 
03862 #if defined(NT_PROCESSOR_GROUPS)
03863 
03864 typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
03865 
03866 typedef enum _IRQ_DEVICE_POLICY_USHORT {
03867   IrqPolicyMachineDefault = 0,
03868   IrqPolicyAllCloseProcessors = 1,
03869   IrqPolicyOneCloseProcessor = 2,
03870   IrqPolicyAllProcessorsInMachine = 3,
03871   IrqPolicyAllProcessorsInGroup = 3,
03872   IrqPolicySpecifiedProcessors = 4,
03873   IrqPolicySpreadMessagesAcrossAllProcessors = 5};
03874 
03875 #else /* defined(NT_PROCESSOR_GROUPS) */
03876 
03877 typedef enum _IRQ_DEVICE_POLICY {
03878   IrqPolicyMachineDefault = 0,
03879   IrqPolicyAllCloseProcessors,
03880   IrqPolicyOneCloseProcessor,
03881   IrqPolicyAllProcessorsInMachine,
03882   IrqPolicySpecifiedProcessors,
03883   IrqPolicySpreadMessagesAcrossAllProcessors
03884 } IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
03885 
03886 #endif
03887 
03888 typedef enum _IRQ_PRIORITY {
03889   IrqPriorityUndefined = 0,
03890   IrqPriorityLow,
03891   IrqPriorityNormal,
03892   IrqPriorityHigh
03893 } IRQ_PRIORITY, *PIRQ_PRIORITY;
03894 
03895 typedef enum _IRQ_GROUP_POLICY {
03896   GroupAffinityAllGroupZero = 0,
03897   GroupAffinityDontCare
03898 } IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY;
03899 
03900 #define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
03901 
03902 typedef struct _OBJECT_HANDLE_INFORMATION {
03903   ULONG HandleAttributes;
03904   ACCESS_MASK GrantedAccess;
03905 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
03906 
03907 typedef struct _CLIENT_ID {
03908   HANDLE UniqueProcess;
03909   HANDLE UniqueThread;
03910 } CLIENT_ID, *PCLIENT_ID;
03911 
03912 typedef struct _VPB {
03913   CSHORT Type;
03914   CSHORT Size;
03915   USHORT Flags;
03916   USHORT VolumeLabelLength;
03917   struct _DEVICE_OBJECT *DeviceObject;
03918   struct _DEVICE_OBJECT *RealDevice;
03919   ULONG SerialNumber;
03920   ULONG ReferenceCount;
03921   WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
03922 } VPB, *PVPB;
03923 
03924 typedef enum _IO_ALLOCATION_ACTION {
03925   KeepObject = 1,
03926   DeallocateObject,
03927   DeallocateObjectKeepRegisters
03928 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
03929 
03930 _Function_class_(DRIVER_CONTROL)
03931 _IRQL_requires_same_
03932 typedef IO_ALLOCATION_ACTION
03933 (NTAPI DRIVER_CONTROL)(
03934   _In_ struct _DEVICE_OBJECT *DeviceObject,
03935   _Inout_ struct _IRP *Irp,
03936   _In_ PVOID MapRegisterBase,
03937   _In_ PVOID Context);
03938 typedef DRIVER_CONTROL *PDRIVER_CONTROL;
03939 
03940 typedef struct _WAIT_CONTEXT_BLOCK {
03941   KDEVICE_QUEUE_ENTRY WaitQueueEntry;
03942   PDRIVER_CONTROL DeviceRoutine;
03943   PVOID DeviceContext;
03944   ULONG NumberOfMapRegisters;
03945   PVOID DeviceObject;
03946   PVOID CurrentIrp;
03947   PKDPC BufferChainingDpc;
03948 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
03949 
03950 /* DEVICE_OBJECT.Flags */
03951 #define DO_VERIFY_VOLUME                  0x00000002
03952 #define DO_BUFFERED_IO                    0x00000004
03953 #define DO_EXCLUSIVE                      0x00000008
03954 #define DO_DIRECT_IO                      0x00000010
03955 #define DO_MAP_IO_BUFFER                  0x00000020
03956 #define DO_DEVICE_INITIALIZING            0x00000080
03957 #define DO_SHUTDOWN_REGISTERED            0x00000800
03958 #define DO_BUS_ENUMERATED_DEVICE          0x00001000
03959 #define DO_POWER_PAGABLE                  0x00002000
03960 #define DO_POWER_INRUSH                   0x00004000
03961 
03962 /* DEVICE_OBJECT.Characteristics */
03963 #define FILE_REMOVABLE_MEDIA              0x00000001
03964 #define FILE_READ_ONLY_DEVICE             0x00000002
03965 #define FILE_FLOPPY_DISKETTE              0x00000004
03966 #define FILE_WRITE_ONCE_MEDIA             0x00000008
03967 #define FILE_REMOTE_DEVICE                0x00000010
03968 #define FILE_DEVICE_IS_MOUNTED            0x00000020
03969 #define FILE_VIRTUAL_VOLUME               0x00000040
03970 #define FILE_AUTOGENERATED_DEVICE_NAME    0x00000080
03971 #define FILE_DEVICE_SECURE_OPEN           0x00000100
03972 #define FILE_CHARACTERISTIC_PNP_DEVICE    0x00000800
03973 #define FILE_CHARACTERISTIC_TS_DEVICE     0x00001000
03974 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
03975 
03976 /* DEVICE_OBJECT.AlignmentRequirement */
03977 #define FILE_BYTE_ALIGNMENT             0x00000000
03978 #define FILE_WORD_ALIGNMENT             0x00000001
03979 #define FILE_LONG_ALIGNMENT             0x00000003
03980 #define FILE_QUAD_ALIGNMENT             0x00000007
03981 #define FILE_OCTA_ALIGNMENT             0x0000000f
03982 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
03983 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
03984 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
03985 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
03986 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
03987 
03988 /* DEVICE_OBJECT.DeviceType */
03989 #define DEVICE_TYPE ULONG
03990 
03991 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
03992   CSHORT Type;
03993   USHORT Size;
03994   LONG ReferenceCount;
03995   struct _DRIVER_OBJECT *DriverObject;
03996   struct _DEVICE_OBJECT *NextDevice;
03997   struct _DEVICE_OBJECT *AttachedDevice;
03998   struct _IRP *CurrentIrp;
03999   PIO_TIMER Timer;
04000   ULONG Flags;
04001   ULONG Characteristics;
04002   volatile PVPB Vpb;
04003   PVOID DeviceExtension;
04004   DEVICE_TYPE DeviceType;
04005   CCHAR StackSize;
04006   union {
04007     LIST_ENTRY ListEntry;
04008     WAIT_CONTEXT_BLOCK Wcb;
04009   } Queue;
04010   ULONG AlignmentRequirement;
04011   KDEVICE_QUEUE DeviceQueue;
04012   KDPC Dpc;
04013   ULONG ActiveThreadCount;
04014   PSECURITY_DESCRIPTOR SecurityDescriptor;
04015   KEVENT DeviceLock;
04016   USHORT SectorSize;
04017   USHORT Spare1;
04018   struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
04019   PVOID Reserved;
04020 } DEVICE_OBJECT, *PDEVICE_OBJECT;
04021 
04022 typedef enum _IO_SESSION_STATE {
04023   IoSessionStateCreated = 1,
04024   IoSessionStateInitialized,
04025   IoSessionStateConnected,
04026   IoSessionStateDisconnected,
04027   IoSessionStateDisconnectedLoggedOn,
04028   IoSessionStateLoggedOn,
04029   IoSessionStateLoggedOff,
04030   IoSessionStateTerminated,
04031   IoSessionStateMax
04032 } IO_SESSION_STATE, *PIO_SESSION_STATE;
04033 
04034 typedef enum _IO_COMPLETION_ROUTINE_RESULT {
04035   ContinueCompletion = STATUS_CONTINUE_COMPLETION,
04036   StopCompletion = STATUS_MORE_PROCESSING_REQUIRED
04037 } IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT;
04038 
04039 typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY {
04040   PHYSICAL_ADDRESS MessageAddress;
04041   KAFFINITY TargetProcessorSet;
04042   PKINTERRUPT InterruptObject;
04043   ULONG MessageData;
04044   ULONG Vector;
04045   KIRQL Irql;
04046   KINTERRUPT_MODE Mode;
04047   KINTERRUPT_POLARITY Polarity;
04048 } IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY;
04049 
04050 typedef struct _IO_INTERRUPT_MESSAGE_INFO {
04051   KIRQL UnifiedIrql;
04052   ULONG MessageCount;
04053   IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1];
04054 } IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO;
04055 
04056 typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS {
04057   _In_ PDEVICE_OBJECT PhysicalDeviceObject;
04058   _Out_ PKINTERRUPT *InterruptObject;
04059   _In_ PKSERVICE_ROUTINE ServiceRoutine;
04060   _In_ PVOID ServiceContext;
04061   _In_opt_ PKSPIN_LOCK SpinLock;
04062   _In_ KIRQL SynchronizeIrql;
04063   _In_ BOOLEAN FloatingSave;
04064   _In_ BOOLEAN ShareVector;
04065   _In_ ULONG Vector;
04066   _In_ KIRQL Irql;
04067   _In_ KINTERRUPT_MODE InterruptMode;
04068   _In_ KAFFINITY ProcessorEnableMask;
04069   _In_ USHORT Group;
04070 } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS;
04071 
04072 typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS {
04073   _In_ PDEVICE_OBJECT PhysicalDeviceObject;
04074   _Out_ PKINTERRUPT *InterruptObject;
04075   _In_ PKSERVICE_ROUTINE ServiceRoutine;
04076   _In_ PVOID ServiceContext;
04077   _In_opt_ PKSPIN_LOCK SpinLock;
04078   _In_opt_ KIRQL SynchronizeIrql;
04079   _In_ BOOLEAN FloatingSave;
04080 } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS;
04081 
04082 typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
04083   _In_ PDEVICE_OBJECT PhysicalDeviceObject;
04084   union {
04085     _Out_ PVOID *Generic;
04086     _Out_ PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable;
04087     _Out_ PKINTERRUPT *InterruptObject;
04088   } ConnectionContext;
04089   _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine;
04090   _In_ PVOID ServiceContext;
04091   _In_opt_ PKSPIN_LOCK SpinLock;
04092   _In_opt_ KIRQL SynchronizeIrql;
04093   _In_ BOOLEAN FloatingSave;
04094   _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine;
04095 } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS;
04096 
04097 typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
04098   _Inout_ ULONG Version;
04099   _ANONYMOUS_UNION union {
04100     IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
04101     IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
04102     IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
04103   } DUMMYUNIONNAME;
04104 } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
04105 
04106 typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
04107   _In_ ULONG Version;
04108   union {
04109     _In_ PVOID Generic;
04110     _In_ PKINTERRUPT InterruptObject;
04111     _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable;
04112   } ConnectionContext;
04113 } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS;
04114 
04115 typedef enum _IO_ACCESS_TYPE {
04116   ReadAccess,
04117   WriteAccess,
04118   ModifyAccess
04119 } IO_ACCESS_TYPE;
04120 
04121 typedef enum _IO_ACCESS_MODE {
04122   SequentialAccess,
04123   RandomAccess
04124 } IO_ACCESS_MODE;
04125 
04126 typedef enum _IO_CONTAINER_NOTIFICATION_CLASS {
04127   IoSessionStateNotification,
04128   IoMaxContainerNotificationClass
04129 } IO_CONTAINER_NOTIFICATION_CLASS;
04130 
04131 typedef struct _IO_SESSION_STATE_NOTIFICATION {
04132   ULONG Size;
04133   ULONG Flags;
04134   PVOID IoObject;
04135   ULONG EventMask;
04136   PVOID Context;
04137 } IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION;
04138 
04139 typedef enum _IO_CONTAINER_INFORMATION_CLASS {
04140   IoSessionStateInformation,
04141   IoMaxContainerInformationClass
04142 } IO_CONTAINER_INFORMATION_CLASS;
04143 
04144 typedef struct _IO_SESSION_STATE_INFORMATION {
04145   ULONG SessionId;
04146   IO_SESSION_STATE SessionState;
04147   BOOLEAN LocalSession;
04148 } IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION;
04149 
04150 #if (NTDDI_VERSION >= NTDDI_WIN7)
04151 
04152 typedef NTSTATUS
04153 (NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)(
04154   VOID);
04155 
04156 typedef NTSTATUS
04157 (NTAPI IO_SESSION_NOTIFICATION_FUNCTION)(
04158   _In_ PVOID SessionObject,
04159   _In_ PVOID IoObject,
04160   _In_ ULONG Event,
04161   _In_ PVOID Context,
04162   _In_reads_bytes_opt_(PayloadLength) PVOID NotificationPayload,
04163   _In_ ULONG PayloadLength);
04164 
04165 typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION;
04166 
04167 #endif
04168 
04169 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
04170 
04171 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
04172   BOOLEAN Removed;
04173   BOOLEAN Reserved[3];
04174   volatile LONG IoCount;
04175   KEVENT RemoveEvent;
04176 } IO_REMOVE_LOCK_COMMON_BLOCK;
04177 
04178 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
04179   LONG Signature;
04180   LONG HighWatermark;
04181   LONGLONG MaxLockedTicks;
04182   LONG AllocateTag;
04183   LIST_ENTRY LockList;
04184   KSPIN_LOCK Spin;
04185   volatile LONG LowMemoryCount;
04186   ULONG Reserved1[4];
04187   PVOID Reserved2;
04188   PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
04189 } IO_REMOVE_LOCK_DBG_BLOCK;
04190 
04191 typedef struct _IO_REMOVE_LOCK {
04192   IO_REMOVE_LOCK_COMMON_BLOCK Common;
04193 #if DBG
04194   IO_REMOVE_LOCK_DBG_BLOCK Dbg;
04195 #endif
04196 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
04197 
04198 typedef struct _IO_WORKITEM *PIO_WORKITEM;
04199 
04200 _Function_class_(IO_WORKITEM_ROUTINE)
04201 _IRQL_requires_(PASSIVE_LEVEL)
04202 _IRQL_requires_same_
04203 typedef VOID
04204 (NTAPI IO_WORKITEM_ROUTINE)(
04205   _In_ PDEVICE_OBJECT DeviceObject,
04206   _In_opt_ PVOID Context);
04207 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
04208 
04209 typedef VOID
04210 (NTAPI IO_WORKITEM_ROUTINE_EX)(
04211   _In_ PVOID IoObject,
04212   _In_opt_ PVOID Context,
04213   _In_ PIO_WORKITEM IoWorkItem);
04214 typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
04215 
04216 typedef struct _SHARE_ACCESS {
04217   ULONG OpenCount;
04218   ULONG Readers;
04219   ULONG Writers;
04220   ULONG Deleters;
04221   ULONG SharedRead;
04222   ULONG SharedWrite;
04223   ULONG SharedDelete;
04224 } SHARE_ACCESS, *PSHARE_ACCESS;
04225 
04226 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
04227    inheritance, even from a struct renders the type non-POD. So we use
04228    this hack */
04229 #define PCI_COMMON_HEADER_LAYOUT                \
04230   USHORT VendorID;                              \
04231   USHORT DeviceID;                              \
04232   USHORT Command;                               \
04233   USHORT Status;                                \
04234   UCHAR RevisionID;                             \
04235   UCHAR ProgIf;                                 \
04236   UCHAR SubClass;                               \
04237   UCHAR BaseClass;                              \
04238   UCHAR CacheLineSize;                          \
04239   UCHAR LatencyTimer;                           \
04240   UCHAR HeaderType;                             \
04241   UCHAR BIST;                                   \
04242   union {                                       \
04243     struct _PCI_HEADER_TYPE_0 {                 \
04244       ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
04245       ULONG CIS;                                \
04246       USHORT SubVendorID;                       \
04247       USHORT SubSystemID;                       \
04248       ULONG ROMBaseAddress;                     \
04249       UCHAR CapabilitiesPtr;                    \
04250       UCHAR Reserved1[3];                       \
04251       ULONG Reserved2;                          \
04252       UCHAR InterruptLine;                      \
04253       UCHAR InterruptPin;                       \
04254       UCHAR MinimumGrant;                       \
04255       UCHAR MaximumLatency;                     \
04256     } type0;                                    \
04257     struct _PCI_HEADER_TYPE_1 {                 \
04258       ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
04259       UCHAR PrimaryBus;                         \
04260       UCHAR SecondaryBus;                       \
04261       UCHAR SubordinateBus;                     \
04262       UCHAR SecondaryLatency;                   \
04263       UCHAR IOBase;                             \
04264       UCHAR IOLimit;                            \
04265       USHORT SecondaryStatus;                   \
04266       USHORT MemoryBase;                        \
04267       USHORT MemoryLimit;                       \
04268       USHORT PrefetchBase;                      \
04269       USHORT PrefetchLimit;                     \
04270       ULONG PrefetchBaseUpper32;                \
04271       ULONG PrefetchLimitUpper32;               \
04272       USHORT IOBaseUpper16;                     \
04273       USHORT IOLimitUpper16;                    \
04274       UCHAR CapabilitiesPtr;                    \
04275       UCHAR Reserved1[3];                       \
04276       ULONG ROMBaseAddress;                     \
04277       UCHAR InterruptLine;                      \
04278       UCHAR InterruptPin;                       \
04279       USHORT BridgeControl;                     \
04280     } type1;                                    \
04281     struct _PCI_HEADER_TYPE_2 {                 \
04282       ULONG SocketRegistersBaseAddress;         \
04283       UCHAR CapabilitiesPtr;                    \
04284       UCHAR Reserved;                           \
04285       USHORT SecondaryStatus;                   \
04286       UCHAR PrimaryBus;                         \
04287       UCHAR SecondaryBus;                       \
04288       UCHAR SubordinateBus;                     \
04289       UCHAR SecondaryLatency;                   \
04290       struct {                                  \
04291         ULONG Base;                             \
04292         ULONG Limit;                            \
04293       } Range[PCI_TYPE2_ADDRESSES-1];           \
04294       UCHAR InterruptLine;                      \
04295       UCHAR InterruptPin;                       \
04296       USHORT BridgeControl;                     \
04297     } type2;                                    \
04298   } u;
04299 
04300 typedef enum _CREATE_FILE_TYPE {
04301   CreateFileTypeNone,
04302   CreateFileTypeNamedPipe,
04303   CreateFileTypeMailslot
04304 } CREATE_FILE_TYPE;
04305 
04306 #define IO_FORCE_ACCESS_CHECK               0x001
04307 #define IO_NO_PARAMETER_CHECKING            0x100
04308 
04309 #define IO_REPARSE                      0x0
04310 #define IO_REMOUNT                      0x1
04311 
04312 typedef struct _IO_STATUS_BLOCK {
04313   _ANONYMOUS_UNION union {
04314     NTSTATUS Status;
04315     PVOID Pointer;
04316   } DUMMYUNIONNAME;
04317   ULONG_PTR Information;
04318 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
04319 
04320 #if defined(_WIN64)
04321 typedef struct _IO_STATUS_BLOCK32 {
04322   NTSTATUS Status;
04323   ULONG Information;
04324 } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
04325 #endif
04326 
04327 typedef VOID
04328 (NTAPI *PIO_APC_ROUTINE)(
04329   _In_ PVOID ApcContext,
04330   _In_ PIO_STATUS_BLOCK IoStatusBlock,
04331   _In_ ULONG Reserved);
04332 
04333 #define PIO_APC_ROUTINE_DEFINED
04334 
04335 typedef enum _IO_SESSION_EVENT {
04336   IoSessionEventIgnore = 0,
04337   IoSessionEventCreated,
04338   IoSessionEventTerminated,
04339   IoSessionEventConnected,
04340   IoSessionEventDisconnected,
04341   IoSessionEventLogon,
04342   IoSessionEventLogoff,
04343   IoSessionEventMax
04344 } IO_SESSION_EVENT, *PIO_SESSION_EVENT;
04345 
04346 #define IO_SESSION_STATE_ALL_EVENTS        0xffffffff
04347 #define IO_SESSION_STATE_CREATION_EVENT    0x00000001
04348 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
04349 #define IO_SESSION_STATE_CONNECT_EVENT     0x00000004
04350 #define IO_SESSION_STATE_DISCONNECT_EVENT  0x00000008
04351 #define IO_SESSION_STATE_LOGON_EVENT       0x00000010
04352 #define IO_SESSION_STATE_LOGOFF_EVENT      0x00000020
04353 
04354 #define IO_SESSION_STATE_VALID_EVENT_MASK  0x0000003f
04355 
04356 #define IO_SESSION_MAX_PAYLOAD_SIZE        256L
04357 
04358 typedef struct _IO_SESSION_CONNECT_INFO {
04359   ULONG SessionId;
04360   BOOLEAN LocalSession;
04361 } IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO;
04362 
04363 #define EVENT_INCREMENT                   1
04364 #define IO_NO_INCREMENT                   0
04365 #define IO_CD_ROM_INCREMENT               1
04366 #define IO_DISK_INCREMENT                 1
04367 #define IO_KEYBOARD_INCREMENT             6
04368 #define IO_MAILSLOT_INCREMENT             2
04369 #define IO_MOUSE_INCREMENT                6
04370 #define IO_NAMED_PIPE_INCREMENT           2
04371 #define IO_NETWORK_INCREMENT              2
04372 #define IO_PARALLEL_INCREMENT             1
04373 #define IO_SERIAL_INCREMENT               2
04374 #define IO_SOUND_INCREMENT                8
04375 #define IO_VIDEO_INCREMENT                1
04376 #define SEMAPHORE_INCREMENT               1
04377 
04378 #define MM_MAXIMUM_DISK_IO_SIZE          (0x10000)
04379 
04380 typedef struct _BOOTDISK_INFORMATION {
04381   LONGLONG BootPartitionOffset;
04382   LONGLONG SystemPartitionOffset;
04383   ULONG BootDeviceSignature;
04384   ULONG SystemDeviceSignature;
04385 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
04386 
04387 typedef struct _BOOTDISK_INFORMATION_EX {
04388   LONGLONG BootPartitionOffset;
04389   LONGLONG SystemPartitionOffset;
04390   ULONG BootDeviceSignature;
04391   ULONG SystemDeviceSignature;
04392   GUID BootDeviceGuid;
04393   GUID SystemDeviceGuid;
04394   BOOLEAN BootDeviceIsGpt;
04395   BOOLEAN SystemDeviceIsGpt;
04396 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
04397 
04398 #if (NTDDI_VERSION >= NTDDI_WIN7)
04399 
04400 typedef struct _LOADER_PARTITION_INFORMATION_EX {
04401   ULONG PartitionStyle;
04402   ULONG PartitionNumber;
04403   _ANONYMOUS_UNION union {
04404     ULONG Signature;
04405     GUID DeviceId;
04406   } DUMMYUNIONNAME;
04407   ULONG Flags;
04408 } LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
04409 
04410 typedef struct _BOOTDISK_INFORMATION_LITE {
04411   ULONG NumberEntries;
04412   LOADER_PARTITION_INFORMATION_EX Entries[1];
04413 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
04414 
04415 #else
04416 
04417 #if (NTDDI_VERSION >= NTDDI_VISTA)
04418 typedef struct _BOOTDISK_INFORMATION_LITE {
04419   ULONG BootDeviceSignature;
04420   ULONG SystemDeviceSignature;
04421   GUID BootDeviceGuid;
04422   GUID SystemDeviceGuid;
04423   BOOLEAN BootDeviceIsGpt;
04424   BOOLEAN SystemDeviceIsGpt;
04425 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
04426 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
04427 
04428 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
04429 
04430 #include <pshpack1.h>
04431 
04432 typedef struct _EISA_MEMORY_TYPE {
04433   UCHAR ReadWrite:1;
04434   UCHAR Cached:1;
04435   UCHAR Reserved0:1;
04436   UCHAR Type:2;
04437   UCHAR Shared:1;
04438   UCHAR Reserved1:1;
04439   UCHAR MoreEntries:1;
04440 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
04441 
04442 typedef struct _EISA_MEMORY_CONFIGURATION {
04443   EISA_MEMORY_TYPE ConfigurationByte;
04444   UCHAR DataSize;
04445   USHORT AddressLowWord;
04446   UCHAR AddressHighByte;
04447   USHORT MemorySize;
04448 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
04449 
04450 typedef struct _EISA_IRQ_DESCRIPTOR {
04451   UCHAR Interrupt:4;
04452   UCHAR Reserved:1;
04453   UCHAR LevelTriggered:1;
04454   UCHAR Shared:1;
04455   UCHAR MoreEntries:1;
04456 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
04457 
04458 typedef struct _EISA_IRQ_CONFIGURATION {
04459   EISA_IRQ_DESCRIPTOR ConfigurationByte;
04460   UCHAR Reserved;
04461 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
04462 
04463 typedef struct _DMA_CONFIGURATION_BYTE0 {
04464   UCHAR Channel:3;
04465   UCHAR Reserved:3;
04466   UCHAR Shared:1;
04467   UCHAR MoreEntries:1;
04468 } DMA_CONFIGURATION_BYTE0;
04469 
04470 typedef struct _DMA_CONFIGURATION_BYTE1 {
04471   UCHAR Reserved0:2;
04472   UCHAR TransferSize:2;
04473   UCHAR Timing:2;
04474   UCHAR Reserved1:2;
04475 } DMA_CONFIGURATION_BYTE1;
04476 
04477 typedef struct _EISA_DMA_CONFIGURATION {
04478   DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
04479   DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
04480 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
04481 
04482 typedef struct _EISA_PORT_DESCRIPTOR {
04483   UCHAR NumberPorts:5;
04484   UCHAR Reserved:1;
04485   UCHAR Shared:1;
04486   UCHAR MoreEntries:1;
04487 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
04488 
04489 typedef struct _EISA_PORT_CONFIGURATION {
04490   EISA_PORT_DESCRIPTOR Configuration;
04491   USHORT PortAddress;
04492 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
04493 
04494 typedef struct _CM_EISA_SLOT_INFORMATION {
04495   UCHAR ReturnCode;
04496   UCHAR ReturnFlags;
04497   UCHAR MajorRevision;
04498   UCHAR MinorRevision;
04499   USHORT Checksum;
04500   UCHAR NumberFunctions;
04501   UCHAR FunctionInformation;
04502   ULONG CompressedId;
04503 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
04504 
04505 typedef struct _CM_EISA_FUNCTION_INFORMATION {
04506   ULONG CompressedId;
04507   UCHAR IdSlotFlags1;
04508   UCHAR IdSlotFlags2;
04509   UCHAR MinorRevision;
04510   UCHAR MajorRevision;
04511   UCHAR Selections[26];
04512   UCHAR FunctionFlags;
04513   UCHAR TypeString[80];
04514   EISA_MEMORY_CONFIGURATION EisaMemory[9];
04515   EISA_IRQ_CONFIGURATION EisaIrq[7];
04516   EISA_DMA_CONFIGURATION EisaDma[4];
04517   EISA_PORT_CONFIGURATION EisaPort[20];
04518   UCHAR InitializationData[60];
04519 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
04520 
04521 #include <poppack.h>
04522 
04523 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
04524 
04525 #define EISA_FUNCTION_ENABLED           0x80
04526 #define EISA_FREE_FORM_DATA             0x40
04527 #define EISA_HAS_PORT_INIT_ENTRY        0x20
04528 #define EISA_HAS_PORT_RANGE             0x10
04529 #define EISA_HAS_DMA_ENTRY              0x08
04530 #define EISA_HAS_IRQ_ENTRY              0x04
04531 #define EISA_HAS_MEMORY_ENTRY           0x02
04532 #define EISA_HAS_TYPE_ENTRY             0x01
04533 #define EISA_HAS_INFORMATION \
04534   (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
04535   + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
04536 
04537 #define EISA_MORE_ENTRIES               0x80
04538 #define EISA_SYSTEM_MEMORY              0x00
04539 #define EISA_MEMORY_TYPE_RAM            0x01
04540 
04541 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
04542 
04543 #define EISA_INVALID_SLOT               0x80
04544 #define EISA_INVALID_FUNCTION           0x81
04545 #define EISA_INVALID_CONFIGURATION      0x82
04546 #define EISA_EMPTY_SLOT                 0x83
04547 #define EISA_INVALID_BIOS_CALL          0x86
04548 
04549 /*
04550 ** Plug and Play structures
04551 */
04552 
04553 typedef VOID
04554 (NTAPI *PINTERFACE_REFERENCE)(
04555   PVOID Context);
04556 
04557 typedef VOID
04558 (NTAPI *PINTERFACE_DEREFERENCE)(
04559   PVOID Context);
04560 
04561 _Function_class_(TRANSLATE_BUS_ADDRESS)
04562 _IRQL_requires_same_
04563 typedef BOOLEAN
04564 (NTAPI TRANSLATE_BUS_ADDRESS)(
04565   _Inout_opt_ PVOID Context,
04566   _In_ PHYSICAL_ADDRESS BusAddress,
04567   _In_ ULONG Length,
04568   _Out_ PULONG AddressSpace,
04569   _Out_ PPHYSICAL_ADDRESS TranslatedAddress);
04570 typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
04571 
04572 _Function_class_(GET_DMA_ADAPTER)
04573 _IRQL_requires_same_
04574 typedef struct _DMA_ADAPTER*
04575 (NTAPI GET_DMA_ADAPTER)(
04576   _Inout_opt_ PVOID Context,
04577   _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor,
04578   _Out_ PULONG NumberOfMapRegisters);
04579 typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
04580 
04581 _Function_class_(GET_SET_DEVICE_DATA)
04582 _IRQL_requires_same_
04583 typedef ULONG
04584 (NTAPI GET_SET_DEVICE_DATA)(
04585   _Inout_opt_ PVOID Context,
04586   _In_ ULONG DataType,
04587   _Inout_updates_bytes_(Length) PVOID Buffer,
04588   _In_ ULONG Offset,
04589   _In_ ULONG Length);
04590 typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
04591 
04592 typedef enum _DEVICE_INSTALL_STATE {
04593   InstallStateInstalled,
04594   InstallStateNeedsReinstall,
04595   InstallStateFailedInstall,
04596   InstallStateFinishInstall
04597 } DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE;
04598 
04599 typedef struct _LEGACY_BUS_INFORMATION {
04600   GUID BusTypeGuid;
04601   INTERFACE_TYPE LegacyBusType;
04602   ULONG BusNumber;
04603 } LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
04604 
04605 typedef enum _DEVICE_REMOVAL_POLICY {
04606   RemovalPolicyExpectNoRemoval = 1,
04607   RemovalPolicyExpectOrderlyRemoval = 2,
04608   RemovalPolicyExpectSurpriseRemoval = 3
04609 } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY;
04610 
04611 typedef VOID
04612 (NTAPI *PREENUMERATE_SELF)(
04613   _In_ PVOID Context);
04614 
04615 typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD {
04616   USHORT Size;
04617   USHORT Version;
04618   PVOID Context;
04619   PINTERFACE_REFERENCE InterfaceReference;
04620   PINTERFACE_DEREFERENCE InterfaceDereference;
04621   PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf;
04622 } REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD;
04623 
04624 typedef VOID
04625 (NTAPI *PIO_DEVICE_EJECT_CALLBACK)(
04626   _In_ NTSTATUS Status,
04627   _Inout_opt_ PVOID Context);
04628 
04629 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION     1
04630 
04631 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
04632 #define PCI_USE_SUBSYSTEM_IDS   0x00000001
04633 #define PCI_USE_REVISION        0x00000002
04634 #define PCI_USE_VENDEV_IDS      0x00000004
04635 #define PCI_USE_CLASS_SUBCLASS  0x00000008
04636 #define PCI_USE_PROGIF          0x00000010
04637 #define PCI_USE_LOCAL_BUS       0x00000020
04638 #define PCI_USE_LOCAL_DEVICE    0x00000040
04639 
04640 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
04641   ULONG Size;
04642   ULONG Flags;
04643   USHORT VendorID;
04644   USHORT DeviceID;
04645   UCHAR RevisionID;
04646   USHORT SubVendorID;
04647   USHORT SubSystemID;
04648   UCHAR BaseClass;
04649   UCHAR SubClass;
04650   UCHAR ProgIf;
04651 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
04652 
04653 _IRQL_requires_max_(PASSIVE_LEVEL)
04654 _Must_inspect_result_
04655 typedef BOOLEAN
04656 (NTAPI PCI_IS_DEVICE_PRESENT)(
04657   _In_ USHORT VendorID,
04658   _In_ USHORT DeviceID,
04659   _In_ UCHAR RevisionID,
04660   _In_ USHORT SubVendorID,
04661   _In_ USHORT SubSystemID,
04662   _In_ ULONG Flags);
04663 typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
04664 
04665 _IRQL_requires_max_(PASSIVE_LEVEL)
04666 _Must_inspect_result_
04667 typedef BOOLEAN
04668 (NTAPI PCI_IS_DEVICE_PRESENT_EX)(
04669   _In_ PVOID Context,
04670   _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
04671 typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
04672 
04673 typedef struct _BUS_INTERFACE_STANDARD {
04674   USHORT Size;
04675   USHORT Version;
04676   PVOID Context;
04677   PINTERFACE_REFERENCE InterfaceReference;
04678   PINTERFACE_DEREFERENCE InterfaceDereference;
04679   PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
04680   PGET_DMA_ADAPTER GetDmaAdapter;
04681   PGET_SET_DEVICE_DATA SetBusData;
04682   PGET_SET_DEVICE_DATA GetBusData;
04683 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
04684 
04685 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
04686   USHORT Size;
04687   USHORT Version;
04688   PVOID Context;
04689   PINTERFACE_REFERENCE InterfaceReference;
04690   PINTERFACE_DEREFERENCE InterfaceDereference;
04691   PPCI_IS_DEVICE_PRESENT IsDevicePresent;
04692   PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
04693 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
04694 
04695 _Struct_size_bytes_(Size)
04696 typedef struct _DEVICE_CAPABILITIES {
04697   _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES)) USHORT Size;
04698   USHORT Version;
04699   ULONG DeviceD1:1;
04700   ULONG DeviceD2:1;
04701   ULONG LockSupported:1;
04702   ULONG EjectSupported:1;
04703   ULONG Removable:1;
04704   ULONG DockDevice:1;
04705   ULONG UniqueID:1;
04706   ULONG SilentInstall:1;
04707   ULONG RawDeviceOK:1;
04708   ULONG SurpriseRemovalOK:1;
04709   ULONG WakeFromD0:1;
04710   ULONG WakeFromD1:1;
04711   ULONG WakeFromD2:1;
04712   ULONG WakeFromD3:1;
04713   ULONG HardwareDisabled:1;
04714   ULONG NonDynamic:1;
04715   ULONG WarmEjectSupported:1;
04716   ULONG NoDisplayInUI:1;
04717   ULONG Reserved:14;
04718   ULONG Address;
04719   ULONG UINumber;
04720   DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
04721   SYSTEM_POWER_STATE SystemWake;
04722   DEVICE_POWER_STATE DeviceWake;
04723   ULONG D1Latency;
04724   ULONG D2Latency;
04725   ULONG D3Latency;
04726 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
04727 
04728 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
04729   USHORT Version;
04730   USHORT Size;
04731   GUID Event;
04732   GUID InterfaceClassGuid;
04733   PUNICODE_STRING SymbolicLinkName;
04734 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
04735 
04736 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
04737   USHORT Version;
04738   USHORT Size;
04739   GUID Event;
04740 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
04741 
04742 #undef INTERFACE
04743 
04744 typedef struct _INTERFACE {
04745   USHORT Size;
04746   USHORT Version;
04747   PVOID Context;
04748   PINTERFACE_REFERENCE InterfaceReference;
04749   PINTERFACE_DEREFERENCE InterfaceDereference;
04750 } INTERFACE, *PINTERFACE;
04751 
04752 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
04753   USHORT Version;
04754   USHORT Size;
04755   GUID Event;
04756 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
04757 
04758 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
04759 
04760 /* PNP_DEVICE_STATE */
04761 
04762 #define PNP_DEVICE_DISABLED                      0x00000001
04763 #define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
04764 #define PNP_DEVICE_FAILED                        0x00000004
04765 #define PNP_DEVICE_REMOVED                       0x00000008
04766 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
04767 #define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
04768 
04769 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
04770   USHORT Version;
04771   USHORT Size;
04772   GUID Event;
04773   struct _FILE_OBJECT *FileObject;
04774   LONG NameBufferOffset;
04775   UCHAR CustomDataBuffer[1];
04776 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
04777 
04778 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
04779   USHORT Version;
04780   USHORT Size;
04781   GUID Event;
04782   struct _FILE_OBJECT *FileObject;
04783 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
04784 
04785 #if (NTDDI_VERSION >= NTDDI_VISTA)
04786 #include <devpropdef.h>
04787 #define PLUGPLAY_PROPERTY_PERSISTENT   0x00000001
04788 #endif
04789 
04790 #define PNP_REPLACE_NO_MAP             MAXLONGLONG
04791 
04792 _Must_inspect_result_
04793 typedef NTSTATUS
04794 (NTAPI *PREPLACE_MAP_MEMORY)(
04795   _In_ PHYSICAL_ADDRESS TargetPhysicalAddress,
04796   _In_ PHYSICAL_ADDRESS SparePhysicalAddress,
04797   _Inout_ PLARGE_INTEGER NumberOfBytes,
04798   _Outptr_ PVOID *TargetAddress,
04799   _Outptr_ PVOID *SpareAddress);
04800 
04801 typedef struct _PNP_REPLACE_MEMORY_LIST {
04802   ULONG AllocatedCount;
04803   ULONG Count;
04804   ULONGLONG TotalLength;
04805   struct {
04806     PHYSICAL_ADDRESS Address;
04807     ULONGLONG Length;
04808   } Ranges[ANYSIZE_ARRAY];
04809 } PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST;
04810 
04811 typedef struct _PNP_REPLACE_PROCESSOR_LIST {
04812   PKAFFINITY Affinity;
04813   _Field_range_(<=, MAXIMUM_GROUPS) ULONG GroupCount;
04814   ULONG AllocatedCount;
04815   ULONG Count;
04816   ULONG ApicIds[ANYSIZE_ARRAY];
04817 } PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST;
04818 
04819 typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 {
04820   KAFFINITY AffinityMask;
04821   ULONG AllocatedCount;
04822   ULONG Count;
04823   ULONG ApicIds[ANYSIZE_ARRAY];
04824 } PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1;
04825 
04826 #define PNP_REPLACE_PARAMETERS_VERSION           2
04827 
04828 typedef struct _PNP_REPLACE_PARAMETERS {
04829   ULONG Size;
04830   ULONG Version;
04831   ULONG64 Target;
04832   ULONG64 Spare;
04833   PPNP_REPLACE_PROCESSOR_LIST TargetProcessors;
04834   PPNP_REPLACE_PROCESSOR_LIST SpareProcessors;
04835   PPNP_REPLACE_MEMORY_LIST TargetMemory;
04836   PPNP_REPLACE_MEMORY_LIST SpareMemory;
04837   PREPLACE_MAP_MEMORY MapMemory;
04838 } PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS;
04839 
04840 typedef VOID
04841 (NTAPI *PREPLACE_UNLOAD)(
04842   VOID);
04843 
04844 _Must_inspect_result_
04845 typedef NTSTATUS
04846 (NTAPI *PREPLACE_BEGIN)(
04847   _In_ PPNP_REPLACE_PARAMETERS Parameters,
04848   _Outptr_ PVOID *Context);
04849 
04850 _Must_inspect_result_
04851 typedef NTSTATUS
04852 (NTAPI *PREPLACE_END)(
04853   _In_ PVOID Context);
04854 
04855 _Must_inspect_result_
04856 typedef NTSTATUS
04857 (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)(
04858   _In_ PVOID Context,
04859   _In_ PHYSICAL_ADDRESS PhysicalAddress,
04860   _In_ LARGE_INTEGER ByteCount);
04861 
04862 _Must_inspect_result_
04863 typedef NTSTATUS
04864 (NTAPI *PREPLACE_SET_PROCESSOR_ID)(
04865   _In_ PVOID Context,
04866   _In_ ULONG ApicId,
04867   _In_ BOOLEAN Target);
04868 
04869 _Must_inspect_result_
04870 typedef NTSTATUS
04871 (NTAPI *PREPLACE_SWAP)(
04872   _In_ PVOID Context);
04873 
04874 _Must_inspect_result_
04875 typedef NTSTATUS
04876 (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)(
04877   _In_ PVOID Context);
04878 
04879 _Must_inspect_result_
04880 typedef NTSTATUS
04881 (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)(
04882   _In_ PVOID Context);
04883 
04884 _Must_inspect_result_
04885 typedef NTSTATUS
04886 (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)(
04887   _In_ PVOID Context,
04888   _In_ PHYSICAL_ADDRESS SourceAddress,
04889   _Out_ PPHYSICAL_ADDRESS DestinationAddress);
04890 
04891 _Must_inspect_result_
04892 typedef NTSTATUS
04893 (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)(
04894   _In_ PVOID Context,
04895   _In_ BOOLEAN Enable);
04896 
04897 #define PNP_REPLACE_DRIVER_INTERFACE_VERSION      1
04898 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
04899              FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
04900 
04901 #define PNP_REPLACE_MEMORY_SUPPORTED             0x0001
04902 #define PNP_REPLACE_PROCESSOR_SUPPORTED          0x0002
04903 #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING    0x0004
04904 #define PNP_REPLACE_HARDWARE_PAGE_COPY           0x0008
04905 #define PNP_REPLACE_HARDWARE_QUIESCE             0x0010
04906 
04907 typedef struct _PNP_REPLACE_DRIVER_INTERFACE {
04908   ULONG Size;
04909   ULONG Version;
04910   ULONG Flags;
04911   PREPLACE_UNLOAD Unload;
04912   PREPLACE_BEGIN BeginReplace;
04913   PREPLACE_END EndReplace;
04914   PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory;
04915   PREPLACE_SET_PROCESSOR_ID SetProcessorId;
04916   PREPLACE_SWAP Swap;
04917   PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror;
04918   PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory;
04919   PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination;
04920   PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce;
04921 } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE;
04922 
04923 _Must_inspect_result_
04924 typedef NTSTATUS
04925 (NTAPI *PREPLACE_DRIVER_INIT)(
04926   _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface,
04927   _In_ PVOID Unused);
04928 
04929 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
04930   DeviceUsageTypeUndefined,
04931   DeviceUsageTypePaging,
04932   DeviceUsageTypeHibernation,
04933   DeviceUsageTypeDumpFile
04934 } DEVICE_USAGE_NOTIFICATION_TYPE;
04935 
04936 typedef struct _POWER_SEQUENCE {
04937   ULONG SequenceD1;
04938   ULONG SequenceD2;
04939   ULONG SequenceD3;
04940 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
04941 
04942 #ifdef _PREFAST_
04943 #define __string_type      0x1000
04944 #define __guid_type        0x2000
04945 #define __multiString_type 0x4000
04946 #else
04947 #define __string_type      0
04948 #define __guid_type        0
04949 #define __multiString_type 0
04950 #endif
04951 
04952 typedef enum {
04953   DevicePropertyDeviceDescription = 0x0 | __string_type,
04954   DevicePropertyHardwareID = 0x1 | __multiString_type,
04955   DevicePropertyCompatibleIDs = 0x2 | __multiString_type,
04956   DevicePropertyBootConfiguration = 0x3,
04957   DevicePropertyBootConfigurationTranslated = 0x4,
04958   DevicePropertyClassName = 0x5 | __string_type,
04959   DevicePropertyClassGuid = 0x6 | __string_type,
04960   DevicePropertyDriverKeyName = 0x7 | __string_type,
04961   DevicePropertyManufacturer = 0x8 | __string_type,
04962   DevicePropertyFriendlyName = 0x9 | __string_type,
04963   DevicePropertyLocationInformation = 0xa | __string_type,
04964   DevicePropertyPhysicalDeviceObjectName = 0xb | __string_type,
04965   DevicePropertyBusTypeGuid = 0xc | __guid_type,
04966   DevicePropertyLegacyBusType = 0xd,
04967   DevicePropertyBusNumber = 0xe,
04968   DevicePropertyEnumeratorName = 0xf | __string_type,
04969   DevicePropertyAddress = 0x10,
04970   DevicePropertyUINumber = 0x11,
04971   DevicePropertyInstallState = 0x12,
04972   DevicePropertyRemovalPolicy = 0x13,
04973   DevicePropertyResourceRequirements = 0x14,
04974   DevicePropertyAllocatedResources = 0x15,
04975   DevicePropertyContainerID = 0x16 | __string_type
04976 } DEVICE_REGISTRY_PROPERTY;
04977 
04978 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
04979   EventCategoryReserved,
04980   EventCategoryHardwareProfileChange,
04981   EventCategoryDeviceInterfaceChange,
04982   EventCategoryTargetDeviceChange
04983 } IO_NOTIFICATION_EVENT_CATEGORY;
04984 
04985 typedef enum _IO_PRIORITY_HINT {
04986   IoPriorityVeryLow = 0,
04987   IoPriorityLow,
04988   IoPriorityNormal,
04989   IoPriorityHigh,
04990   IoPriorityCritical,
04991   MaxIoPriorityTypes
04992 } IO_PRIORITY_HINT;
04993 
04994 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
04995 
04996 _Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE)
04997 _IRQL_requires_max_(PASSIVE_LEVEL)
04998 typedef NTSTATUS
04999 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
05000   _In_ PVOID NotificationStructure,
05001   _Inout_opt_ PVOID Context);
05002 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE;
05003 
05004 _Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK)
05005 _IRQL_requires_same_
05006 typedef VOID
05007 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)(
05008   _Inout_opt_ PVOID Context);
05009 typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK;
05010 
05011 typedef enum _FILE_INFORMATION_CLASS {
05012   FileDirectoryInformation = 1,
05013   FileFullDirectoryInformation,
05014   FileBothDirectoryInformation,
05015   FileBasicInformation,
05016   FileStandardInformation,
05017   FileInternalInformation,
05018   FileEaInformation,
05019   FileAccessInformation,
05020   FileNameInformation,
05021   FileRenameInformation,
05022   FileLinkInformation,
05023   FileNamesInformation,
05024   FileDispositionInformation,
05025   FilePositionInformation,
05026   FileFullEaInformation,
05027   FileModeInformation,
05028   FileAlignmentInformation,
05029   FileAllInformation,
05030   FileAllocationInformation,
05031   FileEndOfFileInformation,
05032   FileAlternateNameInformation,
05033   FileStreamInformation,
05034   FilePipeInformation,
05035   FilePipeLocalInformation,
05036   FilePipeRemoteInformation,
05037   FileMailslotQueryInformation,
05038   FileMailslotSetInformation,
05039   FileCompressionInformation,
05040   FileObjectIdInformation,
05041   FileCompletionInformation,
05042   FileMoveClusterInformation,
05043   FileQuotaInformation,
05044   FileReparsePointInformation,
05045   FileNetworkOpenInformation,
05046   FileAttributeTagInformation,
05047   FileTrackingInformation,
05048   FileIdBothDirectoryInformation,
05049   FileIdFullDirectoryInformation,
05050   FileValidDataLengthInformation,
05051   FileShortNameInformation,
05052 #if (NTDDI_VERSION >= NTDDI_VISTA)
05053   FileIoCompletionNotificationInformation,
05054   FileIoStatusBlockRangeInformation,
05055   FileIoPriorityHintInformation,
05056   FileSfioReserveInformation,
05057   FileSfioVolumeInformation,
05058   FileHardLinkInformation,
05059   FileProcessIdsUsingFileInformation,
05060   FileNormalizedNameInformation,
05061   FileNetworkPhysicalNameInformation,
05062 #endif
05063 #if (NTDDI_VERSION >= NTDDI_WIN7)
05064   FileIdGlobalTxDirectoryInformation,
05065   FileIsRemoteDeviceInformation,
05066   FileAttributeCacheInformation,
05067   FileNumaNodeInformation,
05068   FileStandardLinkInformation,
05069   FileRemoteProtocolInformation,
05070 #endif
05071   FileMaximumInformation
05072 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
05073 
05074 typedef struct _FILE_POSITION_INFORMATION {
05075   LARGE_INTEGER CurrentByteOffset;
05076 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
05077 
05078 typedef struct _FILE_BASIC_INFORMATION {
05079   LARGE_INTEGER CreationTime;
05080   LARGE_INTEGER LastAccessTime;
05081   LARGE_INTEGER LastWriteTime;
05082   LARGE_INTEGER ChangeTime;
05083   ULONG FileAttributes;
05084 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
05085 
05086 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
05087   IO_PRIORITY_HINT PriorityHint;
05088 } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
05089 
05090 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
05091   ULONG Flags;
05092 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
05093 
05094 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
05095   PUCHAR IoStatusBlockRange;
05096   ULONG Length;
05097 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
05098 
05099 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION {
05100   BOOLEAN IsRemote;
05101 } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
05102 
05103 typedef struct _FILE_NUMA_NODE_INFORMATION {
05104   USHORT NodeNumber;
05105 } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
05106 
05107 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
05108   ULONG NumberOfProcessIdsInList;
05109   ULONG_PTR ProcessIdList[1];
05110 } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
05111 
05112 typedef struct _FILE_STANDARD_INFORMATION {
05113   LARGE_INTEGER AllocationSize;
05114   LARGE_INTEGER EndOfFile;
05115   ULONG NumberOfLinks;
05116   BOOLEAN DeletePending;
05117   BOOLEAN Directory;
05118 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
05119 
05120 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
05121   LARGE_INTEGER CreationTime;
05122   LARGE_INTEGER LastAccessTime;
05123   LARGE_INTEGER LastWriteTime;
05124   LARGE_INTEGER ChangeTime;
05125   LARGE_INTEGER AllocationSize;
05126   LARGE_INTEGER EndOfFile;
05127   ULONG FileAttributes;
05128 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
05129 
05130 typedef enum _FSINFOCLASS {
05131   FileFsVolumeInformation = 1,
05132   FileFsLabelInformation,
05133   FileFsSizeInformation,
05134   FileFsDeviceInformation,
05135   FileFsAttributeInformation,
05136   FileFsControlInformation,
05137   FileFsFullSizeInformation,
05138   FileFsObjectIdInformation,
05139   FileFsDriverPathInformation,
05140   FileFsVolumeFlagsInformation,
05141   FileFsMaximumInformation
05142 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
05143 
05144 typedef struct _FILE_FS_DEVICE_INFORMATION {
05145   DEVICE_TYPE DeviceType;
05146   ULONG Characteristics;
05147 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
05148 
05149 typedef struct _FILE_FULL_EA_INFORMATION {
05150   ULONG NextEntryOffset;
05151   UCHAR Flags;
05152   UCHAR EaNameLength;
05153   USHORT EaValueLength;
05154   CHAR EaName[1];
05155 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
05156 
05157 typedef struct _FILE_SFIO_RESERVE_INFORMATION {
05158   ULONG RequestsPerPeriod;
05159   ULONG Period;
05160   BOOLEAN RetryFailures;
05161   BOOLEAN Discardable;
05162   ULONG RequestSize;
05163   ULONG NumOutstandingRequests;
05164 } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
05165 
05166 typedef struct _FILE_SFIO_VOLUME_INFORMATION {
05167   ULONG MaximumRequestsPerPeriod;
05168   ULONG MinimumPeriod;
05169   ULONG MinimumTransferSize;
05170 } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
05171 
05172 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS     0x1
05173 #define FILE_SKIP_SET_EVENT_ON_HANDLE            0x2
05174 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO      0x4
05175 
05176 #define FM_LOCK_BIT             (0x1)
05177 #define FM_LOCK_BIT_V           (0x0)
05178 #define FM_LOCK_WAITER_WOKEN    (0x2)
05179 #define FM_LOCK_WAITER_INC      (0x4)
05180 
05181 _Function_class_(FAST_IO_CHECK_IF_POSSIBLE)
05182 _IRQL_requires_same_
05183 typedef BOOLEAN
05184 (NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
05185   _In_ struct _FILE_OBJECT *FileObject,
05186   _In_ PLARGE_INTEGER FileOffset,
05187   _In_ ULONG Length,
05188   _In_ BOOLEAN Wait,
05189   _In_ ULONG LockKey,
05190   _In_ BOOLEAN CheckForReadOperation,
05191   _Out_ PIO_STATUS_BLOCK IoStatus,
05192   _In_ struct _DEVICE_OBJECT *DeviceObject);
05193 typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
05194 
05195 _Function_class_(FAST_IO_READ)
05196 _IRQL_requires_same_
05197 typedef BOOLEAN
05198 (NTAPI FAST_IO_READ)(
05199   _In_ struct _FILE_OBJECT *FileObject,
05200   _In_ PLARGE_INTEGER FileOffset,
05201   _In_ ULONG Length,
05202   _In_ BOOLEAN Wait,
05203   _In_ ULONG LockKey,
05204   _Out_ PVOID Buffer,
05205   _Out_ PIO_STATUS_BLOCK IoStatus,
05206   _In_ struct _DEVICE_OBJECT *DeviceObject);
05207 typedef FAST_IO_READ *PFAST_IO_READ;
05208 
05209 _Function_class_(FAST_IO_WRITE)
05210 _IRQL_requires_same_
05211 typedef BOOLEAN
05212 (NTAPI FAST_IO_WRITE)(
05213   _In_ struct _FILE_OBJECT *FileObject,
05214   _In_ PLARGE_INTEGER FileOffset,
05215   _In_ ULONG Length,
05216   _In_ BOOLEAN Wait,
05217   _In_ ULONG LockKey,
05218   _In_ PVOID Buffer,
05219   _Out_ PIO_STATUS_BLOCK IoStatus,
05220   _In_ struct _DEVICE_OBJECT *DeviceObject);
05221 typedef FAST_IO_WRITE *PFAST_IO_WRITE;
05222 
05223 _Function_class_(FAST_IO_QUERY_BASIC_INFO)
05224 _IRQL_requires_same_
05225 typedef BOOLEAN
05226 (NTAPI FAST_IO_QUERY_BASIC_INFO)(
05227   _In_ struct _FILE_OBJECT *FileObject,
05228   _In_ BOOLEAN Wait,
05229   _Out_ PFILE_BASIC_INFORMATION Buffer,
05230   _Out_ PIO_STATUS_BLOCK IoStatus,
05231   _In_ struct _DEVICE_OBJECT *DeviceObject);
05232 typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
05233 
05234 _Function_class_(FAST_IO_QUERY_STANDARD_INFO)
05235 _IRQL_requires_same_
05236 typedef BOOLEAN
05237 (NTAPI FAST_IO_QUERY_STANDARD_INFO)(
05238   _In_ struct _FILE_OBJECT *FileObject,
05239   _In_ BOOLEAN Wait,
05240   _Out_ PFILE_STANDARD_INFORMATION Buffer,
05241   _Out_ PIO_STATUS_BLOCK IoStatus,
05242   _In_ struct _DEVICE_OBJECT *DeviceObject);
05243 typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
05244 
05245 _Function_class_(FAST_IO_LOCK)
05246 _IRQL_requires_same_
05247 typedef BOOLEAN
05248 (NTAPI FAST_IO_LOCK)(
05249   _In_ struct _FILE_OBJECT *FileObject,
05250   _In_ PLARGE_INTEGER FileOffset,
05251   _In_ PLARGE_INTEGER Length,
05252   _In_ PEPROCESS ProcessId,
05253   _In_ ULONG Key,
05254   _In_ BOOLEAN FailImmediately,
05255   _In_ BOOLEAN ExclusiveLock,
05256   _Out_ PIO_STATUS_BLOCK IoStatus,
05257   _In_ struct _DEVICE_OBJECT *DeviceObject);
05258 typedef FAST_IO_LOCK *PFAST_IO_LOCK;
05259 
05260 _Function_class_(FAST_IO_UNLOCK_SINGLE)
05261 _IRQL_requires_same_
05262 typedef BOOLEAN
05263 (NTAPI FAST_IO_UNLOCK_SINGLE)(
05264   _In_ struct _FILE_OBJECT *FileObject,
05265   _In_ PLARGE_INTEGER FileOffset,
05266   _In_ PLARGE_INTEGER Length,
05267   _In_ PEPROCESS ProcessId,
05268   _In_ ULONG Key,
05269   _Out_ PIO_STATUS_BLOCK IoStatus,
05270   _In_ struct _DEVICE_OBJECT *DeviceObject);
05271 typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
05272 
05273 _Function_class_(FAST_IO_UNLOCK_ALL)
05274 _IRQL_requires_same_
05275 typedef BOOLEAN
05276 (NTAPI FAST_IO_UNLOCK_ALL)(
05277   _In_ struct _FILE_OBJECT *FileObject,
05278   _In_ PEPROCESS ProcessId,
05279   _Out_ PIO_STATUS_BLOCK IoStatus,
05280   _In_ struct _DEVICE_OBJECT *DeviceObject);
05281 typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
05282 
05283 _Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY)
05284 _IRQL_requires_same_
05285 typedef BOOLEAN
05286 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
05287   _In_ struct _FILE_OBJECT *FileObject,
05288   _In_ PVOID ProcessId,
05289   _In_ ULONG Key,
05290   _Out_ PIO_STATUS_BLOCK IoStatus,
05291   _In_ struct _DEVICE_OBJECT *DeviceObject);
05292 typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
05293 
05294 _Function_class_(FAST_IO_DEVICE_CONTROL)
05295 _IRQL_requires_same_
05296 typedef BOOLEAN
05297 (NTAPI FAST_IO_DEVICE_CONTROL)(
05298   _In_ struct _FILE_OBJECT *FileObject,
05299   _In_ BOOLEAN Wait,
05300   _In_opt_ PVOID InputBuffer,
05301   _In_ ULONG InputBufferLength,
05302   _Out_opt_ PVOID OutputBuffer,
05303   _In_ ULONG OutputBufferLength,
05304   _In_ ULONG IoControlCode,
05305   _Out_ PIO_STATUS_BLOCK IoStatus,
05306   _In_ struct _DEVICE_OBJECT *DeviceObject);
05307 typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
05308 
05309 _Function_class_(FAST_IO_ACQUIRE_FILE)
05310 _IRQL_requires_same_
05311 typedef VOID
05312 (NTAPI FAST_IO_ACQUIRE_FILE)(
05313   _In_ struct _FILE_OBJECT *FileObject);
05314 typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
05315 
05316 _Function_class_(FAST_IO_RELEASE_FILE)
05317 _IRQL_requires_same_
05318 typedef VOID
05319 (NTAPI FAST_IO_RELEASE_FILE)(
05320   _In_ struct _FILE_OBJECT *FileObject);
05321 typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
05322 
05323 _Function_class_(FAST_IO_DETACH_DEVICE)
05324 _IRQL_requires_same_
05325 typedef VOID
05326 (NTAPI FAST_IO_DETACH_DEVICE)(
05327   _In_ struct _DEVICE_OBJECT *SourceDevice,
05328   _In_ struct _DEVICE_OBJECT *TargetDevice);
05329 typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
05330 
05331 _Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO)
05332 _IRQL_requires_same_
05333 typedef BOOLEAN
05334 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
05335   _In_ struct _FILE_OBJECT *FileObject,
05336   _In_ BOOLEAN Wait,
05337   _Out_ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
05338   _Out_ struct _IO_STATUS_BLOCK *IoStatus,
05339   _In_ struct _DEVICE_OBJECT *DeviceObject);
05340 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
05341 
05342 _Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE)
05343 _IRQL_requires_same_
05344 typedef NTSTATUS
05345 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
05346   _In_ struct _FILE_OBJECT *FileObject,
05347   _In_ PLARGE_INTEGER EndingOffset,
05348   _Out_ struct _ERESOURCE **ResourceToRelease,
05349   _In_ struct _DEVICE_OBJECT *DeviceObject);
05350 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
05351 
05352 _Function_class_(FAST_IO_MDL_READ)
05353 _IRQL_requires_same_
05354 typedef BOOLEAN
05355 (NTAPI FAST_IO_MDL_READ)(
05356   _In_ struct _FILE_OBJECT *FileObject,
05357   _In_ PLARGE_INTEGER FileOffset,
05358   _In_ ULONG Length,
05359   _In_ ULONG LockKey,
05360   _Out_ PMDL *MdlChain,
05361   _Out_ PIO_STATUS_BLOCK IoStatus,
05362   _In_ struct _DEVICE_OBJECT *DeviceObject);
05363 typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
05364 
05365 _Function_class_(FAST_IO_MDL_READ_COMPLETE)
05366 _IRQL_requires_same_
05367 typedef BOOLEAN
05368 (NTAPI FAST_IO_MDL_READ_COMPLETE)(
05369   _In_ struct _FILE_OBJECT *FileObject,
05370   _In_ PMDL MdlChain,
05371   _In_ struct _DEVICE_OBJECT *DeviceObject);
05372 typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
05373 
05374 _Function_class_(FAST_IO_PREPARE_MDL_WRITE)
05375 _IRQL_requires_same_
05376 typedef BOOLEAN
05377 (NTAPI FAST_IO_PREPARE_MDL_WRITE)(
05378   _In_ struct _FILE_OBJECT *FileObject,
05379   _In_ PLARGE_INTEGER FileOffset,
05380   _In_ ULONG Length,
05381   _In_ ULONG LockKey,
05382   _Out_ PMDL *MdlChain,
05383   _Out_ PIO_STATUS_BLOCK IoStatus,
05384   _In_ struct _DEVICE_OBJECT *DeviceObject);
05385 typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
05386 
05387 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE)
05388 _IRQL_requires_same_
05389 typedef BOOLEAN
05390 (NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
05391   _In_ struct _FILE_OBJECT *FileObject,
05392   _In_ PLARGE_INTEGER FileOffset,
05393   _In_ PMDL MdlChain,
05394   _In_ struct _DEVICE_OBJECT *DeviceObject);
05395 typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
05396 
05397 _Function_class_(FAST_IO_READ_COMPRESSED)
05398 _IRQL_requires_same_
05399 typedef BOOLEAN
05400 (NTAPI FAST_IO_READ_COMPRESSED)(
05401   _In_ struct _FILE_OBJECT *FileObject,
05402   _In_ PLARGE_INTEGER FileOffset,
05403   _In_ ULONG Length,
05404   _In_ ULONG LockKey,
05405   _Out_ PVOID Buffer,
05406   _Out_ PMDL *MdlChain,
05407   _Out_ PIO_STATUS_BLOCK IoStatus,
05408   _Out_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
05409   _In_ ULONG CompressedDataInfoLength,
05410   _In_ struct _DEVICE_OBJECT *DeviceObject);
05411 typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
05412 
05413 _Function_class_(FAST_IO_WRITE_COMPRESSED)
05414 _IRQL_requires_same_
05415 typedef BOOLEAN
05416 (NTAPI FAST_IO_WRITE_COMPRESSED)(
05417   _In_ struct _FILE_OBJECT *FileObject,
05418   _In_ PLARGE_INTEGER FileOffset,
05419   _In_ ULONG Length,
05420   _In_ ULONG LockKey,
05421   _In_ PVOID Buffer,
05422   _Out_ PMDL *MdlChain,
05423   _Out_ PIO_STATUS_BLOCK IoStatus,
05424   _In_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
05425   _In_ ULONG CompressedDataInfoLength,
05426   _In_ struct _DEVICE_OBJECT *DeviceObject);
05427 typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
05428 
05429 _Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED)
05430 _IRQL_requires_same_
05431 typedef BOOLEAN
05432 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
05433   _In_ struct _FILE_OBJECT *FileObject,
05434   _In_ PMDL MdlChain,
05435   _In_ struct _DEVICE_OBJECT *DeviceObject);
05436 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
05437 
05438 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)
05439 _IRQL_requires_same_
05440 typedef BOOLEAN
05441 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
05442   _In_ struct _FILE_OBJECT *FileObject,
05443   _In_ PLARGE_INTEGER FileOffset,
05444   _In_ PMDL MdlChain,
05445   _In_ struct _DEVICE_OBJECT *DeviceObject);
05446 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
05447 
05448 _Function_class_(FAST_IO_QUERY_OPEN)
05449 _IRQL_requires_same_
05450 typedef BOOLEAN
05451 (NTAPI FAST_IO_QUERY_OPEN)(
05452   _Inout_ struct _IRP *Irp,
05453   _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
05454   _In_ struct _DEVICE_OBJECT *DeviceObject);
05455 typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
05456 
05457 _Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE)
05458 _IRQL_requires_same_
05459 typedef NTSTATUS
05460 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
05461   _In_ struct _FILE_OBJECT *FileObject,
05462   _In_ struct _ERESOURCE *ResourceToRelease,
05463   _In_ struct _DEVICE_OBJECT *DeviceObject);
05464 typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
05465 
05466 _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH)
05467 _IRQL_requires_same_
05468 typedef NTSTATUS
05469 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
05470   _In_ struct _FILE_OBJECT *FileObject,
05471   _In_ struct _DEVICE_OBJECT *DeviceObject);
05472 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
05473 
05474 _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH)
05475 _IRQL_requires_same_
05476 typedef NTSTATUS
05477 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
05478   _In_ struct _FILE_OBJECT *FileObject,
05479   _In_ struct _DEVICE_OBJECT *DeviceObject);
05480 typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
05481 
05482 typedef struct _FAST_IO_DISPATCH {
05483   ULONG SizeOfFastIoDispatch;
05484   PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
05485   PFAST_IO_READ FastIoRead;
05486   PFAST_IO_WRITE FastIoWrite;
05487   PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
05488   PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
05489   PFAST_IO_LOCK FastIoLock;
05490   PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
05491   PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
05492   PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
05493   PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
05494   PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
05495   PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
05496   PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
05497   PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
05498   PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
05499   PFAST_IO_MDL_READ MdlRead;
05500   PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
05501   PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
05502   PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
05503   PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
05504   PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
05505   PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
05506   PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
05507   PFAST_IO_QUERY_OPEN FastIoQueryOpen;
05508   PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
05509   PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
05510   PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
05511 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
05512 
05513 typedef struct _SECTION_OBJECT_POINTERS {
05514   PVOID DataSectionObject;
05515   PVOID SharedCacheMap;
05516   PVOID ImageSectionObject;
05517 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
05518 
05519 typedef struct _IO_COMPLETION_CONTEXT {
05520   PVOID Port;
05521   PVOID Key;
05522 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
05523 
05524 /* FILE_OBJECT.Flags */
05525 #define FO_FILE_OPEN                 0x00000001
05526 #define FO_SYNCHRONOUS_IO            0x00000002
05527 #define FO_ALERTABLE_IO              0x00000004
05528 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
05529 #define FO_WRITE_THROUGH             0x00000010
05530 #define FO_SEQUENTIAL_ONLY           0x00000020
05531 #define FO_CACHE_SUPPORTED           0x00000040
05532 #define FO_NAMED_PIPE                0x00000080
05533 #define FO_STREAM_FILE               0x00000100
05534 #define FO_MAILSLOT                  0x00000200
05535 #define FO_GENERATE_AUDIT_ON_CLOSE   0x00000400
05536 #define FO_QUEUE_IRP_TO_THREAD       0x00000400
05537 #define FO_DIRECT_DEVICE_OPEN        0x00000800
05538 #define FO_FILE_MODIFIED             0x00001000
05539 #define FO_FILE_SIZE_CHANGED         0x00002000
05540 #define FO_CLEANUP_COMPLETE          0x00004000
05541 #define FO_TEMPORARY_FILE            0x00008000
05542 #define FO_DELETE_ON_CLOSE           0x00010000
05543 #define FO_OPENED_CASE_SENSITIVE     0x00020000
05544 #define FO_HANDLE_CREATED            0x00040000
05545 #define FO_FILE_FAST_IO_READ         0x00080000
05546 #define FO_RANDOM_ACCESS             0x00100000
05547 #define FO_FILE_OPEN_CANCELLED       0x00200000
05548 #define FO_VOLUME_OPEN               0x00400000
05549 #define FO_REMOTE_ORIGIN             0x01000000
05550 #define FO_DISALLOW_EXCLUSIVE        0x02000000
05551 #define FO_SKIP_COMPLETION_PORT      0x02000000
05552 #define FO_SKIP_SET_EVENT            0x04000000
05553 #define FO_SKIP_SET_FAST_IO          0x08000000
05554 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
05555 
05556 /* VPB.Flags */
05557 #define VPB_MOUNTED                       0x0001
05558 #define VPB_LOCKED                        0x0002
05559 #define VPB_PERSISTENT                    0x0004
05560 #define VPB_REMOVE_PENDING                0x0008
05561 #define VPB_RAW_MOUNT                     0x0010
05562 #define VPB_DIRECT_WRITES_ALLOWED         0x0020
05563 
05564 /* IRP.Flags */
05565 
05566 #define SL_FORCE_ACCESS_CHECK             0x01
05567 #define SL_OPEN_PAGING_FILE               0x02
05568 #define SL_OPEN_TARGET_DIRECTORY          0x04
05569 #define SL_STOP_ON_SYMLINK                0x08
05570 #define SL_CASE_SENSITIVE                 0x80
05571 
05572 #define SL_KEY_SPECIFIED                  0x01
05573 #define SL_OVERRIDE_VERIFY_VOLUME         0x02
05574 #define SL_WRITE_THROUGH                  0x04
05575 #define SL_FT_SEQUENTIAL_WRITE            0x08
05576 #define SL_FORCE_DIRECT_WRITE             0x10
05577 #define SL_REALTIME_STREAM                0x20
05578 
05579 #define SL_READ_ACCESS_GRANTED            0x01
05580 #define SL_WRITE_ACCESS_GRANTED           0x04
05581 
05582 #define SL_FAIL_IMMEDIATELY               0x01
05583 #define SL_EXCLUSIVE_LOCK                 0x02
05584 
05585 #define SL_RESTART_SCAN                   0x01
05586 #define SL_RETURN_SINGLE_ENTRY            0x02
05587 #define SL_INDEX_SPECIFIED                0x04
05588 
05589 #define SL_WATCH_TREE                     0x01
05590 
05591 #define SL_ALLOW_RAW_MOUNT                0x01
05592 
05593 #define CTL_CODE(DeviceType, Function, Method, Access) \
05594   (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
05595 
05596 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
05597 
05598 #define METHOD_FROM_CTL_CODE(ctrlCode)          ((ULONG)(ctrlCode & 3))
05599 
05600 #define IRP_NOCACHE                     0x00000001
05601 #define IRP_PAGING_IO                   0x00000002
05602 #define IRP_MOUNT_COMPLETION            0x00000002
05603 #define IRP_SYNCHRONOUS_API             0x00000004
05604 #define IRP_ASSOCIATED_IRP              0x00000008
05605 #define IRP_BUFFERED_IO                 0x00000010
05606 #define IRP_DEALLOCATE_BUFFER           0x00000020
05607 #define IRP_INPUT_OPERATION             0x00000040
05608 #define IRP_SYNCHRONOUS_PAGING_IO       0x00000040
05609 #define IRP_CREATE_OPERATION            0x00000080
05610 #define IRP_READ_OPERATION              0x00000100
05611 #define IRP_WRITE_OPERATION             0x00000200
05612 #define IRP_CLOSE_OPERATION             0x00000400
05613 #define IRP_DEFER_IO_COMPLETION         0x00000800
05614 #define IRP_OB_QUERY_NAME               0x00001000
05615 #define IRP_HOLD_DEVICE_QUEUE           0x00002000
05616 /* The following 2 are missing in latest WDK */
05617 #define IRP_RETRY_IO_COMPLETION         0x00004000
05618 #define IRP_CLASS_CACHE_OPERATION       0x00008000
05619 
05620 #define IRP_QUOTA_CHARGED                 0x01
05621 #define IRP_ALLOCATED_MUST_SUCCEED        0x02
05622 #define IRP_ALLOCATED_FIXED_SIZE          0x04
05623 #define IRP_LOOKASIDE_ALLOCATION          0x08
05624 
05625 /*
05626 ** IRP function codes
05627 */
05628 
05629 #define IRP_MJ_CREATE                     0x00
05630 #define IRP_MJ_CREATE_NAMED_PIPE          0x01
05631 #define IRP_MJ_CLOSE                      0x02
05632 #define IRP_MJ_READ                       0x03
05633 #define IRP_MJ_WRITE                      0x04
05634 #define IRP_MJ_QUERY_INFORMATION          0x05
05635 #define IRP_MJ_SET_INFORMATION            0x06
05636 #define IRP_MJ_QUERY_EA                   0x07
05637 #define IRP_MJ_SET_EA                     0x08
05638 #define IRP_MJ_FLUSH_BUFFERS              0x09
05639 #define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
05640 #define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
05641 #define IRP_MJ_DIRECTORY_CONTROL          0x0c
05642 #define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
05643 #define IRP_MJ_DEVICE_CONTROL             0x0e
05644 #define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
05645 #define IRP_MJ_SCSI                       0x0f
05646 #define IRP_MJ_SHUTDOWN                   0x10
05647 #define IRP_MJ_LOCK_CONTROL               0x11
05648 #define IRP_MJ_CLEANUP                    0x12
05649 #define IRP_MJ_CREATE_MAILSLOT            0x13
05650 #define IRP_MJ_QUERY_SECURITY             0x14
05651 #define IRP_MJ_SET_SECURITY               0x15
05652 #define IRP_MJ_POWER                      0x16
05653 #define IRP_MJ_SYSTEM_CONTROL             0x17
05654 #define IRP_MJ_DEVICE_CHANGE              0x18
05655 #define IRP_MJ_QUERY_QUOTA                0x19
05656 #define IRP_MJ_SET_QUOTA                  0x1a
05657 #define IRP_MJ_PNP                        0x1b
05658 #define IRP_MJ_PNP_POWER                  0x1b
05659 #define IRP_MJ_MAXIMUM_FUNCTION           0x1b
05660 
05661 #define IRP_MN_SCSI_CLASS                 0x01
05662 
05663 #define IRP_MN_START_DEVICE               0x00
05664 #define IRP_MN_QUERY_REMOVE_DEVICE        0x01
05665 #define IRP_MN_REMOVE_DEVICE              0x02
05666 #define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
05667 #define IRP_MN_STOP_DEVICE                0x04
05668 #define IRP_MN_QUERY_STOP_DEVICE          0x05
05669 #define IRP_MN_CANCEL_STOP_DEVICE         0x06
05670 
05671 #define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
05672 #define IRP_MN_QUERY_INTERFACE              0x08
05673 #define IRP_MN_QUERY_CAPABILITIES           0x09
05674 #define IRP_MN_QUERY_RESOURCES              0x0A
05675 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
05676 #define IRP_MN_QUERY_DEVICE_TEXT            0x0C
05677 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
05678 
05679 #define IRP_MN_READ_CONFIG                  0x0F
05680 #define IRP_MN_WRITE_CONFIG                 0x10
05681 #define IRP_MN_EJECT                        0x11
05682 #define IRP_MN_SET_LOCK                     0x12
05683 #define IRP_MN_QUERY_ID                     0x13
05684 #define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
05685 #define IRP_MN_QUERY_BUS_INFORMATION        0x15
05686 #define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
05687 #define IRP_MN_SURPRISE_REMOVAL             0x17
05688 #if (NTDDI_VERSION >= NTDDI_WIN7)
05689 #define IRP_MN_DEVICE_ENUMERATED            0x19
05690 #endif
05691 
05692 #define IRP_MN_WAIT_WAKE                  0x00
05693 #define IRP_MN_POWER_SEQUENCE             0x01
05694 #define IRP_MN_SET_POWER                  0x02
05695 #define IRP_MN_QUERY_POWER                0x03
05696 
05697 #define IRP_MN_QUERY_ALL_DATA             0x00
05698 #define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
05699 #define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
05700 #define IRP_MN_CHANGE_SINGLE_ITEM         0x03
05701 #define IRP_MN_ENABLE_EVENTS              0x04
05702 #define IRP_MN_DISABLE_EVENTS             0x05
05703 #define IRP_MN_ENABLE_COLLECTION          0x06
05704 #define IRP_MN_DISABLE_COLLECTION         0x07
05705 #define IRP_MN_REGINFO                    0x08
05706 #define IRP_MN_EXECUTE_METHOD             0x09
05707 
05708 #define IRP_MN_REGINFO_EX                 0x0b
05709 
05710 typedef struct _FILE_OBJECT {
05711   CSHORT Type;
05712   CSHORT Size;
05713   PDEVICE_OBJECT DeviceObject;
05714   PVPB Vpb;
05715   PVOID FsContext;
05716   PVOID FsContext2;
05717   PSECTION_OBJECT_POINTERS SectionObjectPointer;
05718   PVOID PrivateCacheMap;
05719   NTSTATUS FinalStatus;
05720   struct _FILE_OBJECT *RelatedFileObject;
05721   BOOLEAN LockOperation;
05722   BOOLEAN DeletePending;
05723   BOOLEAN ReadAccess;
05724   BOOLEAN WriteAccess;
05725   BOOLEAN DeleteAccess;
05726   BOOLEAN SharedRead;
05727   BOOLEAN SharedWrite;
05728   BOOLEAN SharedDelete;
05729   ULONG Flags;
05730   UNICODE_STRING FileName;
05731   LARGE_INTEGER CurrentByteOffset;
05732   volatile ULONG Waiters;
05733   volatile ULONG Busy;
05734   PVOID LastLock;
05735   KEVENT Lock;
05736   KEVENT Event;
05737   volatile PIO_COMPLETION_CONTEXT CompletionContext;
05738   KSPIN_LOCK IrpListLock;
05739   LIST_ENTRY IrpList;
05740   volatile PVOID FileObjectExtension;
05741 } FILE_OBJECT, *PFILE_OBJECT;
05742 
05743 typedef struct _IO_ERROR_LOG_PACKET {
05744   UCHAR MajorFunctionCode;
05745   UCHAR RetryCount;
05746   USHORT DumpDataSize;
05747   USHORT NumberOfStrings;
05748   USHORT StringOffset;
05749   USHORT EventCategory;
05750   NTSTATUS ErrorCode;
05751   ULONG UniqueErrorValue;
05752   NTSTATUS FinalStatus;
05753   ULONG SequenceNumber;
05754   ULONG IoControlCode;
05755   LARGE_INTEGER DeviceOffset;
05756   ULONG DumpData[1];
05757 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
05758 
05759 typedef struct _IO_ERROR_LOG_MESSAGE {
05760   USHORT Type;
05761   USHORT Size;
05762   USHORT DriverNameLength;
05763   LARGE_INTEGER TimeStamp;
05764   ULONG DriverNameOffset;
05765   IO_ERROR_LOG_PACKET EntryData;
05766 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
05767 
05768 #define ERROR_LOG_LIMIT_SIZE               240
05769 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
05770                                             sizeof(IO_ERROR_LOG_PACKET) + \
05771                                             (sizeof(WCHAR) * 40))
05772 #define ERROR_LOG_MESSAGE_LIMIT_SIZE                                          \
05773     (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
05774 #define IO_ERROR_LOG_MESSAGE_LENGTH                                           \
05775     ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ?           \
05776         ERROR_LOG_MESSAGE_LIMIT_SIZE :                                        \
05777         PORT_MAXIMUM_MESSAGE_LENGTH)
05778 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH -                 \
05779                                 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
05780 
05781 #ifdef _WIN64
05782 #define PORT_MAXIMUM_MESSAGE_LENGTH    512
05783 #else
05784 #define PORT_MAXIMUM_MESSAGE_LENGTH    256
05785 #endif
05786 
05787 typedef enum _DMA_WIDTH {
05788   Width8Bits,
05789   Width16Bits,
05790   Width32Bits,
05791   MaximumDmaWidth
05792 } DMA_WIDTH, *PDMA_WIDTH;
05793 
05794 typedef enum _DMA_SPEED {
05795   Compatible,
05796   TypeA,
05797   TypeB,
05798   TypeC,
05799   TypeF,
05800   MaximumDmaSpeed
05801 } DMA_SPEED, *PDMA_SPEED;
05802 
05803 /* DEVICE_DESCRIPTION.Version */
05804 
05805 #define DEVICE_DESCRIPTION_VERSION        0x0000
05806 #define DEVICE_DESCRIPTION_VERSION1       0x0001
05807 #define DEVICE_DESCRIPTION_VERSION2       0x0002
05808 
05809 typedef struct _DEVICE_DESCRIPTION {
05810   ULONG Version;
05811   BOOLEAN Master;
05812   BOOLEAN ScatterGather;
05813   BOOLEAN DemandMode;
05814   BOOLEAN AutoInitialize;
05815   BOOLEAN Dma32BitAddresses;
05816   BOOLEAN IgnoreCount;
05817   BOOLEAN Reserved1;
05818   BOOLEAN Dma64BitAddresses;
05819   ULONG BusNumber;
05820   ULONG DmaChannel;
05821   INTERFACE_TYPE InterfaceType;
05822   DMA_WIDTH DmaWidth;
05823   DMA_SPEED DmaSpeed;
05824   ULONG MaximumLength;
05825   ULONG DmaPort;
05826 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
05827 
05828 typedef enum _DEVICE_RELATION_TYPE {
05829   BusRelations,
05830   EjectionRelations,
05831   PowerRelations,
05832   RemovalRelations,
05833   TargetDeviceRelation,
05834   SingleBusRelations,
05835   TransportRelations
05836 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
05837 
05838 typedef struct _DEVICE_RELATIONS {
05839   ULONG Count;
05840   PDEVICE_OBJECT Objects[1];
05841 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
05842 
05843 typedef struct _DEVOBJ_EXTENSION {
05844   CSHORT Type;
05845   USHORT Size;
05846   PDEVICE_OBJECT DeviceObject;
05847 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
05848 
05849 typedef struct _SCATTER_GATHER_ELEMENT {
05850   PHYSICAL_ADDRESS Address;
05851   ULONG Length;
05852   ULONG_PTR Reserved;
05853 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
05854 
05855 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
05856 
05857 #if defined(_MSC_VER)
05858 #if _MSC_VER >= 1200
05859 #pragma warning(push)
05860 #endif
05861 #pragma warning(disable:4200)
05862 #endif /* _MSC_VER */
05863 
05864 typedef struct _SCATTER_GATHER_LIST {
05865   ULONG NumberOfElements;
05866   ULONG_PTR Reserved;
05867   SCATTER_GATHER_ELEMENT Elements[1];
05868 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
05869 
05870 #if defined(_MSC_VER)
05871 #if _MSC_VER >= 1200
05872 #pragma warning(pop)
05873 #else
05874 #pragma warning(default:4200)
05875 #endif
05876 #endif /* _MSC_VER */
05877 
05878 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
05879 
05880 struct _SCATTER_GATHER_LIST;
05881 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
05882 
05883 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
05884 
05885 _Function_class_(DRIVER_ADD_DEVICE)
05886 _IRQL_requires_(PASSIVE_LEVEL)
05887 _IRQL_requires_same_
05888 _When_(return>=0, _Kernel_clear_do_init_(__yes))
05889 typedef NTSTATUS
05890 (NTAPI DRIVER_ADD_DEVICE)(
05891   _In_ struct _DRIVER_OBJECT *DriverObject,
05892   _In_ struct _DEVICE_OBJECT *PhysicalDeviceObject);
05893 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
05894 
05895 typedef struct _DRIVER_EXTENSION {
05896   struct _DRIVER_OBJECT *DriverObject;
05897   PDRIVER_ADD_DEVICE AddDevice;
05898   ULONG Count;
05899   UNICODE_STRING ServiceKeyName;
05900 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
05901 
05902 #define DRVO_UNLOAD_INVOKED               0x00000001
05903 #define DRVO_LEGACY_DRIVER                0x00000002
05904 #define DRVO_BUILTIN_DRIVER               0x00000004
05905 
05906 _Function_class_(DRIVER_INITIALIZE)
05907 _IRQL_requires_same_
05908 typedef NTSTATUS
05909 (NTAPI DRIVER_INITIALIZE)(
05910   _In_ struct _DRIVER_OBJECT *DriverObject,
05911   _In_ PUNICODE_STRING RegistryPath);
05912 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
05913 
05914 _Function_class_(DRIVER_STARTIO)
05915 _IRQL_always_function_min_(DISPATCH_LEVEL)
05916 _IRQL_requires_(DISPATCH_LEVEL)
05917 _IRQL_requires_same_
05918 typedef VOID
05919 (NTAPI DRIVER_STARTIO)(
05920   _Inout_ struct _DEVICE_OBJECT *DeviceObject,
05921   _Inout_ struct _IRP *Irp);
05922 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
05923 
05924 _Function_class_(DRIVER_UNLOAD)
05925 _IRQL_requires_(PASSIVE_LEVEL)
05926 _IRQL_requires_same_
05927 typedef VOID
05928 (NTAPI DRIVER_UNLOAD)(
05929   _In_ struct _DRIVER_OBJECT *DriverObject);
05930 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
05931 
05932 _Function_class_(DRIVER_DISPATCH)
05933 _IRQL_requires_(PASSIVE_LEVEL)
05934 _IRQL_requires_same_
05935 typedef NTSTATUS
05936 (NTAPI DRIVER_DISPATCH)(
05937   _In_ struct _DEVICE_OBJECT *DeviceObject,
05938   _Inout_ struct _IRP *Irp);
05939 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
05940 
05941 typedef struct _DRIVER_OBJECT {
05942   CSHORT Type;
05943   CSHORT Size;
05944   PDEVICE_OBJECT DeviceObject;
05945   ULONG Flags;
05946   PVOID DriverStart;
05947   ULONG DriverSize;
05948   PVOID DriverSection;
05949   PDRIVER_EXTENSION DriverExtension;
05950   UNICODE_STRING DriverName;
05951   PUNICODE_STRING HardwareDatabase;
05952   struct _FAST_IO_DISPATCH *FastIoDispatch;
05953   PDRIVER_INITIALIZE DriverInit;
05954   PDRIVER_STARTIO DriverStartIo;
05955   PDRIVER_UNLOAD DriverUnload;
05956   PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
05957 } DRIVER_OBJECT, *PDRIVER_OBJECT;
05958 
05959 typedef struct _DMA_ADAPTER {
05960   USHORT Version;
05961   USHORT Size;
05962   struct _DMA_OPERATIONS* DmaOperations;
05963 } DMA_ADAPTER, *PDMA_ADAPTER;
05964 
05965 typedef VOID
05966 (NTAPI *PPUT_DMA_ADAPTER)(
05967   PDMA_ADAPTER DmaAdapter);
05968 
05969 typedef PVOID
05970 (NTAPI *PALLOCATE_COMMON_BUFFER)(
05971   _In_ PDMA_ADAPTER DmaAdapter,
05972   _In_ ULONG Length,
05973   _Out_ PPHYSICAL_ADDRESS LogicalAddress,
05974   _In_ BOOLEAN CacheEnabled);
05975 
05976 typedef VOID
05977 (NTAPI *PFREE_COMMON_BUFFER)(
05978   _In_ PDMA_ADAPTER DmaAdapter,
05979   _In_ ULONG Length,
05980   _In_ PHYSICAL_ADDRESS LogicalAddress,
05981   _In_ PVOID VirtualAddress,
05982   _In_ BOOLEAN CacheEnabled);
05983 
05984 typedef NTSTATUS
05985 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
05986   _In_ PDMA_ADAPTER DmaAdapter,
05987   _In_ PDEVICE_OBJECT DeviceObject,
05988   _In_ ULONG NumberOfMapRegisters,
05989   _In_ PDRIVER_CONTROL ExecutionRoutine,
05990   _In_ PVOID Context);
05991 
05992 typedef BOOLEAN
05993 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
05994   _In_ PDMA_ADAPTER DmaAdapter,
05995   _In_ PMDL Mdl,
05996   _In_ PVOID MapRegisterBase,
05997   _In_ PVOID CurrentVa,
05998   _In_ ULONG Length,
05999   _In_ BOOLEAN WriteToDevice);
06000 
06001 typedef VOID
06002 (NTAPI *PFREE_ADAPTER_CHANNEL)(
06003   _In_ PDMA_ADAPTER DmaAdapter);
06004 
06005 typedef VOID
06006 (NTAPI *PFREE_MAP_REGISTERS)(
06007   _In_ PDMA_ADAPTER DmaAdapter,
06008   PVOID MapRegisterBase,
06009   ULONG NumberOfMapRegisters);
06010 
06011 typedef PHYSICAL_ADDRESS
06012 (NTAPI *PMAP_TRANSFER)(
06013   _In_ PDMA_ADAPTER DmaAdapter,
06014   _In_ PMDL Mdl,
06015   _In_ PVOID MapRegisterBase,
06016   _In_ PVOID CurrentVa,
06017   _Inout_ PULONG Length,
06018   _In_ BOOLEAN WriteToDevice);
06019 
06020 typedef ULONG
06021 (NTAPI *PGET_DMA_ALIGNMENT)(
06022   _In_ PDMA_ADAPTER DmaAdapter);
06023 
06024 typedef ULONG
06025 (NTAPI *PREAD_DMA_COUNTER)(
06026   _In_ PDMA_ADAPTER DmaAdapter);
06027 
06028 _Function_class_(DRIVER_LIST_CONTROL)
06029 _IRQL_requires_same_
06030 typedef VOID
06031 (NTAPI DRIVER_LIST_CONTROL)(
06032   _In_ struct _DEVICE_OBJECT *DeviceObject,
06033   _In_ struct _IRP *Irp,
06034   _In_ struct _SCATTER_GATHER_LIST *ScatterGather,
06035   _In_ PVOID Context);
06036 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
06037 
06038 typedef NTSTATUS
06039 (NTAPI *PGET_SCATTER_GATHER_LIST)(
06040   _In_ PDMA_ADAPTER DmaAdapter,
06041   _In_ PDEVICE_OBJECT DeviceObject,
06042   _In_ PMDL Mdl,
06043   _In_ PVOID CurrentVa,
06044   _In_ ULONG Length,
06045   _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
06046   _In_ PVOID Context,
06047   _In_ BOOLEAN WriteToDevice);
06048 
06049 typedef VOID
06050 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
06051   _In_ PDMA_ADAPTER DmaAdapter,
06052   _In_ PSCATTER_GATHER_LIST ScatterGather,
06053   _In_ BOOLEAN WriteToDevice);
06054 
06055 typedef NTSTATUS
06056 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
06057   _In_ PDMA_ADAPTER DmaAdapter,
06058   _In_ PMDL Mdl OPTIONAL,
06059   _In_ PVOID CurrentVa,
06060   _In_ ULONG Length,
06061   _Out_ PULONG ScatterGatherListSize,
06062   _Out_ OPTIONAL PULONG pNumberOfMapRegisters);
06063 
06064 typedef NTSTATUS
06065 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
06066   _In_ PDMA_ADAPTER DmaAdapter,
06067   _In_ PDEVICE_OBJECT DeviceObject,
06068   _In_ PMDL Mdl,
06069   _In_ PVOID CurrentVa,
06070   _In_ ULONG Length,
06071   _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
06072   _In_ PVOID Context,
06073   _In_ BOOLEAN WriteToDevice,
06074   _In_ PVOID ScatterGatherBuffer,
06075   _In_ ULONG ScatterGatherLength);
06076 
06077 typedef NTSTATUS
06078 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
06079   _In_ PDMA_ADAPTER DmaAdapter,
06080   _In_ PSCATTER_GATHER_LIST ScatterGather,
06081   _In_ PMDL OriginalMdl,
06082   _Out_ PMDL *TargetMdl);
06083 
06084 typedef struct _DMA_OPERATIONS {
06085   ULONG Size;
06086   PPUT_DMA_ADAPTER PutDmaAdapter;
06087   PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
06088   PFREE_COMMON_BUFFER FreeCommonBuffer;
06089   PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
06090   PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
06091   PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
06092   PFREE_MAP_REGISTERS FreeMapRegisters;
06093   PMAP_TRANSFER MapTransfer;
06094   PGET_DMA_ALIGNMENT GetDmaAlignment;
06095   PREAD_DMA_COUNTER ReadDmaCounter;
06096   PGET_SCATTER_GATHER_LIST GetScatterGatherList;
06097   PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
06098   PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
06099   PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
06100   PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
06101 } DMA_OPERATIONS, *PDMA_OPERATIONS;
06102 
06103 typedef struct _IO_RESOURCE_DESCRIPTOR {
06104   UCHAR Option;
06105   UCHAR Type;
06106   UCHAR ShareDisposition;
06107   UCHAR Spare1;
06108   USHORT Flags;
06109   USHORT Spare2;
06110   union {
06111     struct {
06112       ULONG Length;
06113       ULONG Alignment;
06114       PHYSICAL_ADDRESS MinimumAddress;
06115       PHYSICAL_ADDRESS MaximumAddress;
06116     } Port;
06117     struct {
06118       ULONG Length;
06119       ULONG Alignment;
06120       PHYSICAL_ADDRESS MinimumAddress;
06121       PHYSICAL_ADDRESS MaximumAddress;
06122     } Memory;
06123     struct {
06124       ULONG MinimumVector;
06125       ULONG MaximumVector;
06126     } Interrupt;
06127     struct {
06128       ULONG MinimumChannel;
06129       ULONG MaximumChannel;
06130     } Dma;
06131     struct {
06132       ULONG Length;
06133       ULONG Alignment;
06134       PHYSICAL_ADDRESS MinimumAddress;
06135       PHYSICAL_ADDRESS MaximumAddress;
06136     } Generic;
06137     struct {
06138       ULONG Data[3];
06139     } DevicePrivate;
06140     struct {
06141       ULONG Length;
06142       ULONG MinBusNumber;
06143       ULONG MaxBusNumber;
06144       ULONG Reserved;
06145     } BusNumber;
06146     struct {
06147       ULONG Priority;
06148       ULONG Reserved1;
06149       ULONG Reserved2;
06150     } ConfigData;
06151   } u;
06152 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
06153 
06154 typedef struct _IO_RESOURCE_LIST {
06155   USHORT Version;
06156   USHORT Revision;
06157   ULONG Count;
06158   IO_RESOURCE_DESCRIPTOR Descriptors[1];
06159 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
06160 
06161 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
06162   ULONG ListSize;
06163   INTERFACE_TYPE InterfaceType;
06164   ULONG BusNumber;
06165   ULONG SlotNumber;
06166   ULONG Reserved[3];
06167   ULONG AlternativeLists;
06168   IO_RESOURCE_LIST List[1];
06169 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
06170 
06171 _Function_class_(DRIVER_CANCEL)
06172 _Requires_lock_held_(_Global_cancel_spin_lock_)
06173 _Releases_lock_(_Global_cancel_spin_lock_)
06174 _IRQL_requires_min_(DISPATCH_LEVEL)
06175 _IRQL_requires_(DISPATCH_LEVEL)
06176 typedef VOID
06177 (NTAPI DRIVER_CANCEL)(
06178   _Inout_ struct _DEVICE_OBJECT *DeviceObject,
06179   _Inout_ _IRQL_uses_cancel_ struct _IRP *Irp);
06180 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
06181 
06182 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP {
06183   CSHORT Type;
06184   USHORT Size;
06185   struct _MDL *MdlAddress;
06186   ULONG Flags;
06187   union {
06188     struct _IRP *MasterIrp;
06189     volatile LONG IrpCount;
06190     PVOID SystemBuffer;
06191   } AssociatedIrp;
06192   LIST_ENTRY ThreadListEntry;
06193   IO_STATUS_BLOCK IoStatus;
06194   KPROCESSOR_MODE RequestorMode;
06195   BOOLEAN PendingReturned;
06196   CHAR StackCount;
06197   CHAR CurrentLocation;
06198   BOOLEAN Cancel;
06199   KIRQL CancelIrql;
06200   CCHAR ApcEnvironment;
06201   UCHAR AllocationFlags;
06202   PIO_STATUS_BLOCK UserIosb;
06203   PKEVENT UserEvent;
06204   union {
06205     struct {
06206       _ANONYMOUS_UNION union {
06207         PIO_APC_ROUTINE UserApcRoutine;
06208         PVOID IssuingProcess;
06209       } DUMMYUNIONNAME;
06210       PVOID UserApcContext;
06211     } AsynchronousParameters;
06212     LARGE_INTEGER AllocationSize;
06213   } Overlay;
06214   volatile PDRIVER_CANCEL CancelRoutine;
06215   PVOID UserBuffer;
06216   union {
06217     struct {
06218       _ANONYMOUS_UNION union {
06219         KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
06220         _ANONYMOUS_STRUCT struct {
06221           PVOID DriverContext[4];
06222         } DUMMYSTRUCTNAME;
06223       } DUMMYUNIONNAME;
06224       PETHREAD Thread;
06225       PCHAR AuxiliaryBuffer;
06226       _ANONYMOUS_STRUCT struct {
06227         LIST_ENTRY ListEntry;
06228         _ANONYMOUS_UNION union {
06229           struct _IO_STACK_LOCATION *CurrentStackLocation;
06230           ULONG PacketType;
06231         } DUMMYUNIONNAME;
06232       } DUMMYSTRUCTNAME;
06233       struct _FILE_OBJECT *OriginalFileObject;
06234     } Overlay;
06235     KAPC Apc;
06236     PVOID CompletionKey;
06237   } Tail;
06238 } IRP, *PIRP;
06239 
06240 typedef enum _IO_PAGING_PRIORITY {
06241   IoPagingPriorityInvalid,
06242   IoPagingPriorityNormal,
06243   IoPagingPriorityHigh,
06244   IoPagingPriorityReserved1,
06245   IoPagingPriorityReserved2
06246 } IO_PAGING_PRIORITY;
06247 
06248 _Function_class_(IO_COMPLETION_ROUTINE)
06249 _IRQL_requires_same_
06250 typedef NTSTATUS
06251 (NTAPI IO_COMPLETION_ROUTINE)(
06252   _In_ struct _DEVICE_OBJECT *DeviceObject,
06253   _In_ struct _IRP *Irp,
06254   _In_opt_ PVOID Context);
06255 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
06256 
06257 _Function_class_(IO_DPC_ROUTINE)
06258 _IRQL_always_function_min_(DISPATCH_LEVEL)
06259 _IRQL_requires_(DISPATCH_LEVEL)
06260 _IRQL_requires_same_
06261 typedef VOID
06262 (NTAPI IO_DPC_ROUTINE)(
06263   _In_ struct _KDPC *Dpc,
06264   _In_ struct _DEVICE_OBJECT *DeviceObject,
06265   _Inout_ struct _IRP *Irp,
06266   _In_opt_ PVOID Context);
06267 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
06268 
06269 typedef NTSTATUS
06270 (NTAPI *PMM_DLL_INITIALIZE)(
06271   _In_ PUNICODE_STRING RegistryPath);
06272 
06273 typedef NTSTATUS
06274 (NTAPI *PMM_DLL_UNLOAD)(
06275   VOID);
06276 
06277 _Function_class_(IO_TIMER_ROUTINE)
06278 _IRQL_requires_same_
06279 typedef VOID
06280 (NTAPI IO_TIMER_ROUTINE)(
06281   _In_ struct _DEVICE_OBJECT *DeviceObject,
06282   _In_opt_ PVOID Context);
06283 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
06284 
06285 typedef struct _IO_SECURITY_CONTEXT {
06286   PSECURITY_QUALITY_OF_SERVICE SecurityQos;
06287   PACCESS_STATE AccessState;
06288   ACCESS_MASK DesiredAccess;
06289   ULONG FullCreateOptions;
06290 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
06291 
06292 struct _IO_CSQ;
06293 
06294 typedef struct _IO_CSQ_IRP_CONTEXT {
06295   ULONG Type;
06296   struct _IRP *Irp;
06297   struct _IO_CSQ *Csq;
06298 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
06299 
06300 typedef VOID
06301 (NTAPI *PIO_CSQ_INSERT_IRP)(
06302   _In_ struct _IO_CSQ *Csq,
06303   _In_ PIRP Irp);
06304 
06305 typedef NTSTATUS
06306 (NTAPI IO_CSQ_INSERT_IRP_EX)(
06307   _In_ struct _IO_CSQ *Csq,
06308   _In_ PIRP Irp,
06309   _In_ PVOID InsertContext);
06310 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
06311 
06312 typedef VOID
06313 (NTAPI *PIO_CSQ_REMOVE_IRP)(
06314   _In_ struct _IO_CSQ *Csq,
06315   _In_ PIRP Irp);
06316 
06317 typedef PIRP
06318 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
06319   _In_ struct _IO_CSQ *Csq,
06320   _In_ PIRP Irp,
06321   _In_ PVOID PeekContext);
06322 
06323 typedef VOID
06324 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
06325   _In_ struct _IO_CSQ *Csq,
06326   _Out_ PKIRQL Irql);
06327 
06328 typedef VOID
06329 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
06330   _In_ struct _IO_CSQ *Csq,
06331   _In_ KIRQL Irql);
06332 
06333 typedef VOID
06334 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
06335   _In_ struct _IO_CSQ *Csq,
06336   _In_ PIRP Irp);
06337 
06338 typedef struct _IO_CSQ {
06339   ULONG Type;
06340   PIO_CSQ_INSERT_IRP CsqInsertIrp;
06341   PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
06342   PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
06343   PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
06344   PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
06345   PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
06346   PVOID ReservePointer;
06347 } IO_CSQ, *PIO_CSQ;
06348 
06349 typedef enum _BUS_QUERY_ID_TYPE {
06350   BusQueryDeviceID,
06351   BusQueryHardwareIDs,
06352   BusQueryCompatibleIDs,
06353   BusQueryInstanceID,
06354   BusQueryDeviceSerialNumber
06355 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
06356 
06357 typedef enum _DEVICE_TEXT_TYPE {
06358   DeviceTextDescription,
06359   DeviceTextLocationInformation
06360 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
06361 
06362 typedef BOOLEAN
06363 (NTAPI *PGPE_SERVICE_ROUTINE)(
06364   PVOID,
06365   PVOID);
06366 
06367 _IRQL_requires_max_(DISPATCH_LEVEL)
06368 _Must_inspect_result_
06369 typedef NTSTATUS
06370 (NTAPI *PGPE_CONNECT_VECTOR)(
06371   PDEVICE_OBJECT,
06372   ULONG,
06373   KINTERRUPT_MODE,
06374   BOOLEAN,
06375   PGPE_SERVICE_ROUTINE,
06376   PVOID,
06377   PVOID);
06378 
06379 _IRQL_requires_max_(DISPATCH_LEVEL)
06380 _Must_inspect_result_
06381 typedef NTSTATUS
06382 (NTAPI *PGPE_DISCONNECT_VECTOR)(
06383   PVOID);
06384 
06385 _IRQL_requires_max_(DISPATCH_LEVEL)
06386 _Must_inspect_result_
06387 typedef NTSTATUS
06388 (NTAPI *PGPE_ENABLE_EVENT)(
06389   PDEVICE_OBJECT,
06390   PVOID);
06391 
06392 _IRQL_requires_max_(DISPATCH_LEVEL)
06393 _Must_inspect_result_
06394 typedef NTSTATUS
06395 (NTAPI *PGPE_DISABLE_EVENT)(
06396   PDEVICE_OBJECT,
06397   PVOID);
06398 
06399 _IRQL_requires_max_(DISPATCH_LEVEL)
06400 _Must_inspect_result_
06401 typedef NTSTATUS
06402 (NTAPI *PGPE_CLEAR_STATUS)(
06403   PDEVICE_OBJECT,
06404   PVOID);
06405 
06406 typedef VOID
06407 (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
06408   PVOID,
06409   ULONG);
06410 
06411 _IRQL_requires_max_(DISPATCH_LEVEL)
06412 _Must_inspect_result_
06413 typedef NTSTATUS
06414 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
06415   PDEVICE_OBJECT,
06416   PDEVICE_NOTIFY_CALLBACK,
06417   PVOID);
06418 
06419 _IRQL_requires_max_(DISPATCH_LEVEL)
06420 typedef VOID
06421 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
06422   PDEVICE_OBJECT,
06423   PDEVICE_NOTIFY_CALLBACK);
06424 
06425 typedef struct _ACPI_INTERFACE_STANDARD {
06426   USHORT Size;
06427   USHORT Version;
06428   PVOID Context;
06429   PINTERFACE_REFERENCE InterfaceReference;
06430   PINTERFACE_DEREFERENCE InterfaceDereference;
06431   PGPE_CONNECT_VECTOR GpeConnectVector;
06432   PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
06433   PGPE_ENABLE_EVENT GpeEnableEvent;
06434   PGPE_DISABLE_EVENT GpeDisableEvent;
06435   PGPE_CLEAR_STATUS GpeClearStatus;
06436   PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
06437   PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
06438 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
06439 
06440 typedef BOOLEAN
06441 (NTAPI *PGPE_SERVICE_ROUTINE2)(
06442   PVOID ObjectContext,
06443   PVOID ServiceContext);
06444 
06445 _IRQL_requires_max_(DISPATCH_LEVEL)
06446 _Must_inspect_result_
06447 typedef NTSTATUS
06448 (NTAPI *PGPE_CONNECT_VECTOR2)(
06449   PVOID Context,
06450   ULONG GpeNumber,
06451   KINTERRUPT_MODE Mode,
06452   BOOLEAN Shareable,
06453   PGPE_SERVICE_ROUTINE ServiceRoutine,
06454   PVOID ServiceContext,
06455   PVOID *ObjectContext);
06456 
06457 _IRQL_requires_max_(DISPATCH_LEVEL)
06458 _Must_inspect_result_
06459 typedef NTSTATUS
06460 (NTAPI *PGPE_DISCONNECT_VECTOR2)(
06461   PVOID Context,
06462   PVOID ObjectContext);
06463 
06464 _IRQL_requires_max_(DISPATCH_LEVEL)
06465 _Must_inspect_result_
06466 typedef NTSTATUS
06467 (NTAPI *PGPE_ENABLE_EVENT2)(
06468   PVOID Context,
06469   PVOID ObjectContext);
06470 
06471 _IRQL_requires_max_(DISPATCH_LEVEL)
06472 _Must_inspect_result_
06473 typedef NTSTATUS
06474 (NTAPI *PGPE_DISABLE_EVENT2)(
06475   PVOID Context,
06476   PVOID ObjectContext);
06477 
06478 _IRQL_requires_max_(DISPATCH_LEVEL)
06479 _Must_inspect_result_
06480 typedef NTSTATUS
06481 (NTAPI *PGPE_CLEAR_STATUS2)(
06482   PVOID Context,
06483   PVOID ObjectContext);
06484 
06485 _IRQL_requires_max_(DISPATCH_LEVEL)
06486 typedef VOID
06487 (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
06488   PVOID NotificationContext,
06489   ULONG NotifyCode);
06490 
06491 _IRQL_requires_max_(DISPATCH_LEVEL)
06492 _Must_inspect_result_
06493 typedef NTSTATUS
06494 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
06495   PVOID Context,
06496   PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
06497   PVOID NotificationContext);
06498 
06499 _IRQL_requires_max_(DISPATCH_LEVEL)
06500 typedef VOID
06501 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
06502   PVOID Context);
06503 
06504 typedef struct _ACPI_INTERFACE_STANDARD2 {
06505   USHORT Size;
06506   USHORT Version;
06507   PVOID Context;
06508   PINTERFACE_REFERENCE InterfaceReference;
06509   PINTERFACE_DEREFERENCE InterfaceDereference;
06510   PGPE_CONNECT_VECTOR2 GpeConnectVector;
06511   PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
06512   PGPE_ENABLE_EVENT2 GpeEnableEvent;
06513   PGPE_DISABLE_EVENT2 GpeDisableEvent;
06514   PGPE_CLEAR_STATUS2 GpeClearStatus;
06515   PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
06516   PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
06517 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
06518 
06519 #if !defined(_AMD64_) && !defined(_IA64_)
06520 #include <pshpack4.h>
06521 #endif
06522 typedef struct _IO_STACK_LOCATION {
06523   UCHAR MajorFunction;
06524   UCHAR MinorFunction;
06525   UCHAR Flags;
06526   UCHAR Control;
06527   union {
06528     struct {
06529       PIO_SECURITY_CONTEXT SecurityContext;
06530       ULONG Options;
06531       USHORT POINTER_ALIGNMENT FileAttributes;
06532       USHORT ShareAccess;
06533       ULONG POINTER_ALIGNMENT EaLength;
06534     } Create;
06535     struct {
06536       ULONG Length;
06537       ULONG POINTER_ALIGNMENT Key;
06538       LARGE_INTEGER ByteOffset;
06539     } Read;
06540     struct {
06541       ULONG Length;
06542       ULONG POINTER_ALIGNMENT Key;
06543       LARGE_INTEGER ByteOffset;
06544     } Write;
06545     struct {
06546       ULONG Length;
06547       PUNICODE_STRING FileName;
06548       FILE_INFORMATION_CLASS FileInformationClass;
06549       ULONG FileIndex;
06550     } QueryDirectory;
06551     struct {
06552       ULONG Length;
06553       ULONG CompletionFilter;
06554     } NotifyDirectory;
06555     struct {
06556       ULONG Length;
06557       FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
06558     } QueryFile;
06559     struct {
06560       ULONG Length;
06561       FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
06562       PFILE_OBJECT FileObject;
06563       _ANONYMOUS_UNION union {
06564         _ANONYMOUS_STRUCT struct {
06565           BOOLEAN ReplaceIfExists;
06566           BOOLEAN AdvanceOnly;
06567         } DUMMYSTRUCTNAME;
06568         ULONG ClusterCount;
06569         HANDLE DeleteHandle;
06570       } DUMMYUNIONNAME;
06571     } SetFile;
06572     struct {
06573       ULONG Length;
06574       PVOID EaList;
06575       ULONG EaListLength;
06576       ULONG EaIndex;
06577     } QueryEa;
06578     struct {
06579       ULONG Length;
06580     } SetEa;
06581     struct {
06582       ULONG Length;
06583       FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
06584     } QueryVolume;
06585     struct {
06586       ULONG Length;
06587       FS_INFORMATION_CLASS FsInformationClass;
06588     } SetVolume;
06589     struct {
06590       ULONG OutputBufferLength;
06591       ULONG InputBufferLength;
06592       ULONG FsControlCode;
06593       PVOID Type3InputBuffer;
06594     } FileSystemControl;
06595     struct {
06596       PLARGE_INTEGER Length;
06597       ULONG Key;
06598       LARGE_INTEGER ByteOffset;
06599     } LockControl;
06600     struct {
06601       ULONG OutputBufferLength;
06602       ULONG POINTER_ALIGNMENT InputBufferLength;
06603       ULONG POINTER_ALIGNMENT IoControlCode;
06604       PVOID Type3InputBuffer;
06605     } DeviceIoControl;
06606     struct {
06607       SECURITY_INFORMATION SecurityInformation;
06608       ULONG POINTER_ALIGNMENT Length;
06609     } QuerySecurity;
06610     struct {
06611       SECURITY_INFORMATION SecurityInformation;
06612       PSECURITY_DESCRIPTOR SecurityDescriptor;
06613     } SetSecurity;
06614     struct {
06615       PVPB Vpb;
06616       PDEVICE_OBJECT DeviceObject;
06617     } MountVolume;
06618     struct {
06619       PVPB Vpb;
06620       PDEVICE_OBJECT DeviceObject;
06621     } VerifyVolume;
06622     struct {
06623       struct _SCSI_REQUEST_BLOCK *Srb;
06624     } Scsi;
06625     struct {
06626       ULONG Length;
06627       PSID StartSid;
06628       struct _FILE_GET_QUOTA_INFORMATION *SidList;
06629       ULONG SidListLength;
06630     } QueryQuota;
06631     struct {
06632       ULONG Length;
06633     } SetQuota;
06634     struct {
06635       DEVICE_RELATION_TYPE Type;
06636     } QueryDeviceRelations;
06637     struct {
06638       CONST GUID *InterfaceType;
06639       USHORT Size;
06640       USHORT Version;
06641       PINTERFACE Interface;
06642       PVOID InterfaceSpecificData;
06643     } QueryInterface;
06644     struct {
06645       PDEVICE_CAPABILITIES Capabilities;
06646     } DeviceCapabilities;
06647     struct {
06648       PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
06649     } FilterResourceRequirements;
06650     struct {
06651       ULONG WhichSpace;
06652       PVOID Buffer;
06653       ULONG Offset;
06654       ULONG POINTER_ALIGNMENT Length;
06655     } ReadWriteConfig;
06656     struct {
06657       BOOLEAN Lock;
06658     } SetLock;
06659     struct {
06660       BUS_QUERY_ID_TYPE IdType;
06661     } QueryId;
06662     struct {
06663       DEVICE_TEXT_TYPE DeviceTextType;
06664       LCID POINTER_ALIGNMENT LocaleId;
06665     } QueryDeviceText;
06666     struct {
06667       BOOLEAN InPath;
06668       BOOLEAN Reserved[3];
06669       DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
06670     } UsageNotification;
06671     struct {
06672       SYSTEM_POWER_STATE PowerState;
06673     } WaitWake;
06674     struct {
06675       PPOWER_SEQUENCE PowerSequence;
06676     } PowerSequence;
06677     struct {
06678       ULONG SystemContext;
06679       POWER_STATE_TYPE POINTER_ALIGNMENT Type;
06680       POWER_STATE POINTER_ALIGNMENT State;
06681       POWER_ACTION POINTER_ALIGNMENT ShutdownType;
06682     } Power;
06683     struct {
06684       PCM_RESOURCE_LIST AllocatedResources;
06685       PCM_RESOURCE_LIST AllocatedResourcesTranslated;
06686     } StartDevice;
06687     struct {
06688       ULONG_PTR ProviderId;
06689       PVOID DataPath;
06690       ULONG BufferSize;
06691       PVOID Buffer;
06692     } WMI;
06693     struct {
06694       PVOID Argument1;
06695       PVOID Argument2;
06696       PVOID Argument3;
06697       PVOID Argument4;
06698     } Others;
06699   } Parameters;
06700   PDEVICE_OBJECT DeviceObject;
06701   PFILE_OBJECT FileObject;
06702   PIO_COMPLETION_ROUTINE CompletionRoutine;
06703   PVOID Context;
06704 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
06705 #if !defined(_AMD64_) && !defined(_IA64_)
06706 #include <poppack.h>
06707 #endif
06708 
06709 /* IO_STACK_LOCATION.Control */
06710 
06711 #define SL_PENDING_RETURNED               0x01
06712 #define SL_ERROR_RETURNED                 0x02
06713 #define SL_INVOKE_ON_CANCEL               0x20
06714 #define SL_INVOKE_ON_SUCCESS              0x40
06715 #define SL_INVOKE_ON_ERROR                0x80
06716 
06717 #define METHOD_BUFFERED                   0
06718 #define METHOD_IN_DIRECT                  1
06719 #define METHOD_OUT_DIRECT                 2
06720 #define METHOD_NEITHER                    3
06721 
06722 #define METHOD_DIRECT_TO_HARDWARE       METHOD_IN_DIRECT
06723 #define METHOD_DIRECT_FROM_HARDWARE     METHOD_OUT_DIRECT
06724 
06725 #define FILE_SUPERSEDED                   0x00000000
06726 #define FILE_OPENED                       0x00000001
06727 #define FILE_CREATED                      0x00000002
06728 #define FILE_OVERWRITTEN                  0x00000003
06729 #define FILE_EXISTS                       0x00000004
06730 #define FILE_DOES_NOT_EXIST               0x00000005
06731 
06732 #define FILE_USE_FILE_POINTER_POSITION    0xfffffffe
06733 #define FILE_WRITE_TO_END_OF_FILE         0xffffffff
06734 
06735 /* also in winnt.h */
06736 #define FILE_LIST_DIRECTORY               0x00000001
06737 #define FILE_READ_DATA                    0x00000001
06738 #define FILE_ADD_FILE                     0x00000002
06739 #define FILE_WRITE_DATA                   0x00000002
06740 #define FILE_ADD_SUBDIRECTORY             0x00000004
06741 #define FILE_APPEND_DATA                  0x00000004
06742 #define FILE_CREATE_PIPE_INSTANCE         0x00000004
06743 #define FILE_READ_EA                      0x00000008
06744 #define FILE_WRITE_EA                     0x00000010
06745 #define FILE_EXECUTE                      0x00000020
06746 #define FILE_TRAVERSE                     0x00000020
06747 #define FILE_DELETE_CHILD                 0x00000040
06748 #define FILE_READ_ATTRIBUTES              0x00000080
06749 #define FILE_WRITE_ATTRIBUTES             0x00000100
06750 
06751 #define FILE_SHARE_READ                   0x00000001
06752 #define FILE_SHARE_WRITE                  0x00000002
06753 #define FILE_SHARE_DELETE                 0x00000004
06754 #define FILE_SHARE_VALID_FLAGS            0x00000007
06755 
06756 #define FILE_ATTRIBUTE_READONLY           0x00000001
06757 #define FILE_ATTRIBUTE_HIDDEN             0x00000002
06758 #define FILE_ATTRIBUTE_SYSTEM             0x00000004
06759 #define FILE_ATTRIBUTE_DIRECTORY          0x00000010
06760 #define FILE_ATTRIBUTE_ARCHIVE            0x00000020
06761 #define FILE_ATTRIBUTE_DEVICE             0x00000040
06762 #define FILE_ATTRIBUTE_NORMAL             0x00000080
06763 #define FILE_ATTRIBUTE_TEMPORARY          0x00000100
06764 #define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
06765 #define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
06766 #define FILE_ATTRIBUTE_COMPRESSED         0x00000800
06767 #define FILE_ATTRIBUTE_OFFLINE            0x00001000
06768 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
06769 #define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
06770 #define FILE_ATTRIBUTE_VIRTUAL            0x00010000
06771 
06772 #define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
06773 #define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
06774 
06775 #define FILE_VALID_OPTION_FLAGS           0x00ffffff
06776 #define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
06777 #define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
06778 #define FILE_VALID_SET_FLAGS              0x00000036
06779 
06780 #define FILE_SUPERSEDE                    0x00000000
06781 #define FILE_OPEN                         0x00000001
06782 #define FILE_CREATE                       0x00000002
06783 #define FILE_OPEN_IF                      0x00000003
06784 #define FILE_OVERWRITE                    0x00000004
06785 #define FILE_OVERWRITE_IF                 0x00000005
06786 #define FILE_MAXIMUM_DISPOSITION          0x00000005
06787 
06788 #define FILE_DIRECTORY_FILE               0x00000001
06789 #define FILE_WRITE_THROUGH                0x00000002
06790 #define FILE_SEQUENTIAL_ONLY              0x00000004
06791 #define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
06792 #define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
06793 #define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
06794 #define FILE_NON_DIRECTORY_FILE           0x00000040
06795 #define FILE_CREATE_TREE_CONNECTION       0x00000080
06796 #define FILE_COMPLETE_IF_OPLOCKED         0x00000100
06797 #define FILE_NO_EA_KNOWLEDGE              0x00000200
06798 #define FILE_OPEN_REMOTE_INSTANCE         0x00000400
06799 #define FILE_RANDOM_ACCESS                0x00000800
06800 #define FILE_DELETE_ON_CLOSE              0x00001000
06801 #define FILE_OPEN_BY_FILE_ID              0x00002000
06802 #define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
06803 #define FILE_NO_COMPRESSION               0x00008000
06804 #if (NTDDI_VERSION >= NTDDI_WIN7)
06805 #define FILE_OPEN_REQUIRING_OPLOCK        0x00010000
06806 #define FILE_DISALLOW_EXCLUSIVE           0x00020000
06807 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
06808 #define FILE_RESERVE_OPFILTER             0x00100000
06809 #define FILE_OPEN_REPARSE_POINT           0x00200000
06810 #define FILE_OPEN_NO_RECALL               0x00400000
06811 #define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
06812 
06813 #define FILE_ANY_ACCESS                   0x00000000
06814 #define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
06815 #define FILE_READ_ACCESS                  0x00000001
06816 #define FILE_WRITE_ACCESS                 0x00000002
06817 
06818 #define FILE_ALL_ACCESS \
06819   (STANDARD_RIGHTS_REQUIRED | \
06820    SYNCHRONIZE | \
06821    0x1FF)
06822 
06823 #define FILE_GENERIC_EXECUTE \
06824   (STANDARD_RIGHTS_EXECUTE | \
06825    FILE_READ_ATTRIBUTES | \
06826    FILE_EXECUTE | \
06827    SYNCHRONIZE)
06828 
06829 #define FILE_GENERIC_READ \
06830   (STANDARD_RIGHTS_READ | \
06831    FILE_READ_DATA | \
06832    FILE_READ_ATTRIBUTES | \
06833    FILE_READ_EA | \
06834    SYNCHRONIZE)
06835 
06836 #define FILE_GENERIC_WRITE \
06837   (STANDARD_RIGHTS_WRITE | \
06838    FILE_WRITE_DATA | \
06839    FILE_WRITE_ATTRIBUTES | \
06840    FILE_WRITE_EA | \
06841    FILE_APPEND_DATA | \
06842    SYNCHRONIZE)
06843 
06844 /* end winnt.h */
06845 
06846 #define WMIREG_ACTION_REGISTER      1
06847 #define WMIREG_ACTION_DEREGISTER    2
06848 #define WMIREG_ACTION_REREGISTER    3
06849 #define WMIREG_ACTION_UPDATE_GUIDS  4
06850 #define WMIREG_ACTION_BLOCK_IRPS    5
06851 
06852 #define WMIREGISTER                 0
06853 #define WMIUPDATE                   1
06854 
06855 _Function_class_(WMI_NOTIFICATION_CALLBACK)
06856 _IRQL_requires_same_
06857 typedef VOID
06858 (NTAPI FWMI_NOTIFICATION_CALLBACK)(
06859   PVOID Wnode,
06860   PVOID Context);
06861 typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
06862 
06863 #ifndef _PCI_X_
06864 #define _PCI_X_
06865 
06866 typedef struct _PCI_SLOT_NUMBER {
06867   union {
06868     struct {
06869       ULONG DeviceNumber:5;
06870       ULONG FunctionNumber:3;
06871       ULONG Reserved:24;
06872     } bits;
06873     ULONG AsULONG;
06874   } u;
06875 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
06876 
06877 #define PCI_TYPE0_ADDRESSES               6
06878 #define PCI_TYPE1_ADDRESSES               2
06879 #define PCI_TYPE2_ADDRESSES               5
06880 
06881 typedef struct _PCI_COMMON_HEADER {
06882   PCI_COMMON_HEADER_LAYOUT
06883 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
06884 
06885 #ifdef __cplusplus
06886 typedef struct _PCI_COMMON_CONFIG {
06887   PCI_COMMON_HEADER_LAYOUT
06888   UCHAR DeviceSpecific[192];
06889 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
06890 #else
06891 typedef struct _PCI_COMMON_CONFIG {
06892   PCI_COMMON_HEADER DUMMYSTRUCTNAME;
06893   UCHAR DeviceSpecific[192];
06894 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
06895 #endif
06896 
06897 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
06898 
06899 #define PCI_EXTENDED_CONFIG_LENGTH               0x1000
06900 
06901 #define PCI_MAX_DEVICES        32
06902 #define PCI_MAX_FUNCTION       8
06903 #define PCI_MAX_BRIDGE_NUMBER  0xFF
06904 #define PCI_INVALID_VENDORID   0xFFFF
06905 
06906 /* PCI_COMMON_CONFIG.HeaderType */
06907 #define PCI_MULTIFUNCTION                 0x80
06908 #define PCI_DEVICE_TYPE                   0x00
06909 #define PCI_BRIDGE_TYPE                   0x01
06910 #define PCI_CARDBUS_BRIDGE_TYPE           0x02
06911 
06912 #define PCI_CONFIGURATION_TYPE(PciData) \
06913   (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
06914 
06915 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
06916   ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
06917 
06918 /* PCI_COMMON_CONFIG.Command */
06919 #define PCI_ENABLE_IO_SPACE               0x0001
06920 #define PCI_ENABLE_MEMORY_SPACE           0x0002
06921 #define PCI_ENABLE_BUS_MASTER             0x0004
06922 #define PCI_ENABLE_SPECIAL_CYCLES         0x0008
06923 #define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
06924 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
06925 #define PCI_ENABLE_PARITY                 0x0040
06926 #define PCI_ENABLE_WAIT_CYCLE             0x0080
06927 #define PCI_ENABLE_SERR                   0x0100
06928 #define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
06929 #define PCI_DISABLE_LEVEL_INTERRUPT       0x0400
06930 
06931 /* PCI_COMMON_CONFIG.Status */
06932 #define PCI_STATUS_INTERRUPT_PENDING      0x0008
06933 #define PCI_STATUS_CAPABILITIES_LIST      0x0010
06934 #define PCI_STATUS_66MHZ_CAPABLE          0x0020
06935 #define PCI_STATUS_UDF_SUPPORTED          0x0040
06936 #define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
06937 #define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
06938 #define PCI_STATUS_DEVSEL                 0x0600
06939 #define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
06940 #define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
06941 #define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
06942 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
06943 #define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
06944 
06945 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
06946 
06947 #define PCI_WHICHSPACE_CONFIG             0x0
06948 #define PCI_WHICHSPACE_ROM                0x52696350 /* 'PciR' */
06949 
06950 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT  0x01
06951 #define PCI_CAPABILITY_ID_AGP               0x02
06952 #define PCI_CAPABILITY_ID_VPD               0x03
06953 #define PCI_CAPABILITY_ID_SLOT_ID           0x04
06954 #define PCI_CAPABILITY_ID_MSI               0x05
06955 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP      0x06
06956 #define PCI_CAPABILITY_ID_PCIX              0x07
06957 #define PCI_CAPABILITY_ID_HYPERTRANSPORT    0x08
06958 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC   0x09
06959 #define PCI_CAPABILITY_ID_DEBUG_PORT        0x0A
06960 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL     0x0B
06961 #define PCI_CAPABILITY_ID_SHPC              0x0C
06962 #define PCI_CAPABILITY_ID_P2P_SSID          0x0D
06963 #define PCI_CAPABILITY_ID_AGP_TARGET        0x0E
06964 #define PCI_CAPABILITY_ID_SECURE            0x0F
06965 #define PCI_CAPABILITY_ID_PCI_EXPRESS       0x10
06966 #define PCI_CAPABILITY_ID_MSIX              0x11
06967 
06968 typedef struct _PCI_CAPABILITIES_HEADER {
06969   UCHAR CapabilityID;
06970   UCHAR Next;
06971 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
06972 
06973 typedef struct _PCI_PMC {
06974   UCHAR Version:3;
06975   UCHAR PMEClock:1;
06976   UCHAR Rsvd1:1;
06977   UCHAR DeviceSpecificInitialization:1;
06978   UCHAR Rsvd2:2;
06979   struct _PM_SUPPORT {
06980     UCHAR Rsvd2:1;
06981     UCHAR D1:1;
06982     UCHAR D2:1;
06983     UCHAR PMED0:1;
06984     UCHAR PMED1:1;
06985     UCHAR PMED2:1;
06986     UCHAR PMED3Hot:1;
06987     UCHAR PMED3Cold:1;
06988   } Support;
06989 } PCI_PMC, *PPCI_PMC;
06990 
06991 typedef struct _PCI_PMCSR {
06992   USHORT PowerState:2;
06993   USHORT Rsvd1:6;
06994   USHORT PMEEnable:1;
06995   USHORT DataSelect:4;
06996   USHORT DataScale:2;
06997   USHORT PMEStatus:1;
06998 } PCI_PMCSR, *PPCI_PMCSR;
06999 
07000 typedef struct _PCI_PMCSR_BSE {
07001   UCHAR Rsvd1:6;
07002   UCHAR D3HotSupportsStopClock:1;
07003   UCHAR BusPowerClockControlEnabled:1;
07004 } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
07005 
07006 typedef struct _PCI_PM_CAPABILITY {
07007   PCI_CAPABILITIES_HEADER Header;
07008   union {
07009     PCI_PMC Capabilities;
07010     USHORT AsUSHORT;
07011   } PMC;
07012     union {
07013       PCI_PMCSR ControlStatus;
07014       USHORT AsUSHORT;
07015     } PMCSR;
07016     union {
07017       PCI_PMCSR_BSE BridgeSupport;
07018       UCHAR AsUCHAR;
07019     } PMCSR_BSE;
07020   UCHAR Data;
07021 } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
07022 
07023 typedef struct {
07024   PCI_CAPABILITIES_HEADER Header;
07025   union {
07026     struct {
07027       USHORT DataParityErrorRecoveryEnable:1;
07028       USHORT EnableRelaxedOrdering:1;
07029       USHORT MaxMemoryReadByteCount:2;
07030       USHORT MaxOutstandingSplitTransactions:3;
07031       USHORT Reserved:9;
07032     } bits;
07033     USHORT AsUSHORT;
07034   } Command;
07035   union {
07036     struct {
07037       ULONG FunctionNumber:3;
07038       ULONG DeviceNumber:5;
07039       ULONG BusNumber:8;
07040       ULONG Device64Bit:1;
07041       ULONG Capable133MHz:1;
07042       ULONG SplitCompletionDiscarded:1;
07043       ULONG UnexpectedSplitCompletion:1;
07044       ULONG DeviceComplexity:1;
07045       ULONG DesignedMaxMemoryReadByteCount:2;
07046       ULONG DesignedMaxOutstandingSplitTransactions:3;
07047       ULONG DesignedMaxCumulativeReadSize:3;
07048       ULONG ReceivedSplitCompletionErrorMessage:1;
07049       ULONG CapablePCIX266:1;
07050       ULONG CapablePCIX533:1;
07051       } bits;
07052     ULONG AsULONG;
07053   } Status;
07054 } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
07055 
07056 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID                     0x0001
07057 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID                              0x0002
07058 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID                         0x0003
07059 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID                              0x0004
07060 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID                          0x0005
07061 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID                     0x0006
07062 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID      0x0007
07063 #define PCI_EXPRESS_MFVC_CAP_ID                                         0x0008
07064 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID                                  0x0009
07065 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID                                  0x000A
07066 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID                0x0010
07067 
07068 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
07069   USHORT CapabilityID;
07070   USHORT Version:4;
07071   USHORT Next:12;
07072 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
07073 
07074 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
07075   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
07076   ULONG LowSerialNumber;
07077   ULONG HighSerialNumber;
07078 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
07079 
07080 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
07081   _ANONYMOUS_STRUCT struct {
07082     ULONG Undefined:1;
07083     ULONG Reserved1:3;
07084     ULONG DataLinkProtocolError:1;
07085     ULONG SurpriseDownError:1;
07086     ULONG Reserved2:6;
07087     ULONG PoisonedTLP:1;
07088     ULONG FlowControlProtocolError:1;
07089     ULONG CompletionTimeout:1;
07090     ULONG CompleterAbort:1;
07091     ULONG UnexpectedCompletion:1;
07092     ULONG ReceiverOverflow:1;
07093     ULONG MalformedTLP:1;
07094     ULONG ECRCError:1;
07095     ULONG UnsupportedRequestError:1;
07096     ULONG Reserved3:11;
07097   } DUMMYSTRUCTNAME;
07098   ULONG AsULONG;
07099 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
07100 
07101 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
07102   _ANONYMOUS_STRUCT struct {
07103     ULONG Undefined:1;
07104     ULONG Reserved1:3;
07105     ULONG DataLinkProtocolError:1;
07106     ULONG SurpriseDownError:1;
07107     ULONG Reserved2:6;
07108     ULONG PoisonedTLP:1;
07109     ULONG FlowControlProtocolError:1;
07110     ULONG CompletionTimeout:1;
07111     ULONG CompleterAbort:1;
07112     ULONG UnexpectedCompletion:1;
07113     ULONG ReceiverOverflow:1;
07114     ULONG MalformedTLP:1;
07115     ULONG ECRCError:1;
07116     ULONG UnsupportedRequestError:1;
07117     ULONG Reserved3:11;
07118   } DUMMYSTRUCTNAME;
07119   ULONG AsULONG;
07120 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
07121 
07122 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
07123   _ANONYMOUS_STRUCT struct {
07124     ULONG Undefined:1;
07125     ULONG Reserved1:3;
07126     ULONG DataLinkProtocolError:1;
07127     ULONG SurpriseDownError:1;
07128     ULONG Reserved2:6;
07129     ULONG PoisonedTLP:1;
07130     ULONG FlowControlProtocolError:1;
07131     ULONG CompletionTimeout:1;
07132     ULONG CompleterAbort:1;
07133     ULONG UnexpectedCompletion:1;
07134     ULONG ReceiverOverflow:1;
07135     ULONG MalformedTLP:1;
07136     ULONG ECRCError:1;
07137     ULONG UnsupportedRequestError:1;
07138     ULONG Reserved3:11;
07139   } DUMMYSTRUCTNAME;
07140   ULONG AsULONG;
07141 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
07142 
07143 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
07144   _ANONYMOUS_STRUCT struct {
07145     ULONG ReceiverError:1;
07146     ULONG Reserved1:5;
07147     ULONG BadTLP:1;
07148     ULONG BadDLLP:1;
07149     ULONG ReplayNumRollover:1;
07150     ULONG Reserved2:3;
07151     ULONG ReplayTimerTimeout:1;
07152     ULONG AdvisoryNonFatalError:1;
07153     ULONG Reserved3:18;
07154   } DUMMYSTRUCTNAME;
07155   ULONG AsULONG;
07156 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
07157 
07158 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
07159   _ANONYMOUS_STRUCT struct {
07160     ULONG ReceiverError:1;
07161     ULONG Reserved1:5;
07162     ULONG BadTLP:1;
07163     ULONG BadDLLP:1;
07164     ULONG ReplayNumRollover:1;
07165     ULONG Reserved2:3;
07166     ULONG ReplayTimerTimeout:1;
07167     ULONG AdvisoryNonFatalError:1;
07168     ULONG Reserved3:18;
07169   } DUMMYSTRUCTNAME;
07170   ULONG AsULONG;
07171 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
07172 
07173 typedef union _PCI_EXPRESS_AER_CAPABILITIES {
07174   _ANONYMOUS_STRUCT struct {
07175     ULONG FirstErrorPointer:5;
07176     ULONG ECRCGenerationCapable:1;
07177     ULONG ECRCGenerationEnable:1;
07178     ULONG ECRCCheckCapable:1;
07179     ULONG ECRCCheckEnable:1;
07180     ULONG Reserved:23;
07181   } DUMMYSTRUCTNAME;
07182   ULONG AsULONG;
07183 } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
07184 
07185 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
07186   _ANONYMOUS_STRUCT struct {
07187     ULONG CorrectableErrorReportingEnable:1;
07188     ULONG NonFatalErrorReportingEnable:1;
07189     ULONG FatalErrorReportingEnable:1;
07190     ULONG Reserved:29;
07191   } DUMMYSTRUCTNAME;
07192   ULONG AsULONG;
07193 } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
07194 
07195 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
07196   _ANONYMOUS_STRUCT struct {
07197     ULONG CorrectableErrorReceived:1;
07198     ULONG MultipleCorrectableErrorsReceived:1;
07199     ULONG UncorrectableErrorReceived:1;
07200     ULONG MultipleUncorrectableErrorsReceived:1;
07201     ULONG FirstUncorrectableFatal:1;
07202     ULONG NonFatalErrorMessagesReceived:1;
07203     ULONG FatalErrorMessagesReceived:1;
07204     ULONG Reserved:20;
07205     ULONG AdvancedErrorInterruptMessageNumber:5;
07206   } DUMMYSTRUCTNAME;
07207   ULONG AsULONG;
07208 } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
07209 
07210 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
07211   _ANONYMOUS_STRUCT struct {
07212     USHORT CorrectableSourceIdFun:3;
07213     USHORT CorrectableSourceIdDev:5;
07214     USHORT CorrectableSourceIdBus:8;
07215     USHORT UncorrectableSourceIdFun:3;
07216     USHORT UncorrectableSourceIdDev:5;
07217     USHORT UncorrectableSourceIdBus:8;
07218   } DUMMYSTRUCTNAME;
07219   ULONG AsULONG;
07220 } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
07221 
07222 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
07223   _ANONYMOUS_STRUCT struct {
07224     ULONG TargetAbortOnSplitCompletion:1;
07225     ULONG MasterAbortOnSplitCompletion:1;
07226     ULONG ReceivedTargetAbort:1;
07227     ULONG ReceivedMasterAbort:1;
07228     ULONG RsvdZ:1;
07229     ULONG UnexpectedSplitCompletionError:1;
07230     ULONG UncorrectableSplitCompletion:1;
07231     ULONG UncorrectableDataError:1;
07232     ULONG UncorrectableAttributeError:1;
07233     ULONG UncorrectableAddressError:1;
07234     ULONG DelayedTransactionDiscardTimerExpired:1;
07235     ULONG PERRAsserted:1;
07236     ULONG SERRAsserted:1;
07237     ULONG InternalBridgeError:1;
07238     ULONG Reserved:18;
07239   } DUMMYSTRUCTNAME;
07240   ULONG AsULONG;
07241 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
07242 
07243 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
07244   _ANONYMOUS_STRUCT struct {
07245     ULONG TargetAbortOnSplitCompletion:1;
07246     ULONG MasterAbortOnSplitCompletion:1;
07247     ULONG ReceivedTargetAbort:1;
07248     ULONG ReceivedMasterAbort:1;
07249     ULONG RsvdZ:1;
07250     ULONG UnexpectedSplitCompletionError:1;
07251     ULONG UncorrectableSplitCompletion:1;
07252     ULONG UncorrectableDataError:1;
07253     ULONG UncorrectableAttributeError:1;
07254     ULONG UncorrectableAddressError:1;
07255     ULONG DelayedTransactionDiscardTimerExpired:1;
07256     ULONG PERRAsserted:1;
07257     ULONG SERRAsserted:1;
07258     ULONG InternalBridgeError:1;
07259     ULONG Reserved:18;
07260   } DUMMYSTRUCTNAME;
07261   ULONG AsULONG;
07262 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
07263 
07264 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
07265   _ANONYMOUS_STRUCT struct {
07266     ULONG TargetAbortOnSplitCompletion:1;
07267     ULONG MasterAbortOnSplitCompletion:1;
07268     ULONG ReceivedTargetAbort:1;
07269     ULONG ReceivedMasterAbort:1;
07270     ULONG RsvdZ:1;
07271     ULONG UnexpectedSplitCompletionError:1;
07272     ULONG UncorrectableSplitCompletion:1;
07273     ULONG UncorrectableDataError:1;
07274     ULONG UncorrectableAttributeError:1;
07275     ULONG UncorrectableAddressError:1;
07276     ULONG DelayedTransactionDiscardTimerExpired:1;
07277     ULONG PERRAsserted:1;
07278     ULONG SERRAsserted:1;
07279     ULONG InternalBridgeError:1;
07280     ULONG Reserved:18;
07281   } DUMMYSTRUCTNAME;
07282   ULONG AsULONG;
07283 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
07284 
07285 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
07286   _ANONYMOUS_STRUCT struct {
07287     ULONG SecondaryUncorrectableFirstErrorPtr:5;
07288     ULONG Reserved:27;
07289   } DUMMYSTRUCTNAME;
07290   ULONG AsULONG;
07291 } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
07292 
07293 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING  0x00000001
07294 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING     0x00000002
07295 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING        0x00000004
07296 
07297 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
07298     (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
07299      ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
07300      ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
07301 
07302 typedef struct _PCI_EXPRESS_AER_CAPABILITY {
07303   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
07304   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
07305   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
07306   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
07307   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
07308   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
07309   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
07310   ULONG HeaderLog[4];
07311   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
07312   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
07313   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
07314   PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
07315   ULONG SecHeaderLog[4];
07316 } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
07317 
07318 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
07319   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
07320   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
07321   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
07322   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
07323   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
07324   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
07325   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
07326   ULONG HeaderLog[4];
07327   PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
07328   PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
07329   PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
07330 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
07331 
07332 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
07333   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
07334   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
07335   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
07336   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
07337   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
07338   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
07339   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
07340   ULONG HeaderLog[4];
07341   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
07342   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
07343   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
07344   PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
07345   ULONG SecHeaderLog[4];
07346 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
07347 
07348 typedef union _PCI_EXPRESS_SRIOV_CAPS {
07349   _ANONYMOUS_STRUCT struct {
07350     ULONG VFMigrationCapable:1;
07351     ULONG Reserved1:20;
07352     ULONG VFMigrationInterruptNumber:11;
07353   } DUMMYSTRUCTNAME;
07354   ULONG AsULONG;
07355 } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
07356 
07357 typedef union _PCI_EXPRESS_SRIOV_CONTROL {
07358   _ANONYMOUS_STRUCT struct {
07359     USHORT VFEnable:1;
07360     USHORT VFMigrationEnable:1;
07361     USHORT VFMigrationInterruptEnable:1;
07362     USHORT VFMemorySpaceEnable:1;
07363     USHORT ARICapableHierarchy:1;
07364     USHORT Reserved1:11;
07365   } DUMMYSTRUCTNAME;
07366   USHORT AsUSHORT;
07367 } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
07368 
07369 typedef union _PCI_EXPRESS_SRIOV_STATUS {
07370   _ANONYMOUS_STRUCT struct {
07371     USHORT VFMigrationStatus:1;
07372     USHORT Reserved1:15;
07373   } DUMMYSTRUCTNAME;
07374   USHORT AsUSHORT;
07375 } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
07376 
07377 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
07378   _ANONYMOUS_STRUCT struct {
07379     ULONG VFMigrationStateBIR:3;
07380     ULONG VFMigrationStateOffset:29;
07381   } DUMMYSTRUCTNAME;
07382   ULONG AsULONG;
07383 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
07384 
07385 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
07386   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
07387   PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
07388   PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
07389   PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
07390   USHORT InitialVFs;
07391   USHORT TotalVFs;
07392   USHORT NumVFs;
07393   UCHAR FunctionDependencyLink;
07394   UCHAR RsvdP1;
07395   USHORT FirstVFOffset;
07396   USHORT VFStride;
07397   USHORT RsvdP2;
07398   USHORT VFDeviceId;
07399   ULONG SupportedPageSizes;
07400   ULONG SystemPageSize;
07401   ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
07402   PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
07403 } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
07404 
07405 /* PCI device classes */
07406 #define PCI_CLASS_PRE_20                    0x00
07407 #define PCI_CLASS_MASS_STORAGE_CTLR         0x01
07408 #define PCI_CLASS_NETWORK_CTLR              0x02
07409 #define PCI_CLASS_DISPLAY_CTLR              0x03
07410 #define PCI_CLASS_MULTIMEDIA_DEV            0x04
07411 #define PCI_CLASS_MEMORY_CTLR               0x05
07412 #define PCI_CLASS_BRIDGE_DEV                0x06
07413 #define PCI_CLASS_SIMPLE_COMMS_CTLR         0x07
07414 #define PCI_CLASS_BASE_SYSTEM_DEV           0x08
07415 #define PCI_CLASS_INPUT_DEV                 0x09
07416 #define PCI_CLASS_DOCKING_STATION           0x0a
07417 #define PCI_CLASS_PROCESSOR                 0x0b
07418 #define PCI_CLASS_SERIAL_BUS_CTLR           0x0c
07419 #define PCI_CLASS_WIRELESS_CTLR             0x0d
07420 #define PCI_CLASS_INTELLIGENT_IO_CTLR       0x0e
07421 #define PCI_CLASS_SATELLITE_COMMS_CTLR      0x0f
07422 #define PCI_CLASS_ENCRYPTION_DECRYPTION     0x10
07423 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC      0x11
07424 #define PCI_CLASS_NOT_DEFINED               0xff
07425 
07426 /* PCI device subclasses for class 0 */
07427 #define PCI_SUBCLASS_PRE_20_NON_VGA         0x00
07428 #define PCI_SUBCLASS_PRE_20_VGA             0x01
07429 
07430 /* PCI device subclasses for class 1 (mass storage controllers)*/
07431 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR      0x00
07432 #define PCI_SUBCLASS_MSC_IDE_CTLR           0x01
07433 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR        0x02
07434 #define PCI_SUBCLASS_MSC_IPI_CTLR           0x03
07435 #define PCI_SUBCLASS_MSC_RAID_CTLR          0x04
07436 #define PCI_SUBCLASS_MSC_OTHER              0x80
07437 
07438 /* PCI device subclasses for class 2 (network controllers)*/
07439 #define PCI_SUBCLASS_NET_ETHERNET_CTLR      0x00
07440 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR    0x01
07441 #define PCI_SUBCLASS_NET_FDDI_CTLR          0x02
07442 #define PCI_SUBCLASS_NET_ATM_CTLR           0x03
07443 #define PCI_SUBCLASS_NET_ISDN_CTLR          0x04
07444 #define PCI_SUBCLASS_NET_OTHER              0x80
07445 
07446 /* PCI device subclasses for class 3 (display controllers)*/
07447 #define PCI_SUBCLASS_VID_VGA_CTLR           0x00
07448 #define PCI_SUBCLASS_VID_XGA_CTLR           0x01
07449 #define PCI_SUBCLASS_VID_3D_CTLR            0x02
07450 #define PCI_SUBCLASS_VID_OTHER              0x80
07451 
07452 /* PCI device subclasses for class 4 (multimedia device)*/
07453 #define PCI_SUBCLASS_MM_VIDEO_DEV           0x00
07454 #define PCI_SUBCLASS_MM_AUDIO_DEV           0x01
07455 #define PCI_SUBCLASS_MM_TELEPHONY_DEV       0x02
07456 #define PCI_SUBCLASS_MM_OTHER               0x80
07457 
07458 /* PCI device subclasses for class 5 (memory controller)*/
07459 #define PCI_SUBCLASS_MEM_RAM                0x00
07460 #define PCI_SUBCLASS_MEM_FLASH              0x01
07461 #define PCI_SUBCLASS_MEM_OTHER              0x80
07462 
07463 /* PCI device subclasses for class 6 (bridge device)*/
07464 #define PCI_SUBCLASS_BR_HOST                0x00
07465 #define PCI_SUBCLASS_BR_ISA                 0x01
07466 #define PCI_SUBCLASS_BR_EISA                0x02
07467 #define PCI_SUBCLASS_BR_MCA                 0x03
07468 #define PCI_SUBCLASS_BR_PCI_TO_PCI          0x04
07469 #define PCI_SUBCLASS_BR_PCMCIA              0x05
07470 #define PCI_SUBCLASS_BR_NUBUS               0x06
07471 #define PCI_SUBCLASS_BR_CARDBUS             0x07
07472 #define PCI_SUBCLASS_BR_RACEWAY             0x08
07473 #define PCI_SUBCLASS_BR_OTHER               0x80
07474 
07475 #define PCI_SUBCLASS_COM_SERIAL             0x00
07476 #define PCI_SUBCLASS_COM_PARALLEL           0x01
07477 #define PCI_SUBCLASS_COM_MULTIPORT          0x02
07478 #define PCI_SUBCLASS_COM_MODEM              0x03
07479 #define PCI_SUBCLASS_COM_OTHER              0x80
07480 
07481 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR     0x00
07482 #define PCI_SUBCLASS_SYS_DMA_CTLR           0x01
07483 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER       0x02
07484 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK    0x03
07485 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR   0x04
07486 #define PCI_SUBCLASS_SYS_SDIO_CTRL          0x05
07487 #define PCI_SUBCLASS_SYS_OTHER              0x80
07488 
07489 #define PCI_SUBCLASS_INP_KEYBOARD           0x00
07490 #define PCI_SUBCLASS_INP_DIGITIZER          0x01
07491 #define PCI_SUBCLASS_INP_MOUSE              0x02
07492 #define PCI_SUBCLASS_INP_SCANNER            0x03
07493 #define PCI_SUBCLASS_INP_GAMEPORT           0x04
07494 #define PCI_SUBCLASS_INP_OTHER              0x80
07495 
07496 #define PCI_SUBCLASS_DOC_GENERIC            0x00
07497 #define PCI_SUBCLASS_DOC_OTHER              0x80
07498 
07499 #define PCI_SUBCLASS_PROC_386               0x00
07500 #define PCI_SUBCLASS_PROC_486               0x01
07501 #define PCI_SUBCLASS_PROC_PENTIUM           0x02
07502 #define PCI_SUBCLASS_PROC_ALPHA             0x10
07503 #define PCI_SUBCLASS_PROC_POWERPC           0x20
07504 #define PCI_SUBCLASS_PROC_COPROCESSOR       0x40
07505 
07506 /* PCI device subclasses for class C (serial bus controller)*/
07507 #define PCI_SUBCLASS_SB_IEEE1394            0x00
07508 #define PCI_SUBCLASS_SB_ACCESS              0x01
07509 #define PCI_SUBCLASS_SB_SSA                 0x02
07510 #define PCI_SUBCLASS_SB_USB                 0x03
07511 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL       0x04
07512 #define PCI_SUBCLASS_SB_SMBUS               0x05
07513 
07514 #define PCI_SUBCLASS_WIRELESS_IRDA          0x00
07515 #define PCI_SUBCLASS_WIRELESS_CON_IR        0x01
07516 #define PCI_SUBCLASS_WIRELESS_RF            0x10
07517 #define PCI_SUBCLASS_WIRELESS_OTHER         0x80
07518 
07519 #define PCI_SUBCLASS_INTIO_I2O              0x00
07520 
07521 #define PCI_SUBCLASS_SAT_TV                 0x01
07522 #define PCI_SUBCLASS_SAT_AUDIO              0x02
07523 #define PCI_SUBCLASS_SAT_VOICE              0x03
07524 #define PCI_SUBCLASS_SAT_DATA               0x04
07525 
07526 #define PCI_SUBCLASS_CRYPTO_NET_COMP        0x00
07527 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT   0x10
07528 #define PCI_SUBCLASS_CRYPTO_OTHER           0x80
07529 
07530 #define PCI_SUBCLASS_DASP_DPIO              0x00
07531 #define PCI_SUBCLASS_DASP_OTHER             0x80
07532 
07533 #define PCI_ADDRESS_IO_SPACE                0x00000001
07534 #define PCI_ADDRESS_MEMORY_TYPE_MASK        0x00000006
07535 #define PCI_ADDRESS_MEMORY_PREFETCHABLE     0x00000008
07536 #define PCI_ADDRESS_IO_ADDRESS_MASK         0xfffffffc
07537 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK     0xfffffff0
07538 #define PCI_ADDRESS_ROM_ADDRESS_MASK        0xfffff800
07539 
07540 #define PCI_TYPE_32BIT                      0
07541 #define PCI_TYPE_20BIT                      2
07542 #define PCI_TYPE_64BIT                      4
07543 
07544 #define PCI_ROMADDRESS_ENABLED              0x00000001
07545 
07546 #endif /* _PCI_X_ */
07547 
07548 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION       1
07549 
07550 _IRQL_requires_max_(PASSIVE_LEVEL)
07551 _Must_inspect_result_
07552 typedef NTSTATUS
07553 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
07554   _Inout_ PVOID Context);
07555 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
07556 
07557 _IRQL_requires_max_(PASSIVE_LEVEL)
07558 _Must_inspect_result_
07559 typedef NTSTATUS
07560 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
07561   _Inout_ PVOID Context);
07562 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
07563 
07564 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
07565   USHORT Size;
07566   USHORT Version;
07567   PVOID Context;
07568   PINTERFACE_REFERENCE InterfaceReference;
07569   PINTERFACE_DEREFERENCE InterfaceDereference;
07570   PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
07571   PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
07572 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
07573 
07574 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION            1
07575 
07576 typedef ULONG
07577 (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
07578   _In_ PVOID Context,
07579   _Out_writes_bytes_(Length) PVOID Buffer,
07580   _In_ ULONG Offset,
07581   _In_ ULONG Length);
07582 
07583 typedef ULONG
07584 (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
07585   _In_ PVOID Context,
07586   _In_reads_bytes_(Length) PVOID Buffer,
07587   _In_ ULONG Offset,
07588   _In_ ULONG Length);
07589 
07590 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
07591   USHORT Size;
07592   USHORT Version;
07593   PVOID Context;
07594   PINTERFACE_REFERENCE InterfaceReference;
07595   PINTERFACE_DEREFERENCE InterfaceDereference;
07596   PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
07597   PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
07598 } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
07599 
07600 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION            1
07601 
07602 _Must_inspect_result_
07603 typedef NTSTATUS
07604 (NTAPI PCI_MSIX_SET_ENTRY)(
07605   _In_ PVOID Context,
07606   _In_ ULONG TableEntry,
07607   _In_ ULONG MessageNumber);
07608 typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
07609 
07610 _Must_inspect_result_
07611 typedef NTSTATUS
07612 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
07613   _In_ PVOID Context,
07614   _In_ ULONG TableEntry);
07615 typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
07616 
07617 _Must_inspect_result_
07618 typedef NTSTATUS
07619 (NTAPI PCI_MSIX_GET_ENTRY)(
07620   _In_ PVOID Context,
07621   _In_ ULONG TableEntry,
07622   _Out_ PULONG MessageNumber,
07623   _Out_ PBOOLEAN Masked);
07624 typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
07625 
07626 _Must_inspect_result_
07627 typedef NTSTATUS
07628 (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
07629   _In_ PVOID Context,
07630   _Out_ PULONG TableSize);
07631 typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
07632 
07633 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
07634   USHORT Size;
07635   USHORT Version;
07636   PVOID Context;
07637   PINTERFACE_REFERENCE InterfaceReference;
07638   PINTERFACE_DEREFERENCE InterfaceDereference;
07639   PPCI_MSIX_SET_ENTRY SetTableEntry;
07640   PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
07641   PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
07642   PPCI_MSIX_GET_ENTRY GetTableEntry;
07643   PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
07644 } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
07645 
07646 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
07647         RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
07648 
07649 /******************************************************************************
07650  *                            Object Manager Types                            *
07651  ******************************************************************************/
07652 
07653 #define MAXIMUM_FILENAME_LENGTH           256
07654 #define OBJ_NAME_PATH_SEPARATOR           ((WCHAR)L'\\')
07655 
07656 #define OBJECT_TYPE_CREATE                0x0001
07657 #define OBJECT_TYPE_ALL_ACCESS            (STANDARD_RIGHTS_REQUIRED | 0x1)
07658 
07659 #define DIRECTORY_QUERY                   0x0001
07660 #define DIRECTORY_TRAVERSE                0x0002
07661 #define DIRECTORY_CREATE_OBJECT           0x0004
07662 #define DIRECTORY_CREATE_SUBDIRECTORY     0x0008
07663 #define DIRECTORY_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED | 0xF)
07664 
07665 #define SYMBOLIC_LINK_QUERY               0x0001
07666 #define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)
07667 
07668 #define DUPLICATE_CLOSE_SOURCE            0x00000001
07669 #define DUPLICATE_SAME_ACCESS             0x00000002
07670 #define DUPLICATE_SAME_ATTRIBUTES         0x00000004
07671 
07672 #define OB_FLT_REGISTRATION_VERSION_0100  0x0100
07673 #define OB_FLT_REGISTRATION_VERSION       OB_FLT_REGISTRATION_VERSION_0100
07674 
07675 typedef ULONG OB_OPERATION;
07676 
07677 #define OB_OPERATION_HANDLE_CREATE        0x00000001
07678 #define OB_OPERATION_HANDLE_DUPLICATE     0x00000002
07679 
07680 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {
07681   _Inout_ ACCESS_MASK DesiredAccess;
07682   _In_ ACCESS_MASK OriginalDesiredAccess;
07683 } OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION;
07684 
07685 typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION {
07686   _Inout_ ACCESS_MASK DesiredAccess;
07687   _In_ ACCESS_MASK OriginalDesiredAccess;
07688   _In_ PVOID SourceProcess;
07689   _In_ PVOID TargetProcess;
07690 } OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION;
07691 
07692 typedef union _OB_PRE_OPERATION_PARAMETERS {
07693   _Inout_ OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation;
07694   _Inout_ OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
07695 } OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS;
07696 
07697 typedef struct _OB_PRE_OPERATION_INFORMATION {
07698   _In_ OB_OPERATION Operation;
07699   _ANONYMOUS_UNION union {
07700     _In_ ULONG Flags;
07701     _ANONYMOUS_STRUCT struct {
07702       _In_ ULONG KernelHandle:1;
07703       _In_ ULONG Reserved:31;
07704     } DUMMYSTRUCTNAME;
07705   } DUMMYUNIONNAME;
07706   _In_ PVOID Object;
07707   _In_ POBJECT_TYPE ObjectType;
07708   _Out_ PVOID CallContext;
07709   _In_ POB_PRE_OPERATION_PARAMETERS Parameters;
07710 } OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION;
07711 
07712 typedef struct _OB_POST_CREATE_HANDLE_INFORMATION {
07713   _In_ ACCESS_MASK GrantedAccess;
07714 } OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION;
07715 
07716 typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION {
07717   _In_ ACCESS_MASK GrantedAccess;
07718 } OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION;
07719 
07720 typedef union _OB_POST_OPERATION_PARAMETERS {
07721   _In_ OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation;
07722   _In_ OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
07723 } OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS;
07724 
07725 typedef struct _OB_POST_OPERATION_INFORMATION {
07726   _In_ OB_OPERATION Operation;
07727   _ANONYMOUS_UNION union {
07728     _In_ ULONG Flags;
07729     _ANONYMOUS_STRUCT struct {
07730       _In_ ULONG KernelHandle:1;
07731       _In_ ULONG Reserved:31;
07732     } DUMMYSTRUCTNAME;
07733   } DUMMYUNIONNAME;
07734   _In_ PVOID Object;
07735   _In_ POBJECT_TYPE ObjectType;
07736   _In_ PVOID CallContext;
07737   _In_ NTSTATUS ReturnStatus;
07738   _In_ POB_POST_OPERATION_PARAMETERS Parameters;
07739 } OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION;
07740 
07741 typedef enum _OB_PREOP_CALLBACK_STATUS {
07742   OB_PREOP_SUCCESS
07743 } OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS;
07744 
07745 typedef OB_PREOP_CALLBACK_STATUS
07746 (NTAPI *POB_PRE_OPERATION_CALLBACK)(
07747   _In_ PVOID RegistrationContext,
07748   _Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation);
07749 
07750 typedef VOID
07751 (NTAPI *POB_POST_OPERATION_CALLBACK)(
07752   _In_ PVOID RegistrationContext,
07753   _In_ POB_POST_OPERATION_INFORMATION OperationInformation);
07754 
07755 typedef struct _OB_OPERATION_REGISTRATION {
07756   _In_ POBJECT_TYPE *ObjectType;
07757   _In_ OB_OPERATION Operations;
07758   _In_ POB_PRE_OPERATION_CALLBACK PreOperation;
07759   _In_ POB_POST_OPERATION_CALLBACK PostOperation;
07760 } OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;
07761 
07762 typedef struct _OB_CALLBACK_REGISTRATION {
07763   _In_ USHORT Version;
07764   _In_ USHORT OperationRegistrationCount;
07765   _In_ UNICODE_STRING Altitude;
07766   _In_ PVOID RegistrationContext;
07767   _In_ OB_OPERATION_REGISTRATION *OperationRegistration;
07768 } OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
07769 
07770 typedef struct _OBJECT_NAME_INFORMATION {
07771   UNICODE_STRING Name;
07772 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
07773 
07774 /* Exported object types */
07775 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType;
07776 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
07777 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
07778 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
07779 extern POBJECT_TYPE NTSYSAPI PsThreadType;
07780 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
07781 extern POBJECT_TYPE NTSYSAPI PsProcessType;
07782 
07783 
07784 /******************************************************************************
07785  *                           Process Manager Types                            *
07786  ******************************************************************************/
07787 
07788 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001
07789 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
07790 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004
07791 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
07792 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
07793 
07794 /* Thread Access Rights */
07795 #define THREAD_TERMINATE                 0x0001
07796 #define THREAD_SUSPEND_RESUME            0x0002
07797 #define THREAD_ALERT                     0x0004
07798 #define THREAD_GET_CONTEXT               0x0008
07799 #define THREAD_SET_CONTEXT               0x0010
07800 #define THREAD_SET_INFORMATION           0x0020
07801 #define THREAD_SET_LIMITED_INFORMATION   0x0400
07802 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
07803 
07804 #define PROCESS_DUP_HANDLE               (0x0040)
07805 
07806 #if (NTDDI_VERSION >= NTDDI_VISTA)
07807 #define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
07808 #else
07809 #define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
07810 #endif
07811 
07812 #if (NTDDI_VERSION >= NTDDI_VISTA)
07813 #define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
07814 #else
07815 #define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
07816 #endif
07817 
07818 #define LOW_PRIORITY                      0
07819 #define LOW_REALTIME_PRIORITY             16
07820 #define HIGH_PRIORITY                     31
07821 #define MAXIMUM_PRIORITY                  32
07822 
07823 
07824 /******************************************************************************
07825  *                          WMI Library Support Types                         *
07826  ******************************************************************************/
07827 
07828 #ifdef RUN_WPP
07829 #include <evntrace.h>
07830 #include <stdarg.h>
07831 #endif
07832 
07833 #ifndef _TRACEHANDLE_DEFINED
07834 #define _TRACEHANDLE_DEFINED
07835 typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
07836 #endif
07837 
07838 #ifndef TRACE_INFORMATION_CLASS_DEFINE
07839 
07840 typedef struct _ETW_TRACE_SESSION_SETTINGS {
07841   ULONG Version;
07842   ULONG BufferSize;
07843   ULONG MinimumBuffers;
07844   ULONG MaximumBuffers;
07845   ULONG LoggerMode;
07846   ULONG FlushTimer;
07847   ULONG FlushThreshold;
07848   ULONG ClockType;
07849 } ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS;
07850 
07851 typedef enum _TRACE_INFORMATION_CLASS {
07852   TraceIdClass,
07853   TraceHandleClass,
07854   TraceEnableFlagsClass,
07855   TraceEnableLevelClass,
07856   GlobalLoggerHandleClass,
07857   EventLoggerHandleClass,
07858   AllLoggerHandlesClass,
07859   TraceHandleByNameClass,
07860   LoggerEventsLostClass,
07861   TraceSessionSettingsClass,
07862   LoggerEventsLoggedClass,
07863   MaxTraceInformationClass
07864 } TRACE_INFORMATION_CLASS;
07865 
07866 #endif /* TRACE_INFORMATION_CLASS_DEFINE */
07867 
07868 #ifndef _ETW_KM_
07869 #define _ETW_KM_
07870 #endif
07871 
07872 #include <evntprov.h>
07873 
07874 _IRQL_requires_same_
07875 typedef VOID
07876 (NTAPI *PETWENABLECALLBACK)(
07877   _In_ LPCGUID SourceId,
07878   _In_ ULONG ControlCode,
07879   _In_ UCHAR Level,
07880   _In_ ULONGLONG MatchAnyKeyword,
07881   _In_ ULONGLONG MatchAllKeyword,
07882   _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData,
07883   _Inout_opt_ PVOID CallbackContext);
07884 
07885 #define EVENT_WRITE_FLAG_NO_FAULTING             0x00000001
07886 
07887 
07888 /******************************************************************************
07889  *                         Runtime Library Functions                          *
07890  ******************************************************************************/
07891 
07892 
07893 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
07894 
07895 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
07896 
07897 FORCEINLINE
07898 VOID
07899 InitializeListHead(
07900   _Out_ PLIST_ENTRY ListHead)
07901 {
07902   ListHead->Flink = ListHead->Blink = ListHead;
07903 }
07904 
07905 _Must_inspect_result_
07906 FORCEINLINE
07907 BOOLEAN
07908 IsListEmpty(
07909   _In_ const LIST_ENTRY * ListHead)
07910 {
07911   return (BOOLEAN)(ListHead->Flink == ListHead);
07912 }
07913 
07914 FORCEINLINE
07915 BOOLEAN
07916 RemoveEntryList(
07917   _In_ PLIST_ENTRY Entry)
07918 {
07919   PLIST_ENTRY OldFlink;
07920   PLIST_ENTRY OldBlink;
07921 
07922   OldFlink = Entry->Flink;
07923   OldBlink = Entry->Blink;
07924   OldFlink->Blink = OldBlink;
07925   OldBlink->Flink = OldFlink;
07926   return (BOOLEAN)(OldFlink == OldBlink);
07927 }
07928 
07929 FORCEINLINE
07930 PLIST_ENTRY
07931 RemoveHeadList(
07932   _Inout_ PLIST_ENTRY ListHead)
07933 {
07934   PLIST_ENTRY Flink;
07935   PLIST_ENTRY Entry;
07936 
07937   Entry = ListHead->Flink;
07938   Flink = Entry->Flink;
07939   ListHead->Flink = Flink;
07940   Flink->Blink = ListHead;
07941   return Entry;
07942 }
07943 
07944 FORCEINLINE
07945 PLIST_ENTRY
07946 RemoveTailList(
07947   _Inout_ PLIST_ENTRY ListHead)
07948 {
07949   PLIST_ENTRY Blink;
07950   PLIST_ENTRY Entry;
07951 
07952   Entry = ListHead->Blink;
07953   Blink = Entry->Blink;
07954   ListHead->Blink = Blink;
07955   Blink->Flink = ListHead;
07956   return Entry;
07957 }
07958 
07959 FORCEINLINE
07960 VOID
07961 InsertTailList(
07962   _Inout_ PLIST_ENTRY ListHead,
07963   _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
07964 {
07965   PLIST_ENTRY OldBlink;
07966   OldBlink = ListHead->Blink;
07967   Entry->Flink = ListHead;
07968   Entry->Blink = OldBlink;
07969   OldBlink->Flink = Entry;
07970   ListHead->Blink = Entry;
07971 }
07972 
07973 FORCEINLINE
07974 VOID
07975 InsertHeadList(
07976   _Inout_ PLIST_ENTRY ListHead,
07977   _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
07978 {
07979   PLIST_ENTRY OldFlink;
07980   OldFlink = ListHead->Flink;
07981   Entry->Flink = OldFlink;
07982   Entry->Blink = ListHead;
07983   OldFlink->Blink = Entry;
07984   ListHead->Flink = Entry;
07985 }
07986 
07987 FORCEINLINE
07988 VOID
07989 AppendTailList(
07990   _Inout_ PLIST_ENTRY ListHead,
07991   _Inout_ PLIST_ENTRY ListToAppend)
07992 {
07993   PLIST_ENTRY ListEnd = ListHead->Blink;
07994 
07995   ListHead->Blink->Flink = ListToAppend;
07996   ListHead->Blink = ListToAppend->Blink;
07997   ListToAppend->Blink->Flink = ListHead;
07998   ListToAppend->Blink = ListEnd;
07999 }
08000 
08001 FORCEINLINE
08002 PSINGLE_LIST_ENTRY
08003 PopEntryList(
08004   _Inout_ PSINGLE_LIST_ENTRY ListHead)
08005 {
08006   PSINGLE_LIST_ENTRY FirstEntry;
08007   FirstEntry = ListHead->Next;
08008   if (FirstEntry != NULL) {
08009     ListHead->Next = FirstEntry->Next;
08010   }
08011   return FirstEntry;
08012 }
08013 
08014 FORCEINLINE
08015 VOID
08016 PushEntryList(
08017   _Inout_ PSINGLE_LIST_ENTRY ListHead,
08018   _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry)
08019 {
08020   Entry->Next = ListHead->Next;
08021   ListHead->Next = Entry;
08022 }
08023 
08024 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
08025 
08026 __analysis_noreturn
08027 NTSYSAPI
08028 VOID
08029 NTAPI
08030 RtlAssert(
08031   _In_ PVOID FailedAssertion,
08032   _In_ PVOID FileName,
08033   _In_ ULONG LineNumber,
08034   _In_opt_ PSTR Message);
08035 
08036 /* VOID
08037  * RtlCopyMemory(
08038  *     IN VOID UNALIGNED *Destination,
08039  *     IN CONST VOID UNALIGNED *Source,
08040  *     IN SIZE_T Length)
08041  */
08042 #define RtlCopyMemory(Destination, Source, Length) \
08043     memcpy(Destination, Source, Length)
08044 
08045 #define RtlCopyBytes RtlCopyMemory
08046 
08047 #if defined(_M_AMD64)
08048 NTSYSAPI
08049 VOID
08050 NTAPI
08051 RtlCopyMemoryNonTemporal(
08052   _Out_writes_bytes_all_(Length) VOID UNALIGNED *Destination,
08053   _In_reads_bytes_(Length) const VOID UNALIGNED *Source,
08054   _In_ SIZE_T Length);
08055 #else
08056 #define RtlCopyMemoryNonTemporal RtlCopyMemory
08057 #endif
08058 
08059 /* BOOLEAN
08060  * RtlEqualLuid(
08061  *     IN PLUID Luid1,
08062  *     IN PLUID Luid2)
08063  */
08064 #define RtlEqualLuid(Luid1, Luid2) \
08065     (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
08066 
08067 /* LOGICAL
08068  * RtlEqualMemory(
08069  *     IN VOID UNALIGNED *Destination,
08070  *     IN CONST VOID UNALIGNED *Source,
08071  *     IN SIZE_T Length)
08072  */
08073 #define RtlEqualMemory(Destination, Source, Length) \
08074     (!memcmp(Destination, Source, Length))
08075 
08076 /* VOID
08077  * RtlFillMemory(
08078  *     IN VOID UNALIGNED *Destination,
08079  *     IN SIZE_T Length,
08080  *     IN UCHAR Fill)
08081  */
08082 #define RtlFillMemory(Destination, Length, Fill) \
08083     memset(Destination, Fill, Length)
08084 
08085 #define RtlFillBytes RtlFillMemory
08086 
08087 _IRQL_requires_max_(PASSIVE_LEVEL)
08088 NTSYSAPI
08089 VOID
08090 NTAPI
08091 RtlFreeUnicodeString(
08092   _Inout_ _At_(UnicodeString->Buffer, __drv_freesMem(Mem))
08093     PUNICODE_STRING UnicodeString);
08094 
08095 _IRQL_requires_max_(PASSIVE_LEVEL)
08096 _Must_inspect_result_
08097 NTSYSAPI
08098 NTSTATUS
08099 NTAPI
08100 RtlGUIDFromString(
08101   _In_ PUNICODE_STRING GuidString,
08102   _Out_ GUID *Guid);
08103 
08104 _IRQL_requires_max_(DISPATCH_LEVEL)
08105 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
08106 //_At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
08107 _At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR)))
08108 NTSYSAPI
08109 VOID
08110 NTAPI
08111 RtlInitUnicodeString(
08112   _Out_ PUNICODE_STRING DestinationString,
08113   _In_opt_z_ __drv_aliasesMem PCWSTR SourceString);
08114 
08115 /* VOID
08116  * RtlMoveMemory(
08117  *    IN VOID UNALIGNED *Destination,
08118  *    IN CONST VOID UNALIGNED *Source,
08119  *    IN SIZE_T Length)
08120  */
08121 #define RtlMoveMemory(Destination, Source, Length) \
08122     memmove(Destination, Source, Length)
08123 
08124 _IRQL_requires_max_(PASSIVE_LEVEL)
08125 _Must_inspect_result_
08126 NTSYSAPI
08127 NTSTATUS
08128 NTAPI
08129 RtlStringFromGUID(
08130   _In_ REFGUID Guid,
08131   _Out_ _At_(GuidString->Buffer, __drv_allocatesMem(Mem))
08132     PUNICODE_STRING GuidString);
08133 
08134 /* VOID
08135  * RtlZeroMemory(
08136  *     IN VOID UNALIGNED *Destination,
08137  *     IN SIZE_T Length)
08138  */
08139 #define RtlZeroMemory(Destination, Length) \
08140     memset(Destination, 0, Length)
08141 
08142 #define RtlZeroBytes RtlZeroMemory
08143 
08144 #if (NTDDI_VERSION >= NTDDI_WIN2K)
08145 
08146 _Must_inspect_result_
08147 NTSYSAPI
08148 BOOLEAN
08149 NTAPI
08150 RtlAreBitsClear(
08151   _In_ PRTL_BITMAP BitMapHeader,
08152   _In_ ULONG StartingIndex,
08153   _In_ ULONG Length);
08154 
08155 _Must_inspect_result_
08156 NTSYSAPI
08157 BOOLEAN
08158 NTAPI
08159 RtlAreBitsSet(
08160   _In_ PRTL_BITMAP BitMapHeader,
08161   _In_ ULONG StartingIndex,
08162   _In_ ULONG Length);
08163 
08164 _IRQL_requires_max_(PASSIVE_LEVEL)
08165 _Must_inspect_result_
08166 NTSYSAPI
08167 NTSTATUS
08168 NTAPI
08169 RtlAnsiStringToUnicodeString(
08170   _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
08171   _When_(!AllocateDestinationString, _Inout_)
08172     PUNICODE_STRING DestinationString,
08173   _In_ PANSI_STRING SourceString,
08174   _In_ BOOLEAN AllocateDestinationString);
08175 
08176 _IRQL_requires_max_(PASSIVE_LEVEL)
08177 NTSYSAPI
08178 ULONG
08179 NTAPI
08180 RtlxAnsiStringToUnicodeSize(
08181   _In_ PCANSI_STRING AnsiString);
08182 
08183 #define RtlAnsiStringToUnicodeSize(String) (               \
08184   NLS_MB_CODE_PAGE_TAG ?                                   \
08185   RtlxAnsiStringToUnicodeSize(String) :                    \
08186   ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
08187 )
08188 
08189 _Success_(1)
08190 _Unchanged_(Destination->MaximumLength)
08191 _Unchanged_(Destination->Buffer)
08192 _When_(_Old_(Destination->Length) + Source->Length <= Destination->MaximumLength,
08193   _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + Source->Length))
08194   _At_(return, _Out_range_(==, 0)))
08195 _When_(_Old_(Destination->Length) + Source->Length > Destination->MaximumLength,
08196   _Unchanged_(Destination->Length)
08197   _At_(return, _Out_range_(<, 0)))
08198 NTSYSAPI
08199 NTSTATUS
08200 NTAPI
08201 RtlAppendUnicodeStringToString(
08202   _Inout_ PUNICODE_STRING Destination,
08203   _In_ PCUNICODE_STRING Source);
08204 
08205 _Success_(1)
08206 _Unchanged_(Destination->MaximumLength)
08207 _Unchanged_(Destination->Buffer)
08208 /* _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) <= Destination->MaximumLength,
08209   _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR)))
08210   _At_(return, _Out_range_(==, 0)))
08211 _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) > Destination->MaximumLength,
08212   _Unchanged_(Destination->Length)
08213   _At_(return, _Out_range_(<, 0))) */
08214 NTSYSAPI
08215 NTSTATUS
08216 NTAPI
08217 RtlAppendUnicodeToString(
08218   _Inout_ PUNICODE_STRING Destination,
08219   _In_opt_z_ PCWSTR Source);
08220 
08221 _IRQL_requires_max_(PASSIVE_LEVEL)
08222 _Must_inspect_result_
08223 NTSYSAPI
08224 NTSTATUS
08225 NTAPI
08226 RtlCheckRegistryKey(
08227   _In_ ULONG RelativeTo,
08228   _In_ PWSTR Path);
08229 
08230 NTSYSAPI
08231 VOID
08232 NTAPI
08233 RtlClearAllBits(
08234   _In_ PRTL_BITMAP BitMapHeader);
08235 
08236 NTSYSAPI
08237 VOID
08238 NTAPI
08239 RtlClearBits(
08240   _In_ PRTL_BITMAP BitMapHeader,
08241   _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,
08242   _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear);
08243 
08244 _Must_inspect_result_
08245 NTSYSAPI
08246 SIZE_T
08247 NTAPI
08248 RtlCompareMemory(
08249   _In_ const VOID *Source1,
08250   _In_ const VOID *Source2,
08251   _In_ SIZE_T Length);
08252 
08253 _IRQL_requires_max_(PASSIVE_LEVEL)
08254 _Must_inspect_result_
08255 NTSYSAPI
08256 LONG
08257 NTAPI
08258 RtlCompareUnicodeString(
08259   _In_ PCUNICODE_STRING String1,
08260   _In_ PCUNICODE_STRING String2,
08261   _In_ BOOLEAN CaseInSensitive);
08262 
08263 _IRQL_requires_max_(PASSIVE_LEVEL)
08264 _Must_inspect_result_
08265 NTSYSAPI
08266 LONG
08267 NTAPI
08268 RtlCompareUnicodeStrings(
08269   _In_reads_(String1Length) PCWCH String1,
08270   _In_ SIZE_T String1Length,
08271   _In_reads_(String2Length) PCWCH String2,
08272   _In_ SIZE_T String2Length,
08273   _In_ BOOLEAN CaseInSensitive);
08274 
08275 _Unchanged_(DestinationString->Buffer)
08276 _Unchanged_(DestinationString->MaximumLength)
08277 _At_(DestinationString->Length,
08278   _When_(SourceString->Length > DestinationString->MaximumLength,
08279     _Post_equal_to_(DestinationString->MaximumLength))
08280   _When_(SourceString->Length <= DestinationString->MaximumLength,
08281     _Post_equal_to_(SourceString->Length)))
08282 NTSYSAPI
08283 VOID
08284 NTAPI
08285 RtlCopyUnicodeString(
08286   _Inout_ PUNICODE_STRING DestinationString,
08287   _In_opt_ PCUNICODE_STRING SourceString);
08288 
08289 _IRQL_requires_max_(PASSIVE_LEVEL)
08290 NTSYSAPI
08291 NTSTATUS
08292 NTAPI
08293 RtlCreateRegistryKey(
08294   _In_ ULONG RelativeTo,
08295   _In_ PWSTR Path);
08296 
08297 _IRQL_requires_max_(APC_LEVEL)
08298 NTSYSAPI
08299 NTSTATUS
08300 NTAPI
08301 RtlCreateSecurityDescriptor(
08302   _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor,
08303   _In_ ULONG Revision);
08304 
08305 _IRQL_requires_max_(PASSIVE_LEVEL)
08306 NTSYSAPI
08307 NTSTATUS
08308 NTAPI
08309 RtlDeleteRegistryValue(
08310   _In_ ULONG RelativeTo,
08311   _In_ PCWSTR Path,
08312   _In_z_ PCWSTR ValueName);
08313 
08314 _IRQL_requires_max_(PASSIVE_LEVEL)
08315 _Must_inspect_result_
08316 NTSYSAPI
08317 BOOLEAN
08318 NTAPI
08319 RtlEqualUnicodeString(
08320   _In_ CONST UNICODE_STRING *String1,
08321   _In_ CONST UNICODE_STRING *String2,
08322   _In_ BOOLEAN CaseInSensitive);
08323 
08324 #if !defined(_AMD64_) && !defined(_IA64_)
08325 NTSYSAPI
08326 LARGE_INTEGER
08327 NTAPI
08328 RtlExtendedIntegerMultiply(
08329   _In_ LARGE_INTEGER Multiplicand,
08330   _In_ LONG Multiplier);
08331 
08332 NTSYSAPI
08333 LARGE_INTEGER
08334 NTAPI
08335 RtlExtendedLargeIntegerDivide(
08336   _In_ LARGE_INTEGER Dividend,
08337   _In_ ULONG Divisor,
08338   _Out_opt_ PULONG Remainder);
08339 #endif
08340 
08341 #if defined(_X86_) || defined(_IA64_)
08342 NTSYSAPI
08343 LARGE_INTEGER
08344 NTAPI
08345 RtlExtendedMagicDivide(
08346     _In_ LARGE_INTEGER Dividend,
08347     _In_ LARGE_INTEGER MagicDivisor,
08348     _In_ CCHAR  ShiftCount);
08349 #endif
08350 
08351 _IRQL_requires_max_(PASSIVE_LEVEL)
08352 NTSYSAPI
08353 VOID
08354 NTAPI
08355 RtlFreeAnsiString(
08356   _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem))
08357     PANSI_STRING AnsiString);
08358 
08359 _Success_(return != -1)
08360 _Must_inspect_result_
08361 NTSYSAPI
08362 ULONG
08363 NTAPI
08364 RtlFindClearBits(
08365   _In_ PRTL_BITMAP BitMapHeader,
08366   _In_ ULONG NumberToFind,
08367   _In_ ULONG HintIndex);
08368 
08369 _Success_(return != -1)
08370 NTSYSAPI
08371 ULONG
08372 NTAPI
08373 RtlFindClearBitsAndSet(
08374   _In_ PRTL_BITMAP BitMapHeader,
08375   _In_ ULONG NumberToFind,
08376   _In_ ULONG HintIndex);
08377 
08378 NTSYSAPI
08379 ULONG
08380 NTAPI
08381 RtlFindFirstRunClear(
08382   _In_ PRTL_BITMAP BitMapHeader,
08383   _Out_ PULONG StartingIndex);
08384 
08385 NTSYSAPI
08386 ULONG
08387 NTAPI
08388 RtlFindClearRuns(
08389   _In_ PRTL_BITMAP BitMapHeader,
08390   _Out_writes_to_(SizeOfRunArray, return) PRTL_BITMAP_RUN RunArray,
08391   _In_range_(>, 0) ULONG SizeOfRunArray,
08392   _In_ BOOLEAN LocateLongestRuns);
08393 
08394 NTSYSAPI
08395 ULONG
08396 NTAPI
08397 RtlFindLastBackwardRunClear(
08398   _In_ PRTL_BITMAP BitMapHeader,
08399   _In_ ULONG FromIndex,
08400   _Out_ PULONG StartingRunIndex);
08401 
08402 _Success_(return != -1)
08403 _Must_inspect_result_
08404 NTSYSAPI
08405 CCHAR
08406 NTAPI
08407 RtlFindLeastSignificantBit(
08408   _In_ ULONGLONG Set);
08409 
08410 NTSYSAPI
08411 ULONG
08412 NTAPI
08413 RtlFindLongestRunClear(
08414   _In_ PRTL_BITMAP BitMapHeader,
08415   _Out_ PULONG StartingIndex);
08416 
08417 _Success_(return != -1)
08418 _Must_inspect_result_
08419 NTSYSAPI
08420 CCHAR
08421 NTAPI
08422 RtlFindMostSignificantBit(
08423   _In_ ULONGLONG Set);
08424 
08425 NTSYSAPI
08426 ULONG
08427 NTAPI
08428 RtlFindNextForwardRunClear(
08429   _In_ PRTL_BITMAP BitMapHeader,
08430   _In_ ULONG FromIndex,
08431   _Out_ PULONG StartingRunIndex);
08432 
08433 _Success_(return != -1)
08434 _Must_inspect_result_
08435 NTSYSAPI
08436 ULONG
08437 NTAPI
08438 RtlFindSetBits(
08439   _In_ PRTL_BITMAP BitMapHeader,
08440   _In_ ULONG NumberToFind,
08441   _In_ ULONG HintIndex);
08442 
08443 _Success_(return != -1)
08444 NTSYSAPI
08445 ULONG
08446 NTAPI
08447 RtlFindSetBitsAndClear(
08448   _In_ PRTL_BITMAP BitMapHeader,
08449   _In_ ULONG NumberToFind,
08450   _In_ ULONG HintIndex);
08451 
08452 _IRQL_requires_max_(DISPATCH_LEVEL)
08453 NTSYSAPI
08454 VOID
08455 NTAPI
08456 RtlInitAnsiString(
08457   _Out_ PANSI_STRING DestinationString,
08458   _In_opt_z_ __drv_aliasesMem PCSZ SourceString);
08459 
08460 NTSYSAPI
08461 VOID
08462 NTAPI
08463 RtlInitializeBitMap(
08464   _Out_ PRTL_BITMAP BitMapHeader,
08465   _In_ __drv_aliasesMem PULONG BitMapBuffer,
08466   _In_ ULONG SizeOfBitMap);
08467 
08468 _IRQL_requires_max_(DISPATCH_LEVEL)
08469 NTSYSAPI
08470 VOID
08471 NTAPI
08472 RtlInitString(
08473   _Out_ PSTRING DestinationString,
08474   _In_opt_z_ __drv_aliasesMem PCSZ SourceString);
08475 
08476 _IRQL_requires_max_(PASSIVE_LEVEL)
08477 _At_(String->MaximumLength, _Const_)
08478 NTSYSAPI
08479 NTSTATUS
08480 NTAPI
08481 RtlIntegerToUnicodeString(
08482   _In_ ULONG Value,
08483   _In_opt_ ULONG Base,
08484   _Inout_ PUNICODE_STRING String);
08485 
08486 _IRQL_requires_max_(PASSIVE_LEVEL)
08487 _At_(String->MaximumLength, _Const_)
08488 NTSYSAPI
08489 NTSTATUS
08490 NTAPI
08491 RtlInt64ToUnicodeString(
08492   _In_ ULONGLONG Value,
08493   _In_opt_ ULONG Base,
08494   _Inout_ PUNICODE_STRING String);
08495 
08496 #ifdef _WIN64
08497 #define RtlIntPtrToUnicodeString(Value, Base, String) \
08498     RtlInt64ToUnicodeString(Value, Base, String)
08499 #else
08500 #define RtlIntPtrToUnicodeString(Value, Base, String) \
08501     RtlIntegerToUnicodeString(Value, Base, String)
08502 #endif
08503 
08504 /* BOOLEAN
08505  * RtlIsZeroLuid(
08506  *     IN PLUID L1);
08507  */
08508 #define RtlIsZeroLuid(_L1) \
08509     ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
08510 
08511 _IRQL_requires_max_(APC_LEVEL)
08512 NTSYSAPI
08513 ULONG
08514 NTAPI
08515 RtlLengthSecurityDescriptor(
08516   _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
08517 
08518 NTSYSAPI
08519 ULONG
08520 NTAPI
08521 RtlNumberOfClearBits(
08522   _In_ PRTL_BITMAP BitMapHeader);
08523 
08524 NTSYSAPI
08525 ULONG
08526 NTAPI
08527 RtlNumberOfSetBits(
08528   _In_ PRTL_BITMAP BitMapHeader);
08529 
08530 _IRQL_requires_max_(PASSIVE_LEVEL)
08531 NTSYSAPI
08532 NTSTATUS
08533 NTAPI
08534 RtlQueryRegistryValues(
08535   _In_ ULONG RelativeTo,
08536   _In_ PCWSTR Path,
08537   _Inout_ _At_(*(*QueryTable).EntryContext, _Post_valid_)
08538     PRTL_QUERY_REGISTRY_TABLE QueryTable,
08539   _In_opt_ PVOID Context,
08540   _In_opt_ PVOID Environment);
08541 
08542 #define SHORT_SIZE  (sizeof(USHORT))
08543 #define SHORT_MASK  (SHORT_SIZE - 1)
08544 #define LONG_SIZE (sizeof(LONG))
08545 #define LONGLONG_SIZE   (sizeof(LONGLONG))
08546 #define LONG_MASK (LONG_SIZE - 1)
08547 #define LONGLONG_MASK   (LONGLONG_SIZE - 1)
08548 #define LOWBYTE_MASK 0x00FF
08549 
08550 #define FIRSTBYTE(VALUE)  ((VALUE) & LOWBYTE_MASK)
08551 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
08552 #define THIRDBYTE(VALUE)  (((VALUE) >> 16) & LOWBYTE_MASK)
08553 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
08554 
08555 NTSYSAPI
08556 VOID
08557 NTAPI
08558 RtlSetAllBits(
08559   _In_ PRTL_BITMAP BitMapHeader);
08560 
08561 NTSYSAPI
08562 VOID
08563 NTAPI
08564 RtlSetBits(
08565   _In_ PRTL_BITMAP BitMapHeader,
08566   _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,
08567   _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet);
08568 
08569 _IRQL_requires_max_(APC_LEVEL)
08570 NTSYSAPI
08571 NTSTATUS
08572 NTAPI
08573 RtlSetDaclSecurityDescriptor(
08574   _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
08575   _In_ BOOLEAN DaclPresent,
08576   _In_opt_ PACL Dacl,
08577   _In_opt_ BOOLEAN DaclDefaulted);
08578 
08579 #if defined(_AMD64_)
08580 
08581 /* VOID
08582  * RtlStoreUlong(
08583  *     IN PULONG Address,
08584  *     IN ULONG Value);
08585  */
08586 #define RtlStoreUlong(Address,Value) \
08587     *(ULONG UNALIGNED *)(Address) = (Value)
08588 
08589 /* VOID
08590  * RtlStoreUlonglong(
08591  *     IN OUT PULONGLONG Address,
08592  *     ULONGLONG Value);
08593  */
08594 #define RtlStoreUlonglong(Address,Value) \
08595     *(ULONGLONG UNALIGNED *)(Address) = (Value)
08596 
08597 /* VOID
08598  * RtlStoreUshort(
08599  *     IN PUSHORT Address,
08600  *     IN USHORT Value);
08601  */
08602 #define RtlStoreUshort(Address,Value) \
08603     *(USHORT UNALIGNED *)(Address) = (Value)
08604 
08605 /* VOID
08606  * RtlRetrieveUshort(
08607  *     PUSHORT DestinationAddress,
08608  *    PUSHORT SourceAddress);
08609  */
08610 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
08611     *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
08612 
08613 /* VOID
08614  * RtlRetrieveUlong(
08615  *    PULONG DestinationAddress,
08616  *    PULONG SourceAddress);
08617  */
08618 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
08619     *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
08620 
08621 #else
08622 
08623 #define RtlStoreUlong(Address,Value)                      \
08624     if ((ULONG_PTR)(Address) & LONG_MASK) { \
08625         ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT]    = (UCHAR)(FIRSTBYTE(Value)); \
08626         ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
08627         ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
08628         ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT]     = (UCHAR)(FOURTHBYTE(Value)); \
08629     } \
08630     else { \
08631         *((PULONG)(Address)) = (ULONG) (Value); \
08632     }
08633 
08634 #define RtlStoreUlonglong(Address,Value) \
08635     if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
08636         RtlStoreUlong((ULONG_PTR)(Address), \
08637                       (ULONGLONG)(Value) & 0xFFFFFFFF); \
08638         RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
08639                       (ULONGLONG)(Value) >> 32); \
08640     } else { \
08641         *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
08642     }
08643 
08644 #define RtlStoreUshort(Address,Value) \
08645     if ((ULONG_PTR)(Address) & SHORT_MASK) { \
08646         ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
08647         ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
08648     } \
08649     else { \
08650         *((PUSHORT) (Address)) = (USHORT)Value; \
08651     }
08652 
08653 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
08654     if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
08655     { \
08656         ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
08657         ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
08658     } \
08659     else \
08660     { \
08661         *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
08662     }
08663 
08664 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
08665     if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
08666     { \
08667         ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
08668         ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
08669         ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
08670         ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
08671     } \
08672     else \
08673     { \
08674         *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
08675     }
08676 
08677 #endif /* defined(_AMD64_) */
08678 
08679 #ifdef _WIN64
08680 /* VOID
08681  * RtlStoreUlongPtr(
08682  *     IN OUT PULONG_PTR Address,
08683  *     IN ULONG_PTR Value);
08684  */
08685 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
08686 #else
08687 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
08688 #endif /* _WIN64 */
08689 
08690 _Success_(return != 0)
08691 NTSYSAPI
08692 BOOLEAN
08693 NTAPI
08694 RtlTimeFieldsToTime(
08695   _In_ PTIME_FIELDS TimeFields,
08696   _Out_ PLARGE_INTEGER Time);
08697 
08698 NTSYSAPI
08699 VOID
08700 NTAPI
08701 RtlTimeToTimeFields(
08702   _In_ PLARGE_INTEGER Time,
08703   _Out_ PTIME_FIELDS TimeFields);
08704 
08705 NTSYSAPI
08706 ULONG
08707 FASTCALL
08708 RtlUlongByteSwap(
08709   _In_ ULONG Source);
08710 
08711 NTSYSAPI
08712 ULONGLONG
08713 FASTCALL
08714 RtlUlonglongByteSwap(
08715   _In_ ULONGLONG Source);
08716 
08717 _When_(AllocateDestinationString,
08718   _At_(DestinationString->MaximumLength,
08719     _Out_range_(<=, (SourceString->MaximumLength / sizeof(WCHAR)))))
08720 _When_(!AllocateDestinationString,
08721   _At_(DestinationString->Buffer, _Const_)
08722   _At_(DestinationString->MaximumLength, _Const_))
08723 _IRQL_requires_max_(PASSIVE_LEVEL)
08724 _When_(AllocateDestinationString, _Must_inspect_result_)
08725 NTSYSAPI
08726 NTSTATUS
08727 NTAPI
08728 RtlUnicodeStringToAnsiString(
08729   _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
08730   _When_(!AllocateDestinationString, _Inout_)
08731     PANSI_STRING DestinationString,
08732   _In_ PCUNICODE_STRING SourceString,
08733   _In_ BOOLEAN AllocateDestinationString);
08734 
08735 _IRQL_requires_max_(PASSIVE_LEVEL)
08736 NTSYSAPI
08737 ULONG
08738 NTAPI
08739 RtlxUnicodeStringToAnsiSize(
08740   _In_ PCUNICODE_STRING UnicodeString);
08741 
08742 #define RtlUnicodeStringToAnsiSize(String) (                  \
08743     NLS_MB_CODE_PAGE_TAG ?                                    \
08744     RtlxUnicodeStringToAnsiSize(String) :                     \
08745     ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
08746 )
08747 
08748 _IRQL_requires_max_(PASSIVE_LEVEL)
08749 NTSYSAPI
08750 NTSTATUS
08751 NTAPI
08752 RtlUnicodeStringToInteger(
08753   _In_ PCUNICODE_STRING String,
08754   _In_opt_ ULONG Base,
08755   _Out_ PULONG Value);
08756 
08757 _IRQL_requires_max_(PASSIVE_LEVEL)
08758 NTSYSAPI
08759 WCHAR
08760 NTAPI
08761 RtlUpcaseUnicodeChar(
08762   _In_ WCHAR SourceCharacter);
08763 
08764 NTSYSAPI
08765 USHORT
08766 FASTCALL
08767 RtlUshortByteSwap(
08768   _In_ USHORT Source);
08769 
08770 _IRQL_requires_max_(APC_LEVEL)
08771 _Must_inspect_result_
08772 NTSYSAPI
08773 BOOLEAN
08774 NTAPI
08775 RtlValidRelativeSecurityDescriptor(
08776   _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput,
08777   _In_ ULONG SecurityDescriptorLength,
08778   _In_ SECURITY_INFORMATION RequiredInformation);
08779 
08780 _IRQL_requires_max_(APC_LEVEL)
08781 _Must_inspect_result_
08782 NTSYSAPI
08783 BOOLEAN
08784 NTAPI
08785 RtlValidSecurityDescriptor(
08786   _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
08787 
08788 _IRQL_requires_max_(PASSIVE_LEVEL)
08789 NTSYSAPI
08790 NTSTATUS
08791 NTAPI
08792 RtlWriteRegistryValue(
08793   _In_ ULONG RelativeTo,
08794   _In_ PCWSTR Path,
08795   _In_z_ PCWSTR ValueName,
08796   _In_ ULONG ValueType,
08797   _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
08798   _In_ ULONG ValueLength);
08799 
08800 
08801 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
08802 
08803 
08804 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
08805 NTSYSAPI
08806 VOID
08807 FASTCALL
08808 RtlPrefetchMemoryNonTemporal(
08809   _In_ PVOID Source,
08810   _In_ SIZE_T Length);
08811 #endif
08812 
08813 
08814 #if (NTDDI_VERSION >= NTDDI_WINXP)
08815 
08816 
08817 NTSYSAPI
08818 VOID
08819 NTAPI
08820 RtlClearBit(
08821   _In_ PRTL_BITMAP BitMapHeader,
08822   _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
08823 
08824 _IRQL_requires_max_(PASSIVE_LEVEL)
08825 NTSYSAPI
08826 WCHAR
08827 NTAPI
08828 RtlDowncaseUnicodeChar(
08829   _In_ WCHAR SourceCharacter);
08830 
08831 NTSYSAPI
08832 VOID
08833 NTAPI
08834 RtlSetBit(
08835   _In_ PRTL_BITMAP BitMapHeader,
08836   _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
08837 
08838 _Must_inspect_result_
08839 NTSYSAPI
08840 BOOLEAN
08841 NTAPI
08842 RtlTestBit(
08843   _In_ PRTL_BITMAP BitMapHeader,
08844   _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
08845 
08846 _IRQL_requires_max_(PASSIVE_LEVEL)
08847 NTSYSAPI
08848 NTSTATUS
08849 NTAPI
08850 RtlHashUnicodeString(
08851   _In_ CONST UNICODE_STRING *String,
08852   _In_ BOOLEAN CaseInSensitive,
08853   _In_ ULONG HashAlgorithm,
08854   _Out_ PULONG HashValue);
08855 
08856 
08857 
08858 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
08859 
08860 
08861 #if (NTDDI_VERSION >= NTDDI_VISTA)
08862 
08863 NTSYSAPI
08864 ULONG
08865 NTAPI
08866 RtlNumberOfSetBitsUlongPtr(
08867   _In_ ULONG_PTR Target);
08868 
08869 NTSYSAPI
08870 ULONGLONG
08871 NTAPI
08872 RtlIoDecodeMemIoResource(
08873   _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
08874   _Out_opt_ PULONGLONG Alignment,
08875   _Out_opt_ PULONGLONG MinimumAddress,
08876   _Out_opt_ PULONGLONG MaximumAddress);
08877 
08878 NTSYSAPI
08879 NTSTATUS
08880 NTAPI
08881 RtlIoEncodeMemIoResource(
08882   _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
08883   _In_ UCHAR Type,
08884   _In_ ULONGLONG Length,
08885   _In_ ULONGLONG Alignment,
08886   _In_ ULONGLONG MinimumAddress,
08887   _In_ ULONGLONG MaximumAddress);
08888 
08889 NTSYSAPI
08890 ULONGLONG
08891 NTAPI
08892 RtlCmDecodeMemIoResource(
08893   _In_ struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
08894   _Out_opt_ PULONGLONG Start);
08895 
08896 NTSYSAPI
08897 NTSTATUS
08898 NTAPI
08899 RtlFindClosestEncodableLength(
08900   _In_ ULONGLONG SourceLength,
08901   _Out_ PULONGLONG TargetLength);
08902 
08903 NTSYSAPI
08904 NTSTATUS
08905 NTAPI
08906 RtlCmEncodeMemIoResource(
08907   _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
08908   _In_ UCHAR Type,
08909   _In_ ULONGLONG Length,
08910   _In_ ULONGLONG Start);
08911 
08912 
08913 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
08914 
08915 #if (NTDDI_VERSION >= NTDDI_WIN7)
08916 
08917 _IRQL_requires_max_(PASSIVE_LEVEL)
08918 _Must_inspect_result_
08919 NTSYSAPI
08920 NTSTATUS
08921 NTAPI
08922 RtlUnicodeToUTF8N(
08923   _Out_writes_bytes_to_(UTF8StringMaxByteCount, *UTF8StringActualByteCount)
08924     PCHAR UTF8StringDestination,
08925   _In_ ULONG UTF8StringMaxByteCount,
08926   _Out_ PULONG UTF8StringActualByteCount,
08927   _In_reads_bytes_(UnicodeStringByteCount) PCWCH UnicodeStringSource,
08928   _In_ ULONG UnicodeStringByteCount);
08929 
08930 _IRQL_requires_max_(PASSIVE_LEVEL)
08931 _Must_inspect_result_
08932 NTSYSAPI
08933 NTSTATUS
08934 NTAPI
08935 RtlUTF8ToUnicodeN(
08936   _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount)
08937     PWSTR UnicodeStringDestination,
08938   _In_ ULONG UnicodeStringMaxByteCount,
08939   _Out_ PULONG UnicodeStringActualByteCount,
08940   _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource,
08941   _In_ ULONG UTF8StringByteCount);
08942 
08943 NTSYSAPI
08944 ULONG64
08945 NTAPI
08946 RtlGetEnabledExtendedFeatures(
08947   IN ULONG64 FeatureMask);
08948 
08949 
08950 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
08951 
08952 
08953 #if !defined(MIDL_PASS)
08954 /* inline funftions */
08955 //DECLSPEC_DEPRECATED_DDK_WINXP
08956 static __inline
08957 LARGE_INTEGER
08958 NTAPI_INLINE
08959 RtlConvertLongToLargeInteger(
08960   _In_ LONG SignedInteger)
08961 {
08962   LARGE_INTEGER ret;
08963   ret.QuadPart = SignedInteger;
08964   return ret;
08965 }
08966 
08967 //DECLSPEC_DEPRECATED_DDK_WINXP
08968 static __inline
08969 LARGE_INTEGER
08970 NTAPI_INLINE
08971 RtlConvertUlongToLargeInteger(
08972   _In_ ULONG UnsignedInteger)
08973 {
08974   LARGE_INTEGER ret;
08975   ret.QuadPart = UnsignedInteger;
08976   return ret;
08977 }
08978 
08979 //DECLSPEC_DEPRECATED_DDK_WINXP
08980 static __inline
08981 LARGE_INTEGER
08982 NTAPI_INLINE
08983 RtlLargeIntegerShiftLeft(
08984   _In_ LARGE_INTEGER LargeInteger,
08985   _In_ CCHAR ShiftCount)
08986 {
08987   LARGE_INTEGER Result;
08988 
08989   Result.QuadPart = LargeInteger.QuadPart << ShiftCount;
08990   return Result;
08991 }
08992 
08993 //DECLSPEC_DEPRECATED_DDK_WINXP
08994 static __inline
08995 LARGE_INTEGER
08996 NTAPI_INLINE
08997 RtlLargeIntegerShiftRight(
08998   _In_ LARGE_INTEGER LargeInteger,
08999   _In_ CCHAR ShiftCount)
09000 {
09001   LARGE_INTEGER Result;
09002 
09003   Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount;
09004   return Result;
09005 }
09006 
09007 //DECLSPEC_DEPRECATED_DDK
09008 static __inline
09009 ULONG
09010 NTAPI_INLINE
09011 RtlEnlargedUnsignedDivide(
09012   _In_ ULARGE_INTEGER Dividend,
09013   _In_ ULONG Divisor,
09014   _Out_opt_ PULONG Remainder)
09015 {
09016   if (Remainder)
09017     *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
09018   return (ULONG)(Dividend.QuadPart / Divisor);
09019 }
09020 
09021 //DECLSPEC_DEPRECATED_DDK
09022 static __inline
09023 LARGE_INTEGER
09024 NTAPI_INLINE
09025 RtlLargeIntegerNegate(
09026   _In_ LARGE_INTEGER Subtrahend)
09027 {
09028   LARGE_INTEGER Difference;
09029 
09030   Difference.QuadPart = -Subtrahend.QuadPart;
09031   return Difference;
09032 }
09033 
09034 //DECLSPEC_DEPRECATED_DDK
09035 static __inline
09036 LARGE_INTEGER
09037 NTAPI_INLINE
09038 RtlLargeIntegerSubtract(
09039   _In_ LARGE_INTEGER Minuend,
09040   _In_ LARGE_INTEGER Subtrahend)
09041 {
09042   LARGE_INTEGER Difference;
09043 
09044   Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
09045   return Difference;
09046 }
09047 
09048 //DECLSPEC_DEPRECATED_DDK
09049 static __inline
09050 LARGE_INTEGER
09051 NTAPI_INLINE
09052 RtlEnlargedUnsignedMultiply(
09053   _In_ ULONG Multiplicand,
09054   _In_ ULONG Multiplier)
09055 {
09056   LARGE_INTEGER ret;
09057   ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
09058   return ret;
09059 }
09060 
09061 //DECLSPEC_DEPRECATED_DDK
09062 static __inline
09063 LARGE_INTEGER
09064 NTAPI_INLINE
09065 RtlEnlargedIntegerMultiply(
09066   _In_ LONG Multiplicand,
09067   _In_ LONG Multiplier)
09068 {
09069   LARGE_INTEGER ret;
09070   ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
09071   return ret;
09072 }
09073 
09074 _At_(AnsiString->Buffer, _Post_equal_to_(Buffer))
09075 _At_(AnsiString->Length, _Post_equal_to_(0))
09076 _At_(AnsiString->MaximumLength, _Post_equal_to_(BufferSize))
09077 FORCEINLINE
09078 VOID
09079 RtlInitEmptyAnsiString(
09080   _Out_ PANSI_STRING AnsiString,
09081   _Pre_maybenull_ _Pre_readable_size_(BufferSize) __drv_aliasesMem PCHAR Buffer,
09082   _In_ USHORT BufferSize)
09083 {
09084   AnsiString->Length = 0;
09085   AnsiString->MaximumLength = BufferSize;
09086   AnsiString->Buffer = Buffer;
09087 }
09088 
09089 _At_(UnicodeString->Buffer, _Post_equal_to_(Buffer))
09090 _At_(UnicodeString->Length, _Post_equal_to_(0))
09091 _At_(UnicodeString->MaximumLength, _Post_equal_to_(BufferSize))
09092 FORCEINLINE
09093 VOID
09094 RtlInitEmptyUnicodeString(
09095     _Out_ PUNICODE_STRING UnicodeString,
09096     _Writable_bytes_(BufferSize)
09097     _When_(BufferSize != 0, _Notnull_)
09098     __drv_aliasesMem PWSTR Buffer,
09099     _In_ USHORT BufferSize)
09100 {
09101     UnicodeString->Length = 0;
09102     UnicodeString->MaximumLength = BufferSize;
09103     UnicodeString->Buffer = Buffer;
09104 }
09105 
09106 #if defined(_AMD64_) || defined(_IA64_)
09107 
09108 
09109 static __inline
09110 LARGE_INTEGER
09111 NTAPI_INLINE
09112 RtlExtendedIntegerMultiply(
09113   _In_ LARGE_INTEGER Multiplicand,
09114   _In_ LONG Multiplier)
09115 {
09116   LARGE_INTEGER ret;
09117   ret.QuadPart = Multiplicand.QuadPart * Multiplier;
09118   return ret;
09119 }
09120 
09121 static __inline
09122 LARGE_INTEGER
09123 NTAPI_INLINE
09124 RtlExtendedLargeIntegerDivide(
09125   _In_ LARGE_INTEGER Dividend,
09126   _In_ ULONG Divisor,
09127   _Out_opt_ PULONG Remainder)
09128 {
09129   LARGE_INTEGER ret;
09130   ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
09131   if (Remainder)
09132     *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
09133   return ret;
09134 }
09135 
09136 
09137 
09138 #endif /* defined(_AMD64_) || defined(_IA64_) */
09139 
09140 
09141 #if defined(_AMD64_)
09142 
09143 #define MultiplyHigh __mulh
09144 #define UnsignedMultiplyHigh __umulh
09145 
09146 //DECLSPEC_DEPRECATED_DDK
09147 static __inline
09148 LARGE_INTEGER
09149 NTAPI_INLINE
09150 RtlExtendedMagicDivide(
09151   _In_ LARGE_INTEGER Dividend,
09152   _In_ LARGE_INTEGER MagicDivisor,
09153   _In_ CCHAR ShiftCount)
09154 {
09155   LARGE_INTEGER ret;
09156   ULONG64 ret64;
09157   BOOLEAN Pos;
09158   Pos = (Dividend.QuadPart >= 0);
09159   ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
09160                                MagicDivisor.QuadPart);
09161   ret64 >>= ShiftCount;
09162   ret.QuadPart = Pos ? ret64 : -(LONG64)ret64;
09163   return ret;
09164 }
09165 #endif
09166 
09167 //DECLSPEC_DEPRECATED_DDK
09168 static __inline
09169 LARGE_INTEGER
09170 NTAPI_INLINE
09171 RtlLargeIntegerAdd(
09172   _In_ LARGE_INTEGER Addend1,
09173   _In_ LARGE_INTEGER Addend2)
09174 {
09175   LARGE_INTEGER ret;
09176   ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
09177   return ret;
09178 }
09179 
09180 /* VOID
09181  * RtlLargeIntegerAnd(
09182  *     IN OUT LARGE_INTEGER Result,
09183  *     IN LARGE_INTEGER Source,
09184  *     IN LARGE_INTEGER Mask);
09185  */
09186 #define RtlLargeIntegerAnd(Result, Source, Mask) \
09187     Result.QuadPart = Source.QuadPart & Mask.QuadPart
09188 
09189 //DECLSPEC_DEPRECATED_DDK
09190 static __inline
09191 LARGE_INTEGER
09192 NTAPI_INLINE
09193 RtlLargeIntegerArithmeticShift(
09194   _In_ LARGE_INTEGER LargeInteger,
09195   _In_ CCHAR ShiftCount)
09196 {
09197   LARGE_INTEGER ret;
09198   ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
09199   return ret;
09200 }
09201 
09202 /* BOOLEAN
09203  * RtlLargeIntegerEqualTo(
09204  *     IN LARGE_INTEGER  Operand1,
09205  *     IN LARGE_INTEGER  Operand2);
09206  */
09207 #define RtlLargeIntegerEqualTo(X,Y) \
09208     (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
09209 
09210 FORCEINLINE
09211 PVOID
09212 RtlSecureZeroMemory(
09213   _Out_writes_bytes_all_(Size) PVOID Pointer,
09214   _In_ SIZE_T Size)
09215 {
09216   volatile char* vptr = (volatile char*)Pointer;
09217 #if defined(_M_AMD64)
09218   __stosb((PUCHAR)vptr, 0, Size);
09219 #else
09220   char * endptr = (char *)vptr + Size;
09221   while (vptr < endptr) {
09222     *vptr = 0; vptr++;
09223   }
09224 #endif
09225    return Pointer;
09226 }
09227 
09228 #if defined(_M_AMD64)
09229 _Must_inspect_result_
09230 FORCEINLINE
09231 BOOLEAN
09232 RtlCheckBit(
09233   _In_ PRTL_BITMAP BitMapHeader,
09234   _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitPosition)
09235 {
09236   return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
09237 }
09238 #else
09239 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
09240 #endif /* defined(_M_AMD64) */
09241 
09242 #define RtlLargeIntegerGreaterThan(X,Y) (                              \
09243     (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
09244     ((X).HighPart > (Y).HighPart)                                      \
09245 )
09246 
09247 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) (                      \
09248     (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
09249     ((X).HighPart > (Y).HighPart)                                       \
09250 )
09251 
09252 #define RtlLargeIntegerNotEqualTo(X,Y) (                          \
09253     (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
09254 )
09255 
09256 #define RtlLargeIntegerLessThan(X,Y) (                                 \
09257     (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
09258     ((X).HighPart < (Y).HighPart)                                      \
09259 )
09260 
09261 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) (                         \
09262     (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
09263     ((X).HighPart < (Y).HighPart)                                       \
09264 )
09265 
09266 #define RtlLargeIntegerGreaterThanZero(X) (       \
09267     (((X).HighPart == 0) && ((X).LowPart > 0)) || \
09268     ((X).HighPart > 0 )                           \
09269 )
09270 
09271 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
09272 
09273 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
09274 
09275 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
09276 
09277 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
09278 
09279 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
09280 
09281 #endif /* !defined(MIDL_PASS) */
09282 
09283 /* Byte Swap Functions */
09284 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
09285     ((defined(_M_AMD64) || defined(_M_IA64)) \
09286         && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
09287 
09288 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
09289 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
09290 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
09291 
09292 #endif
09293 
09294 #if DBG
09295 
09296 #define ASSERT(exp) \
09297   (VOID)((!(exp)) ? \
09298     RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
09299 
09300 #define ASSERTMSG(msg, exp) \
09301   (VOID)((!(exp)) ? \
09302     RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
09303 
09304 #define RTL_SOFT_ASSERT(exp) \
09305   (VOID)((!(exp)) ? \
09306     DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
09307 
09308 #define RTL_SOFT_ASSERTMSG(msg, exp) \
09309   (VOID)((!(exp)) ? \
09310     DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n   Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
09311 
09312 #define RTL_VERIFY(exp) ASSERT(exp)
09313 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
09314 
09315 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
09316 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
09317 
09318 #if defined(_MSC_VER)
09319 
09320 #define NT_ASSERT(exp) \
09321    ((!(exp)) ? \
09322       (__annotation(L"Debug", L"AssertFail", L#exp), \
09323        DbgRaiseAssertionFailure(), FALSE) : TRUE)
09324 
09325 #define NT_ASSERTMSG(msg, exp) \
09326    ((!(exp)) ? \
09327       (__annotation(L"Debug", L"AssertFail", L##msg), \
09328       DbgRaiseAssertionFailure(), FALSE) : TRUE)
09329 
09330 #define NT_ASSERTMSGW(msg, exp) \
09331     ((!(exp)) ? \
09332         (__annotation(L"Debug", L"AssertFail", msg), \
09333          DbgRaiseAssertionFailure(), FALSE) : TRUE)
09334 
09335 #define NT_VERIFY     NT_ASSERT
09336 #define NT_VERIFYMSG  NT_ASSERTMSG
09337 #define NT_VERIFYMSGW NT_ASSERTMSGW
09338 
09339 #else
09340 
09341 /* GCC doesn't support __annotation (nor PDB) */
09342 #define NT_ASSERT(exp) \
09343    (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
09344 
09345 #define NT_ASSERTMSG NT_ASSERT
09346 #define NT_ASSERTMSGW NT_ASSERT
09347 
09348 #endif
09349 
09350 #else /* !DBG */
09351 
09352 #define ASSERT(exp) ((VOID) 0)
09353 #define ASSERTMSG(msg, exp) ((VOID) 0)
09354 
09355 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
09356 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
09357 
09358 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
09359 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
09360 
09361 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
09362 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
09363 
09364 #define NT_ASSERT(exp)          ((VOID)0)
09365 #define NT_ASSERTMSG(msg, exp)  ((VOID)0)
09366 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
09367 
09368 #define NT_VERIFY(_exp)           ((_exp) ? TRUE : FALSE)
09369 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
09370 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
09371 
09372 #endif /* DBG */
09373 
09374 #define InitializeListHead32(ListHead) (\
09375     (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
09376 
09377 #if !defined(_WINBASE_)
09378 
09379 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
09380 
09381 NTKERNELAPI
09382 VOID
09383 InitializeSListHead(
09384   _Out_ PSLIST_HEADER SListHead);
09385 
09386 #else
09387 
09388 FORCEINLINE
09389 VOID
09390 InitializeSListHead(
09391   _Out_ PSLIST_HEADER SListHead)
09392 {
09393 #if defined(_IA64_)
09394   ULONG64 FeatureBits;
09395 #endif
09396 
09397 #if defined(_WIN64)
09398   if (((ULONG_PTR)SListHead & 0xf) != 0) {
09399     RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
09400   }
09401 #endif
09402   RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
09403 #if defined(_IA64_)
09404   FeatureBits = __getReg(CV_IA64_CPUID4);
09405   if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
09406     SListHead->Header16.HeaderType = 1;
09407     SListHead->Header16.Init = 1;
09408   }
09409 #endif
09410 }
09411 
09412 #endif
09413 
09414 #if defined(_WIN64)
09415 
09416 #define InterlockedPopEntrySList(Head) \
09417     ExpInterlockedPopEntrySList(Head)
09418 
09419 #define InterlockedPushEntrySList(Head, Entry) \
09420     ExpInterlockedPushEntrySList(Head, Entry)
09421 
09422 #define InterlockedFlushSList(Head) \
09423     ExpInterlockedFlushSList(Head)
09424 
09425 #define QueryDepthSList(Head) \
09426     ExQueryDepthSList(Head)
09427 
09428 #else /* !defined(_WIN64) */
09429 
09430 NTKERNELAPI
09431 PSLIST_ENTRY
09432 FASTCALL
09433 InterlockedPopEntrySList(
09434   _Inout_ PSLIST_HEADER ListHead);
09435 
09436 NTKERNELAPI
09437 PSLIST_ENTRY
09438 FASTCALL
09439 InterlockedPushEntrySList(
09440   _Inout_ PSLIST_HEADER ListHead,
09441   _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry);
09442 
09443 #define InterlockedFlushSList(ListHead) \
09444     ExInterlockedFlushSList(ListHead)
09445 
09446 #define QueryDepthSList(Head) \
09447     ExQueryDepthSList(Head)
09448 
09449 #endif /* !defined(_WIN64) */
09450 
09451 #endif /* !defined(_WINBASE_) */
09452 
09453 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
09454 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
09455 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk)       \
09456     ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
09457 #define RTL_CONTEXT_OFFSET(Context, Chunk)              \
09458     RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
09459 #define RTL_CONTEXT_LENGTH(Context, Chunk)              \
09460     RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
09461 #define RTL_CONTEXT_CHUNK(Context, Chunk)               \
09462     RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1),    \
09463                          (PCONTEXT_EX)(Context + 1),    \
09464                          Chunk)
09465 
09466 BOOLEAN
09467 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)(
09468   _In_ ULONG Version);
09469 
09470 BOOLEAN
09471 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
09472   _In_ ULONG Version);
09473 
09474 #ifndef RtlIsNtDdiVersionAvailable
09475 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
09476 #endif
09477 
09478 #ifndef RtlIsServicePackVersionInstalled
09479 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
09480 #endif
09481 
09482 #define RtlInterlockedSetBits(Flags, Flag) \
09483     InterlockedOr((PLONG)(Flags), Flag)
09484 
09485 #define RtlInterlockedAndBits(Flags, Flag) \
09486     InterlockedAnd((PLONG)(Flags), Flag)
09487 
09488 #define RtlInterlockedClearBits(Flags, Flag) \
09489     RtlInterlockedAndBits(Flags, ~(Flag))
09490 
09491 #define RtlInterlockedXorBits(Flags, Flag) \
09492     InterlockedXor(Flags, Flag)
09493 
09494 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
09495     (VOID) RtlInterlockedSetBits(Flags, Flag)
09496 
09497 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
09498     (VOID) RtlInterlockedAndBits(Flags, Flag)
09499 
09500 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
09501     RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
09502 
09503 
09504 /******************************************************************************
09505  *                              Kernel Functions                              *
09506  ******************************************************************************/
09507 #if defined(_M_IX86)
09508 
09510 /* Interrupt request levels */
09511 #define PASSIVE_LEVEL           0
09512 #define LOW_LEVEL               0
09513 #define APC_LEVEL               1
09514 #define DISPATCH_LEVEL          2
09515 #define CMCI_LEVEL              5
09516 #define PROFILE_LEVEL           27
09517 #define CLOCK1_LEVEL            28
09518 #define CLOCK2_LEVEL            28
09519 #define IPI_LEVEL               29
09520 #define POWER_LEVEL             30
09521 #define HIGH_LEVEL              31
09522 #define CLOCK_LEVEL             CLOCK2_LEVEL
09523 
09524 #define KIP0PCRADDRESS          0xffdff000
09525 #define KI_USER_SHARED_DATA     0xffdf0000
09526 #define SharedUserData          ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
09527 
09528 #define PAGE_SIZE               0x1000
09529 #define PAGE_SHIFT              12L
09530 #define KeGetDcacheFillSize()   1L
09531 
09532 #define EFLAG_SIGN              0x8000
09533 #define EFLAG_ZERO              0x4000
09534 #define EFLAG_SELECT            (EFLAG_SIGN | EFLAG_ZERO)
09535 
09536 #define RESULT_NEGATIVE         ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
09537 #define RESULT_ZERO             ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
09538 #define RESULT_POSITIVE         ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
09539 
09540 
09541 typedef struct _KFLOATING_SAVE {
09542   ULONG ControlWord;
09543   ULONG StatusWord;
09544   ULONG ErrorOffset;
09545   ULONG ErrorSelector;
09546   ULONG DataOffset;
09547   ULONG DataSelector;
09548   ULONG Cr0NpxState;
09549   ULONG Spare1;
09550 } KFLOATING_SAVE, *PKFLOATING_SAVE;
09551 
09552 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
09553 
09554 #define YieldProcessor _mm_pause
09555 
09556 FORCEINLINE
09557 VOID
09558 KeMemoryBarrier(VOID)
09559 {
09560   LONG Barrier, *Dummy = &Barrier;
09561   UNREFERENCED_LOCAL_VARIABLE(Dummy);
09562 
09563 #if defined(__GNUC__)
09564   __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
09565 #elif defined(_MSC_VER)
09566   __asm xchg [Barrier], eax
09567 #endif
09568 }
09569 
09570 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
09571 
09572 _IRQL_requires_max_(HIGH_LEVEL)
09573 _IRQL_saves_
09574 NTHALAPI
09575 KIRQL
09576 NTAPI
09577 KeGetCurrentIrql(VOID);
09578 
09579 _IRQL_requires_max_(HIGH_LEVEL)
09580 NTHALAPI
09581 VOID
09582 FASTCALL
09583 KfLowerIrql(
09584   _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql);
09585 #define KeLowerIrql(a) KfLowerIrql(a)
09586 
09587 _IRQL_requires_max_(HIGH_LEVEL)
09588 _IRQL_raises_(NewIrql)
09589 _IRQL_saves_
09590 NTHALAPI
09591 KIRQL
09592 FASTCALL
09593 KfRaiseIrql(
09594   _In_ KIRQL NewIrql);
09595 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
09596 
09597 _IRQL_requires_max_(DISPATCH_LEVEL)
09598 _IRQL_saves_
09599 _IRQL_raises_(DISPATCH_LEVEL)
09600 NTHALAPI
09601 KIRQL
09602 NTAPI
09603 KeRaiseIrqlToDpcLevel(VOID);
09604 
09605 NTHALAPI
09606 KIRQL
09607 NTAPI
09608 KeRaiseIrqlToSynchLevel(VOID);
09609 
09610 _Requires_lock_not_held_(*SpinLock)
09611 _Acquires_lock_(*SpinLock)
09612 _IRQL_requires_max_(DISPATCH_LEVEL)
09613 _IRQL_saves_
09614 _IRQL_raises_(DISPATCH_LEVEL)
09615 NTHALAPI
09616 KIRQL
09617 FASTCALL
09618 KfAcquireSpinLock(
09619   _Inout_ PKSPIN_LOCK SpinLock);
09620 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
09621 
09622 _Requires_lock_held_(*SpinLock)
09623 _Releases_lock_(*SpinLock)
09624 _IRQL_requires_(DISPATCH_LEVEL)
09625 NTHALAPI
09626 VOID
09627 FASTCALL
09628 KfReleaseSpinLock(
09629   _Inout_ PKSPIN_LOCK SpinLock,
09630   _In_ _IRQL_restores_ KIRQL NewIrql);
09631 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
09632 
09633 _Requires_lock_not_held_(*SpinLock)
09634 _Acquires_lock_(*SpinLock)
09635 _IRQL_requires_min_(DISPATCH_LEVEL)
09636 NTKERNELAPI
09637 VOID
09638 FASTCALL
09639 KefAcquireSpinLockAtDpcLevel(
09640   _Inout_ PKSPIN_LOCK SpinLock);
09641 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
09642 
09643 _Requires_lock_held_(*SpinLock)
09644 _Releases_lock_(*SpinLock)
09645 _IRQL_requires_min_(DISPATCH_LEVEL)
09646 NTKERNELAPI
09647 VOID
09648 FASTCALL
09649 KefReleaseSpinLockFromDpcLevel(
09650   _Inout_ PKSPIN_LOCK SpinLock);
09651 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
09652 
09653 NTSYSAPI
09654 PKTHREAD
09655 NTAPI
09656 KeGetCurrentThread(VOID);
09657 
09658 _Always_(_Post_satisfies_(return<=0))
09659 _Must_inspect_result_
09660 _IRQL_requires_max_(DISPATCH_LEVEL)
09661 _Kernel_float_saved_
09662 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
09663 NTKERNELAPI
09664 NTSTATUS
09665 NTAPI
09666 KeSaveFloatingPointState(
09667   _Out_ PKFLOATING_SAVE FloatSave);
09668 
09669 _Success_(1)
09670 _Kernel_float_restored_
09671 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
09672 NTKERNELAPI
09673 NTSTATUS
09674 NTAPI
09675 KeRestoreFloatingPointState(
09676   _In_ PKFLOATING_SAVE FloatSave);
09677 
09678 /* VOID
09679  * KeFlushIoBuffers(
09680  *   IN PMDL Mdl,
09681  *   IN BOOLEAN ReadOperation,
09682  *   IN BOOLEAN DmaOperation)
09683  */
09684 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
09685 
09686 /* x86 and x64 performs a 0x2C interrupt */
09687 #define DbgRaiseAssertionFailure __int2c
09688 
09689 FORCEINLINE
09690 VOID
09691 _KeQueryTickCount(
09692   OUT PLARGE_INTEGER CurrentCount)
09693 {
09694   for (;;) {
09695 #ifdef NONAMELESSUNION
09696     CurrentCount->s.HighPart = KeTickCount.High1Time;
09697     CurrentCount->s.LowPart = KeTickCount.LowPart;
09698     if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
09699 #else
09700     CurrentCount->HighPart = KeTickCount.High1Time;
09701     CurrentCount->LowPart = KeTickCount.LowPart;
09702     if (CurrentCount->HighPart == KeTickCount.High2Time) break;
09703 #endif
09704     YieldProcessor();
09705   }
09706 }
09707 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
09708 
09709 
09710 
09711 
09712 
09713 #elif defined(_M_AMD64)
09714 
09716 /* Interrupt request levels */
09717 #define PASSIVE_LEVEL           0
09718 #define LOW_LEVEL               0
09719 #define APC_LEVEL               1
09720 #define DISPATCH_LEVEL          2
09721 #define CMCI_LEVEL              5
09722 #define CLOCK_LEVEL             13
09723 #define IPI_LEVEL               14
09724 #define DRS_LEVEL               14
09725 #define POWER_LEVEL             14
09726 #define PROFILE_LEVEL           15
09727 #define HIGH_LEVEL              15
09728 
09729 #define KI_USER_SHARED_DATA     0xFFFFF78000000000ULL
09730 #define SharedUserData          ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
09731 #define SharedInterruptTime     (KI_USER_SHARED_DATA + 0x8)
09732 #define SharedSystemTime        (KI_USER_SHARED_DATA + 0x14)
09733 #define SharedTickCount         (KI_USER_SHARED_DATA + 0x320)
09734 
09735 #define PAGE_SIZE               0x1000
09736 #define PAGE_SHIFT              12L
09737 
09738 #define EFLAG_SIGN              0x8000
09739 #define EFLAG_ZERO              0x4000
09740 #define EFLAG_SELECT            (EFLAG_SIGN | EFLAG_ZERO)
09741 
09742 typedef struct _KFLOATING_SAVE {
09743   ULONG Dummy;
09744 } KFLOATING_SAVE, *PKFLOATING_SAVE;
09745 
09746 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
09747 
09748 #define KeQueryInterruptTime() \
09749     (*(volatile ULONG64*)SharedInterruptTime)
09750 
09751 #define KeQuerySystemTime(CurrentCount) \
09752     *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
09753 
09754 #define KeQueryTickCount(CurrentCount) \
09755     *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
09756 
09757 #define KeGetDcacheFillSize() 1L
09758 
09759 #define YieldProcessor _mm_pause
09760 #define FastFence __faststorefence
09761 #define LoadFence _mm_lfence
09762 #define MemoryFence _mm_mfence
09763 #define StoreFence _mm_sfence
09764 #define LFENCE_ACQUIRE() LoadFence()
09765 
09766 FORCEINLINE
09767 VOID
09768 KeMemoryBarrier(VOID)
09769 {
09770   // FIXME: Do we really need lfence after the __faststorefence ?
09771   FastFence();
09772   LFENCE_ACQUIRE();
09773 }
09774 
09775 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
09776 
09777 FORCEINLINE
09778 KIRQL
09779 KeGetCurrentIrql(VOID)
09780 {
09781   return (KIRQL)__readcr8();
09782 }
09783 
09784 FORCEINLINE
09785 VOID
09786 KeLowerIrql(IN KIRQL NewIrql)
09787 {
09788   ASSERT((KIRQL)__readcr8() >= NewIrql);
09789   __writecr8(NewIrql);
09790 }
09791 
09792 FORCEINLINE
09793 KIRQL
09794 KfRaiseIrql(IN KIRQL NewIrql)
09795 {
09796   KIRQL OldIrql;
09797 
09798   OldIrql = (KIRQL)__readcr8();
09799   ASSERT(OldIrql <= NewIrql);
09800   __writecr8(NewIrql);
09801   return OldIrql;
09802 }
09803 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
09804 
09805 FORCEINLINE
09806 KIRQL
09807 KeRaiseIrqlToDpcLevel(VOID)
09808 {
09809   return KfRaiseIrql(DISPATCH_LEVEL);
09810 }
09811 
09812 FORCEINLINE
09813 KIRQL
09814 KeRaiseIrqlToSynchLevel(VOID)
09815 {
09816   return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
09817 }
09818 
09819 FORCEINLINE
09820 PKTHREAD
09821 KeGetCurrentThread(VOID)
09822 {
09823   return (struct _KTHREAD *)__readgsqword(0x188);
09824 }
09825 
09826 FORCEINLINE
09827 NTSTATUS
09828 KeSaveFloatingPointState(PVOID FloatingState)
09829 {
09830   UNREFERENCED_PARAMETER(FloatingState);
09831   return STATUS_SUCCESS;
09832 }
09833 
09834 FORCEINLINE
09835 NTSTATUS
09836 KeRestoreFloatingPointState(PVOID FloatingState)
09837 {
09838   UNREFERENCED_PARAMETER(FloatingState);
09839   return STATUS_SUCCESS;
09840 }
09841 
09842 /* VOID
09843  * KeFlushIoBuffers(
09844  *   IN PMDL Mdl,
09845  *   IN BOOLEAN ReadOperation,
09846  *   IN BOOLEAN DmaOperation)
09847  */
09848 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
09849 
09850 /* x86 and x64 performs a 0x2C interrupt */
09851 #define DbgRaiseAssertionFailure __int2c
09852 
09853 #elif defined(_M_IA64)
09854 
09856 /* Interrupt request levels */
09857 #define PASSIVE_LEVEL           0
09858 #define LOW_LEVEL               0
09859 #define APC_LEVEL               1
09860 #define DISPATCH_LEVEL          2
09861 #define CMC_LEVEL               3
09862 #define DEVICE_LEVEL_BASE       4
09863 #define PC_LEVEL                12
09864 #define IPI_LEVEL               14
09865 #define DRS_LEVEL               14
09866 #define CLOCK_LEVEL             13
09867 #define POWER_LEVEL             15
09868 #define PROFILE_LEVEL           15
09869 #define HIGH_LEVEL              15
09870 
09871 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
09872 extern volatile LARGE_INTEGER KeTickCount;
09873 
09874 #define PAUSE_PROCESSOR __yield();
09875 
09876 FORCEINLINE
09877 VOID
09878 KeFlushWriteBuffer(VOID)
09879 {
09880   __mf ();
09881   return;
09882 }
09883 
09884 NTSYSAPI
09885 PKTHREAD
09886 NTAPI
09887 KeGetCurrentThread(VOID);
09888 
09889 
09890 #elif defined(_M_PPC)
09891 
09892 /* Interrupt request levels */
09893 #define PASSIVE_LEVEL                      0
09894 #define LOW_LEVEL                          0
09895 #define APC_LEVEL                          1
09896 #define DISPATCH_LEVEL                     2
09897 #define PROFILE_LEVEL                     27
09898 #define CLOCK1_LEVEL                      28
09899 #define CLOCK2_LEVEL                      28
09900 #define IPI_LEVEL                         29
09901 #define POWER_LEVEL                       30
09902 #define HIGH_LEVEL                        31
09903 
09904 //
09905 // Used to contain PFNs and PFN counts
09906 //
09907 typedef ULONG PFN_COUNT;
09908 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
09909 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
09910 
09911 
09912 typedef struct _KFLOATING_SAVE {
09913   ULONG Dummy;
09914 } KFLOATING_SAVE, *PKFLOATING_SAVE;
09915 
09916 typedef struct _KPCR_TIB {
09917   PVOID ExceptionList;         /* 00 */
09918   PVOID StackBase;             /* 04 */
09919   PVOID StackLimit;            /* 08 */
09920   PVOID SubSystemTib;          /* 0C */
09921   _ANONYMOUS_UNION union {
09922     PVOID FiberData;           /* 10 */
09923     ULONG Version;             /* 10 */
09924   } DUMMYUNIONNAME;
09925   PVOID ArbitraryUserPointer;  /* 14 */
09926   struct _KPCR_TIB *Self;       /* 18 */
09927 } KPCR_TIB, *PKPCR_TIB;         /* 1C */
09928 
09929 #define PCR_MINOR_VERSION 1
09930 #define PCR_MAJOR_VERSION 1
09931 
09932 typedef struct _KPCR {
09933   KPCR_TIB Tib;                /* 00 */
09934   struct _KPCR *Self;          /* 1C */
09935   struct _KPRCB *Prcb;         /* 20 */
09936   KIRQL Irql;                  /* 24 */
09937   ULONG IRR;                   /* 28 */
09938   ULONG IrrActive;             /* 2C */
09939   ULONG IDR;                   /* 30 */
09940   PVOID KdVersionBlock;        /* 34 */
09941   PUSHORT IDT;                 /* 38 */
09942   PUSHORT GDT;                 /* 3C */
09943   struct _KTSS *TSS;           /* 40 */
09944   USHORT MajorVersion;         /* 44 */
09945   USHORT MinorVersion;         /* 46 */
09946   KAFFINITY SetMember;         /* 48 */
09947   ULONG StallScaleFactor;      /* 4C */
09948   UCHAR SpareUnused;           /* 50 */
09949   UCHAR Number;                /* 51 */
09950 } KPCR, *PKPCR;                /* 54 */
09951 
09952 #define KeGetPcr()                      PCR
09953 
09954 #define YieldProcessor() __asm__ __volatile__("nop");
09955 
09956 FORCEINLINE
09957 ULONG
09958 NTAPI
09959 KeGetCurrentProcessorNumber(VOID)
09960 {
09961   ULONG Number;
09962   __asm__ __volatile__ (
09963     "lwz %0, %c1(12)\n"
09964     : "=r" (Number)
09965     : "i" (FIELD_OFFSET(KPCR, Number))
09966   );
09967   return Number;
09968 }
09969 
09970 NTHALAPI
09971 VOID
09972 FASTCALL
09973 KfLowerIrql(
09974   IN KIRQL NewIrql);
09975 #define KeLowerIrql(a) KfLowerIrql(a)
09976 
09977 NTHALAPI
09978 KIRQL
09979 FASTCALL
09980 KfRaiseIrql(
09981   IN KIRQL NewIrql);
09982 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
09983 
09984 NTHALAPI
09985 KIRQL
09986 NTAPI
09987 KeRaiseIrqlToDpcLevel(VOID);
09988 
09989 NTHALAPI
09990 KIRQL
09991 NTAPI
09992 KeRaiseIrqlToSynchLevel(VOID);
09993 
09994 
09995 
09996 #elif defined(_M_MIPS)
09997 #error MIPS Headers are totally incorrect
09998 
09999 //
10000 // Used to contain PFNs and PFN counts
10001 //
10002 typedef ULONG PFN_COUNT;
10003 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
10004 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
10005 
10006 #define PASSIVE_LEVEL                      0
10007 #define APC_LEVEL                          1
10008 #define DISPATCH_LEVEL                     2
10009 #define PROFILE_LEVEL                     27
10010 #define IPI_LEVEL                         29
10011 #define HIGH_LEVEL                        31
10012 
10013 typedef struct _KPCR {
10014   struct _KPRCB *Prcb;         /* 20 */
10015   KIRQL Irql;                  /* 24 */
10016   ULONG IRR;                   /* 28 */
10017   ULONG IDR;                   /* 30 */
10018 } KPCR, *PKPCR;
10019 
10020 #define KeGetPcr()                      PCR
10021 
10022 typedef struct _KFLOATING_SAVE {
10023 } KFLOATING_SAVE, *PKFLOATING_SAVE;
10024 
10025 static __inline
10026 ULONG
10027 NTAPI
10028 KeGetCurrentProcessorNumber(VOID)
10029 {
10030   return 0;
10031 }
10032 
10033 #define YieldProcessor() __asm__ __volatile__("nop");
10034 
10035 #define KeLowerIrql(a) KfLowerIrql(a)
10036 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
10037 
10038 NTKERNELAPI
10039 VOID
10040 NTAPI
10041 KfLowerIrql(
10042   IN KIRQL NewIrql);
10043 
10044 NTKERNELAPI
10045 KIRQL
10046 NTAPI
10047 KfRaiseIrql(
10048   IN KIRQL NewIrql);
10049 
10050 NTKERNELAPI
10051 KIRQL
10052 NTAPI
10053 KeRaiseIrqlToDpcLevel(VOID);
10054 
10055 NTKERNELAPI
10056 KIRQL
10057 NTAPI
10058 KeRaiseIrqlToSynchLevel(VOID);
10059 
10060 
10061 #elif defined(_M_ARM)
10062 #include <armddk.h>
10063 #else
10064 #error Unknown Architecture
10065 #endif
10066 
10067 NTKERNELAPI
10068 VOID
10069 NTAPI
10070 KeInitializeEvent(
10071   _Out_ PRKEVENT Event,
10072   _In_ EVENT_TYPE Type,
10073   _In_ BOOLEAN State);
10074 
10075 _IRQL_requires_max_(DISPATCH_LEVEL)
10076 NTKERNELAPI
10077 VOID
10078 NTAPI
10079 KeClearEvent(
10080   _Inout_ PRKEVENT Event);
10081 
10082 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10083 
10084 #if defined(_NTDDK_) || defined(_NTIFS_)
10085 _Maybe_raises_SEH_exception_
10086 _IRQL_requires_max_(APC_LEVEL)
10087 NTKERNELAPI
10088 VOID
10089 NTAPI
10090 ProbeForRead(
10091   __in_data_source(USER_MODE) _In_reads_bytes_(Length) CONST VOID *Address, /* CONST is added */
10092   _In_ SIZE_T Length,
10093   _In_ ULONG Alignment);
10094 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
10095 
10096 _Maybe_raises_SEH_exception_
10097 _IRQL_requires_max_(APC_LEVEL)
10098 NTKERNELAPI
10099 VOID
10100 NTAPI
10101 ProbeForWrite(
10102   __in_data_source(USER_MODE) _Inout_updates_bytes_(Length) PVOID Address,
10103   _In_ SIZE_T Length,
10104   _In_ ULONG Alignment);
10105 
10106 #if defined(SINGLE_GROUP_LEGACY_API)
10107 
10108 _IRQL_requires_min_(PASSIVE_LEVEL)
10109 _IRQL_requires_max_(APC_LEVEL)
10110 NTKERNELAPI
10111 VOID
10112 NTAPI
10113 KeRevertToUserAffinityThread(VOID);
10114 
10115 _IRQL_requires_min_(PASSIVE_LEVEL)
10116 _IRQL_requires_max_(APC_LEVEL)
10117 NTKERNELAPI
10118 VOID
10119 NTAPI
10120 KeSetSystemAffinityThread(
10121   _In_ KAFFINITY Affinity);
10122 
10123 NTKERNELAPI
10124 VOID
10125 NTAPI
10126 KeSetTargetProcessorDpc(
10127   _Inout_ PRKDPC Dpc,
10128   _In_ CCHAR Number);
10129 
10130 NTKERNELAPI
10131 KAFFINITY
10132 NTAPI
10133 KeQueryActiveProcessors(VOID);
10134 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
10135 
10136 #if !defined(_M_AMD64)
10137 NTKERNELAPI
10138 ULONGLONG
10139 NTAPI
10140 KeQueryInterruptTime(VOID);
10141 
10142 NTKERNELAPI
10143 VOID
10144 NTAPI
10145 KeQuerySystemTime(
10146   _Out_ PLARGE_INTEGER CurrentTime);
10147 #endif /* !_M_AMD64 */
10148 
10149 #if !defined(_X86_) && !defined(_M_ARM)
10150 _Requires_lock_not_held_(*SpinLock)
10151 _Acquires_lock_(*SpinLock)
10152 _IRQL_requires_max_(DISPATCH_LEVEL)
10153 _IRQL_saves_
10154 _IRQL_raises_(DISPATCH_LEVEL)
10155 NTKERNELAPI
10156 KIRQL
10157 NTAPI
10158 KeAcquireSpinLockRaiseToDpc(
10159   _Inout_ PKSPIN_LOCK SpinLock);
10160 
10161 #define KeAcquireSpinLock(SpinLock, OldIrql) \
10162     *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
10163 
10164 _Requires_lock_not_held_(*SpinLock)
10165 _Acquires_lock_(*SpinLock)
10166 _IRQL_requires_min_(DISPATCH_LEVEL)
10167 NTKERNELAPI
10168 VOID
10169 NTAPI
10170 KeAcquireSpinLockAtDpcLevel(
10171   _Inout_ PKSPIN_LOCK SpinLock);
10172 
10173 _Requires_lock_held_(*SpinLock)
10174 _Releases_lock_(*SpinLock)
10175 _IRQL_requires_(DISPATCH_LEVEL)
10176 NTKERNELAPI
10177 VOID
10178 NTAPI
10179 KeReleaseSpinLock(
10180   _Inout_ PKSPIN_LOCK SpinLock,
10181   _In_ _IRQL_restores_ KIRQL NewIrql);
10182 
10183 _Requires_lock_held_(*SpinLock)
10184 _Releases_lock_(*SpinLock)
10185 _IRQL_requires_min_(DISPATCH_LEVEL)
10186 NTKERNELAPI
10187 VOID
10188 NTAPI
10189 KeReleaseSpinLockFromDpcLevel(
10190   _Inout_ PKSPIN_LOCK SpinLock);
10191 #endif /* !_X86_ */
10192 
10193 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
10194 NTKERNELAPI
10195 VOID
10196 NTAPI
10197 KeInitializeSpinLock(
10198   _Out_ PKSPIN_LOCK SpinLock);
10199 #else
10200 FORCEINLINE
10201 VOID
10202 KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
10203 {
10204   /* Clear the lock */
10205   *SpinLock = 0;
10206 }
10207 #endif
10208 
10209 DECLSPEC_NORETURN
10210 NTKERNELAPI
10211 VOID
10212 NTAPI
10213 KeBugCheckEx(
10214   _In_ ULONG BugCheckCode,
10215   _In_ ULONG_PTR BugCheckParameter1,
10216   _In_ ULONG_PTR BugCheckParameter2,
10217   _In_ ULONG_PTR BugCheckParameter3,
10218   _In_ ULONG_PTR BugCheckParameter4);
10219 
10220 _IRQL_requires_max_(DISPATCH_LEVEL)
10221 NTKERNELAPI
10222 BOOLEAN
10223 NTAPI
10224 KeCancelTimer(
10225   _Inout_ PKTIMER);
10226 
10227 _IRQL_requires_min_(PASSIVE_LEVEL)
10228 _IRQL_requires_max_(APC_LEVEL)
10229 NTKERNELAPI
10230 NTSTATUS
10231 NTAPI
10232 KeDelayExecutionThread(
10233   _In_ KPROCESSOR_MODE WaitMode,
10234   _In_ BOOLEAN Alertable,
10235   _In_ PLARGE_INTEGER Interval);
10236 
10237 _Must_inspect_result_
10238 NTKERNELAPI
10239 BOOLEAN
10240 NTAPI
10241 KeDeregisterBugCheckCallback(
10242   _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
10243 
10244 _Acquires_lock_(_Global_critical_region_)
10245 _IRQL_requires_max_(APC_LEVEL)
10246 NTKERNELAPI
10247 VOID
10248 NTAPI
10249 KeEnterCriticalRegion(VOID);
10250 
10251 _IRQL_requires_max_(DISPATCH_LEVEL)
10252 NTKERNELAPI
10253 VOID
10254 NTAPI
10255 KeInitializeDeviceQueue(
10256   _Out_ PKDEVICE_QUEUE DeviceQueue);
10257 
10258 NTKERNELAPI
10259 VOID
10260 NTAPI
10261 KeInitializeDpc(
10262   _Out_ __drv_aliasesMem PRKDPC Dpc,
10263   _In_ PKDEFERRED_ROUTINE DeferredRoutine,
10264   _In_opt_ __drv_aliasesMem PVOID DeferredContext);
10265 
10266 NTKERNELAPI
10267 VOID
10268 NTAPI
10269 KeInitializeMutex(
10270   _Out_ PRKMUTEX Mutex,
10271   _In_ ULONG Level);
10272 
10273 _IRQL_requires_max_(PASSIVE_LEVEL)
10274 NTKERNELAPI
10275 VOID
10276 NTAPI
10277 KeInitializeSemaphore(
10278   _Out_ PRKSEMAPHORE Semaphore,
10279   _In_ LONG Count,
10280   _In_ LONG Limit);
10281 
10282 _IRQL_requires_max_(DISPATCH_LEVEL)
10283 NTKERNELAPI
10284 VOID
10285 NTAPI
10286 KeInitializeTimer(
10287   _Out_ PKTIMER Timer);
10288 
10289 _IRQL_requires_max_(DISPATCH_LEVEL)
10290 NTKERNELAPI
10291 VOID
10292 NTAPI
10293 KeInitializeTimerEx(
10294   _Out_ PKTIMER Timer,
10295   _In_ TIMER_TYPE Type);
10296 
10297 _IRQL_requires_(DISPATCH_LEVEL)
10298 NTKERNELAPI
10299 BOOLEAN
10300 NTAPI
10301 KeInsertByKeyDeviceQueue(
10302   _Inout_ PKDEVICE_QUEUE DeviceQueue,
10303   _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
10304   _In_ ULONG SortKey);
10305 
10306 _IRQL_requires_(DISPATCH_LEVEL)
10307 NTKERNELAPI
10308 BOOLEAN
10309 NTAPI
10310 KeInsertDeviceQueue(
10311   _Inout_ PKDEVICE_QUEUE DeviceQueue,
10312   _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
10313 
10314 NTKERNELAPI
10315 BOOLEAN
10316 NTAPI
10317 KeInsertQueueDpc(
10318   _Inout_ PRKDPC Dpc,
10319   _In_opt_ PVOID SystemArgument1,
10320   _In_opt_ PVOID SystemArgument2);
10321 
10322 _Releases_lock_(_Global_critical_region_)
10323 _IRQL_requires_max_(APC_LEVEL)
10324 NTKERNELAPI
10325 VOID
10326 NTAPI
10327 KeLeaveCriticalRegion(VOID);
10328 
10329 NTHALAPI
10330 LARGE_INTEGER
10331 NTAPI
10332 KeQueryPerformanceCounter(
10333   _Out_opt_ PLARGE_INTEGER PerformanceFrequency);
10334 
10335 _IRQL_requires_max_(PASSIVE_LEVEL)
10336 NTKERNELAPI
10337 KPRIORITY
10338 NTAPI
10339 KeQueryPriorityThread(
10340   _In_ PRKTHREAD Thread);
10341 
10342 NTKERNELAPI
10343 ULONG
10344 NTAPI
10345 KeQueryTimeIncrement(VOID);
10346 
10347 _IRQL_requires_max_(DISPATCH_LEVEL)
10348 NTKERNELAPI
10349 LONG
10350 NTAPI
10351 KeReadStateEvent(
10352   _In_ PRKEVENT Event);
10353 
10354 _IRQL_requires_max_(DISPATCH_LEVEL)
10355 NTKERNELAPI
10356 LONG
10357 NTAPI
10358 KeReadStateMutex(
10359   _In_ PRKMUTEX Mutex);
10360 
10361 _IRQL_requires_max_(DISPATCH_LEVEL)
10362 NTKERNELAPI
10363 LONG
10364 NTAPI
10365 KeReadStateSemaphore(
10366   _In_ PRKSEMAPHORE Semaphore);
10367 
10368 _IRQL_requires_max_(DISPATCH_LEVEL)
10369 NTKERNELAPI
10370 BOOLEAN
10371 NTAPI
10372 KeReadStateTimer(
10373   _In_ PKTIMER Timer);
10374 
10375 _Must_inspect_result_
10376 NTKERNELAPI
10377 BOOLEAN
10378 NTAPI
10379 KeRegisterBugCheckCallback(
10380   _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
10381   _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
10382   _In_reads_bytes_opt_(Length) PVOID Buffer,
10383   _In_ ULONG Length,
10384   _In_ PUCHAR Component);
10385 
10386 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
10387 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
10388 NTKERNELAPI
10389 LONG
10390 NTAPI
10391 KeReleaseMutex(
10392   _Inout_ PRKMUTEX Mutex,
10393   _In_ BOOLEAN Wait);
10394 
10395 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
10396 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
10397 NTKERNELAPI
10398 LONG
10399 NTAPI
10400 KeReleaseSemaphore(
10401   _Inout_ PRKSEMAPHORE Semaphore,
10402   _In_ KPRIORITY Increment,
10403   _In_ LONG Adjustment,
10404   _In_ _Literal_ BOOLEAN Wait);
10405 
10406 _IRQL_requires_(DISPATCH_LEVEL)
10407 NTKERNELAPI
10408 PKDEVICE_QUEUE_ENTRY
10409 NTAPI
10410 KeRemoveByKeyDeviceQueue(
10411   _Inout_ PKDEVICE_QUEUE DeviceQueue,
10412   _In_ ULONG SortKey);
10413 
10414 _IRQL_requires_(DISPATCH_LEVEL)
10415 NTKERNELAPI
10416 PKDEVICE_QUEUE_ENTRY
10417 NTAPI
10418 KeRemoveDeviceQueue(
10419   _Inout_ PKDEVICE_QUEUE DeviceQueue);
10420 
10421 _IRQL_requires_max_(DISPATCH_LEVEL)
10422 NTKERNELAPI
10423 BOOLEAN
10424 NTAPI
10425 KeRemoveEntryDeviceQueue(
10426   _Inout_ PKDEVICE_QUEUE DeviceQueue,
10427   _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
10428 
10429 _IRQL_requires_max_(HIGH_LEVEL)
10430 NTKERNELAPI
10431 BOOLEAN
10432 NTAPI
10433 KeRemoveQueueDpc(
10434   _Inout_ PRKDPC Dpc);
10435 
10436 _IRQL_requires_max_(DISPATCH_LEVEL)
10437 NTKERNELAPI
10438 LONG
10439 NTAPI
10440 KeResetEvent(
10441   _Inout_ PRKEVENT Event);
10442 
10443 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
10444 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
10445 NTKERNELAPI
10446 LONG
10447 NTAPI
10448 KeSetEvent(
10449   _Inout_ PRKEVENT Event,
10450   _In_ KPRIORITY Increment,
10451   _In_ _Literal_ BOOLEAN Wait);
10452 
10453 NTKERNELAPI
10454 VOID
10455 NTAPI
10456 KeSetImportanceDpc(
10457   _Inout_ PRKDPC Dpc,
10458   _In_ KDPC_IMPORTANCE Importance);
10459 
10460 _IRQL_requires_min_(PASSIVE_LEVEL)
10461 _IRQL_requires_max_(DISPATCH_LEVEL)
10462 NTKERNELAPI
10463 KPRIORITY
10464 NTAPI
10465 KeSetPriorityThread(
10466   _Inout_ PKTHREAD Thread,
10467   _In_ KPRIORITY Priority);
10468 
10469 _IRQL_requires_max_(DISPATCH_LEVEL)
10470 NTKERNELAPI
10471 BOOLEAN
10472 NTAPI
10473 KeSetTimer(
10474   _Inout_ PKTIMER Timer,
10475   _In_ LARGE_INTEGER DueTime,
10476   _In_opt_ PKDPC Dpc);
10477 
10478 _IRQL_requires_max_(DISPATCH_LEVEL)
10479 NTKERNELAPI
10480 BOOLEAN
10481 NTAPI
10482 KeSetTimerEx(
10483   _Inout_ PKTIMER Timer,
10484   _In_ LARGE_INTEGER DueTime,
10485   _In_ LONG Period OPTIONAL,
10486   _In_opt_ PKDPC Dpc);
10487 
10488 NTHALAPI
10489 VOID
10490 NTAPI
10491 KeStallExecutionProcessor(
10492   _In_ ULONG MicroSeconds);
10493 
10494 _IRQL_requires_max_(HIGH_LEVEL)
10495 NTKERNELAPI
10496 BOOLEAN
10497 NTAPI
10498 KeSynchronizeExecution(
10499   _Inout_ PKINTERRUPT Interrupt,
10500   _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
10501   _In_opt_ __drv_aliasesMem PVOID SynchronizeContext);
10502 
10503 _IRQL_requires_min_(PASSIVE_LEVEL)
10504 _When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL))
10505 _When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL))
10506 NTKERNELAPI
10507 NTSTATUS
10508 NTAPI
10509 KeWaitForMultipleObjects(
10510   _In_ ULONG Count,
10511   _In_reads_(Count) PVOID Object[],
10512   _In_ __drv_strictTypeMatch(__drv_typeConst) WAIT_TYPE WaitType,
10513   _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason,
10514   _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode,
10515   _In_ BOOLEAN Alertable,
10516   _In_opt_ PLARGE_INTEGER Timeout,
10517   _Out_opt_ PKWAIT_BLOCK WaitBlockArray);
10518 
10519 #define KeWaitForMutexObject KeWaitForSingleObject
10520 
10521 _IRQL_requires_min_(PASSIVE_LEVEL)
10522 _When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL))
10523 _When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL))
10524 NTKERNELAPI
10525 NTSTATUS
10526 NTAPI
10527 KeWaitForSingleObject(
10528   _In_ _Points_to_data_ PVOID Object,
10529   _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason,
10530   _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode,
10531   _In_ BOOLEAN Alertable,
10532   _In_opt_ PLARGE_INTEGER Timeout);
10533 
10534 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10535 
10536 #if (NTDDI_VERSION >= NTDDI_WINXP)
10537 
10538 _Requires_lock_not_held_(*LockHandle)
10539 _Acquires_lock_(*LockHandle)
10540 _Post_same_lock_(*SpinLock, *LockHandle)
10541 _IRQL_requires_max_(DISPATCH_LEVEL)
10542 _IRQL_saves_global_(QueuedSpinLock,LockHandle)
10543 _IRQL_raises_(DISPATCH_LEVEL)
10544 _DECL_HAL_KE_IMPORT
10545 VOID
10546 FASTCALL
10547 KeAcquireInStackQueuedSpinLock(
10548   _Inout_ PKSPIN_LOCK SpinLock,
10549   _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
10550 
10551 _Requires_lock_not_held_(*LockHandle)
10552 _Acquires_lock_(*LockHandle)
10553 _Post_same_lock_(*SpinLock, *LockHandle)
10554 _IRQL_requires_min_(DISPATCH_LEVEL)
10555 NTKERNELAPI
10556 VOID
10557 FASTCALL
10558 KeAcquireInStackQueuedSpinLockAtDpcLevel(
10559   _Inout_ PKSPIN_LOCK SpinLock,
10560   _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
10561 
10562 _Requires_lock_not_held_(*Interrupt->ActualLock)
10563 _Acquires_lock_(*Interrupt->ActualLock)
10564 _IRQL_requires_max_(HIGH_LEVEL)
10565 _IRQL_saves_
10566 _IRQL_raises_(HIGH_LEVEL)
10567 NTKERNELAPI
10568 KIRQL
10569 NTAPI
10570 KeAcquireInterruptSpinLock(
10571   _Inout_ PKINTERRUPT Interrupt);
10572 
10573 _IRQL_requires_min_(PASSIVE_LEVEL)
10574 _IRQL_requires_max_(DISPATCH_LEVEL)
10575 NTKERNELAPI
10576 BOOLEAN
10577 NTAPI
10578 KeAreApcsDisabled(VOID);
10579 
10580 NTKERNELAPI
10581 ULONG
10582 NTAPI
10583 KeGetRecommendedSharedDataAlignment(VOID);
10584 
10585 _IRQL_requires_max_(PASSIVE_LEVEL)
10586 NTKERNELAPI
10587 ULONG
10588 NTAPI
10589 KeQueryRuntimeThread(
10590   _In_ PKTHREAD Thread,
10591   _Out_ PULONG UserTime);
10592 
10593 _Requires_lock_held_(*LockHandle)
10594 _Releases_lock_(*LockHandle)
10595 _IRQL_requires_(DISPATCH_LEVEL)
10596 NTKERNELAPI
10597 VOID
10598 FASTCALL
10599 KeReleaseInStackQueuedSpinLockFromDpcLevel(
10600   _In_ PKLOCK_QUEUE_HANDLE LockHandle);
10601 
10602 _Requires_lock_held_(*Interrupt->ActualLock)
10603 _Releases_lock_(*Interrupt->ActualLock)
10604 _IRQL_requires_(HIGH_LEVEL)
10605 NTKERNELAPI
10606 VOID
10607 NTAPI
10608 KeReleaseInterruptSpinLock(
10609   _Inout_ PKINTERRUPT Interrupt,
10610   _In_ _IRQL_restores_ KIRQL OldIrql);
10611 
10612 _IRQL_requires_(DISPATCH_LEVEL)
10613 NTKERNELAPI
10614 PKDEVICE_QUEUE_ENTRY
10615 NTAPI
10616 KeRemoveByKeyDeviceQueueIfBusy(
10617   _Inout_ PKDEVICE_QUEUE DeviceQueue,
10618   _In_ ULONG SortKey);
10619 
10620 _Requires_lock_held_(*LockHandle)
10621 _Releases_lock_(*LockHandle)
10622 _IRQL_requires_(DISPATCH_LEVEL)
10623 _IRQL_restores_global_(QueuedSpinLock,LockHandle)
10624 _DECL_HAL_KE_IMPORT
10625 VOID
10626 FASTCALL
10627 KeReleaseInStackQueuedSpinLock(
10628   _In_ PKLOCK_QUEUE_HANDLE LockHandle);
10629 
10630 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10631 
10632 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
10633 
10634 _Must_inspect_result_
10635 NTKERNELAPI
10636 BOOLEAN
10637 NTAPI
10638 KeDeregisterBugCheckReasonCallback(
10639   _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
10640 
10641 _Must_inspect_result_
10642 NTKERNELAPI
10643 BOOLEAN
10644 NTAPI
10645 KeRegisterBugCheckReasonCallback(
10646   _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
10647   _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
10648   _In_ KBUGCHECK_CALLBACK_REASON Reason,
10649   _In_ PUCHAR Component);
10650 
10651 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
10652 
10653 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
10654 _IRQL_requires_max_(APC_LEVEL)
10655 NTKERNELAPI
10656 VOID
10657 NTAPI
10658 KeFlushQueuedDpcs(VOID);
10659 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
10660 #if (NTDDI_VERSION >= NTDDI_WS03)
10661 
10662 _IRQL_requires_max_(APC_LEVEL)
10663 NTKERNELAPI
10664 PVOID
10665 NTAPI
10666 KeRegisterNmiCallback(
10667   _In_ PNMI_CALLBACK CallbackRoutine,
10668   _In_opt_ PVOID Context);
10669 
10670 _IRQL_requires_max_(APC_LEVEL)
10671 NTKERNELAPI
10672 NTSTATUS
10673 NTAPI
10674 KeDeregisterNmiCallback(
10675   _In_ PVOID Handle);
10676 
10677 NTKERNELAPI
10678 VOID
10679 NTAPI
10680 KeInitializeThreadedDpc(
10681   _Out_ PRKDPC Dpc,
10682   _In_ PKDEFERRED_ROUTINE DeferredRoutine,
10683   _In_opt_ PVOID DeferredContext);
10684 
10685 _IRQL_requires_min_(PASSIVE_LEVEL)
10686 _IRQL_requires_max_(IPI_LEVEL-1)
10687 NTKERNELAPI
10688 ULONG_PTR
10689 NTAPI
10690 KeIpiGenericCall(
10691   _In_ PKIPI_BROADCAST_WORKER BroadcastFunction,
10692   _In_ ULONG_PTR Context);
10693 
10694 _Requires_lock_not_held_(*SpinLock)
10695 _Acquires_lock_(*SpinLock)
10696 _IRQL_requires_max_(DISPATCH_LEVEL)
10697 _IRQL_saves_
10698 NTKERNELAPI
10699 KIRQL
10700 FASTCALL
10701 KeAcquireSpinLockForDpc(
10702   _Inout_ PKSPIN_LOCK SpinLock);
10703 
10704 _Requires_lock_held_(*SpinLock)
10705 _Releases_lock_(*SpinLock)
10706 _IRQL_requires_(DISPATCH_LEVEL)
10707 NTKERNELAPI
10708 VOID
10709 FASTCALL
10710 KeReleaseSpinLockForDpc(
10711   _Inout_ PKSPIN_LOCK SpinLock,
10712   _In_ _IRQL_restores_ KIRQL OldIrql);
10713 
10714 _Must_inspect_result_
10715 NTKERNELAPI
10716 BOOLEAN
10717 FASTCALL
10718 KeTestSpinLock(
10719   _In_ PKSPIN_LOCK SpinLock);
10720 
10721 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10722 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10723 
10724 _Must_inspect_result_
10725 _IRQL_requires_min_(DISPATCH_LEVEL)
10726 _Post_satisfies_(return == 1 || return == 0)
10727 NTKERNELAPI
10728 BOOLEAN
10729 FASTCALL
10730 KeTryToAcquireSpinLockAtDpcLevel(
10731   _Inout_ _Requires_lock_not_held_(*_Curr_)
10732   _When_(return!=0, _Acquires_lock_(*_Curr_))
10733     PKSPIN_LOCK SpinLock);
10734 
10735 _IRQL_requires_min_(PASSIVE_LEVEL)
10736 _IRQL_requires_max_(DISPATCH_LEVEL)
10737 NTKERNELAPI
10738 BOOLEAN
10739 NTAPI
10740 KeAreAllApcsDisabled(VOID);
10741 
10742 _Acquires_lock_(_Global_critical_region_)
10743 _Requires_lock_not_held_(*Mutex)
10744 _Acquires_lock_(*Mutex)
10745 _IRQL_requires_max_(APC_LEVEL)
10746 _IRQL_requires_min_(PASSIVE_LEVEL)
10747 NTKERNELAPI
10748 VOID
10749 FASTCALL
10750 KeAcquireGuardedMutex(
10751   _Inout_ PKGUARDED_MUTEX GuardedMutex);
10752 
10753 _Requires_lock_not_held_(*FastMutex)
10754 _Acquires_lock_(*FastMutex)
10755 _IRQL_requires_max_(APC_LEVEL)
10756 _IRQL_requires_min_(PASSIVE_LEVEL)
10757 NTKERNELAPI
10758 VOID
10759 FASTCALL
10760 KeAcquireGuardedMutexUnsafe(
10761   _Inout_ PKGUARDED_MUTEX GuardedMutex);
10762 
10763 _Acquires_lock_(_Global_critical_region_)
10764 _IRQL_requires_max_(APC_LEVEL)
10765 NTKERNELAPI
10766 VOID
10767 NTAPI
10768 KeEnterGuardedRegion(VOID);
10769 
10770 _Releases_lock_(_Global_critical_region_)
10771 _IRQL_requires_max_(APC_LEVEL)
10772 NTKERNELAPI
10773 VOID
10774 NTAPI
10775 KeLeaveGuardedRegion(VOID);
10776 
10777 _IRQL_requires_max_(APC_LEVEL)
10778 _IRQL_requires_min_(PASSIVE_LEVEL)
10779 NTKERNELAPI
10780 VOID
10781 FASTCALL
10782 KeInitializeGuardedMutex(
10783   _Out_ PKGUARDED_MUTEX GuardedMutex);
10784 
10785 _Requires_lock_held_(*FastMutex)
10786 _Releases_lock_(*FastMutex)
10787 _IRQL_requires_max_(APC_LEVEL)
10788 NTKERNELAPI
10789 VOID
10790 FASTCALL
10791 KeReleaseGuardedMutexUnsafe(
10792   _Inout_ PKGUARDED_MUTEX GuardedMutex);
10793 
10794 _Releases_lock_(_Global_critical_region_)
10795 _Requires_lock_held_(*Mutex)
10796 _Releases_lock_(*Mutex)
10797 _IRQL_requires_max_(APC_LEVEL)
10798 NTKERNELAPI
10799 VOID
10800 FASTCALL
10801 KeReleaseGuardedMutex(
10802   _Inout_ PKGUARDED_MUTEX GuardedMutex);
10803 
10804 _Must_inspect_result_
10805 _Success_(return != FALSE)
10806 _IRQL_requires_max_(APC_LEVEL)
10807 _Post_satisfies_(return == 1 || return == 0)
10808 NTKERNELAPI
10809 BOOLEAN
10810 FASTCALL
10811 KeTryToAcquireGuardedMutex(
10812   _When_ (return, _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)) _Acquires_lock_(_Global_critical_region_)
10813   _Inout_ PKGUARDED_MUTEX GuardedMutex);
10814 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
10815 
10816 #if (NTDDI_VERSION >= NTDDI_VISTA)
10817 _Requires_lock_not_held_(*LockHandle)
10818 _Acquires_lock_(*LockHandle)
10819 _Post_same_lock_(*SpinLock, *LockHandle)
10820 _IRQL_requires_max_(DISPATCH_LEVEL)
10821 _IRQL_saves_global_(QueuedSpinLock,LockHandle)
10822 NTKERNELAPI
10823 VOID
10824 FASTCALL
10825 KeAcquireInStackQueuedSpinLockForDpc(
10826   _Inout_ PKSPIN_LOCK SpinLock,
10827   _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
10828 
10829 _Requires_lock_held_(*LockHandle)
10830 _Releases_lock_(*LockHandle)
10831 _IRQL_requires_(DISPATCH_LEVEL)
10832 _IRQL_restores_global_(QueuedSpinLock,LockHandle)
10833 NTKERNELAPI
10834 VOID
10835 FASTCALL
10836 KeReleaseInStackQueuedSpinLockForDpc(
10837   _In_ PKLOCK_QUEUE_HANDLE LockHandle);
10838 
10839 _IRQL_requires_(DISPATCH_LEVEL)
10840 NTKERNELAPI
10841 NTSTATUS
10842 NTAPI
10843 KeQueryDpcWatchdogInformation(
10844   _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
10845 #if defined(SINGLE_GROUP_LEGACY_API)
10846 
10847 _IRQL_requires_min_(PASSIVE_LEVEL)
10848 _IRQL_requires_max_(APC_LEVEL)
10849 NTKERNELAPI
10850 KAFFINITY
10851 NTAPI
10852 KeSetSystemAffinityThreadEx(
10853   _In_ KAFFINITY Affinity);
10854 
10855 _IRQL_requires_min_(PASSIVE_LEVEL)
10856 _IRQL_requires_max_(APC_LEVEL)
10857 NTKERNELAPI
10858 VOID
10859 NTAPI
10860 KeRevertToUserAffinityThreadEx(
10861   _In_ KAFFINITY Affinity);
10862 
10863 NTKERNELAPI
10864 ULONG
10865 NTAPI
10866 KeQueryActiveProcessorCount(
10867   _Out_opt_ PKAFFINITY ActiveProcessors);
10868 
10869 NTKERNELAPI
10870 ULONG
10871 NTAPI
10872 KeQueryMaximumProcessorCount(VOID);
10873 #endif /* SINGLE_GROUP_LEGACY_API */
10874 
10875 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10876 
10877 #if (NTDDI_VERSION >= NTDDI_WS08)
10878 
10879 _IRQL_requires_max_(APC_LEVEL)
10880 PVOID
10881 NTAPI
10882 KeRegisterProcessorChangeCallback(
10883   _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
10884   _In_opt_ PVOID CallbackContext,
10885   _In_ ULONG Flags);
10886 
10887 _IRQL_requires_max_(APC_LEVEL)
10888 VOID
10889 NTAPI
10890 KeDeregisterProcessorChangeCallback(
10891   _In_ PVOID CallbackHandle);
10892 
10893 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
10894 #if (NTDDI_VERSION >= NTDDI_WIN7)
10895 
10896 _IRQL_requires_max_(DISPATCH_LEVEL)
10897 _IRQL_requires_min_(PASSIVE_LEVEL)
10898 _IRQL_requires_same_
10899 ULONG64
10900 NTAPI
10901 KeQueryTotalCycleTimeProcess(
10902   _Inout_ PKPROCESS Process,
10903   _Out_ PULONG64 CycleTimeStamp);
10904 
10905 _IRQL_requires_max_(APC_LEVEL)
10906 _IRQL_requires_min_(PASSIVE_LEVEL)
10907 _IRQL_requires_same_
10908 ULONG64
10909 NTAPI
10910 KeQueryTotalCycleTimeThread(
10911   _Inout_ PKTHREAD Thread,
10912   _Out_ PULONG64 CycleTimeStamp);
10913 
10914 _Must_inspect_result_
10915 NTKERNELAPI
10916 NTSTATUS
10917 NTAPI
10918 KeSetTargetProcessorDpcEx(
10919   _Inout_ PKDPC Dpc,
10920   _In_ PPROCESSOR_NUMBER ProcNumber);
10921 
10922 _IRQL_requires_min_(PASSIVE_LEVEL)
10923 _IRQL_requires_max_(APC_LEVEL)
10924 NTKERNELAPI
10925 VOID
10926 NTAPI
10927 KeSetSystemGroupAffinityThread(
10928   _In_ PGROUP_AFFINITY Affinity,
10929   _Out_opt_ PGROUP_AFFINITY PreviousAffinity);
10930 
10931 _IRQL_requires_min_(PASSIVE_LEVEL)
10932 _IRQL_requires_max_(APC_LEVEL)
10933 NTKERNELAPI
10934 VOID
10935 NTAPI
10936 KeRevertToUserGroupAffinityThread(
10937   _In_ PGROUP_AFFINITY PreviousAffinity);
10938 
10939 _IRQL_requires_max_(DISPATCH_LEVEL)
10940 NTKERNELAPI
10941 BOOLEAN
10942 NTAPI
10943 KeSetCoalescableTimer(
10944   _Inout_ PKTIMER Timer,
10945   _In_ LARGE_INTEGER DueTime,
10946   _In_ ULONG Period,
10947   _In_ ULONG TolerableDelay,
10948   _In_opt_ PKDPC Dpc);
10949 
10950 NTKERNELAPI
10951 ULONGLONG
10952 NTAPI
10953 KeQueryUnbiasedInterruptTime(VOID);
10954 
10955 NTKERNELAPI
10956 ULONG
10957 NTAPI
10958 KeQueryActiveProcessorCountEx(
10959   _In_ USHORT GroupNumber);
10960 
10961 NTKERNELAPI
10962 ULONG
10963 NTAPI
10964 KeQueryMaximumProcessorCountEx(
10965   _In_ USHORT GroupNumber);
10966 
10967 NTKERNELAPI
10968 USHORT
10969 NTAPI
10970 KeQueryActiveGroupCount(VOID);
10971 
10972 NTKERNELAPI
10973 USHORT
10974 NTAPI
10975 KeQueryMaximumGroupCount(VOID);
10976 
10977 NTKERNELAPI
10978 KAFFINITY
10979 NTAPI
10980 KeQueryGroupAffinity(
10981   _In_ USHORT GroupNumber);
10982 
10983 NTKERNELAPI
10984 ULONG
10985 NTAPI
10986 KeGetCurrentProcessorNumberEx(
10987   _Out_opt_ PPROCESSOR_NUMBER ProcNumber);
10988 
10989 NTKERNELAPI
10990 VOID
10991 NTAPI
10992 KeQueryNodeActiveAffinity(
10993   _In_ USHORT NodeNumber,
10994   _Out_opt_ PGROUP_AFFINITY Affinity,
10995   _Out_opt_ PUSHORT Count);
10996 
10997 NTKERNELAPI
10998 USHORT
10999 NTAPI
11000 KeQueryNodeMaximumProcessorCount(
11001   _In_ USHORT NodeNumber);
11002 
11003 NTKERNELAPI
11004 USHORT
11005 NTAPI
11006 KeQueryHighestNodeNumber(VOID);
11007 
11008 NTKERNELAPI
11009 USHORT
11010 NTAPI
11011 KeGetCurrentNodeNumber(VOID);
11012 
11013 _IRQL_requires_max_(DISPATCH_LEVEL)
11014 NTKERNELAPI
11015 NTSTATUS
11016 NTAPI
11017 KeQueryLogicalProcessorRelationship(
11018   _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
11019   _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
11020   _Out_writes_bytes_opt_(*Length) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information,
11021   _Inout_ PULONG Length);
11022 
11023 _Must_inspect_result_
11024 _IRQL_requires_max_(DISPATCH_LEVEL)
11025 _Ret_range_(<=, 0)
11026 _When_(return==0, _Kernel_float_saved_)
11027 NTKERNELAPI
11028 NTSTATUS
11029 NTAPI
11030 KeSaveExtendedProcessorState(
11031   _In_ ULONG64 Mask,
11032   _Out_ _Requires_lock_not_held_(*_Curr_)
11033   _When_(return==0, _Acquires_lock_(*_Curr_))
11034     PXSTATE_SAVE XStateSave);
11035 
11036 _Kernel_float_restored_
11037 NTKERNELAPI
11038 VOID
11039 NTAPI
11040 KeRestoreExtendedProcessorState(
11041   _In_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
11042     PXSTATE_SAVE XStateSave);
11043 
11044 NTSTATUS
11045 NTAPI
11046 KeGetProcessorNumberFromIndex(
11047   _In_ ULONG ProcIndex,
11048   _Out_ PPROCESSOR_NUMBER ProcNumber);
11049 
11050 ULONG
11051 NTAPI
11052 KeGetProcessorIndexFromNumber(
11053   _In_ PPROCESSOR_NUMBER ProcNumber);
11054 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
11055 #if !defined(_IA64_)
11056 NTHALAPI
11057 VOID
11058 NTAPI
11059 KeFlushWriteBuffer(VOID);
11060 #endif
11061 
11062 /* VOID
11063  * KeInitializeCallbackRecord(
11064  *   IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
11065  */
11066 #define KeInitializeCallbackRecord(CallbackRecord) \
11067   CallbackRecord->State = BufferEmpty;
11068 
11069 #if defined(_PREFAST_)
11070 
11071 void __PREfastPagedCode(void);
11072 void __PREfastPagedCodeLocked(void);
11073 #define PAGED_CODE() __PREfastPagedCode();
11074 #define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked();
11075 
11076 #elif DBG
11077 
11078 #if (NTDDI_VERSION >= NTDDI_VISTA)
11079 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
11080 #else
11081 #define PAGED_ASSERT( exp ) ASSERT( exp )
11082 #endif
11083 
11084 #define PAGED_CODE() { \
11085   if (KeGetCurrentIrql() > APC_LEVEL) { \
11086     KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
11087     PAGED_ASSERT(FALSE); \
11088   } \
11089 }
11090 
11091 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
11092 
11093 #else
11094 
11095 #define PAGED_CODE() NOP_FUNCTION;
11096 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
11097 
11098 #endif /* DBG */
11099 
11100 /******************************************************************************
11101  *                       Memory manager Functions                             *
11102  ******************************************************************************/
11103 /* Alignment Macros */
11104 #define ALIGN_DOWN_BY(size, align) \
11105     ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
11106 
11107 #define ALIGN_UP_BY(size, align) \
11108     (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
11109 
11110 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
11111     ((PVOID)ALIGN_DOWN_BY(ptr, align))
11112 
11113 #define ALIGN_UP_POINTER_BY(ptr, align) \
11114     ((PVOID)ALIGN_UP_BY(ptr, align))
11115 
11116 #define ALIGN_DOWN(size, type) \
11117     ALIGN_DOWN_BY(size, sizeof(type))
11118 
11119 #define ALIGN_UP(size, type) \
11120     ALIGN_UP_BY(size, sizeof(type))
11121 
11122 #define ALIGN_DOWN_POINTER(ptr, type) \
11123     ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
11124 
11125 #define ALIGN_UP_POINTER(ptr, type) \
11126     ALIGN_UP_POINTER_BY(ptr, sizeof(type))
11127 
11128 #ifndef FIELD_OFFSET
11129 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
11130 #endif
11131 
11132 #ifndef FIELD_SIZE
11133 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
11134 #endif
11135 
11136 #define POOL_TAGGING                             1
11137 
11138 #if DBG
11139 #define IF_DEBUG if (TRUE)
11140 #else
11141 #define IF_DEBUG if (FALSE)
11142 #endif /* DBG */
11143 
11144 /* ULONG
11145  * BYTE_OFFSET(
11146  *   IN PVOID Va)
11147  */
11148 #define BYTE_OFFSET(Va) \
11149   ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
11150 
11151 /* ULONG
11152  * BYTES_TO_PAGES(
11153  *   IN ULONG Size)
11154  */
11155 #define BYTES_TO_PAGES(Size) \
11156   (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT)
11157 
11158 /* PVOID
11159  * PAGE_ALIGN(
11160  *   IN PVOID Va)
11161  */
11162 #define PAGE_ALIGN(Va) \
11163   ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
11164 
11165 /* ULONG_PTR
11166  * ROUND_TO_PAGES(
11167  *   IN ULONG_PTR Size)
11168  */
11169 #define ROUND_TO_PAGES(Size) \
11170   (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
11171 
11172 /* ULONG
11173  * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
11174  *   IN PVOID Va,
11175  *   IN ULONG Size)
11176  */
11177 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
11178   ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
11179     + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
11180 
11181 #define COMPUTE_PAGES_SPANNED(Va, Size) \
11182     ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
11183 
11184 /*
11185  * ULONG
11186  * MmGetMdlByteCount(
11187  *   IN PMDL  Mdl)
11188  */
11189 #define MmGetMdlByteCount(_Mdl) \
11190   ((_Mdl)->ByteCount)
11191 
11192 /*
11193  * ULONG
11194  * MmGetMdlByteOffset(
11195  *   IN PMDL  Mdl)
11196  */
11197 #define MmGetMdlByteOffset(_Mdl) \
11198   ((_Mdl)->ByteOffset)
11199 
11200 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
11201 
11202 /*
11203  * PPFN_NUMBER
11204  * MmGetMdlPfnArray(
11205  *   IN PMDL  Mdl)
11206  */
11207 #define MmGetMdlPfnArray(_Mdl) \
11208   ((PPFN_NUMBER) ((_Mdl) + 1))
11209 
11210 /*
11211  * PVOID
11212  * MmGetMdlVirtualAddress(
11213  *   IN PMDL  Mdl)
11214  */
11215 #define MmGetMdlVirtualAddress(_Mdl) \
11216   ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
11217 
11218 #define MmGetProcedureAddress(Address) (Address)
11219 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
11220 
11221 /* PVOID MmGetSystemAddressForMdl(
11222  *     IN PMDL Mdl);
11223  */
11224 #define MmGetSystemAddressForMdl(Mdl) \
11225   (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
11226     MDL_SOURCE_IS_NONPAGED_POOL)) ? \
11227       ((Mdl)->MappedSystemVa) : \
11228       (MmMapLockedPages((Mdl), KernelMode)))
11229 
11230 /* PVOID
11231  * MmGetSystemAddressForMdlSafe(
11232  *     IN PMDL Mdl,
11233  *     IN MM_PAGE_PRIORITY Priority)
11234  */
11235 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
11236   (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
11237     | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
11238     (_Mdl)->MappedSystemVa : \
11239     (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
11240       KernelMode, MmCached, NULL, FALSE, (_Priority)))
11241 
11242 /*
11243  * VOID
11244  * MmInitializeMdl(
11245  *   IN PMDL  MemoryDescriptorList,
11246  *   IN PVOID  BaseVa,
11247  *   IN SIZE_T  Length)
11248  */
11249 #define MmInitializeMdl(_MemoryDescriptorList, \
11250                         _BaseVa, \
11251                         _Length) \
11252 { \
11253   (_MemoryDescriptorList)->Next = (PMDL) NULL; \
11254   (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
11255     (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
11256   (_MemoryDescriptorList)->MdlFlags = 0; \
11257   (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
11258   (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
11259   (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
11260 }
11261 
11262 /*
11263  * VOID
11264  * MmPrepareMdlForReuse(
11265  *   IN PMDL  Mdl)
11266  */
11267 #define MmPrepareMdlForReuse(_Mdl) \
11268 { \
11269   if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
11270     ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
11271     MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
11272   } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
11273     ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
11274   } \
11275 }
11276 
11277 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11278 _Must_inspect_result_
11279 _IRQL_requires_max_(DISPATCH_LEVEL)
11280 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
11281 NTKERNELAPI
11282 PVOID
11283 NTAPI
11284 MmAllocateContiguousMemory(
11285   _In_ SIZE_T NumberOfBytes,
11286   _In_ PHYSICAL_ADDRESS HighestAcceptableAddress);
11287 
11288 _Must_inspect_result_
11289 _IRQL_requires_max_(DISPATCH_LEVEL)
11290 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
11291 NTKERNELAPI
11292 PVOID
11293 NTAPI
11294 MmAllocateContiguousMemorySpecifyCache(
11295   _In_ SIZE_T NumberOfBytes,
11296   _In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
11297   _In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
11298   _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
11299   _In_ MEMORY_CACHING_TYPE CacheType);
11300 
11301 _Must_inspect_result_
11302 _IRQL_requires_max_(DISPATCH_LEVEL)
11303 NTKERNELAPI
11304 PMDL
11305 NTAPI
11306 MmAllocatePagesForMdl(
11307   _In_ PHYSICAL_ADDRESS LowAddress,
11308   _In_ PHYSICAL_ADDRESS HighAddress,
11309   _In_ PHYSICAL_ADDRESS SkipBytes,
11310   _In_ SIZE_T TotalBytes);
11311 
11312 _IRQL_requires_max_(DISPATCH_LEVEL)
11313 NTKERNELAPI
11314 VOID
11315 NTAPI
11316 MmBuildMdlForNonPagedPool(
11317   _Inout_ PMDLX MemoryDescriptorList);
11318 
11319 //DECLSPEC_DEPRECATED_DDK
11320 NTKERNELAPI
11321 PMDL
11322 NTAPI
11323 MmCreateMdl(
11324   _Out_writes_bytes_opt_ (sizeof (MDL) + (sizeof (PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base, Length)))
11325     PMDL MemoryDescriptorList,
11326   _In_reads_bytes_opt_ (Length) PVOID Base,
11327   _In_ SIZE_T Length);
11328 
11329 _IRQL_requires_max_(DISPATCH_LEVEL)
11330 NTKERNELAPI
11331 VOID
11332 NTAPI
11333 MmFreeContiguousMemory(
11334   _In_ PVOID BaseAddress);
11335 
11336 _IRQL_requires_max_ (DISPATCH_LEVEL)
11337 NTKERNELAPI
11338 VOID
11339 NTAPI
11340 MmFreeContiguousMemorySpecifyCache(
11341   _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress,
11342   _In_ SIZE_T NumberOfBytes,
11343   _In_ MEMORY_CACHING_TYPE CacheType);
11344 
11345 _IRQL_requires_max_(DISPATCH_LEVEL)
11346 NTKERNELAPI
11347 VOID
11348 NTAPI
11349 MmFreePagesFromMdl(
11350   _Inout_ PMDLX MemoryDescriptorList);
11351 
11352 _IRQL_requires_max_(PASSIVE_LEVEL)
11353 NTKERNELAPI
11354 PVOID
11355 NTAPI
11356 MmGetSystemRoutineAddress(
11357   _In_ PUNICODE_STRING SystemRoutineName);
11358 
11359 NTKERNELAPI
11360 LOGICAL
11361 NTAPI
11362 MmIsDriverVerifying(
11363   _In_ struct _DRIVER_OBJECT *DriverObject);
11364 
11365 _Must_inspect_result_
11366 _IRQL_requires_max_(APC_LEVEL)
11367 NTKERNELAPI
11368 PVOID
11369 NTAPI
11370 MmLockPagableDataSection(
11371   _In_ PVOID AddressWithinSection);
11372 
11373 _Must_inspect_result_
11374 _IRQL_requires_max_(DISPATCH_LEVEL)
11375 _Out_writes_bytes_opt_ (NumberOfBytes)
11376 NTKERNELAPI
11377 PVOID
11378 NTAPI
11379 MmMapIoSpace(
11380   _In_ PHYSICAL_ADDRESS PhysicalAddress,
11381   _In_ SIZE_T NumberOfBytes,
11382   _In_ MEMORY_CACHING_TYPE CacheType);
11383 
11384 _Must_inspect_result_
11385 _When_(AccessMode==0, _IRQL_requires_max_(DISPATCH_LEVEL))
11386 _When_(AccessMode==1, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL))
11387 NTKERNELAPI
11388 PVOID
11389 NTAPI
11390 MmMapLockedPages(
11391   _Inout_ PMDL MemoryDescriptorList,
11392   _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst)
11393     KPROCESSOR_MODE AccessMode);
11394 
11395 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)
11396 _When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL))
11397 _When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL) _Post_notnull_)
11398 _At_(MemoryDescriptorList->MappedSystemVa, _Post_writable_byte_size_(MemoryDescriptorList->ByteCount))
11399 _Must_inspect_result_
11400 _Success_(return != NULL)
11401 NTKERNELAPI
11402 PVOID
11403 NTAPI
11404 MmMapLockedPagesSpecifyCache(
11405   _Inout_ PMDLX MemoryDescriptorList,
11406   _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst)
11407     KPROCESSOR_MODE AccessMode,
11408   _In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType,
11409   _In_opt_ PVOID BaseAddress,
11410   _In_ ULONG BugCheckOnFailure,
11411   _In_ MM_PAGE_PRIORITY Priority);
11412 
11413 _IRQL_requires_max_(APC_LEVEL)
11414 NTKERNELAPI
11415 PVOID
11416 NTAPI
11417 MmPageEntireDriver(
11418   _In_ PVOID AddressWithinSection);
11419 
11420 _IRQL_requires_max_(DISPATCH_LEVEL)
11421 _At_(MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset,
11422   _Field_size_bytes_opt_(MemoryDescriptorList->ByteCount))
11423 NTKERNELAPI
11424 VOID
11425 NTAPI
11426 MmProbeAndLockPages(
11427   _Inout_ PMDLX MemoryDescriptorList,
11428   _In_ KPROCESSOR_MODE AccessMode,
11429   _In_ LOCK_OPERATION Operation);
11430 
11431 NTKERNELAPI
11432 MM_SYSTEMSIZE
11433 NTAPI
11434 MmQuerySystemSize(VOID);
11435 
11436 _IRQL_requires_max_(APC_LEVEL)
11437 NTKERNELAPI
11438 VOID
11439 NTAPI
11440 MmResetDriverPaging(
11441   _In_ PVOID AddressWithinSection);
11442 
11443 NTKERNELAPI
11444 SIZE_T
11445 NTAPI
11446 MmSizeOfMdl(
11447   _In_reads_bytes_opt_ (Length) PVOID Base,
11448   _In_ SIZE_T Length);
11449 
11450 _IRQL_requires_max_(DISPATCH_LEVEL)
11451 NTKERNELAPI
11452 VOID
11453 NTAPI
11454 MmUnlockPagableImageSection(
11455   _In_ PVOID ImageSectionHandle);
11456 
11457 _IRQL_requires_max_(DISPATCH_LEVEL)
11458 NTKERNELAPI
11459 VOID
11460 NTAPI
11461 MmUnlockPages(
11462   _Inout_ PMDLX MemoryDescriptorList);
11463 
11464 _IRQL_requires_max_(DISPATCH_LEVEL)
11465 NTKERNELAPI
11466 VOID
11467 NTAPI
11468 MmUnmapIoSpace(
11469   _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress,
11470   _In_ SIZE_T NumberOfBytes);
11471 
11472 _IRQL_requires_max_ (APC_LEVEL)
11473 NTKERNELAPI
11474 VOID
11475 NTAPI
11476 MmProbeAndLockProcessPages(
11477   _Inout_ PMDL MemoryDescriptorList,
11478   _In_ PEPROCESS Process,
11479   _In_ KPROCESSOR_MODE AccessMode,
11480   _In_ LOCK_OPERATION Operation);
11481 
11482 _IRQL_requires_max_(DISPATCH_LEVEL)
11483 NTKERNELAPI
11484 VOID
11485 NTAPI
11486 MmUnmapLockedPages(
11487   _In_ PVOID BaseAddress,
11488   _Inout_ PMDL MemoryDescriptorList);
11489 
11490 _Must_inspect_result_
11491 _IRQL_requires_max_(DISPATCH_LEVEL)
11492 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
11493 NTKERNELAPI
11494 PVOID
11495 NTAPI
11496 MmAllocateContiguousMemorySpecifyCacheNode(
11497   _In_ SIZE_T NumberOfBytes,
11498   _In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
11499   _In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
11500   _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
11501   _In_ MEMORY_CACHING_TYPE CacheType,
11502   _In_ NODE_REQUIREMENT PreferredNode);
11503 
11504 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11505 
11506 #if (NTDDI_VERSION >= NTDDI_WINXP)
11507 
11508 _IRQL_requires_max_(DISPATCH_LEVEL)
11509 NTKERNELAPI
11510 NTSTATUS
11511 NTAPI
11512 MmAdvanceMdl(
11513   _Inout_ PMDLX Mdl,
11514   _In_ ULONG NumberOfBytes);
11515 
11516 _Must_inspect_result_
11517 _IRQL_requires_max_(APC_LEVEL)
11518 _When_ (return != NULL, _Out_writes_bytes_opt_ (NumberOfBytes))
11519 NTKERNELAPI
11520 PVOID
11521 NTAPI
11522 MmAllocateMappingAddress(
11523   _In_ SIZE_T NumberOfBytes,
11524   _In_ ULONG PoolTag);
11525 
11526 _IRQL_requires_max_(APC_LEVEL)
11527 NTKERNELAPI
11528 VOID
11529 NTAPI
11530 MmFreeMappingAddress(
11531   _In_ PVOID BaseAddress,
11532   _In_ ULONG PoolTag);
11533 
11534 _IRQL_requires_max_ (APC_LEVEL)
11535 NTKERNELAPI
11536 NTSTATUS
11537 NTAPI
11538 MmIsVerifierEnabled(
11539   _Out_ PULONG VerifierFlags);
11540 
11541 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)
11542 _IRQL_requires_max_(DISPATCH_LEVEL)
11543 _At_(MemoryDescriptorList->MappedSystemVa + MemoryDescriptorList->ByteOffset,
11544   _Post_writable_byte_size_(MemoryDescriptorList->ByteCount))
11545 _Must_inspect_result_
11546 _Success_(return != NULL)
11547 NTKERNELAPI
11548 PVOID
11549 NTAPI
11550 MmMapLockedPagesWithReservedMapping(
11551   _In_ PVOID MappingAddress,
11552   _In_ ULONG PoolTag,
11553   _Inout_ PMDLX MemoryDescriptorList,
11554   _In_ __drv_strictTypeMatch(__drv_typeCond)
11555     MEMORY_CACHING_TYPE CacheType);
11556 
11557 _Must_inspect_result_
11558 _IRQL_requires_max_(DISPATCH_LEVEL)
11559 NTKERNELAPI
11560 NTSTATUS
11561 NTAPI
11562 MmProtectMdlSystemAddress(
11563   _In_ PMDLX MemoryDescriptorList,
11564   _In_ ULONG NewProtect);
11565 
11566 _IRQL_requires_max_(DISPATCH_LEVEL)
11567 NTKERNELAPI
11568 VOID
11569 NTAPI
11570 MmUnmapReservedMapping(
11571   _In_ PVOID BaseAddress,
11572   _In_ ULONG PoolTag,
11573   _Inout_ PMDLX MemoryDescriptorList);
11574 
11575 _IRQL_requires_max_ (APC_LEVEL)
11576 NTKERNELAPI
11577 NTSTATUS
11578 NTAPI
11579 MmAddVerifierThunks(
11580   _In_reads_bytes_ (ThunkBufferSize) PVOID ThunkBuffer,
11581   _In_ ULONG ThunkBufferSize);
11582 
11583 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
11584 #if (NTDDI_VERSION >= NTDDI_WS03)
11585 _IRQL_requires_max_ (DISPATCH_LEVEL)
11586 NTKERNELAPI
11587 LOGICAL
11588 NTAPI
11589 MmIsIoSpaceActive(
11590   _In_ PHYSICAL_ADDRESS StartAddress,
11591   _In_ SIZE_T NumberOfBytes);
11592 
11593 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
11594 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11595 _Must_inspect_result_
11596 _IRQL_requires_max_ (DISPATCH_LEVEL)
11597 NTKERNELAPI
11598 PMDL
11599 NTAPI
11600 MmAllocatePagesForMdlEx(
11601   _In_ PHYSICAL_ADDRESS LowAddress,
11602   _In_ PHYSICAL_ADDRESS HighAddress,
11603   _In_ PHYSICAL_ADDRESS SkipBytes,
11604   _In_ SIZE_T TotalBytes,
11605   _In_ MEMORY_CACHING_TYPE CacheType,
11606   _In_ ULONG Flags);
11607 #endif
11608 
11609 #if (NTDDI_VERSION >= NTDDI_VISTA)
11610 _IRQL_requires_max_ (APC_LEVEL)
11611 NTKERNELAPI
11612 LOGICAL
11613 NTAPI
11614 MmIsDriverVerifyingByAddress(
11615   _In_ PVOID AddressWithinSection);
11616 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11617 
11618 /******************************************************************************
11619  *                            Security Manager Functions                      *
11620  ******************************************************************************/
11621 
11622 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11623 _IRQL_requires_max_(PASSIVE_LEVEL)
11624 NTKERNELAPI
11625 BOOLEAN
11626 NTAPI
11627 SeAccessCheck(
11628   _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
11629   _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
11630   _In_ BOOLEAN SubjectContextLocked,
11631   _In_ ACCESS_MASK DesiredAccess,
11632   _In_ ACCESS_MASK PreviouslyGrantedAccess,
11633   _Outptr_opt_ PPRIVILEGE_SET *Privileges,
11634   _In_ PGENERIC_MAPPING GenericMapping,
11635   _In_ KPROCESSOR_MODE AccessMode,
11636   _Out_ PACCESS_MASK GrantedAccess,
11637   _Out_ PNTSTATUS AccessStatus);
11638 
11639 _IRQL_requires_max_(PASSIVE_LEVEL)
11640 NTKERNELAPI
11641 NTSTATUS
11642 NTAPI
11643 SeAssignSecurity(
11644   _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,
11645   _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor,
11646   _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
11647   _In_ BOOLEAN IsDirectoryObject,
11648   _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext,
11649   _In_ PGENERIC_MAPPING GenericMapping,
11650   _In_ POOL_TYPE PoolType);
11651 
11652 NTKERNELAPI
11653 NTSTATUS
11654 NTAPI
11655 SeAssignSecurityEx(
11656   _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,
11657   _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor,
11658   _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
11659   _In_opt_ GUID *ObjectType,
11660   _In_ BOOLEAN IsDirectoryObject,
11661   _In_ ULONG AutoInheritFlags,
11662   _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext,
11663   _In_ PGENERIC_MAPPING GenericMapping,
11664   _In_ POOL_TYPE PoolType);
11665 
11666 _IRQL_requires_max_(PASSIVE_LEVEL)
11667 NTKERNELAPI
11668 NTSTATUS
11669 NTAPI
11670 SeDeassignSecurity(
11671   _Inout_ PSECURITY_DESCRIPTOR *SecurityDescriptor);
11672 
11673 _IRQL_requires_max_(PASSIVE_LEVEL)
11674 NTKERNELAPI
11675 BOOLEAN
11676 NTAPI
11677 SeValidSecurityDescriptor(
11678   _In_ ULONG Length,
11679   _In_reads_bytes_(Length) PSECURITY_DESCRIPTOR SecurityDescriptor);
11680 
11681 NTKERNELAPI
11682 ULONG
11683 NTAPI
11684 SeObjectCreateSaclAccessBits(
11685   _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
11686 
11687 NTKERNELAPI
11688 VOID
11689 NTAPI
11690 SeReleaseSubjectContext(
11691   _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
11692 
11693 NTKERNELAPI
11694 VOID
11695 NTAPI
11696 SeUnlockSubjectContext(
11697   _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
11698 
11699 NTKERNELAPI
11700 VOID
11701 NTAPI
11702 SeCaptureSubjectContext(
11703   _Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
11704 
11705 NTKERNELAPI
11706 VOID
11707 NTAPI
11708 SeLockSubjectContext(
11709   _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
11710 
11711 
11712 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11713 
11714 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11715 
11716 _At_(AuditParameters->ParameterCount, _Const_)
11717 NTSTATUS
11718 NTAPI
11719 SeSetAuditParameter(
11720   _Inout_ PSE_ADT_PARAMETER_ARRAY AuditParameters,
11721   _In_ SE_ADT_PARAMETER_TYPE Type,
11722   _In_range_(<,SE_MAX_AUDIT_PARAMETERS) ULONG Index,
11723   _In_reads_(_Inexpressible_("depends on SE_ADT_PARAMETER_TYPE"))
11724     PVOID Data);
11725 
11726 NTSTATUS
11727 NTAPI
11728 SeReportSecurityEvent(
11729   _In_ ULONG Flags,
11730   _In_ PUNICODE_STRING SourceName,
11731   _In_opt_ PSID UserSid,
11732   _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters);
11733 
11734 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11735 
11736 #if (NTDDI_VERSION >= NTDDI_VISTA)
11737 NTKERNELAPI
11738 ULONG
11739 NTAPI
11740 SeComputeAutoInheritByObjectType(
11741   _In_ PVOID ObjectType,
11742   _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,
11743   _In_opt_ PSECURITY_DESCRIPTOR ParentSecurityDescriptor);
11744 
11745 #ifdef SE_NTFS_WORLD_CACHE
11746 VOID
11747 NTAPI
11748 SeGetWorldRights(
11749   _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
11750   _In_ PGENERIC_MAPPING GenericMapping,
11751   _Out_ PACCESS_MASK GrantedAccess);
11752 #endif /* SE_NTFS_WORLD_CACHE */
11753 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11754 /******************************************************************************
11755  *                         Configuration Manager Functions                    *
11756  ******************************************************************************/
11757 
11758 #if (NTDDI_VERSION >= NTDDI_WINXP)
11759 _IRQL_requires_max_(APC_LEVEL)
11760 NTKERNELAPI
11761 NTSTATUS
11762 NTAPI
11763 CmRegisterCallback(
11764   _In_ PEX_CALLBACK_FUNCTION Function,
11765   _In_opt_ PVOID Context,
11766   _Out_ PLARGE_INTEGER Cookie);
11767 
11768 _IRQL_requires_max_(APC_LEVEL)
11769 NTKERNELAPI
11770 NTSTATUS
11771 NTAPI
11772 CmUnRegisterCallback(
11773   _In_ LARGE_INTEGER Cookie);
11774 #endif
11775 
11776 #if (NTDDI_VERSION >= NTDDI_VISTA)
11777 
11778 _IRQL_requires_max_(APC_LEVEL)
11779 NTKERNELAPI
11780 NTSTATUS
11781 NTAPI
11782 CmRegisterCallbackEx(
11783   _In_ PEX_CALLBACK_FUNCTION Function,
11784   _In_ PCUNICODE_STRING Altitude,
11785   _In_ PVOID Driver,
11786   _In_opt_ PVOID Context,
11787   _Out_ PLARGE_INTEGER Cookie,
11788   _Reserved_ PVOID Reserved);
11789 
11790 _IRQL_requires_max_(APC_LEVEL)
11791 NTKERNELAPI
11792 VOID
11793 NTAPI
11794 CmGetCallbackVersion(
11795   _Out_opt_ PULONG Major,
11796   _Out_opt_ PULONG Minor);
11797 
11798 _IRQL_requires_max_(APC_LEVEL)
11799 NTKERNELAPI
11800 NTSTATUS
11801 NTAPI
11802 CmSetCallbackObjectContext(
11803   _Inout_ PVOID Object,
11804   _In_ PLARGE_INTEGER Cookie,
11805   _In_ PVOID NewContext,
11806   _Out_opt_ PVOID *OldContext);
11807 
11808 _IRQL_requires_max_(APC_LEVEL)
11809 NTKERNELAPI
11810 NTSTATUS
11811 NTAPI
11812 CmCallbackGetKeyObjectID(
11813   _In_ PLARGE_INTEGER Cookie,
11814   _In_ PVOID Object,
11815   _Out_opt_ PULONG_PTR ObjectID,
11816   _Outptr_opt_ PCUNICODE_STRING *ObjectName);
11817 
11818 _IRQL_requires_max_(APC_LEVEL)
11819 NTKERNELAPI
11820 PVOID
11821 NTAPI
11822 CmGetBoundTransaction(
11823   _In_ PLARGE_INTEGER Cookie,
11824   _In_ PVOID Object);
11825 
11826 #endif // NTDDI_VERSION >= NTDDI_VISTA
11827 
11828 
11829 /******************************************************************************
11830  *                         I/O Manager Functions                              *
11831  ******************************************************************************/
11832 
11833 /*
11834  * NTSTATUS
11835  * IoAcquireRemoveLock(
11836  *   IN PIO_REMOVE_LOCK  RemoveLock,
11837  *   IN OPTIONAL PVOID  Tag)
11838  */
11839 #if DBG
11840 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11841   IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
11842 #else
11843 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11844   IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
11845 #endif
11846 
11847 /*
11848  * VOID
11849  * IoAdjustPagingPathCount(
11850  *   IN PLONG  Count,
11851  *   IN BOOLEAN  Increment)
11852  */
11853 #define IoAdjustPagingPathCount(_Count, \
11854                                 _Increment) \
11855 { \
11856   if (_Increment) \
11857     { \
11858       InterlockedIncrement(_Count); \
11859     } \
11860   else \
11861     { \
11862       InterlockedDecrement(_Count); \
11863     } \
11864 }
11865 
11866 #if !defined(_M_AMD64)
11867 NTHALAPI
11868 VOID
11869 NTAPI
11870 READ_PORT_BUFFER_UCHAR(
11871   IN PUCHAR Port,
11872   IN PUCHAR Buffer,
11873   IN ULONG Count);
11874 
11875 NTHALAPI
11876 VOID
11877 NTAPI
11878 READ_PORT_BUFFER_ULONG(
11879   IN PULONG Port,
11880   IN PULONG Buffer,
11881   IN ULONG Count);
11882 
11883 NTHALAPI
11884 VOID
11885 NTAPI
11886 READ_PORT_BUFFER_USHORT(
11887   IN PUSHORT Port,
11888   IN PUSHORT Buffer,
11889   IN ULONG Count);
11890 
11891 NTHALAPI
11892 UCHAR
11893 NTAPI
11894 READ_PORT_UCHAR(
11895   IN PUCHAR Port);
11896 
11897 NTHALAPI
11898 ULONG
11899 NTAPI
11900 READ_PORT_ULONG(
11901   IN PULONG Port);
11902 
11903 NTHALAPI
11904 USHORT
11905 NTAPI
11906 READ_PORT_USHORT(
11907   IN PUSHORT Port);
11908 
11909 NTKERNELAPI
11910 VOID
11911 NTAPI
11912 READ_REGISTER_BUFFER_UCHAR(
11913   IN PUCHAR Register,
11914   IN PUCHAR Buffer,
11915   IN ULONG Count);
11916 
11917 NTKERNELAPI
11918 VOID
11919 NTAPI
11920 READ_REGISTER_BUFFER_ULONG(
11921   IN PULONG Register,
11922   IN PULONG Buffer,
11923   IN ULONG Count);
11924 
11925 NTKERNELAPI
11926 VOID
11927 NTAPI
11928 READ_REGISTER_BUFFER_USHORT(
11929   IN PUSHORT Register,
11930   IN PUSHORT Buffer,
11931   IN ULONG Count);
11932 
11933 NTKERNELAPI
11934 UCHAR
11935 NTAPI
11936 READ_REGISTER_UCHAR(
11937   IN PUCHAR Register);
11938 
11939 NTKERNELAPI
11940 ULONG
11941 NTAPI
11942 READ_REGISTER_ULONG(
11943   IN PULONG Register);
11944 
11945 NTKERNELAPI
11946 USHORT
11947 NTAPI
11948 READ_REGISTER_USHORT(
11949   IN PUSHORT Register);
11950 
11951 NTHALAPI
11952 VOID
11953 NTAPI
11954 WRITE_PORT_BUFFER_UCHAR(
11955   IN PUCHAR Port,
11956   IN PUCHAR Buffer,
11957   IN ULONG Count);
11958 
11959 NTHALAPI
11960 VOID
11961 NTAPI
11962 WRITE_PORT_BUFFER_ULONG(
11963   IN PULONG Port,
11964   IN PULONG Buffer,
11965   IN ULONG Count);
11966 
11967 NTHALAPI
11968 VOID
11969 NTAPI
11970 WRITE_PORT_BUFFER_USHORT(
11971   IN PUSHORT Port,
11972   IN PUSHORT Buffer,
11973   IN ULONG Count);
11974 
11975 NTHALAPI
11976 VOID
11977 NTAPI
11978 WRITE_PORT_UCHAR(
11979   IN PUCHAR Port,
11980   IN UCHAR Value);
11981 
11982 NTHALAPI
11983 VOID
11984 NTAPI
11985 WRITE_PORT_ULONG(
11986   IN PULONG Port,
11987   IN ULONG Value);
11988 
11989 NTHALAPI
11990 VOID
11991 NTAPI
11992 WRITE_PORT_USHORT(
11993   IN PUSHORT Port,
11994   IN USHORT Value);
11995 
11996 NTKERNELAPI
11997 VOID
11998 NTAPI
11999 WRITE_REGISTER_BUFFER_UCHAR(
12000   IN PUCHAR Register,
12001   IN PUCHAR Buffer,
12002   IN ULONG Count);
12003 
12004 NTKERNELAPI
12005 VOID
12006 NTAPI
12007 WRITE_REGISTER_BUFFER_ULONG(
12008   IN PULONG Register,
12009   IN PULONG Buffer,
12010   IN ULONG Count);
12011 
12012 NTKERNELAPI
12013 VOID
12014 NTAPI
12015 WRITE_REGISTER_BUFFER_USHORT(
12016   IN PUSHORT Register,
12017   IN PUSHORT Buffer,
12018   IN ULONG Count);
12019 
12020 NTKERNELAPI
12021 VOID
12022 NTAPI
12023 WRITE_REGISTER_UCHAR(
12024   IN PUCHAR Register,
12025   IN UCHAR Value);
12026 
12027 NTKERNELAPI
12028 VOID
12029 NTAPI
12030 WRITE_REGISTER_ULONG(
12031   IN PULONG Register,
12032   IN ULONG Value);
12033 
12034 NTKERNELAPI
12035 VOID
12036 NTAPI
12037 WRITE_REGISTER_USHORT(
12038   IN PUSHORT Register,
12039   IN USHORT Value);
12040 
12041 #else
12042 
12043 FORCEINLINE
12044 VOID
12045 READ_PORT_BUFFER_UCHAR(
12046   IN PUCHAR Port,
12047   IN PUCHAR Buffer,
12048   IN ULONG Count)
12049 {
12050   __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12051 }
12052 
12053 FORCEINLINE
12054 VOID
12055 READ_PORT_BUFFER_ULONG(
12056   IN PULONG Port,
12057   IN PULONG Buffer,
12058   IN ULONG Count)
12059 {
12060   __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12061 }
12062 
12063 FORCEINLINE
12064 VOID
12065 READ_PORT_BUFFER_USHORT(
12066   IN PUSHORT Port,
12067   IN PUSHORT Buffer,
12068   IN ULONG Count)
12069 {
12070   __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12071 }
12072 
12073 FORCEINLINE
12074 UCHAR
12075 READ_PORT_UCHAR(
12076   IN PUCHAR Port)
12077 {
12078   return __inbyte((USHORT)(ULONG_PTR)Port);
12079 }
12080 
12081 FORCEINLINE
12082 ULONG
12083 READ_PORT_ULONG(
12084   IN PULONG Port)
12085 {
12086   return __indword((USHORT)(ULONG_PTR)Port);
12087 }
12088 
12089 FORCEINLINE
12090 USHORT
12091 READ_PORT_USHORT(
12092   IN PUSHORT Port)
12093 {
12094   return __inword((USHORT)(ULONG_PTR)Port);
12095 }
12096 
12097 FORCEINLINE
12098 VOID
12099 READ_REGISTER_BUFFER_UCHAR(
12100   IN PUCHAR Register,
12101   IN PUCHAR Buffer,
12102   IN ULONG Count)
12103 {
12104   __movsb(Register, Buffer, Count);
12105 }
12106 
12107 FORCEINLINE
12108 VOID
12109 READ_REGISTER_BUFFER_ULONG(
12110   IN PULONG Register,
12111   IN PULONG Buffer,
12112   IN ULONG Count)
12113 {
12114   __movsd(Register, Buffer, Count);
12115 }
12116 
12117 FORCEINLINE
12118 VOID
12119 READ_REGISTER_BUFFER_USHORT(
12120   IN PUSHORT Register,
12121   IN PUSHORT Buffer,
12122   IN ULONG Count)
12123 {
12124   __movsw(Register, Buffer, Count);
12125 }
12126 
12127 FORCEINLINE
12128 UCHAR
12129 READ_REGISTER_UCHAR(
12130   IN volatile UCHAR *Register)
12131 {
12132   return *Register;
12133 }
12134 
12135 FORCEINLINE
12136 ULONG
12137 READ_REGISTER_ULONG(
12138   IN volatile ULONG *Register)
12139 {
12140   return *Register;
12141 }
12142 
12143 FORCEINLINE
12144 USHORT
12145 READ_REGISTER_USHORT(
12146   IN volatile USHORT *Register)
12147 {
12148   return *Register;
12149 }
12150 
12151 FORCEINLINE
12152 VOID
12153 WRITE_PORT_BUFFER_UCHAR(
12154   IN PUCHAR Port,
12155   IN PUCHAR Buffer,
12156   IN ULONG Count)
12157 {
12158   __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12159 }
12160 
12161 FORCEINLINE
12162 VOID
12163 WRITE_PORT_BUFFER_ULONG(
12164   IN PULONG Port,
12165   IN PULONG Buffer,
12166   IN ULONG Count)
12167 {
12168   __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12169 }
12170 
12171 FORCEINLINE
12172 VOID
12173 WRITE_PORT_BUFFER_USHORT(
12174   IN PUSHORT Port,
12175   IN PUSHORT Buffer,
12176   IN ULONG Count)
12177 {
12178   __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12179 }
12180 
12181 FORCEINLINE
12182 VOID
12183 WRITE_PORT_UCHAR(
12184   IN PUCHAR Port,
12185   IN UCHAR Value)
12186 {
12187   __outbyte((USHORT)(ULONG_PTR)Port, Value);
12188 }
12189 
12190 FORCEINLINE
12191 VOID
12192 WRITE_PORT_ULONG(
12193   IN PULONG Port,
12194   IN ULONG Value)
12195 {
12196   __outdword((USHORT)(ULONG_PTR)Port, Value);
12197 }
12198 
12199 FORCEINLINE
12200 VOID
12201 WRITE_PORT_USHORT(
12202   IN PUSHORT Port,
12203   IN USHORT Value)
12204 {
12205   __outword((USHORT)(ULONG_PTR)Port, Value);
12206 }
12207 
12208 FORCEINLINE
12209 VOID
12210 WRITE_REGISTER_BUFFER_UCHAR(
12211   IN PUCHAR Register,
12212   IN PUCHAR Buffer,
12213   IN ULONG Count)
12214 {
12215   LONG Synch;
12216   __movsb(Register, Buffer, Count);
12217   InterlockedOr(&Synch, 1);
12218 }
12219 
12220 FORCEINLINE
12221 VOID
12222 WRITE_REGISTER_BUFFER_ULONG(
12223   IN PULONG Register,
12224   IN PULONG Buffer,
12225   IN ULONG Count)
12226 {
12227   LONG Synch;
12228   __movsd(Register, Buffer, Count);
12229   InterlockedOr(&Synch, 1);
12230 }
12231 
12232 FORCEINLINE
12233 VOID
12234 WRITE_REGISTER_BUFFER_USHORT(
12235   IN PUSHORT Register,
12236   IN PUSHORT Buffer,
12237   IN ULONG Count)
12238 {
12239   LONG Synch;
12240   __movsw(Register, Buffer, Count);
12241   InterlockedOr(&Synch, 1);
12242 }
12243 
12244 FORCEINLINE
12245 VOID
12246 WRITE_REGISTER_UCHAR(
12247   IN volatile UCHAR *Register,
12248   IN UCHAR Value)
12249 {
12250   LONG Synch;
12251   *Register = Value;
12252   InterlockedOr(&Synch, 1);
12253 }
12254 
12255 FORCEINLINE
12256 VOID
12257 WRITE_REGISTER_ULONG(
12258   IN volatile ULONG *Register,
12259   IN ULONG Value)
12260 {
12261   LONG Synch;
12262   *Register = Value;
12263   InterlockedOr(&Synch, 1);
12264 }
12265 
12266 FORCEINLINE
12267 VOID
12268 WRITE_REGISTER_USHORT(
12269   IN volatile USHORT *Register,
12270   IN USHORT Value)
12271 {
12272   LONG Sync;
12273   *Register = Value;
12274   InterlockedOr(&Sync, 1);
12275 }
12276 #endif
12277 
12278 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
12279    (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
12280 
12281 #define DMA_MACROS_DEFINED
12282 
12283 _IRQL_requires_max_(DISPATCH_LEVEL)
12284 _IRQL_requires_min_(DISPATCH_LEVEL)
12285 FORCEINLINE
12286 NTSTATUS
12287 IoAllocateAdapterChannel(
12288   _In_ PDMA_ADAPTER DmaAdapter,
12289   _In_ PDEVICE_OBJECT DeviceObject,
12290   _In_ ULONG NumberOfMapRegisters,
12291   _In_ PDRIVER_CONTROL ExecutionRoutine,
12292   _In_ PVOID Context)
12293 {
12294   PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
12295   AllocateAdapterChannel =
12296       *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
12297   ASSERT(AllocateAdapterChannel);
12298   return AllocateAdapterChannel(DmaAdapter,
12299                                 DeviceObject,
12300                                 NumberOfMapRegisters,
12301                                 ExecutionRoutine,
12302                                 Context);
12303 }
12304 
12305 FORCEINLINE
12306 BOOLEAN
12307 NTAPI
12308 IoFlushAdapterBuffers(
12309   _In_ PDMA_ADAPTER DmaAdapter,
12310   _In_ PMDL Mdl,
12311   _In_ PVOID MapRegisterBase,
12312   _In_ PVOID CurrentVa,
12313   _In_ ULONG Length,
12314   _In_ BOOLEAN WriteToDevice)
12315 {
12316   PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
12317   FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
12318   ASSERT(FlushAdapterBuffers);
12319   return FlushAdapterBuffers(DmaAdapter,
12320                              Mdl,
12321                              MapRegisterBase,
12322                              CurrentVa,
12323                              Length,
12324                              WriteToDevice);
12325 }
12326 
12327 FORCEINLINE
12328 VOID
12329 NTAPI
12330 IoFreeAdapterChannel(
12331   _In_ PDMA_ADAPTER DmaAdapter)
12332 {
12333   PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
12334   FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
12335   ASSERT(FreeAdapterChannel);
12336   FreeAdapterChannel(DmaAdapter);
12337 }
12338 
12339 FORCEINLINE
12340 VOID
12341 NTAPI
12342 IoFreeMapRegisters(
12343   _In_ PDMA_ADAPTER DmaAdapter,
12344   _In_ PVOID MapRegisterBase,
12345   _In_ ULONG NumberOfMapRegisters)
12346 {
12347   PFREE_MAP_REGISTERS FreeMapRegisters;
12348   FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
12349   ASSERT(FreeMapRegisters);
12350   FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
12351 }
12352 
12353 FORCEINLINE
12354 PHYSICAL_ADDRESS
12355 NTAPI
12356 IoMapTransfer(
12357   _In_ PDMA_ADAPTER DmaAdapter,
12358   _In_ PMDL Mdl,
12359   _In_ PVOID MapRegisterBase,
12360   _In_ PVOID CurrentVa,
12361   _Inout_ PULONG Length,
12362   _In_ BOOLEAN WriteToDevice)
12363 {
12364   PMAP_TRANSFER MapTransfer;
12365 
12366   MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
12367   ASSERT(MapTransfer);
12368   return MapTransfer(DmaAdapter,
12369                      Mdl,
12370                      MapRegisterBase,
12371                      CurrentVa,
12372                      Length,
12373                      WriteToDevice);
12374 }
12375 #endif
12376 
12377 #if (NTDDI_VERSION >= NTDDI_WIN2K)
12378 
12379 _Acquires_lock_(_Global_cancel_spin_lock_)
12380 _Requires_lock_not_held_(_Global_cancel_spin_lock_)
12381 _IRQL_requires_max_(DISPATCH_LEVEL)
12382 _IRQL_raises_(DISPATCH_LEVEL)
12383 NTKERNELAPI
12384 VOID
12385 NTAPI
12386 IoAcquireCancelSpinLock(
12387   _Out_ _At_(*Irql, _IRQL_saves_) PKIRQL Irql);
12388 
12389 _IRQL_requires_max_(DISPATCH_LEVEL)
12390 NTKERNELAPI
12391 NTSTATUS
12392 NTAPI
12393 IoAcquireRemoveLockEx(
12394   _Inout_ PIO_REMOVE_LOCK RemoveLock,
12395   _In_opt_ PVOID Tag,
12396   _In_ PCSTR File,
12397   _In_ ULONG Line,
12398   _In_ ULONG RemlockSize);
12399 
12400 _IRQL_requires_max_(DISPATCH_LEVEL)
12401 _Ret_range_(<=, 0)
12402 NTKERNELAPI
12403 NTSTATUS
12404 NTAPI
12405 IoAllocateDriverObjectExtension(
12406   _In_ PDRIVER_OBJECT DriverObject,
12407   _In_ PVOID ClientIdentificationAddress,
12408   _In_ ULONG DriverObjectExtensionSize,
12409   _Post_ _At_(*DriverObjectExtension, _When_(return==0,
12410     __drv_aliasesMem __drv_allocatesMem(Mem) _Post_notnull_))
12411   _When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize))
12412     PVOID *DriverObjectExtension);
12413 
12414 _IRQL_requires_max_(DISPATCH_LEVEL)
12415 NTKERNELAPI
12416 PVOID
12417 NTAPI
12418 IoAllocateErrorLogEntry(
12419   _In_ PVOID IoObject,
12420   _In_ UCHAR EntrySize);
12421 
12422 _Must_inspect_result_
12423 _IRQL_requires_max_(DISPATCH_LEVEL)
12424 NTKERNELAPI
12425 PIRP
12426 NTAPI
12427 IoAllocateIrp(
12428   _In_ CCHAR StackSize,
12429   _In_ BOOLEAN ChargeQuota);
12430 
12431 _IRQL_requires_max_(DISPATCH_LEVEL)
12432 NTKERNELAPI
12433 PMDL
12434 NTAPI
12435 IoAllocateMdl(
12436   _In_opt_ __drv_aliasesMem PVOID VirtualAddress,
12437   _In_ ULONG Length,
12438   _In_ BOOLEAN SecondaryBuffer,
12439   _In_ BOOLEAN ChargeQuota,
12440   _Inout_opt_ PIRP Irp);
12441 
12442 __drv_allocatesMem(Mem)
12443 _IRQL_requires_max_(DISPATCH_LEVEL)
12444 NTKERNELAPI
12445 PIO_WORKITEM
12446 NTAPI
12447 IoAllocateWorkItem(
12448   _In_ PDEVICE_OBJECT DeviceObject);
12449 
12450 _IRQL_requires_max_(APC_LEVEL)
12451 _Ret_range_(<=, 0)
12452 NTKERNELAPI
12453 NTSTATUS
12454 NTAPI
12455 IoAttachDevice(
12456   _In_ _Kernel_requires_resource_held_(Memory) _When_(return==0, __drv_aliasesMem)
12457     PDEVICE_OBJECT SourceDevice,
12458   _In_ PUNICODE_STRING TargetDevice,
12459   _Out_ PDEVICE_OBJECT *AttachedDevice);
12460 
12461 _Must_inspect_result_
12462 _IRQL_requires_max_(DISPATCH_LEVEL)
12463 NTKERNELAPI
12464 PDEVICE_OBJECT
12465 NTAPI
12466 IoAttachDeviceToDeviceStack(
12467   _In_ _Kernel_requires_resource_held_(Memory) _When_(return!=0, __drv_aliasesMem)
12468     PDEVICE_OBJECT SourceDevice,
12469   _In_ PDEVICE_OBJECT TargetDevice);
12470 
12471 _Must_inspect_result_
12472 __drv_aliasesMem
12473 _IRQL_requires_max_(DISPATCH_LEVEL)
12474 NTKERNELAPI
12475 PIRP
12476 NTAPI
12477 IoBuildAsynchronousFsdRequest(
12478   _In_ ULONG MajorFunction,
12479   _In_ PDEVICE_OBJECT DeviceObject,
12480   _Inout_opt_ PVOID Buffer,
12481   _In_opt_ ULONG Length,
12482   _In_opt_ PLARGE_INTEGER StartingOffset,
12483   _In_opt_ PIO_STATUS_BLOCK IoStatusBlock);
12484 
12485 _Must_inspect_result_
12486 __drv_aliasesMem
12487 _IRQL_requires_max_(PASSIVE_LEVEL)
12488 NTKERNELAPI
12489 PIRP
12490 NTAPI
12491 IoBuildDeviceIoControlRequest(
12492   _In_ ULONG IoControlCode,
12493   _In_ PDEVICE_OBJECT DeviceObject,
12494   _In_opt_ PVOID InputBuffer,
12495   _In_ ULONG InputBufferLength,
12496   _Out_opt_ PVOID OutputBuffer,
12497   _In_ ULONG OutputBufferLength,
12498   _In_ BOOLEAN InternalDeviceIoControl,
12499   _In_ PKEVENT Event,
12500   _Out_ PIO_STATUS_BLOCK IoStatusBlock);
12501 
12502 _IRQL_requires_max_(DISPATCH_LEVEL)
12503 NTKERNELAPI
12504 VOID
12505 NTAPI
12506 IoBuildPartialMdl(
12507   _In_ PMDL SourceMdl,
12508   _Inout_ PMDL TargetMdl,
12509   _In_ PVOID VirtualAddress,
12510   _In_ ULONG Length);
12511 
12512 _Must_inspect_result_
12513 __drv_aliasesMem
12514 _IRQL_requires_max_(PASSIVE_LEVEL)
12515 NTKERNELAPI
12516 PIRP
12517 NTAPI
12518 IoBuildSynchronousFsdRequest(
12519   _In_ ULONG MajorFunction,
12520   _In_ PDEVICE_OBJECT DeviceObject,
12521   _Inout_opt_ PVOID Buffer,
12522   _In_opt_ ULONG Length,
12523   _In_opt_ PLARGE_INTEGER StartingOffset,
12524   _In_ PKEVENT Event,
12525   _Out_ PIO_STATUS_BLOCK IoStatusBlock);
12526 
12527 _IRQL_requires_max_(DISPATCH_LEVEL)
12528 _Success_(TRUE)
12529 NTKERNELAPI
12530 NTSTATUS
12531 FASTCALL
12532 IofCallDriver(
12533   _In_ PDEVICE_OBJECT DeviceObject,
12534   _Inout_ __drv_aliasesMem PIRP Irp);
12535 #define IoCallDriver IofCallDriver
12536 
12537 _IRQL_requires_max_(DISPATCH_LEVEL)
12538 NTKERNELAPI
12539 VOID
12540 FASTCALL
12541 IofCompleteRequest(
12542   _In_ PIRP Irp,
12543   _In_ CCHAR PriorityBoost);
12544 #define IoCompleteRequest IofCompleteRequest
12545 
12546 _IRQL_requires_max_(DISPATCH_LEVEL)
12547 NTKERNELAPI
12548 BOOLEAN
12549 NTAPI
12550 IoCancelIrp(
12551   _In_ PIRP Irp);
12552 
12553 _IRQL_requires_max_(PASSIVE_LEVEL)
12554 NTKERNELAPI
12555 NTSTATUS
12556 NTAPI
12557 IoCheckShareAccess(
12558   _In_ ACCESS_MASK DesiredAccess,
12559   _In_ ULONG DesiredShareAccess,
12560   _Inout_ PFILE_OBJECT FileObject,
12561   _Inout_ PSHARE_ACCESS ShareAccess,
12562   _In_ BOOLEAN Update);
12563 
12564 _IRQL_requires_max_(DISPATCH_LEVEL)
12565 NTKERNELAPI
12566 VOID
12567 FASTCALL
12568 IofCompleteRequest(
12569   _In_ PIRP Irp,
12570   _In_ CCHAR PriorityBoost);
12571 
12572 _IRQL_requires_max_(PASSIVE_LEVEL)
12573 NTKERNELAPI
12574 NTSTATUS
12575 NTAPI
12576 IoConnectInterrupt(
12577   _Out_ PKINTERRUPT *InterruptObject,
12578   _In_ PKSERVICE_ROUTINE ServiceRoutine,
12579   _In_opt_ PVOID ServiceContext,
12580   _In_opt_ PKSPIN_LOCK SpinLock,
12581   _In_ ULONG Vector,
12582   _In_ KIRQL Irql,
12583   _In_ KIRQL SynchronizeIrql,
12584   _In_ KINTERRUPT_MODE InterruptMode,
12585   _In_ BOOLEAN ShareVector,
12586   _In_ KAFFINITY ProcessorEnableMask,
12587   _In_ BOOLEAN FloatingSave);
12588 
12589 _IRQL_requires_max_(APC_LEVEL)
12590 _Ret_range_(<=, 0)
12591 NTKERNELAPI
12592 NTSTATUS
12593 NTAPI
12594 IoCreateDevice(
12595   _In_ PDRIVER_OBJECT DriverObject,
12596   _In_ ULONG DeviceExtensionSize,
12597   _In_opt_ PUNICODE_STRING DeviceName,
12598   _In_ DEVICE_TYPE DeviceType,
12599   _In_ ULONG DeviceCharacteristics,
12600   _In_ BOOLEAN Exclusive,
12601   _Outptr_result_nullonfailure_
12602   _At_(*DeviceObject,
12603     __drv_allocatesMem(Mem)
12604     _When_((((_In_function_class_(DRIVER_INITIALIZE))
12605       ||(_In_function_class_(DRIVER_DISPATCH)))),
12606       __drv_aliasesMem))
12607     PDEVICE_OBJECT *DeviceObject);
12608 
12609 _IRQL_requires_max_(PASSIVE_LEVEL)
12610 NTKERNELAPI
12611 NTSTATUS
12612 NTAPI
12613 IoCreateFile(
12614   _Out_ PHANDLE FileHandle,
12615   _In_ ACCESS_MASK DesiredAccess,
12616   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
12617   _Out_ PIO_STATUS_BLOCK IoStatusBlock,
12618   _In_opt_ PLARGE_INTEGER AllocationSize,
12619   _In_ ULONG FileAttributes,
12620   _In_ ULONG ShareAccess,
12621   _In_ ULONG Disposition,
12622   _In_ ULONG CreateOptions,
12623   _In_opt_ PVOID EaBuffer,
12624   _In_ ULONG EaLength,
12625   _In_ CREATE_FILE_TYPE CreateFileType,
12626   _In_opt_ PVOID InternalParameters,
12627   _In_ ULONG Options);
12628 
12629 _IRQL_requires_max_(PASSIVE_LEVEL)
12630 NTKERNELAPI
12631 PKEVENT
12632 NTAPI
12633 IoCreateNotificationEvent(
12634   _In_ PUNICODE_STRING EventName,
12635   _Out_ PHANDLE EventHandle);
12636 
12637 _IRQL_requires_max_(PASSIVE_LEVEL)
12638 NTKERNELAPI
12639 NTSTATUS
12640 NTAPI
12641 IoCreateSymbolicLink(
12642   _In_ PUNICODE_STRING SymbolicLinkName,
12643   _In_ PUNICODE_STRING DeviceName);
12644 
12645 _IRQL_requires_max_(PASSIVE_LEVEL)
12646 NTKERNELAPI
12647 PKEVENT
12648 NTAPI
12649 IoCreateSynchronizationEvent(
12650   _In_ PUNICODE_STRING EventName,
12651   _Out_ PHANDLE EventHandle);
12652 
12653 _IRQL_requires_max_(PASSIVE_LEVEL)
12654 NTKERNELAPI
12655 NTSTATUS
12656 NTAPI
12657 IoCreateUnprotectedSymbolicLink(
12658   _In_ PUNICODE_STRING SymbolicLinkName,
12659   _In_ PUNICODE_STRING DeviceName);
12660 
12661 _IRQL_requires_max_(APC_LEVEL)
12662 _Kernel_clear_do_init_(__yes)
12663 NTKERNELAPI
12664 VOID
12665 NTAPI
12666 IoDeleteDevice(
12667   _In_ _Kernel_requires_resource_held_(Memory) __drv_freesMem(Mem)
12668     PDEVICE_OBJECT DeviceObject);
12669 
12670 _IRQL_requires_max_(PASSIVE_LEVEL)
12671 NTKERNELAPI
12672 NTSTATUS
12673 NTAPI
12674 IoDeleteSymbolicLink(
12675   _In_ PUNICODE_STRING SymbolicLinkName);
12676 
12677 _IRQL_requires_max_(PASSIVE_LEVEL)
12678 NTKERNELAPI
12679 VOID
12680 NTAPI
12681 IoDetachDevice(
12682   _Inout_ PDEVICE_OBJECT TargetDevice);
12683 
12684 _IRQL_requires_max_(PASSIVE_LEVEL)
12685 NTKERNELAPI
12686 VOID
12687 NTAPI
12688 IoDisconnectInterrupt(
12689   _In_ PKINTERRUPT InterruptObject);
12690 
12691 __drv_freesMem(Mem)
12692 _IRQL_requires_max_(DISPATCH_LEVEL)
12693 NTKERNELAPI
12694 VOID
12695 NTAPI
12696 IoFreeIrp(
12697   _In_ PIRP Irp);
12698 
12699 _IRQL_requires_max_(DISPATCH_LEVEL)
12700 NTKERNELAPI
12701 VOID
12702 NTAPI
12703 IoFreeMdl(
12704   PMDL Mdl);
12705 
12706 _IRQL_requires_max_(DISPATCH_LEVEL)
12707 NTKERNELAPI
12708 VOID
12709 NTAPI
12710 IoFreeWorkItem(
12711   _In_ __drv_freesMem(Mem) PIO_WORKITEM IoWorkItem);
12712 
12713 NTKERNELAPI
12714 PDEVICE_OBJECT
12715 NTAPI
12716 IoGetAttachedDevice(
12717   IN PDEVICE_OBJECT DeviceObject);
12718 
12719 _IRQL_requires_max_(DISPATCH_LEVEL)
12720 NTKERNELAPI
12721 PDEVICE_OBJECT
12722 NTAPI
12723 IoGetAttachedDeviceReference(
12724   _In_ PDEVICE_OBJECT DeviceObject);
12725 
12726 NTKERNELAPI
12727 NTSTATUS
12728 NTAPI
12729 IoGetBootDiskInformation(
12730   _Inout_ PBOOTDISK_INFORMATION BootDiskInformation,
12731   _In_ ULONG Size);
12732 
12733 _IRQL_requires_max_(PASSIVE_LEVEL)
12734 _Must_inspect_result_
12735 NTKERNELAPI
12736 NTSTATUS
12737 NTAPI
12738 IoGetDeviceInterfaceAlias(
12739   _In_ PUNICODE_STRING SymbolicLinkName,
12740   _In_ CONST GUID *AliasInterfaceClassGuid,
12741   _Out_
12742   _When_(return==0, _At_(AliasSymbolicLinkName->Buffer, __drv_allocatesMem(Mem)))
12743     PUNICODE_STRING AliasSymbolicLinkName);
12744 
12745 NTKERNELAPI
12746 PEPROCESS
12747 NTAPI
12748 IoGetCurrentProcess(VOID);
12749 
12750 _IRQL_requires_max_(PASSIVE_LEVEL)
12751 _Must_inspect_result_
12752 NTKERNELAPI
12753 NTSTATUS
12754 NTAPI
12755 IoGetDeviceInterfaces(
12756   _In_ CONST GUID *InterfaceClassGuid,
12757   _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
12758   _In_ ULONG Flags,
12759   _Outptr_result_nullonfailure_
12760   _At_(*SymbolicLinkList, _When_(return==0, __drv_allocatesMem(Mem)))
12761     PZZWSTR *SymbolicLinkList);
12762 
12763 _IRQL_requires_max_(PASSIVE_LEVEL)
12764 NTKERNELAPI
12765 NTSTATUS
12766 NTAPI
12767 IoGetDeviceObjectPointer(
12768   _In_ PUNICODE_STRING ObjectName,
12769   _In_ ACCESS_MASK DesiredAccess,
12770   _Out_ PFILE_OBJECT *FileObject,
12771   _Out_ PDEVICE_OBJECT *DeviceObject);
12772 
12773 _IRQL_requires_max_(PASSIVE_LEVEL)
12774 _When_((DeviceProperty & __string_type),
12775   _At_(PropertyBuffer, _Post_z_))
12776 _When_((DeviceProperty & __multiString_type),
12777   _At_(PropertyBuffer, _Post_ _NullNull_terminated_))
12778 NTKERNELAPI
12779 NTSTATUS
12780 NTAPI
12781 IoGetDeviceProperty(
12782   _In_ PDEVICE_OBJECT DeviceObject,
12783   _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty,
12784   _In_ ULONG BufferLength,
12785   _Out_writes_bytes_opt_(BufferLength) PVOID PropertyBuffer,
12786   _Deref_out_range_(<=, BufferLength) PULONG ResultLength);
12787 
12788 _Must_inspect_result_
12789 _IRQL_requires_max_(PASSIVE_LEVEL)
12790 NTKERNELAPI
12791 PDMA_ADAPTER
12792 NTAPI
12793 IoGetDmaAdapter(
12794   _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
12795   _In_ PDEVICE_DESCRIPTION DeviceDescription,
12796   _Out_ _When_(return!=0, _Kernel_IoGetDmaAdapter_ _At_(*NumberOfMapRegisters, _Must_inspect_result_))
12797     PULONG NumberOfMapRegisters);
12798 
12799 __drv_aliasesMem
12800 _IRQL_requires_max_(DISPATCH_LEVEL)
12801 NTKERNELAPI
12802 PVOID
12803 NTAPI
12804 IoGetDriverObjectExtension(
12805   _In_ PDRIVER_OBJECT DriverObject,
12806   _In_ PVOID ClientIdentificationAddress);
12807 
12808 _IRQL_requires_max_(APC_LEVEL)
12809 NTKERNELAPI
12810 PVOID
12811 NTAPI
12812 IoGetInitialStack(VOID);
12813 
12814 NTKERNELAPI
12815 PDEVICE_OBJECT
12816 NTAPI
12817 IoGetRelatedDeviceObject(
12818   _In_ PFILE_OBJECT FileObject);
12819 
12820 _IRQL_requires_max_(DISPATCH_LEVEL)
12821 NTKERNELAPI
12822 VOID
12823 NTAPI
12824 IoQueueWorkItem(
12825   _Inout_ PIO_WORKITEM IoWorkItem,
12826   _In_ PIO_WORKITEM_ROUTINE WorkerRoutine,
12827   _In_ WORK_QUEUE_TYPE QueueType,
12828   _In_opt_ __drv_aliasesMem PVOID Context);
12829 
12830 _IRQL_requires_max_(DISPATCH_LEVEL)
12831 NTKERNELAPI
12832 VOID
12833 NTAPI
12834 IoInitializeIrp(
12835   _Inout_ PIRP Irp,
12836   _In_ USHORT PacketSize,
12837   _In_ CCHAR StackSize);
12838 
12839 _IRQL_requires_max_(PASSIVE_LEVEL)
12840 NTKERNELAPI
12841 VOID
12842 NTAPI
12843 IoInitializeRemoveLockEx(
12844   _Out_ PIO_REMOVE_LOCK Lock,
12845   _In_ ULONG AllocateTag,
12846   _In_ ULONG MaxLockedMinutes,
12847   _In_ ULONG HighWatermark,
12848   _In_ ULONG RemlockSize);
12849 
12850 _IRQL_requires_max_(PASSIVE_LEVEL)
12851 NTKERNELAPI
12852 NTSTATUS
12853 NTAPI
12854 IoInitializeTimer(
12855   _In_ PDEVICE_OBJECT DeviceObject,
12856   _In_ PIO_TIMER_ROUTINE TimerRoutine,
12857   _In_opt_ __drv_aliasesMem PVOID Context);
12858 
12859 _IRQL_requires_max_(DISPATCH_LEVEL)
12860 NTKERNELAPI
12861 VOID
12862 NTAPI
12863 IoInvalidateDeviceRelations(
12864   _In_ PDEVICE_OBJECT DeviceObject,
12865   _In_ DEVICE_RELATION_TYPE Type);
12866 
12867 _IRQL_requires_max_(DISPATCH_LEVEL)
12868 NTKERNELAPI
12869 VOID
12870 NTAPI
12871 IoInvalidateDeviceState(
12872   _In_ PDEVICE_OBJECT PhysicalDeviceObject);
12873 
12874 _IRQL_requires_max_(PASSIVE_LEVEL)
12875 NTKERNELAPI
12876 BOOLEAN
12877 NTAPI
12878 IoIsWdmVersionAvailable(
12879   _When_(MajorVersion!=1&&MajorVersion!=6, _In_ __drv_reportError("MajorVersion must be 1 or 6"))
12880     UCHAR MajorVersion,
12881   _In_ _When_(MinorVersion!=0 && MinorVersion!=5 &&
12882               MinorVersion!=16 && MinorVersion!=32 &&
12883               MinorVersion!=48, __drv_reportError("MinorVersion must be 0, 0x5, 0x10, 0x20, or 0x30"))
12884     UCHAR MinorVersion);
12885 
12886 _IRQL_requires_max_(PASSIVE_LEVEL)
12887 _Must_inspect_result_
12888 NTKERNELAPI
12889 NTSTATUS
12890 NTAPI
12891 IoOpenDeviceInterfaceRegistryKey(
12892   _In_ PUNICODE_STRING SymbolicLinkName,
12893   _In_ ACCESS_MASK DesiredAccess,
12894   _Out_ PHANDLE DeviceInterfaceKey);
12895 
12896 _IRQL_requires_max_(PASSIVE_LEVEL)
12897 _Must_inspect_result_
12898 NTKERNELAPI
12899 NTSTATUS
12900 NTAPI
12901 IoOpenDeviceRegistryKey(
12902   _In_ PDEVICE_OBJECT DeviceObject,
12903   _In_ ULONG DevInstKeyType,
12904   _In_ ACCESS_MASK DesiredAccess,
12905   _Out_ PHANDLE DevInstRegKey);
12906 
12907 _IRQL_requires_max_(PASSIVE_LEVEL)
12908 _Must_inspect_result_
12909 NTKERNELAPI
12910 NTSTATUS
12911 NTAPI
12912 IoRegisterDeviceInterface(
12913   _In_ PDEVICE_OBJECT PhysicalDeviceObject,
12914   _In_ CONST GUID *InterfaceClassGuid,
12915   _In_opt_ PUNICODE_STRING ReferenceString,
12916   _Out_ _When_(return==0, _At_(SymbolicLinkName->Buffer, __drv_allocatesMem(Mem)))
12917     PUNICODE_STRING SymbolicLinkName);
12918 
12919 _IRQL_requires_max_(PASSIVE_LEVEL)
12920 _Must_inspect_result_
12921 NTKERNELAPI
12922 NTSTATUS
12923 NTAPI
12924 IoRegisterPlugPlayNotification(
12925   _In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
12926   _In_ ULONG EventCategoryFlags,
12927   _In_opt_ PVOID EventCategoryData,
12928   _In_ PDRIVER_OBJECT DriverObject,
12929   _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
12930   _Inout_opt_ __drv_aliasesMem PVOID Context,
12931   _Outptr_result_nullonfailure_
12932   _At_(*NotificationEntry, _When_(return==0, __drv_allocatesMem(Mem)))
12933     PVOID *NotificationEntry);
12934 
12935 _IRQL_requires_max_(PASSIVE_LEVEL)
12936 NTKERNELAPI
12937 NTSTATUS
12938 NTAPI
12939 IoRegisterShutdownNotification(
12940   _In_ PDEVICE_OBJECT DeviceObject);
12941 
12942 _Requires_lock_held_(_Global_cancel_spin_lock_)
12943 _Releases_lock_(_Global_cancel_spin_lock_)
12944 _IRQL_requires_max_(DISPATCH_LEVEL)
12945 _IRQL_requires_min_(DISPATCH_LEVEL)
12946 NTKERNELAPI
12947 VOID
12948 NTAPI
12949 IoReleaseCancelSpinLock(
12950   _In_ _IRQL_restores_ _IRQL_uses_cancel_ KIRQL Irql);
12951 
12952 _IRQL_requires_max_(PASSIVE_LEVEL)
12953 NTKERNELAPI
12954 VOID
12955 NTAPI
12956 IoReleaseRemoveLockAndWaitEx(
12957   _Inout_ PIO_REMOVE_LOCK RemoveLock,
12958   _In_opt_ PVOID Tag,
12959   _In_ ULONG RemlockSize);
12960 
12961 NTKERNELAPI
12962 VOID
12963 NTAPI
12964 IoReleaseRemoveLockEx(
12965   _Inout_ PIO_REMOVE_LOCK RemoveLock,
12966   _In_opt_ PVOID Tag,
12967   _In_ ULONG RemlockSize);
12968 
12969 _IRQL_requires_max_(PASSIVE_LEVEL)
12970 NTKERNELAPI
12971 VOID
12972 NTAPI
12973 IoRemoveShareAccess(
12974   _In_ PFILE_OBJECT FileObject,
12975   _Inout_ PSHARE_ACCESS ShareAccess);
12976 
12977 _IRQL_requires_max_(PASSIVE_LEVEL)
12978 NTKERNELAPI
12979 NTSTATUS
12980 NTAPI
12981 IoReportTargetDeviceChange(
12982   _In_ PDEVICE_OBJECT PhysicalDeviceObject,
12983   _In_ PVOID NotificationStructure);
12984 
12985 _IRQL_requires_max_(DISPATCH_LEVEL)
12986 NTKERNELAPI
12987 NTSTATUS
12988 NTAPI
12989 IoReportTargetDeviceChangeAsynchronous(
12990   _In_ PDEVICE_OBJECT PhysicalDeviceObject,
12991   _In_ PVOID NotificationStructure,
12992   _In_opt_ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback,
12993   _In_opt_ PVOID Context);
12994 
12995 _IRQL_requires_max_(DISPATCH_LEVEL)
12996 NTKERNELAPI
12997 VOID
12998 NTAPI
12999 IoRequestDeviceEject(
13000   _In_ PDEVICE_OBJECT PhysicalDeviceObject);
13001 
13002 _IRQL_requires_max_(DISPATCH_LEVEL)
13003 NTKERNELAPI
13004 VOID
13005 NTAPI
13006 IoReuseIrp(
13007   _Inout_ PIRP Irp,
13008   _In_ NTSTATUS Status);
13009 
13010 _IRQL_requires_max_(PASSIVE_LEVEL)
13011 _Must_inspect_result_
13012 NTKERNELAPI
13013 NTSTATUS
13014 NTAPI
13015 IoSetDeviceInterfaceState(
13016   _In_ PUNICODE_STRING SymbolicLinkName,
13017   _In_ BOOLEAN Enable);
13018 
13019 NTKERNELAPI
13020 VOID
13021 NTAPI
13022 IoSetShareAccess(
13023   _In_ ACCESS_MASK DesiredAccess,
13024   _In_ ULONG DesiredShareAccess,
13025   _Inout_ PFILE_OBJECT FileObject,
13026   _Out_ PSHARE_ACCESS ShareAccess);
13027 
13028 _IRQL_requires_max_(DISPATCH_LEVEL)
13029 _IRQL_requires_min_(DISPATCH_LEVEL)
13030 NTKERNELAPI
13031 VOID
13032 NTAPI
13033 IoStartNextPacket(
13034   _In_ PDEVICE_OBJECT DeviceObject,
13035   _In_ BOOLEAN Cancelable);
13036 
13037 _IRQL_requires_max_(DISPATCH_LEVEL)
13038 NTKERNELAPI
13039 VOID
13040 NTAPI
13041 IoStartNextPacketByKey(
13042   _In_ PDEVICE_OBJECT DeviceObject,
13043   _In_ BOOLEAN Cancelable,
13044   _In_ ULONG Key);
13045 
13046 _IRQL_requires_max_(DISPATCH_LEVEL)
13047 NTKERNELAPI
13048 VOID
13049 NTAPI
13050 IoStartPacket(
13051   _In_ PDEVICE_OBJECT DeviceObject,
13052   _In_ PIRP Irp,
13053   _In_opt_ PULONG Key,
13054   _In_opt_ PDRIVER_CANCEL CancelFunction);
13055 
13056 _IRQL_requires_max_(DISPATCH_LEVEL)
13057 NTKERNELAPI
13058 VOID
13059 NTAPI
13060 IoStartTimer(
13061   _In_ PDEVICE_OBJECT DeviceObject);
13062 
13063 _IRQL_requires_max_(DISPATCH_LEVEL)
13064 NTKERNELAPI
13065 VOID
13066 NTAPI
13067 IoStopTimer(
13068   _In_ PDEVICE_OBJECT DeviceObject);
13069 
13070 _IRQL_requires_max_(PASSIVE_LEVEL)
13071 __drv_freesMem(Pool)
13072 NTKERNELAPI
13073 NTSTATUS
13074 NTAPI
13075 IoUnregisterPlugPlayNotification(
13076   _In_ PVOID NotificationEntry);
13077 
13078 _IRQL_requires_max_(PASSIVE_LEVEL)
13079 NTKERNELAPI
13080 VOID
13081 NTAPI
13082 IoUnregisterShutdownNotification(
13083   _In_ PDEVICE_OBJECT DeviceObject);
13084 
13085 _IRQL_requires_max_(PASSIVE_LEVEL)
13086 NTKERNELAPI
13087 VOID
13088 NTAPI
13089 IoUpdateShareAccess(
13090   _In_ PFILE_OBJECT FileObject,
13091   _Inout_ PSHARE_ACCESS ShareAccess);
13092 
13093 _IRQL_requires_max_(PASSIVE_LEVEL)
13094 NTKERNELAPI
13095 NTSTATUS
13096 NTAPI
13097 IoWMIAllocateInstanceIds(
13098   _In_ GUID *Guid,
13099   _In_ ULONG InstanceCount,
13100   _Out_ ULONG *FirstInstanceId);
13101 
13102 NTKERNELAPI
13103 NTSTATUS
13104 NTAPI
13105 IoWMIQuerySingleInstanceMultiple(
13106   _In_reads_(ObjectCount) PVOID *DataBlockObjectList,
13107   _In_reads_(ObjectCount) PUNICODE_STRING InstanceNames,
13108   _In_ ULONG ObjectCount,
13109   _Inout_ ULONG *InOutBufferSize,
13110   _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
13111 
13112 _IRQL_requires_max_(PASSIVE_LEVEL)
13113 NTKERNELAPI
13114 NTSTATUS
13115 NTAPI
13116 IoWMIRegistrationControl(
13117   _In_ PDEVICE_OBJECT DeviceObject,
13118   _In_ ULONG Action);
13119 
13120 NTKERNELAPI
13121 NTSTATUS
13122 NTAPI
13123 IoWMISuggestInstanceName(
13124   _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
13125   _In_opt_ PUNICODE_STRING SymbolicLinkName,
13126   _In_ BOOLEAN CombineNames,
13127   _Out_ PUNICODE_STRING SuggestedInstanceName);
13128 
13129 _Must_inspect_result_
13130 _IRQL_requires_max_(DISPATCH_LEVEL)
13131 _Ret_range_(<=, 0)
13132 NTKERNELAPI
13133 NTSTATUS
13134 NTAPI
13135 IoWMIWriteEvent(
13136   _Inout_ _When_(return==0, __drv_aliasesMem) PVOID WnodeEventItem);
13137 
13138 _IRQL_requires_max_(DISPATCH_LEVEL)
13139 NTKERNELAPI
13140 VOID
13141 NTAPI
13142 IoWriteErrorLogEntry(
13143   _In_ PVOID ElEntry);
13144 
13145 NTKERNELAPI
13146 PIRP
13147 NTAPI
13148 IoGetTopLevelIrp(VOID);
13149 
13150 _IRQL_requires_max_(PASSIVE_LEVEL)
13151 NTKERNELAPI
13152 NTSTATUS
13153 NTAPI
13154 IoRegisterLastChanceShutdownNotification(
13155   _In_ PDEVICE_OBJECT DeviceObject);
13156 
13157 NTKERNELAPI
13158 VOID
13159 NTAPI
13160 IoSetTopLevelIrp(
13161   _In_opt_ PIRP Irp);
13162 
13163 
13164 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13165 
13166 
13167 #if (NTDDI_VERSION >= NTDDI_WINXP)
13168 
13169 NTKERNELAPI
13170 NTSTATUS
13171 NTAPI
13172 IoCsqInitialize(
13173   _Out_ PIO_CSQ Csq,
13174   _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp,
13175   _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
13176   _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
13177   _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
13178   _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
13179   _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
13180 
13181 NTKERNELAPI
13182 VOID
13183 NTAPI
13184 IoCsqInsertIrp(
13185   _Inout_ PIO_CSQ Csq,
13186   _Inout_ PIRP Irp,
13187   _Out_opt_ PIO_CSQ_IRP_CONTEXT Context);
13188 
13189 NTKERNELAPI
13190 PIRP
13191 NTAPI
13192 IoCsqRemoveIrp(
13193   _Inout_ PIO_CSQ Csq,
13194   _Inout_ PIO_CSQ_IRP_CONTEXT Context);
13195 
13196 NTKERNELAPI
13197 PIRP
13198 NTAPI
13199 IoCsqRemoveNextIrp(
13200   _Inout_ PIO_CSQ Csq,
13201   _In_opt_ PVOID PeekContext);
13202 
13203 NTKERNELAPI
13204 BOOLEAN
13205 NTAPI
13206 IoForwardIrpSynchronously(
13207   _In_ PDEVICE_OBJECT DeviceObject,
13208   _In_ PIRP Irp);
13209 
13210 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
13211 
13212 NTKERNELAPI
13213 VOID
13214 NTAPI
13215 IoFreeErrorLogEntry(
13216   _In_ PVOID ElEntry);
13217 
13218 _IRQL_requires_max_(DISPATCH_LEVEL)
13219 _Must_inspect_result_
13220 NTKERNELAPI
13221 NTSTATUS
13222 NTAPI
13223 IoSetCompletionRoutineEx(
13224   _In_ PDEVICE_OBJECT DeviceObject,
13225   _In_ PIRP Irp,
13226   _In_ PIO_COMPLETION_ROUTINE CompletionRoutine,
13227   _In_opt_ PVOID Context,
13228   _In_ BOOLEAN InvokeOnSuccess,
13229   _In_ BOOLEAN InvokeOnError,
13230   _In_ BOOLEAN InvokeOnCancel);
13231 
13232 VOID
13233 NTAPI
13234 IoSetStartIoAttributes(
13235   _In_ PDEVICE_OBJECT DeviceObject,
13236   _In_ BOOLEAN DeferredStartIo,
13237   _In_ BOOLEAN NonCancelable);
13238 
13239 NTKERNELAPI
13240 NTSTATUS
13241 NTAPI
13242 IoWMIDeviceObjectToInstanceName(
13243   _In_ PVOID DataBlockObject,
13244   _In_ PDEVICE_OBJECT DeviceObject,
13245   _Out_ PUNICODE_STRING InstanceName);
13246 
13247 NTKERNELAPI
13248 NTSTATUS
13249 NTAPI
13250 IoWMIExecuteMethod(
13251   _In_ PVOID DataBlockObject,
13252   _In_ PUNICODE_STRING InstanceName,
13253   _In_ ULONG MethodId,
13254   _In_ ULONG InBufferSize,
13255   _Inout_ PULONG OutBufferSize,
13256   _Inout_updates_bytes_to_opt_(*OutBufferSize, InBufferSize) PUCHAR InOutBuffer);
13257 
13258 NTKERNELAPI
13259 NTSTATUS
13260 NTAPI
13261 IoWMIHandleToInstanceName(
13262   _In_ PVOID DataBlockObject,
13263   _In_ HANDLE FileHandle,
13264   _Out_ PUNICODE_STRING InstanceName);
13265 
13266 NTKERNELAPI
13267 NTSTATUS
13268 NTAPI
13269 IoWMIOpenBlock(
13270   _In_ GUID *DataBlockGuid,
13271   _In_ ULONG DesiredAccess,
13272   _Out_ PVOID *DataBlockObject);
13273 
13274 NTKERNELAPI
13275 NTSTATUS
13276 NTAPI
13277 IoWMIQueryAllData(
13278   _In_ PVOID DataBlockObject,
13279   _Inout_ ULONG *InOutBufferSize,
13280   _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
13281 
13282 NTKERNELAPI
13283 NTSTATUS
13284 NTAPI
13285 IoWMIQueryAllDataMultiple(
13286   _In_reads_(ObjectCount) PVOID *DataBlockObjectList,
13287   _In_ ULONG ObjectCount,
13288   _Inout_ ULONG *InOutBufferSize,
13289   _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
13290 
13291 NTKERNELAPI
13292 NTSTATUS
13293 NTAPI
13294 IoWMIQuerySingleInstance(
13295   _In_ PVOID DataBlockObject,
13296   _In_ PUNICODE_STRING InstanceName,
13297   _Inout_ ULONG *InOutBufferSize,
13298   _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
13299 
13300 NTKERNELAPI
13301 NTSTATUS
13302 NTAPI
13303 IoWMISetNotificationCallback(
13304   _Inout_ PVOID Object,
13305   _In_ WMI_NOTIFICATION_CALLBACK Callback,
13306   _In_opt_ PVOID Context);
13307 
13308 NTKERNELAPI
13309 NTSTATUS
13310 NTAPI
13311 IoWMISetSingleInstance(
13312   _In_ PVOID DataBlockObject,
13313   _In_ PUNICODE_STRING InstanceName,
13314   _In_ ULONG Version,
13315   _In_ ULONG ValueBufferSize,
13316   _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer);
13317 
13318 NTKERNELAPI
13319 NTSTATUS
13320 NTAPI
13321 IoWMISetSingleItem(
13322   _In_ PVOID DataBlockObject,
13323   _In_ PUNICODE_STRING InstanceName,
13324   _In_ ULONG DataItemId,
13325   _In_ ULONG Version,
13326   _In_ ULONG ValueBufferSize,
13327   _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer);
13328 
13329 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
13330 
13331 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
13332 NTKERNELAPI
13333 NTSTATUS
13334 NTAPI
13335 IoValidateDeviceIoControlAccess(
13336   _In_ PIRP Irp,
13337   _In_ ULONG RequiredAccess);
13338 #endif
13339 
13340 #if (NTDDI_VERSION >= NTDDI_WS03)
13341 NTKERNELAPI
13342 NTSTATUS
13343 NTAPI
13344 IoCsqInitializeEx(
13345   _Out_ PIO_CSQ Csq,
13346   _In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,
13347   _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
13348   _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
13349   _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
13350   _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
13351   _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
13352 
13353 NTKERNELAPI
13354 NTSTATUS
13355 NTAPI
13356 IoCsqInsertIrpEx(
13357   _Inout_ PIO_CSQ Csq,
13358   _Inout_ PIRP Irp,
13359   _Out_opt_ PIO_CSQ_IRP_CONTEXT Context,
13360   _In_opt_ PVOID InsertContext);
13361 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
13362 
13363 
13364 #if (NTDDI_VERSION >= NTDDI_VISTA)
13365 NTKERNELAPI
13366 NTSTATUS
13367 NTAPI
13368 IoGetBootDiskInformationLite(
13369   _Outptr_ PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
13370 
13371 NTKERNELAPI
13372 NTSTATUS
13373 NTAPI
13374 IoCheckShareAccessEx(
13375   _In_ ACCESS_MASK DesiredAccess,
13376   _In_ ULONG DesiredShareAccess,
13377   _Inout_ PFILE_OBJECT FileObject,
13378   _Inout_ PSHARE_ACCESS ShareAccess,
13379   _In_ BOOLEAN Update,
13380   _In_ PBOOLEAN WritePermission);
13381 
13382 NTKERNELAPI
13383 NTSTATUS
13384 NTAPI
13385 IoConnectInterruptEx(
13386   _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
13387 
13388 NTKERNELAPI
13389 VOID
13390 NTAPI
13391 IoDisconnectInterruptEx(
13392   _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
13393 
13394 LOGICAL
13395 NTAPI
13396 IoWithinStackLimits(
13397   _In_ ULONG_PTR RegionStart,
13398   _In_ SIZE_T RegionSize);
13399 
13400 NTKERNELAPI
13401 VOID
13402 NTAPI
13403 IoSetShareAccessEx(
13404   _In_ ACCESS_MASK DesiredAccess,
13405   _In_ ULONG DesiredShareAccess,
13406   _Inout_ PFILE_OBJECT FileObject,
13407   _Out_ PSHARE_ACCESS ShareAccess,
13408   _In_ PBOOLEAN WritePermission);
13409 
13410 ULONG
13411 NTAPI
13412 IoSizeofWorkItem(VOID);
13413 
13414 VOID
13415 NTAPI
13416 IoInitializeWorkItem(
13417   _In_ PVOID IoObject,
13418   _Out_ PIO_WORKITEM IoWorkItem);
13419 
13420 VOID
13421 NTAPI
13422 IoUninitializeWorkItem(
13423   _Inout_ PIO_WORKITEM IoWorkItem);
13424 
13425 _IRQL_requires_max_(DISPATCH_LEVEL)
13426 VOID
13427 NTAPI
13428 IoQueueWorkItemEx(
13429   _Inout_ PIO_WORKITEM IoWorkItem,
13430   _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
13431   _In_ WORK_QUEUE_TYPE QueueType,
13432   _In_opt_ __drv_aliasesMem PVOID Context);
13433 
13434 IO_PRIORITY_HINT
13435 NTAPI
13436 IoGetIoPriorityHint(
13437   _In_ PIRP Irp);
13438 
13439 NTSTATUS
13440 NTAPI
13441 IoSetIoPriorityHint(
13442   _In_ PIRP Irp,
13443   _In_ IO_PRIORITY_HINT PriorityHint);
13444 
13445 NTSTATUS
13446 NTAPI
13447 IoAllocateSfioStreamIdentifier(
13448   _In_ PFILE_OBJECT FileObject,
13449   _In_ ULONG Length,
13450   _In_ PVOID Signature,
13451   _Out_ PVOID *StreamIdentifier);
13452 
13453 PVOID
13454 NTAPI
13455 IoGetSfioStreamIdentifier(
13456   _In_ PFILE_OBJECT FileObject,
13457   _In_ PVOID Signature);
13458 
13459 NTSTATUS
13460 NTAPI
13461 IoFreeSfioStreamIdentifier(
13462   _In_ PFILE_OBJECT FileObject,
13463   _In_ PVOID Signature);
13464 
13465 _IRQL_requires_max_(DISPATCH_LEVEL)
13466 _Must_inspect_result_
13467 NTKERNELAPI
13468 NTSTATUS
13469 NTAPI
13470 IoRequestDeviceEjectEx(
13471   _In_ PDEVICE_OBJECT PhysicalDeviceObject,
13472   _In_opt_ PIO_DEVICE_EJECT_CALLBACK Callback,
13473   _In_opt_ PVOID Context,
13474   _In_opt_ PDRIVER_OBJECT DriverObject);
13475 
13476 _IRQL_requires_max_(PASSIVE_LEVEL)
13477 _Must_inspect_result_
13478 NTKERNELAPI
13479 NTSTATUS
13480 NTAPI
13481 IoSetDevicePropertyData(
13482   _In_ PDEVICE_OBJECT Pdo,
13483   _In_ CONST DEVPROPKEY *PropertyKey,
13484   _In_ LCID Lcid,
13485   _In_ ULONG Flags,
13486   _In_ DEVPROPTYPE Type,
13487   _In_ ULONG Size,
13488   _In_opt_ PVOID Data);
13489 
13490 _IRQL_requires_max_(PASSIVE_LEVEL)
13491 _Must_inspect_result_
13492 NTKERNELAPI
13493 NTSTATUS
13494 NTAPI
13495 IoGetDevicePropertyData(
13496   _In_ PDEVICE_OBJECT Pdo,
13497   _In_ CONST DEVPROPKEY *PropertyKey,
13498   _In_ LCID Lcid,
13499   _Reserved_ ULONG Flags,
13500   _In_ ULONG Size,
13501   _Out_ PVOID Data,
13502   _Out_ PULONG RequiredSize,
13503   _Out_ PDEVPROPTYPE Type);
13504 
13505 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13506 
13507 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
13508 
13509 #if (NTDDI_VERSION >= NTDDI_WS08)
13510 _IRQL_requires_max_(PASSIVE_LEVEL)
13511 _Must_inspect_result_
13512 NTKERNELAPI
13513 NTSTATUS
13514 NTAPI
13515 IoReplacePartitionUnit(
13516   _In_ PDEVICE_OBJECT TargetPdo,
13517   _In_ PDEVICE_OBJECT SparePdo,
13518   _In_ ULONG Flags);
13519 #endif
13520 
13521 #if (NTDDI_VERSION >= NTDDI_WIN7)
13522 
13523 NTKERNELAPI
13524 NTSTATUS
13525 NTAPI
13526 IoGetAffinityInterrupt(
13527   _In_ PKINTERRUPT InterruptObject,
13528   _Out_ PGROUP_AFFINITY GroupAffinity);
13529 
13530 NTSTATUS
13531 NTAPI
13532 IoGetContainerInformation(
13533   _In_ IO_CONTAINER_INFORMATION_CLASS InformationClass,
13534   _In_opt_ PVOID ContainerObject,
13535   _Inout_updates_bytes_opt_(BufferLength) PVOID Buffer,
13536   _In_ ULONG BufferLength);
13537 
13538 NTSTATUS
13539 NTAPI
13540 IoRegisterContainerNotification(
13541   _In_ IO_CONTAINER_NOTIFICATION_CLASS NotificationClass,
13542   _In_ PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction,
13543   _In_reads_bytes_opt_(NotificationInformationLength) PVOID NotificationInformation,
13544   _In_ ULONG NotificationInformationLength,
13545   _Out_ PVOID CallbackRegistration);
13546 
13547 VOID
13548 NTAPI
13549 IoUnregisterContainerNotification(
13550   _In_ PVOID CallbackRegistration);
13551 
13552 _IRQL_requires_max_(PASSIVE_LEVEL)
13553 __drv_freesMem(Pool)
13554 NTKERNELAPI
13555 NTSTATUS
13556 NTAPI
13557 IoUnregisterPlugPlayNotificationEx(
13558   _In_ PVOID NotificationEntry);
13559 
13560 _IRQL_requires_max_(PASSIVE_LEVEL)
13561 _Must_inspect_result_
13562 NTKERNELAPI
13563 NTSTATUS
13564 NTAPI
13565 IoGetDeviceNumaNode(
13566   _In_ PDEVICE_OBJECT Pdo,
13567   _Out_ PUSHORT NodeNumber);
13568 
13569 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13570 
13571 #if defined(_WIN64)
13572 NTKERNELAPI
13573 ULONG
13574 NTAPI
13575 IoWMIDeviceObjectToProviderId(
13576   _In_ PDEVICE_OBJECT DeviceObject);
13577 #else
13578 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
13579 #endif
13580 
13581 /*
13582  * USHORT
13583  * IoSizeOfIrp(
13584  *   IN CCHAR  StackSize)
13585  */
13586 #define IoSizeOfIrp(_StackSize) \
13587   ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
13588 
13589 FORCEINLINE
13590 VOID
13591 IoSkipCurrentIrpStackLocation(
13592   _Inout_ PIRP Irp)
13593 {
13594   ASSERT(Irp->CurrentLocation <= Irp->StackCount);
13595   Irp->CurrentLocation++;
13596 #ifdef NONAMELESSUNION
13597   Irp->Tail.Overlay.s.u.CurrentStackLocation++;
13598 #else
13599   Irp->Tail.Overlay.CurrentStackLocation++;
13600 #endif
13601 }
13602 
13603 FORCEINLINE
13604 VOID
13605 IoSetNextIrpStackLocation(
13606   _Inout_ PIRP Irp)
13607 {
13608   ASSERT(Irp->CurrentLocation > 0);
13609   Irp->CurrentLocation--;
13610 #ifdef NONAMELESSUNION
13611   Irp->Tail.Overlay.s.u.CurrentStackLocation--;
13612 #else
13613   Irp->Tail.Overlay.CurrentStackLocation--;
13614 #endif
13615 }
13616 
13617 __drv_aliasesMem
13618 FORCEINLINE
13619 PIO_STACK_LOCATION
13620 IoGetNextIrpStackLocation(
13621   _In_ PIRP Irp)
13622 {
13623   ASSERT(Irp->CurrentLocation > 0);
13624 #ifdef NONAMELESSUNION
13625   return ((Irp)->Tail.Overlay.s.u.CurrentStackLocation - 1 );
13626 #else
13627   return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
13628 #endif
13629 }
13630 
13631 _IRQL_requires_max_(DISPATCH_LEVEL)
13632 FORCEINLINE
13633 VOID
13634 IoSetCompletionRoutine(
13635   _In_ PIRP Irp,
13636   _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine,
13637   _In_opt_ __drv_aliasesMem PVOID Context,
13638   _In_ BOOLEAN InvokeOnSuccess,
13639   _In_ BOOLEAN InvokeOnError,
13640   _In_ BOOLEAN InvokeOnCancel)
13641 {
13642   PIO_STACK_LOCATION irpSp;
13643   ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
13644   irpSp = IoGetNextIrpStackLocation(Irp);
13645   irpSp->CompletionRoutine = CompletionRoutine;
13646   irpSp->Context = Context;
13647   irpSp->Control = 0;
13648 
13649   if (InvokeOnSuccess) {
13650     irpSp->Control = SL_INVOKE_ON_SUCCESS;
13651   }
13652 
13653   if (InvokeOnError) {
13654     irpSp->Control |= SL_INVOKE_ON_ERROR;
13655   }
13656 
13657   if (InvokeOnCancel) {
13658     irpSp->Control |= SL_INVOKE_ON_CANCEL;
13659   }
13660 }
13661 
13662 _IRQL_requires_max_(DISPATCH_LEVEL)
13663 _Ret_maybenull_
13664 FORCEINLINE
13665 PDRIVER_CANCEL
13666 IoSetCancelRoutine(
13667     _Inout_ PIRP Irp,
13668     _In_opt_ PDRIVER_CANCEL CancelRoutine)
13669 {
13670     return (PDRIVER_CANCEL)(ULONG_PTR) InterlockedExchangePointer((PVOID *)&(Irp)->CancelRoutine, (PVOID)(ULONG_PTR)(CancelRoutine));
13671 }
13672 
13673 FORCEINLINE
13674 VOID
13675 IoRequestDpc(
13676     _Inout_ PDEVICE_OBJECT DeviceObject,
13677     _In_opt_ PIRP Irp,
13678     _In_opt_ __drv_aliasesMem PVOID Context)
13679 {
13680     KeInsertQueueDpc(&DeviceObject->Dpc, Irp, Context);
13681 }
13682 
13683 /*
13684  * VOID
13685  * IoReleaseRemoveLock(
13686  *   IN PIO_REMOVE_LOCK  RemoveLock,
13687  *   IN PVOID  Tag)
13688  */
13689 #define IoReleaseRemoveLock(_RemoveLock, \
13690                             _Tag) \
13691   IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
13692 
13693 /*
13694  * VOID
13695  * IoReleaseRemoveLockAndWait(
13696  *   IN PIO_REMOVE_LOCK  RemoveLock,
13697  *   IN PVOID  Tag)
13698  */
13699 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
13700                                    _Tag) \
13701   IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
13702 
13703 #if defined(_WIN64)
13704 _IRQL_requires_max_(DISPATCH_LEVEL)
13705 NTKERNELAPI
13706 BOOLEAN
13707 IoIs32bitProcess(
13708   _In_opt_ PIRP Irp);
13709 #endif
13710 
13711 #define PLUGPLAY_REGKEY_DEVICE                            1
13712 #define PLUGPLAY_REGKEY_DRIVER                            2
13713 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE                 4
13714 
13715 __drv_aliasesMem
13716 FORCEINLINE
13717 PIO_STACK_LOCATION
13718 IoGetCurrentIrpStackLocation(
13719   _In_ PIRP Irp)
13720 {
13721   ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
13722 #ifdef NONAMELESSUNION
13723   return Irp->Tail.Overlay.s.u.CurrentStackLocation;
13724 #else
13725   return Irp->Tail.Overlay.CurrentStackLocation;
13726 #endif
13727 }
13728 
13729 FORCEINLINE
13730 VOID
13731 IoMarkIrpPending(
13732   _Inout_ PIRP Irp)
13733 {
13734     IoGetCurrentIrpStackLocation((Irp))->Control |= SL_PENDING_RETURNED;
13735 }
13736 
13737 /*
13738  * BOOLEAN
13739  * IoIsErrorUserInduced(
13740  *   IN NTSTATUS  Status);
13741  */
13742 #define IoIsErrorUserInduced(Status) \
13743    ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
13744    ((Status) == STATUS_IO_TIMEOUT) || \
13745    ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
13746    ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
13747    ((Status) == STATUS_VERIFY_REQUIRED) || \
13748    ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
13749    ((Status) == STATUS_WRONG_VOLUME)))
13750 
13751 /* VOID
13752  * IoInitializeRemoveLock(
13753  *   IN PIO_REMOVE_LOCK  Lock,
13754  *   IN ULONG  AllocateTag,
13755  *   IN ULONG  MaxLockedMinutes,
13756  *   IN ULONG  HighWatermark)
13757  */
13758 #define IoInitializeRemoveLock( \
13759   Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
13760   IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
13761     HighWatermark, sizeof(IO_REMOVE_LOCK))
13762 
13763 FORCEINLINE
13764 VOID
13765 IoInitializeDpcRequest(
13766   _In_ PDEVICE_OBJECT DeviceObject,
13767   _In_ PIO_DPC_ROUTINE DpcRoutine)
13768 {
13769 #ifdef _MSC_VER
13770 #pragma warning(push)
13771 #pragma warning(disable:28024)
13772 #endif
13773   KeInitializeDpc(&DeviceObject->Dpc,
13774                   (PKDEFERRED_ROUTINE) DpcRoutine,
13775                   DeviceObject);
13776 #ifdef _MSC_VER
13777 #pragma warning(pop)
13778 #endif
13779 }
13780 
13781 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
13782 
13783 /*
13784  * ULONG
13785  * IoGetFunctionCodeFromCtlCode(
13786  *   IN ULONG  ControlCode)
13787  */
13788 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
13789   (((_ControlCode) >> 2) & 0x00000FFF)
13790 
13791 FORCEINLINE
13792 VOID
13793 IoCopyCurrentIrpStackLocationToNext(
13794     _Inout_ PIRP Irp)
13795 {
13796     PIO_STACK_LOCATION irpSp;
13797     PIO_STACK_LOCATION nextIrpSp;
13798     irpSp = IoGetCurrentIrpStackLocation(Irp);
13799     nextIrpSp = IoGetNextIrpStackLocation(Irp);
13800     RtlCopyMemory(nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
13801     nextIrpSp->Control = 0;
13802 }
13803 
13804 _IRQL_requires_max_(APC_LEVEL)
13805 NTKERNELAPI
13806 VOID
13807 NTAPI
13808 IoGetStackLimits(
13809   _Out_ PULONG_PTR LowLimit,
13810   _Out_ PULONG_PTR HighLimit);
13811 
13812 _IRQL_requires_max_(APC_LEVEL)
13813 FORCEINLINE
13814 ULONG_PTR
13815 IoGetRemainingStackSize(VOID)
13816 {
13817     ULONG_PTR End, Begin;
13818     ULONG_PTR Result;
13819 
13820     IoGetStackLimits(&Begin, &End);
13821     Result = (ULONG_PTR)(&End) - Begin;
13822     return Result;
13823 }
13824 
13825 #if (NTDDI_VERSION >= NTDDI_WS03)
13826 FORCEINLINE
13827 VOID
13828 IoInitializeThreadedDpcRequest(
13829     _In_ PDEVICE_OBJECT DeviceObject,
13830     _In_ PIO_DPC_ROUTINE DpcRoutine)
13831 {
13832 #ifdef _MSC_VER
13833 #pragma warning(push)
13834 #pragma warning(disable:28024)
13835 #pragma warning(disable:28128)
13836 #endif
13837     KeInitializeThreadedDpc(&DeviceObject->Dpc,
13838                             (PKDEFERRED_ROUTINE) DpcRoutine,
13839                             DeviceObject );
13840 #ifdef _MSC_VER
13841 #pragma warning(pop)
13842 #endif
13843 }
13844 #endif
13845 
13846 /******************************************************************************
13847  *                     Power Management Support Functions                     *
13848  ******************************************************************************/
13849 
13850 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
13851 
13852 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13853 
13854 _IRQL_requires_max_(DISPATCH_LEVEL)
13855 NTKERNELAPI
13856 NTSTATUS
13857 NTAPI
13858 PoCallDriver(
13859   _In_ struct _DEVICE_OBJECT *DeviceObject,
13860   _Inout_ __drv_aliasesMem struct _IRP *Irp);
13861 
13862 _IRQL_requires_max_(APC_LEVEL)
13863 NTKERNELAPI
13864 PULONG
13865 NTAPI
13866 PoRegisterDeviceForIdleDetection(
13867   _In_ struct _DEVICE_OBJECT *DeviceObject,
13868   _In_ ULONG ConservationIdleTime,
13869   _In_ ULONG PerformanceIdleTime,
13870   _In_ DEVICE_POWER_STATE State);
13871 
13872 _IRQL_requires_max_(APC_LEVEL)
13873 NTKERNELAPI
13874 PVOID
13875 NTAPI
13876 PoRegisterSystemState(
13877   _Inout_opt_ PVOID StateHandle,
13878   _In_ EXECUTION_STATE Flags);
13879 
13880 _IRQL_requires_max_(DISPATCH_LEVEL)
13881 NTKERNELAPI
13882 NTSTATUS
13883 NTAPI
13884 PoRequestPowerIrp(
13885   _In_ struct _DEVICE_OBJECT *DeviceObject,
13886   _In_ UCHAR MinorFunction,
13887   _In_ POWER_STATE PowerState,
13888   _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction,
13889   _In_opt_ __drv_aliasesMem PVOID Context,
13890   _Outptr_opt_ struct _IRP **Irp);
13891 
13892 _IRQL_requires_max_(DISPATCH_LEVEL)
13893 NTKERNELAPI
13894 POWER_STATE
13895 NTAPI
13896 PoSetPowerState(
13897   _In_ struct _DEVICE_OBJECT *DeviceObject,
13898   _In_ POWER_STATE_TYPE Type,
13899   _In_ POWER_STATE State);
13900 
13901 _IRQL_requires_max_(DISPATCH_LEVEL)
13902 NTKERNELAPI
13903 VOID
13904 NTAPI
13905 PoSetSystemState(
13906   _In_ EXECUTION_STATE Flags);
13907 
13908 _IRQL_requires_max_(DISPATCH_LEVEL)
13909 NTKERNELAPI
13910 VOID
13911 NTAPI
13912 PoStartNextPowerIrp(
13913   _Inout_ struct _IRP *Irp);
13914 
13915 _IRQL_requires_max_(APC_LEVEL)
13916 NTKERNELAPI
13917 VOID
13918 NTAPI
13919 PoUnregisterSystemState(
13920   _Inout_ PVOID StateHandle);
13921 
13922 NTKERNELAPI
13923 NTSTATUS
13924 NTAPI
13925 PoRequestShutdownEvent(
13926   OUT PVOID *Event);
13927 
13928 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13929 
13930 #if (NTDDI_VERSION >= NTDDI_VISTA)
13931 
13932 _IRQL_requires_max_(DISPATCH_LEVEL)
13933 NTKERNELAPI
13934 VOID
13935 NTAPI
13936 PoSetSystemWake(
13937   _Inout_ struct _IRP *Irp);
13938 
13939 _IRQL_requires_max_(DISPATCH_LEVEL)
13940 NTKERNELAPI
13941 BOOLEAN
13942 NTAPI
13943 PoGetSystemWake(
13944   _In_ struct _IRP *Irp);
13945 
13946 _IRQL_requires_max_(APC_LEVEL)
13947 NTKERNELAPI
13948 NTSTATUS
13949 NTAPI
13950 PoRegisterPowerSettingCallback(
13951   _In_opt_ PDEVICE_OBJECT DeviceObject,
13952   _In_ LPCGUID SettingGuid,
13953   _In_ PPOWER_SETTING_CALLBACK Callback,
13954   _In_opt_ PVOID Context,
13955   _Outptr_opt_ PVOID *Handle);
13956 
13957 _IRQL_requires_max_(APC_LEVEL)
13958 NTKERNELAPI
13959 NTSTATUS
13960 NTAPI
13961 PoUnregisterPowerSettingCallback(
13962   _Inout_ PVOID Handle);
13963 
13964 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13965 
13966 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
13967 NTKERNELAPI
13968 VOID
13969 NTAPI
13970 PoSetDeviceBusyEx(
13971   _Inout_ PULONG IdlePointer);
13972 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
13973 
13974 #if (NTDDI_VERSION >= NTDDI_WIN7)
13975 
13976 NTKERNELAPI
13977 VOID
13978 NTAPI
13979 PoStartDeviceBusy(
13980   _Inout_ PULONG IdlePointer);
13981 
13982 NTKERNELAPI
13983 VOID
13984 NTAPI
13985 PoEndDeviceBusy(
13986   _Inout_ PULONG IdlePointer);
13987 
13988 _IRQL_requires_max_(DISPATCH_LEVEL)
13989 NTKERNELAPI
13990 BOOLEAN
13991 NTAPI
13992 PoQueryWatchdogTime(
13993   _In_ PDEVICE_OBJECT Pdo,
13994   _Out_ PULONG SecondsRemaining);
13995 
13996 _IRQL_requires_max_(APC_LEVEL)
13997 NTKERNELAPI
13998 VOID
13999 NTAPI
14000 PoDeletePowerRequest(
14001   _Inout_ PVOID PowerRequest);
14002 
14003 _IRQL_requires_max_(DISPATCH_LEVEL)
14004 NTKERNELAPI
14005 NTSTATUS
14006 NTAPI
14007 PoSetPowerRequest(
14008   _Inout_ PVOID PowerRequest,
14009   _In_ POWER_REQUEST_TYPE Type);
14010 
14011 _IRQL_requires_max_(DISPATCH_LEVEL)
14012 NTKERNELAPI
14013 NTSTATUS
14014 NTAPI
14015 PoClearPowerRequest(
14016   _Inout_ PVOID PowerRequest,
14017   _In_ POWER_REQUEST_TYPE Type);
14018 
14019 _IRQL_requires_max_(APC_LEVEL)
14020 NTKERNELAPI
14021 NTSTATUS
14022 NTAPI
14023 PoCreatePowerRequest(
14024   _Outptr_ PVOID *PowerRequest,
14025   _In_ PDEVICE_OBJECT DeviceObject,
14026   _In_opt_ PCOUNTED_REASON_CONTEXT Context);
14027 
14028 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14029 
14030 /******************************************************************************
14031  *                          Executive Functions                               *
14032  ******************************************************************************/
14033 
14034 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
14035 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
14036 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
14037 
14038 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
14039 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
14040 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
14041 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
14042 
14043 #define ExInitializeSListHead InitializeSListHead
14044 
14045 #if defined(_NTHAL_) && defined(_X86_)
14046 
14047 NTKERNELAPI
14048 VOID
14049 FASTCALL
14050 ExiAcquireFastMutex(
14051   IN OUT PFAST_MUTEX FastMutex);
14052 
14053 NTKERNELAPI
14054 VOID
14055 FASTCALL
14056 ExiReleaseFastMutex(
14057   IN OUT PFAST_MUTEX FastMutex);
14058 
14059 NTKERNELAPI
14060 BOOLEAN
14061 FASTCALL
14062 ExiTryToAcquireFastMutex(
14063     IN OUT PFAST_MUTEX FastMutex);
14064 
14065 #define ExAcquireFastMutex ExiAcquireFastMutex
14066 #define ExReleaseFastMutex ExiReleaseFastMutex
14067 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
14068 
14069 #else
14070 
14071 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14072 
14073 _IRQL_raises_(APC_LEVEL)
14074 _IRQL_saves_global_(OldIrql, FastMutex)
14075 NTKERNELAPI
14076 VOID
14077 FASTCALL
14078 ExAcquireFastMutex(
14079   _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14080     PFAST_MUTEX FastMutex);
14081 
14082 _IRQL_requires_(APC_LEVEL)
14083 _IRQL_restores_global_(OldIrql, FastMutex)
14084 NTKERNELAPI
14085 VOID
14086 FASTCALL
14087 ExReleaseFastMutex(
14088   _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
14089     PFAST_MUTEX FastMutex);
14090 
14091 _Must_inspect_result_
14092 _Success_(return!=FALSE)
14093 _IRQL_raises_(APC_LEVEL)
14094 _IRQL_saves_global_(OldIrql, FastMutex)
14095 NTKERNELAPI
14096 BOOLEAN
14097 FASTCALL
14098 ExTryToAcquireFastMutex(
14099   _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14100     PFAST_MUTEX FastMutex);
14101 
14102 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14103 
14104 #endif /* defined(_NTHAL_) && defined(_X86_) */
14105 
14106 #if defined(_X86_)
14107 #define ExInterlockedAddUlong ExfInterlockedAddUlong
14108 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
14109 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
14110 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
14111 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
14112 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
14113 #endif /* defined(_X86_) */
14114 
14115 #if defined(_WIN64)
14116 
14117 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
14118     defined(_NTHAL_) || defined(_NTOSP_)
14119 NTKERNELAPI
14120 USHORT
14121 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead);
14122 #else
14123 FORCEINLINE
14124 USHORT
14125 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead)
14126 {
14127   return (USHORT)(ListHead->Alignment & 0xffff);
14128 }
14129 #endif
14130 
14131 NTKERNELAPI
14132 PSLIST_ENTRY
14133 ExpInterlockedFlushSList(
14134   PSLIST_HEADER ListHead);
14135 
14136 NTKERNELAPI
14137 PSLIST_ENTRY
14138 ExpInterlockedPopEntrySList(
14139   _Inout_ PSLIST_HEADER ListHead);
14140 
14141 NTKERNELAPI
14142 PSLIST_ENTRY
14143 ExpInterlockedPushEntrySList(
14144   _Inout_ PSLIST_HEADER ListHead,
14145   _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry);
14146 
14147 #define ExInterlockedFlushSList(Head) \
14148     ExpInterlockedFlushSList(Head)
14149 #define ExInterlockedPopEntrySList(Head, Lock) \
14150     ExpInterlockedPopEntrySList(Head)
14151 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
14152     ExpInterlockedPushEntrySList(Head, Entry)
14153 
14154 #else /* !defined(_WIN64) */
14155 
14156 #ifdef NONAMELESSUNION
14157 #define ExQueryDepthSList(listhead) (listhead)->s.Depth
14158 #else
14159 #define ExQueryDepthSList(listhead) (listhead)->Depth
14160 #endif
14161 
14162 NTKERNELAPI
14163 PSINGLE_LIST_ENTRY
14164 FASTCALL
14165 ExInterlockedFlushSList(
14166   _Inout_ PSLIST_HEADER ListHead);
14167 
14168 #endif /* !defined(_WIN64) */
14169 
14170 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14171 
14172 NTKERNELAPI
14173 PSINGLE_LIST_ENTRY
14174 FASTCALL
14175 ExInterlockedPopEntrySList(
14176   _Inout_ PSLIST_HEADER ListHead,
14177   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14178 
14179 NTKERNELAPI
14180 PSINGLE_LIST_ENTRY
14181 FASTCALL
14182 ExInterlockedPushEntrySList(
14183   _Inout_ PSLIST_HEADER ListHead,
14184   _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry,
14185   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14186 
14187 _IRQL_requires_max_(APC_LEVEL)
14188 NTKERNELAPI
14189 PVOID
14190 NTAPI
14191 ExAllocateFromPagedLookasideList(
14192   _Inout_ PPAGED_LOOKASIDE_LIST Lookaside);
14193 
14194 _IRQL_requires_max_(APC_LEVEL)
14195 NTKERNELAPI
14196 VOID
14197 NTAPI
14198 ExFreeToPagedLookasideList(
14199   _Inout_ PPAGED_LOOKASIDE_LIST Lookaside,
14200   _In_ PVOID Entry);
14201 
14202 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
14203 
14204 #if !defined(_WIN64)
14205 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
14206     InterlockedPopEntrySList(_ListHead)
14207 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
14208     InterlockedPushEntrySList(_ListHead, _ListEntry)
14209 #endif
14210 
14211 _IRQL_requires_max_(APC_LEVEL)
14212 static __inline
14213 PVOID
14214 ExAllocateFromPagedLookasideList(
14215   _Inout_ PPAGED_LOOKASIDE_LIST Lookaside)
14216 {
14217   PVOID Entry;
14218 
14219   Lookaside->L.TotalAllocates++;
14220 #ifdef NONAMELESSUNION
14221   Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
14222   if (Entry == NULL) {
14223     Lookaside->L.u2.AllocateMisses++;
14224     Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
14225                                        Lookaside->L.Size,
14226                                        Lookaside->L.Tag);
14227   }
14228 #else /* NONAMELESSUNION */
14229   Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
14230   if (Entry == NULL) {
14231     Lookaside->L.AllocateMisses++;
14232     Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
14233                                     Lookaside->L.Size,
14234                                     Lookaside->L.Tag);
14235   }
14236 #endif /* NONAMELESSUNION */
14237   return Entry;
14238 }
14239 
14240 _IRQL_requires_max_(APC_LEVEL)
14241 static __inline
14242 VOID
14243 ExFreeToPagedLookasideList(
14244   _Inout_ PPAGED_LOOKASIDE_LIST Lookaside,
14245   _In_ PVOID Entry)
14246 {
14247   Lookaside->L.TotalFrees++;
14248 #ifdef NONAMELESSUNION
14249   if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
14250     Lookaside->L.u3.FreeMisses++;
14251     (Lookaside->L.u5.Free)(Entry);
14252   } else {
14253     InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
14254   }
14255 #else /* NONAMELESSUNION */
14256   if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
14257     Lookaside->L.FreeMisses++;
14258     (Lookaside->L.Free)(Entry);
14259   } else {
14260     InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
14261   }
14262 #endif /* NONAMELESSUNION */
14263 }
14264 
14265 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
14266 
14267 
14268 /* ERESOURCE_THREAD
14269  * ExGetCurrentResourceThread(
14270  *     VOID);
14271  */
14272 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
14273 
14274 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
14275 
14276 /* VOID
14277  * ExInitializeWorkItem(
14278  *     IN PWORK_QUEUE_ITEM Item,
14279  *     IN PWORKER_THREAD_ROUTINE Routine,
14280  *     IN PVOID Context)
14281  */
14282 #define ExInitializeWorkItem(Item, Routine, Context) \
14283 { \
14284   (Item)->WorkerRoutine = Routine; \
14285   (Item)->Parameter = Context; \
14286   (Item)->List.Flink = NULL; \
14287 }
14288 
14289 FORCEINLINE
14290 VOID
14291 ExInitializeFastMutex(
14292   _Out_ PFAST_MUTEX FastMutex)
14293 {
14294   FastMutex->Count = FM_LOCK_BIT;
14295   FastMutex->Owner = NULL;
14296   FastMutex->Contention = 0;
14297   KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
14298   return;
14299 }
14300 
14301 
14302 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14303 _IRQL_requires_max_(APC_LEVEL)
14304 _Requires_lock_held_(_Global_critical_region_)
14305 NTKERNELAPI
14306 VOID
14307 FASTCALL
14308 ExAcquireFastMutexUnsafe(
14309   _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14310     PFAST_MUTEX FastMutex);
14311 
14312 _IRQL_requires_max_(APC_LEVEL)
14313 _Requires_lock_held_(_Global_critical_region_)
14314 NTKERNELAPI
14315 VOID
14316 FASTCALL
14317 ExReleaseFastMutexUnsafe(
14318   _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
14319     PFAST_MUTEX FastMutex);
14320 
14321 _Requires_lock_held_(_Global_critical_region_)
14322 _Requires_lock_not_held_(*Resource)
14323 _When_(Wait!=0, _Acquires_exclusive_lock_(*Resource))
14324 _IRQL_requires_max_(APC_LEVEL)
14325 _When_(Wait!=0, _Post_satisfies_(return == 1))
14326 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
14327 NTKERNELAPI
14328 BOOLEAN
14329 NTAPI
14330 ExAcquireResourceExclusiveLite(
14331   _Inout_ PERESOURCE Resource,
14332   _In_ _Literal_ BOOLEAN Wait);
14333 
14334 _IRQL_requires_max_(APC_LEVEL)
14335 _Requires_lock_held_(_Global_critical_region_)
14336 _When_(Wait!=0, _Post_satisfies_(return == 1))
14337 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
14338 NTKERNELAPI
14339 BOOLEAN
14340 NTAPI
14341 ExAcquireResourceSharedLite(
14342   _Inout_ _Requires_lock_not_held_(*_Curr_)
14343   _When_(return!=0, _Acquires_shared_lock_(*_Curr_))
14344     PERESOURCE Resource,
14345   _In_ BOOLEAN Wait);
14346 
14347 _IRQL_requires_max_(APC_LEVEL)
14348 _Requires_lock_held_(_Global_critical_region_)
14349 _When_(Wait!=0, _Post_satisfies_(return == 1))
14350 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
14351 NTKERNELAPI
14352 BOOLEAN
14353 NTAPI
14354 ExAcquireSharedStarveExclusive(
14355   _Inout_ _Requires_lock_not_held_(*_Curr_)
14356   _When_(return!=0, _Acquires_shared_lock_(*_Curr_))
14357     PERESOURCE Resource,
14358   _In_ BOOLEAN Wait);
14359 
14360 _IRQL_requires_max_(APC_LEVEL)
14361 _Requires_lock_held_(_Global_critical_region_)
14362 _When_(Wait!=0, _Post_satisfies_(return == 1))
14363 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
14364 NTKERNELAPI
14365 BOOLEAN
14366 NTAPI
14367 ExAcquireSharedWaitForExclusive(
14368   _Inout_ _Requires_lock_not_held_(*_Curr_)
14369   _When_(return!=0, _Acquires_lock_(*_Curr_))
14370     PERESOURCE Resource,
14371   _In_ BOOLEAN Wait);
14372 
14373 __drv_preferredFunction("ExAllocatePoolWithTag",
14374                         "No tag interferes with debugging.")
14375 __drv_allocatesMem(Mem)
14376 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14377 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14378 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14379   __drv_reportError("Must succeed pool allocations are forbidden. "
14380                     "Allocation failures cause a system crash"))
14381 _When_((PoolType & (NonPagedPoolMustSucceed |
14382                     POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
14383   _Post_maybenull_ _Must_inspect_result_)
14384 _When_((PoolType & (NonPagedPoolMustSucceed |
14385                     POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
14386   _Post_notnull_)
14387 _Post_writable_byte_size_(NumberOfBytes)
14388 NTKERNELAPI
14389 PVOID
14390 NTAPI
14391 ExAllocatePool(
14392   __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
14393   _In_ SIZE_T NumberOfBytes);
14394 
14395 __drv_preferredFunction("ExAllocatePoolWithQuotaTag",
14396                         "No tag interferes with debugging.")
14397 __drv_allocatesMem(Mem)
14398 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14399 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14400 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14401   __drv_reportError("Must succeed pool allocations are forbidden. "
14402                     "Allocation failures cause a system crash"))
14403 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0,
14404   _Post_maybenull_ _Must_inspect_result_)
14405 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_)
14406 _Post_writable_byte_size_(NumberOfBytes)
14407 NTKERNELAPI
14408 PVOID
14409 NTAPI
14410 ExAllocatePoolWithQuota(
14411   __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
14412   _In_ SIZE_T NumberOfBytes);
14413 
14414 __drv_allocatesMem(Mem)
14415 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14416 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14417 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14418   __drv_reportError("Must succeed pool allocations are forbidden. "
14419                     "Allocation failures cause a system crash"))
14420 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0,
14421   _Post_maybenull_ _Must_inspect_result_)
14422 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_)
14423 _Post_writable_byte_size_(NumberOfBytes)
14424 NTKERNELAPI
14425 PVOID
14426 NTAPI
14427 ExAllocatePoolWithQuotaTag(
14428   _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
14429   _In_ SIZE_T NumberOfBytes,
14430   _In_ ULONG Tag);
14431 
14432 #ifndef POOL_TAGGING
14433 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
14434 #endif
14435 
14436 __drv_allocatesMem(Mem)
14437 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14438 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14439 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14440   __drv_reportError("Must succeed pool allocations are forbidden. "
14441                     "Allocation failures cause a system crash"))
14442 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
14443   _Post_maybenull_ _Must_inspect_result_)
14444 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
14445   _Post_notnull_)
14446 _Post_writable_byte_size_(NumberOfBytes)
14447 NTKERNELAPI
14448 PVOID
14449 NTAPI
14450 ExAllocatePoolWithTag(
14451   _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
14452   _In_ SIZE_T NumberOfBytes,
14453   _In_ ULONG Tag);
14454 
14455 #ifndef POOL_TAGGING
14456 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
14457 #endif
14458 
14459 __drv_allocatesMem(Mem)
14460 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
14461 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
14462 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
14463   __drv_reportError("Must succeed pool allocations are forbidden. "
14464                     "Allocation failures cause a system crash"))
14465 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
14466   _Post_maybenull_ _Must_inspect_result_)
14467 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
14468   _Post_notnull_)
14469 _Post_writable_byte_size_(NumberOfBytes)
14470 NTKERNELAPI
14471 PVOID
14472 NTAPI
14473 ExAllocatePoolWithTagPriority(
14474   _In_ __drv_strictTypeMatch(__drv_typeCond) POOL_TYPE PoolType,
14475   _In_ SIZE_T NumberOfBytes,
14476   _In_ ULONG Tag,
14477   _In_ __drv_strictTypeMatch(__drv_typeExpr) EX_POOL_PRIORITY Priority);
14478 
14479 _IRQL_requires_max_(DISPATCH_LEVEL)
14480 NTKERNELAPI
14481 VOID
14482 NTAPI
14483 ExConvertExclusiveToSharedLite(
14484   _Inout_ _Requires_lock_held_(*_Curr_) PERESOURCE Resource);
14485 
14486 _IRQL_requires_max_(APC_LEVEL)
14487 NTKERNELAPI
14488 NTSTATUS
14489 NTAPI
14490 ExCreateCallback(
14491   _Outptr_ PCALLBACK_OBJECT *CallbackObject,
14492   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
14493   _In_ BOOLEAN Create,
14494   _In_ BOOLEAN AllowMultipleCallbacks);
14495 
14496 NTKERNELAPI
14497 VOID
14498 NTAPI
14499 ExDeleteNPagedLookasideList(
14500   _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside);
14501 
14502 _IRQL_requires_max_(APC_LEVEL)
14503 NTKERNELAPI
14504 VOID
14505 NTAPI
14506 ExDeletePagedLookasideList(
14507   _Inout_ PPAGED_LOOKASIDE_LIST Lookaside);
14508 
14509 _IRQL_requires_max_(DISPATCH_LEVEL)
14510 NTKERNELAPI
14511 NTSTATUS
14512 NTAPI
14513 ExDeleteResourceLite(
14514   _Inout_ PERESOURCE Resource);
14515 
14516 _IRQL_requires_max_(DISPATCH_LEVEL)
14517 NTKERNELAPI
14518 VOID
14519 NTAPI
14520 ExFreePool(
14521   _In_ __drv_freesMem(Mem) PVOID P);
14522 
14523 _IRQL_requires_max_(DISPATCH_LEVEL)
14524 NTKERNELAPI
14525 VOID
14526 NTAPI
14527 ExFreePoolWithTag(
14528   _In_ __drv_freesMem(Mem) PVOID P,
14529   _In_ ULONG Tag);
14530 
14531 _IRQL_requires_max_(DISPATCH_LEVEL)
14532 NTKERNELAPI
14533 ULONG
14534 NTAPI
14535 ExGetExclusiveWaiterCount(
14536   _In_ PERESOURCE Resource);
14537 
14538 _IRQL_requires_max_(DISPATCH_LEVEL)
14539 NTKERNELAPI
14540 KPROCESSOR_MODE
14541 NTAPI
14542 ExGetPreviousMode(VOID);
14543 
14544 _IRQL_requires_max_(DISPATCH_LEVEL)
14545 NTKERNELAPI
14546 ULONG
14547 NTAPI
14548 ExGetSharedWaiterCount(
14549   _In_ PERESOURCE Resource);
14550 
14551 _IRQL_requires_max_(DISPATCH_LEVEL)
14552 NTKERNELAPI
14553 VOID
14554 NTAPI
14555 ExInitializeNPagedLookasideList(
14556   _Out_ PNPAGED_LOOKASIDE_LIST Lookaside,
14557   _In_opt_ PALLOCATE_FUNCTION Allocate,
14558   _In_opt_ PFREE_FUNCTION Free,
14559   _In_ ULONG Flags,
14560   _In_ SIZE_T Size,
14561   _In_ ULONG Tag,
14562   _In_ USHORT Depth);
14563 
14564 _IRQL_requires_max_(APC_LEVEL)
14565 NTKERNELAPI
14566 VOID
14567 NTAPI
14568 ExInitializePagedLookasideList(
14569   _Out_ PPAGED_LOOKASIDE_LIST Lookaside,
14570   _In_opt_ PALLOCATE_FUNCTION Allocate,
14571   _In_opt_ PFREE_FUNCTION Free,
14572   _In_ ULONG Flags,
14573   _In_ SIZE_T Size,
14574   _In_ ULONG Tag,
14575   _In_ USHORT Depth);
14576 
14577 _IRQL_requires_max_(DISPATCH_LEVEL)
14578 NTKERNELAPI
14579 NTSTATUS
14580 NTAPI
14581 ExInitializeResourceLite(
14582   _Out_ PERESOURCE Resource);
14583 
14584 NTKERNELAPI
14585 LARGE_INTEGER
14586 NTAPI
14587 ExInterlockedAddLargeInteger(
14588   _Inout_ PLARGE_INTEGER Addend,
14589   _In_ LARGE_INTEGER Increment,
14590   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14591 
14592 #if defined(_WIN64)
14593 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
14594     (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
14595 #else
14596 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
14597     _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
14598 #endif
14599 
14600 NTKERNELAPI
14601 ULONG
14602 FASTCALL
14603 ExInterlockedAddUlong(
14604   _Inout_ PULONG Addend,
14605   _In_ ULONG Increment,
14606   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14607 
14608 #if defined(_AMD64_) || defined(_IA64_)
14609 
14610 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
14611     InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
14612 
14613 #elif defined(_X86_)
14614 
14615 NTKERNELAPI
14616 LONGLONG
14617 FASTCALL
14618 ExfInterlockedCompareExchange64(
14619   _Inout_ _Interlocked_operand_ LONGLONG volatile *Destination,
14620   _In_ PLONGLONG Exchange,
14621   _In_ PLONGLONG Comperand);
14622 
14623 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
14624     ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
14625 
14626 #else
14627 
14628 NTKERNELAPI
14629 LONGLONG
14630 FASTCALL
14631 ExInterlockedCompareExchange64(
14632   IN OUT LONGLONG volatile *Destination,
14633   IN PLONGLONG Exchange,
14634   IN PLONGLONG Comparand,
14635   IN PKSPIN_LOCK Lock);
14636 
14637 #endif /* defined(_AMD64_) || defined(_IA64_) */
14638 
14639 NTKERNELAPI
14640 PLIST_ENTRY
14641 FASTCALL
14642 ExInterlockedInsertHeadList(
14643   _Inout_ PLIST_ENTRY ListHead,
14644   _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry,
14645   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14646 
14647 NTKERNELAPI
14648 PLIST_ENTRY
14649 FASTCALL
14650 ExInterlockedInsertTailList(
14651   _Inout_ PLIST_ENTRY ListHead,
14652   _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry,
14653   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14654 
14655 NTKERNELAPI
14656 PSINGLE_LIST_ENTRY
14657 FASTCALL
14658 ExInterlockedPopEntryList(
14659   _Inout_ PSINGLE_LIST_ENTRY ListHead,
14660   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14661 
14662 NTKERNELAPI
14663 PSINGLE_LIST_ENTRY
14664 FASTCALL
14665 ExInterlockedPushEntryList(
14666   _Inout_ PSINGLE_LIST_ENTRY ListHead,
14667   _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry,
14668   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14669 
14670 NTKERNELAPI
14671 PLIST_ENTRY
14672 FASTCALL
14673 ExInterlockedRemoveHeadList(
14674   _Inout_ PLIST_ENTRY ListHead,
14675   _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
14676 
14677 _IRQL_requires_max_(PASSIVE_LEVEL)
14678 NTKERNELAPI
14679 BOOLEAN
14680 NTAPI
14681 ExIsProcessorFeaturePresent(
14682   _In_ ULONG ProcessorFeature);
14683 
14684 _IRQL_requires_max_(DISPATCH_LEVEL)
14685 NTKERNELAPI
14686 BOOLEAN
14687 NTAPI
14688 ExIsResourceAcquiredExclusiveLite(
14689   _In_ PERESOURCE Resource);
14690 
14691 _IRQL_requires_max_(DISPATCH_LEVEL)
14692 NTKERNELAPI
14693 ULONG
14694 NTAPI
14695 ExIsResourceAcquiredSharedLite(
14696   _In_ PERESOURCE Resource);
14697 
14698 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
14699 
14700 NTKERNELAPI
14701 VOID
14702 NTAPI
14703 ExLocalTimeToSystemTime(
14704   _In_ PLARGE_INTEGER LocalTime,
14705   _Out_ PLARGE_INTEGER SystemTime);
14706 
14707 _IRQL_requires_max_(DISPATCH_LEVEL)
14708 NTKERNELAPI
14709 VOID
14710 NTAPI
14711 ExNotifyCallback(
14712   _In_ PCALLBACK_OBJECT CallbackObject,
14713   _In_opt_ PVOID Argument1,
14714   _In_opt_ PVOID Argument2);
14715 
14716 _IRQL_requires_max_(DISPATCH_LEVEL)
14717 NTKERNELAPI
14718 VOID
14719 NTAPI
14720 ExQueueWorkItem(
14721   _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
14722   __drv_strictTypeMatch(__drv_typeExpr) _In_ WORK_QUEUE_TYPE QueueType);
14723 
14724 _IRQL_requires_max_(APC_LEVEL)
14725 NTKERNELAPI
14726 DECLSPEC_NORETURN
14727 VOID
14728 NTAPI
14729 ExRaiseStatus(
14730   _In_ NTSTATUS Status);
14731 
14732 _IRQL_requires_max_(APC_LEVEL)
14733 NTKERNELAPI
14734 PVOID
14735 NTAPI
14736 ExRegisterCallback(
14737   _Inout_ PCALLBACK_OBJECT CallbackObject,
14738   _In_ PCALLBACK_FUNCTION CallbackFunction,
14739   _In_opt_ PVOID CallbackContext);
14740 
14741 _IRQL_requires_max_(DISPATCH_LEVEL)
14742 NTKERNELAPI
14743 NTSTATUS
14744 NTAPI
14745 ExReinitializeResourceLite(
14746   _Inout_ PERESOURCE Resource);
14747 
14748 _IRQL_requires_max_(DISPATCH_LEVEL)
14749 _Requires_lock_held_(_Global_critical_region_)
14750 NTKERNELAPI
14751 VOID
14752 NTAPI
14753 ExReleaseResourceForThreadLite(
14754   _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
14755     PERESOURCE Resource,
14756   _In_ ERESOURCE_THREAD ResourceThreadId);
14757 
14758 _Requires_lock_held_(_Global_critical_region_)
14759 _Requires_lock_held_(*Resource)
14760 _Releases_lock_(*Resource)
14761 _IRQL_requires_max_(DISPATCH_LEVEL)
14762 NTKERNELAPI
14763 VOID
14764 FASTCALL
14765 ExReleaseResourceLite(
14766   _Inout_ PERESOURCE Resource);
14767 
14768 _IRQL_requires_max_(DISPATCH_LEVEL)
14769 NTKERNELAPI
14770 VOID
14771 NTAPI
14772 ExSetResourceOwnerPointer(
14773   _Inout_ PERESOURCE Resource,
14774   _In_ PVOID OwnerPointer);
14775 
14776 _IRQL_requires_max_(APC_LEVEL)
14777 NTKERNELAPI
14778 ULONG
14779 NTAPI
14780 ExSetTimerResolution(
14781   _In_ ULONG DesiredTime,
14782   _In_ BOOLEAN SetResolution);
14783 
14784 NTKERNELAPI
14785 VOID
14786 NTAPI
14787 ExSystemTimeToLocalTime(
14788   _In_ PLARGE_INTEGER SystemTime,
14789   _Out_ PLARGE_INTEGER LocalTime);
14790 
14791 _IRQL_requires_max_(APC_LEVEL)
14792 NTKERNELAPI
14793 VOID
14794 NTAPI
14795 ExUnregisterCallback(
14796   _Inout_ PVOID CbRegistration);
14797 
14798 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14799 
14800 #if (NTDDI_VERSION >= NTDDI_WINXP)
14801 
14802 _Must_inspect_result_
14803 _Post_satisfies_(return == 0 || return == 1)
14804 NTKERNELAPI
14805 BOOLEAN
14806 FASTCALL
14807 ExAcquireRundownProtection(
14808   _Inout_ PEX_RUNDOWN_REF RunRef);
14809 
14810 NTKERNELAPI
14811 VOID
14812 FASTCALL
14813 ExInitializeRundownProtection(
14814   _Out_ PEX_RUNDOWN_REF RunRef);
14815 
14816 NTKERNELAPI
14817 VOID
14818 FASTCALL
14819 ExReInitializeRundownProtection(
14820   _Inout_ PEX_RUNDOWN_REF RunRef);
14821 
14822 NTKERNELAPI
14823 VOID
14824 FASTCALL
14825 ExReleaseRundownProtection(
14826   _Inout_ PEX_RUNDOWN_REF RunRef);
14827 
14828 NTKERNELAPI
14829 VOID
14830 FASTCALL
14831 ExRundownCompleted(
14832   _Out_ PEX_RUNDOWN_REF RunRef);
14833 
14834 NTKERNELAPI
14835 BOOLEAN
14836 NTAPI
14837 ExVerifySuite(
14838   __drv_strictTypeMatch(__drv_typeExpr) _In_ SUITE_TYPE SuiteType);
14839 
14840 NTKERNELAPI
14841 VOID
14842 FASTCALL
14843 ExWaitForRundownProtectionRelease(
14844   _Inout_ PEX_RUNDOWN_REF RunRef);
14845 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14846 
14847 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
14848 
14849 _Must_inspect_result_
14850 _Post_satisfies_(return == 0 || return == 1)
14851 NTKERNELAPI
14852 BOOLEAN
14853 FASTCALL
14854 ExAcquireRundownProtectionEx(
14855   _Inout_ PEX_RUNDOWN_REF RunRef,
14856   _In_ ULONG Count);
14857 
14858 NTKERNELAPI
14859 VOID
14860 FASTCALL
14861 ExReleaseRundownProtectionEx(
14862   _Inout_ PEX_RUNDOWN_REF RunRef,
14863   _In_ ULONG Count);
14864 
14865 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
14866 
14867 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
14868 
14869 _Must_inspect_result_
14870 _IRQL_requires_max_(APC_LEVEL)
14871 NTKERNELAPI
14872 PEX_RUNDOWN_REF_CACHE_AWARE
14873 NTAPI
14874 ExAllocateCacheAwareRundownProtection(
14875   __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
14876   _In_ ULONG PoolTag);
14877 
14878 _IRQL_requires_max_(APC_LEVEL)
14879 NTKERNELAPI
14880 SIZE_T
14881 NTAPI
14882 ExSizeOfRundownProtectionCacheAware(VOID);
14883 
14884 _IRQL_requires_max_(APC_LEVEL)
14885 _Acquires_lock_(_Global_critical_region_)
14886 NTKERNELAPI
14887 PVOID
14888 NTAPI
14889 ExEnterCriticalRegionAndAcquireResourceShared(
14890   _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_shared_lock_(*_Curr_)
14891     PERESOURCE Resource);
14892 
14893 _IRQL_requires_max_(APC_LEVEL)
14894 _Acquires_lock_(_Global_critical_region_)
14895 NTKERNELAPI
14896 PVOID
14897 NTAPI
14898 ExEnterCriticalRegionAndAcquireResourceExclusive(
14899   _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)
14900     PERESOURCE Resource);
14901 
14902 _IRQL_requires_max_(APC_LEVEL)
14903 _Acquires_lock_(_Global_critical_region_)
14904 NTKERNELAPI
14905 PVOID
14906 NTAPI
14907 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
14908   _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14909     PERESOURCE Resource);
14910 
14911 _IRQL_requires_max_(DISPATCH_LEVEL)
14912 _Releases_lock_(_Global_critical_region_)
14913 NTKERNELAPI
14914 VOID
14915 FASTCALL
14916 ExReleaseResourceAndLeaveCriticalRegion(
14917   _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
14918     PERESOURCE Resource);
14919 
14920 _IRQL_requires_max_(APC_LEVEL)
14921 NTKERNELAPI
14922 VOID
14923 NTAPI
14924 ExInitializeRundownProtectionCacheAware(
14925   _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
14926   _In_ SIZE_T RunRefSize);
14927 
14928 _IRQL_requires_max_(APC_LEVEL)
14929 NTKERNELAPI
14930 VOID
14931 NTAPI
14932 ExFreeCacheAwareRundownProtection(
14933   _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14934 
14935 _Must_inspect_result_
14936 _Post_satisfies_(return == 0 || return == 1)
14937 NTKERNELAPI
14938 BOOLEAN
14939 FASTCALL
14940 ExAcquireRundownProtectionCacheAware(
14941   _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14942 
14943 NTKERNELAPI
14944 VOID
14945 FASTCALL
14946 ExReleaseRundownProtectionCacheAware(
14947   _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14948 
14949 _Must_inspect_result_
14950 _Post_satisfies_(return == 0 || return == 1)
14951 NTKERNELAPI
14952 BOOLEAN
14953 FASTCALL
14954 ExAcquireRundownProtectionCacheAwareEx(
14955   _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
14956   _In_ ULONG Count);
14957 
14958 NTKERNELAPI
14959 VOID
14960 FASTCALL
14961 ExReleaseRundownProtectionCacheAwareEx(
14962   _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
14963   _In_ ULONG Count);
14964 
14965 NTKERNELAPI
14966 VOID
14967 FASTCALL
14968 ExWaitForRundownProtectionReleaseCacheAware(
14969   IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
14970 
14971 NTKERNELAPI
14972 VOID
14973 FASTCALL
14974 ExReInitializeRundownProtectionCacheAware(
14975   _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14976 
14977 NTKERNELAPI
14978 VOID
14979 FASTCALL
14980 ExRundownCompletedCacheAware(
14981   _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
14982 
14983 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
14984 
14985 #if (NTDDI_VERSION >= NTDDI_VISTA)
14986 
14987 _IRQL_requires_max_(DISPATCH_LEVEL)
14988 NTKERNELAPI
14989 NTSTATUS
14990 NTAPI
14991 ExInitializeLookasideListEx(
14992   _Out_ PLOOKASIDE_LIST_EX Lookaside,
14993   _In_opt_ PALLOCATE_FUNCTION_EX Allocate,
14994   _In_opt_ PFREE_FUNCTION_EX Free,
14995   _In_ POOL_TYPE PoolType,
14996   _In_ ULONG Flags,
14997   _In_ SIZE_T Size,
14998   _In_ ULONG Tag,
14999   _In_ USHORT Depth);
15000 
15001 _IRQL_requires_max_(DISPATCH_LEVEL)
15002 NTKERNELAPI
15003 VOID
15004 NTAPI
15005 ExDeleteLookasideListEx(
15006   _Inout_ PLOOKASIDE_LIST_EX Lookaside);
15007 
15008 _IRQL_requires_max_(DISPATCH_LEVEL)
15009 NTKERNELAPI
15010 VOID
15011 NTAPI
15012 ExFlushLookasideListEx(
15013   _Inout_ PLOOKASIDE_LIST_EX Lookaside);
15014 
15015 _Must_inspect_result_
15016 _IRQL_requires_max_(DISPATCH_LEVEL)
15017 FORCEINLINE
15018 PVOID
15019 ExAllocateFromLookasideListEx(
15020   _Inout_ PLOOKASIDE_LIST_EX Lookaside)
15021 {
15022   PVOID Entry;
15023 
15024   Lookaside->L.TotalAllocates += 1;
15025 #ifdef NONAMELESSUNION
15026   Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
15027   if (Entry == NULL) {
15028     Lookaside->L.u2.AllocateMisses += 1;
15029     Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
15030                                          Lookaside->L.Size,
15031                                          Lookaside->L.Tag,
15032                                          Lookaside);
15033   }
15034 #else /* NONAMELESSUNION */
15035   Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
15036   if (Entry == NULL) {
15037     Lookaside->L.AllocateMisses += 1;
15038     Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
15039                                       Lookaside->L.Size,
15040                                       Lookaside->L.Tag,
15041                                       Lookaside);
15042   }
15043 #endif /* NONAMELESSUNION */
15044   return Entry;
15045 }
15046 
15047 _IRQL_requires_max_(DISPATCH_LEVEL)
15048 FORCEINLINE
15049 VOID
15050 ExFreeToLookasideListEx(
15051   _Inout_ PLOOKASIDE_LIST_EX Lookaside,
15052   _In_ PVOID Entry)
15053 {
15054   Lookaside->L.TotalFrees += 1;
15055   if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
15056     Lookaside->L.FreeMisses += 1;
15057     (Lookaside->L.FreeEx)(Entry, Lookaside);
15058   } else {
15059     InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
15060   }
15061   return;
15062 }
15063 
15064 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15065 
15066 #if (NTDDI_VERSION >= NTDDI_WIN7)
15067 
15068 _IRQL_requires_max_(DISPATCH_LEVEL)
15069 NTKERNELAPI
15070 VOID
15071 NTAPI
15072 ExSetResourceOwnerPointerEx(
15073   _Inout_ PERESOURCE Resource,
15074   _In_ PVOID OwnerPointer,
15075   _In_ ULONG Flags);
15076 
15077 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
15078 
15079 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15080 
15081 _IRQL_requires_max_(DISPATCH_LEVEL)
15082 static __inline PVOID
15083 ExAllocateFromNPagedLookasideList(
15084   _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside)
15085 {
15086   PVOID Entry;
15087 
15088   Lookaside->L.TotalAllocates++;
15089 #ifdef NONAMELESSUNION
15090 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15091   Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
15092                                      &Lookaside->Lock__ObsoleteButDoNotDelete);
15093 #else
15094   Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
15095 #endif
15096   if (Entry == NULL) {
15097     Lookaside->L.u2.AllocateMisses++;
15098     Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
15099                                        Lookaside->L.Size,
15100                                        Lookaside->L.Tag);
15101   }
15102 #else /* NONAMELESSUNION */
15103 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15104   Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
15105                                      &Lookaside->Lock__ObsoleteButDoNotDelete);
15106 #else
15107   Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
15108 #endif
15109   if (Entry == NULL) {
15110     Lookaside->L.AllocateMisses++;
15111     Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
15112                                     Lookaside->L.Size,
15113                                     Lookaside->L.Tag);
15114   }
15115 #endif /* NONAMELESSUNION */
15116   return Entry;
15117 }
15118 
15119 _IRQL_requires_max_(DISPATCH_LEVEL)
15120 static __inline VOID
15121 ExFreeToNPagedLookasideList(
15122   _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside,
15123   _In_ PVOID Entry)
15124 {
15125   Lookaside->L.TotalFrees++;
15126 #ifdef NONAMELESSUNION
15127   if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
15128     Lookaside->L.u3.FreeMisses++;
15129     (Lookaside->L.u5.Free)(Entry);
15130   } else {
15131 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15132       ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
15133                                   (PSLIST_ENTRY)Entry,
15134                                   &Lookaside->Lock__ObsoleteButDoNotDelete);
15135 #else
15136       InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
15137 #endif
15138    }
15139 #else /* NONAMELESSUNION */
15140   if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
15141     Lookaside->L.FreeMisses++;
15142     (Lookaside->L.Free)(Entry);
15143   } else {
15144 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15145       ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
15146                                   (PSLIST_ENTRY)Entry,
15147                                   &Lookaside->Lock__ObsoleteButDoNotDelete);
15148 #else
15149       InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
15150 #endif
15151    }
15152 #endif /* NONAMELESSUNION */
15153 }
15154 
15155 /******************************************************************************
15156  *                          Object Manager Functions                          *
15157  ******************************************************************************/
15158 
15159 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15160 _IRQL_requires_max_(DISPATCH_LEVEL)
15161 NTKERNELAPI
15162 LONG_PTR
15163 FASTCALL
15164 ObfDereferenceObject(
15165   _In_ PVOID Object);
15166 #define ObDereferenceObject ObfDereferenceObject
15167 
15168 _IRQL_requires_max_(APC_LEVEL)
15169 NTKERNELAPI
15170 NTSTATUS
15171 NTAPI
15172 ObGetObjectSecurity(
15173   _In_ PVOID Object,
15174   _Out_ PSECURITY_DESCRIPTOR *SecurityDescriptor,
15175   _Out_ PBOOLEAN MemoryAllocated);
15176 
15177 _IRQL_requires_max_(DISPATCH_LEVEL)
15178 NTKERNELAPI
15179 LONG_PTR
15180 FASTCALL
15181 ObfReferenceObject(
15182   _In_ PVOID Object);
15183 #define ObReferenceObject ObfReferenceObject
15184 
15185 _IRQL_requires_max_(APC_LEVEL)
15186 NTKERNELAPI
15187 NTSTATUS
15188 NTAPI
15189 ObReferenceObjectByHandle(
15190   _In_ HANDLE Handle,
15191   _In_ ACCESS_MASK DesiredAccess,
15192   _In_opt_ POBJECT_TYPE ObjectType,
15193   _In_ KPROCESSOR_MODE AccessMode,
15194   _Out_ PVOID *Object,
15195   _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation);
15196 
15197 _IRQL_requires_max_(DISPATCH_LEVEL)
15198 NTKERNELAPI
15199 NTSTATUS
15200 NTAPI
15201 ObReferenceObjectByPointer(
15202   _In_ PVOID Object,
15203   _In_ ACCESS_MASK DesiredAccess,
15204   _In_opt_ POBJECT_TYPE ObjectType,
15205   _In_ KPROCESSOR_MODE AccessMode);
15206 
15207 _IRQL_requires_max_(APC_LEVEL)
15208 NTKERNELAPI
15209 VOID
15210 NTAPI
15211 ObReleaseObjectSecurity(
15212   _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
15213   _In_ BOOLEAN MemoryAllocated);
15214 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15215 
15216 #if (NTDDI_VERSION >= NTDDI_VISTA)
15217 NTKERNELAPI
15218 VOID
15219 NTAPI
15220 ObDereferenceObjectDeferDelete(
15221   _In_ PVOID Object);
15222 #endif
15223 
15224 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
15225 NTKERNELAPI
15226 NTSTATUS
15227 NTAPI
15228 ObRegisterCallbacks(
15229   _In_ POB_CALLBACK_REGISTRATION CallbackRegistration,
15230   _Outptr_ PVOID *RegistrationHandle);
15231 
15232 NTKERNELAPI
15233 VOID
15234 NTAPI
15235 ObUnRegisterCallbacks(
15236   _In_ PVOID RegistrationHandle);
15237 
15238 NTKERNELAPI
15239 USHORT
15240 NTAPI
15241 ObGetFilterVersion(VOID);
15242 
15243 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
15244 
15245 #if (NTDDI_VERSION >= NTDDI_WIN7)
15246 _IRQL_requires_max_(APC_LEVEL)
15247 NTKERNELAPI
15248 NTSTATUS
15249 NTAPI
15250 ObReferenceObjectByHandleWithTag(
15251   _In_ HANDLE Handle,
15252   _In_ ACCESS_MASK DesiredAccess,
15253   _In_opt_ POBJECT_TYPE ObjectType,
15254   _In_ KPROCESSOR_MODE AccessMode,
15255   _In_ ULONG Tag,
15256   _Out_ PVOID *Object,
15257   _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation);
15258 
15259 _IRQL_requires_max_(DISPATCH_LEVEL)
15260 NTKERNELAPI
15261 LONG_PTR
15262 FASTCALL
15263 ObfReferenceObjectWithTag(
15264   _In_ PVOID Object,
15265   _In_ ULONG Tag);
15266 
15267 _IRQL_requires_max_(DISPATCH_LEVEL)
15268 NTKERNELAPI
15269 NTSTATUS
15270 NTAPI
15271 ObReferenceObjectByPointerWithTag(
15272   _In_ PVOID Object,
15273   _In_ ACCESS_MASK DesiredAccess,
15274   _In_opt_ POBJECT_TYPE ObjectType,
15275   _In_ KPROCESSOR_MODE AccessMode,
15276   _In_ ULONG Tag);
15277 
15278 _IRQL_requires_max_(DISPATCH_LEVEL)
15279 NTKERNELAPI
15280 LONG_PTR
15281 FASTCALL
15282 ObfDereferenceObjectWithTag(
15283   _In_ PVOID Object,
15284   _In_ ULONG Tag);
15285 
15286 NTKERNELAPI
15287 VOID
15288 NTAPI
15289 ObDereferenceObjectDeferDeleteWithTag(
15290   _In_ PVOID Object,
15291   _In_ ULONG Tag);
15292 
15293 #define ObDereferenceObject ObfDereferenceObject
15294 #define ObReferenceObject ObfReferenceObject
15295 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
15296 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
15297 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15298 
15299 /******************************************************************************
15300  *                          Process Manager Functions                         *
15301  ******************************************************************************/
15302 
15303 NTKERNELAPI
15304 NTSTATUS
15305 NTAPI
15306 PsWrapApcWow64Thread(
15307   _Inout_ PVOID *ApcContext,
15308   _Inout_ PVOID *ApcRoutine);
15309 
15310 /*
15311  * PEPROCESS
15312  * PsGetCurrentProcess(VOID)
15313  */
15314 #define PsGetCurrentProcess IoGetCurrentProcess
15315 
15316 #if !defined(_PSGETCURRENTTHREAD_)
15317 #define _PSGETCURRENTTHREAD_
15318 _IRQL_requires_max_(DISPATCH_LEVEL)
15319 FORCEINLINE
15320 PETHREAD
15321 NTAPI
15322 PsGetCurrentThread(VOID)
15323 {
15324   return (PETHREAD)KeGetCurrentThread();
15325 }
15326 #endif /* !_PSGETCURRENTTHREAD_ */
15327 
15328 
15329 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15330 
15331 _IRQL_requires_max_(APC_LEVEL)
15332 _Post_satisfies_(return <= 0)
15333 _Must_inspect_result_
15334 NTKERNELAPI
15335 NTSTATUS
15336 NTAPI
15337 PsCreateSystemThread(
15338   _Out_ PHANDLE ThreadHandle,
15339   _In_ ULONG DesiredAccess,
15340   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
15341   _In_opt_ HANDLE ProcessHandle,
15342   _Out_opt_ PCLIENT_ID ClientId,
15343   _In_ PKSTART_ROUTINE StartRoutine,
15344   _In_opt_ _When_(return==0, __drv_aliasesMem) PVOID StartContext);
15345 
15346 _IRQL_requires_max_(PASSIVE_LEVEL)
15347 NTKERNELAPI
15348 NTSTATUS
15349 NTAPI
15350 PsTerminateSystemThread(
15351   _In_ NTSTATUS ExitStatus);
15352 
15353 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15354 
15355 
15356 /******************************************************************************
15357  *                          WMI Library Support Functions                     *
15358  ******************************************************************************/
15359 
15360 #ifdef RUN_WPP
15361 #if (NTDDI_VERSION >= NTDDI_WINXP)
15362 _IRQL_requires_max_(HIGH_LEVEL)
15363 NTKERNELAPI
15364 NTSTATUS
15365 __cdecl
15366 WmiTraceMessage(
15367   _In_ TRACEHANDLE LoggerHandle,
15368   _In_ ULONG MessageFlags,
15369   _In_ LPGUID MessageGuid,
15370   _In_ USHORT MessageNumber,
15371   ...);
15372 #endif
15373 #endif /* RUN_WPP */
15374 
15375 #if (NTDDI_VERSION >= NTDDI_WINXP)
15376 
15377 _IRQL_requires_max_(APC_LEVEL)
15378 NTKERNELAPI
15379 NTSTATUS
15380 NTAPI
15381 WmiQueryTraceInformation(
15382   _In_ TRACE_INFORMATION_CLASS TraceInformationClass,
15383   _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation,
15384   _In_ ULONG TraceInformationLength,
15385   _Out_opt_ PULONG RequiredLength,
15386   _In_opt_ PVOID Buffer);
15387 
15388 #if 0
15389 /* FIXME: Get va_list from where? */
15390 _IRQL_requires_max_(HIGH_LEVEL)
15391 NTKERNELAPI
15392 NTSTATUS
15393 NTAPI
15394 WmiTraceMessageVa(
15395   _In_ TRACEHANDLE LoggerHandle,
15396   _In_ ULONG MessageFlags,
15397   _In_ LPGUID MessageGuid,
15398   _In_ USHORT MessageNumber,
15399   _In_ va_list MessageArgList);
15400 #endif
15401 
15402 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15403 
15404 #ifndef TRACE_INFORMATION_CLASS_DEFINE
15405 
15406 #if (NTDDI_VERSION >= NTDDI_WINXP)
15407 _IRQL_requires_max_(APC_LEVEL)
15408 NTKERNELAPI
15409 NTSTATUS
15410 NTAPI
15411 WmiQueryTraceInformation(
15412   _In_ TRACE_INFORMATION_CLASS TraceInformationClass,
15413   _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation,
15414   _In_ ULONG TraceInformationLength,
15415   _Out_opt_ PULONG RequiredLength,
15416   _In_opt_ PVOID Buffer);
15417 #endif
15418 
15419 #define TRACE_INFORMATION_CLASS_DEFINE
15420 
15421 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
15422 
15423 #if (NTDDI_VERSION >= NTDDI_VISTA)
15424 
15425 _IRQL_requires_max_(PASSIVE_LEVEL)
15426 NTSTATUS
15427 NTKERNELAPI
15428 NTAPI
15429 EtwRegister(
15430   _In_ LPCGUID ProviderId,
15431   _In_opt_ PETWENABLECALLBACK EnableCallback,
15432   _In_opt_ PVOID CallbackContext,
15433   _Out_ PREGHANDLE RegHandle);
15434 
15435 _IRQL_requires_max_(PASSIVE_LEVEL)
15436 NTSTATUS
15437 NTKERNELAPI
15438 NTAPI
15439 EtwUnregister(
15440   _In_ REGHANDLE RegHandle);
15441 
15442 _IRQL_requires_max_(HIGH_LEVEL)
15443 BOOLEAN
15444 NTKERNELAPI
15445 NTAPI
15446 EtwEventEnabled(
15447   _In_ REGHANDLE RegHandle,
15448   _In_ PCEVENT_DESCRIPTOR EventDescriptor);
15449 
15450 _IRQL_requires_max_(HIGH_LEVEL)
15451 BOOLEAN
15452 NTKERNELAPI
15453 NTAPI
15454 EtwProviderEnabled(
15455   _In_ REGHANDLE RegHandle,
15456   _In_ UCHAR Level,
15457   _In_ ULONGLONG Keyword);
15458 
15459 _When_(ControlCode==EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(HIGH_LEVEL))
15460 _When_(ControlCode!=EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(APC_LEVEL))
15461 NTSTATUS
15462 NTKERNELAPI
15463 NTAPI
15464 EtwActivityIdControl(
15465   _In_ ULONG ControlCode,
15466   _Inout_updates_bytes_(sizeof(GUID)) LPGUID ActivityId);
15467 
15468 _IRQL_requires_max_(HIGH_LEVEL)
15469 NTSTATUS
15470 NTKERNELAPI
15471 NTAPI
15472 EtwWrite(
15473   _In_ REGHANDLE RegHandle,
15474   _In_ PCEVENT_DESCRIPTOR EventDescriptor,
15475   _In_opt_ LPCGUID ActivityId,
15476   _In_ ULONG UserDataCount,
15477   _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
15478 
15479 _IRQL_requires_max_(HIGH_LEVEL)
15480 NTSTATUS
15481 NTKERNELAPI
15482 NTAPI
15483 EtwWriteTransfer(
15484   _In_ REGHANDLE RegHandle,
15485   _In_ PCEVENT_DESCRIPTOR EventDescriptor,
15486   _In_opt_ LPCGUID ActivityId,
15487   _In_opt_ LPCGUID RelatedActivityId,
15488   _In_ ULONG UserDataCount,
15489   _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
15490 
15491 _IRQL_requires_max_(HIGH_LEVEL)
15492 NTSTATUS
15493 NTKERNELAPI
15494 NTAPI
15495 EtwWriteString(
15496   _In_ REGHANDLE RegHandle,
15497   _In_ UCHAR Level,
15498   _In_ ULONGLONG Keyword,
15499   _In_opt_ LPCGUID ActivityId,
15500   _In_ PCWSTR String);
15501 
15502 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15503 
15504 #if (NTDDI_VERSION >= NTDDI_WIN7)
15505 _IRQL_requires_max_(HIGH_LEVEL)
15506 NTSTATUS
15507 NTKERNELAPI
15508 NTAPI
15509 EtwWriteEx(
15510   _In_ REGHANDLE RegHandle,
15511   _In_ PCEVENT_DESCRIPTOR EventDescriptor,
15512   _In_ ULONG64 Filter,
15513   _In_ ULONG Flags,
15514   _In_opt_ LPCGUID ActivityId,
15515   _In_opt_ LPCGUID RelatedActivityId,
15516   _In_ ULONG UserDataCount,
15517   _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
15518 #endif
15519 
15520 
15521 
15522 /******************************************************************************
15523  *                          Kernel Debugger Functions                         *
15524  ******************************************************************************/
15525 
15526 #ifndef _DBGNT_
15527 
15528 ULONG
15529 __cdecl
15530 DbgPrint(
15531   _In_z_ _Printf_format_string_ PCSTR Format,
15532   ...);
15533 
15534 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15535 NTSYSAPI
15536 ULONG
15537 __cdecl
15538 DbgPrintReturnControlC(
15539   _In_z_ _Printf_format_string_ PCCH Format,
15540   ...);
15541 #endif
15542 
15543 #if (NTDDI_VERSION >= NTDDI_WINXP)
15544 
15545 NTSYSAPI
15546 ULONG
15547 __cdecl
15548 DbgPrintEx(
15549   _In_ ULONG ComponentId,
15550   _In_ ULONG Level,
15551   _In_z_ _Printf_format_string_ PCSTR Format,
15552   ...);
15553 
15554 #ifdef _VA_LIST_DEFINED
15555 
15556 NTSYSAPI
15557 ULONG
15558 NTAPI
15559 vDbgPrintEx(
15560   _In_ ULONG ComponentId,
15561   _In_ ULONG Level,
15562   _In_z_ PCCH Format,
15563   _In_ va_list ap);
15564 
15565 NTSYSAPI
15566 ULONG
15567 NTAPI
15568 vDbgPrintExWithPrefix(
15569   _In_z_ PCCH Prefix,
15570   _In_ ULONG ComponentId,
15571   _In_ ULONG Level,
15572   _In_z_ PCCH Format,
15573   _In_ va_list ap);
15574 
15575 #endif /* _VA_LIST_DEFINED */
15576 
15577 NTSYSAPI
15578 NTSTATUS
15579 NTAPI
15580 DbgQueryDebugFilterState(
15581   _In_ ULONG ComponentId,
15582   _In_ ULONG Level);
15583 
15584 NTSYSAPI
15585 NTSTATUS
15586 NTAPI
15587 DbgSetDebugFilterState(
15588   _In_ ULONG ComponentId,
15589   _In_ ULONG Level,
15590   _In_ BOOLEAN State);
15591 
15592 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15593 
15594 #if (NTDDI_VERSION >= NTDDI_VISTA)
15595 
15596 typedef VOID
15597 (*PDEBUG_PRINT_CALLBACK)(
15598   _In_ PSTRING Output,
15599   _In_ ULONG ComponentId,
15600   _In_ ULONG Level);
15601 
15602 NTSYSAPI
15603 NTSTATUS
15604 NTAPI
15605 DbgSetDebugPrintCallback(
15606   _In_ PDEBUG_PRINT_CALLBACK DebugPrintCallback,
15607   _In_ BOOLEAN Enable);
15608 
15609 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15610 
15611 #endif /* _DBGNT_ */
15612 
15613 #if DBG
15614 
15615 #define KdPrint(_x_) DbgPrint _x_
15616 #define KdPrintEx(_x_) DbgPrintEx _x_
15617 #define vKdPrintEx(_x_) vDbgPrintEx _x_
15618 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
15619 #define KdBreakPoint() DbgBreakPoint()
15620 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
15621 
15622 #else /* !DBG */
15623 
15624 #define KdPrint(_x_)
15625 #define KdPrintEx(_x_)
15626 #define vKdPrintEx(_x_)
15627 #define vKdPrintExWithPrefix(_x_)
15628 #define KdBreakPoint()
15629 #define KdBreakPointWithStatus(s)
15630 
15631 #endif /* !DBG */
15632 
15633 #if defined(__GNUC__)
15634 
15635 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
15636 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
15637 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
15638 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
15639 
15640 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
15641 
15642 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
15643 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
15644 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
15645 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
15646 
15647 #else
15648 
15649 extern BOOLEAN KdDebuggerNotPresent;
15650 extern BOOLEAN KdDebuggerEnabled;
15651 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
15652 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
15653 
15654 #endif
15655 
15656 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15657 
15658 NTKERNELAPI
15659 NTSTATUS
15660 NTAPI
15661 KdDisableDebugger(VOID);
15662 
15663 NTKERNELAPI
15664 NTSTATUS
15665 NTAPI
15666 KdEnableDebugger(VOID);
15667 
15668 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
15669 #define DbgBreakPoint __debugbreak
15670 #else
15671 __analysis_noreturn
15672 VOID
15673 NTAPI
15674 DbgBreakPoint(VOID);
15675 #endif
15676 
15677 __analysis_noreturn
15678 NTSYSAPI
15679 VOID
15680 NTAPI
15681 DbgBreakPointWithStatus(
15682   IN ULONG Status);
15683 
15684 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15685 
15686 #if (NTDDI_VERSION >= NTDDI_WS03)
15687 NTKERNELAPI
15688 BOOLEAN
15689 NTAPI
15690 KdRefreshDebuggerNotPresent(VOID);
15691 #endif
15692 
15693 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
15694 NTKERNELAPI
15695 NTSTATUS
15696 NTAPI
15697 KdChangeOption(
15698   _In_ KD_OPTION Option,
15699   _In_opt_ ULONG InBufferBytes,
15700   _In_ PVOID InBuffer,
15701   _In_opt_ ULONG OutBufferBytes,
15702   _Out_ PVOID OutBuffer,
15703   _Out_opt_ PULONG OutBufferNeeded);
15704 #endif
15705 /* Hardware Abstraction Layer Functions */
15706 
15707 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15708 
15709 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
15710 
15711 __drv_preferredFunction("AllocateCommonBuffer","Obsolete")
15712 FORCEINLINE
15713 PVOID
15714 NTAPI
15715 HalAllocateCommonBuffer(
15716   _In_ PDMA_ADAPTER DmaAdapter,
15717   _In_ ULONG Length,
15718   _Out_ PPHYSICAL_ADDRESS LogicalAddress,
15719   _In_ BOOLEAN CacheEnabled)
15720 {
15721   PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
15722   PVOID commonBuffer;
15723 
15724   allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
15725   ASSERT( allocateCommonBuffer != NULL );
15726   commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
15727   return commonBuffer;
15728 }
15729 
15730 __drv_preferredFunction("FreeCommonBuffer","Obsolete")
15731 FORCEINLINE
15732 VOID
15733 NTAPI
15734 HalFreeCommonBuffer(
15735   _In_ PDMA_ADAPTER DmaAdapter,
15736   _In_ ULONG Length,
15737   _In_ PHYSICAL_ADDRESS LogicalAddress,
15738   _In_ PVOID VirtualAddress,
15739   _In_ BOOLEAN CacheEnabled)
15740 {
15741   PFREE_COMMON_BUFFER freeCommonBuffer;
15742 
15743   freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
15744   ASSERT( freeCommonBuffer != NULL );
15745   freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
15746 }
15747 
15748 __drv_preferredFunction("ReadDmaCounter","Obsolete")
15749 FORCEINLINE
15750 ULONG
15751 NTAPI
15752 HalReadDmaCounter(
15753   _In_ PDMA_ADAPTER DmaAdapter)
15754 {
15755   PREAD_DMA_COUNTER readDmaCounter;
15756   ULONG counter;
15757 
15758   readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
15759   ASSERT( readDmaCounter != NULL );
15760   counter = readDmaCounter( DmaAdapter );
15761   return counter;
15762 }
15763 
15764 FORCEINLINE
15765 ULONG
15766 HalGetDmaAlignment(
15767   _In_ PDMA_ADAPTER DmaAdapter)
15768 {
15769   PGET_DMA_ALIGNMENT getDmaAlignment;
15770   ULONG alignment;
15771 
15772   getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
15773   ASSERT( getDmaAlignment != NULL );
15774   alignment = getDmaAlignment( DmaAdapter );
15775   return alignment;
15776 }
15777 
15778 #endif /* USE_DMA_MACROS ... */
15779 
15780 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15781 
15782 #ifndef _NTTMAPI_
15783 #define _NTTMAPI_
15784 
15785 #include <ktmtypes.h>
15786 
15787 #define TRANSACTIONMANAGER_QUERY_INFORMATION     (0x0001)
15788 #define TRANSACTIONMANAGER_SET_INFORMATION       (0x0002)
15789 #define TRANSACTIONMANAGER_RECOVER               (0x0004)
15790 #define TRANSACTIONMANAGER_RENAME                (0x0008)
15791 #define TRANSACTIONMANAGER_CREATE_RM             (0x0010)
15792 #define TRANSACTIONMANAGER_BIND_TRANSACTION      (0x0020)
15793 
15794 #define TRANSACTIONMANAGER_GENERIC_READ            (STANDARD_RIGHTS_READ            |\
15795                                                     TRANSACTIONMANAGER_QUERY_INFORMATION)
15796 
15797 #define TRANSACTIONMANAGER_GENERIC_WRITE           (STANDARD_RIGHTS_WRITE           |\
15798                                                     TRANSACTIONMANAGER_SET_INFORMATION     |\
15799                                                     TRANSACTIONMANAGER_RECOVER             |\
15800                                                     TRANSACTIONMANAGER_RENAME              |\
15801                                                     TRANSACTIONMANAGER_CREATE_RM)
15802 
15803 #define TRANSACTIONMANAGER_GENERIC_EXECUTE         (STANDARD_RIGHTS_EXECUTE)
15804 
15805 #define TRANSACTIONMANAGER_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED        |\
15806                                                     TRANSACTIONMANAGER_GENERIC_READ        |\
15807                                                     TRANSACTIONMANAGER_GENERIC_WRITE       |\
15808                                                     TRANSACTIONMANAGER_GENERIC_EXECUTE     |\
15809                                                     TRANSACTIONMANAGER_BIND_TRANSACTION)
15810 
15811 #define TRANSACTION_QUERY_INFORMATION     (0x0001)
15812 #define TRANSACTION_SET_INFORMATION       (0x0002)
15813 #define TRANSACTION_ENLIST                (0x0004)
15814 #define TRANSACTION_COMMIT                (0x0008)
15815 #define TRANSACTION_ROLLBACK              (0x0010)
15816 #define TRANSACTION_PROPAGATE             (0x0020)
15817 #define TRANSACTION_RIGHT_RESERVED1       (0x0040)
15818 
15819 #define TRANSACTION_GENERIC_READ            (STANDARD_RIGHTS_READ            |\
15820                                              TRANSACTION_QUERY_INFORMATION   |\
15821                                              SYNCHRONIZE)
15822 
15823 #define TRANSACTION_GENERIC_WRITE           (STANDARD_RIGHTS_WRITE           |\
15824                                              TRANSACTION_SET_INFORMATION     |\
15825                                              TRANSACTION_COMMIT              |\
15826                                              TRANSACTION_ENLIST              |\
15827                                              TRANSACTION_ROLLBACK            |\
15828                                              TRANSACTION_PROPAGATE           |\
15829                                              SYNCHRONIZE)
15830 
15831 #define TRANSACTION_GENERIC_EXECUTE         (STANDARD_RIGHTS_EXECUTE         |\
15832                                              TRANSACTION_COMMIT              |\
15833                                              TRANSACTION_ROLLBACK            |\
15834                                              SYNCHRONIZE)
15835 
15836 #define TRANSACTION_ALL_ACCESS              (STANDARD_RIGHTS_REQUIRED        |\
15837                                              TRANSACTION_GENERIC_READ        |\
15838                                              TRANSACTION_GENERIC_WRITE       |\
15839                                              TRANSACTION_GENERIC_EXECUTE)
15840 
15841 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ        |\
15842                                              STANDARD_RIGHTS_WRITE           |\
15843                                              TRANSACTION_SET_INFORMATION     |\
15844                                              TRANSACTION_ENLIST              |\
15845                                              TRANSACTION_ROLLBACK            |\
15846                                              TRANSACTION_PROPAGATE           |\
15847                                              SYNCHRONIZE)
15848 
15849 #define RESOURCEMANAGER_QUERY_INFORMATION        (0x0001)
15850 #define RESOURCEMANAGER_SET_INFORMATION          (0x0002)
15851 #define RESOURCEMANAGER_RECOVER                  (0x0004)
15852 #define RESOURCEMANAGER_ENLIST                   (0x0008)
15853 #define RESOURCEMANAGER_GET_NOTIFICATION         (0x0010)
15854 #define RESOURCEMANAGER_REGISTER_PROTOCOL        (0x0020)
15855 #define RESOURCEMANAGER_COMPLETE_PROPAGATION     (0x0040)
15856 
15857 #define RESOURCEMANAGER_GENERIC_READ        (STANDARD_RIGHTS_READ                 |\
15858                                              RESOURCEMANAGER_QUERY_INFORMATION    |\
15859                                              SYNCHRONIZE)
15860 
15861 #define RESOURCEMANAGER_GENERIC_WRITE       (STANDARD_RIGHTS_WRITE                |\
15862                                              RESOURCEMANAGER_SET_INFORMATION      |\
15863                                              RESOURCEMANAGER_RECOVER              |\
15864                                              RESOURCEMANAGER_ENLIST               |\
15865                                              RESOURCEMANAGER_GET_NOTIFICATION     |\
15866                                              RESOURCEMANAGER_REGISTER_PROTOCOL    |\
15867                                              RESOURCEMANAGER_COMPLETE_PROPAGATION |\
15868                                              SYNCHRONIZE)
15869 
15870 #define RESOURCEMANAGER_GENERIC_EXECUTE     (STANDARD_RIGHTS_EXECUTE              |\
15871                                              RESOURCEMANAGER_RECOVER              |\
15872                                              RESOURCEMANAGER_ENLIST               |\
15873                                              RESOURCEMANAGER_GET_NOTIFICATION     |\
15874                                              RESOURCEMANAGER_COMPLETE_PROPAGATION |\
15875                                              SYNCHRONIZE)
15876 
15877 #define RESOURCEMANAGER_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED             |\
15878                                              RESOURCEMANAGER_GENERIC_READ         |\
15879                                              RESOURCEMANAGER_GENERIC_WRITE        |\
15880                                              RESOURCEMANAGER_GENERIC_EXECUTE)
15881 
15882 #define ENLISTMENT_QUERY_INFORMATION             (0x0001)
15883 #define ENLISTMENT_SET_INFORMATION               (0x0002)
15884 #define ENLISTMENT_RECOVER                       (0x0004)
15885 #define ENLISTMENT_SUBORDINATE_RIGHTS            (0x0008)
15886 #define ENLISTMENT_SUPERIOR_RIGHTS               (0x0010)
15887 
15888 #define ENLISTMENT_GENERIC_READ        (STANDARD_RIGHTS_READ           |\
15889                                         ENLISTMENT_QUERY_INFORMATION)
15890 
15891 #define ENLISTMENT_GENERIC_WRITE       (STANDARD_RIGHTS_WRITE          |\
15892                                         ENLISTMENT_SET_INFORMATION     |\
15893                                         ENLISTMENT_RECOVER             |\
15894                                         ENLISTMENT_SUBORDINATE_RIGHTS  |\
15895                                         ENLISTMENT_SUPERIOR_RIGHTS)
15896 
15897 #define ENLISTMENT_GENERIC_EXECUTE     (STANDARD_RIGHTS_EXECUTE        |\
15898                                         ENLISTMENT_RECOVER             |\
15899                                         ENLISTMENT_SUBORDINATE_RIGHTS  |\
15900                                         ENLISTMENT_SUPERIOR_RIGHTS)
15901 
15902 #define ENLISTMENT_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED       |\
15903                                         ENLISTMENT_GENERIC_READ        |\
15904                                         ENLISTMENT_GENERIC_WRITE       |\
15905                                         ENLISTMENT_GENERIC_EXECUTE)
15906 
15907 typedef enum _TRANSACTION_OUTCOME {
15908   TransactionOutcomeUndetermined = 1,
15909   TransactionOutcomeCommitted,
15910   TransactionOutcomeAborted,
15911 } TRANSACTION_OUTCOME;
15912 
15913 
15914 typedef enum _TRANSACTION_STATE {
15915   TransactionStateNormal = 1,
15916   TransactionStateIndoubt,
15917   TransactionStateCommittedNotify,
15918 } TRANSACTION_STATE;
15919 
15920 
15921 typedef struct _TRANSACTION_BASIC_INFORMATION {
15922   GUID TransactionId;
15923   ULONG State;
15924   ULONG Outcome;
15925 } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
15926 
15927 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
15928   GUID TmIdentity;
15929   LARGE_INTEGER VirtualClock;
15930 } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
15931 
15932 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
15933   GUID LogIdentity;
15934 } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
15935 
15936 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
15937   ULONG LogPathLength;
15938   _Field_size_(LogPathLength) WCHAR LogPath[1];
15939 } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
15940 
15941 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
15942   ULONGLONG LastRecoveredLsn;
15943 } TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
15944 
15945 typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
15946   ULONG IsolationLevel;
15947   ULONG IsolationFlags;
15948   LARGE_INTEGER Timeout;
15949   ULONG Outcome;
15950   ULONG DescriptionLength;
15951   WCHAR Description[1];
15952 } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
15953 
15954 typedef struct _TRANSACTION_BIND_INFORMATION {
15955   HANDLE TmHandle;
15956 } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
15957 
15958 typedef struct _TRANSACTION_ENLISTMENT_PAIR {
15959   GUID EnlistmentId;
15960   GUID ResourceManagerId;
15961 } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
15962 
15963 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
15964   ULONG NumberOfEnlistments;
15965   TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1];
15966 } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
15967 
15968 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
15969   TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
15970 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
15971 
15972 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
15973   GUID ResourceManagerId;
15974   ULONG DescriptionLength;
15975   WCHAR Description[1];
15976 } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
15977 
15978 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
15979   HANDLE IoCompletionPortHandle;
15980   ULONG_PTR CompletionKey;
15981 } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
15982 
15983 typedef enum _KTMOBJECT_TYPE {
15984   KTMOBJECT_TRANSACTION,
15985   KTMOBJECT_TRANSACTION_MANAGER,
15986   KTMOBJECT_RESOURCE_MANAGER,
15987   KTMOBJECT_ENLISTMENT,
15988   KTMOBJECT_INVALID
15989 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
15990 
15991 typedef struct _KTMOBJECT_CURSOR {
15992   GUID LastQuery;
15993   ULONG ObjectIdCount;
15994   GUID ObjectIds[1];
15995 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
15996 
15997 typedef enum _TRANSACTION_INFORMATION_CLASS {
15998   TransactionBasicInformation,
15999   TransactionPropertiesInformation,
16000   TransactionEnlistmentInformation,
16001   TransactionSuperiorEnlistmentInformation
16002 } TRANSACTION_INFORMATION_CLASS;
16003 
16004 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
16005   TransactionManagerBasicInformation,
16006   TransactionManagerLogInformation,
16007   TransactionManagerLogPathInformation,
16008   TransactionManagerRecoveryInformation = 4
16009 } TRANSACTIONMANAGER_INFORMATION_CLASS;
16010 
16011 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
16012   ResourceManagerBasicInformation,
16013   ResourceManagerCompletionInformation,
16014 } RESOURCEMANAGER_INFORMATION_CLASS;
16015 
16016 typedef struct _ENLISTMENT_BASIC_INFORMATION {
16017   GUID EnlistmentId;
16018   GUID TransactionId;
16019   GUID ResourceManagerId;
16020 } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
16021 
16022 typedef struct _ENLISTMENT_CRM_INFORMATION {
16023   GUID CrmTransactionManagerId;
16024   GUID CrmResourceManagerId;
16025   GUID CrmEnlistmentId;
16026 } ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
16027 
16028 typedef enum _ENLISTMENT_INFORMATION_CLASS {
16029   EnlistmentBasicInformation,
16030   EnlistmentRecoveryInformation,
16031   EnlistmentCrmInformation
16032 } ENLISTMENT_INFORMATION_CLASS;
16033 
16034 typedef struct _TRANSACTION_LIST_ENTRY {
16035 #if defined(__cplusplus)
16036   ::UOW UOW;
16037 #else
16038   UOW UOW;
16039 #endif
16040 } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
16041 
16042 typedef struct _TRANSACTION_LIST_INFORMATION {
16043   ULONG NumberOfTransactions;
16044   TRANSACTION_LIST_ENTRY TransactionInformation[1];
16045 } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
16046 
16047 typedef NTSTATUS
16048 (NTAPI *PFN_NT_CREATE_TRANSACTION)(
16049   _Out_ PHANDLE TransactionHandle,
16050   _In_ ACCESS_MASK DesiredAccess,
16051   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16052   _In_opt_ LPGUID Uow,
16053   _In_opt_ HANDLE TmHandle,
16054   _In_opt_ ULONG CreateOptions,
16055   _In_opt_ ULONG IsolationLevel,
16056   _In_opt_ ULONG IsolationFlags,
16057   _In_opt_ PLARGE_INTEGER Timeout,
16058   _In_opt_ PUNICODE_STRING Description);
16059 
16060 typedef NTSTATUS
16061 (NTAPI *PFN_NT_OPEN_TRANSACTION)(
16062   _Out_ PHANDLE TransactionHandle,
16063   _In_ ACCESS_MASK DesiredAccess,
16064   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16065   _In_opt_ LPGUID Uow,
16066   _In_opt_ HANDLE TmHandle);
16067 
16068 typedef NTSTATUS
16069 (NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)(
16070   _In_ HANDLE TransactionHandle,
16071   _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16072   _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16073   _In_ ULONG TransactionInformationLength,
16074   _Out_opt_ PULONG ReturnLength);
16075 
16076 typedef NTSTATUS
16077 (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)(
16078   _In_ HANDLE TransactionHandle,
16079   _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16080   _In_ PVOID TransactionInformation,
16081   _In_ ULONG TransactionInformationLength);
16082 
16083 typedef NTSTATUS
16084 (NTAPI *PFN_NT_COMMIT_TRANSACTION)(
16085   _In_ HANDLE TransactionHandle,
16086   _In_ BOOLEAN Wait);
16087 
16088 typedef NTSTATUS
16089 (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)(
16090   _In_ HANDLE TransactionHandle,
16091   _In_ BOOLEAN Wait);
16092 
16093 #if (NTDDI_VERSION >= NTDDI_VISTA)
16094 
16095 _Must_inspect_result_
16096 _IRQL_requires_max_ (APC_LEVEL)
16097 __kernel_entry
16098 NTSYSCALLAPI
16099 NTSTATUS
16100 NTAPI
16101 NtCreateTransactionManager(
16102   _Out_ PHANDLE TmHandle,
16103   _In_ ACCESS_MASK DesiredAccess,
16104   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16105   _In_opt_ PUNICODE_STRING LogFileName,
16106   _In_opt_ ULONG CreateOptions,
16107   _In_opt_ ULONG CommitStrength);
16108 
16109 _Must_inspect_result_
16110 _IRQL_requires_max_ (APC_LEVEL)
16111 __kernel_entry
16112 NTSYSCALLAPI
16113 NTSTATUS
16114 NTAPI
16115 NtOpenTransactionManager(
16116   _Out_ PHANDLE TmHandle,
16117   _In_ ACCESS_MASK DesiredAccess,
16118   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16119   _In_opt_ PUNICODE_STRING LogFileName,
16120   _In_opt_ LPGUID TmIdentity,
16121   _In_opt_ ULONG OpenOptions);
16122 
16123 _Must_inspect_result_
16124 _IRQL_requires_max_ (APC_LEVEL)
16125 __kernel_entry
16126 NTSYSCALLAPI
16127 NTSTATUS
16128 NTAPI
16129 NtRenameTransactionManager(
16130   _In_ PUNICODE_STRING LogFileName,
16131   _In_ LPGUID ExistingTransactionManagerGuid);
16132 
16133 _Must_inspect_result_
16134 _IRQL_requires_max_ (APC_LEVEL)
16135 __kernel_entry
16136 NTSYSCALLAPI
16137 NTSTATUS
16138 NTAPI
16139 NtRollforwardTransactionManager(
16140   _In_ HANDLE TransactionManagerHandle,
16141   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16142 
16143 _Must_inspect_result_
16144 _IRQL_requires_max_ (APC_LEVEL)
16145 __kernel_entry
16146 NTSYSCALLAPI
16147 NTSTATUS
16148 NTAPI
16149 NtRecoverTransactionManager(
16150   _In_ HANDLE TransactionManagerHandle);
16151 
16152 _Must_inspect_result_
16153 _IRQL_requires_max_ (APC_LEVEL)
16154 __kernel_entry
16155 NTSYSCALLAPI
16156 NTSTATUS
16157 NTAPI
16158 NtQueryInformationTransactionManager(
16159   _In_ HANDLE TransactionManagerHandle,
16160   _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
16161   _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
16162   _In_ ULONG TransactionManagerInformationLength,
16163   _Out_ PULONG ReturnLength);
16164 
16165 _Must_inspect_result_
16166 _IRQL_requires_max_ (APC_LEVEL)
16167 __kernel_entry
16168 NTSYSCALLAPI
16169 NTSTATUS
16170 NTAPI
16171 NtSetInformationTransactionManager(
16172   _In_opt_ HANDLE TmHandle,
16173   _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
16174   _In_reads_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
16175   _In_ ULONG TransactionManagerInformationLength);
16176 
16177 _Must_inspect_result_
16178 _IRQL_requires_max_ (APC_LEVEL)
16179 __kernel_entry
16180 NTSYSCALLAPI
16181 NTSTATUS
16182 NTAPI
16183 NtEnumerateTransactionObject(
16184   _In_opt_ HANDLE RootObjectHandle,
16185   _In_ KTMOBJECT_TYPE QueryType,
16186   _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor,
16187   _In_ ULONG ObjectCursorLength,
16188   _Out_ PULONG ReturnLength);
16189 
16190 _Must_inspect_result_
16191 _IRQL_requires_max_ (APC_LEVEL)
16192 __kernel_entry
16193 NTSYSCALLAPI
16194 NTSTATUS
16195 NTAPI
16196 NtCreateTransaction(
16197   _Out_ PHANDLE TransactionHandle,
16198   _In_ ACCESS_MASK DesiredAccess,
16199   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16200   _In_opt_ LPGUID Uow,
16201   _In_opt_ HANDLE TmHandle,
16202   _In_opt_ ULONG CreateOptions,
16203   _In_opt_ ULONG IsolationLevel,
16204   _In_opt_ ULONG IsolationFlags,
16205   _In_opt_ PLARGE_INTEGER Timeout,
16206   _In_opt_ PUNICODE_STRING Description);
16207 
16208 _Must_inspect_result_
16209 _IRQL_requires_max_ (APC_LEVEL)
16210 __kernel_entry
16211 NTSYSCALLAPI
16212 NTSTATUS
16213 NTAPI
16214 NtOpenTransaction(
16215   _Out_ PHANDLE TransactionHandle,
16216   _In_ ACCESS_MASK DesiredAccess,
16217   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16218   _In_ LPGUID Uow,
16219   _In_opt_ HANDLE TmHandle);
16220 
16221 _Must_inspect_result_
16222 _IRQL_requires_max_ (APC_LEVEL)
16223 __kernel_entry
16224 NTSYSCALLAPI
16225 NTSTATUS
16226 NTAPI
16227 NtQueryInformationTransaction(
16228   _In_ HANDLE TransactionHandle,
16229   _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16230   _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16231   _In_ ULONG TransactionInformationLength,
16232   _Out_opt_ PULONG ReturnLength);
16233 
16234 _Must_inspect_result_
16235 _IRQL_requires_max_ (APC_LEVEL)
16236 __kernel_entry
16237 NTSYSCALLAPI
16238 NTSTATUS
16239 NTAPI
16240 NtSetInformationTransaction(
16241   _In_ HANDLE TransactionHandle,
16242   _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16243   _In_reads_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16244   _In_ ULONG TransactionInformationLength);
16245 
16246 _IRQL_requires_max_ (APC_LEVEL)
16247 __kernel_entry
16248 NTSYSCALLAPI
16249 NTSTATUS
16250 NTAPI
16251 NtCommitTransaction(
16252   _In_ HANDLE TransactionHandle,
16253   _In_ BOOLEAN Wait);
16254 
16255 _IRQL_requires_max_ (APC_LEVEL)
16256 __kernel_entry
16257 NTSYSCALLAPI
16258 NTSTATUS
16259 NTAPI
16260 NtRollbackTransaction(
16261   _In_ HANDLE TransactionHandle,
16262   _In_ BOOLEAN Wait);
16263 
16264 _Must_inspect_result_
16265 _IRQL_requires_max_ (APC_LEVEL)
16266 __kernel_entry
16267 NTSYSCALLAPI
16268 NTSTATUS
16269 NTAPI
16270 NtCreateEnlistment(
16271   _Out_ PHANDLE EnlistmentHandle,
16272   _In_ ACCESS_MASK DesiredAccess,
16273   _In_ HANDLE ResourceManagerHandle,
16274   _In_ HANDLE TransactionHandle,
16275   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16276   _In_opt_ ULONG CreateOptions,
16277   _In_ NOTIFICATION_MASK NotificationMask,
16278   _In_opt_ PVOID EnlistmentKey);
16279 
16280 _Must_inspect_result_
16281 _IRQL_requires_max_ (APC_LEVEL)
16282 __kernel_entry
16283 NTSYSCALLAPI
16284 NTSTATUS
16285 NTAPI
16286 NtOpenEnlistment(
16287   _Out_ PHANDLE EnlistmentHandle,
16288   _In_ ACCESS_MASK DesiredAccess,
16289   _In_ HANDLE ResourceManagerHandle,
16290   _In_ LPGUID EnlistmentGuid,
16291   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
16292 
16293 _Must_inspect_result_
16294 _IRQL_requires_max_ (APC_LEVEL)
16295 __kernel_entry
16296 NTSYSCALLAPI
16297 NTSTATUS
16298 NTAPI
16299 NtQueryInformationEnlistment(
16300   _In_ HANDLE EnlistmentHandle,
16301   _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
16302   _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
16303   _In_ ULONG EnlistmentInformationLength,
16304   _Out_ PULONG ReturnLength);
16305 
16306 _Must_inspect_result_
16307 _IRQL_requires_max_ (APC_LEVEL)
16308 __kernel_entry
16309 NTSYSCALLAPI
16310 NTSTATUS
16311 NTAPI
16312 NtSetInformationEnlistment(
16313   _In_opt_ HANDLE EnlistmentHandle,
16314   _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
16315   _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
16316   _In_ ULONG EnlistmentInformationLength);
16317 
16318 _Must_inspect_result_
16319 _IRQL_requires_max_ (APC_LEVEL)
16320 __kernel_entry
16321 NTSYSCALLAPI
16322 NTSTATUS
16323 NTAPI
16324 NtRecoverEnlistment(
16325   _In_ HANDLE EnlistmentHandle,
16326   _In_opt_ PVOID EnlistmentKey);
16327 
16328 _Must_inspect_result_
16329 _IRQL_requires_max_ (APC_LEVEL)
16330 __kernel_entry
16331 NTSYSCALLAPI
16332 NTSTATUS
16333 NTAPI
16334 NtPrePrepareEnlistment(
16335   _In_ HANDLE EnlistmentHandle,
16336   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16337 
16338 _Must_inspect_result_
16339 _IRQL_requires_max_ (APC_LEVEL)
16340 __kernel_entry
16341 NTSYSCALLAPI
16342 NTSTATUS
16343 NTAPI
16344 NtPrepareEnlistment(
16345   _In_ HANDLE EnlistmentHandle,
16346   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16347 
16348 _Must_inspect_result_
16349 _IRQL_requires_max_ (APC_LEVEL)
16350 __kernel_entry
16351 NTSYSCALLAPI
16352 NTSTATUS
16353 NTAPI
16354 NtCommitEnlistment(
16355   _In_ HANDLE EnlistmentHandle,
16356   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16357 
16358 _IRQL_requires_max_ (APC_LEVEL)
16359 __kernel_entry
16360 NTSYSCALLAPI
16361 NTSTATUS
16362 NTAPI
16363 NtRollbackEnlistment(
16364   _In_ HANDLE EnlistmentHandle,
16365   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16366 
16367 _IRQL_requires_max_ (APC_LEVEL)
16368 __kernel_entry
16369 NTSYSCALLAPI
16370 NTSTATUS
16371 NTAPI
16372 NtPrePrepareComplete(
16373   _In_ HANDLE EnlistmentHandle,
16374   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16375 
16376 _IRQL_requires_max_ (APC_LEVEL)
16377 __kernel_entry
16378 NTSYSCALLAPI
16379 NTSTATUS
16380 NTAPI
16381 NtPrepareComplete(
16382   _In_ HANDLE EnlistmentHandle,
16383   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16384 
16385 _IRQL_requires_max_ (APC_LEVEL)
16386 __kernel_entry
16387 NTSYSCALLAPI
16388 NTSTATUS
16389 NTAPI
16390 NtCommitComplete(
16391   _In_ HANDLE EnlistmentHandle,
16392   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16393 
16394 _IRQL_requires_max_ (APC_LEVEL)
16395 __kernel_entry
16396 NTSYSCALLAPI
16397 NTSTATUS
16398 NTAPI
16399 NtReadOnlyEnlistment(
16400   _In_ HANDLE EnlistmentHandle,
16401   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16402 
16403 _IRQL_requires_max_ (APC_LEVEL)
16404 __kernel_entry
16405 NTSYSCALLAPI
16406 NTSTATUS
16407 NTAPI
16408 NtRollbackComplete(
16409   _In_ HANDLE EnlistmentHandle,
16410   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16411 
16412 _IRQL_requires_max_ (APC_LEVEL)
16413 __kernel_entry
16414 NTSYSCALLAPI
16415 NTSTATUS
16416 NTAPI
16417 NtSinglePhaseReject(
16418   _In_ HANDLE EnlistmentHandle,
16419   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16420 
16421 _Must_inspect_result_
16422 _IRQL_requires_max_ (APC_LEVEL)
16423 __kernel_entry
16424 NTSYSCALLAPI
16425 NTSTATUS
16426 NTAPI
16427 NtCreateResourceManager(
16428   _Out_ PHANDLE ResourceManagerHandle,
16429   _In_ ACCESS_MASK DesiredAccess,
16430   _In_ HANDLE TmHandle,
16431   _In_ LPGUID RmGuid,
16432   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16433   _In_opt_ ULONG CreateOptions,
16434   _In_opt_ PUNICODE_STRING Description);
16435 
16436 _Must_inspect_result_
16437 _IRQL_requires_max_ (APC_LEVEL)
16438 __kernel_entry
16439 NTSYSCALLAPI
16440 NTSTATUS
16441 NTAPI
16442 NtOpenResourceManager(
16443   _Out_ PHANDLE ResourceManagerHandle,
16444   _In_ ACCESS_MASK DesiredAccess,
16445   _In_ HANDLE TmHandle,
16446   _In_opt_ LPGUID ResourceManagerGuid,
16447   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
16448 
16449 _Must_inspect_result_
16450 _IRQL_requires_max_ (APC_LEVEL)
16451 __kernel_entry
16452 NTSYSCALLAPI
16453 NTSTATUS
16454 NTAPI
16455 NtRecoverResourceManager(
16456   _In_ HANDLE ResourceManagerHandle);
16457 
16458 _Must_inspect_result_
16459 _IRQL_requires_max_ (APC_LEVEL)
16460 __kernel_entry
16461 NTSYSCALLAPI
16462 NTSTATUS
16463 NTAPI
16464 NtGetNotificationResourceManager(
16465   _In_ HANDLE ResourceManagerHandle,
16466   _Out_ PTRANSACTION_NOTIFICATION TransactionNotification,
16467   _In_ ULONG NotificationLength,
16468   _In_opt_ PLARGE_INTEGER Timeout,
16469   _Out_opt_ PULONG ReturnLength,
16470   _In_ ULONG Asynchronous,
16471   _In_opt_ ULONG_PTR AsynchronousContext);
16472 
16473 _Must_inspect_result_
16474 _IRQL_requires_max_ (APC_LEVEL)
16475 __kernel_entry
16476 NTSYSCALLAPI
16477 NTSTATUS
16478 NTAPI
16479 NtQueryInformationResourceManager(
16480   _In_ HANDLE ResourceManagerHandle,
16481   _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
16482   _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
16483   _In_ ULONG ResourceManagerInformationLength,
16484   _Out_opt_ PULONG ReturnLength);
16485 
16486 _Must_inspect_result_
16487 _IRQL_requires_max_ (APC_LEVEL)
16488 __kernel_entry
16489 NTSYSCALLAPI
16490 NTSTATUS
16491 NTAPI
16492 NtSetInformationResourceManager(
16493   _In_ HANDLE ResourceManagerHandle,
16494   _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
16495   _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
16496   _In_ ULONG ResourceManagerInformationLength);
16497 
16498 _Must_inspect_result_
16499 _IRQL_requires_max_ (APC_LEVEL)
16500 __kernel_entry
16501 NTSYSCALLAPI
16502 NTSTATUS
16503 NTAPI
16504 NtRegisterProtocolAddressInformation(
16505   _In_ HANDLE ResourceManager,
16506   _In_ PCRM_PROTOCOL_ID ProtocolId,
16507   _In_ ULONG ProtocolInformationSize,
16508   _In_ PVOID ProtocolInformation,
16509   _In_opt_ ULONG CreateOptions);
16510 
16511 _IRQL_requires_max_ (APC_LEVEL)
16512 __kernel_entry
16513 NTSYSCALLAPI
16514 NTSTATUS
16515 NTAPI
16516 NtPropagationComplete(
16517   _In_ HANDLE ResourceManagerHandle,
16518   _In_ ULONG RequestCookie,
16519   _In_ ULONG BufferLength,
16520   _In_ PVOID Buffer);
16521 
16522 _IRQL_requires_max_ (APC_LEVEL)
16523 __kernel_entry
16524 NTSYSCALLAPI
16525 NTSTATUS
16526 NTAPI
16527 NtPropagationFailed(
16528   _In_ HANDLE ResourceManagerHandle,
16529   _In_ ULONG RequestCookie,
16530   _In_ NTSTATUS PropStatus);
16531 
16532 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
16533 
16534 #endif /* !_NTTMAPI_ */
16535 /******************************************************************************
16536  *                            ZwXxx Functions                                 *
16537  ******************************************************************************/
16538 
16539 
16540 /* Constants */
16541 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
16542 #define ZwCurrentProcess() NtCurrentProcess()
16543 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
16544 #define ZwCurrentThread() NtCurrentThread()
16545 
16546 
16547 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16548 
16549 _IRQL_requires_max_(PASSIVE_LEVEL)
16550 NTSYSAPI
16551 NTSTATUS
16552 NTAPI
16553 ZwClose(
16554   _In_ HANDLE Handle);
16555 
16556 _IRQL_requires_max_(PASSIVE_LEVEL)
16557 NTSYSAPI
16558 NTSTATUS
16559 NTAPI
16560 ZwCreateDirectoryObject(
16561   _Out_ PHANDLE DirectoryHandle,
16562   _In_ ACCESS_MASK DesiredAccess,
16563   _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16564 
16565 _IRQL_requires_max_(PASSIVE_LEVEL)
16566 NTSYSAPI
16567 NTSTATUS
16568 NTAPI
16569 ZwCreateFile(
16570   _Out_ PHANDLE FileHandle,
16571   _In_ ACCESS_MASK DesiredAccess,
16572   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16573   _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16574   _In_opt_ PLARGE_INTEGER AllocationSize,
16575   _In_ ULONG FileAttributes,
16576   _In_ ULONG ShareAccess,
16577   _In_ ULONG CreateDisposition,
16578   _In_ ULONG CreateOptions,
16579   _In_reads_bytes_opt_(EaLength) PVOID EaBuffer,
16580   _In_ ULONG EaLength);
16581 
16582 _IRQL_requires_max_(PASSIVE_LEVEL)
16583 NTSYSAPI
16584 NTSTATUS
16585 NTAPI
16586 ZwCreateKey(
16587   _Out_ PHANDLE KeyHandle,
16588   _In_ ACCESS_MASK DesiredAccess,
16589   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16590   _Reserved_ ULONG TitleIndex,
16591   _In_opt_ PUNICODE_STRING Class,
16592   _In_ ULONG CreateOptions,
16593   _Out_opt_ PULONG Disposition);
16594 
16595 _IRQL_requires_max_(APC_LEVEL)
16596 NTSYSAPI
16597 NTSTATUS
16598 NTAPI
16599 ZwCreateSection(
16600   _Out_ PHANDLE SectionHandle,
16601   _In_ ACCESS_MASK DesiredAccess,
16602   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16603   _In_opt_ PLARGE_INTEGER MaximumSize,
16604   _In_ ULONG SectionPageProtection,
16605   _In_ ULONG AllocationAttributes,
16606   _In_opt_ HANDLE FileHandle);
16607 
16608 _IRQL_requires_max_(PASSIVE_LEVEL)
16609 NTSYSAPI
16610 NTSTATUS
16611 NTAPI
16612 ZwDeleteKey(
16613   _In_ HANDLE KeyHandle);
16614 
16615 _IRQL_requires_max_(PASSIVE_LEVEL)
16616 NTSYSAPI
16617 NTSTATUS
16618 NTAPI
16619 ZwDeleteValueKey(
16620   _In_ HANDLE KeyHandle,
16621   _In_ PUNICODE_STRING ValueName);
16622 
16623 _IRQL_requires_max_(PASSIVE_LEVEL)
16624 _When_(Length == 0, _Post_satisfies_(return < 0))
16625 _When_(Length > 0, _Post_satisfies_(return <= 0))
16626 NTSYSAPI
16627 NTSTATUS
16628 NTAPI
16629 ZwEnumerateKey(
16630   _In_ HANDLE KeyHandle,
16631   _In_ ULONG Index,
16632   _In_ KEY_INFORMATION_CLASS KeyInformationClass,
16633   _Out_writes_bytes_opt_(Length) PVOID KeyInformation,
16634   _In_ ULONG Length,
16635   _Out_ PULONG ResultLength);
16636 
16637 _IRQL_requires_max_(PASSIVE_LEVEL)
16638 _When_(Length == 0, _Post_satisfies_(return < 0))
16639 _When_(Length > 0, _Post_satisfies_(return <= 0))
16640 NTSYSAPI
16641 NTSTATUS
16642 NTAPI
16643 ZwEnumerateValueKey(
16644   _In_ HANDLE KeyHandle,
16645   _In_ ULONG Index,
16646   _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
16647   _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation,
16648   _In_ ULONG Length,
16649   _Out_ PULONG ResultLength);
16650 
16651 _IRQL_requires_max_(PASSIVE_LEVEL)
16652 NTSYSAPI
16653 NTSTATUS
16654 NTAPI
16655 ZwFlushKey(
16656   _In_ HANDLE KeyHandle);
16657 
16658 _IRQL_requires_max_(PASSIVE_LEVEL)
16659 NTSYSAPI
16660 NTSTATUS
16661 NTAPI
16662 ZwLoadDriver(
16663   _In_ PUNICODE_STRING DriverServiceName);
16664 
16665 _IRQL_requires_max_(PASSIVE_LEVEL)
16666 NTSYSAPI
16667 NTSTATUS
16668 NTAPI
16669 ZwMakeTemporaryObject(
16670   _In_ HANDLE Handle);
16671 
16672 _IRQL_requires_max_(PASSIVE_LEVEL)
16673 NTSYSAPI
16674 NTSTATUS
16675 NTAPI
16676 ZwMapViewOfSection(
16677   _In_ HANDLE SectionHandle,
16678   _In_ HANDLE ProcessHandle,
16679   _Outptr_result_bytebuffer_(*ViewSize) PVOID *BaseAddress,
16680   _In_ ULONG_PTR ZeroBits,
16681   _In_ SIZE_T CommitSize,
16682   _Inout_opt_ PLARGE_INTEGER SectionOffset,
16683   _Inout_ PSIZE_T ViewSize,
16684   _In_ SECTION_INHERIT InheritDisposition,
16685   _In_ ULONG AllocationType,
16686   _In_ ULONG Protect);
16687 
16688 _IRQL_requires_max_(PASSIVE_LEVEL)
16689 NTSYSAPI
16690 NTSTATUS
16691 NTAPI
16692 ZwOpenFile(
16693   _Out_ PHANDLE FileHandle,
16694   _In_ ACCESS_MASK DesiredAccess,
16695   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16696   _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16697   _In_ ULONG ShareAccess,
16698   _In_ ULONG OpenOptions);
16699 
16700 _IRQL_requires_max_(PASSIVE_LEVEL)
16701 NTSYSAPI
16702 NTSTATUS
16703 NTAPI
16704 ZwOpenKey(
16705   _Out_ PHANDLE KeyHandle,
16706   _In_ ACCESS_MASK DesiredAccess,
16707   _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16708 
16709 _IRQL_requires_max_(PASSIVE_LEVEL)
16710 NTSYSAPI
16711 NTSTATUS
16712 NTAPI
16713 ZwOpenSection(
16714   _Out_ PHANDLE SectionHandle,
16715   _In_ ACCESS_MASK DesiredAccess,
16716   _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16717 
16718 _IRQL_requires_max_(PASSIVE_LEVEL)
16719 NTSYSAPI
16720 NTSTATUS
16721 NTAPI
16722 ZwOpenSymbolicLinkObject(
16723   _Out_ PHANDLE LinkHandle,
16724   _In_ ACCESS_MASK DesiredAccess,
16725   _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16726 
16727 _IRQL_requires_max_(PASSIVE_LEVEL)
16728 NTSYSAPI
16729 NTSTATUS
16730 NTAPI
16731 ZwQueryInformationFile(
16732   _In_ HANDLE FileHandle,
16733   _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16734   _Out_writes_bytes_(Length) PVOID FileInformation,
16735   _In_ ULONG Length,
16736   _In_ FILE_INFORMATION_CLASS FileInformationClass);
16737 
16738 _IRQL_requires_max_(PASSIVE_LEVEL)
16739 _When_(Length == 0, _Post_satisfies_(return < 0))
16740 _When_(Length > 0, _Post_satisfies_(return <= 0))
16741 NTSYSAPI
16742 NTSTATUS
16743 NTAPI
16744 ZwQueryKey(
16745   _In_ HANDLE KeyHandle,
16746   _In_ KEY_INFORMATION_CLASS KeyInformationClass,
16747   _Out_writes_bytes_opt_(Length) PVOID KeyInformation,
16748   _In_ ULONG Length,
16749   _Out_ PULONG ResultLength);
16750 
16751 _IRQL_requires_max_(PASSIVE_LEVEL)
16752 NTSYSAPI
16753 NTSTATUS
16754 NTAPI
16755 ZwQuerySymbolicLinkObject(
16756   _In_ HANDLE LinkHandle,
16757   _Inout_ PUNICODE_STRING LinkTarget,
16758   _Out_opt_ PULONG ReturnedLength);
16759 
16760 _IRQL_requires_max_(PASSIVE_LEVEL)
16761 _When_(Length == 0, _Post_satisfies_(return < 0))
16762 _When_(Length > 0, _Post_satisfies_(return <= 0))
16763 NTSYSAPI
16764 NTSTATUS
16765 NTAPI
16766 ZwQueryValueKey(
16767   _In_ HANDLE KeyHandle,
16768   _In_ PUNICODE_STRING ValueName,
16769   _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
16770   _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation,
16771   _In_ ULONG Length,
16772   _Out_ PULONG ResultLength);
16773 
16774 _IRQL_requires_max_(PASSIVE_LEVEL)
16775 NTSYSAPI
16776 NTSTATUS
16777 NTAPI
16778 ZwReadFile(
16779   _In_ HANDLE FileHandle,
16780   _In_opt_ HANDLE Event,
16781   _In_opt_ PIO_APC_ROUTINE ApcRoutine,
16782   _In_opt_ PVOID ApcContext,
16783   _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16784   _Out_writes_bytes_(Length) PVOID Buffer,
16785   _In_ ULONG Length,
16786   _In_opt_ PLARGE_INTEGER ByteOffset,
16787   _In_opt_ PULONG Key);
16788 
16789 _IRQL_requires_max_(PASSIVE_LEVEL)
16790 NTSYSAPI
16791 NTSTATUS
16792 NTAPI
16793 ZwSetInformationFile(
16794   _In_ HANDLE FileHandle,
16795   _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16796   _In_reads_bytes_(Length) PVOID FileInformation,
16797   _In_ ULONG Length,
16798   _In_ FILE_INFORMATION_CLASS FileInformationClass);
16799 
16800 _IRQL_requires_max_(PASSIVE_LEVEL)
16801 NTSYSAPI
16802 NTSTATUS
16803 NTAPI
16804 ZwSetValueKey(
16805   _In_ HANDLE KeyHandle,
16806   _In_ PUNICODE_STRING ValueName,
16807   _In_opt_ ULONG TitleIndex,
16808   _In_ ULONG Type,
16809   _In_reads_bytes_opt_(DataSize) PVOID Data,
16810   _In_ ULONG DataSize);
16811 
16812 _IRQL_requires_max_(PASSIVE_LEVEL)
16813 NTSYSAPI
16814 NTSTATUS
16815 NTAPI
16816 ZwUnloadDriver(
16817   _In_ PUNICODE_STRING DriverServiceName);
16818 
16819 _IRQL_requires_max_(PASSIVE_LEVEL)
16820 NTSYSAPI
16821 NTSTATUS
16822 NTAPI
16823 ZwUnmapViewOfSection(
16824   _In_ HANDLE ProcessHandle,
16825   _In_opt_ PVOID BaseAddress);
16826 
16827 _IRQL_requires_max_(PASSIVE_LEVEL)
16828 NTSYSAPI
16829 NTSTATUS
16830 NTAPI
16831 ZwWriteFile(
16832   _In_ HANDLE FileHandle,
16833   _In_opt_ HANDLE Event,
16834   _In_opt_ PIO_APC_ROUTINE ApcRoutine,
16835   _In_opt_ PVOID ApcContext,
16836   _Out_ PIO_STATUS_BLOCK IoStatusBlock,
16837   _In_reads_bytes_(Length) PVOID Buffer,
16838   _In_ ULONG Length,
16839   _In_opt_ PLARGE_INTEGER ByteOffset,
16840   _In_opt_ PULONG Key);
16841 
16842 _IRQL_requires_max_(PASSIVE_LEVEL)
16843 NTSYSAPI
16844 NTSTATUS
16845 NTAPI
16846 ZwQueryFullAttributesFile(
16847   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16848   _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation);
16849 
16850 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
16851 
16852 
16853 #if (NTDDI_VERSION >= NTDDI_WS03)
16854 _IRQL_requires_max_(PASSIVE_LEVEL)
16855 NTSYSCALLAPI
16856 NTSTATUS
16857 NTAPI
16858 ZwOpenEvent(
16859   _Out_ PHANDLE EventHandle,
16860   _In_ ACCESS_MASK DesiredAccess,
16861   _In_ POBJECT_ATTRIBUTES ObjectAttributes);
16862 #endif
16863 
16864 #if (NTDDI_VERSION >= NTDDI_VISTA)
16865 
16866 _IRQL_requires_max_(PASSIVE_LEVEL)
16867 NTSYSAPI
16868 NTSTATUS
16869 ZwCreateKeyTransacted(
16870   _Out_ PHANDLE KeyHandle,
16871   _In_ ACCESS_MASK DesiredAccess,
16872   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16873   _Reserved_ ULONG TitleIndex,
16874   _In_opt_ PUNICODE_STRING Class,
16875   _In_ ULONG CreateOptions,
16876   _In_ HANDLE TransactionHandle,
16877   _Out_opt_ PULONG Disposition);
16878 
16879 _IRQL_requires_max_(PASSIVE_LEVEL)
16880 NTSYSAPI
16881 NTSTATUS
16882 NTAPI
16883 ZwOpenKeyTransacted(
16884   _Out_ PHANDLE KeyHandle,
16885   _In_ ACCESS_MASK DesiredAccess,
16886   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16887   _In_ HANDLE TransactionHandle);
16888 
16889 _IRQL_requires_max_(PASSIVE_LEVEL)
16890 NTSYSCALLAPI
16891 NTSTATUS
16892 NTAPI
16893 ZwCreateTransactionManager(
16894   _Out_ PHANDLE TmHandle,
16895   _In_ ACCESS_MASK DesiredAccess,
16896   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16897   _In_opt_ PUNICODE_STRING LogFileName,
16898   _In_opt_ ULONG CreateOptions,
16899   _In_opt_ ULONG CommitStrength);
16900 
16901 _IRQL_requires_max_(PASSIVE_LEVEL)
16902 NTSYSCALLAPI
16903 NTSTATUS
16904 NTAPI
16905 ZwOpenTransactionManager(
16906   _Out_ PHANDLE TmHandle,
16907   _In_ ACCESS_MASK DesiredAccess,
16908   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16909   _In_opt_ PUNICODE_STRING LogFileName,
16910   _In_opt_ LPGUID TmIdentity,
16911   _In_opt_ ULONG OpenOptions);
16912 
16913 _IRQL_requires_max_(PASSIVE_LEVEL)
16914 NTSYSCALLAPI
16915 NTSTATUS
16916 NTAPI
16917 ZwRollforwardTransactionManager(
16918   _In_ HANDLE TransactionManagerHandle,
16919   _In_opt_ PLARGE_INTEGER TmVirtualClock);
16920 
16921 _IRQL_requires_max_(PASSIVE_LEVEL)
16922 NTSYSCALLAPI
16923 NTSTATUS
16924 NTAPI
16925 ZwRecoverTransactionManager(
16926   _In_ HANDLE TransactionManagerHandle);
16927 
16928 _IRQL_requires_max_(PASSIVE_LEVEL)
16929 NTSYSCALLAPI
16930 NTSTATUS
16931 NTAPI
16932 ZwQueryInformationTransactionManager(
16933   _In_ HANDLE TransactionManagerHandle,
16934   _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
16935   _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
16936   _In_ ULONG TransactionManagerInformationLength,
16937   _Out_opt_ PULONG ReturnLength);
16938 
16939 _IRQL_requires_max_(PASSIVE_LEVEL)
16940 NTSYSCALLAPI
16941 NTSTATUS
16942 NTAPI
16943 ZwSetInformationTransactionManager(
16944   _In_ HANDLE TmHandle,
16945   _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
16946   _In_ PVOID TransactionManagerInformation,
16947   _In_ ULONG TransactionManagerInformationLength);
16948 
16949 _IRQL_requires_max_(PASSIVE_LEVEL)
16950 NTSYSCALLAPI
16951 NTSTATUS
16952 NTAPI
16953 ZwEnumerateTransactionObject(
16954   _In_opt_ HANDLE RootObjectHandle,
16955   _In_ KTMOBJECT_TYPE QueryType,
16956   _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor,
16957   _In_ ULONG ObjectCursorLength,
16958   _Out_ PULONG ReturnLength);
16959 
16960 _IRQL_requires_max_(PASSIVE_LEVEL)
16961 NTSYSCALLAPI
16962 NTSTATUS
16963 NTAPI
16964 ZwCreateTransaction(
16965   _Out_ PHANDLE TransactionHandle,
16966   _In_ ACCESS_MASK DesiredAccess,
16967   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16968   _In_opt_ LPGUID Uow,
16969   _In_opt_ HANDLE TmHandle,
16970   _In_opt_ ULONG CreateOptions,
16971   _In_opt_ ULONG IsolationLevel,
16972   _In_opt_ ULONG IsolationFlags,
16973   _In_opt_ PLARGE_INTEGER Timeout,
16974   _In_opt_ PUNICODE_STRING Description);
16975 
16976 _IRQL_requires_max_(PASSIVE_LEVEL)
16977 NTSYSCALLAPI
16978 NTSTATUS
16979 NTAPI
16980 ZwOpenTransaction(
16981   _Out_ PHANDLE TransactionHandle,
16982   _In_ ACCESS_MASK DesiredAccess,
16983   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16984   _In_ LPGUID Uow,
16985   _In_opt_ HANDLE TmHandle);
16986 
16987 _IRQL_requires_max_(PASSIVE_LEVEL)
16988 NTSYSCALLAPI
16989 NTSTATUS
16990 NTAPI
16991 ZwQueryInformationTransaction(
16992   _In_ HANDLE TransactionHandle,
16993   _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16994   _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16995   _In_ ULONG TransactionInformationLength,
16996   _Out_opt_ PULONG ReturnLength);
16997 
16998 _IRQL_requires_max_(PASSIVE_LEVEL)
16999 NTSYSCALLAPI
17000 NTSTATUS
17001 NTAPI
17002 ZwSetInformationTransaction(
17003   _In_ HANDLE TransactionHandle,
17004   _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
17005   _In_ PVOID TransactionInformation,
17006   _In_ ULONG TransactionInformationLength);
17007 
17008 _IRQL_requires_max_(PASSIVE_LEVEL)
17009 NTSYSCALLAPI
17010 NTSTATUS
17011 NTAPI
17012 ZwCommitTransaction(
17013   _In_ HANDLE TransactionHandle,
17014   _In_ BOOLEAN Wait);
17015 
17016 _IRQL_requires_max_(PASSIVE_LEVEL)
17017 NTSYSCALLAPI
17018 NTSTATUS
17019 NTAPI
17020 ZwRollbackTransaction(
17021   _In_ HANDLE TransactionHandle,
17022   _In_ BOOLEAN Wait);
17023 
17024 _IRQL_requires_max_(PASSIVE_LEVEL)
17025 NTSYSCALLAPI
17026 NTSTATUS
17027 NTAPI
17028 ZwCreateResourceManager(
17029   _Out_ PHANDLE ResourceManagerHandle,
17030   _In_ ACCESS_MASK DesiredAccess,
17031   _In_ HANDLE TmHandle,
17032   _In_opt_ LPGUID ResourceManagerGuid,
17033   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17034   _In_opt_ ULONG CreateOptions,
17035   _In_opt_ PUNICODE_STRING Description);
17036 
17037 _IRQL_requires_max_(PASSIVE_LEVEL)
17038 NTSYSCALLAPI
17039 NTSTATUS
17040 NTAPI
17041 ZwOpenResourceManager(
17042   _Out_ PHANDLE ResourceManagerHandle,
17043   _In_ ACCESS_MASK DesiredAccess,
17044   _In_ HANDLE TmHandle,
17045   _In_ LPGUID ResourceManagerGuid,
17046   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
17047 
17048 _IRQL_requires_max_(PASSIVE_LEVEL)
17049 NTSYSCALLAPI
17050 NTSTATUS
17051 NTAPI
17052 ZwRecoverResourceManager(
17053   _In_ HANDLE ResourceManagerHandle);
17054 
17055 _IRQL_requires_max_(PASSIVE_LEVEL)
17056 NTSYSCALLAPI
17057 NTSTATUS
17058 NTAPI
17059 ZwGetNotificationResourceManager(
17060   _In_ HANDLE ResourceManagerHandle,
17061   _Out_ PTRANSACTION_NOTIFICATION TransactionNotification,
17062   _In_ ULONG NotificationLength,
17063   _In_ PLARGE_INTEGER Timeout,
17064   _Out_opt_ PULONG ReturnLength,
17065   _In_ ULONG Asynchronous,
17066   _In_opt_ ULONG_PTR AsynchronousContext);
17067 
17068 _IRQL_requires_max_(PASSIVE_LEVEL)
17069 NTSYSCALLAPI
17070 NTSTATUS
17071 NTAPI
17072 ZwQueryInformationResourceManager(
17073   _In_ HANDLE ResourceManagerHandle,
17074   _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
17075   _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
17076   _In_ ULONG ResourceManagerInformationLength,
17077   _Out_opt_ PULONG ReturnLength);
17078 
17079 _IRQL_requires_max_(PASSIVE_LEVEL)
17080 NTSYSCALLAPI
17081 NTSTATUS
17082 NTAPI
17083 ZwSetInformationResourceManager(
17084   _In_ HANDLE ResourceManagerHandle,
17085   _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
17086   _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
17087   _In_ ULONG ResourceManagerInformationLength);
17088 
17089 _IRQL_requires_max_(PASSIVE_LEVEL)
17090 NTSYSCALLAPI
17091 NTSTATUS
17092 NTAPI
17093 ZwCreateEnlistment(
17094   _Out_ PHANDLE EnlistmentHandle,
17095   _In_ ACCESS_MASK DesiredAccess,
17096   _In_ HANDLE ResourceManagerHandle,
17097   _In_ HANDLE TransactionHandle,
17098   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17099   _In_opt_ ULONG CreateOptions,
17100   _In_ NOTIFICATION_MASK NotificationMask,
17101   _In_opt_ PVOID EnlistmentKey);
17102 
17103 _IRQL_requires_max_(PASSIVE_LEVEL)
17104 NTSYSCALLAPI
17105 NTSTATUS
17106 NTAPI
17107 ZwOpenEnlistment(
17108   _Out_ PHANDLE EnlistmentHandle,
17109   _In_ ACCESS_MASK DesiredAccess,
17110   _In_ HANDLE RmHandle,
17111   _In_ LPGUID EnlistmentGuid,
17112   _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
17113 
17114 _IRQL_requires_max_(PASSIVE_LEVEL)
17115 NTSYSCALLAPI
17116 NTSTATUS
17117 NTAPI
17118 ZwQueryInformationEnlistment(
17119   _In_ HANDLE EnlistmentHandle,
17120   _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
17121   _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
17122   _In_ ULONG EnlistmentInformationLength,
17123   _Out_opt_ PULONG ReturnLength);
17124 
17125 _IRQL_requires_max_(PASSIVE_LEVEL)
17126 NTSYSCALLAPI
17127 NTSTATUS
17128 NTAPI
17129 ZwSetInformationEnlistment(
17130   _In_ HANDLE EnlistmentHandle,
17131   _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
17132   _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
17133   _In_ ULONG EnlistmentInformationLength);
17134 
17135 _IRQL_requires_max_(PASSIVE_LEVEL)
17136 NTSYSCALLAPI
17137 NTSTATUS
17138 NTAPI
17139 ZwRecoverEnlistment(
17140   _In_ HANDLE EnlistmentHandle,
17141   _In_opt_ PVOID EnlistmentKey);
17142 
17143 _IRQL_requires_max_(PASSIVE_LEVEL)
17144 NTSYSCALLAPI
17145 NTSTATUS
17146 NTAPI
17147 ZwPrePrepareEnlistment(
17148   _In_ HANDLE EnlistmentHandle,
17149   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17150 
17151 _IRQL_requires_max_(PASSIVE_LEVEL)
17152 NTSYSCALLAPI
17153 NTSTATUS
17154 NTAPI
17155 ZwPrepareEnlistment(
17156   _In_ HANDLE EnlistmentHandle,
17157   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17158 
17159 _IRQL_requires_max_(PASSIVE_LEVEL)
17160 NTSYSCALLAPI
17161 NTSTATUS
17162 NTAPI
17163 ZwCommitEnlistment(
17164   _In_ HANDLE EnlistmentHandle,
17165   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17166 
17167 _IRQL_requires_max_(PASSIVE_LEVEL)
17168 NTSYSCALLAPI
17169 NTSTATUS
17170 NTAPI
17171 ZwRollbackEnlistment(
17172   _In_ HANDLE EnlistmentHandle,
17173   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17174 
17175 _IRQL_requires_max_(PASSIVE_LEVEL)
17176 NTSYSCALLAPI
17177 NTSTATUS
17178 NTAPI
17179 ZwPrePrepareComplete(
17180   _In_ HANDLE EnlistmentHandle,
17181   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17182 
17183 _IRQL_requires_max_(PASSIVE_LEVEL)
17184 NTSYSCALLAPI
17185 NTSTATUS
17186 NTAPI
17187 ZwPrepareComplete(
17188   _In_ HANDLE EnlistmentHandle,
17189   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17190 
17191 _IRQL_requires_max_(PASSIVE_LEVEL)
17192 NTSYSCALLAPI
17193 NTSTATUS
17194 NTAPI
17195 ZwCommitComplete(
17196   _In_ HANDLE EnlistmentHandle,
17197   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17198 
17199 _IRQL_requires_max_(PASSIVE_LEVEL)
17200 NTSYSCALLAPI
17201 NTSTATUS
17202 NTAPI
17203 ZwReadOnlyEnlistment(
17204   _In_ HANDLE EnlistmentHandle,
17205   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17206 
17207 NTSYSCALLAPI
17208 NTSTATUS
17209 NTAPI
17210 ZwRollbackComplete(
17211   IN HANDLE EnlistmentHandle,
17212   IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
17213 
17214 NTSYSCALLAPI
17215 NTSTATUS
17216 NTAPI
17217 ZwSinglePhaseReject(
17218   _In_ HANDLE EnlistmentHandle,
17219   _In_opt_ PLARGE_INTEGER TmVirtualClock);
17220 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
17221 #if (NTDDI_VERSION >= NTDDI_WIN7)
17222 
17223 _IRQL_requires_max_(PASSIVE_LEVEL)
17224 NTSYSAPI
17225 NTSTATUS
17226 NTAPI
17227 ZwOpenKeyEx(
17228   _Out_ PHANDLE KeyHandle,
17229   _In_ ACCESS_MASK DesiredAccess,
17230   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17231   _In_ ULONG OpenOptions);
17232 
17233 _IRQL_requires_max_(PASSIVE_LEVEL)
17234 NTSYSAPI
17235 NTSTATUS
17236 NTAPI
17237 ZwOpenKeyTransactedEx(
17238   _Out_ PHANDLE KeyHandle,
17239   _In_ ACCESS_MASK DesiredAccess,
17240   _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17241   _In_ ULONG OpenOptions,
17242   _In_ HANDLE TransactionHandle);
17243 
17244 NTSYSAPI
17245 NTSTATUS
17246 NTAPI
17247 ZwNotifyChangeMultipleKeys(
17248   IN HANDLE MasterKeyHandle,
17249   IN ULONG Count OPTIONAL,
17250   IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
17251   IN HANDLE Event OPTIONAL,
17252   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
17253   IN PVOID ApcContext OPTIONAL,
17254   OUT PIO_STATUS_BLOCK IoStatusBlock,
17255   IN ULONG CompletionFilter,
17256   IN BOOLEAN WatchTree,
17257   OUT PVOID Buffer OPTIONAL,
17258   IN ULONG BufferSize,
17259   IN BOOLEAN Asynchronous);
17260 
17261 NTSYSAPI
17262 NTSTATUS
17263 NTAPI
17264 ZwQueryMultipleValueKey(
17265   IN HANDLE KeyHandle,
17266   IN OUT PKEY_VALUE_ENTRY ValueEntries,
17267   IN ULONG EntryCount,
17268   OUT PVOID ValueBuffer,
17269   IN OUT PULONG BufferLength,
17270   OUT PULONG RequiredBufferLength OPTIONAL);
17271 
17272 _IRQL_requires_max_(PASSIVE_LEVEL)
17273 NTSYSAPI
17274 NTSTATUS
17275 NTAPI
17276 ZwRenameKey(
17277   _In_ HANDLE KeyHandle,
17278   _In_ PUNICODE_STRING NewName);
17279 
17280 _IRQL_requires_max_(PASSIVE_LEVEL)
17281 NTSYSAPI
17282 NTSTATUS
17283 NTAPI
17284 ZwSetInformationKey(
17285   _In_ HANDLE KeyHandle,
17286   _In_ __drv_strictTypeMatch(__drv_typeConst) KEY_SET_INFORMATION_CLASS KeySetInformationClass,
17287   _In_reads_bytes_(KeySetInformationLength) PVOID KeySetInformation,
17288   _In_ ULONG KeySetInformationLength);
17289 
17290 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
17291 
17292 
17293 #ifdef __cplusplus
17294 }
17295 #endif
17296 
17297 #endif /* !_WDMDDK_ */

Generated on Sun May 27 2012 04:30:27 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.