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