Partial merge of the condrv_restructure branch, including:
[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 extern PHAL_DISPATCH HalDispatchTable;
1674 __CREATE_NTOS_DATA_IMPORT_ALIAS(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 _NT_TIB {
1943 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
1944 PVOID StackBase;
1945 PVOID StackLimit;
1946 PVOID SubSystemTib;
1947 _ANONYMOUS_UNION union {
1948 PVOID FiberData;
1949 ULONG Version;
1950 } DUMMYUNIONNAME;
1951 PVOID ArbitraryUserPointer;
1952 struct _NT_TIB *Self;
1953 } NT_TIB, *PNT_TIB;
1954
1955 typedef struct _NT_TIB32 {
1956 ULONG ExceptionList;
1957 ULONG StackBase;
1958 ULONG StackLimit;
1959 ULONG SubSystemTib;
1960 _ANONYMOUS_UNION union {
1961 ULONG FiberData;
1962 ULONG Version;
1963 } DUMMYUNIONNAME;
1964 ULONG ArbitraryUserPointer;
1965 ULONG Self;
1966 } NT_TIB32,*PNT_TIB32;
1967
1968 typedef struct _NT_TIB64 {
1969 ULONG64 ExceptionList;
1970 ULONG64 StackBase;
1971 ULONG64 StackLimit;
1972 ULONG64 SubSystemTib;
1973 _ANONYMOUS_UNION union {
1974 ULONG64 FiberData;
1975 ULONG Version;
1976 } DUMMYUNIONNAME;
1977 ULONG64 ArbitraryUserPointer;
1978 ULONG64 Self;
1979 } NT_TIB64,*PNT_TIB64;
1980
1981 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
1982 #define NX_SUPPORT_POLICY_ALWAYSON 1
1983 #define NX_SUPPORT_POLICY_OPTIN 2
1984 #define NX_SUPPORT_POLICY_OPTOUT 3
1985
1986 _IRQL_requires_same_
1987 _Function_class_(EXPAND_STACK_CALLOUT)
1988 typedef VOID
1989 (NTAPI EXPAND_STACK_CALLOUT)(
1990 _In_opt_ PVOID Parameter);
1991 typedef EXPAND_STACK_CALLOUT *PEXPAND_STACK_CALLOUT;
1992
1993 typedef VOID
1994 (NTAPI *PTIMER_APC_ROUTINE)(
1995 _In_ PVOID TimerContext,
1996 _In_ ULONG TimerLowValue,
1997 _In_ LONG TimerHighValue);
1998
1999 typedef enum _TIMER_SET_INFORMATION_CLASS {
2000 TimerSetCoalescableTimer,
2001 MaxTimerInfoClass
2002 } TIMER_SET_INFORMATION_CLASS;
2003
2004 #if (NTDDI_VERSION >= NTDDI_WIN7)
2005 typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO {
2006 _In_ LARGE_INTEGER DueTime;
2007 _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine;
2008 _In_opt_ PVOID TimerContext;
2009 _In_opt_ struct _COUNTED_REASON_CONTEXT *WakeContext;
2010 _In_opt_ ULONG Period;
2011 _In_ ULONG TolerableDelay;
2012 _Out_opt_ PBOOLEAN PreviousState;
2013 } TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO;
2014 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2015
2016 #define XSTATE_LEGACY_FLOATING_POINT 0
2017 #define XSTATE_LEGACY_SSE 1
2018 #define XSTATE_GSSE 2
2019
2020 #define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT))
2021 #define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE))
2022 #define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
2023 #define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE))
2024
2025 #define MAXIMUM_XSTATE_FEATURES 64
2026
2027 typedef struct _XSTATE_FEATURE {
2028 ULONG Offset;
2029 ULONG Size;
2030 } XSTATE_FEATURE, *PXSTATE_FEATURE;
2031
2032 typedef struct _XSTATE_CONFIGURATION {
2033 ULONG64 EnabledFeatures;
2034 ULONG Size;
2035 ULONG OptimizedSave:1;
2036 XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES];
2037 } XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION;
2038
2039 #define MAX_WOW64_SHARED_ENTRIES 16
2040
2041 typedef struct _KUSER_SHARED_DATA {
2042 ULONG TickCountLowDeprecated;
2043 ULONG TickCountMultiplier;
2044 volatile KSYSTEM_TIME InterruptTime;
2045 volatile KSYSTEM_TIME SystemTime;
2046 volatile KSYSTEM_TIME TimeZoneBias;
2047 USHORT ImageNumberLow;
2048 USHORT ImageNumberHigh;
2049 WCHAR NtSystemRoot[260];
2050 ULONG MaxStackTraceDepth;
2051 ULONG CryptoExponent;
2052 ULONG TimeZoneId;
2053 ULONG LargePageMinimum;
2054 ULONG Reserved2[7];
2055 NT_PRODUCT_TYPE NtProductType;
2056 BOOLEAN ProductTypeIsValid;
2057 ULONG NtMajorVersion;
2058 ULONG NtMinorVersion;
2059 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
2060 ULONG Reserved1;
2061 ULONG Reserved3;
2062 volatile ULONG TimeSlip;
2063 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
2064 ULONG AltArchitecturePad[1];
2065 LARGE_INTEGER SystemExpirationDate;
2066 ULONG SuiteMask;
2067 BOOLEAN KdDebuggerEnabled;
2068 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2069 UCHAR NXSupportPolicy;
2070 #endif
2071 volatile ULONG ActiveConsoleId;
2072 volatile ULONG DismountCount;
2073 ULONG ComPlusPackage;
2074 ULONG LastSystemRITEventTickCount;
2075 ULONG NumberOfPhysicalPages;
2076 BOOLEAN SafeBootMode;
2077 #if (NTDDI_VERSION >= NTDDI_WIN7)
2078 _ANONYMOUS_UNION union {
2079 UCHAR TscQpcData;
2080 _ANONYMOUS_STRUCT struct {
2081 UCHAR TscQpcEnabled:1;
2082 UCHAR TscQpcSpareFlag:1;
2083 UCHAR TscQpcShift:6;
2084 } DUMMYSTRUCTNAME;
2085 } DUMMYUNIONNAME;
2086 UCHAR TscQpcPad[2];
2087 #endif
2088 #if (NTDDI_VERSION >= NTDDI_VISTA)
2089 _ANONYMOUS_UNION union {
2090 ULONG SharedDataFlags;
2091 _ANONYMOUS_STRUCT struct {
2092 ULONG DbgErrorPortPresent:1;
2093 ULONG DbgElevationEnabled:1;
2094 ULONG DbgVirtEnabled:1;
2095 ULONG DbgInstallerDetectEnabled:1;
2096 ULONG DbgSystemDllRelocated:1;
2097 ULONG DbgDynProcessorEnabled:1;
2098 ULONG DbgSEHValidationEnabled:1;
2099 ULONG SpareBits:25;
2100 } DUMMYSTRUCTNAME2;
2101 } DUMMYUNIONNAME2;
2102 #else
2103 ULONG TraceLogging;
2104 #endif
2105 ULONG DataFlagsPad[1];
2106 ULONGLONG TestRetInstruction;
2107 ULONG SystemCall;
2108 ULONG SystemCallReturn;
2109 ULONGLONG SystemCallPad[3];
2110 _ANONYMOUS_UNION union {
2111 volatile KSYSTEM_TIME TickCount;
2112 volatile ULONG64 TickCountQuad;
2113 _ANONYMOUS_STRUCT struct {
2114 ULONG ReservedTickCountOverlay[3];
2115 ULONG TickCountPad[1];
2116 } DUMMYSTRUCTNAME;
2117 } DUMMYUNIONNAME3;
2118 ULONG Cookie;
2119 ULONG CookiePad[1];
2120 #if (NTDDI_VERSION >= NTDDI_WS03)
2121 LONGLONG ConsoleSessionForegroundProcessId;
2122 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
2123 #endif
2124 #if (NTDDI_VERSION >= NTDDI_VISTA)
2125 #if (NTDDI_VERSION >= NTDDI_WIN7)
2126 USHORT UserModeGlobalLogger[16];
2127 #else
2128 USHORT UserModeGlobalLogger[8];
2129 ULONG HeapTracingPid[2];
2130 ULONG CritSecTracingPid[2];
2131 #endif
2132 ULONG ImageFileExecutionOptions;
2133 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
2134 ULONG LangGenerationCount;
2135 #else
2136 /* 4 bytes padding */
2137 #endif
2138 ULONGLONG Reserved5;
2139 volatile ULONG64 InterruptTimeBias;
2140 #endif
2141 #if (NTDDI_VERSION >= NTDDI_WIN7)
2142 volatile ULONG64 TscQpcBias;
2143 volatile ULONG ActiveProcessorCount;
2144 volatile USHORT ActiveGroupCount;
2145 USHORT Reserved4;
2146 volatile ULONG AitSamplingValue;
2147 volatile ULONG AppCompatFlag;
2148 ULONGLONG SystemDllNativeRelocation;
2149 ULONG SystemDllWowRelocation;
2150 ULONG XStatePad[1];
2151 XSTATE_CONFIGURATION XState;
2152 #endif
2153 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
2154
2155 #if (NTDDI_VERSION >= NTDDI_VISTA)
2156 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
2157 #elif (NTDDI_VERSION >= NTDDI_WINXP)
2158 extern NTSYSAPI CCHAR KeNumberProcessors;
2159 #else
2160 extern PCCHAR KeNumberProcessors;
2161 #endif
2162
2163
2164 /******************************************************************************
2165 * Kernel Debugger Types *
2166 ******************************************************************************/
2167 typedef struct _DEBUG_DEVICE_ADDRESS {
2168 UCHAR Type;
2169 BOOLEAN Valid;
2170 UCHAR Reserved[2];
2171 PUCHAR TranslatedAddress;
2172 ULONG Length;
2173 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
2174
2175 typedef struct _DEBUG_MEMORY_REQUIREMENTS {
2176 PHYSICAL_ADDRESS Start;
2177 PHYSICAL_ADDRESS MaxEnd;
2178 PVOID VirtualAddress;
2179 ULONG Length;
2180 BOOLEAN Cached;
2181 BOOLEAN Aligned;
2182 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
2183
2184 typedef struct _DEBUG_DEVICE_DESCRIPTOR {
2185 ULONG Bus;
2186 ULONG Slot;
2187 USHORT Segment;
2188 USHORT VendorID;
2189 USHORT DeviceID;
2190 UCHAR BaseClass;
2191 UCHAR SubClass;
2192 UCHAR ProgIf;
2193 BOOLEAN Initialized;
2194 BOOLEAN Configured;
2195 DEBUG_DEVICE_ADDRESS BaseAddress[6];
2196 DEBUG_MEMORY_REQUIREMENTS Memory;
2197 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
2198
2199 typedef NTSTATUS
2200 (NTAPI *pKdSetupPciDeviceForDebugging)(
2201 _In_opt_ PVOID LoaderBlock,
2202 _Inout_ PDEBUG_DEVICE_DESCRIPTOR PciDevice);
2203
2204 typedef NTSTATUS
2205 (NTAPI *pKdReleasePciDeviceForDebugging)(
2206 _Inout_ PDEBUG_DEVICE_DESCRIPTOR PciDevice);
2207
2208 typedef PVOID
2209 (NTAPI *pKdGetAcpiTablePhase0)(
2210 _In_ struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
2211 _In_ ULONG Signature);
2212
2213 typedef VOID
2214 (NTAPI *pKdCheckPowerButton)(VOID);
2215
2216 #if (NTDDI_VERSION >= NTDDI_VISTA)
2217 typedef PVOID
2218 (NTAPI *pKdMapPhysicalMemory64)(
2219 _In_ PHYSICAL_ADDRESS PhysicalAddress,
2220 _In_ ULONG NumberPages,
2221 _In_ BOOLEAN FlushCurrentTLB);
2222
2223 typedef VOID
2224 (NTAPI *pKdUnmapVirtualAddress)(
2225 _In_ PVOID VirtualAddress,
2226 _In_ ULONG NumberPages,
2227 _In_ BOOLEAN FlushCurrentTLB);
2228 #else
2229 typedef PVOID
2230 (NTAPI *pKdMapPhysicalMemory64)(
2231 _In_ PHYSICAL_ADDRESS PhysicalAddress,
2232 _In_ ULONG NumberPages);
2233
2234 typedef VOID
2235 (NTAPI *pKdUnmapVirtualAddress)(
2236 _In_ PVOID VirtualAddress,
2237 _In_ ULONG NumberPages);
2238 #endif
2239
2240 typedef ULONG
2241 (NTAPI *pKdGetPciDataByOffset)(
2242 _In_ ULONG BusNumber,
2243 _In_ ULONG SlotNumber,
2244 _Out_writes_bytes_(Length) PVOID Buffer,
2245 _In_ ULONG Offset,
2246 _In_ ULONG Length);
2247
2248 typedef ULONG
2249 (NTAPI *pKdSetPciDataByOffset)(
2250 _In_ ULONG BusNumber,
2251 _In_ ULONG SlotNumber,
2252 _In_reads_bytes_(Length) PVOID Buffer,
2253 _In_ ULONG Offset,
2254 _In_ ULONG Length);
2255 /******************************************************************************
2256 * Memory manager Types *
2257 ******************************************************************************/
2258
2259 typedef struct _PHYSICAL_MEMORY_RANGE {
2260 PHYSICAL_ADDRESS BaseAddress;
2261 LARGE_INTEGER NumberOfBytes;
2262 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
2263
2264 typedef NTSTATUS
2265 (NTAPI *PMM_ROTATE_COPY_CALLBACK_FUNCTION)(
2266 _In_ PMDL DestinationMdl,
2267 _In_ PMDL SourceMdl,
2268 _In_ PVOID Context);
2269
2270 typedef enum _MM_ROTATE_DIRECTION {
2271 MmToFrameBuffer,
2272 MmToFrameBufferNoCopy,
2273 MmToRegularMemory,
2274 MmToRegularMemoryNoCopy,
2275 MmMaximumRotateDirection
2276 } MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION;
2277
2278
2279 /******************************************************************************
2280 * Process Manager Types *
2281 ******************************************************************************/
2282
2283 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
2284 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
2285 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
2286 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
2287 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
2288
2289 typedef struct _QUOTA_LIMITS {
2290 SIZE_T PagedPoolLimit;
2291 SIZE_T NonPagedPoolLimit;
2292 SIZE_T MinimumWorkingSetSize;
2293 SIZE_T MaximumWorkingSetSize;
2294 SIZE_T PagefileLimit;
2295 LARGE_INTEGER TimeLimit;
2296 } QUOTA_LIMITS, *PQUOTA_LIMITS;
2297
2298 typedef union _RATE_QUOTA_LIMIT {
2299 ULONG RateData;
2300 _ANONYMOUS_STRUCT struct {
2301 ULONG RatePercent:7;
2302 ULONG Reserved0:25;
2303 } DUMMYSTRUCTNAME;
2304 } RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT;
2305
2306 typedef struct _QUOTA_LIMITS_EX {
2307 SIZE_T PagedPoolLimit;
2308 SIZE_T NonPagedPoolLimit;
2309 SIZE_T MinimumWorkingSetSize;
2310 SIZE_T MaximumWorkingSetSize;
2311 SIZE_T PagefileLimit;
2312 LARGE_INTEGER TimeLimit;
2313 SIZE_T WorkingSetLimit;
2314 SIZE_T Reserved2;
2315 SIZE_T Reserved3;
2316 SIZE_T Reserved4;
2317 ULONG Flags;
2318 RATE_QUOTA_LIMIT CpuRateLimit;
2319 } QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
2320
2321 typedef struct _IO_COUNTERS {
2322 ULONGLONG ReadOperationCount;
2323 ULONGLONG WriteOperationCount;
2324 ULONGLONG OtherOperationCount;
2325 ULONGLONG ReadTransferCount;
2326 ULONGLONG WriteTransferCount;
2327 ULONGLONG OtherTransferCount;
2328 } IO_COUNTERS, *PIO_COUNTERS;
2329
2330 typedef struct _VM_COUNTERS {
2331 SIZE_T PeakVirtualSize;
2332 SIZE_T VirtualSize;
2333 ULONG PageFaultCount;
2334 SIZE_T PeakWorkingSetSize;
2335 SIZE_T WorkingSetSize;
2336 SIZE_T QuotaPeakPagedPoolUsage;
2337 SIZE_T QuotaPagedPoolUsage;
2338 SIZE_T QuotaPeakNonPagedPoolUsage;
2339 SIZE_T QuotaNonPagedPoolUsage;
2340 SIZE_T PagefileUsage;
2341 SIZE_T PeakPagefileUsage;
2342 } VM_COUNTERS, *PVM_COUNTERS;
2343
2344 typedef struct _VM_COUNTERS_EX {
2345 SIZE_T PeakVirtualSize;
2346 SIZE_T VirtualSize;
2347 ULONG PageFaultCount;
2348 SIZE_T PeakWorkingSetSize;
2349 SIZE_T WorkingSetSize;
2350 SIZE_T QuotaPeakPagedPoolUsage;
2351 SIZE_T QuotaPagedPoolUsage;
2352 SIZE_T QuotaPeakNonPagedPoolUsage;
2353 SIZE_T QuotaNonPagedPoolUsage;
2354 SIZE_T PagefileUsage;
2355 SIZE_T PeakPagefileUsage;
2356 SIZE_T PrivateUsage;
2357 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
2358
2359 #define MAX_HW_COUNTERS 16
2360 #define THREAD_PROFILING_FLAG_DISPATCH 0x00000001
2361
2362 typedef enum _HARDWARE_COUNTER_TYPE {
2363 PMCCounter,
2364 MaxHardwareCounterType
2365 } HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE;
2366
2367 typedef struct _HARDWARE_COUNTER {
2368 HARDWARE_COUNTER_TYPE Type;
2369 ULONG Reserved;
2370 ULONG64 Index;
2371 } HARDWARE_COUNTER, *PHARDWARE_COUNTER;
2372
2373 typedef struct _POOLED_USAGE_AND_LIMITS {
2374 SIZE_T PeakPagedPoolUsage;
2375 SIZE_T PagedPoolUsage;
2376 SIZE_T PagedPoolLimit;
2377 SIZE_T PeakNonPagedPoolUsage;
2378 SIZE_T NonPagedPoolUsage;
2379 SIZE_T NonPagedPoolLimit;
2380 SIZE_T PeakPagefileUsage;
2381 SIZE_T PagefileUsage;
2382 SIZE_T PagefileLimit;
2383 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
2384
2385 typedef struct _PROCESS_ACCESS_TOKEN {
2386 HANDLE Token;
2387 HANDLE Thread;
2388 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
2389
2390 #define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS 0x00000003UL
2391 #define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1))
2392
2393 typedef struct _PROCESS_EXCEPTION_PORT {
2394 _In_ HANDLE ExceptionPortHandle;
2395 _Inout_ ULONG StateFlags;
2396 } PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT;
2397
2398 typedef VOID
2399 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
2400 _In_ HANDLE ParentId,
2401 _In_ HANDLE ProcessId,
2402 _In_ BOOLEAN Create);
2403
2404 typedef struct _PS_CREATE_NOTIFY_INFO {
2405 _In_ SIZE_T Size;
2406 _ANONYMOUS_UNION union {
2407 _In_ ULONG Flags;
2408 _ANONYMOUS_STRUCT struct {
2409 _In_ ULONG FileOpenNameAvailable:1;
2410 _In_ ULONG Reserved:31;
2411 } DUMMYSTRUCTNAME;
2412 } DUMMYUNIONNAME;
2413 _In_ HANDLE ParentProcessId;
2414 _In_ CLIENT_ID CreatingThreadId;
2415 _Inout_ struct _FILE_OBJECT *FileObject;
2416 _In_ PCUNICODE_STRING ImageFileName;
2417 _In_opt_ PCUNICODE_STRING CommandLine;
2418 _Inout_ NTSTATUS CreationStatus;
2419 } PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
2420
2421 typedef VOID
2422 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE_EX)(
2423 _Inout_ PEPROCESS Process,
2424 _In_ HANDLE ProcessId,
2425 _Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo);
2426
2427 typedef VOID
2428 (NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
2429 _In_ HANDLE ProcessId,
2430 _In_ HANDLE ThreadId,
2431 _In_ BOOLEAN Create);
2432
2433 #define IMAGE_ADDRESSING_MODE_32BIT 3
2434
2435 typedef struct _IMAGE_INFO {
2436 _ANONYMOUS_UNION union {
2437 ULONG Properties;
2438 _ANONYMOUS_STRUCT struct {
2439 ULONG ImageAddressingMode:8;
2440 ULONG SystemModeImage:1;
2441 ULONG ImageMappedToAllPids:1;
2442 ULONG ExtendedInfoPresent:1;
2443 ULONG Reserved:21;
2444 } DUMMYSTRUCTNAME;
2445 } DUMMYUNIONNAME;
2446 PVOID ImageBase;
2447 ULONG ImageSelector;
2448 SIZE_T ImageSize;
2449 ULONG ImageSectionNumber;
2450 } IMAGE_INFO, *PIMAGE_INFO;
2451
2452 typedef struct _IMAGE_INFO_EX {
2453 SIZE_T Size;
2454 IMAGE_INFO ImageInfo;
2455 struct _FILE_OBJECT *FileObject;
2456 } IMAGE_INFO_EX, *PIMAGE_INFO_EX;
2457
2458 typedef VOID
2459 (NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
2460 _In_ PUNICODE_STRING FullImageName,
2461 _In_ HANDLE ProcessId,
2462 _In_ PIMAGE_INFO ImageInfo);
2463
2464 #define THREAD_CSWITCH_PMU_DISABLE FALSE
2465 #define THREAD_CSWITCH_PMU_ENABLE TRUE
2466
2467 #define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001
2468
2469 #define PROCESS_HANDLE_TRACING_MAX_STACKS 16
2470
2471 typedef enum _PROCESSINFOCLASS {
2472 ProcessBasicInformation,
2473 ProcessQuotaLimits,
2474 ProcessIoCounters,
2475 ProcessVmCounters,
2476 ProcessTimes,
2477 ProcessBasePriority,
2478 ProcessRaisePriority,
2479 ProcessDebugPort,
2480 ProcessExceptionPort,
2481 ProcessAccessToken,
2482 ProcessLdtInformation,
2483 ProcessLdtSize,
2484 ProcessDefaultHardErrorMode,
2485 ProcessIoPortHandlers,
2486 ProcessPooledUsageAndLimits,
2487 ProcessWorkingSetWatch,
2488 ProcessUserModeIOPL,
2489 ProcessEnableAlignmentFaultFixup,
2490 ProcessPriorityClass,
2491 ProcessWx86Information,
2492 ProcessHandleCount,
2493 ProcessAffinityMask,
2494 ProcessPriorityBoost,
2495 ProcessDeviceMap,
2496 ProcessSessionInformation,
2497 ProcessForegroundInformation,
2498 ProcessWow64Information,
2499 ProcessImageFileName,
2500 ProcessLUIDDeviceMapsEnabled,
2501 ProcessBreakOnTermination,
2502 ProcessDebugObjectHandle,
2503 ProcessDebugFlags,
2504 ProcessHandleTracing,
2505 ProcessIoPriority,
2506 ProcessExecuteFlags,
2507 ProcessTlsInformation,
2508 ProcessCookie,
2509 ProcessImageInformation,
2510 ProcessCycleTime,
2511 ProcessPagePriority,
2512 ProcessInstrumentationCallback,
2513 ProcessThreadStackAllocation,
2514 ProcessWorkingSetWatchEx,
2515 ProcessImageFileNameWin32,
2516 ProcessImageFileMapping,
2517 ProcessAffinityUpdateMode,
2518 ProcessMemoryAllocationMode,
2519 ProcessGroupInformation,
2520 ProcessTokenVirtualizationEnabled,
2521 ProcessConsoleHostProcess,
2522 ProcessWindowInformation,
2523 MaxProcessInfoClass
2524 } PROCESSINFOCLASS;
2525
2526 typedef enum _THREADINFOCLASS {
2527 ThreadBasicInformation,
2528 ThreadTimes,
2529 ThreadPriority,
2530 ThreadBasePriority,
2531 ThreadAffinityMask,
2532 ThreadImpersonationToken,
2533 ThreadDescriptorTableEntry,
2534 ThreadEnableAlignmentFaultFixup,
2535 ThreadEventPair_Reusable,
2536 ThreadQuerySetWin32StartAddress,
2537 ThreadZeroTlsCell,
2538 ThreadPerformanceCount,
2539 ThreadAmILastThread,
2540 ThreadIdealProcessor,
2541 ThreadPriorityBoost,
2542 ThreadSetTlsArrayAddress,
2543 ThreadIsIoPending,
2544 ThreadHideFromDebugger,
2545 ThreadBreakOnTermination,
2546 ThreadSwitchLegacyState,
2547 ThreadIsTerminated,
2548 ThreadLastSystemCall,
2549 ThreadIoPriority,
2550 ThreadCycleTime,
2551 ThreadPagePriority,
2552 ThreadActualBasePriority,
2553 ThreadTebInformation,
2554 ThreadCSwitchMon,
2555 ThreadCSwitchPmu,
2556 ThreadWow64Context,
2557 ThreadGroupInformation,
2558 ThreadUmsInformation,
2559 ThreadCounterProfiling,
2560 ThreadIdealProcessorEx,
2561 MaxThreadInfoClass
2562 } THREADINFOCLASS;
2563
2564 typedef struct _PAGE_PRIORITY_INFORMATION {
2565 ULONG PagePriority;
2566 } PAGE_PRIORITY_INFORMATION, *PPAGE_PRIORITY_INFORMATION;
2567
2568 typedef struct _PROCESS_WS_WATCH_INFORMATION {
2569 PVOID FaultingPc;
2570 PVOID FaultingVa;
2571 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
2572
2573 typedef struct _PROCESS_BASIC_INFORMATION {
2574 NTSTATUS ExitStatus;
2575 struct _PEB *PebBaseAddress;
2576 ULONG_PTR AffinityMask;
2577 KPRIORITY BasePriority;
2578 ULONG_PTR UniqueProcessId;
2579 ULONG_PTR InheritedFromUniqueProcessId;
2580 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
2581
2582 typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
2583 SIZE_T Size;
2584 PROCESS_BASIC_INFORMATION BasicInfo;
2585 _ANONYMOUS_UNION union {
2586 ULONG Flags;
2587 _ANONYMOUS_STRUCT struct {
2588 ULONG IsProtectedProcess:1;
2589 ULONG IsWow64Process:1;
2590 ULONG IsProcessDeleting:1;
2591 ULONG IsCrossSessionCreate:1;
2592 ULONG SpareBits:28;
2593 } DUMMYSTRUCTNAME;
2594 } DUMMYUNIONNAME;
2595 } PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;
2596
2597 typedef struct _PROCESS_DEVICEMAP_INFORMATION {
2598 _ANONYMOUS_UNION union {
2599 struct {
2600 HANDLE DirectoryHandle;
2601 } Set;
2602 struct {
2603 ULONG DriveMap;
2604 UCHAR DriveType[32];
2605 } Query;
2606 } DUMMYUNIONNAME;
2607 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
2608
2609 typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX {
2610 _ANONYMOUS_UNION union {
2611 struct {
2612 HANDLE DirectoryHandle;
2613 } Set;
2614 struct {
2615 ULONG DriveMap;
2616 UCHAR DriveType[32];
2617 } Query;
2618 } DUMMYUNIONNAME;
2619 ULONG Flags;
2620 } PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX;
2621
2622 typedef struct _PROCESS_SESSION_INFORMATION {
2623 ULONG SessionId;
2624 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
2625
2626 typedef struct _PROCESS_HANDLE_TRACING_ENABLE {
2627 ULONG Flags;
2628 } PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE;
2629
2630 typedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX {
2631 ULONG Flags;
2632 ULONG TotalSlots;
2633 } PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX;
2634
2635 typedef struct _PROCESS_HANDLE_TRACING_ENTRY {
2636 HANDLE Handle;
2637 CLIENT_ID ClientId;
2638 ULONG Type;
2639 PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS];
2640 } PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY;
2641
2642 typedef struct _PROCESS_HANDLE_TRACING_QUERY {
2643 HANDLE Handle;
2644 ULONG TotalTraces;
2645 PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1];
2646 } PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY;
2647
2648 extern NTKERNELAPI PEPROCESS PsInitialSystemProcess;
2649
2650
2651 /******************************************************************************
2652 * Runtime Library Types *
2653 ******************************************************************************/
2654
2655
2656 #ifndef _RTL_RUN_ONCE_DEF
2657 #define _RTL_RUN_ONCE_DEF
2658
2659 #define RTL_RUN_ONCE_INIT {0}
2660
2661 #define RTL_RUN_ONCE_CHECK_ONLY 0x00000001UL
2662 #define RTL_RUN_ONCE_ASYNC 0x00000002UL
2663 #define RTL_RUN_ONCE_INIT_FAILED 0x00000004UL
2664
2665 #define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
2666
2667 #define RTL_HASH_ALLOCATED_HEADER 0x00000001
2668
2669 #define RTL_HASH_RESERVED_SIGNATURE 0
2670
2671 /* RtlVerifyVersionInfo() ComparisonType */
2672
2673 #define VER_EQUAL 1
2674 #define VER_GREATER 2
2675 #define VER_GREATER_EQUAL 3
2676 #define VER_LESS 4
2677 #define VER_LESS_EQUAL 5
2678 #define VER_AND 6
2679 #define VER_OR 7
2680
2681 #define VER_CONDITION_MASK 7
2682 #define VER_NUM_BITS_PER_CONDITION_MASK 3
2683
2684 /* RtlVerifyVersionInfo() TypeMask */
2685
2686 #define VER_MINORVERSION 0x0000001
2687 #define VER_MAJORVERSION 0x0000002
2688 #define VER_BUILDNUMBER 0x0000004
2689 #define VER_PLATFORMID 0x0000008
2690 #define VER_SERVICEPACKMINOR 0x0000010
2691 #define VER_SERVICEPACKMAJOR 0x0000020
2692 #define VER_SUITENAME 0x0000040
2693 #define VER_PRODUCT_TYPE 0x0000080
2694
2695 #define VER_NT_WORKSTATION 0x0000001
2696 #define VER_NT_DOMAIN_CONTROLLER 0x0000002
2697 #define VER_NT_SERVER 0x0000003
2698
2699 #define VER_PLATFORM_WIN32s 0
2700 #define VER_PLATFORM_WIN32_WINDOWS 1
2701 #define VER_PLATFORM_WIN32_NT 2
2702
2703 typedef union _RTL_RUN_ONCE {
2704 PVOID Ptr;
2705 } RTL_RUN_ONCE, *PRTL_RUN_ONCE;
2706
2707 _Function_class_(RTL_RUN_ONCE_INIT_FN)
2708 _IRQL_requires_same_
2709 typedef ULONG /* LOGICAL */
2710 (NTAPI *PRTL_RUN_ONCE_INIT_FN) (
2711 _Inout_ PRTL_RUN_ONCE RunOnce,
2712 _Inout_opt_ PVOID Parameter,
2713 _Inout_opt_ PVOID *Context);
2714
2715 #endif /* _RTL_RUN_ONCE_DEF */
2716
2717 typedef enum _TABLE_SEARCH_RESULT {
2718 TableEmptyTree,
2719 TableFoundNode,
2720 TableInsertAsLeft,
2721 TableInsertAsRight
2722 } TABLE_SEARCH_RESULT;
2723
2724 typedef enum _RTL_GENERIC_COMPARE_RESULTS {
2725 GenericLessThan,
2726 GenericGreaterThan,
2727 GenericEqual
2728 } RTL_GENERIC_COMPARE_RESULTS;
2729
2730 // Forwarder
2731 struct _RTL_AVL_TABLE;
2732
2733 _IRQL_requires_same_
2734 _Function_class_(RTL_AVL_COMPARE_ROUTINE)
2735 typedef RTL_GENERIC_COMPARE_RESULTS
2736 (NTAPI RTL_AVL_COMPARE_ROUTINE) (
2737 _In_ struct _RTL_AVL_TABLE *Table,
2738 _In_ PVOID FirstStruct,
2739 _In_ PVOID SecondStruct);
2740 typedef RTL_AVL_COMPARE_ROUTINE *PRTL_AVL_COMPARE_ROUTINE;
2741
2742 _IRQL_requires_same_
2743 _Function_class_(RTL_AVL_ALLOCATE_ROUTINE)
2744 __drv_allocatesMem(Mem)
2745 typedef PVOID
2746 (NTAPI RTL_AVL_ALLOCATE_ROUTINE) (
2747 _In_ struct _RTL_AVL_TABLE *Table,
2748 _In_ CLONG ByteSize);
2749 typedef RTL_AVL_ALLOCATE_ROUTINE *PRTL_AVL_ALLOCATE_ROUTINE;
2750
2751 _IRQL_requires_same_
2752 _Function_class_(RTL_AVL_FREE_ROUTINE)
2753 typedef VOID
2754 (NTAPI RTL_AVL_FREE_ROUTINE) (
2755 _In_ struct _RTL_AVL_TABLE *Table,
2756 _In_ __drv_freesMem(Mem) _Post_invalid_ PVOID Buffer);
2757 typedef RTL_AVL_FREE_ROUTINE *PRTL_AVL_FREE_ROUTINE;
2758
2759 _IRQL_requires_same_
2760 _Function_class_(RTL_AVL_MATCH_FUNCTION)
2761 typedef NTSTATUS
2762 (NTAPI RTL_AVL_MATCH_FUNCTION) (
2763 _In_ struct _RTL_AVL_TABLE *Table,
2764 _In_ PVOID UserData,
2765 _In_ PVOID MatchData);
2766 typedef RTL_AVL_MATCH_FUNCTION *PRTL_AVL_MATCH_FUNCTION;
2767
2768 typedef struct _RTL_BALANCED_LINKS {
2769 struct _RTL_BALANCED_LINKS *Parent;
2770 struct _RTL_BALANCED_LINKS *LeftChild;
2771 struct _RTL_BALANCED_LINKS *RightChild;
2772 CHAR Balance;
2773 UCHAR Reserved[3];
2774 } RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
2775
2776 typedef struct _RTL_AVL_TABLE {
2777 RTL_BALANCED_LINKS BalancedRoot;
2778 PVOID OrderedPointer;
2779 ULONG WhichOrderedElement;
2780 ULONG NumberGenericTableElements;
2781 ULONG DepthOfTree;
2782 PRTL_BALANCED_LINKS RestartKey;
2783 ULONG DeleteCount;
2784 PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
2785 PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
2786 PRTL_AVL_FREE_ROUTINE FreeRoutine;
2787 PVOID TableContext;
2788 } RTL_AVL_TABLE, *PRTL_AVL_TABLE;
2789
2790 typedef struct _RTL_SPLAY_LINKS {
2791 struct _RTL_SPLAY_LINKS *Parent;
2792 struct _RTL_SPLAY_LINKS *LeftChild;
2793 struct _RTL_SPLAY_LINKS *RightChild;
2794 } RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
2795
2796 #ifndef RTL_USE_AVL_TABLES
2797
2798 struct _RTL_GENERIC_TABLE;
2799
2800 _IRQL_requires_same_
2801 _Function_class_(RTL_GENERIC_COMPARE_ROUTINE)
2802 typedef RTL_GENERIC_COMPARE_RESULTS
2803 (NTAPI RTL_GENERIC_COMPARE_ROUTINE) (
2804 _In_ struct _RTL_GENERIC_TABLE *Table,
2805 _In_ PVOID FirstStruct,
2806 _In_ PVOID SecondStruct);
2807 typedef RTL_GENERIC_COMPARE_ROUTINE *PRTL_GENERIC_COMPARE_ROUTINE;
2808
2809 _IRQL_requires_same_
2810 _Function_class_(RTL_GENERIC_ALLOCATE_ROUTINE)
2811 __drv_allocatesMem(Mem)
2812 typedef PVOID
2813 (NTAPI RTL_GENERIC_ALLOCATE_ROUTINE) (
2814 _In_ struct _RTL_GENERIC_TABLE *Table,
2815 _In_ CLONG ByteSize);
2816 typedef RTL_GENERIC_ALLOCATE_ROUTINE *PRTL_GENERIC_ALLOCATE_ROUTINE;
2817
2818 _IRQL_requires_same_
2819 _Function_class_(RTL_GENERIC_FREE_ROUTINE)
2820 typedef VOID
2821 (NTAPI RTL_GENERIC_FREE_ROUTINE) (
2822 _In_ struct _RTL_GENERIC_TABLE *Table,
2823 _In_ __drv_freesMem(Mem) _Post_invalid_ PVOID Buffer);
2824 typedef RTL_GENERIC_FREE_ROUTINE *PRTL_GENERIC_FREE_ROUTINE;
2825
2826 typedef struct _RTL_GENERIC_TABLE {
2827 PRTL_SPLAY_LINKS TableRoot;
2828 LIST_ENTRY InsertOrderList;
2829 PLIST_ENTRY OrderedPointer;
2830 ULONG WhichOrderedElement;
2831 ULONG NumberGenericTableElements;
2832 PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
2833 PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
2834 PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
2835 PVOID TableContext;
2836 } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
2837
2838 #endif /* !RTL_USE_AVL_TABLES */
2839
2840 #ifdef RTL_USE_AVL_TABLES
2841
2842 #undef RTL_GENERIC_COMPARE_ROUTINE
2843 #undef PRTL_GENERIC_COMPARE_ROUTINE
2844 #undef RTL_GENERIC_ALLOCATE_ROUTINE
2845 #undef PRTL_GENERIC_ALLOCATE_ROUTINE
2846 #undef RTL_GENERIC_FREE_ROUTINE
2847 #undef PRTL_GENERIC_FREE_ROUTINE
2848 #undef RTL_GENERIC_TABLE
2849 #undef PRTL_GENERIC_TABLE
2850
2851 #define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE
2852 #define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE
2853 #define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE
2854 #define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE
2855 #define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE
2856 #define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE
2857 #define RTL_GENERIC_TABLE RTL_AVL_TABLE
2858 #define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
2859
2860 #endif /* RTL_USE_AVL_TABLES */
2861
2862 #define RTL_HASH_ALLOCATED_HEADER 0x00000001
2863
2864 typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY {
2865 LIST_ENTRY Linkage;
2866 ULONG_PTR Signature;
2867 } RTL_DYNAMIC_HASH_TABLE_ENTRY, *PRTL_DYNAMIC_HASH_TABLE_ENTRY;
2868
2869 typedef struct _RTL_DYNAMIC_HASH_TABLE_CONTEXT {
2870 PLIST_ENTRY ChainHead;
2871 PLIST_ENTRY PrevLinkage;
2872 ULONG_PTR Signature;
2873 } RTL_DYNAMIC_HASH_TABLE_CONTEXT, *PRTL_DYNAMIC_HASH_TABLE_CONTEXT;
2874
2875 typedef struct _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR {
2876 RTL_DYNAMIC_HASH_TABLE_ENTRY HashEntry;
2877 PLIST_ENTRY ChainHead;
2878 ULONG BucketIndex;
2879 } RTL_DYNAMIC_HASH_TABLE_ENUMERATOR, *PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR;
2880
2881 typedef struct _RTL_DYNAMIC_HASH_TABLE {
2882 ULONG Flags;
2883 ULONG Shift;
2884 ULONG TableSize;
2885 ULONG Pivot;
2886 ULONG DivisorMask;
2887 ULONG NumEntries;
2888 ULONG NonEmptyBuckets;
2889 ULONG NumEnumerators;
2890 PVOID Directory;
2891 } RTL_DYNAMIC_HASH_TABLE, *PRTL_DYNAMIC_HASH_TABLE;
2892
2893 #define HASH_ENTRY_KEY(x) ((x)->Signature)
2894
2895 /******************************************************************************
2896 * Security Manager Types *
2897 ******************************************************************************/
2898 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
2899
2900 typedef enum _WELL_KNOWN_SID_TYPE {
2901 WinNullSid = 0,
2902 WinWorldSid = 1,
2903 WinLocalSid = 2,
2904 WinCreatorOwnerSid = 3,
2905 WinCreatorGroupSid = 4,
2906 WinCreatorOwnerServerSid = 5,
2907 WinCreatorGroupServerSid = 6,
2908 WinNtAuthoritySid = 7,
2909 WinDialupSid = 8,
2910 WinNetworkSid = 9,
2911 WinBatchSid = 10,
2912 WinInteractiveSid = 11,
2913 WinServiceSid = 12,
2914 WinAnonymousSid = 13,
2915 WinProxySid = 14,
2916 WinEnterpriseControllersSid = 15,
2917 WinSelfSid = 16,
2918 WinAuthenticatedUserSid = 17,
2919 WinRestrictedCodeSid = 18,
2920 WinTerminalServerSid = 19,
2921 WinRemoteLogonIdSid = 20,
2922 WinLogonIdsSid = 21,
2923 WinLocalSystemSid = 22,
2924 WinLocalServiceSid = 23,
2925 WinNetworkServiceSid = 24,
2926 WinBuiltinDomainSid = 25,
2927 WinBuiltinAdministratorsSid = 26,
2928 WinBuiltinUsersSid = 27,
2929 WinBuiltinGuestsSid = 28,
2930 WinBuiltinPowerUsersSid = 29,
2931 WinBuiltinAccountOperatorsSid = 30,
2932 WinBuiltinSystemOperatorsSid = 31,
2933 WinBuiltinPrintOperatorsSid = 32,
2934 WinBuiltinBackupOperatorsSid = 33,
2935 WinBuiltinReplicatorSid = 34,
2936 WinBuiltinPreWindows2000CompatibleAccessSid = 35,
2937 WinBuiltinRemoteDesktopUsersSid = 36,
2938 WinBuiltinNetworkConfigurationOperatorsSid = 37,
2939 WinAccountAdministratorSid = 38,
2940 WinAccountGuestSid = 39,
2941 WinAccountKrbtgtSid = 40,
2942 WinAccountDomainAdminsSid = 41,
2943 WinAccountDomainUsersSid = 42,
2944 WinAccountDomainGuestsSid = 43,
2945 WinAccountComputersSid = 44,
2946 WinAccountControllersSid = 45,
2947 WinAccountCertAdminsSid = 46,
2948 WinAccountSchemaAdminsSid = 47,
2949 WinAccountEnterpriseAdminsSid = 48,
2950 WinAccountPolicyAdminsSid = 49,
2951 WinAccountRasAndIasServersSid = 50,
2952 WinNTLMAuthenticationSid = 51,
2953 WinDigestAuthenticationSid = 52,
2954 WinSChannelAuthenticationSid = 53,
2955 WinThisOrganizationSid = 54,
2956 WinOtherOrganizationSid = 55,
2957 WinBuiltinIncomingForestTrustBuildersSid = 56,
2958 WinBuiltinPerfMonitoringUsersSid = 57,
2959 WinBuiltinPerfLoggingUsersSid = 58,
2960 WinBuiltinAuthorizationAccessSid = 59,
2961 WinBuiltinTerminalServerLicenseServersSid = 60,
2962 WinBuiltinDCOMUsersSid = 61,
2963 WinBuiltinIUsersSid = 62,
2964 WinIUserSid = 63,
2965 WinBuiltinCryptoOperatorsSid = 64,
2966 WinUntrustedLabelSid = 65,
2967 WinLowLabelSid = 66,
2968 WinMediumLabelSid = 67,
2969 WinHighLabelSid = 68,
2970 WinSystemLabelSid = 69,
2971 WinWriteRestrictedCodeSid = 70,
2972 WinCreatorOwnerRightsSid = 71,
2973 WinCacheablePrincipalsGroupSid = 72,
2974 WinNonCacheablePrincipalsGroupSid = 73,
2975 WinEnterpriseReadonlyControllersSid = 74,
2976 WinAccountReadonlyControllersSid = 75,
2977 WinBuiltinEventLogReadersGroup = 76,
2978 WinNewEnterpriseReadonlyControllersSid = 77,
2979 WinBuiltinCertSvcDComAccessGroup = 78,
2980 WinMediumPlusLabelSid = 79,
2981 WinLocalLogonSid = 80,
2982 WinConsoleLogonSid = 81,
2983 WinThisOrganizationCertificateSid = 82,
2984 } WELL_KNOWN_SID_TYPE;
2985
2986 #if defined(_M_IX86)
2987
2988 #define PAUSE_PROCESSOR YieldProcessor();
2989
2990 #define KERNEL_STACK_SIZE 12288
2991 #define KERNEL_LARGE_STACK_SIZE 61440
2992 #define KERNEL_LARGE_STACK_COMMIT 12288
2993
2994 #define SIZE_OF_80387_REGISTERS 80
2995
2996 #if !defined(RC_INVOKED)
2997
2998 #define CONTEXT_i386 0x10000
2999 #define CONTEXT_i486 0x10000
3000 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
3001 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
3002 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
3003 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
3004 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
3005 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
3006
3007 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
3008 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
3009 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
3010 CONTEXT_EXTENDED_REGISTERS)
3011
3012 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
3013
3014 #endif /* !defined(RC_INVOKED) */
3015
3016 typedef struct _FLOATING_SAVE_AREA {
3017 ULONG ControlWord;
3018 ULONG StatusWord;
3019 ULONG TagWord;
3020 ULONG ErrorOffset;
3021 ULONG ErrorSelector;
3022 ULONG DataOffset;
3023 ULONG DataSelector;
3024 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
3025 ULONG Cr0NpxState;
3026 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
3027
3028 #include "pshpack4.h"
3029 typedef struct _CONTEXT {
3030 ULONG ContextFlags;
3031 ULONG Dr0;
3032 ULONG Dr1;
3033 ULONG Dr2;
3034 ULONG Dr3;
3035 ULONG Dr6;
3036 ULONG Dr7;
3037 FLOATING_SAVE_AREA FloatSave;
3038 ULONG SegGs;
3039 ULONG SegFs;
3040 ULONG SegEs;
3041 ULONG SegDs;
3042 ULONG Edi;
3043 ULONG Esi;
3044 ULONG Ebx;
3045 ULONG Edx;
3046 ULONG Ecx;
3047 ULONG Eax;
3048 ULONG Ebp;
3049 ULONG Eip;
3050 ULONG SegCs;
3051 ULONG EFlags;
3052 ULONG Esp;
3053 ULONG SegSs;
3054 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
3055 } CONTEXT;
3056 #include "poppack.h"
3057
3058 #define KeGetPcr() PCR
3059
3060 #define PCR_MINOR_VERSION 1
3061 #define PCR_MAJOR_VERSION 1
3062
3063 typedef struct _KPCR {
3064 union {
3065 NT_TIB NtTib;
3066 struct {
3067 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
3068 PVOID Used_StackBase;
3069 PVOID Spare2;
3070 PVOID TssCopy;
3071 ULONG ContextSwitches;
3072 KAFFINITY SetMemberCopy;
3073 PVOID Used_Self;
3074 };
3075 };
3076 struct _KPCR *SelfPcr;
3077 struct _KPRCB *Prcb;
3078 KIRQL Irql;
3079 ULONG IRR;
3080 ULONG IrrActive;
3081 ULONG IDR;
3082 PVOID KdVersionBlock;
3083 struct _KIDTENTRY *IDT;
3084 struct _KGDTENTRY *GDT;
3085 struct _KTSS *TSS;
3086 USHORT MajorVersion;
3087 USHORT MinorVersion;
3088 KAFFINITY SetMember;
3089 ULONG StallScaleFactor;
3090 UCHAR SpareUnused;
3091 UCHAR Number;
3092 UCHAR Spare0;
3093 UCHAR SecondLevelCacheAssociativity;
3094 ULONG VdmAlert;
3095 ULONG KernelReserved[14];
3096 ULONG SecondLevelCacheSize;
3097 ULONG HalReserved[16];
3098 } KPCR, *PKPCR;
3099
3100 FORCEINLINE
3101 ULONG
3102 KeGetCurrentProcessorNumber(VOID)
3103 {
3104 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
3105 }
3106
3107
3108
3109
3110
3111
3112 extern NTKERNELAPI PVOID MmHighestUserAddress;
3113 extern NTKERNELAPI PVOID MmSystemRangeStart;
3114 extern NTKERNELAPI ULONG MmUserProbeAddress;
3115
3116 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
3117 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
3118 #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
3119 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
3120 extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
3121 #else
3122 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
3123 #endif
3124 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
3125 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
3126 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
3127 #if !defined (_X86PAE_)
3128 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
3129 #else
3130 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
3131 #endif
3132
3133 #elif defined(_M_AMD64)
3134
3135 #define PAUSE_PROCESSOR YieldProcessor();
3136
3137 #define KERNEL_STACK_SIZE 0x6000
3138 #define KERNEL_LARGE_STACK_SIZE 0x12000
3139 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
3140
3141 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
3142
3143 #define EXCEPTION_READ_FAULT 0
3144 #define EXCEPTION_WRITE_FAULT 1
3145 #define EXCEPTION_EXECUTE_FAULT 8
3146
3147 #if !defined(RC_INVOKED)
3148
3149 #define CONTEXT_AMD64 0x100000
3150
3151 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
3152 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
3153 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
3154 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
3155 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
3156
3157 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
3158 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
3159
3160 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
3161
3162 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
3163 #define CONTEXT_SERVICE_ACTIVE 0x10000000
3164 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
3165 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
3166
3167 #endif /* !defined(RC_INVOKED) */
3168
3169 #define INITIAL_MXCSR 0x1f80
3170 #define INITIAL_FPCSR 0x027f
3171
3172 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
3173 ULONG64 P1Home;
3174 ULONG64 P2Home;
3175 ULONG64 P3Home;
3176 ULONG64 P4Home;
3177 ULONG64 P5Home;
3178 ULONG64 P6Home;
3179 ULONG ContextFlags;
3180 ULONG MxCsr;
3181 USHORT SegCs;
3182 USHORT SegDs;
3183 USHORT SegEs;
3184 USHORT SegFs;
3185 USHORT SegGs;
3186 USHORT SegSs;
3187 ULONG EFlags;
3188 ULONG64 Dr0;
3189 ULONG64 Dr1;
3190 ULONG64 Dr2;
3191 ULONG64 Dr3;
3192 ULONG64 Dr6;
3193 ULONG64 Dr7;
3194 ULONG64 Rax;
3195 ULONG64 Rcx;
3196 ULONG64 Rdx;
3197 ULONG64 Rbx;
3198 ULONG64 Rsp;
3199 ULONG64 Rbp;
3200 ULONG64 Rsi;
3201 ULONG64 Rdi;
3202 ULONG64 R8;
3203 ULONG64 R9;
3204 ULONG64 R10;
3205 ULONG64 R11;
3206 ULONG64 R12;
3207 ULONG64 R13;
3208 ULONG64 R14;
3209 ULONG64 R15;
3210 ULONG64 Rip;
3211 union {
3212 XMM_SAVE_AREA32 FltSave;
3213 struct {
3214 M128A Header[2];
3215 M128A Legacy[8];
3216 M128A Xmm0;
3217 M128A Xmm1;
3218 M128A Xmm2;
3219 M128A Xmm3;
3220 M128A Xmm4;
3221 M128A Xmm5;
3222 M128A Xmm6;
3223 M128A Xmm7;
3224 M128A Xmm8;
3225 M128A Xmm9;
3226 M128A Xmm10;
3227 M128A Xmm11;
3228 M128A Xmm12;
3229 M128A Xmm13;
3230 M128A Xmm14;
3231 M128A Xmm15;
3232 } DUMMYSTRUCTNAME;
3233 } DUMMYUNIONNAME;
3234 M128A VectorRegister[26];
3235 ULONG64 VectorControl;
3236 ULONG64 DebugControl;
3237 ULONG64 LastBranchToRip;
3238 ULONG64 LastBranchFromRip;
3239 ULONG64 LastExceptionToRip;
3240 ULONG64 LastExceptionFromRip;
3241 } CONTEXT;
3242
3243 #define PCR_MINOR_VERSION 1
3244 #define PCR_MAJOR_VERSION 1
3245
3246 typedef struct _KPCR
3247 {
3248 _ANONYMOUS_UNION union
3249 {
3250 NT_TIB NtTib;
3251 _ANONYMOUS_STRUCT struct
3252 {
3253 union _KGDTENTRY64 *GdtBase;
3254 struct _KTSS64 *TssBase;
3255 ULONG64 UserRsp;
3256 struct _KPCR *Self;
3257 struct _KPRCB *CurrentPrcb;
3258 PKSPIN_LOCK_QUEUE LockArray;
3259 PVOID Used_Self;
3260 };
3261 };
3262 union _KIDTENTRY64 *IdtBase;
3263 ULONG64 Unused[2];
3264 KIRQL Irql;
3265 UCHAR SecondLevelCacheAssociativity;
3266 UCHAR ObsoleteNumber;
3267 UCHAR Fill0;
3268 ULONG Unused0[3];
3269 USHORT MajorVersion;
3270 USHORT MinorVersion;
3271 ULONG StallScaleFactor;
3272 PVOID Unused1[3];
3273 ULONG KernelReserved[15];
3274 ULONG SecondLevelCacheSize;
3275 ULONG HalReserved[16];
3276 ULONG Unused2;
3277 PVOID KdVersionBlock;
3278 PVOID Unused3;
3279 ULONG PcrAlign1[24];
3280 } KPCR, *PKPCR;
3281
3282 FORCEINLINE
3283 PKPCR
3284 KeGetPcr(VOID)
3285 {
3286 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
3287 }
3288
3289 FORCEINLINE
3290 ULONG
3291 KeGetCurrentProcessorNumber(VOID)
3292 {
3293 return (ULONG)__readgsword(0x184);
3294 }
3295
3296
3297 #define PTI_SHIFT 12L
3298 #define PDI_SHIFT 21L
3299 #define PPI_SHIFT 30L
3300 #define PXI_SHIFT 39L
3301 #define PTE_PER_PAGE 512
3302 #define PDE_PER_PAGE 512
3303 #define PPE_PER_PAGE 512
3304 #define PXE_PER_PAGE 512
3305 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
3306 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
3307 #define PPI_MASK (PPE_PER_PAGE - 1)
3308 #define PXI_MASK (PXE_PER_PAGE - 1)
3309
3310 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
3311 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
3312 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
3313 #define PDE_BASE 0xFFFFF6FB40000000ULL
3314 #define PTE_BASE 0xFFFFF68000000000ULL
3315 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
3316 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
3317 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
3318 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
3319
3320 extern NTKERNELAPI PVOID MmHighestUserAddress;
3321 extern NTKERNELAPI PVOID MmSystemRangeStart;
3322 extern NTKERNELAPI ULONG64 MmUserProbeAddress;
3323
3324 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
3325 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
3326 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
3327 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
3328 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
3329
3330
3331 #elif defined(_M_IA64)
3332
3333 #elif defined(_M_PPC)
3334
3335
3336 #elif defined(_M_MIPS)
3337
3338 #elif defined(_M_ARM)
3339 #else
3340 #error Unknown Architecture
3341 #endif
3342
3343 /******************************************************************************
3344 * Executive Functions *
3345 ******************************************************************************/
3346
3347 static __inline PVOID
3348 ExAllocateFromZone(
3349 IN PZONE_HEADER Zone)
3350 {
3351 PVOID Result = (PVOID)Zone->FreeList.Next;
3352 if (Zone->FreeList.Next)
3353 Zone->FreeList.Next = Zone->FreeList.Next->Next;
3354 return Result;
3355 }
3356
3357 static __inline PVOID
3358 ExFreeToZone(
3359 IN PZONE_HEADER Zone,
3360 IN PVOID Block)
3361 {
3362 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
3363 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
3364 return ((PSINGLE_LIST_ENTRY) Block)->Next;
3365 }
3366
3367 /*
3368 * PVOID
3369 * ExInterlockedAllocateFromZone(
3370 * IN PZONE_HEADER Zone,
3371 * IN PKSPIN_LOCK Lock)
3372 */
3373 #define ExInterlockedAllocateFromZone(Zone, Lock) \
3374 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
3375
3376 /* PVOID
3377 * ExInterlockedFreeToZone(
3378 * IN PZONE_HEADER Zone,
3379 * IN PVOID Block,
3380 * IN PKSPIN_LOCK Lock);
3381 */
3382 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
3383 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
3384
3385 /*
3386 * BOOLEAN
3387 * ExIsFullZone(
3388 * IN PZONE_HEADER Zone)
3389 */
3390 #define ExIsFullZone(Zone) \
3391 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
3392
3393 /* BOOLEAN
3394 * ExIsObjectInFirstZoneSegment(
3395 * IN PZONE_HEADER Zone,
3396 * IN PVOID Object);
3397 */
3398 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
3399 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
3400 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
3401 (Zone)->TotalSegmentSize)) )
3402
3403 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
3404 #define ExAcquireResourceShared ExAcquireResourceSharedLite
3405 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
3406 #define ExDeleteResource ExDeleteResourceLite
3407 #define ExInitializeResource ExInitializeResourceLite
3408 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
3409 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
3410 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
3411 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
3412
3413 #ifndef _M_IX86
3414 #define RESULT_ZERO 0
3415 #define RESULT_NEGATIVE 1
3416 #define RESULT_POSITIVE 2
3417 #endif
3418
3419 typedef enum _INTERLOCKED_RESULT {
3420 ResultNegative = RESULT_NEGATIVE,
3421 ResultZero = RESULT_ZERO,
3422 ResultPositive = RESULT_POSITIVE
3423 } INTERLOCKED_RESULT;
3424
3425 #ifdef _X86_
3426
3427 NTKERNELAPI
3428 INTERLOCKED_RESULT
3429 FASTCALL
3430 Exfi386InterlockedIncrementLong(
3431 _Inout_ _Interlocked_operand_ LONG volatile *Addend);
3432
3433 NTKERNELAPI
3434 INTERLOCKED_RESULT
3435 FASTCALL
3436 Exfi386InterlockedDecrementLong(
3437 _Inout_ _Interlocked_operand_ PLONG Addend);
3438
3439 NTKERNELAPI
3440 ULONG
3441 FASTCALL
3442 Exfi386InterlockedExchangeUlong(
3443 _Inout_ _Interlocked_operand_ PULONG Target,
3444 _In_ ULONG Value);
3445
3446 #endif
3447
3448
3449 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3450 NTKERNELAPI
3451 NTSTATUS
3452 NTAPI
3453 ExExtendZone(
3454 _Inout_ PZONE_HEADER Zone,
3455 _Inout_ PVOID Segment,
3456 _In_ ULONG SegmentSize);
3457
3458 NTKERNELAPI
3459 NTSTATUS
3460 NTAPI
3461 ExInitializeZone(
3462 _Out_ PZONE_HEADER Zone,
3463 _In_ ULONG BlockSize,
3464 _Inout_ PVOID InitialSegment,
3465 _In_ ULONG InitialSegmentSize);
3466
3467 _IRQL_requires_max_(DISPATCH_LEVEL)
3468 NTKERNELAPI
3469 NTSTATUS
3470 NTAPI
3471 ExInterlockedExtendZone(
3472 _Inout_ PZONE_HEADER Zone,
3473 _Inout_ PVOID Segment,
3474 _In_ ULONG SegmentSize,
3475 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
3476
3477 _IRQL_requires_max_(PASSIVE_LEVEL)
3478 NTKERNELAPI
3479 NTSTATUS
3480 NTAPI
3481 ExUuidCreate(
3482 _Out_ UUID *Uuid);
3483
3484 _IRQL_requires_max_(PASSIVE_LEVEL)
3485 NTKERNELAPI
3486 DECLSPEC_NORETURN
3487 VOID
3488 NTAPI
3489 ExRaiseAccessViolation(VOID);
3490
3491 _IRQL_requires_max_(PASSIVE_LEVEL)
3492 NTKERNELAPI
3493 DECLSPEC_NORETURN
3494 VOID
3495 NTAPI
3496 ExRaiseDatatypeMisalignment(VOID);
3497
3498 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
3499
3500
3501 /* Hardware Abstraction Layer Functions */
3502
3503 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3504
3505 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
3506
3507 /* Nothing here */
3508
3509 #else /* USE_DMA_MACROS ... */
3510
3511 //DECLSPEC_DEPRECATED_DDK
3512 NTHALAPI
3513 VOID
3514 NTAPI
3515 IoFreeAdapterChannel(
3516 _In_ PADAPTER_OBJECT AdapterObject);
3517
3518 //DECLSPEC_DEPRECATED_DDK
3519 NTHALAPI
3520 BOOLEAN
3521 NTAPI
3522 IoFlushAdapterBuffers(
3523 _In_ PADAPTER_OBJECT AdapterObject,
3524 _In_ PMDL Mdl,
3525 _In_ PVOID MapRegisterBase,
3526 _In_ PVOID CurrentVa,
3527 _In_ ULONG Length,
3528 _In_ BOOLEAN WriteToDevice);
3529
3530 //DECLSPEC_DEPRECATED_DDK
3531 NTHALAPI
3532 VOID
3533 NTAPI
3534 IoFreeMapRegisters(
3535 _In_ PADAPTER_OBJECT AdapterObject,
3536 _In_ PVOID MapRegisterBase,
3537 _In_ ULONG NumberOfMapRegisters);
3538
3539 //DECLSPEC_DEPRECATED_DDK
3540 NTHALAPI
3541 PVOID
3542 NTAPI
3543 HalAllocateCommonBuffer(
3544 _In_ PADAPTER_OBJECT AdapterObject,
3545 _In_ ULONG Length,
3546 _Out_ PPHYSICAL_ADDRESS LogicalAddress,
3547 _In_ BOOLEAN CacheEnabled);
3548
3549 //DECLSPEC_DEPRECATED_DDK
3550 NTHALAPI
3551 VOID
3552 NTAPI
3553 HalFreeCommonBuffer(
3554 _In_ PADAPTER_OBJECT AdapterObject,
3555 _In_ ULONG Length,
3556 _In_ PHYSICAL_ADDRESS LogicalAddress,
3557 _In_ PVOID VirtualAddress,
3558 _In_ BOOLEAN CacheEnabled);
3559
3560 //DECLSPEC_DEPRECATED_DDK
3561 NTHALAPI
3562 ULONG
3563 NTAPI
3564 HalReadDmaCounter(
3565 _In_ PADAPTER_OBJECT AdapterObject);
3566
3567 NTHALAPI
3568 NTSTATUS
3569 NTAPI
3570 HalAllocateAdapterChannel(
3571 _In_ PADAPTER_OBJECT AdapterObject,
3572 _In_ PWAIT_CONTEXT_BLOCK Wcb,
3573 _In_ ULONG NumberOfMapRegisters,
3574 _In_ PDRIVER_CONTROL ExecutionRoutine);
3575
3576 #endif /* USE_DMA_MACROS ... */
3577
3578 #if !defined(NO_LEGACY_DRIVERS)
3579 NTHALAPI
3580 NTSTATUS
3581 NTAPI
3582 HalAssignSlotResources(
3583 _In_ PUNICODE_STRING RegistryPath,
3584 _In_opt_ PUNICODE_STRING DriverClassName,
3585 _In_ PDRIVER_OBJECT DriverObject,
3586 _In_ PDEVICE_OBJECT DeviceObject,
3587 _In_ INTERFACE_TYPE BusType,
3588 _In_ ULONG BusNumber,
3589 _In_ ULONG SlotNumber,
3590 _Inout_ PCM_RESOURCE_LIST *AllocatedResources);
3591
3592 _IRQL_requires_max_(PASSIVE_LEVEL)
3593 NTHALAPI
3594 ULONG
3595 NTAPI
3596 HalGetInterruptVector(
3597 _In_ INTERFACE_TYPE InterfaceType,
3598 _In_ ULONG BusNumber,
3599 _In_ ULONG BusInterruptLevel,
3600 _In_ ULONG BusInterruptVector,
3601 _Out_ PKIRQL Irql,
3602 _Out_ PKAFFINITY Affinity);
3603
3604 NTHALAPI
3605 ULONG
3606 NTAPI
3607 HalSetBusData(
3608 _In_ BUS_DATA_TYPE BusDataType,
3609 _In_ ULONG BusNumber,
3610 _In_ ULONG SlotNumber,
3611 _In_reads_bytes_(Length) PVOID Buffer,
3612 _In_ ULONG Length);
3613
3614 NTHALAPI
3615 ULONG
3616 NTAPI
3617 HalGetBusData(
3618 _In_ BUS_DATA_TYPE BusDataType,
3619 _In_ ULONG BusNumber,
3620 _In_ ULONG SlotNumber,
3621 _Out_writes_bytes_(Length) PVOID Buffer,
3622 _In_ ULONG Length);
3623
3624 NTHALAPI
3625 BOOLEAN
3626 NTAPI
3627 HalMakeBeep(
3628 _In_ ULONG Frequency);
3629 #endif /* !defined(NO_LEGACY_DRIVERS) */
3630
3631 _IRQL_requires_max_(PASSIVE_LEVEL)
3632 NTHALAPI
3633 PADAPTER_OBJECT
3634 NTAPI
3635 HalGetAdapter(
3636 _In_ PDEVICE_DESCRIPTION DeviceDescription,
3637 _Out_ PULONG NumberOfMapRegisters);
3638
3639 VOID
3640 NTAPI
3641 HalPutDmaAdapter(
3642 _In_ PADAPTER_OBJECT DmaAdapter);
3643
3644 NTHALAPI
3645 VOID
3646 NTAPI
3647 HalAcquireDisplayOwnership(
3648 _In_ PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
3649
3650 NTHALAPI
3651 ULONG
3652 NTAPI
3653 HalGetBusDataByOffset(
3654 _In_ BUS_DATA_TYPE BusDataType,
3655 _In_ ULONG BusNumber,
3656 _In_ ULONG SlotNumber,
3657 _Out_writes_bytes_(Length) PVOID Buffer,
3658 _In_ ULONG Offset,
3659 _In_ ULONG Length);
3660
3661 NTHALAPI
3662 ULONG
3663 NTAPI
3664 HalSetBusDataByOffset(
3665 _In_ BUS_DATA_TYPE BusDataType,
3666 _In_ ULONG BusNumber,
3667 _In_ ULONG SlotNumber,
3668 _In_reads_bytes_(Length) PVOID Buffer,
3669 _In_ ULONG Offset,
3670 _In_ ULONG Length);
3671
3672 NTHALAPI
3673 BOOLEAN
3674 NTAPI
3675 HalTranslateBusAddress(
3676 _In_ INTERFACE_TYPE InterfaceType,
3677 _In_ ULONG BusNumber,
3678 _In_ PHYSICAL_ADDRESS BusAddress,
3679 _Inout_ PULONG AddressSpace,
3680 _Out_ PPHYSICAL_ADDRESS TranslatedAddress);
3681
3682 NTHALAPI
3683 PVOID
3684 NTAPI
3685 HalAllocateCrashDumpRegisters(
3686 _In_ PADAPTER_OBJECT AdapterObject,
3687 _Inout_ PULONG NumberOfMapRegisters);
3688
3689 NTSTATUS
3690 NTAPI
3691 HalGetScatterGatherList(
3692 _In_ PADAPTER_OBJECT DmaAdapter,
3693 _In_ PDEVICE_OBJECT DeviceObject,
3694 _In_ PMDL Mdl,
3695 _In_ PVOID CurrentVa,
3696 _In_ ULONG Length,
3697 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
3698 _In_ PVOID Context,
3699 _In_ BOOLEAN WriteToDevice);
3700
3701 VOID
3702 NTAPI
3703 HalPutScatterGatherList(
3704 _In_ PADAPTER_OBJECT DmaAdapter,
3705 _In_ PSCATTER_GATHER_LIST ScatterGather,
3706 _In_ BOOLEAN WriteToDevice);
3707
3708 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
3709
3710 #if (NTDDI_VERSION >= NTDDI_WINXP)
3711 _IRQL_requires_max_(PASSIVE_LEVEL)
3712 NTKERNELAPI
3713 VOID
3714 FASTCALL
3715 HalExamineMBR(
3716 _In_ PDEVICE_OBJECT DeviceObject,
3717 _In_ ULONG SectorSize,
3718 _In_ ULONG MBRTypeIdentifier,
3719 _Out_ PVOID *Buffer);
3720 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
3721
3722 #if (NTDDI_VERSION >= NTDDI_WIN7)
3723
3724 NTSTATUS
3725 NTAPI
3726 HalAllocateHardwareCounters(
3727 _In_reads_(GroupCount) PGROUP_AFFINITY GroupAffinty,
3728 _In_ ULONG GroupCount,
3729 _In_ PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList,
3730 _Out_ PHANDLE CounterSetHandle);
3731
3732 NTSTATUS
3733 NTAPI
3734 HalFreeHardwareCounters(
3735 _In_ HANDLE CounterSetHandle);
3736
3737 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
3738
3739 #if defined(_IA64_)
3740 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3741 NTHALAPI
3742 ULONG
3743 NTAPI
3744 HalGetDmaAlignmentRequirement(VOID);
3745 #endif
3746 #endif /* defined(_IA64_) */
3747
3748 #if defined(_M_IX86) || defined(_M_AMD64)
3749 #define HalGetDmaAlignmentRequirement() 1L
3750 #endif
3751
3752 #if (NTDDI_VERSION >= NTDDI_WIN7)
3753
3754 typedef struct _WHEA_ERROR_SOURCE_DESCRIPTOR *PWHEA_ERROR_SOURCE_DESCRIPTOR;
3755 typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
3756
3757 NTHALAPI
3758 VOID
3759 NTAPI
3760 HalBugCheckSystem(
3761 _In_ PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource,
3762 _In_ PWHEA_ERROR_RECORD ErrorRecord);
3763
3764 #else
3765
3766 typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
3767
3768 NTHALAPI
3769 VOID
3770 NTAPI
3771 HalBugCheckSystem(
3772 _In_ PWHEA_ERROR_RECORD ErrorRecord);
3773
3774 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
3775
3776 /******************************************************************************
3777 * I/O Manager Functions *
3778 ******************************************************************************/
3779
3780 /*
3781 * VOID IoAssignArcName(
3782 * IN PUNICODE_STRING ArcName,
3783 * IN PUNICODE_STRING DeviceName);
3784 */
3785 #define IoAssignArcName(_ArcName, _DeviceName) ( \
3786 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
3787
3788 /*
3789 * VOID
3790 * IoDeassignArcName(
3791 * IN PUNICODE_STRING ArcName)
3792 */
3793 #define IoDeassignArcName IoDeleteSymbolicLink
3794
3795 FORCEINLINE
3796 VOID
3797 NTAPI
3798 IoInitializeDriverCreateContext(
3799 PIO_DRIVER_CREATE_CONTEXT DriverContext)
3800 {
3801 RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT));
3802 DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT);
3803 }
3804
3805 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3806
3807 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
3808 _IRQL_requires_max_(DISPATCH_LEVEL)
3809 _IRQL_requires_min_(DISPATCH_LEVEL)
3810 NTKERNELAPI
3811 NTSTATUS
3812 NTAPI
3813 IoAllocateAdapterChannel(
3814 _In_ PADAPTER_OBJECT AdapterObject,
3815 _In_ PDEVICE_OBJECT DeviceObject,
3816 _In_ ULONG NumberOfMapRegisters,
3817 _In_ PDRIVER_CONTROL ExecutionRoutine,
3818 _In_ PVOID Context);
3819 #endif
3820
3821 #if !defined(DMA_MACROS_DEFINED)
3822 //DECLSPEC_DEPRECATED_DDK
3823 NTHALAPI
3824 PHYSICAL_ADDRESS
3825 NTAPI
3826 IoMapTransfer(
3827 _In_ PADAPTER_OBJECT AdapterObject,
3828 _In_ PMDL Mdl,
3829 _In_ PVOID MapRegisterBase,
3830 _In_ PVOID CurrentVa,
3831 _Inout_ PULONG Length,
3832 _In_ BOOLEAN WriteToDevice);
3833 #endif
3834
3835 _IRQL_requires_max_(DISPATCH_LEVEL)
3836 _IRQL_requires_min_(DISPATCH_LEVEL)
3837 NTKERNELAPI
3838 VOID
3839 NTAPI
3840 IoAllocateController(
3841 _In_ PCONTROLLER_OBJECT ControllerObject,
3842 _In_ PDEVICE_OBJECT DeviceObject,
3843 _In_ PDRIVER_CONTROL ExecutionRoutine,
3844 _In_opt_ PVOID Context);
3845
3846 _IRQL_requires_max_(PASSIVE_LEVEL)
3847 NTKERNELAPI
3848 PCONTROLLER_OBJECT
3849 NTAPI
3850 IoCreateController(
3851 _In_ ULONG Size);
3852
3853 _IRQL_requires_max_(PASSIVE_LEVEL)
3854 NTKERNELAPI
3855 VOID
3856 NTAPI
3857 IoDeleteController(
3858 _In_ PCONTROLLER_OBJECT ControllerObject);
3859
3860 _IRQL_requires_max_(DISPATCH_LEVEL)
3861 _IRQL_requires_min_(DISPATCH_LEVEL)
3862 NTKERNELAPI
3863 VOID
3864 NTAPI
3865 IoFreeController(
3866 _In_ PCONTROLLER_OBJECT ControllerObject);
3867
3868 _IRQL_requires_max_(PASSIVE_LEVEL)
3869 NTKERNELAPI
3870 PCONFIGURATION_INFORMATION
3871 NTAPI
3872 IoGetConfigurationInformation(VOID);
3873
3874 _IRQL_requires_max_(PASSIVE_LEVEL)
3875 NTKERNELAPI
3876 PDEVICE_OBJECT
3877 NTAPI
3878 IoGetDeviceToVerify(
3879 _In_ PETHREAD Thread);
3880
3881 NTKERNELAPI
3882 VOID
3883 NTAPI
3884 IoCancelFileOpen(
3885 _In_ PDEVICE_OBJECT DeviceObject,
3886 _In_ PFILE_OBJECT FileObject);
3887
3888 _IRQL_requires_max_(PASSIVE_LEVEL)
3889 NTKERNELAPI
3890 PGENERIC_MAPPING
3891 NTAPI
3892 IoGetFileObjectGenericMapping(VOID);
3893
3894 _IRQL_requires_max_(DISPATCH_LEVEL)
3895 NTKERNELAPI
3896 PIRP
3897 NTAPI
3898 IoMakeAssociatedIrp(
3899 _In_ PIRP Irp,
3900 _In_ CCHAR StackSize);
3901
3902 NTKERNELAPI
3903 NTSTATUS
3904 NTAPI
3905 IoQueryDeviceDescription(
3906 _In_opt_ PINTERFACE_TYPE BusType,
3907 _In_opt_ PULONG BusNumber,
3908 _In_opt_ PCONFIGURATION_TYPE ControllerType,
3909 _In_opt_ PULONG ControllerNumber,
3910 _In_opt_ PCONFIGURATION_TYPE PeripheralType,
3911 _In_opt_ PULONG PeripheralNumber,
3912 _In_ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
3913 _Inout_opt_ PVOID Context);
3914
3915 _IRQL_requires_max_(APC_LEVEL)
3916 NTKERNELAPI
3917 VOID
3918 NTAPI
3919 IoRaiseHardError(
3920 _In_ PIRP Irp,
3921 _In_opt_ PVPB Vpb,
3922 _In_ PDEVICE_OBJECT RealDeviceObject);
3923
3924 _IRQL_requires_max_(APC_LEVEL)
3925 NTKERNELAPI
3926 BOOLEAN
3927 NTAPI
3928 IoRaiseInformationalHardError(
3929 _In_ NTSTATUS ErrorStatus,
3930 _In_opt_ PUNICODE_STRING String,
3931 _In_opt_ PKTHREAD Thread);
3932
3933 _IRQL_requires_max_(PASSIVE_LEVEL)
3934 NTKERNELAPI
3935 VOID
3936 NTAPI
3937 IoRegisterBootDriverReinitialization(
3938 _In_ PDRIVER_OBJECT DriverObject,
3939 _In_ PDRIVER_REINITIALIZE DriverReinitializationRoutine,
3940 _In_opt_ PVOID Context);
3941
3942 _IRQL_requires_max_(PASSIVE_LEVEL)
3943 NTKERNELAPI
3944 VOID
3945 NTAPI
3946 IoRegisterDriverReinitialization(
3947 _In_ PDRIVER_OBJECT DriverObject,
3948 _In_ PDRIVER_REINITIALIZE DriverReinitializationRoutine,
3949 _In_opt_ PVOID Context);
3950
3951 NTKERNELAPI
3952 NTSTATUS
3953 NTAPI
3954 IoAttachDeviceByPointer(
3955 _In_ PDEVICE_OBJECT SourceDevice,
3956 _In_ PDEVICE_OBJECT TargetDevice);
3957
3958 _IRQL_requires_max_(PASSIVE_LEVEL)
3959 _Must_inspect_result_
3960 NTKERNELAPI
3961 NTSTATUS
3962 NTAPI
3963 IoReportDetectedDevice(
3964 _In_ PDRIVER_OBJECT DriverObject,
3965 _In_ INTERFACE_TYPE LegacyBusType,
3966 _In_ ULONG BusNumber,
3967 _In_ ULONG SlotNumber,
3968 _In_opt_ PCM_RESOURCE_LIST ResourceList,
3969 _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements,
3970 _In_ BOOLEAN ResourceAssigned,
3971 _Inout_ PDEVICE_OBJECT *DeviceObject);
3972
3973 NTKERNELAPI
3974 NTSTATUS
3975 NTAPI
3976 IoReportResourceForDetection(
3977 _In_ PDRIVER_OBJECT DriverObject,
3978 _In_reads_bytes_opt_(DriverListSize) PCM_RESOURCE_LIST DriverList,
3979 _In_opt_ ULONG DriverListSize,
3980 _In_opt_ PDEVICE_OBJECT DeviceObject,
3981 _In_reads_bytes_opt_(DeviceListSize) PCM_RESOURCE_LIST DeviceList,
3982 _In_opt_ ULONG DeviceListSize,
3983 _Out_ PBOOLEAN ConflictDetected);
3984
3985 NTKERNELAPI
3986 NTSTATUS
3987 NTAPI
3988 IoReportResourceUsage(
3989 _In_opt_ PUNICODE_STRING DriverClassName,
3990 _In_ PDRIVER_OBJECT DriverObject,
3991 _In_reads_bytes_opt_(DriverListSize) PCM_RESOURCE_LIST DriverList,
3992 _In_opt_ ULONG DriverListSize,
3993 _In_opt_ PDEVICE_OBJECT DeviceObject,
3994 _In_reads_bytes_opt_(DeviceListSize) PCM_RESOURCE_LIST DeviceList,
3995 _In_opt_ ULONG DeviceListSize,
3996 _In_ BOOLEAN OverrideConflict,
3997 _Out_ PBOOLEAN ConflictDetected);
3998
3999 _IRQL_requires_max_(DISPATCH_LEVEL)
4000 NTKERNELAPI
4001 VOID
4002 NTAPI
4003 IoSetHardErrorOrVerifyDevice(
4004 _In_ PIRP Irp,
4005 _In_ PDEVICE_OBJECT DeviceObject);
4006
4007 NTKERNELAPI
4008 NTSTATUS
4009 NTAPI
4010 IoAssignResources(
4011 _In_ PUNICODE_STRING RegistryPath,
4012 _In_opt_ PUNICODE_STRING DriverClassName,
4013 _In_ PDRIVER_OBJECT DriverObject,
4014 _In_opt_ PDEVICE_OBJECT DeviceObject,
4015 _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
4016 _Inout_ PCM_RESOURCE_LIST *AllocatedResources);
4017
4018 _IRQL_requires_max_(DISPATCH_LEVEL)
4019 NTKERNELAPI
4020 BOOLEAN
4021 NTAPI
4022 IoSetThreadHardErrorMode(
4023 _In_ BOOLEAN EnableHardErrors);
4024
4025
4026 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4027
4028 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
4029
4030 NTKERNELAPI
4031 BOOLEAN
4032 NTAPI
4033 IoIsFileOriginRemote(
4034 _In_ PFILE_OBJECT FileObject);
4035
4036 NTKERNELAPI
4037 NTSTATUS
4038 NTAPI
4039 IoSetFileOrigin(
4040 _In_ PFILE_OBJECT FileObject,
4041 _In_ BOOLEAN Remote);
4042
4043 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */
4044
4045 #if (NTDDI_VERSION >= NTDDI_WINXP)
4046
4047 _IRQL_requires_max_(PASSIVE_LEVEL)
4048 NTKERNELAPI
4049 NTSTATUS
4050 FASTCALL
4051 IoReadPartitionTable(
4052 _In_ PDEVICE_OBJECT DeviceObject,
4053 _In_ ULONG SectorSize,
4054 _In_ BOOLEAN ReturnRecognizedPartitions,
4055 _Out_ struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
4056
4057 _IRQL_requires_max_(PASSIVE_LEVEL)
4058 NTKERNELAPI
4059 NTSTATUS
4060 FASTCALL
4061 IoSetPartitionInformation(
4062 _In_ PDEVICE_OBJECT DeviceObject,
4063 _In_ ULONG SectorSize,
4064 _In_ ULONG PartitionNumber,
4065 _In_ ULONG PartitionType);
4066
4067 _IRQL_requires_max_(PASSIVE_LEVEL)
4068 NTKERNELAPI
4069 NTSTATUS
4070 FASTCALL
4071 IoWritePartitionTable(
4072 _In_ PDEVICE_OBJECT DeviceObject,
4073 _In_ ULONG SectorSize,
4074 _In_ ULONG SectorsPerTrack,
4075 _In_ ULONG NumberOfHeads,
4076 _In_ struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
4077
4078 NTKERNELAPI
4079 NTSTATUS
4080 NTAPI
4081 IoCreateDisk(
4082 _In_ PDEVICE_OBJECT DeviceObject,
4083 _In_opt_ struct _CREATE_DISK* Disk);
4084
4085 NTKERNELAPI
4086 NTSTATUS
4087 NTAPI
4088 IoReadDiskSignature(
4089 _In_ PDEVICE_OBJECT DeviceObject,
4090 _In_ ULONG BytesPerSector,
4091 _Out_ PDISK_SIGNATURE Signature);
4092
4093 _IRQL_requires_max_(PASSIVE_LEVEL)
4094 NTKERNELAPI
4095 NTSTATUS
4096 NTAPI
4097 IoReadPartitionTableEx(
4098 _In_ PDEVICE_OBJECT DeviceObject,
4099 _Out_ struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
4100
4101 _IRQL_requires_max_(PASSIVE_LEVEL)
4102 NTKERNELAPI
4103 NTSTATUS
4104 NTAPI
4105 IoSetPartitionInformationEx(
4106 _In_ PDEVICE_OBJECT DeviceObject,
4107 _In_ ULONG PartitionNumber,
4108 _In_ struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
4109
4110 NTKERNELAPI
4111 NTSTATUS
4112 NTAPI
4113 IoSetSystemPartition(
4114 _In_ PUNICODE_STRING VolumeNameString);
4115
4116 NTKERNELAPI
4117 NTSTATUS
4118 NTAPI
4119 IoVerifyPartitionTable(
4120 _In_ PDEVICE_OBJECT DeviceObject,
4121 _In_ BOOLEAN FixErrors);
4122
4123 NTKERNELAPI
4124 NTSTATUS
4125 NTAPI
4126 IoVolumeDeviceToDosName(
4127 _In_ PVOID VolumeDeviceObject,
4128 _Out_ _When_(return==0,
4129 _At_(DosName->Buffer, __drv_allocatesMem(Mem)))
4130 PUNICODE_STRING DosName);
4131
4132 _IRQL_requires_max_(PASSIVE_LEVEL)
4133 NTKERNELAPI
4134 NTSTATUS
4135 NTAPI
4136 IoWritePartitionTableEx(
4137 _In_ PDEVICE_OBJECT DeviceObject,
4138 _In_reads_(_Inexpressible_(FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry[0])))
4139 struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
4140
4141 NTKERNELAPI
4142 NTSTATUS
4143 NTAPI
4144 IoCreateFileSpecifyDeviceObjectHint(
4145 _Out_ PHANDLE FileHandle,
4146 _In_ ACCESS_MASK DesiredAccess,
4147 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
4148 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
4149 _In_opt_ PLARGE_INTEGER AllocationSize,
4150 _In_ ULONG FileAttributes,
4151 _In_ ULONG ShareAccess,
4152 _In_ ULONG Disposition,
4153 _In_ ULONG CreateOptions,
4154 _In_opt_ PVOID EaBuffer,
4155 _In_ ULONG EaLength,
4156 _In_ CREATE_FILE_TYPE CreateFileType,
4157 _In_opt_ PVOID InternalParameters,
4158 _In_ ULONG Options,
4159 _In_opt_ PVOID DeviceObject);
4160
4161 NTKERNELAPI
4162 NTSTATUS
4163 NTAPI
4164 IoAttachDeviceToDeviceStackSafe(
4165 _In_ PDEVICE_OBJECT SourceDevice,
4166 _In_ PDEVICE_OBJECT TargetDevice,
4167 _Outptr_ PDEVICE_OBJECT *AttachedToDeviceObject);
4168
4169
4170 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
4171
4172 #if (NTDDI_VERSION >= NTDDI_WS03)
4173 NTKERNELAPI
4174 IO_PAGING_PRIORITY
4175 FASTCALL
4176 IoGetPagingIoPriority(
4177 _In_ PIRP Irp);
4178
4179 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
4180 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
4181
4182 BOOLEAN
4183 NTAPI
4184 IoTranslateBusAddress(
4185 _In_ INTERFACE_TYPE InterfaceType,
4186 _In_ ULONG BusNumber,
4187 _In_ PHYSICAL_ADDRESS BusAddress,
4188 _Inout_ PULONG AddressSpace,
4189 _Out_ PPHYSICAL_ADDRESS TranslatedAddress);
4190 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
4191
4192 #if (NTDDI_VERSION >= NTDDI_VISTA)
4193 NTKERNELAPI
4194 NTSTATUS
4195 NTAPI
4196 IoUpdateDiskGeometry(
4197 _In_ PDEVICE_OBJECT DeviceObject,
4198 _In_ struct _DISK_GEOMETRY_EX* OldDiskGeometry,
4199 _In_ struct _DISK_GEOMETRY_EX* NewDiskGeometry);
4200
4201 PTXN_PARAMETER_BLOCK
4202 NTAPI
4203 IoGetTransactionParameterBlock(
4204 _In_ PFILE_OBJECT FileObject);
4205
4206 NTKERNELAPI
4207 NTSTATUS
4208 NTAPI
4209 IoCreateFileEx(
4210 _Out_ PHANDLE FileHandle,
4211 _In_ ACCESS_MASK DesiredAccess,
4212 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
4213 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
4214 _In_opt_ PLARGE_INTEGER AllocationSize,
4215 _In_ ULONG FileAttributes,
4216 _In_ ULONG ShareAccess,
4217 _In_ ULONG Disposition,
4218 _In_ ULONG CreateOptions,
4219 _In_opt_ PVOID EaBuffer,
4220 _In_ ULONG EaLength,
4221 _In_ CREATE_FILE_TYPE CreateFileType,
4222 _In_opt_ PVOID InternalParameters,
4223 _In_ ULONG Options,
4224 _In_opt_ PIO_DRIVER_CREATE_CONTEXT DriverContext);
4225
4226 NTSTATUS
4227 NTAPI
4228 IoSetIrpExtraCreateParameter(
4229 _Inout_ PIRP Irp,
4230 _In_ struct _ECP_LIST *ExtraCreateParameter);
4231
4232 VOID
4233 NTAPI
4234 IoClearIrpExtraCreateParameter(
4235 _Inout_ PIRP Irp);
4236
4237 NTSTATUS
4238 NTAPI
4239 IoGetIrpExtraCreateParameter(
4240 _In_ PIRP Irp,
4241 _Outptr_result_maybenull_ struct _ECP_LIST **ExtraCreateParameter);
4242
4243 BOOLEAN
4244 NTAPI
4245 IoIsFileObjectIgnoringSharing(
4246 _In_ PFILE_OBJECT FileObject);
4247
4248 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4249
4250 #if (NTDDI_VERSION >= NTDDI_WIN7)
4251
4252 NTSTATUS
4253 NTAPI
4254 IoSetFileObjectIgnoreSharing(
4255 _In_ PFILE_OBJECT FileObject);
4256
4257 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4258
4259 /******************************************************************************
4260 * Kernel Debugger Functions *
4261 ******************************************************************************/
4262 NTSYSAPI
4263 ULONG
4264 NTAPI
4265 DbgPrompt(
4266 _In_z_ PCCH Prompt,
4267 _Out_writes_bytes_(MaximumResponseLength) PCH Response,
4268 _In_ ULONG MaximumResponseLength);
4269
4270 /******************************************************************************
4271 * Kernel Functions *
4272 ******************************************************************************/
4273
4274 _IRQL_requires_min_(PASSIVE_LEVEL)
4275 _IRQL_requires_max_(DISPATCH_LEVEL)
4276 NTKERNELAPI
4277 VOID
4278 FASTCALL
4279 KeInvalidateRangeAllCaches(
4280 _In_ PVOID BaseAddress,
4281 _In_ ULONG Length);
4282
4283 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4284
4285 NTKERNELAPI
4286 VOID
4287 NTAPI
4288 KeSetImportanceDpc(
4289 _Inout_ PRKDPC Dpc,
4290 _In_ KDPC_IMPORTANCE Importance);
4291
4292 _IRQL_requires_max_(DISPATCH_LEVEL)
4293 NTKERNELAPI
4294 LONG
4295 NTAPI
4296 KePulseEvent(
4297 _Inout_ PRKEVENT Event,
4298 _In_ KPRIORITY Increment,
4299 _In_ BOOLEAN Wait);
4300
4301 _IRQL_requires_min_(PASSIVE_LEVEL)
4302 _IRQL_requires_max_(DISPATCH_LEVEL)
4303 NTKERNELAPI
4304 LONG
4305 NTAPI
4306 KeSetBasePriorityThread(
4307 _Inout_ PRKTHREAD Thread,
4308 _In_ LONG Increment);
4309
4310 _Acquires_lock_(_Global_critical_region_)
4311 _IRQL_requires_max_(APC_LEVEL)
4312 NTKERNELAPI
4313 VOID
4314 NTAPI
4315 KeEnterCriticalRegion(VOID);
4316
4317 _Releases_lock_(_Global_critical_region_)
4318 _IRQL_requires_max_(APC_LEVEL)
4319 NTKERNELAPI
4320 VOID
4321 NTAPI
4322 KeLeaveCriticalRegion(VOID);
4323
4324 NTKERNELAPI
4325 DECLSPEC_NORETURN
4326 VOID
4327 NTAPI
4328 KeBugCheck(
4329 _In_ ULONG BugCheckCode);
4330 #if defined(SINGLE_GROUP_LEGACY_API)
4331
4332
4333 NTKERNELAPI
4334 VOID
4335 NTAPI
4336 KeSetTargetProcessorDpc(
4337 _Inout_ PRKDPC Dpc,
4338 _In_ CCHAR Number);
4339
4340 NTKERNELAPI
4341 KAFFINITY
4342 NTAPI
4343 KeQueryActiveProcessors(VOID);
4344 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
4345
4346
4347 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4348
4349 #if (NTDDI_VERSION >= NTDDI_WINXP)
4350
4351 _IRQL_requires_min_(PASSIVE_LEVEL)
4352 _IRQL_requires_max_(DISPATCH_LEVEL)
4353 NTKERNELAPI
4354 BOOLEAN
4355 NTAPI
4356 KeAreApcsDisabled(VOID);
4357
4358 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
4359
4360 #if (NTDDI_VERSION >= NTDDI_WS03)
4361
4362
4363 NTKERNELAPI
4364 BOOLEAN
4365 NTAPI
4366 KeInvalidateAllCaches(VOID);
4367 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
4368 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
4369
4370 _Must_inspect_result_
4371 _IRQL_requires_max_(APC_LEVEL)
4372 NTKERNELAPI
4373 NTSTATUS
4374 NTAPI
4375 KeExpandKernelStackAndCallout(
4376 _In_ PEXPAND_STACK_CALLOUT Callout,
4377 _In_opt_ PVOID Parameter,
4378 _In_ SIZE_T Size);
4379
4380 _Acquires_lock_(_Global_critical_region_)
4381 _IRQL_requires_max_(APC_LEVEL)
4382 NTKERNELAPI
4383 VOID
4384 NTAPI
4385 KeEnterGuardedRegion(VOID);
4386
4387 _Releases_lock_(_Global_critical_region_)
4388 _IRQL_requires_max_(APC_LEVEL)
4389 NTKERNELAPI
4390 VOID
4391 NTAPI
4392 KeLeaveGuardedRegion(VOID);
4393 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
4394
4395 #if (NTDDI_VERSION >= NTDDI_VISTA)
4396 #if defined(SINGLE_GROUP_LEGACY_API)
4397
4398 NTKERNELAPI
4399 ULONG
4400 NTAPI
4401 KeQueryActiveProcessorCount(
4402 _Out_opt_ PKAFFINITY ActiveProcessors);
4403
4404 NTKERNELAPI
4405 ULONG
4406 NTAPI
4407 KeQueryMaximumProcessorCount(VOID);
4408 #endif /* SINGLE_GROUP_LEGACY_API */
4409
4410 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4411
4412 #if (NTDDI_VERSION >= NTDDI_WIN7)
4413
4414 NTKERNELAPI
4415 ULONG
4416 NTAPI
4417 KeQueryActiveProcessorCountEx(
4418 _In_ USHORT GroupNumber);
4419
4420 NTKERNELAPI
4421 ULONG
4422 NTAPI
4423 KeQueryMaximumProcessorCountEx(
4424 _In_ USHORT GroupNumber);
4425
4426 NTKERNELAPI
4427 USHORT
4428 NTAPI
4429 KeQueryActiveGroupCount(VOID);
4430
4431 NTKERNELAPI
4432 USHORT
4433 NTAPI
4434 KeQueryMaximumGroupCount(VOID);
4435
4436 NTKERNELAPI
4437 KAFFINITY
4438 NTAPI
4439 KeQueryGroupAffinity(
4440 _In_ USHORT GroupNumber);
4441
4442 NTKERNELAPI
4443 ULONG
4444 NTAPI
4445 KeGetCurrentProcessorNumberEx(
4446 _Out_opt_ PPROCESSOR_NUMBER ProcNumber);
4447
4448 NTKERNELAPI
4449 VOID
4450 NTAPI
4451 KeQueryNodeActiveAffinity(
4452 _In_ USHORT NodeNumber,
4453 _Out_opt_ PGROUP_AFFINITY Affinity,
4454 _Out_opt_ PUSHORT Count);
4455
4456 NTKERNELAPI
4457 USHORT
4458 NTAPI
4459 KeQueryNodeMaximumProcessorCount(
4460 _In_ USHORT NodeNumber);
4461
4462 NTKERNELAPI
4463 USHORT
4464 NTAPI
4465 KeQueryHighestNodeNumber(VOID);
4466
4467 NTKERNELAPI
4468 USHORT
4469 NTAPI
4470 KeGetCurrentNodeNumber(VOID);
4471
4472 _IRQL_requires_max_(DISPATCH_LEVEL)
4473 NTKERNELAPI
4474 NTSTATUS
4475 NTAPI
4476 KeQueryLogicalProcessorRelationship(
4477 _In_opt_ PPROCESSOR_NUMBER ProcessorNumber,
4478 _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
4479 _Out_writes_bytes_opt_(*Length) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information,
4480 _Inout_ PULONG Length);
4481
4482 _IRQL_requires_max_(APC_LEVEL)
4483 NTKERNELAPI
4484 NTSTATUS
4485 NTAPI
4486 KeSetHardwareCounterConfiguration(
4487 _In_reads_(Count) PHARDWARE_COUNTER CounterArray,
4488 _In_ ULONG Count);
4489
4490 _IRQL_requires_max_(APC_LEVEL)
4491 NTKERNELAPI
4492 NTSTATUS
4493 NTAPI
4494 KeQueryHardwareCounterConfiguration(
4495 _Out_writes_to_(MaximumCount, *Count) PHARDWARE_COUNTER CounterArray,
4496 _In_ ULONG MaximumCount,
4497 _Out_ PULONG Count);
4498 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4499 /******************************************************************************
4500 * Memory manager Functions *
4501 ******************************************************************************/
4502
4503 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4504
4505 _IRQL_requires_max_ (PASSIVE_LEVEL)
4506 NTKERNELAPI
4507 PPHYSICAL_MEMORY_RANGE
4508 NTAPI
4509 MmGetPhysicalMemoryRanges(VOID);
4510
4511 NTKERNELAPI
4512 PHYSICAL_ADDRESS
4513 NTAPI
4514 MmGetPhysicalAddress(
4515 _In_ PVOID BaseAddress);
4516
4517 NTKERNELAPI
4518 BOOLEAN
4519 NTAPI
4520 MmIsNonPagedSystemAddressValid(
4521 _In_ PVOID VirtualAddress);
4522
4523 _Must_inspect_result_
4524 _IRQL_requires_max_(APC_LEVEL)
4525 _Out_writes_bytes_opt_(NumberOfBytes)
4526 NTKERNELAPI
4527 PVOID
4528 NTAPI
4529 MmAllocateNonCachedMemory(
4530 _In_ SIZE_T NumberOfBytes);
4531
4532 _IRQL_requires_max_(APC_LEVEL)
4533 NTKERNELAPI
4534 VOID
4535 NTAPI
4536 MmFreeNonCachedMemory(
4537 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress,
4538 _In_ SIZE_T NumberOfBytes);
4539
4540 NTKERNELAPI
4541 PVOID
4542 NTAPI
4543 MmGetVirtualForPhysical(
4544 _In_ PHYSICAL_ADDRESS PhysicalAddress);
4545
4546 _Must_inspect_result_
4547 _IRQL_requires_max_(APC_LEVEL)
4548 NTKERNELAPI
4549 NTSTATUS
4550 NTAPI
4551 MmMapUserAddressesToPage(
4552 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress,
4553 _In_ SIZE_T NumberOfBytes,
4554 _In_ PVOID PageAddress);
4555
4556 _Must_inspect_result_
4557 _IRQL_requires_max_(APC_LEVEL)
4558 _Out_writes_bytes_opt_(NumberOfBytes)
4559 NTKERNELAPI
4560 PVOID
4561 NTAPI
4562 MmMapVideoDisplay(
4563 _In_ PHYSICAL_ADDRESS PhysicalAddress,
4564 _In_ SIZE_T NumberOfBytes,
4565 _In_ MEMORY_CACHING_TYPE CacheType);
4566
4567 _Must_inspect_result_
4568 _IRQL_requires_max_(APC_LEVEL)
4569 NTKERNELAPI
4570 NTSTATUS
4571 NTAPI
4572 MmMapViewInSessionSpace(
4573 _In_ PVOID Section,
4574 _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase,
4575 _Inout_ PSIZE_T ViewSize);
4576
4577 _Must_inspect_result_
4578 _IRQL_requires_max_(APC_LEVEL)
4579 NTKERNELAPI
4580 NTSTATUS
4581 NTAPI
4582 MmMapViewInSystemSpace(
4583 _In_ PVOID Section,
4584 _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase,
4585 _Inout_ PSIZE_T ViewSize);
4586
4587 _IRQL_requires_max_(DISPATCH_LEVEL)
4588 NTKERNELAPI
4589 BOOLEAN
4590 NTAPI
4591 MmIsAddressValid(
4592 _In_ PVOID VirtualAddress);
4593
4594 NTKERNELAPI
4595 BOOLEAN
4596 NTAPI
4597 MmIsThisAnNtAsSystem(VOID);
4598
4599 _IRQL_requires_max_(APC_LEVEL)
4600 NTKERNELAPI
4601 VOID
4602 NTAPI
4603 MmLockPagableSectionByHandle(
4604 _In_ PVOID ImageSectionHandle);
4605
4606 _IRQL_requires_max_(APC_LEVEL)
4607 NTKERNELAPI
4608 NTSTATUS
4609 NTAPI
4610 MmUnmapViewInSessionSpace(
4611 _In_ PVOID MappedBase);
4612
4613 _IRQL_requires_max_(APC_LEVEL)
4614 NTKERNELAPI
4615 NTSTATUS
4616 NTAPI
4617 MmUnmapViewInSystemSpace(
4618 _In_ PVOID MappedBase);
4619
4620 _IRQL_requires_max_(APC_LEVEL)
4621 NTKERNELAPI
4622 VOID
4623 NTAPI
4624 MmUnsecureVirtualMemory(
4625 _In_ HANDLE SecureHandle);
4626
4627 _IRQL_requires_max_ (PASSIVE_LEVEL)
4628 NTKERNELAPI
4629 NTSTATUS
4630 NTAPI
4631 MmRemovePhysicalMemory(
4632 _In_ PPHYSICAL_ADDRESS StartAddress,
4633 _Inout_ PLARGE_INTEGER NumberOfBytes);
4634
4635 _Must_inspect_result_
4636 _IRQL_requires_max_(APC_LEVEL)
4637 NTKERNELAPI
4638 HANDLE
4639 NTAPI
4640 MmSecureVirtualMemory(
4641 __in_data_source(USER_MODE) _In_reads_bytes_ (Size) PVOID Address,
4642 _In_ __in_data_source(USER_MODE) SIZE_T Size,
4643 _In_ ULONG ProbeMode);
4644
4645 _IRQL_requires_max_(APC_LEVEL)
4646 NTKERNELAPI
4647 VOID
4648 NTAPI
4649 MmUnmapVideoDisplay(
4650 _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress,
4651 _In_ SIZE_T NumberOfBytes);
4652
4653 _IRQL_requires_max_ (PASSIVE_LEVEL)
4654 NTKERNELAPI
4655 NTSTATUS
4656 NTAPI
4657 MmAddPhysicalMemory(
4658 _In_ PPHYSICAL_ADDRESS StartAddress,
4659 _Inout_ PLARGE_INTEGER NumberOfBytes);
4660
4661 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4662
4663
4664
4665 #if (NTDDI_VERSION >= NTDDI_WS03)
4666
4667 _Must_inspect_result_
4668 _IRQL_requires_max_(PASSIVE_LEVEL)
4669 NTKERNELAPI
4670 NTSTATUS
4671 NTAPI
4672 MmCreateMirror(VOID);
4673 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
4674
4675 #if (NTDDI_VERSION >= NTDDI_VISTA)
4676 _Must_inspect_result_
4677 _IRQL_requires_max_(APC_LEVEL)
4678 NTSTATUS
4679 NTAPI
4680 MmRotatePhysicalView(
4681 _In_ PVOID VirtualAddress,
4682 _Inout_ PSIZE_T NumberOfBytes,
4683 _In_opt_ PMDLX NewMdl,
4684 _In_ MM_ROTATE_DIRECTION Direction,
4685 _In_ PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction,
4686 _In_opt_ PVOID Context);
4687 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4688
4689 /******************************************************************************
4690 * Process Manager Functions *
4691 ******************************************************************************/
4692
4693 __kernel_entry
4694 NTSYSCALLAPI
4695 NTSTATUS
4696 NTAPI
4697 NtOpenProcess(
4698 _Out_ PHANDLE ProcessHandle,
4699 _In_ ACCESS_MASK DesiredAccess,
4700 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
4701 _In_opt_ PCLIENT_ID ClientId);
4702
4703 NTSYSCALLAPI
4704 NTSTATUS
4705 NTAPI
4706 NtQueryInformationProcess(
4707 IN HANDLE ProcessHandle,
4708 IN PROCESSINFOCLASS ProcessInformationClass,
4709 OUT PVOID ProcessInformation OPTIONAL,
4710 IN ULONG ProcessInformationLength,
4711 OUT PULONG ReturnLength OPTIONAL);
4712
4713 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4714
4715
4716 _IRQL_requires_max_(PASSIVE_LEVEL)
4717 NTKERNELAPI
4718 NTSTATUS
4719 NTAPI
4720 PsSetCreateProcessNotifyRoutine(
4721 _In_ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
4722 _In_ BOOLEAN Remove);
4723
4724 _IRQL_requires_max_(PASSIVE_LEVEL)
4725 NTKERNELAPI
4726 NTSTATUS
4727 NTAPI
4728 PsSetCreateThreadNotifyRoutine(
4729 _In_ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
4730
4731 _IRQL_requires_max_(PASSIVE_LEVEL)
4732 NTKERNELAPI
4733 NTSTATUS
4734 NTAPI
4735 PsSetLoadImageNotifyRoutine(
4736 _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
4737
4738 NTKERNELAPI
4739 HANDLE
4740 NTAPI
4741 PsGetCurrentProcessId(VOID);
4742
4743 _IRQL_requires_max_(DISPATCH_LEVEL)
4744 NTKERNELAPI
4745 HANDLE
4746 NTAPI
4747 PsGetCurrentThreadId(VOID);
4748
4749 NTKERNELAPI
4750 BOOLEAN
4751 NTAPI
4752 PsGetVersion(
4753 OUT PULONG MajorVersion OPTIONAL,
4754 OUT PULONG MinorVersion OPTIONAL,
4755 OUT PULONG BuildNumber OPTIONAL,
4756 OUT PUNICODE_STRING CSDVersion OPTIONAL);
4757 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4758 #if (NTDDI_VERSION >= NTDDI_WINXP)
4759
4760 _IRQL_requires_max_(DISPATCH_LEVEL)
4761 NTKERNELAPI
4762 HANDLE
4763 NTAPI
4764 PsGetProcessId(
4765 _In_ PEPROCESS Process);
4766
4767 _IRQL_requires_max_(DISPATCH_LEVEL)
4768 NTKERNELAPI
4769 HANDLE
4770 NTAPI
4771 PsGetThreadId(
4772 _In_ PETHREAD Thread);
4773
4774 NTKERNELAPI
4775 NTSTATUS
4776 NTAPI
4777 PsRemoveCreateThreadNotifyRoutine(
4778 _In_ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
4779
4780 _IRQL_requires_max_(PASSIVE_LEVEL)
4781 NTKERNELAPI
4782 NTSTATUS
4783 NTAPI
4784 PsRemoveLoadImageNotifyRoutine(
4785 _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
4786
4787 _IRQL_requires_max_(DISPATCH_LEVEL)
4788 NTKERNELAPI
4789 LONGLONG
4790 NTAPI
4791 PsGetProcessCreateTimeQuadPart(
4792 _In_ PEPROCESS Process);
4793 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
4794
4795 #if (NTDDI_VERSION >= NTDDI_WS03)
4796 NTKERNELAPI
4797 HANDLE
4798 NTAPI
4799 PsGetThreadProcessId(
4800 IN PETHREAD Thread);
4801 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
4802
4803 #if (NTDDI_VERSION >= NTDDI_VISTA)
4804
4805 NTKERNELAPI
4806 BOOLEAN
4807 NTAPI
4808 PsSetCurrentThreadPrefetching(
4809 IN BOOLEAN Prefetching);
4810
4811 NTKERNELAPI
4812 BOOLEAN
4813 NTAPI
4814 PsIsCurrentThreadPrefetching(VOID);
4815
4816 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4817
4818 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
4819 NTKERNELAPI
4820 NTSTATUS
4821 NTAPI
4822 PsSetCreateProcessNotifyRoutineEx(
4823 IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
4824 IN BOOLEAN Remove);
4825 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
4826 /******************************************************************************
4827 * Runtime Library Functions *
4828 ******************************************************************************/
4829
4830
4831 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4832
4833
4834 #ifndef RTL_USE_AVL_TABLES
4835
4836 NTSYSAPI
4837 VOID
4838 NTAPI
4839 RtlInitializeGenericTable(
4840 _Out_ PRTL_GENERIC_TABLE Table,
4841 _In_ PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
4842 _In_ PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
4843 _In_ PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
4844 _In_opt_ PVOID TableContext);
4845
4846 NTSYSAPI
4847 PVOID
4848 NTAPI
4849 RtlInsertElementGenericTable(
4850 _In_ PRTL_GENERIC_TABLE Table,
4851 _In_reads_bytes_(BufferSize) PVOID Buffer,
4852 _In_ CLONG BufferSize,
4853 _Out_opt_ PBOOLEAN NewElement);
4854
4855 NTSYSAPI
4856 PVOID
4857 NTAPI
4858 RtlInsertElementGenericTableFull(
4859 _In_ PRTL_GENERIC_TABLE Table,
4860 _In_reads_bytes_(BufferSize) PVOID Buffer,
4861 _In_ CLONG BufferSize,
4862 _Out_opt_ PBOOLEAN NewElement,
4863 _In_ PVOID NodeOrParent,
4864 _In_ TABLE_SEARCH_RESULT SearchResult);
4865
4866 NTSYSAPI
4867 BOOLEAN
4868 NTAPI
4869 RtlDeleteElementGenericTable(
4870 _In_ PRTL_GENERIC_TABLE Table,
4871 _In_ PVOID Buffer);
4872
4873 _Must_inspect_result_
4874 NTSYSAPI
4875 PVOID
4876 NTAPI
4877 RtlLookupElementGenericTable(
4878 _In_ PRTL_GENERIC_TABLE Table,
4879 _In_ PVOID Buffer);
4880
4881 NTSYSAPI
4882 PVOID
4883 NTAPI
4884 RtlLookupElementGenericTableFull(
4885 _In_ PRTL_GENERIC_TABLE Table,
4886 _In_ PVOID Buffer,
4887 _Out_ PVOID *NodeOrParent,
4888 _Out_ TABLE_SEARCH_RESULT *SearchResult);
4889
4890 _Must_inspect_result_
4891 NTSYSAPI
4892 PVOID
4893 NTAPI
4894 RtlEnumerateGenericTable(
4895 _In_ PRTL_GENERIC_TABLE Table,
4896 _In_ BOOLEAN Restart);
4897
4898 _Must_inspect_result_
4899 NTSYSAPI
4900 PVOID
4901 NTAPI
4902 RtlEnumerateGenericTableWithoutSplaying(
4903 _In_ PRTL_GENERIC_TABLE Table,
4904 _Inout_ PVOID *RestartKey);
4905
4906 _Must_inspect_result_
4907 NTSYSAPI
4908 PVOID
4909 NTAPI
4910 RtlGetElementGenericTable(
4911 _In_ PRTL_GENERIC_TABLE Table,
4912 _In_ ULONG I);
4913
4914 NTSYSAPI
4915 ULONG
4916 NTAPI
4917 RtlNumberGenericTableElements(
4918 _In_ PRTL_GENERIC_TABLE Table);
4919
4920 _Must_inspect_result_
4921 NTSYSAPI
4922 BOOLEAN
4923 NTAPI
4924 RtlIsGenericTableEmpty(
4925 _In_ PRTL_GENERIC_TABLE Table);
4926
4927 #endif /* !RTL_USE_AVL_TABLES */
4928
4929 #define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
4930
4931 NTSYSAPI
4932 PRTL_SPLAY_LINKS
4933 NTAPI
4934 RtlSplay(
4935 _Inout_ PRTL_SPLAY_LINKS Links);
4936
4937 NTSYSAPI
4938 PRTL_SPLAY_LINKS
4939 NTAPI
4940 RtlDelete(
4941 _In_ PRTL_SPLAY_LINKS Links);
4942
4943 NTSYSAPI
4944 VOID
4945 NTAPI
4946 RtlDeleteNoSplay(
4947 _In_ PRTL_SPLAY_LINKS Links,
4948 _Inout_ PRTL_SPLAY_LINKS *Root);
4949
4950 _Must_inspect_result_
4951 NTSYSAPI
4952 PRTL_SPLAY_LINKS
4953 NTAPI
4954 RtlSubtreeSuccessor(
4955 _In_ PRTL_SPLAY_LINKS Links);
4956
4957 _Must_inspect_result_
4958 NTSYSAPI
4959 PRTL_SPLAY_LINKS
4960 NTAPI
4961 RtlSubtreePredecessor(
4962 _In_ PRTL_SPLAY_LINKS Links);
4963
4964 _Must_inspect_result_
4965 NTSYSAPI
4966 PRTL_SPLAY_LINKS
4967 NTAPI
4968 RtlRealSuccessor(
4969 _In_ PRTL_SPLAY_LINKS Links);
4970
4971 _Must_inspect_result_
4972 NTSYSAPI
4973 PRTL_SPLAY_LINKS
4974 NTAPI
4975 RtlRealPredecessor(
4976 _In_ PRTL_SPLAY_LINKS Links);
4977
4978 _IRQL_requires_max_(PASSIVE_LEVEL)
4979 _Must_inspect_result_
4980 NTSYSAPI
4981 BOOLEAN
4982 NTAPI
4983 RtlPrefixUnicodeString(
4984 _In_ PCUNICODE_STRING String1,
4985 _In_ PCUNICODE_STRING String2,
4986 _In_ BOOLEAN CaseInSensitive);
4987
4988 _IRQL_requires_max_(PASSIVE_LEVEL)
4989 NTSYSAPI
4990 VOID
4991 NTAPI
4992 RtlUpperString(
4993 _Inout_ PSTRING DestinationString,
4994 _In_ const STRING *SourceString);
4995
4996 _IRQL_requires_max_(PASSIVE_LEVEL)
4997 _When_(AllocateDestinationString, _Must_inspect_result_)
4998 NTSYSAPI
4999 NTSTATUS
5000 NTAPI
5001 RtlUpcaseUnicodeString(
5002 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
5003 _When_(!AllocateDestinationString, _Inout_)
5004 PUNICODE_STRING DestinationString,
5005 _In_ PCUNICODE_STRING SourceString,
5006 _In_ BOOLEAN AllocateDestinationString);
5007
5008 _IRQL_requires_max_(APC_LEVEL)
5009 NTSYSAPI
5010 VOID
5011 NTAPI
5012 RtlMapGenericMask(
5013 _Inout_ PACCESS_MASK AccessMask,
5014 _In_ PGENERIC_MAPPING GenericMapping);
5015
5016 _IRQL_requires_max_(PASSIVE_LEVEL)
5017 NTSYSAPI
5018 NTSTATUS
5019 NTAPI
5020 RtlVolumeDeviceToDosName(
5021 _In_ PVOID VolumeDeviceObject,
5022 _Out_ PUNICODE_STRING DosName);
5023
5024 _IRQL_requires_max_(PASSIVE_LEVEL)
5025 _Must_inspect_result_
5026 NTSYSAPI
5027 LONG
5028 NTAPI
5029 RtlCompareString(
5030 _In_ const STRING *String1,
5031 _In_ const STRING *String2,
5032 _In_ BOOLEAN CaseInSensitive);
5033
5034 NTSYSAPI
5035 VOID
5036 NTAPI
5037 RtlCopyString(
5038 _Out_ PSTRING DestinationString,
5039 _In_opt_ const STRING *SourceString);
5040
5041 _IRQL_requires_max_(PASSIVE_LEVEL)
5042 _Must_inspect_result_
5043 NTSYSAPI
5044 BOOLEAN
5045 NTAPI
5046 RtlEqualString(
5047 _In_ const STRING *String1,
5048 _In_ const STRING *String2,
5049 _In_ BOOLEAN CaseInSensitive);
5050
5051 _IRQL_requires_max_(PASSIVE_LEVEL)
5052 NTSYSAPI
5053 NTSTATUS
5054 NTAPI
5055 RtlCharToInteger(
5056 _In_z_ PCSZ String,
5057 _In_opt_ ULONG Base,
5058 _Out_ PULONG Value);
5059
5060 _IRQL_requires_max_(PASSIVE_LEVEL)
5061 NTSYSAPI
5062 CHAR
5063 NTAPI
5064 RtlUpperChar(
5065 _In_ CHAR Character);
5066
5067 NTSYSAPI
5068 ULONG
5069 NTAPI
5070 RtlWalkFrameChain(
5071 _Out_writes_(Count - (Flags >> RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT))
5072 PVOID *Callers,
5073 _In_ ULONG Count,
5074 _In_ ULONG Flags);
5075
5076
5077 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5078
5079
5080 #if (NTDDI_VERSION >= NTDDI_WINXP)
5081
5082
5083
5084 NTSYSAPI
5085 VOID
5086 NTAPI
5087 RtlInitializeGenericTableAvl(
5088 _Out_ PRTL_AVL_TABLE Table,
5089 _In_ PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
5090 _In_opt_ PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
5091 _In_opt_ PRTL_AVL_FREE_ROUTINE FreeRoutine,
5092 _In_opt_ PVOID TableContext);
5093
5094 NTSYSAPI
5095 PVOID
5096 NTAPI
5097 RtlInsertElementGenericTableAvl(
5098 _In_ PRTL_AVL_TABLE Table,
5099 _In_reads_bytes_(BufferSize) PVOID Buffer,
5100 _In_ CLONG BufferSize,
5101 _Out_opt_ PBOOLEAN NewElement);
5102
5103 NTSYSAPI
5104 PVOID
5105 NTAPI
5106 RtlInsertElementGenericTableFullAvl(
5107 _In_ PRTL_AVL_TABLE Table,
5108 _In_reads_bytes_(BufferSize) PVOID Buffer,
5109 _In_ CLONG BufferSize,
5110 _Out_opt_ PBOOLEAN NewElement,
5111 _In_ PVOID NodeOrParent,
5112 _In_ TABLE_SEARCH_RESULT SearchResult);
5113
5114 NTSYSAPI
5115 BOOLEAN
5116 NTAPI
5117 RtlDeleteElementGenericTableAvl(
5118 _In_ PRTL_AVL_TABLE Table,
5119 _In_ PVOID Buffer);
5120
5121 _Must_inspect_result_
5122 NTSYSAPI
5123 PVOID
5124 NTAPI
5125 RtlLookupElementGenericTableAvl(
5126 _In_ PRTL_AVL_TABLE Table,
5127 _In_ PVOID Buffer);
5128
5129 NTSYSAPI
5130 PVOID
5131 NTAPI
5132 RtlLookupElementGenericTableFullAvl(
5133 _In_ PRTL_AVL_TABLE Table,
5134 _In_ PVOID Buffer,
5135 _Out_ PVOID *NodeOrParent,
5136 _Out_ TABLE_SEARCH_RESULT *SearchResult);
5137
5138 _Must_inspect_result_
5139 NTSYSAPI
5140 PVOID
5141 NTAPI
5142 RtlEnumerateGenericTableAvl(
5143 _In_ PRTL_AVL_TABLE Table,
5144 _In_ BOOLEAN Restart);
5145
5146 _Must_inspect_result_
5147 NTSYSAPI
5148 PVOID
5149 NTAPI
5150 RtlEnumerateGenericTableWithoutSplayingAvl(
5151 _In_ PRTL_AVL_TABLE Table,
5152 _Inout_ PVOID *RestartKey);
5153
5154 _Must_inspect_result_
5155 NTSYSAPI
5156 PVOID
5157 NTAPI
5158 RtlLookupFirstMatchingElementGenericTableAvl(
5159 _In_ PRTL_AVL_TABLE Table,
5160 _In_ PVOID Buffer,
5161 _Out_ PVOID *RestartKey);
5162
5163 _Must_inspect_result_
5164 NTSYSAPI
5165 PVOID
5166 NTAPI
5167 RtlEnumerateGenericTableLikeADirectory(
5168 _In_ PRTL_AVL_TABLE Table,
5169 _In_opt_ PRTL_AVL_MATCH_FUNCTION MatchFunction,
5170 _In_opt_ PVOID MatchData,
5171 _In_ ULONG NextFlag,
5172 _Inout_ PVOID *RestartKey,
5173 _Inout_ PULONG DeleteCount,
5174 _In_ PVOID Buffer);
5175
5176 _Must_inspect_result_
5177 NTSYSAPI
5178 PVOID
5179 NTAPI
5180 RtlGetElementGenericTableAvl(
5181 _In_ PRTL_AVL_TABLE Table,
5182 _In_ ULONG I);
5183
5184 NTSYSAPI
5185 ULONG
5186 NTAPI
5187 RtlNumberGenericTableElementsAvl(
5188 _In_ PRTL_AVL_TABLE Table);
5189
5190 _Must_inspect_result_
5191 NTSYSAPI
5192 BOOLEAN
5193 NTAPI
5194 RtlIsGenericTableEmptyAvl(
5195 _In_ PRTL_AVL_TABLE Table);
5196
5197
5198 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
5199
5200
5201 #if (NTDDI_VERSION >= NTDDI_VISTA)
5202
5203
5204 _IRQL_requires_max_(APC_LEVEL)
5205 NTSYSAPI
5206 VOID
5207 NTAPI
5208 RtlRunOnceInitialize(
5209 _Out_ PRTL_RUN_ONCE RunOnce);
5210
5211 _IRQL_requires_max_(APC_LEVEL)
5212 _Maybe_raises_SEH_exception_
5213 NTSYSAPI
5214 NTSTATUS
5215 NTAPI
5216 RtlRunOnceExecuteOnce(
5217 _Inout_ PRTL_RUN_ONCE RunOnce,
5218 _In_ __inner_callback PRTL_RUN_ONCE_INIT_FN InitFn,
5219 _Inout_opt_ PVOID Parameter,
5220 _Outptr_opt_result_maybenull_ PVOID *Context);
5221
5222 _IRQL_requires_max_(APC_LEVEL)
5223 _Must_inspect_result_
5224 NTSYSAPI
5225 NTSTATUS
5226 NTAPI
5227 RtlRunOnceBeginInitialize(
5228 _Inout_ PRTL_RUN_ONCE RunOnce,
5229 _In_ ULONG Flags,
5230 _Outptr_opt_result_maybenull_ PVOID *Context);
5231
5232 _IRQL_requires_max_(APC_LEVEL)
5233 NTSYSAPI
5234 NTSTATUS
5235 NTAPI
5236 RtlRunOnceComplete(
5237 _Inout_ PRTL_RUN_ONCE RunOnce,
5238 _In_ ULONG Flags,
5239 _In_opt_ PVOID Context);
5240
5241 NTSYSAPI
5242 BOOLEAN
5243 NTAPI
5244 RtlGetProductInfo(
5245 _In_ ULONG OSMajorVersion,
5246 _In_ ULONG OSMinorVersion,
5247 _In_ ULONG SpMajorVersion,
5248 _In_ ULONG SpMinorVersion,
5249 _Out_ PULONG ReturnedProductType);
5250
5251
5252 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
5253
5254 #if (NTDDI_VERSION >= NTDDI_WIN7)
5255
5256
5257 _Must_inspect_result_
5258 NTSYSAPI
5259 BOOLEAN
5260 NTAPI
5261 RtlCreateHashTable(
5262 _Inout_ _When_(NULL == *HashTable, __drv_allocatesMem(Mem))
5263 PRTL_DYNAMIC_HASH_TABLE *HashTable,
5264 _In_ ULONG Shift,
5265 _In_ _Reserved_ ULONG Flags);
5266
5267 NTSYSAPI
5268 VOID
5269 NTAPI
5270 RtlDeleteHashTable(
5271 _In_ _When_((HashTable->Flags & RTL_HASH_ALLOCATED_HEADER), __drv_freesMem(Mem) _Post_invalid_)
5272 PRTL_DYNAMIC_HASH_TABLE HashTable);
5273
5274 NTSYSAPI
5275 BOOLEAN
5276 NTAPI
5277 RtlInsertEntryHashTable(
5278 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5279 _In_ __drv_aliasesMem PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,
5280 _In_ ULONG_PTR Signature,
5281 _Inout_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context);
5282
5283 NTSYSAPI
5284 BOOLEAN
5285 NTAPI
5286 RtlRemoveEntryHashTable(
5287 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5288 _In_ PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,
5289 _Inout_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context);
5290
5291 _Must_inspect_result_
5292 NTSYSAPI
5293 PRTL_DYNAMIC_HASH_TABLE_ENTRY
5294 NTAPI
5295 RtlLookupEntryHashTable(
5296 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5297 _In_ ULONG_PTR Signature,
5298 _Out_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context);
5299
5300 _Must_inspect_result_
5301 NTSYSAPI
5302 PRTL_DYNAMIC_HASH_TABLE_ENTRY
5303 NTAPI
5304 RtlGetNextEntryHashTable(
5305 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5306 _In_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context);
5307
5308 NTSYSAPI
5309 BOOLEAN
5310 NTAPI
5311 RtlInitEnumerationHashTable(
5312 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5313 _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
5314
5315 _Must_inspect_result_
5316 NTSYSAPI
5317 PRTL_DYNAMIC_HASH_TABLE_ENTRY
5318 NTAPI
5319 RtlEnumerateEntryHashTable(
5320 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5321 _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
5322
5323 NTSYSAPI
5324 VOID
5325 NTAPI
5326 RtlEndEnumerationHashTable(
5327 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5328 _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
5329
5330 NTSYSAPI
5331 BOOLEAN
5332 NTAPI
5333 RtlInitWeakEnumerationHashTable(
5334 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5335 _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
5336
5337 _Must_inspect_result_
5338 NTSYSAPI
5339 PRTL_DYNAMIC_HASH_TABLE_ENTRY
5340 NTAPI
5341 RtlWeaklyEnumerateEntryHashTable(
5342 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5343 _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
5344
5345 NTSYSAPI
5346 VOID
5347 NTAPI
5348 RtlEndWeakEnumerationHashTable(
5349 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable,
5350 _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
5351
5352 NTSYSAPI
5353 BOOLEAN
5354 NTAPI
5355 RtlExpandHashTable(
5356 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable);
5357
5358 NTSYSAPI
5359 BOOLEAN
5360 NTAPI
5361 RtlContractHashTable(
5362 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable);
5363
5364
5365 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5366
5367
5368 #if defined(_AMD64_) || defined(_IA64_)
5369
5370
5371
5372 //DECLSPEC_DEPRECATED_DDK_WINXP
5373 FORCEINLINE
5374 LARGE_INTEGER
5375 NTAPI_INLINE
5376 RtlLargeIntegerDivide(
5377 _In_ LARGE_INTEGER Dividend,
5378 _In_ LARGE_INTEGER Divisor,
5379 _Out_opt_ PLARGE_INTEGER Remainder)
5380 {
5381 LARGE_INTEGER ret;
5382 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
5383 if (Remainder)
5384 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
5385 return ret;
5386 }
5387
5388 #else
5389
5390 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5391 NTSYSAPI
5392 LARGE_INTEGER
5393 NTAPI
5394 RtlLargeIntegerDivide(
5395 _In_ LARGE_INTEGER Dividend,
5396 _In_ LARGE_INTEGER Divisor,
5397 _Out_opt_ PLARGE_INTEGER Remainder);
5398 #endif
5399
5400
5401 #endif /* defined(_AMD64_) || defined(_IA64_) */
5402
5403
5404
5405 #ifdef RTL_USE_AVL_TABLES
5406
5407 #define RtlInitializeGenericTable RtlInitializeGenericTableAvl
5408 #define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl
5409 #define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl
5410 #define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl
5411 #define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl
5412 #define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl
5413 #define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl
5414 #define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
5415 #define RtlGetElementGenericTable RtlGetElementGenericTableAvl
5416 #define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl
5417 #define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl
5418
5419 #endif /* RTL_USE_AVL_TABLES */
5420
5421 #define RtlInitializeSplayLinks(Links) { \
5422 PRTL_SPLAY_LINKS _SplayLinks; \
5423 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
5424 _SplayLinks->Parent = _SplayLinks; \
5425 _SplayLinks->LeftChild = NULL; \
5426 _SplayLinks->RightChild = NULL; \
5427 }
5428
5429 #define RtlIsLeftChild(Links) \
5430 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
5431
5432 #define RtlIsRightChild(Links) \
5433 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
5434
5435 #define RtlRightChild(Links) \
5436 ((PRTL_SPLAY_LINKS)(Links))->RightChild
5437
5438 #define RtlIsRoot(Links) \
5439 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
5440
5441 #define RtlLeftChild(Links) \
5442 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
5443
5444 #define RtlParent(Links) \
5445 ((PRTL_SPLAY_LINKS)(Links))->Parent
5446
5447 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
5448 { \
5449 PRTL_SPLAY_LINKS _SplayParent; \
5450 PRTL_SPLAY_LINKS _SplayChild; \
5451 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
5452 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
5453 _SplayParent->LeftChild = _SplayChild; \
5454 _SplayChild->Parent = _SplayParent; \
5455 }
5456
5457 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
5458 { \
5459 PRTL_SPLAY_LINKS _SplayParent; \
5460 PRTL_SPLAY_LINKS _SplayChild; \
5461 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
5462 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
5463 _SplayParent->RightChild = _SplayChild; \
5464 _SplayChild->Parent = _SplayParent; \
5465 }
5466
5467 #if !defined(MIDL_PASS)
5468
5469 FORCEINLINE
5470 LUID
5471 NTAPI_INLINE
5472 RtlConvertLongToLuid(
5473 _In_ LONG Val)
5474 {
5475 LUID Luid;
5476 LARGE_INTEGER Temp;
5477
5478 Temp.QuadPart = Val;
5479 Luid.LowPart = Temp.u.LowPart;
5480 Luid.HighPart = Temp.u.HighPart;
5481 return Luid;
5482 }
5483
5484 FORCEINLINE
5485 LUID
5486 NTAPI_INLINE
5487 RtlConvertUlongToLuid(
5488 _In_ ULONG Val)
5489 {
5490 LUID Luid;
5491
5492 Luid.LowPart = Val;
5493 Luid.HighPart = 0;
5494 return Luid;
5495 }
5496
5497 #endif /* !defined(MIDL_PASS) */
5498
5499 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
5500 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
5501 *CallersAddress = (PVOID)_ReturnAddress(); \
5502 *CallersCaller = NULL;
5503 #else
5504 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5505 NTSYSAPI
5506 VOID
5507 NTAPI
5508 RtlGetCallersAddress(
5509 _Out_ PVOID *CallersAddress,
5510 _Out_ PVOID *CallersCaller);
5511 #endif
5512 #endif
5513
5514 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
5515
5516 #if (NTDDI_VERSION >= NTDDI_WIN7)
5517
5518 FORCEINLINE
5519 VOID
5520 NTAPI
5521 RtlInitHashTableContext(
5522 _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)
5523 {
5524 Context->ChainHead = NULL;
5525 Context->PrevLinkage = NULL;
5526 }
5527
5528 FORCEINLINE
5529 VOID
5530 NTAPI
5531 RtlInitHashTableContextFromEnumerator(
5532 _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context,
5533 _In_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator)
5534 {
5535 Context->ChainHead = Enumerator->ChainHead;
5536 Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink;
5537 }
5538
5539 FORCEINLINE
5540 VOID
5541 NTAPI
5542 RtlReleaseHashTableContext(
5543 _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)
5544 {
5545 UNREFERENCED_PARAMETER(Context);
5546 return;
5547 }
5548
5549 FORCEINLINE
5550 ULONG
5551 NTAPI
5552 RtlTotalBucketsHashTable(
5553 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable)
5554 {
5555 return HashTable->TableSize;
5556 }
5557
5558 FORCEINLINE
5559 ULONG
5560 NTAPI
5561 RtlNonEmptyBucketsHashTable(
5562 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable)
5563 {
5564 return HashTable->NonEmptyBuckets;
5565 }
5566
5567 FORCEINLINE
5568 ULONG
5569 NTAPI
5570 RtlEmptyBucketsHashTable(
5571 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable)
5572 {
5573 return HashTable->TableSize - HashTable->NonEmptyBuckets;
5574 }
5575
5576 FORCEINLINE
5577 ULONG
5578 NTAPI
5579 RtlTotalEntriesHashTable(
5580 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable)
5581 {
5582 return HashTable->NumEntries;
5583 }
5584
5585 FORCEINLINE
5586 ULONG
5587 NTAPI
5588 RtlActiveEnumeratorsHashTable(
5589 _In_ PRTL_DYNAMIC_HASH_TABLE HashTable)
5590 {
5591 return HashTable->NumEnumerators;
5592 }
5593
5594 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5595
5596 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
5597
5598 /******************************************************************************
5599 * Security Manager Functions *
5600 ******************************************************************************/
5601
5602 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5603
5604 _IRQL_requires_max_(PASSIVE_LEVEL)
5605 NTKERNELAPI
5606 BOOLEAN
5607 NTAPI
5608 SeSinglePrivilegeCheck(
5609 _In_ LUID PrivilegeValue,
5610 _In_ KPROCESSOR_MODE PreviousMode);
5611
5612 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5613
5614
5615 /******************************************************************************
5616 * ZwXxx Functions *
5617 ******************************************************************************/
5618
5619
5620 _IRQL_requires_max_(PASSIVE_LEVEL)
5621 NTSYSAPI
5622 NTSTATUS
5623 NTAPI
5624 ZwAllocateLocallyUniqueId(
5625 _Out_ PLUID Luid);
5626
5627 _IRQL_requires_max_(PASSIVE_LEVEL)
5628 NTSYSAPI
5629 NTSTATUS
5630 NTAPI
5631 ZwTerminateProcess(
5632 _In_opt_ HANDLE ProcessHandle,
5633 _In_ NTSTATUS ExitStatus);
5634
5635 _IRQL_requires_max_(PASSIVE_LEVEL)
5636 NTSYSAPI
5637 NTSTATUS
5638 NTAPI
5639 ZwOpenProcess(
5640 _Out_ PHANDLE ProcessHandle,
5641 _In_ ACCESS_MASK DesiredAccess,
5642 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
5643 _In_opt_ PCLIENT_ID ClientId);
5644
5645 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5646
5647 _IRQL_requires_max_(PASSIVE_LEVEL)
5648 NTSTATUS
5649 NTAPI
5650 ZwCancelTimer(
5651 _In_ HANDLE TimerHandle,
5652 _Out_opt_ PBOOLEAN CurrentState);
5653
5654 _IRQL_requires_max_(PASSIVE_LEVEL)
5655 _When_(return == 0, __drv_allocatesMem(TimerObject))
5656 NTSTATUS
5657 NTAPI
5658 ZwCreateTimer(
5659 _Out_ PHANDLE TimerHandle,
5660 _In_ ACCESS_MASK DesiredAccess,
5661 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
5662 _In_ TIMER_TYPE TimerType);
5663
5664 _IRQL_requires_max_(PASSIVE_LEVEL)
5665 NTSTATUS
5666 NTAPI
5667 ZwOpenTimer(
5668 _Out_ PHANDLE TimerHandle,
5669 _In_ ACCESS_MASK DesiredAccess,
5670 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
5671
5672 _IRQL_requires_max_(PASSIVE_LEVEL)
5673 NTSYSAPI
5674 NTSTATUS
5675 NTAPI
5676 ZwSetInformationThread(
5677 _In_ HANDLE ThreadHandle,
5678 _In_ THREADINFOCLASS ThreadInformationClass,
5679 _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation,
5680 _In_ ULONG ThreadInformationLength);
5681
5682 _IRQL_requires_max_(PASSIVE_LEVEL)
5683 NTSTATUS
5684 NTAPI
5685 ZwSetTimer(
5686 _In_ HANDLE TimerHandle,
5687 _In_ PLARGE_INTEGER DueTime,
5688 _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine,
5689 _In_opt_ PVOID TimerContext,
5690 _In_ BOOLEAN ResumeTimer,
5691 _In_opt_ LONG Period,
5692 _Out_opt_ PBOOLEAN PreviousState);
5693
5694 _IRQL_requires_max_(PASSIVE_LEVEL)
5695 NTSYSAPI
5696 NTSTATUS
5697 NTAPI
5698 ZwDisplayString(
5699 _In_ PUNICODE_STRING String);
5700
5701 _IRQL_requires_max_(PASSIVE_LEVEL)
5702 NTSYSAPI
5703 NTSTATUS
5704 NTAPI
5705 ZwPowerInformation(
5706 _In_ POWER_INFORMATION_LEVEL PowerInformationLevel,
5707 _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,
5708 _In_ ULONG InputBufferLength,
5709 _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,
5710 _In_ ULONG OutputBufferLength);
5711
5712 _IRQL_requires_max_(PASSIVE_LEVEL)
5713 NTSYSAPI
5714 NTSTATUS
5715 NTAPI
5716 ZwQueryVolumeInformationFile(
5717 _In_ HANDLE FileHandle,
5718 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
5719 _Out_writes_bytes_(Length) PVOID FsInformation,
5720 _In_ ULONG Length,
5721 _In_ FS_INFORMATION_CLASS FsInformationClass);
5722
5723 _IRQL_requires_max_(PASSIVE_LEVEL)
5724 NTSYSAPI
5725 NTSTATUS
5726 NTAPI
5727 ZwDeviceIoControlFile(
5728 _In_ HANDLE FileHandle,
5729 _In_opt_ HANDLE Event,
5730 _In_opt_ PIO_APC_ROUTINE ApcRoutine,
5731 _In_opt_ PVOID ApcContext,
5732 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
5733 _In_ ULONG IoControlCode,
5734 _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer,
5735 _In_ ULONG InputBufferLength,
5736 _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer,
5737 _In_ ULONG OutputBufferLength);
5738
5739 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5740
5741
5742 #if (NTDDI_VERSION >= NTDDI_WIN7)
5743
5744 _IRQL_requires_max_(PASSIVE_LEVEL)
5745 NTSTATUS
5746 NTAPI
5747 ZwSetTimerEx(
5748 _In_ HANDLE TimerHandle,
5749 _In_ TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,
5750 _Inout_updates_bytes_opt_(TimerSetInformationLength) PVOID TimerSetInformation,
5751 _In_ ULONG TimerSetInformationLength);
5752 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5753
5754
5755
5756 /* UNSORTED */
5757
5758 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
5759 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
5760 (TypeBitMask), (ComparisonType)))
5761
5762 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5763 NTSYSAPI
5764 ULONGLONG
5765 NTAPI
5766 VerSetConditionMask(
5767 IN ULONGLONG ConditionMask,
5768 IN ULONG TypeMask,
5769 IN UCHAR Condition);
5770 #endif
5771
5772 typedef struct _KERNEL_USER_TIMES {
5773 LARGE_INTEGER CreateTime;
5774 LARGE_INTEGER ExitTime;
5775 LARGE_INTEGER KernelTime;
5776 LARGE_INTEGER UserTime;
5777 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
5778
5779 /* NtXxx Functions */
5780
5781 typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION {
5782 SystemFirmwareTable_Enumerate,
5783 SystemFirmwareTable_Get
5784 } SYSTEM_FIRMWARE_TABLE_ACTION;
5785
5786 typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION {
5787 ULONG ProviderSignature;
5788 SYSTEM_FIRMWARE_TABLE_ACTION Action;
5789 ULONG TableID;
5790 ULONG TableBufferLength;
5791 UCHAR TableBuffer[ANYSIZE_ARRAY];
5792 } SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;
5793
5794 typedef NTSTATUS
5795 (__cdecl *PFNFTH)(
5796 _Inout_ PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo);
5797
5798 typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER {
5799 ULONG ProviderSignature;
5800 BOOLEAN Register;
5801 PFNFTH FirmwareTableHandler;
5802 PVOID DriverObject;
5803 } SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER;
5804
5805 typedef ULONG_PTR
5806 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
5807 _In_ PVOID Context);
5808
5809 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
5810 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
5811 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
5812 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
5813
5814 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
5815 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
5816 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
5817 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
5818 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
5819
5820 #define SHARED_GLOBAL_FLAGS_ERROR_PORT_V 0x0
5821 #define SHARED_GLOBAL_FLAGS_ERROR_PORT (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V)
5822
5823 #define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V 0x1
5824 #define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V)
5825
5826 #define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V 0x2
5827 #define SHARED_GLOBAL_FLAGS_VIRT_ENABLED (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V)
5828
5829 #define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V 0x3
5830 #define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED \
5831 (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V)
5832
5833 #define SHARED_GLOBAL_FLAGS_SPARE_V 0x4
5834 #define SHARED_GLOBAL_FLAGS_SPARE \
5835 (1UL << SHARED_GLOBAL_FLAGS_SPARE_V)
5836
5837 #define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V 0x5
5838 #define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED \
5839 (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V)
5840
5841 #define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V 0x6
5842 #define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED \
5843 (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V)
5844
5845 #define EX_INIT_BITS(Flags, Bit) \
5846 *((Flags)) |= (Bit) // Safe to use before concurrently accessible
5847
5848 #define EX_TEST_SET_BIT(Flags, Bit) \
5849 InterlockedBitTestAndSet ((PLONG)(Flags), (Bit))
5850
5851 #define EX_TEST_CLEAR_BIT(Flags, Bit) \
5852 InterlockedBitTestAndReset ((PLONG)(Flags), (Bit))
5853
5854 #define PCCARD_MAP_ERROR 0x01
5855 #define PCCARD_DEVICE_PCI 0x10
5856
5857 #define PCCARD_SCAN_DISABLED 0x01
5858 #define PCCARD_MAP_ZERO 0x02
5859 #define PCCARD_NO_TIMER 0x03
5860 #define PCCARD_NO_PIC 0x04
5861 #define PCCARD_NO_LEGACY_BASE 0x05
5862 #define PCCARD_DUP_LEGACY_BASE 0x06
5863 #define PCCARD_NO_CONTROLLERS 0x07
5864
5865 #define MAXIMUM_EXPANSION_SIZE (KERNEL_LARGE_STACK_SIZE - (PAGE_SIZE / 2))
5866
5867 /* Filesystem runtime library routines */
5868
5869 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5870 _Must_inspect_result_
5871 NTKERNELAPI
5872 BOOLEAN
5873 NTAPI
5874 FsRtlIsTotalDeviceFailure(
5875 _In_ NTSTATUS Status);
5876 #endif
5877
5878 #ifdef __cplusplus
5879 }
5880 #endif