11 #endif /* GUID_DEFINED */
20 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
21 #define NTHALAPI DECLSPEC_IMPORT
26 #define NTKERNELAPI DECLSPEC_IMPORT
29 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
31 #define POINTER_ALIGNMENT
34 /* Helper macro to enable gcc's extension. */
35 #ifndef __GNU_EXTENSION
37 #define __GNU_EXTENSION __extension__
39 #define __GNU_EXTENSION
45 /* Indicate if #pragma alloc_text() is supported */
46 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
47 #define ALLOC_PRAGMA 1
50 /* Indicate if #pragma data_seg() is supported */
51 #if defined(_M_IX86) || defined(_M_AMD64)
52 #define ALLOC_DATA_PRAGMA 1
57 /* Forward declarations */
64 struct _DEVICE_OBJECT
;
65 struct _DRIVER_OBJECT
;
66 struct _IO_STATUS_BLOCK
;
67 struct _DEVICE_DESCRIPTION
;
68 struct _SCATTER_GATHER_LIST
;
69 struct _DRIVE_LAYOUT_INFORMATION
;
70 struct _COMPRESSED_DATA_INFO
;
71 struct _IO_RESOURCE_DESCRIPTOR
;
73 /* Structures not exposed to drivers */
74 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
75 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
76 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
77 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
78 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
79 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
80 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
81 typedef struct _ETHREAD
*PETHREAD
;
82 typedef struct _EPROCESS
*PEPROCESS
;
83 typedef struct _IO_TIMER
*PIO_TIMER
;
84 typedef struct _KINTERRUPT
*PKINTERRUPT
;
85 typedef struct _KPROCESS
*PKPROCESS
;
86 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
87 typedef struct _CONTEXT
*PCONTEXT
;
90 /******************************************************************************
91 * INTERLOCKED Functions *
92 ******************************************************************************/
94 // Intrinsics (note: taken from our winnt.h)
99 static __inline__ BOOLEAN
100 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
105 __asm__
__volatile__("lock "
108 :"=r" (OldBit
),"+m" (*Base
)
113 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
117 static __inline__ BOOLEAN
118 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
123 __asm__
__volatile__("lock "
126 :"=r" (OldBit
),"+m" (*Base
)
131 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
137 #define BitScanForward _BitScanForward
138 #define BitScanReverse _BitScanReverse
139 #define BitTest _bittest
140 #define BitTestAndComplement _bittestandcomplement
141 #define BitTestAndSet _bittestandset
142 #define BitTestAndReset _bittestandreset
143 #define InterlockedBitTestAndSet _interlockedbittestandset
144 #define InterlockedBitTestAndReset _interlockedbittestandreset
147 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
148 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
151 #if !defined(__INTERLOCKED_DECLARED)
152 #define __INTERLOCKED_DECLARED
155 #if defined(NO_INTERLOCKED_INTRINSICS)
159 InterlockedIncrement(
160 IN OUT LONG
volatile *Addend
);
165 InterlockedDecrement(
166 IN OUT LONG
volatile *Addend
);
171 InterlockedCompareExchange(
172 IN OUT LONG
volatile *Destination
,
180 IN OUT LONG
volatile *Destination
,
186 InterlockedExchangeAdd(
187 IN OUT LONG
volatile *Addend
,
190 #else // !defined(NO_INTERLOCKED_INTRINSICS)
192 #define InterlockedExchange _InterlockedExchange
193 #define InterlockedIncrement _InterlockedIncrement
194 #define InterlockedDecrement _InterlockedDecrement
195 #define InterlockedExchangeAdd _InterlockedExchangeAdd
196 #define InterlockedCompareExchange _InterlockedCompareExchange
197 #define InterlockedOr _InterlockedOr
198 #define InterlockedAnd _InterlockedAnd
199 #define InterlockedXor _InterlockedXor
201 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
203 #endif // defined (_X86_)
205 #if !defined (_WIN64)
208 * InterlockedExchangePointer(
209 * IN OUT PVOID volatile *Target,
212 #define InterlockedExchangePointer(Target, Value) \
213 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
217 * InterlockedCompareExchangePointer(
218 * IN OUT PVOID *Destination,
220 * IN PVOID Comparand)
222 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
223 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
225 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
226 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
227 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
229 #endif // !defined (_WIN64)
231 #if defined (_M_AMD64)
233 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
234 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
235 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
236 #define InterlockedAnd _InterlockedAnd
237 #define InterlockedOr _InterlockedOr
238 #define InterlockedXor _InterlockedXor
239 #define InterlockedIncrement _InterlockedIncrement
240 #define InterlockedDecrement _InterlockedDecrement
241 #define InterlockedAdd _InterlockedAdd
242 #define InterlockedExchange _InterlockedExchange
243 #define InterlockedExchangeAdd _InterlockedExchangeAdd
244 #define InterlockedCompareExchange _InterlockedCompareExchange
245 #define InterlockedAnd64 _InterlockedAnd64
246 #define InterlockedOr64 _InterlockedOr64
247 #define InterlockedXor64 _InterlockedXor64
248 #define InterlockedIncrement64 _InterlockedIncrement64
249 #define InterlockedDecrement64 _InterlockedDecrement64
250 #define InterlockedAdd64 _InterlockedAdd64
251 #define InterlockedExchange64 _InterlockedExchange64
252 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
253 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
254 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
255 #define InterlockedExchangePointer _InterlockedExchangePointer
256 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
257 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
261 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
262 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
266 IN OUT LONG64
volatile *Addend
,
269 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
274 #endif /* !__INTERLOCKED_DECLARED */
277 /******************************************************************************
279 ******************************************************************************/
281 typedef UCHAR KIRQL
, *PKIRQL
;
282 typedef UCHAR KPROCESSOR_MODE
;
283 typedef LONG KPRIORITY
;
291 /* Processor features */
292 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
293 #define PF_FLOATING_POINT_EMULATED 1
294 #define PF_COMPARE_EXCHANGE_DOUBLE 2
295 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
296 #define PF_PPC_MOVEMEM_64BIT_OK 4
297 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
298 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
299 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
300 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
301 #define PF_PAE_ENABLED 9
302 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
303 #define PF_SSE_DAZ_MODE_AVAILABLE 11
304 #define PF_NX_ENABLED 12
305 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
306 #define PF_COMPARE_EXCHANGE128 14
307 #define PF_COMPARE64_EXCHANGE128 15
308 #define PF_CHANNELS_ENABLED 16
310 #define MAXIMUM_SUPPORTED_EXTENSION 512
311 #define MAXIMUM_WAIT_OBJECTS 64
313 #define ASSERT_APC(Object) \
314 ASSERT((Object)->Type == ApcObject)
316 #define ASSERT_DPC(Object) \
317 ASSERT(((Object)->Type == 0) || \
318 ((Object)->Type == DpcObject) || \
319 ((Object)->Type == ThreadedDpcObject))
321 #define ASSERT_DEVICE_QUEUE(Object) \
322 ASSERT((Object)->Type == DeviceQueueObject)
325 #define DPC_THREADED 1
327 #define GM_LOCK_BIT 0x1
328 #define GM_LOCK_BIT_V 0x0
329 #define GM_LOCK_WAITER_WOKEN 0x2
330 #define GM_LOCK_WAITER_INC 0x4
332 #define LOCK_QUEUE_WAIT 1
333 #define LOCK_QUEUE_OWNER 2
334 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
335 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
337 #define PROCESSOR_FEATURE_MAX 64
339 #define DBG_STATUS_CONTROL_C 1
340 #define DBG_STATUS_SYSRQ 2
341 #define DBG_STATUS_BUGCHECK_FIRST 3
342 #define DBG_STATUS_BUGCHECK_SECOND 4
343 #define DBG_STATUS_FATAL 5
344 #define DBG_STATUS_DEBUG_CONTROL 6
345 #define DBG_STATUS_WORKER 7
347 #define KI_USER_SHARED_DATA 0xffdf0000
348 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
350 #define EFLAG_SIGN 0x8000
351 #define EFLAG_ZERO 0x4000
352 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
354 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
355 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
356 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
359 #define MAXIMUM_PROC_PER_GROUP 64
361 #define MAXIMUM_PROC_PER_GROUP 32
363 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
366 #define KIP0PCRADDRESS 0xffdff000
371 #define PASSIVE_LEVEL 0
374 #define DISPATCH_LEVEL 2
376 #define PROFILE_LEVEL 27
377 #define CLOCK1_LEVEL 28
378 #define CLOCK2_LEVEL 28
380 #define POWER_LEVEL 30
381 #define HIGH_LEVEL 31
382 #define CLOCK_LEVEL (CLOCK2_LEVEL)
384 typedef struct _KFLOATING_SAVE
{
393 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
399 #define PASSIVE_LEVEL 0
402 #define DISPATCH_LEVEL 2
404 #define CLOCK_LEVEL 13
407 #define POWER_LEVEL 14
408 #define PROFILE_LEVEL 15
409 #define HIGH_LEVEL 15
415 #define PASSIVE_LEVEL 0
418 #define DISPATCH_LEVEL 2
420 #define DEVICE_LEVEL_BASE 4
424 #define CLOCK_LEVEL 13
425 #define POWER_LEVEL 15
426 #define PROFILE_LEVEL 15
427 #define HIGH_LEVEL 15
431 /* Exception Records */
432 #define EXCEPTION_NONCONTINUABLE 1
433 #define EXCEPTION_MAXIMUM_PARAMETERS 15
435 typedef struct _EXCEPTION_RECORD
{
436 NTSTATUS ExceptionCode
;
437 ULONG ExceptionFlags
;
438 struct _EXCEPTION_RECORD
*ExceptionRecord
;
439 PVOID ExceptionAddress
;
440 ULONG NumberParameters
;
441 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
442 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
444 typedef struct _EXCEPTION_RECORD32
{
445 NTSTATUS ExceptionCode
;
446 ULONG ExceptionFlags
;
447 ULONG ExceptionRecord
;
448 ULONG ExceptionAddress
;
449 ULONG NumberParameters
;
450 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
451 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
453 typedef struct _EXCEPTION_RECORD64
{
454 NTSTATUS ExceptionCode
;
455 ULONG ExceptionFlags
;
456 ULONG64 ExceptionRecord
;
457 ULONG64 ExceptionAddress
;
458 ULONG NumberParameters
;
459 ULONG __unusedAlignment
;
460 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
461 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
463 typedef struct _EXCEPTION_POINTERS
{
464 PEXCEPTION_RECORD ExceptionRecord
;
465 PCONTEXT ContextRecord
;
466 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
469 typedef enum _KBUGCHECK_CALLBACK_REASON
{
472 KbCallbackSecondaryDumpData
,
475 } KBUGCHECK_CALLBACK_REASON
;
477 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
480 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
481 IN KBUGCHECK_CALLBACK_REASON Reason
,
482 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
483 IN OUT PVOID ReasonSpecificData
,
484 IN ULONG ReasonSpecificDataLength
);
486 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
488 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
491 KBUGCHECK_CALLBACK_REASON Reason
;
493 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
495 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
501 } KBUGCHECK_BUFFER_DUMP_STATE
;
504 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
508 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
510 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
516 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
519 (DDKAPI
*PNMI_CALLBACK
)(
523 typedef enum _KDPC_IMPORTANCE
{
530 typedef enum _TRACE_INFORMATION_CLASS
{
533 TraceEnableFlagsClass
,
534 TraceEnableLevelClass
,
535 GlobalLoggerHandleClass
,
536 EventLoggerHandleClass
,
537 AllLoggerHandlesClass
,
538 TraceHandleByNameClass
,
539 LoggerEventsLostClass
,
540 TraceSessionSettingsClass
,
541 LoggerEventsLoggedClass
,
542 MaxTraceInformationClass
543 } TRACE_INFORMATION_CLASS
;
545 typedef enum _KINTERRUPT_POLARITY
{
546 InterruptPolarityUnknown
,
549 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
551 typedef enum _KPROFILE_SOURCE
{
553 ProfileAlignmentFixup
,
556 ProfileLoadInstructions
,
557 ProfilePipelineFrozen
,
558 ProfileBranchInstructions
,
559 ProfileTotalNonissues
,
563 ProfileBranchMispredictions
,
564 ProfileStoreInstructions
,
565 ProfileFpInstructions
,
566 ProfileIntegerInstructions
,
570 ProfileSpecialInstructions
,
573 ProfileDcacheAccesses
,
574 ProfileMemoryBarrierCycles
,
575 ProfileLoadLinkedIssues
,
579 typedef enum _KWAIT_REASON
{
620 typedef struct _KWAIT_BLOCK
{
621 LIST_ENTRY WaitListEntry
;
622 struct _KTHREAD
*Thread
;
624 struct _KWAIT_BLOCK
*NextWaitBlock
;
627 volatile UCHAR BlockState
;
631 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
633 typedef enum _KINTERRUPT_MODE
{
638 #define THREAD_WAIT_OBJECTS 3
641 (DDKAPI
*PKINTERRUPT_ROUTINE
)(
644 typedef enum _KD_OPTION
{
645 KD_OPTION_SET_BLOCK_ENABLE
,
648 typedef enum _INTERFACE_TYPE
{
649 InterfaceTypeUndefined
= -1,
667 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
670 (DDKAPI
*PKNORMAL_ROUTINE
)(
671 IN PVOID NormalContext
,
672 IN PVOID SystemArgument1
,
673 IN PVOID SystemArgument2
);
676 (DDKAPI
*PKRUNDOWN_ROUTINE
)(
677 IN
struct _KAPC
*Apc
);
680 (DDKAPI
*PKKERNEL_ROUTINE
)(
681 IN
struct _KAPC
*Apc
,
682 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
683 IN OUT PVOID
*NormalContext
,
684 IN OUT PVOID
*SystemArgument1
,
685 IN OUT PVOID
*SystemArgument2
);
694 struct _KTHREAD
*Thread
;
695 LIST_ENTRY ApcListEntry
;
696 PKKERNEL_ROUTINE KernelRoutine
;
697 PKRUNDOWN_ROUTINE RundownRoutine
;
698 PKNORMAL_ROUTINE NormalRoutine
;
700 PVOID SystemArgument1
;
701 PVOID SystemArgument2
;
703 KPROCESSOR_MODE ApcMode
;
705 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
707 typedef struct _KDEVICE_QUEUE_ENTRY
{
708 LIST_ENTRY DeviceListEntry
;
711 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
712 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
714 typedef PVOID PKIPI_CONTEXT
;
718 (NTAPI
*PKIPI_WORKER
)(
719 IN PKIPI_CONTEXT PacketContext
,
727 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
728 IN ULONG_PTR Argument
);
730 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
732 typedef struct _KSPIN_LOCK_QUEUE
{
733 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
734 PKSPIN_LOCK
volatile Lock
;
735 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
737 typedef struct _KLOCK_QUEUE_HANDLE
{
738 KSPIN_LOCK_QUEUE LockQueue
;
740 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
744 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
746 #define LockQueueDispatcherLock 0
747 #define LockQueueExpansionLock 1
748 #define LockQueuePfnLock 2
749 #define LockQueueSystemSpaceLock 3
750 #define LockQueueVacbLock 4
751 #define LockQueueMasterLock 5
752 #define LockQueueNonPagedPoolLock 6
753 #define LockQueueIoCancelLock 7
754 #define LockQueueWorkQueueLock 8
755 #define LockQueueIoVpbLock 9
756 #define LockQueueIoDatabaseLock 10
757 #define LockQueueIoCompletionLock 11
758 #define LockQueueNtfsStructLock 12
759 #define LockQueueAfdWorkQueueLock 13
760 #define LockQueueBcbLock 14
761 #define LockQueueMmNonPagedPoolLock 15
762 #define LockQueueUnusedSpare16 16
763 #define LockQueueTimerTableLock 17
764 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
768 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
769 LockQueueDispatcherLock
,
770 LockQueueExpansionLock
,
772 LockQueueSystemSpaceLock
,
775 LockQueueNonPagedPoolLock
,
776 LockQueueIoCancelLock
,
777 LockQueueWorkQueueLock
,
779 LockQueueIoDatabaseLock
,
780 LockQueueIoCompletionLock
,
781 LockQueueNtfsStructLock
,
782 LockQueueAfdWorkQueueLock
,
784 LockQueueMmNonPagedPoolLock
,
785 LockQueueUnusedSpare16
,
786 LockQueueTimerTableLock
,
787 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
788 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
793 (DDKAPI
*PKDEFERRED_ROUTINE
)(
794 IN
struct _KDPC
*Dpc
,
795 IN PVOID DeferredContext
,
796 IN PVOID SystemArgument1
,
797 IN PVOID SystemArgument2
);
803 volatile USHORT Number
;
804 LIST_ENTRY DpcListEntry
;
805 PKDEFERRED_ROUTINE DeferredRoutine
;
806 PVOID DeferredContext
;
807 PVOID SystemArgument1
;
808 PVOID SystemArgument2
;
809 volatile PVOID DpcData
;
810 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
812 typedef struct _KDEVICE_QUEUE
{
815 LIST_ENTRY DeviceListHead
;
829 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
831 typedef struct _DISPATCHER_HEADER
833 __GNU_EXTENSION
union
835 __GNU_EXTENSION
struct
838 __GNU_EXTENSION
union
843 __GNU_EXTENSION
union
848 __GNU_EXTENSION
union
857 LIST_ENTRY WaitListHead
;
858 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
860 typedef struct _KGATE
862 DISPATCHER_HEADER Header
;
863 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
865 typedef struct _KGUARDED_MUTEX
871 __GNU_EXTENSION
union
873 __GNU_EXTENSION
struct
875 SHORT KernelApcDisable
;
876 SHORT SpecialApcDisable
;
878 ULONG CombinedApcDisable
;
880 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
882 typedef struct _KMUTANT
{
883 DISPATCHER_HEADER Header
;
884 LIST_ENTRY MutantListEntry
;
885 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
888 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
890 typedef struct _KTIMER
{
891 DISPATCHER_HEADER Header
;
892 ULARGE_INTEGER DueTime
;
893 LIST_ENTRY TimerListEntry
;
899 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
901 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
906 } ALTERNATIVE_ARCHITECTURE_TYPE
;
908 typedef struct _KSYSTEM_TIME
913 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
915 typedef struct _KEVENT
{
916 DISPATCHER_HEADER Header
;
917 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
919 typedef struct _KSEMAPHORE
{
920 DISPATCHER_HEADER Header
;
922 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
924 typedef struct _PNP_BUS_INFORMATION
{
926 INTERFACE_TYPE LegacyBusType
;
928 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
930 typedef struct DECLSPEC_ALIGN(16) _M128A
{
935 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
942 USHORT ErrorSelector
;
949 M128A FloatRegisters
[8];
953 M128A XmmRegisters
[16];
958 M128A XmmRegisters
[8];
959 UCHAR Reserved4
[192];
961 ULONG StackControl
[7];
966 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
970 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
975 /******************************************************************************
977 ******************************************************************************/
979 #if (NTDDI_VERSION >= NTDDI_WIN2K) && defined(SINGLE_GROUP_LEGACY_API)
982 KeQueryActiveProcessors (
986 #if !defined(_M_AMD64)
988 #if (NTDDI_VERSION >= NTDDI_WIN2K)
993 KeQueryInterruptTime(
1000 OUT PLARGE_INTEGER CurrentTime
);
1006 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1013 IN ULONG BugCheckCode
,
1014 IN ULONG_PTR BugCheckParameter1
,
1015 IN ULONG_PTR BugCheckParameter2
,
1016 IN ULONG_PTR BugCheckParameter3
,
1017 IN ULONG_PTR BugCheckParameter4
);
1028 KeDelayExecutionThread(
1029 IN KPROCESSOR_MODE WaitMode
,
1030 IN BOOLEAN Alertable
,
1031 IN PLARGE_INTEGER Interval
);
1036 KeDeregisterBugCheckCallback(
1037 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
1042 KeEnterCriticalRegion(VOID
);
1047 KeInitializeDeviceQueue(
1048 OUT PKDEVICE_QUEUE DeviceQueue
);
1060 KeInitializeSemaphore(
1061 OUT PRKSEMAPHORE Semaphore
,
1074 KeInitializeTimerEx(
1076 IN TIMER_TYPE Type
);
1081 KeInsertByKeyDeviceQueue(
1082 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1083 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
1089 KeInsertDeviceQueue(
1090 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1091 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
1098 IN PVOID SystemArgument1 OPTIONAL
,
1099 IN PVOID SystemArgument2 OPTIONAL
);
1104 KeLeaveCriticalRegion(VOID
);
1109 KeQueryPerformanceCounter(
1110 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
1115 KeQueryPriorityThread(
1116 IN PRKTHREAD Thread
);
1121 KeQueryTimeIncrement(
1140 KeReadStateSemaphore(
1141 IN PRKSEMAPHORE Semaphore
);
1152 KeRegisterBugCheckCallback(
1153 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
1154 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
1157 IN PUCHAR Component
);
1163 IN OUT PRKMUTEX Mutex
,
1170 IN OUT PRKSEMAPHORE Semaphore
,
1171 IN KPRIORITY Increment
,
1176 PKDEVICE_QUEUE_ENTRY
1178 KeRemoveByKeyDeviceQueue(
1179 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1183 PKDEVICE_QUEUE_ENTRY
1185 KeRemoveDeviceQueue(
1186 IN OUT PKDEVICE_QUEUE DeviceQueue
);
1191 KeRemoveEntryDeviceQueue(
1192 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1193 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
1205 IN OUT PRKEVENT Event
);
1211 IN OUT PRKEVENT Event
,
1212 IN KPRIORITY Increment
,
1220 IN KDPC_IMPORTANCE Importance
);
1225 KeSetPriorityThread(
1226 IN OUT PKTHREAD Thread
,
1227 IN KPRIORITY Priority
);
1233 IN OUT PKTIMER Timer
,
1234 IN LARGE_INTEGER DueTime
,
1235 IN PKDPC Dpc OPTIONAL
);
1241 IN OUT PKTIMER Timer
,
1242 IN LARGE_INTEGER DueTime
,
1243 IN LONG Period OPTIONAL
,
1244 IN PKDPC Dpc OPTIONAL
);
1249 KeStallExecutionProcessor(
1250 IN ULONG MicroSeconds
);
1255 KeSynchronizeExecution(
1256 IN OUT PKINTERRUPT Interrupt
,
1257 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
1258 IN PVOID SynchronizeContext OPTIONAL
);
1263 KeWaitForMultipleObjects(
1266 IN WAIT_TYPE WaitType
,
1267 IN KWAIT_REASON WaitReason
,
1268 IN KPROCESSOR_MODE WaitMode
,
1269 IN BOOLEAN Alertable
,
1270 IN PLARGE_INTEGER Timeout OPTIONAL
,
1271 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
1273 #define KeWaitForMutexObject KeWaitForSingleObject
1278 KeWaitForSingleObject(
1280 IN KWAIT_REASON WaitReason
,
1281 IN KPROCESSOR_MODE WaitMode
,
1282 IN BOOLEAN Alertable
,
1283 IN PLARGE_INTEGER Timeout OPTIONAL
);
1287 #if (NTDDI_VERSION >= NTDDI_WINXP)
1291 KeAcquireInStackQueuedSpinLock (
1292 IN OUT PKSPIN_LOCK SpinLock
,
1293 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1298 KeAcquireInStackQueuedSpinLockAtDpcLevel(
1299 IN OUT PKSPIN_LOCK SpinLock
,
1300 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1305 KeAcquireInterruptSpinLock(
1306 IN OUT PKINTERRUPT Interrupt
);
1311 KeAreApcsDisabled(VOID
);
1316 KeGetRecommendedSharedDataAlignment(VOID
);
1321 KeQueryRuntimeThread(
1323 OUT PULONG UserTime
);
1328 KeReleaseInStackQueuedSpinLockFromDpcLevel(
1329 IN PKLOCK_QUEUE_HANDLE LockHandle
);
1334 KeReleaseInterruptSpinLock(
1335 IN OUT PKINTERRUPT Interrupt
,
1340 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1350 #if (NTDDI_VERSION >= NTDDI_WS03)
1355 KeRegisterNmiCallback(
1356 IN PNMI_CALLBACK CallbackRoutine
,
1357 IN PVOID Context OPTIONAL
);
1362 KeDeregisterNmiCallback(
1370 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
1371 IN ULONG_PTR Context
1379 KeSaveFloatingPointState(
1380 OUT PKFLOATING_SAVE FloatSave
);
1385 KeRestoreFloatingPointState(
1386 IN PKFLOATING_SAVE FloatSave
);
1391 KeFlushWriteBuffer(VOID
)
1400 KeFlushWriteBuffer(VOID
);
1407 IN OUT PRKEVENT Event
);
1409 #if (NTDDI_VERSION >= NTDDI_WIN2K) && defined(SINGLE_GROUP_LEGACY_API)
1414 KeRevertToUserAffinityThread(VOID
);
1419 KeSetSystemAffinityThread(
1420 IN KAFFINITY Affinity
);
1425 KeSetTargetProcessorDpc(
1435 * IN BOOLEAN ReadOperation,
1436 * IN BOOLEAN DmaOperation)
1438 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
1440 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
1441 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
1442 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
1443 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
1446 /* SPINLOCK FUNCTIONS */
1448 #if (NTDDI_VERSION >= NTDDI_WINXP)
1449 //_DECL_HAL_KE_IMPORT
1452 KeAcquireInStackQueuedSpinLock(
1453 IN OUT PKSPIN_LOCK SpinLock
,
1454 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1456 //_DECL_HAL_KE_IMPORT
1459 KeReleaseInStackQueuedSpinLock(
1460 IN PKLOCK_QUEUE_HANDLE LockHandle
);
1464 /* FIXME : #if (NTDDI_VERSION >= NTDDI_WS03SP1) */
1468 KeTryToAcquireSpinLockAtDpcLevel(
1469 IN OUT PKSPIN_LOCK SpinLock
1471 /* #endif (NTDDI_VERSION >= NTDDI_WS03SP1) */
1473 #if (NTDDI_VERSION >= NTDDI_WS03)
1478 IN PKSPIN_LOCK SpinLock
1482 /* FIXME : #if (NTDDI_VERSION >= NTDDI_WS03SP1) */
1486 KeAreAllApcsDisabled(
1488 /* #endif (NTDDI_VERSION >= NTDDI_WS03SP1) */
1490 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1492 /* Guarded Mutex routines */
1497 KeAcquireGuardedMutex(
1498 IN OUT PKGUARDED_MUTEX GuardedMutex
1504 KeAcquireGuardedMutexUnsafe(
1505 IN OUT PKGUARDED_MUTEX GuardedMutex
1510 KeEnterGuardedRegion(
1517 KeLeaveGuardedRegion(
1524 KeInitializeGuardedMutex(
1525 OUT PKGUARDED_MUTEX GuardedMutex
1531 KeReleaseGuardedMutexUnsafe(
1532 IN OUT PKGUARDED_MUTEX GuardedMutex
1538 KeReleaseGuardedMutex(
1539 IN OUT PKGUARDED_MUTEX GuardedMutex
1545 KeTryToAcquireGuardedMutex(
1546 IN OUT PKGUARDED_MUTEX GuardedMutex
1557 #if defined(_M_AMD64)
1563 #pragma intrinsic(__readgsqword)
1567 KeGetCurrentThread (
1570 return (struct _KTHREAD
*)__readgsqword(0x188);
1575 #if defined(_M_IX86) || defined(_M_IA64)
1593 * KeInitializeCallbackRecord(
1594 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1596 #define KeInitializeCallbackRecord(CallbackRecord) \
1597 CallbackRecord->State = BufferEmpty;
1601 #if (NTDDI_VERSION >= NTDDI_VISTA)
1602 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
1604 #define PAGED_ASSERT( exp ) ASSERT( exp )
1607 #define PAGED_CODE() { \
1608 if (KeGetCurrentIrql() > APC_LEVEL) { \
1609 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
1610 PAGED_ASSERT(FALSE); \
1616 #define PAGED_CODE()
1620 #if defined(_NTDDK_) || defined(_NTIFS_)
1622 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1628 IN CONST VOID
*Address
,
1630 IN ULONG Alignment
);
1636 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1644 IN ULONG Alignment
);
1648 #if defined(_X86_) || defined(_AMD64_)
1650 /* x86 and x64 performs a 0x2C interrupt */
1651 #define DbgRaiseAssertionFailure __int2c
1653 #elif defined(_ARM_)
1660 #error Unsupported Architecture
1664 /******************************************************************************
1665 * Memory manager Types *
1666 ******************************************************************************/
1668 #define PAGE_SIZE 0x1000
1669 #define PAGE_SHIFT 12L
1671 #define MM_DONT_ZERO_ALLOCATION 0x00000001
1672 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
1673 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
1674 #define MM_ALLOCATE_NO_WAIT 0x00000008
1675 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
1676 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
1678 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1679 #define MDL_PAGES_LOCKED 0x0002
1680 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1681 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1682 #define MDL_PARTIAL 0x0010
1683 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1684 #define MDL_IO_PAGE_READ 0x0040
1685 #define MDL_WRITE_OPERATION 0x0080
1686 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1687 #define MDL_FREE_EXTRA_PTES 0x0200
1688 #define MDL_DESCRIBES_AWE 0x0400
1689 #define MDL_IO_SPACE 0x0800
1690 #define MDL_NETWORK_HEADER 0x1000
1691 #define MDL_MAPPING_CAN_FAIL 0x2000
1692 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1693 #define MDL_INTERNAL 0x8000
1695 #define MDL_MAPPING_FLAGS ( \
1696 MDL_MAPPED_TO_SYSTEM_VA | \
1697 MDL_PAGES_LOCKED | \
1698 MDL_SOURCE_IS_NONPAGED_POOL | \
1699 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1700 MDL_PARENT_MAPPED_SYSTEM_VA | \
1704 #define FLUSH_MULTIPLE_MAXIMUM 32
1706 /* Section access rights */
1707 #define SECTION_QUERY 0x0001
1708 #define SECTION_MAP_WRITE 0x0002
1709 #define SECTION_MAP_READ 0x0004
1710 #define SECTION_MAP_EXECUTE 0x0008
1711 #define SECTION_EXTEND_SIZE 0x0010
1712 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
1714 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
1715 SECTION_MAP_WRITE | \
1716 SECTION_MAP_READ | \
1717 SECTION_MAP_EXECUTE | \
1718 SECTION_EXTEND_SIZE)
1720 #define SESSION_QUERY_ACCESS 0x0001
1721 #define SESSION_MODIFY_ACCESS 0x0002
1723 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
1724 SESSION_QUERY_ACCESS | \
1725 SESSION_MODIFY_ACCESS)
1727 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1729 #define PAGE_NOACCESS 0x01
1730 #define PAGE_READONLY 0x02
1731 #define PAGE_READWRITE 0x04
1732 #define PAGE_WRITECOPY 0x08
1733 #define PAGE_EXECUTE 0x10
1734 #define PAGE_EXECUTE_READ 0x20
1735 #define PAGE_EXECUTE_READWRITE 0x40
1736 #define PAGE_EXECUTE_WRITECOPY 0x80
1737 #define PAGE_GUARD 0x100
1738 #define PAGE_NOCACHE 0x200
1739 #define PAGE_WRITECOMBINE 0x400
1741 #define MEM_COMMIT 0x1000
1742 #define MEM_RESERVE 0x2000
1743 #define MEM_DECOMMIT 0x4000
1744 #define MEM_RELEASE 0x8000
1745 #define MEM_FREE 0x10000
1746 #define MEM_PRIVATE 0x20000
1747 #define MEM_MAPPED 0x40000
1748 #define MEM_RESET 0x80000
1749 #define MEM_TOP_DOWN 0x100000
1750 #define MEM_LARGE_PAGES 0x20000000
1751 #define MEM_4MB_PAGES 0x80000000
1753 #define SEC_RESERVE 0x4000000
1754 #define SEC_LARGE_PAGES 0x80000000
1756 /* Section map options */
1757 typedef enum _SECTION_INHERIT
{
1762 typedef ULONG PFN_COUNT
;
1763 typedef LONG_PTR SPFN_NUMBER
, *PSPFN_NUMBER
;
1764 typedef ULONG_PTR PFN_NUMBER
, *PPFN_NUMBER
;
1766 typedef struct _MDL
{
1770 struct _EPROCESS
*Process
;
1771 PVOID MappedSystemVa
;
1777 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
1778 MmFrameBufferCached
= 2
1779 } MEMORY_CACHING_TYPE_ORIG
;
1781 typedef enum _MEMORY_CACHING_TYPE
{
1782 MmNonCached
= FALSE
,
1784 MmWriteCombined
= MmFrameBufferCached
,
1785 MmHardwareCoherentCached
,
1786 MmNonCachedUnordered
,
1789 } MEMORY_CACHING_TYPE
;
1791 typedef enum _MM_PAGE_PRIORITY
{
1793 NormalPagePriority
= 16,
1794 HighPagePriority
= 32
1797 typedef enum _LOCK_OPERATION
{
1803 typedef enum _MM_SYSTEM_SIZE
{
1810 /******************************************************************************
1811 * Memory manager Functions *
1812 ******************************************************************************/
1817 #define ALIGN_DOWN(s, t) \
1818 ((ULONG)(s) & ~(sizeof(t) - 1))
1820 #define ALIGN_UP(s, t) \
1821 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
1823 #define ALIGN_DOWN_POINTER(p, t) \
1824 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
1826 #define ALIGN_UP_POINTER(p, t) \
1827 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
1833 #define BYTE_OFFSET(Va) \
1834 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
1840 #define BYTES_TO_PAGES(Size) \
1841 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
1847 #define PAGE_ALIGN(Va) \
1848 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
1852 * IN ULONG_PTR Size)
1854 #define ROUND_TO_PAGES(Size) \
1855 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
1859 * MmGetMdlByteCount(
1862 #define MmGetMdlByteCount(_Mdl) \
1867 * MmGetMdlByteOffset(
1870 #define MmGetMdlByteOffset(_Mdl) \
1871 ((_Mdl)->ByteOffset)
1878 #define MmGetMdlPfnArray(_Mdl) \
1879 ((PPFN_NUMBER) ((_Mdl) + 1))
1883 * MmGetMdlVirtualAddress(
1886 #define MmGetMdlVirtualAddress(_Mdl) \
1887 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
1889 #define MmGetProcedureAddress(Address) (Address)
1891 /* PVOID MmGetSystemAddressForMdl(
1894 #define MmGetSystemAddressForMdl(Mdl) \
1895 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
1896 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1897 ((Mdl)->MappedSystemVa) : \
1898 (MmMapLockedPages((Mdl), KernelMode)))
1901 * MmGetSystemAddressForMdlSafe(
1903 * IN MM_PAGE_PRIORITY Priority)
1905 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
1906 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
1907 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1908 (_Mdl)->MappedSystemVa : \
1909 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
1910 KernelMode, MmCached, NULL, FALSE, (_Priority)))
1915 * IN PMDL MemoryDescriptorList,
1919 #define MmInitializeMdl(_MemoryDescriptorList, \
1923 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
1924 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
1925 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
1926 (_MemoryDescriptorList)->MdlFlags = 0; \
1927 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
1928 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
1929 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
1934 * MmPrepareMdlForReuse(
1937 #define MmPrepareMdlForReuse(_Mdl) \
1939 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
1940 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
1941 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
1942 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
1943 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
1947 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1952 MmAllocateContiguousMemory(
1953 IN SIZE_T NumberOfBytes
,
1954 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
1959 MmAllocateContiguousMemorySpecifyCache(
1960 IN SIZE_T NumberOfBytes
,
1961 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
1962 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
1963 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
1964 IN MEMORY_CACHING_TYPE CacheType
);
1969 MmAllocatePagesForMdl(
1970 IN PHYSICAL_ADDRESS LowAddress
,
1971 IN PHYSICAL_ADDRESS HighAddress
,
1972 IN PHYSICAL_ADDRESS SkipBytes
,
1973 IN SIZE_T TotalBytes
);
1978 MmBuildMdlForNonPagedPool(
1979 IN OUT PMDL MemoryDescriptorList
);
1985 IN PMDL MemoryDescriptorList OPTIONAL
,
1992 MmFreeContiguousMemory(
1993 IN PVOID BaseAddress
);
1998 MmFreeContiguousMemorySpecifyCache(
1999 IN PVOID BaseAddress
,
2000 IN SIZE_T NumberOfBytes
,
2001 IN MEMORY_CACHING_TYPE CacheType
);
2007 IN PMDL MemoryDescriptorList
);
2012 MmGetSystemRoutineAddress(
2013 IN PUNICODE_STRING SystemRoutineName
);
2018 MmIsDriverVerifying(
2019 IN PDRIVER_OBJECT DriverObject
);
2024 MmLockPagableDataSection(
2025 IN PVOID AddressWithinSection
);
2031 IN PHYSICAL_ADDRESS PhysicalAddress
,
2032 IN SIZE_T NumberOfBytes
,
2033 IN MEMORY_CACHING_TYPE CacheEnable
);
2039 IN PMDL MemoryDescriptorList
,
2040 IN KPROCESSOR_MODE AccessMode
);
2045 MmMapLockedPagesSpecifyCache(
2046 IN PMDL MemoryDescriptorList
,
2047 IN KPROCESSOR_MODE AccessMode
,
2048 IN MEMORY_CACHING_TYPE CacheType
,
2049 IN PVOID BaseAddress OPTIONAL
,
2050 IN ULONG BugCheckOnFailure
,
2051 IN MM_PAGE_PRIORITY Priority
);
2057 IN PVOID AddressWithinSection
);
2062 MmProbeAndLockPages(
2063 IN OUT PMDLX MemoryDescriptorList
,
2064 IN KPROCESSOR_MODE AccessMode
,
2065 IN LOCK_OPERATION Operation
);
2076 MmResetDriverPaging(
2077 IN PVOID AddressWithinSection
);
2089 MmUnlockPagableImageSection(
2090 IN PVOID ImageSectionHandle
);
2096 IN OUT PMDLX MemoryDescriptorList
);
2102 IN PVOID BaseAddress
,
2103 IN SIZE_T NumberOfBytes
);
2109 IN PVOID BaseAddress
,
2110 IN PMDL MemoryDescriptorList
);
2114 #if (NTDDI_VERSION >= NTDDI_WINXP)
2121 IN ULONG NumberOfBytes
);
2126 MmAllocateMappingAddress(
2127 IN SIZE_T NumberOfBytes
,
2133 MmFreeMappingAddress(
2134 IN PVOID BaseAddress
,
2140 MmIsVerifierEnabled(
2141 OUT PULONG VerifierFlags
);
2146 MmMapLockedPagesWithReservedMapping(
2147 IN PVOID MappingAddress
,
2149 IN PMDL MemoryDescriptorList
,
2150 IN MEMORY_CACHING_TYPE CacheType
);
2155 MmProbeAndLockProcessPages(
2156 IN OUT PMDL MemoryDescriptorList
,
2157 IN PEPROCESS Process
,
2158 IN KPROCESSOR_MODE AccessMode
,
2159 IN LOCK_OPERATION Operation
);
2164 MmProtectMdlSystemAddress(
2165 IN PMDLX MemoryDescriptorList
,
2166 IN ULONG NewProtect
);
2171 MmUnmapReservedMapping(
2172 IN PVOID BaseAddress
,
2174 IN PMDLX MemoryDescriptorList
);
2178 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2182 MmAllocatePagesForMdlEx(
2183 IN PHYSICAL_ADDRESS LowAddress
,
2184 IN PHYSICAL_ADDRESS HighAddress
,
2185 IN PHYSICAL_ADDRESS SkipBytes
,
2186 IN SIZE_T TotalBytes
,
2187 IN MEMORY_CACHING_TYPE CacheType
,
2191 /******************************************************************************
2192 * Security Manager Types *
2193 ******************************************************************************/
2196 typedef PVOID PSECURITY_DESCRIPTOR
;
2197 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
2198 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
2199 typedef PVOID PACCESS_TOKEN
;
2202 #define DELETE 0x00010000L
2203 #define READ_CONTROL 0x00020000L
2204 #define WRITE_DAC 0x00040000L
2205 #define WRITE_OWNER 0x00080000L
2206 #define SYNCHRONIZE 0x00100000L
2207 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
2208 #define STANDARD_RIGHTS_READ READ_CONTROL
2209 #define STANDARD_RIGHTS_WRITE READ_CONTROL
2210 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
2211 #define STANDARD_RIGHTS_ALL 0x001F0000L
2212 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
2213 #define ACCESS_SYSTEM_SECURITY 0x01000000L
2214 #define MAXIMUM_ALLOWED 0x02000000L
2215 #define GENERIC_READ 0x80000000L
2216 #define GENERIC_WRITE 0x40000000L
2217 #define GENERIC_EXECUTE 0x20000000L
2218 #define GENERIC_ALL 0x10000000L
2220 typedef struct _GENERIC_MAPPING
{
2221 ACCESS_MASK GenericRead
;
2222 ACCESS_MASK GenericWrite
;
2223 ACCESS_MASK GenericExecute
;
2224 ACCESS_MASK GenericAll
;
2225 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
2227 #define ACL_REVISION 2
2228 #define ACL_REVISION_DS 4
2230 #define ACL_REVISION1 1
2231 #define ACL_REVISION2 2
2232 #define ACL_REVISION3 3
2233 #define ACL_REVISION4 4
2234 #define MIN_ACL_REVISION ACL_REVISION2
2235 #define MAX_ACL_REVISION ACL_REVISION4
2237 typedef struct _ACL
{
2245 /* Current security descriptor revision value */
2246 #define SECURITY_DESCRIPTOR_REVISION (1)
2247 #define SECURITY_DESCRIPTOR_REVISION1 (1)
2249 /* Privilege attributes */
2250 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
2251 #define SE_PRIVILEGE_ENABLED (0x00000002L)
2252 #define SE_PRIVILEGE_REMOVED (0X00000004L)
2253 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
2255 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
2256 SE_PRIVILEGE_ENABLED | \
2257 SE_PRIVILEGE_REMOVED | \
2258 SE_PRIVILEGE_USED_FOR_ACCESS)
2260 #include <pshpack4.h>
2261 typedef struct _LUID_AND_ATTRIBUTES
{
2264 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
2265 #include <poppack.h>
2267 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
2268 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
2270 /* Privilege sets */
2271 #define PRIVILEGE_SET_ALL_NECESSARY (1)
2273 typedef struct _PRIVILEGE_SET
{
2274 ULONG PrivilegeCount
;
2276 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
2277 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
2279 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
2281 SecurityIdentification
,
2282 SecurityImpersonation
,
2284 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
2286 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
2287 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
2288 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
2289 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
2291 #define SECURITY_DYNAMIC_TRACKING (TRUE)
2292 #define SECURITY_STATIC_TRACKING (FALSE)
2294 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
2296 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
2298 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2299 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
2300 BOOLEAN EffectiveOnly
;
2301 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
2303 typedef struct _SE_IMPERSONATION_STATE
{
2304 PACCESS_TOKEN Token
;
2306 BOOLEAN EffectiveOnly
;
2307 SECURITY_IMPERSONATION_LEVEL Level
;
2308 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
2310 #define OWNER_SECURITY_INFORMATION (0x00000001L)
2311 #define GROUP_SECURITY_INFORMATION (0x00000002L)
2312 #define DACL_SECURITY_INFORMATION (0x00000004L)
2313 #define SACL_SECURITY_INFORMATION (0x00000008L)
2314 #define LABEL_SECURITY_INFORMATION (0x00000010L)
2316 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
2317 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
2318 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
2319 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
2321 typedef enum _SECURITY_OPERATION_CODE
{
2322 SetSecurityDescriptor
,
2323 QuerySecurityDescriptor
,
2324 DeleteSecurityDescriptor
,
2325 AssignSecurityDescriptor
2326 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
2328 #define INITIAL_PRIVILEGE_COUNT 3
2330 typedef struct _INITIAL_PRIVILEGE_SET
{
2331 ULONG PrivilegeCount
;
2333 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
2334 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
2336 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
2337 #define SE_CREATE_TOKEN_PRIVILEGE 2
2338 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
2339 #define SE_LOCK_MEMORY_PRIVILEGE 4
2340 #define SE_INCREASE_QUOTA_PRIVILEGE 5
2341 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
2342 #define SE_TCB_PRIVILEGE 7
2343 #define SE_SECURITY_PRIVILEGE 8
2344 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
2345 #define SE_LOAD_DRIVER_PRIVILEGE 10
2346 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
2347 #define SE_SYSTEMTIME_PRIVILEGE 12
2348 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
2349 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
2350 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
2351 #define SE_CREATE_PERMANENT_PRIVILEGE 16
2352 #define SE_BACKUP_PRIVILEGE 17
2353 #define SE_RESTORE_PRIVILEGE 18
2354 #define SE_SHUTDOWN_PRIVILEGE 19
2355 #define SE_DEBUG_PRIVILEGE 20
2356 #define SE_AUDIT_PRIVILEGE 21
2357 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
2358 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
2359 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
2360 #define SE_UNDOCK_PRIVILEGE 25
2361 #define SE_SYNC_AGENT_PRIVILEGE 26
2362 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
2363 #define SE_MANAGE_VOLUME_PRIVILEGE 28
2364 #define SE_IMPERSONATE_PRIVILEGE 29
2365 #define SE_CREATE_GLOBAL_PRIVILEGE 30
2366 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
2367 #define SE_RELABEL_PRIVILEGE 32
2368 #define SE_INC_WORKING_SET_PRIVILEGE 33
2369 #define SE_TIME_ZONE_PRIVILEGE 34
2370 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
2371 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
2373 typedef struct _SECURITY_SUBJECT_CONTEXT
{
2374 PACCESS_TOKEN ClientToken
;
2375 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2376 PACCESS_TOKEN PrimaryToken
;
2377 PVOID ProcessAuditId
;
2378 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
2380 typedef struct _ACCESS_STATE
{
2382 BOOLEAN SecurityEvaluated
;
2383 BOOLEAN GenerateAudit
;
2384 BOOLEAN GenerateOnClose
;
2385 BOOLEAN PrivilegesAllocated
;
2387 ACCESS_MASK RemainingDesiredAccess
;
2388 ACCESS_MASK PreviouslyGrantedAccess
;
2389 ACCESS_MASK OriginalDesiredAccess
;
2390 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
2391 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2394 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
2395 PRIVILEGE_SET PrivilegeSet
;
2398 BOOLEAN AuditPrivileges
;
2399 UNICODE_STRING ObjectName
;
2400 UNICODE_STRING ObjectTypeName
;
2401 } ACCESS_STATE
, *PACCESS_STATE
;
2403 /******************************************************************************
2404 * Security Manager Functions *
2405 ******************************************************************************/
2407 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2413 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
2414 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
2415 IN BOOLEAN SubjectContextLocked
,
2416 IN ACCESS_MASK DesiredAccess
,
2417 IN ACCESS_MASK PreviouslyGrantedAccess
,
2418 OUT PPRIVILEGE_SET
*Privileges OPTIONAL
,
2419 IN PGENERIC_MAPPING GenericMapping
,
2420 IN KPROCESSOR_MODE AccessMode
,
2421 OUT PACCESS_MASK GrantedAccess
,
2422 OUT PNTSTATUS AccessStatus
);
2428 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
2429 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
2430 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
2431 IN BOOLEAN IsDirectoryObject
,
2432 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
2433 IN PGENERIC_MAPPING GenericMapping
,
2434 IN POOL_TYPE PoolType
);
2440 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
2441 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
2442 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
2443 IN GUID
*ObjectType OPTIONAL
,
2444 IN BOOLEAN IsDirectoryObject
,
2445 IN ULONG AutoInheritFlags
,
2446 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
2447 IN PGENERIC_MAPPING GenericMapping
,
2448 IN POOL_TYPE PoolType
);
2454 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
);
2459 SeValidSecurityDescriptor(
2461 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
2465 /******************************************************************************
2466 * Power Management Support Types *
2467 ******************************************************************************/
2469 /* Power States/Levels */
2470 typedef enum _SYSTEM_POWER_STATE
{
2471 PowerSystemUnspecified
,
2473 PowerSystemSleeping1
,
2474 PowerSystemSleeping2
,
2475 PowerSystemSleeping3
,
2476 PowerSystemHibernate
,
2477 PowerSystemShutdown
,
2479 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
2481 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
2483 typedef enum _POWER_INFORMATION_LEVEL
{
2484 SystemPowerPolicyAc
,
2485 SystemPowerPolicyDc
,
2486 VerifySystemPolicyAc
,
2487 VerifySystemPolicyDc
,
2488 SystemPowerCapabilities
,
2490 SystemPowerStateHandler
,
2491 ProcessorStateHandler
,
2492 SystemPowerPolicyCurrent
,
2493 AdministratorPowerPolicy
,
2494 SystemReserveHiberFile
,
2495 ProcessorInformation
,
2496 SystemPowerInformation
,
2497 ProcessorStateHandler2
,
2500 SystemExecutionState
,
2501 SystemPowerStateNotifyHandler
,
2502 ProcessorPowerPolicyAc
,
2503 ProcessorPowerPolicyDc
,
2504 VerifyProcessorPowerPolicyAc
,
2505 VerifyProcessorPowerPolicyDc
,
2506 ProcessorPowerPolicyCurrent
2507 } POWER_INFORMATION_LEVEL
;
2511 PowerActionReserved
,
2513 PowerActionHibernate
,
2514 PowerActionShutdown
,
2515 PowerActionShutdownReset
,
2516 PowerActionShutdownOff
,
2517 PowerActionWarmEject
2518 } POWER_ACTION
, *PPOWER_ACTION
;
2520 typedef enum _DEVICE_POWER_STATE
{
2521 PowerDeviceUnspecified
,
2527 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
2529 /******************************************************************************
2530 * Power Management Support Functions *
2531 ******************************************************************************/
2533 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
2535 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2541 IN PDEVICE_OBJECT DeviceObject
,
2547 PoRegisterDeviceForIdleDetection(
2548 IN PDEVICE_OBJECT DeviceObject
,
2549 IN ULONG ConservationIdleTime
,
2550 IN ULONG PerformanceIdleTime
,
2551 IN DEVICE_POWER_STATE State
);
2556 PoRegisterSystemState(
2557 IN PVOID StateHandle OPTIONAL
,
2558 IN EXECUTION_STATE Flags
);
2564 IN PDEVICE_OBJECT DeviceObject
,
2565 IN UCHAR MinorFunction
,
2566 IN POWER_STATE PowerState
,
2567 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL
,
2568 IN PVOID Context OPTIONAL
,
2569 OUT PIRP
*Irp OPTIONAL
);
2575 IN PDEVICE_OBJECT DeviceObject
,
2576 IN POWER_STATE_TYPE Type
,
2577 IN POWER_STATE State
);
2583 IN EXECUTION_STATE Flags
);
2588 PoStartNextPowerIrp(
2594 PoUnregisterSystemState(
2595 IN OUT PVOID StateHandle
);
2599 /******************************************************************************
2600 * Configuration Manager Types *
2601 ******************************************************************************/
2603 /* Resource list definitions */
2604 typedef int CM_RESOURCE_TYPE
;
2606 #define CmResourceTypeNull 0
2607 #define CmResourceTypePort 1
2608 #define CmResourceTypeInterrupt 2
2609 #define CmResourceTypeMemory 3
2610 #define CmResourceTypeDma 4
2611 #define CmResourceTypeDeviceSpecific 5
2612 #define CmResourceTypeBusNumber 6
2613 #define CmResourceTypeNonArbitrated 128
2614 #define CmResourceTypeConfigData 128
2615 #define CmResourceTypeDevicePrivate 129
2616 #define CmResourceTypePcCardConfig 130
2617 #define CmResourceTypeMfCardConfig 131
2620 /* KEY_VALUE_Xxx.Type */
2623 #define REG_EXPAND_SZ 2
2624 #define REG_BINARY 3
2626 #define REG_DWORD_LITTLE_ENDIAN 4
2627 #define REG_DWORD_BIG_ENDIAN 5
2629 #define REG_MULTI_SZ 7
2630 #define REG_RESOURCE_LIST 8
2631 #define REG_FULL_RESOURCE_DESCRIPTOR 9
2632 #define REG_RESOURCE_REQUIREMENTS_LIST 10
2633 #define REG_QWORD 11
2634 #define REG_QWORD_LITTLE_ENDIAN 11
2636 /* Registry Access Rights */
2637 #define KEY_QUERY_VALUE (0x0001)
2638 #define KEY_SET_VALUE (0x0002)
2639 #define KEY_CREATE_SUB_KEY (0x0004)
2640 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
2641 #define KEY_NOTIFY (0x0010)
2642 #define KEY_CREATE_LINK (0x0020)
2643 #define KEY_WOW64_32KEY (0x0200)
2644 #define KEY_WOW64_64KEY (0x0100)
2645 #define KEY_WOW64_RES (0x0300)
2647 #define KEY_READ ((STANDARD_RIGHTS_READ |\
2649 KEY_ENUMERATE_SUB_KEYS |\
2654 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
2656 KEY_CREATE_SUB_KEY) \
2660 #define KEY_EXECUTE ((KEY_READ) \
2664 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
2667 KEY_CREATE_SUB_KEY |\
2668 KEY_ENUMERATE_SUB_KEYS |\
2674 /* Registry Open/Create Options */
2675 #define REG_OPTION_RESERVED (0x00000000L)
2676 #define REG_OPTION_NON_VOLATILE (0x00000000L)
2677 #define REG_OPTION_VOLATILE (0x00000001L)
2678 #define REG_OPTION_CREATE_LINK (0x00000002L)
2679 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
2680 #define REG_OPTION_OPEN_LINK (0x00000008L)
2682 #define REG_LEGAL_OPTION \
2683 (REG_OPTION_RESERVED |\
2684 REG_OPTION_NON_VOLATILE |\
2685 REG_OPTION_VOLATILE |\
2686 REG_OPTION_CREATE_LINK |\
2687 REG_OPTION_BACKUP_RESTORE |\
2688 REG_OPTION_OPEN_LINK)
2690 /* Key creation/open disposition */
2691 #define REG_CREATED_NEW_KEY (0x00000001L)
2692 #define REG_OPENED_EXISTING_KEY (0x00000002L)
2694 /* Key restore & hive load flags */
2695 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
2696 #define REG_REFRESH_HIVE (0x00000002L)
2697 #define REG_NO_LAZY_FLUSH (0x00000004L)
2698 #define REG_FORCE_RESTORE (0x00000008L)
2699 #define REG_APP_HIVE (0x00000010L)
2700 #define REG_PROCESS_PRIVATE (0x00000020L)
2701 #define REG_START_JOURNAL (0x00000040L)
2702 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
2703 #define REG_HIVE_NO_RM (0x00000100L)
2704 #define REG_HIVE_SINGLE_LOG (0x00000200L)
2707 #define REG_FORCE_UNLOAD 1
2709 /* Notify Filter Values */
2710 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
2711 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
2712 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
2713 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
2715 #define REG_LEGAL_CHANGE_FILTER \
2716 (REG_NOTIFY_CHANGE_NAME |\
2717 REG_NOTIFY_CHANGE_ATTRIBUTES |\
2718 REG_NOTIFY_CHANGE_LAST_SET |\
2719 REG_NOTIFY_CHANGE_SECURITY)
2721 typedef struct _CM_FLOPPY_DEVICE_DATA
{
2727 UCHAR StepRateHeadUnloadTime
;
2730 UCHAR SectorLengthCode
;
2731 UCHAR SectorPerTrack
;
2732 UCHAR ReadWriteGapLength
;
2733 UCHAR DataTransferLength
;
2734 UCHAR FormatGapLength
;
2735 UCHAR FormatFillCharacter
;
2736 UCHAR HeadSettleTime
;
2737 UCHAR MotorSettleTime
;
2738 UCHAR MaximumTrackValue
;
2739 UCHAR DataTransferRate
;
2740 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
2742 #include <pshpack4.h>
2743 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
2745 UCHAR ShareDisposition
;
2749 PHYSICAL_ADDRESS Start
;
2753 PHYSICAL_ADDRESS Start
;
2761 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2763 __GNU_EXTENSION
union {
2766 USHORT MessageCount
;
2779 PHYSICAL_ADDRESS Start
;
2799 } DeviceSpecificData
;
2800 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2802 PHYSICAL_ADDRESS Start
;
2806 PHYSICAL_ADDRESS Start
;
2810 PHYSICAL_ADDRESS Start
;
2815 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
2816 #include <poppack.h>
2818 #include <pshpack1.h>
2819 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
2821 #define CmResourceTypeNull 0
2822 #define CmResourceTypePort 1
2823 #define CmResourceTypeInterrupt 2
2824 #define CmResourceTypeMemory 3
2825 #define CmResourceTypeDma 4
2826 #define CmResourceTypeDeviceSpecific 5
2827 #define CmResourceTypeBusNumber 6
2828 #define CmResourceTypeMemoryLarge 7
2829 #define CmResourceTypeNonArbitrated 128
2830 #define CmResourceTypeConfigData 128
2831 #define CmResourceTypeDevicePrivate 129
2832 #define CmResourceTypePcCardConfig 130
2833 #define CmResourceTypeMfCardConfig 131
2835 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
2837 typedef enum _CM_SHARE_DISPOSITION
{
2838 CmResourceShareUndetermined
,
2839 CmResourceShareDeviceExclusive
,
2840 CmResourceShareDriverExclusive
,
2841 CmResourceShareShared
2842 } CM_SHARE_DISPOSITION
;
2844 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
2846 #define CM_RESOURCE_PORT_MEMORY 0x0000
2847 #define CM_RESOURCE_PORT_IO 0x0001
2848 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
2849 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
2850 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
2851 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
2852 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
2853 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
2854 #define CM_RESOURCE_PORT_BAR 0x0100
2856 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
2858 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
2859 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
2860 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
2861 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
2863 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
2865 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
2866 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
2867 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
2868 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
2869 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
2870 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
2871 #define CM_RESOURCE_MEMORY_24 0x0010
2872 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
2873 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
2874 #define CM_RESOURCE_MEMORY_BAR 0x0080
2875 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
2877 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
2879 #define CM_RESOURCE_DMA_8 0x0000
2880 #define CM_RESOURCE_DMA_16 0x0001
2881 #define CM_RESOURCE_DMA_32 0x0002
2882 #define CM_RESOURCE_DMA_8_AND_16 0x0004
2883 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
2884 #define CM_RESOURCE_DMA_TYPE_A 0x0010
2885 #define CM_RESOURCE_DMA_TYPE_B 0x0020
2886 #define CM_RESOURCE_DMA_TYPE_F 0x0040
2888 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
2892 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
2893 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
2895 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
2896 INTERFACE_TYPE InterfaceType
;
2898 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
2899 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
2901 typedef struct _CM_RESOURCE_LIST
{
2903 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
2904 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
2906 typedef struct _CM_INT13_DRIVE_PARAMETER
{
2909 USHORT SectorsPerTrack
;
2911 USHORT NumberDrives
;
2912 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
2914 typedef struct _CM_PNP_BIOS_DEVICE_NODE
2919 UCHAR DeviceType
[3];
2920 USHORT DeviceAttributes
;
2921 } CM_PNP_BIOS_DEVICE_NODE
,*PCM_PNP_BIOS_DEVICE_NODE
;
2923 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
2928 USHORT ControlField
;
2930 ULONG EventFlagAddress
;
2931 USHORT RealModeEntryOffset
;
2932 USHORT RealModeEntrySegment
;
2933 USHORT ProtectedModeEntryOffset
;
2934 ULONG ProtectedModeCodeBaseAddress
;
2936 USHORT RealModeDataBaseAddress
;
2937 ULONG ProtectedModeDataBaseAddress
;
2938 } CM_PNP_BIOS_INSTALLATION_CHECK
, *PCM_PNP_BIOS_INSTALLATION_CHECK
;
2940 #include <poppack.h>
2942 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
2944 ULONG BytesPerSector
;
2945 ULONG NumberOfCylinders
;
2946 ULONG SectorsPerTrack
;
2947 ULONG NumberOfHeads
;
2948 } CM_DISK_GEOMETRY_DEVICE_DATA
, *PCM_DISK_GEOMETRY_DEVICE_DATA
;
2950 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
2955 USHORT KeyboardFlags
;
2956 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
2958 typedef struct _CM_MCA_POS_DATA
{
2964 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
2966 #if (NTDDI_VERSION >= NTDDI_WINXP)
2967 typedef struct CM_Power_Data_s
{
2969 DEVICE_POWER_STATE PD_MostRecentPowerState
;
2970 ULONG PD_Capabilities
;
2974 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
2975 SYSTEM_POWER_STATE PD_DeepestSystemWake
;
2976 } CM_POWER_DATA
, *PCM_POWER_DATA
;
2978 #define PDCAP_D0_SUPPORTED 0x00000001
2979 #define PDCAP_D1_SUPPORTED 0x00000002
2980 #define PDCAP_D2_SUPPORTED 0x00000004
2981 #define PDCAP_D3_SUPPORTED 0x00000008
2982 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2983 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2984 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2985 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2986 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2988 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2990 typedef struct _CM_SCSI_DEVICE_DATA
{
2993 UCHAR HostIdentifier
;
2994 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
2996 typedef struct _CM_SERIAL_DEVICE_DATA
{
3000 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
3002 typedef enum _KEY_INFORMATION_CLASS
{
3003 KeyBasicInformation
,
3007 KeyCachedInformation
,
3009 } KEY_INFORMATION_CLASS
;
3011 typedef struct _KEY_BASIC_INFORMATION
{
3012 LARGE_INTEGER LastWriteTime
;
3016 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
3018 typedef struct _KEY_FULL_INFORMATION
{
3019 LARGE_INTEGER LastWriteTime
;
3027 ULONG MaxValueNameLen
;
3028 ULONG MaxValueDataLen
;
3030 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
3032 typedef struct _KEY_NODE_INFORMATION
{
3033 LARGE_INTEGER LastWriteTime
;
3039 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
3041 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
3046 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
3048 typedef struct _KEY_VALUE_FULL_INFORMATION
{
3055 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
3057 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
3062 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
3064 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
3068 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
3070 typedef struct _KEY_VALUE_ENTRY
{
3071 PUNICODE_STRING ValueName
;
3075 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
3077 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
3078 KeyValueBasicInformation
,
3079 KeyValueFullInformation
,
3080 KeyValuePartialInformation
,
3081 KeyValueFullInformationAlign64
,
3082 KeyValuePartialInformationAlign64
3083 } KEY_VALUE_INFORMATION_CLASS
;
3085 typedef struct _KEY_WRITE_TIME_INFORMATION
{
3086 LARGE_INTEGER LastWriteTime
;
3087 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
3089 typedef enum _KEY_SET_INFORMATION_CLASS
{
3090 KeyWriteTimeInformation
,
3091 KeyWow64FlagsInformation
,
3092 KeyControlFlagsInformation
,
3093 KeySetVirtualizationInformation
,
3094 KeySetDebugInformation
,
3095 KeySetHandleTagsInformation
,
3097 } KEY_SET_INFORMATION_CLASS
;
3099 typedef enum _REG_NOTIFY_CLASS
{
3101 RegNtPreDeleteKey
= RegNtDeleteKey
,
3103 RegNtPreSetValueKey
= RegNtSetValueKey
,
3104 RegNtDeleteValueKey
,
3105 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
3106 RegNtSetInformationKey
,
3107 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
3109 RegNtPreRenameKey
= RegNtRenameKey
,
3111 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
3112 RegNtEnumerateValueKey
,
3113 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
3115 RegNtPreQueryKey
= RegNtQueryKey
,
3117 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
3118 RegNtQueryMultipleValueKey
,
3119 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
3124 RegNtKeyHandleClose
,
3125 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
3127 RegNtPostSetValueKey
,
3128 RegNtPostDeleteValueKey
,
3129 RegNtPostSetInformationKey
,
3131 RegNtPostEnumerateKey
,
3132 RegNtPostEnumerateValueKey
,
3134 RegNtPostQueryValueKey
,
3135 RegNtPostQueryMultipleValueKey
,
3136 RegNtPostKeyHandleClose
,
3137 RegNtPreCreateKeyEx
,
3138 RegNtPostCreateKeyEx
,
3147 RegNtPreQueryKeySecurity
,
3148 RegNtPostQueryKeySecurity
,
3149 RegNtPreSetKeySecurity
,
3150 RegNtPostSetKeySecurity
,
3151 RegNtCallbackObjectContextCleanup
,
3153 RegNtPostRestoreKey
,
3157 RegNtPostReplaceKey
,
3159 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
3162 (NTAPI
*PEX_CALLBACK_FUNCTION
)(
3163 IN PVOID CallbackContext
,
3168 typedef struct _REG_DELETE_KEY_INFORMATION
{
3171 PVOID ObjectContext
;
3173 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
3174 #if (NTDDI_VERSION >= NTDDI_VISTA)
3175 , REG_FLUSH_KEY_INFORMATION
, *PREG_FLUSH_KEY_INFORMATION
3179 typedef struct _REG_SET_VALUE_KEY_INFORMATION
{
3181 PUNICODE_STRING ValueName
;
3187 PVOID ObjectContext
;
3189 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
3191 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
{
3193 PUNICODE_STRING ValueName
;
3195 PVOID ObjectContext
;
3197 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
3199 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
{
3201 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
3202 PVOID KeySetInformation
;
3203 ULONG KeySetInformationLength
;
3205 PVOID ObjectContext
;
3207 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
3209 typedef struct _REG_ENUMERATE_KEY_INFORMATION
{
3212 KEY_INFORMATION_CLASS KeyInformationClass
;
3213 PVOID KeyInformation
;
3215 PULONG ResultLength
;
3217 PVOID ObjectContext
;
3219 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
3221 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
{
3224 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
3225 PVOID KeyValueInformation
;
3227 PULONG ResultLength
;
3229 PVOID ObjectContext
;
3231 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
3233 typedef struct _REG_QUERY_KEY_INFORMATION
{
3235 KEY_INFORMATION_CLASS KeyInformationClass
;
3236 PVOID KeyInformation
;
3238 PULONG ResultLength
;
3240 PVOID ObjectContext
;
3242 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
3244 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
{
3246 PUNICODE_STRING ValueName
;
3247 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
3248 PVOID KeyValueInformation
;
3250 PULONG ResultLength
;
3252 PVOID ObjectContext
;
3254 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
3256 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
{
3258 PKEY_VALUE_ENTRY ValueEntries
;
3261 PULONG BufferLength
;
3262 PULONG RequiredBufferLength
;
3264 PVOID ObjectContext
;
3266 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
3268 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
{
3269 PUNICODE_STRING CompleteName
;
3270 } REG_PRE_CREATE_KEY_INFORMATION
, REG_PRE_OPEN_KEY_INFORMATION
,*PREG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;;
3272 typedef struct _REG_POST_CREATE_KEY_INFORMATION
{
3273 PUNICODE_STRING CompleteName
;
3276 } REG_POST_CREATE_KEY_INFORMATION
,REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
3278 typedef struct _REG_POST_OPERATION_INFORMATION
{
3281 PVOID PreInformation
;
3282 NTSTATUS ReturnStatus
;
3284 PVOID ObjectContext
;
3286 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
3288 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
{
3291 PVOID ObjectContext
;
3293 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
3296 /******************************************************************************
3297 * Configuration Manager Functions *
3298 ******************************************************************************/
3300 #if (NTDDI_VERSION >= NTDDI_WINXP)
3305 IN PEX_CALLBACK_FUNCTION Function
,
3306 IN PVOID Context OPTIONAL
,
3307 OUT PLARGE_INTEGER Cookie
);
3312 CmUnRegisterCallback(
3313 IN LARGE_INTEGER Cookie
);
3317 /******************************************************************************
3319 ******************************************************************************/
3321 #define RTL_REGISTRY_ABSOLUTE 0
3322 #define RTL_REGISTRY_SERVICES 1
3323 #define RTL_REGISTRY_CONTROL 2
3324 #define RTL_REGISTRY_WINDOWS_NT 3
3325 #define RTL_REGISTRY_DEVICEMAP 4
3326 #define RTL_REGISTRY_USER 5
3327 #define RTL_REGISTRY_MAXIMUM 6
3328 #define RTL_REGISTRY_HANDLE 0x40000000
3329 #define RTL_REGISTRY_OPTIONAL 0x80000000
3331 /* RTL_QUERY_REGISTRY_TABLE.Flags */
3332 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3333 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3334 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3335 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3336 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3337 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3338 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
3340 #define HASH_STRING_ALGORITHM_DEFAULT 0
3341 #define HASH_STRING_ALGORITHM_X65599 1
3342 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
3344 typedef struct _RTL_BITMAP
{
3347 } RTL_BITMAP
, *PRTL_BITMAP
;
3349 typedef struct _RTL_BITMAP_RUN
{
3350 ULONG StartingIndex
;
3352 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
3355 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
3359 IN ULONG ValueLength
,
3361 IN PVOID EntryContext
);
3363 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
3364 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
3370 ULONG DefaultLength
;
3371 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
3373 typedef struct _TIME_FIELDS
{
3380 CSHORT Milliseconds
;
3382 } TIME_FIELDS
, *PTIME_FIELDS
;
3385 #ifndef _SLIST_HEADER_
3386 #define _SLIST_HEADER_
3389 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
3390 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
3393 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
3395 ULONGLONG Alignment
;
3400 ULONGLONG Sequence
:9;
3401 ULONGLONG NextEntry
:39;
3402 ULONGLONG HeaderType
:1;
3404 ULONGLONG Reserved
:59;
3409 ULONGLONG Sequence
:48;
3410 ULONGLONG HeaderType
:1;
3412 ULONGLONG Reserved
:2;
3413 ULONGLONG NextEntry
:60;
3415 } SLIST_HEADER
, *PSLIST_HEADER
;
3417 #define SLIST_ENTRY SINGLE_LIST_ENTRY
3418 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
3419 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
3420 typedef union _SLIST_HEADER
{
3421 ULONGLONG Alignment
;
3427 } SLIST_HEADER
, *PSLIST_HEADER
;
3430 #endif /* _SLIST_HEADER_ */
3433 /******************************************************************************
3435 ******************************************************************************/
3440 OUT PLIST_ENTRY ListHead
)
3442 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
3448 IN OUT PLIST_ENTRY ListHead
,
3449 IN OUT PLIST_ENTRY Entry
)
3451 PLIST_ENTRY OldFlink
;
3452 OldFlink
= ListHead
->Flink
;
3453 Entry
->Flink
= OldFlink
;
3454 Entry
->Blink
= ListHead
;
3455 OldFlink
->Blink
= Entry
;
3456 ListHead
->Flink
= Entry
;
3462 IN OUT PLIST_ENTRY ListHead
,
3463 IN OUT PLIST_ENTRY Entry
)
3465 PLIST_ENTRY OldBlink
;
3466 OldBlink
= ListHead
->Blink
;
3467 Entry
->Flink
= ListHead
;
3468 Entry
->Blink
= OldBlink
;
3469 OldBlink
->Flink
= Entry
;
3470 ListHead
->Blink
= Entry
;
3476 IN CONST LIST_ENTRY
* ListHead
)
3478 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
3484 IN OUT PSINGLE_LIST_ENTRY ListHead
)
3486 PSINGLE_LIST_ENTRY FirstEntry
;
3487 FirstEntry
= ListHead
->Next
;
3488 if (FirstEntry
!= NULL
) {
3489 ListHead
->Next
= FirstEntry
->Next
;
3497 IN OUT PSINGLE_LIST_ENTRY ListHead
,
3498 IN OUT PSINGLE_LIST_ENTRY Entry
)
3500 Entry
->Next
= ListHead
->Next
;
3501 ListHead
->Next
= Entry
;
3507 IN PLIST_ENTRY Entry
)
3509 PLIST_ENTRY OldFlink
;
3510 PLIST_ENTRY OldBlink
;
3512 OldFlink
= Entry
->Flink
;
3513 OldBlink
= Entry
->Blink
;
3514 OldFlink
->Blink
= OldBlink
;
3515 OldBlink
->Flink
= OldFlink
;
3516 return (BOOLEAN
)(OldFlink
== OldBlink
);
3522 IN OUT PLIST_ENTRY ListHead
)
3527 Entry
= ListHead
->Flink
;
3528 Flink
= Entry
->Flink
;
3529 ListHead
->Flink
= Flink
;
3530 Flink
->Blink
= ListHead
;
3537 IN OUT PLIST_ENTRY ListHead
)
3542 Entry
= ListHead
->Blink
;
3543 Blink
= Entry
->Blink
;
3544 ListHead
->Blink
= Blink
;
3545 Blink
->Flink
= ListHead
;
3553 IN PVOID FailedAssertion
,
3555 IN ULONG LineNumber
,
3560 * IN VOID UNALIGNED *Destination,
3561 * IN CONST VOID UNALIGNED *Source,
3564 #define RtlCopyMemory(Destination, Source, Length) \
3565 memcpy(Destination, Source, Length)
3567 #define RtlCopyBytes RtlCopyMemory
3569 #if defined(_M_AMD64)
3573 RtlCopyMemoryNonTemporal(
3574 VOID UNALIGNED
*Destination
,
3575 CONST VOID UNALIGNED
*Source
,
3578 #define RtlCopyMemoryNonTemporal RtlCopyMemory
3586 #define RtlEqualLuid(Luid1, Luid2) \
3587 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
3591 * IN VOID UNALIGNED *Destination,
3592 * IN CONST VOID UNALIGNED *Source,
3595 #define RtlEqualMemory(Destination, Source, Length) \
3596 (!memcmp(Destination, Source, Length))
3600 * IN VOID UNALIGNED *Destination,
3604 #define RtlFillMemory(Destination, Length, Fill) \
3605 memset(Destination, Fill, Length)
3607 #define RtlFillBytes RtlFillMemory
3612 RtlFreeUnicodeString(
3613 IN PUNICODE_STRING UnicodeString
);
3619 IN PUNICODE_STRING GuidString
,
3625 RtlInitUnicodeString(
3626 IN OUT PUNICODE_STRING DestinationString
,
3627 IN PCWSTR SourceString
);
3631 * IN VOID UNALIGNED *Destination,
3632 * IN CONST VOID UNALIGNED *Source,
3635 #define RtlMoveMemory(Destination, Source, Length) \
3636 memmove(Destination, Source, Length)
3643 OUT PUNICODE_STRING GuidString
);
3647 * IN VOID UNALIGNED *Destination,
3650 #define RtlZeroMemory(Destination, Length) \
3651 memset(Destination, 0, Length)
3653 #define RtlZeroBytes RtlZeroMemory
3656 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3661 IN PRTL_BITMAP BitMapHeader
,
3662 IN ULONG StartingIndex
,
3669 IN PRTL_BITMAP BitMapHeader
,
3670 IN ULONG StartingIndex
,
3676 RtlAnsiStringToUnicodeString(
3677 IN OUT PUNICODE_STRING DestinationString
,
3678 IN PANSI_STRING SourceString
,
3679 IN BOOLEAN AllocateDestinationString
);
3684 RtlxAnsiStringToUnicodeSize(
3685 IN PCANSI_STRING AnsiString
);
3687 #define RtlAnsiStringToUnicodeSize(String) ( \
3688 NLS_MB_CODE_PAGE_TAG ? \
3689 RtlxAnsiStringToUnicodeSize(String) : \
3690 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
3696 RtlAppendUnicodeStringToString(
3697 IN OUT PUNICODE_STRING Destination
,
3698 IN PCUNICODE_STRING Source
);
3703 RtlAppendUnicodeToString(
3704 IN OUT PUNICODE_STRING Destination
,
3710 RtlCheckRegistryKey(
3711 IN ULONG RelativeTo
,
3718 IN PRTL_BITMAP BitMapHeader
);
3724 IN PRTL_BITMAP BitMapHeader
,
3725 IN ULONG StartingIndex
,
3726 IN ULONG NumberToClear
);
3732 IN CONST VOID
*Source1
,
3733 IN CONST VOID
*Source2
,
3739 RtlCompareUnicodeString(
3740 IN PCUNICODE_STRING String1
,
3741 IN PCUNICODE_STRING String2
,
3742 IN BOOLEAN CaseInSensitive
);
3747 RtlCompareUnicodeStrings(
3749 IN SIZE_T String1Length
,
3751 IN SIZE_T String2Length
,
3752 IN BOOLEAN CaseInSensitive
);
3757 RtlCopyUnicodeString(
3758 IN OUT PUNICODE_STRING DestinationString
,
3759 IN PCUNICODE_STRING SourceString
);
3764 RtlCreateRegistryKey(
3765 IN ULONG RelativeTo
,
3771 RtlCreateSecurityDescriptor(
3772 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
3778 RtlDeleteRegistryValue(
3779 IN ULONG RelativeTo
,
3781 IN PCWSTR ValueName
);
3786 RtlEqualUnicodeString(
3787 IN CONST UNICODE_STRING
*String1
,
3788 IN CONST UNICODE_STRING
*String2
,
3789 IN BOOLEAN CaseInSensitive
);
3791 #if !defined(_AMD64_) && !defined(_IA64_)
3795 RtlExtendedIntegerMultiply(
3796 IN LARGE_INTEGER Multiplicand
,
3797 IN LONG Multiplier
);
3802 RtlExtendedLargeIntegerDivide(
3803 IN LARGE_INTEGER Dividend
,
3805 IN OUT PULONG Remainder
);
3808 #if defined(_X86_) || defined(_IA64_)
3812 RtlExtendedMagicDivide(
3813 IN LARGE_INTEGER Dividend
,
3814 IN LARGE_INTEGER MagicDivisor
,
3815 IN CCHAR ShiftCount
);
3822 IN PANSI_STRING AnsiString
);
3828 IN PRTL_BITMAP BitMapHeader
,
3829 IN ULONG NumberToFind
,
3830 IN ULONG HintIndex
);
3835 RtlFindClearBitsAndSet(
3836 IN PRTL_BITMAP BitMapHeader
,
3837 IN ULONG NumberToFind
,
3838 IN ULONG HintIndex
);
3843 RtlFindFirstRunClear(
3844 IN PRTL_BITMAP BitMapHeader
,
3845 OUT PULONG StartingIndex
);
3851 IN PRTL_BITMAP BitMapHeader
,
3852 OUT PRTL_BITMAP_RUN RunArray
,
3853 IN ULONG SizeOfRunArray
,
3854 IN BOOLEAN LocateLongestRuns
);
3859 RtlFindLastBackwardRunClear(
3860 IN PRTL_BITMAP BitMapHeader
,
3862 OUT PULONG StartingRunIndex
);
3867 RtlFindLeastSignificantBit(
3873 RtlFindLongestRunClear(
3874 IN PRTL_BITMAP BitMapHeader
,
3875 OUT PULONG StartingIndex
);
3880 RtlFindMostSignificantBit(
3886 RtlFindNextForwardRunClear(
3887 IN PRTL_BITMAP BitMapHeader
,
3889 OUT PULONG StartingRunIndex
);
3895 IN PRTL_BITMAP BitMapHeader
,
3896 IN ULONG NumberToFind
,
3897 IN ULONG HintIndex
);
3902 RtlFindSetBitsAndClear(
3903 IN PRTL_BITMAP BitMapHeader
,
3904 IN ULONG NumberToFind
,
3905 IN ULONG HintIndex
);
3910 RtlHashUnicodeString(
3911 IN CONST UNICODE_STRING
*String
,
3912 IN BOOLEAN CaseInSensitive
,
3913 IN ULONG HashAlgorithm
,
3914 OUT PULONG HashValue
);
3920 IN OUT PANSI_STRING DestinationString
,
3921 IN PCSZ SourceString
);
3926 RtlInitializeBitMap(
3927 IN PRTL_BITMAP BitMapHeader
,
3928 IN PULONG BitMapBuffer
,
3929 IN ULONG SizeOfBitMap
);
3935 IN OUT PSTRING DestinationString
,
3936 IN PCSZ SourceString
);
3941 RtlIntegerToUnicodeString(
3943 IN ULONG Base OPTIONAL
,
3944 IN OUT PUNICODE_STRING String
);
3949 RtlInt64ToUnicodeString(
3951 IN ULONG Base OPTIONAL
,
3952 IN OUT PUNICODE_STRING String
);
3955 #define RtlIntPtrToUnicodeString(Value, Base, String) \
3956 RtlInt64ToUnicodeString(Value, Base, String)
3958 #define RtlIntPtrToUnicodeString(Value, Base, String) \
3959 RtlIntegerToUnicodeString(Value, Base, String)
3966 #define RtlIsZeroLuid(_L1) \
3967 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
3972 RtlLengthSecurityDescriptor(
3973 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
3978 RtlNumberOfClearBits(
3979 IN PRTL_BITMAP BitMapHeader
);
3985 IN PRTL_BITMAP BitMapHeader
);
3990 RtlQueryRegistryValues(
3991 IN ULONG RelativeTo
,
3993 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
3995 IN PVOID Environment OPTIONAL
);
3997 #define LONG_SIZE (sizeof(LONG))
3998 #define LONG_MASK (LONG_SIZE - 1)
4002 * PULONG DestinationAddress,
4003 * PULONG SourceAddress);
4005 #if defined(_AMD64_)
4006 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
4007 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
4009 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
4010 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
4012 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
4013 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
4014 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
4015 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
4019 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
4024 * RtlRetrieveUshort(
4025 * PUSHORT DestinationAddress,
4026 * PUSHORT SourceAddress);
4028 #if defined(_AMD64_)
4029 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
4030 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
4032 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
4033 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
4035 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
4036 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
4040 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
4048 IN PRTL_BITMAP BitMapHeader
);
4054 IN PRTL_BITMAP BitMapHeader
,
4055 IN ULONG StartingIndex
,
4056 IN ULONG NumberToSet
);
4061 RtlSetDaclSecurityDescriptor(
4062 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
4063 IN BOOLEAN DaclPresent
,
4064 IN PACL Dacl OPTIONAL
,
4065 IN BOOLEAN DaclDefaulted OPTIONAL
);
4069 * IN PULONG Address,
4072 #if defined(_AMD64_)
4073 #define RtlStoreUlong(Address,Value) \
4074 *(ULONG UNALIGNED *)(Address) = (Value)
4076 #define RtlStoreUlong(Address,Value) \
4077 if ((ULONG_PTR)(Address) & LONG_MASK) { \
4078 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
4079 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
4080 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
4081 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
4084 *((PULONG)(Address)) = (ULONG) (Value); \
4089 * RtlStoreUlonglong(
4090 * IN OUT PULONGLONG Address,
4093 #if defined(_AMD64_)
4094 #define RtlStoreUlonglong(Address,Value) \
4095 *(ULONGLONG UNALIGNED *)(Address) = (Value)
4097 #define RtlStoreUlonglong(Address,Value) \
4098 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
4099 RtlStoreUlong((ULONG_PTR)(Address), \
4100 (ULONGLONG)(Value) & 0xFFFFFFFF); \
4101 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
4102 (ULONGLONG)(Value) >> 32); \
4104 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
4110 * IN OUT PULONG_PTR Address,
4111 * IN ULONG_PTR Value);
4114 #define RtlStoreUlongPtr(Address,Value) \
4115 RtlStoreUlonglong(Address,Value)
4117 #define RtlStoreUlongPtr(Address,Value) \
4118 RtlStoreUlong(Address,Value)
4123 * IN PUSHORT Address,
4126 #if defined(_AMD64_)
4127 #define RtlStoreUshort(Address,Value) \
4128 *(USHORT UNALIGNED *)(Address) = (Value)
4130 #define RtlStoreUshort(Address,Value) \
4131 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
4132 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
4133 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
4136 *((PUSHORT) (Address)) = (USHORT)Value; \
4143 RtlTimeFieldsToTime(
4144 IN PTIME_FIELDS TimeFields
,
4145 IN PLARGE_INTEGER Time
);
4150 RtlTimeToTimeFields(
4151 IN PLARGE_INTEGER Time
,
4152 IN PTIME_FIELDS TimeFields
);
4163 RtlUlonglongByteSwap(
4164 IN ULONGLONG Source
);
4169 RtlUnicodeStringToAnsiString(
4170 IN OUT PANSI_STRING DestinationString
,
4171 IN PCUNICODE_STRING SourceString
,
4172 IN BOOLEAN AllocateDestinationString
);
4177 RtlxUnicodeStringToAnsiSize(
4178 IN PCUNICODE_STRING UnicodeString
);
4180 #define RtlUnicodeStringToAnsiSize(String) ( \
4181 NLS_MB_CODE_PAGE_TAG ? \
4182 RtlxUnicodeStringToAnsiSize(String) : \
4183 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
4189 RtlUnicodeStringToInteger(
4190 IN PCUNICODE_STRING String
,
4191 IN ULONG Base OPTIONAL
,
4197 RtlUpcaseUnicodeChar(
4198 IN WCHAR SourceCharacter
);
4209 RtlValidRelativeSecurityDescriptor(
4210 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
4211 IN ULONG SecurityDescriptorLength
,
4212 IN SECURITY_INFORMATION RequiredInformation
);
4217 RtlValidSecurityDescriptor(
4218 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
4223 RtlWriteRegistryValue(
4224 IN ULONG RelativeTo
,
4226 IN PCWSTR ValueName
,
4229 IN ULONG ValueLength
);
4231 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
4233 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
4237 RtlPrefetchMemoryNonTemporal(
4242 #if (NTDDI_VERSION >= NTDDI_WINXP)
4247 PRTL_BITMAP BitMapHeader
,
4253 RtlDowncaseUnicodeChar(
4254 IN WCHAR SourceCharacter
);
4260 PRTL_BITMAP BitMapHeader
,
4267 IN PRTL_BITMAP BitMapHeader
,
4268 IN ULONG BitNumber
);
4270 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
4272 #if (NTDDI_VERSION >= NTDDI_VISTA)
4276 RtlNumberOfSetBitsUlongPtr(
4277 IN ULONG_PTR Target
);
4282 RtlIoDecodeMemIoResource (
4283 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
4284 OUT PULONGLONG Alignment OPTIONAL
,
4285 OUT PULONGLONG MinimumAddress OPTIONAL
,
4286 OUT PULONGLONG MaximumAddress OPTIONAL
);
4291 RtlIoEncodeMemIoResource(
4292 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
4294 IN ULONGLONG Length
,
4295 IN ULONGLONG Alignment
,
4296 IN ULONGLONG MinimumAddress
,
4297 IN ULONGLONG MaximumAddress
);
4302 RtlCmDecodeMemIoResource(
4303 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
4304 OUT PULONGLONG Start OPTIONAL
);
4309 RtlFindClosestEncodableLength(
4310 IN ULONGLONG SourceLength
,
4311 OUT PULONGLONG TargetLength
);
4315 #if !defined(MIDL_PASS)
4316 /* inline funftions */
4317 //DECLSPEC_DEPRECATED_DDK_WINXP
4321 RtlConvertLongToLargeInteger(LONG SignedInteger
)
4324 ret
.QuadPart
= SignedInteger
;
4328 //DECLSPEC_DEPRECATED_DDK_WINXP
4332 RtlConvertUlongToLargeInteger(
4333 ULONG UnsignedInteger
)
4336 ret
.QuadPart
= UnsignedInteger
;
4340 //DECLSPEC_DEPRECATED_DDK
4344 RtlEnlargedUnsignedDivide(
4345 IN ULARGE_INTEGER Dividend
,
4347 IN OUT PULONG Remainder
)
4350 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
4351 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
4354 //DECLSPEC_DEPRECATED_DDK
4358 RtlEnlargedUnsignedMultiply(
4359 IN ULONG Multiplicand
,
4360 IN ULONG Multiplier
)
4363 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
4367 //DECLSPEC_DEPRECATED_DDK
4371 RtlEnlargedIntegerMultiply(
4372 IN LONG Multiplicand
,
4376 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
4382 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
4384 IN USHORT BufferSize
)
4386 AnsiString
->Length
= 0;
4387 AnsiString
->MaximumLength
= BufferSize
;
4388 AnsiString
->Buffer
= Buffer
;
4393 RtlInitEmptyUnicodeString(
4394 OUT PUNICODE_STRING UnicodeString
,
4396 IN USHORT BufferSize
)
4398 UnicodeString
->Length
= 0;
4399 UnicodeString
->MaximumLength
= BufferSize
;
4400 UnicodeString
->Buffer
= Buffer
;
4403 #if defined(_AMD64_) || defined(_IA64_)
4407 RtlExtendedIntegerMultiply(
4408 LARGE_INTEGER Multiplicand
,
4412 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
4419 RtlExtendedLargeIntegerDivide(
4420 LARGE_INTEGER Dividend
,
4425 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
4427 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
4432 #if defined(_AMD64_)
4434 #define MultiplyHigh __mulh
4435 #define UnsignedMultiplyHigh __umulh
4437 //DECLSPEC_DEPRECATED_DDK
4441 RtlExtendedMagicDivide(
4442 IN LARGE_INTEGER Dividend
,
4443 IN LARGE_INTEGER MagicDivisor
,
4444 IN CCHAR ShiftCount
)
4449 Pos
= (Dividend
.QuadPart
>= 0);
4450 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
4451 MagicDivisor
.QuadPart
);
4452 ret64
>>= ShiftCount
;
4453 ret
.QuadPart
= Pos
? ret64
: -ret64
;
4458 //DECLSPEC_DEPRECATED_DDK
4463 IN LARGE_INTEGER Addend1
,
4464 IN LARGE_INTEGER Addend2
)
4467 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
4472 * RtlLargeIntegerAnd(
4473 * IN OUT LARGE_INTEGER Result,
4474 * IN LARGE_INTEGER Source,
4475 * IN LARGE_INTEGER Mask);
4477 #define RtlLargeIntegerAnd(Result, Source, Mask) \
4478 Result.QuadPart = Source.QuadPart & Mask.QuadPart
4480 //DECLSPEC_DEPRECATED_DDK
4484 RtlLargeIntegerArithmeticShift(
4485 IN LARGE_INTEGER LargeInteger
,
4486 IN CCHAR ShiftCount
)
4489 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
4494 * RtlLargeIntegerEqualTo(
4495 * IN LARGE_INTEGER Operand1,
4496 * IN LARGE_INTEGER Operand2);
4498 #define RtlLargeIntegerEqualTo(X,Y) \
4499 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
4503 RtlSecureZeroMemory(
4507 volatile char* vptr
= (volatile char*)Pointer
;
4508 #if defined(_M_AMD64)
4509 __stosb((PUCHAR
)vptr
, 0, Size
);
4511 char * endptr
= (char *)vptr
+ Size
;
4512 while (vptr
< endptr
)
4520 #if defined(_M_AMD64)
4524 IN PRTL_BITMAP BitMapHeader
,
4525 IN ULONG BitPosition
)
4527 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
4530 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
4531 #endif // defined(_M_AMD64)
4533 #endif // !defined(MIDL_PASS)
4535 /* Byte Swap Functions */
4536 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
4537 ((defined(_M_AMD64) || defined(_M_IA64)) \
4538 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
4540 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
4541 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
4542 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
4548 #define ASSERT(exp) \
4550 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
4552 #define ASSERTMSG(msg, exp) \
4554 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
4556 #define RTL_SOFT_ASSERT(exp) \
4558 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
4560 #define RTL_SOFT_ASSERTMSG(msg, exp) \
4562 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
4564 #define RTL_VERIFY(exp) ASSERT(exp)
4565 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
4567 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
4568 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
4570 #if defined(_MSC_VER)
4572 #define NT_ASSERT(exp) \
4574 (__annotation(L"Debug", L"AssertFail", L#exp), \
4575 DbgRaiseAssertionFailure(), FALSE) : TRUE)
4577 #define NT_ASSERTMSG(msg, exp) \
4579 (__annotation(L"Debug", L"AssertFail", L##msg), \
4580 DbgRaiseAssertionFailure(), FALSE) : TRUE)
4582 #define NT_ASSERTMSGW(msg, exp) \
4584 (__annotation(L"Debug", L"AssertFail", msg), \
4585 DbgRaiseAssertionFailure(), FALSE) : TRUE)
4589 /* GCC doesn't support __annotation (nor PDB) */
4590 #define NT_ASSERT(exp) \
4591 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
4593 #define NT_ASSERTMSG NT_ASSERT
4594 #define NT_ASSERTMSGW NT_ASSERT
4600 #define ASSERT(exp) ((VOID) 0)
4601 #define ASSERTMSG(msg, exp) ((VOID) 0)
4603 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
4604 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
4606 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
4607 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4609 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
4610 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4612 #define NT_ASSERT(exp) ((VOID)0)
4613 #define NT_ASSERTMSG(exp) ((VOID)0)
4614 #define NT_ASSERTMSGW(exp) ((VOID)0)
4620 /******************************************************************************
4621 * I/O Manager Types *
4622 ******************************************************************************/
4624 /* PCI_COMMON_CONFIG.Command */
4625 #define PCI_ENABLE_IO_SPACE 0x0001
4626 #define PCI_ENABLE_MEMORY_SPACE 0x0002
4627 #define PCI_ENABLE_BUS_MASTER 0x0004
4628 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
4629 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
4630 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
4631 #define PCI_ENABLE_PARITY 0x0040
4632 #define PCI_ENABLE_WAIT_CYCLE 0x0080
4633 #define PCI_ENABLE_SERR 0x0100
4634 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
4635 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
4637 /* PCI_COMMON_CONFIG.Status */
4638 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
4639 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
4640 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
4641 #define PCI_STATUS_UDF_SUPPORTED 0x0040
4642 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
4643 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
4644 #define PCI_STATUS_DEVSEL 0x0600
4645 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
4646 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
4647 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
4648 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
4649 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
4651 /* PCI_COMMON_CONFIG.HeaderType */
4652 #define PCI_MULTIFUNCTION 0x80
4653 #define PCI_DEVICE_TYPE 0x00
4654 #define PCI_BRIDGE_TYPE 0x01
4655 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
4657 #define PCI_CONFIGURATION_TYPE(PciData) \
4658 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
4660 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
4661 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
4663 /* PCI device classes */
4664 #define PCI_CLASS_PRE_20 0x00
4665 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
4666 #define PCI_CLASS_NETWORK_CTLR 0x02
4667 #define PCI_CLASS_DISPLAY_CTLR 0x03
4668 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
4669 #define PCI_CLASS_MEMORY_CTLR 0x05
4670 #define PCI_CLASS_BRIDGE_DEV 0x06
4671 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
4672 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
4673 #define PCI_CLASS_INPUT_DEV 0x09
4674 #define PCI_CLASS_DOCKING_STATION 0x0a
4675 #define PCI_CLASS_PROCESSOR 0x0b
4676 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
4677 #define PCI_CLASS_WIRELESS_CTLR 0x0d
4678 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
4679 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
4680 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
4681 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
4683 /* PCI device subclasses for class 0 */
4684 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
4685 #define PCI_SUBCLASS_PRE_20_VGA 0x01
4687 /* PCI device subclasses for class 1 (mass storage controllers)*/
4688 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
4689 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
4690 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
4691 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
4692 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
4693 #define PCI_SUBCLASS_MSC_OTHER 0x80
4695 /* PCI device subclasses for class 2 (network controllers)*/
4696 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
4697 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
4698 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
4699 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
4700 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
4701 #define PCI_SUBCLASS_NET_OTHER 0x80
4703 /* PCI device subclasses for class 3 (display controllers)*/
4704 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
4705 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
4706 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
4707 #define PCI_SUBCLASS_VID_OTHER 0x80
4709 /* PCI device subclasses for class 4 (multimedia device)*/
4710 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
4711 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
4712 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
4713 #define PCI_SUBCLASS_MM_OTHER 0x80
4715 /* PCI device subclasses for class 5 (memory controller)*/
4716 #define PCI_SUBCLASS_MEM_RAM 0x00
4717 #define PCI_SUBCLASS_MEM_FLASH 0x01
4718 #define PCI_SUBCLASS_MEM_OTHER 0x80
4720 /* PCI device subclasses for class 6 (bridge device)*/
4721 #define PCI_SUBCLASS_BR_HOST 0x00
4722 #define PCI_SUBCLASS_BR_ISA 0x01
4723 #define PCI_SUBCLASS_BR_EISA 0x02
4724 #define PCI_SUBCLASS_BR_MCA 0x03
4725 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
4726 #define PCI_SUBCLASS_BR_PCMCIA 0x05
4727 #define PCI_SUBCLASS_BR_NUBUS 0x06
4728 #define PCI_SUBCLASS_BR_CARDBUS 0x07
4729 #define PCI_SUBCLASS_BR_RACEWAY 0x08
4730 #define PCI_SUBCLASS_BR_OTHER 0x80
4732 /* PCI device subclasses for class C (serial bus controller)*/
4733 #define PCI_SUBCLASS_SB_IEEE1394 0x00
4734 #define PCI_SUBCLASS_SB_ACCESS 0x01
4735 #define PCI_SUBCLASS_SB_SSA 0x02
4736 #define PCI_SUBCLASS_SB_USB 0x03
4737 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
4738 #define PCI_SUBCLASS_SB_SMBUS 0x05
4740 #define PCI_MAX_DEVICES 32
4741 #define PCI_MAX_FUNCTION 8
4742 #define PCI_MAX_BRIDGE_NUMBER 0xFF
4743 #define PCI_INVALID_VENDORID 0xFFFF
4744 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
4746 #define PCI_ADDRESS_IO_SPACE 0x00000001
4747 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
4748 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
4749 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
4750 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
4751 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
4753 #define PCI_TYPE_32BIT 0
4754 #define PCI_TYPE_20BIT 2
4755 #define PCI_TYPE_64BIT 4
4757 #define POOL_COLD_ALLOCATION 256
4758 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
4759 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
4761 #define PCI_TYPE0_ADDRESSES 6
4762 #define PCI_TYPE1_ADDRESSES 2
4763 #define PCI_TYPE2_ADDRESSES 5
4765 #define IO_TYPE_ADAPTER 1
4766 #define IO_TYPE_CONTROLLER 2
4767 #define IO_TYPE_DEVICE 3
4768 #define IO_TYPE_DRIVER 4
4769 #define IO_TYPE_FILE 5
4770 #define IO_TYPE_IRP 6
4771 #define IO_TYPE_MASTER_ADAPTER 7
4772 #define IO_TYPE_OPEN_PACKET 8
4773 #define IO_TYPE_TIMER 9
4774 #define IO_TYPE_VPB 10
4775 #define IO_TYPE_ERROR_LOG 11
4776 #define IO_TYPE_ERROR_MESSAGE 12
4777 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
4779 #define IO_TYPE_CSQ_IRP_CONTEXT 1
4780 #define IO_TYPE_CSQ 2
4781 #define IO_TYPE_CSQ_EX 3
4783 /* IO_RESOURCE_DESCRIPTOR.Option */
4784 #define IO_RESOURCE_PREFERRED 0x01
4785 #define IO_RESOURCE_DEFAULT 0x02
4786 #define IO_RESOURCE_ALTERNATIVE 0x08
4788 /* DEVICE_OBJECT.Flags */
4789 #define DO_VERIFY_VOLUME 0x00000002
4790 #define DO_BUFFERED_IO 0x00000004
4791 #define DO_EXCLUSIVE 0x00000008
4792 #define DO_DIRECT_IO 0x00000010
4793 #define DO_MAP_IO_BUFFER 0x00000020
4794 #define DO_DEVICE_INITIALIZING 0x00000080
4795 #define DO_SHUTDOWN_REGISTERED 0x00000800
4796 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
4797 #define DO_POWER_PAGABLE 0x00002000
4798 #define DO_POWER_INRUSH 0x00004000
4800 /* DEVICE_OBJECT.Characteristics */
4801 #define FILE_REMOVABLE_MEDIA 0x00000001
4802 #define FILE_READ_ONLY_DEVICE 0x00000002
4803 #define FILE_FLOPPY_DISKETTE 0x00000004
4804 #define FILE_WRITE_ONCE_MEDIA 0x00000008
4805 #define FILE_REMOTE_DEVICE 0x00000010
4806 #define FILE_DEVICE_IS_MOUNTED 0x00000020
4807 #define FILE_VIRTUAL_VOLUME 0x00000040
4808 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
4809 #define FILE_DEVICE_SECURE_OPEN 0x00000100
4810 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
4811 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
4812 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
4814 /* DEVICE_OBJECT.AlignmentRequirement */
4815 #define FILE_BYTE_ALIGNMENT 0x00000000
4816 #define FILE_WORD_ALIGNMENT 0x00000001
4817 #define FILE_LONG_ALIGNMENT 0x00000003
4818 #define FILE_QUAD_ALIGNMENT 0x00000007
4819 #define FILE_OCTA_ALIGNMENT 0x0000000f
4820 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
4821 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
4822 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
4823 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
4824 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
4826 /* DEVICE_OBJECT.DeviceType */
4827 #define DEVICE_TYPE ULONG
4829 #define FILE_DEVICE_BEEP 0x00000001
4830 #define FILE_DEVICE_CD_ROM 0x00000002
4831 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
4832 #define FILE_DEVICE_CONTROLLER 0x00000004
4833 #define FILE_DEVICE_DATALINK 0x00000005
4834 #define FILE_DEVICE_DFS 0x00000006
4835 #define FILE_DEVICE_DISK 0x00000007
4836 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
4837 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
4838 #define FILE_DEVICE_INPORT_PORT 0x0000000a
4839 #define FILE_DEVICE_KEYBOARD 0x0000000b
4840 #define FILE_DEVICE_MAILSLOT 0x0000000c
4841 #define FILE_DEVICE_MIDI_IN 0x0000000d
4842 #define FILE_DEVICE_MIDI_OUT 0x0000000e
4843 #define FILE_DEVICE_MOUSE 0x0000000f
4844 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
4845 #define FILE_DEVICE_NAMED_PIPE 0x00000011
4846 #define FILE_DEVICE_NETWORK 0x00000012
4847 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
4848 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
4849 #define FILE_DEVICE_NULL 0x00000015
4850 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
4851 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
4852 #define FILE_DEVICE_PRINTER 0x00000018
4853 #define FILE_DEVICE_SCANNER 0x00000019
4854 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
4855 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
4856 #define FILE_DEVICE_SCREEN 0x0000001c
4857 #define FILE_DEVICE_SOUND 0x0000001d
4858 #define FILE_DEVICE_STREAMS 0x0000001e
4859 #define FILE_DEVICE_TAPE 0x0000001f
4860 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
4861 #define FILE_DEVICE_TRANSPORT 0x00000021
4862 #define FILE_DEVICE_UNKNOWN 0x00000022
4863 #define FILE_DEVICE_VIDEO 0x00000023
4864 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
4865 #define FILE_DEVICE_WAVE_IN 0x00000025
4866 #define FILE_DEVICE_WAVE_OUT 0x00000026
4867 #define FILE_DEVICE_8042_PORT 0x00000027
4868 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
4869 #define FILE_DEVICE_BATTERY 0x00000029
4870 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
4871 #define FILE_DEVICE_MODEM 0x0000002b
4872 #define FILE_DEVICE_VDM 0x0000002c
4873 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
4874 #define FILE_DEVICE_SMB 0x0000002e
4875 #define FILE_DEVICE_KS 0x0000002f
4876 #define FILE_DEVICE_CHANGER 0x00000030
4877 #define FILE_DEVICE_SMARTCARD 0x00000031
4878 #define FILE_DEVICE_ACPI 0x00000032
4879 #define FILE_DEVICE_DVD 0x00000033
4880 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
4881 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
4882 #define FILE_DEVICE_DFS_VOLUME 0x00000036
4883 #define FILE_DEVICE_SERENUM 0x00000037
4884 #define FILE_DEVICE_TERMSRV 0x00000038
4885 #define FILE_DEVICE_KSEC 0x00000039
4886 #define FILE_DEVICE_FIPS 0x0000003a
4887 #define FILE_DEVICE_INFINIBAND 0x0000003b
4888 #define FILE_DEVICE_VMBUS 0x0000003e
4889 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003f
4890 #define FILE_DEVICE_WPD 0x00000040
4891 #define FILE_DEVICE_BLUETOOTH 0x00000041
4892 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
4893 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
4894 #define FILE_DEVICE_BIOMETRIC 0x00000044
4895 #define FILE_DEVICE_PMI 0x00000045
4897 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
4899 typedef struct _OBJECT_HANDLE_INFORMATION
{
4900 ULONG HandleAttributes
;
4901 ACCESS_MASK GrantedAccess
;
4902 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
4904 typedef struct _CLIENT_ID
{
4905 HANDLE UniqueProcess
;
4906 HANDLE UniqueThread
;
4907 } CLIENT_ID
, *PCLIENT_ID
;
4910 (DDKAPI
*PKSTART_ROUTINE
)(
4911 IN PVOID StartContext
);
4913 typedef struct _VPB
{
4917 USHORT VolumeLabelLength
;
4918 struct _DEVICE_OBJECT
*DeviceObject
;
4919 struct _DEVICE_OBJECT
*RealDevice
;
4921 ULONG ReferenceCount
;
4922 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
4925 typedef enum _IO_ALLOCATION_ACTION
{
4928 DeallocateObjectKeepRegisters
4929 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
4931 typedef IO_ALLOCATION_ACTION
4932 (DDKAPI
*PDRIVER_CONTROL
)(
4933 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4934 IN
struct _IRP
*Irp
,
4935 IN PVOID MapRegisterBase
,
4938 typedef struct _WAIT_CONTEXT_BLOCK
{
4939 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
4940 PDRIVER_CONTROL DeviceRoutine
;
4941 PVOID DeviceContext
;
4942 ULONG NumberOfMapRegisters
;
4945 PKDPC BufferChainingDpc
;
4946 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
4948 typedef struct _DEVICE_OBJECT
{
4951 LONG ReferenceCount
;
4952 struct _DRIVER_OBJECT
*DriverObject
;
4953 struct _DEVICE_OBJECT
*NextDevice
;
4954 struct _DEVICE_OBJECT
*AttachedDevice
;
4955 struct _IRP
*CurrentIrp
;
4958 ULONG Characteristics
;
4960 PVOID DeviceExtension
;
4961 DEVICE_TYPE DeviceType
;
4964 LIST_ENTRY ListEntry
;
4965 WAIT_CONTEXT_BLOCK Wcb
;
4967 ULONG AlignmentRequirement
;
4968 KDEVICE_QUEUE DeviceQueue
;
4970 ULONG ActiveThreadCount
;
4971 PSECURITY_DESCRIPTOR SecurityDescriptor
;
4975 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
4977 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
4979 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
4981 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
4983 BOOLEAN Reserved
[3];
4984 volatile LONG IoCount
;
4986 } IO_REMOVE_LOCK_COMMON_BLOCK
;
4988 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
4991 LONGLONG MaxLockedTicks
;
4993 LIST_ENTRY LockList
;
4995 volatile LONG LowMemoryCount
;
4998 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
4999 } IO_REMOVE_LOCK_DBG_BLOCK
;
5001 typedef struct _IO_REMOVE_LOCK
{
5002 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
5004 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
5006 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
5008 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
5011 (DDKAPI IO_WORKITEM_ROUTINE
)(
5012 IN PDEVICE_OBJECT DeviceObject
,
5014 typedef IO_WORKITEM_ROUTINE
*PIO_WORKITEM_ROUTINE
;
5016 typedef struct _SHARE_ACCESS
{
5024 } SHARE_ACCESS
, *PSHARE_ACCESS
;
5026 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
5027 inheritance, even from a struct renders the type non-POD. So we use
5029 #define PCI_COMMON_HEADER_MEMBERS \
5038 UCHAR CacheLineSize; \
5039 UCHAR LatencyTimer; \
5043 struct _PCI_HEADER_TYPE_0 { \
5044 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
5046 USHORT SubVendorID; \
5047 USHORT SubSystemID; \
5048 ULONG ROMBaseAddress; \
5049 UCHAR CapabilitiesPtr; \
5050 UCHAR Reserved1[3]; \
5052 UCHAR InterruptLine; \
5053 UCHAR InterruptPin; \
5054 UCHAR MinimumGrant; \
5055 UCHAR MaximumLatency; \
5057 struct _PCI_HEADER_TYPE_1 { \
5058 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
5060 UCHAR SecondaryBus; \
5061 UCHAR SubordinateBus; \
5062 UCHAR SecondaryLatency; \
5065 USHORT SecondaryStatus; \
5066 USHORT MemoryBase; \
5067 USHORT MemoryLimit; \
5068 USHORT PrefetchBase; \
5069 USHORT PrefetchLimit; \
5070 ULONG PrefetchBaseUpper32; \
5071 ULONG PrefetchLimitUpper32; \
5072 USHORT IOBaseUpper16; \
5073 USHORT IOLimitUpper16; \
5074 UCHAR CapabilitiesPtr; \
5075 UCHAR Reserved1[3]; \
5076 ULONG ROMBaseAddress; \
5077 UCHAR InterruptLine; \
5078 UCHAR InterruptPin; \
5079 USHORT BridgeControl; \
5081 struct _PCI_HEADER_TYPE_2 { \
5082 ULONG SocketRegistersBaseAddress; \
5083 UCHAR CapabilitiesPtr; \
5085 USHORT SecondaryStatus; \
5087 UCHAR SecondaryBus; \
5088 UCHAR SubordinateBus; \
5089 UCHAR SecondaryLatency; \
5093 } Range[PCI_TYPE2_ADDRESSES-1]; \
5094 UCHAR InterruptLine; \
5095 UCHAR InterruptPin; \
5096 USHORT BridgeControl; \
5100 typedef struct _PCI_COMMON_HEADER
{
5101 PCI_COMMON_HEADER_MEMBERS
5102 } PCI_COMMON_HEADER
, *PPCI_COMMON_HEADER
;
5105 typedef struct _PCI_COMMON_CONFIG
{
5106 PCI_COMMON_HEADER_MEMBERS
5107 UCHAR DeviceSpecific
[192];
5108 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
5110 typedef struct _PCI_COMMON_CONFIG
{
5111 PCI_COMMON_HEADER DUMMYSTRUCTNAME
;
5112 UCHAR DeviceSpecific
[192];
5113 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
5116 typedef enum _CREATE_FILE_TYPE
{
5118 CreateFileTypeNamedPipe
,
5119 CreateFileTypeMailslot
5122 #define IO_FORCE_ACCESS_CHECK 0x001
5123 #define IO_NO_PARAMETER_CHECKING 0x100
5125 #define IO_REPARSE 0x0
5126 #define IO_REMOUNT 0x1
5128 typedef union _POWER_STATE
{
5129 SYSTEM_POWER_STATE SystemState
;
5130 DEVICE_POWER_STATE DeviceState
;
5131 } POWER_STATE
, *PPOWER_STATE
;
5133 typedef enum _POWER_STATE_TYPE
{
5134 SystemPowerState
= 0,
5136 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
5138 typedef struct _IO_STATUS_BLOCK
{
5139 _ANONYMOUS_UNION
union {
5143 ULONG_PTR Information
;
5144 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
5147 (DDKAPI
*PREQUEST_POWER_COMPLETE
)(
5148 IN PDEVICE_OBJECT DeviceObject
,
5149 IN UCHAR MinorFunction
,
5150 IN POWER_STATE PowerState
,
5152 IN PIO_STATUS_BLOCK IoStatus
);
5154 typedef struct _PCI_SLOT_NUMBER
{
5157 ULONG DeviceNumber
: 5;
5158 ULONG FunctionNumber
: 3;
5159 ULONG Reserved
: 24;
5163 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
5166 (DDKAPI
*PIO_APC_ROUTINE
)(
5167 IN PVOID ApcContext
,
5168 IN PIO_STATUS_BLOCK IoStatusBlock
,
5172 (DDKAPI
*WMI_NOTIFICATION_CALLBACK
)(
5176 #define EVENT_INCREMENT 1
5177 #define IO_NO_INCREMENT 0
5178 #define IO_CD_ROM_INCREMENT 1
5179 #define IO_DISK_INCREMENT 1
5180 #define IO_KEYBOARD_INCREMENT 6
5181 #define IO_MAILSLOT_INCREMENT 2
5182 #define IO_MOUSE_INCREMENT 6
5183 #define IO_NAMED_PIPE_INCREMENT 2
5184 #define IO_NETWORK_INCREMENT 2
5185 #define IO_PARALLEL_INCREMENT 1
5186 #define IO_SERIAL_INCREMENT 2
5187 #define IO_SOUND_INCREMENT 8
5188 #define IO_VIDEO_INCREMENT 1
5189 #define SEMAPHORE_INCREMENT 1
5191 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
5193 typedef struct _BOOTDISK_INFORMATION
{
5194 LONGLONG BootPartitionOffset
;
5195 LONGLONG SystemPartitionOffset
;
5196 ULONG BootDeviceSignature
;
5197 ULONG SystemDeviceSignature
;
5198 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
5200 typedef struct _BOOTDISK_INFORMATION_EX
{
5201 LONGLONG BootPartitionOffset
;
5202 LONGLONG SystemPartitionOffset
;
5203 ULONG BootDeviceSignature
;
5204 ULONG SystemDeviceSignature
;
5205 GUID BootDeviceGuid
;
5206 GUID SystemDeviceGuid
;
5207 BOOLEAN BootDeviceIsGpt
;
5208 BOOLEAN SystemDeviceIsGpt
;
5209 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
5211 typedef struct _EISA_MEMORY_TYPE
{
5212 UCHAR ReadWrite
: 1;
5214 UCHAR Reserved0
: 1;
5217 UCHAR Reserved1
: 1;
5218 UCHAR MoreEntries
: 1;
5219 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
5221 #include <pshpack1.h>
5222 typedef struct _EISA_MEMORY_CONFIGURATION
{
5223 EISA_MEMORY_TYPE ConfigurationByte
;
5225 USHORT AddressLowWord
;
5226 UCHAR AddressHighByte
;
5228 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
5229 #include <poppack.h>
5231 typedef struct _EISA_IRQ_DESCRIPTOR
{
5232 UCHAR Interrupt
: 4;
5234 UCHAR LevelTriggered
: 1;
5236 UCHAR MoreEntries
: 1;
5237 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
5239 typedef struct _EISA_IRQ_CONFIGURATION
{
5240 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
5242 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
5244 typedef struct _DMA_CONFIGURATION_BYTE0
{
5248 UCHAR MoreEntries
: 1;
5249 } DMA_CONFIGURATION_BYTE0
;
5251 typedef struct _DMA_CONFIGURATION_BYTE1
{
5252 UCHAR Reserved0
: 2;
5253 UCHAR TransferSize
: 2;
5255 UCHAR Reserved1
: 2;
5256 } DMA_CONFIGURATION_BYTE1
;
5258 typedef struct _EISA_DMA_CONFIGURATION
{
5259 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
5260 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
5261 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
5263 #include <pshpack1.h>
5264 typedef struct _EISA_PORT_DESCRIPTOR
{
5265 UCHAR NumberPorts
: 5;
5268 UCHAR MoreEntries
: 1;
5269 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
5271 typedef struct _EISA_PORT_CONFIGURATION
{
5272 EISA_PORT_DESCRIPTOR Configuration
;
5274 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
5275 #include <poppack.h>
5277 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
5281 UCHAR MinorRevision
;
5282 UCHAR MajorRevision
;
5283 UCHAR Selections
[26];
5284 UCHAR FunctionFlags
;
5285 UCHAR TypeString
[80];
5286 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
5287 EISA_IRQ_CONFIGURATION EisaIrq
[7];
5288 EISA_DMA_CONFIGURATION EisaDma
[4];
5289 EISA_PORT_CONFIGURATION EisaPort
[20];
5290 UCHAR InitializationData
[60];
5291 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
5293 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
5295 #define EISA_FUNCTION_ENABLED 0x80
5296 #define EISA_FREE_FORM_DATA 0x40
5297 #define EISA_HAS_PORT_INIT_ENTRY 0x20
5298 #define EISA_HAS_PORT_RANGE 0x10
5299 #define EISA_HAS_DMA_ENTRY 0x08
5300 #define EISA_HAS_IRQ_ENTRY 0x04
5301 #define EISA_HAS_MEMORY_ENTRY 0x02
5302 #define EISA_HAS_TYPE_ENTRY 0x01
5303 #define EISA_HAS_INFORMATION \
5304 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
5305 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
5307 typedef struct _CM_EISA_SLOT_INFORMATION
{
5310 UCHAR MajorRevision
;
5311 UCHAR MinorRevision
;
5313 UCHAR NumberFunctions
;
5314 UCHAR FunctionInformation
;
5316 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
5318 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
5320 #define EISA_INVALID_SLOT 0x80
5321 #define EISA_INVALID_FUNCTION 0x81
5322 #define EISA_INVALID_CONFIGURATION 0x82
5323 #define EISA_EMPTY_SLOT 0x83
5324 #define EISA_INVALID_BIOS_CALL 0x86
5327 ** Plug and Play structures
5331 (DDKAPI
*PINTERFACE_REFERENCE
)(
5335 (DDKAPI
*PINTERFACE_DEREFERENCE
)(
5339 (DDKAPI
*PTRANSLATE_BUS_ADDRESS
)(
5341 IN PHYSICAL_ADDRESS BusAddress
,
5343 IN OUT PULONG AddressSpace
,
5344 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
5346 typedef struct _DMA_ADAPTER
*
5347 (DDKAPI
*PGET_DMA_ADAPTER
)(
5349 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
5350 OUT PULONG NumberOfMapRegisters
);
5353 (DDKAPI
*PGET_SET_DEVICE_DATA
)(
5360 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
5361 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
5362 #define PCI_USE_REVISION 0x00000002
5363 #define PCI_USE_VENDEV_IDS 0x00000004
5364 #define PCI_USE_CLASS_SUBCLASS 0x00000008
5365 #define PCI_USE_PROGIF 0x00000010
5366 #define PCI_USE_LOCAL_BUS 0x00000020
5367 #define PCI_USE_LOCAL_DEVICE 0x00000040
5369 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS
{
5380 } PCI_DEVICE_PRESENCE_PARAMETERS
, *PPCI_DEVICE_PRESENCE_PARAMETERS
;
5383 (DDKAPI
*PPCI_IS_DEVICE_PRESENT
)(
5386 IN UCHAR RevisionID
,
5387 IN USHORT SubVendorID
,
5388 IN USHORT SubSystemID
,
5392 (DDKAPI
*PPCI_IS_DEVICE_PRESENT_EX
)(
5394 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
);
5396 typedef struct _BUS_INTERFACE_STANDARD
{
5400 PINTERFACE_REFERENCE InterfaceReference
;
5401 PINTERFACE_DEREFERENCE InterfaceDereference
;
5402 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
5403 PGET_DMA_ADAPTER GetDmaAdapter
;
5404 PGET_SET_DEVICE_DATA SetBusData
;
5405 PGET_SET_DEVICE_DATA GetBusData
;
5406 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
5408 typedef struct _PCI_DEVICE_PRESENT_INTERFACE
{
5412 PINTERFACE_REFERENCE InterfaceReference
;
5413 PINTERFACE_DEREFERENCE InterfaceDereference
;
5414 PPCI_IS_DEVICE_PRESENT IsDevicePresent
;
5415 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx
;
5416 } PCI_DEVICE_PRESENT_INTERFACE
, *PPCI_DEVICE_PRESENT_INTERFACE
;
5418 typedef struct _DEVICE_CAPABILITIES
{
5423 ULONG LockSupported
: 1;
5424 ULONG EjectSupported
: 1;
5425 ULONG Removable
: 1;
5426 ULONG DockDevice
: 1;
5428 ULONG SilentInstall
: 1;
5429 ULONG RawDeviceOK
: 1;
5430 ULONG SurpriseRemovalOK
: 1;
5431 ULONG WakeFromD0
: 1;
5432 ULONG WakeFromD1
: 1;
5433 ULONG WakeFromD2
: 1;
5434 ULONG WakeFromD3
: 1;
5435 ULONG HardwareDisabled
: 1;
5436 ULONG NonDynamic
: 1;
5437 ULONG WarmEjectSupported
: 1;
5438 ULONG NoDisplayInUI
: 1;
5439 ULONG Reserved
: 14;
5442 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
5443 SYSTEM_POWER_STATE SystemWake
;
5444 DEVICE_POWER_STATE DeviceWake
;
5448 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
5450 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
5454 GUID InterfaceClassGuid
;
5455 PUNICODE_STRING SymbolicLinkName
;
5456 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
5458 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
5462 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
5466 typedef struct _INTERFACE
{
5470 PINTERFACE_REFERENCE InterfaceReference
;
5471 PINTERFACE_DEREFERENCE InterfaceDereference
;
5472 } INTERFACE
, *PINTERFACE
;
5474 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
5478 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
5480 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
5482 /* PNP_DEVICE_STATE */
5484 #define PNP_DEVICE_DISABLED 0x00000001
5485 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
5486 #define PNP_DEVICE_FAILED 0x00000004
5487 #define PNP_DEVICE_REMOVED 0x00000008
5488 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
5489 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
5491 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
5495 struct _FILE_OBJECT
*FileObject
;
5496 LONG NameBufferOffset
;
5497 UCHAR CustomDataBuffer
[1];
5498 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
5500 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
5504 struct _FILE_OBJECT
*FileObject
;
5505 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
5507 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
5508 DeviceUsageTypeUndefined
,
5509 DeviceUsageTypePaging
,
5510 DeviceUsageTypeHibernation
,
5511 DeviceUsageTypeDumpFile
5512 } DEVICE_USAGE_NOTIFICATION_TYPE
;
5514 typedef struct _POWER_SEQUENCE
{
5518 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
5521 DevicePropertyDeviceDescription
= 0x0,
5522 DevicePropertyHardwareID
= 0x1,
5523 DevicePropertyCompatibleIDs
= 0x2,
5524 DevicePropertyBootConfiguration
= 0x3,
5525 DevicePropertyBootConfigurationTranslated
= 0x4,
5526 DevicePropertyClassName
= 0x5,
5527 DevicePropertyClassGuid
= 0x6,
5528 DevicePropertyDriverKeyName
= 0x7,
5529 DevicePropertyManufacturer
= 0x8,
5530 DevicePropertyFriendlyName
= 0x9,
5531 DevicePropertyLocationInformation
= 0xa,
5532 DevicePropertyPhysicalDeviceObjectName
= 0xb,
5533 DevicePropertyBusTypeGuid
= 0xc,
5534 DevicePropertyLegacyBusType
= 0xd,
5535 DevicePropertyBusNumber
= 0xe,
5536 DevicePropertyEnumeratorName
= 0xf,
5537 DevicePropertyAddress
= 0x10,
5538 DevicePropertyUINumber
= 0x11,
5539 DevicePropertyInstallState
= 0x12,
5540 DevicePropertyRemovalPolicy
= 0x13,
5541 DevicePropertyResourceRequirements
= 0x14,
5542 DevicePropertyAllocatedResources
= 0x15,
5543 DevicePropertyContainerID
= 0x16
5544 } DEVICE_REGISTRY_PROPERTY
;
5546 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
5547 EventCategoryReserved
,
5548 EventCategoryHardwareProfileChange
,
5549 EventCategoryDeviceInterfaceChange
,
5550 EventCategoryTargetDeviceChange
5551 } IO_NOTIFICATION_EVENT_CATEGORY
;
5553 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
5556 (DDKAPI
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
5557 IN PVOID NotificationStructure
,
5561 (DDKAPI
*PDEVICE_CHANGE_COMPLETE_CALLBACK
)(
5564 typedef enum _FILE_INFORMATION_CLASS
{
5565 FileDirectoryInformation
= 1,
5566 FileFullDirectoryInformation
,
5567 FileBothDirectoryInformation
,
5568 FileBasicInformation
,
5569 FileStandardInformation
,
5570 FileInternalInformation
,
5572 FileAccessInformation
,
5573 FileNameInformation
,
5574 FileRenameInformation
,
5575 FileLinkInformation
,
5576 FileNamesInformation
,
5577 FileDispositionInformation
,
5578 FilePositionInformation
,
5579 FileFullEaInformation
,
5580 FileModeInformation
,
5581 FileAlignmentInformation
,
5583 FileAllocationInformation
,
5584 FileEndOfFileInformation
,
5585 FileAlternateNameInformation
,
5586 FileStreamInformation
,
5587 FilePipeInformation
,
5588 FilePipeLocalInformation
,
5589 FilePipeRemoteInformation
,
5590 FileMailslotQueryInformation
,
5591 FileMailslotSetInformation
,
5592 FileCompressionInformation
,
5593 FileObjectIdInformation
,
5594 FileCompletionInformation
,
5595 FileMoveClusterInformation
,
5596 FileQuotaInformation
,
5597 FileReparsePointInformation
,
5598 FileNetworkOpenInformation
,
5599 FileAttributeTagInformation
,
5600 FileTrackingInformation
,
5601 FileIdBothDirectoryInformation
,
5602 FileIdFullDirectoryInformation
,
5603 FileValidDataLengthInformation
,
5604 FileShortNameInformation
,
5605 FileIoCompletionNotificationInformation
,
5606 FileIoStatusBlockRangeInformation
,
5607 FileIoPriorityHintInformation
,
5608 FileSfioReserveInformation
,
5609 FileSfioVolumeInformation
,
5610 FileHardLinkInformation
,
5611 FileProcessIdsUsingFileInformation
,
5612 FileNormalizedNameInformation
,
5613 FileNetworkPhysicalNameInformation
,
5614 FileIdGlobalTxDirectoryInformation
,
5615 FileIsRemoteDeviceInformation
,
5616 FileAttributeCacheInformation
,
5617 FileNumaNodeInformation
,
5618 FileStandardLinkInformation
,
5619 FileRemoteProtocolInformation
,
5620 FileMaximumInformation
5621 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
5623 typedef struct _FILE_POSITION_INFORMATION
{
5624 LARGE_INTEGER CurrentByteOffset
;
5625 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
5627 #include <pshpack8.h>
5628 typedef struct _FILE_BASIC_INFORMATION
{
5629 LARGE_INTEGER CreationTime
;
5630 LARGE_INTEGER LastAccessTime
;
5631 LARGE_INTEGER LastWriteTime
;
5632 LARGE_INTEGER ChangeTime
;
5633 ULONG FileAttributes
;
5634 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
5635 #include <poppack.h>
5637 typedef struct _FILE_STANDARD_INFORMATION
{
5638 LARGE_INTEGER AllocationSize
;
5639 LARGE_INTEGER EndOfFile
;
5640 ULONG NumberOfLinks
;
5641 BOOLEAN DeletePending
;
5643 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
5645 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
5646 LARGE_INTEGER CreationTime
;
5647 LARGE_INTEGER LastAccessTime
;
5648 LARGE_INTEGER LastWriteTime
;
5649 LARGE_INTEGER ChangeTime
;
5650 LARGE_INTEGER AllocationSize
;
5651 LARGE_INTEGER EndOfFile
;
5652 ULONG FileAttributes
;
5653 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
5655 typedef enum _FSINFOCLASS
{
5656 FileFsVolumeInformation
= 1,
5657 FileFsLabelInformation
,
5658 FileFsSizeInformation
,
5659 FileFsDeviceInformation
,
5660 FileFsAttributeInformation
,
5661 FileFsControlInformation
,
5662 FileFsFullSizeInformation
,
5663 FileFsObjectIdInformation
,
5664 FileFsDriverPathInformation
,
5665 FileFsVolumeFlagsInformation
,
5666 FileFsMaximumInformation
5667 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
5669 typedef struct _FILE_FS_DEVICE_INFORMATION
{
5670 DEVICE_TYPE DeviceType
;
5671 ULONG Characteristics
;
5672 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
5674 typedef struct _FILE_FULL_EA_INFORMATION
{
5675 ULONG NextEntryOffset
;
5678 USHORT EaValueLength
;
5680 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
5682 #define FM_LOCK_BIT (0x1)
5683 #define FM_LOCK_BIT_V (0x0)
5684 #define FM_LOCK_WAITER_WOKEN (0x2)
5685 #define FM_LOCK_WAITER_INC (0x4)
5687 typedef struct _FAST_MUTEX
{
5688 volatile LONG Count
;
5693 } FAST_MUTEX
, *PFAST_MUTEX
;
5695 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
5697 typedef struct _OWNER_ENTRY
{
5698 ERESOURCE_THREAD OwnerThread
;
5699 _ANONYMOUS_UNION
union {
5703 } OWNER_ENTRY
, *POWNER_ENTRY
;
5705 typedef struct _ERESOURCE
5707 LIST_ENTRY SystemResourcesList
;
5708 POWNER_ENTRY OwnerTable
;
5711 volatile PKSEMAPHORE SharedWaiters
;
5712 volatile PKEVENT ExclusiveWaiters
;
5713 OWNER_ENTRY OwnerEntry
;
5714 ULONG ActiveEntries
;
5715 ULONG ContentionCount
;
5716 ULONG NumberOfSharedWaiters
;
5717 ULONG NumberOfExclusiveWaiters
;
5718 __GNU_EXTENSION
union
5721 ULONG_PTR CreatorBackTraceIndex
;
5723 KSPIN_LOCK SpinLock
;
5724 } ERESOURCE
, *PERESOURCE
;
5726 /* ERESOURCE.Flag */
5727 #define ResourceNeverExclusive 0x0010
5728 #define ResourceReleaseByOtherThread 0x0020
5729 #define ResourceOwnedExclusive 0x0080
5731 #define RESOURCE_HASH_TABLE_SIZE 64
5734 (DDKAPI
*PFAST_IO_CHECK_IF_POSSIBLE
)(
5735 IN
struct _FILE_OBJECT
*FileObject
,
5736 IN PLARGE_INTEGER FileOffset
,
5740 IN BOOLEAN CheckForReadOperation
,
5741 OUT PIO_STATUS_BLOCK IoStatus
,
5742 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5745 (DDKAPI
*PFAST_IO_READ
)(
5746 IN
struct _FILE_OBJECT
*FileObject
,
5747 IN PLARGE_INTEGER FileOffset
,
5752 OUT PIO_STATUS_BLOCK IoStatus
,
5753 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5756 (DDKAPI
*PFAST_IO_WRITE
)(
5757 IN
struct _FILE_OBJECT
*FileObject
,
5758 IN PLARGE_INTEGER FileOffset
,
5763 OUT PIO_STATUS_BLOCK IoStatus
,
5764 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5767 (DDKAPI
*PFAST_IO_QUERY_BASIC_INFO
)(
5768 IN
struct _FILE_OBJECT
*FileObject
,
5770 OUT PFILE_BASIC_INFORMATION Buffer
,
5771 OUT PIO_STATUS_BLOCK IoStatus
,
5772 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5775 (DDKAPI
*PFAST_IO_QUERY_STANDARD_INFO
)(
5776 IN
struct _FILE_OBJECT
*FileObject
,
5778 OUT PFILE_STANDARD_INFORMATION Buffer
,
5779 OUT PIO_STATUS_BLOCK IoStatus
,
5780 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5783 (DDKAPI
*PFAST_IO_LOCK
)(
5784 IN
struct _FILE_OBJECT
*FileObject
,
5785 IN PLARGE_INTEGER FileOffset
,
5786 IN PLARGE_INTEGER Length
,
5787 PEPROCESS ProcessId
,
5789 BOOLEAN FailImmediately
,
5790 BOOLEAN ExclusiveLock
,
5791 OUT PIO_STATUS_BLOCK IoStatus
,
5792 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5795 (DDKAPI
*PFAST_IO_UNLOCK_SINGLE
)(
5796 IN
struct _FILE_OBJECT
*FileObject
,
5797 IN PLARGE_INTEGER FileOffset
,
5798 IN PLARGE_INTEGER Length
,
5799 PEPROCESS ProcessId
,
5801 OUT PIO_STATUS_BLOCK IoStatus
,
5802 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5805 (DDKAPI
*PFAST_IO_UNLOCK_ALL
)(
5806 IN
struct _FILE_OBJECT
*FileObject
,
5807 PEPROCESS ProcessId
,
5808 OUT PIO_STATUS_BLOCK IoStatus
,
5809 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5812 (DDKAPI
*PFAST_IO_UNLOCK_ALL_BY_KEY
)(
5813 IN
struct _FILE_OBJECT
*FileObject
,
5816 OUT PIO_STATUS_BLOCK IoStatus
,
5817 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5820 (DDKAPI
*PFAST_IO_DEVICE_CONTROL
)(
5821 IN
struct _FILE_OBJECT
*FileObject
,
5823 IN PVOID InputBuffer OPTIONAL
,
5824 IN ULONG InputBufferLength
,
5825 OUT PVOID OutputBuffer OPTIONAL
,
5826 IN ULONG OutputBufferLength
,
5827 IN ULONG IoControlCode
,
5828 OUT PIO_STATUS_BLOCK IoStatus
,
5829 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5832 (DDKAPI
*PFAST_IO_ACQUIRE_FILE
)(
5833 IN
struct _FILE_OBJECT
*FileObject
);
5836 (DDKAPI
*PFAST_IO_RELEASE_FILE
)(
5837 IN
struct _FILE_OBJECT
*FileObject
);
5840 (DDKAPI
*PFAST_IO_DETACH_DEVICE
)(
5841 IN
struct _DEVICE_OBJECT
*SourceDevice
,
5842 IN
struct _DEVICE_OBJECT
*TargetDevice
);
5845 (DDKAPI
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
)(
5846 IN
struct _FILE_OBJECT
*FileObject
,
5848 OUT
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
5849 OUT
struct _IO_STATUS_BLOCK
*IoStatus
,
5850 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5853 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
5854 IN
struct _FILE_OBJECT
*FileObject
,
5855 IN PLARGE_INTEGER EndingOffset
,
5856 OUT
struct _ERESOURCE
**ResourceToRelease
,
5857 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5860 (DDKAPI
*PFAST_IO_MDL_READ
)(
5861 IN
struct _FILE_OBJECT
*FileObject
,
5862 IN PLARGE_INTEGER FileOffset
,
5866 OUT PIO_STATUS_BLOCK IoStatus
,
5867 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5870 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE
)(
5871 IN
struct _FILE_OBJECT
*FileObject
,
5873 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5876 (DDKAPI
*PFAST_IO_PREPARE_MDL_WRITE
)(
5877 IN
struct _FILE_OBJECT
*FileObject
,
5878 IN PLARGE_INTEGER FileOffset
,
5882 OUT PIO_STATUS_BLOCK IoStatus
,
5883 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5886 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE
)(
5887 IN
struct _FILE_OBJECT
*FileObject
,
5888 IN PLARGE_INTEGER FileOffset
,
5890 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5893 (DDKAPI
*PFAST_IO_READ_COMPRESSED
)(
5894 IN
struct _FILE_OBJECT
*FileObject
,
5895 IN PLARGE_INTEGER FileOffset
,
5900 OUT PIO_STATUS_BLOCK IoStatus
,
5901 OUT
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
5902 IN ULONG CompressedDataInfoLength
,
5903 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5906 (DDKAPI
*PFAST_IO_WRITE_COMPRESSED
)(
5907 IN
struct _FILE_OBJECT
*FileObject
,
5908 IN PLARGE_INTEGER FileOffset
,
5913 OUT PIO_STATUS_BLOCK IoStatus
,
5914 IN
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
5915 IN ULONG CompressedDataInfoLength
,
5916 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5919 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
5920 IN
struct _FILE_OBJECT
*FileObject
,
5922 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5925 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
5926 IN
struct _FILE_OBJECT
*FileObject
,
5927 IN PLARGE_INTEGER FileOffset
,
5929 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5932 (DDKAPI
*PFAST_IO_QUERY_OPEN
)(
5933 IN
struct _IRP
*Irp
,
5934 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
5935 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5938 (DDKAPI
*PFAST_IO_RELEASE_FOR_MOD_WRITE
)(
5939 IN
struct _FILE_OBJECT
*FileObject
,
5940 IN
struct _ERESOURCE
*ResourceToRelease
,
5941 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5944 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
)(
5945 IN
struct _FILE_OBJECT
*FileObject
,
5946 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5949 (DDKAPI
*PFAST_IO_RELEASE_FOR_CCFLUSH
) (
5950 IN
struct _FILE_OBJECT
*FileObject
,
5951 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5953 typedef struct _FAST_IO_DISPATCH
{
5954 ULONG SizeOfFastIoDispatch
;
5955 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
5956 PFAST_IO_READ FastIoRead
;
5957 PFAST_IO_WRITE FastIoWrite
;
5958 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
5959 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
5960 PFAST_IO_LOCK FastIoLock
;
5961 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
5962 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
5963 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
5964 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
5965 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
5966 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
5967 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
5968 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
5969 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
5970 PFAST_IO_MDL_READ MdlRead
;
5971 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
5972 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
5973 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
5974 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
5975 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
5976 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
5977 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
5978 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
5979 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
5980 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
5981 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
5982 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
5984 typedef struct _SECTION_OBJECT_POINTERS
{
5985 PVOID DataSectionObject
;
5986 PVOID SharedCacheMap
;
5987 PVOID ImageSectionObject
;
5988 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
5990 typedef struct _IO_COMPLETION_CONTEXT
{
5993 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
5995 /* FILE_OBJECT.Flags */
5996 #define FO_FILE_OPEN 0x00000001
5997 #define FO_SYNCHRONOUS_IO 0x00000002
5998 #define FO_ALERTABLE_IO 0x00000004
5999 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
6000 #define FO_WRITE_THROUGH 0x00000010
6001 #define FO_SEQUENTIAL_ONLY 0x00000020
6002 #define FO_CACHE_SUPPORTED 0x00000040
6003 #define FO_NAMED_PIPE 0x00000080
6004 #define FO_STREAM_FILE 0x00000100
6005 #define FO_MAILSLOT 0x00000200
6006 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
6007 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
6008 #define FO_DIRECT_DEVICE_OPEN 0x00000800
6009 #define FO_FILE_MODIFIED 0x00001000
6010 #define FO_FILE_SIZE_CHANGED 0x00002000
6011 #define FO_CLEANUP_COMPLETE 0x00004000
6012 #define FO_TEMPORARY_FILE 0x00008000
6013 #define FO_DELETE_ON_CLOSE 0x00010000
6014 #define FO_OPENED_CASE_SENSITIVE 0x00020000
6015 #define FO_HANDLE_CREATED 0x00040000
6016 #define FO_FILE_FAST_IO_READ 0x00080000
6017 #define FO_RANDOM_ACCESS 0x00100000
6018 #define FO_FILE_OPEN_CANCELLED 0x00200000
6019 #define FO_VOLUME_OPEN 0x00400000
6020 #define FO_REMOTE_ORIGIN 0x01000000
6021 #define FO_DISALLOW_EXCLUSIVE 0x02000000
6022 #define FO_SKIP_COMPLETION_PORT 0x02000000
6023 #define FO_SKIP_SET_EVENT 0x04000000
6024 #define FO_SKIP_SET_FAST_IO 0x08000000
6027 #define VPB_MOUNTED 0x0001
6028 #define VPB_LOCKED 0x0002
6029 #define VPB_PERSISTENT 0x0004
6030 #define VPB_REMOVE_PENDING 0x0008
6031 #define VPB_RAW_MOUNT 0x0010
6032 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
6036 #define SL_FORCE_ACCESS_CHECK 0x01
6037 #define SL_OPEN_PAGING_FILE 0x02
6038 #define SL_OPEN_TARGET_DIRECTORY 0x04
6039 #define SL_CASE_SENSITIVE 0x80
6041 #define SL_KEY_SPECIFIED 0x01
6042 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
6043 #define SL_WRITE_THROUGH 0x04
6044 #define SL_FT_SEQUENTIAL_WRITE 0x08
6046 #define SL_FAIL_IMMEDIATELY 0x01
6047 #define SL_EXCLUSIVE_LOCK 0x02
6049 #define SL_RESTART_SCAN 0x01
6050 #define SL_RETURN_SINGLE_ENTRY 0x02
6051 #define SL_INDEX_SPECIFIED 0x04
6053 #define SL_WATCH_TREE 0x01
6055 #define SL_ALLOW_RAW_MOUNT 0x01
6057 #define CTL_CODE(DeviceType, Function, Method, Access)( \
6058 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
6060 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
6062 #define IRP_NOCACHE 0x00000001
6063 #define IRP_PAGING_IO 0x00000002
6064 #define IRP_MOUNT_COMPLETION 0x00000002
6065 #define IRP_SYNCHRONOUS_API 0x00000004
6066 #define IRP_ASSOCIATED_IRP 0x00000008
6067 #define IRP_BUFFERED_IO 0x00000010
6068 #define IRP_DEALLOCATE_BUFFER 0x00000020
6069 #define IRP_INPUT_OPERATION 0x00000040
6070 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
6071 #define IRP_CREATE_OPERATION 0x00000080
6072 #define IRP_READ_OPERATION 0x00000100
6073 #define IRP_WRITE_OPERATION 0x00000200
6074 #define IRP_CLOSE_OPERATION 0x00000400
6075 #define IRP_DEFER_IO_COMPLETION 0x00000800
6076 #define IRP_OB_QUERY_NAME 0x00001000
6077 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
6079 #define IRP_QUOTA_CHARGED 0x01
6080 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
6081 #define IRP_ALLOCATED_FIXED_SIZE 0x04
6082 #define IRP_LOOKASIDE_ALLOCATION 0x08
6085 ** IRP function codes
6088 #define IRP_MJ_CREATE 0x00
6089 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
6090 #define IRP_MJ_CLOSE 0x02
6091 #define IRP_MJ_READ 0x03
6092 #define IRP_MJ_WRITE 0x04
6093 #define IRP_MJ_QUERY_INFORMATION 0x05
6094 #define IRP_MJ_SET_INFORMATION 0x06
6095 #define IRP_MJ_QUERY_EA 0x07
6096 #define IRP_MJ_SET_EA 0x08
6097 #define IRP_MJ_FLUSH_BUFFERS 0x09
6098 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
6099 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
6100 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
6101 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
6102 #define IRP_MJ_DEVICE_CONTROL 0x0e
6103 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
6104 #define IRP_MJ_SCSI 0x0f
6105 #define IRP_MJ_SHUTDOWN 0x10
6106 #define IRP_MJ_LOCK_CONTROL 0x11
6107 #define IRP_MJ_CLEANUP 0x12
6108 #define IRP_MJ_CREATE_MAILSLOT 0x13
6109 #define IRP_MJ_QUERY_SECURITY 0x14
6110 #define IRP_MJ_SET_SECURITY 0x15
6111 #define IRP_MJ_POWER 0x16
6112 #define IRP_MJ_SYSTEM_CONTROL 0x17
6113 #define IRP_MJ_DEVICE_CHANGE 0x18
6114 #define IRP_MJ_QUERY_QUOTA 0x19
6115 #define IRP_MJ_SET_QUOTA 0x1a
6116 #define IRP_MJ_PNP 0x1b
6117 #define IRP_MJ_PNP_POWER 0x1b
6118 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
6120 #define IRP_MN_SCSI_CLASS 0x01
6122 #define IRP_MN_START_DEVICE 0x00
6123 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
6124 #define IRP_MN_REMOVE_DEVICE 0x02
6125 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
6126 #define IRP_MN_STOP_DEVICE 0x04
6127 #define IRP_MN_QUERY_STOP_DEVICE 0x05
6128 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
6130 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
6131 #define IRP_MN_QUERY_INTERFACE 0x08
6132 #define IRP_MN_QUERY_CAPABILITIES 0x09
6133 #define IRP_MN_QUERY_RESOURCES 0x0A
6134 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
6135 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
6136 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
6138 #define IRP_MN_READ_CONFIG 0x0F
6139 #define IRP_MN_WRITE_CONFIG 0x10
6140 #define IRP_MN_EJECT 0x11
6141 #define IRP_MN_SET_LOCK 0x12
6142 #define IRP_MN_QUERY_ID 0x13
6143 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
6144 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
6145 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
6146 #define IRP_MN_SURPRISE_REMOVAL 0x17
6148 #define IRP_MN_WAIT_WAKE 0x00
6149 #define IRP_MN_POWER_SEQUENCE 0x01
6150 #define IRP_MN_SET_POWER 0x02
6151 #define IRP_MN_QUERY_POWER 0x03
6153 #define IRP_MN_QUERY_ALL_DATA 0x00
6154 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
6155 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
6156 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
6157 #define IRP_MN_ENABLE_EVENTS 0x04
6158 #define IRP_MN_DISABLE_EVENTS 0x05
6159 #define IRP_MN_ENABLE_COLLECTION 0x06
6160 #define IRP_MN_DISABLE_COLLECTION 0x07
6161 #define IRP_MN_REGINFO 0x08
6162 #define IRP_MN_EXECUTE_METHOD 0x09
6164 #define IRP_MN_REGINFO_EX 0x0b
6166 typedef struct _FILE_OBJECT
6170 PDEVICE_OBJECT DeviceObject
;
6174 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
6175 PVOID PrivateCacheMap
;
6176 NTSTATUS FinalStatus
;
6177 struct _FILE_OBJECT
*RelatedFileObject
;
6178 BOOLEAN LockOperation
;
6179 BOOLEAN DeletePending
;
6181 BOOLEAN WriteAccess
;
6182 BOOLEAN DeleteAccess
;
6184 BOOLEAN SharedWrite
;
6185 BOOLEAN SharedDelete
;
6187 UNICODE_STRING FileName
;
6188 LARGE_INTEGER CurrentByteOffset
;
6189 volatile ULONG Waiters
;
6190 volatile ULONG Busy
;
6194 volatile PIO_COMPLETION_CONTEXT CompletionContext
;
6195 KSPIN_LOCK IrpListLock
;
6197 volatile PVOID FileObjectExtension
;
6198 } FILE_OBJECT
, *PFILE_OBJECT
;
6200 typedef struct _IO_ERROR_LOG_PACKET
{
6201 UCHAR MajorFunctionCode
;
6203 USHORT DumpDataSize
;
6204 USHORT NumberOfStrings
;
6205 USHORT StringOffset
;
6206 USHORT EventCategory
;
6208 ULONG UniqueErrorValue
;
6209 NTSTATUS FinalStatus
;
6210 ULONG SequenceNumber
;
6211 ULONG IoControlCode
;
6212 LARGE_INTEGER DeviceOffset
;
6214 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
6216 typedef struct _IO_ERROR_LOG_MESSAGE
{
6219 USHORT DriverNameLength
;
6220 LARGE_INTEGER TimeStamp
;
6221 ULONG DriverNameOffset
;
6222 IO_ERROR_LOG_PACKET EntryData
;
6223 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
6225 #define ERROR_LOG_LIMIT_SIZE 240
6226 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
6227 sizeof(IO_ERROR_LOG_PACKET) + \
6228 (sizeof(WCHAR) * 40))
6229 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
6230 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6231 #define IO_ERROR_LOG_MESSAGE_LENGTH \
6232 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
6233 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
6234 PORT_MAXIMUM_MESSAGE_LENGTH)
6235 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
6236 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6238 typedef enum _DMA_WIDTH
{
6243 } DMA_WIDTH
, *PDMA_WIDTH
;
6245 typedef enum _DMA_SPEED
{
6252 } DMA_SPEED
, *PDMA_SPEED
;
6254 /* DEVICE_DESCRIPTION.Version */
6256 #define DEVICE_DESCRIPTION_VERSION 0x0000
6257 #define DEVICE_DESCRIPTION_VERSION1 0x0001
6258 #define DEVICE_DESCRIPTION_VERSION2 0x0002
6260 typedef struct _DEVICE_DESCRIPTION
{
6263 BOOLEAN ScatterGather
;
6265 BOOLEAN AutoInitialize
;
6266 BOOLEAN Dma32BitAddresses
;
6267 BOOLEAN IgnoreCount
;
6269 BOOLEAN Dma64BitAddresses
;
6272 INTERFACE_TYPE InterfaceType
;
6275 ULONG MaximumLength
;
6277 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
6279 typedef enum _DEVICE_RELATION_TYPE
{
6284 TargetDeviceRelation
,
6287 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
6289 typedef struct _DEVICE_RELATIONS
{
6291 PDEVICE_OBJECT Objects
[1];
6292 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
6294 typedef struct _DEVOBJ_EXTENSION
6298 PDEVICE_OBJECT DeviceObject
;
6299 } DEVOBJ_EXTENSION
, *PDEVOBJ_EXTENSION
;
6301 typedef struct _SCATTER_GATHER_ELEMENT
{
6302 PHYSICAL_ADDRESS Address
;
6305 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
6307 #if defined(_MSC_EXTENSIONS)
6309 #if _MSC_VER >= 1200
6310 #pragma warning(push)
6312 #pragma warning(disable:4200)
6313 typedef struct _SCATTER_GATHER_LIST
{
6314 ULONG NumberOfElements
;
6316 SCATTER_GATHER_ELEMENT Elements
[1];
6317 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
6319 #if _MSC_VER >= 1200
6320 #pragma warning(pop)
6322 #pragma warning(default:4200)
6327 struct _SCATTER_GATHER_LIST
;
6328 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
6333 (DDKAPI DRIVER_ADD_DEVICE
)(
6334 IN
struct _DRIVER_OBJECT
*DriverObject
,
6335 IN
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
6336 typedef DRIVER_ADD_DEVICE
*PDRIVER_ADD_DEVICE
;
6338 typedef struct _DRIVER_EXTENSION
{
6339 struct _DRIVER_OBJECT
*DriverObject
;
6340 PDRIVER_ADD_DEVICE AddDevice
;
6342 UNICODE_STRING ServiceKeyName
;
6343 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
6345 #define DRVO_UNLOAD_INVOKED 0x00000001
6346 #define DRVO_LEGACY_DRIVER 0x00000002
6347 #define DRVO_BUILTIN_DRIVER 0x00000004
6350 (DDKAPI DRIVER_INITIALIZE
)(
6351 IN
struct _DRIVER_OBJECT
*DriverObject
,
6352 IN PUNICODE_STRING RegistryPath
);
6353 typedef DRIVER_INITIALIZE
*PDRIVER_INITIALIZE
;
6356 (DDKAPI DRIVER_STARTIO
)(
6357 IN
struct _DEVICE_OBJECT
*DeviceObject
,
6358 IN
struct _IRP
*Irp
);
6359 typedef DRIVER_STARTIO
*PDRIVER_STARTIO
;
6362 (DDKAPI DRIVER_UNLOAD
)(
6363 IN
struct _DRIVER_OBJECT
*DriverObject
);
6364 typedef DRIVER_UNLOAD
*PDRIVER_UNLOAD
;
6367 (DDKAPI DRIVER_DISPATCH
)(
6368 IN
struct _DEVICE_OBJECT
*DeviceObject
,
6369 IN
struct _IRP
*Irp
);
6370 typedef DRIVER_DISPATCH
*PDRIVER_DISPATCH
;
6372 typedef struct _DRIVER_OBJECT
{
6375 PDEVICE_OBJECT DeviceObject
;
6379 PVOID DriverSection
;
6380 PDRIVER_EXTENSION DriverExtension
;
6381 UNICODE_STRING DriverName
;
6382 PUNICODE_STRING HardwareDatabase
;
6383 struct _FAST_IO_DISPATCH
*FastIoDispatch
;
6384 PDRIVER_INITIALIZE DriverInit
;
6385 PDRIVER_STARTIO DriverStartIo
;
6386 PDRIVER_UNLOAD DriverUnload
;
6387 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
6389 typedef struct _DRIVER_OBJECT
*PDRIVER_OBJECT
;
6391 typedef struct _DMA_ADAPTER
{
6394 struct _DMA_OPERATIONS
* DmaOperations
;
6395 } DMA_ADAPTER
, *PDMA_ADAPTER
;
6398 (DDKAPI
*PPUT_DMA_ADAPTER
)(
6399 IN PDMA_ADAPTER DmaAdapter
);
6402 (DDKAPI
*PALLOCATE_COMMON_BUFFER
)(
6403 IN PDMA_ADAPTER DmaAdapter
,
6405 OUT PPHYSICAL_ADDRESS LogicalAddress
,
6406 IN BOOLEAN CacheEnabled
);
6409 (DDKAPI
*PFREE_COMMON_BUFFER
)(
6410 IN PDMA_ADAPTER DmaAdapter
,
6412 IN PHYSICAL_ADDRESS LogicalAddress
,
6413 IN PVOID VirtualAddress
,
6414 IN BOOLEAN CacheEnabled
);
6417 (DDKAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
6418 IN PDMA_ADAPTER DmaAdapter
,
6419 IN PDEVICE_OBJECT DeviceObject
,
6420 IN ULONG NumberOfMapRegisters
,
6421 IN PDRIVER_CONTROL ExecutionRoutine
,
6425 (DDKAPI
*PFLUSH_ADAPTER_BUFFERS
)(
6426 IN PDMA_ADAPTER DmaAdapter
,
6428 IN PVOID MapRegisterBase
,
6431 IN BOOLEAN WriteToDevice
);
6434 (DDKAPI
*PFREE_ADAPTER_CHANNEL
)(
6435 IN PDMA_ADAPTER DmaAdapter
);
6438 (DDKAPI
*PFREE_MAP_REGISTERS
)(
6439 IN PDMA_ADAPTER DmaAdapter
,
6440 PVOID MapRegisterBase
,
6441 ULONG NumberOfMapRegisters
);
6443 typedef PHYSICAL_ADDRESS
6444 (DDKAPI
*PMAP_TRANSFER
)(
6445 IN PDMA_ADAPTER DmaAdapter
,
6447 IN PVOID MapRegisterBase
,
6449 IN OUT PULONG Length
,
6450 IN BOOLEAN WriteToDevice
);
6453 (DDKAPI
*PGET_DMA_ALIGNMENT
)(
6454 IN PDMA_ADAPTER DmaAdapter
);
6457 (DDKAPI
*PREAD_DMA_COUNTER
)(
6458 IN PDMA_ADAPTER DmaAdapter
);
6461 (DDKAPI
*PDRIVER_LIST_CONTROL
)(
6462 IN
struct _DEVICE_OBJECT
*DeviceObject
,
6463 IN
struct _IRP
*Irp
,
6464 IN
struct _SCATTER_GATHER_LIST
*ScatterGather
,
6468 (DDKAPI
*PGET_SCATTER_GATHER_LIST
)(
6469 IN PDMA_ADAPTER DmaAdapter
,
6470 IN PDEVICE_OBJECT DeviceObject
,
6474 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
6476 IN BOOLEAN WriteToDevice
);
6479 (DDKAPI
*PPUT_SCATTER_GATHER_LIST
)(
6480 IN PDMA_ADAPTER DmaAdapter
,
6481 IN PSCATTER_GATHER_LIST ScatterGather
,
6482 IN BOOLEAN WriteToDevice
);
6485 (DDKAPI
*PCALCULATE_SCATTER_GATHER_LIST_SIZE
)(
6486 IN PDMA_ADAPTER DmaAdapter
,
6487 IN PMDL Mdl OPTIONAL
,
6490 OUT PULONG ScatterGatherListSize
,
6491 OUT PULONG pNumberOfMapRegisters OPTIONAL
);
6494 (DDKAPI
*PBUILD_SCATTER_GATHER_LIST
)(
6495 IN PDMA_ADAPTER DmaAdapter
,
6496 IN PDEVICE_OBJECT DeviceObject
,
6500 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
6502 IN BOOLEAN WriteToDevice
,
6503 IN PVOID ScatterGatherBuffer
,
6504 IN ULONG ScatterGatherLength
);
6507 (DDKAPI
*PBUILD_MDL_FROM_SCATTER_GATHER_LIST
)(
6508 IN PDMA_ADAPTER DmaAdapter
,
6509 IN PSCATTER_GATHER_LIST ScatterGather
,
6510 IN PMDL OriginalMdl
,
6511 OUT PMDL
*TargetMdl
);
6513 typedef struct _DMA_OPERATIONS
{
6515 PPUT_DMA_ADAPTER PutDmaAdapter
;
6516 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
;
6517 PFREE_COMMON_BUFFER FreeCommonBuffer
;
6518 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
6519 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
6520 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
6521 PFREE_MAP_REGISTERS FreeMapRegisters
;
6522 PMAP_TRANSFER MapTransfer
;
6523 PGET_DMA_ALIGNMENT GetDmaAlignment
;
6524 PREAD_DMA_COUNTER ReadDmaCounter
;
6525 PGET_SCATTER_GATHER_LIST GetScatterGatherList
;
6526 PPUT_SCATTER_GATHER_LIST PutScatterGatherList
;
6527 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList
;
6528 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList
;
6529 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList
;
6530 } DMA_OPERATIONS
, *PDMA_OPERATIONS
;
6532 typedef struct _IO_RESOURCE_DESCRIPTOR
{
6535 UCHAR ShareDisposition
;
6543 PHYSICAL_ADDRESS MinimumAddress
;
6544 PHYSICAL_ADDRESS MaximumAddress
;
6549 PHYSICAL_ADDRESS MinimumAddress
;
6550 PHYSICAL_ADDRESS MaximumAddress
;
6553 ULONG MinimumVector
;
6554 ULONG MaximumVector
;
6557 ULONG MinimumChannel
;
6558 ULONG MaximumChannel
;
6563 PHYSICAL_ADDRESS MinimumAddress
;
6564 PHYSICAL_ADDRESS MaximumAddress
;
6581 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
6583 typedef struct _IO_RESOURCE_LIST
{
6587 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
6588 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
6590 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
6592 INTERFACE_TYPE InterfaceType
;
6596 ULONG AlternativeLists
;
6597 IO_RESOURCE_LIST List
[1];
6598 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
6601 (DDKAPI DRIVER_CANCEL
)(
6602 IN
struct _DEVICE_OBJECT
*DeviceObject
,
6603 IN
struct _IRP
*Irp
);
6604 typedef DRIVER_CANCEL
*PDRIVER_CANCEL
;
6606 typedef struct _IRP
{
6609 struct _MDL
*MdlAddress
;
6612 struct _IRP
*MasterIrp
;
6613 volatile LONG IrpCount
;
6616 LIST_ENTRY ThreadListEntry
;
6617 IO_STATUS_BLOCK IoStatus
;
6618 KPROCESSOR_MODE RequestorMode
;
6619 BOOLEAN PendingReturned
;
6621 CHAR CurrentLocation
;
6624 CCHAR ApcEnvironment
;
6625 UCHAR AllocationFlags
;
6626 PIO_STATUS_BLOCK UserIosb
;
6630 _ANONYMOUS_UNION
union {
6631 PIO_APC_ROUTINE UserApcRoutine
;
6632 PVOID IssuingProcess
;
6634 PVOID UserApcContext
;
6635 } AsynchronousParameters
;
6636 LARGE_INTEGER AllocationSize
;
6638 volatile PDRIVER_CANCEL CancelRoutine
;
6642 _ANONYMOUS_UNION
union {
6643 KDEVICE_QUEUE_ENTRY DeviceQueueEntry
;
6644 _ANONYMOUS_STRUCT
struct {
6645 PVOID DriverContext
[4];
6649 PCHAR AuxiliaryBuffer
;
6650 _ANONYMOUS_STRUCT
struct {
6651 LIST_ENTRY ListEntry
;
6652 _ANONYMOUS_UNION
union {
6653 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
6657 struct _FILE_OBJECT
*OriginalFileObject
;
6660 PVOID CompletionKey
;
6663 typedef struct _IRP
*PIRP
;
6665 typedef enum _IO_PAGING_PRIORITY
{
6666 IoPagingPriorityInvalid
,
6667 IoPagingPriorityNormal
,
6668 IoPagingPriorityHigh
,
6669 IoPagingPriorityReserved1
,
6670 IoPagingPriorityReserved2
6671 } IO_PAGING_PRIORITY
;
6674 (DDKAPI IO_COMPLETION_ROUTINE
)(
6675 IN
struct _DEVICE_OBJECT
*DeviceObject
,
6676 IN
struct _IRP
*Irp
,
6678 typedef IO_COMPLETION_ROUTINE
*PIO_COMPLETION_ROUTINE
;
6681 (DDKAPI
*PIO_DPC_ROUTINE
)(
6682 IN
struct _KDPC
*Dpc
,
6683 IN
struct _DEVICE_OBJECT
*DeviceObject
,
6684 IN
struct _IRP
*Irp
,
6688 (DDKAPI
*PMM_DLL_INITIALIZE
)(
6689 IN PUNICODE_STRING RegistryPath
);
6692 (DDKAPI
*PMM_DLL_UNLOAD
)(
6696 (DDKAPI KSERVICE_ROUTINE
)(
6697 IN
struct _KINTERRUPT
*Interrupt
,
6698 IN PVOID ServiceContext
);
6699 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
6702 (DDKAPI
*PIO_TIMER_ROUTINE
)(
6703 IN
struct _DEVICE_OBJECT
*DeviceObject
,
6707 (DDKAPI
*PKSYNCHRONIZE_ROUTINE
)(
6708 IN PVOID SynchronizeContext
);
6710 typedef struct _IO_SECURITY_CONTEXT
{
6711 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
6712 PACCESS_STATE AccessState
;
6713 ACCESS_MASK DesiredAccess
;
6714 ULONG FullCreateOptions
;
6715 } IO_SECURITY_CONTEXT
, *PIO_SECURITY_CONTEXT
;
6719 typedef struct _IO_CSQ_IRP_CONTEXT
{
6722 struct _IO_CSQ
*Csq
;
6723 } IO_CSQ_IRP_CONTEXT
, *PIO_CSQ_IRP_CONTEXT
;
6726 (DDKAPI
*PIO_CSQ_INSERT_IRP
)(
6727 IN
struct _IO_CSQ
*Csq
,
6731 (DDKAPI
*PIO_CSQ_REMOVE_IRP
)(
6732 IN
struct _IO_CSQ
*Csq
,
6736 (DDKAPI
*PIO_CSQ_PEEK_NEXT_IRP
)(
6737 IN
struct _IO_CSQ
*Csq
,
6739 IN PVOID PeekContext
);
6742 (DDKAPI
*PIO_CSQ_ACQUIRE_LOCK
)(
6743 IN
struct _IO_CSQ
*Csq
,
6747 (DDKAPI
*PIO_CSQ_RELEASE_LOCK
)(
6748 IN
struct _IO_CSQ
*Csq
,
6752 (DDKAPI
*PIO_CSQ_COMPLETE_CANCELED_IRP
)(
6753 IN
struct _IO_CSQ
*Csq
,
6756 typedef struct _IO_CSQ
{
6758 PIO_CSQ_INSERT_IRP CsqInsertIrp
;
6759 PIO_CSQ_REMOVE_IRP CsqRemoveIrp
;
6760 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
;
6761 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
;
6762 PIO_CSQ_RELEASE_LOCK CsqReleaseLock
;
6763 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
;
6764 PVOID ReservePointer
;
6767 typedef enum _BUS_QUERY_ID_TYPE
{
6769 BusQueryHardwareIDs
,
6770 BusQueryCompatibleIDs
,
6772 BusQueryDeviceSerialNumber
6773 } BUS_QUERY_ID_TYPE
, *PBUS_QUERY_ID_TYPE
;
6775 typedef enum _DEVICE_TEXT_TYPE
{
6776 DeviceTextDescription
,
6777 DeviceTextLocationInformation
6778 } DEVICE_TEXT_TYPE
, *PDEVICE_TEXT_TYPE
;
6780 typedef enum _WORK_QUEUE_TYPE
{
6783 HyperCriticalWorkQueue
,
6787 #if !defined(_AMD64_) && !defined(_IA64_)
6788 #include <pshpack4.h>
6790 typedef struct _IO_STACK_LOCATION
{
6791 UCHAR MajorFunction
;
6792 UCHAR MinorFunction
;
6797 PIO_SECURITY_CONTEXT SecurityContext
;
6799 USHORT POINTER_ALIGNMENT FileAttributes
;
6801 ULONG POINTER_ALIGNMENT EaLength
;
6805 ULONG POINTER_ALIGNMENT Key
;
6806 LARGE_INTEGER ByteOffset
;
6810 ULONG POINTER_ALIGNMENT Key
;
6811 LARGE_INTEGER ByteOffset
;
6815 PUNICODE_STRING FileName
;
6816 FILE_INFORMATION_CLASS FileInformationClass
;
6821 ULONG CompletionFilter
;
6825 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
6829 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
6830 PFILE_OBJECT FileObject
;
6831 _ANONYMOUS_UNION
union {
6832 _ANONYMOUS_STRUCT
struct {
6833 BOOLEAN ReplaceIfExists
;
6834 BOOLEAN AdvanceOnly
;
6837 HANDLE DeleteHandle
;
6851 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass
;
6855 FS_INFORMATION_CLASS FsInformationClass
;
6858 ULONG OutputBufferLength
;
6859 ULONG InputBufferLength
;
6860 ULONG FsControlCode
;
6861 PVOID Type3InputBuffer
;
6862 } FileSystemControl
;
6864 PLARGE_INTEGER Length
;
6866 LARGE_INTEGER ByteOffset
;
6869 ULONG OutputBufferLength
;
6870 ULONG POINTER_ALIGNMENT InputBufferLength
;
6871 ULONG POINTER_ALIGNMENT IoControlCode
;
6872 PVOID Type3InputBuffer
;
6875 SECURITY_INFORMATION SecurityInformation
;
6876 ULONG POINTER_ALIGNMENT Length
;
6879 SECURITY_INFORMATION SecurityInformation
;
6880 PSECURITY_DESCRIPTOR SecurityDescriptor
;
6884 PDEVICE_OBJECT DeviceObject
;
6888 PDEVICE_OBJECT DeviceObject
;
6891 struct _SCSI_REQUEST_BLOCK
*Srb
;
6896 struct _FILE_GET_QUOTA_INFORMATION
*SidList
;
6897 ULONG SidListLength
;
6903 DEVICE_RELATION_TYPE Type
;
6904 } QueryDeviceRelations
;
6906 CONST GUID
*InterfaceType
;
6909 PINTERFACE Interface
;
6910 PVOID InterfaceSpecificData
;
6913 PDEVICE_CAPABILITIES Capabilities
;
6914 } DeviceCapabilities
;
6916 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList
;
6917 } FilterResourceRequirements
;
6922 ULONG POINTER_ALIGNMENT Length
;
6928 BUS_QUERY_ID_TYPE IdType
;
6931 DEVICE_TEXT_TYPE DeviceTextType
;
6932 LCID POINTER_ALIGNMENT LocaleId
;
6936 BOOLEAN Reserved
[3];
6937 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type
;
6938 } UsageNotification
;
6940 SYSTEM_POWER_STATE PowerState
;
6943 PPOWER_SEQUENCE PowerSequence
;
6946 ULONG SystemContext
;
6947 POWER_STATE_TYPE POINTER_ALIGNMENT Type
;
6948 POWER_STATE POINTER_ALIGNMENT State
;
6949 POWER_ACTION POINTER_ALIGNMENT ShutdownType
;
6952 PCM_RESOURCE_LIST AllocatedResources
;
6953 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
6956 ULONG_PTR ProviderId
;
6968 PDEVICE_OBJECT DeviceObject
;
6969 PFILE_OBJECT FileObject
;
6970 PIO_COMPLETION_ROUTINE CompletionRoutine
;
6972 } IO_STACK_LOCATION
, *PIO_STACK_LOCATION
;
6973 #if !defined(_AMD64_) && !defined(_IA64_)
6974 #include <poppack.h>
6977 /* IO_STACK_LOCATION.Control */
6979 #define SL_PENDING_RETURNED 0x01
6980 #define SL_ERROR_RETURNED 0x02
6981 #define SL_INVOKE_ON_CANCEL 0x20
6982 #define SL_INVOKE_ON_SUCCESS 0x40
6983 #define SL_INVOKE_ON_ERROR 0x80
6985 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
6987 #define PCI_WHICHSPACE_CONFIG 0x0
6988 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
6991 /******************************************************************************
6992 * I/O Manager Functions *
6993 ******************************************************************************/
6995 #if !defined(_M_AMD64)
6999 READ_PORT_BUFFER_UCHAR(
7007 READ_PORT_BUFFER_ULONG(
7015 READ_PORT_BUFFER_USHORT(
7041 READ_REGISTER_BUFFER_UCHAR(
7049 READ_REGISTER_BUFFER_ULONG(
7057 READ_REGISTER_BUFFER_USHORT(
7058 IN PUSHORT Register
,
7065 READ_REGISTER_UCHAR(
7066 IN PUCHAR Register
);
7071 READ_REGISTER_ULONG(
7072 IN PULONG Register
);
7077 READ_REGISTER_USHORT(
7078 IN PUSHORT Register
);
7083 WRITE_PORT_BUFFER_UCHAR(
7091 WRITE_PORT_BUFFER_ULONG(
7099 WRITE_PORT_BUFFER_USHORT(
7128 WRITE_REGISTER_BUFFER_UCHAR(
7136 WRITE_REGISTER_BUFFER_ULONG(
7144 WRITE_REGISTER_BUFFER_USHORT(
7145 IN PUSHORT Register
,
7152 WRITE_REGISTER_UCHAR(
7159 WRITE_REGISTER_ULONG(
7166 WRITE_REGISTER_USHORT(
7167 IN PUSHORT Register
,
7174 READ_PORT_BUFFER_UCHAR(
7179 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7184 READ_PORT_BUFFER_ULONG(
7189 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7194 READ_PORT_BUFFER_USHORT(
7199 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7207 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
7215 return __indword((USHORT
)(ULONG_PTR
)Port
);
7223 return __inword((USHORT
)(ULONG_PTR
)Port
);
7228 READ_REGISTER_BUFFER_UCHAR(
7233 __movsb(Register
, Buffer
, Count
);
7238 READ_REGISTER_BUFFER_ULONG(
7243 __movsd(Register
, Buffer
, Count
);
7248 READ_REGISTER_BUFFER_USHORT(
7249 IN PUSHORT Register
,
7253 __movsw(Register
, Buffer
, Count
);
7258 READ_REGISTER_UCHAR(
7259 IN
volatile UCHAR
*Register
)
7266 READ_REGISTER_ULONG(
7267 IN
volatile ULONG
*Register
)
7274 READ_REGISTER_USHORT(
7275 IN
volatile USHORT
*Register
)
7282 WRITE_PORT_BUFFER_UCHAR(
7287 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7292 WRITE_PORT_BUFFER_ULONG(
7297 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7302 WRITE_PORT_BUFFER_USHORT(
7307 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7316 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
7325 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
7334 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
7339 WRITE_REGISTER_BUFFER_UCHAR(
7345 __movsb(Register
, Buffer
, Count
);
7346 InterlockedOr(&Synch
, 1);
7351 WRITE_REGISTER_BUFFER_ULONG(
7357 __movsd(Register
, Buffer
, Count
);
7358 InterlockedOr(&Synch
, 1);
7363 WRITE_REGISTER_BUFFER_USHORT(
7364 IN PUSHORT Register
,
7369 __movsw(Register
, Buffer
, Count
);
7370 InterlockedOr(&Synch
, 1);
7375 WRITE_REGISTER_UCHAR(
7376 IN
volatile UCHAR
*Register
,
7381 InterlockedOr(&Synch
, 1);
7386 WRITE_REGISTER_ULONG(
7387 IN
volatile ULONG
*Register
,
7392 InterlockedOr(&Synch
, 1);
7397 WRITE_REGISTER_USHORT(
7398 IN
volatile USHORT
*Register
,
7403 InterlockedOr(&Sync
, 1);
7407 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
7408 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
7410 #define DMA_MACROS_DEFINED
7414 IoAllocateAdapterChannel(
7415 IN PDMA_ADAPTER DmaAdapter
,
7416 IN PDEVICE_OBJECT DeviceObject
,
7417 IN ULONG NumberOfMapRegisters
,
7418 IN PDRIVER_CONTROL ExecutionRoutine
,
7421 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
7422 AllocateAdapterChannel
=
7423 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
7424 ASSERT(AllocateAdapterChannel
);
7425 return AllocateAdapterChannel(DmaAdapter
,
7427 NumberOfMapRegisters
,
7435 IoFlushAdapterBuffers(
7436 IN PDMA_ADAPTER DmaAdapter
,
7438 IN PVOID MapRegisterBase
,
7441 IN BOOLEAN WriteToDevice
)
7443 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
7444 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
7445 ASSERT(FlushAdapterBuffers
);
7446 return FlushAdapterBuffers(DmaAdapter
,
7457 IoFreeAdapterChannel(
7458 IN PDMA_ADAPTER DmaAdapter
)
7460 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
7461 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
7462 ASSERT(FreeAdapterChannel
);
7463 FreeAdapterChannel(DmaAdapter
);
7470 IN PDMA_ADAPTER DmaAdapter
,
7471 IN PVOID MapRegisterBase
,
7472 IN ULONG NumberOfMapRegisters
)
7474 PFREE_MAP_REGISTERS FreeMapRegisters
;
7475 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
7476 ASSERT(FreeMapRegisters
);
7477 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
7484 IN PDMA_ADAPTER DmaAdapter
,
7486 IN PVOID MapRegisterBase
,
7488 IN OUT PULONG Length
,
7489 IN BOOLEAN WriteToDevice
)
7491 PMAP_TRANSFER MapTransfer
;
7493 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
7494 ASSERT(MapTransfer
);
7495 return MapTransfer(DmaAdapter
,
7504 #if (NTDDI_VERSION >= NTDDI_WIN2K)
7508 IoAcquireCancelSpinLock(
7514 IoAcquireRemoveLockEx(
7515 IN PIO_REMOVE_LOCK RemoveLock
,
7516 IN PVOID Tag OPTIONAL
,
7519 IN ULONG RemlockSize
);
7524 * IoAcquireRemoveLock(
7525 * IN PIO_REMOVE_LOCK RemoveLock,
7526 * IN OPTIONAL PVOID Tag)
7529 #define IoAcquireRemoveLock(RemoveLock, Tag) \
7530 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
7532 #define IoAcquireRemoveLock(RemoveLock, Tag) \
7533 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
7538 * IoAdjustPagingPathCount(
7540 * IN BOOLEAN Increment)
7542 #define IoAdjustPagingPathCount(_Count, \
7547 InterlockedIncrement(_Count); \
7551 InterlockedDecrement(_Count); \
7555 #if (NTDDI_VERSION >= NTDDI_WIN2K)
7560 IoAllocateDriverObjectExtension(
7561 IN PDRIVER_OBJECT DriverObject
,
7562 IN PVOID ClientIdentificationAddress
,
7563 IN ULONG DriverObjectExtensionSize
,
7564 OUT PVOID
*DriverObjectExtension
);
7569 IoAllocateErrorLogEntry(
7571 IN UCHAR EntrySize
);
7578 IN BOOLEAN ChargeQuota
);
7584 IN PVOID VirtualAddress OPTIONAL
,
7586 IN BOOLEAN SecondaryBuffer
,
7587 IN BOOLEAN ChargeQuota
,
7588 IN OUT PIRP Irp OPTIONAL
);
7594 IN PDEVICE_OBJECT DeviceObject
);
7600 IN PDEVICE_OBJECT SourceDevice
,
7601 IN PUNICODE_STRING TargetDevice
,
7602 OUT PDEVICE_OBJECT
*AttachedDevice
);
7607 IoAttachDeviceToDeviceStack(
7608 IN PDEVICE_OBJECT SourceDevice
,
7609 IN PDEVICE_OBJECT TargetDevice
);
7614 IoBuildAsynchronousFsdRequest(
7615 IN ULONG MajorFunction
,
7616 IN PDEVICE_OBJECT DeviceObject
,
7617 IN OUT PVOID Buffer OPTIONAL
,
7618 IN ULONG Length OPTIONAL
,
7619 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
7620 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
7625 IoBuildDeviceIoControlRequest(
7626 IN ULONG IoControlCode
,
7627 IN PDEVICE_OBJECT DeviceObject
,
7628 IN PVOID InputBuffer OPTIONAL
,
7629 IN ULONG InputBufferLength
,
7630 OUT PVOID OutputBuffer OPTIONAL
,
7631 IN ULONG OutputBufferLength
,
7632 IN BOOLEAN InternalDeviceIoControl
,
7634 OUT PIO_STATUS_BLOCK IoStatusBlock
);
7641 IN OUT PMDL TargetMdl
,
7642 IN PVOID VirtualAddress
,
7648 IoBuildSynchronousFsdRequest(
7649 IN ULONG MajorFunction
,
7650 IN PDEVICE_OBJECT DeviceObject
,
7651 IN OUT PVOID Buffer OPTIONAL
,
7652 IN ULONG Length OPTIONAL
,
7653 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
7655 OUT PIO_STATUS_BLOCK IoStatusBlock
);
7661 IN PDEVICE_OBJECT DeviceObject
,
7663 #define IoCallDriver IofCallDriver
7670 IN CCHAR PriorityBoost
);
7671 #define IoCompleteRequest IofCompleteRequest
7683 IN ACCESS_MASK DesiredAccess
,
7684 IN ULONG DesiredShareAccess
,
7685 IN OUT PFILE_OBJECT FileObject
,
7686 IN OUT PSHARE_ACCESS ShareAccess
,
7694 IN CCHAR PriorityBoost
);
7700 OUT PKINTERRUPT
*InterruptObject
,
7701 IN PKSERVICE_ROUTINE ServiceRoutine
,
7702 IN PVOID ServiceContext OPTIONAL
,
7703 IN PKSPIN_LOCK SpinLock OPTIONAL
,
7706 IN KIRQL SynchronizeIrql
,
7707 IN KINTERRUPT_MODE InterruptMode
,
7708 IN BOOLEAN ShareVector
,
7709 IN KAFFINITY ProcessorEnableMask
,
7710 IN BOOLEAN FloatingSave
);
7716 IN PDRIVER_OBJECT DriverObject
,
7717 IN ULONG DeviceExtensionSize
,
7718 IN PUNICODE_STRING DeviceName OPTIONAL
,
7719 IN DEVICE_TYPE DeviceType
,
7720 IN ULONG DeviceCharacteristics
,
7721 IN BOOLEAN Exclusive
,
7722 OUT PDEVICE_OBJECT
*DeviceObject
);
7728 OUT PHANDLE FileHandle
,
7729 IN ACCESS_MASK DesiredAccess
,
7730 IN POBJECT_ATTRIBUTES ObjectAttributes
,
7731 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7732 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
7733 IN ULONG FileAttributes
,
7734 IN ULONG ShareAccess
,
7735 IN ULONG Disposition
,
7736 IN ULONG CreateOptions
,
7737 IN PVOID EaBuffer OPTIONAL
,
7739 IN CREATE_FILE_TYPE CreateFileType
,
7740 IN PVOID InternalParameters OPTIONAL
,
7746 IoCreateNotificationEvent(
7747 IN PUNICODE_STRING EventName
,
7748 OUT PHANDLE EventHandle
);
7753 IoCreateSymbolicLink(
7754 IN PUNICODE_STRING SymbolicLinkName
,
7755 IN PUNICODE_STRING DeviceName
);
7760 IoCreateSynchronizationEvent(
7761 IN PUNICODE_STRING EventName
,
7762 OUT PHANDLE EventHandle
);
7767 IoCreateUnprotectedSymbolicLink(
7768 IN PUNICODE_STRING SymbolicLinkName
,
7769 IN PUNICODE_STRING DeviceName
);
7775 IN PDEVICE_OBJECT DeviceObject
);
7780 IoDeleteSymbolicLink(
7781 IN PUNICODE_STRING SymbolicLinkName
);
7787 IN OUT PDEVICE_OBJECT TargetDevice
);
7792 IoDisconnectInterrupt(
7793 IN PKINTERRUPT InterruptObject
);
7811 IN PIO_WORKITEM IoWorkItem
);
7816 IoGetAttachedDevice(
7817 IN PDEVICE_OBJECT DeviceObject
);
7822 IoGetAttachedDeviceReference(
7823 IN PDEVICE_OBJECT DeviceObject
);
7828 IoGetBootDiskInformation(
7829 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
7835 IoGetDeviceInterfaceAlias(
7836 IN PUNICODE_STRING SymbolicLinkName
,
7837 IN CONST GUID
*AliasInterfaceClassGuid
,
7838 OUT PUNICODE_STRING AliasSymbolicLinkName
);
7843 IoGetCurrentProcess(
7849 IoGetDeviceInterfaces(
7850 IN CONST GUID
*InterfaceClassGuid
,
7851 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
7853 OUT PWSTR
*SymbolicLinkList
);
7858 IoGetDeviceObjectPointer(
7859 IN PUNICODE_STRING ObjectName
,
7860 IN ACCESS_MASK DesiredAccess
,
7861 OUT PFILE_OBJECT
*FileObject
,
7862 OUT PDEVICE_OBJECT
*DeviceObject
);
7867 IoGetDeviceProperty(
7868 IN PDEVICE_OBJECT DeviceObject
,
7869 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
7870 IN ULONG BufferLength
,
7871 OUT PVOID PropertyBuffer
,
7872 OUT PULONG ResultLength
);
7878 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
7879 IN PDEVICE_DESCRIPTION DeviceDescription
,
7880 IN OUT PULONG NumberOfMapRegisters
);
7885 IoGetDriverObjectExtension(
7886 IN PDRIVER_OBJECT DriverObject
,
7887 IN PVOID ClientIdentificationAddress
);
7898 IoGetRelatedDeviceObject(
7899 IN PFILE_OBJECT FileObject
);
7905 IN PIO_WORKITEM IoWorkItem
,
7906 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
7907 IN WORK_QUEUE_TYPE QueueType
,
7908 IN PVOID Context OPTIONAL
);
7915 IN PKDEFERRED_ROUTINE DeferredRoutine
,
7916 IN PVOID DeferredContext OPTIONAL
);
7923 IN USHORT PacketSize
,
7924 IN CCHAR StackSize
);
7929 IoInitializeRemoveLockEx(
7930 IN PIO_REMOVE_LOCK Lock
,
7931 IN ULONG AllocateTag
,
7932 IN ULONG MaxLockedMinutes
,
7933 IN ULONG HighWatermark
,
7934 IN ULONG RemlockSize
);
7940 IN PDEVICE_OBJECT DeviceObject
,
7941 IN PIO_TIMER_ROUTINE TimerRoutine
,
7942 IN PVOID Context OPTIONAL
);
7947 IoInvalidateDeviceRelations(
7948 IN PDEVICE_OBJECT DeviceObject
,
7949 IN DEVICE_RELATION_TYPE Type
);
7954 IoInvalidateDeviceState(
7955 IN PDEVICE_OBJECT PhysicalDeviceObject
);
7960 IoIsWdmVersionAvailable(
7961 IN UCHAR MajorVersion
,
7962 IN UCHAR MinorVersion
);
7967 IoOpenDeviceInterfaceRegistryKey(
7968 IN PUNICODE_STRING SymbolicLinkName
,
7969 IN ACCESS_MASK DesiredAccess
,
7970 OUT PHANDLE DeviceInterfaceKey
);
7975 IoOpenDeviceRegistryKey(
7976 IN PDEVICE_OBJECT DeviceObject
,
7977 IN ULONG DevInstKeyType
,
7978 IN ACCESS_MASK DesiredAccess
,
7979 OUT PHANDLE DevInstRegKey
);
7984 IoRegisterDeviceInterface(
7985 IN PDEVICE_OBJECT PhysicalDeviceObject
,
7986 IN CONST GUID
*InterfaceClassGuid
,
7987 IN PUNICODE_STRING ReferenceString OPTIONAL
,
7988 OUT PUNICODE_STRING SymbolicLinkName
);
7993 IoRegisterPlugPlayNotification(
7994 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
7995 IN ULONG EventCategoryFlags
,
7996 IN PVOID EventCategoryData OPTIONAL
,
7997 IN PDRIVER_OBJECT DriverObject
,
7998 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
7999 IN OUT PVOID Context OPTIONAL
,
8000 OUT PVOID
*NotificationEntry
);
8005 IoRegisterShutdownNotification(
8006 IN PDEVICE_OBJECT DeviceObject
);
8011 IoReleaseCancelSpinLock(
8017 IoReleaseRemoveLockAndWaitEx(
8018 IN PIO_REMOVE_LOCK RemoveLock
,
8019 IN PVOID Tag OPTIONAL
,
8020 IN ULONG RemlockSize
);
8025 IoReleaseRemoveLockEx(
8026 IN PIO_REMOVE_LOCK RemoveLock
,
8027 IN PVOID Tag OPTIONAL
,
8028 IN ULONG RemlockSize
);
8033 IoRemoveShareAccess(
8034 IN PFILE_OBJECT FileObject
,
8035 IN OUT PSHARE_ACCESS ShareAccess
);
8040 IoReportTargetDeviceChange(
8041 IN PDEVICE_OBJECT PhysicalDeviceObject
,
8042 IN PVOID NotificationStructure
);
8047 IoReportTargetDeviceChangeAsynchronous(
8048 IN PDEVICE_OBJECT PhysicalDeviceObject
,
8049 IN PVOID NotificationStructure
,
8050 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
8051 IN PVOID Context OPTIONAL
);
8056 IoRequestDeviceEject(
8057 IN PDEVICE_OBJECT PhysicalDeviceObject
);
8064 IN NTSTATUS Status
);
8069 IoSetDeviceInterfaceState(
8070 IN PUNICODE_STRING SymbolicLinkName
,
8077 IN ACCESS_MASK DesiredAccess
,
8078 IN ULONG DesiredShareAccess
,
8079 IN OUT PFILE_OBJECT FileObject
,
8080 OUT PSHARE_ACCESS ShareAccess
);
8086 IN PDEVICE_OBJECT DeviceObject
,
8087 IN BOOLEAN Cancelable
);
8092 IoStartNextPacketByKey(
8093 IN PDEVICE_OBJECT DeviceObject
,
8094 IN BOOLEAN Cancelable
,
8101 IN PDEVICE_OBJECT DeviceObject
,
8103 IN PULONG Key OPTIONAL
,
8104 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
8110 IN PDEVICE_OBJECT DeviceObject
);
8116 IN PDEVICE_OBJECT DeviceObject
);
8121 IoUnregisterPlugPlayNotification(
8122 IN PVOID NotificationEntry
);
8127 IoUnregisterShutdownNotification(
8128 IN PDEVICE_OBJECT DeviceObject
);
8133 IoUpdateShareAccess(
8134 IN PFILE_OBJECT FileObject
,
8135 IN OUT PSHARE_ACCESS ShareAccess
);
8140 IoWMIAllocateInstanceIds(
8142 IN ULONG InstanceCount
,
8143 OUT ULONG
*FirstInstanceId
);
8148 IoWMIQuerySingleInstanceMultiple(
8149 IN PVOID
*DataBlockObjectList
,
8150 IN PUNICODE_STRING InstanceNames
,
8151 IN ULONG ObjectCount
,
8152 IN OUT ULONG
*InOutBufferSize
,
8153 OUT PVOID OutBuffer
);
8158 IoWMIRegistrationControl(
8159 IN PDEVICE_OBJECT DeviceObject
,
8165 IoWMISuggestInstanceName(
8166 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
8167 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
8168 IN BOOLEAN CombineNames
,
8169 OUT PUNICODE_STRING SuggestedInstanceName
);
8175 IN PVOID WnodeEventItem
);
8180 IoWriteErrorLogEntry(
8185 #if (NTDDI_VERSION >= NTDDI_WINXP)
8192 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
8193 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
8194 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
8195 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
8196 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
8197 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
8205 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
);
8212 IN PIO_CSQ_IRP_CONTEXT Context
);
8219 IN PVOID PeekContext
);
8224 IoForwardIrpSynchronously(
8225 IN PDEVICE_OBJECT DeviceObject
,
8228 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
8233 IoFreeErrorLogEntry(
8239 IoSetCompletionRoutineEx(
8240 IN PDEVICE_OBJECT DeviceObject
,
8242 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
8244 IN BOOLEAN InvokeOnSuccess
,
8245 IN BOOLEAN InvokeOnError
,
8246 IN BOOLEAN InvokeOnCancel
);
8251 IoSetStartIoAttributes(
8252 IN PDEVICE_OBJECT DeviceObject
,
8253 IN BOOLEAN DeferredStartIo
,
8254 IN BOOLEAN NonCancelable
);
8259 IoWMIDeviceObjectToInstanceName(
8260 IN PVOID DataBlockObject
,
8261 IN PDEVICE_OBJECT DeviceObject
,
8262 OUT PUNICODE_STRING InstanceName
);
8268 IN PVOID DataBlockObject
,
8269 IN PUNICODE_STRING InstanceName
,
8271 IN ULONG InBufferSize
,
8272 IN OUT PULONG OutBufferSize
,
8273 IN OUT PUCHAR InOutBuffer
);
8278 IoWMIHandleToInstanceName(
8279 IN PVOID DataBlockObject
,
8280 IN HANDLE FileHandle
,
8281 OUT PUNICODE_STRING InstanceName
);
8287 IN GUID
*DataBlockGuid
,
8288 IN ULONG DesiredAccess
,
8289 OUT PVOID
*DataBlockObject
);
8295 IN PVOID DataBlockObject
,
8296 IN OUT ULONG
*InOutBufferSize
,
8297 OUT PVOID OutBuffer
);
8302 IoWMIQueryAllDataMultiple(
8303 IN PVOID
*DataBlockObjectList
,
8304 IN ULONG ObjectCount
,
8305 IN OUT ULONG
*InOutBufferSize
,
8306 OUT PVOID OutBuffer
);
8311 IoWMIQuerySingleInstance(
8312 IN PVOID DataBlockObject
,
8313 IN PUNICODE_STRING InstanceName
,
8314 IN OUT ULONG
*InOutBufferSize
,
8315 OUT PVOID OutBuffer
);
8320 IoWMISetNotificationCallback(
8321 IN OUT PVOID Object
,
8322 IN WMI_NOTIFICATION_CALLBACK Callback
,
8323 IN PVOID Context OPTIONAL
);
8328 IoWMISetSingleInstance(
8329 IN PVOID DataBlockObject
,
8330 IN PUNICODE_STRING InstanceName
,
8332 IN ULONG ValueBufferSize
,
8333 IN PVOID ValueBuffer
);
8339 IN PVOID DataBlockObject
,
8340 IN PUNICODE_STRING InstanceName
,
8341 IN ULONG DataItemId
,
8343 IN ULONG ValueBufferSize
,
8344 IN PVOID ValueBuffer
);
8352 IoWMIDeviceObjectToProviderId(
8353 IN PDEVICE_OBJECT DeviceObject
);
8355 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
8361 * IN CCHAR StackSize)
8363 #define IoSizeOfIrp(_StackSize) \
8364 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
8368 IoSkipCurrentIrpStackLocation (
8371 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
8372 Irp
->CurrentLocation
++;
8373 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
8378 IoSetNextIrpStackLocation (
8381 ASSERT(Irp
->CurrentLocation
> 0);
8382 Irp
->CurrentLocation
--;
8383 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
8388 IoGetNextIrpStackLocation(
8391 ASSERT(Irp
->CurrentLocation
> 0);
8392 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
8397 IoSetCompletionRoutine(
8399 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
8400 IN PVOID Context OPTIONAL
,
8401 IN BOOLEAN InvokeOnSuccess
,
8402 IN BOOLEAN InvokeOnError
,
8403 IN BOOLEAN InvokeOnCancel
)
8405 PIO_STACK_LOCATION irpSp
;
8406 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
8407 irpSp
= IoGetNextIrpStackLocation(Irp
);
8408 irpSp
->CompletionRoutine
= CompletionRoutine
;
8409 irpSp
->Context
= Context
;
8412 if (InvokeOnSuccess
) {
8413 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
8416 if (InvokeOnError
) {
8417 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
8420 if (InvokeOnCancel
) {
8421 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
8427 * IoSetCancelRoutine(
8429 * IN PDRIVER_CANCEL CancelRoutine)
8431 #define IoSetCancelRoutine(_Irp, \
8433 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
8434 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
8439 * IN PDEVICE_OBJECT DeviceObject,
8441 * IN PVOID Context);
8443 #define IoRequestDpc(DeviceObject, Irp, Context)( \
8444 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
8448 * IoReleaseRemoveLock(
8449 * IN PIO_REMOVE_LOCK RemoveLock,
8452 #define IoReleaseRemoveLock(_RemoveLock, \
8454 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8458 * IoReleaseRemoveLockAndWait(
8459 * IN PIO_REMOVE_LOCK RemoveLock,
8462 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
8464 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8471 IN PIRP Irp OPTIONAL
);
8475 #define PLUGPLAY_REGKEY_DEVICE 1
8476 #define PLUGPLAY_REGKEY_DRIVER 2
8477 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
8481 IoGetCurrentIrpStackLocation(
8484 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
8485 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
8493 IoGetCurrentIrpStackLocation( (Irp
) )->Control
|= SL_PENDING_RETURNED
;
8498 * IoIsErrorUserInduced(
8499 * IN NTSTATUS Status);
8501 #define IoIsErrorUserInduced(Status) \
8502 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
8503 ((Status) == STATUS_IO_TIMEOUT) || \
8504 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
8505 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
8506 ((Status) == STATUS_VERIFY_REQUIRED) || \
8507 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
8508 ((Status) == STATUS_WRONG_VOLUME)))
8511 * IoInitializeRemoveLock(
8512 * IN PIO_REMOVE_LOCK Lock,
8513 * IN ULONG AllocateTag,
8514 * IN ULONG MaxLockedMinutes,
8515 * IN ULONG HighWatermark)
8517 #define IoInitializeRemoveLock( \
8518 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
8519 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
8520 HighWatermark, sizeof(IO_REMOVE_LOCK))
8524 IoInitializeDpcRequest(
8525 IN PDEVICE_OBJECT DeviceObject
,
8526 IN PIO_DPC_ROUTINE DpcRoutine
)
8528 KeInitializeDpc( &DeviceObject
->Dpc
,
8529 (PKDEFERRED_ROUTINE
) DpcRoutine
,
8533 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
8537 * IoGetFunctionCodeFromCtlCode(
8538 * IN ULONG ControlCode)
8540 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
8541 (((_ControlCode) >> 2) & 0x00000FFF)
8545 IoCopyCurrentIrpStackLocationToNext(
8548 PIO_STACK_LOCATION irpSp
;
8549 PIO_STACK_LOCATION nextIrpSp
;
8550 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
8551 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
8552 RtlCopyMemory( nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
8553 nextIrpSp
->Control
= 0;
8560 OUT PULONG_PTR LowLimit
,
8561 OUT PULONG_PTR HighLimit
);
8565 IoGetRemainingStackSize(
8568 ULONG_PTR End
, Begin
;
8571 IoGetStackLimits(&Begin
, &End
);
8572 Result
= (ULONG_PTR
)(&End
) - Begin
;
8577 /******************************************************************************
8578 * WINBASE Functions *
8579 ******************************************************************************/
8580 #if !defined(_WINBASE_)
8582 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
8586 InitializeSListHead(
8587 OUT PSLIST_HEADER SListHead
);
8593 InitializeSListHead(
8594 OUT PSLIST_HEADER SListHead
)
8597 ULONG64 FeatureBits
;
8601 if (((ULONG_PTR
)SListHead
& 0xf) != 0)
8603 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
8607 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
8610 FeatureBits
= __getReg(CV_IA64_CPUID4
);
8611 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0)
8613 SListHead
->Header16
.HeaderType
= 1;
8614 SListHead
->Header16
.Init
= 1;
8623 #define InterlockedPopEntrySList(Head) \
8624 ExpInterlockedPopEntrySList(Head)
8626 #define InterlockedPushEntrySList(Head, Entry) \
8627 ExpInterlockedPushEntrySList(Head, Entry)
8629 #define InterlockedFlushSList(Head) \
8630 ExpInterlockedFlushSList(Head)
8632 #define QueryDepthSList(Head) \
8633 ExQueryDepthSList(Head)
8635 #else // !defined(_WIN64)
8640 InterlockedPopEntrySList(
8641 IN PSLIST_HEADER ListHead
);
8646 InterlockedPushEntrySList(
8647 IN PSLIST_HEADER ListHead
,
8648 IN PSLIST_ENTRY ListEntry
);
8650 #define InterlockedFlushSList(ListHead) \
8651 ExInterlockedFlushSList(ListHead)
8653 #define QueryDepthSList(Head) \
8654 ExQueryDepthSList(Head)
8656 #endif // !defined(_WIN64)
8658 #endif // !defined(_WINBASE_)
8661 /******************************************************************************
8663 ******************************************************************************/
8665 #define EX_RUNDOWN_ACTIVE 0x1
8666 #define EX_RUNDOWN_COUNT_SHIFT 0x1
8667 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
8670 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
8672 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
8675 typedef enum _POOL_TYPE
{
8678 NonPagedPoolMustSucceed
,
8680 NonPagedPoolCacheAligned
,
8681 PagedPoolCacheAligned
,
8682 NonPagedPoolCacheAlignedMustS
,
8684 NonPagedPoolSession
= 32,
8686 NonPagedPoolMustSucceedSession
,
8687 DontUseThisTypeSession
,
8688 NonPagedPoolCacheAlignedSession
,
8689 PagedPoolCacheAlignedSession
,
8690 NonPagedPoolCacheAlignedMustSSession
8693 typedef enum _SUITE_TYPE
{
8697 CommunicationServer
,
8699 SmallBusinessRestricted
,
8708 typedef enum _EX_POOL_PRIORITY
{
8710 LowPoolPrioritySpecialPoolOverrun
= 8,
8711 LowPoolPrioritySpecialPoolUnderrun
= 9,
8712 NormalPoolPriority
= 16,
8713 NormalPoolPrioritySpecialPoolOverrun
= 24,
8714 NormalPoolPrioritySpecialPoolUnderrun
= 25,
8715 HighPoolPriority
= 32,
8716 HighPoolPrioritySpecialPoolOverrun
= 40,
8717 HighPoolPrioritySpecialPoolUnderrun
= 41
8720 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
8721 #define LOOKASIDE_ALIGN
8723 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
8726 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
8729 (DDKAPI
*PALLOCATE_FUNCTION
)(
8730 IN POOL_TYPE PoolType
,
8731 IN SIZE_T NumberOfBytes
,
8735 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
8736 IN POOL_TYPE PoolType
,
8737 IN SIZE_T NumberOfBytes
,
8739 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
8742 (DDKAPI
*PFREE_FUNCTION
)(
8746 (DDKAPI
*PFREE_FUNCTION_EX
)(
8748 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
8751 (DDKAPI
*PCALLBACK_FUNCTION
)(
8752 IN PVOID CallbackContext
,
8754 IN PVOID Argument2
);
8756 #define GENERAL_LOOKASIDE_LAYOUT \
8758 SLIST_HEADER ListHead; \
8759 SINGLE_LIST_ENTRY SingleListHead; \
8762 USHORT MaximumDepth; \
8763 ULONG TotalAllocates; \
8765 ULONG AllocateMisses; \
8766 ULONG AllocateHits; \
8767 } DUMMYUNIONNAME2; \
8773 } DUMMYUNIONNAME3; \
8779 PALLOCATE_FUNCTION_EX AllocateEx; \
8780 PALLOCATE_FUNCTION Allocate; \
8781 } DUMMYUNIONNAME4; \
8784 PFREE_FUNCTION_EX FreeEx; \
8785 PFREE_FUNCTION Free; \
8786 } DUMMYUNIONNAME5; \
8788 LIST_ENTRY ListEntry; \
8789 ULONG LastTotalAllocates; \
8791 ULONG LastAllocateMisses; \
8792 ULONG LastAllocateHits; \
8793 } DUMMYUNIONNAME6; \
8796 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
8797 GENERAL_LOOKASIDE_LAYOUT
8798 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
8800 typedef struct _GENERAL_LOOKASIDE_POOL
{
8801 GENERAL_LOOKASIDE_LAYOUT
8802 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
8804 typedef struct _PAGED_LOOKASIDE_LIST
{
8805 GENERAL_LOOKASIDE L
;
8806 #if !defined(_AMD64_) && !defined(_IA64_)
8807 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
8809 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
8811 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
8812 GENERAL_LOOKASIDE L
;
8813 #if !defined(_AMD64_) && !defined(_IA64_)
8814 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
8816 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
8818 typedef struct _LOOKASIDE_LIST_EX
{
8819 GENERAL_LOOKASIDE_POOL L
;
8820 } LOOKASIDE_LIST_EX
;
8822 typedef struct _EX_RUNDOWN_REF
{
8823 __GNU_EXTENSION
union {
8824 volatile ULONG_PTR Count
;
8827 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
8829 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
8832 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
8833 IN PVOID Parameter
);
8835 typedef struct _WORK_QUEUE_ITEM
{
8837 PWORKER_THREAD_ROUTINE WorkerRoutine
;
8838 volatile PVOID Parameter
;
8839 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
8842 /******************************************************************************
8843 * Executive Functions *
8844 ******************************************************************************/
8846 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
8847 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
8848 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
8850 #define ExInitializeSListHead InitializeSListHead
8853 #if defined(_NTHAL_)
8854 #define ExAcquireFastMutex ExiAcquireFastMutex
8855 #define ExReleaseFastMutex ExiReleaseFastMutex
8856 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
8858 #define ExInterlockedAddUlong ExfInterlockedAddUlong
8859 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
8860 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
8861 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
8862 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
8863 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
8868 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
8869 defined(_NTHAL_) || defined(_NTOSP_)
8872 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
8876 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
8878 return (USHORT
)(ListHead
->Alignment
& 0xffff);
8884 ExpInterlockedFlushSList(
8885 PSLIST_HEADER ListHead
);
8889 ExpInterlockedPopEntrySList(
8890 PSLIST_HEADER ListHead
);
8894 ExpInterlockedPushEntrySList(
8895 PSLIST_HEADER ListHead
,
8896 PSLIST_ENTRY ListEntry
);
8898 #define ExInterlockedFlushSList(Head) \
8899 ExpInterlockedFlushSList(Head)
8900 #define ExInterlockedPopEntrySList(Head, Lock) \
8901 ExpInterlockedPopEntrySList(Head)
8902 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
8903 ExpInterlockedPushEntrySList(Head, Entry)
8905 #else // !defined(_WIN64)
8907 #define ExQueryDepthSList(listhead) (listhead)->Depth
8912 ExInterlockedFlushSList(
8913 IN PSLIST_HEADER ListHead
);
8915 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
8919 ExInterlockedPopEntrySList(
8920 IN PSLIST_HEADER ListHead
,
8921 IN PKSPIN_LOCK Lock
);
8926 ExInterlockedPushEntrySList(
8927 IN PSLIST_HEADER ListHead
,
8928 IN PSINGLE_LIST_ENTRY ListEntry
,
8929 IN PKSPIN_LOCK Lock
);
8931 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
8932 InterlockedPopEntrySList(_ListHead)
8933 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
8934 InterlockedPushEntrySList(_ListHead, _ListEntry)
8935 #endif // _WIN2K_COMPAT_SLIST_USAGE
8937 #endif // !defined(_WIN64)
8940 * ExGetCurrentResourceThread(
8943 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
8945 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
8948 * ExInitializeWorkItem(
8949 * IN PWORK_QUEUE_ITEM Item,
8950 * IN PWORKER_THREAD_ROUTINE Routine,
8953 #define ExInitializeWorkItem(Item, Routine, Context) \
8955 (Item)->WorkerRoutine = Routine; \
8956 (Item)->Parameter = Context; \
8957 (Item)->List.Flink = NULL; \
8962 ExInitializeFastMutex(
8963 OUT PFAST_MUTEX FastMutex
)
8965 FastMutex
->Count
= FM_LOCK_BIT
;
8966 FastMutex
->Owner
= NULL
;
8967 FastMutex
->Contention
= 0;
8968 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
8972 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8978 IN OUT PFAST_MUTEX FastMutex
);
8984 IN OUT PFAST_MUTEX FastMutex
);
8989 ExTryToAcquireFastMutex(
8990 IN OUT PFAST_MUTEX FastMutex
);
8995 ExAcquireFastMutexUnsafe(
8996 IN OUT PFAST_MUTEX FastMutex
);
9001 ExReleaseFastMutexUnsafe(
9002 IN OUT PFAST_MUTEX FastMutex
);
9007 ExAcquireResourceExclusiveLite(
9008 IN PERESOURCE Resource
,
9014 ExAcquireResourceSharedLite(
9015 IN PERESOURCE Resource
,
9021 ExAcquireSharedStarveExclusive(
9022 IN PERESOURCE Resource
,
9028 ExAcquireSharedWaitForExclusive(
9029 IN PERESOURCE Resource
,
9036 IN POOL_TYPE PoolType
,
9037 IN SIZE_T NumberOfBytes
);
9040 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
9041 #endif /* POOL_TAGGING */
9046 ExAllocatePoolWithQuota(
9047 IN POOL_TYPE PoolType
,
9048 IN SIZE_T NumberOfBytes
);
9051 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
9052 #endif /* POOL_TAGGING */
9057 ExAllocatePoolWithQuotaTag(
9058 IN POOL_TYPE PoolType
,
9059 IN SIZE_T NumberOfBytes
,
9062 #ifndef POOL_TAGGING
9063 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
9064 #endif /* POOL_TAGGING */
9069 ExAllocatePoolWithTag(
9070 IN POOL_TYPE PoolType
,
9071 IN SIZE_T NumberOfBytes
,
9077 ExAllocatePoolWithTagPriority(
9078 IN POOL_TYPE PoolType
,
9079 IN SIZE_T NumberOfBytes
,
9081 IN EX_POOL_PRIORITY Priority
);
9086 ExConvertExclusiveToSharedLite(
9087 IN PERESOURCE Resource
);
9093 OUT PCALLBACK_OBJECT
*CallbackObject
,
9094 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9096 IN BOOLEAN AllowMultipleCallbacks
);
9101 ExDeleteNPagedLookasideList(
9102 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
9107 ExDeletePagedLookasideList(
9108 IN PPAGED_LOOKASIDE_LIST Lookaside
);
9113 ExDeleteResourceLite(
9114 IN PERESOURCE Resource
);
9123 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
9136 ExGetExclusiveWaiterCount(
9137 IN PERESOURCE Resource
);
9148 ExGetSharedWaiterCount(
9149 IN PERESOURCE Resource
);
9154 ExInitializeNPagedLookasideList(
9155 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
9156 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
9157 IN PFREE_FUNCTION Free OPTIONAL
,
9166 ExInitializePagedLookasideList(
9167 IN PPAGED_LOOKASIDE_LIST Lookaside
,
9168 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
9169 IN PFREE_FUNCTION Free OPTIONAL
,
9178 ExInitializeResourceLite(
9179 IN PERESOURCE Resource
);
9184 ExInterlockedAddLargeInteger(
9185 IN PLARGE_INTEGER Addend
,
9186 IN LARGE_INTEGER Increment
,
9187 IN PKSPIN_LOCK Lock
);
9190 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
9191 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
9193 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
9194 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
9200 ExInterlockedAddUlong(
9205 #if defined(_AMD64_) || defined(_IA64_)
9206 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
9207 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
9208 #elif defined(_X86_)
9212 ExfInterlockedCompareExchange64(
9213 IN OUT LONGLONG
volatile *Destination
,
9214 IN PLONGLONG Exchange
,
9215 IN PLONGLONG Comperand
);
9216 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
9217 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
9222 ExInterlockedCompareExchange64(
9223 IN OUT LONGLONG
volatile *Destination
,
9224 IN PLONGLONG Exchange
,
9225 IN PLONGLONG Comparand
,
9226 IN PKSPIN_LOCK Lock
);
9232 ExInterlockedInsertHeadList(
9233 IN PLIST_ENTRY ListHead
,
9234 IN PLIST_ENTRY ListEntry
,
9235 IN PKSPIN_LOCK Lock
);
9240 ExInterlockedInsertTailList(
9241 IN PLIST_ENTRY ListHead
,
9242 IN PLIST_ENTRY ListEntry
,
9243 IN PKSPIN_LOCK Lock
);
9248 ExInterlockedPopEntryList(
9249 IN PSINGLE_LIST_ENTRY ListHead
,
9250 IN PKSPIN_LOCK Lock
);
9255 ExInterlockedPushEntryList(
9256 IN PSINGLE_LIST_ENTRY ListHead
,
9257 IN PSINGLE_LIST_ENTRY ListEntry
,
9258 IN PKSPIN_LOCK Lock
);
9263 ExInterlockedRemoveHeadList(
9264 IN PLIST_ENTRY ListHead
,
9265 IN PKSPIN_LOCK Lock
);
9270 ExIsProcessorFeaturePresent(
9271 IN ULONG ProcessorFeature
);
9276 ExIsResourceAcquiredExclusiveLite(
9277 IN PERESOURCE Resource
);
9282 ExIsResourceAcquiredSharedLite(
9283 IN PERESOURCE Resource
);
9285 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
9290 ExLocalTimeToSystemTime(
9291 IN PLARGE_INTEGER LocalTime
,
9292 OUT PLARGE_INTEGER SystemTime
);
9298 IN PCALLBACK_OBJECT CallbackObject
,
9300 IN PVOID Argument2
);
9306 IN PWORK_QUEUE_ITEM WorkItem
,
9307 IN WORK_QUEUE_TYPE QueueType
);
9314 IN NTSTATUS Status
);
9320 IN PCALLBACK_OBJECT CallbackObject
,
9321 IN PCALLBACK_FUNCTION CallbackFunction
,
9322 IN PVOID CallbackContext
);
9327 ExReinitializeResourceLite(
9328 IN PERESOURCE Resource
);
9333 ExReleaseResourceForThreadLite(
9334 IN PERESOURCE Resource
,
9335 IN ERESOURCE_THREAD ResourceThreadId
);
9340 ExReleaseResourceLite(
9341 IN PERESOURCE Resource
);
9346 ExSetResourceOwnerPointer(
9347 IN PERESOURCE Resource
,
9348 IN PVOID OwnerPointer
);
9353 ExSetTimerResolution(
9354 IN ULONG DesiredTime
,
9355 IN BOOLEAN SetResolution
);
9360 ExSystemTimeToLocalTime(
9361 IN PLARGE_INTEGER SystemTime
,
9362 OUT PLARGE_INTEGER LocalTime
);
9367 ExUnregisterCallback(
9368 IN PVOID CbRegistration
);
9371 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
9373 #if (NTDDI_VERSION >= NTDDI_WINXP)
9377 ExAcquireRundownProtection(
9378 IN OUT PEX_RUNDOWN_REF RunRef
);
9383 ExInitializeRundownProtection(
9384 OUT PEX_RUNDOWN_REF RunRef
);
9389 ExReInitializeRundownProtection(
9390 OUT PEX_RUNDOWN_REF RunRef
);
9395 ExReleaseRundownProtection(
9396 IN OUT PEX_RUNDOWN_REF RunRef
);
9402 OUT PEX_RUNDOWN_REF RunRef
);
9408 IN SUITE_TYPE SuiteType
);
9413 ExWaitForRundownProtectionRelease(
9414 IN OUT PEX_RUNDOWN_REF RunRef
);
9416 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
9418 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
9422 ExAcquireRundownProtectionEx(
9423 IN OUT PEX_RUNDOWN_REF RunRef
,
9429 ExReleaseRundownProtectionEx(
9430 IN OUT PEX_RUNDOWN_REF RunRef
,
9432 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
9434 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
9436 PEX_RUNDOWN_REF_CACHE_AWARE
9438 ExAllocateCacheAwareRundownProtection(
9439 IN POOL_TYPE PoolType
,
9445 ExSizeOfRundownProtectionCacheAware(VOID
);
9446 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
9448 #if (NTDDI_VERSION >= NTDDI_VISTA)
9452 ExInitializeLookasideListEx(
9453 OUT PLOOKASIDE_LIST_EX Lookaside
,
9454 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
9455 IN PFREE_FUNCTION_EX Free OPTIONAL
,
9456 IN POOL_TYPE PoolType
,
9463 #if !defined(MIDL_PASS)
9465 static __inline PVOID
9466 ExAllocateFromNPagedLookasideList(
9467 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
9471 Lookaside
->L
.TotalAllocates
++;
9472 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
9473 if (Entry
== NULL
) {
9474 Lookaside
->L
.AllocateMisses
++;
9475 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
9482 static __inline PVOID
9483 ExAllocateFromPagedLookasideList(
9484 IN PPAGED_LOOKASIDE_LIST Lookaside
)
9488 Lookaside
->L
.TotalAllocates
++;
9489 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
9490 if (Entry
== NULL
) {
9491 Lookaside
->L
.AllocateMisses
++;
9492 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
9499 static __inline VOID
9500 ExFreeToNPagedLookasideList(
9501 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
9504 Lookaside
->L
.TotalFrees
++;
9505 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
9506 Lookaside
->L
.FreeMisses
++;
9507 (Lookaside
->L
.Free
)(Entry
);
9509 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
9513 static __inline VOID
9514 ExFreeToPagedLookasideList(
9515 IN PPAGED_LOOKASIDE_LIST Lookaside
,
9518 Lookaside
->L
.TotalFrees
++;
9519 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
9520 Lookaside
->L
.FreeMisses
++;
9521 (Lookaside
->L
.Free
)(Entry
);
9523 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
9527 #endif // !defined(MIDL_PASS)
9529 /******************************************************************************
9530 * Object Manager Functions *
9531 ******************************************************************************/
9535 * ObDereferenceObject(
9538 #define ObDereferenceObject ObfDereferenceObject
9542 * ObReferenceObject(
9545 #define ObReferenceObject ObfReferenceObject
9547 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9552 ObfDereferenceObject(
9558 ObGetObjectSecurity(
9560 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
9561 OUT PBOOLEAN MemoryAllocated
);
9572 ObReferenceObjectByHandle(
9574 IN ACCESS_MASK DesiredAccess
,
9575 IN POBJECT_TYPE ObjectType OPTIONAL
,
9576 IN KPROCESSOR_MODE AccessMode
,
9578 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
9583 ObReferenceObjectByPointer(
9585 IN ACCESS_MASK DesiredAccess
,
9586 IN POBJECT_TYPE ObjectType OPTIONAL
,
9587 IN KPROCESSOR_MODE AccessMode
);
9592 ObReleaseObjectSecurity(
9593 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
9594 IN BOOLEAN MemoryAllocated
);
9598 /******************************************************************************
9599 * Process Manager Functions *
9600 ******************************************************************************/
9604 * PsGetCurrentProcess(VOID)
9606 #define PsGetCurrentProcess IoGetCurrentProcess
9608 #if !defined(_PSGETCURRENTTHREAD_)
9610 #define _PSGETCURRENTTHREAD_
9615 PsGetCurrentThread (
9618 return (PETHREAD
)KeGetCurrentThread();
9623 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9628 PsCreateSystemThread(
9629 OUT PHANDLE ThreadHandle
,
9630 IN ULONG DesiredAccess
,
9631 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9632 IN HANDLE ProcessHandle OPTIONAL
,
9633 OUT PCLIENT_ID ClientId OPTIONAL
,
9634 IN PKSTART_ROUTINE StartRoutine
,
9635 IN PVOID StartContext OPTIONAL
);
9640 PsTerminateSystemThread(
9641 IN NTSTATUS ExitStatus
);
9645 /******************************************************************************
9647 ******************************************************************************/
9649 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9660 ZwCreateDirectoryObject(
9661 OUT PHANDLE DirectoryHandle
,
9662 IN ACCESS_MASK DesiredAccess
,
9663 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9669 OUT PHANDLE FileHandle
,
9670 IN ACCESS_MASK DesiredAccess
,
9671 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9672 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9673 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
9674 IN ULONG FileAttributes
,
9675 IN ULONG ShareAccess
,
9676 IN ULONG CreateDisposition
,
9677 IN ULONG CreateOptions
,
9678 IN PVOID EaBuffer OPTIONAL
,
9685 OUT PHANDLE KeyHandle
,
9686 IN ACCESS_MASK DesiredAccess
,
9687 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9688 IN ULONG TitleIndex
,
9689 IN PUNICODE_STRING Class OPTIONAL
,
9690 IN ULONG CreateOptions
,
9691 OUT PULONG Disposition OPTIONAL
);
9697 IN HANDLE KeyHandle
);
9703 IN HANDLE KeyHandle
,
9704 IN PUNICODE_STRING ValueName
);
9710 IN HANDLE KeyHandle
,
9712 IN KEY_INFORMATION_CLASS KeyInformationClass
,
9713 OUT PVOID KeyInformation
,
9715 OUT PULONG ResultLength
);
9720 ZwEnumerateValueKey(
9721 IN HANDLE KeyHandle
,
9723 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
9724 OUT PVOID KeyValueInformation
,
9726 OUT PULONG ResultLength
);
9732 IN HANDLE KeyHandle
);
9737 ZwMakeTemporaryObject(
9744 IN HANDLE SectionHandle
,
9745 IN HANDLE ProcessHandle
,
9746 IN OUT PVOID
*BaseAddress
,
9747 IN ULONG_PTR ZeroBits
,
9748 IN SIZE_T CommitSize
,
9749 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
9750 IN OUT PSIZE_T ViewSize
,
9751 IN SECTION_INHERIT InheritDisposition
,
9752 IN ULONG AllocationType
,
9759 OUT PHANDLE KeyHandle
,
9760 IN ACCESS_MASK DesiredAccess
,
9761 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9767 OUT PHANDLE SectionHandle
,
9768 IN ACCESS_MASK DesiredAccess
,
9769 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9774 ZwOpenSymbolicLinkObject(
9775 OUT PHANDLE LinkHandle
,
9776 IN ACCESS_MASK DesiredAccess
,
9777 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9782 ZwQueryInformationFile(
9783 IN HANDLE FileHandle
,
9784 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9785 OUT PVOID FileInformation
,
9787 IN FILE_INFORMATION_CLASS FileInformationClass
);
9793 IN HANDLE KeyHandle
,
9794 IN KEY_INFORMATION_CLASS KeyInformationClass
,
9795 OUT PVOID KeyInformation
,
9797 OUT PULONG ResultLength
);
9802 ZwQuerySymbolicLinkObject(
9803 IN HANDLE LinkHandle
,
9804 IN OUT PUNICODE_STRING LinkTarget
,
9805 OUT PULONG ReturnedLength OPTIONAL
);
9811 IN HANDLE KeyHandle
,
9812 IN PUNICODE_STRING ValueName
,
9813 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
9814 OUT PVOID KeyValueInformation
,
9816 OUT PULONG ResultLength
);
9822 IN HANDLE FileHandle
,
9823 IN HANDLE Event OPTIONAL
,
9824 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
9825 IN PVOID ApcContext OPTIONAL
,
9826 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9829 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
9830 IN PULONG Key OPTIONAL
);
9835 ZwSetInformationFile(
9836 IN HANDLE FileHandle
,
9837 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9838 IN PVOID FileInformation
,
9840 IN FILE_INFORMATION_CLASS FileInformationClass
);
9846 IN HANDLE KeyHandle
,
9847 IN PUNICODE_STRING ValueName
,
9848 IN ULONG TitleIndex OPTIONAL
,
9850 IN PVOID Data OPTIONAL
,
9856 ZwUnmapViewOfSection(
9857 IN HANDLE ProcessHandle
,
9858 IN PVOID BaseAddress OPTIONAL
);
9864 IN HANDLE FileHandle
,
9865 IN HANDLE Event OPTIONAL
,
9866 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
9867 IN PVOID ApcContext OPTIONAL
,
9868 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9871 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
9872 IN PULONG Key OPTIONAL
);
9876 /******************************************************************************
9877 * WMI Library Support Functions *
9878 ******************************************************************************/
9882 #if (NTDDI_VERSION >= NTDDI_WINXP)
9887 IN TRACEHANDLE LoggerHandle
,
9888 IN ULONG MessageFlags
,
9889 IN LPGUID MessageGuid
,
9890 IN USHORT MessageNumber
,
9896 #if (NTDDI_VERSION >= NTDDI_WINXP)
9901 WmiQueryTraceInformation(
9902 IN TRACE_INFORMATION_CLASS TraceInformationClass
,
9903 OUT PVOID TraceInformation
,
9904 IN ULONG TraceInformationLength
,
9905 OUT PULONG RequiredLength OPTIONAL
,
9906 IN PVOID Buffer OPTIONAL
);
9909 /* FIXME: Get va_list from where? */
9914 IN TRACEHANDLE LoggerHandle
,
9915 IN ULONG MessageFlags
,
9916 IN LPGUID MessageGuid
,
9917 IN USHORT MessageNumber
,
9918 IN
va_list MessageArgList
);
9923 /******************************************************************************
9924 * Kernel Debugger Functions *
9925 ******************************************************************************/
9937 #define KdPrint(_x_) DbgPrint _x_
9938 #define KdPrintEx(_x_) DbgPrintEx _x_
9939 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
9940 #define KdBreakPoint() DbgBreakPoint()
9941 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
9945 #define KdPrint(_x_)
9946 #define KdPrintEx(_x_)
9947 #define vKdPrintExWithPrefix(_x_)
9948 #define KdBreakPoint()
9949 #define KdBreakPointWithStatus(s)
9953 #if defined(__GNUC__)
9955 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent
;
9956 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled
;
9957 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
9958 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
9960 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
9962 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent
;
9963 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled
;
9964 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
9965 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
9969 extern BOOLEAN KdDebuggerNotPresent
;
9970 extern BOOLEAN KdDebuggerEnabled
;
9971 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
9972 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
9976 #ifdef _VA_LIST_DEFINED
9977 #if (NTDDI_VERSION >= NTDDI_WINXP)
9983 IN ULONG ComponentId
,
9991 vDbgPrintExWithPrefix(
9993 IN ULONG ComponentId
,
9999 #endif // _VA_LIST_DEFINED
10001 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10015 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
10016 #define DbgBreakPoint __debugbreak
10027 DbgBreakPointWithStatus(
10033 DbgPrintReturnControlC(
10039 #if (NTDDI_VERSION >= NTDDI_WINXP)
10045 IN ULONG ComponentId
,
10053 DbgQueryDebugFilterState(
10054 IN ULONG ComponentId
,
10060 DbgSetDebugFilterState(
10061 IN ULONG ComponentId
,
10067 #if (NTDDI_VERSION >= NTDDI_WS03)
10072 KdRefreshDebuggerNotPresent(
10078 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10083 IN KD_OPTION Option
,
10084 IN ULONG InBufferBytes OPTIONAL
,
10086 IN ULONG OutBufferBytes OPTIONAL
,
10087 OUT PVOID OutBuffer
,
10088 OUT PULONG OutBufferNeeded OPTIONAL
);
10093 /******************************************************************************
10095 ******************************************************************************/
10100 #ifndef __IID_ALIGNED__
10101 #define __IID_ALIGNED__
10103 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
10105 return ((*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) && (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)));
10108 #define IsEqualGUIDAligned(guid1, guid2) \
10109 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
10113 #define ES_SYSTEM_REQUIRED 0x00000001
10114 #define ES_DISPLAY_REQUIRED 0x00000002
10115 #define ES_USER_PRESENT 0x00000004
10116 #define ES_CONTINUOUS 0x80000000
10124 typedef ULONG EXECUTION_STATE
;
10127 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
10128 #define ZwCurrentProcess() NtCurrentProcess()
10129 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
10130 #define ZwCurrentThread() NtCurrentThread()
10132 #define METHOD_BUFFERED 0
10133 #define METHOD_IN_DIRECT 1
10134 #define METHOD_OUT_DIRECT 2
10135 #define METHOD_NEITHER 3
10137 #define LOW_PRIORITY 0
10138 #define LOW_REALTIME_PRIORITY 16
10139 #define HIGH_PRIORITY 31
10140 #define MAXIMUM_PRIORITY 32
10142 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
10144 #define MAXIMUM_FILENAME_LENGTH 256
10146 #define FILE_SUPERSEDED 0x00000000
10147 #define FILE_OPENED 0x00000001
10148 #define FILE_CREATED 0x00000002
10149 #define FILE_OVERWRITTEN 0x00000003
10150 #define FILE_EXISTS 0x00000004
10151 #define FILE_DOES_NOT_EXIST 0x00000005
10153 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
10154 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
10156 /* also in winnt.h */
10157 #define FILE_LIST_DIRECTORY 0x00000001
10158 #define FILE_READ_DATA 0x00000001
10159 #define FILE_ADD_FILE 0x00000002
10160 #define FILE_WRITE_DATA 0x00000002
10161 #define FILE_ADD_SUBDIRECTORY 0x00000004
10162 #define FILE_APPEND_DATA 0x00000004
10163 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
10164 #define FILE_READ_EA 0x00000008
10165 #define FILE_WRITE_EA 0x00000010
10166 #define FILE_EXECUTE 0x00000020
10167 #define FILE_TRAVERSE 0x00000020
10168 #define FILE_DELETE_CHILD 0x00000040
10169 #define FILE_READ_ATTRIBUTES 0x00000080
10170 #define FILE_WRITE_ATTRIBUTES 0x00000100
10172 #define FILE_SHARE_READ 0x00000001
10173 #define FILE_SHARE_WRITE 0x00000002
10174 #define FILE_SHARE_DELETE 0x00000004
10175 #define FILE_SHARE_VALID_FLAGS 0x00000007
10177 #define FILE_ATTRIBUTE_READONLY 0x00000001
10178 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
10179 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
10180 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
10181 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
10182 #define FILE_ATTRIBUTE_DEVICE 0x00000040
10183 #define FILE_ATTRIBUTE_NORMAL 0x00000080
10184 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
10185 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
10186 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
10187 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
10188 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
10189 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
10190 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
10192 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
10193 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
10195 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
10196 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
10197 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
10198 #define FILE_VALID_SET_FLAGS 0x00000036
10200 #define FILE_SUPERSEDE 0x00000000
10201 #define FILE_OPEN 0x00000001
10202 #define FILE_CREATE 0x00000002
10203 #define FILE_OPEN_IF 0x00000003
10204 #define FILE_OVERWRITE 0x00000004
10205 #define FILE_OVERWRITE_IF 0x00000005
10206 #define FILE_MAXIMUM_DISPOSITION 0x00000005
10208 #define FILE_DIRECTORY_FILE 0x00000001
10209 #define FILE_WRITE_THROUGH 0x00000002
10210 #define FILE_SEQUENTIAL_ONLY 0x00000004
10211 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
10212 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
10213 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
10214 #define FILE_NON_DIRECTORY_FILE 0x00000040
10215 #define FILE_CREATE_TREE_CONNECTION 0x00000080
10216 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
10217 #define FILE_NO_EA_KNOWLEDGE 0x00000200
10218 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
10219 #define FILE_RANDOM_ACCESS 0x00000800
10220 #define FILE_DELETE_ON_CLOSE 0x00001000
10221 #define FILE_OPEN_BY_FILE_ID 0x00002000
10222 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
10223 #define FILE_NO_COMPRESSION 0x00008000
10224 #define FILE_RESERVE_OPFILTER 0x00100000
10225 #define FILE_OPEN_REPARSE_POINT 0x00200000
10226 #define FILE_OPEN_NO_RECALL 0x00400000
10227 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
10229 #define FILE_ANY_ACCESS 0x00000000
10230 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
10231 #define FILE_READ_ACCESS 0x00000001
10232 #define FILE_WRITE_ACCESS 0x00000002
10234 #define FILE_ALL_ACCESS \
10235 (STANDARD_RIGHTS_REQUIRED | \
10239 #define FILE_GENERIC_EXECUTE \
10240 (STANDARD_RIGHTS_EXECUTE | \
10241 FILE_READ_ATTRIBUTES | \
10245 #define FILE_GENERIC_READ \
10246 (STANDARD_RIGHTS_READ | \
10248 FILE_READ_ATTRIBUTES | \
10252 #define FILE_GENERIC_WRITE \
10253 (STANDARD_RIGHTS_WRITE | \
10254 FILE_WRITE_DATA | \
10255 FILE_WRITE_ATTRIBUTES | \
10257 FILE_APPEND_DATA | \
10262 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
10264 #define OBJECT_TYPE_CREATE (0x0001)
10265 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
10267 #define DIRECTORY_QUERY (0x0001)
10268 #define DIRECTORY_TRAVERSE (0x0002)
10269 #define DIRECTORY_CREATE_OBJECT (0x0004)
10270 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
10271 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
10273 #define EVENT_QUERY_STATE (0x0001)
10274 #define EVENT_MODIFY_STATE (0x0002)
10275 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
10277 #define SEMAPHORE_QUERY_STATE (0x0001)
10278 #define SEMAPHORE_MODIFY_STATE (0x0002)
10279 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
10283 ** System structures
10286 #define SYMBOLIC_LINK_QUERY 0x0001
10287 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
10289 /* also in winnt,h */
10290 #define DUPLICATE_CLOSE_SOURCE 0x00000001
10291 #define DUPLICATE_SAME_ACCESS 0x00000002
10292 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
10295 typedef struct _OBJECT_NAME_INFORMATION
{
10296 UNICODE_STRING Name
;
10297 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
10299 /* Global debug flag */
10300 extern ULONG NtGlobalFlag
;
10302 #define PROCESS_DUP_HANDLE (0x0040)
10304 #if (NTDDI_VERSION >= NTDDI_VISTA)
10305 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
10308 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
10313 #if defined(_M_IX86)
10314 #define YieldProcessor _mm_pause
10315 #elif defined (_M_AMD64)
10316 #define YieldProcessor _mm_pause
10317 #elif defined(_M_PPC)
10318 #define YieldProcessor() __asm__ __volatile__("nop");
10319 #elif defined(_M_MIPS)
10320 #define YieldProcessor() __asm__ __volatile__("nop");
10321 #elif defined(_M_ARM)
10322 #define YieldProcessor()
10324 #error Unknown architecture
10327 /* Thread Access Rights */
10328 #define THREAD_TERMINATE (0x0001)
10329 #define THREAD_SUSPEND_RESUME (0x0002)
10330 #define THREAD_ALERT (0x0004)
10331 #define THREAD_GET_CONTEXT (0x0008)
10332 #define THREAD_SET_CONTEXT (0x0010)
10333 #define THREAD_SET_INFORMATION (0x0020)
10334 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
10335 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
10336 #if (NTDDI_VERSION >= NTDDI_VISTA)
10337 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
10340 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
10344 /* Service Start Types */
10345 #define SERVICE_BOOT_START 0x00000000
10346 #define SERVICE_SYSTEM_START 0x00000001
10347 #define SERVICE_AUTO_START 0x00000002
10348 #define SERVICE_DEMAND_START 0x00000003
10349 #define SERVICE_DISABLED 0x00000004
10351 /* Process Qoutas */
10352 typedef struct _QUOTA_LIMITS
{
10353 SIZE_T PagedPoolLimit
;
10354 SIZE_T NonPagedPoolLimit
;
10355 SIZE_T MinimumWorkingSetSize
;
10356 SIZE_T MaximumWorkingSetSize
;
10357 SIZE_T PagefileLimit
;
10358 LARGE_INTEGER TimeLimit
;
10359 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
10361 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
10362 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
10363 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
10364 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
10365 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
10367 /* Exported object types */
10368 extern POBJECT_TYPE NTSYSAPI ExEventObjectType
;
10369 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType
;
10370 extern POBJECT_TYPE NTSYSAPI IoFileObjectType
;
10371 extern POBJECT_TYPE NTSYSAPI PsThreadType
;
10372 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType
;
10373 extern POBJECT_TYPE NTSYSAPI PsProcessType
;
10375 #if defined(_IA64_)
10377 extern volatile LARGE_INTEGER KeTickCount
;
10379 #elif defined(_X86_)
10381 extern volatile KSYSTEM_TIME KeTickCount
;
10385 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
10386 #if defined(_NTSYSTEM_) || defined(__GNUC__)
10387 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
10388 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
10390 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
10391 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
10392 #endif /* _NT_SYSTEM */
10393 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG
;
10394 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG
;