[DDK]
[reactos.git] / reactos / include / ddk / ntddk.h
1 /*
2 * ntddk.h
3 *
4 * Windows Device Driver Kit
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 * DEFINES:
22 * DBG - Debugging enabled/disabled (0/1)
23 * POOL_TAGGING - Enable pool tagging
24 * _X86_ - X86 environment
25 */
26
27 #ifndef _NTDDK_
28 #define _NTDDK_
29
30 #if !defined(_NTHAL_) && !defined(_NTIFS_)
31 #define _NTDDK_INCLUDED_
32 #define _DDK_DRIVER_
33 #endif
34
35 /* Dependencies */
36
37 #define NT_INCLUDED
38 #define _CTYPE_DISABLE_MACROS
39
40 #include <wdm.h>
41 #include <excpt.h>
42 #include <ntdef.h>
43 #include <ntstatus.h>
44
45 /* FIXME
46 #include <bugcodes.h>
47 #include <ntiologc.h>
48 */
49
50 #include <stdarg.h> // FIXME
51 #include <basetyps.h> // FIXME
52
53
54 #ifdef __cplusplus
55 extern "C" {
56 #endif
57
58 struct _LOADER_PARAMETER_BLOCK;
59 struct _CREATE_DISK;
60 struct _DRIVE_LAYOUT_INFORMATION_EX;
61 struct _SET_PARTITION_INFORMATION_EX;
62
63 //
64 // GUID and UUID
65 //
66 #ifndef GUID_DEFINED
67 #include <guiddef.h>
68 #endif
69 typedef GUID UUID;
70
71 typedef struct _BUS_HANDLER *PBUS_HANDLER;
72
73 typedef struct _PEB *PPEB;
74
75 #ifndef _NTIMAGE_
76
77 typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32;
78 typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64;
79
80 #ifdef _WIN64
81 typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
82 #else
83 typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
84 #endif
85
86 #endif /* _NTIMAGE_ */
87
88 #define EXCEPTION_READ_FAULT 0
89 #define EXCEPTION_WRITE_FAULT 1
90 #define EXCEPTION_EXECUTE_FAULT 8
91
92 #if (NTDDI_VERSION >= NTDDI_VISTA)
93 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
94 #elif (NTDDI_VERSION >= NTDDI_WINXP)
95 extern NTSYSAPI CCHAR KeNumberProcessors;
96 #else
97 extern PCCHAR KeNumberProcessors;
98 #endif
99
100 #define MAX_WOW64_SHARED_ENTRIES 16
101
102 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
103 #define NX_SUPPORT_POLICY_ALWAYSON 1
104 #define NX_SUPPORT_POLICY_OPTIN 2
105 #define NX_SUPPORT_POLICY_OPTOUT 3
106
107 /*
108 ** IRP function codes
109 */
110
111 #define IRP_MN_QUERY_DIRECTORY 0x01
112 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
113
114 #define IRP_MN_USER_FS_REQUEST 0x00
115 #define IRP_MN_MOUNT_VOLUME 0x01
116 #define IRP_MN_VERIFY_VOLUME 0x02
117 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
118 #define IRP_MN_TRACK_LINK 0x04
119 #define IRP_MN_KERNEL_CALL 0x04
120
121 #define IRP_MN_LOCK 0x01
122 #define IRP_MN_UNLOCK_SINGLE 0x02
123 #define IRP_MN_UNLOCK_ALL 0x03
124 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
125
126 #define IRP_MN_FLUSH_AND_PURGE 0x01
127
128 #define IRP_MN_NORMAL 0x00
129 #define IRP_MN_DPC 0x01
130 #define IRP_MN_MDL 0x02
131 #define IRP_MN_COMPLETE 0x04
132 #define IRP_MN_COMPRESSED 0x08
133
134 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
135 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
136 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
137
138 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
139
140 typedef struct _IO_COUNTERS {
141 ULONGLONG ReadOperationCount;
142 ULONGLONG WriteOperationCount;
143 ULONGLONG OtherOperationCount;
144 ULONGLONG ReadTransferCount;
145 ULONGLONG WriteTransferCount;
146 ULONGLONG OtherTransferCount;
147 } IO_COUNTERS, *PIO_COUNTERS;
148
149 typedef struct _VM_COUNTERS {
150 SIZE_T PeakVirtualSize;
151 SIZE_T VirtualSize;
152 ULONG PageFaultCount;
153 SIZE_T PeakWorkingSetSize;
154 SIZE_T WorkingSetSize;
155 SIZE_T QuotaPeakPagedPoolUsage;
156 SIZE_T QuotaPagedPoolUsage;
157 SIZE_T QuotaPeakNonPagedPoolUsage;
158 SIZE_T QuotaNonPagedPoolUsage;
159 SIZE_T PagefileUsage;
160 SIZE_T PeakPagefileUsage;
161 } VM_COUNTERS, *PVM_COUNTERS;
162
163 typedef struct _VM_COUNTERS_EX
164 {
165 SIZE_T PeakVirtualSize;
166 SIZE_T VirtualSize;
167 ULONG PageFaultCount;
168 SIZE_T PeakWorkingSetSize;
169 SIZE_T WorkingSetSize;
170 SIZE_T QuotaPeakPagedPoolUsage;
171 SIZE_T QuotaPagedPoolUsage;
172 SIZE_T QuotaPeakNonPagedPoolUsage;
173 SIZE_T QuotaNonPagedPoolUsage;
174 SIZE_T PagefileUsage;
175 SIZE_T PeakPagefileUsage;
176 SIZE_T PrivateUsage;
177 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
178
179 typedef struct _POOLED_USAGE_AND_LIMITS
180 {
181 SIZE_T PeakPagedPoolUsage;
182 SIZE_T PagedPoolUsage;
183 SIZE_T PagedPoolLimit;
184 SIZE_T PeakNonPagedPoolUsage;
185 SIZE_T NonPagedPoolUsage;
186 SIZE_T NonPagedPoolLimit;
187 SIZE_T PeakPagefileUsage;
188 SIZE_T PagefileUsage;
189 SIZE_T PagefileLimit;
190 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
191
192 /* DEVICE_OBJECT.Flags */
193
194 #define DO_VERIFY_VOLUME 0x00000002
195 #define DO_BUFFERED_IO 0x00000004
196 #define DO_EXCLUSIVE 0x00000008
197 #define DO_DIRECT_IO 0x00000010
198 #define DO_MAP_IO_BUFFER 0x00000020
199 #define DO_DEVICE_HAS_NAME 0x00000040
200 #define DO_DEVICE_INITIALIZING 0x00000080
201 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
202 #define DO_LONG_TERM_REQUESTS 0x00000200
203 #define DO_NEVER_LAST_DEVICE 0x00000400
204 #define DO_SHUTDOWN_REGISTERED 0x00000800
205 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
206 #define DO_POWER_PAGABLE 0x00002000
207 #define DO_POWER_INRUSH 0x00004000
208 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
209 #define DO_SUPPORTS_TRANSACTIONS 0x00040000
210 #define DO_FORCE_NEITHER_IO 0x00080000
211 #define DO_VOLUME_DEVICE_OBJECT 0x00100000
212 #define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
213 #define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
214 #define DO_DISALLOW_EXECUTE 0x00800000
215
216 #define DRVO_REINIT_REGISTERED 0x00000008
217 #define DRVO_INITIALIZED 0x00000010
218 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
219 #define DRVO_LEGACY_RESOURCES 0x00000040
220
221 typedef enum _ARBITER_REQUEST_SOURCE {
222 ArbiterRequestUndefined = -1,
223 ArbiterRequestLegacyReported,
224 ArbiterRequestHalReported,
225 ArbiterRequestLegacyAssigned,
226 ArbiterRequestPnpDetected,
227 ArbiterRequestPnpEnumerated
228 } ARBITER_REQUEST_SOURCE;
229
230 typedef enum _ARBITER_RESULT {
231 ArbiterResultUndefined = -1,
232 ArbiterResultSuccess,
233 ArbiterResultExternalConflict,
234 ArbiterResultNullRequest
235 } ARBITER_RESULT;
236
237 typedef enum _ARBITER_ACTION {
238 ArbiterActionTestAllocation,
239 ArbiterActionRetestAllocation,
240 ArbiterActionCommitAllocation,
241 ArbiterActionRollbackAllocation,
242 ArbiterActionQueryAllocatedResources,
243 ArbiterActionWriteReservedResources,
244 ArbiterActionQueryConflict,
245 ArbiterActionQueryArbitrate,
246 ArbiterActionAddReserved,
247 ArbiterActionBootAllocation
248 } ARBITER_ACTION, *PARBITER_ACTION;
249
250 typedef struct _ARBITER_CONFLICT_INFO {
251 PDEVICE_OBJECT OwningObject;
252 ULONGLONG Start;
253 ULONGLONG End;
254 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
255
256 typedef struct _ARBITER_PARAMETERS {
257 union {
258 struct {
259 IN OUT PLIST_ENTRY ArbitrationList;
260 IN ULONG AllocateFromCount;
261 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
262 } TestAllocation;
263 struct {
264 IN OUT PLIST_ENTRY ArbitrationList;
265 IN ULONG AllocateFromCount;
266 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
267 } RetestAllocation;
268 struct {
269 IN OUT PLIST_ENTRY ArbitrationList;
270 } BootAllocation;
271 struct {
272 OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
273 } QueryAllocatedResources;
274 struct {
275 IN PDEVICE_OBJECT PhysicalDeviceObject;
276 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
277 OUT PULONG ConflictCount;
278 OUT PARBITER_CONFLICT_INFO *Conflicts;
279 } QueryConflict;
280 struct {
281 IN PLIST_ENTRY ArbitrationList;
282 } QueryArbitrate;
283 struct {
284 IN PDEVICE_OBJECT ReserveDevice;
285 } AddReserved;
286 } Parameters;
287 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
288
289 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
290
291 typedef struct _ARBITER_LIST_ENTRY {
292 LIST_ENTRY ListEntry;
293 ULONG AlternativeCount;
294 PIO_RESOURCE_DESCRIPTOR Alternatives;
295 PDEVICE_OBJECT PhysicalDeviceObject;
296 ARBITER_REQUEST_SOURCE RequestSource;
297 ULONG Flags;
298 LONG_PTR WorkSpace;
299 INTERFACE_TYPE InterfaceType;
300 ULONG SlotNumber;
301 ULONG BusNumber;
302 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
303 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
304 ARBITER_RESULT Result;
305 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
306
307 typedef NTSTATUS
308 (NTAPI *PARBITER_HANDLER)(
309 IN OUT PVOID Context,
310 IN ARBITER_ACTION Action,
311 IN OUT PARBITER_PARAMETERS Parameters);
312
313 #define ARBITER_PARTIAL 0x00000001
314
315 typedef struct _ARBITER_INTERFACE {
316 USHORT Size;
317 USHORT Version;
318 PVOID Context;
319 PINTERFACE_REFERENCE InterfaceReference;
320 PINTERFACE_DEREFERENCE InterfaceDereference;
321 PARBITER_HANDLER ArbiterHandler;
322 ULONG Flags;
323 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
324
325 typedef struct _PCI_AGP_CAPABILITY {
326 PCI_CAPABILITIES_HEADER Header;
327 USHORT Minor:4;
328 USHORT Major:4;
329 USHORT Rsvd1:8;
330 struct _PCI_AGP_STATUS {
331 ULONG Rate:3;
332 ULONG Agp3Mode:1;
333 ULONG FastWrite:1;
334 ULONG FourGB:1;
335 ULONG HostTransDisable:1;
336 ULONG Gart64:1;
337 ULONG ITA_Coherent:1;
338 ULONG SideBandAddressing:1;
339 ULONG CalibrationCycle:3;
340 ULONG AsyncRequestSize:3;
341 ULONG Rsvd1:1;
342 ULONG Isoch:1;
343 ULONG Rsvd2:6;
344 ULONG RequestQueueDepthMaximum:8;
345 } AGPStatus;
346 struct _PCI_AGP_COMMAND {
347 ULONG Rate:3;
348 ULONG Rsvd1:1;
349 ULONG FastWriteEnable:1;
350 ULONG FourGBEnable:1;
351 ULONG Rsvd2:1;
352 ULONG Gart64:1;
353 ULONG AGPEnable:1;
354 ULONG SBAEnable:1;
355 ULONG CalibrationCycle:3;
356 ULONG AsyncReqSize:3;
357 ULONG Rsvd3:8;
358 ULONG RequestQueueDepth:8;
359 } AGPCommand;
360 } PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY;
361
362 typedef enum _EXTENDED_AGP_REGISTER {
363 IsochStatus,
364 AgpControl,
365 ApertureSize,
366 AperturePageSize,
367 GartLow,
368 GartHigh,
369 IsochCommand
370 } EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER;
371
372 typedef struct _PCI_AGP_ISOCH_STATUS {
373 ULONG ErrorCode:2;
374 ULONG Rsvd1:1;
375 ULONG Isoch_L:3;
376 ULONG Isoch_Y:2;
377 ULONG Isoch_N:8;
378 ULONG Rsvd2:16;
379 } PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS;
380
381 typedef struct _PCI_AGP_CONTROL {
382 ULONG Rsvd1:7;
383 ULONG GTLB_Enable:1;
384 ULONG AP_Enable:1;
385 ULONG CAL_Disable:1;
386 ULONG Rsvd2:22;
387 } PCI_AGP_CONTROL, *PPCI_AGP_CONTROL;
388
389 typedef struct _PCI_AGP_APERTURE_PAGE_SIZE {
390 USHORT PageSizeMask:11;
391 USHORT Rsvd1:1;
392 USHORT PageSizeSelect:4;
393 } PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE;
394
395 typedef struct _PCI_AGP_ISOCH_COMMAND {
396 USHORT Rsvd1:6;
397 USHORT Isoch_Y:2;
398 USHORT Isoch_N:8;
399 } PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND;
400
401 typedef struct PCI_AGP_EXTENDED_CAPABILITY {
402 PCI_AGP_ISOCH_STATUS IsochStatus;
403 PCI_AGP_CONTROL AgpControl;
404 USHORT ApertureSize;
405 PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize;
406 ULONG GartLow;
407 ULONG GartHigh;
408 PCI_AGP_ISOCH_COMMAND IsochCommand;
409 } PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY;
410
411 #define PCI_AGP_RATE_1X 0x1
412 #define PCI_AGP_RATE_2X 0x2
413 #define PCI_AGP_RATE_4X 0x4
414
415 #define PCIX_MODE_CONVENTIONAL_PCI 0x0
416 #define PCIX_MODE1_66MHZ 0x1
417 #define PCIX_MODE1_100MHZ 0x2
418 #define PCIX_MODE1_133MHZ 0x3
419 #define PCIX_MODE2_266_66MHZ 0x9
420 #define PCIX_MODE2_266_100MHZ 0xA
421 #define PCIX_MODE2_266_133MHZ 0xB
422 #define PCIX_MODE2_533_66MHZ 0xD
423 #define PCIX_MODE2_533_100MHZ 0xE
424 #define PCIX_MODE2_533_133MHZ 0xF
425
426 #define PCIX_VERSION_MODE1_ONLY 0x0
427 #define PCIX_VERSION_MODE2_ECC 0x1
428 #define PCIX_VERSION_DUAL_MODE_ECC 0x2
429
430 typedef struct _PCIX_BRIDGE_CAPABILITY {
431 PCI_CAPABILITIES_HEADER Header;
432 union {
433 struct {
434 USHORT Bus64Bit:1;
435 USHORT Bus133MHzCapable:1;
436 USHORT SplitCompletionDiscarded:1;
437 USHORT UnexpectedSplitCompletion:1;
438 USHORT SplitCompletionOverrun:1;
439 USHORT SplitRequestDelayed:1;
440 USHORT BusModeFrequency:4;
441 USHORT Rsvd:2;
442 USHORT Version:2;
443 USHORT Bus266MHzCapable:1;
444 USHORT Bus533MHzCapable:1;
445 } DUMMYSTRUCTNAME;
446 USHORT AsUSHORT;
447 } SecondaryStatus;
448 union {
449 struct {
450 ULONG FunctionNumber:3;
451 ULONG DeviceNumber:5;
452 ULONG BusNumber:8;
453 ULONG Device64Bit:1;
454 ULONG Device133MHzCapable:1;
455 ULONG SplitCompletionDiscarded:1;
456 ULONG UnexpectedSplitCompletion:1;
457 ULONG SplitCompletionOverrun:1;
458 ULONG SplitRequestDelayed:1;
459 ULONG Rsvd:7;
460 ULONG DIMCapable:1;
461 ULONG Device266MHzCapable:1;
462 ULONG Device533MHzCapable:1;
463 } DUMMYSTRUCTNAME;
464 ULONG AsULONG;
465 } BridgeStatus;
466 USHORT UpstreamSplitTransactionCapacity;
467 USHORT UpstreamSplitTransactionLimit;
468 USHORT DownstreamSplitTransactionCapacity;
469 USHORT DownstreamSplitTransactionLimit;
470 union {
471 struct {
472 ULONG SelectSecondaryRegisters:1;
473 ULONG ErrorPresentInOtherBank:1;
474 ULONG AdditionalCorrectableError:1;
475 ULONG AdditionalUncorrectableError:1;
476 ULONG ErrorPhase:3;
477 ULONG ErrorCorrected:1;
478 ULONG Syndrome:8;
479 ULONG ErrorFirstCommand:4;
480 ULONG ErrorSecondCommand:4;
481 ULONG ErrorUpperAttributes:4;
482 ULONG ControlUpdateEnable:1;
483 ULONG Rsvd:1;
484 ULONG DisableSingleBitCorrection:1;
485 ULONG EccMode:1;
486 } DUMMYSTRUCTNAME;
487 ULONG AsULONG;
488 } EccControlStatus;
489 ULONG EccFirstAddress;
490 ULONG EccSecondAddress;
491 ULONG EccAttribute;
492 } PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY;
493
494 typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY {
495 PCI_CAPABILITIES_HEADER Header;
496 USHORT Reserved;
497 USHORT SubVendorID;
498 USHORT SubSystemID;
499 } PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY;
500
501 #define OSC_FIRMWARE_FAILURE 0x02
502 #define OSC_UNRECOGNIZED_UUID 0x04
503 #define OSC_UNRECOGNIZED_REVISION 0x08
504 #define OSC_CAPABILITIES_MASKED 0x10
505
506 #define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION 0x01
507
508 typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
509 union {
510 struct {
511 ULONG ExtendedConfigOpRegions:1;
512 ULONG ActiveStatePowerManagement:1;
513 ULONG ClockPowerManagement:1;
514 ULONG SegmentGroups:1;
515 ULONG MessageSignaledInterrupts:1;
516 ULONG WindowsHardwareErrorArchitecture:1;
517 ULONG Reserved:26;
518 } DUMMYSTRUCTNAME;
519 ULONG AsULONG;
520 } u;
521 } PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD;
522
523 typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD {
524 union {
525 struct {
526 ULONG ExpressNativeHotPlug:1;
527 ULONG ShpcNativeHotPlug:1;
528 ULONG ExpressNativePME:1;
529 ULONG ExpressAdvancedErrorReporting:1;
530 ULONG ExpressCapabilityStructure:1;
531 ULONG Reserved:27;
532 } DUMMYSTRUCTNAME;
533 ULONG AsULONG;
534 } u;
535 } PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD;
536
537 typedef enum _PCI_HARDWARE_INTERFACE {
538 PciConventional,
539 PciXMode1,
540 PciXMode2,
541 PciExpress
542 } PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE;
543
544 typedef enum {
545 BusWidth32Bits,
546 BusWidth64Bits
547 } PCI_BUS_WIDTH;
548
549 typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
550 PCI_HARDWARE_INTERFACE SecondaryInterface;
551 struct {
552 BOOLEAN BusCapabilitiesFound;
553 ULONG CurrentSpeedAndMode;
554 ULONG SupportedSpeedsAndModes;
555 BOOLEAN DeviceIDMessagingCapable;
556 PCI_BUS_WIDTH SecondaryBusWidth;
557 } DUMMYSTRUCTNAME;
558 PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport;
559 PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest;
560 PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted;
561 } PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY;
562
563 typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
564 struct {
565 USHORT CapabilityVersion:4;
566 USHORT DeviceType:4;
567 USHORT SlotImplemented:1;
568 USHORT InterruptMessageNumber:5;
569 USHORT Rsvd:2;
570 } DUMMYSTRUCTNAME;
571 USHORT AsUSHORT;
572 } PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER;
573
574 typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
575 struct {
576 ULONG MaxPayloadSizeSupported:3;
577 ULONG PhantomFunctionsSupported:2;
578 ULONG ExtendedTagSupported:1;
579 ULONG L0sAcceptableLatency:3;
580 ULONG L1AcceptableLatency:3;
581 ULONG Undefined:3;
582 ULONG RoleBasedErrorReporting:1;
583 ULONG Rsvd1:2;
584 ULONG CapturedSlotPowerLimit:8;
585 ULONG CapturedSlotPowerLimitScale:2;
586 ULONG Rsvd2:4;
587 } DUMMYSTRUCTNAME;
588 ULONG AsULONG;
589 } PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER;
590
591 #define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07;
592
593 typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
594 struct {
595 USHORT CorrectableErrorEnable:1;
596 USHORT NonFatalErrorEnable:1;
597 USHORT FatalErrorEnable:1;
598 USHORT UnsupportedRequestErrorEnable:1;
599 USHORT EnableRelaxedOrder:1;
600 USHORT MaxPayloadSize:3;
601 USHORT ExtendedTagEnable:1;
602 USHORT PhantomFunctionsEnable:1;
603 USHORT AuxPowerEnable:1;
604 USHORT NoSnoopEnable:1;
605 USHORT MaxReadRequestSize:3;
606 USHORT BridgeConfigRetryEnable:1;
607 } DUMMYSTRUCTNAME;
608 USHORT AsUSHORT;
609 } PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER;
610
611 #define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F;
612
613 typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
614 struct {
615 USHORT CorrectableErrorDetected:1;
616 USHORT NonFatalErrorDetected:1;
617 USHORT FatalErrorDetected:1;
618 USHORT UnsupportedRequestDetected:1;
619 USHORT AuxPowerDetected:1;
620 USHORT TransactionsPending:1;
621 USHORT Rsvd:10;
622 } DUMMYSTRUCTNAME;
623 USHORT AsUSHORT;
624 } PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER;
625
626 typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
627 struct {
628 ULONG MaximumLinkSpeed:4;
629 ULONG MaximumLinkWidth:6;
630 ULONG ActiveStatePMSupport:2;
631 ULONG L0sExitLatency:3;
632 ULONG L1ExitLatency:3;
633 ULONG ClockPowerManagement:1;
634 ULONG SurpriseDownErrorReportingCapable:1;
635 ULONG DataLinkLayerActiveReportingCapable:1;
636 ULONG Rsvd:3;
637 ULONG PortNumber:8;
638 } DUMMYSTRUCTNAME;
639 ULONG AsULONG;
640 } PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER;
641
642 typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
643 struct {
644 USHORT ActiveStatePMControl:2;
645 USHORT Rsvd1:1;
646 USHORT ReadCompletionBoundary:1;
647 USHORT LinkDisable:1;
648 USHORT RetrainLink:1;
649 USHORT CommonClockConfig:1;
650 USHORT ExtendedSynch:1;
651 USHORT EnableClockPowerManagement:1;
652 USHORT Rsvd2:7;
653 } DUMMYSTRUCTNAME;
654 USHORT AsUSHORT;
655 } PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER;
656
657 typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
658 struct {
659 USHORT LinkSpeed:4;
660 USHORT LinkWidth:6;
661 USHORT Undefined:1;
662 USHORT LinkTraining:1;
663 USHORT SlotClockConfig:1;
664 USHORT DataLinkLayerActive:1;
665 USHORT Rsvd:2;
666 } DUMMYSTRUCTNAME;
667 USHORT AsUSHORT;
668 } PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER;
669
670 typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
671 struct {
672 ULONG AttentionButtonPresent:1;
673 ULONG PowerControllerPresent:1;
674 ULONG MRLSensorPresent:1;
675 ULONG AttentionIndicatorPresent:1;
676 ULONG PowerIndicatorPresent:1;
677 ULONG HotPlugSurprise:1;
678 ULONG HotPlugCapable:1;
679 ULONG SlotPowerLimit:8;
680 ULONG SlotPowerLimitScale:2;
681 ULONG ElectromechanicalLockPresent:1;
682 ULONG NoCommandCompletedSupport:1;
683 ULONG PhysicalSlotNumber:13;
684 } DUMMYSTRUCTNAME;
685 ULONG AsULONG;
686 } PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER;
687
688 typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
689 struct {
690 USHORT AttentionButtonEnable:1;
691 USHORT PowerFaultDetectEnable:1;
692 USHORT MRLSensorEnable:1;
693 USHORT PresenceDetectEnable:1;
694 USHORT CommandCompletedEnable:1;
695 USHORT HotPlugInterruptEnable:1;
696 USHORT AttentionIndicatorControl:2;
697 USHORT PowerIndicatorControl:2;
698 USHORT PowerControllerControl:1;
699 USHORT ElectromechanicalLockControl:1;
700 USHORT DataLinkStateChangeEnable:1;
701 USHORT Rsvd:3;
702 } DUMMYSTRUCTNAME;
703 USHORT AsUSHORT;
704 } PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER;
705
706 typedef enum _HAL_QUERY_INFORMATION_CLASS {
707 HalInstalledBusInformation,
708 HalProfileSourceInformation,
709 HalInformationClassUnused1,
710 HalPowerInformation,
711 HalProcessorSpeedInformation,
712 HalCallbackInformation,
713 HalMapRegisterInformation,
714 HalMcaLogInformation,
715 HalFrameBufferCachingInformation,
716 HalDisplayBiosInformation,
717 HalProcessorFeatureInformation,
718 HalNumaTopologyInterface,
719 HalErrorInformation,
720 HalCmcLogInformation,
721 HalCpeLogInformation,
722 HalQueryMcaInterface,
723 HalQueryAMLIIllegalIOPortAddresses,
724 HalQueryMaxHotPlugMemoryAddress,
725 HalPartitionIpiInterface,
726 HalPlatformInformation,
727 HalQueryProfileSourceList,
728 HalInitLogInformation,
729 HalFrequencyInformation,
730 HalProcessorBrandString,
731 HalHypervisorInformation,
732 HalPlatformTimerInformation,
733 HalAcpiAuditInformation
734 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
735
736 typedef enum _HAL_SET_INFORMATION_CLASS {
737 HalProfileSourceInterval,
738 HalProfileSourceInterruptHandler,
739 HalMcaRegisterDriver,
740 HalKernelErrorHandler,
741 HalCmcRegisterDriver,
742 HalCpeRegisterDriver,
743 HalMcaLog,
744 HalCmcLog,
745 HalCpeLog,
746 HalGenerateCmcInterrupt,
747 HalProfileSourceTimerHandler,
748 HalEnlightenment,
749 HalProfileDpgoSourceInterruptHandler
750 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
751
752 typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
753 KPROFILE_SOURCE Source;
754 ULONG_PTR Interval;
755 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
756
757 typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
758 KPROFILE_SOURCE Source;
759 BOOLEAN Supported;
760 ULONG Interval;
761 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
762
763 typedef struct _MAP_REGISTER_ENTRY {
764 PVOID MapRegister;
765 BOOLEAN WriteToDevice;
766 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
767
768 typedef struct _DEBUG_DEVICE_ADDRESS {
769 UCHAR Type;
770 BOOLEAN Valid;
771 UCHAR Reserved[2];
772 PUCHAR TranslatedAddress;
773 ULONG Length;
774 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
775
776 typedef struct _DEBUG_MEMORY_REQUIREMENTS {
777 PHYSICAL_ADDRESS Start;
778 PHYSICAL_ADDRESS MaxEnd;
779 PVOID VirtualAddress;
780 ULONG Length;
781 BOOLEAN Cached;
782 BOOLEAN Aligned;
783 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
784
785 typedef struct _DEBUG_DEVICE_DESCRIPTOR {
786 ULONG Bus;
787 ULONG Slot;
788 USHORT Segment;
789 USHORT VendorID;
790 USHORT DeviceID;
791 UCHAR BaseClass;
792 UCHAR SubClass;
793 UCHAR ProgIf;
794 BOOLEAN Initialized;
795 BOOLEAN Configured;
796 DEBUG_DEVICE_ADDRESS BaseAddress[6];
797 DEBUG_MEMORY_REQUIREMENTS Memory;
798 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
799
800 typedef struct _PM_DISPATCH_TABLE {
801 ULONG Signature;
802 ULONG Version;
803 PVOID Function[1];
804 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
805
806 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
807 TranslateChildToParent,
808 TranslateParentToChild
809 } RESOURCE_TRANSLATION_DIRECTION;
810
811 typedef NTSTATUS
812 (NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
813 IN OUT PVOID Context,
814 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
815 IN RESOURCE_TRANSLATION_DIRECTION Direction,
816 IN ULONG AlternativesCount OPTIONAL,
817 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
818 IN PDEVICE_OBJECT PhysicalDeviceObject,
819 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
820
821 typedef NTSTATUS
822 (NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
823 IN PVOID Context OPTIONAL,
824 IN PIO_RESOURCE_DESCRIPTOR Source,
825 IN PDEVICE_OBJECT PhysicalDeviceObject,
826 OUT PULONG TargetCount,
827 OUT PIO_RESOURCE_DESCRIPTOR *Target);
828
829 typedef struct _TRANSLATOR_INTERFACE {
830 USHORT Size;
831 USHORT Version;
832 PVOID Context;
833 PINTERFACE_REFERENCE InterfaceReference;
834 PINTERFACE_DEREFERENCE InterfaceDereference;
835 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
836 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
837 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
838
839 typedef VOID
840 (FASTCALL *pHalExamineMBR)(
841 IN PDEVICE_OBJECT DeviceObject,
842 IN ULONG SectorSize,
843 IN ULONG MBRTypeIdentifier,
844 OUT PVOID *Buffer);
845
846 typedef NTSTATUS
847 (FASTCALL *pHalIoReadPartitionTable)(
848 IN PDEVICE_OBJECT DeviceObject,
849 IN ULONG SectorSize,
850 IN BOOLEAN ReturnRecognizedPartitions,
851 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
852
853 typedef NTSTATUS
854 (FASTCALL *pHalIoSetPartitionInformation)(
855 IN PDEVICE_OBJECT DeviceObject,
856 IN ULONG SectorSize,
857 IN ULONG PartitionNumber,
858 IN ULONG PartitionType);
859
860 typedef NTSTATUS
861 (FASTCALL *pHalIoWritePartitionTable)(
862 IN PDEVICE_OBJECT DeviceObject,
863 IN ULONG SectorSize,
864 IN ULONG SectorsPerTrack,
865 IN ULONG NumberOfHeads,
866 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
867
868 typedef PBUS_HANDLER
869 (FASTCALL *pHalHandlerForBus)(
870 IN INTERFACE_TYPE InterfaceType,
871 IN ULONG BusNumber);
872
873 typedef VOID
874 (FASTCALL *pHalReferenceBusHandler)(
875 IN PBUS_HANDLER BusHandler);
876
877 typedef NTSTATUS
878 (NTAPI *pHalQuerySystemInformation)(
879 IN HAL_QUERY_INFORMATION_CLASS InformationClass,
880 IN ULONG BufferSize,
881 IN OUT PVOID Buffer,
882 OUT PULONG ReturnedLength);
883
884 typedef NTSTATUS
885 (NTAPI *pHalSetSystemInformation)(
886 IN HAL_SET_INFORMATION_CLASS InformationClass,
887 IN ULONG BufferSize,
888 IN PVOID Buffer);
889
890 typedef NTSTATUS
891 (NTAPI *pHalQueryBusSlots)(
892 IN PBUS_HANDLER BusHandler,
893 IN ULONG BufferSize,
894 OUT PULONG SlotNumbers,
895 OUT PULONG ReturnedLength);
896
897 typedef NTSTATUS
898 (NTAPI *pHalInitPnpDriver)(
899 VOID);
900
901 typedef NTSTATUS
902 (NTAPI *pHalInitPowerManagement)(
903 IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
904 OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
905
906 typedef struct _DMA_ADAPTER*
907 (NTAPI *pHalGetDmaAdapter)(
908 IN PVOID Context,
909 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
910 OUT PULONG NumberOfMapRegisters);
911
912 typedef NTSTATUS
913 (NTAPI *pHalGetInterruptTranslator)(
914 IN INTERFACE_TYPE ParentInterfaceType,
915 IN ULONG ParentBusNumber,
916 IN INTERFACE_TYPE BridgeInterfaceType,
917 IN USHORT Size,
918 IN USHORT Version,
919 OUT PTRANSLATOR_INTERFACE Translator,
920 OUT PULONG BridgeBusNumber);
921
922 typedef NTSTATUS
923 (NTAPI *pHalStartMirroring)(
924 VOID);
925
926 typedef NTSTATUS
927 (NTAPI *pHalEndMirroring)(
928 IN ULONG PassNumber);
929
930 typedef NTSTATUS
931 (NTAPI *pHalMirrorPhysicalMemory)(
932 IN PHYSICAL_ADDRESS PhysicalAddress,
933 IN LARGE_INTEGER NumberOfBytes);
934
935 typedef NTSTATUS
936 (NTAPI *pHalMirrorVerify)(
937 IN PHYSICAL_ADDRESS PhysicalAddress,
938 IN LARGE_INTEGER NumberOfBytes);
939
940 typedef VOID
941 (NTAPI *pHalEndOfBoot)(
942 VOID);
943
944 typedef
945 BOOLEAN
946 (NTAPI *pHalTranslateBusAddress)(
947 IN INTERFACE_TYPE InterfaceType,
948 IN ULONG BusNumber,
949 IN PHYSICAL_ADDRESS BusAddress,
950 IN OUT PULONG AddressSpace,
951 OUT PPHYSICAL_ADDRESS TranslatedAddress);
952
953 typedef
954 NTSTATUS
955 (NTAPI *pHalAssignSlotResources)(
956 IN PUNICODE_STRING RegistryPath,
957 IN PUNICODE_STRING DriverClassName OPTIONAL,
958 IN PDRIVER_OBJECT DriverObject,
959 IN PDEVICE_OBJECT DeviceObject,
960 IN INTERFACE_TYPE BusType,
961 IN ULONG BusNumber,
962 IN ULONG SlotNumber,
963 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
964
965 typedef
966 VOID
967 (NTAPI *pHalHaltSystem)(
968 VOID);
969
970 typedef
971 BOOLEAN
972 (NTAPI *pHalResetDisplay)(
973 VOID);
974
975 typedef
976 UCHAR
977 (NTAPI *pHalVectorToIDTEntry)(
978 ULONG Vector);
979
980 typedef
981 BOOLEAN
982 (NTAPI *pHalFindBusAddressTranslation)(
983 IN PHYSICAL_ADDRESS BusAddress,
984 IN OUT PULONG AddressSpace,
985 OUT PPHYSICAL_ADDRESS TranslatedAddress,
986 IN OUT PULONG_PTR Context,
987 IN BOOLEAN NextBus);
988
989 typedef
990 NTSTATUS
991 (NTAPI *pKdSetupPciDeviceForDebugging)(
992 IN PVOID LoaderBlock OPTIONAL,
993 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
994
995 typedef
996 NTSTATUS
997 (NTAPI *pKdReleasePciDeviceForDebugging)(
998 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
999
1000 typedef
1001 PVOID
1002 (NTAPI *pKdGetAcpiTablePhase0)(
1003 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
1004 IN ULONG Signature);
1005
1006 typedef
1007 PVOID
1008 (NTAPI *pHalGetAcpiTable)(
1009 IN ULONG Signature,
1010 IN PCSTR OemId OPTIONAL,
1011 IN PCSTR OemTableId OPTIONAL);
1012
1013 typedef
1014 VOID
1015 (NTAPI *pKdCheckPowerButton)(
1016 VOID);
1017
1018 #if (NTDDI_VERSION >= NTDDI_VISTA)
1019 typedef
1020 PVOID
1021 (NTAPI *pKdMapPhysicalMemory64)(
1022 IN PHYSICAL_ADDRESS PhysicalAddress,
1023 IN ULONG NumberPages,
1024 IN BOOLEAN FlushCurrentTLB);
1025
1026 typedef
1027 VOID
1028 (NTAPI *pKdUnmapVirtualAddress)(
1029 IN PVOID VirtualAddress,
1030 IN ULONG NumberPages,
1031 IN BOOLEAN FlushCurrentTLB);
1032 #else
1033 typedef
1034 PVOID
1035 (NTAPI *pKdMapPhysicalMemory64)(
1036 IN PHYSICAL_ADDRESS PhysicalAddress,
1037 IN ULONG NumberPages);
1038
1039 typedef
1040 VOID
1041 (NTAPI *pKdUnmapVirtualAddress)(
1042 IN PVOID VirtualAddress,
1043 IN ULONG NumberPages);
1044 #endif
1045
1046
1047 typedef
1048 ULONG
1049 (NTAPI *pKdGetPciDataByOffset)(
1050 IN ULONG BusNumber,
1051 IN ULONG SlotNumber,
1052 OUT PVOID Buffer,
1053 IN ULONG Offset,
1054 IN ULONG Length);
1055
1056 typedef
1057 ULONG
1058 (NTAPI *pKdSetPciDataByOffset)(
1059 IN ULONG BusNumber,
1060 IN ULONG SlotNumber,
1061 IN PVOID Buffer,
1062 IN ULONG Offset,
1063 IN ULONG Length);
1064
1065 typedef BOOLEAN
1066 (NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
1067 IN ULONG Columns,
1068 IN ULONG Rows);
1069
1070 typedef
1071 VOID
1072 (NTAPI *PCI_ERROR_HANDLER_CALLBACK)(
1073 VOID);
1074
1075 typedef
1076 VOID
1077 (NTAPI *pHalSetPciErrorHandlerCallback)(
1078 IN PCI_ERROR_HANDLER_CALLBACK Callback);
1079
1080 #if 1 /* Not present in WDK 7600 */
1081 typedef VOID
1082 (FASTCALL *pHalIoAssignDriveLetters)(
1083 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
1084 IN PSTRING NtDeviceName,
1085 OUT PUCHAR NtSystemPath,
1086 OUT PSTRING NtSystemPathString);
1087 #endif
1088
1089 typedef struct {
1090 ULONG Version;
1091 pHalQuerySystemInformation HalQuerySystemInformation;
1092 pHalSetSystemInformation HalSetSystemInformation;
1093 pHalQueryBusSlots HalQueryBusSlots;
1094 ULONG Spare1;
1095 pHalExamineMBR HalExamineMBR;
1096 #if 1 /* Not present in WDK 7600 */
1097 pHalIoAssignDriveLetters HalIoAssignDriveLetters;
1098 #endif
1099 pHalIoReadPartitionTable HalIoReadPartitionTable;
1100 pHalIoSetPartitionInformation HalIoSetPartitionInformation;
1101 pHalIoWritePartitionTable HalIoWritePartitionTable;
1102 pHalHandlerForBus HalReferenceHandlerForBus;
1103 pHalReferenceBusHandler HalReferenceBusHandler;
1104 pHalReferenceBusHandler HalDereferenceBusHandler;
1105 pHalInitPnpDriver HalInitPnpDriver;
1106 pHalInitPowerManagement HalInitPowerManagement;
1107 pHalGetDmaAdapter HalGetDmaAdapter;
1108 pHalGetInterruptTranslator HalGetInterruptTranslator;
1109 pHalStartMirroring HalStartMirroring;
1110 pHalEndMirroring HalEndMirroring;
1111 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
1112 pHalEndOfBoot HalEndOfBoot;
1113 pHalMirrorVerify HalMirrorVerify;
1114 pHalGetAcpiTable HalGetCachedAcpiTable;
1115 pHalSetPciErrorHandlerCallback HalSetPciErrorHandlerCallback;
1116 #if defined(_IA64_)
1117 pHalGetErrorCapList HalGetErrorCapList;
1118 pHalInjectError HalInjectError;
1119 #endif
1120 } HAL_DISPATCH, *PHAL_DISPATCH;
1121
1122 /* GCC/MSVC and WDK compatible declaration */
1123 extern NTKERNELAPI HAL_DISPATCH HalDispatchTable;
1124
1125 #if defined(_NTOSKRNL_) || defined(_BLDR_)
1126 #define HALDISPATCH (&HalDispatchTable)
1127 #else
1128 /* This is a WDK compatibility definition */
1129 #define HalDispatchTable (&HalDispatchTable)
1130 #define HALDISPATCH HalDispatchTable
1131 #endif
1132
1133 #define HAL_DISPATCH_VERSION 3 /* FIXME: when to use 4? */
1134 #define HalDispatchTableVersion HALDISPATCH->Version
1135 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
1136 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
1137 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
1138 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
1139 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
1140 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
1141 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
1142 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
1143 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
1144 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
1145 #define HalStartMirroring HALDISPATCH->HalStartMirroring
1146 #define HalEndMirroring HALDISPATCH->HalEndMirroring
1147 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
1148 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
1149 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
1150
1151 typedef struct _FILE_ALIGNMENT_INFORMATION {
1152 ULONG AlignmentRequirement;
1153 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
1154
1155 typedef struct _FILE_NAME_INFORMATION {
1156 ULONG FileNameLength;
1157 WCHAR FileName[1];
1158 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1159
1160
1161 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
1162 ULONG FileAttributes;
1163 ULONG ReparseTag;
1164 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
1165
1166 typedef struct _FILE_DISPOSITION_INFORMATION {
1167 BOOLEAN DeleteFile;
1168 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
1169
1170 typedef struct _FILE_END_OF_FILE_INFORMATION {
1171 LARGE_INTEGER EndOfFile;
1172 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
1173
1174 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
1175 LARGE_INTEGER ValidDataLength;
1176 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
1177
1178 typedef union _FILE_SEGMENT_ELEMENT {
1179 PVOID64 Buffer;
1180 ULONGLONG Alignment;
1181 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
1182
1183 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
1184
1185 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1186 NTSYSAPI
1187 ULONGLONG
1188 NTAPI
1189 VerSetConditionMask(
1190 IN ULONGLONG ConditionMask,
1191 IN ULONG TypeMask,
1192 IN UCHAR Condition);
1193 #endif
1194
1195 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
1196 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
1197 (TypeBitMask), (ComparisonType)))
1198
1199 /* RtlVerifyVersionInfo() TypeMask */
1200
1201 #define VER_MINORVERSION 0x0000001
1202 #define VER_MAJORVERSION 0x0000002
1203 #define VER_BUILDNUMBER 0x0000004
1204 #define VER_PLATFORMID 0x0000008
1205 #define VER_SERVICEPACKMINOR 0x0000010
1206 #define VER_SERVICEPACKMAJOR 0x0000020
1207 #define VER_SUITENAME 0x0000040
1208 #define VER_PRODUCT_TYPE 0x0000080
1209
1210 /* RtlVerifyVersionInfo() ComparisonType */
1211
1212 #define VER_EQUAL 1
1213 #define VER_GREATER 2
1214 #define VER_GREATER_EQUAL 3
1215 #define VER_LESS 4
1216 #define VER_LESS_EQUAL 5
1217 #define VER_AND 6
1218 #define VER_OR 7
1219
1220 #define VER_CONDITION_MASK 7
1221 #define VER_NUM_BITS_PER_CONDITION_MASK 3
1222
1223 typedef struct _IMAGE_INFO {
1224 _ANONYMOUS_UNION union {
1225 ULONG Properties;
1226 _ANONYMOUS_STRUCT struct {
1227 ULONG ImageAddressingMode:8;
1228 ULONG SystemModeImage:1;
1229 ULONG ImageMappedToAllPids:1;
1230 ULONG ExtendedInfoPresent:1;
1231 ULONG Reserved:22;
1232 } DUMMYSTRUCTNAME;
1233 } DUMMYUNIONNAME;
1234 PVOID ImageBase;
1235 ULONG ImageSelector;
1236 SIZE_T ImageSize;
1237 ULONG ImageSectionNumber;
1238 } IMAGE_INFO, *PIMAGE_INFO;
1239
1240 #define IMAGE_ADDRESSING_MODE_32BIT 3
1241
1242 typedef enum _BUS_DATA_TYPE {
1243 ConfigurationSpaceUndefined = -1,
1244 Cmos,
1245 EisaConfiguration,
1246 Pos,
1247 CbusConfiguration,
1248 PCIConfiguration,
1249 VMEConfiguration,
1250 NuBusConfiguration,
1251 PCMCIAConfiguration,
1252 MPIConfiguration,
1253 MPSAConfiguration,
1254 PNPISAConfiguration,
1255 SgiInternalConfiguration,
1256 MaximumBusDataType
1257 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
1258
1259 typedef struct _NT_TIB {
1260 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
1261 PVOID StackBase;
1262 PVOID StackLimit;
1263 PVOID SubSystemTib;
1264 _ANONYMOUS_UNION union {
1265 PVOID FiberData;
1266 ULONG Version;
1267 } DUMMYUNIONNAME;
1268 PVOID ArbitraryUserPointer;
1269 struct _NT_TIB *Self;
1270 } NT_TIB, *PNT_TIB;
1271
1272 typedef struct _NT_TIB32 {
1273 ULONG ExceptionList;
1274 ULONG StackBase;
1275 ULONG StackLimit;
1276 ULONG SubSystemTib;
1277 __GNU_EXTENSION union {
1278 ULONG FiberData;
1279 ULONG Version;
1280 };
1281 ULONG ArbitraryUserPointer;
1282 ULONG Self;
1283 } NT_TIB32,*PNT_TIB32;
1284
1285 typedef struct _NT_TIB64 {
1286 ULONG64 ExceptionList;
1287 ULONG64 StackBase;
1288 ULONG64 StackLimit;
1289 ULONG64 SubSystemTib;
1290 __GNU_EXTENSION union {
1291 ULONG64 FiberData;
1292 ULONG Version;
1293 };
1294 ULONG64 ArbitraryUserPointer;
1295 ULONG64 Self;
1296 } NT_TIB64,*PNT_TIB64;
1297
1298 typedef enum _PROCESSINFOCLASS {
1299 ProcessBasicInformation,
1300 ProcessQuotaLimits,
1301 ProcessIoCounters,
1302 ProcessVmCounters,
1303 ProcessTimes,
1304 ProcessBasePriority,
1305 ProcessRaisePriority,
1306 ProcessDebugPort,
1307 ProcessExceptionPort,
1308 ProcessAccessToken,
1309 ProcessLdtInformation,
1310 ProcessLdtSize,
1311 ProcessDefaultHardErrorMode,
1312 ProcessIoPortHandlers,
1313 ProcessPooledUsageAndLimits,
1314 ProcessWorkingSetWatch,
1315 ProcessUserModeIOPL,
1316 ProcessEnableAlignmentFaultFixup,
1317 ProcessPriorityClass,
1318 ProcessWx86Information,
1319 ProcessHandleCount,
1320 ProcessAffinityMask,
1321 ProcessPriorityBoost,
1322 ProcessDeviceMap,
1323 ProcessSessionInformation,
1324 ProcessForegroundInformation,
1325 ProcessWow64Information,
1326 ProcessImageFileName,
1327 ProcessLUIDDeviceMapsEnabled,
1328 ProcessBreakOnTermination,
1329 ProcessDebugObjectHandle,
1330 ProcessDebugFlags,
1331 ProcessHandleTracing,
1332 ProcessIoPriority,
1333 ProcessExecuteFlags,
1334 ProcessTlsInformation,
1335 ProcessCookie,
1336 ProcessImageInformation,
1337 ProcessCycleTime,
1338 ProcessPagePriority,
1339 ProcessInstrumentationCallback,
1340 ProcessThreadStackAllocation,
1341 ProcessWorkingSetWatchEx,
1342 ProcessImageFileNameWin32,
1343 ProcessImageFileMapping,
1344 ProcessAffinityUpdateMode,
1345 ProcessMemoryAllocationMode,
1346 ProcessGroupInformation,
1347 ProcessTokenVirtualizationEnabled,
1348 ProcessConsoleHostProcess,
1349 ProcessWindowInformation,
1350 MaxProcessInfoClass
1351 } PROCESSINFOCLASS;
1352
1353 typedef enum _THREADINFOCLASS {
1354 ThreadBasicInformation,
1355 ThreadTimes,
1356 ThreadPriority,
1357 ThreadBasePriority,
1358 ThreadAffinityMask,
1359 ThreadImpersonationToken,
1360 ThreadDescriptorTableEntry,
1361 ThreadEnableAlignmentFaultFixup,
1362 ThreadEventPair_Reusable,
1363 ThreadQuerySetWin32StartAddress,
1364 ThreadZeroTlsCell,
1365 ThreadPerformanceCount,
1366 ThreadAmILastThread,
1367 ThreadIdealProcessor,
1368 ThreadPriorityBoost,
1369 ThreadSetTlsArrayAddress,
1370 ThreadIsIoPending,
1371 ThreadHideFromDebugger,
1372 ThreadBreakOnTermination,
1373 ThreadSwitchLegacyState,
1374 ThreadIsTerminated,
1375 ThreadLastSystemCall,
1376 ThreadIoPriority,
1377 ThreadCycleTime,
1378 ThreadPagePriority,
1379 ThreadActualBasePriority,
1380 ThreadTebInformation,
1381 ThreadCSwitchMon,
1382 ThreadCSwitchPmu,
1383 ThreadWow64Context,
1384 ThreadGroupInformation,
1385 ThreadUmsInformation,
1386 ThreadCounterProfiling,
1387 ThreadIdealProcessorEx,
1388 MaxThreadInfoClass
1389 } THREADINFOCLASS;
1390
1391 typedef struct _PROCESS_BASIC_INFORMATION {
1392 NTSTATUS ExitStatus;
1393 struct _PEB *PebBaseAddress;
1394 ULONG_PTR AffinityMask;
1395 KPRIORITY BasePriority;
1396 ULONG_PTR UniqueProcessId;
1397 ULONG_PTR InheritedFromUniqueProcessId;
1398 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
1399
1400 typedef struct _PROCESS_WS_WATCH_INFORMATION {
1401 PVOID FaultingPc;
1402 PVOID FaultingVa;
1403 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
1404
1405 typedef struct _PROCESS_DEVICEMAP_INFORMATION {
1406 __GNU_EXTENSION union {
1407 struct {
1408 HANDLE DirectoryHandle;
1409 } Set;
1410 struct {
1411 ULONG DriveMap;
1412 UCHAR DriveType[32];
1413 } Query;
1414 };
1415 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
1416
1417 typedef struct _KERNEL_USER_TIMES {
1418 LARGE_INTEGER CreateTime;
1419 LARGE_INTEGER ExitTime;
1420 LARGE_INTEGER KernelTime;
1421 LARGE_INTEGER UserTime;
1422 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
1423
1424 typedef struct _PROCESS_ACCESS_TOKEN {
1425 HANDLE Token;
1426 HANDLE Thread;
1427 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
1428
1429 typedef struct _PROCESS_SESSION_INFORMATION {
1430 ULONG SessionId;
1431 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
1432
1433 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
1434 IoQueryDeviceIdentifier = 0,
1435 IoQueryDeviceConfigurationData,
1436 IoQueryDeviceComponentInformation,
1437 IoQueryDeviceMaxData
1438 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
1439
1440 typedef struct _DISK_SIGNATURE {
1441 ULONG PartitionStyle;
1442 _ANONYMOUS_UNION union {
1443 struct {
1444 ULONG Signature;
1445 ULONG CheckSum;
1446 } Mbr;
1447 struct {
1448 GUID DiskId;
1449 } Gpt;
1450 } DUMMYUNIONNAME;
1451 } DISK_SIGNATURE, *PDISK_SIGNATURE;
1452
1453 typedef ULONG_PTR
1454 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
1455 IN PVOID Context);
1456
1457 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
1458 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
1459 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
1460 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
1461
1462 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
1463 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
1464 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
1465 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
1466 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
1467
1468 typedef VOID
1469 (NTAPI *PTIMER_APC_ROUTINE)(
1470 IN PVOID TimerContext,
1471 IN ULONG TimerLowValue,
1472 IN LONG TimerHighValue);
1473
1474 typedef struct _KUSER_SHARED_DATA
1475 {
1476 ULONG TickCountLowDeprecated;
1477 ULONG TickCountMultiplier;
1478 volatile KSYSTEM_TIME InterruptTime;
1479 volatile KSYSTEM_TIME SystemTime;
1480 volatile KSYSTEM_TIME TimeZoneBias;
1481 USHORT ImageNumberLow;
1482 USHORT ImageNumberHigh;
1483 WCHAR NtSystemRoot[260];
1484 ULONG MaxStackTraceDepth;
1485 ULONG CryptoExponent;
1486 ULONG TimeZoneId;
1487 ULONG LargePageMinimum;
1488 ULONG Reserved2[7];
1489 NT_PRODUCT_TYPE NtProductType;
1490 BOOLEAN ProductTypeIsValid;
1491 ULONG NtMajorVersion;
1492 ULONG NtMinorVersion;
1493 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
1494 ULONG Reserved1;
1495 ULONG Reserved3;
1496 volatile ULONG TimeSlip;
1497 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
1498 ULONG AltArchitecturePad[1];
1499 LARGE_INTEGER SystemExpirationDate;
1500 ULONG SuiteMask;
1501 BOOLEAN KdDebuggerEnabled;
1502 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1503 UCHAR NXSupportPolicy;
1504 #endif
1505 volatile ULONG ActiveConsoleId;
1506 volatile ULONG DismountCount;
1507 ULONG ComPlusPackage;
1508 ULONG LastSystemRITEventTickCount;
1509 ULONG NumberOfPhysicalPages;
1510 BOOLEAN SafeBootMode;
1511 #if (NTDDI_VERSION >= NTDDI_WIN7)
1512 union {
1513 UCHAR TscQpcData;
1514 struct {
1515 UCHAR TscQpcEnabled:1;
1516 UCHAR TscQpcSpareFlag:1;
1517 UCHAR TscQpcShift:6;
1518 } DUMMYSTRUCTNAME;
1519 } DUMMYUNIONNAME;
1520 UCHAR TscQpcPad[2];
1521 #endif
1522 #if (NTDDI_VERSION >= NTDDI_VISTA)
1523 union {
1524 ULONG SharedDataFlags;
1525 struct {
1526 ULONG DbgErrorPortPresent:1;
1527 ULONG DbgElevationEnabled:1;
1528 ULONG DbgVirtEnabled:1;
1529 ULONG DbgInstallerDetectEnabled:1;
1530 ULONG DbgSystemDllRelocated:1;
1531 ULONG DbgDynProcessorEnabled:1;
1532 ULONG DbgSEHValidationEnabled:1;
1533 ULONG SpareBits:25;
1534 } DUMMYSTRUCTNAME2;
1535 } DUMMYUNIONNAME2;
1536 #else
1537 ULONG TraceLogging;
1538 #endif
1539 ULONG DataFlagsPad[1];
1540 ULONGLONG TestRetInstruction;
1541 ULONG SystemCall;
1542 ULONG SystemCallReturn;
1543 ULONGLONG SystemCallPad[3];
1544 _ANONYMOUS_UNION union {
1545 volatile KSYSTEM_TIME TickCount;
1546 volatile ULONG64 TickCountQuad;
1547 _ANONYMOUS_STRUCT struct {
1548 ULONG ReservedTickCountOverlay[3];
1549 ULONG TickCountPad[1];
1550 } DUMMYSTRUCTNAME;
1551 } DUMMYUNIONNAME3;
1552 ULONG Cookie;
1553 ULONG CookiePad[1];
1554 #if (NTDDI_VERSION >= NTDDI_WS03)
1555 LONGLONG ConsoleSessionForegroundProcessId;
1556 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
1557 #endif
1558 #if (NTDDI_VERSION >= NTDDI_VISTA)
1559 #if (NTDDI_VERSION >= NTDDI_WIN7)
1560 USHORT UserModeGlobalLogger[16];
1561 #else
1562 USHORT UserModeGlobalLogger[8];
1563 ULONG HeapTracingPid[2];
1564 ULONG CritSecTracingPid[2];
1565 #endif
1566 ULONG ImageFileExecutionOptions;
1567 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
1568 ULONG LangGenerationCount;
1569 #else
1570 /* 4 bytes padding */
1571 #endif
1572 ULONGLONG Reserved5;
1573 volatile ULONG64 InterruptTimeBias;
1574 #endif
1575 #if (NTDDI_VERSION >= NTDDI_WIN7)
1576 volatile ULONG64 TscQpcBias;
1577 volatile ULONG ActiveProcessorCount;
1578 volatile USHORT ActiveGroupCount;
1579 USHORT Reserved4;
1580 volatile ULONG AitSamplingValue;
1581 volatile ULONG AppCompatFlag;
1582 ULONGLONG SystemDllNativeRelocation;
1583 ULONG SystemDllWowRelocation;
1584 ULONG XStatePad[1];
1585 XSTATE_CONFIGURATION XState;
1586 #endif
1587 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
1588
1589 extern NTKERNELAPI PVOID MmHighestUserAddress;
1590 extern NTKERNELAPI PVOID MmSystemRangeStart;
1591 extern NTKERNELAPI ULONG MmUserProbeAddress;
1592
1593
1594 #ifdef _X86_
1595
1596 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
1597 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
1598 #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
1599 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
1600 extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
1601 #else
1602 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
1603 #endif
1604 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
1605 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
1606 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
1607 #if !defined (_X86PAE_)
1608 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
1609 #else
1610 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
1611 #endif
1612
1613 #define KeGetPcr() PCR
1614
1615 #define KERNEL_STACK_SIZE 12288
1616 #define KERNEL_LARGE_STACK_SIZE 61440
1617 #define KERNEL_LARGE_STACK_COMMIT 12288
1618
1619 #define SIZE_OF_80387_REGISTERS 80
1620
1621 #define PCR_MINOR_VERSION 1
1622 #define PCR_MAJOR_VERSION 1
1623
1624 #if !defined(RC_INVOKED)
1625
1626 #define CONTEXT_i386 0x10000
1627 #define CONTEXT_i486 0x10000
1628 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
1629 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
1630 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
1631 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
1632 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
1633 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
1634
1635 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
1636
1637 #endif /* !defined(RC_INVOKED) */
1638
1639 typedef struct _KPCR {
1640 union {
1641 NT_TIB NtTib;
1642 struct {
1643 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
1644 PVOID Used_StackBase;
1645 PVOID Spare2;
1646 PVOID TssCopy;
1647 ULONG ContextSwitches;
1648 KAFFINITY SetMemberCopy;
1649 PVOID Used_Self;
1650 };
1651 };
1652 struct _KPCR *SelfPcr;
1653 struct _KPRCB *Prcb;
1654 KIRQL Irql;
1655 ULONG IRR;
1656 ULONG IrrActive;
1657 ULONG IDR;
1658 PVOID KdVersionBlock;
1659 struct _KIDTENTRY *IDT;
1660 struct _KGDTENTRY *GDT;
1661 struct _KTSS *TSS;
1662 USHORT MajorVersion;
1663 USHORT MinorVersion;
1664 KAFFINITY SetMember;
1665 ULONG StallScaleFactor;
1666 UCHAR SpareUnused;
1667 UCHAR Number;
1668 UCHAR Spare0;
1669 UCHAR SecondLevelCacheAssociativity;
1670 ULONG VdmAlert;
1671 ULONG KernelReserved[14];
1672 ULONG SecondLevelCacheSize;
1673 ULONG HalReserved[16];
1674 } KPCR, *PKPCR;
1675
1676 FORCEINLINE
1677 ULONG
1678 KeGetCurrentProcessorNumber(VOID)
1679 {
1680 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
1681 }
1682
1683 typedef struct _FLOATING_SAVE_AREA {
1684 ULONG ControlWord;
1685 ULONG StatusWord;
1686 ULONG TagWord;
1687 ULONG ErrorOffset;
1688 ULONG ErrorSelector;
1689 ULONG DataOffset;
1690 ULONG DataSelector;
1691 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
1692 ULONG Cr0NpxState;
1693 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
1694
1695 #include "pshpack4.h"
1696 typedef struct _CONTEXT {
1697 ULONG ContextFlags;
1698 ULONG Dr0;
1699 ULONG Dr1;
1700 ULONG Dr2;
1701 ULONG Dr3;
1702 ULONG Dr6;
1703 ULONG Dr7;
1704 FLOATING_SAVE_AREA FloatSave;
1705 ULONG SegGs;
1706 ULONG SegFs;
1707 ULONG SegEs;
1708 ULONG SegDs;
1709 ULONG Edi;
1710 ULONG Esi;
1711 ULONG Ebx;
1712 ULONG Edx;
1713 ULONG Ecx;
1714 ULONG Eax;
1715 ULONG Ebp;
1716 ULONG Eip;
1717 ULONG SegCs;
1718 ULONG EFlags;
1719 ULONG Esp;
1720 ULONG SegSs;
1721 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
1722 } CONTEXT;
1723 #include "poppack.h"
1724
1725 #endif /* _X86_ */
1726
1727 #ifdef _AMD64_
1728
1729 #define PTI_SHIFT 12L
1730 #define PDI_SHIFT 21L
1731 #define PPI_SHIFT 30L
1732 #define PXI_SHIFT 39L
1733 #define PTE_PER_PAGE 512
1734 #define PDE_PER_PAGE 512
1735 #define PPE_PER_PAGE 512
1736 #define PXE_PER_PAGE 512
1737 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
1738 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
1739 #define PPI_MASK (PPE_PER_PAGE - 1)
1740 #define PXI_MASK (PXE_PER_PAGE - 1)
1741
1742 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
1743 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
1744 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
1745 #define PDE_BASE 0xFFFFF6FB40000000ULL
1746 #define PTE_BASE 0xFFFFF68000000000ULL
1747 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
1748 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
1749 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
1750 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
1751
1752 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
1753 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
1754 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
1755 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
1756 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
1757 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
1758
1759 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
1760 ULONG64 P1Home;
1761 ULONG64 P2Home;
1762 ULONG64 P3Home;
1763 ULONG64 P4Home;
1764 ULONG64 P5Home;
1765 ULONG64 P6Home;
1766
1767 /* Control flags */
1768 ULONG ContextFlags;
1769 ULONG MxCsr;
1770
1771 /* Segment */
1772 USHORT SegCs;
1773 USHORT SegDs;
1774 USHORT SegEs;
1775 USHORT SegFs;
1776 USHORT SegGs;
1777 USHORT SegSs;
1778 ULONG EFlags;
1779
1780 /* Debug */
1781 ULONG64 Dr0;
1782 ULONG64 Dr1;
1783 ULONG64 Dr2;
1784 ULONG64 Dr3;
1785 ULONG64 Dr6;
1786 ULONG64 Dr7;
1787
1788 /* Integer */
1789 ULONG64 Rax;
1790 ULONG64 Rcx;
1791 ULONG64 Rdx;
1792 ULONG64 Rbx;
1793 ULONG64 Rsp;
1794 ULONG64 Rbp;
1795 ULONG64 Rsi;
1796 ULONG64 Rdi;
1797 ULONG64 R8;
1798 ULONG64 R9;
1799 ULONG64 R10;
1800 ULONG64 R11;
1801 ULONG64 R12;
1802 ULONG64 R13;
1803 ULONG64 R14;
1804 ULONG64 R15;
1805
1806 /* Counter */
1807 ULONG64 Rip;
1808
1809 /* Floating point */
1810 union {
1811 XMM_SAVE_AREA32 FltSave;
1812 struct {
1813 M128A Header[2];
1814 M128A Legacy[8];
1815 M128A Xmm0;
1816 M128A Xmm1;
1817 M128A Xmm2;
1818 M128A Xmm3;
1819 M128A Xmm4;
1820 M128A Xmm5;
1821 M128A Xmm6;
1822 M128A Xmm7;
1823 M128A Xmm8;
1824 M128A Xmm9;
1825 M128A Xmm10;
1826 M128A Xmm11;
1827 M128A Xmm12;
1828 M128A Xmm13;
1829 M128A Xmm14;
1830 M128A Xmm15;
1831 } DUMMYSTRUCTNAME;
1832 } DUMMYUNIONNAME;
1833
1834 /* Vector */
1835 M128A VectorRegister[26];
1836 ULONG64 VectorControl;
1837
1838 /* Debug control */
1839 ULONG64 DebugControl;
1840 ULONG64 LastBranchToRip;
1841 ULONG64 LastBranchFromRip;
1842 ULONG64 LastExceptionToRip;
1843 ULONG64 LastExceptionFromRip;
1844 } CONTEXT;
1845
1846 typedef struct _KPCR
1847 {
1848 _ANONYMOUS_UNION union
1849 {
1850 NT_TIB NtTib;
1851 _ANONYMOUS_STRUCT struct
1852 {
1853 union _KGDTENTRY64 *GdtBase;
1854 struct _KTSS64 *TssBase;
1855 ULONG64 UserRsp;
1856 struct _KPCR *Self;
1857 struct _KPRCB *CurrentPrcb;
1858 PKSPIN_LOCK_QUEUE LockArray;
1859 PVOID Used_Self;
1860 };
1861 };
1862 union _KIDTENTRY64 *IdtBase;
1863 ULONG64 Unused[2];
1864 KIRQL Irql;
1865 UCHAR SecondLevelCacheAssociativity;
1866 UCHAR ObsoleteNumber;
1867 UCHAR Fill0;
1868 ULONG Unused0[3];
1869 USHORT MajorVersion;
1870 USHORT MinorVersion;
1871 ULONG StallScaleFactor;
1872 PVOID Unused1[3];
1873 ULONG KernelReserved[15];
1874 ULONG SecondLevelCacheSize;
1875 ULONG HalReserved[16];
1876 ULONG Unused2;
1877 PVOID KdVersionBlock;
1878 PVOID Unused3;
1879 ULONG PcrAlign1[24];
1880 } KPCR, *PKPCR;
1881
1882 FORCEINLINE
1883 PKPCR
1884 KeGetPcr(VOID)
1885 {
1886 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
1887 }
1888
1889 FORCEINLINE
1890 ULONG
1891 KeGetCurrentProcessorNumber(VOID)
1892 {
1893 return (ULONG)__readgsword(0x184);
1894 }
1895
1896 #if !defined(RC_INVOKED)
1897
1898 #define CONTEXT_AMD64 0x100000
1899
1900 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
1901 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
1902 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
1903 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
1904 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
1905
1906 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
1907 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
1908
1909 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
1910
1911 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
1912 #define CONTEXT_SERVICE_ACTIVE 0x10000000
1913 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
1914 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
1915
1916 #endif /* RC_INVOKED */
1917
1918 #endif /* _AMD64_ */
1919
1920 typedef enum _INTERLOCKED_RESULT {
1921 ResultNegative = RESULT_NEGATIVE,
1922 ResultZero = RESULT_ZERO,
1923 ResultPositive = RESULT_POSITIVE
1924 } INTERLOCKED_RESULT;
1925
1926 typedef struct _OSVERSIONINFOA {
1927 ULONG dwOSVersionInfoSize;
1928 ULONG dwMajorVersion;
1929 ULONG dwMinorVersion;
1930 ULONG dwBuildNumber;
1931 ULONG dwPlatformId;
1932 CHAR szCSDVersion[128];
1933 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
1934
1935 typedef struct _OSVERSIONINFOW {
1936 ULONG dwOSVersionInfoSize;
1937 ULONG dwMajorVersion;
1938 ULONG dwMinorVersion;
1939 ULONG dwBuildNumber;
1940 ULONG dwPlatformId;
1941 WCHAR szCSDVersion[128];
1942 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
1943
1944 typedef struct _OSVERSIONINFOEXA {
1945 ULONG dwOSVersionInfoSize;
1946 ULONG dwMajorVersion;
1947 ULONG dwMinorVersion;
1948 ULONG dwBuildNumber;
1949 ULONG dwPlatformId;
1950 CHAR szCSDVersion[128];
1951 USHORT wServicePackMajor;
1952 USHORT wServicePackMinor;
1953 USHORT wSuiteMask;
1954 UCHAR wProductType;
1955 UCHAR wReserved;
1956 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
1957
1958 typedef struct _OSVERSIONINFOEXW {
1959 ULONG dwOSVersionInfoSize;
1960 ULONG dwMajorVersion;
1961 ULONG dwMinorVersion;
1962 ULONG dwBuildNumber;
1963 ULONG dwPlatformId;
1964 WCHAR szCSDVersion[128];
1965 USHORT wServicePackMajor;
1966 USHORT wServicePackMinor;
1967 USHORT wSuiteMask;
1968 UCHAR wProductType;
1969 UCHAR wReserved;
1970 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
1971
1972 #ifdef UNICODE
1973 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
1974 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
1975 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
1976 typedef OSVERSIONINFOW OSVERSIONINFO;
1977 typedef POSVERSIONINFOW POSVERSIONINFO;
1978 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
1979 #else
1980 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
1981 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
1982 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
1983 typedef OSVERSIONINFOA OSVERSIONINFO;
1984 typedef POSVERSIONINFOA POSVERSIONINFO;
1985 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
1986 #endif /* UNICODE */
1987
1988 /* Executive Types */
1989
1990 #define PROTECTED_POOL 0x80000000
1991
1992 typedef struct _ZONE_SEGMENT_HEADER {
1993 SINGLE_LIST_ENTRY SegmentList;
1994 PVOID Reserved;
1995 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
1996
1997 typedef struct _ZONE_HEADER {
1998 SINGLE_LIST_ENTRY FreeList;
1999 SINGLE_LIST_ENTRY SegmentList;
2000 ULONG BlockSize;
2001 ULONG TotalSegmentSize;
2002 } ZONE_HEADER, *PZONE_HEADER;
2003
2004 /* Executive Functions */
2005
2006 static __inline PVOID
2007 ExAllocateFromZone(
2008 IN PZONE_HEADER Zone)
2009 {
2010 if (Zone->FreeList.Next)
2011 Zone->FreeList.Next = Zone->FreeList.Next->Next;
2012 return (PVOID) Zone->FreeList.Next;
2013 }
2014
2015 static __inline PVOID
2016 ExFreeToZone(
2017 IN PZONE_HEADER Zone,
2018 IN PVOID Block)
2019 {
2020 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
2021 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
2022 return ((PSINGLE_LIST_ENTRY) Block)->Next;
2023 }
2024
2025 /*
2026 * PVOID
2027 * ExInterlockedAllocateFromZone(
2028 * IN PZONE_HEADER Zone,
2029 * IN PKSPIN_LOCK Lock)
2030 */
2031 #define ExInterlockedAllocateFromZone(Zone, Lock) \
2032 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
2033
2034 /* PVOID
2035 * ExInterlockedFreeToZone(
2036 * IN PZONE_HEADER Zone,
2037 * IN PVOID Block,
2038 * IN PKSPIN_LOCK Lock);
2039 */
2040 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
2041 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
2042
2043 /*
2044 * BOOLEAN
2045 * ExIsFullZone(
2046 * IN PZONE_HEADER Zone)
2047 */
2048 #define ExIsFullZone(Zone) \
2049 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
2050
2051 /* BOOLEAN
2052 * ExIsObjectInFirstZoneSegment(
2053 * IN PZONE_HEADER Zone,
2054 * IN PVOID Object);
2055 */
2056 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
2057 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
2058 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
2059 (Zone)->TotalSegmentSize)) )
2060
2061 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
2062 #define ExAcquireResourceShared ExAcquireResourceSharedLite
2063 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
2064 #define ExDeleteResource ExDeleteResourceLite
2065 #define ExInitializeResource ExInitializeResourceLite
2066 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
2067 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
2068 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
2069 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
2070
2071 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2072
2073 NTKERNELAPI
2074 NTSTATUS
2075 NTAPI
2076 ExExtendZone(
2077 IN OUT PZONE_HEADER Zone,
2078 IN OUT PVOID Segment,
2079 IN ULONG SegmentSize);
2080
2081 NTKERNELAPI
2082 NTSTATUS
2083 NTAPI
2084 ExInitializeZone(
2085 OUT PZONE_HEADER Zone,
2086 IN ULONG BlockSize,
2087 IN OUT PVOID InitialSegment,
2088 IN ULONG InitialSegmentSize);
2089
2090 NTKERNELAPI
2091 NTSTATUS
2092 NTAPI
2093 ExInterlockedExtendZone(
2094 IN OUT PZONE_HEADER Zone,
2095 IN OUT PVOID Segment,
2096 IN ULONG SegmentSize,
2097 IN OUT PKSPIN_LOCK Lock);
2098
2099 NTKERNELAPI
2100 NTSTATUS
2101 NTAPI
2102 ExUuidCreate(
2103 OUT UUID *Uuid);
2104
2105 NTKERNELAPI
2106 DECLSPEC_NORETURN
2107 VOID
2108 NTAPI
2109 ExRaiseAccessViolation(
2110 VOID);
2111
2112 NTKERNELAPI
2113 DECLSPEC_NORETURN
2114 VOID
2115 NTAPI
2116 ExRaiseDatatypeMisalignment(
2117 VOID);
2118
2119 #endif
2120
2121 #ifdef _X86_
2122
2123 NTKERNELAPI
2124 INTERLOCKED_RESULT
2125 FASTCALL
2126 Exfi386InterlockedIncrementLong(
2127 IN OUT LONG volatile *Addend);
2128
2129 NTKERNELAPI
2130 INTERLOCKED_RESULT
2131 FASTCALL
2132 Exfi386InterlockedDecrementLong(
2133 IN PLONG Addend);
2134
2135 NTKERNELAPI
2136 ULONG
2137 FASTCALL
2138 Exfi386InterlockedExchangeUlong(
2139 IN PULONG Target,
2140 IN ULONG Value);
2141
2142 #endif /* _X86_ */
2143
2144 #ifndef _ARC_DDK_
2145 #define _ARC_DDK_
2146 typedef enum _CONFIGURATION_TYPE {
2147 ArcSystem,
2148 CentralProcessor,
2149 FloatingPointProcessor,
2150 PrimaryIcache,
2151 PrimaryDcache,
2152 SecondaryIcache,
2153 SecondaryDcache,
2154 SecondaryCache,
2155 EisaAdapter,
2156 TcAdapter,
2157 ScsiAdapter,
2158 DtiAdapter,
2159 MultiFunctionAdapter,
2160 DiskController,
2161 TapeController,
2162 CdromController,
2163 WormController,
2164 SerialController,
2165 NetworkController,
2166 DisplayController,
2167 ParallelController,
2168 PointerController,
2169 KeyboardController,
2170 AudioController,
2171 OtherController,
2172 DiskPeripheral,
2173 FloppyDiskPeripheral,
2174 TapePeripheral,
2175 ModemPeripheral,
2176 MonitorPeripheral,
2177 PrinterPeripheral,
2178 PointerPeripheral,
2179 KeyboardPeripheral,
2180 TerminalPeripheral,
2181 OtherPeripheral,
2182 LinePeripheral,
2183 NetworkPeripheral,
2184 SystemMemory,
2185 DockingInformation,
2186 RealModeIrqRoutingTable,
2187 RealModePCIEnumeration,
2188 MaximumType
2189 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
2190 #endif /* !_ARC_DDK_ */
2191
2192 typedef struct _CONTROLLER_OBJECT {
2193 CSHORT Type;
2194 CSHORT Size;
2195 PVOID ControllerExtension;
2196 KDEVICE_QUEUE DeviceWaitQueue;
2197 ULONG Spare1;
2198 LARGE_INTEGER Spare2;
2199 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
2200
2201 typedef struct _CONFIGURATION_INFORMATION {
2202 ULONG DiskCount;
2203 ULONG FloppyCount;
2204 ULONG CdRomCount;
2205 ULONG TapeCount;
2206 ULONG ScsiPortCount;
2207 ULONG SerialCount;
2208 ULONG ParallelCount;
2209 BOOLEAN AtDiskPrimaryAddressClaimed;
2210 BOOLEAN AtDiskSecondaryAddressClaimed;
2211 ULONG Version;
2212 ULONG MediumChangerCount;
2213 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
2214
2215 typedef
2216 NTSTATUS
2217 (NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
2218 IN PVOID Context,
2219 IN PUNICODE_STRING PathName,
2220 IN INTERFACE_TYPE BusType,
2221 IN ULONG BusNumber,
2222 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
2223 IN CONFIGURATION_TYPE ControllerType,
2224 IN ULONG ControllerNumber,
2225 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
2226 IN CONFIGURATION_TYPE PeripheralType,
2227 IN ULONG PeripheralNumber,
2228 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
2229
2230 typedef
2231 VOID
2232 (NTAPI DRIVER_REINITIALIZE)(
2233 IN struct _DRIVER_OBJECT *DriverObject,
2234 IN PVOID Context,
2235 IN ULONG Count);
2236
2237 typedef DRIVER_REINITIALIZE *PDRIVER_REINITIALIZE;
2238
2239 /** Filesystem runtime library routines **/
2240
2241 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2242 NTKERNELAPI
2243 BOOLEAN
2244 NTAPI
2245 FsRtlIsTotalDeviceFailure(
2246 IN NTSTATUS Status);
2247 #endif
2248
2249 /* Hardware Abstraction Layer Types */
2250
2251 typedef VOID
2252 (NTAPI *PciPin2Line)(
2253 IN struct _BUS_HANDLER *BusHandler,
2254 IN struct _BUS_HANDLER *RootHandler,
2255 IN PCI_SLOT_NUMBER SlotNumber,
2256 IN PPCI_COMMON_CONFIG PciData);
2257
2258 typedef VOID
2259 (NTAPI *PciLine2Pin)(
2260 IN struct _BUS_HANDLER *BusHandler,
2261 IN struct _BUS_HANDLER *RootHandler,
2262 IN PCI_SLOT_NUMBER SlotNumber,
2263 IN PPCI_COMMON_CONFIG PciNewData,
2264 IN PPCI_COMMON_CONFIG PciOldData);
2265
2266 typedef VOID
2267 (NTAPI *PciReadWriteConfig)(
2268 IN struct _BUS_HANDLER *BusHandler,
2269 IN PCI_SLOT_NUMBER Slot,
2270 IN PVOID Buffer,
2271 IN ULONG Offset,
2272 IN ULONG Length);
2273
2274 #define PCI_DATA_TAG ' ICP'
2275 #define PCI_DATA_VERSION 1
2276
2277 typedef struct _PCIBUSDATA {
2278 ULONG Tag;
2279 ULONG Version;
2280 PciReadWriteConfig ReadConfig;
2281 PciReadWriteConfig WriteConfig;
2282 PciPin2Line Pin2Line;
2283 PciLine2Pin Line2Pin;
2284 PCI_SLOT_NUMBER ParentSlot;
2285 PVOID Reserved[4];
2286 } PCIBUSDATA, *PPCIBUSDATA;
2287
2288 /* Hardware Abstraction Layer Functions */
2289
2290 #if !defined(NO_LEGACY_DRIVERS)
2291
2292 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2293
2294 NTHALAPI
2295 NTSTATUS
2296 NTAPI
2297 HalAssignSlotResources(
2298 IN PUNICODE_STRING RegistryPath,
2299 IN PUNICODE_STRING DriverClassName,
2300 IN PDRIVER_OBJECT DriverObject,
2301 IN PDEVICE_OBJECT DeviceObject,
2302 IN INTERFACE_TYPE BusType,
2303 IN ULONG BusNumber,
2304 IN ULONG SlotNumber,
2305 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
2306
2307 NTHALAPI
2308 ULONG
2309 NTAPI
2310 HalGetInterruptVector(
2311 IN INTERFACE_TYPE InterfaceType,
2312 IN ULONG BusNumber,
2313 IN ULONG BusInterruptLevel,
2314 IN ULONG BusInterruptVector,
2315 OUT PKIRQL Irql,
2316 OUT PKAFFINITY Affinity);
2317
2318 NTHALAPI
2319 ULONG
2320 NTAPI
2321 HalSetBusData(
2322 IN BUS_DATA_TYPE BusDataType,
2323 IN ULONG BusNumber,
2324 IN ULONG SlotNumber,
2325 IN PVOID Buffer,
2326 IN ULONG Length);
2327
2328 #endif
2329
2330 #endif /* !defined(NO_LEGACY_DRIVERS) */
2331
2332 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2333
2334 NTHALAPI
2335 PADAPTER_OBJECT
2336 NTAPI
2337 HalGetAdapter(
2338 IN PDEVICE_DESCRIPTION DeviceDescription,
2339 IN OUT PULONG NumberOfMapRegisters);
2340
2341 NTHALAPI
2342 BOOLEAN
2343 NTAPI
2344 HalMakeBeep(
2345 IN ULONG Frequency);
2346
2347 VOID
2348 NTAPI
2349 HalPutDmaAdapter(
2350 IN PADAPTER_OBJECT DmaAdapter);
2351
2352 NTHALAPI
2353 VOID
2354 NTAPI
2355 HalAcquireDisplayOwnership(
2356 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
2357
2358 NTHALAPI
2359 ULONG
2360 NTAPI
2361 HalGetBusData(
2362 IN BUS_DATA_TYPE BusDataType,
2363 IN ULONG BusNumber,
2364 IN ULONG SlotNumber,
2365 OUT PVOID Buffer,
2366 IN ULONG Length);
2367
2368 NTHALAPI
2369 ULONG
2370 NTAPI
2371 HalGetBusDataByOffset(
2372 IN BUS_DATA_TYPE BusDataType,
2373 IN ULONG BusNumber,
2374 IN ULONG SlotNumber,
2375 OUT PVOID Buffer,
2376 IN ULONG Offset,
2377 IN ULONG Length);
2378
2379 NTHALAPI
2380 ULONG
2381 NTAPI
2382 HalSetBusDataByOffset(
2383 IN BUS_DATA_TYPE BusDataType,
2384 IN ULONG BusNumber,
2385 IN ULONG SlotNumber,
2386 IN PVOID Buffer,
2387 IN ULONG Offset,
2388 IN ULONG Length);
2389
2390 NTHALAPI
2391 BOOLEAN
2392 NTAPI
2393 HalTranslateBusAddress(
2394 IN INTERFACE_TYPE InterfaceType,
2395 IN ULONG BusNumber,
2396 IN PHYSICAL_ADDRESS BusAddress,
2397 IN OUT PULONG AddressSpace,
2398 OUT PPHYSICAL_ADDRESS TranslatedAddress);
2399
2400 #endif
2401
2402 #if (NTDDI_VERSION >= NTDDI_WINXP)
2403 NTKERNELAPI
2404 VOID
2405 FASTCALL
2406 HalExamineMBR(
2407 IN PDEVICE_OBJECT DeviceObject,
2408 IN ULONG SectorSize,
2409 IN ULONG MBRTypeIdentifier,
2410 OUT PVOID *Buffer);
2411 #endif
2412
2413 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2414 // nothing here
2415 #else
2416
2417 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2418 //DECLSPEC_DEPRECATED_DDK
2419 NTHALAPI
2420 VOID
2421 NTAPI
2422 IoFreeAdapterChannel(
2423 IN PADAPTER_OBJECT AdapterObject);
2424
2425 //DECLSPEC_DEPRECATED_DDK
2426 NTHALAPI
2427 BOOLEAN
2428 NTAPI
2429 IoFlushAdapterBuffers(
2430 IN PADAPTER_OBJECT AdapterObject,
2431 IN PMDL Mdl,
2432 IN PVOID MapRegisterBase,
2433 IN PVOID CurrentVa,
2434 IN ULONG Length,
2435 IN BOOLEAN WriteToDevice);
2436
2437 //DECLSPEC_DEPRECATED_DDK
2438 NTHALAPI
2439 VOID
2440 NTAPI
2441 IoFreeMapRegisters(
2442 IN PADAPTER_OBJECT AdapterObject,
2443 IN PVOID MapRegisterBase,
2444 IN ULONG NumberOfMapRegisters);
2445
2446 //DECLSPEC_DEPRECATED_DDK
2447 NTHALAPI
2448 PVOID
2449 NTAPI
2450 HalAllocateCommonBuffer(
2451 IN PADAPTER_OBJECT AdapterObject,
2452 IN ULONG Length,
2453 OUT PPHYSICAL_ADDRESS LogicalAddress,
2454 IN BOOLEAN CacheEnabled);
2455
2456 //DECLSPEC_DEPRECATED_DDK
2457 NTHALAPI
2458 VOID
2459 NTAPI
2460 HalFreeCommonBuffer(
2461 IN PADAPTER_OBJECT AdapterObject,
2462 IN ULONG Length,
2463 IN PHYSICAL_ADDRESS LogicalAddress,
2464 IN PVOID VirtualAddress,
2465 IN BOOLEAN CacheEnabled);
2466
2467 //DECLSPEC_DEPRECATED_DDK
2468 NTHALAPI
2469 ULONG
2470 NTAPI
2471 HalReadDmaCounter(
2472 IN PADAPTER_OBJECT AdapterObject);
2473
2474 NTHALAPI
2475 NTSTATUS
2476 NTAPI
2477 HalAllocateAdapterChannel(
2478 IN PADAPTER_OBJECT AdapterObject,
2479 IN PWAIT_CONTEXT_BLOCK Wcb,
2480 IN ULONG NumberOfMapRegisters,
2481 IN PDRIVER_CONTROL ExecutionRoutine);
2482
2483 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2484
2485 #endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */
2486
2487 /* I/O Manager Functions */
2488
2489 /*
2490 * VOID IoAssignArcName(
2491 * IN PUNICODE_STRING ArcName,
2492 * IN PUNICODE_STRING DeviceName);
2493 */
2494 #define IoAssignArcName(_ArcName, _DeviceName) ( \
2495 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
2496
2497 /*
2498 * VOID
2499 * IoDeassignArcName(
2500 * IN PUNICODE_STRING ArcName)
2501 */
2502 #define IoDeassignArcName IoDeleteSymbolicLink
2503
2504 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2505
2506 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
2507 NTKERNELAPI
2508 NTSTATUS
2509 NTAPI
2510 IoAllocateAdapterChannel(
2511 IN PADAPTER_OBJECT AdapterObject,
2512 IN PDEVICE_OBJECT DeviceObject,
2513 IN ULONG NumberOfMapRegisters,
2514 IN PDRIVER_CONTROL ExecutionRoutine,
2515 IN PVOID Context);
2516 #endif
2517
2518 #if !defined(DMA_MACROS_DEFINED)
2519 //DECLSPEC_DEPRECATED_DDK
2520 NTHALAPI
2521 PHYSICAL_ADDRESS
2522 NTAPI
2523 IoMapTransfer(
2524 IN PADAPTER_OBJECT AdapterObject,
2525 IN PMDL Mdl,
2526 IN PVOID MapRegisterBase,
2527 IN PVOID CurrentVa,
2528 IN OUT PULONG Length,
2529 IN BOOLEAN WriteToDevice);
2530 #endif
2531
2532 NTKERNELAPI
2533 VOID
2534 NTAPI
2535 IoAllocateController(
2536 IN PCONTROLLER_OBJECT ControllerObject,
2537 IN PDEVICE_OBJECT DeviceObject,
2538 IN PDRIVER_CONTROL ExecutionRoutine,
2539 IN PVOID Context OPTIONAL);
2540
2541 NTKERNELAPI
2542 PCONTROLLER_OBJECT
2543 NTAPI
2544 IoCreateController(
2545 IN ULONG Size);
2546
2547 NTKERNELAPI
2548 VOID
2549 NTAPI
2550 IoDeleteController(
2551 IN PCONTROLLER_OBJECT ControllerObject);
2552
2553 NTKERNELAPI
2554 VOID
2555 NTAPI
2556 IoFreeController(
2557 IN PCONTROLLER_OBJECT ControllerObject);
2558
2559 NTKERNELAPI
2560 PCONFIGURATION_INFORMATION
2561 NTAPI
2562 IoGetConfigurationInformation(
2563 VOID);
2564
2565 NTKERNELAPI
2566 PDEVICE_OBJECT
2567 NTAPI
2568 IoGetDeviceToVerify(
2569 IN PETHREAD Thread);
2570
2571 NTKERNELAPI
2572 VOID
2573 NTAPI
2574 IoCancelFileOpen(
2575 IN PDEVICE_OBJECT DeviceObject,
2576 IN PFILE_OBJECT FileObject);
2577
2578 NTKERNELAPI
2579 PGENERIC_MAPPING
2580 NTAPI
2581 IoGetFileObjectGenericMapping(
2582 VOID);
2583
2584 NTKERNELAPI
2585 PIRP
2586 NTAPI
2587 IoMakeAssociatedIrp(
2588 IN PIRP Irp,
2589 IN CCHAR StackSize);
2590
2591 NTKERNELAPI
2592 NTSTATUS
2593 NTAPI
2594 IoQueryDeviceDescription(
2595 IN PINTERFACE_TYPE BusType OPTIONAL,
2596 IN PULONG BusNumber OPTIONAL,
2597 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
2598 IN PULONG ControllerNumber OPTIONAL,
2599 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
2600 IN PULONG PeripheralNumber OPTIONAL,
2601 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
2602 IN OUT PVOID Context OPTIONAL);
2603
2604 NTKERNELAPI
2605 VOID
2606 NTAPI
2607 IoRaiseHardError(
2608 IN PIRP Irp,
2609 IN PVPB Vpb OPTIONAL,
2610 IN PDEVICE_OBJECT RealDeviceObject);
2611
2612 NTKERNELAPI
2613 BOOLEAN
2614 NTAPI
2615 IoRaiseInformationalHardError(
2616 IN NTSTATUS ErrorStatus,
2617 IN PUNICODE_STRING String OPTIONAL,
2618 IN PKTHREAD Thread OPTIONAL);
2619
2620 NTKERNELAPI
2621 VOID
2622 NTAPI
2623 IoRegisterBootDriverReinitialization(
2624 IN PDRIVER_OBJECT DriverObject,
2625 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
2626 IN PVOID Context OPTIONAL);
2627
2628 NTKERNELAPI
2629 VOID
2630 NTAPI
2631 IoRegisterDriverReinitialization(
2632 IN PDRIVER_OBJECT DriverObject,
2633 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
2634 IN PVOID Context OPTIONAL);
2635
2636 NTKERNELAPI
2637 NTSTATUS
2638 NTAPI
2639 IoAttachDeviceByPointer(
2640 IN PDEVICE_OBJECT SourceDevice,
2641 IN PDEVICE_OBJECT TargetDevice);
2642
2643 NTKERNELAPI
2644 NTSTATUS
2645 NTAPI
2646 IoReportDetectedDevice(
2647 IN PDRIVER_OBJECT DriverObject,
2648 IN INTERFACE_TYPE LegacyBusType,
2649 IN ULONG BusNumber,
2650 IN ULONG SlotNumber,
2651 IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
2652 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
2653 IN BOOLEAN ResourceAssigned,
2654 IN OUT PDEVICE_OBJECT *DeviceObject);
2655
2656 NTKERNELAPI
2657 NTSTATUS
2658 NTAPI
2659 IoReportResourceForDetection(
2660 IN PDRIVER_OBJECT DriverObject,
2661 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
2662 IN ULONG DriverListSize OPTIONAL,
2663 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
2664 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
2665 IN ULONG DeviceListSize OPTIONAL,
2666 OUT PBOOLEAN ConflictDetected);
2667
2668 NTKERNELAPI
2669 NTSTATUS
2670 NTAPI
2671 IoReportResourceUsage(
2672 IN PUNICODE_STRING DriverClassName OPTIONAL,
2673 IN PDRIVER_OBJECT DriverObject,
2674 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
2675 IN ULONG DriverListSize OPTIONAL,
2676 IN PDEVICE_OBJECT DeviceObject,
2677 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
2678 IN ULONG DeviceListSize OPTIONAL,
2679 IN BOOLEAN OverrideConflict,
2680 OUT PBOOLEAN ConflictDetected);
2681
2682 NTKERNELAPI
2683 VOID
2684 NTAPI
2685 IoSetHardErrorOrVerifyDevice(
2686 IN PIRP Irp,
2687 IN PDEVICE_OBJECT DeviceObject);
2688
2689 NTKERNELAPI
2690 NTSTATUS
2691 NTAPI
2692 IoAssignResources(
2693 IN PUNICODE_STRING RegistryPath,
2694 IN PUNICODE_STRING DriverClassName OPTIONAL,
2695 IN PDRIVER_OBJECT DriverObject,
2696 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
2697 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
2698 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
2699
2700 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2701
2702 #if (NTDDI_VERSION >= NTDDI_WINXP)
2703
2704 NTKERNELAPI
2705 NTSTATUS
2706 NTAPI
2707 IoCreateDisk(
2708 IN PDEVICE_OBJECT DeviceObject,
2709 IN struct _CREATE_DISK* Disk OPTIONAL);
2710
2711 NTKERNELAPI
2712 NTSTATUS
2713 NTAPI
2714 IoReadDiskSignature(
2715 IN PDEVICE_OBJECT DeviceObject,
2716 IN ULONG BytesPerSector,
2717 OUT PDISK_SIGNATURE Signature);
2718
2719 NTKERNELAPI
2720 NTSTATUS
2721 FASTCALL
2722 IoReadPartitionTable(
2723 IN PDEVICE_OBJECT DeviceObject,
2724 IN ULONG SectorSize,
2725 IN BOOLEAN ReturnRecognizedPartitions,
2726 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
2727
2728 NTKERNELAPI
2729 NTSTATUS
2730 NTAPI
2731 IoReadPartitionTableEx(
2732 IN PDEVICE_OBJECT DeviceObject,
2733 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
2734
2735 NTKERNELAPI
2736 NTSTATUS
2737 FASTCALL
2738 IoSetPartitionInformation(
2739 IN PDEVICE_OBJECT DeviceObject,
2740 IN ULONG SectorSize,
2741 IN ULONG PartitionNumber,
2742 IN ULONG PartitionType);
2743
2744 NTKERNELAPI
2745 NTSTATUS
2746 NTAPI
2747 IoSetPartitionInformationEx(
2748 IN PDEVICE_OBJECT DeviceObject,
2749 IN ULONG PartitionNumber,
2750 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
2751
2752 NTKERNELAPI
2753 NTSTATUS
2754 NTAPI
2755 IoSetSystemPartition(
2756 IN PUNICODE_STRING VolumeNameString);
2757
2758 NTKERNELAPI
2759 BOOLEAN
2760 NTAPI
2761 IoSetThreadHardErrorMode(
2762 IN BOOLEAN EnableHardErrors);
2763
2764 NTKERNELAPI
2765 NTSTATUS
2766 NTAPI
2767 IoVerifyPartitionTable(
2768 IN PDEVICE_OBJECT DeviceObject,
2769 IN BOOLEAN FixErrors);
2770
2771 NTKERNELAPI
2772 NTSTATUS
2773 NTAPI
2774 IoVolumeDeviceToDosName(
2775 IN PVOID VolumeDeviceObject,
2776 OUT PUNICODE_STRING DosName);
2777
2778 NTKERNELAPI
2779 NTSTATUS
2780 FASTCALL
2781 IoWritePartitionTable(
2782 IN PDEVICE_OBJECT DeviceObject,
2783 IN ULONG SectorSize,
2784 IN ULONG SectorsPerTrack,
2785 IN ULONG NumberOfHeads,
2786 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
2787
2788 NTKERNELAPI
2789 NTSTATUS
2790 NTAPI
2791 IoWritePartitionTableEx(
2792 IN PDEVICE_OBJECT DeviceObject,
2793 IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
2794
2795 NTKERNELAPI
2796 NTSTATUS
2797 NTAPI
2798 IoAttachDeviceToDeviceStackSafe(
2799 IN PDEVICE_OBJECT SourceDevice,
2800 IN PDEVICE_OBJECT TargetDevice,
2801 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
2802
2803 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2804
2805 /** Kernel debugger routines **/
2806
2807 NTSYSAPI
2808 ULONG
2809 NTAPI
2810 DbgPrompt(
2811 IN PCCH Prompt,
2812 OUT PCH Response,
2813 IN ULONG MaximumResponseLength);
2814
2815 /* Kernel Functions */
2816
2817 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2818
2819 NTKERNELAPI
2820 DECLSPEC_NORETURN
2821 VOID
2822 NTAPI
2823 KeBugCheck(
2824 IN ULONG BugCheckCode);
2825
2826 NTKERNELAPI
2827 LONG
2828 NTAPI
2829 KePulseEvent(
2830 IN OUT PRKEVENT Event,
2831 IN KPRIORITY Increment,
2832 IN BOOLEAN Wait);
2833
2834 NTKERNELAPI
2835 LONG
2836 NTAPI
2837 KeSetBasePriorityThread(
2838 IN OUT PRKTHREAD Thread,
2839 IN LONG Increment);
2840
2841 #endif
2842
2843 /* Memory Manager Types */
2844
2845 typedef struct _PHYSICAL_MEMORY_RANGE {
2846 PHYSICAL_ADDRESS BaseAddress;
2847 LARGE_INTEGER NumberOfBytes;
2848 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
2849
2850 /* Memory Manager Functions */
2851
2852 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2853
2854 NTKERNELAPI
2855 PPHYSICAL_MEMORY_RANGE
2856 NTAPI
2857 MmGetPhysicalMemoryRanges(
2858 VOID);
2859
2860 NTKERNELAPI
2861 PHYSICAL_ADDRESS
2862 NTAPI
2863 MmGetPhysicalAddress(
2864 IN PVOID BaseAddress);
2865
2866 NTKERNELAPI
2867 BOOLEAN
2868 NTAPI
2869 MmIsNonPagedSystemAddressValid(
2870 IN PVOID VirtualAddress);
2871
2872 NTKERNELAPI
2873 PVOID
2874 NTAPI
2875 MmAllocateNonCachedMemory(
2876 IN SIZE_T NumberOfBytes);
2877
2878 NTKERNELAPI
2879 VOID
2880 NTAPI
2881 MmFreeNonCachedMemory(
2882 IN PVOID BaseAddress,
2883 IN SIZE_T NumberOfBytes);
2884
2885 NTKERNELAPI
2886 PVOID
2887 NTAPI
2888 MmGetVirtualForPhysical(
2889 IN PHYSICAL_ADDRESS PhysicalAddress);
2890
2891 NTKERNELAPI
2892 NTSTATUS
2893 NTAPI
2894 MmMapUserAddressesToPage(
2895 IN PVOID BaseAddress,
2896 IN SIZE_T NumberOfBytes,
2897 IN PVOID PageAddress);
2898
2899 NTKERNELAPI
2900 PVOID
2901 NTAPI
2902 MmMapVideoDisplay(
2903 IN PHYSICAL_ADDRESS PhysicalAddress,
2904 IN SIZE_T NumberOfBytes,
2905 IN MEMORY_CACHING_TYPE CacheType);
2906
2907 NTKERNELAPI
2908 NTSTATUS
2909 NTAPI
2910 MmMapViewInSessionSpace(
2911 IN PVOID Section,
2912 OUT PVOID *MappedBase,
2913 IN OUT PSIZE_T ViewSize);
2914
2915 NTKERNELAPI
2916 NTSTATUS
2917 NTAPI
2918 MmMapViewInSystemSpace(
2919 IN PVOID Section,
2920 OUT PVOID *MappedBase,
2921 IN OUT PSIZE_T ViewSize);
2922
2923 NTKERNELAPI
2924 BOOLEAN
2925 NTAPI
2926 MmIsAddressValid(
2927 IN PVOID VirtualAddress);
2928
2929 NTKERNELAPI
2930 BOOLEAN
2931 NTAPI
2932 MmIsThisAnNtAsSystem(
2933 VOID);
2934
2935 NTKERNELAPI
2936 VOID
2937 NTAPI
2938 MmLockPagableSectionByHandle(
2939 IN PVOID ImageSectionHandle);
2940
2941 NTKERNELAPI
2942 NTSTATUS
2943 NTAPI
2944 MmUnmapViewInSessionSpace(
2945 IN PVOID MappedBase);
2946
2947 NTKERNELAPI
2948 NTSTATUS
2949 NTAPI
2950 MmUnmapViewInSystemSpace(
2951 IN PVOID MappedBase);
2952
2953 NTKERNELAPI
2954 VOID
2955 NTAPI
2956 MmUnsecureVirtualMemory(
2957 IN HANDLE SecureHandle);
2958
2959 NTKERNELAPI
2960 NTSTATUS
2961 NTAPI
2962 MmRemovePhysicalMemory(
2963 IN PPHYSICAL_ADDRESS StartAddress,
2964 IN OUT PLARGE_INTEGER NumberOfBytes);
2965
2966 NTKERNELAPI
2967 HANDLE
2968 NTAPI
2969 MmSecureVirtualMemory(
2970 IN PVOID Address,
2971 IN SIZE_T Size,
2972 IN ULONG ProbeMode);
2973
2974 NTKERNELAPI
2975 VOID
2976 NTAPI
2977 MmUnmapVideoDisplay(
2978 IN PVOID BaseAddress,
2979 IN SIZE_T NumberOfBytes);
2980
2981 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2982
2983 /* NtXxx Functions */
2984
2985 NTSYSCALLAPI
2986 NTSTATUS
2987 NTAPI
2988 NtOpenProcess(
2989 OUT PHANDLE ProcessHandle,
2990 IN ACCESS_MASK DesiredAccess,
2991 IN POBJECT_ATTRIBUTES ObjectAttributes,
2992 IN PCLIENT_ID ClientId OPTIONAL);
2993
2994 NTSYSCALLAPI
2995 NTSTATUS
2996 NTAPI
2997 NtQueryInformationProcess(
2998 IN HANDLE ProcessHandle,
2999 IN PROCESSINFOCLASS ProcessInformationClass,
3000 OUT PVOID ProcessInformation OPTIONAL,
3001 IN ULONG ProcessInformationLength,
3002 OUT PULONG ReturnLength OPTIONAL);
3003
3004 /** Process manager types **/
3005
3006 typedef VOID
3007 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
3008 IN HANDLE ParentId,
3009 IN HANDLE ProcessId,
3010 IN BOOLEAN Create);
3011
3012 typedef VOID
3013 (NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
3014 IN HANDLE ProcessId,
3015 IN HANDLE ThreadId,
3016 IN BOOLEAN Create);
3017
3018 typedef VOID
3019 (NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
3020 IN PUNICODE_STRING FullImageName,
3021 IN HANDLE ProcessId,
3022 IN PIMAGE_INFO ImageInfo);
3023
3024 /** Process manager routines **/
3025
3026 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3027
3028 NTKERNELAPI
3029 NTSTATUS
3030 NTAPI
3031 PsSetLoadImageNotifyRoutine(
3032 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
3033
3034 NTKERNELAPI
3035 NTSTATUS
3036 NTAPI
3037 PsSetCreateThreadNotifyRoutine(
3038 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
3039
3040 NTKERNELAPI
3041 NTSTATUS
3042 NTAPI
3043 PsSetCreateProcessNotifyRoutine(
3044 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
3045 IN BOOLEAN Remove);
3046
3047 NTKERNELAPI
3048 HANDLE
3049 NTAPI
3050 PsGetCurrentProcessId(
3051 VOID);
3052
3053 NTKERNELAPI
3054 HANDLE
3055 NTAPI
3056 PsGetCurrentThreadId(
3057 VOID);
3058
3059 NTKERNELAPI
3060 BOOLEAN
3061 NTAPI
3062 PsGetVersion(
3063 OUT PULONG MajorVersion OPTIONAL,
3064 OUT PULONG MinorVersion OPTIONAL,
3065 OUT PULONG BuildNumber OPTIONAL,
3066 OUT PUNICODE_STRING CSDVersion OPTIONAL);
3067
3068 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
3069
3070 #if (NTDDI_VERSION >= NTDDI_WINXP)
3071
3072 NTKERNELAPI
3073 HANDLE
3074 NTAPI
3075 PsGetProcessId(
3076 IN PEPROCESS Process);
3077
3078 NTKERNELAPI
3079 NTSTATUS
3080 NTAPI
3081 PsRemoveCreateThreadNotifyRoutine(
3082 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
3083
3084 NTKERNELAPI
3085 NTSTATUS
3086 NTAPI
3087 PsRemoveLoadImageNotifyRoutine(
3088 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
3089
3090 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
3091
3092 extern NTKERNELAPI PEPROCESS PsInitialSystemProcess;
3093
3094 /* RTL Types */
3095
3096 typedef struct _RTL_SPLAY_LINKS {
3097 struct _RTL_SPLAY_LINKS *Parent;
3098 struct _RTL_SPLAY_LINKS *LeftChild;
3099 struct _RTL_SPLAY_LINKS *RightChild;
3100 } RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
3101
3102 /* RTL Functions */
3103
3104 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
3105
3106 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
3107 *CallersAddress = (PVOID)_ReturnAddress(); \
3108 *CallersCaller = NULL;
3109 #else
3110
3111 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3112 NTSYSAPI
3113 VOID
3114 NTAPI
3115 RtlGetCallersAddress(
3116 OUT PVOID *CallersAddress,
3117 OUT PVOID *CallersCaller);
3118 #endif
3119
3120 #endif
3121
3122 #if !defined(MIDL_PASS)
3123
3124 FORCEINLINE
3125 LUID
3126 NTAPI_INLINE
3127 RtlConvertLongToLuid(
3128 IN LONG Val)
3129 {
3130 LUID Luid;
3131 LARGE_INTEGER Temp;
3132
3133 Temp.QuadPart = Val;
3134 Luid.LowPart = Temp.u.LowPart;
3135 Luid.HighPart = Temp.u.HighPart;
3136 return Luid;
3137 }
3138
3139 FORCEINLINE
3140 LUID
3141 NTAPI_INLINE
3142 RtlConvertUlongToLuid(
3143 IN ULONG Val)
3144 {
3145 LUID Luid;
3146
3147 Luid.LowPart = Val;
3148 Luid.HighPart = 0;
3149 return Luid;
3150 }
3151
3152 #endif
3153
3154 #if defined(_AMD64_) || defined(_IA64_)
3155 //DECLSPEC_DEPRECATED_DDK_WINXP
3156 FORCEINLINE
3157 LARGE_INTEGER
3158 NTAPI_INLINE
3159 RtlLargeIntegerDivide(
3160 IN LARGE_INTEGER Dividend,
3161 IN LARGE_INTEGER Divisor,
3162 OUT PLARGE_INTEGER Remainder OPTIONAL)
3163 {
3164 LARGE_INTEGER ret;
3165 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
3166 if (Remainder)
3167 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
3168 return ret;
3169 }
3170
3171 #else
3172
3173 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3174 NTSYSAPI
3175 LARGE_INTEGER
3176 NTAPI
3177 RtlLargeIntegerDivide(
3178 IN LARGE_INTEGER Dividend,
3179 IN LARGE_INTEGER Divisor,
3180 OUT PLARGE_INTEGER Remainder OPTIONAL);
3181 #endif
3182
3183 #endif /* defined(_AMD64_) || defined(_IA64_) */
3184
3185 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3186
3187 NTSYSAPI
3188 BOOLEAN
3189 NTAPI
3190 RtlPrefixUnicodeString(
3191 IN PCUNICODE_STRING String1,
3192 IN PCUNICODE_STRING String2,
3193 IN BOOLEAN CaseInSensitive);
3194
3195 NTSYSAPI
3196 VOID
3197 NTAPI
3198 RtlUpperString(
3199 IN OUT PSTRING DestinationString,
3200 IN const PSTRING SourceString);
3201
3202 NTSYSAPI
3203 NTSTATUS
3204 NTAPI
3205 RtlUpcaseUnicodeString(
3206 IN OUT PUNICODE_STRING DestinationString,
3207 IN PCUNICODE_STRING SourceString,
3208 IN BOOLEAN AllocateDestinationString);
3209
3210 NTSYSAPI
3211 VOID
3212 NTAPI
3213 RtlMapGenericMask(
3214 IN OUT PACCESS_MASK AccessMask,
3215 IN PGENERIC_MAPPING GenericMapping);
3216
3217 NTSYSAPI
3218 NTSTATUS
3219 NTAPI
3220 RtlVolumeDeviceToDosName(
3221 IN PVOID VolumeDeviceObject,
3222 OUT PUNICODE_STRING DosName);
3223
3224 NTSYSAPI
3225 NTSTATUS
3226 NTAPI
3227 RtlGetVersion(
3228 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
3229
3230 NTSYSAPI
3231 NTSTATUS
3232 NTAPI
3233 RtlVerifyVersionInfo(
3234 IN PRTL_OSVERSIONINFOEXW VersionInfo,
3235 IN ULONG TypeMask,
3236 IN ULONGLONG ConditionMask);
3237
3238 NTSYSAPI
3239 LONG
3240 NTAPI
3241 RtlCompareString(
3242 IN const PSTRING String1,
3243 IN const PSTRING String2,
3244 BOOLEAN CaseInSensitive);
3245
3246 NTSYSAPI
3247 VOID
3248 NTAPI
3249 RtlCopyString(
3250 OUT PSTRING DestinationString,
3251 IN const PSTRING SourceString OPTIONAL);
3252
3253 NTSYSAPI
3254 BOOLEAN
3255 NTAPI
3256 RtlEqualString(
3257 IN const PSTRING String1,
3258 IN const PSTRING String2,
3259 IN BOOLEAN CaseInSensitive);
3260
3261 NTSYSAPI
3262 NTSTATUS
3263 NTAPI
3264 RtlCharToInteger(
3265 IN PCSZ String,
3266 IN ULONG Base OPTIONAL,
3267 OUT PULONG Value);
3268
3269 NTSYSAPI
3270 CHAR
3271 NTAPI
3272 RtlUpperChar(
3273 IN CHAR Character);
3274
3275 NTSYSAPI
3276 ULONG
3277 NTAPI
3278 RtlWalkFrameChain(
3279 OUT PVOID *Callers,
3280 IN ULONG Count,
3281 IN ULONG Flags);
3282
3283 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
3284
3285 /* Security reference monitor routines */
3286
3287 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3288 NTKERNELAPI
3289 BOOLEAN
3290 NTAPI
3291 SeSinglePrivilegeCheck(
3292 IN LUID PrivilegeValue,
3293 IN KPROCESSOR_MODE PreviousMode);
3294 #endif
3295
3296 /* ZwXxx Functions */
3297
3298 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3299
3300 NTSTATUS
3301 NTAPI
3302 ZwCancelTimer(
3303 IN HANDLE TimerHandle,
3304 OUT PBOOLEAN CurrentState OPTIONAL);
3305
3306 NTSTATUS
3307 NTAPI
3308 ZwCreateTimer(
3309 OUT PHANDLE TimerHandle,
3310 IN ACCESS_MASK DesiredAccess,
3311 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
3312 IN TIMER_TYPE TimerType);
3313
3314 NTSTATUS
3315 NTAPI
3316 ZwOpenTimer(
3317 OUT PHANDLE TimerHandle,
3318 IN ACCESS_MASK DesiredAccess,
3319 IN POBJECT_ATTRIBUTES ObjectAttributes);
3320
3321 NTSYSAPI
3322 NTSTATUS
3323 NTAPI
3324 ZwSetInformationThread(
3325 IN HANDLE ThreadHandle,
3326 IN THREADINFOCLASS ThreadInformationClass,
3327 IN PVOID ThreadInformation,
3328 IN ULONG ThreadInformationLength);
3329
3330 NTSTATUS
3331 NTAPI
3332 ZwSetTimer(
3333 IN HANDLE TimerHandle,
3334 IN PLARGE_INTEGER DueTime,
3335 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
3336 IN PVOID TimerContext OPTIONAL,
3337 IN BOOLEAN ResumeTimer,
3338 IN LONG Period OPTIONAL,
3339 OUT PBOOLEAN PreviousState OPTIONAL);
3340
3341 #endif
3342
3343 typedef struct _QUOTA_LIMITS {
3344 SIZE_T PagedPoolLimit;
3345 SIZE_T NonPagedPoolLimit;
3346 SIZE_T MinimumWorkingSetSize;
3347 SIZE_T MaximumWorkingSetSize;
3348 SIZE_T PagefileLimit;
3349 LARGE_INTEGER TimeLimit;
3350 } QUOTA_LIMITS, *PQUOTA_LIMITS;
3351
3352 struct _RTL_GENERIC_COMPARE_ROUTINE;
3353 struct _RTL_GENERIC_ALLOCATE_ROUTINE;
3354 struct _RTL_GENERIC_FREE_ROUTINE;
3355
3356 typedef struct _RTL_GENERIC_TABLE {
3357 PRTL_SPLAY_LINKS TableRoot;
3358 LIST_ENTRY InsertOrderList;
3359 PLIST_ENTRY OrderedPointer;
3360 ULONG WhichOrderedElement;
3361 ULONG NumberGenericTableElements;
3362 struct _RTL_GENERIC_COMPARE_ROUTINE *CompareRoutine;
3363 struct _RTL_GENERIC_ALLOCATE_ROUTINE *AllocateRoutine;
3364 struct _RTL_GENERIC_FREE_ROUTINE *FreeRoutine;
3365 PVOID TableContext;
3366 } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
3367
3368 typedef enum _TABLE_SEARCH_RESULT {
3369 TableEmptyTree,
3370 TableFoundNode,
3371 TableInsertAsLeft,
3372 TableInsertAsRight
3373 } TABLE_SEARCH_RESULT;
3374
3375 typedef struct _FILE_FS_SIZE_INFORMATION {
3376 LARGE_INTEGER TotalAllocationUnits;
3377 LARGE_INTEGER AvailableAllocationUnits;
3378 ULONG SectorsPerAllocationUnit;
3379 ULONG BytesPerSector;
3380 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
3381
3382 #define IO_CHECK_CREATE_PARAMETERS 0x0200
3383 #define IO_ATTACH_DEVICE 0x0400
3384 #define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
3385
3386 typedef struct _FILE_FS_VOLUME_INFORMATION {
3387 LARGE_INTEGER VolumeCreationTime;
3388 ULONG VolumeSerialNumber;
3389 ULONG VolumeLabelLength;
3390 BOOLEAN SupportsObjects;
3391 WCHAR VolumeLabel[1];
3392 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
3393
3394 typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
3395 LARGE_INTEGER TotalAllocationUnits;
3396 LARGE_INTEGER CallerAvailableAllocationUnits;
3397 LARGE_INTEGER ActualAvailableAllocationUnits;
3398 ULONG SectorsPerAllocationUnit;
3399 ULONG BytesPerSector;
3400 } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
3401
3402 typedef struct _FILE_FS_OBJECTID_INFORMATION {
3403 UCHAR ObjectId[16];
3404 UCHAR ExtendedInfo[48];
3405 } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
3406
3407 typedef struct _FILE_FS_LABEL_INFORMATION {
3408 ULONG VolumeLabelLength;
3409 WCHAR VolumeLabel[1];
3410 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
3411
3412 typedef enum _RTL_GENERIC_COMPARE_RESULTS {
3413 GenericLessThan,
3414 GenericGreaterThan,
3415 GenericEqual
3416 } RTL_GENERIC_COMPARE_RESULTS;
3417
3418 // Forwarder
3419 struct _RTL_AVL_TABLE;
3420
3421 typedef RTL_GENERIC_COMPARE_RESULTS
3422 (NTAPI *PRTL_AVL_COMPARE_ROUTINE) (
3423 IN struct _RTL_AVL_TABLE *Table,
3424 IN PVOID FirstStruct,
3425 IN PVOID SecondStruct);
3426
3427 typedef PVOID
3428 (NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) (
3429 IN struct _RTL_AVL_TABLE *Table,
3430 IN CLONG ByteSize);
3431
3432 typedef VOID
3433 (NTAPI *PRTL_AVL_FREE_ROUTINE) (
3434 IN struct _RTL_AVL_TABLE *Table,
3435 IN PVOID Buffer);
3436
3437 typedef NTSTATUS
3438 (NTAPI *PRTL_AVL_MATCH_FUNCTION) (
3439 IN struct _RTL_AVL_TABLE *Table,
3440 IN PVOID UserData,
3441 IN PVOID MatchData);
3442
3443 typedef struct _RTL_BALANCED_LINKS {
3444 struct _RTL_BALANCED_LINKS *Parent;
3445 struct _RTL_BALANCED_LINKS *LeftChild;
3446 struct _RTL_BALANCED_LINKS *RightChild;
3447 CHAR Balance;
3448 UCHAR Reserved[3];
3449 } RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
3450
3451 typedef struct _RTL_AVL_TABLE {
3452 RTL_BALANCED_LINKS BalancedRoot;
3453 PVOID OrderedPointer;
3454 ULONG WhichOrderedElement;
3455 ULONG NumberGenericTableElements;
3456 ULONG DepthOfTree;
3457 PRTL_BALANCED_LINKS RestartKey;
3458 ULONG DeleteCount;
3459 PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
3460 PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
3461 PRTL_AVL_FREE_ROUTINE FreeRoutine;
3462 PVOID TableContext;
3463 } RTL_AVL_TABLE, *PRTL_AVL_TABLE;
3464
3465 #ifndef RTL_USE_AVL_TABLES
3466
3467 struct _RTL_GENERIC_TABLE;
3468
3469 typedef RTL_GENERIC_COMPARE_RESULTS
3470 (NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) (
3471 IN struct _RTL_GENERIC_TABLE *Table,
3472 IN PVOID FirstStruct,
3473 IN PVOID SecondStruct);
3474
3475 typedef PVOID
3476 (NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) (
3477 IN struct _RTL_GENERIC_TABLE *Table,
3478 IN CLONG ByteSize);
3479
3480 typedef VOID
3481 (NTAPI *PRTL_GENERIC_FREE_ROUTINE) (
3482 IN struct _RTL_GENERIC_TABLE *Table,
3483 IN PVOID Buffer);
3484
3485 #endif /* !RTL_USE_AVL_TABLES */
3486
3487 NTSYSAPI
3488 VOID
3489 NTAPI
3490 RtlInitializeGenericTableAvl(
3491 OUT PRTL_AVL_TABLE Table,
3492 IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
3493 IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
3494 IN PRTL_AVL_FREE_ROUTINE FreeRoutine,
3495 IN PVOID TableContext OPTIONAL);
3496
3497 #ifdef __cplusplus
3498 }
3499 #endif
3500
3501
3502 #endif /* _NTDDK_ */