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