4 * Windows Device Driver Kit
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
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.
26 /* Helper macro to enable gcc's extension. */
27 #ifndef __GNU_EXTENSION
29 #define __GNU_EXTENSION __extension__
31 #define __GNU_EXTENSION
46 #define NTHALAPI DECLSPEC_IMPORT
51 /* Pseudo modifiers for parameters */
67 #define RESTRICTED_POINTER
70 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
72 #define POINTER_ALIGNMENT
75 #define DECLSPEC_ADDRSAFE
77 #ifdef NONAMELESSUNION
78 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
79 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
81 # define _DDK_DUMMYUNION_MEMBER(name) name
82 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
86 ** Forward declarations
92 struct _DRIVE_LAYOUT_INFORMATION_EX
;
93 struct _LOADER_PARAMETER_BLOCK
;
97 /* FIXME: Unknown definitions */
98 struct _SET_PARTITION_INFORMATION_EX
;
99 typedef ULONG WAIT_TYPE
;
102 typedef HANDLE TRACEHANDLE
;
103 typedef PVOID PWMILIB_CONTEXT
;
104 typedef ULONG LOGICAL
;
108 ** WmiLib specific structure
112 IrpProcessed
, // Irp was processed and possibly completed
113 IrpNotCompleted
, // Irp was process and NOT completed
114 IrpNotWmi
, // Irp is not a WMI irp
115 IrpForward
// Irp is wmi irp, but targeted at another device object
116 } SYSCTL_IRP_DISPOSITION
, *PSYSCTL_IRP_DISPOSITION
;
121 struct _COMPRESSED_DATA_INFO
;
123 #define KERNEL_STACK_SIZE 12288
124 #define KERNEL_LARGE_STACK_SIZE 61440
125 #define KERNEL_LARGE_STACK_COMMIT 12288
127 #define EXCEPTION_READ_FAULT 0
128 #define EXCEPTION_WRITE_FAULT 1
129 #define EXCEPTION_EXECUTE_FAULT 8
131 #define DPFLTR_ERROR_LEVEL 0
132 #define DPFLTR_WARNING_LEVEL 1
133 #define DPFLTR_TRACE_LEVEL 2
134 #define DPFLTR_INFO_LEVEL 3
135 #define DPFLTR_MASK 0x80000000
137 typedef enum _DPFLTR_TYPE
139 DPFLTR_SYSTEM_ID
= 0,
144 DPFLTR_CRASHDUMP_ID
= 5,
145 DPFLTR_CDAUDIO_ID
= 6,
147 DPFLTR_CLASSPNP_ID
= 8,
149 DPFLTR_REDBOOK_ID
= 10,
150 DPFLTR_STORPROP_ID
= 11,
151 DPFLTR_SCSIPORT_ID
= 12,
152 DPFLTR_SCSIMINIPORT_ID
= 13,
153 DPFLTR_CONFIG_ID
= 14,
154 DPFLTR_I8042PRT_ID
= 15,
155 DPFLTR_SERMOUSE_ID
= 16,
156 DPFLTR_LSERMOUS_ID
= 17,
157 DPFLTR_KBDHID_ID
= 18,
158 DPFLTR_MOUHID_ID
= 19,
159 DPFLTR_KBDCLASS_ID
= 20,
160 DPFLTR_MOUCLASS_ID
= 21,
161 DPFLTR_TWOTRACK_ID
= 22,
162 DPFLTR_WMILIB_ID
= 23,
165 DPFLTR_HALIA64_ID
= 26,
166 DPFLTR_VIDEO_ID
= 27,
167 DPFLTR_SVCHOST_ID
= 28,
168 DPFLTR_VIDEOPRT_ID
= 29,
169 DPFLTR_TCPIP_ID
= 30,
170 DPFLTR_DMSYNTH_ID
= 31,
171 DPFLTR_NTOSPNP_ID
= 32,
172 DPFLTR_FASTFAT_ID
= 33,
173 DPFLTR_SAMSS_ID
= 34,
174 DPFLTR_PNPMGR_ID
= 35,
175 DPFLTR_NETAPI_ID
= 36,
176 DPFLTR_SCSERVER_ID
= 37,
177 DPFLTR_SCCLIENT_ID
= 38,
178 DPFLTR_SERIAL_ID
= 39,
179 DPFLTR_SERENUM_ID
= 40,
181 DPFLTR_BOOTOK_ID
= 42,
182 DPFLTR_BOOTVRFY_ID
= 43,
183 DPFLTR_RPCPROXY_ID
= 44,
184 DPFLTR_AUTOCHK_ID
= 45,
185 DPFLTR_DCOMSS_ID
= 46,
186 DPFLTR_UNIMODEM_ID
= 47,
188 DPFLTR_FLTMGR_ID
= 49,
189 DPFLTR_WMICORE_ID
= 50,
190 DPFLTR_BURNENG_ID
= 51,
191 DPFLTR_IMAPI_ID
= 52,
193 DPFLTR_FUSION_ID
= 54,
194 DPFLTR_IDLETASK_ID
= 55,
195 DPFLTR_SOFTPCI_ID
= 56,
197 DPFLTR_MCHGR_ID
= 58,
199 DPFLTR_PCIIDE_ID
= 60,
200 DPFLTR_FLOPPY_ID
= 61,
202 DPFLTR_TERMSRV_ID
= 63,
203 DPFLTR_W32TIME_ID
= 64,
204 DPFLTR_PREFETCHER_ID
= 65,
205 DPFLTR_RSFILTER_ID
= 66,
206 DPFLTR_FCPORT_ID
= 67,
209 DPFLTR_DMCONFIG_ID
= 70,
210 DPFLTR_DMADMIN_ID
= 71,
211 DPFLTR_WSOCKTRANSPORT_ID
= 72,
213 DPFLTR_PNPMEM_ID
= 74,
214 DPFLTR_PROCESSOR_ID
= 75,
215 DPFLTR_DMSERVER_ID
= 76,
217 DPFLTR_INFINIBAND_ID
= 78,
218 DPFLTR_IHVDRIVER_ID
= 79,
219 DPFLTR_IHVVIDEO_ID
= 80,
220 DPFLTR_IHVAUDIO_ID
= 81,
221 DPFLTR_IHVNETWORK_ID
= 82,
222 DPFLTR_IHVSTREAMING_ID
= 83,
223 DPFLTR_IHVBUS_ID
= 84,
225 DPFLTR_RTLTHREADPOOL_ID
= 86,
227 DPFLTR_TCPIP6_ID
= 88,
228 DPFLTR_ISAPNP_ID
= 89,
230 DPFLTR_STORPORT_ID
= 91,
231 DPFLTR_STORMINIPORT_ID
= 92,
232 DPFLTR_PRINTSPOOLER_ID
= 93,
234 DPFLTR_VDSBAS_ID
= 95,
235 DPFLTR_VDSDYNDR_ID
= 96,
236 DPFLTR_VDSUTIL_ID
= 97,
237 DPFLTR_DFRGIFC_ID
= 98,
238 DPFLTR_DEFAULT_ID
= 99,
240 DPFLTR_DFSC_ID
= 101,
241 DPFLTR_WOW64_ID
= 102,
245 /* also in winnt.h */
247 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
248 #define FILE_STRUCTURED_STORAGE 0x00000441
252 #define THREAD_ALERT (0x0004)
254 /* Exported object types */
255 extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType
;
256 extern POBJECT_TYPE NTSYSAPI ExEventObjectType
;
257 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType
;
258 extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType
;
259 extern ULONG NTSYSAPI IoDeviceHandlerObjectSize
;
260 extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType
;
261 extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType
;
262 extern POBJECT_TYPE NTSYSAPI IoDriverObjectType
;
263 extern POBJECT_TYPE NTSYSAPI IoFileObjectType
;
264 extern POBJECT_TYPE NTSYSAPI PsThreadType
;
265 extern POBJECT_TYPE NTSYSAPI LpcPortObjectType
;
266 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType
;
267 extern POBJECT_TYPE NTSYSAPI PsProcessType
;
269 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
270 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
272 #if (NTDDI_VERSION >= NTDDI_WINXP)
273 extern CCHAR NTSYSAPI KeNumberProcessors
;
275 //extern PCCHAR KeNumberProcessors;
276 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
280 #define MAX_WOW64_SHARED_ENTRIES 16
282 extern volatile KSYSTEM_TIME KeTickCount
;
284 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
285 #define NX_SUPPORT_POLICY_ALWAYSON 1
286 #define NX_SUPPORT_POLICY_OPTIN 2
287 #define NX_SUPPORT_POLICY_OPTOUT 3
289 typedef struct _KUSER_SHARED_DATA
291 ULONG TickCountLowDeprecated
;
292 ULONG TickCountMultiplier
;
293 volatile KSYSTEM_TIME InterruptTime
;
294 volatile KSYSTEM_TIME SystemTime
;
295 volatile KSYSTEM_TIME TimeZoneBias
;
296 USHORT ImageNumberLow
;
297 USHORT ImageNumberHigh
;
298 WCHAR NtSystemRoot
[260];
299 ULONG MaxStackTraceDepth
;
300 ULONG CryptoExponent
;
302 ULONG LargePageMinimum
;
304 NT_PRODUCT_TYPE NtProductType
;
305 BOOLEAN ProductTypeIsValid
;
306 ULONG NtMajorVersion
;
307 ULONG NtMinorVersion
;
308 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
311 volatile ULONG TimeSlip
;
312 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
313 LARGE_INTEGER SystemExpirationDate
;
315 BOOLEAN KdDebuggerEnabled
;
316 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
317 UCHAR NXSupportPolicy
;
319 volatile ULONG ActiveConsoleId
;
320 volatile ULONG DismountCount
;
321 ULONG ComPlusPackage
;
322 ULONG LastSystemRITEventTickCount
;
323 ULONG NumberOfPhysicalPages
;
324 BOOLEAN SafeBootMode
;
327 ULONGLONG TestRetInstruction
;
329 ULONG SystemCallReturn
;
330 ULONGLONG SystemCallPad
[3];
331 __GNU_EXTENSION
union {
332 volatile KSYSTEM_TIME TickCount
;
333 volatile ULONG64 TickCountQuad
;
336 #if (NTDDI_VERSION >= NTDDI_WS03)
337 LONGLONG ConsoleSessionForegroundProcessId
;
338 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
340 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
341 USHORT UserModeGlobalLogger
[8];
342 ULONG HeapTracingPid
[2];
343 ULONG CritSecTracingPid
[2];
344 __GNU_EXTENSION
union
346 ULONG SharedDataFlags
;
347 __GNU_EXTENSION
struct
349 ULONG DbgErrorPortPresent
:1;
350 ULONG DbgElevationEnabled
:1;
351 ULONG DbgVirtEnabled
:1;
352 ULONG DbgInstallerDetectEnabled
:1;
356 ULONG ImageFileExecutionOptions
;
357 KAFFINITY ActiveProcessorAffinity
;
359 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
362 ** IRP function codes
365 #define IRP_MN_QUERY_DIRECTORY 0x01
366 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
368 #define IRP_MN_USER_FS_REQUEST 0x00
369 #define IRP_MN_MOUNT_VOLUME 0x01
370 #define IRP_MN_VERIFY_VOLUME 0x02
371 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
372 #define IRP_MN_TRACK_LINK 0x04
373 #define IRP_MN_KERNEL_CALL 0x04
375 #define IRP_MN_LOCK 0x01
376 #define IRP_MN_UNLOCK_SINGLE 0x02
377 #define IRP_MN_UNLOCK_ALL 0x03
378 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
380 #define IRP_MN_NORMAL 0x00
381 #define IRP_MN_DPC 0x01
382 #define IRP_MN_MDL 0x02
383 #define IRP_MN_COMPLETE 0x04
384 #define IRP_MN_COMPRESSED 0x08
386 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
387 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
388 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
390 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
392 typedef EXCEPTION_DISPOSITION
393 (DDKAPI
*PEXCEPTION_ROUTINE
)(
394 IN
struct _EXCEPTION_RECORD
*ExceptionRecord
,
395 IN PVOID EstablisherFrame
,
396 IN OUT
struct _CONTEXT
*ContextRecord
,
397 IN OUT PVOID DispatcherContext
);
400 (DDKAPI
*PDRIVER_ENTRY
)(
401 IN
struct _DRIVER_OBJECT
*DriverObject
,
402 IN PUNICODE_STRING RegistryPath
);
405 (DDKAPI
*PDRIVER_REINITIALIZE
)(
406 IN
struct _DRIVER_OBJECT
*DriverObject
,
411 (DDKAPI
*PKTRANSFER_ROUTINE
)(
414 #define ASSERT_GATE(object) \
415 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
416 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
418 #define TIMER_TABLE_SIZE 512
419 #define TIMER_TABLE_SHIFT 9
421 #define ASSERT_TIMER(E) \
422 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
423 ((E)->Header.Type == TimerSynchronizationObject))
425 #define ASSERT_MUTANT(E) \
426 ASSERT((E)->Header.Type == MutantObject)
428 #define ASSERT_SEMAPHORE(E) \
429 ASSERT((E)->Header.Type == SemaphoreObject)
431 #define ASSERT_EVENT(E) \
432 ASSERT(((E)->Header.Type == NotificationEvent) || \
433 ((E)->Header.Type == SynchronizationEvent))
436 typedef enum _TIMER_TYPE
{
441 #define KEYBOARD_INSERT_ON 0x08
442 #define KEYBOARD_CAPS_LOCK_ON 0x04
443 #define KEYBOARD_NUM_LOCK_ON 0x02
444 #define KEYBOARD_SCROLL_LOCK_ON 0x01
445 #define KEYBOARD_ALT_KEY_DOWN 0x80
446 #define KEYBOARD_CTRL_KEY_DOWN 0x40
447 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
448 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
450 typedef struct _IO_COUNTERS
{
451 ULONGLONG ReadOperationCount
;
452 ULONGLONG WriteOperationCount
;
453 ULONGLONG OtherOperationCount
;
454 ULONGLONG ReadTransferCount
;
455 ULONGLONG WriteTransferCount
;
456 ULONGLONG OtherTransferCount
;
457 } IO_COUNTERS
, *PIO_COUNTERS
;
459 typedef struct _VM_COUNTERS
461 SIZE_T PeakVirtualSize
;
463 ULONG PageFaultCount
;
464 SIZE_T PeakWorkingSetSize
;
465 SIZE_T WorkingSetSize
;
466 SIZE_T QuotaPeakPagedPoolUsage
;
467 SIZE_T QuotaPagedPoolUsage
;
468 SIZE_T QuotaPeakNonPagedPoolUsage
;
469 SIZE_T QuotaNonPagedPoolUsage
;
470 SIZE_T PagefileUsage
;
471 SIZE_T PeakPagefileUsage
;
472 } VM_COUNTERS
, *PVM_COUNTERS
;
474 typedef struct _VM_COUNTERS_EX
476 SIZE_T PeakVirtualSize
;
478 ULONG PageFaultCount
;
479 SIZE_T PeakWorkingSetSize
;
480 SIZE_T WorkingSetSize
;
481 SIZE_T QuotaPeakPagedPoolUsage
;
482 SIZE_T QuotaPagedPoolUsage
;
483 SIZE_T QuotaPeakNonPagedPoolUsage
;
484 SIZE_T QuotaNonPagedPoolUsage
;
485 SIZE_T PagefileUsage
;
486 SIZE_T PeakPagefileUsage
;
488 } VM_COUNTERS_EX
, *PVM_COUNTERS_EX
;
490 typedef struct _POOLED_USAGE_AND_LIMITS
492 SIZE_T PeakPagedPoolUsage
;
493 SIZE_T PagedPoolUsage
;
494 SIZE_T PagedPoolLimit
;
495 SIZE_T PeakNonPagedPoolUsage
;
496 SIZE_T NonPagedPoolUsage
;
497 SIZE_T NonPagedPoolLimit
;
498 SIZE_T PeakPagefileUsage
;
499 SIZE_T PagefileUsage
;
500 SIZE_T PagefileLimit
;
501 } POOLED_USAGE_AND_LIMITS
, *PPOOLED_USAGE_AND_LIMITS
;
503 typedef struct _CONTROLLER_OBJECT
{
506 PVOID ControllerExtension
;
507 KDEVICE_QUEUE DeviceWaitQueue
;
509 LARGE_INTEGER Spare2
;
510 } CONTROLLER_OBJECT
, *PCONTROLLER_OBJECT
;
512 /* DEVICE_OBJECT.Flags */
514 #define DO_DEVICE_HAS_NAME 0x00000040
515 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
516 #define DO_LONG_TERM_REQUESTS 0x00000200
517 #define DO_NEVER_LAST_DEVICE 0x00000400
518 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
519 #define DO_XIP 0x00020000
521 #define DRVO_REINIT_REGISTERED 0x00000008
522 #define DRVO_INITIALIZED 0x00000010
523 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
524 #define DRVO_LEGACY_RESOURCES 0x00000040
526 typedef enum _ARBITER_REQUEST_SOURCE
{
527 ArbiterRequestUndefined
= -1,
528 ArbiterRequestLegacyReported
,
529 ArbiterRequestHalReported
,
530 ArbiterRequestLegacyAssigned
,
531 ArbiterRequestPnpDetected
,
532 ArbiterRequestPnpEnumerated
533 } ARBITER_REQUEST_SOURCE
;
535 typedef enum _ARBITER_RESULT
{
536 ArbiterResultUndefined
= -1,
537 ArbiterResultSuccess
,
538 ArbiterResultExternalConflict
,
539 ArbiterResultNullRequest
542 typedef enum _ARBITER_ACTION
{
543 ArbiterActionTestAllocation
,
544 ArbiterActionRetestAllocation
,
545 ArbiterActionCommitAllocation
,
546 ArbiterActionRollbackAllocation
,
547 ArbiterActionQueryAllocatedResources
,
548 ArbiterActionWriteReservedResources
,
549 ArbiterActionQueryConflict
,
550 ArbiterActionQueryArbitrate
,
551 ArbiterActionAddReserved
,
552 ArbiterActionBootAllocation
553 } ARBITER_ACTION
, *PARBITER_ACTION
;
555 typedef struct _ARBITER_CONFLICT_INFO
{
556 PDEVICE_OBJECT OwningObject
;
559 } ARBITER_CONFLICT_INFO
, *PARBITER_CONFLICT_INFO
;
561 typedef struct _ARBITER_PARAMETERS
{
564 IN OUT PLIST_ENTRY ArbitrationList
;
565 IN ULONG AllocateFromCount
;
566 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom
;
570 IN OUT PLIST_ENTRY ArbitrationList
;
571 IN ULONG AllocateFromCount
;
572 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom
;
576 IN OUT PLIST_ENTRY ArbitrationList
;
580 OUT PCM_PARTIAL_RESOURCE_LIST
*AllocatedResources
;
581 } QueryAllocatedResources
;
584 IN PDEVICE_OBJECT PhysicalDeviceObject
;
585 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource
;
586 OUT PULONG ConflictCount
;
587 OUT PARBITER_CONFLICT_INFO
*Conflicts
;
591 IN PLIST_ENTRY ArbitrationList
;
595 IN PDEVICE_OBJECT ReserveDevice
;
598 } ARBITER_PARAMETERS
, *PARBITER_PARAMETERS
;
600 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
602 typedef struct _ARBITER_LIST_ENTRY
{
603 LIST_ENTRY ListEntry
;
604 ULONG AlternativeCount
;
605 PIO_RESOURCE_DESCRIPTOR Alternatives
;
606 PDEVICE_OBJECT PhysicalDeviceObject
;
607 ARBITER_REQUEST_SOURCE RequestSource
;
610 INTERFACE_TYPE InterfaceType
;
613 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment
;
614 PIO_RESOURCE_DESCRIPTOR SelectedAlternative
;
615 ARBITER_RESULT Result
;
616 } ARBITER_LIST_ENTRY
, *PARBITER_LIST_ENTRY
;
619 (DDKAPI
*PARBITER_HANDLER
)(
621 IN ARBITER_ACTION Action
,
622 IN OUT PARBITER_PARAMETERS Parameters
);
624 #define ARBITER_PARTIAL 0x00000001
626 typedef struct _ARBITER_INTERFACE
{
630 PINTERFACE_REFERENCE InterfaceReference
;
631 PINTERFACE_DEREFERENCE InterfaceDereference
;
632 PARBITER_HANDLER ArbiterHandler
;
634 } ARBITER_INTERFACE
, *PARBITER_INTERFACE
;
636 typedef enum _HAL_QUERY_INFORMATION_CLASS
{
637 HalInstalledBusInformation
,
638 HalProfileSourceInformation
,
639 HalInformationClassUnused1
,
641 HalProcessorSpeedInformation
,
642 HalCallbackInformation
,
643 HalMapRegisterInformation
,
644 HalMcaLogInformation
,
645 HalFrameBufferCachingInformation
,
646 HalDisplayBiosInformation
,
647 HalProcessorFeatureInformation
,
648 HalNumaTopologyInterface
,
650 HalCmcLogInformation
,
651 HalCpeLogInformation
,
652 HalQueryMcaInterface
,
653 HalQueryAMLIIllegalIOPortAddresses
,
654 HalQueryMaxHotPlugMemoryAddress
,
655 HalPartitionIpiInterface
,
656 HalPlatformInformation
,
657 HalQueryProfileSourceList
658 } HAL_QUERY_INFORMATION_CLASS
, *PHAL_QUERY_INFORMATION_CLASS
;
660 typedef enum _HAL_SET_INFORMATION_CLASS
{
661 HalProfileSourceInterval
,
662 HalProfileSourceInterruptHandler
,
663 HalMcaRegisterDriver
,
664 HalKernelErrorHandler
,
665 HalCmcRegisterDriver
,
666 HalCpeRegisterDriver
,
670 HalGenerateCmcInterrupt
671 } HAL_SET_INFORMATION_CLASS
, *PHAL_SET_INFORMATION_CLASS
;
673 typedef struct _HAL_PROFILE_SOURCE_INTERVAL
675 KPROFILE_SOURCE Source
;
677 } HAL_PROFILE_SOURCE_INTERVAL
, *PHAL_PROFILE_SOURCE_INTERVAL
;
679 typedef struct _HAL_PROFILE_SOURCE_INFORMATION
681 KPROFILE_SOURCE Source
;
684 } HAL_PROFILE_SOURCE_INFORMATION
, *PHAL_PROFILE_SOURCE_INFORMATION
;
686 typedef struct _MAP_REGISTER_ENTRY
689 BOOLEAN WriteToDevice
;
690 } MAP_REGISTER_ENTRY
, *PMAP_REGISTER_ENTRY
;
697 PUCHAR TranslatedAddress
;
699 } DEBUG_DEVICE_ADDRESS
, *PDEBUG_DEVICE_ADDRESS
;
703 PHYSICAL_ADDRESS Start
;
704 PHYSICAL_ADDRESS MaxEnd
;
705 PVOID VirtualAddress
;
709 } DEBUG_MEMORY_REQUIREMENTS
, *PDEBUG_MEMORY_REQUIREMENTS
;
721 DEBUG_DEVICE_ADDRESS BaseAddress
[6];
722 DEBUG_MEMORY_REQUIREMENTS Memory
;
723 } DEBUG_DEVICE_DESCRIPTOR
, *PDEBUG_DEVICE_DESCRIPTOR
;
725 /* Function Type Defintions for Dispatch Functions */
726 struct _DEVICE_CONTROL_CONTEXT
;
729 (DDKAPI
*PDEVICE_CONTROL_COMPLETION
)(
730 IN
struct _DEVICE_CONTROL_CONTEXT
*ControlContext
);
732 typedef struct _DEVICE_CONTROL_CONTEXT
{
734 PDEVICE_HANDLER_OBJECT DeviceHandler
;
735 PDEVICE_OBJECT DeviceObject
;
740 } DEVICE_CONTROL_CONTEXT
, *PDEVICE_CONTROL_CONTEXT
;
742 typedef struct _PM_DISPATCH_TABLE
{
746 } PM_DISPATCH_TABLE
, *PPM_DISPATCH_TABLE
;
748 typedef enum _RESOURCE_TRANSLATION_DIRECTION
{
749 TranslateChildToParent
,
750 TranslateParentToChild
751 } RESOURCE_TRANSLATION_DIRECTION
;
754 (DDKAPI
*PTRANSLATE_RESOURCE_HANDLER
)(
756 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source
,
757 IN RESOURCE_TRANSLATION_DIRECTION Direction
,
758 IN ULONG AlternativesCount
,
759 IN IO_RESOURCE_DESCRIPTOR Alternatives
[],
760 IN PDEVICE_OBJECT PhysicalDeviceObject
,
761 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target
);
764 (DDKAPI
*PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER
)(
766 IN PIO_RESOURCE_DESCRIPTOR Source
,
767 IN PDEVICE_OBJECT PhysicalDeviceObject
,
768 OUT PULONG TargetCount
,
769 OUT PIO_RESOURCE_DESCRIPTOR
*Target
);
771 typedef struct _TRANSLATOR_INTERFACE
{
775 PINTERFACE_REFERENCE InterfaceReference
;
776 PINTERFACE_DEREFERENCE InterfaceDereference
;
777 PTRANSLATE_RESOURCE_HANDLER TranslateResources
;
778 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements
;
779 } TRANSLATOR_INTERFACE
, *PTRANSLATOR_INTERFACE
;
782 (DDKAPI
*pHalDeviceControl
)(
783 IN PDEVICE_HANDLER_OBJECT DeviceHandler
,
784 IN PDEVICE_OBJECT DeviceObject
,
785 IN ULONG ControlCode
,
786 IN OUT PVOID Buffer OPTIONAL
,
787 IN OUT PULONG BufferLength OPTIONAL
,
789 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine
);
792 (FASTCALL
*pHalExamineMBR
)(
793 IN PDEVICE_OBJECT DeviceObject
,
795 IN ULONG MBRTypeIdentifier
,
799 (FASTCALL
*pHalIoAssignDriveLetters
)(
800 IN
struct _LOADER_PARAMETER_BLOCK
*LoaderBlock
,
801 IN PSTRING NtDeviceName
,
802 OUT PUCHAR NtSystemPath
,
803 OUT PSTRING NtSystemPathString
);
806 (FASTCALL
*pHalIoReadPartitionTable
)(
807 IN PDEVICE_OBJECT DeviceObject
,
809 IN BOOLEAN ReturnRecognizedPartitions
,
810 OUT
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
813 (FASTCALL
*pHalIoSetPartitionInformation
)(
814 IN PDEVICE_OBJECT DeviceObject
,
816 IN ULONG PartitionNumber
,
817 IN ULONG PartitionType
);
820 (FASTCALL
*pHalIoWritePartitionTable
)(
821 IN PDEVICE_OBJECT DeviceObject
,
823 IN ULONG SectorsPerTrack
,
824 IN ULONG NumberOfHeads
,
825 IN
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
828 (FASTCALL
*pHalHandlerForBus
)(
829 IN INTERFACE_TYPE InterfaceType
,
833 (FASTCALL
*pHalReferenceBusHandler
)(
834 IN PBUS_HANDLER BusHandler
);
837 (DDKAPI
*pHalQuerySystemInformation
)(
838 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
841 OUT PULONG ReturnedLength
);
844 (DDKAPI
*pHalSetSystemInformation
)(
845 IN HAL_SET_INFORMATION_CLASS InformationClass
,
850 (DDKAPI
*pHalQueryBusSlots
)(
851 IN PBUS_HANDLER BusHandler
,
853 OUT PULONG SlotNumbers
,
854 OUT PULONG ReturnedLength
);
857 (DDKAPI
*pHalInitPnpDriver
)(
861 (DDKAPI
*pHalInitPowerManagement
)(
862 IN PPM_DISPATCH_TABLE PmDriverDispatchTable
,
863 OUT PPM_DISPATCH_TABLE
*PmHalDispatchTable
);
865 typedef struct _DMA_ADAPTER
*
866 (DDKAPI
*pHalGetDmaAdapter
)(
868 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
869 OUT PULONG NumberOfMapRegisters
);
872 (DDKAPI
*pHalGetInterruptTranslator
)(
873 IN INTERFACE_TYPE ParentInterfaceType
,
874 IN ULONG ParentBusNumber
,
875 IN INTERFACE_TYPE BridgeInterfaceType
,
878 OUT PTRANSLATOR_INTERFACE Translator
,
879 OUT PULONG BridgeBusNumber
);
882 (DDKAPI
*pHalStartMirroring
)(
886 (DDKAPI
*pHalEndMirroring
)(
887 IN ULONG PassNumber
);
890 (DDKAPI
*pHalMirrorPhysicalMemory
)(
891 IN PHYSICAL_ADDRESS PhysicalAddress
,
892 IN LARGE_INTEGER NumberOfBytes
);
895 (DDKAPI
*pHalMirrorVerify
)(
896 IN PHYSICAL_ADDRESS PhysicalAddress
,
897 IN LARGE_INTEGER NumberOfBytes
);
900 (DDKAPI
*pHalEndOfBoot
)(
905 (DDKAPI
*pHalTranslateBusAddress
)(
906 IN INTERFACE_TYPE InterfaceType
,
908 IN PHYSICAL_ADDRESS BusAddress
,
909 IN OUT PULONG AddressSpace
,
910 OUT PPHYSICAL_ADDRESS TranslatedAddress
915 (DDKAPI
*pHalAssignSlotResources
)(
916 IN PUNICODE_STRING RegistryPath
,
917 IN PUNICODE_STRING DriverClassName OPTIONAL
,
918 IN PDRIVER_OBJECT DriverObject
,
919 IN PDEVICE_OBJECT DeviceObject
,
920 IN INTERFACE_TYPE BusType
,
923 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
928 (DDKAPI
*pHalHaltSystem
)(
934 (DDKAPI
*pHalResetDisplay
)(
940 (DDKAPI
*pHalVectorToIDTEntry
)(
946 (DDKAPI
*pHalFindBusAddressTranslation
)(
947 IN PHYSICAL_ADDRESS BusAddress
,
948 IN OUT PULONG AddressSpace
,
949 OUT PPHYSICAL_ADDRESS TranslatedAddress
,
950 IN OUT PULONG_PTR Context
,
956 (DDKAPI
*pKdSetupPciDeviceForDebugging
)(
957 IN PVOID LoaderBlock OPTIONAL
,
958 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
963 (DDKAPI
*pKdReleasePciDeviceForDebugging
)(
964 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
969 (DDKAPI
*pKdGetAcpiTablePhase0
)(
970 IN
struct _LOADER_PARAMETER_BLOCK
*LoaderBlock
,
976 (DDKAPI
*pKdCheckPowerButton
)(
982 (DDKAPI
*pHalGetInterruptVector
)(
983 IN INTERFACE_TYPE InterfaceType
,
985 IN ULONG BusInterruptLevel
,
986 IN ULONG BusInterruptVector
,
988 OUT PKAFFINITY Affinity
993 (DDKAPI
*pHalGetVectorInput
)(
995 IN KAFFINITY Affinity
,
997 OUT PKINTERRUPT_POLARITY Polarity
1002 (DDKAPI
*pKdMapPhysicalMemory64
)(
1003 IN PHYSICAL_ADDRESS PhysicalAddress
,
1004 IN ULONG NumberPages
1009 (DDKAPI
*pKdUnmapVirtualAddress
)(
1010 IN PVOID VirtualAddress
,
1011 IN ULONG NumberPages
1016 (DDKAPI
*pKdGetPciDataByOffset
)(
1018 IN ULONG SlotNumber
,
1026 (DDKAPI
*pKdSetPciDataByOffset
)(
1028 IN ULONG SlotNumber
,
1035 (DDKAPI
*PHAL_RESET_DISPLAY_PARAMETERS
)(
1036 ULONG Columns
, ULONG Rows
);
1040 pHalQuerySystemInformation HalQuerySystemInformation
;
1041 pHalSetSystemInformation HalSetSystemInformation
;
1042 pHalQueryBusSlots HalQueryBusSlots
;
1044 pHalExamineMBR HalExamineMBR
;
1045 pHalIoAssignDriveLetters HalIoAssignDriveLetters
;
1046 pHalIoReadPartitionTable HalIoReadPartitionTable
;
1047 pHalIoSetPartitionInformation HalIoSetPartitionInformation
;
1048 pHalIoWritePartitionTable HalIoWritePartitionTable
;
1049 pHalHandlerForBus HalReferenceHandlerForBus
;
1050 pHalReferenceBusHandler HalReferenceBusHandler
;
1051 pHalReferenceBusHandler HalDereferenceBusHandler
;
1052 pHalInitPnpDriver HalInitPnpDriver
;
1053 pHalInitPowerManagement HalInitPowerManagement
;
1054 pHalGetDmaAdapter HalGetDmaAdapter
;
1055 pHalGetInterruptTranslator HalGetInterruptTranslator
;
1056 pHalStartMirroring HalStartMirroring
;
1057 pHalEndMirroring HalEndMirroring
;
1058 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory
;
1059 pHalEndOfBoot HalEndOfBoot
;
1060 pHalMirrorVerify HalMirrorVerify
;
1061 } HAL_DISPATCH
, *PHAL_DISPATCH
;
1063 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_)
1064 extern NTSYSAPI PHAL_DISPATCH HalDispatchTable
;
1065 #define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
1067 extern __declspec(dllexport
) HAL_DISPATCH HalDispatchTable
;
1068 #define HALDISPATCH (&HalDispatchTable)
1071 #define HAL_DISPATCH_VERSION 3
1072 #define HalDispatchTableVersion HALDISPATCH->Version
1073 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
1074 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
1075 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
1076 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
1077 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
1078 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
1079 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
1080 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
1081 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
1082 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
1083 #define HalStartMirroring HALDISPATCH->HalStartMirroring
1084 #define HalEndMirroring HALDISPATCH->HalEndMirroring
1085 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
1086 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
1087 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
1089 typedef struct _FILE_ALIGNMENT_INFORMATION
{
1090 ULONG AlignmentRequirement
;
1091 } FILE_ALIGNMENT_INFORMATION
, *PFILE_ALIGNMENT_INFORMATION
;
1093 typedef struct _FILE_NAME_INFORMATION
{
1094 ULONG FileNameLength
;
1096 } FILE_NAME_INFORMATION
, *PFILE_NAME_INFORMATION
;
1099 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION
{
1100 ULONG FileAttributes
;
1102 } FILE_ATTRIBUTE_TAG_INFORMATION
, *PFILE_ATTRIBUTE_TAG_INFORMATION
;
1104 typedef struct _FILE_DISPOSITION_INFORMATION
{
1106 } FILE_DISPOSITION_INFORMATION
, *PFILE_DISPOSITION_INFORMATION
;
1108 typedef struct _FILE_END_OF_FILE_INFORMATION
{
1109 LARGE_INTEGER EndOfFile
;
1110 } FILE_END_OF_FILE_INFORMATION
, *PFILE_END_OF_FILE_INFORMATION
;
1112 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
{
1113 LARGE_INTEGER ValidDataLength
;
1114 } FILE_VALID_DATA_LENGTH_INFORMATION
, *PFILE_VALID_DATA_LENGTH_INFORMATION
;
1116 typedef union _FILE_SEGMENT_ELEMENT
{
1118 ULONGLONG Alignment
;
1119 }FILE_SEGMENT_ELEMENT
, *PFILE_SEGMENT_ELEMENT
;
1121 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
1123 typedef struct _KEY_USER_FLAGS_INFORMATION
{
1125 } KEY_USER_FLAGS_INFORMATION
, *PKEY_USER_FLAGS_INFORMATION
;
1127 typedef struct _PCI_COMMON_CONFIG
{
1136 UCHAR CacheLineSize
;
1141 struct _PCI_HEADER_TYPE_0
{
1142 ULONG BaseAddresses
[PCI_TYPE0_ADDRESSES
];
1146 ULONG ROMBaseAddress
;
1147 UCHAR CapabilitiesPtr
;
1150 UCHAR InterruptLine
;
1153 UCHAR MaximumLatency
;
1155 struct _PCI_HEADER_TYPE_1
{
1156 ULONG BaseAddresses
[PCI_TYPE1_ADDRESSES
];
1159 UCHAR SubordinateBus
;
1160 UCHAR SecondaryLatency
;
1163 USHORT SecondaryStatus
;
1166 USHORT PrefetchBase
;
1167 USHORT PrefetchLimit
;
1168 ULONG PrefetchBaseUpper32
;
1169 ULONG PrefetchLimitUpper32
;
1170 USHORT IOBaseUpper16
;
1171 USHORT IOLimitUpper16
;
1172 UCHAR CapabilitiesPtr
;
1174 ULONG ROMBaseAddress
;
1175 UCHAR InterruptLine
;
1177 USHORT BridgeControl
;
1179 struct _PCI_HEADER_TYPE_2
{
1180 ULONG SocketRegistersBaseAddress
;
1181 UCHAR CapabilitiesPtr
;
1183 USHORT SecondaryStatus
;
1186 UCHAR SubordinateBus
;
1187 UCHAR SecondaryLatency
;
1191 } Range
[PCI_TYPE2_ADDRESSES
- 1];
1192 UCHAR InterruptLine
;
1194 USHORT BridgeControl
;
1197 UCHAR DeviceSpecific
[192];
1198 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
1201 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
1203 typedef struct _OSVERSIONINFOA
{
1204 ULONG dwOSVersionInfoSize
;
1205 ULONG dwMajorVersion
;
1206 ULONG dwMinorVersion
;
1207 ULONG dwBuildNumber
;
1209 CHAR szCSDVersion
[128];
1210 } OSVERSIONINFOA
, *POSVERSIONINFOA
, *LPOSVERSIONINFOA
;
1212 typedef struct _OSVERSIONINFOW
{
1213 ULONG dwOSVersionInfoSize
;
1214 ULONG dwMajorVersion
;
1215 ULONG dwMinorVersion
;
1216 ULONG dwBuildNumber
;
1218 WCHAR szCSDVersion
[128];
1219 } OSVERSIONINFOW
, *POSVERSIONINFOW
, *LPOSVERSIONINFOW
, RTL_OSVERSIONINFOW
, *PRTL_OSVERSIONINFOW
;
1222 typedef OSVERSIONINFOW OSVERSIONINFO
;
1223 typedef POSVERSIONINFOW POSVERSIONINFO
;
1224 typedef LPOSVERSIONINFOW LPOSVERSIONINFO
;
1226 typedef OSVERSIONINFOA OSVERSIONINFO
;
1227 typedef POSVERSIONINFOA POSVERSIONINFO
;
1228 typedef LPOSVERSIONINFOA LPOSVERSIONINFO
;
1231 typedef struct _OSVERSIONINFOEXA
{
1232 ULONG dwOSVersionInfoSize
;
1233 ULONG dwMajorVersion
;
1234 ULONG dwMinorVersion
;
1235 ULONG dwBuildNumber
;
1237 CHAR szCSDVersion
[128];
1238 USHORT wServicePackMajor
;
1239 USHORT wServicePackMinor
;
1243 } OSVERSIONINFOEXA
, *POSVERSIONINFOEXA
, *LPOSVERSIONINFOEXA
;
1245 typedef struct _OSVERSIONINFOEXW
{
1246 ULONG dwOSVersionInfoSize
;
1247 ULONG dwMajorVersion
;
1248 ULONG dwMinorVersion
;
1249 ULONG dwBuildNumber
;
1251 WCHAR szCSDVersion
[128];
1252 USHORT wServicePackMajor
;
1253 USHORT wServicePackMinor
;
1257 } OSVERSIONINFOEXW
, *POSVERSIONINFOEXW
, *LPOSVERSIONINFOEXW
, RTL_OSVERSIONINFOEXW
, *PRTL_OSVERSIONINFOEXW
;
1260 typedef OSVERSIONINFOEXW OSVERSIONINFOEX
;
1261 typedef POSVERSIONINFOEXW POSVERSIONINFOEX
;
1262 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX
;
1264 typedef OSVERSIONINFOEXA OSVERSIONINFOEX
;
1265 typedef POSVERSIONINFOEXA POSVERSIONINFOEX
;
1266 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX
;
1272 VerSetConditionMask(
1273 IN ULONGLONG ConditionMask
,
1275 IN UCHAR Condition
);
1277 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
1278 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
1279 (TypeBitMask), (ComparisonType)))
1281 /* RtlVerifyVersionInfo() TypeMask */
1283 #define VER_MINORVERSION 0x0000001
1284 #define VER_MAJORVERSION 0x0000002
1285 #define VER_BUILDNUMBER 0x0000004
1286 #define VER_PLATFORMID 0x0000008
1287 #define VER_SERVICEPACKMINOR 0x0000010
1288 #define VER_SERVICEPACKMAJOR 0x0000020
1289 #define VER_SUITENAME 0x0000040
1290 #define VER_PRODUCT_TYPE 0x0000080
1292 /* RtlVerifyVersionInfo() ComparisonType */
1295 #define VER_GREATER 2
1296 #define VER_GREATER_EQUAL 3
1298 #define VER_LESS_EQUAL 5
1302 #define VER_CONDITION_MASK 7
1303 #define VER_NUM_BITS_PER_CONDITION_MASK 3
1308 (NTAPI
*PRTL_CONFLICT_RANGE_CALLBACK
) (
1310 struct _RTL_RANGE
*Range
1313 typedef enum _EVENT_TYPE
{
1315 SynchronizationEvent
1318 typedef struct _KWAIT_BLOCK
{
1319 LIST_ENTRY WaitListEntry
;
1320 struct _KTHREAD
* RESTRICTED_POINTER Thread
;
1322 struct _KWAIT_BLOCK
* RESTRICTED_POINTER NextWaitBlock
;
1326 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *RESTRICTED_POINTER PRKWAIT_BLOCK
;
1328 typedef enum _KINTERRUPT_MODE
{
1333 #define THREAD_WAIT_OBJECTS 3
1336 (DDKAPI
*PKINTERRUPT_ROUTINE
)(
1339 typedef enum _CREATE_FILE_TYPE
{
1341 CreateFileTypeNamedPipe
,
1342 CreateFileTypeMailslot
1345 typedef struct _CONFIGURATION_INFORMATION
{
1350 ULONG ScsiPortCount
;
1352 ULONG ParallelCount
;
1353 BOOLEAN AtDiskPrimaryAddressClaimed
;
1354 BOOLEAN AtDiskSecondaryAddressClaimed
;
1356 ULONG MediumChangerCount
;
1357 } CONFIGURATION_INFORMATION
, *PCONFIGURATION_INFORMATION
;
1359 typedef enum _CONFIGURATION_TYPE
{
1362 FloatingPointProcessor
,
1372 MultiFunctionAdapter
,
1386 FloppyDiskPeripheral
,
1399 RealModeIrqRoutingTable
,
1400 RealModePCIEnumeration
,
1402 } CONFIGURATION_TYPE
, *PCONFIGURATION_TYPE
;
1404 #define IO_FORCE_ACCESS_CHECK 0x001
1405 #define IO_NO_PARAMETER_CHECKING 0x100
1407 #define IO_REPARSE 0x0
1408 #define IO_REMOUNT 0x1
1411 (DDKAPI
*PIO_QUERY_DEVICE_ROUTINE
)(
1413 IN PUNICODE_STRING PathName
,
1414 IN INTERFACE_TYPE BusType
,
1416 IN PKEY_VALUE_FULL_INFORMATION
*BusInformation
,
1417 IN CONFIGURATION_TYPE ControllerType
,
1418 IN ULONG ControllerNumber
,
1419 IN PKEY_VALUE_FULL_INFORMATION
*ControllerInformation
,
1420 IN CONFIGURATION_TYPE PeripheralType
,
1421 IN ULONG PeripheralNumber
,
1422 IN PKEY_VALUE_FULL_INFORMATION
*PeripheralInformation
);
1424 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT
{
1425 IoQueryDeviceIdentifier
= 0,
1426 IoQueryDeviceConfigurationData
,
1427 IoQueryDeviceComponentInformation
,
1428 IoQueryDeviceMaxData
1429 } IO_QUERY_DEVICE_DATA_FORMAT
, *PIO_QUERY_DEVICE_DATA_FORMAT
;
1431 typedef enum _KBUGCHECK_CALLBACK_REASON
{
1433 KbCallbackReserved1
,
1434 KbCallbackSecondaryDumpData
,
1436 } KBUGCHECK_CALLBACK_REASON
;
1438 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
1441 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
1442 IN KBUGCHECK_CALLBACK_REASON Reason
,
1443 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
1444 IN OUT PVOID ReasonSpecificData
,
1445 IN ULONG ReasonSpecificDataLength
);
1447 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
1449 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
1452 KBUGCHECK_CALLBACK_REASON Reason
;
1454 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
1456 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
1462 } KBUGCHECK_BUFFER_DUMP_STATE
;
1465 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
1469 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
1471 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
1477 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
1480 (DDKAPI
*PNMI_CALLBACK
)(
1482 IN BOOLEAN Handled
);
1486 * KeInitializeCallbackRecord(
1487 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1489 #define KeInitializeCallbackRecord(CallbackRecord) \
1490 CallbackRecord->State = BufferEmpty;
1492 typedef enum _KDPC_IMPORTANCE
{
1498 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
1499 MmFrameBufferCached
= 2
1500 } MEMORY_CACHING_TYPE_ORIG
;
1502 typedef enum _MEMORY_CACHING_TYPE
{
1503 MmNonCached
= FALSE
,
1505 MmWriteCombined
= MmFrameBufferCached
,
1506 MmHardwareCoherentCached
,
1507 MmNonCachedUnordered
,
1510 } MEMORY_CACHING_TYPE
;
1512 typedef enum _MM_PAGE_PRIORITY
{
1514 NormalPagePriority
= 16,
1515 HighPagePriority
= 32
1518 typedef enum _LOCK_OPERATION
{
1524 #define FLUSH_MULTIPLE_MAXIMUM 32
1526 typedef enum _MM_SYSTEM_SIZE
{
1532 typedef struct _OBJECT_HANDLE_INFORMATION
{
1533 ULONG HandleAttributes
;
1534 ACCESS_MASK GrantedAccess
;
1535 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
1537 typedef struct _CLIENT_ID
{
1538 HANDLE UniqueProcess
;
1539 HANDLE UniqueThread
;
1540 } CLIENT_ID
, *PCLIENT_ID
;
1543 (DDKAPI
*PKSTART_ROUTINE
)(
1544 IN PVOID StartContext
);
1547 (DDKAPI
*PCREATE_PROCESS_NOTIFY_ROUTINE
)(
1549 IN HANDLE ProcessId
,
1553 (DDKAPI
*PCREATE_THREAD_NOTIFY_ROUTINE
)(
1554 IN HANDLE ProcessId
,
1558 typedef struct _IMAGE_INFO
{
1559 _ANONYMOUS_UNION
union {
1561 _ANONYMOUS_STRUCT
struct {
1562 ULONG ImageAddressingMode
: 8;
1563 ULONG SystemModeImage
: 1;
1564 ULONG ImageMappedToAllPids
: 1;
1565 ULONG Reserved
: 22;
1569 ULONG ImageSelector
;
1571 ULONG ImageSectionNumber
;
1572 } IMAGE_INFO
, *PIMAGE_INFO
;
1574 #define IMAGE_ADDRESSING_MODE_32BIT 3
1577 (DDKAPI
*PLOAD_IMAGE_NOTIFY_ROUTINE
)(
1578 IN PUNICODE_STRING FullImageName
,
1579 IN HANDLE ProcessId
,
1580 IN PIMAGE_INFO ImageInfo
);
1582 #pragma pack(push,4)
1583 typedef enum _BUS_DATA_TYPE
{
1584 ConfigurationSpaceUndefined
= -1,
1592 PCMCIAConfiguration
,
1595 PNPISAConfiguration
,
1596 SgiInternalConfiguration
,
1598 } BUS_DATA_TYPE
, *PBUS_DATA_TYPE
;
1601 typedef struct _NT_TIB
{
1602 struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;
1606 _ANONYMOUS_UNION
union {
1610 PVOID ArbitraryUserPointer
;
1611 struct _NT_TIB
*Self
;
1614 typedef struct _NT_TIB32
{
1615 ULONG ExceptionList
;
1619 __GNU_EXTENSION
union {
1623 ULONG ArbitraryUserPointer
;
1625 } NT_TIB32
,*PNT_TIB32
;
1627 typedef struct _NT_TIB64
{
1628 ULONG64 ExceptionList
;
1631 ULONG64 SubSystemTib
;
1632 __GNU_EXTENSION
union {
1636 ULONG64 ArbitraryUserPointer
;
1638 } NT_TIB64
,*PNT_TIB64
;
1640 typedef enum _PROCESSINFOCLASS
{
1641 ProcessBasicInformation
,
1646 ProcessBasePriority
,
1647 ProcessRaisePriority
,
1649 ProcessExceptionPort
,
1651 ProcessLdtInformation
,
1653 ProcessDefaultHardErrorMode
,
1654 ProcessIoPortHandlers
,
1655 ProcessPooledUsageAndLimits
,
1656 ProcessWorkingSetWatch
,
1657 ProcessUserModeIOPL
,
1658 ProcessEnableAlignmentFaultFixup
,
1659 ProcessPriorityClass
,
1660 ProcessWx86Information
,
1662 ProcessAffinityMask
,
1663 ProcessPriorityBoost
,
1665 ProcessSessionInformation
,
1666 ProcessForegroundInformation
,
1667 ProcessWow64Information
,
1668 ProcessImageFileName
,
1669 ProcessLUIDDeviceMapsEnabled
,
1670 ProcessBreakOnTermination
,
1671 ProcessDebugObjectHandle
,
1673 ProcessHandleTracing
,
1675 ProcessExecuteFlags
,
1676 ProcessTlsInformation
,
1678 ProcessImageInformation
,
1680 ProcessPagePriority
,
1681 ProcessInstrumentationCallback
,
1685 typedef enum _THREADINFOCLASS
{
1686 ThreadBasicInformation
,
1691 ThreadImpersonationToken
,
1692 ThreadDescriptorTableEntry
,
1693 ThreadEnableAlignmentFaultFixup
,
1694 ThreadEventPair_Reusable
,
1695 ThreadQuerySetWin32StartAddress
,
1697 ThreadPerformanceCount
,
1698 ThreadAmILastThread
,
1699 ThreadIdealProcessor
,
1700 ThreadPriorityBoost
,
1701 ThreadSetTlsArrayAddress
,
1703 ThreadHideFromDebugger
,
1704 ThreadBreakOnTermination
,
1705 ThreadSwitchLegacyState
,
1707 ThreadLastSystemCall
,
1711 ThreadActualBasePriority
,
1715 typedef struct _PROCESS_BASIC_INFORMATION
1717 NTSTATUS ExitStatus
;
1718 struct _PEB
*PebBaseAddress
;
1719 ULONG_PTR AffinityMask
;
1720 KPRIORITY BasePriority
;
1721 ULONG_PTR UniqueProcessId
;
1722 ULONG_PTR InheritedFromUniqueProcessId
;
1723 } PROCESS_BASIC_INFORMATION
,*PPROCESS_BASIC_INFORMATION
;
1725 typedef struct _PROCESS_WS_WATCH_INFORMATION
1729 } PROCESS_WS_WATCH_INFORMATION
, *PPROCESS_WS_WATCH_INFORMATION
;
1731 typedef struct _PROCESS_DEVICEMAP_INFORMATION
1733 __GNU_EXTENSION
union
1737 HANDLE DirectoryHandle
;
1742 UCHAR DriveType
[32];
1745 } PROCESS_DEVICEMAP_INFORMATION
, *PPROCESS_DEVICEMAP_INFORMATION
;
1747 typedef struct _KERNEL_USER_TIMES
1749 LARGE_INTEGER CreateTime
;
1750 LARGE_INTEGER ExitTime
;
1751 LARGE_INTEGER KernelTime
;
1752 LARGE_INTEGER UserTime
;
1753 } KERNEL_USER_TIMES
, *PKERNEL_USER_TIMES
;
1755 typedef struct _PROCESS_ACCESS_TOKEN
1759 } PROCESS_ACCESS_TOKEN
, *PPROCESS_ACCESS_TOKEN
;
1761 typedef struct _PROCESS_SESSION_INFORMATION
1764 } PROCESS_SESSION_INFORMATION
, *PPROCESS_SESSION_INFORMATION
;
1767 (DDKAPI
*PREQUEST_POWER_COMPLETE
)(
1768 IN PDEVICE_OBJECT DeviceObject
,
1769 IN UCHAR MinorFunction
,
1770 IN POWER_STATE PowerState
,
1772 IN PIO_STATUS_BLOCK IoStatus
);
1774 typedef enum _TRACE_INFORMATION_CLASS
{
1777 TraceEnableFlagsClass
,
1778 TraceEnableLevelClass
,
1779 GlobalLoggerHandleClass
,
1780 EventLoggerHandleClass
,
1781 AllLoggerHandlesClass
,
1782 TraceHandleByNameClass
1783 } TRACE_INFORMATION_CLASS
;
1785 typedef enum _REG_NOTIFY_CLASS
1788 RegNtPreDeleteKey
= RegNtDeleteKey
,
1790 RegNtPreSetValueKey
= RegNtSetValueKey
,
1791 RegNtDeleteValueKey
,
1792 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
1793 RegNtSetInformationKey
,
1794 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
1796 RegNtPreRenameKey
= RegNtRenameKey
,
1798 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
1799 RegNtEnumerateValueKey
,
1800 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
1802 RegNtPreQueryKey
= RegNtQueryKey
,
1804 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
1805 RegNtQueryMultipleValueKey
,
1806 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
1811 RegNtKeyHandleClose
,
1812 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
1814 RegNtPostSetValueKey
,
1815 RegNtPostDeleteValueKey
,
1816 RegNtPostSetInformationKey
,
1818 RegNtPostEnumerateKey
,
1819 RegNtPostEnumerateValueKey
,
1821 RegNtPostQueryValueKey
,
1822 RegNtPostQueryMultipleValueKey
,
1823 RegNtPostKeyHandleClose
,
1824 RegNtPreCreateKeyEx
,
1825 RegNtPostCreateKeyEx
,
1828 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
1831 (NTAPI
*PEX_CALLBACK_FUNCTION
)(
1832 IN PVOID CallbackContext
,
1837 typedef struct _REG_DELETE_KEY_INFORMATION
1840 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
;
1842 typedef struct _REG_SET_VALUE_KEY_INFORMATION
1845 PUNICODE_STRING ValueName
;
1850 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
1852 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
1855 PUNICODE_STRING ValueName
;
1856 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
1858 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
1861 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
1862 PVOID KeySetInformation
;
1863 ULONG KeySetInformationLength
;
1864 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
1866 typedef struct _REG_ENUMERATE_KEY_INFORMATION
1870 KEY_INFORMATION_CLASS KeyInformationClass
;
1871 PVOID KeyInformation
;
1873 PULONG ResultLength
;
1874 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
1876 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
1880 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
1881 PVOID KeyValueInformation
;
1883 PULONG ResultLength
;
1884 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
1886 typedef struct _REG_QUERY_KEY_INFORMATION
1889 KEY_INFORMATION_CLASS KeyInformationClass
;
1890 PVOID KeyInformation
;
1892 PULONG ResultLength
;
1893 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
1895 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
1898 PUNICODE_STRING ValueName
;
1899 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
1900 PVOID KeyValueInformation
;
1902 PULONG ResultLength
;
1903 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
1905 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
1908 PKEY_VALUE_ENTRY ValueEntries
;
1911 PULONG BufferLength
;
1912 PULONG RequiredBufferLength
;
1913 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
1915 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
1917 PUNICODE_STRING CompleteName
;
1918 } REG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_CREATE_KEY_INFORMATION
;
1920 typedef struct _REG_POST_CREATE_KEY_INFORMATION
1922 PUNICODE_STRING CompleteName
;
1925 } REG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
;
1927 typedef struct _REG_PRE_OPEN_KEY_INFORMATION
1929 PUNICODE_STRING CompleteName
;
1930 } REG_PRE_OPEN_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;
1932 typedef struct _REG_POST_OPEN_KEY_INFORMATION
1934 PUNICODE_STRING CompleteName
;
1937 } REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
1939 typedef struct _REG_POST_OPERATION_INFORMATION
1943 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
1945 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
1948 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
1951 ** Storage structures
1953 typedef enum _PARTITION_STYLE
{
1954 PARTITION_STYLE_MBR
,
1955 PARTITION_STYLE_GPT
,
1959 typedef struct _CREATE_DISK_MBR
{
1961 } CREATE_DISK_MBR
, *PCREATE_DISK_MBR
;
1963 typedef struct _CREATE_DISK_GPT
{
1965 ULONG MaxPartitionCount
;
1966 } CREATE_DISK_GPT
, *PCREATE_DISK_GPT
;
1968 typedef struct _CREATE_DISK
{
1969 PARTITION_STYLE PartitionStyle
;
1970 _ANONYMOUS_UNION
union {
1971 CREATE_DISK_MBR Mbr
;
1972 CREATE_DISK_GPT Gpt
;
1974 } CREATE_DISK
, *PCREATE_DISK
;
1976 typedef struct _DISK_SIGNATURE
{
1977 ULONG PartitionStyle
;
1978 _ANONYMOUS_UNION
union {
1987 } DISK_SIGNATURE
, *PDISK_SIGNATURE
;
1990 (FASTCALL
*PTIME_UPDATE_NOTIFY_ROUTINE
)(
1992 IN KPROCESSOR_MODE Mode
);
1994 #define DBG_STATUS_CONTROL_C 1
1995 #define DBG_STATUS_SYSRQ 2
1996 #define DBG_STATUS_BUGCHECK_FIRST 3
1997 #define DBG_STATUS_BUGCHECK_SECOND 4
1998 #define DBG_STATUS_FATAL 5
1999 #define DBG_STATUS_DEBUG_CONTROL 6
2000 #define DBG_STATUS_WORKER 7
2002 typedef struct _PHYSICAL_MEMORY_RANGE
{
2003 PHYSICAL_ADDRESS BaseAddress
;
2004 LARGE_INTEGER NumberOfBytes
;
2005 } PHYSICAL_MEMORY_RANGE
, *PPHYSICAL_MEMORY_RANGE
;
2008 (NTAPI
*PDRIVER_VERIFIER_THUNK_ROUTINE
)(
2011 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS
{
2012 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine
;
2013 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine
;
2014 } DRIVER_VERIFIER_THUNK_PAIRS
, *PDRIVER_VERIFIER_THUNK_PAIRS
;
2016 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
2017 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
2018 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
2019 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
2020 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
2022 #define HASH_STRING_ALGORITHM_DEFAULT 0
2023 #define HASH_STRING_ALGORITHM_X65599 1
2024 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
2027 (DDKAPI
*PTIMER_APC_ROUTINE
)(
2028 IN PVOID TimerContext
,
2029 IN ULONG TimerLowValue
,
2030 IN LONG TimerHighValue
);
2039 (DDKAPI
*WMI_NOTIFICATION_CALLBACK
)(
2045 ** Architecture specific structures
2047 #define PCR_MINOR_VERSION 1
2048 #define PCR_MAJOR_VERSION 1
2052 #define SIZE_OF_80387_REGISTERS 80
2053 #define CONTEXT_i386 0x10000
2054 #define CONTEXT_i486 0x10000
2055 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
2056 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
2057 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
2058 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
2059 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
2060 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
2061 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
2062 #define MAXIMUM_SUPPORTED_EXTENSION 512
2064 typedef struct _FLOATING_SAVE_AREA
{
2069 ULONG ErrorSelector
;
2072 UCHAR RegisterArea
[SIZE_OF_80387_REGISTERS
];
2074 } FLOATING_SAVE_AREA
, *PFLOATING_SAVE_AREA
;
2076 typedef struct _CONTEXT
{
2084 FLOATING_SAVE_AREA FloatSave
;
2101 UCHAR ExtendedRegisters
[MAXIMUM_SUPPORTED_EXTENSION
];
2105 // Used to contain PFNs and PFN counts
2107 typedef ULONG PFN_COUNT
;
2108 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
2109 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2111 #define PASSIVE_LEVEL 0
2114 #define DISPATCH_LEVEL 2
2115 #define PROFILE_LEVEL 27
2116 #define CLOCK1_LEVEL 28
2117 #define CLOCK2_LEVEL 28
2118 #define IPI_LEVEL 29
2119 #define POWER_LEVEL 30
2120 #define HIGH_LEVEL 31
2122 typedef struct _KPCR_TIB
{
2123 PVOID ExceptionList
; /* 00 */
2124 PVOID StackBase
; /* 04 */
2125 PVOID StackLimit
; /* 08 */
2126 PVOID SubSystemTib
; /* 0C */
2127 _ANONYMOUS_UNION
union {
2128 PVOID FiberData
; /* 10 */
2129 ULONG Version
; /* 10 */
2131 PVOID ArbitraryUserPointer
; /* 14 */
2132 struct _KPCR_TIB
*Self
; /* 18 */
2133 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
2135 typedef struct _KPCR
{
2136 KPCR_TIB Tib
; /* 00 */
2137 struct _KPCR
*Self
; /* 1C */
2138 struct _KPRCB
*Prcb
; /* 20 */
2139 KIRQL Irql
; /* 24 */
2141 ULONG IrrActive
; /* 2C */
2143 PVOID KdVersionBlock
; /* 34 */
2144 PUSHORT IDT
; /* 38 */
2145 PUSHORT GDT
; /* 3C */
2146 struct _KTSS
*TSS
; /* 40 */
2147 USHORT MajorVersion
; /* 44 */
2148 USHORT MinorVersion
; /* 46 */
2149 KAFFINITY SetMember
; /* 48 */
2150 ULONG StallScaleFactor
; /* 4C */
2151 UCHAR SpareUnused
; /* 50 */
2152 UCHAR Number
; /* 51 */
2154 UCHAR SecondLevelCacheAssociativity
;
2156 ULONG KernelReserved
[14]; // For use by the kernel
2157 ULONG SecondLevelCacheSize
;
2158 ULONG HalReserved
[16]; // For use by Hal
2159 } KPCR
, *PKPCR
; /* 54 */
2161 #define KeGetPcr() PCR
2163 typedef struct _KFLOATING_SAVE
{
2167 ULONG ErrorSelector
;
2172 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2176 KeGetCurrentProcessorNumber(VOID
)
2178 return (ULONG
)__readfsbyte(FIELD_OFFSET(KPCR
, Number
));
2193 #define KI_USER_SHARED_DATA 0xffdf0000
2195 #define PAGE_SIZE 0x1000
2196 #define PAGE_SHIFT 12L
2198 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
2200 extern NTKERNELAPI PVOID MmHighestUserAddress
;
2201 extern NTKERNELAPI PVOID MmSystemRangeStart
;
2202 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress
;
2204 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
2205 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
2206 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
2207 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
2208 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
2210 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
2211 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
2213 #elif defined(__x86_64__)
2215 #define CONTEXT_AMD64 0x100000
2216 #if !defined(RC_INVOKED)
2217 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
2218 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
2219 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
2220 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
2221 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
2223 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
2224 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
2226 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
2227 #define CONTEXT_SERVICE_ACTIVE 0x10000000
2228 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
2229 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
2232 typedef struct DECLSPEC_ALIGN(16) _M128A
{
2237 typedef struct _XMM_SAVE_AREA32
{
2244 USHORT ErrorSelector
;
2247 USHORT DataSelector
;
2251 M128A FloatRegisters
[8];
2252 M128A XmmRegisters
[16];
2253 UCHAR Reserved4
[96];
2254 } XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
2256 typedef struct DECLSPEC_ALIGN(16) _CONTEXT
{
2306 /* Floating point */
2308 XMM_SAVE_AREA32 FltSave
;
2332 M128A VectorRegister
[26];
2333 ULONG64 VectorControl
;
2336 ULONG64 DebugControl
;
2337 ULONG64 LastBranchToRip
;
2338 ULONG64 LastBranchFromRip
;
2339 ULONG64 LastExceptionToRip
;
2340 ULONG64 LastExceptionFromRip
;
2344 // Used to contain PFNs and PFN counts
2346 typedef ULONG PFN_COUNT
;
2347 typedef ULONG64 PFN_NUMBER
, *PPFN_NUMBER
;
2348 typedef LONG64 SPFN_NUMBER
, *PSPFN_NUMBER
;
2350 #define PASSIVE_LEVEL 0
2353 #define DISPATCH_LEVEL 2
2354 #define CLOCK_LEVEL 13
2355 #define IPI_LEVEL 14
2356 #define POWER_LEVEL 14
2357 #define PROFILE_LEVEL 15
2358 #define HIGH_LEVEL 15
2360 #define PAGE_SIZE 0x1000
2361 #define PAGE_SHIFT 12L
2362 #define PTI_SHIFT 12L
2363 #define PDI_SHIFT 21L
2364 #define PPI_SHIFT 30L
2365 #define PXI_SHIFT 39L
2366 #define PTE_PER_PAGE 512
2367 #define PDE_PER_PAGE 512
2368 #define PPE_PER_PAGE 512
2369 #define PXE_PER_PAGE 512
2370 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
2371 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
2372 #define PPI_MASK (PPE_PER_PAGE - 1)
2373 #define PXI_MASK (PXE_PER_PAGE - 1)
2375 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
2376 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
2377 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
2378 #define PDE_BASE 0xFFFFF6FB40000000ULL
2379 #define PTE_BASE 0xFFFFF68000000000ULL
2380 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
2381 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
2382 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
2383 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
2385 extern NTKERNELAPI PVOID MmHighestUserAddress
;
2386 extern NTKERNELAPI PVOID MmSystemRangeStart
;
2387 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress
;
2389 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
2390 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
2391 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
2392 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
2393 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
2394 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
2396 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
2397 #define SharedInterruptTime (&SharedUserData->InterruptTime)
2398 #define SharedSystemTime (&SharedUserData->SystemTime)
2399 #define SharedTickCount (&SharedUserData->TickCount)
2401 #define KeQueryInterruptTime() \
2402 (*(volatile ULONG64*)SharedInterruptTime)
2403 #define KeQuerySystemTime(CurrentCount) \
2404 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
2405 #define KeQueryTickCount(CurrentCount) \
2406 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
2408 typedef struct _KPCR
2410 __GNU_EXTENSION
union
2413 __GNU_EXTENSION
struct
2415 union _KGDTENTRY64
*GdtBase
;
2416 struct _KTSS64
*TssBase
;
2419 struct _KPRCB
*CurrentPrcb
;
2420 PKSPIN_LOCK_QUEUE LockArray
;
2424 union _KIDTENTRY64
*IdtBase
;
2427 UCHAR SecondLevelCacheAssociativity
;
2428 UCHAR ObsoleteNumber
;
2431 USHORT MajorVersion
;
2432 USHORT MinorVersion
;
2433 ULONG StallScaleFactor
;
2435 ULONG KernelReserved
[15];
2436 ULONG SecondLevelCacheSize
;
2437 ULONG HalReserved
[16];
2439 PVOID KdVersionBlock
;
2441 ULONG PcrAlign1
[24];
2444 typedef struct _KFLOATING_SAVE
{
2446 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2458 return (PKPCR
)__readgsqword(FIELD_OFFSET(KPCR
, Self
));
2463 KeGetCurrentProcessorNumber(VOID
)
2465 return (ULONG
)__readgsword(0x184);
2468 #elif defined(__PowerPC__)
2471 // Used to contain PFNs and PFN counts
2473 typedef ULONG PFN_COUNT
;
2474 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
2475 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2477 #define PASSIVE_LEVEL 0
2480 #define DISPATCH_LEVEL 2
2481 #define PROFILE_LEVEL 27
2482 #define CLOCK1_LEVEL 28
2483 #define CLOCK2_LEVEL 28
2484 #define IPI_LEVEL 29
2485 #define POWER_LEVEL 30
2486 #define HIGH_LEVEL 31
2488 typedef struct _KFLOATING_SAVE
{
2490 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2492 typedef struct _KPCR_TIB
{
2493 PVOID ExceptionList
; /* 00 */
2494 PVOID StackBase
; /* 04 */
2495 PVOID StackLimit
; /* 08 */
2496 PVOID SubSystemTib
; /* 0C */
2497 _ANONYMOUS_UNION
union {
2498 PVOID FiberData
; /* 10 */
2499 ULONG Version
; /* 10 */
2501 PVOID ArbitraryUserPointer
; /* 14 */
2502 struct _KPCR_TIB
*Self
; /* 18 */
2503 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
2505 #define PCR_MINOR_VERSION 1
2506 #define PCR_MAJOR_VERSION 1
2508 typedef struct _KPCR
{
2509 KPCR_TIB Tib
; /* 00 */
2510 struct _KPCR
*Self
; /* 1C */
2511 struct _KPRCB
*Prcb
; /* 20 */
2512 KIRQL Irql
; /* 24 */
2514 ULONG IrrActive
; /* 2C */
2516 PVOID KdVersionBlock
; /* 34 */
2517 PUSHORT IDT
; /* 38 */
2518 PUSHORT GDT
; /* 3C */
2519 struct _KTSS
*TSS
; /* 40 */
2520 USHORT MajorVersion
; /* 44 */
2521 USHORT MinorVersion
; /* 46 */
2522 KAFFINITY SetMember
; /* 48 */
2523 ULONG StallScaleFactor
; /* 4C */
2524 UCHAR SpareUnused
; /* 50 */
2525 UCHAR Number
; /* 51 */
2526 } KPCR
, *PKPCR
; /* 54 */
2528 #define KeGetPcr() PCR
2533 KeGetCurrentProcessorNumber(VOID
)
2536 __asm__
__volatile__ (
2539 : "i" (FIELD_OFFSET(KPCR
, Number
))
2544 #elif defined(_MIPS_)
2546 #error MIPS Headers are totally incorrect
2549 // Used to contain PFNs and PFN counts
2551 typedef ULONG PFN_COUNT
;
2552 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
2553 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2555 #define PASSIVE_LEVEL 0
2557 #define DISPATCH_LEVEL 2
2558 #define PROFILE_LEVEL 27
2559 #define IPI_LEVEL 29
2560 #define HIGH_LEVEL 31
2562 typedef struct _KPCR
{
2563 struct _KPRCB
*Prcb
; /* 20 */
2564 KIRQL Irql
; /* 24 */
2569 #define KeGetPcr() PCR
2571 typedef struct _KFLOATING_SAVE
{
2572 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2577 KeGetCurrentProcessorNumber(VOID
)
2582 #elif defined(_M_ARM)
2585 // NT-ARM is not documented, need DDK-ARM
2590 #error Unknown architecture
2593 #define MM_DONT_ZERO_ALLOCATION 0x00000001
2594 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
2597 #define EFLAG_SIGN 0x8000
2598 #define EFLAG_ZERO 0x4000
2599 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
2601 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
2602 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
2603 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
2605 typedef enum _INTERLOCKED_RESULT
{
2606 ResultNegative
= RESULT_NEGATIVE
,
2607 ResultZero
= RESULT_ZERO
,
2608 ResultPositive
= RESULT_POSITIVE
2609 } INTERLOCKED_RESULT
;
2612 (NTAPI
*PciPin2Line
)(
2613 IN
struct _BUS_HANDLER
*BusHandler
,
2614 IN
struct _BUS_HANDLER
*RootHandler
,
2615 IN PCI_SLOT_NUMBER SlotNumber
,
2616 IN PPCI_COMMON_CONFIG PciData
2620 (NTAPI
*PciLine2Pin
)(
2621 IN
struct _BUS_HANDLER
*BusHandler
,
2622 IN
struct _BUS_HANDLER
*RootHandler
,
2623 IN PCI_SLOT_NUMBER SlotNumber
,
2624 IN PPCI_COMMON_CONFIG PciNewData
,
2625 IN PPCI_COMMON_CONFIG PciOldData
2629 (NTAPI
*PciReadWriteConfig
)(
2630 IN
struct _BUS_HANDLER
*BusHandler
,
2631 IN PCI_SLOT_NUMBER Slot
,
2637 #define PCI_DATA_TAG ' ICP'
2638 #define PCI_DATA_VERSION 1
2640 typedef struct _PCIBUSDATA
2644 PciReadWriteConfig ReadConfig
;
2645 PciReadWriteConfig WriteConfig
;
2646 PciPin2Line Pin2Line
;
2647 PciLine2Pin Line2Pin
;
2648 PCI_SLOT_NUMBER ParentSlot
;
2650 } PCIBUSDATA
, *PPCIBUSDATA
;
2653 /** SPINLOCK FUNCTIONS ********************************************************/
2658 KeTryToAcquireSpinLockAtDpcLevel(
2659 IN OUT PKSPIN_LOCK SpinLock
2666 IN PKSPIN_LOCK SpinLock
2671 #if defined(WIN9X_COMPAT_SPINLOCK)
2676 KeInitializeSpinLock(
2677 IN PKSPIN_LOCK SpinLock
2684 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
2686 /* Clear the lock */
2696 IN PKSPIN_LOCK SpinLock
);
2702 IN PKSPIN_LOCK SpinLock
,
2708 KefAcquireSpinLockAtDpcLevel(
2709 IN PKSPIN_LOCK SpinLock
);
2714 KefReleaseSpinLockFromDpcLevel(
2715 IN PKSPIN_LOCK SpinLock
);
2717 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
2718 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
2719 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
2720 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
2722 #define KeGetDcacheFillSize() 1L
2724 #elif defined(_M_ARM) // !defined (_X86_)
2728 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
2730 /* Clear the lock */
2738 IN PKSPIN_LOCK SpinLock
);
2744 IN PKSPIN_LOCK SpinLock
,
2751 KefAcquireSpinLockAtDpcLevel(
2752 IN PKSPIN_LOCK SpinLock
);
2757 KefReleaseSpinLockFromDpcLevel(
2758 IN PKSPIN_LOCK SpinLock
);
2761 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
2762 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
2763 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
2764 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
2769 KeInitializeSpinLock(
2770 IN PKSPIN_LOCK SpinLock
);
2777 KeInitializeSpinLock(
2778 PKSPIN_LOCK SpinLock
)
2786 IN PKSPIN_LOCK SpinLock
,
2791 KeAcquireSpinLockAtDpcLevel(
2792 IN PKSPIN_LOCK SpinLock
);
2796 KeReleaseSpinLockFromDpcLevel(
2797 IN PKSPIN_LOCK SpinLock
);
2801 KeAcquireSpinLockRaiseToDpc(
2802 IN PKSPIN_LOCK SpinLock
);
2804 #define KeAcquireSpinLock(SpinLock, OldIrql) \
2805 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
2807 #endif // !defined (_X86_)
2810 ** Utillity functions
2813 #define ARGUMENT_PRESENT(ArgumentPointer) \
2814 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
2821 #define BYTE_OFFSET(Va) \
2822 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
2829 #define BYTES_TO_PAGES(Size) \
2830 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
2837 #define PAGE_ALIGN(Va) \
2838 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
2843 * IN ULONG_PTR Size)
2845 #define ROUND_TO_PAGES(Size) \
2846 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
2850 #if defined(_X86_) || defined(_AMD64_)
2853 // x86 and x64 performs a 0x2C interrupt
2855 #define DbgRaiseAssertionFailure __int2c
2857 #elif defined(_ARM_)
2864 #error Unsupported Architecture
2869 #define ASSERT(exp) \
2871 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
2873 #define ASSERTMSG(msg, exp) \
2875 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
2877 #define RTL_SOFT_ASSERT(exp) \
2879 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
2881 #define RTL_SOFT_ASSERTMSG(msg, exp) \
2883 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
2885 #define RTL_VERIFY(exp) ASSERT(exp)
2886 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
2888 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
2889 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
2891 #if defined(_MSC_VER)
2893 #define NT_ASSERT(exp) \
2895 (__annotation(L"Debug", L"AssertFail", L#exp), \
2896 DbgRaiseAssertionFailure(), FALSE) : TRUE)
2898 #define NT_ASSERTMSG(msg, exp) \
2900 (__annotation(L"Debug", L"AssertFail", L##msg), \
2901 DbgRaiseAssertionFailure(), FALSE) : TRUE)
2903 #define NT_ASSERTMSGW(msg, exp) \
2905 (__annotation(L"Debug", L"AssertFail", msg), \
2906 DbgRaiseAssertionFailure(), FALSE) : TRUE)
2911 // GCC doesn't support __annotation (nor PDB)
2913 #define NT_ASSERT(exp) \
2914 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
2916 #define NT_ASSERTMSG NT_ASSERT
2917 #define NT_ASSERTMSGW NT_ASSERT
2923 #define ASSERT(exp) ((VOID) 0)
2924 #define ASSERTMSG(msg, exp) ((VOID) 0)
2926 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
2927 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
2929 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
2930 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
2932 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
2933 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
2935 #define NT_ASSERT(exp) ((VOID)0)
2936 #define NT_ASSERTMSG(exp) ((VOID)0)
2937 #define NT_ASSERTMSGW(exp) ((VOID)0)
2941 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
2942 #if defined(_NTSYSTEM_) || defined(__GNUC__)
2943 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
2944 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
2946 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
2947 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
2948 #endif /* _NT_SYSTEM */
2950 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG
;
2951 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG
;
2954 ** Driver support routines
2957 /** Runtime library routines **/
2959 static __inline VOID
2961 IN PLIST_ENTRY ListHead
)
2963 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
2966 static __inline VOID
2968 IN PLIST_ENTRY ListHead
,
2969 IN PLIST_ENTRY Entry
)
2971 PLIST_ENTRY OldFlink
;
2972 OldFlink
= ListHead
->Flink
;
2973 Entry
->Flink
= OldFlink
;
2974 Entry
->Blink
= ListHead
;
2975 OldFlink
->Blink
= Entry
;
2976 ListHead
->Flink
= Entry
;
2979 static __inline VOID
2981 IN PLIST_ENTRY ListHead
,
2982 IN PLIST_ENTRY Entry
)
2984 PLIST_ENTRY OldBlink
;
2985 OldBlink
= ListHead
->Blink
;
2986 Entry
->Flink
= ListHead
;
2987 Entry
->Blink
= OldBlink
;
2988 OldBlink
->Flink
= Entry
;
2989 ListHead
->Blink
= Entry
;
2995 * IN PLIST_ENTRY ListHead)
2997 #define IsListEmpty(_ListHead) \
2998 ((_ListHead)->Flink == (_ListHead))
3001 * PSINGLE_LIST_ENTRY
3003 * IN PSINGLE_LIST_ENTRY ListHead)
3005 #define PopEntryList(ListHead) \
3008 PSINGLE_LIST_ENTRY _FirstEntry; \
3009 _FirstEntry = (ListHead)->Next; \
3010 if (_FirstEntry != NULL) \
3011 (ListHead)->Next = _FirstEntry->Next; \
3017 * IN PSINGLE_LIST_ENTRY ListHead,
3018 * IN PSINGLE_LIST_ENTRY Entry)
3020 #define PushEntryList(_ListHead, _Entry) \
3021 (_Entry)->Next = (_ListHead)->Next; \
3022 (_ListHead)->Next = (_Entry); \
3024 static __inline BOOLEAN
3026 IN PLIST_ENTRY Entry
)
3028 PLIST_ENTRY OldFlink
;
3029 PLIST_ENTRY OldBlink
;
3031 OldFlink
= Entry
->Flink
;
3032 OldBlink
= Entry
->Blink
;
3033 OldFlink
->Blink
= OldBlink
;
3034 OldBlink
->Flink
= OldFlink
;
3035 return (BOOLEAN
)(OldFlink
== OldBlink
);
3038 static __inline PLIST_ENTRY
3040 IN PLIST_ENTRY ListHead
)
3045 Entry
= ListHead
->Flink
;
3046 Flink
= Entry
->Flink
;
3047 ListHead
->Flink
= Flink
;
3048 Flink
->Blink
= ListHead
;
3052 static __inline PLIST_ENTRY
3054 IN PLIST_ENTRY ListHead
)
3059 Entry
= ListHead
->Blink
;
3060 Blink
= Entry
->Blink
;
3061 ListHead
->Blink
= Blink
;
3062 Blink
->Flink
= ListHead
;
3071 IN ULONG Base OPTIONAL
,
3072 IN OUT PULONG Value
);
3080 BOOLEAN CaseInSensitive
);
3082 #if !defined(MIDL_PASS)
3087 RtlConvertLongToLuid(
3093 Temp
.QuadPart
= Val
;
3094 Luid
.LowPart
= Temp
.u
.LowPart
;
3095 Luid
.HighPart
= Temp
.u
.HighPart
;
3103 RtlConvertUlongToLuid(
3120 IN VOID UNALIGNED
*Destination
,
3121 IN CONST VOID UNALIGNED
*Source
,
3128 IN OUT PSTRING DestinationString
,
3129 IN PSTRING SourceString OPTIONAL
);
3137 IN BOOLEAN CaseInSensitive
);
3139 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
3140 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
3141 *CallersAddress = (PVOID)_ReturnAddress(); \
3142 *CallersCaller = NULL;
3147 RtlGetCallersAddress(
3148 OUT PVOID
*CallersAddress
,
3149 OUT PVOID
*CallersCaller
);
3156 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
3162 IN OUT PACCESS_MASK AccessMask
,
3163 IN PGENERIC_MAPPING GenericMapping
);
3168 RtlPrefixUnicodeString(
3169 IN PCUNICODE_STRING String1
,
3170 IN PCUNICODE_STRING String2
,
3171 IN BOOLEAN CaseInSensitive
);
3176 RtlUpcaseUnicodeString(
3177 IN OUT PUNICODE_STRING DestinationString OPTIONAL
,
3178 IN PCUNICODE_STRING SourceString
,
3179 IN BOOLEAN AllocateDestinationString
);
3191 IN OUT PSTRING DestinationString
,
3192 IN PSTRING SourceString
);
3197 RtlVerifyVersionInfo(
3198 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
3200 IN ULONGLONG ConditionMask
);
3205 RtlVolumeDeviceToDosName(
3206 IN PVOID VolumeDeviceObject
,
3207 OUT PUNICODE_STRING DosName
);
3220 KeAreAllApcsDisabled(
3224 /* Guarded Mutex routines */
3229 KeAcquireGuardedMutex(
3230 IN OUT PKGUARDED_MUTEX GuardedMutex
3236 KeAcquireGuardedMutexUnsafe(
3237 IN OUT PKGUARDED_MUTEX GuardedMutex
3243 KeEnterGuardedRegion(
3250 KeLeaveGuardedRegion(
3257 KeInitializeGuardedMutex(
3258 OUT PKGUARDED_MUTEX GuardedMutex
3264 KeReleaseGuardedMutexUnsafe(
3265 IN OUT PKGUARDED_MUTEX GuardedMutex
3271 KeReleaseGuardedMutex(
3272 IN OUT PKGUARDED_MUTEX GuardedMutex
3278 KeTryToAcquireGuardedMutex(
3279 IN OUT PKGUARDED_MUTEX GuardedMutex
3283 #define ExInitializeFastMutex(_FastMutex) \
3285 (_FastMutex)->Count = FM_LOCK_BIT; \
3286 (_FastMutex)->Owner = NULL; \
3287 (_FastMutex)->Contention = 0; \
3288 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
3299 /******************************************************************************
3301 ******************************************************************************/
3303 typedef struct _ZONE_SEGMENT_HEADER
{
3304 SINGLE_LIST_ENTRY SegmentList
;
3306 } ZONE_SEGMENT_HEADER
, *PZONE_SEGMENT_HEADER
;
3308 typedef struct _ZONE_HEADER
{
3309 SINGLE_LIST_ENTRY FreeList
;
3310 SINGLE_LIST_ENTRY SegmentList
;
3312 ULONG TotalSegmentSize
;
3313 } ZONE_HEADER
, *PZONE_HEADER
;
3315 #define PROTECTED_POOL 0x80000000
3317 /******************************************************************************
3318 * Executive Functions *
3319 ******************************************************************************/
3325 IN PZONE_HEADER Zone
,
3327 IN ULONG SegmentSize
);
3329 static __inline PVOID
3331 IN PZONE_HEADER Zone
)
3333 if (Zone
->FreeList
.Next
)
3334 Zone
->FreeList
.Next
= Zone
->FreeList
.Next
->Next
;
3335 return (PVOID
) Zone
->FreeList
.Next
;
3338 static __inline PVOID
3340 IN PZONE_HEADER Zone
,
3343 ((PSINGLE_LIST_ENTRY
) Block
)->Next
= Zone
->FreeList
.Next
;
3344 Zone
->FreeList
.Next
= ((PSINGLE_LIST_ENTRY
) Block
);
3345 return ((PSINGLE_LIST_ENTRY
) Block
)->Next
;
3352 IN PZONE_HEADER Zone
,
3354 IN PVOID InitialSegment
,
3355 IN ULONG InitialSegmentSize
);
3359 * ExInterlockedAllocateFromZone(
3360 * IN PZONE_HEADER Zone,
3361 * IN PKSPIN_LOCK Lock)
3363 #define ExInterlockedAllocateFromZone(Zone, Lock) \
3364 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
3369 ExInterlockedExtendZone(
3370 IN PZONE_HEADER Zone
,
3372 IN ULONG SegmentSize
,
3373 IN PKSPIN_LOCK Lock
);
3376 * ExInterlockedFreeToZone(
3377 * IN PZONE_HEADER Zone,
3379 * IN PKSPIN_LOCK Lock);
3381 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
3382 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
3386 * InitializeSListHead(
3387 * IN PSLIST_HEADER SListHead)
3389 #define InitializeSListHead(_SListHead) \
3390 (_SListHead)->Alignment = 0
3392 #define ExInitializeSListHead InitializeSListHead
3397 * IN PZONE_HEADER Zone)
3399 #define ExIsFullZone(Zone) \
3400 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
3403 * ExIsObjectInFirstZoneSegment(
3404 * IN PZONE_HEADER Zone,
3407 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
3408 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
3409 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
3410 (Zone)->TotalSegmentSize)) )
3416 ExRaiseAccessViolation(
3423 ExRaiseDatatypeMisalignment(
3432 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
3433 #define ExAcquireResourceShared ExAcquireResourceSharedLite
3434 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
3435 #define ExDeleteResource ExDeleteResourceLite
3436 #define ExInitializeResource ExInitializeResourceLite
3437 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
3438 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
3439 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
3440 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
3445 #define PAGED_CODE() { \
3446 if (KeGetCurrentIrql() > APC_LEVEL) { \
3447 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
3454 #define PAGED_CODE()
3462 IN CONST VOID
*Address
,
3464 IN ULONG Alignment
);
3472 IN ULONG Alignment
);
3476 /** Configuration manager routines **/
3482 IN PEX_CALLBACK_FUNCTION Function
,
3484 IN OUT PLARGE_INTEGER Cookie
);
3489 CmUnRegisterCallback(
3490 IN LARGE_INTEGER Cookie
);
3494 /** Filesystem runtime library routines **/
3499 FsRtlIsTotalDeviceFailure(
3500 IN NTSTATUS Status
);
3504 /** Hardware abstraction layer routines **/
3510 IN ULONG Frequency
);
3516 IN PDEVICE_OBJECT DeviceObject
,
3517 IN ULONG SectorSize
,
3518 IN ULONG MBRTypeIdentifier
,
3524 PADAPTER_OBJECT AdapterObject
3528 /** Io access routines **/
3530 #if !defined(_M_AMD64)
3534 READ_PORT_BUFFER_UCHAR(
3542 READ_PORT_BUFFER_ULONG(
3550 READ_PORT_BUFFER_USHORT(
3576 READ_REGISTER_BUFFER_UCHAR(
3584 READ_REGISTER_BUFFER_ULONG(
3592 READ_REGISTER_BUFFER_USHORT(
3593 IN PUSHORT Register
,
3600 READ_REGISTER_UCHAR(
3601 IN PUCHAR Register
);
3606 READ_REGISTER_ULONG(
3607 IN PULONG Register
);
3612 READ_REGISTER_USHORT(
3613 IN PUSHORT Register
);
3618 WRITE_PORT_BUFFER_UCHAR(
3626 WRITE_PORT_BUFFER_ULONG(
3634 WRITE_PORT_BUFFER_USHORT(
3663 WRITE_REGISTER_BUFFER_UCHAR(
3671 WRITE_REGISTER_BUFFER_ULONG(
3679 WRITE_REGISTER_BUFFER_USHORT(
3680 IN PUSHORT Register
,
3687 WRITE_REGISTER_UCHAR(
3694 WRITE_REGISTER_ULONG(
3701 WRITE_REGISTER_USHORT(
3702 IN PUSHORT Register
,
3709 READ_PORT_BUFFER_UCHAR(
3714 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3719 READ_PORT_BUFFER_ULONG(
3724 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3729 READ_PORT_BUFFER_USHORT(
3734 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3742 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
3750 return __indword((USHORT
)(ULONG_PTR
)Port
);
3758 return __inword((USHORT
)(ULONG_PTR
)Port
);
3763 READ_REGISTER_BUFFER_UCHAR(
3768 __movsb(Register
, Buffer
, Count
);
3773 READ_REGISTER_BUFFER_ULONG(
3778 __movsd(Register
, Buffer
, Count
);
3783 READ_REGISTER_BUFFER_USHORT(
3784 IN PUSHORT Register
,
3788 __movsw(Register
, Buffer
, Count
);
3793 READ_REGISTER_UCHAR(
3801 READ_REGISTER_ULONG(
3809 READ_REGISTER_USHORT(
3810 IN PUSHORT Register
)
3817 WRITE_PORT_BUFFER_UCHAR(
3822 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3827 WRITE_PORT_BUFFER_ULONG(
3832 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3837 WRITE_PORT_BUFFER_USHORT(
3842 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3851 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
3860 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
3869 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
3874 WRITE_REGISTER_BUFFER_UCHAR(
3880 __movsb(Register
, Buffer
, Count
);
3881 InterlockedOr(&Synch
, 1);
3886 WRITE_REGISTER_BUFFER_ULONG(
3892 __movsd(Register
, Buffer
, Count
);
3893 InterlockedOr(&Synch
, 1);
3898 WRITE_REGISTER_BUFFER_USHORT(
3899 IN PUSHORT Register
,
3904 __movsw(Register
, Buffer
, Count
);
3905 InterlockedOr(&Synch
, 1);
3910 WRITE_REGISTER_UCHAR(
3916 InterlockedOr(&Synch
, 1);
3921 WRITE_REGISTER_ULONG(
3927 InterlockedOr(&Synch
, 1);
3932 WRITE_REGISTER_USHORT(
3933 IN PUSHORT Register
,
3938 InterlockedOr(&Sync
, 1);
3943 /** I/O manager routines **/
3948 IoAcquireCancelSpinLock(
3954 IoAcquireRemoveLockEx(
3955 IN PIO_REMOVE_LOCK RemoveLock
,
3956 IN OPTIONAL PVOID Tag OPTIONAL
,
3959 IN ULONG RemlockSize
);
3963 * IoAcquireRemoveLock(
3964 * IN PIO_REMOVE_LOCK RemoveLock,
3965 * IN OPTIONAL PVOID Tag)
3967 #define IoAcquireRemoveLock(_RemoveLock, \
3969 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
3973 * IoAdjustPagingPathCount(
3975 * IN BOOLEAN Increment)