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 ([email protected])
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
KeGetCurrentProcessorNumber(VOID)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
KeGetPcr(VOID)3273 KeGetPcr(VOID)
3274 {
3275     return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
3276 }
3277 
3278 FORCEINLINE
3279 ULONG
KeGetCurrentProcessorNumber(VOID)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
ExAllocateFromZone(IN PZONE_HEADER Zone)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
ExFreeToZone(IN PZONE_HEADER Zone,IN PVOID Block)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
IoInitializeDriverCreateContext(PIO_DRIVER_CREATE_CONTEXT DriverContext)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
RtlLargeIntegerDivide(IN LARGE_INTEGER Dividend,IN LARGE_INTEGER Divisor,OUT PLARGE_INTEGER Remainder OPTIONAL)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
RtlConvertLongToLuid(IN LONG Val)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
RtlConvertUlongToLuid(IN ULONG Val)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
RtlInitHashTableContext(IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)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
RtlInitHashTableContextFromEnumerator(IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context,IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator)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
RtlReleaseHashTableContext(IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)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
RtlTotalBucketsHashTable(IN PRTL_DYNAMIC_HASH_TABLE HashTable)5462 RtlTotalBucketsHashTable(
5463   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
5464 {
5465   return HashTable->TableSize;
5466 }
5467 
5468 FORCEINLINE
5469 ULONG
5470 NTAPI
RtlNonEmptyBucketsHashTable(IN PRTL_DYNAMIC_HASH_TABLE HashTable)5471 RtlNonEmptyBucketsHashTable(
5472   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
5473 {
5474   return HashTable->NonEmptyBuckets;
5475 }
5476 
5477 FORCEINLINE
5478 ULONG
5479 NTAPI
RtlEmptyBucketsHashTable(IN PRTL_DYNAMIC_HASH_TABLE HashTable)5480 RtlEmptyBucketsHashTable(
5481   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
5482 {
5483   return HashTable->TableSize - HashTable->NonEmptyBuckets;
5484 }
5485 
5486 FORCEINLINE
5487 ULONG
5488 NTAPI
RtlTotalEntriesHashTable(IN PRTL_DYNAMIC_HASH_TABLE HashTable)5489 RtlTotalEntriesHashTable(
5490   IN PRTL_DYNAMIC_HASH_TABLE HashTable)
5491 {
5492   return HashTable->NumEntries;
5493 }
5494 
5495 FORCEINLINE
5496 ULONG
5497 NTAPI
RtlActiveEnumeratorsHashTable(IN PRTL_DYNAMIC_HASH_TABLE HashTable)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