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