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