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
,
725 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
727 typedef struct _KSPIN_LOCK_QUEUE
{
728 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
729 PKSPIN_LOCK
volatile Lock
;
730 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
732 typedef struct _KLOCK_QUEUE_HANDLE
{
733 KSPIN_LOCK_QUEUE LockQueue
;
735 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
739 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
741 #define LockQueueDispatcherLock 0
742 #define LockQueueExpansionLock 1
743 #define LockQueuePfnLock 2
744 #define LockQueueSystemSpaceLock 3
745 #define LockQueueVacbLock 4
746 #define LockQueueMasterLock 5
747 #define LockQueueNonPagedPoolLock 6
748 #define LockQueueIoCancelLock 7
749 #define LockQueueWorkQueueLock 8
750 #define LockQueueIoVpbLock 9
751 #define LockQueueIoDatabaseLock 10
752 #define LockQueueIoCompletionLock 11
753 #define LockQueueNtfsStructLock 12
754 #define LockQueueAfdWorkQueueLock 13
755 #define LockQueueBcbLock 14
756 #define LockQueueMmNonPagedPoolLock 15
757 #define LockQueueUnusedSpare16 16
758 #define LockQueueTimerTableLock 17
759 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
763 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
764 LockQueueDispatcherLock
,
765 LockQueueExpansionLock
,
767 LockQueueSystemSpaceLock
,
770 LockQueueNonPagedPoolLock
,
771 LockQueueIoCancelLock
,
772 LockQueueWorkQueueLock
,
774 LockQueueIoDatabaseLock
,
775 LockQueueIoCompletionLock
,
776 LockQueueNtfsStructLock
,
777 LockQueueAfdWorkQueueLock
,
779 LockQueueMmNonPagedPoolLock
,
780 LockQueueUnusedSpare16
,
781 LockQueueTimerTableLock
,
782 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
783 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
788 (DDKAPI
*PKDEFERRED_ROUTINE
)(
789 IN
struct _KDPC
*Dpc
,
790 IN PVOID DeferredContext
,
791 IN PVOID SystemArgument1
,
792 IN PVOID SystemArgument2
);
798 volatile USHORT Number
;
799 LIST_ENTRY DpcListEntry
;
800 PKDEFERRED_ROUTINE DeferredRoutine
;
801 PVOID DeferredContext
;
802 PVOID SystemArgument1
;
803 PVOID SystemArgument2
;
804 volatile PVOID DpcData
;
805 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
807 typedef struct _KDEVICE_QUEUE
{
810 LIST_ENTRY DeviceListHead
;
824 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
826 typedef struct _DISPATCHER_HEADER
828 __GNU_EXTENSION
union
830 __GNU_EXTENSION
struct
833 __GNU_EXTENSION
union
838 __GNU_EXTENSION
union
843 __GNU_EXTENSION
union
852 LIST_ENTRY WaitListHead
;
853 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
855 typedef struct _KGATE
857 DISPATCHER_HEADER Header
;
858 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
860 typedef struct _KGUARDED_MUTEX
866 __GNU_EXTENSION
union
868 __GNU_EXTENSION
struct
870 SHORT KernelApcDisable
;
871 SHORT SpecialApcDisable
;
873 ULONG CombinedApcDisable
;
875 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
877 typedef struct _KMUTANT
{
878 DISPATCHER_HEADER Header
;
879 LIST_ENTRY MutantListEntry
;
880 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
883 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
885 typedef struct _KTIMER
{
886 DISPATCHER_HEADER Header
;
887 ULARGE_INTEGER DueTime
;
888 LIST_ENTRY TimerListEntry
;
894 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
896 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
901 } ALTERNATIVE_ARCHITECTURE_TYPE
;
903 typedef struct _KSYSTEM_TIME
908 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
910 typedef struct _KEVENT
{
911 DISPATCHER_HEADER Header
;
912 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
914 typedef struct _KSEMAPHORE
{
915 DISPATCHER_HEADER Header
;
917 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
919 typedef struct _PNP_BUS_INFORMATION
{
921 INTERFACE_TYPE LegacyBusType
;
923 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
925 typedef struct DECLSPEC_ALIGN(16) _M128A
{
930 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
937 USHORT ErrorSelector
;
944 M128A FloatRegisters
[8];
948 M128A XmmRegisters
[16];
953 M128A XmmRegisters
[8];
954 UCHAR Reserved4
[192];
956 ULONG StackControl
[7];
961 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
965 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
970 /******************************************************************************
972 ******************************************************************************/
974 #if (NTDDI_VERSION >= NTDDI_WIN2K)
981 IN ULONG BugCheckCode
,
982 IN ULONG_PTR BugCheckParameter1
,
983 IN ULONG_PTR BugCheckParameter2
,
984 IN ULONG_PTR BugCheckParameter3
,
985 IN ULONG_PTR BugCheckParameter4
);
996 KeDelayExecutionThread(
997 IN KPROCESSOR_MODE WaitMode
,
998 IN BOOLEAN Alertable
,
999 IN PLARGE_INTEGER Interval
);
1004 KeDeregisterBugCheckCallback(
1005 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
1010 KeEnterCriticalRegion(VOID
);
1015 KeInitializeDeviceQueue(
1016 OUT PKDEVICE_QUEUE DeviceQueue
);
1028 KeInitializeSemaphore(
1029 OUT PRKSEMAPHORE Semaphore
,
1042 KeInitializeTimerEx(
1044 IN TIMER_TYPE Type
);
1049 KeInsertByKeyDeviceQueue(
1050 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1051 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
1057 KeInsertDeviceQueue(
1058 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1059 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
1066 IN PVOID SystemArgument1 OPTIONAL
,
1067 IN PVOID SystemArgument2 OPTIONAL
);
1072 KeLeaveCriticalRegion(VOID
);
1076 #if (NTDDI_VERSION >= NTDDI_WINXP)
1080 KeAcquireInStackQueuedSpinLock (
1081 IN OUT PKSPIN_LOCK SpinLock
,
1082 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1087 KeAcquireInStackQueuedSpinLockAtDpcLevel(
1088 IN OUT PKSPIN_LOCK SpinLock
,
1089 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1094 KeAcquireInterruptSpinLock(
1095 IN OUT PKINTERRUPT Interrupt
);
1100 KeAreApcsDisabled(VOID
);
1105 KeGetRecommendedSharedDataAlignment(VOID
);
1109 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1122 KeFlushWriteBuffer(VOID
)
1131 KeFlushWriteBuffer(VOID
);
1138 IN OUT PRKEVENT Event
);
1144 * IN BOOLEAN ReadOperation,
1145 * IN BOOLEAN DmaOperation)
1147 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
1149 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
1150 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
1151 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
1152 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
1155 /* SPINLOCK FUNCTIONS */
1157 #if (NTDDI_VERSION >= NTDDI_WINXP)
1158 //_DECL_HAL_KE_IMPORT
1161 KeAcquireInStackQueuedSpinLock(
1162 IN OUT PKSPIN_LOCK SpinLock
,
1163 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1165 //_DECL_HAL_KE_IMPORT
1168 KeReleaseInStackQueuedSpinLock(
1169 IN PKLOCK_QUEUE_HANDLE LockHandle
);
1173 /* FIXME : #if (NTDDI_VERSION >= NTDDI_WS03SP1) */
1177 KeTryToAcquireSpinLockAtDpcLevel(
1178 IN OUT PKSPIN_LOCK SpinLock
1180 /* #endif (NTDDI_VERSION >= NTDDI_WS03SP1) */
1182 #if (NTDDI_VERSION >= NTDDI_WS03)
1187 IN PKSPIN_LOCK SpinLock
1191 /* FIXME : #if (NTDDI_VERSION >= NTDDI_WS03SP1) */
1195 KeAreAllApcsDisabled(
1197 /* #endif (NTDDI_VERSION >= NTDDI_WS03SP1) */
1199 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1201 /* Guarded Mutex routines */
1206 KeAcquireGuardedMutex(
1207 IN OUT PKGUARDED_MUTEX GuardedMutex
1213 KeAcquireGuardedMutexUnsafe(
1214 IN OUT PKGUARDED_MUTEX GuardedMutex
1219 KeEnterGuardedRegion(
1226 KeLeaveGuardedRegion(
1233 KeInitializeGuardedMutex(
1234 OUT PKGUARDED_MUTEX GuardedMutex
1240 KeReleaseGuardedMutexUnsafe(
1241 IN OUT PKGUARDED_MUTEX GuardedMutex
1247 KeReleaseGuardedMutex(
1248 IN OUT PKGUARDED_MUTEX GuardedMutex
1254 KeTryToAcquireGuardedMutex(
1255 IN OUT PKGUARDED_MUTEX GuardedMutex
1266 #if defined(_M_AMD64)
1272 #pragma intrinsic(__readgsqword)
1276 KeGetCurrentThread (
1279 return (struct _KTHREAD
*)__readgsqword(0x188);
1284 #if defined(_M_IX86) || defined(_M_IA64)
1302 * KeInitializeCallbackRecord(
1303 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1305 #define KeInitializeCallbackRecord(CallbackRecord) \
1306 CallbackRecord->State = BufferEmpty;
1310 #if (NTDDI_VERSION >= NTDDI_VISTA)
1311 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
1313 #define PAGED_ASSERT( exp ) ASSERT( exp )
1316 #define PAGED_CODE() { \
1317 if (KeGetCurrentIrql() > APC_LEVEL) { \
1318 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
1319 PAGED_ASSERT(FALSE); \
1325 #define PAGED_CODE()
1329 #if defined(_NTDDK_) || defined(_NTIFS_)
1331 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1337 IN CONST VOID
*Address
,
1339 IN ULONG Alignment
);
1345 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1353 IN ULONG Alignment
);
1357 #if defined(_X86_) || defined(_AMD64_)
1359 /* x86 and x64 performs a 0x2C interrupt */
1360 #define DbgRaiseAssertionFailure __int2c
1362 #elif defined(_ARM_)
1369 #error Unsupported Architecture
1373 /******************************************************************************
1374 * Memory manager Types *
1375 ******************************************************************************/
1377 #define PAGE_SIZE 0x1000
1378 #define PAGE_SHIFT 12L
1380 #define MM_DONT_ZERO_ALLOCATION 0x00000001
1381 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
1382 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
1383 #define MM_ALLOCATE_NO_WAIT 0x00000008
1384 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
1385 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
1387 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1388 #define MDL_PAGES_LOCKED 0x0002
1389 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1390 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1391 #define MDL_PARTIAL 0x0010
1392 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1393 #define MDL_IO_PAGE_READ 0x0040
1394 #define MDL_WRITE_OPERATION 0x0080
1395 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1396 #define MDL_FREE_EXTRA_PTES 0x0200
1397 #define MDL_DESCRIBES_AWE 0x0400
1398 #define MDL_IO_SPACE 0x0800
1399 #define MDL_NETWORK_HEADER 0x1000
1400 #define MDL_MAPPING_CAN_FAIL 0x2000
1401 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1402 #define MDL_INTERNAL 0x8000
1404 #define MDL_MAPPING_FLAGS ( \
1405 MDL_MAPPED_TO_SYSTEM_VA | \
1406 MDL_PAGES_LOCKED | \
1407 MDL_SOURCE_IS_NONPAGED_POOL | \
1408 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1409 MDL_PARENT_MAPPED_SYSTEM_VA | \
1413 #define FLUSH_MULTIPLE_MAXIMUM 32
1415 /* Section access rights */
1416 #define SECTION_QUERY 0x0001
1417 #define SECTION_MAP_WRITE 0x0002
1418 #define SECTION_MAP_READ 0x0004
1419 #define SECTION_MAP_EXECUTE 0x0008
1420 #define SECTION_EXTEND_SIZE 0x0010
1421 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
1423 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
1424 SECTION_MAP_WRITE | \
1425 SECTION_MAP_READ | \
1426 SECTION_MAP_EXECUTE | \
1427 SECTION_EXTEND_SIZE)
1429 #define SESSION_QUERY_ACCESS 0x0001
1430 #define SESSION_MODIFY_ACCESS 0x0002
1432 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
1433 SESSION_QUERY_ACCESS | \
1434 SESSION_MODIFY_ACCESS)
1436 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1438 #define PAGE_NOACCESS 0x01
1439 #define PAGE_READONLY 0x02
1440 #define PAGE_READWRITE 0x04
1441 #define PAGE_WRITECOPY 0x08
1442 #define PAGE_EXECUTE 0x10
1443 #define PAGE_EXECUTE_READ 0x20
1444 #define PAGE_EXECUTE_READWRITE 0x40
1445 #define PAGE_EXECUTE_WRITECOPY 0x80
1446 #define PAGE_GUARD 0x100
1447 #define PAGE_NOCACHE 0x200
1448 #define PAGE_WRITECOMBINE 0x400
1450 #define MEM_COMMIT 0x1000
1451 #define MEM_RESERVE 0x2000
1452 #define MEM_DECOMMIT 0x4000
1453 #define MEM_RELEASE 0x8000
1454 #define MEM_FREE 0x10000
1455 #define MEM_PRIVATE 0x20000
1456 #define MEM_MAPPED 0x40000
1457 #define MEM_RESET 0x80000
1458 #define MEM_TOP_DOWN 0x100000
1459 #define MEM_LARGE_PAGES 0x20000000
1460 #define MEM_4MB_PAGES 0x80000000
1462 #define SEC_RESERVE 0x4000000
1463 #define SEC_LARGE_PAGES 0x80000000
1465 /* Section map options */
1466 typedef enum _SECTION_INHERIT
{
1471 typedef ULONG PFN_COUNT
;
1472 typedef LONG_PTR SPFN_NUMBER
, *PSPFN_NUMBER
;
1473 typedef ULONG_PTR PFN_NUMBER
, *PPFN_NUMBER
;
1475 typedef struct _MDL
{
1479 struct _EPROCESS
*Process
;
1480 PVOID MappedSystemVa
;
1486 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
1487 MmFrameBufferCached
= 2
1488 } MEMORY_CACHING_TYPE_ORIG
;
1490 typedef enum _MEMORY_CACHING_TYPE
{
1491 MmNonCached
= FALSE
,
1493 MmWriteCombined
= MmFrameBufferCached
,
1494 MmHardwareCoherentCached
,
1495 MmNonCachedUnordered
,
1498 } MEMORY_CACHING_TYPE
;
1500 typedef enum _MM_PAGE_PRIORITY
{
1502 NormalPagePriority
= 16,
1503 HighPagePriority
= 32
1506 typedef enum _LOCK_OPERATION
{
1512 typedef enum _MM_SYSTEM_SIZE
{
1519 /******************************************************************************
1520 * Memory manager Functions *
1521 ******************************************************************************/
1526 #define ALIGN_DOWN(s, t) \
1527 ((ULONG)(s) & ~(sizeof(t) - 1))
1529 #define ALIGN_UP(s, t) \
1530 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
1532 #define ALIGN_DOWN_POINTER(p, t) \
1533 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
1535 #define ALIGN_UP_POINTER(p, t) \
1536 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
1542 #define BYTE_OFFSET(Va) \
1543 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
1549 #define BYTES_TO_PAGES(Size) \
1550 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
1556 #define PAGE_ALIGN(Va) \
1557 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
1561 * IN ULONG_PTR Size)
1563 #define ROUND_TO_PAGES(Size) \
1564 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
1566 /* PVOID MmGetSystemAddressForMdl(
1569 #define MmGetSystemAddressForMdl(Mdl) \
1570 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
1571 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1572 ((Mdl)->MappedSystemVa) : \
1573 (MmMapLockedPages((Mdl), KernelMode)))
1576 * MmGetSystemAddressForMdlSafe(
1578 * IN MM_PAGE_PRIORITY Priority)
1580 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
1581 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
1582 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1583 (_Mdl)->MappedSystemVa : \
1584 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
1585 KernelMode, MmCached, NULL, FALSE, (_Priority)))
1587 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1592 IN PMDL MemoryDescriptorList OPTIONAL
,
1598 /******************************************************************************
1599 * Security Manager Types *
1600 ******************************************************************************/
1603 typedef PVOID PSECURITY_DESCRIPTOR
;
1604 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
1605 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
1606 typedef PVOID PACCESS_TOKEN
;
1609 #define DELETE 0x00010000L
1610 #define READ_CONTROL 0x00020000L
1611 #define WRITE_DAC 0x00040000L
1612 #define WRITE_OWNER 0x00080000L
1613 #define SYNCHRONIZE 0x00100000L
1614 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
1615 #define STANDARD_RIGHTS_READ READ_CONTROL
1616 #define STANDARD_RIGHTS_WRITE READ_CONTROL
1617 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
1618 #define STANDARD_RIGHTS_ALL 0x001F0000L
1619 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
1620 #define ACCESS_SYSTEM_SECURITY 0x01000000L
1621 #define MAXIMUM_ALLOWED 0x02000000L
1622 #define GENERIC_READ 0x80000000L
1623 #define GENERIC_WRITE 0x40000000L
1624 #define GENERIC_EXECUTE 0x20000000L
1625 #define GENERIC_ALL 0x10000000L
1627 typedef struct _GENERIC_MAPPING
{
1628 ACCESS_MASK GenericRead
;
1629 ACCESS_MASK GenericWrite
;
1630 ACCESS_MASK GenericExecute
;
1631 ACCESS_MASK GenericAll
;
1632 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
1634 #define ACL_REVISION 2
1635 #define ACL_REVISION_DS 4
1637 #define ACL_REVISION1 1
1638 #define ACL_REVISION2 2
1639 #define ACL_REVISION3 3
1640 #define ACL_REVISION4 4
1641 #define MIN_ACL_REVISION ACL_REVISION2
1642 #define MAX_ACL_REVISION ACL_REVISION4
1644 typedef struct _ACL
{
1652 /* Current security descriptor revision value */
1653 #define SECURITY_DESCRIPTOR_REVISION (1)
1654 #define SECURITY_DESCRIPTOR_REVISION1 (1)
1656 /* Privilege attributes */
1657 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
1658 #define SE_PRIVILEGE_ENABLED (0x00000002L)
1659 #define SE_PRIVILEGE_REMOVED (0X00000004L)
1660 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
1662 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
1663 SE_PRIVILEGE_ENABLED | \
1664 SE_PRIVILEGE_REMOVED | \
1665 SE_PRIVILEGE_USED_FOR_ACCESS)
1667 #include <pshpack4.h>
1668 typedef struct _LUID_AND_ATTRIBUTES
{
1671 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
1672 #include <poppack.h>
1674 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
1675 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
1677 /* Privilege sets */
1678 #define PRIVILEGE_SET_ALL_NECESSARY (1)
1680 typedef struct _PRIVILEGE_SET
{
1681 ULONG PrivilegeCount
;
1683 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
1684 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
1686 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
1688 SecurityIdentification
,
1689 SecurityImpersonation
,
1691 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
1693 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
1694 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
1695 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
1696 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
1698 #define SECURITY_DYNAMIC_TRACKING (TRUE)
1699 #define SECURITY_STATIC_TRACKING (FALSE)
1701 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
1703 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
1705 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
1706 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
1707 BOOLEAN EffectiveOnly
;
1708 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
1710 typedef struct _SE_IMPERSONATION_STATE
{
1711 PACCESS_TOKEN Token
;
1713 BOOLEAN EffectiveOnly
;
1714 SECURITY_IMPERSONATION_LEVEL Level
;
1715 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
1717 #define OWNER_SECURITY_INFORMATION (0x00000001L)
1718 #define GROUP_SECURITY_INFORMATION (0x00000002L)
1719 #define DACL_SECURITY_INFORMATION (0x00000004L)
1720 #define SACL_SECURITY_INFORMATION (0x00000008L)
1721 #define LABEL_SECURITY_INFORMATION (0x00000010L)
1723 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
1724 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
1725 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
1726 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
1728 typedef enum _SECURITY_OPERATION_CODE
{
1729 SetSecurityDescriptor
,
1730 QuerySecurityDescriptor
,
1731 DeleteSecurityDescriptor
,
1732 AssignSecurityDescriptor
1733 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
1735 #define INITIAL_PRIVILEGE_COUNT 3
1737 typedef struct _INITIAL_PRIVILEGE_SET
{
1738 ULONG PrivilegeCount
;
1740 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
1741 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
1743 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
1744 #define SE_CREATE_TOKEN_PRIVILEGE 2
1745 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
1746 #define SE_LOCK_MEMORY_PRIVILEGE 4
1747 #define SE_INCREASE_QUOTA_PRIVILEGE 5
1748 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
1749 #define SE_TCB_PRIVILEGE 7
1750 #define SE_SECURITY_PRIVILEGE 8
1751 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
1752 #define SE_LOAD_DRIVER_PRIVILEGE 10
1753 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
1754 #define SE_SYSTEMTIME_PRIVILEGE 12
1755 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
1756 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
1757 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
1758 #define SE_CREATE_PERMANENT_PRIVILEGE 16
1759 #define SE_BACKUP_PRIVILEGE 17
1760 #define SE_RESTORE_PRIVILEGE 18
1761 #define SE_SHUTDOWN_PRIVILEGE 19
1762 #define SE_DEBUG_PRIVILEGE 20
1763 #define SE_AUDIT_PRIVILEGE 21
1764 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
1765 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
1766 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
1767 #define SE_UNDOCK_PRIVILEGE 25
1768 #define SE_SYNC_AGENT_PRIVILEGE 26
1769 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
1770 #define SE_MANAGE_VOLUME_PRIVILEGE 28
1771 #define SE_IMPERSONATE_PRIVILEGE 29
1772 #define SE_CREATE_GLOBAL_PRIVILEGE 30
1773 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
1774 #define SE_RELABEL_PRIVILEGE 32
1775 #define SE_INC_WORKING_SET_PRIVILEGE 33
1776 #define SE_TIME_ZONE_PRIVILEGE 34
1777 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
1778 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
1780 typedef struct _SECURITY_SUBJECT_CONTEXT
{
1781 PACCESS_TOKEN ClientToken
;
1782 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
1783 PACCESS_TOKEN PrimaryToken
;
1784 PVOID ProcessAuditId
;
1785 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
1787 typedef struct _ACCESS_STATE
{
1789 BOOLEAN SecurityEvaluated
;
1790 BOOLEAN GenerateAudit
;
1791 BOOLEAN GenerateOnClose
;
1792 BOOLEAN PrivilegesAllocated
;
1794 ACCESS_MASK RemainingDesiredAccess
;
1795 ACCESS_MASK PreviouslyGrantedAccess
;
1796 ACCESS_MASK OriginalDesiredAccess
;
1797 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
1798 PSECURITY_DESCRIPTOR SecurityDescriptor
;
1801 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
1802 PRIVILEGE_SET PrivilegeSet
;
1805 BOOLEAN AuditPrivileges
;
1806 UNICODE_STRING ObjectName
;
1807 UNICODE_STRING ObjectTypeName
;
1808 } ACCESS_STATE
, *PACCESS_STATE
;
1811 /******************************************************************************
1813 ******************************************************************************/
1816 /* Power States/Levels */
1817 typedef enum _SYSTEM_POWER_STATE
{
1818 PowerSystemUnspecified
,
1820 PowerSystemSleeping1
,
1821 PowerSystemSleeping2
,
1822 PowerSystemSleeping3
,
1823 PowerSystemHibernate
,
1824 PowerSystemShutdown
,
1826 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
1828 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
1830 typedef enum _POWER_INFORMATION_LEVEL
{
1831 SystemPowerPolicyAc
,
1832 SystemPowerPolicyDc
,
1833 VerifySystemPolicyAc
,
1834 VerifySystemPolicyDc
,
1835 SystemPowerCapabilities
,
1837 SystemPowerStateHandler
,
1838 ProcessorStateHandler
,
1839 SystemPowerPolicyCurrent
,
1840 AdministratorPowerPolicy
,
1841 SystemReserveHiberFile
,
1842 ProcessorInformation
,
1843 SystemPowerInformation
,
1844 ProcessorStateHandler2
,
1847 SystemExecutionState
,
1848 SystemPowerStateNotifyHandler
,
1849 ProcessorPowerPolicyAc
,
1850 ProcessorPowerPolicyDc
,
1851 VerifyProcessorPowerPolicyAc
,
1852 VerifyProcessorPowerPolicyDc
,
1853 ProcessorPowerPolicyCurrent
1854 } POWER_INFORMATION_LEVEL
;
1858 PowerActionReserved
,
1860 PowerActionHibernate
,
1861 PowerActionShutdown
,
1862 PowerActionShutdownReset
,
1863 PowerActionShutdownOff
,
1864 PowerActionWarmEject
1865 } POWER_ACTION
, *PPOWER_ACTION
;
1867 typedef enum _DEVICE_POWER_STATE
{
1868 PowerDeviceUnspecified
,
1874 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
1877 /******************************************************************************
1878 * Configuration Manager Types *
1879 ******************************************************************************/
1881 /* Resource list definitions */
1882 typedef int CM_RESOURCE_TYPE
;
1884 #define CmResourceTypeNull 0
1885 #define CmResourceTypePort 1
1886 #define CmResourceTypeInterrupt 2
1887 #define CmResourceTypeMemory 3
1888 #define CmResourceTypeDma 4
1889 #define CmResourceTypeDeviceSpecific 5
1890 #define CmResourceTypeBusNumber 6
1891 #define CmResourceTypeNonArbitrated 128
1892 #define CmResourceTypeConfigData 128
1893 #define CmResourceTypeDevicePrivate 129
1894 #define CmResourceTypePcCardConfig 130
1895 #define CmResourceTypeMfCardConfig 131
1898 /* KEY_VALUE_Xxx.Type */
1901 #define REG_EXPAND_SZ 2
1902 #define REG_BINARY 3
1904 #define REG_DWORD_LITTLE_ENDIAN 4
1905 #define REG_DWORD_BIG_ENDIAN 5
1907 #define REG_MULTI_SZ 7
1908 #define REG_RESOURCE_LIST 8
1909 #define REG_FULL_RESOURCE_DESCRIPTOR 9
1910 #define REG_RESOURCE_REQUIREMENTS_LIST 10
1911 #define REG_QWORD 11
1912 #define REG_QWORD_LITTLE_ENDIAN 11
1914 /* Registry Access Rights */
1915 #define KEY_QUERY_VALUE (0x0001)
1916 #define KEY_SET_VALUE (0x0002)
1917 #define KEY_CREATE_SUB_KEY (0x0004)
1918 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
1919 #define KEY_NOTIFY (0x0010)
1920 #define KEY_CREATE_LINK (0x0020)
1921 #define KEY_WOW64_32KEY (0x0200)
1922 #define KEY_WOW64_64KEY (0x0100)
1923 #define KEY_WOW64_RES (0x0300)
1925 #define KEY_READ ((STANDARD_RIGHTS_READ |\
1927 KEY_ENUMERATE_SUB_KEYS |\
1932 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
1934 KEY_CREATE_SUB_KEY) \
1938 #define KEY_EXECUTE ((KEY_READ) \
1942 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
1945 KEY_CREATE_SUB_KEY |\
1946 KEY_ENUMERATE_SUB_KEYS |\
1952 /* Registry Open/Create Options */
1953 #define REG_OPTION_RESERVED (0x00000000L)
1954 #define REG_OPTION_NON_VOLATILE (0x00000000L)
1955 #define REG_OPTION_VOLATILE (0x00000001L)
1956 #define REG_OPTION_CREATE_LINK (0x00000002L)
1957 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
1958 #define REG_OPTION_OPEN_LINK (0x00000008L)
1960 #define REG_LEGAL_OPTION \
1961 (REG_OPTION_RESERVED |\
1962 REG_OPTION_NON_VOLATILE |\
1963 REG_OPTION_VOLATILE |\
1964 REG_OPTION_CREATE_LINK |\
1965 REG_OPTION_BACKUP_RESTORE |\
1966 REG_OPTION_OPEN_LINK)
1968 /* Key creation/open disposition */
1969 #define REG_CREATED_NEW_KEY (0x00000001L)
1970 #define REG_OPENED_EXISTING_KEY (0x00000002L)
1972 /* Key restore & hive load flags */
1973 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
1974 #define REG_REFRESH_HIVE (0x00000002L)
1975 #define REG_NO_LAZY_FLUSH (0x00000004L)
1976 #define REG_FORCE_RESTORE (0x00000008L)
1977 #define REG_APP_HIVE (0x00000010L)
1978 #define REG_PROCESS_PRIVATE (0x00000020L)
1979 #define REG_START_JOURNAL (0x00000040L)
1980 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
1981 #define REG_HIVE_NO_RM (0x00000100L)
1982 #define REG_HIVE_SINGLE_LOG (0x00000200L)
1985 #define REG_FORCE_UNLOAD 1
1987 /* Notify Filter Values */
1988 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
1989 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
1990 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
1991 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
1993 #define REG_LEGAL_CHANGE_FILTER \
1994 (REG_NOTIFY_CHANGE_NAME |\
1995 REG_NOTIFY_CHANGE_ATTRIBUTES |\
1996 REG_NOTIFY_CHANGE_LAST_SET |\
1997 REG_NOTIFY_CHANGE_SECURITY)
1999 typedef struct _CM_FLOPPY_DEVICE_DATA
{
2005 UCHAR StepRateHeadUnloadTime
;
2008 UCHAR SectorLengthCode
;
2009 UCHAR SectorPerTrack
;
2010 UCHAR ReadWriteGapLength
;
2011 UCHAR DataTransferLength
;
2012 UCHAR FormatGapLength
;
2013 UCHAR FormatFillCharacter
;
2014 UCHAR HeadSettleTime
;
2015 UCHAR MotorSettleTime
;
2016 UCHAR MaximumTrackValue
;
2017 UCHAR DataTransferRate
;
2018 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
2020 #include <pshpack4.h>
2021 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
2023 UCHAR ShareDisposition
;
2027 PHYSICAL_ADDRESS Start
;
2031 PHYSICAL_ADDRESS Start
;
2039 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2041 __GNU_EXTENSION
union {
2044 USHORT MessageCount
;
2057 PHYSICAL_ADDRESS Start
;
2077 } DeviceSpecificData
;
2078 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2080 PHYSICAL_ADDRESS Start
;
2084 PHYSICAL_ADDRESS Start
;
2088 PHYSICAL_ADDRESS Start
;
2093 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
2094 #include <poppack.h>
2096 #include <pshpack1.h>
2097 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
2099 #define CmResourceTypeNull 0
2100 #define CmResourceTypePort 1
2101 #define CmResourceTypeInterrupt 2
2102 #define CmResourceTypeMemory 3
2103 #define CmResourceTypeDma 4
2104 #define CmResourceTypeDeviceSpecific 5
2105 #define CmResourceTypeBusNumber 6
2106 #define CmResourceTypeMemoryLarge 7
2107 #define CmResourceTypeNonArbitrated 128
2108 #define CmResourceTypeConfigData 128
2109 #define CmResourceTypeDevicePrivate 129
2110 #define CmResourceTypePcCardConfig 130
2111 #define CmResourceTypeMfCardConfig 131
2113 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
2115 typedef enum _CM_SHARE_DISPOSITION
{
2116 CmResourceShareUndetermined
,
2117 CmResourceShareDeviceExclusive
,
2118 CmResourceShareDriverExclusive
,
2119 CmResourceShareShared
2120 } CM_SHARE_DISPOSITION
;
2122 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
2124 #define CM_RESOURCE_PORT_MEMORY 0x0000
2125 #define CM_RESOURCE_PORT_IO 0x0001
2126 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
2127 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
2128 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
2129 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
2130 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
2131 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
2132 #define CM_RESOURCE_PORT_BAR 0x0100
2134 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
2136 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
2137 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
2138 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
2139 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
2141 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
2143 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
2144 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
2145 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
2146 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
2147 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
2148 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
2149 #define CM_RESOURCE_MEMORY_24 0x0010
2150 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
2151 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
2152 #define CM_RESOURCE_MEMORY_BAR 0x0080
2153 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
2155 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
2157 #define CM_RESOURCE_DMA_8 0x0000
2158 #define CM_RESOURCE_DMA_16 0x0001
2159 #define CM_RESOURCE_DMA_32 0x0002
2160 #define CM_RESOURCE_DMA_8_AND_16 0x0004
2161 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
2162 #define CM_RESOURCE_DMA_TYPE_A 0x0010
2163 #define CM_RESOURCE_DMA_TYPE_B 0x0020
2164 #define CM_RESOURCE_DMA_TYPE_F 0x0040
2166 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
2170 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
2171 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
2173 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
2174 INTERFACE_TYPE InterfaceType
;
2176 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
2177 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
2179 typedef struct _CM_RESOURCE_LIST
{
2181 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
2182 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
2184 typedef struct _CM_INT13_DRIVE_PARAMETER
{
2187 USHORT SectorsPerTrack
;
2189 USHORT NumberDrives
;
2190 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
2192 typedef struct _CM_PNP_BIOS_DEVICE_NODE
2197 UCHAR DeviceType
[3];
2198 USHORT DeviceAttributes
;
2199 } CM_PNP_BIOS_DEVICE_NODE
,*PCM_PNP_BIOS_DEVICE_NODE
;
2201 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
2206 USHORT ControlField
;
2208 ULONG EventFlagAddress
;
2209 USHORT RealModeEntryOffset
;
2210 USHORT RealModeEntrySegment
;
2211 USHORT ProtectedModeEntryOffset
;
2212 ULONG ProtectedModeCodeBaseAddress
;
2214 USHORT RealModeDataBaseAddress
;
2215 ULONG ProtectedModeDataBaseAddress
;
2216 } CM_PNP_BIOS_INSTALLATION_CHECK
, *PCM_PNP_BIOS_INSTALLATION_CHECK
;
2218 #include <poppack.h>
2220 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
2222 ULONG BytesPerSector
;
2223 ULONG NumberOfCylinders
;
2224 ULONG SectorsPerTrack
;
2225 ULONG NumberOfHeads
;
2226 } CM_DISK_GEOMETRY_DEVICE_DATA
, *PCM_DISK_GEOMETRY_DEVICE_DATA
;
2228 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
2233 USHORT KeyboardFlags
;
2234 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
2236 typedef struct _CM_MCA_POS_DATA
{
2242 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
2244 #if (NTDDI_VERSION >= NTDDI_WINXP)
2245 typedef struct CM_Power_Data_s
{
2247 DEVICE_POWER_STATE PD_MostRecentPowerState
;
2248 ULONG PD_Capabilities
;
2252 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
2253 SYSTEM_POWER_STATE PD_DeepestSystemWake
;
2254 } CM_POWER_DATA
, *PCM_POWER_DATA
;
2256 #define PDCAP_D0_SUPPORTED 0x00000001
2257 #define PDCAP_D1_SUPPORTED 0x00000002
2258 #define PDCAP_D2_SUPPORTED 0x00000004
2259 #define PDCAP_D3_SUPPORTED 0x00000008
2260 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2261 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2262 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2263 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2264 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2266 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2268 typedef struct _CM_SCSI_DEVICE_DATA
{
2271 UCHAR HostIdentifier
;
2272 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
2274 typedef struct _CM_SERIAL_DEVICE_DATA
{
2278 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
2280 typedef enum _KEY_INFORMATION_CLASS
{
2281 KeyBasicInformation
,
2285 KeyCachedInformation
,
2287 } KEY_INFORMATION_CLASS
;
2289 typedef struct _KEY_BASIC_INFORMATION
{
2290 LARGE_INTEGER LastWriteTime
;
2294 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
2296 typedef struct _KEY_FULL_INFORMATION
{
2297 LARGE_INTEGER LastWriteTime
;
2305 ULONG MaxValueNameLen
;
2306 ULONG MaxValueDataLen
;
2308 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
2310 typedef struct _KEY_NODE_INFORMATION
{
2311 LARGE_INTEGER LastWriteTime
;
2317 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
2319 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
2324 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
2326 typedef struct _KEY_VALUE_FULL_INFORMATION
{
2333 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
2335 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
2340 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
2342 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
2346 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
2348 typedef struct _KEY_VALUE_ENTRY
{
2349 PUNICODE_STRING ValueName
;
2353 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
2355 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
2356 KeyValueBasicInformation
,
2357 KeyValueFullInformation
,
2358 KeyValuePartialInformation
,
2359 KeyValueFullInformationAlign64
,
2360 KeyValuePartialInformationAlign64
2361 } KEY_VALUE_INFORMATION_CLASS
;
2363 typedef struct _KEY_WRITE_TIME_INFORMATION
{
2364 LARGE_INTEGER LastWriteTime
;
2365 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
2367 typedef enum _KEY_SET_INFORMATION_CLASS
{
2368 KeyWriteTimeInformation
,
2369 KeyWow64FlagsInformation
,
2370 KeyControlFlagsInformation
,
2371 KeySetVirtualizationInformation
,
2372 KeySetDebugInformation
,
2373 KeySetHandleTagsInformation
,
2375 } KEY_SET_INFORMATION_CLASS
;
2377 typedef enum _REG_NOTIFY_CLASS
{
2379 RegNtPreDeleteKey
= RegNtDeleteKey
,
2381 RegNtPreSetValueKey
= RegNtSetValueKey
,
2382 RegNtDeleteValueKey
,
2383 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
2384 RegNtSetInformationKey
,
2385 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
2387 RegNtPreRenameKey
= RegNtRenameKey
,
2389 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
2390 RegNtEnumerateValueKey
,
2391 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
2393 RegNtPreQueryKey
= RegNtQueryKey
,
2395 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
2396 RegNtQueryMultipleValueKey
,
2397 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
2402 RegNtKeyHandleClose
,
2403 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
2405 RegNtPostSetValueKey
,
2406 RegNtPostDeleteValueKey
,
2407 RegNtPostSetInformationKey
,
2409 RegNtPostEnumerateKey
,
2410 RegNtPostEnumerateValueKey
,
2412 RegNtPostQueryValueKey
,
2413 RegNtPostQueryMultipleValueKey
,
2414 RegNtPostKeyHandleClose
,
2415 RegNtPreCreateKeyEx
,
2416 RegNtPostCreateKeyEx
,
2425 RegNtPreQueryKeySecurity
,
2426 RegNtPostQueryKeySecurity
,
2427 RegNtPreSetKeySecurity
,
2428 RegNtPostSetKeySecurity
,
2429 RegNtCallbackObjectContextCleanup
,
2431 RegNtPostRestoreKey
,
2435 RegNtPostReplaceKey
,
2437 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
2440 (NTAPI
*PEX_CALLBACK_FUNCTION
)(
2441 IN PVOID CallbackContext
,
2446 typedef struct _REG_DELETE_KEY_INFORMATION
{
2449 PVOID ObjectContext
;
2451 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
2452 #if (NTDDI_VERSION >= NTDDI_VISTA)
2453 , REG_FLUSH_KEY_INFORMATION
, *PREG_FLUSH_KEY_INFORMATION
2457 typedef struct _REG_SET_VALUE_KEY_INFORMATION
{
2459 PUNICODE_STRING ValueName
;
2465 PVOID ObjectContext
;
2467 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
2469 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
{
2471 PUNICODE_STRING ValueName
;
2473 PVOID ObjectContext
;
2475 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
2477 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
{
2479 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
2480 PVOID KeySetInformation
;
2481 ULONG KeySetInformationLength
;
2483 PVOID ObjectContext
;
2485 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
2487 typedef struct _REG_ENUMERATE_KEY_INFORMATION
{
2490 KEY_INFORMATION_CLASS KeyInformationClass
;
2491 PVOID KeyInformation
;
2493 PULONG ResultLength
;
2495 PVOID ObjectContext
;
2497 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
2499 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
{
2502 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
2503 PVOID KeyValueInformation
;
2505 PULONG ResultLength
;
2507 PVOID ObjectContext
;
2509 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
2511 typedef struct _REG_QUERY_KEY_INFORMATION
{
2513 KEY_INFORMATION_CLASS KeyInformationClass
;
2514 PVOID KeyInformation
;
2516 PULONG ResultLength
;
2518 PVOID ObjectContext
;
2520 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
2522 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
{
2524 PUNICODE_STRING ValueName
;
2525 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
2526 PVOID KeyValueInformation
;
2528 PULONG ResultLength
;
2530 PVOID ObjectContext
;
2532 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
2534 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
{
2536 PKEY_VALUE_ENTRY ValueEntries
;
2539 PULONG BufferLength
;
2540 PULONG RequiredBufferLength
;
2542 PVOID ObjectContext
;
2544 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
2546 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
{
2547 PUNICODE_STRING CompleteName
;
2548 } REG_PRE_CREATE_KEY_INFORMATION
, REG_PRE_OPEN_KEY_INFORMATION
,*PREG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;;
2550 typedef struct _REG_POST_CREATE_KEY_INFORMATION
{
2551 PUNICODE_STRING CompleteName
;
2554 } REG_POST_CREATE_KEY_INFORMATION
,REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
2556 typedef struct _REG_POST_OPERATION_INFORMATION
{
2559 PVOID PreInformation
;
2560 NTSTATUS ReturnStatus
;
2562 PVOID ObjectContext
;
2564 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
2566 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
{
2569 PVOID ObjectContext
;
2571 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
2574 /******************************************************************************
2575 * Configuration Manager Functions *
2576 ******************************************************************************/
2578 #if (NTDDI_VERSION >= NTDDI_WINXP)
2583 IN PEX_CALLBACK_FUNCTION Function
,
2584 IN PVOID Context OPTIONAL
,
2585 OUT PLARGE_INTEGER Cookie
);
2590 CmUnRegisterCallback(
2591 IN LARGE_INTEGER Cookie
);
2595 /******************************************************************************
2597 ******************************************************************************/
2599 #define RTL_REGISTRY_ABSOLUTE 0
2600 #define RTL_REGISTRY_SERVICES 1
2601 #define RTL_REGISTRY_CONTROL 2
2602 #define RTL_REGISTRY_WINDOWS_NT 3
2603 #define RTL_REGISTRY_DEVICEMAP 4
2604 #define RTL_REGISTRY_USER 5
2605 #define RTL_REGISTRY_MAXIMUM 6
2606 #define RTL_REGISTRY_HANDLE 0x40000000
2607 #define RTL_REGISTRY_OPTIONAL 0x80000000
2609 /* RTL_QUERY_REGISTRY_TABLE.Flags */
2610 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
2611 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
2612 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
2613 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
2614 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
2615 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
2616 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
2618 #define HASH_STRING_ALGORITHM_DEFAULT 0
2619 #define HASH_STRING_ALGORITHM_X65599 1
2620 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
2622 typedef struct _RTL_BITMAP
{
2625 } RTL_BITMAP
, *PRTL_BITMAP
;
2627 typedef struct _RTL_BITMAP_RUN
{
2628 ULONG StartingIndex
;
2630 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
2633 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
2637 IN ULONG ValueLength
,
2639 IN PVOID EntryContext
);
2641 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
2642 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
2648 ULONG DefaultLength
;
2649 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
2651 typedef struct _TIME_FIELDS
{
2658 CSHORT Milliseconds
;
2660 } TIME_FIELDS
, *PTIME_FIELDS
;
2663 #ifndef _SLIST_HEADER_
2664 #define _SLIST_HEADER_
2667 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
2668 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
2671 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
2673 ULONGLONG Alignment
;
2678 ULONGLONG Sequence
:9;
2679 ULONGLONG NextEntry
:39;
2680 ULONGLONG HeaderType
:1;
2682 ULONGLONG Reserved
:59;
2687 ULONGLONG Sequence
:48;
2688 ULONGLONG HeaderType
:1;
2690 ULONGLONG Reserved
:2;
2691 ULONGLONG NextEntry
:60;
2693 } SLIST_HEADER
, *PSLIST_HEADER
;
2695 #define SLIST_ENTRY SINGLE_LIST_ENTRY
2696 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
2697 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
2698 typedef union _SLIST_HEADER
{
2699 ULONGLONG Alignment
;
2705 } SLIST_HEADER
, *PSLIST_HEADER
;
2708 #endif /* _SLIST_HEADER_ */
2711 /******************************************************************************
2713 ******************************************************************************/
2718 OUT PLIST_ENTRY ListHead
)
2720 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
2726 IN OUT PLIST_ENTRY ListHead
,
2727 IN OUT PLIST_ENTRY Entry
)
2729 PLIST_ENTRY OldFlink
;
2730 OldFlink
= ListHead
->Flink
;
2731 Entry
->Flink
= OldFlink
;
2732 Entry
->Blink
= ListHead
;
2733 OldFlink
->Blink
= Entry
;
2734 ListHead
->Flink
= Entry
;
2740 IN OUT PLIST_ENTRY ListHead
,
2741 IN OUT PLIST_ENTRY Entry
)
2743 PLIST_ENTRY OldBlink
;
2744 OldBlink
= ListHead
->Blink
;
2745 Entry
->Flink
= ListHead
;
2746 Entry
->Blink
= OldBlink
;
2747 OldBlink
->Flink
= Entry
;
2748 ListHead
->Blink
= Entry
;
2754 IN CONST LIST_ENTRY
* ListHead
)
2756 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
2762 IN OUT PSINGLE_LIST_ENTRY ListHead
)
2764 PSINGLE_LIST_ENTRY FirstEntry
;
2765 FirstEntry
= ListHead
->Next
;
2766 if (FirstEntry
!= NULL
) {
2767 ListHead
->Next
= FirstEntry
->Next
;
2775 IN OUT PSINGLE_LIST_ENTRY ListHead
,
2776 IN OUT PSINGLE_LIST_ENTRY Entry
)
2778 Entry
->Next
= ListHead
->Next
;
2779 ListHead
->Next
= Entry
;
2785 IN PLIST_ENTRY Entry
)
2787 PLIST_ENTRY OldFlink
;
2788 PLIST_ENTRY OldBlink
;
2790 OldFlink
= Entry
->Flink
;
2791 OldBlink
= Entry
->Blink
;
2792 OldFlink
->Blink
= OldBlink
;
2793 OldBlink
->Flink
= OldFlink
;
2794 return (BOOLEAN
)(OldFlink
== OldBlink
);
2800 IN OUT PLIST_ENTRY ListHead
)
2805 Entry
= ListHead
->Flink
;
2806 Flink
= Entry
->Flink
;
2807 ListHead
->Flink
= Flink
;
2808 Flink
->Blink
= ListHead
;
2815 IN OUT PLIST_ENTRY ListHead
)
2820 Entry
= ListHead
->Blink
;
2821 Blink
= Entry
->Blink
;
2822 ListHead
->Blink
= Blink
;
2823 Blink
->Flink
= ListHead
;
2831 IN PVOID FailedAssertion
,
2833 IN ULONG LineNumber
,
2838 * IN VOID UNALIGNED *Destination,
2839 * IN CONST VOID UNALIGNED *Source,
2842 #define RtlCopyMemory(Destination, Source, Length) \
2843 memcpy(Destination, Source, Length)
2845 #define RtlCopyBytes RtlCopyMemory
2847 #if defined(_M_AMD64)
2851 RtlCopyMemoryNonTemporal(
2852 VOID UNALIGNED
*Destination
,
2853 CONST VOID UNALIGNED
*Source
,
2856 #define RtlCopyMemoryNonTemporal RtlCopyMemory
2864 #define RtlEqualLuid(Luid1, Luid2) \
2865 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
2869 * IN VOID UNALIGNED *Destination,
2870 * IN CONST VOID UNALIGNED *Source,
2873 #define RtlEqualMemory(Destination, Source, Length) \
2874 (!memcmp(Destination, Source, Length))
2878 * IN VOID UNALIGNED *Destination,
2882 #define RtlFillMemory(Destination, Length, Fill) \
2883 memset(Destination, Fill, Length)
2885 #define RtlFillBytes RtlFillMemory
2890 RtlFreeUnicodeString(
2891 IN PUNICODE_STRING UnicodeString
);
2897 IN PUNICODE_STRING GuidString
,
2903 RtlInitUnicodeString(
2904 IN OUT PUNICODE_STRING DestinationString
,
2905 IN PCWSTR SourceString
);
2909 * IN VOID UNALIGNED *Destination,
2910 * IN CONST VOID UNALIGNED *Source,
2913 #define RtlMoveMemory(Destination, Source, Length) \
2914 memmove(Destination, Source, Length)
2921 OUT PUNICODE_STRING GuidString
);
2925 * IN VOID UNALIGNED *Destination,
2928 #define RtlZeroMemory(Destination, Length) \
2929 memset(Destination, 0, Length)
2931 #define RtlZeroBytes RtlZeroMemory
2934 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2939 IN PRTL_BITMAP BitMapHeader
,
2940 IN ULONG StartingIndex
,
2947 IN PRTL_BITMAP BitMapHeader
,
2948 IN ULONG StartingIndex
,
2954 RtlAnsiStringToUnicodeString(
2955 IN OUT PUNICODE_STRING DestinationString
,
2956 IN PANSI_STRING SourceString
,
2957 IN BOOLEAN AllocateDestinationString
);
2962 RtlxAnsiStringToUnicodeSize(
2963 IN PCANSI_STRING AnsiString
);
2965 #define RtlAnsiStringToUnicodeSize(String) ( \
2966 NLS_MB_CODE_PAGE_TAG ? \
2967 RtlxAnsiStringToUnicodeSize(String) : \
2968 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
2974 RtlAppendUnicodeStringToString(
2975 IN OUT PUNICODE_STRING Destination
,
2976 IN PCUNICODE_STRING Source
);
2981 RtlAppendUnicodeToString(
2982 IN OUT PUNICODE_STRING Destination
,
2988 RtlCheckRegistryKey(
2989 IN ULONG RelativeTo
,
2996 IN PRTL_BITMAP BitMapHeader
);
3002 IN PRTL_BITMAP BitMapHeader
,
3003 IN ULONG StartingIndex
,
3004 IN ULONG NumberToClear
);
3010 IN CONST VOID
*Source1
,
3011 IN CONST VOID
*Source2
,
3017 RtlCompareUnicodeString(
3018 IN PCUNICODE_STRING String1
,
3019 IN PCUNICODE_STRING String2
,
3020 IN BOOLEAN CaseInSensitive
);
3025 RtlCompareUnicodeStrings(
3027 IN SIZE_T String1Length
,
3029 IN SIZE_T String2Length
,
3030 IN BOOLEAN CaseInSensitive
);
3035 RtlCopyUnicodeString(
3036 IN OUT PUNICODE_STRING DestinationString
,
3037 IN PCUNICODE_STRING SourceString
);
3042 RtlCreateRegistryKey(
3043 IN ULONG RelativeTo
,
3049 RtlCreateSecurityDescriptor(
3050 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
3056 RtlDeleteRegistryValue(
3057 IN ULONG RelativeTo
,
3059 IN PCWSTR ValueName
);
3064 RtlEqualUnicodeString(
3065 IN CONST UNICODE_STRING
*String1
,
3066 IN CONST UNICODE_STRING
*String2
,
3067 IN BOOLEAN CaseInSensitive
);
3069 #if !defined(_AMD64_) && !defined(_IA64_)
3073 RtlExtendedIntegerMultiply(
3074 IN LARGE_INTEGER Multiplicand
,
3075 IN LONG Multiplier
);
3080 RtlExtendedLargeIntegerDivide(
3081 IN LARGE_INTEGER Dividend
,
3083 IN OUT PULONG Remainder
);
3086 #if defined(_X86_) || defined(_IA64_)
3090 RtlExtendedMagicDivide(
3091 IN LARGE_INTEGER Dividend
,
3092 IN LARGE_INTEGER MagicDivisor
,
3093 IN CCHAR ShiftCount
);
3100 IN PANSI_STRING AnsiString
);
3106 IN PRTL_BITMAP BitMapHeader
,
3107 IN ULONG NumberToFind
,
3108 IN ULONG HintIndex
);
3113 RtlFindClearBitsAndSet(
3114 IN PRTL_BITMAP BitMapHeader
,
3115 IN ULONG NumberToFind
,
3116 IN ULONG HintIndex
);
3121 RtlFindFirstRunClear(
3122 IN PRTL_BITMAP BitMapHeader
,
3123 OUT PULONG StartingIndex
);
3129 IN PRTL_BITMAP BitMapHeader
,
3130 OUT PRTL_BITMAP_RUN RunArray
,
3131 IN ULONG SizeOfRunArray
,
3132 IN BOOLEAN LocateLongestRuns
);
3137 RtlFindLastBackwardRunClear(
3138 IN PRTL_BITMAP BitMapHeader
,
3140 OUT PULONG StartingRunIndex
);
3145 RtlFindLeastSignificantBit(
3151 RtlFindLongestRunClear(
3152 IN PRTL_BITMAP BitMapHeader
,
3153 OUT PULONG StartingIndex
);
3158 RtlFindMostSignificantBit(
3164 RtlFindNextForwardRunClear(
3165 IN PRTL_BITMAP BitMapHeader
,
3167 OUT PULONG StartingRunIndex
);
3173 IN PRTL_BITMAP BitMapHeader
,
3174 IN ULONG NumberToFind
,
3175 IN ULONG HintIndex
);
3180 RtlFindSetBitsAndClear(
3181 IN PRTL_BITMAP BitMapHeader
,
3182 IN ULONG NumberToFind
,
3183 IN ULONG HintIndex
);
3188 RtlHashUnicodeString(
3189 IN CONST UNICODE_STRING
*String
,
3190 IN BOOLEAN CaseInSensitive
,
3191 IN ULONG HashAlgorithm
,
3192 OUT PULONG HashValue
);
3198 IN OUT PANSI_STRING DestinationString
,
3199 IN PCSZ SourceString
);
3204 RtlInitializeBitMap(
3205 IN PRTL_BITMAP BitMapHeader
,
3206 IN PULONG BitMapBuffer
,
3207 IN ULONG SizeOfBitMap
);
3213 IN OUT PSTRING DestinationString
,
3214 IN PCSZ SourceString
);
3219 RtlIntegerToUnicodeString(
3221 IN ULONG Base OPTIONAL
,
3222 IN OUT PUNICODE_STRING String
);
3227 RtlInt64ToUnicodeString(
3229 IN ULONG Base OPTIONAL
,
3230 IN OUT PUNICODE_STRING String
);
3233 #define RtlIntPtrToUnicodeString(Value, Base, String) \
3234 RtlInt64ToUnicodeString(Value, Base, String)
3236 #define RtlIntPtrToUnicodeString(Value, Base, String) \
3237 RtlIntegerToUnicodeString(Value, Base, String)
3244 #define RtlIsZeroLuid(_L1) \
3245 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
3250 RtlLengthSecurityDescriptor(
3251 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
3256 RtlNumberOfClearBits(
3257 IN PRTL_BITMAP BitMapHeader
);
3263 IN PRTL_BITMAP BitMapHeader
);
3268 RtlQueryRegistryValues(
3269 IN ULONG RelativeTo
,
3271 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
3273 IN PVOID Environment OPTIONAL
);
3275 #define LONG_SIZE (sizeof(LONG))
3276 #define LONG_MASK (LONG_SIZE - 1)
3280 * PULONG DestinationAddress,
3281 * PULONG SourceAddress);
3283 #if defined(_AMD64_)
3284 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
3285 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
3287 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
3288 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
3290 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
3291 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
3292 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
3293 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
3297 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
3302 * RtlRetrieveUshort(
3303 * PUSHORT DestinationAddress,
3304 * PUSHORT SourceAddress);
3306 #if defined(_AMD64_)
3307 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
3308 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
3310 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
3311 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
3313 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
3314 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
3318 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
3326 IN PRTL_BITMAP BitMapHeader
);
3332 IN PRTL_BITMAP BitMapHeader
,
3333 IN ULONG StartingIndex
,
3334 IN ULONG NumberToSet
);
3339 RtlSetDaclSecurityDescriptor(
3340 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
3341 IN BOOLEAN DaclPresent
,
3342 IN PACL Dacl OPTIONAL
,
3343 IN BOOLEAN DaclDefaulted OPTIONAL
);
3347 * IN PULONG Address,
3350 #if defined(_AMD64_)
3351 #define RtlStoreUlong(Address,Value) \
3352 *(ULONG UNALIGNED *)(Address) = (Value)
3354 #define RtlStoreUlong(Address,Value) \
3355 if ((ULONG_PTR)(Address) & LONG_MASK) { \
3356 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
3357 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
3358 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
3359 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
3362 *((PULONG)(Address)) = (ULONG) (Value); \
3367 * RtlStoreUlonglong(
3368 * IN OUT PULONGLONG Address,
3371 #if defined(_AMD64_)
3372 #define RtlStoreUlonglong(Address,Value) \
3373 *(ULONGLONG UNALIGNED *)(Address) = (Value)
3375 #define RtlStoreUlonglong(Address,Value) \
3376 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
3377 RtlStoreUlong((ULONG_PTR)(Address), \
3378 (ULONGLONG)(Value) & 0xFFFFFFFF); \
3379 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
3380 (ULONGLONG)(Value) >> 32); \
3382 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
3388 * IN OUT PULONG_PTR Address,
3389 * IN ULONG_PTR Value);
3392 #define RtlStoreUlongPtr(Address,Value) \
3393 RtlStoreUlonglong(Address,Value)
3395 #define RtlStoreUlongPtr(Address,Value) \
3396 RtlStoreUlong(Address,Value)
3401 * IN PUSHORT Address,
3404 #if defined(_AMD64_)
3405 #define RtlStoreUshort(Address,Value) \
3406 *(USHORT UNALIGNED *)(Address) = (Value)
3408 #define RtlStoreUshort(Address,Value) \
3409 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
3410 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
3411 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
3414 *((PUSHORT) (Address)) = (USHORT)Value; \
3421 RtlTimeFieldsToTime(
3422 IN PTIME_FIELDS TimeFields
,
3423 IN PLARGE_INTEGER Time
);
3428 RtlTimeToTimeFields(
3429 IN PLARGE_INTEGER Time
,
3430 IN PTIME_FIELDS TimeFields
);
3441 RtlUlonglongByteSwap(
3442 IN ULONGLONG Source
);
3447 RtlUnicodeStringToAnsiString(
3448 IN OUT PANSI_STRING DestinationString
,
3449 IN PCUNICODE_STRING SourceString
,
3450 IN BOOLEAN AllocateDestinationString
);
3455 RtlxUnicodeStringToAnsiSize(
3456 IN PCUNICODE_STRING UnicodeString
);
3458 #define RtlUnicodeStringToAnsiSize(String) ( \
3459 NLS_MB_CODE_PAGE_TAG ? \
3460 RtlxUnicodeStringToAnsiSize(String) : \
3461 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
3467 RtlUnicodeStringToInteger(
3468 IN PCUNICODE_STRING String
,
3469 IN ULONG Base OPTIONAL
,
3475 RtlUpcaseUnicodeChar(
3476 IN WCHAR SourceCharacter
);
3487 RtlValidRelativeSecurityDescriptor(
3488 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
3489 IN ULONG SecurityDescriptorLength
,
3490 IN SECURITY_INFORMATION RequiredInformation
);
3495 RtlValidSecurityDescriptor(
3496 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
3501 RtlWriteRegistryValue(
3502 IN ULONG RelativeTo
,
3504 IN PCWSTR ValueName
,
3507 IN ULONG ValueLength
);
3509 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
3511 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
3515 RtlPrefetchMemoryNonTemporal(
3520 #if (NTDDI_VERSION >= NTDDI_WINXP)
3525 PRTL_BITMAP BitMapHeader
,
3531 RtlDowncaseUnicodeChar(
3532 IN WCHAR SourceCharacter
);
3538 PRTL_BITMAP BitMapHeader
,
3545 IN PRTL_BITMAP BitMapHeader
,
3546 IN ULONG BitNumber
);
3548 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
3550 #if (NTDDI_VERSION >= NTDDI_VISTA)
3554 RtlNumberOfSetBitsUlongPtr(
3555 IN ULONG_PTR Target
);
3560 RtlIoDecodeMemIoResource (
3561 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
3562 OUT PULONGLONG Alignment OPTIONAL
,
3563 OUT PULONGLONG MinimumAddress OPTIONAL
,
3564 OUT PULONGLONG MaximumAddress OPTIONAL
);
3569 RtlIoEncodeMemIoResource(
3570 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
3572 IN ULONGLONG Length
,
3573 IN ULONGLONG Alignment
,
3574 IN ULONGLONG MinimumAddress
,
3575 IN ULONGLONG MaximumAddress
);
3580 RtlCmDecodeMemIoResource(
3581 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
3582 OUT PULONGLONG Start OPTIONAL
);
3587 RtlFindClosestEncodableLength(
3588 IN ULONGLONG SourceLength
,
3589 OUT PULONGLONG TargetLength
);
3593 #if !defined(MIDL_PASS)
3594 /* inline funftions */
3595 //DECLSPEC_DEPRECATED_DDK_WINXP
3599 RtlConvertLongToLargeInteger(LONG SignedInteger
)
3602 ret
.QuadPart
= SignedInteger
;
3606 //DECLSPEC_DEPRECATED_DDK_WINXP
3610 RtlConvertUlongToLargeInteger(
3611 ULONG UnsignedInteger
)
3614 ret
.QuadPart
= UnsignedInteger
;
3618 //DECLSPEC_DEPRECATED_DDK
3622 RtlEnlargedUnsignedDivide(
3623 IN ULARGE_INTEGER Dividend
,
3625 IN OUT PULONG Remainder
)
3628 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
3629 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
3632 //DECLSPEC_DEPRECATED_DDK
3636 RtlEnlargedUnsignedMultiply(
3637 IN ULONG Multiplicand
,
3638 IN ULONG Multiplier
)
3641 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
3645 //DECLSPEC_DEPRECATED_DDK
3649 RtlEnlargedIntegerMultiply(
3650 IN LONG Multiplicand
,
3654 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
3660 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
3662 IN USHORT BufferSize
)
3664 AnsiString
->Length
= 0;
3665 AnsiString
->MaximumLength
= BufferSize
;
3666 AnsiString
->Buffer
= Buffer
;
3671 RtlInitEmptyUnicodeString(
3672 OUT PUNICODE_STRING UnicodeString
,
3674 IN USHORT BufferSize
)
3676 UnicodeString
->Length
= 0;
3677 UnicodeString
->MaximumLength
= BufferSize
;
3678 UnicodeString
->Buffer
= Buffer
;
3681 #if defined(_AMD64_) || defined(_IA64_)
3685 RtlExtendedIntegerMultiply(
3686 LARGE_INTEGER Multiplicand
,
3690 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
3697 RtlExtendedLargeIntegerDivide(
3698 LARGE_INTEGER Dividend
,
3703 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
3705 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
3710 #if defined(_AMD64_)
3712 #define MultiplyHigh __mulh
3713 #define UnsignedMultiplyHigh __umulh
3715 //DECLSPEC_DEPRECATED_DDK
3719 RtlExtendedMagicDivide(
3720 IN LARGE_INTEGER Dividend
,
3721 IN LARGE_INTEGER MagicDivisor
,
3722 IN CCHAR ShiftCount
)
3727 Pos
= (Dividend
.QuadPart
>= 0);
3728 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
3729 MagicDivisor
.QuadPart
);
3730 ret64
>>= ShiftCount
;
3731 ret
.QuadPart
= Pos
? ret64
: -ret64
;
3736 //DECLSPEC_DEPRECATED_DDK
3741 IN LARGE_INTEGER Addend1
,
3742 IN LARGE_INTEGER Addend2
)
3745 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
3750 * RtlLargeIntegerAnd(
3751 * IN OUT LARGE_INTEGER Result,
3752 * IN LARGE_INTEGER Source,
3753 * IN LARGE_INTEGER Mask);
3755 #define RtlLargeIntegerAnd(Result, Source, Mask) \
3756 Result.QuadPart = Source.QuadPart & Mask.QuadPart
3758 //DECLSPEC_DEPRECATED_DDK
3762 RtlLargeIntegerArithmeticShift(
3763 IN LARGE_INTEGER LargeInteger
,
3764 IN CCHAR ShiftCount
)
3767 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
3772 * RtlLargeIntegerEqualTo(
3773 * IN LARGE_INTEGER Operand1,
3774 * IN LARGE_INTEGER Operand2);
3776 #define RtlLargeIntegerEqualTo(X,Y) \
3777 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
3781 RtlSecureZeroMemory(
3785 volatile char* vptr
= (volatile char*)Pointer
;
3786 #if defined(_M_AMD64)
3787 __stosb((PUCHAR
)vptr
, 0, Size
);
3789 char * endptr
= (char *)vptr
+ Size
;
3790 while (vptr
< endptr
)
3798 #if defined(_M_AMD64)
3802 IN PRTL_BITMAP BitMapHeader
,
3803 IN ULONG BitPosition
)
3805 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
3808 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
3809 #endif // defined(_M_AMD64)
3811 #endif // !defined(MIDL_PASS)
3813 /* Byte Swap Functions */
3814 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
3815 ((defined(_M_AMD64) || defined(_M_IA64)) \
3816 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
3818 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
3819 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
3820 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
3826 #define ASSERT(exp) \
3828 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
3830 #define ASSERTMSG(msg, exp) \
3832 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
3834 #define RTL_SOFT_ASSERT(exp) \
3836 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
3838 #define RTL_SOFT_ASSERTMSG(msg, exp) \
3840 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
3842 #define RTL_VERIFY(exp) ASSERT(exp)
3843 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
3845 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
3846 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
3848 #if defined(_MSC_VER)
3850 #define NT_ASSERT(exp) \
3852 (__annotation(L"Debug", L"AssertFail", L#exp), \
3853 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3855 #define NT_ASSERTMSG(msg, exp) \
3857 (__annotation(L"Debug", L"AssertFail", L##msg), \
3858 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3860 #define NT_ASSERTMSGW(msg, exp) \
3862 (__annotation(L"Debug", L"AssertFail", msg), \
3863 DbgRaiseAssertionFailure(), FALSE) : TRUE)
3867 /* GCC doesn't support __annotation (nor PDB) */
3868 #define NT_ASSERT(exp) \
3869 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
3871 #define NT_ASSERTMSG NT_ASSERT
3872 #define NT_ASSERTMSGW NT_ASSERT
3878 #define ASSERT(exp) ((VOID) 0)
3879 #define ASSERTMSG(msg, exp) ((VOID) 0)
3881 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
3882 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
3884 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
3885 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
3887 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
3888 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
3890 #define NT_ASSERT(exp) ((VOID)0)
3891 #define NT_ASSERTMSG(exp) ((VOID)0)
3892 #define NT_ASSERTMSGW(exp) ((VOID)0)
3898 /******************************************************************************
3899 * I/O Manager Types *
3900 ******************************************************************************/
3902 /* PCI_COMMON_CONFIG.Command */
3903 #define PCI_ENABLE_IO_SPACE 0x0001
3904 #define PCI_ENABLE_MEMORY_SPACE 0x0002
3905 #define PCI_ENABLE_BUS_MASTER 0x0004
3906 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
3907 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
3908 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
3909 #define PCI_ENABLE_PARITY 0x0040
3910 #define PCI_ENABLE_WAIT_CYCLE 0x0080
3911 #define PCI_ENABLE_SERR 0x0100
3912 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
3913 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
3915 /* PCI_COMMON_CONFIG.Status */
3916 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
3917 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
3918 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
3919 #define PCI_STATUS_UDF_SUPPORTED 0x0040
3920 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
3921 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
3922 #define PCI_STATUS_DEVSEL 0x0600
3923 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
3924 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
3925 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
3926 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
3927 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
3929 /* PCI_COMMON_CONFIG.HeaderType */
3930 #define PCI_MULTIFUNCTION 0x80
3931 #define PCI_DEVICE_TYPE 0x00
3932 #define PCI_BRIDGE_TYPE 0x01
3933 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
3935 #define PCI_CONFIGURATION_TYPE(PciData) \
3936 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
3938 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
3939 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
3941 /* PCI device classes */
3942 #define PCI_CLASS_PRE_20 0x00
3943 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
3944 #define PCI_CLASS_NETWORK_CTLR 0x02
3945 #define PCI_CLASS_DISPLAY_CTLR 0x03
3946 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
3947 #define PCI_CLASS_MEMORY_CTLR 0x05
3948 #define PCI_CLASS_BRIDGE_DEV 0x06
3949 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
3950 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
3951 #define PCI_CLASS_INPUT_DEV 0x09
3952 #define PCI_CLASS_DOCKING_STATION 0x0a
3953 #define PCI_CLASS_PROCESSOR 0x0b
3954 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
3955 #define PCI_CLASS_WIRELESS_CTLR 0x0d
3956 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
3957 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
3958 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
3959 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
3961 /* PCI device subclasses for class 0 */
3962 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
3963 #define PCI_SUBCLASS_PRE_20_VGA 0x01
3965 /* PCI device subclasses for class 1 (mass storage controllers)*/
3966 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
3967 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
3968 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
3969 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
3970 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
3971 #define PCI_SUBCLASS_MSC_OTHER 0x80
3973 /* PCI device subclasses for class 2 (network controllers)*/
3974 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
3975 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
3976 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
3977 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
3978 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
3979 #define PCI_SUBCLASS_NET_OTHER 0x80
3981 /* PCI device subclasses for class 3 (display controllers)*/
3982 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
3983 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
3984 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
3985 #define PCI_SUBCLASS_VID_OTHER 0x80
3987 /* PCI device subclasses for class 4 (multimedia device)*/
3988 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
3989 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
3990 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
3991 #define PCI_SUBCLASS_MM_OTHER 0x80
3993 /* PCI device subclasses for class 5 (memory controller)*/
3994 #define PCI_SUBCLASS_MEM_RAM 0x00
3995 #define PCI_SUBCLASS_MEM_FLASH 0x01
3996 #define PCI_SUBCLASS_MEM_OTHER 0x80
3998 /* PCI device subclasses for class 6 (bridge device)*/
3999 #define PCI_SUBCLASS_BR_HOST 0x00
4000 #define PCI_SUBCLASS_BR_ISA 0x01
4001 #define PCI_SUBCLASS_BR_EISA 0x02
4002 #define PCI_SUBCLASS_BR_MCA 0x03
4003 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
4004 #define PCI_SUBCLASS_BR_PCMCIA 0x05
4005 #define PCI_SUBCLASS_BR_NUBUS 0x06
4006 #define PCI_SUBCLASS_BR_CARDBUS 0x07
4007 #define PCI_SUBCLASS_BR_RACEWAY 0x08
4008 #define PCI_SUBCLASS_BR_OTHER 0x80
4010 /* PCI device subclasses for class C (serial bus controller)*/
4011 #define PCI_SUBCLASS_SB_IEEE1394 0x00
4012 #define PCI_SUBCLASS_SB_ACCESS 0x01
4013 #define PCI_SUBCLASS_SB_SSA 0x02
4014 #define PCI_SUBCLASS_SB_USB 0x03
4015 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
4016 #define PCI_SUBCLASS_SB_SMBUS 0x05
4018 #define PCI_MAX_DEVICES 32
4019 #define PCI_MAX_FUNCTION 8
4020 #define PCI_MAX_BRIDGE_NUMBER 0xFF
4021 #define PCI_INVALID_VENDORID 0xFFFF
4022 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
4024 #define PCI_ADDRESS_IO_SPACE 0x00000001
4025 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
4026 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
4027 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
4028 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
4029 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
4031 #define PCI_TYPE_32BIT 0
4032 #define PCI_TYPE_20BIT 2
4033 #define PCI_TYPE_64BIT 4
4035 #define POOL_COLD_ALLOCATION 256
4036 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
4037 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
4039 #define PCI_TYPE0_ADDRESSES 6
4040 #define PCI_TYPE1_ADDRESSES 2
4041 #define PCI_TYPE2_ADDRESSES 5
4043 #define IO_TYPE_ADAPTER 1
4044 #define IO_TYPE_CONTROLLER 2
4045 #define IO_TYPE_DEVICE 3
4046 #define IO_TYPE_DRIVER 4
4047 #define IO_TYPE_FILE 5
4048 #define IO_TYPE_IRP 6
4049 #define IO_TYPE_MASTER_ADAPTER 7
4050 #define IO_TYPE_OPEN_PACKET 8
4051 #define IO_TYPE_TIMER 9
4052 #define IO_TYPE_VPB 10
4053 #define IO_TYPE_ERROR_LOG 11
4054 #define IO_TYPE_ERROR_MESSAGE 12
4055 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
4057 #define IO_TYPE_CSQ_IRP_CONTEXT 1
4058 #define IO_TYPE_CSQ 2
4059 #define IO_TYPE_CSQ_EX 3
4061 /* IO_RESOURCE_DESCRIPTOR.Option */
4062 #define IO_RESOURCE_PREFERRED 0x01
4063 #define IO_RESOURCE_DEFAULT 0x02
4064 #define IO_RESOURCE_ALTERNATIVE 0x08
4066 /* DEVICE_OBJECT.Flags */
4067 #define DO_VERIFY_VOLUME 0x00000002
4068 #define DO_BUFFERED_IO 0x00000004
4069 #define DO_EXCLUSIVE 0x00000008
4070 #define DO_DIRECT_IO 0x00000010
4071 #define DO_MAP_IO_BUFFER 0x00000020
4072 #define DO_DEVICE_INITIALIZING 0x00000080
4073 #define DO_SHUTDOWN_REGISTERED 0x00000800
4074 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
4075 #define DO_POWER_PAGABLE 0x00002000
4076 #define DO_POWER_INRUSH 0x00004000
4078 /* DEVICE_OBJECT.Characteristics */
4079 #define FILE_REMOVABLE_MEDIA 0x00000001
4080 #define FILE_READ_ONLY_DEVICE 0x00000002
4081 #define FILE_FLOPPY_DISKETTE 0x00000004
4082 #define FILE_WRITE_ONCE_MEDIA 0x00000008
4083 #define FILE_REMOTE_DEVICE 0x00000010
4084 #define FILE_DEVICE_IS_MOUNTED 0x00000020
4085 #define FILE_VIRTUAL_VOLUME 0x00000040
4086 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
4087 #define FILE_DEVICE_SECURE_OPEN 0x00000100
4088 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
4089 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
4090 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
4092 /* DEVICE_OBJECT.AlignmentRequirement */
4093 #define FILE_BYTE_ALIGNMENT 0x00000000
4094 #define FILE_WORD_ALIGNMENT 0x00000001
4095 #define FILE_LONG_ALIGNMENT 0x00000003
4096 #define FILE_QUAD_ALIGNMENT 0x00000007
4097 #define FILE_OCTA_ALIGNMENT 0x0000000f
4098 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
4099 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
4100 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
4101 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
4102 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
4104 /* DEVICE_OBJECT.DeviceType */
4105 #define DEVICE_TYPE ULONG
4107 #define FILE_DEVICE_BEEP 0x00000001
4108 #define FILE_DEVICE_CD_ROM 0x00000002
4109 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
4110 #define FILE_DEVICE_CONTROLLER 0x00000004
4111 #define FILE_DEVICE_DATALINK 0x00000005
4112 #define FILE_DEVICE_DFS 0x00000006
4113 #define FILE_DEVICE_DISK 0x00000007
4114 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
4115 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
4116 #define FILE_DEVICE_INPORT_PORT 0x0000000a
4117 #define FILE_DEVICE_KEYBOARD 0x0000000b
4118 #define FILE_DEVICE_MAILSLOT 0x0000000c
4119 #define FILE_DEVICE_MIDI_IN 0x0000000d
4120 #define FILE_DEVICE_MIDI_OUT 0x0000000e
4121 #define FILE_DEVICE_MOUSE 0x0000000f
4122 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
4123 #define FILE_DEVICE_NAMED_PIPE 0x00000011
4124 #define FILE_DEVICE_NETWORK 0x00000012
4125 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
4126 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
4127 #define FILE_DEVICE_NULL 0x00000015
4128 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
4129 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
4130 #define FILE_DEVICE_PRINTER 0x00000018
4131 #define FILE_DEVICE_SCANNER 0x00000019
4132 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
4133 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
4134 #define FILE_DEVICE_SCREEN 0x0000001c
4135 #define FILE_DEVICE_SOUND 0x0000001d
4136 #define FILE_DEVICE_STREAMS 0x0000001e
4137 #define FILE_DEVICE_TAPE 0x0000001f
4138 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
4139 #define FILE_DEVICE_TRANSPORT 0x00000021
4140 #define FILE_DEVICE_UNKNOWN 0x00000022
4141 #define FILE_DEVICE_VIDEO 0x00000023
4142 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
4143 #define FILE_DEVICE_WAVE_IN 0x00000025
4144 #define FILE_DEVICE_WAVE_OUT 0x00000026
4145 #define FILE_DEVICE_8042_PORT 0x00000027
4146 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
4147 #define FILE_DEVICE_BATTERY 0x00000029
4148 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
4149 #define FILE_DEVICE_MODEM 0x0000002b
4150 #define FILE_DEVICE_VDM 0x0000002c
4151 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
4152 #define FILE_DEVICE_SMB 0x0000002e
4153 #define FILE_DEVICE_KS 0x0000002f
4154 #define FILE_DEVICE_CHANGER 0x00000030
4155 #define FILE_DEVICE_SMARTCARD 0x00000031
4156 #define FILE_DEVICE_ACPI 0x00000032
4157 #define FILE_DEVICE_DVD 0x00000033
4158 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
4159 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
4160 #define FILE_DEVICE_DFS_VOLUME 0x00000036
4161 #define FILE_DEVICE_SERENUM 0x00000037
4162 #define FILE_DEVICE_TERMSRV 0x00000038
4163 #define FILE_DEVICE_KSEC 0x00000039
4164 #define FILE_DEVICE_FIPS 0x0000003a
4165 #define FILE_DEVICE_INFINIBAND 0x0000003b
4166 #define FILE_DEVICE_VMBUS 0x0000003e
4167 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003f
4168 #define FILE_DEVICE_WPD 0x00000040
4169 #define FILE_DEVICE_BLUETOOTH 0x00000041
4170 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
4171 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
4172 #define FILE_DEVICE_BIOMETRIC 0x00000044
4173 #define FILE_DEVICE_PMI 0x00000045
4175 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
4177 typedef struct _OBJECT_HANDLE_INFORMATION
{
4178 ULONG HandleAttributes
;
4179 ACCESS_MASK GrantedAccess
;
4180 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
4182 typedef struct _CLIENT_ID
{
4183 HANDLE UniqueProcess
;
4184 HANDLE UniqueThread
;
4185 } CLIENT_ID
, *PCLIENT_ID
;
4188 (DDKAPI
*PKSTART_ROUTINE
)(
4189 IN PVOID StartContext
);
4191 typedef struct _VPB
{
4195 USHORT VolumeLabelLength
;
4196 struct _DEVICE_OBJECT
*DeviceObject
;
4197 struct _DEVICE_OBJECT
*RealDevice
;
4199 ULONG ReferenceCount
;
4200 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
4203 typedef enum _IO_ALLOCATION_ACTION
{
4206 DeallocateObjectKeepRegisters
4207 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
4209 typedef IO_ALLOCATION_ACTION
4210 (DDKAPI
*PDRIVER_CONTROL
)(
4211 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4212 IN
struct _IRP
*Irp
,
4213 IN PVOID MapRegisterBase
,
4216 typedef struct _WAIT_CONTEXT_BLOCK
{
4217 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
4218 PDRIVER_CONTROL DeviceRoutine
;
4219 PVOID DeviceContext
;
4220 ULONG NumberOfMapRegisters
;
4223 PKDPC BufferChainingDpc
;
4224 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
4226 typedef struct _DEVICE_OBJECT
{
4229 LONG ReferenceCount
;
4230 struct _DRIVER_OBJECT
*DriverObject
;
4231 struct _DEVICE_OBJECT
*NextDevice
;
4232 struct _DEVICE_OBJECT
*AttachedDevice
;
4233 struct _IRP
*CurrentIrp
;
4236 ULONG Characteristics
;
4238 PVOID DeviceExtension
;
4239 DEVICE_TYPE DeviceType
;
4242 LIST_ENTRY ListEntry
;
4243 WAIT_CONTEXT_BLOCK Wcb
;
4245 ULONG AlignmentRequirement
;
4246 KDEVICE_QUEUE DeviceQueue
;
4248 ULONG ActiveThreadCount
;
4249 PSECURITY_DESCRIPTOR SecurityDescriptor
;
4253 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
4255 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
4257 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
4259 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
4261 BOOLEAN Reserved
[3];
4262 volatile LONG IoCount
;
4264 } IO_REMOVE_LOCK_COMMON_BLOCK
;
4266 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
4269 LONGLONG MaxLockedTicks
;
4271 LIST_ENTRY LockList
;
4273 volatile LONG LowMemoryCount
;
4276 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
4277 } IO_REMOVE_LOCK_DBG_BLOCK
;
4279 typedef struct _IO_REMOVE_LOCK
{
4280 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
4282 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
4284 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
4286 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
4289 (DDKAPI IO_WORKITEM_ROUTINE
)(
4290 IN PDEVICE_OBJECT DeviceObject
,
4292 typedef IO_WORKITEM_ROUTINE
*PIO_WORKITEM_ROUTINE
;
4294 typedef struct _SHARE_ACCESS
{
4302 } SHARE_ACCESS
, *PSHARE_ACCESS
;
4304 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
4305 inheritance, even from a struct renders the type non-POD. So we use
4307 #define PCI_COMMON_HEADER_MEMBERS \
4316 UCHAR CacheLineSize; \
4317 UCHAR LatencyTimer; \
4321 struct _PCI_HEADER_TYPE_0 { \
4322 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
4324 USHORT SubVendorID; \
4325 USHORT SubSystemID; \
4326 ULONG ROMBaseAddress; \
4327 UCHAR CapabilitiesPtr; \
4328 UCHAR Reserved1[3]; \
4330 UCHAR InterruptLine; \
4331 UCHAR InterruptPin; \
4332 UCHAR MinimumGrant; \
4333 UCHAR MaximumLatency; \
4335 struct _PCI_HEADER_TYPE_1 { \
4336 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
4338 UCHAR SecondaryBus; \
4339 UCHAR SubordinateBus; \
4340 UCHAR SecondaryLatency; \
4343 USHORT SecondaryStatus; \
4344 USHORT MemoryBase; \
4345 USHORT MemoryLimit; \
4346 USHORT PrefetchBase; \
4347 USHORT PrefetchLimit; \
4348 ULONG PrefetchBaseUpper32; \
4349 ULONG PrefetchLimitUpper32; \
4350 USHORT IOBaseUpper16; \
4351 USHORT IOLimitUpper16; \
4352 UCHAR CapabilitiesPtr; \
4353 UCHAR Reserved1[3]; \
4354 ULONG ROMBaseAddress; \
4355 UCHAR InterruptLine; \
4356 UCHAR InterruptPin; \
4357 USHORT BridgeControl; \
4359 struct _PCI_HEADER_TYPE_2 { \
4360 ULONG SocketRegistersBaseAddress; \
4361 UCHAR CapabilitiesPtr; \
4363 USHORT SecondaryStatus; \
4365 UCHAR SecondaryBus; \
4366 UCHAR SubordinateBus; \
4367 UCHAR SecondaryLatency; \
4371 } Range[PCI_TYPE2_ADDRESSES-1]; \
4372 UCHAR InterruptLine; \
4373 UCHAR InterruptPin; \
4374 USHORT BridgeControl; \
4378 typedef struct _PCI_COMMON_HEADER
{
4379 PCI_COMMON_HEADER_MEMBERS
4380 } PCI_COMMON_HEADER
, *PPCI_COMMON_HEADER
;
4383 typedef struct _PCI_COMMON_CONFIG
{
4384 PCI_COMMON_HEADER_MEMBERS
4385 UCHAR DeviceSpecific
[192];
4386 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
4388 typedef struct _PCI_COMMON_CONFIG
{
4389 PCI_COMMON_HEADER DUMMYSTRUCTNAME
;
4390 UCHAR DeviceSpecific
[192];
4391 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
4394 typedef enum _CREATE_FILE_TYPE
{
4396 CreateFileTypeNamedPipe
,
4397 CreateFileTypeMailslot
4400 #define IO_FORCE_ACCESS_CHECK 0x001
4401 #define IO_NO_PARAMETER_CHECKING 0x100
4403 #define IO_REPARSE 0x0
4404 #define IO_REMOUNT 0x1
4406 typedef union _POWER_STATE
{
4407 SYSTEM_POWER_STATE SystemState
;
4408 DEVICE_POWER_STATE DeviceState
;
4409 } POWER_STATE
, *PPOWER_STATE
;
4411 typedef enum _POWER_STATE_TYPE
{
4412 SystemPowerState
= 0,
4414 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
4416 typedef struct _IO_STATUS_BLOCK
{
4417 _ANONYMOUS_UNION
union {
4421 ULONG_PTR Information
;
4422 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
4425 (DDKAPI
*PREQUEST_POWER_COMPLETE
)(
4426 IN PDEVICE_OBJECT DeviceObject
,
4427 IN UCHAR MinorFunction
,
4428 IN POWER_STATE PowerState
,
4430 IN PIO_STATUS_BLOCK IoStatus
);
4432 typedef struct _PCI_SLOT_NUMBER
{
4435 ULONG DeviceNumber
: 5;
4436 ULONG FunctionNumber
: 3;
4437 ULONG Reserved
: 24;
4441 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
4444 (DDKAPI
*PIO_APC_ROUTINE
)(
4445 IN PVOID ApcContext
,
4446 IN PIO_STATUS_BLOCK IoStatusBlock
,
4450 (DDKAPI
*WMI_NOTIFICATION_CALLBACK
)(
4454 #define EVENT_INCREMENT 1
4455 #define IO_NO_INCREMENT 0
4456 #define IO_CD_ROM_INCREMENT 1
4457 #define IO_DISK_INCREMENT 1
4458 #define IO_KEYBOARD_INCREMENT 6
4459 #define IO_MAILSLOT_INCREMENT 2
4460 #define IO_MOUSE_INCREMENT 6
4461 #define IO_NAMED_PIPE_INCREMENT 2
4462 #define IO_NETWORK_INCREMENT 2
4463 #define IO_PARALLEL_INCREMENT 1
4464 #define IO_SERIAL_INCREMENT 2
4465 #define IO_SOUND_INCREMENT 8
4466 #define IO_VIDEO_INCREMENT 1
4467 #define SEMAPHORE_INCREMENT 1
4469 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
4471 typedef struct _BOOTDISK_INFORMATION
{
4472 LONGLONG BootPartitionOffset
;
4473 LONGLONG SystemPartitionOffset
;
4474 ULONG BootDeviceSignature
;
4475 ULONG SystemDeviceSignature
;
4476 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
4478 typedef struct _BOOTDISK_INFORMATION_EX
{
4479 LONGLONG BootPartitionOffset
;
4480 LONGLONG SystemPartitionOffset
;
4481 ULONG BootDeviceSignature
;
4482 ULONG SystemDeviceSignature
;
4483 GUID BootDeviceGuid
;
4484 GUID SystemDeviceGuid
;
4485 BOOLEAN BootDeviceIsGpt
;
4486 BOOLEAN SystemDeviceIsGpt
;
4487 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
4489 typedef struct _EISA_MEMORY_TYPE
{
4490 UCHAR ReadWrite
: 1;
4492 UCHAR Reserved0
: 1;
4495 UCHAR Reserved1
: 1;
4496 UCHAR MoreEntries
: 1;
4497 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
4499 #include <pshpack1.h>
4500 typedef struct _EISA_MEMORY_CONFIGURATION
{
4501 EISA_MEMORY_TYPE ConfigurationByte
;
4503 USHORT AddressLowWord
;
4504 UCHAR AddressHighByte
;
4506 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
4507 #include <poppack.h>
4509 typedef struct _EISA_IRQ_DESCRIPTOR
{
4510 UCHAR Interrupt
: 4;
4512 UCHAR LevelTriggered
: 1;
4514 UCHAR MoreEntries
: 1;
4515 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
4517 typedef struct _EISA_IRQ_CONFIGURATION
{
4518 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
4520 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
4522 typedef struct _DMA_CONFIGURATION_BYTE0
{
4526 UCHAR MoreEntries
: 1;
4527 } DMA_CONFIGURATION_BYTE0
;
4529 typedef struct _DMA_CONFIGURATION_BYTE1
{
4530 UCHAR Reserved0
: 2;
4531 UCHAR TransferSize
: 2;
4533 UCHAR Reserved1
: 2;
4534 } DMA_CONFIGURATION_BYTE1
;
4536 typedef struct _EISA_DMA_CONFIGURATION
{
4537 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
4538 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
4539 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
4541 #include <pshpack1.h>
4542 typedef struct _EISA_PORT_DESCRIPTOR
{
4543 UCHAR NumberPorts
: 5;
4546 UCHAR MoreEntries
: 1;
4547 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
4549 typedef struct _EISA_PORT_CONFIGURATION
{
4550 EISA_PORT_DESCRIPTOR Configuration
;
4552 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
4553 #include <poppack.h>
4555 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
4559 UCHAR MinorRevision
;
4560 UCHAR MajorRevision
;
4561 UCHAR Selections
[26];
4562 UCHAR FunctionFlags
;
4563 UCHAR TypeString
[80];
4564 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
4565 EISA_IRQ_CONFIGURATION EisaIrq
[7];
4566 EISA_DMA_CONFIGURATION EisaDma
[4];
4567 EISA_PORT_CONFIGURATION EisaPort
[20];
4568 UCHAR InitializationData
[60];
4569 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
4571 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
4573 #define EISA_FUNCTION_ENABLED 0x80
4574 #define EISA_FREE_FORM_DATA 0x40
4575 #define EISA_HAS_PORT_INIT_ENTRY 0x20
4576 #define EISA_HAS_PORT_RANGE 0x10
4577 #define EISA_HAS_DMA_ENTRY 0x08
4578 #define EISA_HAS_IRQ_ENTRY 0x04
4579 #define EISA_HAS_MEMORY_ENTRY 0x02
4580 #define EISA_HAS_TYPE_ENTRY 0x01
4581 #define EISA_HAS_INFORMATION \
4582 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
4583 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
4585 typedef struct _CM_EISA_SLOT_INFORMATION
{
4588 UCHAR MajorRevision
;
4589 UCHAR MinorRevision
;
4591 UCHAR NumberFunctions
;
4592 UCHAR FunctionInformation
;
4594 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
4596 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
4598 #define EISA_INVALID_SLOT 0x80
4599 #define EISA_INVALID_FUNCTION 0x81
4600 #define EISA_INVALID_CONFIGURATION 0x82
4601 #define EISA_EMPTY_SLOT 0x83
4602 #define EISA_INVALID_BIOS_CALL 0x86
4605 ** Plug and Play structures
4609 (DDKAPI
*PINTERFACE_REFERENCE
)(
4613 (DDKAPI
*PINTERFACE_DEREFERENCE
)(
4617 (DDKAPI
*PTRANSLATE_BUS_ADDRESS
)(
4619 IN PHYSICAL_ADDRESS BusAddress
,
4621 IN OUT PULONG AddressSpace
,
4622 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
4624 typedef struct _DMA_ADAPTER
*
4625 (DDKAPI
*PGET_DMA_ADAPTER
)(
4627 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
4628 OUT PULONG NumberOfMapRegisters
);
4631 (DDKAPI
*PGET_SET_DEVICE_DATA
)(
4638 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
4639 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
4640 #define PCI_USE_REVISION 0x00000002
4641 #define PCI_USE_VENDEV_IDS 0x00000004
4642 #define PCI_USE_CLASS_SUBCLASS 0x00000008
4643 #define PCI_USE_PROGIF 0x00000010
4644 #define PCI_USE_LOCAL_BUS 0x00000020
4645 #define PCI_USE_LOCAL_DEVICE 0x00000040
4647 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS
{
4658 } PCI_DEVICE_PRESENCE_PARAMETERS
, *PPCI_DEVICE_PRESENCE_PARAMETERS
;
4661 (DDKAPI
*PPCI_IS_DEVICE_PRESENT
)(
4664 IN UCHAR RevisionID
,
4665 IN USHORT SubVendorID
,
4666 IN USHORT SubSystemID
,
4670 (DDKAPI
*PPCI_IS_DEVICE_PRESENT_EX
)(
4672 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
);
4674 typedef struct _BUS_INTERFACE_STANDARD
{
4678 PINTERFACE_REFERENCE InterfaceReference
;
4679 PINTERFACE_DEREFERENCE InterfaceDereference
;
4680 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
4681 PGET_DMA_ADAPTER GetDmaAdapter
;
4682 PGET_SET_DEVICE_DATA SetBusData
;
4683 PGET_SET_DEVICE_DATA GetBusData
;
4684 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
4686 typedef struct _PCI_DEVICE_PRESENT_INTERFACE
{
4690 PINTERFACE_REFERENCE InterfaceReference
;
4691 PINTERFACE_DEREFERENCE InterfaceDereference
;
4692 PPCI_IS_DEVICE_PRESENT IsDevicePresent
;
4693 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx
;
4694 } PCI_DEVICE_PRESENT_INTERFACE
, *PPCI_DEVICE_PRESENT_INTERFACE
;
4696 typedef struct _DEVICE_CAPABILITIES
{
4701 ULONG LockSupported
: 1;
4702 ULONG EjectSupported
: 1;
4703 ULONG Removable
: 1;
4704 ULONG DockDevice
: 1;
4706 ULONG SilentInstall
: 1;
4707 ULONG RawDeviceOK
: 1;
4708 ULONG SurpriseRemovalOK
: 1;
4709 ULONG WakeFromD0
: 1;
4710 ULONG WakeFromD1
: 1;
4711 ULONG WakeFromD2
: 1;
4712 ULONG WakeFromD3
: 1;
4713 ULONG HardwareDisabled
: 1;
4714 ULONG NonDynamic
: 1;
4715 ULONG WarmEjectSupported
: 1;
4716 ULONG NoDisplayInUI
: 1;
4717 ULONG Reserved
: 14;
4720 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
4721 SYSTEM_POWER_STATE SystemWake
;
4722 DEVICE_POWER_STATE DeviceWake
;
4726 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
4728 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
4732 GUID InterfaceClassGuid
;
4733 PUNICODE_STRING SymbolicLinkName
;
4734 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
4736 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
4740 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
4744 typedef struct _INTERFACE
{
4748 PINTERFACE_REFERENCE InterfaceReference
;
4749 PINTERFACE_DEREFERENCE InterfaceDereference
;
4750 } INTERFACE
, *PINTERFACE
;
4752 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
4756 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
4758 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
4760 /* PNP_DEVICE_STATE */
4762 #define PNP_DEVICE_DISABLED 0x00000001
4763 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
4764 #define PNP_DEVICE_FAILED 0x00000004
4765 #define PNP_DEVICE_REMOVED 0x00000008
4766 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
4767 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
4769 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
4773 struct _FILE_OBJECT
*FileObject
;
4774 LONG NameBufferOffset
;
4775 UCHAR CustomDataBuffer
[1];
4776 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
4778 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
4782 struct _FILE_OBJECT
*FileObject
;
4783 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
4785 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
4786 DeviceUsageTypeUndefined
,
4787 DeviceUsageTypePaging
,
4788 DeviceUsageTypeHibernation
,
4789 DeviceUsageTypeDumpFile
4790 } DEVICE_USAGE_NOTIFICATION_TYPE
;
4792 typedef struct _POWER_SEQUENCE
{
4796 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
4799 DevicePropertyDeviceDescription
= 0x0,
4800 DevicePropertyHardwareID
= 0x1,
4801 DevicePropertyCompatibleIDs
= 0x2,
4802 DevicePropertyBootConfiguration
= 0x3,
4803 DevicePropertyBootConfigurationTranslated
= 0x4,
4804 DevicePropertyClassName
= 0x5,
4805 DevicePropertyClassGuid
= 0x6,
4806 DevicePropertyDriverKeyName
= 0x7,
4807 DevicePropertyManufacturer
= 0x8,
4808 DevicePropertyFriendlyName
= 0x9,
4809 DevicePropertyLocationInformation
= 0xa,
4810 DevicePropertyPhysicalDeviceObjectName
= 0xb,
4811 DevicePropertyBusTypeGuid
= 0xc,
4812 DevicePropertyLegacyBusType
= 0xd,
4813 DevicePropertyBusNumber
= 0xe,
4814 DevicePropertyEnumeratorName
= 0xf,
4815 DevicePropertyAddress
= 0x10,
4816 DevicePropertyUINumber
= 0x11,
4817 DevicePropertyInstallState
= 0x12,
4818 DevicePropertyRemovalPolicy
= 0x13,
4819 DevicePropertyResourceRequirements
= 0x14,
4820 DevicePropertyAllocatedResources
= 0x15,
4821 DevicePropertyContainerID
= 0x16
4822 } DEVICE_REGISTRY_PROPERTY
;
4824 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
4825 EventCategoryReserved
,
4826 EventCategoryHardwareProfileChange
,
4827 EventCategoryDeviceInterfaceChange
,
4828 EventCategoryTargetDeviceChange
4829 } IO_NOTIFICATION_EVENT_CATEGORY
;
4831 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
4834 (DDKAPI
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
4835 IN PVOID NotificationStructure
,
4839 (DDKAPI
*PDEVICE_CHANGE_COMPLETE_CALLBACK
)(
4842 typedef enum _FILE_INFORMATION_CLASS
{
4843 FileDirectoryInformation
= 1,
4844 FileFullDirectoryInformation
,
4845 FileBothDirectoryInformation
,
4846 FileBasicInformation
,
4847 FileStandardInformation
,
4848 FileInternalInformation
,
4850 FileAccessInformation
,
4851 FileNameInformation
,
4852 FileRenameInformation
,
4853 FileLinkInformation
,
4854 FileNamesInformation
,
4855 FileDispositionInformation
,
4856 FilePositionInformation
,
4857 FileFullEaInformation
,
4858 FileModeInformation
,
4859 FileAlignmentInformation
,
4861 FileAllocationInformation
,
4862 FileEndOfFileInformation
,
4863 FileAlternateNameInformation
,
4864 FileStreamInformation
,
4865 FilePipeInformation
,
4866 FilePipeLocalInformation
,
4867 FilePipeRemoteInformation
,
4868 FileMailslotQueryInformation
,
4869 FileMailslotSetInformation
,
4870 FileCompressionInformation
,
4871 FileObjectIdInformation
,
4872 FileCompletionInformation
,
4873 FileMoveClusterInformation
,
4874 FileQuotaInformation
,
4875 FileReparsePointInformation
,
4876 FileNetworkOpenInformation
,
4877 FileAttributeTagInformation
,
4878 FileTrackingInformation
,
4879 FileIdBothDirectoryInformation
,
4880 FileIdFullDirectoryInformation
,
4881 FileValidDataLengthInformation
,
4882 FileShortNameInformation
,
4883 FileIoCompletionNotificationInformation
,
4884 FileIoStatusBlockRangeInformation
,
4885 FileIoPriorityHintInformation
,
4886 FileSfioReserveInformation
,
4887 FileSfioVolumeInformation
,
4888 FileHardLinkInformation
,
4889 FileProcessIdsUsingFileInformation
,
4890 FileNormalizedNameInformation
,
4891 FileNetworkPhysicalNameInformation
,
4892 FileIdGlobalTxDirectoryInformation
,
4893 FileIsRemoteDeviceInformation
,
4894 FileAttributeCacheInformation
,
4895 FileNumaNodeInformation
,
4896 FileStandardLinkInformation
,
4897 FileRemoteProtocolInformation
,
4898 FileMaximumInformation
4899 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
4901 typedef struct _FILE_POSITION_INFORMATION
{
4902 LARGE_INTEGER CurrentByteOffset
;
4903 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
4905 #include <pshpack8.h>
4906 typedef struct _FILE_BASIC_INFORMATION
{
4907 LARGE_INTEGER CreationTime
;
4908 LARGE_INTEGER LastAccessTime
;
4909 LARGE_INTEGER LastWriteTime
;
4910 LARGE_INTEGER ChangeTime
;
4911 ULONG FileAttributes
;
4912 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
4913 #include <poppack.h>
4915 typedef struct _FILE_STANDARD_INFORMATION
{
4916 LARGE_INTEGER AllocationSize
;
4917 LARGE_INTEGER EndOfFile
;
4918 ULONG NumberOfLinks
;
4919 BOOLEAN DeletePending
;
4921 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
4923 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
4924 LARGE_INTEGER CreationTime
;
4925 LARGE_INTEGER LastAccessTime
;
4926 LARGE_INTEGER LastWriteTime
;
4927 LARGE_INTEGER ChangeTime
;
4928 LARGE_INTEGER AllocationSize
;
4929 LARGE_INTEGER EndOfFile
;
4930 ULONG FileAttributes
;
4931 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
4933 typedef enum _FSINFOCLASS
{
4934 FileFsVolumeInformation
= 1,
4935 FileFsLabelInformation
,
4936 FileFsSizeInformation
,
4937 FileFsDeviceInformation
,
4938 FileFsAttributeInformation
,
4939 FileFsControlInformation
,
4940 FileFsFullSizeInformation
,
4941 FileFsObjectIdInformation
,
4942 FileFsDriverPathInformation
,
4943 FileFsVolumeFlagsInformation
,
4944 FileFsMaximumInformation
4945 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
4947 typedef struct _FILE_FS_DEVICE_INFORMATION
{
4948 DEVICE_TYPE DeviceType
;
4949 ULONG Characteristics
;
4950 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
4952 typedef struct _FILE_FULL_EA_INFORMATION
{
4953 ULONG NextEntryOffset
;
4956 USHORT EaValueLength
;
4958 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
4960 #define FM_LOCK_BIT (0x1)
4961 #define FM_LOCK_BIT_V (0x0)
4962 #define FM_LOCK_WAITER_WOKEN (0x2)
4963 #define FM_LOCK_WAITER_INC (0x4)
4965 typedef struct _FAST_MUTEX
{
4966 volatile LONG Count
;
4971 } FAST_MUTEX
, *PFAST_MUTEX
;
4973 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
4975 typedef struct _OWNER_ENTRY
{
4976 ERESOURCE_THREAD OwnerThread
;
4977 _ANONYMOUS_UNION
union {
4981 } OWNER_ENTRY
, *POWNER_ENTRY
;
4983 typedef struct _ERESOURCE
4985 LIST_ENTRY SystemResourcesList
;
4986 POWNER_ENTRY OwnerTable
;
4989 volatile PKSEMAPHORE SharedWaiters
;
4990 volatile PKEVENT ExclusiveWaiters
;
4991 OWNER_ENTRY OwnerEntry
;
4992 ULONG ActiveEntries
;
4993 ULONG ContentionCount
;
4994 ULONG NumberOfSharedWaiters
;
4995 ULONG NumberOfExclusiveWaiters
;
4996 __GNU_EXTENSION
union
4999 ULONG_PTR CreatorBackTraceIndex
;
5001 KSPIN_LOCK SpinLock
;
5002 } ERESOURCE
, *PERESOURCE
;
5004 /* ERESOURCE.Flag */
5005 #define ResourceNeverExclusive 0x0010
5006 #define ResourceReleaseByOtherThread 0x0020
5007 #define ResourceOwnedExclusive 0x0080
5009 #define RESOURCE_HASH_TABLE_SIZE 64
5012 (DDKAPI
*PFAST_IO_CHECK_IF_POSSIBLE
)(
5013 IN
struct _FILE_OBJECT
*FileObject
,
5014 IN PLARGE_INTEGER FileOffset
,
5018 IN BOOLEAN CheckForReadOperation
,
5019 OUT PIO_STATUS_BLOCK IoStatus
,
5020 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5023 (DDKAPI
*PFAST_IO_READ
)(
5024 IN
struct _FILE_OBJECT
*FileObject
,
5025 IN PLARGE_INTEGER FileOffset
,
5030 OUT PIO_STATUS_BLOCK IoStatus
,
5031 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5034 (DDKAPI
*PFAST_IO_WRITE
)(
5035 IN
struct _FILE_OBJECT
*FileObject
,
5036 IN PLARGE_INTEGER FileOffset
,
5041 OUT PIO_STATUS_BLOCK IoStatus
,
5042 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5045 (DDKAPI
*PFAST_IO_QUERY_BASIC_INFO
)(
5046 IN
struct _FILE_OBJECT
*FileObject
,
5048 OUT PFILE_BASIC_INFORMATION Buffer
,
5049 OUT PIO_STATUS_BLOCK IoStatus
,
5050 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5053 (DDKAPI
*PFAST_IO_QUERY_STANDARD_INFO
)(
5054 IN
struct _FILE_OBJECT
*FileObject
,
5056 OUT PFILE_STANDARD_INFORMATION Buffer
,
5057 OUT PIO_STATUS_BLOCK IoStatus
,
5058 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5061 (DDKAPI
*PFAST_IO_LOCK
)(
5062 IN
struct _FILE_OBJECT
*FileObject
,
5063 IN PLARGE_INTEGER FileOffset
,
5064 IN PLARGE_INTEGER Length
,
5065 PEPROCESS ProcessId
,
5067 BOOLEAN FailImmediately
,
5068 BOOLEAN ExclusiveLock
,
5069 OUT PIO_STATUS_BLOCK IoStatus
,
5070 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5073 (DDKAPI
*PFAST_IO_UNLOCK_SINGLE
)(
5074 IN
struct _FILE_OBJECT
*FileObject
,
5075 IN PLARGE_INTEGER FileOffset
,
5076 IN PLARGE_INTEGER Length
,
5077 PEPROCESS ProcessId
,
5079 OUT PIO_STATUS_BLOCK IoStatus
,
5080 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5083 (DDKAPI
*PFAST_IO_UNLOCK_ALL
)(
5084 IN
struct _FILE_OBJECT
*FileObject
,
5085 PEPROCESS ProcessId
,
5086 OUT PIO_STATUS_BLOCK IoStatus
,
5087 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5090 (DDKAPI
*PFAST_IO_UNLOCK_ALL_BY_KEY
)(
5091 IN
struct _FILE_OBJECT
*FileObject
,
5094 OUT PIO_STATUS_BLOCK IoStatus
,
5095 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5098 (DDKAPI
*PFAST_IO_DEVICE_CONTROL
)(
5099 IN
struct _FILE_OBJECT
*FileObject
,
5101 IN PVOID InputBuffer OPTIONAL
,
5102 IN ULONG InputBufferLength
,
5103 OUT PVOID OutputBuffer OPTIONAL
,
5104 IN ULONG OutputBufferLength
,
5105 IN ULONG IoControlCode
,
5106 OUT PIO_STATUS_BLOCK IoStatus
,
5107 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5110 (DDKAPI
*PFAST_IO_ACQUIRE_FILE
)(
5111 IN
struct _FILE_OBJECT
*FileObject
);
5114 (DDKAPI
*PFAST_IO_RELEASE_FILE
)(
5115 IN
struct _FILE_OBJECT
*FileObject
);
5118 (DDKAPI
*PFAST_IO_DETACH_DEVICE
)(
5119 IN
struct _DEVICE_OBJECT
*SourceDevice
,
5120 IN
struct _DEVICE_OBJECT
*TargetDevice
);
5123 (DDKAPI
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
)(
5124 IN
struct _FILE_OBJECT
*FileObject
,
5126 OUT
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
5127 OUT
struct _IO_STATUS_BLOCK
*IoStatus
,
5128 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5131 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
5132 IN
struct _FILE_OBJECT
*FileObject
,
5133 IN PLARGE_INTEGER EndingOffset
,
5134 OUT
struct _ERESOURCE
**ResourceToRelease
,
5135 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5138 (DDKAPI
*PFAST_IO_MDL_READ
)(
5139 IN
struct _FILE_OBJECT
*FileObject
,
5140 IN PLARGE_INTEGER FileOffset
,
5144 OUT PIO_STATUS_BLOCK IoStatus
,
5145 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5148 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE
)(
5149 IN
struct _FILE_OBJECT
*FileObject
,
5151 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5154 (DDKAPI
*PFAST_IO_PREPARE_MDL_WRITE
)(
5155 IN
struct _FILE_OBJECT
*FileObject
,
5156 IN PLARGE_INTEGER FileOffset
,
5160 OUT PIO_STATUS_BLOCK IoStatus
,
5161 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5164 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE
)(
5165 IN
struct _FILE_OBJECT
*FileObject
,
5166 IN PLARGE_INTEGER FileOffset
,
5168 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5171 (DDKAPI
*PFAST_IO_READ_COMPRESSED
)(
5172 IN
struct _FILE_OBJECT
*FileObject
,
5173 IN PLARGE_INTEGER FileOffset
,
5178 OUT PIO_STATUS_BLOCK IoStatus
,
5179 OUT
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
5180 IN ULONG CompressedDataInfoLength
,
5181 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5184 (DDKAPI
*PFAST_IO_WRITE_COMPRESSED
)(
5185 IN
struct _FILE_OBJECT
*FileObject
,
5186 IN PLARGE_INTEGER FileOffset
,
5191 OUT PIO_STATUS_BLOCK IoStatus
,
5192 IN
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
5193 IN ULONG CompressedDataInfoLength
,
5194 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5197 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
5198 IN
struct _FILE_OBJECT
*FileObject
,
5200 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5203 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
5204 IN
struct _FILE_OBJECT
*FileObject
,
5205 IN PLARGE_INTEGER FileOffset
,
5207 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5210 (DDKAPI
*PFAST_IO_QUERY_OPEN
)(
5211 IN
struct _IRP
*Irp
,
5212 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
5213 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5216 (DDKAPI
*PFAST_IO_RELEASE_FOR_MOD_WRITE
)(
5217 IN
struct _FILE_OBJECT
*FileObject
,
5218 IN
struct _ERESOURCE
*ResourceToRelease
,
5219 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5222 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
)(
5223 IN
struct _FILE_OBJECT
*FileObject
,
5224 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5227 (DDKAPI
*PFAST_IO_RELEASE_FOR_CCFLUSH
) (
5228 IN
struct _FILE_OBJECT
*FileObject
,
5229 IN
struct _DEVICE_OBJECT
*DeviceObject
);
5231 typedef struct _FAST_IO_DISPATCH
{
5232 ULONG SizeOfFastIoDispatch
;
5233 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
5234 PFAST_IO_READ FastIoRead
;
5235 PFAST_IO_WRITE FastIoWrite
;
5236 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
5237 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
5238 PFAST_IO_LOCK FastIoLock
;
5239 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
5240 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
5241 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
5242 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
5243 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
5244 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
5245 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
5246 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
5247 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
5248 PFAST_IO_MDL_READ MdlRead
;
5249 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
5250 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
5251 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
5252 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
5253 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
5254 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
5255 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
5256 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
5257 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
5258 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
5259 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
5260 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
5262 typedef struct _SECTION_OBJECT_POINTERS
{
5263 PVOID DataSectionObject
;
5264 PVOID SharedCacheMap
;
5265 PVOID ImageSectionObject
;
5266 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
5268 typedef struct _IO_COMPLETION_CONTEXT
{
5271 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
5273 /* FILE_OBJECT.Flags */
5274 #define FO_FILE_OPEN 0x00000001
5275 #define FO_SYNCHRONOUS_IO 0x00000002
5276 #define FO_ALERTABLE_IO 0x00000004
5277 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
5278 #define FO_WRITE_THROUGH 0x00000010
5279 #define FO_SEQUENTIAL_ONLY 0x00000020
5280 #define FO_CACHE_SUPPORTED 0x00000040
5281 #define FO_NAMED_PIPE 0x00000080
5282 #define FO_STREAM_FILE 0x00000100
5283 #define FO_MAILSLOT 0x00000200
5284 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
5285 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
5286 #define FO_DIRECT_DEVICE_OPEN 0x00000800
5287 #define FO_FILE_MODIFIED 0x00001000
5288 #define FO_FILE_SIZE_CHANGED 0x00002000
5289 #define FO_CLEANUP_COMPLETE 0x00004000
5290 #define FO_TEMPORARY_FILE 0x00008000
5291 #define FO_DELETE_ON_CLOSE 0x00010000
5292 #define FO_OPENED_CASE_SENSITIVE 0x00020000
5293 #define FO_HANDLE_CREATED 0x00040000
5294 #define FO_FILE_FAST_IO_READ 0x00080000
5295 #define FO_RANDOM_ACCESS 0x00100000
5296 #define FO_FILE_OPEN_CANCELLED 0x00200000
5297 #define FO_VOLUME_OPEN 0x00400000
5298 #define FO_REMOTE_ORIGIN 0x01000000
5299 #define FO_DISALLOW_EXCLUSIVE 0x02000000
5300 #define FO_SKIP_COMPLETION_PORT 0x02000000
5301 #define FO_SKIP_SET_EVENT 0x04000000
5302 #define FO_SKIP_SET_FAST_IO 0x08000000
5305 #define VPB_MOUNTED 0x0001
5306 #define VPB_LOCKED 0x0002
5307 #define VPB_PERSISTENT 0x0004
5308 #define VPB_REMOVE_PENDING 0x0008
5309 #define VPB_RAW_MOUNT 0x0010
5310 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
5314 #define SL_FORCE_ACCESS_CHECK 0x01
5315 #define SL_OPEN_PAGING_FILE 0x02
5316 #define SL_OPEN_TARGET_DIRECTORY 0x04
5317 #define SL_CASE_SENSITIVE 0x80
5319 #define SL_KEY_SPECIFIED 0x01
5320 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
5321 #define SL_WRITE_THROUGH 0x04
5322 #define SL_FT_SEQUENTIAL_WRITE 0x08
5324 #define SL_FAIL_IMMEDIATELY 0x01
5325 #define SL_EXCLUSIVE_LOCK 0x02
5327 #define SL_RESTART_SCAN 0x01
5328 #define SL_RETURN_SINGLE_ENTRY 0x02
5329 #define SL_INDEX_SPECIFIED 0x04
5331 #define SL_WATCH_TREE 0x01
5333 #define SL_ALLOW_RAW_MOUNT 0x01
5335 #define CTL_CODE(DeviceType, Function, Method, Access)( \
5336 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
5338 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
5340 #define IRP_NOCACHE 0x00000001
5341 #define IRP_PAGING_IO 0x00000002
5342 #define IRP_MOUNT_COMPLETION 0x00000002
5343 #define IRP_SYNCHRONOUS_API 0x00000004
5344 #define IRP_ASSOCIATED_IRP 0x00000008
5345 #define IRP_BUFFERED_IO 0x00000010
5346 #define IRP_DEALLOCATE_BUFFER 0x00000020
5347 #define IRP_INPUT_OPERATION 0x00000040
5348 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
5349 #define IRP_CREATE_OPERATION 0x00000080
5350 #define IRP_READ_OPERATION 0x00000100
5351 #define IRP_WRITE_OPERATION 0x00000200
5352 #define IRP_CLOSE_OPERATION 0x00000400
5353 #define IRP_DEFER_IO_COMPLETION 0x00000800
5354 #define IRP_OB_QUERY_NAME 0x00001000
5355 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
5357 #define IRP_QUOTA_CHARGED 0x01
5358 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
5359 #define IRP_ALLOCATED_FIXED_SIZE 0x04
5360 #define IRP_LOOKASIDE_ALLOCATION 0x08
5363 ** IRP function codes
5366 #define IRP_MJ_CREATE 0x00
5367 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
5368 #define IRP_MJ_CLOSE 0x02
5369 #define IRP_MJ_READ 0x03
5370 #define IRP_MJ_WRITE 0x04
5371 #define IRP_MJ_QUERY_INFORMATION 0x05
5372 #define IRP_MJ_SET_INFORMATION 0x06
5373 #define IRP_MJ_QUERY_EA 0x07
5374 #define IRP_MJ_SET_EA 0x08
5375 #define IRP_MJ_FLUSH_BUFFERS 0x09
5376 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
5377 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
5378 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
5379 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
5380 #define IRP_MJ_DEVICE_CONTROL 0x0e
5381 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
5382 #define IRP_MJ_SCSI 0x0f
5383 #define IRP_MJ_SHUTDOWN 0x10
5384 #define IRP_MJ_LOCK_CONTROL 0x11
5385 #define IRP_MJ_CLEANUP 0x12
5386 #define IRP_MJ_CREATE_MAILSLOT 0x13
5387 #define IRP_MJ_QUERY_SECURITY 0x14
5388 #define IRP_MJ_SET_SECURITY 0x15
5389 #define IRP_MJ_POWER 0x16
5390 #define IRP_MJ_SYSTEM_CONTROL 0x17
5391 #define IRP_MJ_DEVICE_CHANGE 0x18
5392 #define IRP_MJ_QUERY_QUOTA 0x19
5393 #define IRP_MJ_SET_QUOTA 0x1a
5394 #define IRP_MJ_PNP 0x1b
5395 #define IRP_MJ_PNP_POWER 0x1b
5396 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
5398 #define IRP_MN_SCSI_CLASS 0x01
5400 #define IRP_MN_START_DEVICE 0x00
5401 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
5402 #define IRP_MN_REMOVE_DEVICE 0x02
5403 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
5404 #define IRP_MN_STOP_DEVICE 0x04
5405 #define IRP_MN_QUERY_STOP_DEVICE 0x05
5406 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
5408 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
5409 #define IRP_MN_QUERY_INTERFACE 0x08
5410 #define IRP_MN_QUERY_CAPABILITIES 0x09
5411 #define IRP_MN_QUERY_RESOURCES 0x0A
5412 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
5413 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
5414 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
5416 #define IRP_MN_READ_CONFIG 0x0F
5417 #define IRP_MN_WRITE_CONFIG 0x10
5418 #define IRP_MN_EJECT 0x11
5419 #define IRP_MN_SET_LOCK 0x12
5420 #define IRP_MN_QUERY_ID 0x13
5421 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
5422 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
5423 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
5424 #define IRP_MN_SURPRISE_REMOVAL 0x17
5426 #define IRP_MN_WAIT_WAKE 0x00
5427 #define IRP_MN_POWER_SEQUENCE 0x01
5428 #define IRP_MN_SET_POWER 0x02
5429 #define IRP_MN_QUERY_POWER 0x03
5431 #define IRP_MN_QUERY_ALL_DATA 0x00
5432 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
5433 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
5434 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
5435 #define IRP_MN_ENABLE_EVENTS 0x04
5436 #define IRP_MN_DISABLE_EVENTS 0x05
5437 #define IRP_MN_ENABLE_COLLECTION 0x06
5438 #define IRP_MN_DISABLE_COLLECTION 0x07
5439 #define IRP_MN_REGINFO 0x08
5440 #define IRP_MN_EXECUTE_METHOD 0x09
5442 #define IRP_MN_REGINFO_EX 0x0b
5444 typedef struct _FILE_OBJECT
5448 PDEVICE_OBJECT DeviceObject
;
5452 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
5453 PVOID PrivateCacheMap
;
5454 NTSTATUS FinalStatus
;
5455 struct _FILE_OBJECT
*RelatedFileObject
;
5456 BOOLEAN LockOperation
;
5457 BOOLEAN DeletePending
;
5459 BOOLEAN WriteAccess
;
5460 BOOLEAN DeleteAccess
;
5462 BOOLEAN SharedWrite
;
5463 BOOLEAN SharedDelete
;
5465 UNICODE_STRING FileName
;
5466 LARGE_INTEGER CurrentByteOffset
;
5467 volatile ULONG Waiters
;
5468 volatile ULONG Busy
;
5472 volatile PIO_COMPLETION_CONTEXT CompletionContext
;
5473 KSPIN_LOCK IrpListLock
;
5475 volatile PVOID FileObjectExtension
;
5476 } FILE_OBJECT
, *PFILE_OBJECT
;
5478 typedef struct _IO_ERROR_LOG_PACKET
{
5479 UCHAR MajorFunctionCode
;
5481 USHORT DumpDataSize
;
5482 USHORT NumberOfStrings
;
5483 USHORT StringOffset
;
5484 USHORT EventCategory
;
5486 ULONG UniqueErrorValue
;
5487 NTSTATUS FinalStatus
;
5488 ULONG SequenceNumber
;
5489 ULONG IoControlCode
;
5490 LARGE_INTEGER DeviceOffset
;
5492 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
5494 typedef struct _IO_ERROR_LOG_MESSAGE
{
5497 USHORT DriverNameLength
;
5498 LARGE_INTEGER TimeStamp
;
5499 ULONG DriverNameOffset
;
5500 IO_ERROR_LOG_PACKET EntryData
;
5501 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
5503 #define ERROR_LOG_LIMIT_SIZE 240
5504 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
5505 sizeof(IO_ERROR_LOG_PACKET) + \
5506 (sizeof(WCHAR) * 40))
5507 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
5508 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5509 #define IO_ERROR_LOG_MESSAGE_LENGTH \
5510 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
5511 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
5512 PORT_MAXIMUM_MESSAGE_LENGTH)
5513 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
5514 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5516 typedef enum _DMA_WIDTH
{
5521 } DMA_WIDTH
, *PDMA_WIDTH
;
5523 typedef enum _DMA_SPEED
{
5530 } DMA_SPEED
, *PDMA_SPEED
;
5532 /* DEVICE_DESCRIPTION.Version */
5534 #define DEVICE_DESCRIPTION_VERSION 0x0000
5535 #define DEVICE_DESCRIPTION_VERSION1 0x0001
5536 #define DEVICE_DESCRIPTION_VERSION2 0x0002
5538 typedef struct _DEVICE_DESCRIPTION
{
5541 BOOLEAN ScatterGather
;
5543 BOOLEAN AutoInitialize
;
5544 BOOLEAN Dma32BitAddresses
;
5545 BOOLEAN IgnoreCount
;
5547 BOOLEAN Dma64BitAddresses
;
5550 INTERFACE_TYPE InterfaceType
;
5553 ULONG MaximumLength
;
5555 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
5557 typedef enum _DEVICE_RELATION_TYPE
{
5562 TargetDeviceRelation
,
5565 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
5567 typedef struct _DEVICE_RELATIONS
{
5569 PDEVICE_OBJECT Objects
[1];
5570 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
5572 typedef struct _DEVOBJ_EXTENSION
5576 PDEVICE_OBJECT DeviceObject
;
5577 } DEVOBJ_EXTENSION
, *PDEVOBJ_EXTENSION
;
5579 typedef struct _SCATTER_GATHER_ELEMENT
{
5580 PHYSICAL_ADDRESS Address
;
5583 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
5585 #if defined(_MSC_EXTENSIONS)
5587 #if _MSC_VER >= 1200
5588 #pragma warning(push)
5590 #pragma warning(disable:4200)
5591 typedef struct _SCATTER_GATHER_LIST
{
5592 ULONG NumberOfElements
;
5594 SCATTER_GATHER_ELEMENT Elements
[1];
5595 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
5597 #if _MSC_VER >= 1200
5598 #pragma warning(pop)
5600 #pragma warning(default:4200)
5605 struct _SCATTER_GATHER_LIST
;
5606 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
5611 (DDKAPI DRIVER_ADD_DEVICE
)(
5612 IN
struct _DRIVER_OBJECT
*DriverObject
,
5613 IN
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
5614 typedef DRIVER_ADD_DEVICE
*PDRIVER_ADD_DEVICE
;
5616 typedef struct _DRIVER_EXTENSION
{
5617 struct _DRIVER_OBJECT
*DriverObject
;
5618 PDRIVER_ADD_DEVICE AddDevice
;
5620 UNICODE_STRING ServiceKeyName
;
5621 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
5623 #define DRVO_UNLOAD_INVOKED 0x00000001
5624 #define DRVO_LEGACY_DRIVER 0x00000002
5625 #define DRVO_BUILTIN_DRIVER 0x00000004
5628 (DDKAPI DRIVER_INITIALIZE
)(
5629 IN
struct _DRIVER_OBJECT
*DriverObject
,
5630 IN PUNICODE_STRING RegistryPath
);
5631 typedef DRIVER_INITIALIZE
*PDRIVER_INITIALIZE
;
5634 (DDKAPI DRIVER_STARTIO
)(
5635 IN
struct _DEVICE_OBJECT
*DeviceObject
,
5636 IN
struct _IRP
*Irp
);
5637 typedef DRIVER_STARTIO
*PDRIVER_STARTIO
;
5640 (DDKAPI DRIVER_UNLOAD
)(
5641 IN
struct _DRIVER_OBJECT
*DriverObject
);
5642 typedef DRIVER_UNLOAD
*PDRIVER_UNLOAD
;
5645 (DDKAPI DRIVER_DISPATCH
)(
5646 IN
struct _DEVICE_OBJECT
*DeviceObject
,
5647 IN
struct _IRP
*Irp
);
5648 typedef DRIVER_DISPATCH
*PDRIVER_DISPATCH
;
5650 typedef struct _DRIVER_OBJECT
{
5653 PDEVICE_OBJECT DeviceObject
;
5657 PVOID DriverSection
;
5658 PDRIVER_EXTENSION DriverExtension
;
5659 UNICODE_STRING DriverName
;
5660 PUNICODE_STRING HardwareDatabase
;
5661 struct _FAST_IO_DISPATCH
*FastIoDispatch
;
5662 PDRIVER_INITIALIZE DriverInit
;
5663 PDRIVER_STARTIO DriverStartIo
;
5664 PDRIVER_UNLOAD DriverUnload
;
5665 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
5667 typedef struct _DRIVER_OBJECT
*PDRIVER_OBJECT
;
5669 typedef struct _DMA_ADAPTER
{
5672 struct _DMA_OPERATIONS
* DmaOperations
;
5673 } DMA_ADAPTER
, *PDMA_ADAPTER
;
5676 (DDKAPI
*PPUT_DMA_ADAPTER
)(
5677 IN PDMA_ADAPTER DmaAdapter
);
5680 (DDKAPI
*PALLOCATE_COMMON_BUFFER
)(
5681 IN PDMA_ADAPTER DmaAdapter
,
5683 OUT PPHYSICAL_ADDRESS LogicalAddress
,
5684 IN BOOLEAN CacheEnabled
);
5687 (DDKAPI
*PFREE_COMMON_BUFFER
)(
5688 IN PDMA_ADAPTER DmaAdapter
,
5690 IN PHYSICAL_ADDRESS LogicalAddress
,
5691 IN PVOID VirtualAddress
,
5692 IN BOOLEAN CacheEnabled
);
5695 (DDKAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
5696 IN PDMA_ADAPTER DmaAdapter
,
5697 IN PDEVICE_OBJECT DeviceObject
,
5698 IN ULONG NumberOfMapRegisters
,
5699 IN PDRIVER_CONTROL ExecutionRoutine
,
5703 (DDKAPI
*PFLUSH_ADAPTER_BUFFERS
)(
5704 IN PDMA_ADAPTER DmaAdapter
,
5706 IN PVOID MapRegisterBase
,
5709 IN BOOLEAN WriteToDevice
);
5712 (DDKAPI
*PFREE_ADAPTER_CHANNEL
)(
5713 IN PDMA_ADAPTER DmaAdapter
);
5716 (DDKAPI
*PFREE_MAP_REGISTERS
)(
5717 IN PDMA_ADAPTER DmaAdapter
,
5718 PVOID MapRegisterBase
,
5719 ULONG NumberOfMapRegisters
);
5721 typedef PHYSICAL_ADDRESS
5722 (DDKAPI
*PMAP_TRANSFER
)(
5723 IN PDMA_ADAPTER DmaAdapter
,
5725 IN PVOID MapRegisterBase
,
5727 IN OUT PULONG Length
,
5728 IN BOOLEAN WriteToDevice
);
5731 (DDKAPI
*PGET_DMA_ALIGNMENT
)(
5732 IN PDMA_ADAPTER DmaAdapter
);
5735 (DDKAPI
*PREAD_DMA_COUNTER
)(
5736 IN PDMA_ADAPTER DmaAdapter
);
5739 (DDKAPI
*PDRIVER_LIST_CONTROL
)(
5740 IN
struct _DEVICE_OBJECT
*DeviceObject
,
5741 IN
struct _IRP
*Irp
,
5742 IN
struct _SCATTER_GATHER_LIST
*ScatterGather
,
5746 (DDKAPI
*PGET_SCATTER_GATHER_LIST
)(
5747 IN PDMA_ADAPTER DmaAdapter
,
5748 IN PDEVICE_OBJECT DeviceObject
,
5752 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
5754 IN BOOLEAN WriteToDevice
);
5757 (DDKAPI
*PPUT_SCATTER_GATHER_LIST
)(
5758 IN PDMA_ADAPTER DmaAdapter
,
5759 IN PSCATTER_GATHER_LIST ScatterGather
,
5760 IN BOOLEAN WriteToDevice
);
5763 (DDKAPI
*PCALCULATE_SCATTER_GATHER_LIST_SIZE
)(
5764 IN PDMA_ADAPTER DmaAdapter
,
5765 IN PMDL Mdl OPTIONAL
,
5768 OUT PULONG ScatterGatherListSize
,
5769 OUT PULONG pNumberOfMapRegisters OPTIONAL
);
5772 (DDKAPI
*PBUILD_SCATTER_GATHER_LIST
)(
5773 IN PDMA_ADAPTER DmaAdapter
,
5774 IN PDEVICE_OBJECT DeviceObject
,
5778 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
5780 IN BOOLEAN WriteToDevice
,
5781 IN PVOID ScatterGatherBuffer
,
5782 IN ULONG ScatterGatherLength
);
5785 (DDKAPI
*PBUILD_MDL_FROM_SCATTER_GATHER_LIST
)(
5786 IN PDMA_ADAPTER DmaAdapter
,
5787 IN PSCATTER_GATHER_LIST ScatterGather
,
5788 IN PMDL OriginalMdl
,
5789 OUT PMDL
*TargetMdl
);
5791 typedef struct _DMA_OPERATIONS
{
5793 PPUT_DMA_ADAPTER PutDmaAdapter
;
5794 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
;
5795 PFREE_COMMON_BUFFER FreeCommonBuffer
;
5796 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
5797 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
5798 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
5799 PFREE_MAP_REGISTERS FreeMapRegisters
;
5800 PMAP_TRANSFER MapTransfer
;
5801 PGET_DMA_ALIGNMENT GetDmaAlignment
;
5802 PREAD_DMA_COUNTER ReadDmaCounter
;
5803 PGET_SCATTER_GATHER_LIST GetScatterGatherList
;
5804 PPUT_SCATTER_GATHER_LIST PutScatterGatherList
;
5805 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList
;
5806 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList
;
5807 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList
;
5808 } DMA_OPERATIONS
, *PDMA_OPERATIONS
;
5810 typedef struct _IO_RESOURCE_DESCRIPTOR
{
5813 UCHAR ShareDisposition
;
5821 PHYSICAL_ADDRESS MinimumAddress
;
5822 PHYSICAL_ADDRESS MaximumAddress
;
5827 PHYSICAL_ADDRESS MinimumAddress
;
5828 PHYSICAL_ADDRESS MaximumAddress
;
5831 ULONG MinimumVector
;
5832 ULONG MaximumVector
;
5835 ULONG MinimumChannel
;
5836 ULONG MaximumChannel
;
5841 PHYSICAL_ADDRESS MinimumAddress
;
5842 PHYSICAL_ADDRESS MaximumAddress
;
5859 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
5861 typedef struct _IO_RESOURCE_LIST
{
5865 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
5866 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
5868 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
5870 INTERFACE_TYPE InterfaceType
;
5874 ULONG AlternativeLists
;
5875 IO_RESOURCE_LIST List
[1];
5876 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
5879 (DDKAPI DRIVER_CANCEL
)(
5880 IN
struct _DEVICE_OBJECT
*DeviceObject
,
5881 IN
struct _IRP
*Irp
);
5882 typedef DRIVER_CANCEL
*PDRIVER_CANCEL
;
5884 typedef struct _IRP
{
5887 struct _MDL
*MdlAddress
;
5890 struct _IRP
*MasterIrp
;
5891 volatile LONG IrpCount
;
5894 LIST_ENTRY ThreadListEntry
;
5895 IO_STATUS_BLOCK IoStatus
;
5896 KPROCESSOR_MODE RequestorMode
;
5897 BOOLEAN PendingReturned
;
5899 CHAR CurrentLocation
;
5902 CCHAR ApcEnvironment
;
5903 UCHAR AllocationFlags
;
5904 PIO_STATUS_BLOCK UserIosb
;
5908 _ANONYMOUS_UNION
union {
5909 PIO_APC_ROUTINE UserApcRoutine
;
5910 PVOID IssuingProcess
;
5912 PVOID UserApcContext
;
5913 } AsynchronousParameters
;
5914 LARGE_INTEGER AllocationSize
;
5916 volatile PDRIVER_CANCEL CancelRoutine
;
5920 _ANONYMOUS_UNION
union {
5921 KDEVICE_QUEUE_ENTRY DeviceQueueEntry
;
5922 _ANONYMOUS_STRUCT
struct {
5923 PVOID DriverContext
[4];
5927 PCHAR AuxiliaryBuffer
;
5928 _ANONYMOUS_STRUCT
struct {
5929 LIST_ENTRY ListEntry
;
5930 _ANONYMOUS_UNION
union {
5931 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
5935 struct _FILE_OBJECT
*OriginalFileObject
;
5938 PVOID CompletionKey
;
5941 typedef struct _IRP
*PIRP
;
5943 typedef enum _IO_PAGING_PRIORITY
{
5944 IoPagingPriorityInvalid
,
5945 IoPagingPriorityNormal
,
5946 IoPagingPriorityHigh
,
5947 IoPagingPriorityReserved1
,
5948 IoPagingPriorityReserved2
5949 } IO_PAGING_PRIORITY
;
5952 (DDKAPI IO_COMPLETION_ROUTINE
)(
5953 IN
struct _DEVICE_OBJECT
*DeviceObject
,
5954 IN
struct _IRP
*Irp
,
5956 typedef IO_COMPLETION_ROUTINE
*PIO_COMPLETION_ROUTINE
;
5959 (DDKAPI
*PIO_DPC_ROUTINE
)(
5960 IN
struct _KDPC
*Dpc
,
5961 IN
struct _DEVICE_OBJECT
*DeviceObject
,
5962 IN
struct _IRP
*Irp
,
5966 (DDKAPI
*PMM_DLL_INITIALIZE
)(
5967 IN PUNICODE_STRING RegistryPath
);
5970 (DDKAPI
*PMM_DLL_UNLOAD
)(
5974 (DDKAPI KSERVICE_ROUTINE
)(
5975 IN
struct _KINTERRUPT
*Interrupt
,
5976 IN PVOID ServiceContext
);
5977 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
5980 (DDKAPI
*PIO_TIMER_ROUTINE
)(
5981 IN
struct _DEVICE_OBJECT
*DeviceObject
,
5985 (DDKAPI
*PKSYNCHRONIZE_ROUTINE
)(
5986 IN PVOID SynchronizeContext
);
5988 typedef struct _IO_SECURITY_CONTEXT
{
5989 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
5990 PACCESS_STATE AccessState
;
5991 ACCESS_MASK DesiredAccess
;
5992 ULONG FullCreateOptions
;
5993 } IO_SECURITY_CONTEXT
, *PIO_SECURITY_CONTEXT
;
5997 typedef struct _IO_CSQ_IRP_CONTEXT
{
6000 struct _IO_CSQ
*Csq
;
6001 } IO_CSQ_IRP_CONTEXT
, *PIO_CSQ_IRP_CONTEXT
;
6004 (DDKAPI
*PIO_CSQ_INSERT_IRP
)(
6005 IN
struct _IO_CSQ
*Csq
,
6009 (DDKAPI
*PIO_CSQ_REMOVE_IRP
)(
6010 IN
struct _IO_CSQ
*Csq
,
6014 (DDKAPI
*PIO_CSQ_PEEK_NEXT_IRP
)(
6015 IN
struct _IO_CSQ
*Csq
,
6017 IN PVOID PeekContext
);
6020 (DDKAPI
*PIO_CSQ_ACQUIRE_LOCK
)(
6021 IN
struct _IO_CSQ
*Csq
,
6025 (DDKAPI
*PIO_CSQ_RELEASE_LOCK
)(
6026 IN
struct _IO_CSQ
*Csq
,
6030 (DDKAPI
*PIO_CSQ_COMPLETE_CANCELED_IRP
)(
6031 IN
struct _IO_CSQ
*Csq
,
6034 typedef struct _IO_CSQ
{
6036 PIO_CSQ_INSERT_IRP CsqInsertIrp
;
6037 PIO_CSQ_REMOVE_IRP CsqRemoveIrp
;
6038 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
;
6039 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
;
6040 PIO_CSQ_RELEASE_LOCK CsqReleaseLock
;
6041 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
;
6042 PVOID ReservePointer
;
6045 typedef enum _BUS_QUERY_ID_TYPE
{
6047 BusQueryHardwareIDs
,
6048 BusQueryCompatibleIDs
,
6050 BusQueryDeviceSerialNumber
6051 } BUS_QUERY_ID_TYPE
, *PBUS_QUERY_ID_TYPE
;
6053 typedef enum _DEVICE_TEXT_TYPE
{
6054 DeviceTextDescription
,
6055 DeviceTextLocationInformation
6056 } DEVICE_TEXT_TYPE
, *PDEVICE_TEXT_TYPE
;
6058 typedef enum _WORK_QUEUE_TYPE
{
6061 HyperCriticalWorkQueue
,
6065 #if !defined(_AMD64_) && !defined(_IA64_)
6066 #include <pshpack4.h>
6068 typedef struct _IO_STACK_LOCATION
{
6069 UCHAR MajorFunction
;
6070 UCHAR MinorFunction
;
6075 PIO_SECURITY_CONTEXT SecurityContext
;
6077 USHORT POINTER_ALIGNMENT FileAttributes
;
6079 ULONG POINTER_ALIGNMENT EaLength
;
6083 ULONG POINTER_ALIGNMENT Key
;
6084 LARGE_INTEGER ByteOffset
;
6088 ULONG POINTER_ALIGNMENT Key
;
6089 LARGE_INTEGER ByteOffset
;
6093 PUNICODE_STRING FileName
;
6094 FILE_INFORMATION_CLASS FileInformationClass
;
6099 ULONG CompletionFilter
;
6103 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
6107 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
6108 PFILE_OBJECT FileObject
;
6109 _ANONYMOUS_UNION
union {
6110 _ANONYMOUS_STRUCT
struct {
6111 BOOLEAN ReplaceIfExists
;
6112 BOOLEAN AdvanceOnly
;
6115 HANDLE DeleteHandle
;
6129 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass
;
6133 FS_INFORMATION_CLASS FsInformationClass
;
6136 ULONG OutputBufferLength
;
6137 ULONG InputBufferLength
;
6138 ULONG FsControlCode
;
6139 PVOID Type3InputBuffer
;
6140 } FileSystemControl
;
6142 PLARGE_INTEGER Length
;
6144 LARGE_INTEGER ByteOffset
;
6147 ULONG OutputBufferLength
;
6148 ULONG POINTER_ALIGNMENT InputBufferLength
;
6149 ULONG POINTER_ALIGNMENT IoControlCode
;
6150 PVOID Type3InputBuffer
;
6153 SECURITY_INFORMATION SecurityInformation
;
6154 ULONG POINTER_ALIGNMENT Length
;
6157 SECURITY_INFORMATION SecurityInformation
;
6158 PSECURITY_DESCRIPTOR SecurityDescriptor
;
6162 PDEVICE_OBJECT DeviceObject
;
6166 PDEVICE_OBJECT DeviceObject
;
6169 struct _SCSI_REQUEST_BLOCK
*Srb
;
6174 struct _FILE_GET_QUOTA_INFORMATION
*SidList
;
6175 ULONG SidListLength
;
6181 DEVICE_RELATION_TYPE Type
;
6182 } QueryDeviceRelations
;
6184 CONST GUID
*InterfaceType
;
6187 PINTERFACE Interface
;
6188 PVOID InterfaceSpecificData
;
6191 PDEVICE_CAPABILITIES Capabilities
;
6192 } DeviceCapabilities
;
6194 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList
;
6195 } FilterResourceRequirements
;
6200 ULONG POINTER_ALIGNMENT Length
;
6206 BUS_QUERY_ID_TYPE IdType
;
6209 DEVICE_TEXT_TYPE DeviceTextType
;
6210 LCID POINTER_ALIGNMENT LocaleId
;
6214 BOOLEAN Reserved
[3];
6215 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type
;
6216 } UsageNotification
;
6218 SYSTEM_POWER_STATE PowerState
;
6221 PPOWER_SEQUENCE PowerSequence
;
6224 ULONG SystemContext
;
6225 POWER_STATE_TYPE POINTER_ALIGNMENT Type
;
6226 POWER_STATE POINTER_ALIGNMENT State
;
6227 POWER_ACTION POINTER_ALIGNMENT ShutdownType
;
6230 PCM_RESOURCE_LIST AllocatedResources
;
6231 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
6234 ULONG_PTR ProviderId
;
6246 PDEVICE_OBJECT DeviceObject
;
6247 PFILE_OBJECT FileObject
;
6248 PIO_COMPLETION_ROUTINE CompletionRoutine
;
6250 } IO_STACK_LOCATION
, *PIO_STACK_LOCATION
;
6251 #if !defined(_AMD64_) && !defined(_IA64_)
6252 #include <poppack.h>
6255 /* IO_STACK_LOCATION.Control */
6257 #define SL_PENDING_RETURNED 0x01
6258 #define SL_ERROR_RETURNED 0x02
6259 #define SL_INVOKE_ON_CANCEL 0x20
6260 #define SL_INVOKE_ON_SUCCESS 0x40
6261 #define SL_INVOKE_ON_ERROR 0x80
6263 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
6265 #define PCI_WHICHSPACE_CONFIG 0x0
6266 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
6269 /******************************************************************************
6270 * I/O Manager Functions *
6271 ******************************************************************************/
6273 #if !defined(_M_AMD64)
6277 READ_PORT_BUFFER_UCHAR(
6285 READ_PORT_BUFFER_ULONG(
6293 READ_PORT_BUFFER_USHORT(
6319 READ_REGISTER_BUFFER_UCHAR(
6327 READ_REGISTER_BUFFER_ULONG(
6335 READ_REGISTER_BUFFER_USHORT(
6336 IN PUSHORT Register
,
6343 READ_REGISTER_UCHAR(
6344 IN PUCHAR Register
);
6349 READ_REGISTER_ULONG(
6350 IN PULONG Register
);
6355 READ_REGISTER_USHORT(
6356 IN PUSHORT Register
);
6361 WRITE_PORT_BUFFER_UCHAR(
6369 WRITE_PORT_BUFFER_ULONG(
6377 WRITE_PORT_BUFFER_USHORT(
6406 WRITE_REGISTER_BUFFER_UCHAR(
6414 WRITE_REGISTER_BUFFER_ULONG(
6422 WRITE_REGISTER_BUFFER_USHORT(
6423 IN PUSHORT Register
,
6430 WRITE_REGISTER_UCHAR(
6437 WRITE_REGISTER_ULONG(
6444 WRITE_REGISTER_USHORT(
6445 IN PUSHORT Register
,
6452 READ_PORT_BUFFER_UCHAR(
6457 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
6462 READ_PORT_BUFFER_ULONG(
6467 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
6472 READ_PORT_BUFFER_USHORT(
6477 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
6485 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
6493 return __indword((USHORT
)(ULONG_PTR
)Port
);
6501 return __inword((USHORT
)(ULONG_PTR
)Port
);
6506 READ_REGISTER_BUFFER_UCHAR(
6511 __movsb(Register
, Buffer
, Count
);
6516 READ_REGISTER_BUFFER_ULONG(
6521 __movsd(Register
, Buffer
, Count
);
6526 READ_REGISTER_BUFFER_USHORT(
6527 IN PUSHORT Register
,
6531 __movsw(Register
, Buffer
, Count
);
6536 READ_REGISTER_UCHAR(
6537 IN
volatile UCHAR
*Register
)
6544 READ_REGISTER_ULONG(
6545 IN
volatile ULONG
*Register
)
6552 READ_REGISTER_USHORT(
6553 IN
volatile USHORT
*Register
)
6560 WRITE_PORT_BUFFER_UCHAR(
6565 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
6570 WRITE_PORT_BUFFER_ULONG(
6575 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
6580 WRITE_PORT_BUFFER_USHORT(
6585 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
6594 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
6603 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
6612 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
6617 WRITE_REGISTER_BUFFER_UCHAR(
6623 __movsb(Register
, Buffer
, Count
);
6624 InterlockedOr(&Synch
, 1);
6629 WRITE_REGISTER_BUFFER_ULONG(
6635 __movsd(Register
, Buffer
, Count
);
6636 InterlockedOr(&Synch
, 1);
6641 WRITE_REGISTER_BUFFER_USHORT(
6642 IN PUSHORT Register
,
6647 __movsw(Register
, Buffer
, Count
);
6648 InterlockedOr(&Synch
, 1);
6653 WRITE_REGISTER_UCHAR(
6654 IN
volatile UCHAR
*Register
,
6659 InterlockedOr(&Synch
, 1);
6664 WRITE_REGISTER_ULONG(
6665 IN
volatile ULONG
*Register
,
6670 InterlockedOr(&Synch
, 1);
6675 WRITE_REGISTER_USHORT(
6676 IN
volatile USHORT
*Register
,
6681 InterlockedOr(&Sync
, 1);
6685 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
6686 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
6688 #define DMA_MACROS_DEFINED
6692 IoAllocateAdapterChannel(
6693 IN PDMA_ADAPTER DmaAdapter
,
6694 IN PDEVICE_OBJECT DeviceObject
,
6695 IN ULONG NumberOfMapRegisters
,
6696 IN PDRIVER_CONTROL ExecutionRoutine
,
6699 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
6700 AllocateAdapterChannel
=
6701 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
6702 ASSERT(AllocateAdapterChannel
);
6703 return AllocateAdapterChannel(DmaAdapter
,
6705 NumberOfMapRegisters
,
6712 IoFlushAdapterBuffers(
6713 IN PDMA_ADAPTER DmaAdapter
,
6715 IN PVOID MapRegisterBase
,
6718 IN BOOLEAN WriteToDevice
)
6720 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
6721 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
6722 ASSERT(FlushAdapterBuffers
);
6723 return FlushAdapterBuffers(DmaAdapter
,
6733 IoFreeAdapterChannel(
6734 IN PDMA_ADAPTER DmaAdapter
)
6736 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
6737 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
6738 ASSERT(FreeAdapterChannel
);
6739 FreeAdapterChannel(DmaAdapter
);
6745 IN PDMA_ADAPTER DmaAdapter
,
6746 IN PVOID MapRegisterBase
,
6747 IN ULONG NumberOfMapRegisters
)
6749 PFREE_MAP_REGISTERS FreeMapRegisters
;
6750 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
6751 ASSERT(FreeMapRegisters
);
6752 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
6758 IN PDMA_ADAPTER DmaAdapter
,
6760 IN PVOID MapRegisterBase
,
6762 IN OUT PULONG Length
,
6763 IN BOOLEAN WriteToDevice
)
6765 PMAP_TRANSFER MapTransfer
;
6767 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
6768 ASSERT(MapTransfer
);
6769 return MapTransfer(DmaAdapter
,
6778 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6782 IoAcquireCancelSpinLock(
6788 IoAcquireRemoveLockEx(
6789 IN PIO_REMOVE_LOCK RemoveLock
,
6790 IN PVOID Tag OPTIONAL
,
6793 IN ULONG RemlockSize
);
6798 * IoAcquireRemoveLock(
6799 * IN PIO_REMOVE_LOCK RemoveLock,
6800 * IN OPTIONAL PVOID Tag)
6803 #define IoAcquireRemoveLock(RemoveLock, Tag) \
6804 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
6806 #define IoAcquireRemoveLock(RemoveLock, Tag) \
6807 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
6812 * IoAdjustPagingPathCount(
6814 * IN BOOLEAN Increment)
6816 #define IoAdjustPagingPathCount(_Count, \
6821 InterlockedIncrement(_Count); \
6825 InterlockedDecrement(_Count); \
6829 #if (NTDDI_VERSION >= NTDDI_WIN2K)
6834 IoAllocateDriverObjectExtension(
6835 IN PDRIVER_OBJECT DriverObject
,
6836 IN PVOID ClientIdentificationAddress
,
6837 IN ULONG DriverObjectExtensionSize
,
6838 OUT PVOID
*DriverObjectExtension
);
6843 IoAllocateErrorLogEntry(
6845 IN UCHAR EntrySize
);
6852 IN BOOLEAN ChargeQuota
);
6858 IN PVOID VirtualAddress OPTIONAL
,
6860 IN BOOLEAN SecondaryBuffer
,
6861 IN BOOLEAN ChargeQuota
,
6862 IN OUT PIRP Irp OPTIONAL
);
6868 IN PDEVICE_OBJECT DeviceObject
);
6874 IN PDEVICE_OBJECT SourceDevice
,
6875 IN PUNICODE_STRING TargetDevice
,
6876 OUT PDEVICE_OBJECT
*AttachedDevice
);
6881 IoAttachDeviceToDeviceStack(
6882 IN PDEVICE_OBJECT SourceDevice
,
6883 IN PDEVICE_OBJECT TargetDevice
);
6888 IoBuildAsynchronousFsdRequest(
6889 IN ULONG MajorFunction
,
6890 IN PDEVICE_OBJECT DeviceObject
,
6891 IN OUT PVOID Buffer OPTIONAL
,
6892 IN ULONG Length OPTIONAL
,
6893 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
6894 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
6899 IoBuildDeviceIoControlRequest(
6900 IN ULONG IoControlCode
,
6901 IN PDEVICE_OBJECT DeviceObject
,
6902 IN PVOID InputBuffer OPTIONAL
,
6903 IN ULONG InputBufferLength
,
6904 OUT PVOID OutputBuffer OPTIONAL
,
6905 IN ULONG OutputBufferLength
,
6906 IN BOOLEAN InternalDeviceIoControl
,
6908 OUT PIO_STATUS_BLOCK IoStatusBlock
);
6915 IN OUT PMDL TargetMdl
,
6916 IN PVOID VirtualAddress
,
6922 IoBuildSynchronousFsdRequest(
6923 IN ULONG MajorFunction
,
6924 IN PDEVICE_OBJECT DeviceObject
,
6925 IN OUT PVOID Buffer OPTIONAL
,
6926 IN ULONG Length OPTIONAL
,
6927 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
6929 OUT PIO_STATUS_BLOCK IoStatusBlock
);
6935 IN PDEVICE_OBJECT DeviceObject
,
6937 #define IoCallDriver IofCallDriver
6944 IN CCHAR PriorityBoost
);
6945 #define IoCompleteRequest IofCompleteRequest
6957 IN ACCESS_MASK DesiredAccess
,
6958 IN ULONG DesiredShareAccess
,
6959 IN OUT PFILE_OBJECT FileObject
,
6960 IN OUT PSHARE_ACCESS ShareAccess
,
6968 IN CCHAR PriorityBoost
);
6974 OUT PKINTERRUPT
*InterruptObject
,
6975 IN PKSERVICE_ROUTINE ServiceRoutine
,
6976 IN PVOID ServiceContext OPTIONAL
,
6977 IN PKSPIN_LOCK SpinLock OPTIONAL
,
6980 IN KIRQL SynchronizeIrql
,
6981 IN KINTERRUPT_MODE InterruptMode
,
6982 IN BOOLEAN ShareVector
,
6983 IN KAFFINITY ProcessorEnableMask
,
6984 IN BOOLEAN FloatingSave
);
6990 IN PDRIVER_OBJECT DriverObject
,
6991 IN ULONG DeviceExtensionSize
,
6992 IN PUNICODE_STRING DeviceName OPTIONAL
,
6993 IN DEVICE_TYPE DeviceType
,
6994 IN ULONG DeviceCharacteristics
,
6995 IN BOOLEAN Exclusive
,
6996 OUT PDEVICE_OBJECT
*DeviceObject
);
7002 OUT PHANDLE FileHandle
,
7003 IN ACCESS_MASK DesiredAccess
,
7004 IN POBJECT_ATTRIBUTES ObjectAttributes
,
7005 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7006 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
7007 IN ULONG FileAttributes
,
7008 IN ULONG ShareAccess
,
7009 IN ULONG Disposition
,
7010 IN ULONG CreateOptions
,
7011 IN PVOID EaBuffer OPTIONAL
,
7013 IN CREATE_FILE_TYPE CreateFileType
,
7014 IN PVOID InternalParameters OPTIONAL
,
7020 IoCreateNotificationEvent(
7021 IN PUNICODE_STRING EventName
,
7022 OUT PHANDLE EventHandle
);
7027 IoCreateSymbolicLink(
7028 IN PUNICODE_STRING SymbolicLinkName
,
7029 IN PUNICODE_STRING DeviceName
);
7034 IoCreateSynchronizationEvent(
7035 IN PUNICODE_STRING EventName
,
7036 OUT PHANDLE EventHandle
);
7041 IoCreateUnprotectedSymbolicLink(
7042 IN PUNICODE_STRING SymbolicLinkName
,
7043 IN PUNICODE_STRING DeviceName
);
7049 IN PDEVICE_OBJECT DeviceObject
);
7054 IoDeleteSymbolicLink(
7055 IN PUNICODE_STRING SymbolicLinkName
);
7061 IN OUT PDEVICE_OBJECT TargetDevice
);
7066 IoDisconnectInterrupt(
7067 IN PKINTERRUPT InterruptObject
);
7085 IN PIO_WORKITEM IoWorkItem
);
7090 IoGetAttachedDevice(
7091 IN PDEVICE_OBJECT DeviceObject
);
7096 IoGetAttachedDeviceReference(
7097 IN PDEVICE_OBJECT DeviceObject
);
7102 IoGetBootDiskInformation(
7103 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
7109 IoGetDeviceInterfaceAlias(
7110 IN PUNICODE_STRING SymbolicLinkName
,
7111 IN CONST GUID
*AliasInterfaceClassGuid
,
7112 OUT PUNICODE_STRING AliasSymbolicLinkName
);
7117 IoGetCurrentProcess(
7123 IoGetDeviceInterfaces(
7124 IN CONST GUID
*InterfaceClassGuid
,
7125 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
7127 OUT PWSTR
*SymbolicLinkList
);
7132 IoGetDeviceObjectPointer(
7133 IN PUNICODE_STRING ObjectName
,
7134 IN ACCESS_MASK DesiredAccess
,
7135 OUT PFILE_OBJECT
*FileObject
,
7136 OUT PDEVICE_OBJECT
*DeviceObject
);
7141 IoGetDeviceProperty(
7142 IN PDEVICE_OBJECT DeviceObject
,
7143 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
7144 IN ULONG BufferLength
,
7145 OUT PVOID PropertyBuffer
,
7146 OUT PULONG ResultLength
);
7152 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
7153 IN PDEVICE_DESCRIPTION DeviceDescription
,
7154 IN OUT PULONG NumberOfMapRegisters
);
7159 IoGetDriverObjectExtension(
7160 IN PDRIVER_OBJECT DriverObject
,
7161 IN PVOID ClientIdentificationAddress
);
7172 IoGetRelatedDeviceObject(
7173 IN PFILE_OBJECT FileObject
);
7179 IN PIO_WORKITEM IoWorkItem
,
7180 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
7181 IN WORK_QUEUE_TYPE QueueType
,
7182 IN PVOID Context OPTIONAL
);
7189 IN PKDEFERRED_ROUTINE DeferredRoutine
,
7190 IN PVOID DeferredContext OPTIONAL
);
7197 IN USHORT PacketSize
,
7198 IN CCHAR StackSize
);
7203 IoInitializeRemoveLockEx(
7204 IN PIO_REMOVE_LOCK Lock
,
7205 IN ULONG AllocateTag
,
7206 IN ULONG MaxLockedMinutes
,
7207 IN ULONG HighWatermark
,
7208 IN ULONG RemlockSize
);
7214 IN PDEVICE_OBJECT DeviceObject
,
7215 IN PIO_TIMER_ROUTINE TimerRoutine
,
7216 IN PVOID Context OPTIONAL
);
7221 IoInvalidateDeviceRelations(
7222 IN PDEVICE_OBJECT DeviceObject
,
7223 IN DEVICE_RELATION_TYPE Type
);
7228 IoInvalidateDeviceState(
7229 IN PDEVICE_OBJECT PhysicalDeviceObject
);
7234 IoIsWdmVersionAvailable(
7235 IN UCHAR MajorVersion
,
7236 IN UCHAR MinorVersion
);
7241 IoOpenDeviceInterfaceRegistryKey(
7242 IN PUNICODE_STRING SymbolicLinkName
,
7243 IN ACCESS_MASK DesiredAccess
,
7244 OUT PHANDLE DeviceInterfaceKey
);
7249 IoOpenDeviceRegistryKey(
7250 IN PDEVICE_OBJECT DeviceObject
,
7251 IN ULONG DevInstKeyType
,
7252 IN ACCESS_MASK DesiredAccess
,
7253 OUT PHANDLE DevInstRegKey
);
7258 IoRegisterDeviceInterface(
7259 IN PDEVICE_OBJECT PhysicalDeviceObject
,
7260 IN CONST GUID
*InterfaceClassGuid
,
7261 IN PUNICODE_STRING ReferenceString OPTIONAL
,
7262 OUT PUNICODE_STRING SymbolicLinkName
);
7267 IoRegisterPlugPlayNotification(
7268 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
7269 IN ULONG EventCategoryFlags
,
7270 IN PVOID EventCategoryData OPTIONAL
,
7271 IN PDRIVER_OBJECT DriverObject
,
7272 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
7273 IN OUT PVOID Context OPTIONAL
,
7274 OUT PVOID
*NotificationEntry
);
7279 IoRegisterShutdownNotification(
7280 IN PDEVICE_OBJECT DeviceObject
);
7285 IoReleaseCancelSpinLock(
7291 IoReleaseRemoveLockAndWaitEx(
7292 IN PIO_REMOVE_LOCK RemoveLock
,
7293 IN PVOID Tag OPTIONAL
,
7294 IN ULONG RemlockSize
);
7299 IoReleaseRemoveLockEx(
7300 IN PIO_REMOVE_LOCK RemoveLock
,
7301 IN PVOID Tag OPTIONAL
,
7302 IN ULONG RemlockSize
);
7307 IoRemoveShareAccess(
7308 IN PFILE_OBJECT FileObject
,
7309 IN OUT PSHARE_ACCESS ShareAccess
);
7314 IoReportTargetDeviceChange(
7315 IN PDEVICE_OBJECT PhysicalDeviceObject
,
7316 IN PVOID NotificationStructure
);
7321 IoReportTargetDeviceChangeAsynchronous(
7322 IN PDEVICE_OBJECT PhysicalDeviceObject
,
7323 IN PVOID NotificationStructure
,
7324 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
7325 IN PVOID Context OPTIONAL
);
7330 IoRequestDeviceEject(
7331 IN PDEVICE_OBJECT PhysicalDeviceObject
);
7338 IN NTSTATUS Status
);
7343 IoSetDeviceInterfaceState(
7344 IN PUNICODE_STRING SymbolicLinkName
,
7351 IN ACCESS_MASK DesiredAccess
,
7352 IN ULONG DesiredShareAccess
,
7353 IN OUT PFILE_OBJECT FileObject
,
7354 OUT PSHARE_ACCESS ShareAccess
);
7360 IN PDEVICE_OBJECT DeviceObject
,
7361 IN BOOLEAN Cancelable
);
7366 IoStartNextPacketByKey(
7367 IN PDEVICE_OBJECT DeviceObject
,
7368 IN BOOLEAN Cancelable
,
7375 IN PDEVICE_OBJECT DeviceObject
,
7377 IN PULONG Key OPTIONAL
,
7378 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
7384 IN PDEVICE_OBJECT DeviceObject
);
7390 IN PDEVICE_OBJECT DeviceObject
);
7395 IoUnregisterPlugPlayNotification(
7396 IN PVOID NotificationEntry
);
7401 IoUnregisterShutdownNotification(
7402 IN PDEVICE_OBJECT DeviceObject
);
7407 IoUpdateShareAccess(
7408 IN PFILE_OBJECT FileObject
,
7409 IN OUT PSHARE_ACCESS ShareAccess
);
7414 IoWMIAllocateInstanceIds(
7416 IN ULONG InstanceCount
,
7417 OUT ULONG
*FirstInstanceId
);
7422 IoWMIQuerySingleInstanceMultiple(
7423 IN PVOID
*DataBlockObjectList
,
7424 IN PUNICODE_STRING InstanceNames
,
7425 IN ULONG ObjectCount
,
7426 IN OUT ULONG
*InOutBufferSize
,
7427 OUT PVOID OutBuffer
);
7432 IoWMIRegistrationControl(
7433 IN PDEVICE_OBJECT DeviceObject
,
7439 IoWMISuggestInstanceName(
7440 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
7441 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
7442 IN BOOLEAN CombineNames
,
7443 OUT PUNICODE_STRING SuggestedInstanceName
);
7449 IN PVOID WnodeEventItem
);
7454 IoWriteErrorLogEntry(
7459 #if (NTDDI_VERSION >= NTDDI_WINXP)
7466 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
7467 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
7468 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
7469 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
7470 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
7471 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
7479 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
);
7486 IN PIO_CSQ_IRP_CONTEXT Context
);
7493 IN PVOID PeekContext
);
7498 IoForwardIrpSynchronously(
7499 IN PDEVICE_OBJECT DeviceObject
,
7502 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
7507 IoFreeErrorLogEntry(
7513 IoSetCompletionRoutineEx(
7514 IN PDEVICE_OBJECT DeviceObject
,
7516 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
7518 IN BOOLEAN InvokeOnSuccess
,
7519 IN BOOLEAN InvokeOnError
,
7520 IN BOOLEAN InvokeOnCancel
);
7525 IoSetStartIoAttributes(
7526 IN PDEVICE_OBJECT DeviceObject
,
7527 IN BOOLEAN DeferredStartIo
,
7528 IN BOOLEAN NonCancelable
);
7533 IoWMIDeviceObjectToInstanceName(
7534 IN PVOID DataBlockObject
,
7535 IN PDEVICE_OBJECT DeviceObject
,
7536 OUT PUNICODE_STRING InstanceName
);
7542 IN PVOID DataBlockObject
,
7543 IN PUNICODE_STRING InstanceName
,
7545 IN ULONG InBufferSize
,
7546 IN OUT PULONG OutBufferSize
,
7547 IN OUT PUCHAR InOutBuffer
);
7552 IoWMIHandleToInstanceName(
7553 IN PVOID DataBlockObject
,
7554 IN HANDLE FileHandle
,
7555 OUT PUNICODE_STRING InstanceName
);
7561 IN GUID
*DataBlockGuid
,
7562 IN ULONG DesiredAccess
,
7563 OUT PVOID
*DataBlockObject
);
7569 IN PVOID DataBlockObject
,
7570 IN OUT ULONG
*InOutBufferSize
,
7571 OUT PVOID OutBuffer
);
7576 IoWMIQueryAllDataMultiple(
7577 IN PVOID
*DataBlockObjectList
,
7578 IN ULONG ObjectCount
,
7579 IN OUT ULONG
*InOutBufferSize
,
7580 OUT PVOID OutBuffer
);
7585 IoWMIQuerySingleInstance(
7586 IN PVOID DataBlockObject
,
7587 IN PUNICODE_STRING InstanceName
,
7588 IN OUT ULONG
*InOutBufferSize
,
7589 OUT PVOID OutBuffer
);
7594 IoWMISetNotificationCallback(
7595 IN OUT PVOID Object
,
7596 IN WMI_NOTIFICATION_CALLBACK Callback
,
7597 IN PVOID Context OPTIONAL
);
7602 IoWMISetSingleInstance(
7603 IN PVOID DataBlockObject
,
7604 IN PUNICODE_STRING InstanceName
,
7606 IN ULONG ValueBufferSize
,
7607 IN PVOID ValueBuffer
);
7613 IN PVOID DataBlockObject
,
7614 IN PUNICODE_STRING InstanceName
,
7615 IN ULONG DataItemId
,
7617 IN ULONG ValueBufferSize
,
7618 IN PVOID ValueBuffer
);
7626 IoWMIDeviceObjectToProviderId(
7627 IN PDEVICE_OBJECT DeviceObject
);
7629 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
7635 * IN CCHAR StackSize)
7637 #define IoSizeOfIrp(_StackSize) \
7638 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
7642 IoSkipCurrentIrpStackLocation (
7645 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
7646 Irp
->CurrentLocation
++;
7647 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
7652 IoSetNextIrpStackLocation (
7655 ASSERT(Irp
->CurrentLocation
> 0);
7656 Irp
->CurrentLocation
--;
7657 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
7662 IoGetNextIrpStackLocation(
7665 ASSERT(Irp
->CurrentLocation
> 0);
7666 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
7671 IoSetCompletionRoutine(
7673 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
7674 IN PVOID Context OPTIONAL
,
7675 IN BOOLEAN InvokeOnSuccess
,
7676 IN BOOLEAN InvokeOnError
,
7677 IN BOOLEAN InvokeOnCancel
)
7679 PIO_STACK_LOCATION irpSp
;
7680 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
7681 irpSp
= IoGetNextIrpStackLocation(Irp
);
7682 irpSp
->CompletionRoutine
= CompletionRoutine
;
7683 irpSp
->Context
= Context
;
7686 if (InvokeOnSuccess
) {
7687 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
7690 if (InvokeOnError
) {
7691 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
7694 if (InvokeOnCancel
) {
7695 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
7701 * IoSetCancelRoutine(
7703 * IN PDRIVER_CANCEL CancelRoutine)
7705 #define IoSetCancelRoutine(_Irp, \
7707 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
7708 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
7713 * IN PDEVICE_OBJECT DeviceObject,
7715 * IN PVOID Context);
7717 #define IoRequestDpc(DeviceObject, Irp, Context)( \
7718 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
7722 * IoReleaseRemoveLock(
7723 * IN PIO_REMOVE_LOCK RemoveLock,
7726 #define IoReleaseRemoveLock(_RemoveLock, \
7728 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7732 * IoReleaseRemoveLockAndWait(
7733 * IN PIO_REMOVE_LOCK RemoveLock,
7736 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
7738 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7745 IN PIRP Irp OPTIONAL
);
7749 #define PLUGPLAY_REGKEY_DEVICE 1
7750 #define PLUGPLAY_REGKEY_DRIVER 2
7751 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
7755 IoGetCurrentIrpStackLocation(
7758 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
7759 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
7767 IoGetCurrentIrpStackLocation( (Irp
) )->Control
|= SL_PENDING_RETURNED
;
7772 * IoIsErrorUserInduced(
7773 * IN NTSTATUS Status);
7775 #define IoIsErrorUserInduced(Status) \
7776 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
7777 ((Status) == STATUS_IO_TIMEOUT) || \
7778 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
7779 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
7780 ((Status) == STATUS_VERIFY_REQUIRED) || \
7781 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
7782 ((Status) == STATUS_WRONG_VOLUME)))
7785 * IoInitializeRemoveLock(
7786 * IN PIO_REMOVE_LOCK Lock,
7787 * IN ULONG AllocateTag,
7788 * IN ULONG MaxLockedMinutes,
7789 * IN ULONG HighWatermark)
7791 #define IoInitializeRemoveLock( \
7792 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
7793 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
7794 HighWatermark, sizeof(IO_REMOVE_LOCK))
7798 IoInitializeDpcRequest(
7799 IN PDEVICE_OBJECT DeviceObject
,
7800 IN PIO_DPC_ROUTINE DpcRoutine
)
7802 KeInitializeDpc( &DeviceObject
->Dpc
,
7803 (PKDEFERRED_ROUTINE
) DpcRoutine
,
7807 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
7811 * IoGetFunctionCodeFromCtlCode(
7812 * IN ULONG ControlCode)
7814 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
7815 (((_ControlCode) >> 2) & 0x00000FFF)
7819 IoCopyCurrentIrpStackLocationToNext(
7822 PIO_STACK_LOCATION irpSp
;
7823 PIO_STACK_LOCATION nextIrpSp
;
7824 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
7825 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
7826 RtlCopyMemory( nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
7827 nextIrpSp
->Control
= 0;
7834 OUT PULONG_PTR LowLimit
,
7835 OUT PULONG_PTR HighLimit
);
7839 IoGetRemainingStackSize(
7842 ULONG_PTR End
, Begin
;
7845 IoGetStackLimits(&Begin
, &End
);
7846 Result
= (ULONG_PTR
)(&End
) - Begin
;
7851 /******************************************************************************
7852 * WINBASE Functions *
7853 ******************************************************************************/
7854 #if !defined(_WINBASE_)
7856 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
7860 InitializeSListHead(
7861 OUT PSLIST_HEADER SListHead
);
7867 InitializeSListHead(
7868 OUT PSLIST_HEADER SListHead
)
7871 ULONG64 FeatureBits
;
7875 if (((ULONG_PTR
)SListHead
& 0xf) != 0)
7877 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
7881 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
7884 FeatureBits
= __getReg(CV_IA64_CPUID4
);
7885 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0)
7887 SListHead
->Header16
.HeaderType
= 1;
7888 SListHead
->Header16
.Init
= 1;
7897 #define InterlockedPopEntrySList(Head) \
7898 ExpInterlockedPopEntrySList(Head)
7900 #define InterlockedPushEntrySList(Head, Entry) \
7901 ExpInterlockedPushEntrySList(Head, Entry)
7903 #define InterlockedFlushSList(Head) \
7904 ExpInterlockedFlushSList(Head)
7906 #define QueryDepthSList(Head) \
7907 ExQueryDepthSList(Head)
7909 #else // !defined(_WIN64)
7914 InterlockedPopEntrySList(
7915 IN PSLIST_HEADER ListHead
);
7920 InterlockedPushEntrySList(
7921 IN PSLIST_HEADER ListHead
,
7922 IN PSLIST_ENTRY ListEntry
);
7924 #define InterlockedFlushSList(ListHead) \
7925 ExInterlockedFlushSList(ListHead)
7927 #define QueryDepthSList(Head) \
7928 ExQueryDepthSList(Head)
7930 #endif // !defined(_WIN64)
7932 #endif // !defined(_WINBASE_)
7935 /******************************************************************************
7937 ******************************************************************************/
7939 #define EX_RUNDOWN_ACTIVE 0x1
7940 #define EX_RUNDOWN_COUNT_SHIFT 0x1
7941 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
7944 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
7946 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
7949 typedef enum _POOL_TYPE
{
7952 NonPagedPoolMustSucceed
,
7954 NonPagedPoolCacheAligned
,
7955 PagedPoolCacheAligned
,
7956 NonPagedPoolCacheAlignedMustS
,
7958 NonPagedPoolSession
= 32,
7960 NonPagedPoolMustSucceedSession
,
7961 DontUseThisTypeSession
,
7962 NonPagedPoolCacheAlignedSession
,
7963 PagedPoolCacheAlignedSession
,
7964 NonPagedPoolCacheAlignedMustSSession
7967 typedef enum _SUITE_TYPE
{
7971 CommunicationServer
,
7973 SmallBusinessRestricted
,
7982 typedef enum _EX_POOL_PRIORITY
{
7984 LowPoolPrioritySpecialPoolOverrun
= 8,
7985 LowPoolPrioritySpecialPoolUnderrun
= 9,
7986 NormalPoolPriority
= 16,
7987 NormalPoolPrioritySpecialPoolOverrun
= 24,
7988 NormalPoolPrioritySpecialPoolUnderrun
= 25,
7989 HighPoolPriority
= 32,
7990 HighPoolPrioritySpecialPoolOverrun
= 40,
7991 HighPoolPrioritySpecialPoolUnderrun
= 41
7994 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
7995 #define LOOKASIDE_ALIGN
7997 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
8000 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
8003 (DDKAPI
*PALLOCATE_FUNCTION
)(
8004 IN POOL_TYPE PoolType
,
8005 IN SIZE_T NumberOfBytes
,
8009 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
8010 IN POOL_TYPE PoolType
,
8011 IN SIZE_T NumberOfBytes
,
8013 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
8016 (DDKAPI
*PFREE_FUNCTION
)(
8020 (DDKAPI
*PFREE_FUNCTION_EX
)(
8022 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
8025 (DDKAPI
*PCALLBACK_FUNCTION
)(
8026 IN PVOID CallbackContext
,
8028 IN PVOID Argument2
);
8030 #define GENERAL_LOOKASIDE_LAYOUT \
8032 SLIST_HEADER ListHead; \
8033 SINGLE_LIST_ENTRY SingleListHead; \
8036 USHORT MaximumDepth; \
8037 ULONG TotalAllocates; \
8039 ULONG AllocateMisses; \
8040 ULONG AllocateHits; \
8041 } DUMMYUNIONNAME2; \
8047 } DUMMYUNIONNAME3; \
8053 PALLOCATE_FUNCTION_EX AllocateEx; \
8054 PALLOCATE_FUNCTION Allocate; \
8055 } DUMMYUNIONNAME4; \
8058 PFREE_FUNCTION_EX FreeEx; \
8059 PFREE_FUNCTION Free; \
8060 } DUMMYUNIONNAME5; \
8062 LIST_ENTRY ListEntry; \
8063 ULONG LastTotalAllocates; \
8065 ULONG LastAllocateMisses; \
8066 ULONG LastAllocateHits; \
8067 } DUMMYUNIONNAME6; \
8070 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
8071 GENERAL_LOOKASIDE_LAYOUT
8072 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
8074 typedef struct _GENERAL_LOOKASIDE_POOL
{
8075 GENERAL_LOOKASIDE_LAYOUT
8076 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
8078 typedef struct _PAGED_LOOKASIDE_LIST
{
8079 GENERAL_LOOKASIDE L
;
8080 #if !defined(_AMD64_) && !defined(_IA64_)
8081 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
8083 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
8085 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
8086 GENERAL_LOOKASIDE L
;
8087 #if !defined(_AMD64_) && !defined(_IA64_)
8088 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
8090 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
8092 typedef struct _LOOKASIDE_LIST_EX
{
8093 GENERAL_LOOKASIDE_POOL L
;
8094 } LOOKASIDE_LIST_EX
;
8096 typedef struct _EX_RUNDOWN_REF
{
8097 __GNU_EXTENSION
union {
8098 volatile ULONG_PTR Count
;
8101 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
8103 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
8106 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
8107 IN PVOID Parameter
);
8109 typedef struct _WORK_QUEUE_ITEM
{
8111 PWORKER_THREAD_ROUTINE WorkerRoutine
;
8112 volatile PVOID Parameter
;
8113 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
8116 /******************************************************************************
8117 * Executive Functions *
8118 ******************************************************************************/
8120 #define ExInitializeSListHead InitializeSListHead
8123 #if defined(_NTHAL_)
8124 #define ExAcquireFastMutex ExiAcquireFastMutex
8125 #define ExReleaseFastMutex ExiReleaseFastMutex
8126 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
8128 #define ExInterlockedAddUlong ExfInterlockedAddUlong
8129 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
8130 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
8131 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
8132 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
8133 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
8138 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
8139 defined(_NTHAL_) || defined(_NTOSP_)
8142 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
8146 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
8148 return (USHORT
)(ListHead
->Alignment
& 0xffff);
8154 ExpInterlockedFlushSList(
8155 PSLIST_HEADER ListHead
);
8159 ExpInterlockedPopEntrySList(
8160 PSLIST_HEADER ListHead
);
8164 ExpInterlockedPushEntrySList(
8165 PSLIST_HEADER ListHead
,
8166 PSLIST_ENTRY ListEntry
);
8168 #define ExInterlockedFlushSList(Head) \
8169 ExpInterlockedFlushSList(Head)
8170 #define ExInterlockedPopEntrySList(Head, Lock) \
8171 ExpInterlockedPopEntrySList(Head)
8172 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
8173 ExpInterlockedPushEntrySList(Head, Entry)
8175 #else // !defined(_WIN64)
8177 #define ExQueryDepthSList(listhead) (listhead)->Depth
8182 ExInterlockedFlushSList(
8183 IN PSLIST_HEADER ListHead
);
8185 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
8189 ExInterlockedPopEntrySList(
8190 IN PSLIST_HEADER ListHead
,
8191 IN PKSPIN_LOCK Lock
);
8196 ExInterlockedPushEntrySList(
8197 IN PSLIST_HEADER ListHead
,
8198 IN PSINGLE_LIST_ENTRY ListEntry
,
8199 IN PKSPIN_LOCK Lock
);
8201 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
8202 InterlockedPopEntrySList(_ListHead)
8203 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
8204 InterlockedPushEntrySList(_ListHead, _ListEntry)
8205 #endif // _WIN2K_COMPAT_SLIST_USAGE
8207 #endif // !defined(_WIN64)
8210 * ExGetCurrentResourceThread(
8213 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
8215 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
8218 * ExInitializeWorkItem(
8219 * IN PWORK_QUEUE_ITEM Item,
8220 * IN PWORKER_THREAD_ROUTINE Routine,
8223 #define ExInitializeWorkItem(Item, Routine, Context) \
8225 (Item)->WorkerRoutine = Routine; \
8226 (Item)->Parameter = Context; \
8227 (Item)->List.Flink = NULL; \
8232 ExInitializeFastMutex(
8233 OUT PFAST_MUTEX FastMutex
)
8235 FastMutex
->Count
= FM_LOCK_BIT
;
8236 FastMutex
->Owner
= NULL
;
8237 FastMutex
->Contention
= 0;
8238 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
8242 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8248 IN OUT PFAST_MUTEX FastMutex
);
8254 IN OUT PFAST_MUTEX FastMutex
);
8259 ExTryToAcquireFastMutex(
8260 IN OUT PFAST_MUTEX FastMutex
);
8265 ExAcquireFastMutexUnsafe(
8266 IN OUT PFAST_MUTEX FastMutex
);
8271 ExReleaseFastMutexUnsafe(
8272 IN OUT PFAST_MUTEX FastMutex
);
8277 ExAcquireResourceExclusiveLite(
8278 IN PERESOURCE Resource
,
8284 ExAcquireResourceSharedLite(
8285 IN PERESOURCE Resource
,
8291 ExAcquireSharedStarveExclusive(
8292 IN PERESOURCE Resource
,
8298 ExAcquireSharedWaitForExclusive(
8299 IN PERESOURCE Resource
,
8306 IN POOL_TYPE PoolType
,
8307 IN SIZE_T NumberOfBytes
);
8310 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
8311 #endif /* POOL_TAGGING */
8316 ExAllocatePoolWithQuota(
8317 IN POOL_TYPE PoolType
,
8318 IN SIZE_T NumberOfBytes
);
8321 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
8322 #endif /* POOL_TAGGING */
8327 ExAllocatePoolWithQuotaTag(
8328 IN POOL_TYPE PoolType
,
8329 IN SIZE_T NumberOfBytes
,
8332 #ifndef POOL_TAGGING
8333 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
8334 #endif /* POOL_TAGGING */
8339 ExAllocatePoolWithTag(
8340 IN POOL_TYPE PoolType
,
8341 IN SIZE_T NumberOfBytes
,
8347 ExAllocatePoolWithTagPriority(
8348 IN POOL_TYPE PoolType
,
8349 IN SIZE_T NumberOfBytes
,
8351 IN EX_POOL_PRIORITY Priority
);
8356 ExConvertExclusiveToSharedLite(
8357 IN PERESOURCE Resource
);
8363 OUT PCALLBACK_OBJECT
*CallbackObject
,
8364 IN POBJECT_ATTRIBUTES ObjectAttributes
,
8366 IN BOOLEAN AllowMultipleCallbacks
);
8371 ExDeleteNPagedLookasideList(
8372 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
8377 ExDeletePagedLookasideList(
8378 IN PPAGED_LOOKASIDE_LIST Lookaside
);
8383 ExDeleteResourceLite(
8384 IN PERESOURCE Resource
);
8393 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
8406 ExGetExclusiveWaiterCount(
8407 IN PERESOURCE Resource
);
8418 ExGetSharedWaiterCount(
8419 IN PERESOURCE Resource
);
8424 ExInitializeNPagedLookasideList(
8425 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
8426 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
8427 IN PFREE_FUNCTION Free OPTIONAL
,
8436 ExInitializePagedLookasideList(
8437 IN PPAGED_LOOKASIDE_LIST Lookaside
,
8438 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
8439 IN PFREE_FUNCTION Free OPTIONAL
,
8448 ExInitializeResourceLite(
8449 IN PERESOURCE Resource
);
8454 ExInterlockedAddLargeInteger(
8455 IN PLARGE_INTEGER Addend
,
8456 IN LARGE_INTEGER Increment
,
8457 IN PKSPIN_LOCK Lock
);
8460 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
8461 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
8463 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
8464 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
8470 ExInterlockedAddUlong(
8475 #if defined(_AMD64_) || defined(_IA64_)
8476 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
8477 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
8478 #elif defined(_X86_)
8482 ExfInterlockedCompareExchange64(
8483 IN OUT LONGLONG
volatile *Destination
,
8484 IN PLONGLONG Exchange
,
8485 IN PLONGLONG Comperand
);
8486 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
8487 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
8492 ExInterlockedCompareExchange64(
8493 IN OUT LONGLONG
volatile *Destination
,
8494 IN PLONGLONG Exchange
,
8495 IN PLONGLONG Comparand
,
8496 IN PKSPIN_LOCK Lock
);
8502 ExInterlockedInsertHeadList(
8503 IN PLIST_ENTRY ListHead
,
8504 IN PLIST_ENTRY ListEntry
,
8505 IN PKSPIN_LOCK Lock
);
8510 ExInterlockedInsertTailList(
8511 IN PLIST_ENTRY ListHead
,
8512 IN PLIST_ENTRY ListEntry
,
8513 IN PKSPIN_LOCK Lock
);
8518 ExInterlockedPopEntryList(
8519 IN PSINGLE_LIST_ENTRY ListHead
,
8520 IN PKSPIN_LOCK Lock
);
8525 ExInterlockedPushEntryList(
8526 IN PSINGLE_LIST_ENTRY ListHead
,
8527 IN PSINGLE_LIST_ENTRY ListEntry
,
8528 IN PKSPIN_LOCK Lock
);
8533 ExInterlockedRemoveHeadList(
8534 IN PLIST_ENTRY ListHead
,
8535 IN PKSPIN_LOCK Lock
);
8540 ExIsProcessorFeaturePresent(
8541 IN ULONG ProcessorFeature
);
8546 ExIsResourceAcquiredExclusiveLite(
8547 IN PERESOURCE Resource
);
8552 ExIsResourceAcquiredSharedLite(
8553 IN PERESOURCE Resource
);
8555 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
8560 ExLocalTimeToSystemTime(
8561 IN PLARGE_INTEGER LocalTime
,
8562 OUT PLARGE_INTEGER SystemTime
);
8568 IN PCALLBACK_OBJECT CallbackObject
,
8570 IN PVOID Argument2
);
8576 IN PWORK_QUEUE_ITEM WorkItem
,
8577 IN WORK_QUEUE_TYPE QueueType
);
8584 IN NTSTATUS Status
);
8590 IN PCALLBACK_OBJECT CallbackObject
,
8591 IN PCALLBACK_FUNCTION CallbackFunction
,
8592 IN PVOID CallbackContext
);
8597 ExReinitializeResourceLite(
8598 IN PERESOURCE Resource
);
8603 ExReleaseResourceForThreadLite(
8604 IN PERESOURCE Resource
,
8605 IN ERESOURCE_THREAD ResourceThreadId
);
8610 ExReleaseResourceLite(
8611 IN PERESOURCE Resource
);
8616 ExSetResourceOwnerPointer(
8617 IN PERESOURCE Resource
,
8618 IN PVOID OwnerPointer
);
8623 ExSetTimerResolution(
8624 IN ULONG DesiredTime
,
8625 IN BOOLEAN SetResolution
);
8630 ExSystemTimeToLocalTime(
8631 IN PLARGE_INTEGER SystemTime
,
8632 OUT PLARGE_INTEGER LocalTime
);
8637 ExUnregisterCallback(
8638 IN PVOID CbRegistration
);
8641 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
8643 #if (NTDDI_VERSION >= NTDDI_WINXP)
8647 ExAcquireRundownProtection(
8648 IN OUT PEX_RUNDOWN_REF RunRef
);
8653 ExInitializeRundownProtection(
8654 OUT PEX_RUNDOWN_REF RunRef
);
8659 ExReInitializeRundownProtection(
8660 OUT PEX_RUNDOWN_REF RunRef
);
8665 ExReleaseRundownProtection(
8666 IN OUT PEX_RUNDOWN_REF RunRef
);
8672 OUT PEX_RUNDOWN_REF RunRef
);
8678 IN SUITE_TYPE SuiteType
);
8683 ExWaitForRundownProtectionRelease(
8684 IN OUT PEX_RUNDOWN_REF RunRef
);
8686 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
8688 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
8692 ExAcquireRundownProtectionEx(
8693 IN OUT PEX_RUNDOWN_REF RunRef
,
8699 ExReleaseRundownProtectionEx(
8700 IN OUT PEX_RUNDOWN_REF RunRef
,
8702 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
8704 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8706 PEX_RUNDOWN_REF_CACHE_AWARE
8708 ExAllocateCacheAwareRundownProtection(
8709 IN POOL_TYPE PoolType
,
8715 ExSizeOfRundownProtectionCacheAware(VOID
);
8716 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
8718 #if (NTDDI_VERSION >= NTDDI_VISTA)
8722 ExInitializeLookasideListEx(
8723 OUT PLOOKASIDE_LIST_EX Lookaside
,
8724 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
8725 IN PFREE_FUNCTION_EX Free OPTIONAL
,
8726 IN POOL_TYPE PoolType
,
8733 #if !defined(MIDL_PASS)
8735 static __inline PVOID
8736 ExAllocateFromNPagedLookasideList(
8737 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
8741 Lookaside
->L
.TotalAllocates
++;
8742 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
8743 if (Entry
== NULL
) {
8744 Lookaside
->L
.AllocateMisses
++;
8745 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
8752 static __inline PVOID
8753 ExAllocateFromPagedLookasideList(
8754 IN PPAGED_LOOKASIDE_LIST Lookaside
)
8758 Lookaside
->L
.TotalAllocates
++;
8759 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
8760 if (Entry
== NULL
) {
8761 Lookaside
->L
.AllocateMisses
++;
8762 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
8769 static __inline VOID
8770 ExFreeToNPagedLookasideList(
8771 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
8774 Lookaside
->L
.TotalFrees
++;
8775 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
8776 Lookaside
->L
.FreeMisses
++;
8777 (Lookaside
->L
.Free
)(Entry
);
8779 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
8783 static __inline VOID
8784 ExFreeToPagedLookasideList(
8785 IN PPAGED_LOOKASIDE_LIST Lookaside
,
8788 Lookaside
->L
.TotalFrees
++;
8789 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
8790 Lookaside
->L
.FreeMisses
++;
8791 (Lookaside
->L
.Free
)(Entry
);
8793 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
8797 #endif // !defined(MIDL_PASS)
8800 /******************************************************************************
8802 ******************************************************************************/
8807 #ifndef __IID_ALIGNED__
8808 #define __IID_ALIGNED__
8810 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
8812 return ((*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) && (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)));
8815 #define IsEqualGUIDAligned(guid1, guid2) \
8816 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
8820 #define ES_SYSTEM_REQUIRED 0x00000001
8821 #define ES_DISPLAY_REQUIRED 0x00000002
8822 #define ES_USER_PRESENT 0x00000004
8823 #define ES_CONTINUOUS 0x80000000
8831 typedef ULONG EXECUTION_STATE
;
8834 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
8835 #define ZwCurrentProcess() NtCurrentProcess()
8836 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
8837 #define ZwCurrentThread() NtCurrentThread()
8839 #define METHOD_BUFFERED 0
8840 #define METHOD_IN_DIRECT 1
8841 #define METHOD_OUT_DIRECT 2
8842 #define METHOD_NEITHER 3
8844 #define LOW_PRIORITY 0
8845 #define LOW_REALTIME_PRIORITY 16
8846 #define HIGH_PRIORITY 31
8847 #define MAXIMUM_PRIORITY 32
8849 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
8851 #define MAXIMUM_FILENAME_LENGTH 256
8853 #define FILE_SUPERSEDED 0x00000000
8854 #define FILE_OPENED 0x00000001
8855 #define FILE_CREATED 0x00000002
8856 #define FILE_OVERWRITTEN 0x00000003
8857 #define FILE_EXISTS 0x00000004
8858 #define FILE_DOES_NOT_EXIST 0x00000005
8860 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
8861 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
8863 /* also in winnt.h */
8864 #define FILE_LIST_DIRECTORY 0x00000001
8865 #define FILE_READ_DATA 0x00000001
8866 #define FILE_ADD_FILE 0x00000002
8867 #define FILE_WRITE_DATA 0x00000002
8868 #define FILE_ADD_SUBDIRECTORY 0x00000004
8869 #define FILE_APPEND_DATA 0x00000004
8870 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
8871 #define FILE_READ_EA 0x00000008
8872 #define FILE_WRITE_EA 0x00000010
8873 #define FILE_EXECUTE 0x00000020
8874 #define FILE_TRAVERSE 0x00000020
8875 #define FILE_DELETE_CHILD 0x00000040
8876 #define FILE_READ_ATTRIBUTES 0x00000080
8877 #define FILE_WRITE_ATTRIBUTES 0x00000100
8879 #define FILE_SHARE_READ 0x00000001
8880 #define FILE_SHARE_WRITE 0x00000002
8881 #define FILE_SHARE_DELETE 0x00000004
8882 #define FILE_SHARE_VALID_FLAGS 0x00000007
8884 #define FILE_ATTRIBUTE_READONLY 0x00000001
8885 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
8886 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
8887 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
8888 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
8889 #define FILE_ATTRIBUTE_DEVICE 0x00000040
8890 #define FILE_ATTRIBUTE_NORMAL 0x00000080
8891 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
8892 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
8893 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
8894 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
8895 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
8896 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
8897 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
8899 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
8900 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
8902 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
8903 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
8904 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
8905 #define FILE_VALID_SET_FLAGS 0x00000036
8907 #define FILE_SUPERSEDE 0x00000000
8908 #define FILE_OPEN 0x00000001
8909 #define FILE_CREATE 0x00000002
8910 #define FILE_OPEN_IF 0x00000003
8911 #define FILE_OVERWRITE 0x00000004
8912 #define FILE_OVERWRITE_IF 0x00000005
8913 #define FILE_MAXIMUM_DISPOSITION 0x00000005
8915 #define FILE_DIRECTORY_FILE 0x00000001
8916 #define FILE_WRITE_THROUGH 0x00000002
8917 #define FILE_SEQUENTIAL_ONLY 0x00000004
8918 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
8919 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
8920 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
8921 #define FILE_NON_DIRECTORY_FILE 0x00000040
8922 #define FILE_CREATE_TREE_CONNECTION 0x00000080
8923 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
8924 #define FILE_NO_EA_KNOWLEDGE 0x00000200
8925 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
8926 #define FILE_RANDOM_ACCESS 0x00000800
8927 #define FILE_DELETE_ON_CLOSE 0x00001000
8928 #define FILE_OPEN_BY_FILE_ID 0x00002000
8929 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
8930 #define FILE_NO_COMPRESSION 0x00008000
8931 #define FILE_RESERVE_OPFILTER 0x00100000
8932 #define FILE_OPEN_REPARSE_POINT 0x00200000
8933 #define FILE_OPEN_NO_RECALL 0x00400000
8934 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
8936 #define FILE_ANY_ACCESS 0x00000000
8937 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
8938 #define FILE_READ_ACCESS 0x00000001
8939 #define FILE_WRITE_ACCESS 0x00000002
8941 #define FILE_ALL_ACCESS \
8942 (STANDARD_RIGHTS_REQUIRED | \
8946 #define FILE_GENERIC_EXECUTE \
8947 (STANDARD_RIGHTS_EXECUTE | \
8948 FILE_READ_ATTRIBUTES | \
8952 #define FILE_GENERIC_READ \
8953 (STANDARD_RIGHTS_READ | \
8955 FILE_READ_ATTRIBUTES | \
8959 #define FILE_GENERIC_WRITE \
8960 (STANDARD_RIGHTS_WRITE | \
8962 FILE_WRITE_ATTRIBUTES | \
8964 FILE_APPEND_DATA | \
8969 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
8971 #define OBJECT_TYPE_CREATE (0x0001)
8972 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
8974 #define DIRECTORY_QUERY (0x0001)
8975 #define DIRECTORY_TRAVERSE (0x0002)
8976 #define DIRECTORY_CREATE_OBJECT (0x0004)
8977 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
8978 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
8980 #define EVENT_QUERY_STATE (0x0001)
8981 #define EVENT_MODIFY_STATE (0x0002)
8982 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
8984 #define SEMAPHORE_QUERY_STATE (0x0001)
8985 #define SEMAPHORE_MODIFY_STATE (0x0002)
8986 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
8990 ** System structures
8993 #define SYMBOLIC_LINK_QUERY 0x0001
8994 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
8996 /* also in winnt,h */
8997 #define DUPLICATE_CLOSE_SOURCE 0x00000001
8998 #define DUPLICATE_SAME_ACCESS 0x00000002
8999 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
9002 typedef struct _OBJECT_NAME_INFORMATION
{
9003 UNICODE_STRING Name
;
9004 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
9006 /* Global debug flag */
9007 extern ULONG NtGlobalFlag
;
9009 #define PROCESS_DUP_HANDLE (0x0040)
9011 #if (NTDDI_VERSION >= NTDDI_VISTA)
9012 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
9015 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
9020 #if defined(_M_IX86)
9021 #define YieldProcessor _mm_pause
9022 #elif defined (_M_AMD64)
9023 #define YieldProcessor _mm_pause
9024 #elif defined(_M_PPC)
9025 #define YieldProcessor() __asm__ __volatile__("nop");
9026 #elif defined(_M_MIPS)
9027 #define YieldProcessor() __asm__ __volatile__("nop");
9028 #elif defined(_M_ARM)
9029 #define YieldProcessor()
9031 #error Unknown architecture
9034 /* Thread Access Rights */
9035 #define THREAD_TERMINATE (0x0001)
9036 #define THREAD_SUSPEND_RESUME (0x0002)
9037 #define THREAD_ALERT (0x0004)
9038 #define THREAD_GET_CONTEXT (0x0008)
9039 #define THREAD_SET_CONTEXT (0x0010)
9040 #define THREAD_SET_INFORMATION (0x0020)
9041 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
9042 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
9043 #if (NTDDI_VERSION >= NTDDI_VISTA)
9044 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
9047 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
9051 /* Service Start Types */
9052 #define SERVICE_BOOT_START 0x00000000
9053 #define SERVICE_SYSTEM_START 0x00000001
9054 #define SERVICE_AUTO_START 0x00000002
9055 #define SERVICE_DEMAND_START 0x00000003
9056 #define SERVICE_DISABLED 0x00000004
9058 /* Process Qoutas */
9059 typedef struct _QUOTA_LIMITS
{
9060 SIZE_T PagedPoolLimit
;
9061 SIZE_T NonPagedPoolLimit
;
9062 SIZE_T MinimumWorkingSetSize
;
9063 SIZE_T MaximumWorkingSetSize
;
9064 SIZE_T PagefileLimit
;
9065 LARGE_INTEGER TimeLimit
;
9066 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
9068 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
9069 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
9070 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
9071 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
9072 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
9074 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
9075 #if defined(_NTSYSTEM_) || defined(__GNUC__)
9076 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
9077 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
9079 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
9080 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
9081 #endif /* _NT_SYSTEM */
9082 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG
;
9083 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG
;