Home | History | Annotate | Download | only in ddk
      1 /*
      2  * ntddk.h
      3  *
      4  * Windows NT Device Driver Kit
      5  *
      6  * This file is part of the ReactOS DDK package.
      7  *
      8  * Contributors:
      9  *   Amine Khaldi
     10  *   Timo Kreuzer (timo.kreuzer (at) 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 
     24 #pragma once
     25 
     26 #define _NTDDK_
     27 
     28 #if !defined(_NTHAL_) && !defined(_NTIFS_)
     29 #define _NTDDK_INCLUDED_
     30 #define _DDK_DRIVER_
     31 #endif
     32 
     33 /* Dependencies */
     34 
     35 #define NT_INCLUDED
     36 #define _CTYPE_DISABLE_MACROS
     37 
     38 #include <wdm.h>
     39 #include <excpt.h>
     40 #include <ntdef.h>
     41 #include <ntstatus.h>
     42 #include <mce.h>
     43 #include <bugcodes.h>
     44 #include <ntiologc.h>
     45 
     46 #include <stdarg.h> // FIXME
     47 #include <basetyps.h> // FIXME
     48 
     49 
     50 #ifdef __cplusplus
     51 extern "C" {
     52 #endif
     53 
     54 /* GUID and UUID */
     55 #ifndef _NTLSA_IFS_
     56 #ifndef _NTLSA_AUDIT_
     57 #define _NTLSA_AUDIT_
     58 
     59 #ifndef GUID_DEFINED
     60 #include <guiddef.h>
     61 #endif
     62 
     63 #endif /* _NTLSA_AUDIT_ */
     64 #endif /* _NTLSA_IFS_ */
     65 
     66 typedef GUID UUID;
     67 
     68 struct _LOADER_PARAMETER_BLOCK;
     69 struct _CREATE_DISK;
     70 struct _DRIVE_LAYOUT_INFORMATION_EX;
     71 struct _SET_PARTITION_INFORMATION_EX;
     72 struct _DISK_GEOMETRY_EX;
     73 
     74 typedef struct _BUS_HANDLER *PBUS_HANDLER;
     75 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
     76 #if defined(_NTHAL_INCLUDED_)
     77 typedef struct _KAFFINITY_EX *PKAFFINITY_EX;
     78 #endif
     79 typedef struct _PEB *PPEB;
     80 
     81 #ifndef _NTIMAGE_
     82 
     83 typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32;
     84 typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64;
     85 
     86 #ifdef _WIN64
     87 typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
     88 #else
     89 typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
     90 #endif
     91 
     92 #endif /* _NTIMAGE_ */
     93 
     94 /******************************************************************************
     95  *                            Executive Types                                 *
     96  ******************************************************************************/
     97 typedef struct _ZONE_SEGMENT_HEADER {
     98   SINGLE_LIST_ENTRY SegmentList;
     99   PVOID Reserved;
    100 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
    101 
    102 typedef struct _ZONE_HEADER {
    103   SINGLE_LIST_ENTRY FreeList;
    104   SINGLE_LIST_ENTRY SegmentList;
    105   ULONG BlockSize;
    106   ULONG TotalSegmentSize;
    107 } ZONE_HEADER, *PZONE_HEADER;
    108 
    109 #define PROTECTED_POOL                    0x80000000
    110 
    111 /******************************************************************************
    112  *                         I/O Manager Types                                  *
    113  ******************************************************************************/
    114 
    115 /* DEVICE_OBJECT.Flags */
    116 #define DO_DEVICE_HAS_NAME                0x00000040
    117 #define DO_SYSTEM_BOOT_PARTITION          0x00000100
    118 #define DO_LONG_TERM_REQUESTS             0x00000200
    119 #define DO_NEVER_LAST_DEVICE              0x00000400
    120 #define DO_LOW_PRIORITY_FILESYSTEM        0x00010000
    121 #define DO_SUPPORTS_TRANSACTIONS          0x00040000
    122 #define DO_FORCE_NEITHER_IO               0x00080000
    123 #define DO_VOLUME_DEVICE_OBJECT           0x00100000
    124 #define DO_SYSTEM_SYSTEM_PARTITION        0x00200000
    125 #define DO_SYSTEM_CRITICAL_PARTITION      0x00400000
    126 #define DO_DISALLOW_EXECUTE               0x00800000
    127 
    128 #ifndef _ARC_DDK_
    129 #define _ARC_DDK_
    130 typedef enum _CONFIGURATION_TYPE {
    131   ArcSystem,
    132   CentralProcessor,
    133   FloatingPointProcessor,
    134   PrimaryIcache,
    135   PrimaryDcache,
    136   SecondaryIcache,
    137   SecondaryDcache,
    138   SecondaryCache,
    139   EisaAdapter,
    140   TcAdapter,
    141   ScsiAdapter,
    142   DtiAdapter,
    143   MultiFunctionAdapter,
    144   DiskController,
    145   TapeController,
    146   CdromController,
    147   WormController,
    148   SerialController,
    149   NetworkController,
    150   DisplayController,
    151   ParallelController,
    152   PointerController,
    153   KeyboardController,
    154   AudioController,
    155   OtherController,
    156   DiskPeripheral,
    157   FloppyDiskPeripheral,
    158   TapePeripheral,
    159   ModemPeripheral,
    160   MonitorPeripheral,
    161   PrinterPeripheral,
    162   PointerPeripheral,
    163   KeyboardPeripheral,
    164   TerminalPeripheral,
    165   OtherPeripheral,
    166   LinePeripheral,
    167   NetworkPeripheral,
    168   SystemMemory,
    169   DockingInformation,
    170   RealModeIrqRoutingTable,
    171   RealModePCIEnumeration,
    172   MaximumType
    173 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
    174 #endif /* !_ARC_DDK_ */
    175 
    176 /*
    177 ** IRP function codes
    178 */
    179 
    180 #define IRP_MN_QUERY_DIRECTORY            0x01
    181 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY    0x02
    182 
    183 #define IRP_MN_USER_FS_REQUEST            0x00
    184 #define IRP_MN_MOUNT_VOLUME               0x01
    185 #define IRP_MN_VERIFY_VOLUME              0x02
    186 #define IRP_MN_LOAD_FILE_SYSTEM           0x03
    187 #define IRP_MN_TRACK_LINK                 0x04
    188 #define IRP_MN_KERNEL_CALL                0x04
    189 
    190 #define IRP_MN_LOCK                       0x01
    191 #define IRP_MN_UNLOCK_SINGLE              0x02
    192 #define IRP_MN_UNLOCK_ALL                 0x03
    193 #define IRP_MN_UNLOCK_ALL_BY_KEY          0x04
    194 
    195 #define IRP_MN_FLUSH_AND_PURGE          0x01
    196 
    197 #define IRP_MN_NORMAL                     0x00
    198 #define IRP_MN_DPC                        0x01
    199 #define IRP_MN_MDL                        0x02
    200 #define IRP_MN_COMPLETE                   0x04
    201 #define IRP_MN_COMPRESSED                 0x08
    202 
    203 #define IRP_MN_MDL_DPC                    (IRP_MN_MDL | IRP_MN_DPC)
    204 #define IRP_MN_COMPLETE_MDL               (IRP_MN_COMPLETE | IRP_MN_MDL)
    205 #define IRP_MN_COMPLETE_MDL_DPC           (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
    206 
    207 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
    208 
    209 #define IO_CHECK_CREATE_PARAMETERS      0x0200
    210 #define IO_ATTACH_DEVICE                0x0400
    211 #define IO_IGNORE_SHARE_ACCESS_CHECK    0x0800
    212 
    213 typedef NTSTATUS
    214 (NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
    215   IN PVOID Context,
    216   IN PUNICODE_STRING PathName,
    217   IN INTERFACE_TYPE BusType,
    218   IN ULONG BusNumber,
    219   IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
    220   IN CONFIGURATION_TYPE ControllerType,
    221   IN ULONG ControllerNumber,
    222   IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
    223   IN CONFIGURATION_TYPE PeripheralType,
    224   IN ULONG PeripheralNumber,
    225   IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
    226 
    227 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
    228   IoQueryDeviceIdentifier = 0,
    229   IoQueryDeviceConfigurationData,
    230   IoQueryDeviceComponentInformation,
    231   IoQueryDeviceMaxData
    232 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
    233 
    234 typedef VOID
    235 (NTAPI *PDRIVER_REINITIALIZE)(
    236   IN struct _DRIVER_OBJECT *DriverObject,
    237   IN PVOID Context OPTIONAL,
    238   IN ULONG Count);
    239 
    240 typedef struct _CONTROLLER_OBJECT {
    241   CSHORT Type;
    242   CSHORT Size;
    243   PVOID ControllerExtension;
    244   KDEVICE_QUEUE DeviceWaitQueue;
    245   ULONG Spare1;
    246   LARGE_INTEGER Spare2;
    247 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
    248 
    249 #define DRVO_REINIT_REGISTERED          0x00000008
    250 #define DRVO_INITIALIZED                0x00000010
    251 #define DRVO_BOOTREINIT_REGISTERED      0x00000020
    252 #define DRVO_LEGACY_RESOURCES           0x00000040
    253 
    254 typedef struct _CONFIGURATION_INFORMATION {
    255   ULONG DiskCount;
    256   ULONG FloppyCount;
    257   ULONG CdRomCount;
    258   ULONG TapeCount;
    259   ULONG ScsiPortCount;
    260   ULONG SerialCount;
    261   ULONG ParallelCount;
    262   BOOLEAN AtDiskPrimaryAddressClaimed;
    263   BOOLEAN AtDiskSecondaryAddressClaimed;
    264   ULONG Version;
    265   ULONG MediumChangerCount;
    266 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
    267 
    268 typedef struct _DISK_SIGNATURE {
    269   ULONG PartitionStyle;
    270   _ANONYMOUS_UNION union {
    271     struct {
    272       ULONG Signature;
    273       ULONG CheckSum;
    274     } Mbr;
    275     struct {
    276       GUID DiskId;
    277     } Gpt;
    278   } DUMMYUNIONNAME;
    279 } DISK_SIGNATURE, *PDISK_SIGNATURE;
    280 
    281 typedef struct _TXN_PARAMETER_BLOCK {
    282   USHORT Length;
    283   USHORT TxFsContext;
    284   PVOID TransactionObject;
    285 } TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK;
    286 
    287 #define TXF_MINIVERSION_DEFAULT_VIEW        (0xFFFE)
    288 
    289 typedef struct _IO_DRIVER_CREATE_CONTEXT {
    290   CSHORT Size;
    291   struct _ECP_LIST *ExtraCreateParameter;
    292   PVOID DeviceObjectHint;
    293   PTXN_PARAMETER_BLOCK TxnParameters;
    294 } IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT;
    295 
    296 typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD {
    297   USHORT Size;
    298   USHORT Version;
    299   PVOID Context;
    300   PINTERFACE_REFERENCE InterfaceReference;
    301   PINTERFACE_DEREFERENCE InterfaceDereference;
    302   PGET_SET_DEVICE_DATA SetBusData;
    303   PGET_SET_DEVICE_DATA GetBusData;
    304   UCHAR CapabilityID;
    305 } AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD;
    306 
    307 typedef NTSTATUS
    308 (NTAPI *PGET_LOCATION_STRING)(
    309   IN OUT PVOID Context OPTIONAL,
    310   OUT PWCHAR *LocationStrings);
    311 
    312 typedef struct _PNP_LOCATION_INTERFACE {
    313   USHORT Size;
    314   USHORT Version;
    315   PVOID Context;
    316   PINTERFACE_REFERENCE InterfaceReference;
    317   PINTERFACE_DEREFERENCE InterfaceDereference;
    318   PGET_LOCATION_STRING GetLocationString;
    319 } PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE;
    320 
    321 typedef enum _ARBITER_ACTION {
    322   ArbiterActionTestAllocation,
    323   ArbiterActionRetestAllocation,
    324   ArbiterActionCommitAllocation,
    325   ArbiterActionRollbackAllocation,
    326   ArbiterActionQueryAllocatedResources,
    327   ArbiterActionWriteReservedResources,
    328   ArbiterActionQueryConflict,
    329   ArbiterActionQueryArbitrate,
    330   ArbiterActionAddReserved,
    331   ArbiterActionBootAllocation
    332 } ARBITER_ACTION, *PARBITER_ACTION;
    333 
    334 typedef struct _ARBITER_CONFLICT_INFO {
    335   PDEVICE_OBJECT OwningObject;
    336   ULONGLONG Start;
    337   ULONGLONG End;
    338 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
    339 
    340 typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS {
    341   IN OUT PLIST_ENTRY ArbitrationList;
    342   IN ULONG AllocateFromCount;
    343   IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
    344 } ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS;
    345 
    346 typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS {
    347   IN OUT PLIST_ENTRY ArbitrationList;
    348   IN ULONG AllocateFromCount;
    349   IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
    350 } ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS;
    351 
    352 typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS {
    353   IN OUT PLIST_ENTRY ArbitrationList;
    354 } ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS;
    355 
    356 typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS {
    357   OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
    358 } ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS;
    359 
    360 typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS {
    361   IN PDEVICE_OBJECT PhysicalDeviceObject;
    362   IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
    363   OUT PULONG ConflictCount;
    364   OUT PARBITER_CONFLICT_INFO *Conflicts;
    365 } ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS;
    366 
    367 typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS {
    368   IN PLIST_ENTRY ArbitrationList;
    369 } ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS;
    370 
    371 typedef struct _ARBITER_ADD_RESERVED_PARAMETERS {
    372   IN PDEVICE_OBJECT ReserveDevice;
    373 } ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS;
    374 
    375 typedef struct _ARBITER_PARAMETERS {
    376   union {
    377     ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation;
    378     ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation;
    379     ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation;
    380     ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources;
    381     ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict;
    382     ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate;
    383     ARBITER_ADD_RESERVED_PARAMETERS AddReserved;
    384   } Parameters;
    385 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
    386 
    387 typedef enum _ARBITER_REQUEST_SOURCE {
    388   ArbiterRequestUndefined = -1,
    389   ArbiterRequestLegacyReported,
    390   ArbiterRequestHalReported,
    391   ArbiterRequestLegacyAssigned,
    392   ArbiterRequestPnpDetected,
    393   ArbiterRequestPnpEnumerated
    394 } ARBITER_REQUEST_SOURCE;
    395 
    396 typedef enum _ARBITER_RESULT {
    397   ArbiterResultUndefined = -1,
    398   ArbiterResultSuccess,
    399   ArbiterResultExternalConflict,
    400   ArbiterResultNullRequest
    401 } ARBITER_RESULT;
    402 
    403 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
    404 
    405 typedef struct _ARBITER_LIST_ENTRY {
    406   LIST_ENTRY ListEntry;
    407   ULONG AlternativeCount;
    408   PIO_RESOURCE_DESCRIPTOR Alternatives;
    409   PDEVICE_OBJECT PhysicalDeviceObject;
    410   ARBITER_REQUEST_SOURCE RequestSource;
    411   ULONG Flags;
    412   LONG_PTR WorkSpace;
    413   INTERFACE_TYPE InterfaceType;
    414   ULONG SlotNumber;
    415   ULONG BusNumber;
    416   PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
    417   PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
    418   ARBITER_RESULT Result;
    419 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
    420 
    421 typedef NTSTATUS
    422 (NTAPI *PARBITER_HANDLER)(
    423   IN OUT PVOID Context,
    424   IN ARBITER_ACTION Action,
    425   IN OUT PARBITER_PARAMETERS Parameters);
    426 
    427 #define ARBITER_PARTIAL 0x00000001
    428 
    429 typedef struct _ARBITER_INTERFACE {
    430   USHORT Size;
    431   USHORT Version;
    432   PVOID Context;
    433   PINTERFACE_REFERENCE InterfaceReference;
    434   PINTERFACE_DEREFERENCE InterfaceDereference;
    435   PARBITER_HANDLER ArbiterHandler;
    436   ULONG Flags;
    437 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
    438 
    439 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
    440   TranslateChildToParent,
    441   TranslateParentToChild
    442 } RESOURCE_TRANSLATION_DIRECTION;
    443 
    444 typedef NTSTATUS
    445 (NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
    446   IN OUT PVOID Context OPTIONAL,
    447   IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
    448   IN RESOURCE_TRANSLATION_DIRECTION Direction,
    449   IN ULONG AlternativesCount OPTIONAL,
    450   IN IO_RESOURCE_DESCRIPTOR Alternatives[],
    451   IN PDEVICE_OBJECT PhysicalDeviceObject,
    452   OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
    453 
    454 typedef NTSTATUS
    455 (NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
    456   IN OUT PVOID Context OPTIONAL,
    457   IN PIO_RESOURCE_DESCRIPTOR Source,
    458   IN PDEVICE_OBJECT PhysicalDeviceObject,
    459   OUT PULONG TargetCount,
    460   OUT PIO_RESOURCE_DESCRIPTOR *Target);
    461 
    462 typedef struct _TRANSLATOR_INTERFACE {
    463   USHORT Size;
    464   USHORT Version;
    465   PVOID Context;
    466   PINTERFACE_REFERENCE InterfaceReference;
    467   PINTERFACE_DEREFERENCE InterfaceDereference;
    468   PTRANSLATE_RESOURCE_HANDLER TranslateResources;
    469   PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
    470 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
    471 
    472 typedef struct _PCI_AGP_CAPABILITY {
    473   PCI_CAPABILITIES_HEADER Header;
    474   USHORT Minor:4;
    475   USHORT Major:4;
    476   USHORT Rsvd1:8;
    477   struct _PCI_AGP_STATUS {
    478     ULONG Rate:3;
    479     ULONG Agp3Mode:1;
    480     ULONG FastWrite:1;
    481     ULONG FourGB:1;
    482     ULONG HostTransDisable:1;
    483     ULONG Gart64:1;
    484     ULONG ITA_Coherent:1;
    485     ULONG SideBandAddressing:1;
    486     ULONG CalibrationCycle:3;
    487     ULONG AsyncRequestSize:3;
    488     ULONG Rsvd1:1;
    489     ULONG Isoch:1;
    490     ULONG Rsvd2:6;
    491     ULONG RequestQueueDepthMaximum:8;
    492   } AGPStatus;
    493   struct _PCI_AGP_COMMAND {
    494     ULONG Rate:3;
    495     ULONG Rsvd1:1;
    496     ULONG FastWriteEnable:1;
    497     ULONG FourGBEnable:1;
    498     ULONG Rsvd2:1;
    499     ULONG Gart64:1;
    500     ULONG AGPEnable:1;
    501     ULONG SBAEnable:1;
    502     ULONG CalibrationCycle:3;
    503     ULONG AsyncReqSize:3;
    504     ULONG Rsvd3:8;
    505     ULONG RequestQueueDepth:8;
    506   } AGPCommand;
    507 } PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY;
    508 
    509 typedef enum _EXTENDED_AGP_REGISTER {
    510   IsochStatus,
    511   AgpControl,
    512   ApertureSize,
    513   AperturePageSize,
    514   GartLow,
    515   GartHigh,
    516   IsochCommand
    517 } EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER;
    518 
    519 typedef struct _PCI_AGP_ISOCH_STATUS {
    520   ULONG ErrorCode:2;
    521   ULONG Rsvd1:1;
    522   ULONG Isoch_L:3;
    523   ULONG Isoch_Y:2;
    524   ULONG Isoch_N:8;
    525   ULONG Rsvd2:16;
    526 } PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS;
    527 
    528 typedef struct _PCI_AGP_CONTROL {
    529   ULONG Rsvd1:7;
    530   ULONG GTLB_Enable:1;
    531   ULONG AP_Enable:1;
    532   ULONG CAL_Disable:1;
    533   ULONG Rsvd2:22;
    534 } PCI_AGP_CONTROL, *PPCI_AGP_CONTROL;
    535 
    536 typedef struct _PCI_AGP_APERTURE_PAGE_SIZE {
    537   USHORT PageSizeMask:11;
    538   USHORT Rsvd1:1;
    539   USHORT PageSizeSelect:4;
    540 } PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE;
    541 
    542 typedef struct _PCI_AGP_ISOCH_COMMAND {
    543   USHORT Rsvd1:6;
    544   USHORT Isoch_Y:2;
    545   USHORT Isoch_N:8;
    546 } PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND;
    547 
    548 typedef struct PCI_AGP_EXTENDED_CAPABILITY {
    549   PCI_AGP_ISOCH_STATUS IsochStatus;
    550   PCI_AGP_CONTROL AgpControl;
    551   USHORT ApertureSize;
    552   PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize;
    553   ULONG GartLow;
    554   ULONG GartHigh;
    555   PCI_AGP_ISOCH_COMMAND IsochCommand;
    556 } PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY;
    557 
    558 #define PCI_AGP_RATE_1X     0x1
    559 #define PCI_AGP_RATE_2X     0x2
    560 #define PCI_AGP_RATE_4X     0x4
    561 
    562 #define PCIX_MODE_CONVENTIONAL_PCI  0x0
    563 #define PCIX_MODE1_66MHZ            0x1
    564 #define PCIX_MODE1_100MHZ           0x2
    565 #define PCIX_MODE1_133MHZ           0x3
    566 #define PCIX_MODE2_266_66MHZ        0x9
    567 #define PCIX_MODE2_266_100MHZ       0xA
    568 #define PCIX_MODE2_266_133MHZ       0xB
    569 #define PCIX_MODE2_533_66MHZ        0xD
    570 #define PCIX_MODE2_533_100MHZ       0xE
    571 #define PCIX_MODE2_533_133MHZ       0xF
    572 
    573 #define PCIX_VERSION_MODE1_ONLY     0x0
    574 #define PCIX_VERSION_MODE2_ECC      0x1
    575 #define PCIX_VERSION_DUAL_MODE_ECC  0x2
    576 
    577 typedef struct _PCIX_BRIDGE_CAPABILITY {
    578   PCI_CAPABILITIES_HEADER Header;
    579   union {
    580     _ANONYMOUS_STRUCT struct {
    581       USHORT Bus64Bit:1;
    582       USHORT Bus133MHzCapable:1;
    583       USHORT SplitCompletionDiscarded:1;
    584       USHORT UnexpectedSplitCompletion:1;
    585       USHORT SplitCompletionOverrun:1;
    586       USHORT SplitRequestDelayed:1;
    587       USHORT BusModeFrequency:4;
    588       USHORT Rsvd:2;
    589       USHORT Version:2;
    590       USHORT Bus266MHzCapable:1;
    591       USHORT Bus533MHzCapable:1;
    592     } DUMMYSTRUCTNAME;
    593   USHORT AsUSHORT;
    594   } SecondaryStatus;
    595   union {
    596     _ANONYMOUS_STRUCT struct {
    597       ULONG FunctionNumber:3;
    598       ULONG DeviceNumber:5;
    599       ULONG BusNumber:8;
    600       ULONG Device64Bit:1;
    601       ULONG Device133MHzCapable:1;
    602       ULONG SplitCompletionDiscarded:1;
    603       ULONG UnexpectedSplitCompletion:1;
    604       ULONG SplitCompletionOverrun:1;
    605       ULONG SplitRequestDelayed:1;
    606       ULONG Rsvd:7;
    607       ULONG DIMCapable:1;
    608       ULONG Device266MHzCapable:1;
    609       ULONG Device533MHzCapable:1;
    610     } DUMMYSTRUCTNAME;
    611     ULONG AsULONG;
    612   } BridgeStatus;
    613   USHORT UpstreamSplitTransactionCapacity;
    614   USHORT UpstreamSplitTransactionLimit;
    615   USHORT DownstreamSplitTransactionCapacity;
    616   USHORT DownstreamSplitTransactionLimit;
    617   union {
    618     _ANONYMOUS_STRUCT struct {
    619       ULONG SelectSecondaryRegisters:1;
    620       ULONG ErrorPresentInOtherBank:1;
    621       ULONG AdditionalCorrectableError:1;
    622       ULONG AdditionalUncorrectableError:1;
    623       ULONG ErrorPhase:3;
    624       ULONG ErrorCorrected:1;
    625       ULONG Syndrome:8;
    626       ULONG ErrorFirstCommand:4;
    627       ULONG ErrorSecondCommand:4;
    628       ULONG ErrorUpperAttributes:4;
    629       ULONG ControlUpdateEnable:1;
    630       ULONG Rsvd:1;
    631       ULONG DisableSingleBitCorrection:1;
    632       ULONG EccMode:1;
    633     } DUMMYSTRUCTNAME;
    634   ULONG AsULONG;
    635   } EccControlStatus;
    636   ULONG EccFirstAddress;
    637   ULONG EccSecondAddress;
    638   ULONG EccAttribute;
    639 } PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY;
    640 
    641 typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY {
    642   PCI_CAPABILITIES_HEADER Header;
    643   USHORT Reserved;
    644   USHORT SubVendorID;
    645   USHORT SubSystemID;
    646 } PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY;
    647 
    648 #define OSC_FIRMWARE_FAILURE                            0x02
    649 #define OSC_UNRECOGNIZED_UUID                           0x04
    650 #define OSC_UNRECOGNIZED_REVISION                       0x08
    651 #define OSC_CAPABILITIES_MASKED                         0x10
    652 
    653 #define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION     0x01
    654 
    655 typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
    656   union {
    657     _ANONYMOUS_STRUCT struct {
    658       ULONG ExtendedConfigOpRegions:1;
    659       ULONG ActiveStatePowerManagement:1;
    660       ULONG ClockPowerManagement:1;
    661       ULONG SegmentGroups:1;
    662       ULONG MessageSignaledInterrupts:1;
    663       ULONG WindowsHardwareErrorArchitecture:1;
    664       ULONG Reserved:26;
    665     } DUMMYSTRUCTNAME;
    666     ULONG AsULONG;
    667   } u;
    668 } PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD;
    669 
    670 typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD {
    671   union {
    672     _ANONYMOUS_STRUCT struct {
    673       ULONG ExpressNativeHotPlug:1;
    674       ULONG ShpcNativeHotPlug:1;
    675       ULONG ExpressNativePME:1;
    676       ULONG ExpressAdvancedErrorReporting:1;
    677       ULONG ExpressCapabilityStructure:1;
    678       ULONG Reserved:27;
    679     } DUMMYSTRUCTNAME;
    680   ULONG AsULONG;
    681   } u;
    682 } PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD;
    683 
    684 typedef enum _PCI_HARDWARE_INTERFACE {
    685   PciConventional,
    686   PciXMode1,
    687   PciXMode2,
    688   PciExpress
    689 } PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE;
    690 
    691 typedef enum {
    692   BusWidth32Bits,
    693   BusWidth64Bits
    694 } PCI_BUS_WIDTH;
    695 
    696 typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
    697   PCI_HARDWARE_INTERFACE SecondaryInterface;
    698   _ANONYMOUS_STRUCT struct {
    699     BOOLEAN BusCapabilitiesFound;
    700     ULONG CurrentSpeedAndMode;
    701     ULONG SupportedSpeedsAndModes;
    702     BOOLEAN DeviceIDMessagingCapable;
    703     PCI_BUS_WIDTH SecondaryBusWidth;
    704   } DUMMYSTRUCTNAME;
    705   PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport;
    706   PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest;
    707   PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted;
    708 } PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY;
    709 
    710 typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
    711   _ANONYMOUS_STRUCT struct {
    712     USHORT CapabilityVersion:4;
    713     USHORT DeviceType:4;
    714     USHORT SlotImplemented:1;
    715     USHORT InterruptMessageNumber:5;
    716     USHORT Rsvd:2;
    717   } DUMMYSTRUCTNAME;
    718   USHORT AsUSHORT;
    719 } PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER;
    720 
    721 typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
    722   _ANONYMOUS_STRUCT struct {
    723     ULONG MaxPayloadSizeSupported:3;
    724     ULONG PhantomFunctionsSupported:2;
    725     ULONG ExtendedTagSupported:1;
    726     ULONG L0sAcceptableLatency:3;
    727     ULONG L1AcceptableLatency:3;
    728     ULONG Undefined:3;
    729     ULONG RoleBasedErrorReporting:1;
    730     ULONG Rsvd1:2;
    731     ULONG CapturedSlotPowerLimit:8;
    732     ULONG CapturedSlotPowerLimitScale:2;
    733     ULONG Rsvd2:4;
    734   } DUMMYSTRUCTNAME;
    735   ULONG AsULONG;
    736 } PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER;
    737 
    738 #define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07;
    739 
    740 typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
    741   _ANONYMOUS_STRUCT struct {
    742     USHORT CorrectableErrorEnable:1;
    743     USHORT NonFatalErrorEnable:1;
    744     USHORT FatalErrorEnable:1;
    745     USHORT UnsupportedRequestErrorEnable:1;
    746     USHORT EnableRelaxedOrder:1;
    747     USHORT MaxPayloadSize:3;
    748     USHORT ExtendedTagEnable:1;
    749     USHORT PhantomFunctionsEnable:1;
    750     USHORT AuxPowerEnable:1;
    751     USHORT NoSnoopEnable:1;
    752     USHORT MaxReadRequestSize:3;
    753     USHORT BridgeConfigRetryEnable:1;
    754   } DUMMYSTRUCTNAME;
    755   USHORT AsUSHORT;
    756 } PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER;
    757 
    758 #define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F;
    759 
    760 typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
    761   _ANONYMOUS_STRUCT struct {
    762     USHORT CorrectableErrorDetected:1;
    763     USHORT NonFatalErrorDetected:1;
    764     USHORT FatalErrorDetected:1;
    765     USHORT UnsupportedRequestDetected:1;
    766     USHORT AuxPowerDetected:1;
    767     USHORT TransactionsPending:1;
    768     USHORT Rsvd:10;
    769   } DUMMYSTRUCTNAME;
    770   USHORT AsUSHORT;
    771 } PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER;
    772 
    773 typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
    774   _ANONYMOUS_STRUCT struct {
    775     ULONG MaximumLinkSpeed:4;
    776     ULONG MaximumLinkWidth:6;
    777     ULONG ActiveStatePMSupport:2;
    778     ULONG L0sExitLatency:3;
    779     ULONG L1ExitLatency:3;
    780     ULONG ClockPowerManagement:1;
    781     ULONG SurpriseDownErrorReportingCapable:1;
    782     ULONG DataLinkLayerActiveReportingCapable:1;
    783     ULONG Rsvd:3;
    784     ULONG PortNumber:8;
    785   } DUMMYSTRUCTNAME;
    786   ULONG AsULONG;
    787 } PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER;
    788 
    789 typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
    790   _ANONYMOUS_STRUCT struct {
    791     USHORT ActiveStatePMControl:2;
    792     USHORT Rsvd1:1;
    793     USHORT ReadCompletionBoundary:1;
    794     USHORT LinkDisable:1;
    795     USHORT RetrainLink:1;
    796     USHORT CommonClockConfig:1;
    797     USHORT ExtendedSynch:1;
    798     USHORT EnableClockPowerManagement:1;
    799     USHORT Rsvd2:7;
    800   } DUMMYSTRUCTNAME;
    801   USHORT AsUSHORT;
    802 } PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER;
    803 
    804 typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
    805   _ANONYMOUS_STRUCT struct {
    806     USHORT LinkSpeed:4;
    807     USHORT LinkWidth:6;
    808     USHORT Undefined:1;
    809     USHORT LinkTraining:1;
    810     USHORT SlotClockConfig:1;
    811     USHORT DataLinkLayerActive:1;
    812     USHORT Rsvd:2;
    813   } DUMMYSTRUCTNAME;
    814   USHORT AsUSHORT;
    815 } PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER;
    816 
    817 typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
    818   _ANONYMOUS_STRUCT struct {
    819     ULONG AttentionButtonPresent:1;
    820     ULONG PowerControllerPresent:1;
    821     ULONG MRLSensorPresent:1;
    822     ULONG AttentionIndicatorPresent:1;
    823     ULONG PowerIndicatorPresent:1;
    824     ULONG HotPlugSurprise:1;
    825     ULONG HotPlugCapable:1;
    826     ULONG SlotPowerLimit:8;
    827     ULONG SlotPowerLimitScale:2;
    828     ULONG ElectromechanicalLockPresent:1;
    829     ULONG NoCommandCompletedSupport:1;
    830     ULONG PhysicalSlotNumber:13;
    831   } DUMMYSTRUCTNAME;
    832   ULONG AsULONG;
    833 } PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER;
    834 
    835 typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
    836   _ANONYMOUS_STRUCT struct {
    837     USHORT AttentionButtonEnable:1;
    838     USHORT PowerFaultDetectEnable:1;
    839     USHORT MRLSensorEnable:1;
    840     USHORT PresenceDetectEnable:1;
    841     USHORT CommandCompletedEnable:1;
    842     USHORT HotPlugInterruptEnable:1;
    843     USHORT AttentionIndicatorControl:2;
    844     USHORT PowerIndicatorControl:2;
    845     USHORT PowerControllerControl:1;
    846     USHORT ElectromechanicalLockControl:1;
    847     USHORT DataLinkStateChangeEnable:1;
    848     USHORT Rsvd:3;
    849   } DUMMYSTRUCTNAME;
    850   USHORT AsUSHORT;
    851 } PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER;
    852 
    853 typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER {
    854   _ANONYMOUS_STRUCT struct {
    855     USHORT AttentionButtonPressed:1;
    856     USHORT PowerFaultDetected:1;
    857     USHORT MRLSensorChanged:1;
    858     USHORT PresenceDetectChanged:1;
    859     USHORT CommandCompleted:1;
    860     USHORT MRLSensorState:1;
    861     USHORT PresenceDetectState:1;
    862     USHORT ElectromechanicalLockEngaged:1;
    863     USHORT DataLinkStateChanged:1;
    864     USHORT Rsvd:7;
    865   } DUMMYSTRUCTNAME;
    866   USHORT AsUSHORT;
    867 } PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER;
    868 
    869 typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER {
    870   _ANONYMOUS_STRUCT struct {
    871     USHORT CorrectableSerrEnable:1;
    872     USHORT NonFatalSerrEnable:1;
    873     USHORT FatalSerrEnable:1;
    874     USHORT PMEInterruptEnable:1;
    875     USHORT CRSSoftwareVisibilityEnable:1;
    876     USHORT Rsvd:11;
    877   } DUMMYSTRUCTNAME;
    878   USHORT AsUSHORT;
    879 } PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER;
    880 
    881 typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER {
    882   _ANONYMOUS_STRUCT struct {
    883     USHORT CRSSoftwareVisibility:1;
    884     USHORT Rsvd:15;
    885   } DUMMYSTRUCTNAME;
    886   USHORT AsUSHORT;
    887 } PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER;
    888 
    889 typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER {
    890   _ANONYMOUS_STRUCT struct {
    891     ULONG PMERequestorId:16;
    892     ULONG PMEStatus:1;
    893     ULONG PMEPending:1;
    894     ULONG Rsvd:14;
    895   } DUMMYSTRUCTNAME;
    896   ULONG AsULONG;
    897 } PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER;
    898 
    899 typedef struct _PCI_EXPRESS_CAPABILITY {
    900   PCI_CAPABILITIES_HEADER Header;
    901   PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities;
    902   PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities;
    903   PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl;
    904   PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus;
    905   PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities;
    906   PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl;
    907   PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus;
    908   PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities;
    909   PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl;
    910   PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus;
    911   PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl;
    912   PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities;
    913   PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus;
    914 } PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY;
    915 
    916 typedef enum {
    917   MRLClosed = 0,
    918   MRLOpen
    919 } PCI_EXPRESS_MRL_STATE;
    920 
    921 typedef enum {
    922   SlotEmpty = 0,
    923   CardPresent
    924 } PCI_EXPRESS_CARD_PRESENCE;
    925 
    926 typedef enum {
    927   IndicatorOn = 1,
    928   IndicatorBlink,
    929   IndicatorOff
    930 } PCI_EXPRESS_INDICATOR_STATE;
    931 
    932 typedef enum {
    933   PowerOn = 0,
    934   PowerOff
    935 } PCI_EXPRESS_POWER_STATE;
    936 
    937 typedef enum {
    938   L0sEntrySupport = 1,
    939   L0sAndL1EntrySupport = 3
    940 } PCI_EXPRESS_ASPM_SUPPORT;
    941 
    942 typedef enum {
    943   L0sAndL1EntryDisabled,
    944   L0sEntryEnabled,
    945   L1EntryEnabled,
    946   L0sAndL1EntryEnabled
    947 } PCI_EXPRESS_ASPM_CONTROL;
    948 
    949 typedef enum {
    950   L0s_Below64ns = 0,
    951   L0s_64ns_128ns,
    952   L0s_128ns_256ns,
    953   L0s_256ns_512ns,
    954   L0s_512ns_1us,
    955   L0s_1us_2us,
    956   L0s_2us_4us,
    957   L0s_Above4us
    958 } PCI_EXPRESS_L0s_EXIT_LATENCY;
    959 
    960 typedef enum {
    961   L1_Below1us = 0,
    962   L1_1us_2us,
    963   L1_2us_4us,
    964   L1_4us_8us,
    965   L1_8us_16us,
    966   L1_16us_32us,
    967   L1_32us_64us,
    968   L1_Above64us
    969 } PCI_EXPRESS_L1_EXIT_LATENCY;
    970 
    971 typedef enum {
    972   PciExpressEndpoint = 0,
    973   PciExpressLegacyEndpoint,
    974   PciExpressRootPort = 4,
    975   PciExpressUpstreamSwitchPort,
    976   PciExpressDownstreamSwitchPort,
    977   PciExpressToPciXBridge,
    978   PciXToExpressBridge,
    979   PciExpressRootComplexIntegratedEndpoint,
    980   PciExpressRootComplexEventCollector
    981 } PCI_EXPRESS_DEVICE_TYPE;
    982 
    983 typedef enum {
    984   MaxPayload128Bytes = 0,
    985   MaxPayload256Bytes,
    986   MaxPayload512Bytes,
    987   MaxPayload1024Bytes,
    988   MaxPayload2048Bytes,
    989   MaxPayload4096Bytes
    990 } PCI_EXPRESS_MAX_PAYLOAD_SIZE;
    991 
    992 typedef union _PCI_EXPRESS_PME_REQUESTOR_ID {
    993   _ANONYMOUS_STRUCT struct {
    994     USHORT FunctionNumber:3;
    995     USHORT DeviceNumber:5;
    996     USHORT BusNumber:8;
    997   } DUMMYSTRUCTNAME;
    998   USHORT AsUSHORT;
    999 } PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID;
   1000 
   1001 typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE {
   1002   ResourceTypeSingle = 0,
   1003   ResourceTypeRange,
   1004   ResourceTypeExtendedCounterConfiguration,
   1005   ResourceTypeOverflow,
   1006   ResourceTypeMax
   1007 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE;
   1008 
   1009 typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR {
   1010   PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type;
   1011   ULONG Flags;
   1012   union {
   1013     ULONG CounterIndex;
   1014     ULONG ExtendedRegisterAddress;
   1015     struct {
   1016       ULONG Begin;
   1017       ULONG End;
   1018     } Range;
   1019   } u;
   1020 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR;
   1021 
   1022 typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST {
   1023   ULONG Count;
   1024   PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY];
   1025 } PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST;
   1026 
   1027 typedef VOID
   1028 (NTAPI *PciPin2Line)(
   1029   IN struct _BUS_HANDLER *BusHandler,
   1030   IN struct _BUS_HANDLER *RootHandler,
   1031   IN PCI_SLOT_NUMBER SlotNumber,
   1032   IN PPCI_COMMON_CONFIG PciData);
   1033 
   1034 typedef VOID
   1035 (NTAPI *PciLine2Pin)(
   1036   IN struct _BUS_HANDLER *BusHandler,
   1037   IN struct _BUS_HANDLER *RootHandler,
   1038   IN PCI_SLOT_NUMBER SlotNumber,
   1039   IN PPCI_COMMON_CONFIG PciNewData,
   1040   IN PPCI_COMMON_CONFIG PciOldData);
   1041 
   1042 typedef VOID
   1043 (NTAPI *PciReadWriteConfig)(
   1044   IN struct _BUS_HANDLER *BusHandler,
   1045   IN PCI_SLOT_NUMBER Slot,
   1046   IN PVOID Buffer,
   1047   IN ULONG Offset,
   1048   IN ULONG Length);
   1049 
   1050 #define PCI_DATA_TAG ' ICP'
   1051 #define PCI_DATA_VERSION 1
   1052 
   1053 typedef struct _PCIBUSDATA {
   1054   ULONG Tag;
   1055   ULONG Version;
   1056   PciReadWriteConfig ReadConfig;
   1057   PciReadWriteConfig WriteConfig;
   1058   PciPin2Line Pin2Line;
   1059   PciLine2Pin Line2Pin;
   1060   PCI_SLOT_NUMBER ParentSlot;
   1061   PVOID Reserved[4];
   1062 } PCIBUSDATA, *PPCIBUSDATA;
   1063 
   1064 #ifndef _PCIINTRF_X_
   1065 #define _PCIINTRF_X_
   1066 
   1067 typedef ULONG
   1068 (NTAPI *PCI_READ_WRITE_CONFIG)(
   1069   IN PVOID Context,
   1070   IN ULONG BusOffset,
   1071   IN ULONG Slot,
   1072   IN PVOID Buffer,
   1073   IN ULONG Offset,
   1074   IN ULONG Length);
   1075 
   1076 typedef VOID
   1077 (NTAPI *PCI_PIN_TO_LINE)(
   1078   IN PVOID Context,
   1079   IN PPCI_COMMON_CONFIG PciData);
   1080 
   1081 typedef VOID
   1082 (NTAPI *PCI_LINE_TO_PIN)(
   1083   IN PVOID Context,
   1084   IN PPCI_COMMON_CONFIG PciNewData,
   1085   IN PPCI_COMMON_CONFIG PciOldData);
   1086 
   1087 typedef VOID
   1088 (NTAPI *PCI_ROOT_BUS_CAPABILITY)(
   1089   IN PVOID Context,
   1090   OUT PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability);
   1091 
   1092 typedef VOID
   1093 (NTAPI *PCI_EXPRESS_WAKE_CONTROL)(
   1094   IN PVOID Context,
   1095   IN BOOLEAN EnableWake);
   1096 
   1097 typedef struct _PCI_BUS_INTERFACE_STANDARD {
   1098   USHORT Size;
   1099   USHORT Version;
   1100   PVOID Context;
   1101   PINTERFACE_REFERENCE InterfaceReference;
   1102   PINTERFACE_DEREFERENCE InterfaceDereference;
   1103   PCI_READ_WRITE_CONFIG ReadConfig;
   1104   PCI_READ_WRITE_CONFIG WriteConfig;
   1105   PCI_PIN_TO_LINE PinToLine;
   1106   PCI_LINE_TO_PIN LineToPin;
   1107   PCI_ROOT_BUS_CAPABILITY RootBusCapability;
   1108   PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl;
   1109 } PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD;
   1110 
   1111 #define PCI_BUS_INTERFACE_STANDARD_VERSION 1
   1112 
   1113 #endif /* _PCIINTRF_X_ */
   1114 
   1115 #if (NTDDI_VERSION >= NTDDI_WIN7)
   1116 
   1117 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX     0x00004000
   1118 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX    0x00008000
   1119 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \
   1120   (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \
   1121    FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX)
   1122 
   1123 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200
   1124 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300
   1125 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300
   1126 
   1127 #else
   1128 
   1129 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL     0x00000200
   1130 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL    0x00000300
   1131 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK        0x00000300
   1132 
   1133 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL
   1134 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL
   1135 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK
   1136 
   1137 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   1138 
   1139 #define FILE_CHARACTERISTICS_PROPAGATED (FILE_REMOVABLE_MEDIA  | \
   1140                                          FILE_READ_ONLY_DEVICE | \
   1141                                          FILE_FLOPPY_DISKETTE  | \
   1142                                          FILE_WRITE_ONCE_MEDIA | \
   1143                                          FILE_DEVICE_SECURE_OPEN)
   1144 
   1145 typedef struct _FILE_ALIGNMENT_INFORMATION {
   1146   ULONG AlignmentRequirement;
   1147 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
   1148 
   1149 typedef struct _FILE_NAME_INFORMATION {
   1150   ULONG FileNameLength;
   1151   WCHAR FileName[1];
   1152 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
   1153 
   1154 
   1155 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
   1156   ULONG FileAttributes;
   1157   ULONG ReparseTag;
   1158 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
   1159 
   1160 typedef struct _FILE_DISPOSITION_INFORMATION {
   1161   BOOLEAN DeleteFile;
   1162 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
   1163 
   1164 typedef struct _FILE_END_OF_FILE_INFORMATION {
   1165   LARGE_INTEGER EndOfFile;
   1166 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
   1167 
   1168 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
   1169   LARGE_INTEGER ValidDataLength;
   1170 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
   1171 
   1172 typedef struct _FILE_FS_LABEL_INFORMATION {
   1173   ULONG VolumeLabelLength;
   1174   WCHAR VolumeLabel[1];
   1175 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
   1176 
   1177 typedef struct _FILE_FS_VOLUME_INFORMATION {
   1178   LARGE_INTEGER VolumeCreationTime;
   1179   ULONG VolumeSerialNumber;
   1180   ULONG VolumeLabelLength;
   1181   BOOLEAN SupportsObjects;
   1182   WCHAR VolumeLabel[1];
   1183 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
   1184 
   1185 typedef struct _FILE_FS_SIZE_INFORMATION {
   1186   LARGE_INTEGER TotalAllocationUnits;
   1187   LARGE_INTEGER AvailableAllocationUnits;
   1188   ULONG SectorsPerAllocationUnit;
   1189   ULONG BytesPerSector;
   1190 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
   1191 
   1192 typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
   1193   LARGE_INTEGER TotalAllocationUnits;
   1194   LARGE_INTEGER CallerAvailableAllocationUnits;
   1195   LARGE_INTEGER ActualAvailableAllocationUnits;
   1196   ULONG SectorsPerAllocationUnit;
   1197   ULONG BytesPerSector;
   1198 } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
   1199 
   1200 typedef struct _FILE_FS_OBJECTID_INFORMATION {
   1201   UCHAR ObjectId[16];
   1202   UCHAR ExtendedInfo[48];
   1203 } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
   1204 
   1205 typedef union _FILE_SEGMENT_ELEMENT {
   1206   PVOID64 Buffer;
   1207   ULONGLONG Alignment;
   1208 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
   1209 
   1210 #define IOCTL_AVIO_ALLOCATE_STREAM      CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   1211 #define IOCTL_AVIO_FREE_STREAM          CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   1212 #define IOCTL_AVIO_MODIFY_STREAM        CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
   1213 
   1214 typedef enum _BUS_DATA_TYPE {
   1215   ConfigurationSpaceUndefined = -1,
   1216   Cmos,
   1217   EisaConfiguration,
   1218   Pos,
   1219   CbusConfiguration,
   1220   PCIConfiguration,
   1221   VMEConfiguration,
   1222   NuBusConfiguration,
   1223   PCMCIAConfiguration,
   1224   MPIConfiguration,
   1225   MPSAConfiguration,
   1226   PNPISAConfiguration,
   1227   SgiInternalConfiguration,
   1228   MaximumBusDataType
   1229 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
   1230 
   1231 /* Some Server 2003 DDK definitions */
   1232 #define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
   1233 
   1234 typedef NTSTATUS
   1235 (NTAPI *PLEGACY_DEVICE_DETECTION_HANDLER)(
   1236   IN PVOID Context,
   1237   IN INTERFACE_TYPE LegacyBusType,
   1238   IN ULONG BusNumber,
   1239   IN ULONG SlotNumber,
   1240   OUT PDEVICE_OBJECT *PhysicalDeviceObject);
   1241 
   1242 typedef struct _ROUTING_TOKEN {
   1243   PVOID LinkNode;
   1244   ULONG StaticVector;
   1245   UCHAR Flags;
   1246 } ROUTING_TOKEN, *PROUTING_TOKEN;
   1247 
   1248 typedef NTSTATUS
   1249 (NTAPI *PGET_INTERRUPT_ROUTING)(
   1250   IN PDEVICE_OBJECT Pdo,
   1251   OUT ULONG *Bus,
   1252   OUT ULONG *PciSlot,
   1253   OUT UCHAR *InterruptLine,
   1254   OUT UCHAR *InterruptPin,
   1255   OUT UCHAR *ClassCode,
   1256   OUT UCHAR *SubClassCode,
   1257   OUT PDEVICE_OBJECT *ParentPdo,
   1258   OUT ROUTING_TOKEN *RoutingToken,
   1259   OUT UCHAR *Flags);
   1260 
   1261 typedef NTSTATUS
   1262 (NTAPI *PSET_INTERRUPT_ROUTING_TOKEN)(
   1263   IN PDEVICE_OBJECT Pdo,
   1264   IN PROUTING_TOKEN RoutingToken);
   1265 
   1266 typedef VOID
   1267 (NTAPI *PUPDATE_INTERRUPT_LINE)(
   1268   IN PDEVICE_OBJECT Pdo,
   1269   IN UCHAR LineRegister);
   1270 
   1271 typedef struct _INT_ROUTE_INTERFACE_STANDARD {
   1272   USHORT Size;
   1273   USHORT Version;
   1274   PVOID Context;
   1275   PINTERFACE_REFERENCE InterfaceReference;
   1276   PINTERFACE_DEREFERENCE InterfaceDereference;
   1277   PGET_INTERRUPT_ROUTING GetInterruptRouting;
   1278   PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
   1279   PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
   1280 } INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
   1281 
   1282 typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
   1283   USHORT Size;
   1284   USHORT Version;
   1285   PVOID Context;
   1286   PINTERFACE_REFERENCE InterfaceReference;
   1287   PINTERFACE_DEREFERENCE InterfaceDereference;
   1288   PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
   1289 } LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
   1290 
   1291 /* FIXME : These definitions don't exist in public headers */
   1292 
   1293 #define PCI_CB_INTRF_VERSION             1
   1294 #define PCI_PME_INTRF_STANDARD_VER       1
   1295 #define PNP_LOCATION_INTERFACE_VERSION   1
   1296 
   1297 DEFINE_GUID(GUID_PCI_CARDBUS_INTERFACE_PRIVATE, 0xcca82f31, 0x54d6, 0x11d1, 0x82, 0x24, 0x00, 0xa0, 0xc9, 0x32, 0x43, 0x85);
   1298 DEFINE_GUID(GUID_PCI_PME_INTERFACE, 0xaac7e6ac, 0xbb0b, 0x11d2, 0xb4, 0x84, 0x00, 0xc0, 0x4f, 0x72, 0xde, 0x8b);
   1299 
   1300 typedef NTSTATUS
   1301 (NTAPI *PCARDBUSADD)(
   1302   IN PDEVICE_OBJECT DeviceObject,
   1303   IN OUT PVOID *DeviceContext);
   1304 
   1305 typedef NTSTATUS
   1306 (NTAPI *PCARDBUSDELETE)(
   1307   IN PVOID DeviceContext);
   1308 
   1309 typedef NTSTATUS
   1310 (NTAPI *PCARDBUSPCIDISPATCH)(
   1311   IN PVOID DeviceContext,
   1312   IN PIRP Irp);
   1313 
   1314 typedef VOID
   1315 (NTAPI *PPME_SET_PME_ENABLE)(
   1316   IN PDEVICE_OBJECT Pdo,
   1317   IN BOOLEAN PmeEnable);
   1318 
   1319 typedef VOID
   1320 (NTAPI *PPME_CLEAR_PME_STATUS)(
   1321   IN PDEVICE_OBJECT Pdo);
   1322 
   1323 typedef VOID
   1324 (NTAPI *PPME_GET_INFORMATION)(
   1325   IN PDEVICE_OBJECT Pdo,
   1326   OUT PBOOLEAN PmeCapable,
   1327   OUT PBOOLEAN PmeStatus,
   1328   OUT PBOOLEAN PmeEnable);
   1329 
   1330 typedef struct _PCI_CARDBUS_INTERFACE_PRIVATE {
   1331   USHORT Size;
   1332   USHORT Version;
   1333   PVOID Context;
   1334   PINTERFACE_REFERENCE InterfaceReference;
   1335   PINTERFACE_DEREFERENCE InterfaceDereference;
   1336   PDRIVER_OBJECT DriverObject;
   1337   PCARDBUSADD AddCardBus;
   1338   PCARDBUSDELETE DeleteCardBus;
   1339   PCARDBUSPCIDISPATCH DispatchPnp;
   1340 } PCI_CARDBUS_INTERFACE_PRIVATE, *PPCI_CARDBUS_INTERFACE_PRIVATE;
   1341 
   1342 typedef struct _PCI_PME_INTERFACE {
   1343   USHORT Size;
   1344   USHORT Version;
   1345   PVOID Context;
   1346   PINTERFACE_REFERENCE InterfaceReference;
   1347   PINTERFACE_DEREFERENCE InterfaceDereference;
   1348   PPME_GET_INFORMATION GetPmeInformation;
   1349   PPME_CLEAR_PME_STATUS ClearPmeStatus;
   1350   PPME_SET_PME_ENABLE UpdateEnable;
   1351 } PCI_PME_INTERFACE, *PPCI_PME_INTERFACE;
   1352 
   1353 /* Hardware Abstraction Layer Types */
   1354 
   1355 typedef BOOLEAN
   1356 (NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
   1357   IN ULONG Columns,
   1358   IN ULONG Rows);
   1359 
   1360 typedef PBUS_HANDLER
   1361 (FASTCALL *pHalHandlerForBus)(
   1362   IN INTERFACE_TYPE InterfaceType,
   1363   IN ULONG BusNumber);
   1364 
   1365 typedef VOID
   1366 (FASTCALL *pHalReferenceBusHandler)(
   1367   IN PBUS_HANDLER BusHandler);
   1368 
   1369 typedef enum _HAL_QUERY_INFORMATION_CLASS {
   1370   HalInstalledBusInformation,
   1371   HalProfileSourceInformation,
   1372   HalInformationClassUnused1,
   1373   HalPowerInformation,
   1374   HalProcessorSpeedInformation,
   1375   HalCallbackInformation,
   1376   HalMapRegisterInformation,
   1377   HalMcaLogInformation,
   1378   HalFrameBufferCachingInformation,
   1379   HalDisplayBiosInformation,
   1380   HalProcessorFeatureInformation,
   1381   HalNumaTopologyInterface,
   1382   HalErrorInformation,
   1383   HalCmcLogInformation,
   1384   HalCpeLogInformation,
   1385   HalQueryMcaInterface,
   1386   HalQueryAMLIIllegalIOPortAddresses,
   1387   HalQueryMaxHotPlugMemoryAddress,
   1388   HalPartitionIpiInterface,
   1389   HalPlatformInformation,
   1390   HalQueryProfileSourceList,
   1391   HalInitLogInformation,
   1392   HalFrequencyInformation,
   1393   HalProcessorBrandString,
   1394   HalHypervisorInformation,
   1395   HalPlatformTimerInformation,
   1396   HalAcpiAuditInformation
   1397 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
   1398 
   1399 typedef enum _HAL_SET_INFORMATION_CLASS {
   1400   HalProfileSourceInterval,
   1401   HalProfileSourceInterruptHandler,
   1402   HalMcaRegisterDriver,
   1403   HalKernelErrorHandler,
   1404   HalCmcRegisterDriver,
   1405   HalCpeRegisterDriver,
   1406   HalMcaLog,
   1407   HalCmcLog,
   1408   HalCpeLog,
   1409   HalGenerateCmcInterrupt,
   1410   HalProfileSourceTimerHandler,
   1411   HalEnlightenment,
   1412   HalProfileDpgoSourceInterruptHandler
   1413 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
   1414 
   1415 typedef NTSTATUS
   1416 (NTAPI *pHalQuerySystemInformation)(
   1417   IN HAL_QUERY_INFORMATION_CLASS InformationClass,
   1418   IN ULONG BufferSize,
   1419   IN OUT PVOID Buffer,
   1420   OUT PULONG ReturnedLength);
   1421 
   1422 typedef NTSTATUS
   1423 (NTAPI *pHalSetSystemInformation)(
   1424   IN HAL_SET_INFORMATION_CLASS InformationClass,
   1425   IN ULONG BufferSize,
   1426   IN PVOID Buffer);
   1427 
   1428 typedef VOID
   1429 (FASTCALL *pHalExamineMBR)(
   1430   IN PDEVICE_OBJECT DeviceObject,
   1431   IN ULONG SectorSize,
   1432   IN ULONG MBRTypeIdentifier,
   1433   OUT PVOID *Buffer);
   1434 
   1435 typedef NTSTATUS
   1436 (FASTCALL *pHalIoReadPartitionTable)(
   1437   IN PDEVICE_OBJECT DeviceObject,
   1438   IN ULONG SectorSize,
   1439   IN BOOLEAN ReturnRecognizedPartitions,
   1440   OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
   1441 
   1442 typedef NTSTATUS
   1443 (FASTCALL *pHalIoSetPartitionInformation)(
   1444   IN PDEVICE_OBJECT DeviceObject,
   1445   IN ULONG SectorSize,
   1446   IN ULONG PartitionNumber,
   1447   IN ULONG PartitionType);
   1448 
   1449 typedef NTSTATUS
   1450 (FASTCALL *pHalIoWritePartitionTable)(
   1451   IN PDEVICE_OBJECT DeviceObject,
   1452   IN ULONG SectorSize,
   1453   IN ULONG SectorsPerTrack,
   1454   IN ULONG NumberOfHeads,
   1455   IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
   1456 
   1457 typedef NTSTATUS
   1458 (NTAPI *pHalQueryBusSlots)(
   1459   IN PBUS_HANDLER BusHandler,
   1460   IN ULONG BufferSize,
   1461   OUT PULONG SlotNumbers,
   1462   OUT PULONG ReturnedLength);
   1463 
   1464 typedef NTSTATUS
   1465 (NTAPI *pHalInitPnpDriver)(
   1466   VOID);
   1467 
   1468 typedef struct _PM_DISPATCH_TABLE {
   1469   ULONG Signature;
   1470   ULONG Version;
   1471   PVOID Function[1];
   1472 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
   1473 
   1474 typedef NTSTATUS
   1475 (NTAPI *pHalInitPowerManagement)(
   1476   IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
   1477   OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
   1478 
   1479 typedef struct _DMA_ADAPTER*
   1480 (NTAPI *pHalGetDmaAdapter)(
   1481   IN PVOID Context,
   1482   IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
   1483   OUT PULONG NumberOfMapRegisters);
   1484 
   1485 typedef NTSTATUS
   1486 (NTAPI *pHalGetInterruptTranslator)(
   1487   IN INTERFACE_TYPE ParentInterfaceType,
   1488   IN ULONG ParentBusNumber,
   1489   IN INTERFACE_TYPE BridgeInterfaceType,
   1490   IN USHORT Size,
   1491   IN USHORT Version,
   1492   OUT PTRANSLATOR_INTERFACE Translator,
   1493   OUT PULONG BridgeBusNumber);
   1494 
   1495 typedef NTSTATUS
   1496 (NTAPI *pHalStartMirroring)(
   1497   VOID);
   1498 
   1499 typedef NTSTATUS
   1500 (NTAPI *pHalEndMirroring)(
   1501   IN ULONG PassNumber);
   1502 
   1503 typedef NTSTATUS
   1504 (NTAPI *pHalMirrorPhysicalMemory)(
   1505   IN PHYSICAL_ADDRESS PhysicalAddress,
   1506   IN LARGE_INTEGER NumberOfBytes);
   1507 
   1508 typedef NTSTATUS
   1509 (NTAPI *pHalMirrorVerify)(
   1510   IN PHYSICAL_ADDRESS PhysicalAddress,
   1511   IN LARGE_INTEGER NumberOfBytes);
   1512 
   1513 typedef BOOLEAN
   1514 (NTAPI *pHalTranslateBusAddress)(
   1515   IN INTERFACE_TYPE InterfaceType,
   1516   IN ULONG BusNumber,
   1517   IN PHYSICAL_ADDRESS BusAddress,
   1518   IN OUT PULONG AddressSpace,
   1519   OUT PPHYSICAL_ADDRESS TranslatedAddress);
   1520 
   1521 typedef NTSTATUS
   1522 (NTAPI *pHalAssignSlotResources)(
   1523   IN PUNICODE_STRING RegistryPath,
   1524   IN PUNICODE_STRING DriverClassName OPTIONAL,
   1525   IN PDRIVER_OBJECT DriverObject,
   1526   IN PDEVICE_OBJECT DeviceObject,
   1527   IN INTERFACE_TYPE BusType,
   1528   IN ULONG BusNumber,
   1529   IN ULONG SlotNumber,
   1530   IN OUT PCM_RESOURCE_LIST *AllocatedResources);
   1531 
   1532 typedef VOID
   1533 (NTAPI *pHalHaltSystem)(
   1534   VOID);
   1535 
   1536 typedef BOOLEAN
   1537 (NTAPI *pHalResetDisplay)(
   1538   VOID);
   1539 
   1540 typedef struct _MAP_REGISTER_ENTRY {
   1541   PVOID MapRegister;
   1542   BOOLEAN WriteToDevice;
   1543 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
   1544 
   1545 typedef UCHAR
   1546 (NTAPI *pHalVectorToIDTEntry)(
   1547   ULONG Vector);
   1548 
   1549 typedef BOOLEAN
   1550 (NTAPI *pHalFindBusAddressTranslation)(
   1551   IN PHYSICAL_ADDRESS BusAddress,
   1552   IN OUT PULONG AddressSpace,
   1553   OUT PPHYSICAL_ADDRESS TranslatedAddress,
   1554   IN OUT PULONG_PTR Context,
   1555   IN BOOLEAN NextBus);
   1556 
   1557 typedef VOID
   1558 (NTAPI *pHalEndOfBoot)(
   1559   VOID);
   1560 
   1561 typedef PVOID
   1562 (NTAPI *pHalGetAcpiTable)(
   1563   IN ULONG Signature,
   1564   IN PCSTR OemId OPTIONAL,
   1565   IN PCSTR OemTableId OPTIONAL);
   1566 
   1567 #if defined(_IA64_)
   1568 typedef NTSTATUS
   1569 (*pHalGetErrorCapList)(
   1570   IN OUT PULONG CapsListLength,
   1571   IN OUT PUCHAR ErrorCapList);
   1572 
   1573 typedef NTSTATUS
   1574 (*pHalInjectError)(
   1575   IN ULONG BufferLength,
   1576   IN PUCHAR Buffer);
   1577 #endif
   1578 
   1579 typedef VOID
   1580 (NTAPI *PCI_ERROR_HANDLER_CALLBACK)(
   1581   VOID);
   1582 
   1583 typedef VOID
   1584 (NTAPI *pHalSetPciErrorHandlerCallback)(
   1585   IN PCI_ERROR_HANDLER_CALLBACK Callback);
   1586 
   1587 #if 1 /* Not present in WDK 7600 */
   1588 typedef VOID
   1589 (FASTCALL *pHalIoAssignDriveLetters)(
   1590   IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
   1591   IN PSTRING NtDeviceName,
   1592   OUT PUCHAR NtSystemPath,
   1593   OUT PSTRING NtSystemPathString);
   1594 #endif
   1595 
   1596 typedef struct {
   1597   ULONG Version;
   1598   pHalQuerySystemInformation HalQuerySystemInformation;
   1599   pHalSetSystemInformation HalSetSystemInformation;
   1600   pHalQueryBusSlots HalQueryBusSlots;
   1601   ULONG Spare1;
   1602   pHalExamineMBR HalExamineMBR;
   1603 #if 1 /* Not present in WDK 7600 */
   1604   pHalIoAssignDriveLetters HalIoAssignDriveLetters;
   1605 #endif
   1606   pHalIoReadPartitionTable HalIoReadPartitionTable;
   1607   pHalIoSetPartitionInformation HalIoSetPartitionInformation;
   1608   pHalIoWritePartitionTable HalIoWritePartitionTable;
   1609   pHalHandlerForBus HalReferenceHandlerForBus;
   1610   pHalReferenceBusHandler HalReferenceBusHandler;
   1611   pHalReferenceBusHandler HalDereferenceBusHandler;
   1612   pHalInitPnpDriver HalInitPnpDriver;
   1613   pHalInitPowerManagement HalInitPowerManagement;
   1614   pHalGetDmaAdapter HalGetDmaAdapter;
   1615   pHalGetInterruptTranslator HalGetInterruptTranslator;
   1616   pHalStartMirroring HalStartMirroring;
   1617   pHalEndMirroring HalEndMirroring;
   1618   pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
   1619   pHalEndOfBoot HalEndOfBoot;
   1620   pHalMirrorVerify HalMirrorVerify;
   1621   pHalGetAcpiTable HalGetCachedAcpiTable;
   1622   pHalSetPciErrorHandlerCallback  HalSetPciErrorHandlerCallback;
   1623 #if defined(_IA64_)
   1624   pHalGetErrorCapList HalGetErrorCapList;
   1625   pHalInjectError HalInjectError;
   1626 #endif
   1627 } HAL_DISPATCH, *PHAL_DISPATCH;
   1628 
   1629 /* GCC/MSVC and WDK compatible declaration */
   1630 extern NTKERNELAPI HAL_DISPATCH HalDispatchTable;
   1631 
   1632 #if defined(_NTOSKRNL_) || defined(_BLDR_)
   1633 #define HALDISPATCH (&HalDispatchTable)
   1634 #else
   1635 /* This is a WDK compatibility definition */
   1636 #define HalDispatchTable (&HalDispatchTable)
   1637 #define HALDISPATCH HalDispatchTable
   1638 #endif
   1639 
   1640 #define HAL_DISPATCH_VERSION            3 /* FIXME: when to use 4? */
   1641 #define HalDispatchTableVersion         HALDISPATCH->Version
   1642 #define HalQuerySystemInformation       HALDISPATCH->HalQuerySystemInformation
   1643 #define HalSetSystemInformation         HALDISPATCH->HalSetSystemInformation
   1644 #define HalQueryBusSlots                HALDISPATCH->HalQueryBusSlots
   1645 #define HalReferenceHandlerForBus       HALDISPATCH->HalReferenceHandlerForBus
   1646 #define HalReferenceBusHandler          HALDISPATCH->HalReferenceBusHandler
   1647 #define HalDereferenceBusHandler        HALDISPATCH->HalDereferenceBusHandler
   1648 #define HalInitPnpDriver                HALDISPATCH->HalInitPnpDriver
   1649 #define HalInitPowerManagement          HALDISPATCH->HalInitPowerManagement
   1650 #define HalGetDmaAdapter                HALDISPATCH->HalGetDmaAdapter
   1651 #define HalGetInterruptTranslator       HALDISPATCH->HalGetInterruptTranslator
   1652 #define HalStartMirroring               HALDISPATCH->HalStartMirroring
   1653 #define HalEndMirroring                 HALDISPATCH->HalEndMirroring
   1654 #define HalMirrorPhysicalMemory         HALDISPATCH->HalMirrorPhysicalMemory
   1655 #define HalEndOfBoot                    HALDISPATCH->HalEndOfBoot
   1656 #define HalMirrorVerify                 HALDISPATCH->HalMirrorVerify
   1657 #define HalGetCachedAcpiTable           HALDISPATCH->HalGetCachedAcpiTable
   1658 #define HalSetPciErrorHandlerCallback   HALDISPATCH->HalSetPciErrorHandlerCallback
   1659 #if defined(_IA64_)
   1660 #define HalGetErrorCapList              HALDISPATCH->HalGetErrorCapList
   1661 #define HalInjectError                  HALDISPATCH->HalInjectError
   1662 #endif
   1663 
   1664 typedef struct _HAL_BUS_INFORMATION {
   1665   INTERFACE_TYPE BusType;
   1666   BUS_DATA_TYPE ConfigurationType;
   1667   ULONG BusNumber;
   1668   ULONG Reserved;
   1669 } HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION;
   1670 
   1671 typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
   1672   KPROFILE_SOURCE Source;
   1673   BOOLEAN Supported;
   1674   ULONG Interval;
   1675 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
   1676 
   1677 typedef struct _HAL_PROFILE_SOURCE_INFORMATION_EX {
   1678   KPROFILE_SOURCE Source;
   1679   BOOLEAN Supported;
   1680   ULONG_PTR Interval;
   1681   ULONG_PTR DefInterval;
   1682   ULONG_PTR MaxInterval;
   1683   ULONG_PTR MinInterval;
   1684 } HAL_PROFILE_SOURCE_INFORMATION_EX, *PHAL_PROFILE_SOURCE_INFORMATION_EX;
   1685 
   1686 typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
   1687   KPROFILE_SOURCE Source;
   1688   ULONG_PTR Interval;
   1689 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
   1690 
   1691 typedef struct _HAL_PROFILE_SOURCE_LIST {
   1692   KPROFILE_SOURCE Source;
   1693   PWSTR Description;
   1694 } HAL_PROFILE_SOURCE_LIST, *PHAL_PROFILE_SOURCE_LIST;
   1695 
   1696 typedef enum _HAL_DISPLAY_BIOS_INFORMATION {
   1697   HalDisplayInt10Bios,
   1698   HalDisplayEmulatedBios,
   1699   HalDisplayNoBios
   1700 } HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION;
   1701 
   1702 typedef struct _HAL_POWER_INFORMATION {
   1703   ULONG TBD;
   1704 } HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION;
   1705 
   1706 typedef struct _HAL_PROCESSOR_SPEED_INFO {
   1707   ULONG ProcessorSpeed;
   1708 } HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION;
   1709 
   1710 typedef struct _HAL_CALLBACKS {
   1711   PCALLBACK_OBJECT SetSystemInformation;
   1712   PCALLBACK_OBJECT BusCheck;
   1713 } HAL_CALLBACKS, *PHAL_CALLBACKS;
   1714 
   1715 typedef struct _HAL_PROCESSOR_FEATURE {
   1716   ULONG UsableFeatureBits;
   1717 } HAL_PROCESSOR_FEATURE;
   1718 
   1719 typedef NTSTATUS
   1720 (NTAPI *PHALIOREADWRITEHANDLER)(
   1721   IN BOOLEAN fRead,
   1722   IN ULONG dwAddr,
   1723   IN ULONG dwSize,
   1724   IN OUT PULONG pdwData);
   1725 
   1726 typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST {
   1727   ULONG BadAddrBegin;
   1728   ULONG BadAddrSize;
   1729   ULONG OSVersionTrigger;
   1730   PHALIOREADWRITEHANDLER IOHandler;
   1731 } HAL_AMLI_BAD_IO_ADDRESS_LIST, *PHAL_AMLI_BAD_IO_ADDRESS_LIST;
   1732 
   1733 #if defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
   1734 
   1735 typedef VOID
   1736 (NTAPI *PHALMCAINTERFACELOCK)(
   1737   VOID);
   1738 
   1739 typedef VOID
   1740 (NTAPI *PHALMCAINTERFACEUNLOCK)(
   1741   VOID);
   1742 
   1743 typedef NTSTATUS
   1744 (NTAPI *PHALMCAINTERFACEREADREGISTER)(
   1745   IN UCHAR BankNumber,
   1746   IN OUT PVOID Exception);
   1747 
   1748 typedef struct _HAL_MCA_INTERFACE {
   1749   PHALMCAINTERFACELOCK Lock;
   1750   PHALMCAINTERFACEUNLOCK Unlock;
   1751   PHALMCAINTERFACEREADREGISTER ReadRegister;
   1752 } HAL_MCA_INTERFACE;
   1753 
   1754 typedef enum {
   1755   ApicDestinationModePhysical = 1,
   1756   ApicDestinationModeLogicalFlat,
   1757   ApicDestinationModeLogicalClustered,
   1758   ApicDestinationModeUnknown
   1759 } HAL_APIC_DESTINATION_MODE, *PHAL_APIC_DESTINATION_MODE;
   1760 
   1761 #if defined(_AMD64_)
   1762 
   1763 struct _KTRAP_FRAME;
   1764 struct _KEXCEPTION_FRAME;
   1765 
   1766 typedef ERROR_SEVERITY
   1767 (NTAPI *PDRIVER_EXCPTN_CALLBACK)(
   1768   IN PVOID Context,
   1769   IN struct _KTRAP_FRAME *TrapFrame,
   1770   IN struct _KEXCEPTION_FRAME *ExceptionFrame,
   1771   IN PMCA_EXCEPTION Exception);
   1772 
   1773 #endif
   1774 
   1775 #if defined(_X86_) || defined(_IA64_)
   1776 typedef
   1777 #if defined(_IA64_)
   1778 ERROR_SEVERITY
   1779 #else
   1780 VOID
   1781 #endif
   1782 (NTAPI *PDRIVER_EXCPTN_CALLBACK)(
   1783   IN PVOID Context,
   1784   IN PMCA_EXCEPTION BankLog);
   1785 #endif
   1786 
   1787 typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK;
   1788 
   1789 typedef struct _MCA_DRIVER_INFO {
   1790   PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback;
   1791   PKDEFERRED_ROUTINE DpcCallback;
   1792   PVOID DeviceContext;
   1793 } MCA_DRIVER_INFO, *PMCA_DRIVER_INFO;
   1794 
   1795 typedef struct _HAL_ERROR_INFO {
   1796   ULONG Version;
   1797   ULONG InitMaxSize;
   1798   ULONG McaMaxSize;
   1799   ULONG McaPreviousEventsCount;
   1800   ULONG McaCorrectedEventsCount;
   1801   ULONG McaKernelDeliveryFails;
   1802   ULONG McaDriverDpcQueueFails;
   1803   ULONG McaReserved;
   1804   ULONG CmcMaxSize;
   1805   ULONG CmcPollingInterval;
   1806   ULONG CmcInterruptsCount;
   1807   ULONG CmcKernelDeliveryFails;
   1808   ULONG CmcDriverDpcQueueFails;
   1809   ULONG CmcGetStateFails;
   1810   ULONG CmcClearStateFails;
   1811   ULONG CmcReserved;
   1812   ULONGLONG CmcLogId;
   1813   ULONG CpeMaxSize;
   1814   ULONG CpePollingInterval;
   1815   ULONG CpeInterruptsCount;
   1816   ULONG CpeKernelDeliveryFails;
   1817   ULONG CpeDriverDpcQueueFails;
   1818   ULONG CpeGetStateFails;
   1819   ULONG CpeClearStateFails;
   1820   ULONG CpeInterruptSources;
   1821   ULONGLONG CpeLogId;
   1822   ULONGLONG KernelReserved[4];
   1823 } HAL_ERROR_INFO, *PHAL_ERROR_INFO;
   1824 
   1825 #define HAL_MCE_INTERRUPTS_BASED ((ULONG)-1)
   1826 #define HAL_MCE_DISABLED          ((ULONG)0)
   1827 
   1828 #define HAL_CMC_INTERRUPTS_BASED  HAL_MCE_INTERRUPTS_BASED
   1829 #define HAL_CMC_DISABLED          HAL_MCE_DISABLED
   1830 
   1831 #define HAL_CPE_INTERRUPTS_BASED  HAL_MCE_INTERRUPTS_BASED
   1832 #define HAL_CPE_DISABLED          HAL_MCE_DISABLED
   1833 
   1834 #define HAL_MCA_INTERRUPTS_BASED  HAL_MCE_INTERRUPTS_BASED
   1835 #define HAL_MCA_DISABLED          HAL_MCE_DISABLED
   1836 
   1837 typedef VOID
   1838 (NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)(
   1839   IN PVOID Context,
   1840   IN PCMC_EXCEPTION CmcLog);
   1841 
   1842 typedef VOID
   1843 (NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)(
   1844   IN PVOID Context,
   1845   IN PCPE_EXCEPTION CmcLog);
   1846 
   1847 typedef struct _CMC_DRIVER_INFO {
   1848   PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback;
   1849   PKDEFERRED_ROUTINE DpcCallback;
   1850   PVOID DeviceContext;
   1851 } CMC_DRIVER_INFO, *PCMC_DRIVER_INFO;
   1852 
   1853 typedef struct _CPE_DRIVER_INFO {
   1854   PDRIVER_CPE_EXCEPTION_CALLBACK ExceptionCallback;
   1855   PKDEFERRED_ROUTINE DpcCallback;
   1856   PVOID DeviceContext;
   1857 } CPE_DRIVER_INFO, *PCPE_DRIVER_INFO;
   1858 
   1859 #endif // defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
   1860 
   1861 #if defined(_IA64_)
   1862 
   1863 typedef NTSTATUS
   1864 (*HALSENDCROSSPARTITIONIPI)(
   1865   IN USHORT ProcessorID,
   1866   IN UCHAR HardwareVector);
   1867 
   1868 typedef NTSTATUS
   1869 (*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)(
   1870   OUT PULONG Vector,
   1871   OUT PKIRQL Irql,
   1872   IN OUT PGROUP_AFFINITY Affinity,
   1873   OUT PUCHAR HardwareVector);
   1874 
   1875 typedef VOID
   1876 (*HALFREECROSSPARTITIONINTERRUPTVECTOR)(
   1877   IN ULONG Vector,
   1878   IN PGROUP_AFFINITY Affinity);
   1879 
   1880 typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE {
   1881   HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi;
   1882   HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector;
   1883   HALFREECROSSPARTITIONINTERRUPTVECTOR HalFreeCrossPartitionInterruptVector;
   1884 } HAL_CROSS_PARTITION_IPI_INTERFACE;
   1885 
   1886 #define HAL_CROSS_PARTITION_IPI_INTERFACE_MINIMUM_SIZE \
   1887     FIELD_OFFSET(HAL_CROSS_PARTITION_IPI_INTERFACE,    \
   1888                  HalFreeCrossPartitionInterruptVector)
   1889 
   1890 #endif /* defined(_IA64_) */
   1891 
   1892 typedef struct _HAL_PLATFORM_INFORMATION {
   1893   ULONG PlatformFlags;
   1894 } HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION;
   1895 
   1896 #define HAL_PLATFORM_DISABLE_WRITE_COMBINING      0x01L
   1897 #define HAL_PLATFORM_DISABLE_PTCG                 0x04L
   1898 #define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY       0x08L
   1899 #define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO  0x10L
   1900 #define HAL_PLATFORM_ACPI_TABLES_CACHED           0x20L
   1901 
   1902 /******************************************************************************
   1903  *                              Kernel Types                                  *
   1904  ******************************************************************************/
   1905 
   1906 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
   1907 #define NX_SUPPORT_POLICY_ALWAYSON 1
   1908 #define NX_SUPPORT_POLICY_OPTIN 2
   1909 #define NX_SUPPORT_POLICY_OPTOUT 3
   1910 
   1911 typedef VOID
   1912 (NTAPI *PEXPAND_STACK_CALLOUT)(
   1913   IN PVOID Parameter OPTIONAL);
   1914 
   1915 typedef VOID
   1916 (NTAPI *PTIMER_APC_ROUTINE)(
   1917   IN PVOID TimerContext,
   1918   IN ULONG TimerLowValue,
   1919   IN LONG TimerHighValue);
   1920 
   1921 typedef enum _TIMER_SET_INFORMATION_CLASS {
   1922   TimerSetCoalescableTimer,
   1923   MaxTimerInfoClass
   1924 } TIMER_SET_INFORMATION_CLASS;
   1925 
   1926 #if (NTDDI_VERSION >= NTDDI_WIN7)
   1927 typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO {
   1928   IN LARGE_INTEGER DueTime;
   1929   IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL;
   1930   IN PVOID TimerContext OPTIONAL;
   1931   IN struct _COUNTED_REASON_CONTEXT *WakeContext OPTIONAL;
   1932   IN ULONG Period OPTIONAL;
   1933   IN ULONG TolerableDelay;
   1934   OUT PBOOLEAN PreviousState OPTIONAL;
   1935 } TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO;
   1936 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   1937 
   1938 #define XSTATE_LEGACY_FLOATING_POINT        0
   1939 #define XSTATE_LEGACY_SSE                   1
   1940 #define XSTATE_GSSE                         2
   1941 
   1942 #define XSTATE_MASK_LEGACY_FLOATING_POINT   (1i64 << (XSTATE_LEGACY_FLOATING_POINT))
   1943 #define XSTATE_MASK_LEGACY_SSE              (1i64 << (XSTATE_LEGACY_SSE))
   1944 #define XSTATE_MASK_LEGACY                  (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
   1945 #define XSTATE_MASK_GSSE                    (1i64 << (XSTATE_GSSE))
   1946 
   1947 #define MAXIMUM_XSTATE_FEATURES             64
   1948 
   1949 typedef struct _XSTATE_FEATURE {
   1950   ULONG Offset;
   1951   ULONG Size;
   1952 } XSTATE_FEATURE, *PXSTATE_FEATURE;
   1953 
   1954 typedef struct _XSTATE_CONFIGURATION {
   1955   ULONG64 EnabledFeatures;
   1956   ULONG Size;
   1957   ULONG OptimizedSave:1;
   1958   XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES];
   1959 } XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION;
   1960 
   1961 #define MAX_WOW64_SHARED_ENTRIES 16
   1962 
   1963 typedef struct _KUSER_SHARED_DATA {
   1964   ULONG TickCountLowDeprecated;
   1965   ULONG TickCountMultiplier;
   1966   volatile KSYSTEM_TIME InterruptTime;
   1967   volatile KSYSTEM_TIME SystemTime;
   1968   volatile KSYSTEM_TIME TimeZoneBias;
   1969   USHORT ImageNumberLow;
   1970   USHORT ImageNumberHigh;
   1971   WCHAR NtSystemRoot[260];
   1972   ULONG MaxStackTraceDepth;
   1973   ULONG CryptoExponent;
   1974   ULONG TimeZoneId;
   1975   ULONG LargePageMinimum;
   1976   ULONG Reserved2[7];
   1977   NT_PRODUCT_TYPE NtProductType;
   1978   BOOLEAN ProductTypeIsValid;
   1979   ULONG NtMajorVersion;
   1980   ULONG NtMinorVersion;
   1981   BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
   1982   ULONG Reserved1;
   1983   ULONG Reserved3;
   1984   volatile ULONG TimeSlip;
   1985   ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
   1986   ULONG AltArchitecturePad[1];
   1987   LARGE_INTEGER SystemExpirationDate;
   1988   ULONG SuiteMask;
   1989   BOOLEAN KdDebuggerEnabled;
   1990 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
   1991   UCHAR NXSupportPolicy;
   1992 #endif
   1993   volatile ULONG ActiveConsoleId;
   1994   volatile ULONG DismountCount;
   1995   ULONG ComPlusPackage;
   1996   ULONG LastSystemRITEventTickCount;
   1997   ULONG NumberOfPhysicalPages;
   1998   BOOLEAN SafeBootMode;
   1999 #if (NTDDI_VERSION >= NTDDI_WIN7)
   2000   _ANONYMOUS_UNION union {
   2001     UCHAR TscQpcData;
   2002     _ANONYMOUS_STRUCT struct {
   2003       UCHAR TscQpcEnabled:1;
   2004       UCHAR TscQpcSpareFlag:1;
   2005       UCHAR TscQpcShift:6;
   2006     } DUMMYSTRUCTNAME;
   2007   } DUMMYUNIONNAME;
   2008   UCHAR TscQpcPad[2];
   2009 #endif
   2010 #if (NTDDI_VERSION >= NTDDI_VISTA)
   2011   _ANONYMOUS_UNION union {
   2012     ULONG SharedDataFlags;
   2013     _ANONYMOUS_STRUCT struct {
   2014       ULONG DbgErrorPortPresent:1;
   2015       ULONG DbgElevationEnabled:1;
   2016       ULONG DbgVirtEnabled:1;
   2017       ULONG DbgInstallerDetectEnabled:1;
   2018       ULONG DbgSystemDllRelocated:1;
   2019       ULONG DbgDynProcessorEnabled:1;
   2020       ULONG DbgSEHValidationEnabled:1;
   2021       ULONG SpareBits:25;
   2022     } DUMMYSTRUCTNAME2;
   2023   } DUMMYUNIONNAME2;
   2024 #else
   2025   ULONG TraceLogging;
   2026 #endif
   2027   ULONG DataFlagsPad[1];
   2028   ULONGLONG TestRetInstruction;
   2029   ULONG SystemCall;
   2030   ULONG SystemCallReturn;
   2031   ULONGLONG SystemCallPad[3];
   2032   _ANONYMOUS_UNION union {
   2033     volatile KSYSTEM_TIME TickCount;
   2034     volatile ULONG64 TickCountQuad;
   2035     _ANONYMOUS_STRUCT struct {
   2036       ULONG ReservedTickCountOverlay[3];
   2037       ULONG TickCountPad[1];
   2038     } DUMMYSTRUCTNAME;
   2039   } DUMMYUNIONNAME3;
   2040   ULONG Cookie;
   2041   ULONG CookiePad[1];
   2042 #if (NTDDI_VERSION >= NTDDI_WS03)
   2043   LONGLONG ConsoleSessionForegroundProcessId;
   2044   ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
   2045 #endif
   2046 #if (NTDDI_VERSION >= NTDDI_VISTA)
   2047 #if (NTDDI_VERSION >= NTDDI_WIN7)
   2048   USHORT UserModeGlobalLogger[16];
   2049 #else
   2050   USHORT UserModeGlobalLogger[8];
   2051   ULONG HeapTracingPid[2];
   2052   ULONG CritSecTracingPid[2];
   2053 #endif
   2054   ULONG ImageFileExecutionOptions;
   2055 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
   2056   ULONG LangGenerationCount;
   2057 #else
   2058   /* 4 bytes padding */
   2059 #endif
   2060   ULONGLONG Reserved5;
   2061   volatile ULONG64 InterruptTimeBias;
   2062 #endif
   2063 #if (NTDDI_VERSION >= NTDDI_WIN7)
   2064   volatile ULONG64 TscQpcBias;
   2065   volatile ULONG ActiveProcessorCount;
   2066   volatile USHORT ActiveGroupCount;
   2067   USHORT Reserved4;
   2068   volatile ULONG AitSamplingValue;
   2069   volatile ULONG AppCompatFlag;
   2070   ULONGLONG SystemDllNativeRelocation;
   2071   ULONG SystemDllWowRelocation;
   2072   ULONG XStatePad[1];
   2073   XSTATE_CONFIGURATION XState;
   2074 #endif
   2075 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
   2076 
   2077 #if (NTDDI_VERSION >= NTDDI_VISTA)
   2078 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
   2079 #elif (NTDDI_VERSION >= NTDDI_WINXP)
   2080 extern NTSYSAPI CCHAR KeNumberProcessors;
   2081 #else
   2082 extern PCCHAR KeNumberProcessors;
   2083 #endif
   2084 
   2085 
   2086 /******************************************************************************
   2087  *                          Kernel Debugger Types                             *
   2088  ******************************************************************************/
   2089 typedef struct _DEBUG_DEVICE_ADDRESS {
   2090   UCHAR Type;
   2091   BOOLEAN Valid;
   2092   UCHAR Reserved[2];
   2093   PUCHAR TranslatedAddress;
   2094   ULONG Length;
   2095 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
   2096 
   2097 typedef struct _DEBUG_MEMORY_REQUIREMENTS {
   2098   PHYSICAL_ADDRESS Start;
   2099   PHYSICAL_ADDRESS MaxEnd;
   2100   PVOID VirtualAddress;
   2101   ULONG Length;
   2102   BOOLEAN Cached;
   2103   BOOLEAN Aligned;
   2104 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
   2105 
   2106 typedef struct _DEBUG_DEVICE_DESCRIPTOR {
   2107   ULONG Bus;
   2108   ULONG Slot;
   2109   USHORT Segment;
   2110   USHORT VendorID;
   2111   USHORT DeviceID;
   2112   UCHAR BaseClass;
   2113   UCHAR SubClass;
   2114   UCHAR ProgIf;
   2115   BOOLEAN Initialized;
   2116   BOOLEAN Configured;
   2117   DEBUG_DEVICE_ADDRESS BaseAddress[6];
   2118   DEBUG_MEMORY_REQUIREMENTS Memory;
   2119 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
   2120 
   2121 typedef NTSTATUS
   2122 (NTAPI *pKdSetupPciDeviceForDebugging)(
   2123   IN PVOID LoaderBlock OPTIONAL,
   2124   IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
   2125 
   2126 typedef NTSTATUS
   2127 (NTAPI *pKdReleasePciDeviceForDebugging)(
   2128   IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
   2129 
   2130 typedef PVOID
   2131 (NTAPI *pKdGetAcpiTablePhase0)(
   2132   IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
   2133   IN ULONG Signature);
   2134 
   2135 typedef VOID
   2136 (NTAPI *pKdCheckPowerButton)(
   2137   VOID);
   2138 
   2139 #if (NTDDI_VERSION >= NTDDI_VISTA)
   2140 typedef PVOID
   2141 (NTAPI *pKdMapPhysicalMemory64)(
   2142   IN PHYSICAL_ADDRESS PhysicalAddress,
   2143   IN ULONG NumberPages,
   2144   IN BOOLEAN FlushCurrentTLB);
   2145 
   2146 typedef VOID
   2147 (NTAPI *pKdUnmapVirtualAddress)(
   2148   IN PVOID VirtualAddress,
   2149   IN ULONG NumberPages,
   2150   IN BOOLEAN FlushCurrentTLB);
   2151 #else
   2152 typedef PVOID
   2153 (NTAPI *pKdMapPhysicalMemory64)(
   2154   IN PHYSICAL_ADDRESS PhysicalAddress,
   2155   IN ULONG NumberPages);
   2156 
   2157 typedef VOID
   2158 (NTAPI *pKdUnmapVirtualAddress)(
   2159   IN PVOID VirtualAddress,
   2160   IN ULONG NumberPages);
   2161 #endif
   2162 
   2163 typedef ULONG
   2164 (NTAPI *pKdGetPciDataByOffset)(
   2165   IN ULONG BusNumber,
   2166   IN ULONG SlotNumber,
   2167   OUT PVOID Buffer,
   2168   IN ULONG Offset,
   2169   IN ULONG Length);
   2170 
   2171 typedef ULONG
   2172 (NTAPI *pKdSetPciDataByOffset)(
   2173   IN ULONG BusNumber,
   2174   IN ULONG SlotNumber,
   2175   IN PVOID Buffer,
   2176   IN ULONG Offset,
   2177   IN ULONG Length);
   2178 /******************************************************************************
   2179  *                         Memory manager Types                               *
   2180  ******************************************************************************/
   2181 
   2182 typedef struct _PHYSICAL_MEMORY_RANGE {
   2183   PHYSICAL_ADDRESS BaseAddress;
   2184   LARGE_INTEGER NumberOfBytes;
   2185 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
   2186 
   2187 typedef NTSTATUS
   2188 (NTAPI *PMM_ROTATE_COPY_CALLBACK_FUNCTION)(
   2189   IN PMDL DestinationMdl,
   2190   IN PMDL SourceMdl,
   2191   IN PVOID Context);
   2192 
   2193 typedef enum _MM_ROTATE_DIRECTION {
   2194   MmToFrameBuffer,
   2195   MmToFrameBufferNoCopy,
   2196   MmToRegularMemory,
   2197   MmToRegularMemoryNoCopy,
   2198   MmMaximumRotateDirection
   2199 } MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION;
   2200 
   2201 
   2202 /******************************************************************************
   2203  *                           Process Manager Types                            *
   2204  ******************************************************************************/
   2205 
   2206 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001
   2207 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
   2208 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004
   2209 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
   2210 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
   2211 
   2212 typedef struct _QUOTA_LIMITS {
   2213   SIZE_T PagedPoolLimit;
   2214   SIZE_T NonPagedPoolLimit;
   2215   SIZE_T MinimumWorkingSetSize;
   2216   SIZE_T MaximumWorkingSetSize;
   2217   SIZE_T PagefileLimit;
   2218   LARGE_INTEGER TimeLimit;
   2219 } QUOTA_LIMITS, *PQUOTA_LIMITS;
   2220 
   2221 typedef union _RATE_QUOTA_LIMIT {
   2222   ULONG RateData;
   2223   _ANONYMOUS_STRUCT struct {
   2224     ULONG RatePercent:7;
   2225     ULONG Reserved0:25;
   2226   } DUMMYSTRUCTNAME;
   2227 } RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT;
   2228 
   2229 typedef struct _QUOTA_LIMITS_EX {
   2230   SIZE_T PagedPoolLimit;
   2231   SIZE_T NonPagedPoolLimit;
   2232   SIZE_T MinimumWorkingSetSize;
   2233   SIZE_T MaximumWorkingSetSize;
   2234   SIZE_T PagefileLimit;
   2235   LARGE_INTEGER TimeLimit;
   2236   SIZE_T WorkingSetLimit;
   2237   SIZE_T Reserved2;
   2238   SIZE_T Reserved3;
   2239   SIZE_T Reserved4;
   2240   ULONG Flags;
   2241   RATE_QUOTA_LIMIT CpuRateLimit;
   2242 } QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
   2243 
   2244 typedef struct _IO_COUNTERS {
   2245   ULONGLONG ReadOperationCount;
   2246   ULONGLONG WriteOperationCount;
   2247   ULONGLONG OtherOperationCount;
   2248   ULONGLONG ReadTransferCount;
   2249   ULONGLONG WriteTransferCount;
   2250   ULONGLONG OtherTransferCount;
   2251 } IO_COUNTERS, *PIO_COUNTERS;
   2252 
   2253 typedef struct _VM_COUNTERS {
   2254   SIZE_T PeakVirtualSize;
   2255   SIZE_T VirtualSize;
   2256   ULONG PageFaultCount;
   2257   SIZE_T PeakWorkingSetSize;
   2258   SIZE_T WorkingSetSize;
   2259   SIZE_T QuotaPeakPagedPoolUsage;
   2260   SIZE_T QuotaPagedPoolUsage;
   2261   SIZE_T QuotaPeakNonPagedPoolUsage;
   2262   SIZE_T QuotaNonPagedPoolUsage;
   2263   SIZE_T PagefileUsage;
   2264   SIZE_T PeakPagefileUsage;
   2265 } VM_COUNTERS, *PVM_COUNTERS;
   2266 
   2267 typedef struct _VM_COUNTERS_EX {
   2268   SIZE_T PeakVirtualSize;
   2269   SIZE_T VirtualSize;
   2270   ULONG PageFaultCount;
   2271   SIZE_T PeakWorkingSetSize;
   2272   SIZE_T WorkingSetSize;
   2273   SIZE_T QuotaPeakPagedPoolUsage;
   2274   SIZE_T QuotaPagedPoolUsage;
   2275   SIZE_T QuotaPeakNonPagedPoolUsage;
   2276   SIZE_T QuotaNonPagedPoolUsage;
   2277   SIZE_T PagefileUsage;
   2278   SIZE_T PeakPagefileUsage;
   2279   SIZE_T PrivateUsage;
   2280 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
   2281 
   2282 #define MAX_HW_COUNTERS 16
   2283 #define THREAD_PROFILING_FLAG_DISPATCH  0x00000001
   2284 
   2285 typedef enum _HARDWARE_COUNTER_TYPE {
   2286   PMCCounter,
   2287   MaxHardwareCounterType
   2288 } HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE;
   2289 
   2290 typedef struct _HARDWARE_COUNTER {
   2291   HARDWARE_COUNTER_TYPE Type;
   2292   ULONG Reserved;
   2293   ULONG64 Index;
   2294 } HARDWARE_COUNTER, *PHARDWARE_COUNTER;
   2295 
   2296 typedef struct _POOLED_USAGE_AND_LIMITS {
   2297   SIZE_T PeakPagedPoolUsage;
   2298   SIZE_T PagedPoolUsage;
   2299   SIZE_T PagedPoolLimit;
   2300   SIZE_T PeakNonPagedPoolUsage;
   2301   SIZE_T NonPagedPoolUsage;
   2302   SIZE_T NonPagedPoolLimit;
   2303   SIZE_T PeakPagefileUsage;
   2304   SIZE_T PagefileUsage;
   2305   SIZE_T PagefileLimit;
   2306 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
   2307 
   2308 typedef struct _PROCESS_ACCESS_TOKEN {
   2309   HANDLE Token;
   2310   HANDLE Thread;
   2311 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
   2312 
   2313 #define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS     0x00000003UL
   2314 #define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS    ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1))
   2315 
   2316 typedef struct _PROCESS_EXCEPTION_PORT {
   2317   IN HANDLE ExceptionPortHandle;
   2318   IN OUT ULONG StateFlags;
   2319 } PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT;
   2320 
   2321 typedef VOID
   2322 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
   2323   IN HANDLE ParentId,
   2324   IN HANDLE ProcessId,
   2325   IN BOOLEAN Create);
   2326 
   2327 typedef struct _PS_CREATE_NOTIFY_INFO {
   2328   IN SIZE_T Size;
   2329   _ANONYMOUS_UNION union {
   2330     IN ULONG Flags;
   2331     _ANONYMOUS_STRUCT struct {
   2332       IN ULONG FileOpenNameAvailable:1;
   2333       IN ULONG Reserved:31;
   2334     } DUMMYSTRUCTNAME;
   2335   } DUMMYUNIONNAME;
   2336   IN HANDLE ParentProcessId;
   2337   IN CLIENT_ID CreatingThreadId;
   2338   IN OUT struct _FILE_OBJECT *FileObject;
   2339   IN PCUNICODE_STRING ImageFileName;
   2340   IN PCUNICODE_STRING CommandLine OPTIONAL;
   2341   IN OUT NTSTATUS CreationStatus;
   2342 } PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
   2343 
   2344 typedef VOID
   2345 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE_EX)(
   2346   IN OUT PEPROCESS Process,
   2347   IN HANDLE ProcessId,
   2348   IN PPS_CREATE_NOTIFY_INFO CreateInfo OPTIONAL);
   2349 
   2350 typedef VOID
   2351 (NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
   2352   IN HANDLE ProcessId,
   2353   IN HANDLE ThreadId,
   2354   IN BOOLEAN Create);
   2355 
   2356 #define IMAGE_ADDRESSING_MODE_32BIT       3
   2357 
   2358 typedef struct _IMAGE_INFO {
   2359   _ANONYMOUS_UNION union {
   2360     ULONG Properties;
   2361     _ANONYMOUS_STRUCT struct {
   2362       ULONG ImageAddressingMode:8;
   2363       ULONG SystemModeImage:1;
   2364       ULONG ImageMappedToAllPids:1;
   2365       ULONG ExtendedInfoPresent:1;
   2366       ULONG Reserved:21;
   2367     } DUMMYSTRUCTNAME;
   2368   } DUMMYUNIONNAME;
   2369   PVOID ImageBase;
   2370   ULONG ImageSelector;
   2371   SIZE_T ImageSize;
   2372   ULONG ImageSectionNumber;
   2373 } IMAGE_INFO, *PIMAGE_INFO;
   2374 
   2375 typedef struct _IMAGE_INFO_EX {
   2376   SIZE_T Size;
   2377   IMAGE_INFO ImageInfo;
   2378   struct _FILE_OBJECT *FileObject;
   2379 } IMAGE_INFO_EX, *PIMAGE_INFO_EX;
   2380 
   2381 typedef VOID
   2382 (NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
   2383   IN PUNICODE_STRING FullImageName,
   2384   IN HANDLE ProcessId,
   2385   IN PIMAGE_INFO ImageInfo);
   2386 
   2387 #define THREAD_CSWITCH_PMU_DISABLE  FALSE
   2388 #define THREAD_CSWITCH_PMU_ENABLE   TRUE
   2389 
   2390 #define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001
   2391 
   2392 #define PROCESS_HANDLE_TRACING_MAX_STACKS 16
   2393 
   2394 typedef struct _NT_TIB {
   2395   struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
   2396   PVOID StackBase;
   2397   PVOID StackLimit;
   2398   PVOID SubSystemTib;
   2399   _ANONYMOUS_UNION union {
   2400     PVOID FiberData;
   2401     ULONG Version;
   2402   } DUMMYUNIONNAME;
   2403   PVOID ArbitraryUserPointer;
   2404   struct _NT_TIB *Self;
   2405 } NT_TIB, *PNT_TIB;
   2406 
   2407 typedef struct _NT_TIB32 {
   2408   ULONG ExceptionList;
   2409   ULONG StackBase;
   2410   ULONG StackLimit;
   2411   ULONG SubSystemTib;
   2412   _ANONYMOUS_UNION union {
   2413     ULONG FiberData;
   2414     ULONG Version;
   2415   } DUMMYUNIONNAME;
   2416   ULONG ArbitraryUserPointer;
   2417   ULONG Self;
   2418 } NT_TIB32,*PNT_TIB32;
   2419 
   2420 typedef struct _NT_TIB64 {
   2421   ULONG64 ExceptionList;
   2422   ULONG64 StackBase;
   2423   ULONG64 StackLimit;
   2424   ULONG64 SubSystemTib;
   2425   _ANONYMOUS_UNION union {
   2426     ULONG64 FiberData;
   2427     ULONG Version;
   2428   } DUMMYUNIONNAME;
   2429   ULONG64 ArbitraryUserPointer;
   2430   ULONG64 Self;
   2431 } NT_TIB64,*PNT_TIB64;
   2432 
   2433 typedef enum _PROCESSINFOCLASS {
   2434   ProcessBasicInformation,
   2435   ProcessQuotaLimits,
   2436   ProcessIoCounters,
   2437   ProcessVmCounters,
   2438   ProcessTimes,
   2439   ProcessBasePriority,
   2440   ProcessRaisePriority,
   2441   ProcessDebugPort,
   2442   ProcessExceptionPort,
   2443   ProcessAccessToken,
   2444   ProcessLdtInformation,
   2445   ProcessLdtSize,
   2446   ProcessDefaultHardErrorMode,
   2447   ProcessIoPortHandlers,
   2448   ProcessPooledUsageAndLimits,
   2449   ProcessWorkingSetWatch,
   2450   ProcessUserModeIOPL,
   2451   ProcessEnableAlignmentFaultFixup,
   2452   ProcessPriorityClass,
   2453   ProcessWx86Information,
   2454   ProcessHandleCount,
   2455   ProcessAffinityMask,
   2456   ProcessPriorityBoost,
   2457   ProcessDeviceMap,
   2458   ProcessSessionInformation,
   2459   ProcessForegroundInformation,
   2460   ProcessWow64Information,
   2461   ProcessImageFileName,
   2462   ProcessLUIDDeviceMapsEnabled,
   2463   ProcessBreakOnTermination,
   2464   ProcessDebugObjectHandle,
   2465   ProcessDebugFlags,
   2466   ProcessHandleTracing,
   2467   ProcessIoPriority,
   2468   ProcessExecuteFlags,
   2469   ProcessTlsInformation,
   2470   ProcessCookie,
   2471   ProcessImageInformation,
   2472   ProcessCycleTime,
   2473   ProcessPagePriority,
   2474   ProcessInstrumentationCallback,
   2475   ProcessThreadStackAllocation,
   2476   ProcessWorkingSetWatchEx,
   2477   ProcessImageFileNameWin32,
   2478   ProcessImageFileMapping,
   2479   ProcessAffinityUpdateMode,
   2480   ProcessMemoryAllocationMode,
   2481   ProcessGroupInformation,
   2482   ProcessTokenVirtualizationEnabled,
   2483   ProcessConsoleHostProcess,
   2484   ProcessWindowInformation,
   2485   MaxProcessInfoClass
   2486 } PROCESSINFOCLASS;
   2487 
   2488 typedef enum _THREADINFOCLASS {
   2489   ThreadBasicInformation,
   2490   ThreadTimes,
   2491   ThreadPriority,
   2492   ThreadBasePriority,
   2493   ThreadAffinityMask,
   2494   ThreadImpersonationToken,
   2495   ThreadDescriptorTableEntry,
   2496   ThreadEnableAlignmentFaultFixup,
   2497   ThreadEventPair_Reusable,
   2498   ThreadQuerySetWin32StartAddress,
   2499   ThreadZeroTlsCell,
   2500   ThreadPerformanceCount,
   2501   ThreadAmILastThread,
   2502   ThreadIdealProcessor,
   2503   ThreadPriorityBoost,
   2504   ThreadSetTlsArrayAddress,
   2505   ThreadIsIoPending,
   2506   ThreadHideFromDebugger,
   2507   ThreadBreakOnTermination,
   2508   ThreadSwitchLegacyState,
   2509   ThreadIsTerminated,
   2510   ThreadLastSystemCall,
   2511   ThreadIoPriority,
   2512   ThreadCycleTime,
   2513   ThreadPagePriority,
   2514   ThreadActualBasePriority,
   2515   ThreadTebInformation,
   2516   ThreadCSwitchMon,
   2517   ThreadCSwitchPmu,
   2518   ThreadWow64Context,
   2519   ThreadGroupInformation,
   2520   ThreadUmsInformation,
   2521   ThreadCounterProfiling,
   2522   ThreadIdealProcessorEx,
   2523   MaxThreadInfoClass
   2524 } THREADINFOCLASS;
   2525 
   2526 typedef struct _PAGE_PRIORITY_INFORMATION {
   2527   ULONG PagePriority;
   2528 } PAGE_PRIORITY_INFORMATION, *PPAGE_PRIORITY_INFORMATION;
   2529 
   2530 typedef struct _PROCESS_WS_WATCH_INFORMATION {
   2531   PVOID FaultingPc;
   2532   PVOID FaultingVa;
   2533 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
   2534 
   2535 typedef struct _PROCESS_BASIC_INFORMATION {
   2536   NTSTATUS ExitStatus;
   2537   struct _PEB *PebBaseAddress;
   2538   ULONG_PTR AffinityMask;
   2539   KPRIORITY BasePriority;
   2540   ULONG_PTR UniqueProcessId;
   2541   ULONG_PTR InheritedFromUniqueProcessId;
   2542 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
   2543 
   2544 typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
   2545   SIZE_T Size;
   2546   PROCESS_BASIC_INFORMATION BasicInfo;
   2547   _ANONYMOUS_UNION union {
   2548     ULONG Flags;
   2549     _ANONYMOUS_STRUCT struct {
   2550       ULONG IsProtectedProcess:1;
   2551       ULONG IsWow64Process:1;
   2552       ULONG IsProcessDeleting:1;
   2553       ULONG IsCrossSessionCreate:1;
   2554       ULONG SpareBits:28;
   2555     } DUMMYSTRUCTNAME;
   2556   } DUMMYUNIONNAME;
   2557 } PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;
   2558 
   2559 typedef struct _PROCESS_DEVICEMAP_INFORMATION {
   2560   _ANONYMOUS_UNION union {
   2561     struct {
   2562       HANDLE DirectoryHandle;
   2563     } Set;
   2564     struct {
   2565       ULONG DriveMap;
   2566       UCHAR DriveType[32];
   2567     } Query;
   2568   } DUMMYUNIONNAME;
   2569 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
   2570 
   2571 typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX {
   2572   _ANONYMOUS_UNION union {
   2573     struct {
   2574       HANDLE DirectoryHandle;
   2575     } Set;
   2576     struct {
   2577       ULONG DriveMap;
   2578       UCHAR DriveType[32];
   2579     } Query;
   2580   } DUMMYUNIONNAME;
   2581   ULONG Flags;
   2582 } PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX;
   2583 
   2584 typedef struct _PROCESS_SESSION_INFORMATION {
   2585   ULONG SessionId;
   2586 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
   2587 
   2588 typedef struct _PROCESS_HANDLE_TRACING_ENABLE {
   2589   ULONG Flags;
   2590 } PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE;
   2591 
   2592 typedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX {
   2593   ULONG Flags;
   2594   ULONG TotalSlots;
   2595 } PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX;
   2596 
   2597 typedef struct _PROCESS_HANDLE_TRACING_ENTRY {
   2598   HANDLE Handle;
   2599   CLIENT_ID ClientId;
   2600   ULONG Type;
   2601   PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS];
   2602 } PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY;
   2603 
   2604 typedef struct _PROCESS_HANDLE_TRACING_QUERY {
   2605   HANDLE Handle;
   2606   ULONG TotalTraces;
   2607   PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1];
   2608 } PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY;
   2609 
   2610 extern NTKERNELAPI PEPROCESS PsInitialSystemProcess;
   2611 
   2612 
   2613 /******************************************************************************
   2614  *                           Runtime Library Types                            *
   2615  ******************************************************************************/
   2616 
   2617 #ifndef _RTL_RUN_ONCE_DEF
   2618 #define _RTL_RUN_ONCE_DEF
   2619 
   2620 #define RTL_RUN_ONCE_INIT {0}
   2621 
   2622 #define RTL_RUN_ONCE_CHECK_ONLY     0x00000001UL
   2623 #define RTL_RUN_ONCE_ASYNC          0x00000002UL
   2624 #define RTL_RUN_ONCE_INIT_FAILED    0x00000004UL
   2625 
   2626 #define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
   2627 
   2628 #define RTL_HASH_ALLOCATED_HEADER            0x00000001
   2629 
   2630 #define RTL_HASH_RESERVED_SIGNATURE 0
   2631 
   2632 /* RtlVerifyVersionInfo() ComparisonType */
   2633 
   2634 #define VER_EQUAL                       1
   2635 #define VER_GREATER                     2
   2636 #define VER_GREATER_EQUAL               3
   2637 #define VER_LESS                        4
   2638 #define VER_LESS_EQUAL                  5
   2639 #define VER_AND                         6
   2640 #define VER_OR                          7
   2641 
   2642 #define VER_CONDITION_MASK              7
   2643 #define VER_NUM_BITS_PER_CONDITION_MASK 3
   2644 
   2645 /* RtlVerifyVersionInfo() TypeMask */
   2646 
   2647 #define VER_MINORVERSION                  0x0000001
   2648 #define VER_MAJORVERSION                  0x0000002
   2649 #define VER_BUILDNUMBER                   0x0000004
   2650 #define VER_PLATFORMID                    0x0000008
   2651 #define VER_SERVICEPACKMINOR              0x0000010
   2652 #define VER_SERVICEPACKMAJOR              0x0000020
   2653 #define VER_SUITENAME                     0x0000040
   2654 #define VER_PRODUCT_TYPE                  0x0000080
   2655 
   2656 #define VER_NT_WORKSTATION              0x0000001
   2657 #define VER_NT_DOMAIN_CONTROLLER        0x0000002
   2658 #define VER_NT_SERVER                   0x0000003
   2659 
   2660 #define VER_PLATFORM_WIN32s             0
   2661 #define VER_PLATFORM_WIN32_WINDOWS      1
   2662 #define VER_PLATFORM_WIN32_NT           2
   2663 
   2664 typedef union _RTL_RUN_ONCE {
   2665   PVOID Ptr;
   2666 } RTL_RUN_ONCE, *PRTL_RUN_ONCE;
   2667 
   2668 typedef ULONG /* LOGICAL */
   2669 (NTAPI *PRTL_RUN_ONCE_INIT_FN) (
   2670   IN OUT PRTL_RUN_ONCE RunOnce,
   2671   IN OUT PVOID Parameter OPTIONAL,
   2672   IN OUT PVOID *Context OPTIONAL);
   2673 
   2674 #endif /* _RTL_RUN_ONCE_DEF */
   2675 
   2676 typedef enum _TABLE_SEARCH_RESULT {
   2677   TableEmptyTree,
   2678   TableFoundNode,
   2679   TableInsertAsLeft,
   2680   TableInsertAsRight
   2681 } TABLE_SEARCH_RESULT;
   2682 
   2683 typedef enum _RTL_GENERIC_COMPARE_RESULTS {
   2684   GenericLessThan,
   2685   GenericGreaterThan,
   2686   GenericEqual
   2687 } RTL_GENERIC_COMPARE_RESULTS;
   2688 
   2689 // Forwarder
   2690 struct _RTL_AVL_TABLE;
   2691 
   2692 typedef RTL_GENERIC_COMPARE_RESULTS
   2693 (NTAPI *PRTL_AVL_COMPARE_ROUTINE) (
   2694   IN struct _RTL_AVL_TABLE *Table,
   2695   IN PVOID FirstStruct,
   2696   IN PVOID SecondStruct);
   2697 
   2698 typedef PVOID
   2699 (NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) (
   2700   IN struct _RTL_AVL_TABLE *Table,
   2701   IN CLONG ByteSize);
   2702 
   2703 typedef VOID
   2704 (NTAPI *PRTL_AVL_FREE_ROUTINE) (
   2705   IN struct _RTL_AVL_TABLE *Table,
   2706   IN PVOID Buffer);
   2707 
   2708 typedef NTSTATUS
   2709 (NTAPI *PRTL_AVL_MATCH_FUNCTION) (
   2710   IN struct _RTL_AVL_TABLE *Table,
   2711   IN PVOID UserData,
   2712   IN PVOID MatchData);
   2713 
   2714 typedef struct _RTL_BALANCED_LINKS {
   2715   struct _RTL_BALANCED_LINKS *Parent;
   2716   struct _RTL_BALANCED_LINKS *LeftChild;
   2717   struct _RTL_BALANCED_LINKS *RightChild;
   2718   CHAR Balance;
   2719   UCHAR Reserved[3];
   2720 } RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
   2721 
   2722 typedef struct _RTL_AVL_TABLE {
   2723   RTL_BALANCED_LINKS BalancedRoot;
   2724   PVOID OrderedPointer;
   2725   ULONG WhichOrderedElement;
   2726   ULONG NumberGenericTableElements;
   2727   ULONG DepthOfTree;
   2728   PRTL_BALANCED_LINKS RestartKey;
   2729   ULONG DeleteCount;
   2730   PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
   2731   PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
   2732   PRTL_AVL_FREE_ROUTINE FreeRoutine;
   2733   PVOID TableContext;
   2734 } RTL_AVL_TABLE, *PRTL_AVL_TABLE;
   2735 
   2736 #ifndef RTL_USE_AVL_TABLES
   2737 
   2738 struct _RTL_GENERIC_TABLE;
   2739 
   2740 typedef RTL_GENERIC_COMPARE_RESULTS
   2741 (NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) (
   2742   IN struct _RTL_GENERIC_TABLE *Table,
   2743   IN PVOID FirstStruct,
   2744   IN PVOID SecondStruct);
   2745 
   2746 typedef PVOID
   2747 (NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) (
   2748   IN struct _RTL_GENERIC_TABLE *Table,
   2749   IN CLONG ByteSize);
   2750 
   2751 typedef VOID
   2752 (NTAPI *PRTL_GENERIC_FREE_ROUTINE) (
   2753   IN struct _RTL_GENERIC_TABLE *Table,
   2754   IN PVOID Buffer);
   2755 
   2756 typedef struct _RTL_SPLAY_LINKS {
   2757   struct _RTL_SPLAY_LINKS *Parent;
   2758   struct _RTL_SPLAY_LINKS *LeftChild;
   2759   struct _RTL_SPLAY_LINKS *RightChild;
   2760 } RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
   2761 
   2762 typedef struct _RTL_GENERIC_TABLE {
   2763   PRTL_SPLAY_LINKS TableRoot;
   2764   LIST_ENTRY InsertOrderList;
   2765   PLIST_ENTRY OrderedPointer;
   2766   ULONG WhichOrderedElement;
   2767   ULONG NumberGenericTableElements;
   2768   PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
   2769   PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
   2770   PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
   2771   PVOID TableContext;
   2772 } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
   2773 
   2774 #endif /* !RTL_USE_AVL_TABLES */
   2775 
   2776 #ifdef RTL_USE_AVL_TABLES
   2777 
   2778 #undef PRTL_GENERIC_COMPARE_ROUTINE
   2779 #undef RTL_GENERIC_COMPARE_ROUTINE
   2780 #undef PRTL_GENERIC_ALLOCATE_ROUTINE
   2781 #undef RTL_GENERIC_ALLOCATE_ROUTINE
   2782 #undef PRTL_GENERIC_FREE_ROUTINE
   2783 #undef RTL_GENERIC_FREE_ROUTINE
   2784 #undef RTL_GENERIC_TABLE
   2785 #undef PRTL_GENERIC_TABLE
   2786 
   2787 #define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE
   2788 #define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE
   2789 #define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE
   2790 #define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE
   2791 #define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE
   2792 #define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE
   2793 #define RTL_GENERIC_TABLE RTL_AVL_TABLE
   2794 #define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
   2795 
   2796 #endif /* RTL_USE_AVL_TABLES */
   2797 
   2798 typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY {
   2799   LIST_ENTRY Linkage;
   2800   ULONG_PTR Signature;
   2801 } RTL_DYNAMIC_HASH_TABLE_ENTRY, *PRTL_DYNAMIC_HASH_TABLE_ENTRY;
   2802 
   2803 typedef struct _RTL_DYNAMIC_HASH_TABLE_CONTEXT {
   2804   PLIST_ENTRY ChainHead;
   2805   PLIST_ENTRY PrevLinkage;
   2806   ULONG_PTR Signature;
   2807 } RTL_DYNAMIC_HASH_TABLE_CONTEXT, *PRTL_DYNAMIC_HASH_TABLE_CONTEXT;
   2808 
   2809 typedef struct _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR {
   2810   RTL_DYNAMIC_HASH_TABLE_ENTRY HashEntry;
   2811   PLIST_ENTRY ChainHead;
   2812   ULONG BucketIndex;
   2813 } RTL_DYNAMIC_HASH_TABLE_ENUMERATOR, *PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR;
   2814 
   2815 typedef struct _RTL_DYNAMIC_HASH_TABLE {
   2816   ULONG Flags;
   2817   ULONG Shift;
   2818   ULONG TableSize;
   2819   ULONG Pivot;
   2820   ULONG DivisorMask;
   2821   ULONG NumEntries;
   2822   ULONG NonEmptyBuckets;
   2823   ULONG NumEnumerators;
   2824   PVOID Directory;
   2825 } RTL_DYNAMIC_HASH_TABLE, *PRTL_DYNAMIC_HASH_TABLE;
   2826 
   2827 typedef struct _OSVERSIONINFOA {
   2828   ULONG dwOSVersionInfoSize;
   2829   ULONG dwMajorVersion;
   2830   ULONG dwMinorVersion;
   2831   ULONG dwBuildNumber;
   2832   ULONG dwPlatformId;
   2833   CHAR szCSDVersion[128];
   2834 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
   2835 
   2836 typedef struct _OSVERSIONINFOW {
   2837   ULONG dwOSVersionInfoSize;
   2838   ULONG dwMajorVersion;
   2839   ULONG dwMinorVersion;
   2840   ULONG dwBuildNumber;
   2841   ULONG dwPlatformId;
   2842   WCHAR szCSDVersion[128];
   2843 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
   2844 
   2845 typedef struct _OSVERSIONINFOEXA {
   2846   ULONG dwOSVersionInfoSize;
   2847   ULONG dwMajorVersion;
   2848   ULONG dwMinorVersion;
   2849   ULONG dwBuildNumber;
   2850   ULONG dwPlatformId;
   2851   CHAR szCSDVersion[128];
   2852   USHORT wServicePackMajor;
   2853   USHORT wServicePackMinor;
   2854   USHORT wSuiteMask;
   2855   UCHAR wProductType;
   2856   UCHAR wReserved;
   2857 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
   2858 
   2859 typedef struct _OSVERSIONINFOEXW {
   2860   ULONG dwOSVersionInfoSize;
   2861   ULONG dwMajorVersion;
   2862   ULONG dwMinorVersion;
   2863   ULONG dwBuildNumber;
   2864   ULONG dwPlatformId;
   2865   WCHAR szCSDVersion[128];
   2866   USHORT wServicePackMajor;
   2867   USHORT wServicePackMinor;
   2868   USHORT wSuiteMask;
   2869   UCHAR wProductType;
   2870   UCHAR wReserved;
   2871 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
   2872 
   2873 #ifdef UNICODE
   2874 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
   2875 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
   2876 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
   2877 typedef OSVERSIONINFOW OSVERSIONINFO;
   2878 typedef POSVERSIONINFOW POSVERSIONINFO;
   2879 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
   2880 #else
   2881 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
   2882 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
   2883 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
   2884 typedef OSVERSIONINFOA OSVERSIONINFO;
   2885 typedef POSVERSIONINFOA POSVERSIONINFO;
   2886 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
   2887 #endif /* UNICODE */
   2888 
   2889 #define HASH_ENTRY_KEY(x)    ((x)->Signature)
   2890 
   2891 /******************************************************************************
   2892  *                            Security Manager Types                          *
   2893  ******************************************************************************/
   2894 #define SE_UNSOLICITED_INPUT_PRIVILEGE    6
   2895 
   2896 typedef enum _WELL_KNOWN_SID_TYPE {
   2897   WinNullSid = 0,
   2898   WinWorldSid = 1,
   2899   WinLocalSid = 2,
   2900   WinCreatorOwnerSid = 3,
   2901   WinCreatorGroupSid = 4,
   2902   WinCreatorOwnerServerSid = 5,
   2903   WinCreatorGroupServerSid = 6,
   2904   WinNtAuthoritySid = 7,
   2905   WinDialupSid = 8,
   2906   WinNetworkSid = 9,
   2907   WinBatchSid = 10,
   2908   WinInteractiveSid = 11,
   2909   WinServiceSid = 12,
   2910   WinAnonymousSid = 13,
   2911   WinProxySid = 14,
   2912   WinEnterpriseControllersSid = 15,
   2913   WinSelfSid = 16,
   2914   WinAuthenticatedUserSid = 17,
   2915   WinRestrictedCodeSid = 18,
   2916   WinTerminalServerSid = 19,
   2917   WinRemoteLogonIdSid = 20,
   2918   WinLogonIdsSid = 21,
   2919   WinLocalSystemSid = 22,
   2920   WinLocalServiceSid = 23,
   2921   WinNetworkServiceSid = 24,
   2922   WinBuiltinDomainSid = 25,
   2923   WinBuiltinAdministratorsSid = 26,
   2924   WinBuiltinUsersSid = 27,
   2925   WinBuiltinGuestsSid = 28,
   2926   WinBuiltinPowerUsersSid = 29,
   2927   WinBuiltinAccountOperatorsSid = 30,
   2928   WinBuiltinSystemOperatorsSid = 31,
   2929   WinBuiltinPrintOperatorsSid = 32,
   2930   WinBuiltinBackupOperatorsSid = 33,
   2931   WinBuiltinReplicatorSid = 34,
   2932   WinBuiltinPreWindows2000CompatibleAccessSid = 35,
   2933   WinBuiltinRemoteDesktopUsersSid = 36,
   2934   WinBuiltinNetworkConfigurationOperatorsSid = 37,
   2935   WinAccountAdministratorSid = 38,
   2936   WinAccountGuestSid = 39,
   2937   WinAccountKrbtgtSid = 40,
   2938   WinAccountDomainAdminsSid = 41,
   2939   WinAccountDomainUsersSid = 42,
   2940   WinAccountDomainGuestsSid = 43,
   2941   WinAccountComputersSid = 44,
   2942   WinAccountControllersSid = 45,
   2943   WinAccountCertAdminsSid = 46,
   2944   WinAccountSchemaAdminsSid = 47,
   2945   WinAccountEnterpriseAdminsSid = 48,
   2946   WinAccountPolicyAdminsSid = 49,
   2947   WinAccountRasAndIasServersSid = 50,
   2948   WinNTLMAuthenticationSid = 51,
   2949   WinDigestAuthenticationSid = 52,
   2950   WinSChannelAuthenticationSid = 53,
   2951   WinThisOrganizationSid = 54,
   2952   WinOtherOrganizationSid = 55,
   2953   WinBuiltinIncomingForestTrustBuildersSid = 56,
   2954   WinBuiltinPerfMonitoringUsersSid = 57,
   2955   WinBuiltinPerfLoggingUsersSid = 58,
   2956   WinBuiltinAuthorizationAccessSid = 59,
   2957   WinBuiltinTerminalServerLicenseServersSid = 60,
   2958   WinBuiltinDCOMUsersSid = 61,
   2959   WinBuiltinIUsersSid = 62,
   2960   WinIUserSid = 63,
   2961   WinBuiltinCryptoOperatorsSid = 64,
   2962   WinUntrustedLabelSid = 65,
   2963   WinLowLabelSid = 66,
   2964   WinMediumLabelSid = 67,
   2965   WinHighLabelSid = 68,
   2966   WinSystemLabelSid = 69,
   2967   WinWriteRestrictedCodeSid = 70,
   2968   WinCreatorOwnerRightsSid = 71,
   2969   WinCacheablePrincipalsGroupSid = 72,
   2970   WinNonCacheablePrincipalsGroupSid = 73,
   2971   WinEnterpriseReadonlyControllersSid = 74,
   2972   WinAccountReadonlyControllersSid = 75,
   2973   WinBuiltinEventLogReadersGroup = 76,
   2974   WinNewEnterpriseReadonlyControllersSid = 77,
   2975   WinBuiltinCertSvcDComAccessGroup = 78,
   2976   WinMediumPlusLabelSid = 79,
   2977   WinLocalLogonSid = 80,
   2978   WinConsoleLogonSid = 81,
   2979   WinThisOrganizationCertificateSid = 82,
   2980 } WELL_KNOWN_SID_TYPE;
   2981 
   2982 #if defined(_M_IX86)
   2983 
   2984 #define PAUSE_PROCESSOR YieldProcessor();
   2985 
   2986 #define KERNEL_STACK_SIZE                   12288
   2987 #define KERNEL_LARGE_STACK_SIZE             61440
   2988 #define KERNEL_LARGE_STACK_COMMIT           12288
   2989 
   2990 #define SIZE_OF_80387_REGISTERS   80
   2991 
   2992 #if !defined(RC_INVOKED)
   2993 
   2994 #define CONTEXT_i386               0x10000
   2995 #define CONTEXT_i486               0x10000
   2996 #define CONTEXT_CONTROL            (CONTEXT_i386|0x00000001L)
   2997 #define CONTEXT_INTEGER            (CONTEXT_i386|0x00000002L)
   2998 #define CONTEXT_SEGMENTS           (CONTEXT_i386|0x00000004L)
   2999 #define CONTEXT_FLOATING_POINT     (CONTEXT_i386|0x00000008L)
   3000 #define CONTEXT_DEBUG_REGISTERS    (CONTEXT_i386|0x00000010L)
   3001 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
   3002 
   3003 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
   3004 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS |  \
   3005                      CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS |      \
   3006                      CONTEXT_EXTENDED_REGISTERS)
   3007 
   3008 #define CONTEXT_XSTATE          (CONTEXT_i386 | 0x00000040L)
   3009 
   3010 #endif /* !defined(RC_INVOKED) */
   3011 
   3012 typedef struct _FLOATING_SAVE_AREA {
   3013   ULONG ControlWord;
   3014   ULONG StatusWord;
   3015   ULONG TagWord;
   3016   ULONG ErrorOffset;
   3017   ULONG ErrorSelector;
   3018   ULONG DataOffset;
   3019   ULONG DataSelector;
   3020   UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
   3021   ULONG Cr0NpxState;
   3022 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
   3023 
   3024 #include "pshpack4.h"
   3025 typedef struct _CONTEXT {
   3026   ULONG ContextFlags;
   3027   ULONG Dr0;
   3028   ULONG Dr1;
   3029   ULONG Dr2;
   3030   ULONG Dr3;
   3031   ULONG Dr6;
   3032   ULONG Dr7;
   3033   FLOATING_SAVE_AREA FloatSave;
   3034   ULONG SegGs;
   3035   ULONG SegFs;
   3036   ULONG SegEs;
   3037   ULONG SegDs;
   3038   ULONG Edi;
   3039   ULONG Esi;
   3040   ULONG Ebx;
   3041   ULONG Edx;
   3042   ULONG Ecx;
   3043   ULONG Eax;
   3044   ULONG Ebp;
   3045   ULONG Eip;
   3046   ULONG SegCs;
   3047   ULONG EFlags;
   3048   ULONG Esp;
   3049   ULONG SegSs;
   3050   UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
   3051 } CONTEXT;
   3052 #include "poppack.h"
   3053 
   3054 #define KeGetPcr()                      PCR
   3055 
   3056 #define PCR_MINOR_VERSION 1
   3057 #define PCR_MAJOR_VERSION 1
   3058 
   3059 typedef struct _KPCR {
   3060   union {
   3061     NT_TIB NtTib;
   3062     struct {
   3063       struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
   3064       PVOID Used_StackBase;
   3065       PVOID Spare2;
   3066       PVOID TssCopy;
   3067       ULONG ContextSwitches;
   3068       KAFFINITY SetMemberCopy;
   3069       PVOID Used_Self;
   3070     };
   3071   };
   3072   struct _KPCR *SelfPcr;
   3073   struct _KPRCB *Prcb;
   3074   KIRQL Irql;
   3075   ULONG IRR;
   3076   ULONG IrrActive;
   3077   ULONG IDR;
   3078   PVOID KdVersionBlock;
   3079   struct _KIDTENTRY *IDT;
   3080   struct _KGDTENTRY *GDT;
   3081   struct _KTSS *TSS;
   3082   USHORT MajorVersion;
   3083   USHORT MinorVersion;
   3084   KAFFINITY SetMember;
   3085   ULONG StallScaleFactor;
   3086   UCHAR SpareUnused;
   3087   UCHAR Number;
   3088   UCHAR Spare0;
   3089   UCHAR SecondLevelCacheAssociativity;
   3090   ULONG VdmAlert;
   3091   ULONG KernelReserved[14];
   3092   ULONG SecondLevelCacheSize;
   3093   ULONG HalReserved[16];
   3094 } KPCR, *PKPCR;
   3095 
   3096 FORCEINLINE
   3097 ULONG
   3098 KeGetCurrentProcessorNumber(VOID)
   3099 {
   3100     return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
   3101 }
   3102 
   3103 
   3104 extern NTKERNELAPI PVOID MmHighestUserAddress;
   3105 extern NTKERNELAPI PVOID MmSystemRangeStart;
   3106 extern NTKERNELAPI ULONG MmUserProbeAddress;
   3107 
   3108 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
   3109 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
   3110 #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
   3111 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
   3112 extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
   3113 #else
   3114 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
   3115 #endif
   3116 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
   3117 #define MM_KSEG0_BASE       MM_SYSTEM_RANGE_START
   3118 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
   3119 #if !defined (_X86PAE_)
   3120 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
   3121 #else
   3122 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
   3123 #endif
   3124 
   3125 #elif defined(_M_AMD64)
   3126 
   3127 #define PAUSE_PROCESSOR YieldProcessor();
   3128 
   3129 #define KERNEL_STACK_SIZE 0x6000
   3130 #define KERNEL_LARGE_STACK_SIZE 0x12000
   3131 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
   3132 
   3133 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
   3134 
   3135 #define EXCEPTION_READ_FAULT    0
   3136 #define EXCEPTION_WRITE_FAULT   1
   3137 #define EXCEPTION_EXECUTE_FAULT 8
   3138 
   3139 #if !defined(RC_INVOKED)
   3140 
   3141 #define CONTEXT_AMD64 0x100000
   3142 
   3143 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
   3144 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
   3145 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
   3146 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
   3147 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
   3148 
   3149 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
   3150 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
   3151 
   3152 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
   3153 
   3154 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
   3155 #define CONTEXT_SERVICE_ACTIVE 0x10000000
   3156 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
   3157 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
   3158 
   3159 #endif /* !defined(RC_INVOKED) */
   3160 
   3161 #define INITIAL_MXCSR                  0x1f80
   3162 #define INITIAL_FPCSR                  0x027f
   3163 
   3164 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
   3165   ULONG64 P1Home;
   3166   ULONG64 P2Home;
   3167   ULONG64 P3Home;
   3168   ULONG64 P4Home;
   3169   ULONG64 P5Home;
   3170   ULONG64 P6Home;
   3171   ULONG ContextFlags;
   3172   ULONG MxCsr;
   3173   USHORT SegCs;
   3174   USHORT SegDs;
   3175   USHORT SegEs;
   3176   USHORT SegFs;
   3177   USHORT SegGs;
   3178   USHORT SegSs;
   3179   ULONG EFlags;
   3180   ULONG64 Dr0;
   3181   ULONG64 Dr1;
   3182   ULONG64 Dr2;
   3183   ULONG64 Dr3;
   3184   ULONG64 Dr6;
   3185   ULONG64 Dr7;
   3186   ULONG64 Rax;
   3187   ULONG64 Rcx;
   3188   ULONG64 Rdx;
   3189   ULONG64 Rbx;
   3190   ULONG64 Rsp;
   3191   ULONG64 Rbp;
   3192   ULONG64 Rsi;
   3193   ULONG64 Rdi;
   3194   ULONG64 R8;
   3195   ULONG64 R9;
   3196   ULONG64 R10;
   3197   ULONG64 R11;
   3198   ULONG64 R12;
   3199   ULONG64 R13;
   3200   ULONG64 R14;
   3201   ULONG64 R15;
   3202   ULONG64 Rip;
   3203   _ANONYMOUS_UNION union {
   3204     XMM_SAVE_AREA32 FltSave;
   3205     _ANONYMOUS_STRUCT struct {
   3206       M128A Header[2];
   3207       M128A Legacy[8];
   3208       M128A Xmm0;
   3209       M128A Xmm1;
   3210       M128A Xmm2;
   3211       M128A Xmm3;
   3212       M128A Xmm4;
   3213       M128A Xmm5;
   3214       M128A Xmm6;
   3215       M128A Xmm7;
   3216       M128A Xmm8;
   3217       M128A Xmm9;
   3218       M128A Xmm10;
   3219       M128A Xmm11;
   3220       M128A Xmm12;
   3221       M128A Xmm13;
   3222       M128A Xmm14;
   3223       M128A Xmm15;
   3224     } DUMMYSTRUCTNAME;
   3225   } DUMMYUNIONNAME;
   3226   M128A VectorRegister[26];
   3227   ULONG64 VectorControl;
   3228   ULONG64 DebugControl;
   3229   ULONG64 LastBranchToRip;
   3230   ULONG64 LastBranchFromRip;
   3231   ULONG64 LastExceptionToRip;
   3232   ULONG64 LastExceptionFromRip;
   3233 } CONTEXT;
   3234 
   3235 #define PCR_MINOR_VERSION 1
   3236 #define PCR_MAJOR_VERSION 1
   3237 
   3238 typedef struct _KPCR {
   3239   _ANONYMOUS_UNION union {
   3240     NT_TIB NtTib;
   3241     _ANONYMOUS_STRUCT struct {
   3242       union _KGDTENTRY64 *GdtBase;
   3243       struct _KTSS64 *TssBase;
   3244       ULONG64 UserRsp;
   3245       struct _KPCR *Self;
   3246       struct _KPRCB *CurrentPrcb;
   3247       PKSPIN_LOCK_QUEUE LockArray;
   3248       PVOID Used_Self;
   3249     };
   3250   };
   3251   union _KIDTENTRY64 *IdtBase;
   3252   ULONG64 Unused[2];
   3253   KIRQL Irql;
   3254   UCHAR SecondLevelCacheAssociativity;
   3255   UCHAR ObsoleteNumber;
   3256   UCHAR Fill0;
   3257   ULONG Unused0[3];
   3258   USHORT MajorVersion;
   3259   USHORT MinorVersion;
   3260   ULONG StallScaleFactor;
   3261   PVOID Unused1[3];
   3262   ULONG KernelReserved[15];
   3263   ULONG SecondLevelCacheSize;
   3264   ULONG HalReserved[16];
   3265   ULONG Unused2;
   3266   PVOID KdVersionBlock;
   3267   PVOID Unused3;
   3268   ULONG PcrAlign1[24];
   3269 } KPCR, *PKPCR;
   3270 
   3271 FORCEINLINE
   3272 PKPCR
   3273 KeGetPcr(VOID)
   3274 {
   3275     return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
   3276 }
   3277 
   3278 FORCEINLINE
   3279 ULONG
   3280 KeGetCurrentProcessorNumber(VOID)
   3281 {
   3282     return (ULONG)__readgsword(0x184);
   3283 }
   3284 
   3285 
   3286 #define PTI_SHIFT  12L
   3287 #define PDI_SHIFT  21L
   3288 #define PPI_SHIFT  30L
   3289 #define PXI_SHIFT  39L
   3290 #define PTE_PER_PAGE 512
   3291 #define PDE_PER_PAGE 512
   3292 #define PPE_PER_PAGE 512
   3293 #define PXE_PER_PAGE 512
   3294 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
   3295 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
   3296 #define PPI_MASK (PPE_PER_PAGE - 1)
   3297 #define PXI_MASK (PXE_PER_PAGE - 1)
   3298 
   3299 #define PXE_BASE    0xFFFFF6FB7DBED000ULL
   3300 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
   3301 #define PPE_BASE    0xFFFFF6FB7DA00000ULL
   3302 #define PDE_BASE    0xFFFFF6FB40000000ULL
   3303 #define PTE_BASE    0xFFFFF68000000000ULL
   3304 #define PXE_TOP     0xFFFFF6FB7DBEDFFFULL
   3305 #define PPE_TOP     0xFFFFF6FB7DBFFFFFULL
   3306 #define PDE_TOP     0xFFFFF6FB7FFFFFFFULL
   3307 #define PTE_TOP     0xFFFFF6FFFFFFFFFFULL
   3308 
   3309 extern NTKERNELAPI PVOID MmHighestUserAddress;
   3310 extern NTKERNELAPI PVOID MmSystemRangeStart;
   3311 extern NTKERNELAPI ULONG64 MmUserProbeAddress;
   3312 
   3313 #define MM_HIGHEST_USER_ADDRESS           MmHighestUserAddress
   3314 #define MM_SYSTEM_RANGE_START             MmSystemRangeStart
   3315 #define MM_USER_PROBE_ADDRESS             MmUserProbeAddress
   3316 #define MM_LOWEST_USER_ADDRESS   (PVOID)0x10000
   3317 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
   3318 
   3319 
   3320 #elif defined(_M_IA64)
   3321 
   3322 #elif defined(_M_PPC)
   3323 
   3324 
   3325 #elif defined(_M_MIPS)
   3326 
   3327 #elif defined(_M_ARM)
   3328 #else
   3329 #error Unknown Architecture
   3330 #endif
   3331 
   3332 /******************************************************************************
   3333  *                          Executive Functions                               *
   3334  ******************************************************************************/
   3335 
   3336 static __inline PVOID
   3337 ExAllocateFromZone(
   3338   IN PZONE_HEADER Zone)
   3339 {
   3340   PVOID Result = (PVOID)Zone->FreeList.Next;
   3341   if (Zone->FreeList.Next)
   3342     Zone->FreeList.Next = Zone->FreeList.Next->Next;
   3343   return Result;
   3344 }
   3345 
   3346 static __inline PVOID
   3347 ExFreeToZone(
   3348   IN PZONE_HEADER Zone,
   3349   IN PVOID Block)
   3350 {
   3351   ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
   3352   Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
   3353   return ((PSINGLE_LIST_ENTRY) Block)->Next;
   3354 }
   3355 
   3356 /*
   3357  * PVOID
   3358  * ExInterlockedAllocateFromZone(
   3359  *   IN PZONE_HEADER  Zone,
   3360  *   IN PKSPIN_LOCK  Lock)
   3361  */
   3362 #define ExInterlockedAllocateFromZone(Zone, Lock) \
   3363     ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
   3364 
   3365 /* PVOID
   3366  * ExInterlockedFreeToZone(
   3367  *  IN PZONE_HEADER  Zone,
   3368  *  IN PVOID  Block,
   3369  *  IN PKSPIN_LOCK  Lock);
   3370  */
   3371 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
   3372     ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
   3373 
   3374 /*
   3375  * BOOLEAN
   3376  * ExIsFullZone(
   3377  *  IN PZONE_HEADER  Zone)
   3378  */
   3379 #define ExIsFullZone(Zone) \
   3380   ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
   3381 
   3382 /* BOOLEAN
   3383  * ExIsObjectInFirstZoneSegment(
   3384  *     IN PZONE_HEADER Zone,
   3385  *     IN PVOID Object);
   3386  */
   3387 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
   3388     ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
   3389                 ((PUCHAR)(Object) <  (PUCHAR)(Zone)->SegmentList.Next + \
   3390                          (Zone)->TotalSegmentSize)) )
   3391 
   3392 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
   3393 #define ExAcquireResourceShared ExAcquireResourceSharedLite
   3394 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
   3395 #define ExDeleteResource ExDeleteResourceLite
   3396 #define ExInitializeResource ExInitializeResourceLite
   3397 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
   3398 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
   3399 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
   3400 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
   3401 
   3402 #ifndef _M_IX86
   3403 #define RESULT_ZERO     0
   3404 #define RESULT_NEGATIVE 1
   3405 #define RESULT_POSITIVE 2
   3406 #endif
   3407 
   3408 typedef enum _INTERLOCKED_RESULT {
   3409   ResultNegative = RESULT_NEGATIVE,
   3410   ResultZero = RESULT_ZERO,
   3411   ResultPositive = RESULT_POSITIVE
   3412 } INTERLOCKED_RESULT;
   3413 
   3414 #ifdef _X86_
   3415 
   3416 NTKERNELAPI
   3417 INTERLOCKED_RESULT
   3418 FASTCALL
   3419 Exfi386InterlockedIncrementLong(
   3420   IN OUT LONG volatile *Addend);
   3421 
   3422 NTKERNELAPI
   3423 INTERLOCKED_RESULT
   3424 FASTCALL
   3425 Exfi386InterlockedDecrementLong(
   3426   IN PLONG  Addend);
   3427 
   3428 NTKERNELAPI
   3429 ULONG
   3430 FASTCALL
   3431 Exfi386InterlockedExchangeUlong(
   3432   IN PULONG  Target,
   3433   IN ULONG  Value);
   3434 
   3435 #endif
   3436 
   3437 
   3438 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   3439 NTKERNELAPI
   3440 NTSTATUS
   3441 NTAPI
   3442 ExExtendZone(
   3443   IN OUT PZONE_HEADER Zone,
   3444   IN OUT PVOID Segment,
   3445   IN ULONG SegmentSize);
   3446 
   3447 NTKERNELAPI
   3448 NTSTATUS
   3449 NTAPI
   3450 ExInitializeZone(
   3451   OUT PZONE_HEADER Zone,
   3452   IN ULONG BlockSize,
   3453   IN OUT PVOID InitialSegment,
   3454   IN ULONG InitialSegmentSize);
   3455 
   3456 NTKERNELAPI
   3457 NTSTATUS
   3458 NTAPI
   3459 ExInterlockedExtendZone(
   3460   IN OUT PZONE_HEADER Zone,
   3461   IN OUT PVOID Segment,
   3462   IN ULONG SegmentSize,
   3463   IN OUT PKSPIN_LOCK Lock);
   3464 
   3465 NTKERNELAPI
   3466 NTSTATUS
   3467 NTAPI
   3468 ExUuidCreate(
   3469   OUT UUID *Uuid);
   3470 
   3471 NTKERNELAPI
   3472 DECLSPEC_NORETURN
   3473 VOID
   3474 NTAPI
   3475 ExRaiseAccessViolation(VOID);
   3476 
   3477 NTKERNELAPI
   3478 DECLSPEC_NORETURN
   3479 VOID
   3480 NTAPI
   3481 ExRaiseDatatypeMisalignment(VOID);
   3482 
   3483 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   3484 
   3485 
   3486 /* Hardware Abstraction Layer Functions */
   3487 
   3488 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   3489 
   3490 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
   3491 
   3492 /* Nothing here */
   3493 
   3494 #else /* USE_DMA_MACROS ... */
   3495 
   3496 //DECLSPEC_DEPRECATED_DDK
   3497 NTHALAPI
   3498 VOID
   3499 NTAPI
   3500 IoFreeAdapterChannel(
   3501   IN PADAPTER_OBJECT AdapterObject);
   3502 
   3503 //DECLSPEC_DEPRECATED_DDK
   3504 NTHALAPI
   3505 BOOLEAN
   3506 NTAPI
   3507 IoFlushAdapterBuffers(
   3508   IN PADAPTER_OBJECT AdapterObject,
   3509   IN PMDL Mdl,
   3510   IN PVOID MapRegisterBase,
   3511   IN PVOID CurrentVa,
   3512   IN ULONG Length,
   3513   IN BOOLEAN WriteToDevice);
   3514 
   3515 //DECLSPEC_DEPRECATED_DDK
   3516 NTHALAPI
   3517 VOID
   3518 NTAPI
   3519 IoFreeMapRegisters(
   3520   IN PADAPTER_OBJECT AdapterObject,
   3521   IN PVOID MapRegisterBase,
   3522   IN ULONG NumberOfMapRegisters);
   3523 
   3524 //DECLSPEC_DEPRECATED_DDK
   3525 NTHALAPI
   3526 PVOID
   3527 NTAPI
   3528 HalAllocateCommonBuffer(
   3529   IN PADAPTER_OBJECT AdapterObject,
   3530   IN ULONG Length,
   3531   OUT PPHYSICAL_ADDRESS LogicalAddress,
   3532   IN BOOLEAN CacheEnabled);
   3533 
   3534 //DECLSPEC_DEPRECATED_DDK
   3535 NTHALAPI
   3536 VOID
   3537 NTAPI
   3538 HalFreeCommonBuffer(
   3539   IN PADAPTER_OBJECT AdapterObject,
   3540   IN ULONG Length,
   3541   IN PHYSICAL_ADDRESS LogicalAddress,
   3542   IN PVOID VirtualAddress,
   3543   IN BOOLEAN CacheEnabled);
   3544 
   3545 //DECLSPEC_DEPRECATED_DDK
   3546 NTHALAPI
   3547 ULONG
   3548 NTAPI
   3549 HalReadDmaCounter(
   3550   IN PADAPTER_OBJECT AdapterObject);
   3551 
   3552 NTHALAPI
   3553 NTSTATUS
   3554 NTAPI
   3555 HalAllocateAdapterChannel(
   3556   IN PADAPTER_OBJECT  AdapterObject,
   3557   IN PWAIT_CONTEXT_BLOCK  Wcb,
   3558   IN ULONG  NumberOfMapRegisters,
   3559   IN PDRIVER_CONTROL  ExecutionRoutine);
   3560 
   3561 #endif /* USE_DMA_MACROS ... */
   3562 
   3563 #if !defined(NO_LEGACY_DRIVERS)
   3564 NTHALAPI
   3565 NTSTATUS
   3566 NTAPI
   3567 HalAssignSlotResources(
   3568   IN PUNICODE_STRING RegistryPath,
   3569   IN PUNICODE_STRING DriverClassName,
   3570   IN PDRIVER_OBJECT DriverObject,
   3571   IN PDEVICE_OBJECT DeviceObject,
   3572   IN INTERFACE_TYPE BusType,
   3573   IN ULONG BusNumber,
   3574   IN ULONG SlotNumber,
   3575   IN OUT PCM_RESOURCE_LIST *AllocatedResources);
   3576 
   3577 NTHALAPI
   3578 ULONG
   3579 NTAPI
   3580 HalGetInterruptVector(
   3581   IN INTERFACE_TYPE InterfaceType,
   3582   IN ULONG BusNumber,
   3583   IN ULONG BusInterruptLevel,
   3584   IN ULONG BusInterruptVector,
   3585   OUT PKIRQL Irql,
   3586   OUT PKAFFINITY Affinity);
   3587 
   3588 NTHALAPI
   3589 ULONG
   3590 NTAPI
   3591 HalSetBusData(
   3592   IN BUS_DATA_TYPE BusDataType,
   3593   IN ULONG BusNumber,
   3594   IN ULONG SlotNumber,
   3595   IN PVOID Buffer,
   3596   IN ULONG Length);
   3597 
   3598 NTHALAPI
   3599 ULONG
   3600 NTAPI
   3601 HalGetBusData(
   3602   IN BUS_DATA_TYPE BusDataType,
   3603   IN ULONG BusNumber,
   3604   IN ULONG SlotNumber,
   3605   OUT PVOID Buffer,
   3606   IN ULONG Length);
   3607 
   3608 NTHALAPI
   3609 BOOLEAN
   3610 NTAPI
   3611 HalMakeBeep(
   3612   IN ULONG Frequency);
   3613 #endif /* !defined(NO_LEGACY_DRIVERS) */
   3614 
   3615 NTHALAPI
   3616 PADAPTER_OBJECT
   3617 NTAPI
   3618 HalGetAdapter(
   3619   IN PDEVICE_DESCRIPTION DeviceDescription,
   3620   OUT PULONG NumberOfMapRegisters);
   3621 
   3622 VOID
   3623 NTAPI
   3624 HalPutDmaAdapter(
   3625   IN PADAPTER_OBJECT DmaAdapter);
   3626 
   3627 NTHALAPI
   3628 VOID
   3629 NTAPI
   3630 HalAcquireDisplayOwnership(
   3631   IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
   3632 
   3633 NTHALAPI
   3634 ULONG
   3635 NTAPI
   3636 HalGetBusDataByOffset(
   3637   IN BUS_DATA_TYPE BusDataType,
   3638   IN ULONG BusNumber,
   3639   IN ULONG SlotNumber,
   3640   OUT PVOID Buffer,
   3641   IN ULONG Offset,
   3642   IN ULONG Length);
   3643 
   3644 NTHALAPI
   3645 ULONG
   3646 NTAPI
   3647 HalSetBusDataByOffset(
   3648   IN BUS_DATA_TYPE BusDataType,
   3649   IN ULONG BusNumber,
   3650   IN ULONG SlotNumber,
   3651   IN PVOID Buffer,
   3652   IN ULONG Offset,
   3653   IN ULONG Length);
   3654 
   3655 NTHALAPI
   3656 BOOLEAN
   3657 NTAPI
   3658 HalTranslateBusAddress(
   3659   IN INTERFACE_TYPE InterfaceType,
   3660   IN ULONG BusNumber,
   3661   IN PHYSICAL_ADDRESS BusAddress,
   3662   IN OUT PULONG AddressSpace,
   3663   OUT PPHYSICAL_ADDRESS TranslatedAddress);
   3664 
   3665 NTHALAPI
   3666 PVOID
   3667 NTAPI
   3668 HalAllocateCrashDumpRegisters(
   3669   IN PADAPTER_OBJECT AdapterObject,
   3670   IN OUT PULONG NumberOfMapRegisters);
   3671 
   3672 NTSTATUS
   3673 NTAPI
   3674 HalGetScatterGatherList(
   3675   IN PADAPTER_OBJECT DmaAdapter,
   3676   IN PDEVICE_OBJECT DeviceObject,
   3677   IN PMDL Mdl,
   3678   IN PVOID CurrentVa,
   3679   IN ULONG Length,
   3680   IN PDRIVER_LIST_CONTROL ExecutionRoutine,
   3681   IN PVOID Context,
   3682   IN BOOLEAN WriteToDevice);
   3683 
   3684 VOID
   3685 NTAPI
   3686 HalPutScatterGatherList(
   3687   IN PADAPTER_OBJECT DmaAdapter,
   3688   IN PSCATTER_GATHER_LIST ScatterGather,
   3689   IN BOOLEAN WriteToDevice);
   3690 
   3691 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   3692 
   3693 #if (NTDDI_VERSION >= NTDDI_WINXP)
   3694 NTKERNELAPI
   3695 VOID
   3696 FASTCALL
   3697 HalExamineMBR(
   3698   IN PDEVICE_OBJECT DeviceObject,
   3699   IN ULONG SectorSize,
   3700   IN ULONG MBRTypeIdentifier,
   3701   OUT PVOID *Buffer);
   3702 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
   3703 
   3704 #if (NTDDI_VERSION >= NTDDI_WIN7)
   3705 
   3706 NTSTATUS
   3707 NTAPI
   3708 HalAllocateHardwareCounters(
   3709   IN PGROUP_AFFINITY GroupAffinty,
   3710   IN ULONG GroupCount,
   3711   IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList,
   3712   OUT PHANDLE CounterSetHandle);
   3713 
   3714 NTSTATUS
   3715 NTAPI
   3716 HalFreeHardwareCounters(
   3717   IN HANDLE CounterSetHandle);
   3718 
   3719 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   3720 
   3721 #if defined(_IA64_)
   3722 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   3723 NTHALAPI
   3724 ULONG
   3725 NTAPI
   3726 HalGetDmaAlignmentRequirement(VOID);
   3727 #endif
   3728 #endif /* defined(_IA64_) */
   3729 
   3730 #if defined(_M_IX86) || defined(_M_AMD64)
   3731 #define HalGetDmaAlignmentRequirement() 1L
   3732 #endif
   3733 
   3734 #if (NTDDI_VERSION >= NTDDI_WIN7)
   3735 
   3736 typedef struct _WHEA_ERROR_SOURCE_DESCRIPTOR *PWHEA_ERROR_SOURCE_DESCRIPTOR;
   3737 typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
   3738 
   3739 NTHALAPI
   3740 VOID
   3741 NTAPI
   3742 HalBugCheckSystem(
   3743   IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource,
   3744   IN PWHEA_ERROR_RECORD ErrorRecord);
   3745 
   3746 #else
   3747 
   3748 typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
   3749 
   3750 NTHALAPI
   3751 VOID
   3752 NTAPI
   3753 HalBugCheckSystem(
   3754   IN PWHEA_ERROR_RECORD ErrorRecord);
   3755 
   3756 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   3757 
   3758 /******************************************************************************
   3759  *                         I/O Manager Functions                              *
   3760  ******************************************************************************/
   3761 
   3762 /*
   3763  * VOID IoAssignArcName(
   3764  *   IN PUNICODE_STRING  ArcName,
   3765  *   IN PUNICODE_STRING  DeviceName);
   3766  */
   3767 #define IoAssignArcName(_ArcName, _DeviceName) ( \
   3768   IoCreateSymbolicLink((_ArcName), (_DeviceName)))
   3769 
   3770 /*
   3771  * VOID
   3772  * IoDeassignArcName(
   3773  *   IN PUNICODE_STRING  ArcName)
   3774  */
   3775 #define IoDeassignArcName IoDeleteSymbolicLink
   3776 
   3777 FORCEINLINE
   3778 VOID
   3779 NTAPI
   3780 IoInitializeDriverCreateContext(
   3781   PIO_DRIVER_CREATE_CONTEXT DriverContext)
   3782 {
   3783   RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT));
   3784   DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT);
   3785 }
   3786 
   3787 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   3788 
   3789 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
   3790 NTKERNELAPI
   3791 NTSTATUS
   3792 NTAPI
   3793 IoAllocateAdapterChannel(
   3794   IN PADAPTER_OBJECT AdapterObject,
   3795   IN PDEVICE_OBJECT DeviceObject,
   3796   IN ULONG NumberOfMapRegisters,
   3797   IN PDRIVER_CONTROL ExecutionRoutine,
   3798   IN PVOID Context);
   3799 #endif
   3800 
   3801 #if !defined(DMA_MACROS_DEFINED)
   3802 //DECLSPEC_DEPRECATED_DDK
   3803 NTHALAPI
   3804 PHYSICAL_ADDRESS
   3805 NTAPI
   3806 IoMapTransfer(
   3807   IN PADAPTER_OBJECT AdapterObject,
   3808   IN PMDL Mdl,
   3809   IN PVOID MapRegisterBase,
   3810   IN PVOID CurrentVa,
   3811   IN OUT PULONG Length,
   3812   IN BOOLEAN WriteToDevice);
   3813 #endif
   3814 
   3815 NTKERNELAPI
   3816 VOID
   3817 NTAPI
   3818 IoAllocateController(
   3819   IN PCONTROLLER_OBJECT ControllerObject,
   3820   IN PDEVICE_OBJECT DeviceObject,
   3821   IN PDRIVER_CONTROL ExecutionRoutine,
   3822   IN PVOID Context OPTIONAL);
   3823 
   3824 NTKERNELAPI
   3825 PCONTROLLER_OBJECT
   3826 NTAPI
   3827 IoCreateController(
   3828   IN ULONG Size);
   3829 
   3830 NTKERNELAPI
   3831 VOID
   3832 NTAPI
   3833 IoDeleteController(
   3834   IN PCONTROLLER_OBJECT ControllerObject);
   3835 
   3836 NTKERNELAPI
   3837 VOID
   3838 NTAPI
   3839 IoFreeController(
   3840   IN PCONTROLLER_OBJECT ControllerObject);
   3841 
   3842 NTKERNELAPI
   3843 PCONFIGURATION_INFORMATION
   3844 NTAPI
   3845 IoGetConfigurationInformation(VOID);
   3846 
   3847 NTKERNELAPI
   3848 PDEVICE_OBJECT
   3849 NTAPI
   3850 IoGetDeviceToVerify(
   3851   IN PETHREAD Thread);
   3852 
   3853 NTKERNELAPI
   3854 VOID
   3855 NTAPI
   3856 IoCancelFileOpen(
   3857   IN PDEVICE_OBJECT DeviceObject,
   3858   IN PFILE_OBJECT FileObject);
   3859 
   3860 NTKERNELAPI
   3861 PGENERIC_MAPPING
   3862 NTAPI
   3863 IoGetFileObjectGenericMapping(VOID);
   3864 
   3865 NTKERNELAPI
   3866 PIRP
   3867 NTAPI
   3868 IoMakeAssociatedIrp(
   3869   IN PIRP Irp,
   3870   IN CCHAR StackSize);
   3871 
   3872 NTKERNELAPI
   3873 NTSTATUS
   3874 NTAPI
   3875 IoQueryDeviceDescription(
   3876   IN PINTERFACE_TYPE BusType OPTIONAL,
   3877   IN PULONG BusNumber OPTIONAL,
   3878   IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
   3879   IN PULONG ControllerNumber OPTIONAL,
   3880   IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
   3881   IN PULONG PeripheralNumber OPTIONAL,
   3882   IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
   3883   IN OUT PVOID Context OPTIONAL);
   3884 
   3885 NTKERNELAPI
   3886 VOID
   3887 NTAPI
   3888 IoRaiseHardError(
   3889   IN PIRP Irp,
   3890   IN PVPB Vpb OPTIONAL,
   3891   IN PDEVICE_OBJECT RealDeviceObject);
   3892 
   3893 NTKERNELAPI
   3894 BOOLEAN
   3895 NTAPI
   3896 IoRaiseInformationalHardError(
   3897   IN NTSTATUS ErrorStatus,
   3898   IN PUNICODE_STRING String OPTIONAL,
   3899   IN PKTHREAD Thread OPTIONAL);
   3900 
   3901 NTKERNELAPI
   3902 VOID
   3903 NTAPI
   3904 IoRegisterBootDriverReinitialization(
   3905   IN PDRIVER_OBJECT DriverObject,
   3906   IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
   3907   IN PVOID Context OPTIONAL);
   3908 
   3909 NTKERNELAPI
   3910 VOID
   3911 NTAPI
   3912 IoRegisterDriverReinitialization(
   3913   IN PDRIVER_OBJECT DriverObject,
   3914   IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
   3915   IN PVOID Context OPTIONAL);
   3916 
   3917 NTKERNELAPI
   3918 NTSTATUS
   3919 NTAPI
   3920 IoAttachDeviceByPointer(
   3921   IN PDEVICE_OBJECT SourceDevice,
   3922   IN PDEVICE_OBJECT TargetDevice);
   3923 
   3924 NTKERNELAPI
   3925 NTSTATUS
   3926 NTAPI
   3927 IoReportDetectedDevice(
   3928   IN PDRIVER_OBJECT DriverObject,
   3929   IN INTERFACE_TYPE LegacyBusType,
   3930   IN ULONG BusNumber,
   3931   IN ULONG SlotNumber,
   3932   IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
   3933   IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
   3934   IN BOOLEAN ResourceAssigned,
   3935   IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL);
   3936 
   3937 NTKERNELAPI
   3938 NTSTATUS
   3939 NTAPI
   3940 IoReportResourceForDetection(
   3941   IN PDRIVER_OBJECT DriverObject,
   3942   IN PCM_RESOURCE_LIST DriverList OPTIONAL,
   3943   IN ULONG DriverListSize OPTIONAL,
   3944   IN PDEVICE_OBJECT DeviceObject OPTIONAL,
   3945   IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
   3946   IN ULONG DeviceListSize OPTIONAL,
   3947   OUT PBOOLEAN ConflictDetected);
   3948 
   3949 NTKERNELAPI
   3950 NTSTATUS
   3951 NTAPI
   3952 IoReportResourceUsage(
   3953   IN PUNICODE_STRING DriverClassName OPTIONAL,
   3954   IN PDRIVER_OBJECT DriverObject,
   3955   IN PCM_RESOURCE_LIST DriverList OPTIONAL,
   3956   IN ULONG DriverListSize OPTIONAL,
   3957   IN PDEVICE_OBJECT DeviceObject,
   3958   IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
   3959   IN ULONG DeviceListSize OPTIONAL,
   3960   IN BOOLEAN OverrideConflict,
   3961   OUT PBOOLEAN ConflictDetected);
   3962 
   3963 NTKERNELAPI
   3964 VOID
   3965 NTAPI
   3966 IoSetHardErrorOrVerifyDevice(
   3967   IN PIRP Irp,
   3968   IN PDEVICE_OBJECT DeviceObject);
   3969 
   3970 NTKERNELAPI
   3971 NTSTATUS
   3972 NTAPI
   3973 IoAssignResources(
   3974   IN PUNICODE_STRING RegistryPath,
   3975   IN PUNICODE_STRING DriverClassName OPTIONAL,
   3976   IN PDRIVER_OBJECT DriverObject,
   3977   IN PDEVICE_OBJECT DeviceObject OPTIONAL,
   3978   IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
   3979   IN OUT PCM_RESOURCE_LIST *AllocatedResources);
   3980 
   3981 NTKERNELAPI
   3982 BOOLEAN
   3983 NTAPI
   3984 IoSetThreadHardErrorMode(
   3985   IN BOOLEAN EnableHardErrors);
   3986 
   3987 
   3988 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   3989 
   3990 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
   3991 
   3992 NTKERNELAPI
   3993 BOOLEAN
   3994 NTAPI
   3995 IoIsFileOriginRemote(
   3996   IN PFILE_OBJECT FileObject);
   3997 
   3998 NTKERNELAPI
   3999 NTSTATUS
   4000 NTAPI
   4001 IoSetFileOrigin(
   4002   IN PFILE_OBJECT FileObject,
   4003   IN BOOLEAN Remote);
   4004 
   4005 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */
   4006 
   4007 #if (NTDDI_VERSION >= NTDDI_WINXP)
   4008 
   4009 NTKERNELAPI
   4010 NTSTATUS
   4011 FASTCALL
   4012 IoReadPartitionTable(
   4013   IN PDEVICE_OBJECT DeviceObject,
   4014   IN ULONG SectorSize,
   4015   IN BOOLEAN ReturnRecognizedPartitions,
   4016   OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
   4017 
   4018 NTKERNELAPI
   4019 NTSTATUS
   4020 FASTCALL
   4021 IoSetPartitionInformation(
   4022   IN PDEVICE_OBJECT DeviceObject,
   4023   IN ULONG SectorSize,
   4024   IN ULONG PartitionNumber,
   4025   IN ULONG PartitionType);
   4026 
   4027 NTKERNELAPI
   4028 NTSTATUS
   4029 FASTCALL
   4030 IoWritePartitionTable(
   4031   IN PDEVICE_OBJECT DeviceObject,
   4032   IN ULONG SectorSize,
   4033   IN ULONG SectorsPerTrack,
   4034   IN ULONG NumberOfHeads,
   4035   IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
   4036 
   4037 NTKERNELAPI
   4038 NTSTATUS
   4039 NTAPI
   4040 IoCreateDisk(
   4041   IN PDEVICE_OBJECT DeviceObject,
   4042   IN struct _CREATE_DISK* Disk OPTIONAL);
   4043 
   4044 NTKERNELAPI
   4045 NTSTATUS
   4046 NTAPI
   4047 IoReadDiskSignature(
   4048   IN PDEVICE_OBJECT DeviceObject,
   4049   IN ULONG BytesPerSector,
   4050   OUT PDISK_SIGNATURE Signature);
   4051 
   4052 NTKERNELAPI
   4053 NTSTATUS
   4054 NTAPI
   4055 IoReadPartitionTableEx(
   4056   IN PDEVICE_OBJECT DeviceObject,
   4057   OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
   4058 
   4059 NTKERNELAPI
   4060 NTSTATUS
   4061 NTAPI
   4062 IoSetPartitionInformationEx(
   4063   IN PDEVICE_OBJECT DeviceObject,
   4064   IN ULONG PartitionNumber,
   4065   IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
   4066 
   4067 NTKERNELAPI
   4068 NTSTATUS
   4069 NTAPI
   4070 IoSetSystemPartition(
   4071   IN PUNICODE_STRING VolumeNameString);
   4072 
   4073 NTKERNELAPI
   4074 NTSTATUS
   4075 NTAPI
   4076 IoVerifyPartitionTable(
   4077   IN PDEVICE_OBJECT DeviceObject,
   4078   IN BOOLEAN FixErrors);
   4079 
   4080 NTKERNELAPI
   4081 NTSTATUS
   4082 NTAPI
   4083 IoVolumeDeviceToDosName(
   4084   IN PVOID VolumeDeviceObject,
   4085   OUT PUNICODE_STRING DosName);
   4086 
   4087 NTKERNELAPI
   4088 NTSTATUS
   4089 NTAPI
   4090 IoWritePartitionTableEx(
   4091   IN PDEVICE_OBJECT DeviceObject,
   4092   IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
   4093 
   4094 NTKERNELAPI
   4095 NTSTATUS
   4096 NTAPI
   4097 IoCreateFileSpecifyDeviceObjectHint(
   4098   OUT PHANDLE FileHandle,
   4099   IN ACCESS_MASK DesiredAccess,
   4100   IN POBJECT_ATTRIBUTES ObjectAttributes,
   4101   OUT PIO_STATUS_BLOCK IoStatusBlock,
   4102   IN PLARGE_INTEGER AllocationSize OPTIONAL,
   4103   IN ULONG FileAttributes,
   4104   IN ULONG ShareAccess,
   4105   IN ULONG Disposition,
   4106   IN ULONG CreateOptions,
   4107   IN PVOID EaBuffer OPTIONAL,
   4108   IN ULONG EaLength,
   4109   IN CREATE_FILE_TYPE CreateFileType,
   4110   IN PVOID InternalParameters OPTIONAL,
   4111   IN ULONG Options,
   4112   IN PVOID DeviceObject OPTIONAL);
   4113 
   4114 NTKERNELAPI
   4115 NTSTATUS
   4116 NTAPI
   4117 IoAttachDeviceToDeviceStackSafe(
   4118   IN PDEVICE_OBJECT SourceDevice,
   4119   IN PDEVICE_OBJECT TargetDevice,
   4120   OUT PDEVICE_OBJECT *AttachedToDeviceObject);
   4121 
   4122 
   4123 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
   4124 
   4125 #if (NTDDI_VERSION >= NTDDI_WS03)
   4126 NTKERNELAPI
   4127 IO_PAGING_PRIORITY
   4128 FASTCALL
   4129 IoGetPagingIoPriority(
   4130   IN PIRP Irp);
   4131 
   4132 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
   4133 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
   4134 
   4135 BOOLEAN
   4136 NTAPI
   4137 IoTranslateBusAddress(
   4138   IN INTERFACE_TYPE InterfaceType,
   4139   IN ULONG BusNumber,
   4140   IN PHYSICAL_ADDRESS BusAddress,
   4141   IN OUT PULONG AddressSpace,
   4142   OUT PPHYSICAL_ADDRESS TranslatedAddress);
   4143 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
   4144 
   4145 #if (NTDDI_VERSION >= NTDDI_VISTA)
   4146 NTKERNELAPI
   4147 NTSTATUS
   4148 NTAPI
   4149 IoUpdateDiskGeometry(
   4150   IN PDEVICE_OBJECT DeviceObject,
   4151   IN struct _DISK_GEOMETRY_EX* OldDiskGeometry,
   4152   IN struct _DISK_GEOMETRY_EX* NewDiskGeometry);
   4153 
   4154 PTXN_PARAMETER_BLOCK
   4155 NTAPI
   4156 IoGetTransactionParameterBlock(
   4157   IN PFILE_OBJECT FileObject);
   4158 
   4159 NTKERNELAPI
   4160 NTSTATUS
   4161 NTAPI
   4162 IoCreateFileEx(
   4163   OUT PHANDLE FileHandle,
   4164   IN ACCESS_MASK DesiredAccess,
   4165   IN POBJECT_ATTRIBUTES ObjectAttributes,
   4166   OUT PIO_STATUS_BLOCK IoStatusBlock,
   4167   IN PLARGE_INTEGER AllocationSize OPTIONAL,
   4168   IN ULONG FileAttributes,
   4169   IN ULONG ShareAccess,
   4170   IN ULONG Disposition,
   4171   IN ULONG CreateOptions,
   4172   IN PVOID EaBuffer OPTIONAL,
   4173   IN ULONG EaLength,
   4174   IN CREATE_FILE_TYPE CreateFileType,
   4175   IN PVOID InternalParameters OPTIONAL,
   4176   IN ULONG Options,
   4177   IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL);
   4178 
   4179 NTSTATUS
   4180 NTAPI
   4181 IoSetIrpExtraCreateParameter(
   4182   IN OUT PIRP Irp,
   4183   IN struct _ECP_LIST *ExtraCreateParameter);
   4184 
   4185 VOID
   4186 NTAPI
   4187 IoClearIrpExtraCreateParameter(
   4188   IN OUT PIRP Irp);
   4189 
   4190 NTSTATUS
   4191 NTAPI
   4192 IoGetIrpExtraCreateParameter(
   4193   IN PIRP Irp,
   4194   OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL);
   4195 
   4196 BOOLEAN
   4197 NTAPI
   4198 IoIsFileObjectIgnoringSharing(
   4199   IN PFILE_OBJECT FileObject);
   4200 
   4201 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
   4202 
   4203 #if (NTDDI_VERSION >= NTDDI_WIN7)
   4204 
   4205 NTSTATUS
   4206 NTAPI
   4207 IoSetFileObjectIgnoreSharing(
   4208   IN PFILE_OBJECT FileObject);
   4209 
   4210 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   4211 
   4212 /******************************************************************************
   4213  *                          Kernel Debugger Functions                         *
   4214  ******************************************************************************/
   4215 NTSYSAPI
   4216 ULONG
   4217 NTAPI
   4218 DbgPrompt(
   4219   IN PCCH Prompt,
   4220   OUT PCH Response,
   4221   IN ULONG MaximumResponseLength);
   4222 
   4223 /******************************************************************************
   4224  *                              Kernel Functions                              *
   4225  ******************************************************************************/
   4226 
   4227 NTKERNELAPI
   4228 VOID
   4229 FASTCALL
   4230 KeInvalidateRangeAllCaches(
   4231   IN PVOID BaseAddress,
   4232   IN ULONG Length);
   4233 
   4234 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   4235 
   4236 NTKERNELAPI
   4237 VOID
   4238 NTAPI
   4239 KeSetImportanceDpc(
   4240   IN OUT PRKDPC Dpc,
   4241   IN KDPC_IMPORTANCE Importance);
   4242 
   4243 NTKERNELAPI
   4244 LONG
   4245 NTAPI
   4246 KePulseEvent(
   4247   IN OUT PRKEVENT Event,
   4248   IN KPRIORITY Increment,
   4249   IN BOOLEAN Wait);
   4250 
   4251 NTKERNELAPI
   4252 LONG
   4253 NTAPI
   4254 KeSetBasePriorityThread(
   4255   IN OUT PRKTHREAD Thread,
   4256   IN LONG Increment);
   4257 
   4258 NTKERNELAPI
   4259 VOID
   4260 NTAPI
   4261 KeEnterCriticalRegion(VOID);
   4262 
   4263 NTKERNELAPI
   4264 VOID
   4265 NTAPI
   4266 KeLeaveCriticalRegion(VOID);
   4267 
   4268 NTKERNELAPI
   4269 DECLSPEC_NORETURN
   4270 VOID
   4271 NTAPI
   4272 KeBugCheck(
   4273   IN ULONG BugCheckCode);
   4274 #if defined(SINGLE_GROUP_LEGACY_API)
   4275 
   4276 
   4277 NTKERNELAPI
   4278 VOID
   4279 NTAPI
   4280 KeSetTargetProcessorDpc(
   4281   IN OUT PRKDPC Dpc,
   4282   IN CCHAR Number);
   4283 
   4284 NTKERNELAPI
   4285 KAFFINITY
   4286 NTAPI
   4287 KeQueryActiveProcessors(VOID);
   4288 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
   4289 
   4290 
   4291 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   4292 
   4293 #if (NTDDI_VERSION >= NTDDI_WINXP)
   4294 
   4295 NTKERNELAPI
   4296 BOOLEAN
   4297 NTAPI
   4298 KeAreApcsDisabled(VOID);
   4299 
   4300 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
   4301 
   4302 #if (NTDDI_VERSION >= NTDDI_WS03)
   4303 
   4304 
   4305 NTKERNELAPI
   4306 BOOLEAN
   4307 NTAPI
   4308 KeInvalidateAllCaches(VOID);
   4309 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
   4310 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
   4311 
   4312 NTKERNELAPI
   4313 NTSTATUS
   4314 NTAPI
   4315 KeExpandKernelStackAndCallout(
   4316   IN PEXPAND_STACK_CALLOUT Callout,
   4317   IN PVOID Parameter OPTIONAL,
   4318   IN SIZE_T Size);
   4319 
   4320 NTKERNELAPI
   4321 VOID
   4322 NTAPI
   4323 KeEnterGuardedRegion(VOID);
   4324 
   4325 NTKERNELAPI
   4326 VOID
   4327 NTAPI
   4328 KeLeaveGuardedRegion(VOID);
   4329 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
   4330 
   4331 #if (NTDDI_VERSION >= NTDDI_VISTA)
   4332 #if defined(SINGLE_GROUP_LEGACY_API)
   4333 
   4334 NTKERNELAPI
   4335 ULONG
   4336 NTAPI
   4337 KeQueryActiveProcessorCount(
   4338   OUT PKAFFINITY ActiveProcessors OPTIONAL);
   4339 
   4340 NTKERNELAPI
   4341 ULONG
   4342 NTAPI
   4343 KeQueryMaximumProcessorCount(VOID);
   4344 #endif /* SINGLE_GROUP_LEGACY_API */
   4345 
   4346 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
   4347 
   4348 #if (NTDDI_VERSION >= NTDDI_WIN7)
   4349 
   4350 NTKERNELAPI
   4351 ULONG
   4352 NTAPI
   4353 KeQueryActiveProcessorCountEx(
   4354   IN USHORT GroupNumber);
   4355 
   4356 NTKERNELAPI
   4357 ULONG
   4358 NTAPI
   4359 KeQueryMaximumProcessorCountEx(
   4360   IN USHORT GroupNumber);
   4361 
   4362 NTKERNELAPI
   4363 USHORT
   4364 NTAPI
   4365 KeQueryActiveGroupCount(VOID);
   4366 
   4367 NTKERNELAPI
   4368 USHORT
   4369 NTAPI
   4370 KeQueryMaximumGroupCount(VOID);
   4371 
   4372 NTKERNELAPI
   4373 KAFFINITY
   4374 NTAPI
   4375 KeQueryGroupAffinity(
   4376   IN USHORT GroupNumber);
   4377 
   4378 NTKERNELAPI
   4379 ULONG
   4380 NTAPI
   4381 KeGetCurrentProcessorNumberEx(
   4382   OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
   4383 
   4384 NTKERNELAPI
   4385 VOID
   4386 NTAPI
   4387 KeQueryNodeActiveAffinity(
   4388   IN USHORT NodeNumber,
   4389   OUT PGROUP_AFFINITY Affinity OPTIONAL,
   4390   OUT PUSHORT Count OPTIONAL);
   4391 
   4392 NTKERNELAPI
   4393 USHORT
   4394 NTAPI
   4395 KeQueryNodeMaximumProcessorCount(
   4396   IN USHORT NodeNumber);
   4397 
   4398 NTKERNELAPI
   4399 USHORT
   4400 NTAPI
   4401 KeQueryHighestNodeNumber(VOID);
   4402 
   4403 NTKERNELAPI
   4404 USHORT
   4405 NTAPI
   4406 KeGetCurrentNodeNumber(VOID);
   4407 
   4408 NTKERNELAPI
   4409 NTSTATUS
   4410 NTAPI
   4411 KeQueryLogicalProcessorRelationship(
   4412   IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
   4413   IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
   4414   OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
   4415   IN OUT PULONG Length);
   4416 
   4417 NTKERNELAPI
   4418 NTSTATUS
   4419 NTAPI
   4420 KeSetHardwareCounterConfiguration(
   4421   IN PHARDWARE_COUNTER CounterArray,
   4422   IN ULONG Count);
   4423 
   4424 NTKERNELAPI
   4425 NTSTATUS
   4426 NTAPI
   4427 KeQueryHardwareCounterConfiguration(
   4428   OUT PHARDWARE_COUNTER CounterArray,
   4429   IN ULONG MaximumCount,
   4430   OUT PULONG Count);
   4431 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   4432 
   4433 /******************************************************************************
   4434  *                       Memory manager Functions                             *
   4435  ******************************************************************************/
   4436 
   4437 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   4438 
   4439 NTKERNELAPI
   4440 PPHYSICAL_MEMORY_RANGE
   4441 NTAPI
   4442 MmGetPhysicalMemoryRanges(VOID);
   4443 
   4444 NTKERNELAPI
   4445 PHYSICAL_ADDRESS
   4446 NTAPI
   4447 MmGetPhysicalAddress(
   4448   IN PVOID BaseAddress);
   4449 
   4450 NTKERNELAPI
   4451 BOOLEAN
   4452 NTAPI
   4453 MmIsNonPagedSystemAddressValid(
   4454   IN PVOID VirtualAddress);
   4455 
   4456 NTKERNELAPI
   4457 PVOID
   4458 NTAPI
   4459 MmAllocateNonCachedMemory(
   4460   IN SIZE_T NumberOfBytes);
   4461 
   4462 NTKERNELAPI
   4463 VOID
   4464 NTAPI
   4465 MmFreeNonCachedMemory(
   4466   IN PVOID BaseAddress,
   4467   IN SIZE_T NumberOfBytes);
   4468 
   4469 NTKERNELAPI
   4470 PVOID
   4471 NTAPI
   4472 MmGetVirtualForPhysical(
   4473   IN PHYSICAL_ADDRESS PhysicalAddress);
   4474 
   4475 NTKERNELAPI
   4476 NTSTATUS
   4477 NTAPI
   4478 MmMapUserAddressesToPage(
   4479   IN PVOID BaseAddress,
   4480   IN SIZE_T NumberOfBytes,
   4481   IN PVOID PageAddress);
   4482 
   4483 NTKERNELAPI
   4484 PVOID
   4485 NTAPI
   4486 MmMapVideoDisplay(
   4487   IN PHYSICAL_ADDRESS PhysicalAddress,
   4488   IN SIZE_T NumberOfBytes,
   4489   IN MEMORY_CACHING_TYPE CacheType);
   4490 
   4491 NTKERNELAPI
   4492 NTSTATUS
   4493 NTAPI
   4494 MmMapViewInSessionSpace(
   4495   IN PVOID Section,
   4496   OUT PVOID *MappedBase,
   4497   IN OUT PSIZE_T ViewSize);
   4498 
   4499 NTKERNELAPI
   4500 NTSTATUS
   4501 NTAPI
   4502 MmMapViewInSystemSpace(
   4503   IN PVOID Section,
   4504   OUT PVOID *MappedBase,
   4505   IN OUT PSIZE_T ViewSize);
   4506 
   4507 NTKERNELAPI
   4508 BOOLEAN
   4509 NTAPI
   4510 MmIsAddressValid(
   4511   IN PVOID VirtualAddress);
   4512 
   4513 NTKERNELAPI
   4514 BOOLEAN
   4515 NTAPI
   4516 MmIsThisAnNtAsSystem(VOID);
   4517 
   4518 NTKERNELAPI
   4519 VOID
   4520 NTAPI
   4521 MmLockPagableSectionByHandle(
   4522   IN PVOID ImageSectionHandle);
   4523 
   4524 NTKERNELAPI
   4525 NTSTATUS
   4526 NTAPI
   4527 MmUnmapViewInSessionSpace(
   4528   IN PVOID MappedBase);
   4529 
   4530 NTKERNELAPI
   4531 NTSTATUS
   4532 NTAPI
   4533 MmUnmapViewInSystemSpace(
   4534   IN PVOID MappedBase);
   4535 
   4536 NTKERNELAPI
   4537 VOID
   4538 NTAPI
   4539 MmUnsecureVirtualMemory(
   4540   IN HANDLE SecureHandle);
   4541 
   4542 NTKERNELAPI
   4543 NTSTATUS
   4544 NTAPI
   4545 MmRemovePhysicalMemory(
   4546   IN PPHYSICAL_ADDRESS StartAddress,
   4547   IN OUT PLARGE_INTEGER NumberOfBytes);
   4548 
   4549 NTKERNELAPI
   4550 HANDLE
   4551 NTAPI
   4552 MmSecureVirtualMemory(
   4553   IN PVOID Address,
   4554   IN SIZE_T Size,
   4555   IN ULONG ProbeMode);
   4556 
   4557 NTKERNELAPI
   4558 VOID
   4559 NTAPI
   4560 MmUnmapVideoDisplay(
   4561   IN PVOID BaseAddress,
   4562   IN SIZE_T NumberOfBytes);
   4563 
   4564 NTKERNELAPI
   4565 NTSTATUS
   4566 NTAPI
   4567 MmAddPhysicalMemory(
   4568   IN PPHYSICAL_ADDRESS StartAddress,
   4569   IN OUT PLARGE_INTEGER NumberOfBytes);
   4570 
   4571 NTKERNELAPI
   4572 PVOID
   4573 NTAPI
   4574 MmAllocateContiguousMemory(
   4575   IN SIZE_T NumberOfBytes,
   4576   IN PHYSICAL_ADDRESS HighestAcceptableAddress);
   4577 
   4578 NTKERNELAPI
   4579 PVOID
   4580 NTAPI
   4581 MmAllocateContiguousMemorySpecifyCache(
   4582   IN SIZE_T NumberOfBytes,
   4583   IN PHYSICAL_ADDRESS LowestAcceptableAddress,
   4584   IN PHYSICAL_ADDRESS HighestAcceptableAddress,
   4585   IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
   4586   IN MEMORY_CACHING_TYPE CacheType);
   4587 
   4588 NTKERNELAPI
   4589 PVOID
   4590 NTAPI
   4591 MmAllocateContiguousMemorySpecifyCacheNode(
   4592   IN SIZE_T NumberOfBytes,
   4593   IN PHYSICAL_ADDRESS LowestAcceptableAddress,
   4594   IN PHYSICAL_ADDRESS HighestAcceptableAddress,
   4595   IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
   4596   IN MEMORY_CACHING_TYPE CacheType,
   4597   IN NODE_REQUIREMENT PreferredNode);
   4598 
   4599 NTKERNELAPI
   4600 VOID
   4601 NTAPI
   4602 MmFreeContiguousMemory(
   4603   IN PVOID BaseAddress);
   4604 
   4605 NTKERNELAPI
   4606 VOID
   4607 NTAPI
   4608 MmFreeContiguousMemorySpecifyCache(
   4609   IN PVOID BaseAddress,
   4610   IN SIZE_T NumberOfBytes,
   4611   IN MEMORY_CACHING_TYPE CacheType);
   4612 
   4613 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   4614 
   4615 
   4616 
   4617 #if (NTDDI_VERSION >= NTDDI_WS03)
   4618 
   4619 NTKERNELAPI
   4620 NTSTATUS
   4621 NTAPI
   4622 MmCreateMirror(VOID);
   4623 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
   4624 
   4625 #if (NTDDI_VERSION >= NTDDI_VISTA)
   4626 NTSTATUS
   4627 NTAPI
   4628 MmRotatePhysicalView(
   4629   IN PVOID VirtualAddress,
   4630   IN OUT PSIZE_T NumberOfBytes,
   4631   IN PMDLX NewMdl OPTIONAL,
   4632   IN MM_ROTATE_DIRECTION Direction,
   4633   IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction,
   4634   IN PVOID Context OPTIONAL);
   4635 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
   4636 
   4637 /******************************************************************************
   4638  *                          Process Manager Functions                         *
   4639  ******************************************************************************/
   4640 
   4641 NTSYSCALLAPI
   4642 NTSTATUS
   4643 NTAPI
   4644 NtOpenProcess(
   4645   OUT PHANDLE ProcessHandle,
   4646   IN ACCESS_MASK DesiredAccess,
   4647   IN POBJECT_ATTRIBUTES ObjectAttributes,
   4648   IN PCLIENT_ID ClientId OPTIONAL);
   4649 
   4650 NTSYSCALLAPI
   4651 NTSTATUS
   4652 NTAPI
   4653 NtQueryInformationProcess(
   4654   IN HANDLE ProcessHandle,
   4655   IN PROCESSINFOCLASS ProcessInformationClass,
   4656   OUT PVOID ProcessInformation OPTIONAL,
   4657   IN ULONG ProcessInformationLength,
   4658   OUT PULONG ReturnLength OPTIONAL);
   4659 
   4660 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   4661 
   4662 
   4663 NTKERNELAPI
   4664 NTSTATUS
   4665 NTAPI
   4666 PsSetCreateProcessNotifyRoutine(
   4667   IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
   4668   IN BOOLEAN Remove);
   4669 
   4670 NTKERNELAPI
   4671 NTSTATUS
   4672 NTAPI
   4673 PsSetCreateThreadNotifyRoutine(
   4674   IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
   4675 
   4676 NTKERNELAPI
   4677 NTSTATUS
   4678 NTAPI
   4679 PsSetLoadImageNotifyRoutine(
   4680   IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
   4681 
   4682 NTKERNELAPI
   4683 HANDLE
   4684 NTAPI
   4685 PsGetCurrentProcessId(VOID);
   4686 
   4687 NTKERNELAPI
   4688 HANDLE
   4689 NTAPI
   4690 PsGetCurrentThreadId(VOID);
   4691 
   4692 NTKERNELAPI
   4693 BOOLEAN
   4694 NTAPI
   4695 PsGetVersion(
   4696   OUT PULONG MajorVersion OPTIONAL,
   4697   OUT PULONG MinorVersion OPTIONAL,
   4698   OUT PULONG BuildNumber OPTIONAL,
   4699   OUT PUNICODE_STRING CSDVersion OPTIONAL);
   4700 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   4701 #if (NTDDI_VERSION >= NTDDI_WINXP)
   4702 
   4703 NTKERNELAPI
   4704 HANDLE
   4705 NTAPI
   4706 PsGetProcessId(
   4707   IN PEPROCESS Process);
   4708 
   4709 NTKERNELAPI
   4710 HANDLE
   4711 NTAPI
   4712 PsGetThreadId(
   4713   IN PETHREAD Thread);
   4714 
   4715 NTKERNELAPI
   4716 NTSTATUS
   4717 NTAPI
   4718 PsRemoveCreateThreadNotifyRoutine(
   4719   IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
   4720 
   4721 NTKERNELAPI
   4722 NTSTATUS
   4723 NTAPI
   4724 PsRemoveLoadImageNotifyRoutine(
   4725   IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
   4726 
   4727 NTKERNELAPI
   4728 LONGLONG
   4729 NTAPI
   4730 PsGetProcessCreateTimeQuadPart(
   4731   IN PEPROCESS Process);
   4732 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
   4733 
   4734 #if (NTDDI_VERSION >= NTDDI_WS03)
   4735 NTKERNELAPI
   4736 HANDLE
   4737 NTAPI
   4738 PsGetThreadProcessId(
   4739   IN PETHREAD Thread);
   4740 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
   4741 
   4742 #if (NTDDI_VERSION >= NTDDI_VISTA)
   4743 
   4744 NTKERNELAPI
   4745 BOOLEAN
   4746 NTAPI
   4747 PsSetCurrentThreadPrefetching(
   4748   IN BOOLEAN Prefetching);
   4749 
   4750 NTKERNELAPI
   4751 BOOLEAN
   4752 NTAPI
   4753 PsIsCurrentThreadPrefetching(VOID);
   4754 
   4755 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
   4756 
   4757 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
   4758 NTKERNELAPI
   4759 NTSTATUS
   4760 NTAPI
   4761 PsSetCreateProcessNotifyRoutineEx(
   4762   IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
   4763   IN BOOLEAN Remove);
   4764 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
   4765 
   4766 
   4767 /******************************************************************************
   4768  *                         Runtime Library Functions                          *
   4769  ******************************************************************************/
   4770 
   4771 
   4772 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   4773 
   4774 
   4775 #ifndef RTL_USE_AVL_TABLES
   4776 
   4777 NTSYSAPI
   4778 VOID
   4779 NTAPI
   4780 RtlInitializeGenericTable(
   4781   OUT PRTL_GENERIC_TABLE Table,
   4782   IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
   4783   IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
   4784   IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
   4785   IN PVOID TableContext OPTIONAL);
   4786 
   4787 NTSYSAPI
   4788 PVOID
   4789 NTAPI
   4790 RtlInsertElementGenericTable(
   4791   IN PRTL_GENERIC_TABLE Table,
   4792   IN PVOID Buffer,
   4793   IN CLONG BufferSize,
   4794   OUT PBOOLEAN NewElement OPTIONAL);
   4795 
   4796 NTSYSAPI
   4797 PVOID
   4798 NTAPI
   4799 RtlInsertElementGenericTableFull(
   4800   IN PRTL_GENERIC_TABLE Table,
   4801   IN PVOID Buffer,
   4802   IN CLONG BufferSize,
   4803   OUT PBOOLEAN NewElement OPTIONAL,
   4804   IN PVOID NodeOrParent,
   4805   IN TABLE_SEARCH_RESULT SearchResult);
   4806 
   4807 NTSYSAPI
   4808 BOOLEAN
   4809 NTAPI
   4810 RtlDeleteElementGenericTable(
   4811   IN PRTL_GENERIC_TABLE Table,
   4812   IN PVOID Buffer);
   4813 
   4814 NTSYSAPI
   4815 PVOID
   4816 NTAPI
   4817 RtlLookupElementGenericTable(
   4818   IN PRTL_GENERIC_TABLE Table,
   4819   IN PVOID Buffer);
   4820 
   4821 NTSYSAPI
   4822 PVOID
   4823 NTAPI
   4824 RtlLookupElementGenericTableFull(
   4825   IN PRTL_GENERIC_TABLE Table,
   4826   IN PVOID Buffer,
   4827   OUT PVOID *NodeOrParent,
   4828   OUT TABLE_SEARCH_RESULT *SearchResult);
   4829 
   4830 NTSYSAPI
   4831 PVOID
   4832 NTAPI
   4833 RtlEnumerateGenericTable(
   4834   IN PRTL_GENERIC_TABLE Table,
   4835   IN BOOLEAN Restart);
   4836 
   4837 NTSYSAPI
   4838 PVOID
   4839 NTAPI
   4840 RtlEnumerateGenericTableWithoutSplaying(
   4841   IN PRTL_GENERIC_TABLE Table,
   4842   IN OUT PVOID *RestartKey);
   4843 
   4844 NTSYSAPI
   4845 PVOID
   4846 NTAPI
   4847 RtlGetElementGenericTable(
   4848   IN PRTL_GENERIC_TABLE Table,
   4849   IN ULONG I);
   4850 
   4851 NTSYSAPI
   4852 ULONG
   4853 NTAPI
   4854 RtlNumberGenericTableElements(
   4855   IN PRTL_GENERIC_TABLE Table);
   4856 
   4857 NTSYSAPI
   4858 BOOLEAN
   4859 NTAPI
   4860 RtlIsGenericTableEmpty(
   4861   IN PRTL_GENERIC_TABLE Table);
   4862 
   4863 #endif /* !RTL_USE_AVL_TABLES */
   4864 
   4865 #define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT     8
   4866 
   4867 NTSYSAPI
   4868 PRTL_SPLAY_LINKS
   4869 NTAPI
   4870 RtlSplay(
   4871   IN OUT PRTL_SPLAY_LINKS Links);
   4872 
   4873 NTSYSAPI
   4874 PRTL_SPLAY_LINKS
   4875 NTAPI
   4876 RtlDelete(
   4877   IN PRTL_SPLAY_LINKS Links);
   4878 
   4879 NTSYSAPI
   4880 VOID
   4881 NTAPI
   4882 RtlDeleteNoSplay(
   4883   IN PRTL_SPLAY_LINKS Links,
   4884   IN OUT PRTL_SPLAY_LINKS *Root);
   4885 
   4886 NTSYSAPI
   4887 PRTL_SPLAY_LINKS
   4888 NTAPI
   4889 RtlSubtreeSuccessor(
   4890   IN PRTL_SPLAY_LINKS Links);
   4891 
   4892 NTSYSAPI
   4893 PRTL_SPLAY_LINKS
   4894 NTAPI
   4895 RtlSubtreePredecessor(
   4896   IN PRTL_SPLAY_LINKS Links);
   4897 
   4898 NTSYSAPI
   4899 PRTL_SPLAY_LINKS
   4900 NTAPI
   4901 RtlRealSuccessor(
   4902   IN PRTL_SPLAY_LINKS Links);
   4903 
   4904 NTSYSAPI
   4905 PRTL_SPLAY_LINKS
   4906 NTAPI
   4907 RtlRealPredecessor(
   4908   IN PRTL_SPLAY_LINKS Links);
   4909 
   4910 NTSYSAPI
   4911 BOOLEAN
   4912 NTAPI
   4913 RtlPrefixUnicodeString(
   4914   IN PCUNICODE_STRING  String1,
   4915   IN PCUNICODE_STRING  String2,
   4916   IN BOOLEAN  CaseInSensitive);
   4917 
   4918 NTSYSAPI
   4919 VOID
   4920 NTAPI
   4921 RtlUpperString(
   4922   IN OUT PSTRING  DestinationString,
   4923   IN const PSTRING  SourceString);
   4924 
   4925 NTSYSAPI
   4926 NTSTATUS
   4927 NTAPI
   4928 RtlUpcaseUnicodeString(
   4929   IN OUT PUNICODE_STRING DestinationString,
   4930   IN PCUNICODE_STRING  SourceString,
   4931   IN BOOLEAN  AllocateDestinationString);
   4932 
   4933 NTSYSAPI
   4934 VOID
   4935 NTAPI
   4936 RtlMapGenericMask(
   4937   IN OUT PACCESS_MASK AccessMask,
   4938   IN PGENERIC_MAPPING GenericMapping);
   4939 
   4940 NTSYSAPI
   4941 NTSTATUS
   4942 NTAPI
   4943 RtlVolumeDeviceToDosName(
   4944   IN PVOID VolumeDeviceObject,
   4945   OUT PUNICODE_STRING DosName);
   4946 
   4947 NTSYSAPI
   4948 NTSTATUS
   4949 NTAPI
   4950 RtlGetVersion(
   4951   IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
   4952 
   4953 NTSYSAPI
   4954 NTSTATUS
   4955 NTAPI
   4956 RtlVerifyVersionInfo(
   4957   IN PRTL_OSVERSIONINFOEXW VersionInfo,
   4958   IN ULONG TypeMask,
   4959   IN ULONGLONG ConditionMask);
   4960 
   4961 NTSYSAPI
   4962 LONG
   4963 NTAPI
   4964 RtlCompareString(
   4965   IN const PSTRING String1,
   4966   IN const PSTRING String2,
   4967   IN BOOLEAN CaseInSensitive);
   4968 
   4969 NTSYSAPI
   4970 VOID
   4971 NTAPI
   4972 RtlCopyString(
   4973   OUT PSTRING DestinationString,
   4974   IN const PSTRING SourceString OPTIONAL);
   4975 
   4976 NTSYSAPI
   4977 BOOLEAN
   4978 NTAPI
   4979 RtlEqualString(
   4980   IN const PSTRING String1,
   4981   IN const PSTRING String2,
   4982   IN BOOLEAN CaseInSensitive);
   4983 
   4984 NTSYSAPI
   4985 NTSTATUS
   4986 NTAPI
   4987 RtlCharToInteger(
   4988   IN PCSZ String,
   4989   IN ULONG Base OPTIONAL,
   4990   OUT PULONG Value);
   4991 
   4992 NTSYSAPI
   4993 CHAR
   4994 NTAPI
   4995 RtlUpperChar(
   4996   IN CHAR Character);
   4997 
   4998 NTSYSAPI
   4999 ULONG
   5000 NTAPI
   5001 RtlWalkFrameChain(
   5002   OUT PVOID *Callers,
   5003   IN ULONG Count,
   5004   IN ULONG Flags);
   5005 
   5006 
   5007 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   5008 
   5009 
   5010 #if (NTDDI_VERSION >= NTDDI_WINXP)
   5011 
   5012 
   5013 
   5014 NTSYSAPI
   5015 VOID
   5016 NTAPI
   5017 RtlInitializeGenericTableAvl(
   5018   OUT PRTL_AVL_TABLE Table,
   5019   IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
   5020   IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
   5021   IN PRTL_AVL_FREE_ROUTINE FreeRoutine,
   5022   IN PVOID TableContext OPTIONAL);
   5023 
   5024 NTSYSAPI
   5025 PVOID
   5026 NTAPI
   5027 RtlInsertElementGenericTableAvl(
   5028   IN PRTL_AVL_TABLE Table,
   5029   IN PVOID Buffer,
   5030   IN CLONG BufferSize,
   5031   OUT PBOOLEAN NewElement OPTIONAL);
   5032 
   5033 NTSYSAPI
   5034 PVOID
   5035 NTAPI
   5036 RtlInsertElementGenericTableFullAvl(
   5037   IN PRTL_AVL_TABLE Table,
   5038   IN PVOID Buffer,
   5039   IN CLONG BufferSize,
   5040   OUT PBOOLEAN NewElement OPTIONAL,
   5041   IN PVOID NodeOrParent,
   5042   IN TABLE_SEARCH_RESULT SearchResult);
   5043 
   5044 NTSYSAPI
   5045 BOOLEAN
   5046 NTAPI
   5047 RtlDeleteElementGenericTableAvl(
   5048   IN PRTL_AVL_TABLE Table,
   5049   IN PVOID Buffer);
   5050 
   5051 NTSYSAPI
   5052 PVOID
   5053 NTAPI
   5054 RtlLookupElementGenericTableAvl(
   5055   IN PRTL_AVL_TABLE Table,
   5056   IN PVOID Buffer);
   5057 
   5058 NTSYSAPI
   5059 PVOID
   5060 NTAPI
   5061 RtlLookupElementGenericTableFullAvl(
   5062   IN PRTL_AVL_TABLE Table,
   5063   IN PVOID Buffer,
   5064   OUT PVOID *NodeOrParent,
   5065   OUT TABLE_SEARCH_RESULT *SearchResult);
   5066 
   5067 NTSYSAPI
   5068 PVOID
   5069 NTAPI
   5070 RtlEnumerateGenericTableAvl(
   5071   IN PRTL_AVL_TABLE Table,
   5072   IN BOOLEAN Restart);
   5073 
   5074 NTSYSAPI
   5075 PVOID
   5076 NTAPI
   5077 RtlEnumerateGenericTableWithoutSplayingAvl(
   5078   IN PRTL_AVL_TABLE Table,
   5079   IN OUT PVOID *RestartKey);
   5080 
   5081 NTSYSAPI
   5082 PVOID
   5083 NTAPI
   5084 RtlLookupFirstMatchingElementGenericTableAvl(
   5085   IN PRTL_AVL_TABLE Table,
   5086   IN PVOID Buffer,
   5087   OUT PVOID *RestartKey);
   5088 
   5089 NTSYSAPI
   5090 PVOID
   5091 NTAPI
   5092 RtlEnumerateGenericTableLikeADirectory(
   5093   IN PRTL_AVL_TABLE Table,
   5094   IN PRTL_AVL_MATCH_FUNCTION MatchFunction OPTIONAL,
   5095   IN PVOID MatchData OPTIONAL,
   5096   IN ULONG NextFlag,
   5097   IN OUT PVOID *RestartKey,
   5098   IN OUT PULONG DeleteCount,
   5099   IN PVOID Buffer);
   5100 
   5101 NTSYSAPI
   5102 PVOID
   5103 NTAPI
   5104 RtlGetElementGenericTableAvl(
   5105   IN PRTL_AVL_TABLE Table,
   5106   IN ULONG I);
   5107 
   5108 NTSYSAPI
   5109 ULONG
   5110 NTAPI
   5111 RtlNumberGenericTableElementsAvl(
   5112   IN PRTL_AVL_TABLE Table);
   5113 
   5114 NTSYSAPI
   5115 BOOLEAN
   5116 NTAPI
   5117 RtlIsGenericTableEmptyAvl(
   5118   IN PRTL_AVL_TABLE Table);
   5119 
   5120 
   5121 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
   5122 
   5123 
   5124 #if (NTDDI_VERSION >= NTDDI_VISTA)
   5125 
   5126 
   5127 NTSYSAPI
   5128 VOID
   5129 NTAPI
   5130 RtlRunOnceInitialize(
   5131   OUT PRTL_RUN_ONCE RunOnce);
   5132 
   5133 NTSYSAPI
   5134 NTSTATUS
   5135 NTAPI
   5136 RtlRunOnceExecuteOnce(
   5137   IN OUT PRTL_RUN_ONCE RunOnce,
   5138   IN PRTL_RUN_ONCE_INIT_FN InitFn,
   5139   IN OUT PVOID Parameter OPTIONAL,
   5140   OUT PVOID *Context OPTIONAL);
   5141 
   5142 NTSYSAPI
   5143 NTSTATUS
   5144 NTAPI
   5145 RtlRunOnceBeginInitialize(
   5146   IN OUT PRTL_RUN_ONCE RunOnce,
   5147   IN ULONG Flags,
   5148   OUT PVOID *Context OPTIONAL);
   5149 
   5150 NTSYSAPI
   5151 NTSTATUS
   5152 NTAPI
   5153 RtlRunOnceComplete(
   5154   IN OUT PRTL_RUN_ONCE RunOnce,
   5155   IN ULONG Flags,
   5156   IN PVOID Context OPTIONAL);
   5157 
   5158 NTSYSAPI
   5159 BOOLEAN
   5160 NTAPI
   5161 RtlGetProductInfo(
   5162   IN ULONG OSMajorVersion,
   5163   IN ULONG OSMinorVersion,
   5164   IN ULONG SpMajorVersion,
   5165   IN ULONG SpMinorVersion,
   5166   OUT PULONG ReturnedProductType);
   5167 
   5168 
   5169 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
   5170 
   5171 #if (NTDDI_VERSION >= NTDDI_WIN7)
   5172 
   5173 
   5174 NTSYSAPI
   5175 BOOLEAN
   5176 NTAPI
   5177 RtlCreateHashTable(
   5178   IN OUT PRTL_DYNAMIC_HASH_TABLE *HashTable OPTIONAL,
   5179   IN ULONG Shift,
   5180   IN ULONG Flags);
   5181 
   5182 NTSYSAPI
   5183 VOID
   5184 NTAPI
   5185 RtlDeleteHashTable(
   5186   IN PRTL_DYNAMIC_HASH_TABLE HashTable);
   5187 
   5188 NTSYSAPI
   5189 BOOLEAN
   5190 NTAPI
   5191 RtlInsertEntryHashTable(
   5192   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5193   IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,
   5194   IN ULONG_PTR Signature,
   5195   IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
   5196 
   5197 NTSYSAPI
   5198 BOOLEAN
   5199 NTAPI
   5200 RtlRemoveEntryHashTable(
   5201   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5202   IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,
   5203   IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
   5204 
   5205 NTSYSAPI
   5206 PRTL_DYNAMIC_HASH_TABLE_ENTRY
   5207 NTAPI
   5208 RtlLookupEntryHashTable(
   5209   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5210   IN ULONG_PTR Signature,
   5211   OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
   5212 
   5213 NTSYSAPI
   5214 PRTL_DYNAMIC_HASH_TABLE_ENTRY
   5215 NTAPI
   5216 RtlGetNextEntryHashTable(
   5217   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5218   IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context);
   5219 
   5220 NTSYSAPI
   5221 BOOLEAN
   5222 NTAPI
   5223 RtlInitEnumerationHashTable(
   5224   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5225   OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
   5226 
   5227 NTSYSAPI
   5228 PRTL_DYNAMIC_HASH_TABLE_ENTRY
   5229 NTAPI
   5230 RtlEnumerateEntryHashTable(
   5231   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5232   IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
   5233 
   5234 NTSYSAPI
   5235 VOID
   5236 NTAPI
   5237 RtlEndEnumerationHashTable(
   5238   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5239   IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
   5240 
   5241 NTSYSAPI
   5242 BOOLEAN
   5243 NTAPI
   5244 RtlInitWeakEnumerationHashTable(
   5245   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5246   OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
   5247 
   5248 NTSYSAPI
   5249 PRTL_DYNAMIC_HASH_TABLE_ENTRY
   5250 NTAPI
   5251 RtlWeaklyEnumerateEntryHashTable(
   5252   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5253   IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
   5254 
   5255 NTSYSAPI
   5256 VOID
   5257 NTAPI
   5258 RtlEndWeakEnumerationHashTable(
   5259   IN PRTL_DYNAMIC_HASH_TABLE HashTable,
   5260   IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
   5261 
   5262 NTSYSAPI
   5263 BOOLEAN
   5264 NTAPI
   5265 RtlExpandHashTable(
   5266   IN PRTL_DYNAMIC_HASH_TABLE HashTable);
   5267 
   5268 NTSYSAPI
   5269 BOOLEAN
   5270 NTAPI
   5271 RtlContractHashTable(
   5272   IN PRTL_DYNAMIC_HASH_TABLE HashTable);
   5273 
   5274 
   5275 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   5276 
   5277 
   5278 #if defined(_AMD64_) || defined(_IA64_)
   5279 
   5280 
   5281 
   5282 //DECLSPEC_DEPRECATED_DDK_WINXP
   5283 FORCEINLINE
   5284 LARGE_INTEGER
   5285 NTAPI_INLINE
   5286 RtlLargeIntegerDivide(
   5287   IN LARGE_INTEGER Dividend,
   5288   IN LARGE_INTEGER Divisor,
   5289   OUT PLARGE_INTEGER Remainder OPTIONAL)
   5290 {
   5291   LARGE_INTEGER ret;
   5292   ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
   5293   if (Remainder)
   5294     Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
   5295   return ret;
   5296 }
   5297 
   5298 #else
   5299 
   5300 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   5301 NTSYSAPI
   5302 LARGE_INTEGER
   5303 NTAPI
   5304 RtlLargeIntegerDivide(
   5305   IN LARGE_INTEGER Dividend,
   5306   IN LARGE_INTEGER Divisor,
   5307   OUT PLARGE_INTEGER Remainder OPTIONAL);
   5308 #endif
   5309 
   5310 
   5311 #endif /* defined(_AMD64_) || defined(_IA64_) */
   5312 
   5313 
   5314 
   5315 #ifdef RTL_USE_AVL_TABLES
   5316 
   5317 #define RtlInitializeGenericTable               RtlInitializeGenericTableAvl
   5318 #define RtlInsertElementGenericTable            RtlInsertElementGenericTableAvl
   5319 #define RtlInsertElementGenericTableFull        RtlInsertElementGenericTableFullAvl
   5320 #define RtlDeleteElementGenericTable            RtlDeleteElementGenericTableAvl
   5321 #define RtlLookupElementGenericTable            RtlLookupElementGenericTableAvl
   5322 #define RtlLookupElementGenericTableFull        RtlLookupElementGenericTableFullAvl
   5323 #define RtlEnumerateGenericTable                RtlEnumerateGenericTableAvl
   5324 #define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
   5325 #define RtlGetElementGenericTable               RtlGetElementGenericTableAvl
   5326 #define RtlNumberGenericTableElements           RtlNumberGenericTableElementsAvl
   5327 #define RtlIsGenericTableEmpty                  RtlIsGenericTableEmptyAvl
   5328 
   5329 #endif /* RTL_USE_AVL_TABLES */
   5330 
   5331 #define RtlInitializeSplayLinks(Links) {    \
   5332   PRTL_SPLAY_LINKS _SplayLinks;            \
   5333   _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
   5334   _SplayLinks->Parent = _SplayLinks;   \
   5335   _SplayLinks->LeftChild = NULL;       \
   5336   _SplayLinks->RightChild = NULL;      \
   5337 }
   5338 
   5339 #define RtlIsLeftChild(Links) \
   5340     (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
   5341 
   5342 #define RtlIsRightChild(Links) \
   5343     (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
   5344 
   5345 #define RtlRightChild(Links) \
   5346     ((PRTL_SPLAY_LINKS)(Links))->RightChild
   5347 
   5348 #define RtlIsRoot(Links) \
   5349     (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
   5350 
   5351 #define RtlLeftChild(Links) \
   5352     ((PRTL_SPLAY_LINKS)(Links))->LeftChild
   5353 
   5354 #define RtlParent(Links) \
   5355     ((PRTL_SPLAY_LINKS)(Links))->Parent
   5356 
   5357 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks)    \
   5358     {                                                   \
   5359         PRTL_SPLAY_LINKS _SplayParent;                  \
   5360         PRTL_SPLAY_LINKS _SplayChild;                   \
   5361         _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
   5362         _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks);   \
   5363         _SplayParent->LeftChild = _SplayChild;          \
   5364         _SplayChild->Parent = _SplayParent;             \
   5365     }
   5366 
   5367 #define RtlInsertAsRightChild(ParentLinks,ChildLinks)   \
   5368     {                                                   \
   5369         PRTL_SPLAY_LINKS _SplayParent;                  \
   5370         PRTL_SPLAY_LINKS _SplayChild;                   \
   5371         _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
   5372         _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks);   \
   5373         _SplayParent->RightChild = _SplayChild;         \
   5374         _SplayChild->Parent = _SplayParent;             \
   5375     }
   5376 
   5377 #if !defined(MIDL_PASS)
   5378 
   5379 FORCEINLINE
   5380 LUID
   5381 NTAPI_INLINE
   5382 RtlConvertLongToLuid(
   5383   IN LONG Val)
   5384 {
   5385   LUID Luid;
   5386   LARGE_INTEGER Temp;
   5387 
   5388   Temp.QuadPart = Val;
   5389   Luid.LowPart = Temp.u.LowPart;
   5390   Luid.HighPart = Temp.u.HighPart;
   5391   return Luid;
   5392 }
   5393 
   5394 FORCEINLINE
   5395 LUID
   5396 NTAPI_INLINE
   5397 RtlConvertUlongToLuid(
   5398   IN ULONG Val)
   5399 {
   5400   LUID Luid;
   5401 
   5402   Luid.LowPart = Val;
   5403   Luid.HighPart = 0;
   5404   return Luid;
   5405 }
   5406 
   5407 #endif /* !defined(MIDL_PASS) */
   5408 
   5409 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
   5410 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
   5411     *CallersAddress = (PVOID)_ReturnAddress(); \
   5412     *CallersCaller = NULL;
   5413 #else
   5414 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   5415 NTSYSAPI
   5416 VOID
   5417 NTAPI
   5418 RtlGetCallersAddress(
   5419   OUT PVOID *CallersAddress,
   5420   OUT PVOID *CallersCaller);
   5421 #endif
   5422 #endif
   5423 
   5424 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
   5425 
   5426 #if (NTDDI_VERSION >= NTDDI_WIN7)
   5427 
   5428 FORCEINLINE
   5429 VOID
   5430 NTAPI
   5431 RtlInitHashTableContext(
   5432   IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)
   5433 {
   5434   Context->ChainHead = NULL;
   5435   Context->PrevLinkage = NULL;
   5436 }
   5437 
   5438 FORCEINLINE
   5439 VOID
   5440 NTAPI
   5441 RtlInitHashTableContextFromEnumerator(
   5442   IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context,
   5443   IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator)
   5444 {
   5445   Context->ChainHead = Enumerator->ChainHead;
   5446   Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink;
   5447 }
   5448 
   5449 FORCEINLINE
   5450 VOID
   5451 NTAPI
   5452 RtlReleaseHashTableContext(
   5453   IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)
   5454 {
   5455   UNREFERENCED_PARAMETER(Context);
   5456   return;
   5457 }
   5458 
   5459 FORCEINLINE
   5460 ULONG
   5461 NTAPI
   5462 RtlTotalBucketsHashTable(
   5463   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
   5464 {
   5465   return HashTable->TableSize;
   5466 }
   5467 
   5468 FORCEINLINE
   5469 ULONG
   5470 NTAPI
   5471 RtlNonEmptyBucketsHashTable(
   5472   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
   5473 {
   5474   return HashTable->NonEmptyBuckets;
   5475 }
   5476 
   5477 FORCEINLINE
   5478 ULONG
   5479 NTAPI
   5480 RtlEmptyBucketsHashTable(
   5481   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
   5482 {
   5483   return HashTable->TableSize - HashTable->NonEmptyBuckets;
   5484 }
   5485 
   5486 FORCEINLINE
   5487 ULONG
   5488 NTAPI
   5489 RtlTotalEntriesHashTable(
   5490   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
   5491 {
   5492   return HashTable->NumEntries;
   5493 }
   5494 
   5495 FORCEINLINE
   5496 ULONG
   5497 NTAPI
   5498 RtlActiveEnumeratorsHashTable(
   5499   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
   5500 {
   5501   return HashTable->NumEnumerators;
   5502 }
   5503 
   5504 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   5505 
   5506 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
   5507 
   5508 /******************************************************************************
   5509  *                            Security Manager Functions                      *
   5510  ******************************************************************************/
   5511 
   5512 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   5513 
   5514 NTKERNELAPI
   5515 BOOLEAN
   5516 NTAPI
   5517 SeSinglePrivilegeCheck(
   5518   IN LUID PrivilegeValue,
   5519   IN KPROCESSOR_MODE PreviousMode);
   5520 
   5521 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   5522 
   5523 
   5524 /******************************************************************************
   5525  *                            ZwXxx Functions                                 *
   5526  ******************************************************************************/
   5527 
   5528 
   5529 NTSYSAPI
   5530 NTSTATUS
   5531 NTAPI
   5532 ZwAllocateLocallyUniqueId(
   5533   OUT PLUID Luid);
   5534 
   5535 NTSYSAPI
   5536 NTSTATUS
   5537 NTAPI
   5538 ZwTerminateProcess(
   5539   IN HANDLE ProcessHandle OPTIONAL,
   5540   IN NTSTATUS ExitStatus);
   5541 
   5542 NTSYSAPI
   5543 NTSTATUS
   5544 NTAPI
   5545 ZwOpenProcess(
   5546   OUT PHANDLE ProcessHandle,
   5547   IN ACCESS_MASK DesiredAccess,
   5548   IN POBJECT_ATTRIBUTES ObjectAttributes,
   5549   IN PCLIENT_ID ClientId OPTIONAL);
   5550 
   5551 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   5552 
   5553 NTSTATUS
   5554 NTAPI
   5555 ZwCancelTimer(
   5556   IN HANDLE TimerHandle,
   5557   OUT PBOOLEAN CurrentState OPTIONAL);
   5558 
   5559 NTSTATUS
   5560 NTAPI
   5561 ZwCreateTimer(
   5562   OUT PHANDLE TimerHandle,
   5563   IN ACCESS_MASK DesiredAccess,
   5564   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
   5565   IN TIMER_TYPE TimerType);
   5566 
   5567 NTSTATUS
   5568 NTAPI
   5569 ZwOpenTimer(
   5570   OUT PHANDLE TimerHandle,
   5571   IN ACCESS_MASK DesiredAccess,
   5572   IN POBJECT_ATTRIBUTES ObjectAttributes);
   5573 
   5574 NTSYSAPI
   5575 NTSTATUS
   5576 NTAPI
   5577 ZwSetInformationThread(
   5578   IN HANDLE ThreadHandle,
   5579   IN THREADINFOCLASS ThreadInformationClass,
   5580   IN PVOID ThreadInformation,
   5581   IN ULONG ThreadInformationLength);
   5582 
   5583 NTSTATUS
   5584 NTAPI
   5585 ZwSetTimer(
   5586   IN HANDLE TimerHandle,
   5587   IN PLARGE_INTEGER DueTime,
   5588   IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
   5589   IN PVOID TimerContext OPTIONAL,
   5590   IN BOOLEAN ResumeTimer,
   5591   IN LONG Period OPTIONAL,
   5592   OUT PBOOLEAN PreviousState OPTIONAL);
   5593 
   5594 NTSYSAPI
   5595 NTSTATUS
   5596 NTAPI
   5597 ZwDisplayString(
   5598   IN PUNICODE_STRING String);
   5599 
   5600 NTSYSAPI
   5601 NTSTATUS
   5602 NTAPI
   5603 ZwPowerInformation(
   5604   IN POWER_INFORMATION_LEVEL PowerInformationLevel,
   5605   IN PVOID InputBuffer OPTIONAL,
   5606   IN ULONG InputBufferLength,
   5607   OUT PVOID OutputBuffer OPTIONAL,
   5608   IN ULONG OutputBufferLength);
   5609 
   5610 NTSYSAPI
   5611 NTSTATUS
   5612 NTAPI
   5613 ZwQueryVolumeInformationFile(
   5614   IN HANDLE FileHandle,
   5615   OUT PIO_STATUS_BLOCK IoStatusBlock,
   5616   OUT PVOID FsInformation,
   5617   IN ULONG Length,
   5618   IN FS_INFORMATION_CLASS FsInformationClass);
   5619 
   5620 NTSYSAPI
   5621 NTSTATUS
   5622 NTAPI
   5623 ZwDeviceIoControlFile(
   5624   IN HANDLE FileHandle,
   5625   IN HANDLE Event OPTIONAL,
   5626   IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
   5627   IN PVOID ApcContext OPTIONAL,
   5628   OUT PIO_STATUS_BLOCK IoStatusBlock,
   5629   IN ULONG IoControlCode,
   5630   IN PVOID InputBuffer OPTIONAL,
   5631   IN ULONG InputBufferLength,
   5632   OUT PVOID OutputBuffer OPTIONAL,
   5633   IN ULONG OutputBufferLength);
   5634 
   5635 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
   5636 
   5637 
   5638 #if (NTDDI_VERSION >= NTDDI_WIN7)
   5639 
   5640 NTSTATUS
   5641 NTAPI
   5642 ZwSetTimerEx(
   5643   IN HANDLE TimerHandle,
   5644   IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,
   5645   IN OUT PVOID TimerSetInformation,
   5646   IN ULONG TimerSetInformationLength);
   5647 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
   5648 
   5649 
   5650 
   5651 /* UNSORTED */
   5652 
   5653 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
   5654   ((ConditionMask) = VerSetConditionMask((ConditionMask),             \
   5655   (TypeBitMask), (ComparisonType)))
   5656 
   5657 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   5658 NTSYSAPI
   5659 ULONGLONG
   5660 NTAPI
   5661 VerSetConditionMask(
   5662   IN ULONGLONG ConditionMask,
   5663   IN ULONG TypeMask,
   5664   IN UCHAR Condition);
   5665 #endif
   5666 
   5667 typedef struct _KERNEL_USER_TIMES {
   5668   LARGE_INTEGER CreateTime;
   5669   LARGE_INTEGER ExitTime;
   5670   LARGE_INTEGER KernelTime;
   5671   LARGE_INTEGER UserTime;
   5672 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
   5673 
   5674 /* NtXxx Functions */
   5675 
   5676 typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION {
   5677   SystemFirmwareTable_Enumerate,
   5678   SystemFirmwareTable_Get
   5679 } SYSTEM_FIRMWARE_TABLE_ACTION;
   5680 
   5681 typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION {
   5682   ULONG ProviderSignature;
   5683   SYSTEM_FIRMWARE_TABLE_ACTION Action;
   5684   ULONG TableID;
   5685   ULONG TableBufferLength;
   5686   UCHAR TableBuffer[ANYSIZE_ARRAY];
   5687 } SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;
   5688 
   5689 typedef NTSTATUS
   5690 (__cdecl *PFNFTH)(
   5691   IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo);
   5692 
   5693 typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER {
   5694   ULONG ProviderSignature;
   5695   BOOLEAN Register;
   5696   PFNFTH FirmwareTableHandler;
   5697   PVOID DriverObject;
   5698 } SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER;
   5699 
   5700 typedef ULONG_PTR
   5701 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
   5702   IN PVOID Context);
   5703 
   5704 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
   5705   PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
   5706   PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
   5707 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
   5708 
   5709 #define DRIVER_VERIFIER_SPECIAL_POOLING             0x0001
   5710 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING         0x0002
   5711 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES  0x0004
   5712 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS      0x0008
   5713 #define DRIVER_VERIFIER_IO_CHECKING                 0x0010
   5714 
   5715 #define SHARED_GLOBAL_FLAGS_ERROR_PORT_V        0x0
   5716 #define SHARED_GLOBAL_FLAGS_ERROR_PORT          (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V)
   5717 
   5718 #define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V 0x1
   5719 #define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED   (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V)
   5720 
   5721 #define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V      0x2
   5722 #define SHARED_GLOBAL_FLAGS_VIRT_ENABLED        (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V)
   5723 
   5724 #define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V  0x3
   5725 #define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED    \
   5726   (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V)
   5727 
   5728 #define SHARED_GLOBAL_FLAGS_SPARE_V                     0x4
   5729 #define SHARED_GLOBAL_FLAGS_SPARE                       \
   5730   (1UL << SHARED_GLOBAL_FLAGS_SPARE_V)
   5731 
   5732 #define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V      0x5
   5733 #define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED        \
   5734   (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V)
   5735 
   5736 #define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V    0x6
   5737 #define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED        \
   5738   (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V)
   5739 
   5740 #define EX_INIT_BITS(Flags, Bit) \
   5741   *((Flags)) |= (Bit)             // Safe to use before concurrently accessible
   5742 
   5743 #define EX_TEST_SET_BIT(Flags, Bit) \
   5744   InterlockedBitTestAndSet ((PLONG)(Flags), (Bit))
   5745 
   5746 #define EX_TEST_CLEAR_BIT(Flags, Bit) \
   5747   InterlockedBitTestAndReset ((PLONG)(Flags), (Bit))
   5748 
   5749 #define PCCARD_MAP_ERROR               0x01
   5750 #define PCCARD_DEVICE_PCI              0x10
   5751 
   5752 #define PCCARD_SCAN_DISABLED           0x01
   5753 #define PCCARD_MAP_ZERO                0x02
   5754 #define PCCARD_NO_TIMER                0x03
   5755 #define PCCARD_NO_PIC                  0x04
   5756 #define PCCARD_NO_LEGACY_BASE          0x05
   5757 #define PCCARD_DUP_LEGACY_BASE         0x06
   5758 #define PCCARD_NO_CONTROLLERS          0x07
   5759 
   5760 #define MAXIMUM_EXPANSION_SIZE (KERNEL_LARGE_STACK_SIZE - (PAGE_SIZE / 2))
   5761 
   5762 /* Filesystem runtime library routines */
   5763 
   5764 #if (NTDDI_VERSION >= NTDDI_WIN2K)
   5765 NTKERNELAPI
   5766 BOOLEAN
   5767 NTAPI
   5768 FsRtlIsTotalDeviceFailure(
   5769   IN NTSTATUS Status);
   5770 #endif
   5771 
   5772 #ifdef __cplusplus
   5773 }
   5774 #endif
   5775