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 /* KEY_VALUE_Xxx.Type */
1131 #define REG_EXPAND_SZ 2
1132 #define REG_BINARY 3
1134 #define REG_DWORD_LITTLE_ENDIAN 4
1135 #define REG_DWORD_BIG_ENDIAN 5
1137 #define REG_MULTI_SZ 7
1138 #define REG_RESOURCE_LIST 8
1139 #define REG_FULL_RESOURCE_DESCRIPTOR 9
1140 #define REG_RESOURCE_REQUIREMENTS_LIST 10
1141 #define REG_QWORD 11
1142 #define REG_QWORD_LITTLE_ENDIAN 11
1144 #define PCI_TYPE0_ADDRESSES 6
1145 #define PCI_TYPE1_ADDRESSES 2
1146 #define PCI_TYPE2_ADDRESSES 5
1148 typedef struct _PCI_COMMON_CONFIG
{
1157 UCHAR CacheLineSize
;
1162 struct _PCI_HEADER_TYPE_0
{
1163 ULONG BaseAddresses
[PCI_TYPE0_ADDRESSES
];
1167 ULONG ROMBaseAddress
;
1168 UCHAR CapabilitiesPtr
;
1171 UCHAR InterruptLine
;
1174 UCHAR MaximumLatency
;
1176 struct _PCI_HEADER_TYPE_1
{
1177 ULONG BaseAddresses
[PCI_TYPE1_ADDRESSES
];
1180 UCHAR SubordinateBus
;
1181 UCHAR SecondaryLatency
;
1184 USHORT SecondaryStatus
;
1187 USHORT PrefetchBase
;
1188 USHORT PrefetchLimit
;
1189 ULONG PrefetchBaseUpper32
;
1190 ULONG PrefetchLimitUpper32
;
1191 USHORT IOBaseUpper16
;
1192 USHORT IOLimitUpper16
;
1193 UCHAR CapabilitiesPtr
;
1195 ULONG ROMBaseAddress
;
1196 UCHAR InterruptLine
;
1198 USHORT BridgeControl
;
1200 struct _PCI_HEADER_TYPE_2
{
1201 ULONG SocketRegistersBaseAddress
;
1202 UCHAR CapabilitiesPtr
;
1204 USHORT SecondaryStatus
;
1207 UCHAR SubordinateBus
;
1208 UCHAR SecondaryLatency
;
1212 } Range
[PCI_TYPE2_ADDRESSES
- 1];
1213 UCHAR InterruptLine
;
1215 USHORT BridgeControl
;
1218 UCHAR DeviceSpecific
[192];
1219 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
1221 /* PCI_COMMON_CONFIG.Command */
1223 #define PCI_ENABLE_IO_SPACE 0x0001
1224 #define PCI_ENABLE_MEMORY_SPACE 0x0002
1225 #define PCI_ENABLE_BUS_MASTER 0x0004
1226 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
1227 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
1228 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
1229 #define PCI_ENABLE_PARITY 0x0040
1230 #define PCI_ENABLE_WAIT_CYCLE 0x0080
1231 #define PCI_ENABLE_SERR 0x0100
1232 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
1234 /* PCI_COMMON_CONFIG.Status */
1236 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
1237 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
1238 #define PCI_STATUS_UDF_SUPPORTED 0x0040
1239 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
1240 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
1241 #define PCI_STATUS_DEVSEL 0x0600
1242 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
1243 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
1244 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
1245 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
1246 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
1248 /* PCI_COMMON_CONFIG.HeaderType */
1250 #define PCI_MULTIFUNCTION 0x80
1251 #define PCI_DEVICE_TYPE 0x00
1252 #define PCI_BRIDGE_TYPE 0x01
1253 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
1255 #define PCI_CONFIGURATION_TYPE(PciData) \
1256 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
1258 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
1259 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
1261 /* PCI device classes */
1263 #define PCI_CLASS_PRE_20 0x00
1264 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
1265 #define PCI_CLASS_NETWORK_CTLR 0x02
1266 #define PCI_CLASS_DISPLAY_CTLR 0x03
1267 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
1268 #define PCI_CLASS_MEMORY_CTLR 0x05
1269 #define PCI_CLASS_BRIDGE_DEV 0x06
1270 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
1271 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
1272 #define PCI_CLASS_INPUT_DEV 0x09
1273 #define PCI_CLASS_DOCKING_STATION 0x0a
1274 #define PCI_CLASS_PROCESSOR 0x0b
1275 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
1277 /* PCI device subclasses for class 0 */
1279 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
1280 #define PCI_SUBCLASS_PRE_20_VGA 0x01
1282 /* PCI device subclasses for class 1 (mass storage controllers)*/
1284 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
1285 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
1286 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
1287 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
1288 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
1289 #define PCI_SUBCLASS_MSC_OTHER 0x80
1291 /* PCI device subclasses for class 2 (network controllers)*/
1293 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
1294 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
1295 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
1296 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
1297 #define PCI_SUBCLASS_NET_OTHER 0x80
1299 /* PCI device subclasses for class 3 (display controllers)*/
1301 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
1302 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
1303 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
1304 #define PCI_SUBCLASS_VID_OTHER 0x80
1306 /* PCI device subclasses for class 4 (multimedia device)*/
1308 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
1309 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
1310 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
1311 #define PCI_SUBCLASS_MM_OTHER 0x80
1313 /* PCI device subclasses for class 5 (memory controller)*/
1315 #define PCI_SUBCLASS_MEM_RAM 0x00
1316 #define PCI_SUBCLASS_MEM_FLASH 0x01
1317 #define PCI_SUBCLASS_MEM_OTHER 0x80
1319 /* PCI device subclasses for class 6 (bridge device)*/
1321 #define PCI_SUBCLASS_BR_HOST 0x00
1322 #define PCI_SUBCLASS_BR_ISA 0x01
1323 #define PCI_SUBCLASS_BR_EISA 0x02
1324 #define PCI_SUBCLASS_BR_MCA 0x03
1325 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
1326 #define PCI_SUBCLASS_BR_PCMCIA 0x05
1327 #define PCI_SUBCLASS_BR_NUBUS 0x06
1328 #define PCI_SUBCLASS_BR_CARDBUS 0x07
1329 #define PCI_SUBCLASS_BR_OTHER 0x80
1331 /* PCI device subclasses for class C (serial bus controller)*/
1333 #define PCI_SUBCLASS_SB_IEEE1394 0x00
1334 #define PCI_SUBCLASS_SB_ACCESS 0x01
1335 #define PCI_SUBCLASS_SB_SSA 0x02
1336 #define PCI_SUBCLASS_SB_USB 0x03
1337 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
1338 #define PCI_SUBCLASS_SB_SMBUS 0x05
1340 #define PCI_MAX_DEVICES 32
1341 #define PCI_MAX_FUNCTION 8
1342 #define PCI_MAX_BRIDGE_NUMBER 0xFF
1343 #define PCI_INVALID_VENDORID 0xFFFF
1344 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
1346 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
1347 #define PCI_ADDRESS_IO_SPACE 0x00000001
1348 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
1349 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
1350 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
1351 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
1352 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
1354 #define PCI_TYPE_32BIT 0
1355 #define PCI_TYPE_20BIT 2
1356 #define PCI_TYPE_64BIT 4
1358 typedef struct _PCI_SLOT_NUMBER
{
1361 ULONG DeviceNumber
: 5;
1362 ULONG FunctionNumber
: 3;
1363 ULONG Reserved
: 24;
1367 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
1369 #define POOL_COLD_ALLOCATION 256
1370 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
1371 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
1373 typedef struct _OSVERSIONINFOA
{
1374 ULONG dwOSVersionInfoSize
;
1375 ULONG dwMajorVersion
;
1376 ULONG dwMinorVersion
;
1377 ULONG dwBuildNumber
;
1379 CHAR szCSDVersion
[128];
1380 } OSVERSIONINFOA
, *POSVERSIONINFOA
, *LPOSVERSIONINFOA
;
1382 typedef struct _OSVERSIONINFOW
{
1383 ULONG dwOSVersionInfoSize
;
1384 ULONG dwMajorVersion
;
1385 ULONG dwMinorVersion
;
1386 ULONG dwBuildNumber
;
1388 WCHAR szCSDVersion
[128];
1389 } OSVERSIONINFOW
, *POSVERSIONINFOW
, *LPOSVERSIONINFOW
, RTL_OSVERSIONINFOW
, *PRTL_OSVERSIONINFOW
;
1392 typedef OSVERSIONINFOW OSVERSIONINFO
;
1393 typedef POSVERSIONINFOW POSVERSIONINFO
;
1394 typedef LPOSVERSIONINFOW LPOSVERSIONINFO
;
1396 typedef OSVERSIONINFOA OSVERSIONINFO
;
1397 typedef POSVERSIONINFOA POSVERSIONINFO
;
1398 typedef LPOSVERSIONINFOA LPOSVERSIONINFO
;
1401 typedef struct _OSVERSIONINFOEXA
{
1402 ULONG dwOSVersionInfoSize
;
1403 ULONG dwMajorVersion
;
1404 ULONG dwMinorVersion
;
1405 ULONG dwBuildNumber
;
1407 CHAR szCSDVersion
[128];
1408 USHORT wServicePackMajor
;
1409 USHORT wServicePackMinor
;
1413 } OSVERSIONINFOEXA
, *POSVERSIONINFOEXA
, *LPOSVERSIONINFOEXA
;
1415 typedef struct _OSVERSIONINFOEXW
{
1416 ULONG dwOSVersionInfoSize
;
1417 ULONG dwMajorVersion
;
1418 ULONG dwMinorVersion
;
1419 ULONG dwBuildNumber
;
1421 WCHAR szCSDVersion
[128];
1422 USHORT wServicePackMajor
;
1423 USHORT wServicePackMinor
;
1427 } OSVERSIONINFOEXW
, *POSVERSIONINFOEXW
, *LPOSVERSIONINFOEXW
, RTL_OSVERSIONINFOEXW
, *PRTL_OSVERSIONINFOEXW
;
1430 typedef OSVERSIONINFOEXW OSVERSIONINFOEX
;
1431 typedef POSVERSIONINFOEXW POSVERSIONINFOEX
;
1432 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX
;
1434 typedef OSVERSIONINFOEXA OSVERSIONINFOEX
;
1435 typedef POSVERSIONINFOEXA POSVERSIONINFOEX
;
1436 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX
;
1442 VerSetConditionMask(
1443 IN ULONGLONG ConditionMask
,
1445 IN UCHAR Condition
);
1447 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
1448 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
1449 (TypeBitMask), (ComparisonType)))
1451 /* RtlVerifyVersionInfo() TypeMask */
1453 #define VER_MINORVERSION 0x0000001
1454 #define VER_MAJORVERSION 0x0000002
1455 #define VER_BUILDNUMBER 0x0000004
1456 #define VER_PLATFORMID 0x0000008
1457 #define VER_SERVICEPACKMINOR 0x0000010
1458 #define VER_SERVICEPACKMAJOR 0x0000020
1459 #define VER_SUITENAME 0x0000040
1460 #define VER_PRODUCT_TYPE 0x0000080
1462 /* RtlVerifyVersionInfo() ComparisonType */
1465 #define VER_GREATER 2
1466 #define VER_GREATER_EQUAL 3
1468 #define VER_LESS_EQUAL 5
1472 #define VER_CONDITION_MASK 7
1473 #define VER_NUM_BITS_PER_CONDITION_MASK 3
1478 (NTAPI
*PRTL_CONFLICT_RANGE_CALLBACK
) (
1480 struct _RTL_RANGE
*Range
1483 typedef enum _EVENT_TYPE
{
1485 SynchronizationEvent
1488 typedef enum _KWAIT_REASON
{
1526 typedef struct _KWAIT_BLOCK
{
1527 LIST_ENTRY WaitListEntry
;
1528 struct _KTHREAD
* RESTRICTED_POINTER Thread
;
1530 struct _KWAIT_BLOCK
* RESTRICTED_POINTER NextWaitBlock
;
1534 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *RESTRICTED_POINTER PRKWAIT_BLOCK
;
1536 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
1538 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
1540 BOOLEAN Reserved
[3];
1541 volatile LONG IoCount
;
1543 } IO_REMOVE_LOCK_COMMON_BLOCK
;
1545 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
1548 LONGLONG MaxLockedTicks
;
1550 LIST_ENTRY LockList
;
1552 volatile LONG LowMemoryCount
;
1555 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
1556 } IO_REMOVE_LOCK_DBG_BLOCK
;
1558 typedef struct _IO_REMOVE_LOCK
{
1559 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
1561 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
1563 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
1565 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
1568 (DDKAPI IO_WORKITEM_ROUTINE
)(
1569 IN PDEVICE_OBJECT DeviceObject
,
1571 typedef IO_WORKITEM_ROUTINE
*PIO_WORKITEM_ROUTINE
;
1573 typedef struct _SHARE_ACCESS
{
1581 } SHARE_ACCESS
, *PSHARE_ACCESS
;
1583 typedef enum _KINTERRUPT_MODE
{
1588 #define THREAD_WAIT_OBJECTS 3
1591 (DDKAPI
*PKINTERRUPT_ROUTINE
)(
1594 typedef enum _CREATE_FILE_TYPE
{
1596 CreateFileTypeNamedPipe
,
1597 CreateFileTypeMailslot
1600 typedef struct _CONFIGURATION_INFORMATION
{
1605 ULONG ScsiPortCount
;
1607 ULONG ParallelCount
;
1608 BOOLEAN AtDiskPrimaryAddressClaimed
;
1609 BOOLEAN AtDiskSecondaryAddressClaimed
;
1611 ULONG MediumChangerCount
;
1612 } CONFIGURATION_INFORMATION
, *PCONFIGURATION_INFORMATION
;
1614 typedef enum _CONFIGURATION_TYPE
{
1617 FloatingPointProcessor
,
1627 MultiFunctionAdapter
,
1641 FloppyDiskPeripheral
,
1654 RealModeIrqRoutingTable
,
1655 RealModePCIEnumeration
,
1657 } CONFIGURATION_TYPE
, *PCONFIGURATION_TYPE
;
1659 #define IO_FORCE_ACCESS_CHECK 0x001
1660 #define IO_NO_PARAMETER_CHECKING 0x100
1662 #define IO_REPARSE 0x0
1663 #define IO_REMOUNT 0x1
1666 (DDKAPI
*PIO_QUERY_DEVICE_ROUTINE
)(
1668 IN PUNICODE_STRING PathName
,
1669 IN INTERFACE_TYPE BusType
,
1671 IN PKEY_VALUE_FULL_INFORMATION
*BusInformation
,
1672 IN CONFIGURATION_TYPE ControllerType
,
1673 IN ULONG ControllerNumber
,
1674 IN PKEY_VALUE_FULL_INFORMATION
*ControllerInformation
,
1675 IN CONFIGURATION_TYPE PeripheralType
,
1676 IN ULONG PeripheralNumber
,
1677 IN PKEY_VALUE_FULL_INFORMATION
*PeripheralInformation
);
1679 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT
{
1680 IoQueryDeviceIdentifier
= 0,
1681 IoQueryDeviceConfigurationData
,
1682 IoQueryDeviceComponentInformation
,
1683 IoQueryDeviceMaxData
1684 } IO_QUERY_DEVICE_DATA_FORMAT
, *PIO_QUERY_DEVICE_DATA_FORMAT
;
1686 typedef enum _KBUGCHECK_CALLBACK_REASON
{
1688 KbCallbackReserved1
,
1689 KbCallbackSecondaryDumpData
,
1691 } KBUGCHECK_CALLBACK_REASON
;
1693 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
1696 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
1697 IN KBUGCHECK_CALLBACK_REASON Reason
,
1698 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
1699 IN OUT PVOID ReasonSpecificData
,
1700 IN ULONG ReasonSpecificDataLength
);
1702 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
1704 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
1707 KBUGCHECK_CALLBACK_REASON Reason
;
1709 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
1711 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
1717 } KBUGCHECK_BUFFER_DUMP_STATE
;
1720 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
1724 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
1726 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
1732 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
1735 (DDKAPI
*PNMI_CALLBACK
)(
1737 IN BOOLEAN Handled
);
1741 * KeInitializeCallbackRecord(
1742 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1744 #define KeInitializeCallbackRecord(CallbackRecord) \
1745 CallbackRecord->State = BufferEmpty;
1747 typedef enum _KDPC_IMPORTANCE
{
1753 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
1754 MmFrameBufferCached
= 2
1755 } MEMORY_CACHING_TYPE_ORIG
;
1757 typedef enum _MEMORY_CACHING_TYPE
{
1758 MmNonCached
= FALSE
,
1760 MmWriteCombined
= MmFrameBufferCached
,
1761 MmHardwareCoherentCached
,
1762 MmNonCachedUnordered
,
1765 } MEMORY_CACHING_TYPE
;
1767 typedef enum _MM_PAGE_PRIORITY
{
1769 NormalPagePriority
= 16,
1770 HighPagePriority
= 32
1773 typedef enum _LOCK_OPERATION
{
1779 #define FLUSH_MULTIPLE_MAXIMUM 32
1781 typedef enum _MM_SYSTEM_SIZE
{
1787 typedef struct _OBJECT_HANDLE_INFORMATION
{
1788 ULONG HandleAttributes
;
1789 ACCESS_MASK GrantedAccess
;
1790 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
1792 typedef struct _CLIENT_ID
{
1793 HANDLE UniqueProcess
;
1794 HANDLE UniqueThread
;
1795 } CLIENT_ID
, *PCLIENT_ID
;
1798 (DDKAPI
*PKSTART_ROUTINE
)(
1799 IN PVOID StartContext
);
1802 (DDKAPI
*PCREATE_PROCESS_NOTIFY_ROUTINE
)(
1804 IN HANDLE ProcessId
,
1808 (DDKAPI
*PCREATE_THREAD_NOTIFY_ROUTINE
)(
1809 IN HANDLE ProcessId
,
1813 typedef struct _IMAGE_INFO
{
1814 _ANONYMOUS_UNION
union {
1816 _ANONYMOUS_STRUCT
struct {
1817 ULONG ImageAddressingMode
: 8;
1818 ULONG SystemModeImage
: 1;
1819 ULONG ImageMappedToAllPids
: 1;
1820 ULONG Reserved
: 22;
1824 ULONG ImageSelector
;
1826 ULONG ImageSectionNumber
;
1827 } IMAGE_INFO
, *PIMAGE_INFO
;
1829 #define IMAGE_ADDRESSING_MODE_32BIT 3
1832 (DDKAPI
*PLOAD_IMAGE_NOTIFY_ROUTINE
)(
1833 IN PUNICODE_STRING FullImageName
,
1834 IN HANDLE ProcessId
,
1835 IN PIMAGE_INFO ImageInfo
);
1837 #pragma pack(push,4)
1838 typedef enum _BUS_DATA_TYPE
{
1839 ConfigurationSpaceUndefined
= -1,
1847 PCMCIAConfiguration
,
1850 PNPISAConfiguration
,
1851 SgiInternalConfiguration
,
1853 } BUS_DATA_TYPE
, *PBUS_DATA_TYPE
;
1856 typedef struct _NT_TIB
{
1857 struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;
1861 _ANONYMOUS_UNION
union {
1865 PVOID ArbitraryUserPointer
;
1866 struct _NT_TIB
*Self
;
1869 typedef struct _NT_TIB32
{
1870 ULONG ExceptionList
;
1874 __GNU_EXTENSION
union {
1878 ULONG ArbitraryUserPointer
;
1880 } NT_TIB32
,*PNT_TIB32
;
1882 typedef struct _NT_TIB64
{
1883 ULONG64 ExceptionList
;
1886 ULONG64 SubSystemTib
;
1887 __GNU_EXTENSION
union {
1891 ULONG64 ArbitraryUserPointer
;
1893 } NT_TIB64
,*PNT_TIB64
;
1895 typedef enum _PROCESSINFOCLASS
{
1896 ProcessBasicInformation
,
1901 ProcessBasePriority
,
1902 ProcessRaisePriority
,
1904 ProcessExceptionPort
,
1906 ProcessLdtInformation
,
1908 ProcessDefaultHardErrorMode
,
1909 ProcessIoPortHandlers
,
1910 ProcessPooledUsageAndLimits
,
1911 ProcessWorkingSetWatch
,
1912 ProcessUserModeIOPL
,
1913 ProcessEnableAlignmentFaultFixup
,
1914 ProcessPriorityClass
,
1915 ProcessWx86Information
,
1917 ProcessAffinityMask
,
1918 ProcessPriorityBoost
,
1920 ProcessSessionInformation
,
1921 ProcessForegroundInformation
,
1922 ProcessWow64Information
,
1923 ProcessImageFileName
,
1924 ProcessLUIDDeviceMapsEnabled
,
1925 ProcessBreakOnTermination
,
1926 ProcessDebugObjectHandle
,
1928 ProcessHandleTracing
,
1930 ProcessExecuteFlags
,
1931 ProcessTlsInformation
,
1933 ProcessImageInformation
,
1935 ProcessPagePriority
,
1936 ProcessInstrumentationCallback
,
1940 typedef enum _THREADINFOCLASS
{
1941 ThreadBasicInformation
,
1946 ThreadImpersonationToken
,
1947 ThreadDescriptorTableEntry
,
1948 ThreadEnableAlignmentFaultFixup
,
1949 ThreadEventPair_Reusable
,
1950 ThreadQuerySetWin32StartAddress
,
1952 ThreadPerformanceCount
,
1953 ThreadAmILastThread
,
1954 ThreadIdealProcessor
,
1955 ThreadPriorityBoost
,
1956 ThreadSetTlsArrayAddress
,
1958 ThreadHideFromDebugger
,
1959 ThreadBreakOnTermination
,
1960 ThreadSwitchLegacyState
,
1962 ThreadLastSystemCall
,
1966 ThreadActualBasePriority
,
1970 typedef struct _PROCESS_BASIC_INFORMATION
1972 NTSTATUS ExitStatus
;
1973 struct _PEB
*PebBaseAddress
;
1974 ULONG_PTR AffinityMask
;
1975 KPRIORITY BasePriority
;
1976 ULONG_PTR UniqueProcessId
;
1977 ULONG_PTR InheritedFromUniqueProcessId
;
1978 } PROCESS_BASIC_INFORMATION
,*PPROCESS_BASIC_INFORMATION
;
1980 typedef struct _PROCESS_WS_WATCH_INFORMATION
1984 } PROCESS_WS_WATCH_INFORMATION
, *PPROCESS_WS_WATCH_INFORMATION
;
1986 typedef struct _PROCESS_DEVICEMAP_INFORMATION
1988 __GNU_EXTENSION
union
1992 HANDLE DirectoryHandle
;
1997 UCHAR DriveType
[32];
2000 } PROCESS_DEVICEMAP_INFORMATION
, *PPROCESS_DEVICEMAP_INFORMATION
;
2002 typedef struct _KERNEL_USER_TIMES
2004 LARGE_INTEGER CreateTime
;
2005 LARGE_INTEGER ExitTime
;
2006 LARGE_INTEGER KernelTime
;
2007 LARGE_INTEGER UserTime
;
2008 } KERNEL_USER_TIMES
, *PKERNEL_USER_TIMES
;
2010 typedef struct _PROCESS_ACCESS_TOKEN
2014 } PROCESS_ACCESS_TOKEN
, *PPROCESS_ACCESS_TOKEN
;
2016 typedef struct _PROCESS_SESSION_INFORMATION
2019 } PROCESS_SESSION_INFORMATION
, *PPROCESS_SESSION_INFORMATION
;
2022 (DDKAPI
*PREQUEST_POWER_COMPLETE
)(
2023 IN PDEVICE_OBJECT DeviceObject
,
2024 IN UCHAR MinorFunction
,
2025 IN POWER_STATE PowerState
,
2027 IN PIO_STATUS_BLOCK IoStatus
);
2029 typedef enum _TRACE_INFORMATION_CLASS
{
2032 TraceEnableFlagsClass
,
2033 TraceEnableLevelClass
,
2034 GlobalLoggerHandleClass
,
2035 EventLoggerHandleClass
,
2036 AllLoggerHandlesClass
,
2037 TraceHandleByNameClass
2038 } TRACE_INFORMATION_CLASS
;
2040 typedef enum _REG_NOTIFY_CLASS
2043 RegNtPreDeleteKey
= RegNtDeleteKey
,
2045 RegNtPreSetValueKey
= RegNtSetValueKey
,
2046 RegNtDeleteValueKey
,
2047 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
2048 RegNtSetInformationKey
,
2049 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
2051 RegNtPreRenameKey
= RegNtRenameKey
,
2053 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
2054 RegNtEnumerateValueKey
,
2055 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
2057 RegNtPreQueryKey
= RegNtQueryKey
,
2059 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
2060 RegNtQueryMultipleValueKey
,
2061 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
2066 RegNtKeyHandleClose
,
2067 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
2069 RegNtPostSetValueKey
,
2070 RegNtPostDeleteValueKey
,
2071 RegNtPostSetInformationKey
,
2073 RegNtPostEnumerateKey
,
2074 RegNtPostEnumerateValueKey
,
2076 RegNtPostQueryValueKey
,
2077 RegNtPostQueryMultipleValueKey
,
2078 RegNtPostKeyHandleClose
,
2079 RegNtPreCreateKeyEx
,
2080 RegNtPostCreateKeyEx
,
2083 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
2086 (NTAPI
*PEX_CALLBACK_FUNCTION
)(
2087 IN PVOID CallbackContext
,
2092 typedef struct _REG_DELETE_KEY_INFORMATION
2095 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
;
2097 typedef struct _REG_SET_VALUE_KEY_INFORMATION
2100 PUNICODE_STRING ValueName
;
2105 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
2107 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
2110 PUNICODE_STRING ValueName
;
2111 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
2113 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
2116 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
2117 PVOID KeySetInformation
;
2118 ULONG KeySetInformationLength
;
2119 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
2121 typedef struct _REG_ENUMERATE_KEY_INFORMATION
2125 KEY_INFORMATION_CLASS KeyInformationClass
;
2126 PVOID KeyInformation
;
2128 PULONG ResultLength
;
2129 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
2131 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
2135 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
2136 PVOID KeyValueInformation
;
2138 PULONG ResultLength
;
2139 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
2141 typedef struct _REG_QUERY_KEY_INFORMATION
2144 KEY_INFORMATION_CLASS KeyInformationClass
;
2145 PVOID KeyInformation
;
2147 PULONG ResultLength
;
2148 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
2150 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
2153 PUNICODE_STRING ValueName
;
2154 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
2155 PVOID KeyValueInformation
;
2157 PULONG ResultLength
;
2158 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
2160 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
2163 PKEY_VALUE_ENTRY ValueEntries
;
2166 PULONG BufferLength
;
2167 PULONG RequiredBufferLength
;
2168 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
2170 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
2172 PUNICODE_STRING CompleteName
;
2173 } REG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_CREATE_KEY_INFORMATION
;
2175 typedef struct _REG_POST_CREATE_KEY_INFORMATION
2177 PUNICODE_STRING CompleteName
;
2180 } REG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
;
2182 typedef struct _REG_PRE_OPEN_KEY_INFORMATION
2184 PUNICODE_STRING CompleteName
;
2185 } REG_PRE_OPEN_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;
2187 typedef struct _REG_POST_OPEN_KEY_INFORMATION
2189 PUNICODE_STRING CompleteName
;
2192 } REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
2194 typedef struct _REG_POST_OPERATION_INFORMATION
2198 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
2200 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
2203 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
2206 ** Storage structures
2208 typedef enum _PARTITION_STYLE
{
2209 PARTITION_STYLE_MBR
,
2210 PARTITION_STYLE_GPT
,
2214 typedef struct _CREATE_DISK_MBR
{
2216 } CREATE_DISK_MBR
, *PCREATE_DISK_MBR
;
2218 typedef struct _CREATE_DISK_GPT
{
2220 ULONG MaxPartitionCount
;
2221 } CREATE_DISK_GPT
, *PCREATE_DISK_GPT
;
2223 typedef struct _CREATE_DISK
{
2224 PARTITION_STYLE PartitionStyle
;
2225 _ANONYMOUS_UNION
union {
2226 CREATE_DISK_MBR Mbr
;
2227 CREATE_DISK_GPT Gpt
;
2229 } CREATE_DISK
, *PCREATE_DISK
;
2231 typedef struct _DISK_SIGNATURE
{
2232 ULONG PartitionStyle
;
2233 _ANONYMOUS_UNION
union {
2242 } DISK_SIGNATURE
, *PDISK_SIGNATURE
;
2245 (FASTCALL
*PTIME_UPDATE_NOTIFY_ROUTINE
)(
2247 IN KPROCESSOR_MODE Mode
);
2249 #define DBG_STATUS_CONTROL_C 1
2250 #define DBG_STATUS_SYSRQ 2
2251 #define DBG_STATUS_BUGCHECK_FIRST 3
2252 #define DBG_STATUS_BUGCHECK_SECOND 4
2253 #define DBG_STATUS_FATAL 5
2254 #define DBG_STATUS_DEBUG_CONTROL 6
2255 #define DBG_STATUS_WORKER 7
2257 typedef struct _PHYSICAL_MEMORY_RANGE
{
2258 PHYSICAL_ADDRESS BaseAddress
;
2259 LARGE_INTEGER NumberOfBytes
;
2260 } PHYSICAL_MEMORY_RANGE
, *PPHYSICAL_MEMORY_RANGE
;
2263 (NTAPI
*PDRIVER_VERIFIER_THUNK_ROUTINE
)(
2266 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS
{
2267 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine
;
2268 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine
;
2269 } DRIVER_VERIFIER_THUNK_PAIRS
, *PDRIVER_VERIFIER_THUNK_PAIRS
;
2271 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
2272 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
2273 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
2274 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
2275 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
2277 #define HASH_STRING_ALGORITHM_DEFAULT 0
2278 #define HASH_STRING_ALGORITHM_X65599 1
2279 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
2282 (DDKAPI
*PTIMER_APC_ROUTINE
)(
2283 IN PVOID TimerContext
,
2284 IN ULONG TimerLowValue
,
2285 IN LONG TimerHighValue
);
2294 (DDKAPI
*WMI_NOTIFICATION_CALLBACK
)(
2300 ** Architecture specific structures
2302 #define PCR_MINOR_VERSION 1
2303 #define PCR_MAJOR_VERSION 1
2307 #define SIZE_OF_80387_REGISTERS 80
2308 #define CONTEXT_i386 0x10000
2309 #define CONTEXT_i486 0x10000
2310 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
2311 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
2312 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
2313 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
2314 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
2315 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
2316 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
2317 #define MAXIMUM_SUPPORTED_EXTENSION 512
2319 typedef struct _FLOATING_SAVE_AREA
{
2324 ULONG ErrorSelector
;
2327 UCHAR RegisterArea
[SIZE_OF_80387_REGISTERS
];
2329 } FLOATING_SAVE_AREA
, *PFLOATING_SAVE_AREA
;
2331 typedef struct _CONTEXT
{
2339 FLOATING_SAVE_AREA FloatSave
;
2356 UCHAR ExtendedRegisters
[MAXIMUM_SUPPORTED_EXTENSION
];
2360 // Used to contain PFNs and PFN counts
2362 typedef ULONG PFN_COUNT
;
2363 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
2364 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2366 #define PASSIVE_LEVEL 0
2369 #define DISPATCH_LEVEL 2
2370 #define PROFILE_LEVEL 27
2371 #define CLOCK1_LEVEL 28
2372 #define CLOCK2_LEVEL 28
2373 #define IPI_LEVEL 29
2374 #define POWER_LEVEL 30
2375 #define HIGH_LEVEL 31
2377 typedef struct _KPCR_TIB
{
2378 PVOID ExceptionList
; /* 00 */
2379 PVOID StackBase
; /* 04 */
2380 PVOID StackLimit
; /* 08 */
2381 PVOID SubSystemTib
; /* 0C */
2382 _ANONYMOUS_UNION
union {
2383 PVOID FiberData
; /* 10 */
2384 ULONG Version
; /* 10 */
2386 PVOID ArbitraryUserPointer
; /* 14 */
2387 struct _KPCR_TIB
*Self
; /* 18 */
2388 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
2390 typedef struct _KPCR
{
2391 KPCR_TIB Tib
; /* 00 */
2392 struct _KPCR
*Self
; /* 1C */
2393 struct _KPRCB
*Prcb
; /* 20 */
2394 KIRQL Irql
; /* 24 */
2396 ULONG IrrActive
; /* 2C */
2398 PVOID KdVersionBlock
; /* 34 */
2399 PUSHORT IDT
; /* 38 */
2400 PUSHORT GDT
; /* 3C */
2401 struct _KTSS
*TSS
; /* 40 */
2402 USHORT MajorVersion
; /* 44 */
2403 USHORT MinorVersion
; /* 46 */
2404 KAFFINITY SetMember
; /* 48 */
2405 ULONG StallScaleFactor
; /* 4C */
2406 UCHAR SpareUnused
; /* 50 */
2407 UCHAR Number
; /* 51 */
2409 UCHAR SecondLevelCacheAssociativity
;
2411 ULONG KernelReserved
[14]; // For use by the kernel
2412 ULONG SecondLevelCacheSize
;
2413 ULONG HalReserved
[16]; // For use by Hal
2414 } KPCR
, *PKPCR
; /* 54 */
2416 #define KeGetPcr() PCR
2418 typedef struct _KFLOATING_SAVE
{
2422 ULONG ErrorSelector
;
2427 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2431 KeGetCurrentProcessorNumber(VOID
)
2433 return (ULONG
)__readfsbyte(FIELD_OFFSET(KPCR
, Number
));
2448 #define KI_USER_SHARED_DATA 0xffdf0000
2450 #define PAGE_SIZE 0x1000
2451 #define PAGE_SHIFT 12L
2453 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
2455 extern NTKERNELAPI PVOID MmHighestUserAddress
;
2456 extern NTKERNELAPI PVOID MmSystemRangeStart
;
2457 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress
;
2459 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
2460 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
2461 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
2462 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
2463 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
2465 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
2466 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
2468 #elif defined(__x86_64__)
2470 #define CONTEXT_AMD64 0x100000
2471 #if !defined(RC_INVOKED)
2472 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
2473 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
2474 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
2475 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
2476 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
2478 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
2479 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
2481 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
2482 #define CONTEXT_SERVICE_ACTIVE 0x10000000
2483 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
2484 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
2487 typedef struct DECLSPEC_ALIGN(16) _M128A
{
2492 typedef struct _XMM_SAVE_AREA32
{
2499 USHORT ErrorSelector
;
2502 USHORT DataSelector
;
2506 M128A FloatRegisters
[8];
2507 M128A XmmRegisters
[16];
2508 UCHAR Reserved4
[96];
2509 } XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
2511 typedef struct DECLSPEC_ALIGN(16) _CONTEXT
{
2561 /* Floating point */
2563 XMM_SAVE_AREA32 FltSave
;
2587 M128A VectorRegister
[26];
2588 ULONG64 VectorControl
;
2591 ULONG64 DebugControl
;
2592 ULONG64 LastBranchToRip
;
2593 ULONG64 LastBranchFromRip
;
2594 ULONG64 LastExceptionToRip
;
2595 ULONG64 LastExceptionFromRip
;
2599 // Used to contain PFNs and PFN counts
2601 typedef ULONG PFN_COUNT
;
2602 typedef ULONG64 PFN_NUMBER
, *PPFN_NUMBER
;
2603 typedef LONG64 SPFN_NUMBER
, *PSPFN_NUMBER
;
2605 #define PASSIVE_LEVEL 0
2608 #define DISPATCH_LEVEL 2
2609 #define CLOCK_LEVEL 13
2610 #define IPI_LEVEL 14
2611 #define POWER_LEVEL 14
2612 #define PROFILE_LEVEL 15
2613 #define HIGH_LEVEL 15
2615 #define PAGE_SIZE 0x1000
2616 #define PAGE_SHIFT 12L
2617 #define PTI_SHIFT 12L
2618 #define PDI_SHIFT 21L
2619 #define PPI_SHIFT 30L
2620 #define PXI_SHIFT 39L
2621 #define PTE_PER_PAGE 512
2622 #define PDE_PER_PAGE 512
2623 #define PPE_PER_PAGE 512
2624 #define PXE_PER_PAGE 512
2625 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
2626 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
2627 #define PPI_MASK (PPE_PER_PAGE - 1)
2628 #define PXI_MASK (PXE_PER_PAGE - 1)
2630 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
2631 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
2632 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
2633 #define PDE_BASE 0xFFFFF6FB40000000ULL
2634 #define PTE_BASE 0xFFFFF68000000000ULL
2635 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
2636 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
2637 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
2638 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
2640 extern NTKERNELAPI PVOID MmHighestUserAddress
;
2641 extern NTKERNELAPI PVOID MmSystemRangeStart
;
2642 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress
;
2644 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
2645 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
2646 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
2647 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
2648 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
2649 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
2651 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
2652 #define SharedInterruptTime (&SharedUserData->InterruptTime)
2653 #define SharedSystemTime (&SharedUserData->SystemTime)
2654 #define SharedTickCount (&SharedUserData->TickCount)
2656 #define KeQueryInterruptTime() \
2657 (*(volatile ULONG64*)SharedInterruptTime)
2658 #define KeQuerySystemTime(CurrentCount) \
2659 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
2660 #define KeQueryTickCount(CurrentCount) \
2661 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
2663 typedef struct _KPCR
2665 __GNU_EXTENSION
union
2668 __GNU_EXTENSION
struct
2670 union _KGDTENTRY64
*GdtBase
;
2671 struct _KTSS64
*TssBase
;
2674 struct _KPRCB
*CurrentPrcb
;
2675 PKSPIN_LOCK_QUEUE LockArray
;
2679 union _KIDTENTRY64
*IdtBase
;
2682 UCHAR SecondLevelCacheAssociativity
;
2683 UCHAR ObsoleteNumber
;
2686 USHORT MajorVersion
;
2687 USHORT MinorVersion
;
2688 ULONG StallScaleFactor
;
2690 ULONG KernelReserved
[15];
2691 ULONG SecondLevelCacheSize
;
2692 ULONG HalReserved
[16];
2694 PVOID KdVersionBlock
;
2696 ULONG PcrAlign1
[24];
2699 typedef struct _KFLOATING_SAVE
{
2701 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2713 return (PKPCR
)__readgsqword(FIELD_OFFSET(KPCR
, Self
));
2718 KeGetCurrentProcessorNumber(VOID
)
2720 return (ULONG
)__readgsword(0x184);
2723 #elif defined(__PowerPC__)
2726 // Used to contain PFNs and PFN counts
2728 typedef ULONG PFN_COUNT
;
2729 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
2730 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2732 #define PASSIVE_LEVEL 0
2735 #define DISPATCH_LEVEL 2
2736 #define PROFILE_LEVEL 27
2737 #define CLOCK1_LEVEL 28
2738 #define CLOCK2_LEVEL 28
2739 #define IPI_LEVEL 29
2740 #define POWER_LEVEL 30
2741 #define HIGH_LEVEL 31
2743 typedef struct _KFLOATING_SAVE
{
2745 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2747 typedef struct _KPCR_TIB
{
2748 PVOID ExceptionList
; /* 00 */
2749 PVOID StackBase
; /* 04 */
2750 PVOID StackLimit
; /* 08 */
2751 PVOID SubSystemTib
; /* 0C */
2752 _ANONYMOUS_UNION
union {
2753 PVOID FiberData
; /* 10 */
2754 ULONG Version
; /* 10 */
2756 PVOID ArbitraryUserPointer
; /* 14 */
2757 struct _KPCR_TIB
*Self
; /* 18 */
2758 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
2760 #define PCR_MINOR_VERSION 1
2761 #define PCR_MAJOR_VERSION 1
2763 typedef struct _KPCR
{
2764 KPCR_TIB Tib
; /* 00 */
2765 struct _KPCR
*Self
; /* 1C */
2766 struct _KPRCB
*Prcb
; /* 20 */
2767 KIRQL Irql
; /* 24 */
2769 ULONG IrrActive
; /* 2C */
2771 PVOID KdVersionBlock
; /* 34 */
2772 PUSHORT IDT
; /* 38 */
2773 PUSHORT GDT
; /* 3C */
2774 struct _KTSS
*TSS
; /* 40 */
2775 USHORT MajorVersion
; /* 44 */
2776 USHORT MinorVersion
; /* 46 */
2777 KAFFINITY SetMember
; /* 48 */
2778 ULONG StallScaleFactor
; /* 4C */
2779 UCHAR SpareUnused
; /* 50 */
2780 UCHAR Number
; /* 51 */
2781 } KPCR
, *PKPCR
; /* 54 */
2783 #define KeGetPcr() PCR
2788 KeGetCurrentProcessorNumber(VOID
)
2791 __asm__
__volatile__ (
2794 : "i" (FIELD_OFFSET(KPCR
, Number
))
2799 #elif defined(_MIPS_)
2801 #error MIPS Headers are totally incorrect
2804 // Used to contain PFNs and PFN counts
2806 typedef ULONG PFN_COUNT
;
2807 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
2808 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2810 #define PASSIVE_LEVEL 0
2812 #define DISPATCH_LEVEL 2
2813 #define PROFILE_LEVEL 27
2814 #define IPI_LEVEL 29
2815 #define HIGH_LEVEL 31
2817 typedef struct _KPCR
{
2818 struct _KPRCB
*Prcb
; /* 20 */
2819 KIRQL Irql
; /* 24 */
2824 #define KeGetPcr() PCR
2826 typedef struct _KFLOATING_SAVE
{
2827 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2832 KeGetCurrentProcessorNumber(VOID
)
2837 #elif defined(_M_ARM)
2840 // NT-ARM is not documented, need DDK-ARM
2845 #error Unknown architecture
2848 #define MM_DONT_ZERO_ALLOCATION 0x00000001
2849 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
2852 #define EFLAG_SIGN 0x8000
2853 #define EFLAG_ZERO 0x4000
2854 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
2856 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
2857 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
2858 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
2860 typedef enum _INTERLOCKED_RESULT
{
2861 ResultNegative
= RESULT_NEGATIVE
,
2862 ResultZero
= RESULT_ZERO
,
2863 ResultPositive
= RESULT_POSITIVE
2864 } INTERLOCKED_RESULT
;
2867 (NTAPI
*PciPin2Line
)(
2868 IN
struct _BUS_HANDLER
*BusHandler
,
2869 IN
struct _BUS_HANDLER
*RootHandler
,
2870 IN PCI_SLOT_NUMBER SlotNumber
,
2871 IN PPCI_COMMON_CONFIG PciData
2875 (NTAPI
*PciLine2Pin
)(
2876 IN
struct _BUS_HANDLER
*BusHandler
,
2877 IN
struct _BUS_HANDLER
*RootHandler
,
2878 IN PCI_SLOT_NUMBER SlotNumber
,
2879 IN PPCI_COMMON_CONFIG PciNewData
,
2880 IN PPCI_COMMON_CONFIG PciOldData
2884 (NTAPI
*PciReadWriteConfig
)(
2885 IN
struct _BUS_HANDLER
*BusHandler
,
2886 IN PCI_SLOT_NUMBER Slot
,
2892 #define PCI_DATA_TAG ' ICP'
2893 #define PCI_DATA_VERSION 1
2895 typedef struct _PCIBUSDATA
2899 PciReadWriteConfig ReadConfig
;
2900 PciReadWriteConfig WriteConfig
;
2901 PciPin2Line Pin2Line
;
2902 PciLine2Pin Line2Pin
;
2903 PCI_SLOT_NUMBER ParentSlot
;
2905 } PCIBUSDATA
, *PPCIBUSDATA
;
2908 /** SPINLOCK FUNCTIONS ********************************************************/
2913 KeTryToAcquireSpinLockAtDpcLevel(
2914 IN OUT PKSPIN_LOCK SpinLock
2921 IN PKSPIN_LOCK SpinLock
2926 #if defined(WIN9X_COMPAT_SPINLOCK)
2931 KeInitializeSpinLock(
2932 IN PKSPIN_LOCK SpinLock
2939 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
2941 /* Clear the lock */
2951 IN PKSPIN_LOCK SpinLock
);
2957 IN PKSPIN_LOCK SpinLock
,
2963 KefAcquireSpinLockAtDpcLevel(
2964 IN PKSPIN_LOCK SpinLock
);
2969 KefReleaseSpinLockFromDpcLevel(
2970 IN PKSPIN_LOCK SpinLock
);
2972 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
2973 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
2974 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
2975 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
2977 #define KeGetDcacheFillSize() 1L
2979 #elif defined(_M_ARM) // !defined (_X86_)
2983 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
2985 /* Clear the lock */
2993 IN PKSPIN_LOCK SpinLock
);
2999 IN PKSPIN_LOCK SpinLock
,
3006 KefAcquireSpinLockAtDpcLevel(
3007 IN PKSPIN_LOCK SpinLock
);
3012 KefReleaseSpinLockFromDpcLevel(
3013 IN PKSPIN_LOCK SpinLock
);
3016 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
3017 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
3018 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
3019 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
3024 KeInitializeSpinLock(
3025 IN PKSPIN_LOCK SpinLock
);
3032 KeInitializeSpinLock(
3033 PKSPIN_LOCK SpinLock
)
3041 IN PKSPIN_LOCK SpinLock
,
3046 KeAcquireSpinLockAtDpcLevel(
3047 IN PKSPIN_LOCK SpinLock
);
3051 KeReleaseSpinLockFromDpcLevel(
3052 IN PKSPIN_LOCK SpinLock
);
3056 KeAcquireSpinLockRaiseToDpc(
3057 IN PKSPIN_LOCK SpinLock
);
3059 #define KeAcquireSpinLock(SpinLock, OldIrql) \
3060 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
3062 #endif // !defined (_X86_)
3065 ** Utillity functions
3068 #define ARGUMENT_PRESENT(ArgumentPointer) \
3069 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
3076 #define BYTE_OFFSET(Va) \
3077 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
3084 #define BYTES_TO_PAGES(Size) \
3085 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
3092 #define PAGE_ALIGN(Va) \
3093 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
3098 * IN ULONG_PTR Size)
3100 #define ROUND_TO_PAGES(Size) \
3101 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
3105 #if defined(_X86_) || defined(_AMD64_)
3108 // x86 and x64 performs a 0x2C interrupt
3110 #define DbgRaiseAssertionFailure __int2c
3112 #elif defined(_ARM_)
3119 #error Unsupported Architecture
3124 #define ASSERT(exp) \
3126 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
3128 #define ASSERTMSG(msg, exp) \
3130 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
3132 #define RTL_SOFT_ASSERT(exp) \
3134 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
3136 #define RTL_SOFT_ASSERTMSG(msg, exp) \
3138 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
3140 #define RTL_VERIFY(exp) ASSERT(exp)
3141 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
3143 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
3144 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
3146 #if defined(_MSC_VER)
3148 #define NT_ASSERT(exp) \
3150 (__annotation(L"Debug", L"AssertFail", L#exp), \
3151 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3153 #define NT_ASSERTMSG(msg, exp) \
3155 (__annotation(L"Debug", L"AssertFail", L##msg), \
3156 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3158 #define NT_ASSERTMSGW(msg, exp) \
3160 (__annotation(L"Debug", L"AssertFail", msg), \
3161 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3166 // GCC doesn't support __annotation (nor PDB)
3168 #define NT_ASSERT(exp) \
3169 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
3171 #define NT_ASSERTMSG NT_ASSERT
3172 #define NT_ASSERTMSGW NT_ASSERT
3178 #define ASSERT(exp) ((VOID) 0)
3179 #define ASSERTMSG(msg, exp) ((VOID) 0)
3181 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
3182 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
3184 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
3185 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
3187 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
3188 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
3190 #define NT_ASSERT(exp) ((VOID)0)
3191 #define NT_ASSERTMSG(exp) ((VOID)0)
3192 #define NT_ASSERTMSGW(exp) ((VOID)0)
3196 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
3197 #if defined(_NTSYSTEM_) || defined(__GNUC__)
3198 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
3199 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
3201 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
3202 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
3203 #endif /* _NT_SYSTEM */
3205 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG
;
3206 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG
;
3209 ** Driver support routines
3212 /** Runtime library routines **/
3214 static __inline VOID
3216 IN PLIST_ENTRY ListHead
)
3218 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
3221 static __inline VOID
3223 IN PLIST_ENTRY ListHead
,
3224 IN PLIST_ENTRY Entry
)
3226 PLIST_ENTRY OldFlink
;
3227 OldFlink
= ListHead
->Flink
;
3228 Entry
->Flink
= OldFlink
;
3229 Entry
->Blink
= ListHead
;
3230 OldFlink
->Blink
= Entry
;
3231 ListHead
->Flink
= Entry
;
3234 static __inline VOID
3236 IN PLIST_ENTRY ListHead
,
3237 IN PLIST_ENTRY Entry
)
3239 PLIST_ENTRY OldBlink
;
3240 OldBlink
= ListHead
->Blink
;
3241 Entry
->Flink
= ListHead
;
3242 Entry
->Blink
= OldBlink
;
3243 OldBlink
->Flink
= Entry
;
3244 ListHead
->Blink
= Entry
;
3250 * IN PLIST_ENTRY ListHead)
3252 #define IsListEmpty(_ListHead) \
3253 ((_ListHead)->Flink == (_ListHead))
3256 * PSINGLE_LIST_ENTRY
3258 * IN PSINGLE_LIST_ENTRY ListHead)
3260 #define PopEntryList(ListHead) \
3263 PSINGLE_LIST_ENTRY _FirstEntry; \
3264 _FirstEntry = (ListHead)->Next; \
3265 if (_FirstEntry != NULL) \
3266 (ListHead)->Next = _FirstEntry->Next; \
3272 * IN PSINGLE_LIST_ENTRY ListHead,
3273 * IN PSINGLE_LIST_ENTRY Entry)
3275 #define PushEntryList(_ListHead, _Entry) \
3276 (_Entry)->Next = (_ListHead)->Next; \
3277 (_ListHead)->Next = (_Entry); \
3279 static __inline BOOLEAN
3281 IN PLIST_ENTRY Entry
)
3283 PLIST_ENTRY OldFlink
;
3284 PLIST_ENTRY OldBlink
;
3286 OldFlink
= Entry
->Flink
;
3287 OldBlink
= Entry
->Blink
;
3288 OldFlink
->Blink
= OldBlink
;
3289 OldBlink
->Flink
= OldFlink
;
3290 return (BOOLEAN
)(OldFlink
== OldBlink
);
3293 static __inline PLIST_ENTRY
3295 IN PLIST_ENTRY ListHead
)
3300 Entry
= ListHead
->Flink
;
3301 Flink
= Entry
->Flink
;
3302 ListHead
->Flink
= Flink
;
3303 Flink
->Blink
= ListHead
;
3307 static __inline PLIST_ENTRY
3309 IN PLIST_ENTRY ListHead
)
3314 Entry
= ListHead
->Blink
;
3315 Blink
= Entry
->Blink
;
3316 ListHead
->Blink
= Blink
;
3317 Blink
->Flink
= ListHead
;
3326 IN ULONG Base OPTIONAL
,
3327 IN OUT PULONG Value
);
3335 BOOLEAN CaseInSensitive
);
3337 #if !defined(MIDL_PASS)
3342 RtlConvertLongToLuid(
3348 Temp
.QuadPart
= Val
;
3349 Luid
.LowPart
= Temp
.u
.LowPart
;
3350 Luid
.HighPart
= Temp
.u
.HighPart
;
3358 RtlConvertUlongToLuid(
3375 IN VOID UNALIGNED
*Destination
,
3376 IN CONST VOID UNALIGNED
*Source
,
3383 IN OUT PSTRING DestinationString
,
3384 IN PSTRING SourceString OPTIONAL
);
3392 IN BOOLEAN CaseInSensitive
);
3394 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
3395 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
3396 *CallersAddress = (PVOID)_ReturnAddress(); \
3397 *CallersCaller = NULL;
3402 RtlGetCallersAddress(
3403 OUT PVOID
*CallersAddress
,
3404 OUT PVOID
*CallersCaller
);
3411 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
3417 IN OUT PACCESS_MASK AccessMask
,
3418 IN PGENERIC_MAPPING GenericMapping
);
3423 RtlPrefixUnicodeString(
3424 IN PCUNICODE_STRING String1
,
3425 IN PCUNICODE_STRING String2
,
3426 IN BOOLEAN CaseInSensitive
);
3431 RtlUpcaseUnicodeString(
3432 IN OUT PUNICODE_STRING DestinationString OPTIONAL
,
3433 IN PCUNICODE_STRING SourceString
,
3434 IN BOOLEAN AllocateDestinationString
);
3446 IN OUT PSTRING DestinationString
,
3447 IN PSTRING SourceString
);
3452 RtlVerifyVersionInfo(
3453 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
3455 IN ULONGLONG ConditionMask
);
3460 RtlVolumeDeviceToDosName(
3461 IN PVOID VolumeDeviceObject
,
3462 OUT PUNICODE_STRING DosName
);
3475 KeAreAllApcsDisabled(
3479 /* Guarded Mutex routines */
3484 KeAcquireGuardedMutex(
3485 IN OUT PKGUARDED_MUTEX GuardedMutex
3491 KeAcquireGuardedMutexUnsafe(
3492 IN OUT PKGUARDED_MUTEX GuardedMutex
3498 KeEnterGuardedRegion(
3505 KeLeaveGuardedRegion(
3512 KeInitializeGuardedMutex(
3513 OUT PKGUARDED_MUTEX GuardedMutex
3519 KeReleaseGuardedMutexUnsafe(
3520 IN OUT PKGUARDED_MUTEX GuardedMutex
3526 KeReleaseGuardedMutex(
3527 IN OUT PKGUARDED_MUTEX GuardedMutex
3533 KeTryToAcquireGuardedMutex(
3534 IN OUT PKGUARDED_MUTEX GuardedMutex
3538 #define ExInitializeFastMutex(_FastMutex) \
3540 (_FastMutex)->Count = FM_LOCK_BIT; \
3541 (_FastMutex)->Owner = NULL; \
3542 (_FastMutex)->Contention = 0; \
3543 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
3554 /******************************************************************************
3556 ******************************************************************************/
3558 typedef struct _ZONE_SEGMENT_HEADER
{
3559 SINGLE_LIST_ENTRY SegmentList
;
3561 } ZONE_SEGMENT_HEADER
, *PZONE_SEGMENT_HEADER
;
3563 typedef struct _ZONE_HEADER
{
3564 SINGLE_LIST_ENTRY FreeList
;
3565 SINGLE_LIST_ENTRY SegmentList
;
3567 ULONG TotalSegmentSize
;
3568 } ZONE_HEADER
, *PZONE_HEADER
;
3570 #define PROTECTED_POOL 0x80000000
3572 /******************************************************************************
3573 * Executive Functions *
3574 ******************************************************************************/
3580 IN PZONE_HEADER Zone
,
3582 IN ULONG SegmentSize
);
3584 static __inline PVOID
3586 IN PZONE_HEADER Zone
)
3588 if (Zone
->FreeList
.Next
)
3589 Zone
->FreeList
.Next
= Zone
->FreeList
.Next
->Next
;
3590 return (PVOID
) Zone
->FreeList
.Next
;
3593 static __inline PVOID
3595 IN PZONE_HEADER Zone
,
3598 ((PSINGLE_LIST_ENTRY
) Block
)->Next
= Zone
->FreeList
.Next
;
3599 Zone
->FreeList
.Next
= ((PSINGLE_LIST_ENTRY
) Block
);
3600 return ((PSINGLE_LIST_ENTRY
) Block
)->Next
;
3607 IN PZONE_HEADER Zone
,
3609 IN PVOID InitialSegment
,
3610 IN ULONG InitialSegmentSize
);
3614 * ExInterlockedAllocateFromZone(
3615 * IN PZONE_HEADER Zone,
3616 * IN PKSPIN_LOCK Lock)
3618 #define ExInterlockedAllocateFromZone(Zone, Lock) \
3619 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
3624 ExInterlockedExtendZone(
3625 IN PZONE_HEADER Zone
,
3627 IN ULONG SegmentSize
,
3628 IN PKSPIN_LOCK Lock
);
3631 * ExInterlockedFreeToZone(
3632 * IN PZONE_HEADER Zone,
3634 * IN PKSPIN_LOCK Lock);
3636 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
3637 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
3641 * InitializeSListHead(
3642 * IN PSLIST_HEADER SListHead)
3644 #define InitializeSListHead(_SListHead) \
3645 (_SListHead)->Alignment = 0
3647 #define ExInitializeSListHead InitializeSListHead
3652 * IN PZONE_HEADER Zone)
3654 #define ExIsFullZone(Zone) \
3655 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
3658 * ExIsObjectInFirstZoneSegment(
3659 * IN PZONE_HEADER Zone,
3662 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
3663 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
3664 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
3665 (Zone)->TotalSegmentSize)) )
3671 ExRaiseAccessViolation(
3678 ExRaiseDatatypeMisalignment(
3687 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
3688 #define ExAcquireResourceShared ExAcquireResourceSharedLite
3689 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
3690 #define ExDeleteResource ExDeleteResourceLite
3691 #define ExInitializeResource ExInitializeResourceLite
3692 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
3693 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
3694 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
3695 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
3700 #define PAGED_CODE() { \
3701 if (KeGetCurrentIrql() > APC_LEVEL) { \
3702 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
3709 #define PAGED_CODE()
3717 IN CONST VOID
*Address
,
3719 IN ULONG Alignment
);
3727 IN ULONG Alignment
);
3731 /** Configuration manager routines **/
3737 IN PEX_CALLBACK_FUNCTION Function
,
3739 IN OUT PLARGE_INTEGER Cookie
);
3744 CmUnRegisterCallback(
3745 IN LARGE_INTEGER Cookie
);
3749 /** Filesystem runtime library routines **/
3754 FsRtlIsTotalDeviceFailure(
3755 IN NTSTATUS Status
);
3759 /** Hardware abstraction layer routines **/
3765 IN ULONG Frequency
);
3771 IN PDEVICE_OBJECT DeviceObject
,
3772 IN ULONG SectorSize
,
3773 IN ULONG MBRTypeIdentifier
,
3779 PADAPTER_OBJECT AdapterObject
3783 /** Io access routines **/
3785 #if !defined(_M_AMD64)
3789 READ_PORT_BUFFER_UCHAR(
3797 READ_PORT_BUFFER_ULONG(
3805 READ_PORT_BUFFER_USHORT(
3831 READ_REGISTER_BUFFER_UCHAR(
3839 READ_REGISTER_BUFFER_ULONG(
3847 READ_REGISTER_BUFFER_USHORT(
3848 IN PUSHORT Register
,
3855 READ_REGISTER_UCHAR(
3856 IN PUCHAR Register
);
3861 READ_REGISTER_ULONG(
3862 IN PULONG Register
);
3867 READ_REGISTER_USHORT(
3868 IN PUSHORT Register
);
3873 WRITE_PORT_BUFFER_UCHAR(
3881 WRITE_PORT_BUFFER_ULONG(
3889 WRITE_PORT_BUFFER_USHORT(
3918 WRITE_REGISTER_BUFFER_UCHAR(
3926 WRITE_REGISTER_BUFFER_ULONG(
3934 WRITE_REGISTER_BUFFER_USHORT(
3935 IN PUSHORT Register
,
3942 WRITE_REGISTER_UCHAR(
3949 WRITE_REGISTER_ULONG(
3956 WRITE_REGISTER_USHORT(
3957 IN PUSHORT Register
,
3964 READ_PORT_BUFFER_UCHAR(
3969 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3974 READ_PORT_BUFFER_ULONG(
3979 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3984 READ_PORT_BUFFER_USHORT(
3989 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
3997 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
4005 return __indword((USHORT
)(ULONG_PTR
)Port
);
4013 return __inword((USHORT
)(ULONG_PTR
)Port
);
4018 READ_REGISTER_BUFFER_UCHAR(
4023 __movsb(Register
, Buffer
, Count
);
4028 READ_REGISTER_BUFFER_ULONG(
4033 __movsd(Register
, Buffer
, Count
);
4038 READ_REGISTER_BUFFER_USHORT(
4039 IN PUSHORT Register
,
4043 __movsw(Register
, Buffer
, Count
);
4048 READ_REGISTER_UCHAR(
4056 READ_REGISTER_ULONG(
4064 READ_REGISTER_USHORT(
4065 IN PUSHORT Register
)
4072 WRITE_PORT_BUFFER_UCHAR(
4077 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
4082 WRITE_PORT_BUFFER_ULONG(
4087 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
4092 WRITE_PORT_BUFFER_USHORT(
4097 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
4106 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
4115 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
4124 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
4129 WRITE_REGISTER_BUFFER_UCHAR(
4135 __movsb(Register
, Buffer
, Count
);
4136 InterlockedOr(&Synch
, 1);
4141 WRITE_REGISTER_BUFFER_ULONG(
4147 __movsd(Register
, Buffer
, Count
);
4148 InterlockedOr(&Synch
, 1);
4153 WRITE_REGISTER_BUFFER_USHORT(
4154 IN PUSHORT Register
,
4159 __movsw(Register
, Buffer
, Count
);
4160 InterlockedOr(&Synch
, 1);
4165 WRITE_REGISTER_UCHAR(
4171 InterlockedOr(&Synch
, 1);
4176 WRITE_REGISTER_ULONG(
4182 InterlockedOr(&Synch
, 1);
4187 WRITE_REGISTER_USHORT(
4188 IN PUSHORT Register
,
4193 InterlockedOr(&Sync
, 1);
4198 /** I/O manager routines **/
4203 IoAcquireCancelSpinLock(
4209 IoAcquireRemoveLockEx(
4210 IN PIO_REMOVE_LOCK RemoveLock
,
4211 IN OPTIONAL PVOID Tag OPTIONAL
,
4214 IN ULONG RemlockSize
);
4218 * IoAcquireRemoveLock(
4219 * IN PIO_REMOVE_LOCK RemoveLock,
4220 * IN OPTIONAL PVOID Tag)
4222 #define IoAcquireRemoveLock(_RemoveLock, \
4224 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
4228 * IoAdjustPagingPathCount(
4230 * IN BOOLEAN Increment)
4232 #define IoAdjustPagingPathCount(_Count, \
4237 InterlockedIncrement(_Count); \
4241 InterlockedDecrement(_Count); \
4245 #ifndef DMA_MACROS_DEFINED
4249 IoAllocateAdapterChannel(
4250 IN PADAPTER_OBJECT AdapterObject
,
4251 IN PDEVICE_OBJECT DeviceObject
,
4252 IN ULONG NumberOfMapRegisters
,
4253 IN PDRIVER_CONTROL ExecutionRoutine
,
4260 IoAllocateController(
4261 IN PCONTROLLER_OBJECT ControllerObject
,
4262 IN PDEVICE_OBJECT DeviceObject
,
4263 IN PDRIVER_CONTROL ExecutionRoutine
,
4269 IoAllocateDriverObjectExtension(
4270 IN PDRIVER_OBJECT DriverObject
,
4271 IN PVOID ClientIdentificationAddress
,
4272 IN ULONG DriverObjectExtensionSize
,
4273 OUT PVOID
*DriverObjectExtension
);
4278 IoAllocateErrorLogEntry(
4280 IN UCHAR EntrySize
);
4287 IN BOOLEAN ChargeQuota
);
4293 IN PVOID VirtualAddress
,
4295 IN BOOLEAN SecondaryBuffer
,
4296 IN BOOLEAN ChargeQuota
,
4297 IN OUT PIRP Irp OPTIONAL
);
4303 IN PDEVICE_OBJECT DeviceObject
);
4306 * VOID IoAssignArcName(
4307 * IN PUNICODE_STRING ArcName,
4308 * IN PUNICODE_STRING DeviceName);
4310 #define IoAssignArcName(_ArcName, _DeviceName) ( \
4311 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
4317 IN PDEVICE_OBJECT SourceDevice
,
4318 IN PUNICODE_STRING TargetDevice
,
4319 OUT PDEVICE_OBJECT
*AttachedDevice
);
4324 IoAttachDeviceToDeviceStack(
4325 IN PDEVICE_OBJECT SourceDevice
,
4326 IN PDEVICE_OBJECT TargetDevice
);
4331 IoBuildAsynchronousFsdRequest(
4332 IN ULONG MajorFunction
,
4333 IN PDEVICE_OBJECT DeviceObject
,
4334 IN OUT PVOID Buffer OPTIONAL
,
4335 IN ULONG Length OPTIONAL
,
4336 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
4337 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
4342 IoBuildDeviceIoControlRequest(
4343 IN ULONG IoControlCode
,
4344 IN PDEVICE_OBJECT DeviceObject
,
4345 IN PVOID InputBuffer OPTIONAL
,
4346 IN ULONG InputBufferLength
,
4347 OUT PVOID OutputBuffer OPTIONAL
,
4348 IN ULONG OutputBufferLength
,
4349 IN BOOLEAN InternalDeviceIoControl
,
4351 OUT PIO_STATUS_BLOCK IoStatusBlock
);
4358 IN OUT PMDL TargetMdl
,
4359 IN PVOID VirtualAddress
,
4365 IoBuildSynchronousFsdRequest(
4366 IN ULONG MajorFunction
,
4367 IN PDEVICE_OBJECT DeviceObject
,
4368 IN OUT PVOID Buffer OPTIONAL
,
4369 IN ULONG Length OPTIONAL
,
4370 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
4372 OUT PIO_STATUS_BLOCK IoStatusBlock
);
4378 IN PDEVICE_OBJECT DeviceObject
,
4384 * IN PDEVICE_OBJECT DeviceObject,
4387 #define IoCallDriver IofCallDriver
4393 IN PDEVICE_OBJECT DeviceObject
,
4394 IN PFILE_OBJECT FileObject
);
4406 IN ACCESS_MASK DesiredAccess
,
4407 IN ULONG DesiredShareAccess
,
4408 IN OUT PFILE_OBJECT FileObject
,
4409 IN OUT PSHARE_ACCESS ShareAccess
,
4417 IN CCHAR PriorityBoost
);
4421 * IoCompleteRequest(
4423 * IN CCHAR PriorityBoost)
4425 #define IoCompleteRequest IofCompleteRequest
4431 OUT PKINTERRUPT
*InterruptObject
,
4432 IN PKSERVICE_ROUTINE ServiceRoutine
,
4433 IN PVOID ServiceContext
,
4434 IN PKSPIN_LOCK SpinLock OPTIONAL
,
4437 IN KIRQL SynchronizeIrql
,
4438 IN KINTERRUPT_MODE InterruptMode
,
4439 IN BOOLEAN ShareVector
,
4440 IN KAFFINITY ProcessorEnableMask
,
4441 IN BOOLEAN FloatingSave
);
4444 * PIO_STACK_LOCATION
4445 * IoGetCurrentIrpStackLocation(
4448 #define IoGetCurrentIrpStackLocation(_Irp) \
4449 ((_Irp)->Tail.Overlay.CurrentStackLocation)
4452 * PIO_STACK_LOCATION
4453 * IoGetNextIrpStackLocation(
4456 #define IoGetNextIrpStackLocation(_Irp) \
4457 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
4461 * IoCopyCurrentIrpStackLocationToNext(
4464 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
4466 PIO_STACK_LOCATION _IrpSp; \
4467 PIO_STACK_LOCATION _NextIrpSp; \
4468 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
4469 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
4470 RtlCopyMemory(_NextIrpSp, _IrpSp, \
4471 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
4472 _NextIrpSp->Control = 0; \
4485 IN PDRIVER_OBJECT DriverObject
,
4486 IN ULONG DeviceExtensionSize
,
4487 IN PUNICODE_STRING DeviceName OPTIONAL
,
4488 IN DEVICE_TYPE DeviceType
,
4489 IN ULONG DeviceCharacteristics
,
4490 IN BOOLEAN Exclusive
,
4491 OUT PDEVICE_OBJECT
*DeviceObject
);
4497 IN PDEVICE_OBJECT DeviceObject
,
4498 IN PCREATE_DISK Disk
);
4504 OUT PHANDLE FileHandle
,
4505 IN ACCESS_MASK DesiredAccess
,
4506 IN POBJECT_ATTRIBUTES ObjectAttributes
,
4507 OUT PIO_STATUS_BLOCK IoStatusBlock
,
4508 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
4509 IN ULONG FileAttributes
,
4510 IN ULONG ShareAccess
,
4511 IN ULONG Disposition
,
4512 IN ULONG CreateOptions
,
4513 IN PVOID EaBuffer OPTIONAL
,
4515 IN CREATE_FILE_TYPE CreateFileType
,
4516 IN PVOID ExtraCreateParameters OPTIONAL
,
4522 IoCreateNotificationEvent(
4523 IN PUNICODE_STRING EventName
,
4524 OUT PHANDLE EventHandle
);
4529 IoCreateSymbolicLink(
4530 IN PUNICODE_STRING SymbolicLinkName
,
4531 IN PUNICODE_STRING DeviceName
);
4536 IoCreateSynchronizationEvent(
4537 IN PUNICODE_STRING EventName
,
4538 OUT PHANDLE EventHandle
);
4543 IoCreateUnprotectedSymbolicLink(
4544 IN PUNICODE_STRING SymbolicLinkName
,
4545 IN PUNICODE_STRING DeviceName
);
4552 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
4553 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
4554 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
4555 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
4556 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
4557 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
4565 IN PIO_CSQ_IRP_CONTEXT Context
);
4572 IN PIO_CSQ_IRP_CONTEXT Context
);
4579 IN PVOID PeekContext
);
4585 IN PCONTROLLER_OBJECT ControllerObject
);
4591 IN PDEVICE_OBJECT DeviceObject
);
4596 IoDeleteSymbolicLink(
4597 IN PUNICODE_STRING SymbolicLinkName
);
4601 * IoDeassignArcName(
4602 * IN PUNICODE_STRING ArcName)
4604 #define IoDeassignArcName IoDeleteSymbolicLink
4610 IN OUT PDEVICE_OBJECT TargetDevice
);
4615 IoDisconnectInterrupt(
4616 IN PKINTERRUPT InterruptObject
);
4621 IoForwardIrpSynchronously(
4622 IN PDEVICE_OBJECT DeviceObject
,
4625 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
4631 IN PCONTROLLER_OBJECT ControllerObject
);
4636 IoFreeErrorLogEntry(
4655 IN PIO_WORKITEM pIOWorkItem
);
4660 IoGetAttachedDevice(
4661 IN PDEVICE_OBJECT DeviceObject
);
4666 IoGetAttachedDeviceReference(
4667 IN PDEVICE_OBJECT DeviceObject
);
4672 IoGetBootDiskInformation(
4673 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
4677 PCONFIGURATION_INFORMATION
4679 IoGetConfigurationInformation(
4685 IoGetCurrentProcess(
4691 IoGetDeviceInterfaceAlias(
4692 IN PUNICODE_STRING SymbolicLinkName
,
4693 IN CONST GUID
*AliasInterfaceClassGuid
,
4694 OUT PUNICODE_STRING AliasSymbolicLinkName
);
4696 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
4701 IoGetDeviceInterfaces(
4702 IN CONST GUID
*InterfaceClassGuid
,
4703 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
4705 OUT PWSTR
*SymbolicLinkList
);
4710 IoGetDeviceObjectPointer(
4711 IN PUNICODE_STRING ObjectName
,
4712 IN ACCESS_MASK DesiredAccess
,
4713 OUT PFILE_OBJECT
*FileObject
,
4714 OUT PDEVICE_OBJECT
*DeviceObject
);
4719 IoGetDeviceProperty(
4720 IN PDEVICE_OBJECT DeviceObject
,
4721 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
4722 IN ULONG BufferLength
,
4723 OUT PVOID PropertyBuffer
,
4724 OUT PULONG ResultLength
);
4729 IoGetDeviceToVerify(
4730 IN PETHREAD Thread
);
4736 IN PDEVICE_OBJECT PhysicalDeviceObject
,
4737 IN PDEVICE_DESCRIPTION DeviceDescription
,
4738 IN OUT PULONG NumberOfMapRegisters
);
4743 IoGetDriverObjectExtension(
4744 IN PDRIVER_OBJECT DriverObject
,
4745 IN PVOID ClientIdentificationAddress
);
4750 IoGetFileObjectGenericMapping(
4755 * IoGetFunctionCodeFromCtlCode(
4756 * IN ULONG ControlCode)
4758 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
4759 (((_ControlCode) >> 2) & 0x00000FFF)
4770 IoGetRelatedDeviceObject(
4771 IN PFILE_OBJECT FileObject
);
4777 OUT PULONG_PTR LowLimit
,
4778 OUT PULONG_PTR HighLimit
);
4782 IoGetRemainingStackSize(
4786 ULONG_PTR End
, Begin
;
4789 IoGetStackLimits(&Begin
, &End
);
4790 Result
= (ULONG_PTR
)(&End
) - Begin
;
4799 IN PKDEFERRED_ROUTINE DeferredRoutine
,
4800 IN PVOID DeferredContext
);
4804 * IoInitializeDpcRequest(
4805 * IN PDEVICE_OBJECT DeviceObject,
4806 * IN PIO_DPC_ROUTINE DpcRoutine)
4808 #define IoInitializeDpcRequest(_DeviceObject, \
4810 KeInitializeDpc(&(_DeviceObject)->Dpc, \
4811 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
4819 IN USHORT PacketSize
,
4820 IN CCHAR StackSize
);
4825 IoInitializeRemoveLockEx(
4826 IN PIO_REMOVE_LOCK Lock
,
4827 IN ULONG AllocateTag
,
4828 IN ULONG MaxLockedMinutes
,
4829 IN ULONG HighWatermark
,
4830 IN ULONG RemlockSize
);
4833 * IoInitializeRemoveLock(
4834 * IN PIO_REMOVE_LOCK Lock,
4835 * IN ULONG AllocateTag,
4836 * IN ULONG MaxLockedMinutes,
4837 * IN ULONG HighWatermark)
4839 #define IoInitializeRemoveLock( \
4840 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
4841 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
4842 HighWatermark, sizeof(IO_REMOVE_LOCK))
4848 IN PDEVICE_OBJECT DeviceObject
,
4849 IN PIO_TIMER_ROUTINE TimerRoutine
,
4855 IoInvalidateDeviceRelations(
4856 IN PDEVICE_OBJECT DeviceObject
,
4857 IN DEVICE_RELATION_TYPE Type
);
4862 IoInvalidateDeviceState(
4863 IN PDEVICE_OBJECT PhysicalDeviceObject
);
4869 IN PIRP Irp OPTIONAL
);
4873 * IoIsErrorUserInduced(
4874 * IN NTSTATUS Status);
4876 #define IoIsErrorUserInduced(Status) \
4877 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
4878 ((Status) == STATUS_IO_TIMEOUT) || \
4879 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
4880 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
4881 ((Status) == STATUS_VERIFY_REQUIRED) || \
4882 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
4883 ((Status) == STATUS_WRONG_VOLUME)))
4888 IoIsWdmVersionAvailable(
4889 IN UCHAR MajorVersion
,
4890 IN UCHAR MinorVersion
);
4895 IoMakeAssociatedIrp(
4897 IN CCHAR StackSize
);
4904 #define IoMarkIrpPending(_Irp) \
4905 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
4910 IoOpenDeviceInterfaceRegistryKey(
4911 IN PUNICODE_STRING SymbolicLinkName
,
4912 IN ACCESS_MASK DesiredAccess
,
4913 OUT PHANDLE DeviceInterfaceKey
);
4915 #define PLUGPLAY_REGKEY_DEVICE 1
4916 #define PLUGPLAY_REGKEY_DRIVER 2
4917 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
4922 IoOpenDeviceRegistryKey(
4923 IN PDEVICE_OBJECT DeviceObject
,
4924 IN ULONG DevInstKeyType
,
4925 IN ACCESS_MASK DesiredAccess
,
4926 OUT PHANDLE DevInstRegKey
);
4931 IoQueryDeviceDescription(
4932 IN PINTERFACE_TYPE BusType OPTIONAL
,
4933 IN PULONG BusNumber OPTIONAL
,
4934 IN PCONFIGURATION_TYPE ControllerType OPTIONAL
,
4935 IN PULONG ControllerNumber OPTIONAL
,
4936 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL
,
4937 IN PULONG PeripheralNumber OPTIONAL
,
4938 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
,
4945 IN PIO_WORKITEM pIOWorkItem
,
4946 IN PIO_WORKITEM_ROUTINE Routine
,
4947 IN WORK_QUEUE_TYPE QueueType
,
4955 IN PVPB Vpb OPTIONAL
,
4956 IN PDEVICE_OBJECT RealDeviceObject
);
4961 IoRaiseInformationalHardError(
4962 IN NTSTATUS ErrorStatus
,
4963 IN PUNICODE_STRING String OPTIONAL
,
4964 IN PKTHREAD Thread OPTIONAL
);
4969 IoReadDiskSignature(
4970 IN PDEVICE_OBJECT DeviceObject
,
4971 IN ULONG BytesPerSector
,
4972 OUT PDISK_SIGNATURE Signature
);
4977 IoReadPartitionTable(
4978 IN PDEVICE_OBJECT DeviceObject
,
4979 IN ULONG SectorSize
,
4980 IN BOOLEAN ReturnRecognizedPartitions
,
4981 OUT
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
4986 IoReadPartitionTableEx(
4987 IN PDEVICE_OBJECT DeviceObject
,
4988 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
**PartitionBuffer
);
4993 IoRegisterBootDriverReinitialization(
4994 IN PDRIVER_OBJECT DriverObject
,
4995 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
5001 IoRegisterBootDriverReinitialization(
5002 IN PDRIVER_OBJECT DriverObject
,
5003 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
5009 IoRegisterDeviceInterface(
5010 IN PDEVICE_OBJECT PhysicalDeviceObject
,
5011 IN CONST GUID
*InterfaceClassGuid
,
5012 IN PUNICODE_STRING ReferenceString OPTIONAL
,
5013 OUT PUNICODE_STRING SymbolicLinkName
);
5018 IoRegisterDriverReinitialization(
5019 IN PDRIVER_OBJECT DriverObject
,
5020 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
5026 IoRegisterPlugPlayNotification(
5027 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
5028 IN ULONG EventCategoryFlags
,
5029 IN PVOID EventCategoryData OPTIONAL
,
5030 IN PDRIVER_OBJECT DriverObject
,
5031 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
5033 OUT PVOID
*NotificationEntry
);
5038 IoRegisterShutdownNotification(
5039 IN PDEVICE_OBJECT DeviceObject
);
5044 IoReleaseCancelSpinLock(
5050 IoReleaseRemoveLockAndWaitEx(
5051 IN PIO_REMOVE_LOCK RemoveLock
,
5053 IN ULONG RemlockSize
);
5058 IoReleaseRemoveLockEx(
5059 IN PIO_REMOVE_LOCK RemoveLock
,
5061 IN ULONG RemlockSize
);
5065 * IoReleaseRemoveLock(
5066 * IN PIO_REMOVE_LOCK RemoveLock,
5069 #define IoReleaseRemoveLock(_RemoveLock, \
5071 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
5075 * IoReleaseRemoveLockAndWait(
5076 * IN PIO_REMOVE_LOCK RemoveLock,
5079 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
5081 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
5086 IoRemoveShareAccess(
5087 IN PFILE_OBJECT FileObject
,
5088 IN OUT PSHARE_ACCESS ShareAccess
);
5093 IoReportDetectedDevice(
5094 IN PDRIVER_OBJECT DriverObject
,
5095 IN INTERFACE_TYPE LegacyBusType
,
5097 IN ULONG SlotNumber
,
5098 IN PCM_RESOURCE_LIST ResourceList
,
5099 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL
,
5100 IN BOOLEAN ResourceAssigned
,
5101 IN OUT PDEVICE_OBJECT
*DeviceObject
);
5106 IoReportResourceForDetection(
5107 IN PDRIVER_OBJECT DriverObject
,
5108 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
5109 IN ULONG DriverListSize OPTIONAL
,
5110 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
5111 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
5112 IN ULONG DeviceListSize OPTIONAL
,
5113 OUT PBOOLEAN ConflictDetected
);
5118 IoReportResourceUsage(
5119 IN PUNICODE_STRING DriverClassName OPTIONAL
,
5120 IN PDRIVER_OBJECT DriverObject
,
5121 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
5122 IN ULONG DriverListSize OPTIONAL
,
5123 IN PDEVICE_OBJECT DeviceObject
,
5124 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
5125 IN ULONG DeviceListSize OPTIONAL
,
5126 IN BOOLEAN OverrideConflict
,
5127 OUT PBOOLEAN ConflictDetected
);
5132 IoReportTargetDeviceChange(
5133 IN PDEVICE_OBJECT PhysicalDeviceObject
,
5134 IN PVOID NotificationStructure
);
5139 IoReportTargetDeviceChangeAsynchronous(
5140 IN PDEVICE_OBJECT PhysicalDeviceObject
,
5141 IN PVOID NotificationStructure
,
5142 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
5143 IN PVOID Context OPTIONAL
);
5148 IoRequestDeviceEject(
5149 IN PDEVICE_OBJECT PhysicalDeviceObject
);
5154 * IN PDEVICE_OBJECT DeviceObject,
5156 * IN PVOID Context);
5158 #define IoRequestDpc(DeviceObject, Irp, Context)( \
5159 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
5166 IN NTSTATUS Status
);
5170 * IoSetCancelRoutine(
5172 * IN PDRIVER_CANCEL CancelRoutine)
5174 #define IoSetCancelRoutine(_Irp, \
5176 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
5177 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
5181 * IoSetCompletionRoutine(
5183 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
5185 * IN BOOLEAN InvokeOnSuccess,
5186 * IN BOOLEAN InvokeOnError,
5187 * IN BOOLEAN InvokeOnCancel)
5189 #define IoSetCompletionRoutine(_Irp, \
5190 _CompletionRoutine, \
5196 PIO_STACK_LOCATION _IrpSp; \
5197 ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \
5198 (_CompletionRoutine) != NULL : TRUE); \
5199 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
5200 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
5201 _IrpSp->Context = (_Context); \
5202 _IrpSp->Control = 0; \
5203 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
5204 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
5205 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
5211 IoSetCompletionRoutineEx(
5212 IN PDEVICE_OBJECT DeviceObject
,
5214 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
5216 IN BOOLEAN InvokeOnSuccess
,
5217 IN BOOLEAN InvokeOnError
,
5218 IN BOOLEAN InvokeOnCancel
);
5223 IoSetDeviceInterfaceState(
5224 IN PUNICODE_STRING SymbolicLinkName
,
5230 IoSetHardErrorOrVerifyDevice(
5232 IN PDEVICE_OBJECT DeviceObject
);
5236 * IoSetNextIrpStackLocation(
5239 #define IoSetNextIrpStackLocation(_Irp) \
5241 (_Irp)->CurrentLocation--; \
5242 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
5248 IoSetPartitionInformation(
5249 IN PDEVICE_OBJECT DeviceObject
,
5250 IN ULONG SectorSize
,
5251 IN ULONG PartitionNumber
,
5252 IN ULONG PartitionType
);
5257 IoSetPartitionInformationEx(
5258 IN PDEVICE_OBJECT DeviceObject
,
5259 IN ULONG PartitionNumber
,
5260 IN
struct _SET_PARTITION_INFORMATION_EX
*PartitionInfo
);
5266 IN ACCESS_MASK DesiredAccess
,
5267 IN ULONG DesiredShareAccess
,
5268 IN OUT PFILE_OBJECT FileObject
,
5269 OUT PSHARE_ACCESS ShareAccess
);
5274 IoSetStartIoAttributes(
5275 IN PDEVICE_OBJECT DeviceObject
,
5276 IN BOOLEAN DeferredStartIo
,
5277 IN BOOLEAN NonCancelable
);
5282 IoSetSystemPartition(
5283 IN PUNICODE_STRING VolumeNameString
);
5288 IoSetThreadHardErrorMode(
5289 IN BOOLEAN EnableHardErrors
);
5294 * IN CCHAR StackSize)
5296 #define IoSizeOfIrp(_StackSize) \
5297 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
5301 * IoSkipCurrentIrpStackLocation(
5304 #define IoSkipCurrentIrpStackLocation(_Irp) \
5306 (_Irp)->CurrentLocation++; \
5307 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
5314 IN PDEVICE_OBJECT DeviceObject
,
5315 IN BOOLEAN Cancelable
);
5320 IoStartNextPacketByKey(
5321 IN PDEVICE_OBJECT DeviceObject
,
5322 IN BOOLEAN Cancelable
,
5329 IN PDEVICE_OBJECT DeviceObject
,
5331 IN PULONG Key OPTIONAL
,
5332 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
5338 IN PDEVICE_OBJECT DeviceObject
);
5344 IN PDEVICE_OBJECT DeviceObject
);
5349 IoUnregisterPlugPlayNotification(
5350 IN PVOID NotificationEntry
);
5355 IoUnregisterShutdownNotification(
5356 IN PDEVICE_OBJECT DeviceObject
);
5361 IoUpdateShareAccess(
5362 IN PFILE_OBJECT FileObject
,
5363 IN OUT PSHARE_ACCESS ShareAccess
);
5368 IoVerifyPartitionTable(
5369 IN PDEVICE_OBJECT DeviceObject
,
5370 IN BOOLEAN FixErrors
);
5375 IoVolumeDeviceToDosName(
5376 IN PVOID VolumeDeviceObject
,
5377 OUT PUNICODE_STRING DosName
);
5382 IoWMIAllocateInstanceIds(
5384 IN ULONG InstanceCount
,
5385 OUT ULONG
*FirstInstanceId
);
5390 IoWMIDeviceObjectToProviderId(
5391 IN PDEVICE_OBJECT DeviceObject
);
5396 IoWMIDeviceObjectToInstanceName(
5397 IN PVOID DataBlockObject
,
5398 IN PDEVICE_OBJECT DeviceObject
,
5399 OUT PUNICODE_STRING InstanceName
);
5405 IN PVOID DataBlockObject
,
5406 IN PUNICODE_STRING InstanceName
,
5408 IN ULONG InBufferSize
,
5409 IN OUT PULONG OutBufferSize
,
5410 IN OUT PUCHAR InOutBuffer
);
5415 IoWMIHandleToInstanceName(
5416 IN PVOID DataBlockObject
,
5417 IN HANDLE FileHandle
,
5418 OUT PUNICODE_STRING InstanceName
);
5424 IN GUID
*DataBlockGuid
,
5425 IN ULONG DesiredAccess
,
5426 OUT PVOID
*DataBlockObject
);
5432 IN PVOID DataBlockObject
,
5433 IN OUT ULONG
*InOutBufferSize
,
5434 OUT PVOID OutBuffer
);
5439 IoWMIQueryAllDataMultiple(
5440 IN PVOID
*DataBlockObjectList
,
5441 IN ULONG ObjectCount
,
5442 IN OUT ULONG
*InOutBufferSize
,
5443 OUT PVOID OutBuffer
);
5448 IoWMIQuerySingleInstance(
5449 IN PVOID DataBlockObject
,
5450 IN PUNICODE_STRING InstanceName
,
5451 IN OUT ULONG
*InOutBufferSize
,
5452 OUT PVOID OutBuffer
);
5457 IoWMIQuerySingleInstanceMultiple(
5458 IN PVOID
*DataBlockObjectList
,
5459 IN PUNICODE_STRING InstanceNames
,
5460 IN ULONG ObjectCount
,
5461 IN OUT ULONG
*InOutBufferSize
,
5462 OUT PVOID OutBuffer
);
5467 IoWMIRegistrationControl(
5468 IN PDEVICE_OBJECT DeviceObject
,
5474 IoWMISetNotificationCallback(
5476 IN WMI_NOTIFICATION_CALLBACK Callback
,
5482 IoWMISetSingleInstance(
5483 IN PVOID DataBlockObject
,
5484 IN PUNICODE_STRING InstanceName
,
5486 IN ULONG ValueBufferSize
,
5487 IN PVOID ValueBuffer
);
5493 IN PVOID DataBlockObject
,
5494 IN PUNICODE_STRING InstanceName
,
5495 IN ULONG DataItemId
,
5497 IN ULONG ValueBufferSize
,
5498 IN PVOID ValueBuffer
);
5503 IoWMISuggestInstanceName(
5504 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
5505 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
5506 IN BOOLEAN CombineNames
,
5507 OUT PUNICODE_STRING SuggestedInstanceName
);
5513 IN PVOID WnodeEventItem
);
5518 IoWriteErrorLogEntry(
5524 IoWritePartitionTable(
5525 IN PDEVICE_OBJECT DeviceObject
,
5526 IN ULONG SectorSize
,
5527 IN ULONG SectorsPerTrack
,
5528 IN ULONG NumberOfHeads
,
5529 IN
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
5534 IoWritePartitionTableEx(
5535 IN PDEVICE_OBJECT DeviceObject
,
5536 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
*PartitionBuffer
);
5540 /** Kernel routines **/
5542 #if defined (_M_AMD64)
5546 KeAcquireInStackQueuedSpinLock(
5547 IN PKSPIN_LOCK SpinLock
,
5548 IN PKLOCK_QUEUE_HANDLE LockHandle
);
5553 KeReleaseInStackQueuedSpinLock(
5554 IN PKLOCK_QUEUE_HANDLE LockHandle
);
5559 KeAcquireInStackQueuedSpinLock(
5560 IN PKSPIN_LOCK SpinLock
,
5561 IN PKLOCK_QUEUE_HANDLE LockHandle
);
5566 KeReleaseInStackQueuedSpinLock(
5567 IN PKLOCK_QUEUE_HANDLE LockHandle
);
5573 KeAcquireInStackQueuedSpinLockAtDpcLevel(
5574 IN PKSPIN_LOCK SpinLock
,
5575 IN PKLOCK_QUEUE_HANDLE LockHandle
);
5580 KeAcquireInterruptSpinLock(
5581 IN PKINTERRUPT Interrupt
);
5594 IN ULONG BugCheckCode
);
5601 IN ULONG BugCheckCode
,
5602 IN ULONG_PTR BugCheckParameter1
,
5603 IN ULONG_PTR BugCheckParameter2
,
5604 IN ULONG_PTR BugCheckParameter3
,
5605 IN ULONG_PTR BugCheckParameter4
);
5622 KeDelayExecutionThread(
5623 IN KPROCESSOR_MODE WaitMode
,
5624 IN BOOLEAN Alertable
,
5625 IN PLARGE_INTEGER Interval
);
5630 KeDeregisterBugCheckCallback(
5631 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
5636 KeEnterCriticalRegion(
5643 * IN BOOLEAN ReadOperation,
5644 * IN BOOLEAN DmaOperation)
5646 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
5648 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
5649 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
5650 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
5651 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
5663 KeFlushWriteBuffer(VOID
);
5668 KeGetRecommendedSharedDataAlignment(
5674 KeInitializeDeviceQueue(
5675 IN PKDEVICE_QUEUE DeviceQueue
);
5687 KeInitializeSemaphore(
5688 IN PRKSEMAPHORE Semaphore
,
5701 KeInitializeTimerEx(
5703 IN TIMER_TYPE Type
);
5708 KeInsertByKeyDeviceQueue(
5709 IN PKDEVICE_QUEUE DeviceQueue
,
5710 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
5716 KeInsertDeviceQueue(
5717 IN PKDEVICE_QUEUE DeviceQueue
,
5718 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
5725 IN PVOID SystemArgument1
,
5726 IN PVOID SystemArgument2
);
5731 KeLeaveCriticalRegion(
5741 volatile LONG Barrier
;
5742 #if defined(__GNUC__)
5743 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
5744 #elif defined(_MSC_VER)
5745 __asm xchg
[Barrier
], eax
5756 IN KPRIORITY Increment
,
5762 KeQueryActiveProcessors(
5769 KeQueryPerformanceCounter(
5770 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
5775 KeQueryPriorityThread(
5776 IN PRKTHREAD Thread
);
5781 KeQueryRuntimeThread(
5783 OUT PULONG UserTime
);
5785 #if !defined(_M_AMD64)
5789 KeQueryInterruptTime(
5796 OUT PLARGE_INTEGER CurrentTime
);
5802 OUT PLARGE_INTEGER TickCount
);
5808 KeQueryTimeIncrement(
5827 KeReadStateSemaphore(
5828 IN PRKSEMAPHORE Semaphore
);
5839 KeRegisterBugCheckCallback(
5840 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
5841 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
5844 IN PUCHAR Component
);
5849 KeRegisterNmiCallback(
5850 IN PNMI_CALLBACK CallbackRoutine
,
5857 KeDeregisterNmiCallback(
5864 KeReleaseInStackQueuedSpinLockFromDpcLevel(
5865 IN PKLOCK_QUEUE_HANDLE LockHandle
);
5870 KeReleaseInterruptSpinLock(
5871 IN PKINTERRUPT Interrupt
,
5885 IN PRKSEMAPHORE Semaphore
,
5886 IN KPRIORITY Increment
,
5891 PKDEVICE_QUEUE_ENTRY
5893 KeRemoveByKeyDeviceQueue(
5894 IN PKDEVICE_QUEUE DeviceQueue
,
5898 PKDEVICE_QUEUE_ENTRY
5900 KeRemoveDeviceQueue(
5901 IN PKDEVICE_QUEUE DeviceQueue
);
5906 KeRemoveEntryDeviceQueue(
5907 IN PKDEVICE_QUEUE DeviceQueue
,
5908 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
5925 KeRestoreFloatingPointState(
5926 IN PKFLOATING_SAVE FloatSave
);
5931 KeRevertToUserAffinityThread(VOID
);
5936 KeSaveFloatingPointState(
5937 OUT PKFLOATING_SAVE FloatSave
);
5942 KeSetBasePriorityThread(
5943 IN PRKTHREAD Thread
,
5951 IN KPRIORITY Increment
,
5959 IN KDPC_IMPORTANCE Importance
);
5964 KeSetPriorityThread(
5966 IN KPRIORITY Priority
);
5971 KeSetSystemAffinityThread(
5972 IN KAFFINITY Affinity
);
5977 KeSetTargetProcessorDpc(
5986 IN LARGE_INTEGER DueTime
,
5987 IN PKDPC Dpc OPTIONAL
);
5994 IN LARGE_INTEGER DueTime
,
5995 IN LONG Period OPTIONAL
,
5996 IN PKDPC Dpc OPTIONAL
);
6001 KeSetTimeUpdateNotifyRoutine(
6002 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
);
6007 KeStallExecutionProcessor(
6008 IN ULONG MicroSeconds
);
6013 KeSynchronizeExecution(
6014 IN PKINTERRUPT Interrupt
,
6015 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
6016 IN PVOID SynchronizeContext
);
6021 KeWaitForMultipleObjects(
6024 IN WAIT_TYPE WaitType
,
6025 IN KWAIT_REASON WaitReason
,
6026 IN KPROCESSOR_MODE WaitMode
,
6027 IN BOOLEAN Alertable
,
6028 IN PLARGE_INTEGER Timeout OPTIONAL
,
6029 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
6034 KeWaitForMutexObject(
6036 IN KWAIT_REASON WaitReason
,
6037 IN KPROCESSOR_MODE WaitMode
,
6038 IN BOOLEAN Alertable
,
6039 IN PLARGE_INTEGER Timeout OPTIONAL
);
6044 KeWaitForSingleObject(
6046 IN KWAIT_REASON WaitReason
,
6047 IN KPROCESSOR_MODE WaitMode
,
6048 IN BOOLEAN Alertable
,
6049 IN PLARGE_INTEGER Timeout OPTIONAL
);
6053 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
6054 IN ULONG_PTR Argument
6061 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
6062 IN ULONG_PTR Context
6082 KeRaiseIrqlToDpcLevel(
6088 KeRaiseIrqlToSynchLevel(
6091 #define KeLowerIrql(a) KfLowerIrql(a)
6092 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
6094 #elif defined(_M_AMD64)
6098 KeGetCurrentIrql(VOID
)
6100 return (KIRQL
)__readcr8();
6105 KeLowerIrql(IN KIRQL NewIrql
)
6107 ASSERT(KeGetCurrentIrql() >= NewIrql
);
6108 __writecr8(NewIrql
);
6113 KfRaiseIrql(IN KIRQL NewIrql
)
6117 OldIrql
= __readcr8();
6118 ASSERT(OldIrql
<= NewIrql
);
6119 __writecr8(NewIrql
);
6122 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
6126 KeRaiseIrqlToDpcLevel(VOID
)
6128 return KfRaiseIrql(DISPATCH_LEVEL
);
6133 KeRaiseIrqlToSynchLevel(VOID
)
6135 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
6138 #elif defined(__PowerPC__)
6155 KeRaiseIrqlToDpcLevel(
6161 KeRaiseIrqlToSynchLevel(
6164 #define KeLowerIrql(a) KfLowerIrql(a)
6165 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
6167 #elif defined(_M_MIPS)
6169 #define KeLowerIrql(a) KfLowerIrql(a)
6170 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
6187 KeRaiseIrqlToDpcLevel(
6193 KeRaiseIrqlToSynchLevel(
6196 #elif defined(_M_ARM)
6213 OUT PKIRQL OldIrql
);
6218 KeRaiseIrqlToDpcLevel(
6224 KeRaiseIrqlToSynchLevel(
6229 /** Memory manager routines **/
6236 IN ULONG NumberOfBytes
);
6241 MmAllocateContiguousMemory(
6242 IN ULONG NumberOfBytes
,
6243 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
6248 MmAllocateContiguousMemorySpecifyCache(
6249 IN SIZE_T NumberOfBytes
,
6250 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
6251 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
6252 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
6253 IN MEMORY_CACHING_TYPE CacheType
);
6258 MmAllocateMappingAddress(
6259 IN SIZE_T NumberOfBytes
,
6265 MmAllocateNonCachedMemory(
6266 IN ULONG NumberOfBytes
);
6271 MmAllocatePagesForMdl(
6272 IN PHYSICAL_ADDRESS LowAddress
,
6273 IN PHYSICAL_ADDRESS HighAddress
,
6274 IN PHYSICAL_ADDRESS SkipBytes
,
6275 IN SIZE_T TotalBytes
);
6277 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
6281 MmAllocatePagesForMdlEx(
6282 IN PHYSICAL_ADDRESS LowAddress
,
6283 IN PHYSICAL_ADDRESS HighAddress
,
6284 IN PHYSICAL_ADDRESS SkipBytes
,
6285 IN SIZE_T TotalBytes
,
6286 IN MEMORY_CACHING_TYPE CacheType
,
6293 MmBuildMdlForNonPagedPool(
6294 IN OUT PMDL MemoryDescriptorList
);
6296 typedef enum _MMFLUSH_TYPE
{
6304 MmFlushImageSection(
6305 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
6306 IN MMFLUSH_TYPE FlushType
);
6311 MmFreeContiguousMemory(
6312 IN PVOID BaseAddress
);
6317 MmFreeContiguousMemorySpecifyCache(
6318 IN PVOID BaseAddress
,
6319 IN SIZE_T NumberOfBytes
,
6320 IN MEMORY_CACHING_TYPE CacheType
);
6325 MmFreeMappingAddress(
6326 IN PVOID BaseAddress
,
6332 MmFreeNonCachedMemory(
6333 IN PVOID BaseAddress
,
6334 IN SIZE_T NumberOfBytes
);
6340 IN PMDL MemoryDescriptorList
);
6344 * MmGetMdlByteCount(
6347 #define MmGetMdlByteCount(_Mdl) \
6352 * MmGetMdlByteOffset(
6355 #define MmGetMdlByteOffset(_Mdl) \
6356 ((_Mdl)->ByteOffset)
6363 #define MmGetMdlPfnArray(_Mdl) \
6364 ((PPFN_NUMBER) ((_Mdl) + 1))
6368 * MmGetMdlVirtualAddress(
6371 #define MmGetMdlVirtualAddress(_Mdl) \
6372 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
6377 MmGetPhysicalAddress(
6378 IN PVOID BaseAddress
);
6381 PPHYSICAL_MEMORY_RANGE
6383 MmGetPhysicalMemoryRanges(
6389 MmGetVirtualForPhysical(
6390 IN PHYSICAL_ADDRESS PhysicalAddress
);
6395 MmMapLockedPagesSpecifyCache(
6396 IN PMDL MemoryDescriptorList
,
6397 IN KPROCESSOR_MODE AccessMode
,
6398 IN MEMORY_CACHING_TYPE CacheType
,
6399 IN PVOID BaseAddress
,
6400 IN ULONG BugCheckOnFailure
,
6401 IN MM_PAGE_PRIORITY Priority
);
6406 MmMapLockedPagesWithReservedMapping(
6407 IN PVOID MappingAddress
,
6409 IN PMDL MemoryDescriptorList
,
6410 IN MEMORY_CACHING_TYPE CacheType
);
6415 MmMapUserAddressesToPage(
6416 IN PVOID BaseAddress
,
6417 IN SIZE_T NumberOfBytes
,
6418 IN PVOID PageAddress
);
6424 IN PHYSICAL_ADDRESS PhysicalAddress
,
6425 IN SIZE_T NumberOfBytes
,
6426 IN MEMORY_CACHING_TYPE CacheType
);
6431 MmMapViewInSessionSpace(
6433 OUT PVOID
*MappedBase
,
6434 IN OUT PSIZE_T ViewSize
);
6439 MmMapViewInSystemSpace(
6441 OUT PVOID
*MappedBase
,
6442 IN PSIZE_T ViewSize
);
6447 MmMarkPhysicalMemoryAsBad(
6448 IN PPHYSICAL_ADDRESS StartAddress
,
6449 IN OUT PLARGE_INTEGER NumberOfBytes
);
6454 MmMarkPhysicalMemoryAsGood(
6455 IN PPHYSICAL_ADDRESS StartAddress
,
6456 IN OUT PLARGE_INTEGER NumberOfBytes
);
6461 MmGetSystemRoutineAddress(
6462 IN PUNICODE_STRING SystemRoutineName
);
6466 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
6470 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
6472 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
6473 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
6478 * IN PMDL MemoryDescriptorList,
6482 #define MmInitializeMdl(_MemoryDescriptorList, \
6486 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
6487 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
6488 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
6489 (_MemoryDescriptorList)->MdlFlags = 0; \
6490 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
6491 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
6492 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
6499 IN PVOID VirtualAddress
);
6504 MmIsDriverVerifying(
6505 IN PDRIVER_OBJECT DriverObject
);
6510 MmIsThisAnNtAsSystem(
6516 MmIsVerifierEnabled(
6517 OUT PULONG VerifierFlags
);
6522 MmLockPagableDataSection(
6523 IN PVOID AddressWithinSection
);
6528 MmLockPagableImageSection(
6529 IN PVOID AddressWithinSection
);
6533 * MmLockPagableCodeSection(
6534 * IN PVOID AddressWithinSection)
6536 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
6541 MmLockPagableSectionByHandle(
6542 IN PVOID ImageSectionHandle
);
6548 IN PHYSICAL_ADDRESS PhysicalAddress
,
6549 IN ULONG NumberOfBytes
,
6550 IN MEMORY_CACHING_TYPE CacheEnable
);
6556 IN PMDL MemoryDescriptorList
,
6557 IN KPROCESSOR_MODE AccessMode
);
6562 MmLockPageableDataSection (
6563 IN PVOID AddressWithinSection
6569 MmUnlockPageableImageSection(
6570 IN PVOID ImageSectionHandle
6577 IN PVOID AddressWithinSection
);
6582 MmProbeAndLockProcessPages(
6583 IN OUT PMDL MemoryDescriptorList
,
6584 IN PEPROCESS Process
,
6585 IN KPROCESSOR_MODE AccessMode
,
6586 IN LOCK_OPERATION Operation
);
6591 MmProtectMdlSystemAddress(
6592 IN PMDL MemoryDescriptorList
,
6593 IN ULONG NewProtect
);
6599 IN PVOID BaseAddress
,
6600 IN PMDL MemoryDescriptorList
);
6605 MmUnmapViewInSessionSpace(
6606 IN PVOID MappedBase
);
6611 MmUnmapViewInSystemSpace(
6612 IN PVOID MappedBase
);
6617 MmUnsecureVirtualMemory(
6618 IN HANDLE SecureHandle
);
6622 * MmPrepareMdlForReuse(
6625 #define MmPrepareMdlForReuse(_Mdl) \
6627 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
6628 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
6629 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
6630 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
6631 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
6635 #define MmGetProcedureAddress(Address) (Address)
6640 MmProbeAndLockPages(
6641 IN OUT PMDL MemoryDescriptorList
,
6642 IN KPROCESSOR_MODE AccessMode
,
6643 IN LOCK_OPERATION Operation
);
6654 MmRemovePhysicalMemory(
6655 IN PPHYSICAL_ADDRESS StartAddress
,
6656 IN OUT PLARGE_INTEGER NumberOfBytes
);
6661 MmResetDriverPaging(
6662 IN PVOID AddressWithinSection
);
6667 MmSecureVirtualMemory(
6670 IN ULONG ProbeMode
);
6682 MmUnlockPagableImageSection(
6683 IN PVOID ImageSectionHandle
);
6689 IN PMDL MemoryDescriptorList
);
6695 IN PVOID BaseAddress
,
6696 IN SIZE_T NumberOfBytes
);
6701 MmUnmapReservedMapping(
6702 IN PVOID BaseAddress
,
6704 IN PMDL MemoryDescriptorList
);
6709 MmUnmapVideoDisplay(
6710 IN PVOID BaseAddress
,
6711 IN SIZE_T NumberOfBytes
);
6715 /** Object manager routines **/
6721 IN PACCESS_STATE AccessState
,
6722 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
6724 IN POBJECT_TYPE Type
);
6729 ObDereferenceSecurityDescriptor(
6730 PSECURITY_DESCRIPTOR SecurityDescriptor
,
6736 ObfDereferenceObject(
6741 * ObDereferenceObject(
6744 #define ObDereferenceObject ObfDereferenceObject
6749 ObGetObjectSecurity(
6751 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
6752 OUT PBOOLEAN MemoryAllocated
);
6759 IN PACCESS_STATE PassedAccessState OPTIONAL
,
6760 IN ACCESS_MASK DesiredAccess
,
6761 IN ULONG AdditionalReferences
,
6762 OUT PVOID
* ReferencedObject OPTIONAL
,
6763 OUT PHANDLE Handle
);
6774 ObLogSecurityDescriptor(
6775 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor
,
6776 OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
6780 * ObReferenceObject(
6783 #define ObReferenceObject ObfReferenceObject
6788 ObMakeTemporaryObject(
6795 IN POBJECT_ATTRIBUTES ObjectAttributes
,
6796 IN POBJECT_TYPE ObjectType
,
6797 IN KPROCESSOR_MODE AccessMode
,
6798 IN PACCESS_STATE PassedAccessState
,
6799 IN ACCESS_MASK DesiredAccess
,
6800 IN OUT PVOID ParseContext OPTIONAL
,
6801 OUT PHANDLE Handle
);
6806 ObOpenObjectByPointer(
6808 IN ULONG HandleAttributes
,
6809 IN PACCESS_STATE PassedAccessState OPTIONAL
,
6810 IN ACCESS_MASK DesiredAccess OPTIONAL
,
6811 IN POBJECT_TYPE ObjectType OPTIONAL
,
6812 IN KPROCESSOR_MODE AccessMode
,
6813 OUT PHANDLE Handle
);
6818 ObQueryObjectAuditingByHandle(
6820 OUT PBOOLEAN GenerateOnClose
);
6825 ObReferenceObjectByHandle(
6827 IN ACCESS_MASK DesiredAccess
,
6828 IN POBJECT_TYPE ObjectType OPTIONAL
,
6829 IN KPROCESSOR_MODE AccessMode
,
6831 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
6836 ObReferenceObjectByName(
6837 IN PUNICODE_STRING ObjectPath
,
6838 IN ULONG Attributes
,
6839 IN PACCESS_STATE PassedAccessState OPTIONAL
,
6840 IN ACCESS_MASK DesiredAccess OPTIONAL
,
6841 IN POBJECT_TYPE ObjectType
,
6842 IN KPROCESSOR_MODE AccessMode
,
6843 IN OUT PVOID ParseContext OPTIONAL
,
6849 ObReferenceObjectByPointer(
6851 IN ACCESS_MASK DesiredAccess
,
6852 IN POBJECT_TYPE ObjectType
,
6853 IN KPROCESSOR_MODE AccessMode
);
6858 ObReferenceSecurityDescriptor(
6859 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
6865 ObReleaseObjectSecurity(
6866 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
6867 IN BOOLEAN MemoryAllocated
);
6871 /** Process manager routines **/
6876 PsCreateSystemProcess(
6877 IN PHANDLE ProcessHandle
,
6878 IN ACCESS_MASK DesiredAccess
,
6879 IN POBJECT_ATTRIBUTES ObjectAttributes
);
6884 PsCreateSystemThread(
6885 OUT PHANDLE ThreadHandle
,
6886 IN ULONG DesiredAccess
,
6887 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
6888 IN HANDLE ProcessHandle OPTIONAL
,
6889 OUT PCLIENT_ID ClientId OPTIONAL
,
6890 IN PKSTART_ROUTINE StartRoutine
,
6891 IN PVOID StartContext
);
6895 * PsGetCurrentProcess(VOID)
6897 #define PsGetCurrentProcess IoGetCurrentProcess
6902 PsGetCurrentProcessId(
6907 * PsGetCurrentThread(VOID)
6909 #define PsGetCurrentThread() \
6910 ((PETHREAD) KeGetCurrentThread())
6915 PsGetCurrentThreadId(
6921 PsGetProcessId(PEPROCESS Process
);
6927 PULONG MajorVersion OPTIONAL
,
6928 PULONG MinorVersion OPTIONAL
,
6929 PULONG BuildNumber OPTIONAL
,
6930 PUNICODE_STRING CSDVersion OPTIONAL
);
6935 PsRemoveCreateThreadNotifyRoutine(
6936 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
6941 PsRemoveLoadImageNotifyRoutine(
6942 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
6947 PsSetCreateProcessNotifyRoutine(
6948 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine
,
6954 PsSetCreateThreadNotifyRoutine(
6955 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
6960 PsSetLoadImageNotifyRoutine(
6961 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
6966 PsTerminateSystemThread(
6967 IN NTSTATUS ExitStatus
);
6969 extern NTSYSAPI PEPROCESS PsInitialSystemProcess
;
6972 /** Security reference monitor routines **/
6978 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
6979 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
6980 IN BOOLEAN SubjectContextLocked
,
6981 IN ACCESS_MASK DesiredAccess
,
6982 IN ACCESS_MASK PreviouslyGrantedAccess
,
6983 OUT PPRIVILEGE_SET
*Privileges OPTIONAL
,
6984 IN PGENERIC_MAPPING GenericMapping
,
6985 IN KPROCESSOR_MODE AccessMode
,
6986 OUT PACCESS_MASK GrantedAccess
,
6987 OUT PNTSTATUS AccessStatus
);
6993 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
6994 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
6995 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
6996 IN BOOLEAN IsDirectoryObject
,
6997 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
6998 IN PGENERIC_MAPPING GenericMapping
,
6999 IN POOL_TYPE PoolType
);
7005 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
7006 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
7007 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
7008 IN GUID
*ObjectType OPTIONAL
,
7009 IN BOOLEAN IsDirectoryObject
,
7010 IN ULONG AutoInheritFlags
,
7011 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
7012 IN PGENERIC_MAPPING GenericMapping
,
7013 IN POOL_TYPE PoolType
);
7019 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
);
7024 SeSinglePrivilegeCheck(
7025 LUID PrivilegeValue
,
7026 KPROCESSOR_MODE PreviousMode
);
7031 SeValidSecurityDescriptor(
7033 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
7037 /** NtXxx routines **/
7043 OUT PHANDLE ProcessHandle
,
7044 IN ACCESS_MASK DesiredAccess
,
7045 IN POBJECT_ATTRIBUTES ObjectAttributes
,
7046 IN PCLIENT_ID ClientId OPTIONAL
);
7051 NtQueryInformationProcess(
7052 IN HANDLE ProcessHandle
,
7053 IN PROCESSINFOCLASS ProcessInformationClass
,
7054 OUT PVOID ProcessInformation
,
7055 IN ULONG ProcessInformationLength
,
7056 OUT PULONG ReturnLength OPTIONAL
);
7060 /** NtXxx and ZwXxx routines **/
7066 IN HANDLE TimerHandle
,
7067 OUT PBOOLEAN CurrentState OPTIONAL
);
7084 ZwCreateDirectoryObject(
7085 OUT PHANDLE DirectoryHandle
,
7086 IN ACCESS_MASK DesiredAccess
,
7087 IN POBJECT_ATTRIBUTES ObjectAttributes
);
7093 OUT PHANDLE EventHandle
,
7094 IN ACCESS_MASK DesiredAccess
,
7095 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
7096 IN EVENT_TYPE EventType
,
7097 IN BOOLEAN InitialState
);
7103 OUT PHANDLE EventHandle
,
7104 IN ACCESS_MASK DesiredAccess
,
7105 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
7106 IN EVENT_TYPE EventType
,
7107 IN BOOLEAN InitialState
);
7113 OUT PHANDLE FileHandle
,
7114 IN ACCESS_MASK DesiredAccess
,
7115 IN POBJECT_ATTRIBUTES ObjectAttributes
,
7116 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7117 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
7118 IN ULONG FileAttributes
,
7119 IN ULONG ShareAccess
,
7120 IN ULONG CreateDisposition
,
7121 IN ULONG CreateOptions
,
7122 IN PVOID EaBuffer OPTIONAL
,
7129 OUT PHANDLE KeyHandle
,
7130 IN ACCESS_MASK DesiredAccess
,
7131 IN POBJECT_ATTRIBUTES ObjectAttributes
,
7132 IN ULONG TitleIndex
,
7133 IN PUNICODE_STRING Class OPTIONAL
,
7134 IN ULONG CreateOptions
,
7135 OUT PULONG Disposition OPTIONAL
);
7141 OUT PHANDLE TimerHandle
,
7142 IN ACCESS_MASK DesiredAccess
,
7143 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
7144 IN TIMER_TYPE TimerType
);
7150 IN HANDLE KeyHandle
);
7156 IN HANDLE KeyHandle
,
7157 IN PUNICODE_STRING ValueName
);
7162 NtDeviceIoControlFile(
7163 IN HANDLE DeviceHandle
,
7164 IN HANDLE Event OPTIONAL
,
7165 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
7166 IN PVOID UserApcContext OPTIONAL
,
7167 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7168 IN ULONG IoControlCode
,
7169 IN PVOID InputBuffer
,
7170 IN ULONG InputBufferSize
,
7171 OUT PVOID OutputBuffer
,
7172 IN ULONG OutputBufferSize
);
7177 ZwDeviceIoControlFile(
7178 IN HANDLE DeviceHandle
,
7179 IN HANDLE Event OPTIONAL
,
7180 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
7181 IN PVOID UserApcContext OPTIONAL
,
7182 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7183 IN ULONG IoControlCode
,
7184 IN PVOID InputBuffer
,
7185 IN ULONG InputBufferSize
,
7186 OUT PVOID OutputBuffer
,
7187 IN ULONG OutputBufferSize
);
7193 IN HANDLE KeyHandle
,
7195 IN KEY_INFORMATION_CLASS KeyInformationClass
,
7196 OUT PVOID KeyInformation
,
7198 OUT PULONG ResultLength
);
7203 ZwEnumerateValueKey(
7204 IN HANDLE KeyHandle
,
7206 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
7207 OUT PVOID KeyValueInformation
,
7209 OUT PULONG ResultLength
);
7215 IN HANDLE KeyHandle
);
7220 ZwMakeTemporaryObject(
7227 IN HANDLE SectionHandle
,
7228 IN HANDLE ProcessHandle
,
7229 IN OUT PVOID
*BaseAddress
,
7230 IN ULONG_PTR ZeroBits
,
7231 IN SIZE_T CommitSize
,
7232 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
7233 IN OUT PSIZE_T ViewSize
,
7234 IN SECTION_INHERIT InheritDisposition
,
7235 IN ULONG AllocationType
,
7242 IN HANDLE SectionHandle
,
7243 IN HANDLE ProcessHandle
,
7244 IN OUT PVOID
*BaseAddress
,
7245 IN ULONG_PTR ZeroBits
,
7246 IN SIZE_T CommitSize
,
7247 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
7248 IN OUT PSIZE_T ViewSize
,
7249 IN SECTION_INHERIT InheritDisposition
,
7250 IN ULONG AllocationType
,
7257 OUT PHANDLE FileHandle
,
7258 IN ACCESS_MASK DesiredAccess
,
7259 IN POBJECT_ATTRIBUTES ObjectAttributes
,
7260 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7261 IN ULONG ShareAccess
,
7262 IN ULONG OpenOptions
);
7268 OUT PHANDLE FileHandle
,
7269 IN ACCESS_MASK DesiredAccess
,
7270 IN POBJECT_ATTRIBUTES ObjectAttributes
,
7271 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7272 IN ULONG ShareAccess
,
7273 IN ULONG OpenOptions
);
7279 OUT PHANDLE KeyHandle
,
7280 IN ACCESS_MASK DesiredAccess
,
7281 IN POBJECT_ATTRIBUTES ObjectAttributes
);
7287 OUT PHANDLE SectionHandle
,
7288 IN ACCESS_MASK DesiredAccess
,
7289 IN POBJECT_ATTRIBUTES ObjectAttributes
);
7294 ZwOpenSymbolicLinkObject(
7295 OUT PHANDLE LinkHandle
,
7296 IN ACCESS_MASK DesiredAccess
,
7297 IN POBJECT_ATTRIBUTES ObjectAttributes
);
7303 OUT PHANDLE TimerHandle
,
7304 IN ACCESS_MASK DesiredAccess
,
7305 IN POBJECT_ATTRIBUTES ObjectAttributes
);
7310 ZwQueryInformationFile(
7311 IN HANDLE FileHandle
,
7312 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7313 OUT PVOID FileInformation
,
7315 IN FILE_INFORMATION_CLASS FileInformationClass
);
7321 IN HANDLE KeyHandle
,
7322 IN KEY_INFORMATION_CLASS KeyInformationClass
,
7323 OUT PVOID KeyInformation
,
7325 OUT PULONG ResultLength
);
7330 ZwQuerySymbolicLinkObject(
7331 IN HANDLE LinkHandle
,
7332 IN OUT PUNICODE_STRING LinkTarget
,
7333 OUT PULONG ReturnedLength OPTIONAL
);
7339 IN HANDLE KeyHandle
,
7340 IN PUNICODE_STRING ValueName
,
7341 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
7342 OUT PVOID KeyValueInformation
,
7344 OUT PULONG ResultLength
);
7350 IN HANDLE FileHandle
,
7351 IN HANDLE Event OPTIONAL
,
7352 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
7353 IN PVOID ApcContext OPTIONAL
,
7354 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7357 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
7358 IN PULONG Key OPTIONAL
);
7364 IN HANDLE FileHandle
,
7365 IN HANDLE Event OPTIONAL
,
7366 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
7367 IN PVOID ApcContext OPTIONAL
,
7368 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7371 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
7372 IN PULONG Key OPTIONAL
);
7378 IN HANDLE EventHandle
,
7379 OUT PLONG PreviousState OPTIONAL
);
7385 IN HANDLE EventHandle
,
7386 OUT PLONG PreviousState OPTIONAL
);
7391 ZwSetInformationFile(
7392 IN HANDLE FileHandle
,
7393 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7394 IN PVOID FileInformation
,
7396 IN FILE_INFORMATION_CLASS FileInformationClass
);
7401 ZwSetInformationThread(
7402 IN HANDLE ThreadHandle
,
7403 IN THREADINFOCLASS ThreadInformationClass
,
7404 IN PVOID ThreadInformation
,
7405 IN ULONG ThreadInformationLength
);
7411 IN HANDLE TimerHandle
,
7412 IN PLARGE_INTEGER DueTime
,
7413 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL
,
7414 IN PVOID TimerContext OPTIONAL
,
7415 IN BOOLEAN WakeTimer
,
7416 IN LONG Period OPTIONAL
,
7417 OUT PBOOLEAN PreviousState OPTIONAL
);
7423 IN HANDLE KeyHandle
,
7424 IN PUNICODE_STRING ValueName
,
7425 IN ULONG TitleIndex OPTIONAL
,
7430 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
7431 #define AT_EXTENDABLE_FILE 0x00002000
7432 #define AT_RESERVED 0x20000000
7433 #define AT_ROUND_TO_PAGE 0x40000000
7438 NtUnmapViewOfSection(
7439 IN HANDLE ProcessHandle
,
7440 IN PVOID BaseAddress
);
7445 ZwUnmapViewOfSection(
7446 IN HANDLE ProcessHandle
,
7447 IN PVOID BaseAddress
);
7452 NtWaitForSingleObject(
7453 IN HANDLE ObjectHandle
,
7454 IN BOOLEAN Alertable
,
7455 IN PLARGE_INTEGER TimeOut OPTIONAL
);
7460 ZwWaitForSingleObject(
7461 IN HANDLE ObjectHandle
,
7462 IN BOOLEAN Alertable
,
7463 IN PLARGE_INTEGER TimeOut OPTIONAL
);
7469 IN HANDLE FileHandle
,
7470 IN HANDLE Event OPTIONAL
,
7471 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
7472 IN PVOID ApcContext OPTIONAL
,
7473 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7476 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
7477 IN PULONG Key OPTIONAL
);
7483 IN HANDLE FileHandle
,
7484 IN HANDLE Event OPTIONAL
,
7485 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
7486 IN PVOID ApcContext OPTIONAL
,
7487 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7490 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
7491 IN PULONG Key OPTIONAL
);
7495 /** Power management support routines **/
7501 IN PDEVICE_OBJECT DeviceObject
,
7507 PoRegisterDeviceForIdleDetection(
7508 IN PDEVICE_OBJECT DeviceObject
,
7509 IN ULONG ConservationIdleTime
,
7510 IN ULONG PerformanceIdleTime
,
7511 IN DEVICE_POWER_STATE State
);
7516 PoRegisterSystemState(
7517 IN PVOID StateHandle
,
7518 IN EXECUTION_STATE Flags
);
7524 IN PDEVICE_OBJECT DeviceObject
,
7525 IN UCHAR MinorFunction
,
7526 IN POWER_STATE PowerState
,
7527 IN PREQUEST_POWER_COMPLETE CompletionFunction
,
7529 OUT PIRP
*Irp OPTIONAL
);
7534 PoRequestShutdownEvent(
7541 PULONG IdlePointer
);
7543 #define PoSetDeviceBusy(IdlePointer) \
7544 ((void)(*(IdlePointer) = 0))
7550 IN PDEVICE_OBJECT DeviceObject
,
7551 IN POWER_STATE_TYPE Type
,
7552 IN POWER_STATE State
);
7558 IN EXECUTION_STATE Flags
);
7563 PoStartNextPowerIrp(
7569 PoUnregisterSystemState(
7570 IN PVOID StateHandle
);
7574 /** WMI library support routines **/
7579 IN PDEVICE_OBJECT DeviceObject
,
7582 IN ULONG BufferUsed
,
7583 IN CCHAR PriorityBoost
);
7588 IN PDEVICE_OBJECT DeviceObject
,
7590 IN ULONG InstanceIndex
,
7591 IN ULONG EventDataSize
,
7592 IN PVOID EventData
);
7597 WmiQueryTraceInformation(
7598 IN TRACE_INFORMATION_CLASS TraceInformationClass
,
7599 OUT PVOID TraceInformation
,
7600 IN ULONG TraceInformationLength
,
7601 OUT PULONG RequiredLength OPTIONAL
,
7602 IN PVOID Buffer OPTIONAL
);
7607 IN PWMILIB_CONTEXT WmiLibInfo
,
7608 IN PDEVICE_OBJECT DeviceObject
,
7610 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition
);
7616 IN TRACEHANDLE LoggerHandle
,
7617 IN ULONG MessageFlags
,
7618 IN LPGUID MessageGuid
,
7619 IN USHORT MessageNumber
,
7623 /* FIXME: Get va_list from where? */
7628 IN TRACEHANDLE LoggerHandle
,
7629 IN ULONG MessageFlags
,
7630 IN LPGUID MessageGuid
,
7631 IN USHORT MessageNumber
,
7632 IN
va_list MessageArgList
);
7636 /** Kernel debugger routines **/
7653 KdRefreshDebuggerNotPresent(
7657 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
7662 IN KD_OPTION Option
,
7663 IN ULONG InBufferBytes OPTIONAL
,
7665 IN ULONG OutBufferBytes OPTIONAL
,
7666 OUT PVOID OutBuffer
,
7667 OUT PULONG OutBufferNeeded OPTIONAL
);
7678 DbgBreakPointWithStatus(
7691 IN ULONG ComponentId
,
7699 IN ULONG ComponentId
,
7706 vDbgPrintExWithPrefix(
7708 IN ULONG ComponentId
,
7716 DbgPrintReturnControlC(
7725 IN ULONG MaximumResponseLength
7731 DbgQueryDebugFilterState(
7732 IN ULONG ComponentId
,
7738 DbgSetDebugFilterState(
7739 IN ULONG ComponentId
,
7745 #define KdPrint(_x_) DbgPrint _x_
7746 #define KdPrintEx(_x_) DbgPrintEx _x_
7747 #define KdBreakPoint() DbgBreakPoint()
7748 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
7752 #define KdPrint(_x_)
7753 #define KdPrintEx(_x_)
7754 #define KdBreakPoint()
7755 #define KdBreakPointWithStatus(s)
7759 #if defined(__GNUC__)
7761 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent
;
7762 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled
;
7763 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
7764 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
7766 #elif defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
7768 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent
;
7769 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled
;
7770 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
7771 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
7775 extern BOOLEAN KdDebuggerNotPresent
;
7776 extern BOOLEAN KdDebuggerEnabled
;
7777 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
7778 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
7782 /** Stuff from winnt4.h */
7784 #ifndef DMA_MACROS_DEFINED
7786 #if (NTDDI_VERSION >= NTDDI_WIN2K)
7788 //DECLSPEC_DEPRECATED_DDK
7792 IoFlushAdapterBuffers(
7793 IN PADAPTER_OBJECT AdapterObject
,
7795 IN PVOID MapRegisterBase
,
7798 IN BOOLEAN WriteToDevice
);
7800 //DECLSPEC_DEPRECATED_DDK
7804 IoFreeAdapterChannel(
7805 IN PADAPTER_OBJECT AdapterObject
);
7807 //DECLSPEC_DEPRECATED_DDK
7812 IN PADAPTER_OBJECT AdapterObject
,
7813 IN PVOID MapRegisterBase
,
7814 IN ULONG NumberOfMapRegisters
);
7816 //DECLSPEC_DEPRECATED_DDK
7821 IN PADAPTER_OBJECT AdapterObject
,
7823 IN PVOID MapRegisterBase
,
7825 IN OUT PULONG Length
,
7826 IN BOOLEAN WriteToDevice
);
7829 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
7830 #endif // !defined(DMA_MACROS_DEFINED)
7836 IN PUNICODE_STRING RegistryPath
,
7837 IN PUNICODE_STRING DriverClassName OPTIONAL
,
7838 IN PDRIVER_OBJECT DriverObject
,
7839 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
7840 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources
,
7841 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
);
7846 IoAttachDeviceByPointer(
7847 IN PDEVICE_OBJECT SourceDevice
,
7848 IN PDEVICE_OBJECT TargetDevice
);
7853 MmIsNonPagedSystemAddressValid(
7854 IN PVOID VirtualAddress
);
7856 #if defined(_AMD64_) || defined(_IA64_)
7857 //DECLSPEC_DEPRECATED_DDK_WINXP
7861 RtlLargeIntegerDivide(
7862 IN LARGE_INTEGER Dividend
,
7863 IN LARGE_INTEGER Divisor
,
7864 IN OUT PLARGE_INTEGER Remainder
)
7867 ret
.QuadPart
= Dividend
.QuadPart
/ Divisor
.QuadPart
;
7869 Remainder
->QuadPart
= Dividend
.QuadPart
% Divisor
.QuadPart
;
7876 RtlLargeIntegerDivide(
7877 IN LARGE_INTEGER Dividend
,
7878 IN LARGE_INTEGER Divisor
,
7879 IN OUT PLARGE_INTEGER Remainder
);
7885 ExInterlockedDecrementLong(
7887 IN PKSPIN_LOCK Lock
);
7892 ExInterlockedExchangeUlong(
7895 IN PKSPIN_LOCK Lock
);
7900 ExInterlockedIncrementLong(
7902 IN PKSPIN_LOCK Lock
);
7907 HalAcquireDisplayOwnership(
7908 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters
);
7913 HalAllocateAdapterChannel(
7914 IN PADAPTER_OBJECT AdapterObject
,
7915 IN PWAIT_CONTEXT_BLOCK Wcb
,
7916 IN ULONG NumberOfMapRegisters
,
7917 IN PDRIVER_CONTROL ExecutionRoutine
);
7922 HalAllocateCommonBuffer(
7923 IN PADAPTER_OBJECT AdapterObject
,
7925 OUT PPHYSICAL_ADDRESS LogicalAddress
,
7926 IN BOOLEAN CacheEnabled
);
7931 HalAssignSlotResources(
7932 IN PUNICODE_STRING RegistryPath
,
7933 IN PUNICODE_STRING DriverClassName
,
7934 IN PDRIVER_OBJECT DriverObject
,
7935 IN PDEVICE_OBJECT DeviceObject
,
7936 IN INTERFACE_TYPE BusType
,
7938 IN ULONG SlotNumber
,
7939 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
);
7944 HalFreeCommonBuffer(
7945 IN PADAPTER_OBJECT AdapterObject
,
7947 IN PHYSICAL_ADDRESS LogicalAddress
,
7948 IN PVOID VirtualAddress
,
7949 IN BOOLEAN CacheEnabled
);
7955 IN PDEVICE_DESCRIPTION DeviceDescription
,
7956 IN OUT PULONG NumberOfMapRegisters
);
7962 IN BUS_DATA_TYPE BusDataType
,
7964 IN ULONG SlotNumber
,
7971 HalGetBusDataByOffset(
7972 IN BUS_DATA_TYPE BusDataType
,
7974 IN ULONG SlotNumber
,
7982 HalGetDmaAlignmentRequirement(
7988 HalGetInterruptVector(
7989 IN INTERFACE_TYPE InterfaceType
,
7991 IN ULONG BusInterruptLevel
,
7992 IN ULONG BusInterruptVector
,
7994 OUT PKAFFINITY Affinity
);
8000 IN PADAPTER_OBJECT AdapterObject
);
8006 IN BUS_DATA_TYPE BusDataType
,
8008 IN ULONG SlotNumber
,
8015 HalSetBusDataByOffset(
8016 IN BUS_DATA_TYPE BusDataType
,
8018 IN ULONG SlotNumber
,
8026 HalTranslateBusAddress(
8027 IN INTERFACE_TYPE InterfaceType
,
8029 IN PHYSICAL_ADDRESS BusAddress
,
8030 IN OUT PULONG AddressSpace
,
8031 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
8036 RtlLargeIntegerEqualToZero(
8037 IN LARGE_INTEGER Operand
);
8042 RtlLargeIntegerGreaterOrEqualToZero(
8043 IN LARGE_INTEGER Operand
);
8048 RtlLargeIntegerGreaterThan(
8049 IN LARGE_INTEGER Operand1
,
8050 IN LARGE_INTEGER Operand2
);
8055 RtlLargeIntegerGreaterThanOrEqualTo(
8056 IN LARGE_INTEGER Operand1
,
8057 IN LARGE_INTEGER Operand2
);
8062 RtlLargeIntegerGreaterThanZero(
8063 IN LARGE_INTEGER Operand
);
8068 RtlLargeIntegerLessOrEqualToZero(
8069 IN LARGE_INTEGER Operand
);
8074 RtlLargeIntegerLessThan(
8075 IN LARGE_INTEGER Operand1
,
8076 IN LARGE_INTEGER Operand2
);
8081 RtlLargeIntegerLessThanOrEqualTo(
8082 IN LARGE_INTEGER Operand1
,
8083 IN LARGE_INTEGER Operand2
);
8088 RtlLargeIntegerLessThanZero(
8089 IN LARGE_INTEGER Operand
);
8094 RtlLargeIntegerNegate(
8095 IN LARGE_INTEGER Subtrahend
);
8100 RtlLargeIntegerNotEqualTo(
8101 IN LARGE_INTEGER Operand1
,
8102 IN LARGE_INTEGER Operand2
);
8107 RtlLargeIntegerNotEqualToZero(
8108 IN LARGE_INTEGER Operand
);
8113 RtlLargeIntegerShiftLeft(
8114 IN LARGE_INTEGER LargeInteger
,
8115 IN CCHAR ShiftCount
);
8120 RtlLargeIntegerShiftRight(
8121 IN LARGE_INTEGER LargeInteger
,
8122 IN CCHAR ShiftCount
);
8127 RtlLargeIntegerSubtract(
8128 IN LARGE_INTEGER Minuend
,
8129 IN LARGE_INTEGER Subtrahend
);
8134 * COMPUTE_PAGES_SPANNED(
8138 #define COMPUTE_PAGES_SPANNED(Va, \
8140 (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
8144 ** Architecture specific structures
8152 Exfi386InterlockedIncrementLong(
8158 Exfi386InterlockedDecrementLong(
8164 Exfi386InterlockedExchangeUlong(
8168 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
8169 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
8170 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
8176 // NT-ARM is not documented
8185 #endif /* __WINDDK_H */