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