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