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
45 /* Pseudo modifiers for parameters */
61 #define RESTRICTED_POINTER
63 #define DECLSPEC_ADDRSAFE
65 #ifdef NONAMELESSUNION
66 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
67 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
69 # define _DDK_DUMMYUNION_MEMBER(name) name
70 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
74 ** Forward declarations
80 struct _DRIVE_LAYOUT_INFORMATION_EX
;
81 struct _LOADER_PARAMETER_BLOCK
;
85 /* FIXME: Unknown definitions */
86 struct _SET_PARTITION_INFORMATION_EX
;
87 typedef ULONG WAIT_TYPE
;
90 typedef HANDLE TRACEHANDLE
;
91 typedef PVOID PWMILIB_CONTEXT
;
92 typedef ULONG LOGICAL
;
96 ** WmiLib specific structure
100 IrpProcessed
, // Irp was processed and possibly completed
101 IrpNotCompleted
, // Irp was process and NOT completed
102 IrpNotWmi
, // Irp is not a WMI irp
103 IrpForward
// Irp is wmi irp, but targeted at another device object
104 } SYSCTL_IRP_DISPOSITION
, *PSYSCTL_IRP_DISPOSITION
;
109 struct _COMPRESSED_DATA_INFO
;
111 #define KERNEL_STACK_SIZE 12288
112 #define KERNEL_LARGE_STACK_SIZE 61440
113 #define KERNEL_LARGE_STACK_COMMIT 12288
115 #define EXCEPTION_READ_FAULT 0
116 #define EXCEPTION_WRITE_FAULT 1
117 #define EXCEPTION_EXECUTE_FAULT 8
119 #define DPFLTR_ERROR_LEVEL 0
120 #define DPFLTR_WARNING_LEVEL 1
121 #define DPFLTR_TRACE_LEVEL 2
122 #define DPFLTR_INFO_LEVEL 3
123 #define DPFLTR_MASK 0x80000000
125 typedef enum _DPFLTR_TYPE
127 DPFLTR_SYSTEM_ID
= 0,
132 DPFLTR_CRASHDUMP_ID
= 5,
133 DPFLTR_CDAUDIO_ID
= 6,
135 DPFLTR_CLASSPNP_ID
= 8,
137 DPFLTR_REDBOOK_ID
= 10,
138 DPFLTR_STORPROP_ID
= 11,
139 DPFLTR_SCSIPORT_ID
= 12,
140 DPFLTR_SCSIMINIPORT_ID
= 13,
141 DPFLTR_CONFIG_ID
= 14,
142 DPFLTR_I8042PRT_ID
= 15,
143 DPFLTR_SERMOUSE_ID
= 16,
144 DPFLTR_LSERMOUS_ID
= 17,
145 DPFLTR_KBDHID_ID
= 18,
146 DPFLTR_MOUHID_ID
= 19,
147 DPFLTR_KBDCLASS_ID
= 20,
148 DPFLTR_MOUCLASS_ID
= 21,
149 DPFLTR_TWOTRACK_ID
= 22,
150 DPFLTR_WMILIB_ID
= 23,
153 DPFLTR_HALIA64_ID
= 26,
154 DPFLTR_VIDEO_ID
= 27,
155 DPFLTR_SVCHOST_ID
= 28,
156 DPFLTR_VIDEOPRT_ID
= 29,
157 DPFLTR_TCPIP_ID
= 30,
158 DPFLTR_DMSYNTH_ID
= 31,
159 DPFLTR_NTOSPNP_ID
= 32,
160 DPFLTR_FASTFAT_ID
= 33,
161 DPFLTR_SAMSS_ID
= 34,
162 DPFLTR_PNPMGR_ID
= 35,
163 DPFLTR_NETAPI_ID
= 36,
164 DPFLTR_SCSERVER_ID
= 37,
165 DPFLTR_SCCLIENT_ID
= 38,
166 DPFLTR_SERIAL_ID
= 39,
167 DPFLTR_SERENUM_ID
= 40,
169 DPFLTR_BOOTOK_ID
= 42,
170 DPFLTR_BOOTVRFY_ID
= 43,
171 DPFLTR_RPCPROXY_ID
= 44,
172 DPFLTR_AUTOCHK_ID
= 45,
173 DPFLTR_DCOMSS_ID
= 46,
174 DPFLTR_UNIMODEM_ID
= 47,
176 DPFLTR_FLTMGR_ID
= 49,
177 DPFLTR_WMICORE_ID
= 50,
178 DPFLTR_BURNENG_ID
= 51,
179 DPFLTR_IMAPI_ID
= 52,
181 DPFLTR_FUSION_ID
= 54,
182 DPFLTR_IDLETASK_ID
= 55,
183 DPFLTR_SOFTPCI_ID
= 56,
185 DPFLTR_MCHGR_ID
= 58,
187 DPFLTR_PCIIDE_ID
= 60,
188 DPFLTR_FLOPPY_ID
= 61,
190 DPFLTR_TERMSRV_ID
= 63,
191 DPFLTR_W32TIME_ID
= 64,
192 DPFLTR_PREFETCHER_ID
= 65,
193 DPFLTR_RSFILTER_ID
= 66,
194 DPFLTR_FCPORT_ID
= 67,
197 DPFLTR_DMCONFIG_ID
= 70,
198 DPFLTR_DMADMIN_ID
= 71,
199 DPFLTR_WSOCKTRANSPORT_ID
= 72,
201 DPFLTR_PNPMEM_ID
= 74,
202 DPFLTR_PROCESSOR_ID
= 75,
203 DPFLTR_DMSERVER_ID
= 76,
205 DPFLTR_INFINIBAND_ID
= 78,
206 DPFLTR_IHVDRIVER_ID
= 79,
207 DPFLTR_IHVVIDEO_ID
= 80,
208 DPFLTR_IHVAUDIO_ID
= 81,
209 DPFLTR_IHVNETWORK_ID
= 82,
210 DPFLTR_IHVSTREAMING_ID
= 83,
211 DPFLTR_IHVBUS_ID
= 84,
213 DPFLTR_RTLTHREADPOOL_ID
= 86,
215 DPFLTR_TCPIP6_ID
= 88,
216 DPFLTR_ISAPNP_ID
= 89,
218 DPFLTR_STORPORT_ID
= 91,
219 DPFLTR_STORMINIPORT_ID
= 92,
220 DPFLTR_PRINTSPOOLER_ID
= 93,
222 DPFLTR_VDSBAS_ID
= 95,
223 DPFLTR_VDSDYNDR_ID
= 96,
224 DPFLTR_VDSUTIL_ID
= 97,
225 DPFLTR_DFRGIFC_ID
= 98,
226 DPFLTR_DEFAULT_ID
= 99,
228 DPFLTR_DFSC_ID
= 101,
229 DPFLTR_WOW64_ID
= 102,
233 /* also in winnt.h */
235 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
236 #define FILE_STRUCTURED_STORAGE 0x00000441
240 #define THREAD_ALERT (0x0004)
242 /* Exported object types */
243 extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType
;
244 extern POBJECT_TYPE NTSYSAPI ExEventObjectType
;
245 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType
;
246 extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType
;
247 extern ULONG NTSYSAPI IoDeviceHandlerObjectSize
;
248 extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType
;
249 extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType
;
250 extern POBJECT_TYPE NTSYSAPI IoDriverObjectType
;
251 extern POBJECT_TYPE NTSYSAPI IoFileObjectType
;
252 extern POBJECT_TYPE NTSYSAPI PsThreadType
;
253 extern POBJECT_TYPE NTSYSAPI LpcPortObjectType
;
254 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType
;
255 extern POBJECT_TYPE NTSYSAPI PsProcessType
;
257 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
258 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
260 #if (NTDDI_VERSION >= NTDDI_WINXP)
261 extern CCHAR NTSYSAPI KeNumberProcessors
;
263 //extern PCCHAR KeNumberProcessors;
264 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
268 #define MAX_WOW64_SHARED_ENTRIES 16
270 extern volatile KSYSTEM_TIME KeTickCount
;
272 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
273 #define NX_SUPPORT_POLICY_ALWAYSON 1
274 #define NX_SUPPORT_POLICY_OPTIN 2
275 #define NX_SUPPORT_POLICY_OPTOUT 3
277 typedef struct _KUSER_SHARED_DATA
279 ULONG TickCountLowDeprecated
;
280 ULONG TickCountMultiplier
;
281 volatile KSYSTEM_TIME InterruptTime
;
282 volatile KSYSTEM_TIME SystemTime
;
283 volatile KSYSTEM_TIME TimeZoneBias
;
284 USHORT ImageNumberLow
;
285 USHORT ImageNumberHigh
;
286 WCHAR NtSystemRoot
[260];
287 ULONG MaxStackTraceDepth
;
288 ULONG CryptoExponent
;
290 ULONG LargePageMinimum
;
292 NT_PRODUCT_TYPE NtProductType
;
293 BOOLEAN ProductTypeIsValid
;
294 ULONG NtMajorVersion
;
295 ULONG NtMinorVersion
;
296 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
299 volatile ULONG TimeSlip
;
300 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
301 LARGE_INTEGER SystemExpirationDate
;
303 BOOLEAN KdDebuggerEnabled
;
304 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
305 UCHAR NXSupportPolicy
;
307 volatile ULONG ActiveConsoleId
;
308 volatile ULONG DismountCount
;
309 ULONG ComPlusPackage
;
310 ULONG LastSystemRITEventTickCount
;
311 ULONG NumberOfPhysicalPages
;
312 BOOLEAN SafeBootMode
;
315 ULONGLONG TestRetInstruction
;
317 ULONG SystemCallReturn
;
318 ULONGLONG SystemCallPad
[3];
319 __GNU_EXTENSION
union {
320 volatile KSYSTEM_TIME TickCount
;
321 volatile ULONG64 TickCountQuad
;
324 #if (NTDDI_VERSION >= NTDDI_WS03)
325 LONGLONG ConsoleSessionForegroundProcessId
;
326 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
328 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
329 USHORT UserModeGlobalLogger
[8];
330 ULONG HeapTracingPid
[2];
331 ULONG CritSecTracingPid
[2];
332 __GNU_EXTENSION
union
334 ULONG SharedDataFlags
;
335 __GNU_EXTENSION
struct
337 ULONG DbgErrorPortPresent
:1;
338 ULONG DbgElevationEnabled
:1;
339 ULONG DbgVirtEnabled
:1;
340 ULONG DbgInstallerDetectEnabled
:1;
344 ULONG ImageFileExecutionOptions
;
345 KAFFINITY ActiveProcessorAffinity
;
347 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
350 ** IRP function codes
353 #define IRP_MN_QUERY_DIRECTORY 0x01
354 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
356 #define IRP_MN_USER_FS_REQUEST 0x00
357 #define IRP_MN_MOUNT_VOLUME 0x01
358 #define IRP_MN_VERIFY_VOLUME 0x02
359 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
360 #define IRP_MN_TRACK_LINK 0x04
361 #define IRP_MN_KERNEL_CALL 0x04
363 #define IRP_MN_LOCK 0x01
364 #define IRP_MN_UNLOCK_SINGLE 0x02
365 #define IRP_MN_UNLOCK_ALL 0x03
366 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
368 #define IRP_MN_NORMAL 0x00
369 #define IRP_MN_DPC 0x01
370 #define IRP_MN_MDL 0x02
371 #define IRP_MN_COMPLETE 0x04
372 #define IRP_MN_COMPRESSED 0x08
374 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
375 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
376 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
378 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
380 typedef EXCEPTION_DISPOSITION
381 (DDKAPI
*PEXCEPTION_ROUTINE
)(
382 IN
struct _EXCEPTION_RECORD
*ExceptionRecord
,
383 IN PVOID EstablisherFrame
,
384 IN OUT
struct _CONTEXT
*ContextRecord
,
385 IN OUT PVOID DispatcherContext
);
388 (DDKAPI
*PDRIVER_ENTRY
)(
389 IN
struct _DRIVER_OBJECT
*DriverObject
,
390 IN PUNICODE_STRING RegistryPath
);
393 (DDKAPI
*PDRIVER_REINITIALIZE
)(
394 IN
struct _DRIVER_OBJECT
*DriverObject
,
399 (DDKAPI
*PKTRANSFER_ROUTINE
)(
402 #define ASSERT_GATE(object) \
403 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
404 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
406 #define TIMER_TABLE_SIZE 512
407 #define TIMER_TABLE_SHIFT 9
409 #define ASSERT_TIMER(E) \
410 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
411 ((E)->Header.Type == TimerSynchronizationObject))
413 #define ASSERT_MUTANT(E) \
414 ASSERT((E)->Header.Type == MutantObject)
416 #define ASSERT_SEMAPHORE(E) \
417 ASSERT((E)->Header.Type == SemaphoreObject)
419 #define ASSERT_EVENT(E) \
420 ASSERT(((E)->Header.Type == NotificationEvent) || \
421 ((E)->Header.Type == SynchronizationEvent))
424 typedef enum _TIMER_TYPE
{
429 #define KEYBOARD_INSERT_ON 0x08
430 #define KEYBOARD_CAPS_LOCK_ON 0x04
431 #define KEYBOARD_NUM_LOCK_ON 0x02
432 #define KEYBOARD_SCROLL_LOCK_ON 0x01
433 #define KEYBOARD_ALT_KEY_DOWN 0x80
434 #define KEYBOARD_CTRL_KEY_DOWN 0x40
435 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
436 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
438 typedef struct _IO_COUNTERS
{
439 ULONGLONG ReadOperationCount
;
440 ULONGLONG WriteOperationCount
;
441 ULONGLONG OtherOperationCount
;
442 ULONGLONG ReadTransferCount
;
443 ULONGLONG WriteTransferCount
;
444 ULONGLONG OtherTransferCount
;
445 } IO_COUNTERS
, *PIO_COUNTERS
;
447 typedef struct _VM_COUNTERS
449 SIZE_T PeakVirtualSize
;
451 ULONG PageFaultCount
;
452 SIZE_T PeakWorkingSetSize
;
453 SIZE_T WorkingSetSize
;
454 SIZE_T QuotaPeakPagedPoolUsage
;
455 SIZE_T QuotaPagedPoolUsage
;
456 SIZE_T QuotaPeakNonPagedPoolUsage
;
457 SIZE_T QuotaNonPagedPoolUsage
;
458 SIZE_T PagefileUsage
;
459 SIZE_T PeakPagefileUsage
;
460 } VM_COUNTERS
, *PVM_COUNTERS
;
462 typedef struct _VM_COUNTERS_EX
464 SIZE_T PeakVirtualSize
;
466 ULONG PageFaultCount
;
467 SIZE_T PeakWorkingSetSize
;
468 SIZE_T WorkingSetSize
;
469 SIZE_T QuotaPeakPagedPoolUsage
;
470 SIZE_T QuotaPagedPoolUsage
;
471 SIZE_T QuotaPeakNonPagedPoolUsage
;
472 SIZE_T QuotaNonPagedPoolUsage
;
473 SIZE_T PagefileUsage
;
474 SIZE_T PeakPagefileUsage
;
476 } VM_COUNTERS_EX
, *PVM_COUNTERS_EX
;
478 typedef struct _POOLED_USAGE_AND_LIMITS
480 SIZE_T PeakPagedPoolUsage
;
481 SIZE_T PagedPoolUsage
;
482 SIZE_T PagedPoolLimit
;
483 SIZE_T PeakNonPagedPoolUsage
;
484 SIZE_T NonPagedPoolUsage
;
485 SIZE_T NonPagedPoolLimit
;
486 SIZE_T PeakPagefileUsage
;
487 SIZE_T PagefileUsage
;
488 SIZE_T PagefileLimit
;
489 } POOLED_USAGE_AND_LIMITS
, *PPOOLED_USAGE_AND_LIMITS
;
491 typedef struct _CONTROLLER_OBJECT
{
494 PVOID ControllerExtension
;
495 KDEVICE_QUEUE DeviceWaitQueue
;
497 LARGE_INTEGER Spare2
;
498 } CONTROLLER_OBJECT
, *PCONTROLLER_OBJECT
;
500 /* DEVICE_OBJECT.Flags */
502 #define DO_DEVICE_HAS_NAME 0x00000040
503 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
504 #define DO_LONG_TERM_REQUESTS 0x00000200
505 #define DO_NEVER_LAST_DEVICE 0x00000400
506 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
507 #define DO_XIP 0x00020000
509 #define DRVO_REINIT_REGISTERED 0x00000008
510 #define DRVO_INITIALIZED 0x00000010
511 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
512 #define DRVO_LEGACY_RESOURCES 0x00000040
514 typedef enum _ARBITER_REQUEST_SOURCE
{
515 ArbiterRequestUndefined
= -1,
516 ArbiterRequestLegacyReported
,
517 ArbiterRequestHalReported
,
518 ArbiterRequestLegacyAssigned
,
519 ArbiterRequestPnpDetected
,
520 ArbiterRequestPnpEnumerated
521 } ARBITER_REQUEST_SOURCE
;
523 typedef enum _ARBITER_RESULT
{
524 ArbiterResultUndefined
= -1,
525 ArbiterResultSuccess
,
526 ArbiterResultExternalConflict
,
527 ArbiterResultNullRequest
530 typedef enum _ARBITER_ACTION
{
531 ArbiterActionTestAllocation
,
532 ArbiterActionRetestAllocation
,
533 ArbiterActionCommitAllocation
,
534 ArbiterActionRollbackAllocation
,
535 ArbiterActionQueryAllocatedResources
,
536 ArbiterActionWriteReservedResources
,
537 ArbiterActionQueryConflict
,
538 ArbiterActionQueryArbitrate
,
539 ArbiterActionAddReserved
,
540 ArbiterActionBootAllocation
541 } ARBITER_ACTION
, *PARBITER_ACTION
;
543 typedef struct _ARBITER_CONFLICT_INFO
{
544 PDEVICE_OBJECT OwningObject
;
547 } ARBITER_CONFLICT_INFO
, *PARBITER_CONFLICT_INFO
;
549 typedef struct _ARBITER_PARAMETERS
{
552 IN OUT PLIST_ENTRY ArbitrationList
;
553 IN ULONG AllocateFromCount
;
554 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom
;
558 IN OUT PLIST_ENTRY ArbitrationList
;
559 IN ULONG AllocateFromCount
;
560 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom
;
564 IN OUT PLIST_ENTRY ArbitrationList
;
568 OUT PCM_PARTIAL_RESOURCE_LIST
*AllocatedResources
;
569 } QueryAllocatedResources
;
572 IN PDEVICE_OBJECT PhysicalDeviceObject
;
573 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource
;
574 OUT PULONG ConflictCount
;
575 OUT PARBITER_CONFLICT_INFO
*Conflicts
;
579 IN PLIST_ENTRY ArbitrationList
;
583 IN PDEVICE_OBJECT ReserveDevice
;
586 } ARBITER_PARAMETERS
, *PARBITER_PARAMETERS
;
588 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
590 typedef struct _ARBITER_LIST_ENTRY
{
591 LIST_ENTRY ListEntry
;
592 ULONG AlternativeCount
;
593 PIO_RESOURCE_DESCRIPTOR Alternatives
;
594 PDEVICE_OBJECT PhysicalDeviceObject
;
595 ARBITER_REQUEST_SOURCE RequestSource
;
598 INTERFACE_TYPE InterfaceType
;
601 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment
;
602 PIO_RESOURCE_DESCRIPTOR SelectedAlternative
;
603 ARBITER_RESULT Result
;
604 } ARBITER_LIST_ENTRY
, *PARBITER_LIST_ENTRY
;
607 (DDKAPI
*PARBITER_HANDLER
)(
609 IN ARBITER_ACTION Action
,
610 IN OUT PARBITER_PARAMETERS Parameters
);
612 #define ARBITER_PARTIAL 0x00000001
614 typedef struct _ARBITER_INTERFACE
{
618 PINTERFACE_REFERENCE InterfaceReference
;
619 PINTERFACE_DEREFERENCE InterfaceDereference
;
620 PARBITER_HANDLER ArbiterHandler
;
622 } ARBITER_INTERFACE
, *PARBITER_INTERFACE
;
624 typedef enum _HAL_QUERY_INFORMATION_CLASS
{
625 HalInstalledBusInformation
,
626 HalProfileSourceInformation
,
627 HalInformationClassUnused1
,
629 HalProcessorSpeedInformation
,
630 HalCallbackInformation
,
631 HalMapRegisterInformation
,
632 HalMcaLogInformation
,
633 HalFrameBufferCachingInformation
,
634 HalDisplayBiosInformation
,
635 HalProcessorFeatureInformation
,
636 HalNumaTopologyInterface
,
638 HalCmcLogInformation
,
639 HalCpeLogInformation
,
640 HalQueryMcaInterface
,
641 HalQueryAMLIIllegalIOPortAddresses
,
642 HalQueryMaxHotPlugMemoryAddress
,
643 HalPartitionIpiInterface
,
644 HalPlatformInformation
,
645 HalQueryProfileSourceList
646 } HAL_QUERY_INFORMATION_CLASS
, *PHAL_QUERY_INFORMATION_CLASS
;
648 typedef enum _HAL_SET_INFORMATION_CLASS
{
649 HalProfileSourceInterval
,
650 HalProfileSourceInterruptHandler
,
651 HalMcaRegisterDriver
,
652 HalKernelErrorHandler
,
653 HalCmcRegisterDriver
,
654 HalCpeRegisterDriver
,
658 HalGenerateCmcInterrupt
659 } HAL_SET_INFORMATION_CLASS
, *PHAL_SET_INFORMATION_CLASS
;
661 typedef struct _HAL_PROFILE_SOURCE_INTERVAL
663 KPROFILE_SOURCE Source
;
665 } HAL_PROFILE_SOURCE_INTERVAL
, *PHAL_PROFILE_SOURCE_INTERVAL
;
667 typedef struct _HAL_PROFILE_SOURCE_INFORMATION
669 KPROFILE_SOURCE Source
;
672 } HAL_PROFILE_SOURCE_INFORMATION
, *PHAL_PROFILE_SOURCE_INFORMATION
;
674 typedef struct _MAP_REGISTER_ENTRY
677 BOOLEAN WriteToDevice
;
678 } MAP_REGISTER_ENTRY
, *PMAP_REGISTER_ENTRY
;
685 PUCHAR TranslatedAddress
;
687 } DEBUG_DEVICE_ADDRESS
, *PDEBUG_DEVICE_ADDRESS
;
691 PHYSICAL_ADDRESS Start
;
692 PHYSICAL_ADDRESS MaxEnd
;
693 PVOID VirtualAddress
;
697 } DEBUG_MEMORY_REQUIREMENTS
, *PDEBUG_MEMORY_REQUIREMENTS
;
709 DEBUG_DEVICE_ADDRESS BaseAddress
[6];
710 DEBUG_MEMORY_REQUIREMENTS Memory
;
711 } DEBUG_DEVICE_DESCRIPTOR
, *PDEBUG_DEVICE_DESCRIPTOR
;
713 /* Function Type Defintions for Dispatch Functions */
714 struct _DEVICE_CONTROL_CONTEXT
;
717 (DDKAPI
*PDEVICE_CONTROL_COMPLETION
)(
718 IN
struct _DEVICE_CONTROL_CONTEXT
*ControlContext
);
720 typedef struct _DEVICE_CONTROL_CONTEXT
{
722 PDEVICE_HANDLER_OBJECT DeviceHandler
;
723 PDEVICE_OBJECT DeviceObject
;
728 } DEVICE_CONTROL_CONTEXT
, *PDEVICE_CONTROL_CONTEXT
;
730 typedef struct _PM_DISPATCH_TABLE
{
734 } PM_DISPATCH_TABLE
, *PPM_DISPATCH_TABLE
;
736 typedef enum _RESOURCE_TRANSLATION_DIRECTION
{
737 TranslateChildToParent
,
738 TranslateParentToChild
739 } RESOURCE_TRANSLATION_DIRECTION
;
742 (DDKAPI
*PTRANSLATE_RESOURCE_HANDLER
)(
744 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source
,
745 IN RESOURCE_TRANSLATION_DIRECTION Direction
,
746 IN ULONG AlternativesCount
,
747 IN IO_RESOURCE_DESCRIPTOR Alternatives
[],
748 IN PDEVICE_OBJECT PhysicalDeviceObject
,
749 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target
);
752 (DDKAPI
*PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER
)(
754 IN PIO_RESOURCE_DESCRIPTOR Source
,
755 IN PDEVICE_OBJECT PhysicalDeviceObject
,
756 OUT PULONG TargetCount
,
757 OUT PIO_RESOURCE_DESCRIPTOR
*Target
);
759 typedef struct _TRANSLATOR_INTERFACE
{
763 PINTERFACE_REFERENCE InterfaceReference
;
764 PINTERFACE_DEREFERENCE InterfaceDereference
;
765 PTRANSLATE_RESOURCE_HANDLER TranslateResources
;
766 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements
;
767 } TRANSLATOR_INTERFACE
, *PTRANSLATOR_INTERFACE
;
770 (DDKAPI
*pHalDeviceControl
)(
771 IN PDEVICE_HANDLER_OBJECT DeviceHandler
,
772 IN PDEVICE_OBJECT DeviceObject
,
773 IN ULONG ControlCode
,
774 IN OUT PVOID Buffer OPTIONAL
,
775 IN OUT PULONG BufferLength OPTIONAL
,
777 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine
);
780 (FASTCALL
*pHalExamineMBR
)(
781 IN PDEVICE_OBJECT DeviceObject
,
783 IN ULONG MBRTypeIdentifier
,
787 (FASTCALL
*pHalIoAssignDriveLetters
)(
788 IN
struct _LOADER_PARAMETER_BLOCK
*LoaderBlock
,
789 IN PSTRING NtDeviceName
,
790 OUT PUCHAR NtSystemPath
,
791 OUT PSTRING NtSystemPathString
);
794 (FASTCALL
*pHalIoReadPartitionTable
)(
795 IN PDEVICE_OBJECT DeviceObject
,
797 IN BOOLEAN ReturnRecognizedPartitions
,
798 OUT
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
801 (FASTCALL
*pHalIoSetPartitionInformation
)(
802 IN PDEVICE_OBJECT DeviceObject
,
804 IN ULONG PartitionNumber
,
805 IN ULONG PartitionType
);
808 (FASTCALL
*pHalIoWritePartitionTable
)(
809 IN PDEVICE_OBJECT DeviceObject
,
811 IN ULONG SectorsPerTrack
,
812 IN ULONG NumberOfHeads
,
813 IN
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
816 (FASTCALL
*pHalHandlerForBus
)(
817 IN INTERFACE_TYPE InterfaceType
,
821 (FASTCALL
*pHalReferenceBusHandler
)(
822 IN PBUS_HANDLER BusHandler
);
825 (DDKAPI
*pHalQuerySystemInformation
)(
826 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
829 OUT PULONG ReturnedLength
);
832 (DDKAPI
*pHalSetSystemInformation
)(
833 IN HAL_SET_INFORMATION_CLASS InformationClass
,
838 (DDKAPI
*pHalQueryBusSlots
)(
839 IN PBUS_HANDLER BusHandler
,
841 OUT PULONG SlotNumbers
,
842 OUT PULONG ReturnedLength
);
845 (DDKAPI
*pHalInitPnpDriver
)(
849 (DDKAPI
*pHalInitPowerManagement
)(
850 IN PPM_DISPATCH_TABLE PmDriverDispatchTable
,
851 OUT PPM_DISPATCH_TABLE
*PmHalDispatchTable
);
853 typedef struct _DMA_ADAPTER
*
854 (DDKAPI
*pHalGetDmaAdapter
)(
856 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
857 OUT PULONG NumberOfMapRegisters
);
860 (DDKAPI
*pHalGetInterruptTranslator
)(
861 IN INTERFACE_TYPE ParentInterfaceType
,
862 IN ULONG ParentBusNumber
,
863 IN INTERFACE_TYPE BridgeInterfaceType
,
866 OUT PTRANSLATOR_INTERFACE Translator
,
867 OUT PULONG BridgeBusNumber
);
870 (DDKAPI
*pHalStartMirroring
)(
874 (DDKAPI
*pHalEndMirroring
)(
875 IN ULONG PassNumber
);
878 (DDKAPI
*pHalMirrorPhysicalMemory
)(
879 IN PHYSICAL_ADDRESS PhysicalAddress
,
880 IN LARGE_INTEGER NumberOfBytes
);
883 (DDKAPI
*pHalMirrorVerify
)(
884 IN PHYSICAL_ADDRESS PhysicalAddress
,
885 IN LARGE_INTEGER NumberOfBytes
);
888 (DDKAPI
*pHalEndOfBoot
)(
893 (DDKAPI
*pHalTranslateBusAddress
)(
894 IN INTERFACE_TYPE InterfaceType
,
896 IN PHYSICAL_ADDRESS BusAddress
,
897 IN OUT PULONG AddressSpace
,
898 OUT PPHYSICAL_ADDRESS TranslatedAddress
903 (DDKAPI
*pHalAssignSlotResources
)(
904 IN PUNICODE_STRING RegistryPath
,
905 IN PUNICODE_STRING DriverClassName OPTIONAL
,
906 IN PDRIVER_OBJECT DriverObject
,
907 IN PDEVICE_OBJECT DeviceObject
,
908 IN INTERFACE_TYPE BusType
,
911 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
916 (DDKAPI
*pHalHaltSystem
)(
922 (DDKAPI
*pHalResetDisplay
)(
928 (DDKAPI
*pHalVectorToIDTEntry
)(
934 (DDKAPI
*pHalFindBusAddressTranslation
)(
935 IN PHYSICAL_ADDRESS BusAddress
,
936 IN OUT PULONG AddressSpace
,
937 OUT PPHYSICAL_ADDRESS TranslatedAddress
,
938 IN OUT PULONG_PTR Context
,
944 (DDKAPI
*pKdSetupPciDeviceForDebugging
)(
945 IN PVOID LoaderBlock OPTIONAL
,
946 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
951 (DDKAPI
*pKdReleasePciDeviceForDebugging
)(
952 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
957 (DDKAPI
*pKdGetAcpiTablePhase0
)(
958 IN
struct _LOADER_PARAMETER_BLOCK
*LoaderBlock
,
964 (DDKAPI
*pKdCheckPowerButton
)(
970 (DDKAPI
*pHalGetInterruptVector
)(
971 IN INTERFACE_TYPE InterfaceType
,
973 IN ULONG BusInterruptLevel
,
974 IN ULONG BusInterruptVector
,
976 OUT PKAFFINITY Affinity
981 (DDKAPI
*pHalGetVectorInput
)(
983 IN KAFFINITY Affinity
,
985 OUT PKINTERRUPT_POLARITY Polarity
990 (DDKAPI
*pKdMapPhysicalMemory64
)(
991 IN PHYSICAL_ADDRESS PhysicalAddress
,
997 (DDKAPI
*pKdUnmapVirtualAddress
)(
998 IN PVOID VirtualAddress
,
1004 (DDKAPI
*pKdGetPciDataByOffset
)(
1006 IN ULONG SlotNumber
,
1014 (DDKAPI
*pKdSetPciDataByOffset
)(
1016 IN ULONG SlotNumber
,
1023 (DDKAPI
*PHAL_RESET_DISPLAY_PARAMETERS
)(
1024 ULONG Columns
, ULONG Rows
);
1028 pHalQuerySystemInformation HalQuerySystemInformation
;
1029 pHalSetSystemInformation HalSetSystemInformation
;
1030 pHalQueryBusSlots HalQueryBusSlots
;
1032 pHalExamineMBR HalExamineMBR
;
1033 pHalIoAssignDriveLetters HalIoAssignDriveLetters
;
1034 pHalIoReadPartitionTable HalIoReadPartitionTable
;
1035 pHalIoSetPartitionInformation HalIoSetPartitionInformation
;
1036 pHalIoWritePartitionTable HalIoWritePartitionTable
;
1037 pHalHandlerForBus HalReferenceHandlerForBus
;
1038 pHalReferenceBusHandler HalReferenceBusHandler
;
1039 pHalReferenceBusHandler HalDereferenceBusHandler
;
1040 pHalInitPnpDriver HalInitPnpDriver
;
1041 pHalInitPowerManagement HalInitPowerManagement
;
1042 pHalGetDmaAdapter HalGetDmaAdapter
;
1043 pHalGetInterruptTranslator HalGetInterruptTranslator
;
1044 pHalStartMirroring HalStartMirroring
;
1045 pHalEndMirroring HalEndMirroring
;
1046 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory
;
1047 pHalEndOfBoot HalEndOfBoot
;
1048 pHalMirrorVerify HalMirrorVerify
;
1049 } HAL_DISPATCH
, *PHAL_DISPATCH
;
1051 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_)
1052 extern NTSYSAPI PHAL_DISPATCH HalDispatchTable
;
1053 #define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
1055 extern __declspec(dllexport
) HAL_DISPATCH HalDispatchTable
;
1056 #define HALDISPATCH (&HalDispatchTable)
1059 #define HAL_DISPATCH_VERSION 3
1060 #define HalDispatchTableVersion HALDISPATCH->Version
1061 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
1062 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
1063 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
1064 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
1065 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
1066 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
1067 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
1068 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
1069 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
1070 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
1071 #define HalStartMirroring HALDISPATCH->HalStartMirroring
1072 #define HalEndMirroring HALDISPATCH->HalEndMirroring
1073 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
1074 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
1075 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
1077 typedef struct _FILE_ALIGNMENT_INFORMATION
{
1078 ULONG AlignmentRequirement
;
1079 } FILE_ALIGNMENT_INFORMATION
, *PFILE_ALIGNMENT_INFORMATION
;
1081 typedef struct _FILE_NAME_INFORMATION
{
1082 ULONG FileNameLength
;
1084 } FILE_NAME_INFORMATION
, *PFILE_NAME_INFORMATION
;
1087 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION
{
1088 ULONG FileAttributes
;
1090 } FILE_ATTRIBUTE_TAG_INFORMATION
, *PFILE_ATTRIBUTE_TAG_INFORMATION
;
1092 typedef struct _FILE_DISPOSITION_INFORMATION
{
1094 } FILE_DISPOSITION_INFORMATION
, *PFILE_DISPOSITION_INFORMATION
;
1096 typedef struct _FILE_END_OF_FILE_INFORMATION
{
1097 LARGE_INTEGER EndOfFile
;
1098 } FILE_END_OF_FILE_INFORMATION
, *PFILE_END_OF_FILE_INFORMATION
;
1100 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
{
1101 LARGE_INTEGER ValidDataLength
;
1102 } FILE_VALID_DATA_LENGTH_INFORMATION
, *PFILE_VALID_DATA_LENGTH_INFORMATION
;
1104 typedef union _FILE_SEGMENT_ELEMENT
{
1106 ULONGLONG Alignment
;
1107 }FILE_SEGMENT_ELEMENT
, *PFILE_SEGMENT_ELEMENT
;
1109 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
1111 typedef struct _KEY_USER_FLAGS_INFORMATION
{
1113 } KEY_USER_FLAGS_INFORMATION
, *PKEY_USER_FLAGS_INFORMATION
;
1115 #define PCI_ADDRESS_MEMORY_SPACE 0x00000000
1117 typedef struct _OSVERSIONINFOA
{
1118 ULONG dwOSVersionInfoSize
;
1119 ULONG dwMajorVersion
;
1120 ULONG dwMinorVersion
;
1121 ULONG dwBuildNumber
;
1123 CHAR szCSDVersion
[128];
1124 } OSVERSIONINFOA
, *POSVERSIONINFOA
, *LPOSVERSIONINFOA
;
1126 typedef struct _OSVERSIONINFOW
{
1127 ULONG dwOSVersionInfoSize
;
1128 ULONG dwMajorVersion
;
1129 ULONG dwMinorVersion
;
1130 ULONG dwBuildNumber
;
1132 WCHAR szCSDVersion
[128];
1133 } OSVERSIONINFOW
, *POSVERSIONINFOW
, *LPOSVERSIONINFOW
, RTL_OSVERSIONINFOW
, *PRTL_OSVERSIONINFOW
;
1136 typedef OSVERSIONINFOW OSVERSIONINFO
;
1137 typedef POSVERSIONINFOW POSVERSIONINFO
;
1138 typedef LPOSVERSIONINFOW LPOSVERSIONINFO
;
1140 typedef OSVERSIONINFOA OSVERSIONINFO
;
1141 typedef POSVERSIONINFOA POSVERSIONINFO
;
1142 typedef LPOSVERSIONINFOA LPOSVERSIONINFO
;
1145 typedef struct _OSVERSIONINFOEXA
{
1146 ULONG dwOSVersionInfoSize
;
1147 ULONG dwMajorVersion
;
1148 ULONG dwMinorVersion
;
1149 ULONG dwBuildNumber
;
1151 CHAR szCSDVersion
[128];
1152 USHORT wServicePackMajor
;
1153 USHORT wServicePackMinor
;
1157 } OSVERSIONINFOEXA
, *POSVERSIONINFOEXA
, *LPOSVERSIONINFOEXA
;
1159 typedef struct _OSVERSIONINFOEXW
{
1160 ULONG dwOSVersionInfoSize
;
1161 ULONG dwMajorVersion
;
1162 ULONG dwMinorVersion
;
1163 ULONG dwBuildNumber
;
1165 WCHAR szCSDVersion
[128];
1166 USHORT wServicePackMajor
;
1167 USHORT wServicePackMinor
;
1171 } OSVERSIONINFOEXW
, *POSVERSIONINFOEXW
, *LPOSVERSIONINFOEXW
, RTL_OSVERSIONINFOEXW
, *PRTL_OSVERSIONINFOEXW
;
1174 typedef OSVERSIONINFOEXW OSVERSIONINFOEX
;
1175 typedef POSVERSIONINFOEXW POSVERSIONINFOEX
;
1176 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX
;
1178 typedef OSVERSIONINFOEXA OSVERSIONINFOEX
;
1179 typedef POSVERSIONINFOEXA POSVERSIONINFOEX
;
1180 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX
;
1186 VerSetConditionMask(
1187 IN ULONGLONG ConditionMask
,
1189 IN UCHAR Condition
);
1191 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
1192 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
1193 (TypeBitMask), (ComparisonType)))
1195 /* RtlVerifyVersionInfo() TypeMask */
1197 #define VER_MINORVERSION 0x0000001
1198 #define VER_MAJORVERSION 0x0000002
1199 #define VER_BUILDNUMBER 0x0000004
1200 #define VER_PLATFORMID 0x0000008
1201 #define VER_SERVICEPACKMINOR 0x0000010
1202 #define VER_SERVICEPACKMAJOR 0x0000020
1203 #define VER_SUITENAME 0x0000040
1204 #define VER_PRODUCT_TYPE 0x0000080
1206 /* RtlVerifyVersionInfo() ComparisonType */
1209 #define VER_GREATER 2
1210 #define VER_GREATER_EQUAL 3
1212 #define VER_LESS_EQUAL 5
1216 #define VER_CONDITION_MASK 7
1217 #define VER_NUM_BITS_PER_CONDITION_MASK 3
1222 (NTAPI
*PRTL_CONFLICT_RANGE_CALLBACK
) (
1224 struct _RTL_RANGE
*Range
1227 typedef struct _CONFIGURATION_INFORMATION
{
1232 ULONG ScsiPortCount
;
1234 ULONG ParallelCount
;
1235 BOOLEAN AtDiskPrimaryAddressClaimed
;
1236 BOOLEAN AtDiskSecondaryAddressClaimed
;
1238 ULONG MediumChangerCount
;
1239 } CONFIGURATION_INFORMATION
, *PCONFIGURATION_INFORMATION
;
1241 typedef enum _CONFIGURATION_TYPE
{
1244 FloatingPointProcessor
,
1254 MultiFunctionAdapter
,
1268 FloppyDiskPeripheral
,
1281 RealModeIrqRoutingTable
,
1282 RealModePCIEnumeration
,
1284 } CONFIGURATION_TYPE
, *PCONFIGURATION_TYPE
;
1287 (DDKAPI
*PIO_QUERY_DEVICE_ROUTINE
)(
1289 IN PUNICODE_STRING PathName
,
1290 IN INTERFACE_TYPE BusType
,
1292 IN PKEY_VALUE_FULL_INFORMATION
*BusInformation
,
1293 IN CONFIGURATION_TYPE ControllerType
,
1294 IN ULONG ControllerNumber
,
1295 IN PKEY_VALUE_FULL_INFORMATION
*ControllerInformation
,
1296 IN CONFIGURATION_TYPE PeripheralType
,
1297 IN ULONG PeripheralNumber
,
1298 IN PKEY_VALUE_FULL_INFORMATION
*PeripheralInformation
);
1300 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT
{
1301 IoQueryDeviceIdentifier
= 0,
1302 IoQueryDeviceConfigurationData
,
1303 IoQueryDeviceComponentInformation
,
1304 IoQueryDeviceMaxData
1305 } IO_QUERY_DEVICE_DATA_FORMAT
, *PIO_QUERY_DEVICE_DATA_FORMAT
;
1308 (DDKAPI
*PCREATE_PROCESS_NOTIFY_ROUTINE
)(
1310 IN HANDLE ProcessId
,
1314 (DDKAPI
*PCREATE_THREAD_NOTIFY_ROUTINE
)(
1315 IN HANDLE ProcessId
,
1319 typedef struct _IMAGE_INFO
{
1320 _ANONYMOUS_UNION
union {
1322 _ANONYMOUS_STRUCT
struct {
1323 ULONG ImageAddressingMode
: 8;
1324 ULONG SystemModeImage
: 1;
1325 ULONG ImageMappedToAllPids
: 1;
1326 ULONG Reserved
: 22;
1330 ULONG ImageSelector
;
1332 ULONG ImageSectionNumber
;
1333 } IMAGE_INFO
, *PIMAGE_INFO
;
1335 #define IMAGE_ADDRESSING_MODE_32BIT 3
1338 (DDKAPI
*PLOAD_IMAGE_NOTIFY_ROUTINE
)(
1339 IN PUNICODE_STRING FullImageName
,
1340 IN HANDLE ProcessId
,
1341 IN PIMAGE_INFO ImageInfo
);
1343 #pragma pack(push,4)
1344 typedef enum _BUS_DATA_TYPE
{
1345 ConfigurationSpaceUndefined
= -1,
1353 PCMCIAConfiguration
,
1356 PNPISAConfiguration
,
1357 SgiInternalConfiguration
,
1359 } BUS_DATA_TYPE
, *PBUS_DATA_TYPE
;
1362 typedef struct _NT_TIB
{
1363 struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;
1367 _ANONYMOUS_UNION
union {
1371 PVOID ArbitraryUserPointer
;
1372 struct _NT_TIB
*Self
;
1375 typedef struct _NT_TIB32
{
1376 ULONG ExceptionList
;
1380 __GNU_EXTENSION
union {
1384 ULONG ArbitraryUserPointer
;
1386 } NT_TIB32
,*PNT_TIB32
;
1388 typedef struct _NT_TIB64
{
1389 ULONG64 ExceptionList
;
1392 ULONG64 SubSystemTib
;
1393 __GNU_EXTENSION
union {
1397 ULONG64 ArbitraryUserPointer
;
1399 } NT_TIB64
,*PNT_TIB64
;
1401 typedef enum _PROCESSINFOCLASS
{
1402 ProcessBasicInformation
,
1407 ProcessBasePriority
,
1408 ProcessRaisePriority
,
1410 ProcessExceptionPort
,
1412 ProcessLdtInformation
,
1414 ProcessDefaultHardErrorMode
,
1415 ProcessIoPortHandlers
,
1416 ProcessPooledUsageAndLimits
,
1417 ProcessWorkingSetWatch
,
1418 ProcessUserModeIOPL
,
1419 ProcessEnableAlignmentFaultFixup
,
1420 ProcessPriorityClass
,
1421 ProcessWx86Information
,
1423 ProcessAffinityMask
,
1424 ProcessPriorityBoost
,
1426 ProcessSessionInformation
,
1427 ProcessForegroundInformation
,
1428 ProcessWow64Information
,
1429 ProcessImageFileName
,
1430 ProcessLUIDDeviceMapsEnabled
,
1431 ProcessBreakOnTermination
,
1432 ProcessDebugObjectHandle
,
1434 ProcessHandleTracing
,
1436 ProcessExecuteFlags
,
1437 ProcessTlsInformation
,
1439 ProcessImageInformation
,
1441 ProcessPagePriority
,
1442 ProcessInstrumentationCallback
,
1446 typedef enum _THREADINFOCLASS
{
1447 ThreadBasicInformation
,
1452 ThreadImpersonationToken
,
1453 ThreadDescriptorTableEntry
,
1454 ThreadEnableAlignmentFaultFixup
,
1455 ThreadEventPair_Reusable
,
1456 ThreadQuerySetWin32StartAddress
,
1458 ThreadPerformanceCount
,
1459 ThreadAmILastThread
,
1460 ThreadIdealProcessor
,
1461 ThreadPriorityBoost
,
1462 ThreadSetTlsArrayAddress
,
1464 ThreadHideFromDebugger
,
1465 ThreadBreakOnTermination
,
1466 ThreadSwitchLegacyState
,
1468 ThreadLastSystemCall
,
1472 ThreadActualBasePriority
,
1476 typedef struct _PROCESS_BASIC_INFORMATION
1478 NTSTATUS ExitStatus
;
1479 struct _PEB
*PebBaseAddress
;
1480 ULONG_PTR AffinityMask
;
1481 KPRIORITY BasePriority
;
1482 ULONG_PTR UniqueProcessId
;
1483 ULONG_PTR InheritedFromUniqueProcessId
;
1484 } PROCESS_BASIC_INFORMATION
,*PPROCESS_BASIC_INFORMATION
;
1486 typedef struct _PROCESS_WS_WATCH_INFORMATION
1490 } PROCESS_WS_WATCH_INFORMATION
, *PPROCESS_WS_WATCH_INFORMATION
;
1492 typedef struct _PROCESS_DEVICEMAP_INFORMATION
1494 __GNU_EXTENSION
union
1498 HANDLE DirectoryHandle
;
1503 UCHAR DriveType
[32];
1506 } PROCESS_DEVICEMAP_INFORMATION
, *PPROCESS_DEVICEMAP_INFORMATION
;
1508 typedef struct _KERNEL_USER_TIMES
1510 LARGE_INTEGER CreateTime
;
1511 LARGE_INTEGER ExitTime
;
1512 LARGE_INTEGER KernelTime
;
1513 LARGE_INTEGER UserTime
;
1514 } KERNEL_USER_TIMES
, *PKERNEL_USER_TIMES
;
1516 typedef struct _PROCESS_ACCESS_TOKEN
1520 } PROCESS_ACCESS_TOKEN
, *PPROCESS_ACCESS_TOKEN
;
1522 typedef struct _PROCESS_SESSION_INFORMATION
1525 } PROCESS_SESSION_INFORMATION
, *PPROCESS_SESSION_INFORMATION
;
1528 ** Storage structures
1530 typedef enum _PARTITION_STYLE
{
1531 PARTITION_STYLE_MBR
,
1532 PARTITION_STYLE_GPT
,
1536 typedef struct _CREATE_DISK_MBR
{
1538 } CREATE_DISK_MBR
, *PCREATE_DISK_MBR
;
1540 typedef struct _CREATE_DISK_GPT
{
1542 ULONG MaxPartitionCount
;
1543 } CREATE_DISK_GPT
, *PCREATE_DISK_GPT
;
1545 typedef struct _CREATE_DISK
{
1546 PARTITION_STYLE PartitionStyle
;
1547 _ANONYMOUS_UNION
union {
1548 CREATE_DISK_MBR Mbr
;
1549 CREATE_DISK_GPT Gpt
;
1551 } CREATE_DISK
, *PCREATE_DISK
;
1553 typedef struct _DISK_SIGNATURE
{
1554 ULONG PartitionStyle
;
1555 _ANONYMOUS_UNION
union {
1564 } DISK_SIGNATURE
, *PDISK_SIGNATURE
;
1567 (FASTCALL
*PTIME_UPDATE_NOTIFY_ROUTINE
)(
1569 IN KPROCESSOR_MODE Mode
);
1571 typedef struct _PHYSICAL_MEMORY_RANGE
{
1572 PHYSICAL_ADDRESS BaseAddress
;
1573 LARGE_INTEGER NumberOfBytes
;
1574 } PHYSICAL_MEMORY_RANGE
, *PPHYSICAL_MEMORY_RANGE
;
1577 (NTAPI
*PDRIVER_VERIFIER_THUNK_ROUTINE
)(
1580 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS
{
1581 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine
;
1582 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine
;
1583 } DRIVER_VERIFIER_THUNK_PAIRS
, *PDRIVER_VERIFIER_THUNK_PAIRS
;
1585 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
1586 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
1587 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
1588 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
1589 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
1592 (DDKAPI
*PTIMER_APC_ROUTINE
)(
1593 IN PVOID TimerContext
,
1594 IN ULONG TimerLowValue
,
1595 IN LONG TimerHighValue
);
1598 ** Architecture specific structures
1600 #define PCR_MINOR_VERSION 1
1601 #define PCR_MAJOR_VERSION 1
1605 #define SIZE_OF_80387_REGISTERS 80
1606 #define CONTEXT_i386 0x10000
1607 #define CONTEXT_i486 0x10000
1608 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
1609 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
1610 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
1611 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
1612 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
1613 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
1614 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
1616 typedef struct _FLOATING_SAVE_AREA
{
1621 ULONG ErrorSelector
;
1624 UCHAR RegisterArea
[SIZE_OF_80387_REGISTERS
];
1626 } FLOATING_SAVE_AREA
, *PFLOATING_SAVE_AREA
;
1628 typedef struct _CONTEXT
{
1636 FLOATING_SAVE_AREA FloatSave
;
1653 UCHAR ExtendedRegisters
[MAXIMUM_SUPPORTED_EXTENSION
];
1656 typedef struct _KPCR_TIB
{
1657 PVOID ExceptionList
; /* 00 */
1658 PVOID StackBase
; /* 04 */
1659 PVOID StackLimit
; /* 08 */
1660 PVOID SubSystemTib
; /* 0C */
1661 _ANONYMOUS_UNION
union {
1662 PVOID FiberData
; /* 10 */
1663 ULONG Version
; /* 10 */
1665 PVOID ArbitraryUserPointer
; /* 14 */
1666 struct _KPCR_TIB
*Self
; /* 18 */
1667 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
1669 typedef struct _KPCR
{
1670 KPCR_TIB Tib
; /* 00 */
1671 struct _KPCR
*Self
; /* 1C */
1672 struct _KPRCB
*Prcb
; /* 20 */
1673 KIRQL Irql
; /* 24 */
1675 ULONG IrrActive
; /* 2C */
1677 PVOID KdVersionBlock
; /* 34 */
1678 PUSHORT IDT
; /* 38 */
1679 PUSHORT GDT
; /* 3C */
1680 struct _KTSS
*TSS
; /* 40 */
1681 USHORT MajorVersion
; /* 44 */
1682 USHORT MinorVersion
; /* 46 */
1683 KAFFINITY SetMember
; /* 48 */
1684 ULONG StallScaleFactor
; /* 4C */
1685 UCHAR SpareUnused
; /* 50 */
1686 UCHAR Number
; /* 51 */
1688 UCHAR SecondLevelCacheAssociativity
;
1690 ULONG KernelReserved
[14]; // For use by the kernel
1691 ULONG SecondLevelCacheSize
;
1692 ULONG HalReserved
[16]; // For use by Hal
1693 } KPCR
, *PKPCR
; /* 54 */
1695 #define KeGetPcr() PCR
1699 KeGetCurrentProcessorNumber(VOID
)
1701 return (ULONG
)__readfsbyte(FIELD_OFFSET(KPCR
, Number
));
1704 extern NTKERNELAPI PVOID MmHighestUserAddress
;
1705 extern NTKERNELAPI PVOID MmSystemRangeStart
;
1706 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress
;
1708 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
1709 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
1710 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
1711 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
1712 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
1714 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
1715 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
1717 #elif defined(__x86_64__)
1719 #define CONTEXT_AMD64 0x100000
1720 #if !defined(RC_INVOKED)
1721 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
1722 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
1723 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
1724 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
1725 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
1727 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
1728 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
1730 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
1731 #define CONTEXT_SERVICE_ACTIVE 0x10000000
1732 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
1733 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
1736 typedef struct DECLSPEC_ALIGN(16) _CONTEXT
{
1786 /* Floating point */
1788 XMM_SAVE_AREA32 FltSave
;
1812 M128A VectorRegister
[26];
1813 ULONG64 VectorControl
;
1816 ULONG64 DebugControl
;
1817 ULONG64 LastBranchToRip
;
1818 ULONG64 LastBranchFromRip
;
1819 ULONG64 LastExceptionToRip
;
1820 ULONG64 LastExceptionFromRip
;
1823 #define PAGE_SIZE 0x1000
1824 #define PAGE_SHIFT 12L
1825 #define PTI_SHIFT 12L
1826 #define PDI_SHIFT 21L
1827 #define PPI_SHIFT 30L
1828 #define PXI_SHIFT 39L
1829 #define PTE_PER_PAGE 512
1830 #define PDE_PER_PAGE 512
1831 #define PPE_PER_PAGE 512
1832 #define PXE_PER_PAGE 512
1833 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
1834 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
1835 #define PPI_MASK (PPE_PER_PAGE - 1)
1836 #define PXI_MASK (PXE_PER_PAGE - 1)
1838 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
1839 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
1840 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
1841 #define PDE_BASE 0xFFFFF6FB40000000ULL
1842 #define PTE_BASE 0xFFFFF68000000000ULL
1843 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
1844 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
1845 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
1846 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
1848 extern NTKERNELAPI PVOID MmHighestUserAddress
;
1849 extern NTKERNELAPI PVOID MmSystemRangeStart
;
1850 extern NTKERNELAPI ULONG_PTR MmUserProbeAddress
;
1852 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
1853 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
1854 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
1855 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
1856 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
1857 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
1859 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
1860 #define SharedInterruptTime (&SharedUserData->InterruptTime)
1861 #define SharedSystemTime (&SharedUserData->SystemTime)
1862 #define SharedTickCount (&SharedUserData->TickCount)
1864 #define KeQueryInterruptTime() \
1865 (*(volatile ULONG64*)SharedInterruptTime)
1866 #define KeQuerySystemTime(CurrentCount) \
1867 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
1868 #define KeQueryTickCount(CurrentCount) \
1869 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
1871 typedef struct _KPCR
1873 __GNU_EXTENSION
union
1876 __GNU_EXTENSION
struct
1878 union _KGDTENTRY64
*GdtBase
;
1879 struct _KTSS64
*TssBase
;
1882 struct _KPRCB
*CurrentPrcb
;
1883 PKSPIN_LOCK_QUEUE LockArray
;
1887 union _KIDTENTRY64
*IdtBase
;
1890 UCHAR SecondLevelCacheAssociativity
;
1891 UCHAR ObsoleteNumber
;
1894 USHORT MajorVersion
;
1895 USHORT MinorVersion
;
1896 ULONG StallScaleFactor
;
1898 ULONG KernelReserved
[15];
1899 ULONG SecondLevelCacheSize
;
1900 ULONG HalReserved
[16];
1902 PVOID KdVersionBlock
;
1904 ULONG PcrAlign1
[24];
1907 typedef struct _KFLOATING_SAVE
{
1909 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
1915 return (PKPCR
)__readgsqword(FIELD_OFFSET(KPCR
, Self
));
1920 KeGetCurrentProcessorNumber(VOID
)
1922 return (ULONG
)__readgsword(0x184);
1925 #elif defined(__PowerPC__)
1928 // Used to contain PFNs and PFN counts
1930 typedef ULONG PFN_COUNT
;
1931 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
1932 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
1934 #define PASSIVE_LEVEL 0
1937 #define DISPATCH_LEVEL 2
1938 #define PROFILE_LEVEL 27
1939 #define CLOCK1_LEVEL 28
1940 #define CLOCK2_LEVEL 28
1941 #define IPI_LEVEL 29
1942 #define POWER_LEVEL 30
1943 #define HIGH_LEVEL 31
1945 typedef struct _KFLOATING_SAVE
{
1947 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
1949 typedef struct _KPCR_TIB
{
1950 PVOID ExceptionList
; /* 00 */
1951 PVOID StackBase
; /* 04 */
1952 PVOID StackLimit
; /* 08 */
1953 PVOID SubSystemTib
; /* 0C */
1954 _ANONYMOUS_UNION
union {
1955 PVOID FiberData
; /* 10 */
1956 ULONG Version
; /* 10 */
1958 PVOID ArbitraryUserPointer
; /* 14 */
1959 struct _KPCR_TIB
*Self
; /* 18 */
1960 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
1962 #define PCR_MINOR_VERSION 1
1963 #define PCR_MAJOR_VERSION 1
1965 typedef struct _KPCR
{
1966 KPCR_TIB Tib
; /* 00 */
1967 struct _KPCR
*Self
; /* 1C */
1968 struct _KPRCB
*Prcb
; /* 20 */
1969 KIRQL Irql
; /* 24 */
1971 ULONG IrrActive
; /* 2C */
1973 PVOID KdVersionBlock
; /* 34 */
1974 PUSHORT IDT
; /* 38 */
1975 PUSHORT GDT
; /* 3C */
1976 struct _KTSS
*TSS
; /* 40 */
1977 USHORT MajorVersion
; /* 44 */
1978 USHORT MinorVersion
; /* 46 */
1979 KAFFINITY SetMember
; /* 48 */
1980 ULONG StallScaleFactor
; /* 4C */
1981 UCHAR SpareUnused
; /* 50 */
1982 UCHAR Number
; /* 51 */
1983 } KPCR
, *PKPCR
; /* 54 */
1985 #define KeGetPcr() PCR
1990 KeGetCurrentProcessorNumber(VOID
)
1993 __asm__
__volatile__ (
1996 : "i" (FIELD_OFFSET(KPCR
, Number
))
2001 #elif defined(_MIPS_)
2003 #error MIPS Headers are totally incorrect
2006 // Used to contain PFNs and PFN counts
2008 typedef ULONG PFN_COUNT
;
2009 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
2010 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2012 #define PASSIVE_LEVEL 0
2014 #define DISPATCH_LEVEL 2
2015 #define PROFILE_LEVEL 27
2016 #define IPI_LEVEL 29
2017 #define HIGH_LEVEL 31
2019 typedef struct _KPCR
{
2020 struct _KPRCB
*Prcb
; /* 20 */
2021 KIRQL Irql
; /* 24 */
2026 #define KeGetPcr() PCR
2028 typedef struct _KFLOATING_SAVE
{
2029 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2034 KeGetCurrentProcessorNumber(VOID
)
2039 #elif defined(_M_ARM)
2042 // NT-ARM is not documented, need DDK-ARM
2047 #error Unknown architecture
2050 typedef enum _INTERLOCKED_RESULT
{
2051 ResultNegative
= RESULT_NEGATIVE
,
2052 ResultZero
= RESULT_ZERO
,
2053 ResultPositive
= RESULT_POSITIVE
2054 } INTERLOCKED_RESULT
;
2057 (NTAPI
*PciPin2Line
)(
2058 IN
struct _BUS_HANDLER
*BusHandler
,
2059 IN
struct _BUS_HANDLER
*RootHandler
,
2060 IN PCI_SLOT_NUMBER SlotNumber
,
2061 IN PPCI_COMMON_CONFIG PciData
2065 (NTAPI
*PciLine2Pin
)(
2066 IN
struct _BUS_HANDLER
*BusHandler
,
2067 IN
struct _BUS_HANDLER
*RootHandler
,
2068 IN PCI_SLOT_NUMBER SlotNumber
,
2069 IN PPCI_COMMON_CONFIG PciNewData
,
2070 IN PPCI_COMMON_CONFIG PciOldData
2074 (NTAPI
*PciReadWriteConfig
)(
2075 IN
struct _BUS_HANDLER
*BusHandler
,
2076 IN PCI_SLOT_NUMBER Slot
,
2082 #define PCI_DATA_TAG ' ICP'
2083 #define PCI_DATA_VERSION 1
2085 typedef struct _PCIBUSDATA
2089 PciReadWriteConfig ReadConfig
;
2090 PciReadWriteConfig WriteConfig
;
2091 PciPin2Line Pin2Line
;
2092 PciLine2Pin Line2Pin
;
2093 PCI_SLOT_NUMBER ParentSlot
;
2095 } PCIBUSDATA
, *PPCIBUSDATA
;
2098 /** SPINLOCK FUNCTIONS ********************************************************/
2102 #if defined(WIN9X_COMPAT_SPINLOCK)
2107 KeInitializeSpinLock(
2108 IN PKSPIN_LOCK SpinLock
2115 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
2117 /* Clear the lock */
2127 IN PKSPIN_LOCK SpinLock
);
2133 IN PKSPIN_LOCK SpinLock
,
2139 KefAcquireSpinLockAtDpcLevel(
2140 IN PKSPIN_LOCK SpinLock
);
2145 KefReleaseSpinLockFromDpcLevel(
2146 IN PKSPIN_LOCK SpinLock
);
2148 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
2149 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
2150 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
2151 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
2153 #define KeGetDcacheFillSize() 1L
2155 #elif defined(_M_ARM) // !defined (_X86_)
2159 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
2161 /* Clear the lock */
2169 IN PKSPIN_LOCK SpinLock
);
2175 IN PKSPIN_LOCK SpinLock
,
2182 KefAcquireSpinLockAtDpcLevel(
2183 IN PKSPIN_LOCK SpinLock
);
2188 KefReleaseSpinLockFromDpcLevel(
2189 IN PKSPIN_LOCK SpinLock
);
2192 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
2193 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
2194 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
2195 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
2200 KeInitializeSpinLock(
2201 IN PKSPIN_LOCK SpinLock
);
2208 KeInitializeSpinLock(
2209 PKSPIN_LOCK SpinLock
)
2217 IN PKSPIN_LOCK SpinLock
,
2222 KeAcquireSpinLockAtDpcLevel(
2223 IN PKSPIN_LOCK SpinLock
);
2227 KeReleaseSpinLockFromDpcLevel(
2228 IN PKSPIN_LOCK SpinLock
);
2232 KeAcquireSpinLockRaiseToDpc(
2233 IN PKSPIN_LOCK SpinLock
);
2235 #define KeAcquireSpinLock(SpinLock, OldIrql) \
2236 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
2238 #endif // !defined (_X86_)
2240 #define ARGUMENT_PRESENT(ArgumentPointer) \
2241 ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
2248 IN ULONG Base OPTIONAL
,
2249 IN OUT PULONG Value
);
2257 BOOLEAN CaseInSensitive
);
2259 #if !defined(MIDL_PASS)
2264 RtlConvertLongToLuid(
2270 Temp
.QuadPart
= Val
;
2271 Luid
.LowPart
= Temp
.u
.LowPart
;
2272 Luid
.HighPart
= Temp
.u
.HighPart
;
2280 RtlConvertUlongToLuid(
2297 IN VOID UNALIGNED
*Destination
,
2298 IN CONST VOID UNALIGNED
*Source
,
2305 IN OUT PSTRING DestinationString
,
2306 IN PSTRING SourceString OPTIONAL
);
2314 IN BOOLEAN CaseInSensitive
);
2316 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
2317 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
2318 *CallersAddress = (PVOID)_ReturnAddress(); \
2319 *CallersCaller = NULL;
2324 RtlGetCallersAddress(
2325 OUT PVOID
*CallersAddress
,
2326 OUT PVOID
*CallersCaller
);
2333 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
2339 IN OUT PACCESS_MASK AccessMask
,
2340 IN PGENERIC_MAPPING GenericMapping
);
2345 RtlPrefixUnicodeString(
2346 IN PCUNICODE_STRING String1
,
2347 IN PCUNICODE_STRING String2
,
2348 IN BOOLEAN CaseInSensitive
);
2353 RtlUpcaseUnicodeString(
2354 IN OUT PUNICODE_STRING DestinationString OPTIONAL
,
2355 IN PCUNICODE_STRING SourceString
,
2356 IN BOOLEAN AllocateDestinationString
);
2368 IN OUT PSTRING DestinationString
,
2369 IN PSTRING SourceString
);
2374 RtlVerifyVersionInfo(
2375 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
2377 IN ULONGLONG ConditionMask
);
2382 RtlVolumeDeviceToDosName(
2383 IN PVOID VolumeDeviceObject
,
2384 OUT PUNICODE_STRING DosName
);
2394 /******************************************************************************
2396 ******************************************************************************/
2398 typedef struct _ZONE_SEGMENT_HEADER
{
2399 SINGLE_LIST_ENTRY SegmentList
;
2401 } ZONE_SEGMENT_HEADER
, *PZONE_SEGMENT_HEADER
;
2403 typedef struct _ZONE_HEADER
{
2404 SINGLE_LIST_ENTRY FreeList
;
2405 SINGLE_LIST_ENTRY SegmentList
;
2407 ULONG TotalSegmentSize
;
2408 } ZONE_HEADER
, *PZONE_HEADER
;
2410 #define PROTECTED_POOL 0x80000000
2412 /******************************************************************************
2413 * Executive Functions *
2414 ******************************************************************************/
2420 IN PZONE_HEADER Zone
,
2422 IN ULONG SegmentSize
);
2424 static __inline PVOID
2426 IN PZONE_HEADER Zone
)
2428 if (Zone
->FreeList
.Next
)
2429 Zone
->FreeList
.Next
= Zone
->FreeList
.Next
->Next
;
2430 return (PVOID
) Zone
->FreeList
.Next
;
2433 static __inline PVOID
2435 IN PZONE_HEADER Zone
,
2438 ((PSINGLE_LIST_ENTRY
) Block
)->Next
= Zone
->FreeList
.Next
;
2439 Zone
->FreeList
.Next
= ((PSINGLE_LIST_ENTRY
) Block
);
2440 return ((PSINGLE_LIST_ENTRY
) Block
)->Next
;
2447 IN PZONE_HEADER Zone
,
2449 IN PVOID InitialSegment
,
2450 IN ULONG InitialSegmentSize
);
2454 * ExInterlockedAllocateFromZone(
2455 * IN PZONE_HEADER Zone,
2456 * IN PKSPIN_LOCK Lock)
2458 #define ExInterlockedAllocateFromZone(Zone, Lock) \
2459 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
2464 ExInterlockedExtendZone(
2465 IN PZONE_HEADER Zone
,
2467 IN ULONG SegmentSize
,
2468 IN PKSPIN_LOCK Lock
);
2471 * ExInterlockedFreeToZone(
2472 * IN PZONE_HEADER Zone,
2474 * IN PKSPIN_LOCK Lock);
2476 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
2477 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
2482 * IN PZONE_HEADER Zone)
2484 #define ExIsFullZone(Zone) \
2485 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
2488 * ExIsObjectInFirstZoneSegment(
2489 * IN PZONE_HEADER Zone,
2492 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
2493 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
2494 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
2495 (Zone)->TotalSegmentSize)) )
2501 ExRaiseAccessViolation(
2508 ExRaiseDatatypeMisalignment(
2517 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
2518 #define ExAcquireResourceShared ExAcquireResourceSharedLite
2519 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
2520 #define ExDeleteResource ExDeleteResourceLite
2521 #define ExInitializeResource ExInitializeResourceLite
2522 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
2523 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
2524 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
2525 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
2527 /** Filesystem runtime library routines **/
2532 FsRtlIsTotalDeviceFailure(
2533 IN NTSTATUS Status
);
2535 /** Hardware abstraction layer routines **/
2541 IN ULONG Frequency
);
2547 IN PDEVICE_OBJECT DeviceObject
,
2548 IN ULONG SectorSize
,
2549 IN ULONG MBRTypeIdentifier
,
2555 PADAPTER_OBJECT AdapterObject
2558 /** I/O manager routines **/
2563 IoAllocateController(
2564 IN PCONTROLLER_OBJECT ControllerObject
,
2565 IN PDEVICE_OBJECT DeviceObject
,
2566 IN PDRIVER_CONTROL ExecutionRoutine
,
2570 * VOID IoAssignArcName(
2571 * IN PUNICODE_STRING ArcName,
2572 * IN PUNICODE_STRING DeviceName);
2574 #define IoAssignArcName(_ArcName, _DeviceName) ( \
2575 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
2581 IN PDEVICE_OBJECT DeviceObject
,
2582 IN PFILE_OBJECT FileObject
);
2594 IN PDEVICE_OBJECT DeviceObject
,
2595 IN PCREATE_DISK Disk
);
2601 IN PCONTROLLER_OBJECT ControllerObject
);
2605 * IoDeassignArcName(
2606 * IN PUNICODE_STRING ArcName)
2608 #define IoDeassignArcName IoDeleteSymbolicLink
2614 IN PCONTROLLER_OBJECT ControllerObject
);
2617 PCONFIGURATION_INFORMATION
2619 IoGetConfigurationInformation(
2625 IoGetDeviceToVerify(
2626 IN PETHREAD Thread
);
2631 IoGetFileObjectGenericMapping(
2637 IoMakeAssociatedIrp(
2639 IN CCHAR StackSize
);
2644 IoQueryDeviceDescription(
2645 IN PINTERFACE_TYPE BusType OPTIONAL
,
2646 IN PULONG BusNumber OPTIONAL
,
2647 IN PCONFIGURATION_TYPE ControllerType OPTIONAL
,
2648 IN PULONG ControllerNumber OPTIONAL
,
2649 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL
,
2650 IN PULONG PeripheralNumber OPTIONAL
,
2651 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
,
2659 IN PVPB Vpb OPTIONAL
,
2660 IN PDEVICE_OBJECT RealDeviceObject
);
2665 IoRaiseInformationalHardError(
2666 IN NTSTATUS ErrorStatus
,
2667 IN PUNICODE_STRING String OPTIONAL
,
2668 IN PKTHREAD Thread OPTIONAL
);
2673 IoReadDiskSignature(
2674 IN PDEVICE_OBJECT DeviceObject
,
2675 IN ULONG BytesPerSector
,
2676 OUT PDISK_SIGNATURE Signature
);
2681 IoReadPartitionTable(
2682 IN PDEVICE_OBJECT DeviceObject
,
2683 IN ULONG SectorSize
,
2684 IN BOOLEAN ReturnRecognizedPartitions
,
2685 OUT
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
2690 IoReadPartitionTableEx(
2691 IN PDEVICE_OBJECT DeviceObject
,
2692 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
**PartitionBuffer
);
2697 IoRegisterBootDriverReinitialization(
2698 IN PDRIVER_OBJECT DriverObject
,
2699 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
2705 IoRegisterBootDriverReinitialization(
2706 IN PDRIVER_OBJECT DriverObject
,
2707 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
2713 IoRegisterDriverReinitialization(
2714 IN PDRIVER_OBJECT DriverObject
,
2715 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
2721 IoReportDetectedDevice(
2722 IN PDRIVER_OBJECT DriverObject
,
2723 IN INTERFACE_TYPE LegacyBusType
,
2725 IN ULONG SlotNumber
,
2726 IN PCM_RESOURCE_LIST ResourceList
,
2727 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL
,
2728 IN BOOLEAN ResourceAssigned
,
2729 IN OUT PDEVICE_OBJECT
*DeviceObject
);
2734 IoReportResourceForDetection(
2735 IN PDRIVER_OBJECT DriverObject
,
2736 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
2737 IN ULONG DriverListSize OPTIONAL
,
2738 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
2739 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
2740 IN ULONG DeviceListSize OPTIONAL
,
2741 OUT PBOOLEAN ConflictDetected
);
2746 IoReportResourceUsage(
2747 IN PUNICODE_STRING DriverClassName OPTIONAL
,
2748 IN PDRIVER_OBJECT DriverObject
,
2749 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
2750 IN ULONG DriverListSize OPTIONAL
,
2751 IN PDEVICE_OBJECT DeviceObject
,
2752 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
2753 IN ULONG DeviceListSize OPTIONAL
,
2754 IN BOOLEAN OverrideConflict
,
2755 OUT PBOOLEAN ConflictDetected
);
2760 IoSetHardErrorOrVerifyDevice(
2762 IN PDEVICE_OBJECT DeviceObject
);
2767 IoSetPartitionInformation(
2768 IN PDEVICE_OBJECT DeviceObject
,
2769 IN ULONG SectorSize
,
2770 IN ULONG PartitionNumber
,
2771 IN ULONG PartitionType
);
2776 IoSetPartitionInformationEx(
2777 IN PDEVICE_OBJECT DeviceObject
,
2778 IN ULONG PartitionNumber
,
2779 IN
struct _SET_PARTITION_INFORMATION_EX
*PartitionInfo
);
2784 IoSetSystemPartition(
2785 IN PUNICODE_STRING VolumeNameString
);
2790 IoSetThreadHardErrorMode(
2791 IN BOOLEAN EnableHardErrors
);
2796 IoVerifyPartitionTable(
2797 IN PDEVICE_OBJECT DeviceObject
,
2798 IN BOOLEAN FixErrors
);
2803 IoVolumeDeviceToDosName(
2804 IN PVOID VolumeDeviceObject
,
2805 OUT PUNICODE_STRING DosName
);
2810 IoWritePartitionTable(
2811 IN PDEVICE_OBJECT DeviceObject
,
2812 IN ULONG SectorSize
,
2813 IN ULONG SectorsPerTrack
,
2814 IN ULONG NumberOfHeads
,
2815 IN
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
2820 IoWritePartitionTableEx(
2821 IN PDEVICE_OBJECT DeviceObject
,
2822 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
*PartitionBuffer
);
2824 /** Kernel routines **/
2831 IN ULONG BugCheckCode
);
2840 volatile LONG Barrier
;
2841 #if defined(__GNUC__)
2842 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
2843 #elif defined(_MSC_VER)
2844 __asm xchg
[Barrier
], eax
2855 IN KPRIORITY Increment
,
2861 KeQueryActiveProcessors(
2868 KeQueryPerformanceCounter(
2869 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
2874 KeQueryPriorityThread(
2875 IN PRKTHREAD Thread
);
2880 KeQueryRuntimeThread(
2882 OUT PULONG UserTime
);
2884 #if !defined(_M_AMD64)
2888 KeQueryInterruptTime(
2895 OUT PLARGE_INTEGER CurrentTime
);
2901 OUT PLARGE_INTEGER TickCount
);
2907 KeQueryTimeIncrement(
2926 KeReadStateSemaphore(
2927 IN PRKSEMAPHORE Semaphore
);
2938 KeRegisterBugCheckCallback(
2939 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
2940 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
2943 IN PUCHAR Component
);
2948 KeRegisterNmiCallback(
2949 IN PNMI_CALLBACK CallbackRoutine
,
2956 KeDeregisterNmiCallback(
2963 KeReleaseInStackQueuedSpinLockFromDpcLevel(
2964 IN PKLOCK_QUEUE_HANDLE LockHandle
);
2969 KeReleaseInterruptSpinLock(
2970 IN PKINTERRUPT Interrupt
,
2984 IN PRKSEMAPHORE Semaphore
,
2985 IN KPRIORITY Increment
,
2990 PKDEVICE_QUEUE_ENTRY
2992 KeRemoveByKeyDeviceQueue(
2993 IN PKDEVICE_QUEUE DeviceQueue
,
2997 PKDEVICE_QUEUE_ENTRY
2999 KeRemoveDeviceQueue(
3000 IN PKDEVICE_QUEUE DeviceQueue
);
3005 KeRemoveEntryDeviceQueue(
3006 IN PKDEVICE_QUEUE DeviceQueue
,
3007 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
3024 KeRestoreFloatingPointState(
3025 IN PKFLOATING_SAVE FloatSave
);
3030 KeRevertToUserAffinityThread(VOID
);
3035 KeSaveFloatingPointState(
3036 OUT PKFLOATING_SAVE FloatSave
);
3041 KeSetBasePriorityThread(
3042 IN PRKTHREAD Thread
,
3050 IN KPRIORITY Increment
,
3058 IN KDPC_IMPORTANCE Importance
);
3063 KeSetPriorityThread(
3065 IN KPRIORITY Priority
);
3070 KeSetSystemAffinityThread(
3071 IN KAFFINITY Affinity
);
3076 KeSetTargetProcessorDpc(
3085 IN LARGE_INTEGER DueTime
,
3086 IN PKDPC Dpc OPTIONAL
);
3093 IN LARGE_INTEGER DueTime
,
3094 IN LONG Period OPTIONAL
,
3095 IN PKDPC Dpc OPTIONAL
);
3100 KeSetTimeUpdateNotifyRoutine(
3101 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
);
3106 KeStallExecutionProcessor(
3107 IN ULONG MicroSeconds
);
3112 KeSynchronizeExecution(
3113 IN PKINTERRUPT Interrupt
,
3114 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
3115 IN PVOID SynchronizeContext
);
3120 KeWaitForMultipleObjects(
3123 IN WAIT_TYPE WaitType
,
3124 IN KWAIT_REASON WaitReason
,
3125 IN KPROCESSOR_MODE WaitMode
,
3126 IN BOOLEAN Alertable
,
3127 IN PLARGE_INTEGER Timeout OPTIONAL
,
3128 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
3133 KeWaitForMutexObject(
3135 IN KWAIT_REASON WaitReason
,
3136 IN KPROCESSOR_MODE WaitMode
,
3137 IN BOOLEAN Alertable
,
3138 IN PLARGE_INTEGER Timeout OPTIONAL
);
3143 KeWaitForSingleObject(
3145 IN KWAIT_REASON WaitReason
,
3146 IN KPROCESSOR_MODE WaitMode
,
3147 IN BOOLEAN Alertable
,
3148 IN PLARGE_INTEGER Timeout OPTIONAL
);
3152 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
3153 IN ULONG_PTR Argument
3160 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
3161 IN ULONG_PTR Context
3181 KeRaiseIrqlToDpcLevel(
3187 KeRaiseIrqlToSynchLevel(
3190 #define KeLowerIrql(a) KfLowerIrql(a)
3191 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
3193 #elif defined(_M_AMD64)
3197 KeGetCurrentIrql(VOID
)
3199 return (KIRQL
)__readcr8();
3204 KeLowerIrql(IN KIRQL NewIrql
)
3206 ASSERT(KeGetCurrentIrql() >= NewIrql
);
3207 __writecr8(NewIrql
);
3212 KfRaiseIrql(IN KIRQL NewIrql
)
3216 OldIrql
= __readcr8();
3217 ASSERT(OldIrql
<= NewIrql
);
3218 __writecr8(NewIrql
);
3221 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
3225 KeRaiseIrqlToDpcLevel(VOID
)
3227 return KfRaiseIrql(DISPATCH_LEVEL
);
3232 KeRaiseIrqlToSynchLevel(VOID
)
3234 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
3237 #elif defined(__PowerPC__)
3254 KeRaiseIrqlToDpcLevel(
3260 KeRaiseIrqlToSynchLevel(
3263 #define KeLowerIrql(a) KfLowerIrql(a)
3264 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
3266 #elif defined(_M_MIPS)
3268 #define KeLowerIrql(a) KfLowerIrql(a)
3269 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
3286 KeRaiseIrqlToDpcLevel(
3292 KeRaiseIrqlToSynchLevel(
3295 #elif defined(_M_ARM)
3312 OUT PKIRQL OldIrql
);
3317 KeRaiseIrqlToDpcLevel(
3323 KeRaiseIrqlToSynchLevel(
3328 /** Memory manager routines **/
3335 IN ULONG NumberOfBytes
);
3340 MmAllocateContiguousMemory(
3341 IN ULONG NumberOfBytes
,
3342 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
3347 MmAllocateContiguousMemorySpecifyCache(
3348 IN SIZE_T NumberOfBytes
,
3349 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
3350 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
3351 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
3352 IN MEMORY_CACHING_TYPE CacheType
);
3357 MmAllocateMappingAddress(
3358 IN SIZE_T NumberOfBytes
,
3364 MmAllocateNonCachedMemory(
3365 IN ULONG NumberOfBytes
);
3370 MmAllocatePagesForMdl(
3371 IN PHYSICAL_ADDRESS LowAddress
,
3372 IN PHYSICAL_ADDRESS HighAddress
,
3373 IN PHYSICAL_ADDRESS SkipBytes
,
3374 IN SIZE_T TotalBytes
);
3376 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3380 MmAllocatePagesForMdlEx(
3381 IN PHYSICAL_ADDRESS LowAddress
,
3382 IN PHYSICAL_ADDRESS HighAddress
,
3383 IN PHYSICAL_ADDRESS SkipBytes
,
3384 IN SIZE_T TotalBytes
,
3385 IN MEMORY_CACHING_TYPE CacheType
,
3392 MmBuildMdlForNonPagedPool(
3393 IN OUT PMDL MemoryDescriptorList
);
3395 typedef enum _MMFLUSH_TYPE
{
3403 MmFlushImageSection(
3404 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
3405 IN MMFLUSH_TYPE FlushType
);
3410 MmFreeContiguousMemory(
3411 IN PVOID BaseAddress
);
3416 MmFreeContiguousMemorySpecifyCache(
3417 IN PVOID BaseAddress
,
3418 IN SIZE_T NumberOfBytes
,
3419 IN MEMORY_CACHING_TYPE CacheType
);
3424 MmFreeMappingAddress(
3425 IN PVOID BaseAddress
,
3431 MmFreeNonCachedMemory(
3432 IN PVOID BaseAddress
,
3433 IN SIZE_T NumberOfBytes
);
3439 IN PMDL MemoryDescriptorList
);
3443 * MmGetMdlByteCount(
3446 #define MmGetMdlByteCount(_Mdl) \
3451 * MmGetMdlByteOffset(
3454 #define MmGetMdlByteOffset(_Mdl) \
3455 ((_Mdl)->ByteOffset)
3462 #define MmGetMdlPfnArray(_Mdl) \
3463 ((PPFN_NUMBER) ((_Mdl) + 1))
3467 * MmGetMdlVirtualAddress(
3470 #define MmGetMdlVirtualAddress(_Mdl) \
3471 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
3476 MmGetPhysicalAddress(
3477 IN PVOID BaseAddress
);
3480 PPHYSICAL_MEMORY_RANGE
3482 MmGetPhysicalMemoryRanges(
3488 MmGetVirtualForPhysical(
3489 IN PHYSICAL_ADDRESS PhysicalAddress
);
3494 MmMapLockedPagesSpecifyCache(
3495 IN PMDL MemoryDescriptorList
,
3496 IN KPROCESSOR_MODE AccessMode
,
3497 IN MEMORY_CACHING_TYPE CacheType
,
3498 IN PVOID BaseAddress
,
3499 IN ULONG BugCheckOnFailure
,
3500 IN MM_PAGE_PRIORITY Priority
);
3505 MmMapLockedPagesWithReservedMapping(
3506 IN PVOID MappingAddress
,
3508 IN PMDL MemoryDescriptorList
,
3509 IN MEMORY_CACHING_TYPE CacheType
);
3514 MmMapUserAddressesToPage(
3515 IN PVOID BaseAddress
,
3516 IN SIZE_T NumberOfBytes
,
3517 IN PVOID PageAddress
);
3523 IN PHYSICAL_ADDRESS PhysicalAddress
,
3524 IN SIZE_T NumberOfBytes
,
3525 IN MEMORY_CACHING_TYPE CacheType
);
3530 MmMapViewInSessionSpace(
3532 OUT PVOID
*MappedBase
,
3533 IN OUT PSIZE_T ViewSize
);
3538 MmMapViewInSystemSpace(
3540 OUT PVOID
*MappedBase
,
3541 IN PSIZE_T ViewSize
);
3546 MmMarkPhysicalMemoryAsBad(
3547 IN PPHYSICAL_ADDRESS StartAddress
,
3548 IN OUT PLARGE_INTEGER NumberOfBytes
);
3553 MmMarkPhysicalMemoryAsGood(
3554 IN PPHYSICAL_ADDRESS StartAddress
,
3555 IN OUT PLARGE_INTEGER NumberOfBytes
);
3560 MmGetSystemRoutineAddress(
3561 IN PUNICODE_STRING SystemRoutineName
);
3565 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
3569 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
3571 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
3572 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
3577 * IN PMDL MemoryDescriptorList,
3581 #define MmInitializeMdl(_MemoryDescriptorList, \
3585 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
3586 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
3587 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
3588 (_MemoryDescriptorList)->MdlFlags = 0; \
3589 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
3590 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
3591 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
3598 IN PVOID VirtualAddress
);
3603 MmIsDriverVerifying(
3604 IN PDRIVER_OBJECT DriverObject
);
3609 MmIsThisAnNtAsSystem(
3615 MmIsVerifierEnabled(
3616 OUT PULONG VerifierFlags
);
3621 MmLockPagableDataSection(
3622 IN PVOID AddressWithinSection
);
3627 MmLockPagableImageSection(
3628 IN PVOID AddressWithinSection
);
3632 * MmLockPagableCodeSection(
3633 * IN PVOID AddressWithinSection)
3635 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
3640 MmLockPagableSectionByHandle(
3641 IN PVOID ImageSectionHandle
);
3647 IN PHYSICAL_ADDRESS PhysicalAddress
,
3648 IN ULONG NumberOfBytes
,
3649 IN MEMORY_CACHING_TYPE CacheEnable
);
3655 IN PMDL MemoryDescriptorList
,
3656 IN KPROCESSOR_MODE AccessMode
);
3661 MmLockPageableDataSection (
3662 IN PVOID AddressWithinSection
3668 MmUnlockPageableImageSection(
3669 IN PVOID ImageSectionHandle
3676 IN PVOID AddressWithinSection
);
3681 MmProbeAndLockProcessPages(
3682 IN OUT PMDL MemoryDescriptorList
,
3683 IN PEPROCESS Process
,
3684 IN KPROCESSOR_MODE AccessMode
,
3685 IN LOCK_OPERATION Operation
);
3690 MmProtectMdlSystemAddress(
3691 IN PMDL MemoryDescriptorList
,
3692 IN ULONG NewProtect
);
3698 IN PVOID BaseAddress
,
3699 IN PMDL MemoryDescriptorList
);
3704 MmUnmapViewInSessionSpace(
3705 IN PVOID MappedBase
);
3710 MmUnmapViewInSystemSpace(
3711 IN PVOID MappedBase
);
3716 MmUnsecureVirtualMemory(
3717 IN HANDLE SecureHandle
);
3721 * MmPrepareMdlForReuse(
3724 #define MmPrepareMdlForReuse(_Mdl) \
3726 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
3727 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
3728 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
3729 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
3730 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
3734 #define MmGetProcedureAddress(Address) (Address)
3739 MmProbeAndLockPages(
3740 IN OUT PMDL MemoryDescriptorList
,
3741 IN KPROCESSOR_MODE AccessMode
,
3742 IN LOCK_OPERATION Operation
);
3753 MmRemovePhysicalMemory(
3754 IN PPHYSICAL_ADDRESS StartAddress
,
3755 IN OUT PLARGE_INTEGER NumberOfBytes
);
3760 MmResetDriverPaging(
3761 IN PVOID AddressWithinSection
);
3766 MmSecureVirtualMemory(
3769 IN ULONG ProbeMode
);
3781 MmUnlockPagableImageSection(
3782 IN PVOID ImageSectionHandle
);
3788 IN PMDL MemoryDescriptorList
);
3794 IN PVOID BaseAddress
,
3795 IN SIZE_T NumberOfBytes
);
3800 MmUnmapReservedMapping(
3801 IN PVOID BaseAddress
,
3803 IN PMDL MemoryDescriptorList
);
3808 MmUnmapVideoDisplay(
3809 IN PVOID BaseAddress
,
3810 IN SIZE_T NumberOfBytes
);
3814 /** Object manager routines **/
3820 IN PACCESS_STATE AccessState
,
3821 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
3823 IN POBJECT_TYPE Type
);
3828 ObDereferenceSecurityDescriptor(
3829 PSECURITY_DESCRIPTOR SecurityDescriptor
,
3835 ObfDereferenceObject(
3840 * ObDereferenceObject(
3843 #define ObDereferenceObject ObfDereferenceObject
3848 ObGetObjectSecurity(
3850 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
3851 OUT PBOOLEAN MemoryAllocated
);
3858 IN PACCESS_STATE PassedAccessState OPTIONAL
,
3859 IN ACCESS_MASK DesiredAccess
,
3860 IN ULONG AdditionalReferences
,
3861 OUT PVOID
* ReferencedObject OPTIONAL
,
3862 OUT PHANDLE Handle
);
3873 ObLogSecurityDescriptor(
3874 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor
,
3875 OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
3879 * ObReferenceObject(
3882 #define ObReferenceObject ObfReferenceObject
3887 ObMakeTemporaryObject(
3894 IN POBJECT_ATTRIBUTES ObjectAttributes
,
3895 IN POBJECT_TYPE ObjectType
,
3896 IN KPROCESSOR_MODE AccessMode
,
3897 IN PACCESS_STATE PassedAccessState
,
3898 IN ACCESS_MASK DesiredAccess
,
3899 IN OUT PVOID ParseContext OPTIONAL
,
3900 OUT PHANDLE Handle
);
3905 ObOpenObjectByPointer(
3907 IN ULONG HandleAttributes
,
3908 IN PACCESS_STATE PassedAccessState OPTIONAL
,
3909 IN ACCESS_MASK DesiredAccess OPTIONAL
,
3910 IN POBJECT_TYPE ObjectType OPTIONAL
,
3911 IN KPROCESSOR_MODE AccessMode
,
3912 OUT PHANDLE Handle
);
3917 ObQueryObjectAuditingByHandle(
3919 OUT PBOOLEAN GenerateOnClose
);
3924 ObReferenceObjectByHandle(
3926 IN ACCESS_MASK DesiredAccess
,
3927 IN POBJECT_TYPE ObjectType OPTIONAL
,
3928 IN KPROCESSOR_MODE AccessMode
,
3930 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
3935 ObReferenceObjectByName(
3936 IN PUNICODE_STRING ObjectPath
,
3937 IN ULONG Attributes
,
3938 IN PACCESS_STATE PassedAccessState OPTIONAL
,
3939 IN ACCESS_MASK DesiredAccess OPTIONAL
,
3940 IN POBJECT_TYPE ObjectType
,
3941 IN KPROCESSOR_MODE AccessMode
,
3942 IN OUT PVOID ParseContext OPTIONAL
,
3948 ObReferenceObjectByPointer(
3950 IN ACCESS_MASK DesiredAccess
,
3951 IN POBJECT_TYPE ObjectType
,
3952 IN KPROCESSOR_MODE AccessMode
);
3957 ObReferenceSecurityDescriptor(
3958 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
3964 ObReleaseObjectSecurity(
3965 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
3966 IN BOOLEAN MemoryAllocated
);
3970 /** Process manager routines **/
3975 PsCreateSystemProcess(
3976 IN PHANDLE ProcessHandle
,
3977 IN ACCESS_MASK DesiredAccess
,
3978 IN POBJECT_ATTRIBUTES ObjectAttributes
);
3983 PsCreateSystemThread(
3984 OUT PHANDLE ThreadHandle
,
3985 IN ULONG DesiredAccess
,
3986 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
3987 IN HANDLE ProcessHandle OPTIONAL
,
3988 OUT PCLIENT_ID ClientId OPTIONAL
,
3989 IN PKSTART_ROUTINE StartRoutine
,
3990 IN PVOID StartContext
);
3994 * PsGetCurrentProcess(VOID)
3996 #define PsGetCurrentProcess IoGetCurrentProcess
4001 PsGetCurrentProcessId(
4006 * PsGetCurrentThread(VOID)
4008 #define PsGetCurrentThread() \
4009 ((PETHREAD) KeGetCurrentThread())
4014 PsGetCurrentThreadId(
4020 PsGetProcessId(PEPROCESS Process
);
4026 PULONG MajorVersion OPTIONAL
,
4027 PULONG MinorVersion OPTIONAL
,
4028 PULONG BuildNumber OPTIONAL
,
4029 PUNICODE_STRING CSDVersion OPTIONAL
);
4034 PsRemoveCreateThreadNotifyRoutine(
4035 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
4040 PsRemoveLoadImageNotifyRoutine(
4041 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
4046 PsSetCreateProcessNotifyRoutine(
4047 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine
,
4053 PsSetCreateThreadNotifyRoutine(
4054 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);