4 * Windows NT WDM Driver Developer Kit
6 * This file is part of the ReactOS DDK package.
10 * Timo Kreuzer (timo.kreuzer@reactos.org)
12 * THIS SOFTWARE IS NOT COPYRIGHTED
14 * This source code is offered for use in the public domain. You may
15 * use, modify or distribute it freely.
17 * This code is distributed in the hope that it will be useful but
18 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
19 * DISCLAIMED. This includes but is not limited to warranties of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
28 /* Included via ntddk.h? */
31 #define _WDM_INCLUDED_
33 #define NO_INTERLOCKED_INTRINSICS
44 #endif /* GUID_DEFINED */
52 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
53 #define NTHALAPI DECLSPEC_IMPORT
59 #if !defined(_NTOSKRNL_) && !defined(_BLDR_)
60 #define NTKERNELAPI DECLSPEC_IMPORT
66 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
68 #define POINTER_ALIGNMENT
71 /* Helper macro to enable gcc's extension. */
72 #ifndef __GNU_EXTENSION
74 #define __GNU_EXTENSION __extension__
76 #define __GNU_EXTENSION
82 /* Indicate if #pragma alloc_text() is supported */
83 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
84 #define ALLOC_PRAGMA 1
87 /* Indicate if #pragma data_seg() is supported */
88 #if defined(_M_IX86) || defined(_M_AMD64)
89 #define ALLOC_DATA_PRAGMA 1
94 /* Forward declarations */
101 struct _DEVICE_OBJECT
;
102 struct _DRIVER_OBJECT
;
103 struct _IO_STATUS_BLOCK
;
104 struct _DEVICE_DESCRIPTION
;
105 struct _SCATTER_GATHER_LIST
;
106 struct _DRIVE_LAYOUT_INFORMATION
;
107 struct _COMPRESSED_DATA_INFO
;
108 struct _IO_RESOURCE_DESCRIPTOR
;
110 /* Structures not exposed to drivers */
111 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
112 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
113 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
114 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
115 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
116 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
117 typedef struct _ETHREAD
*PETHREAD
;
118 typedef struct _EPROCESS
*PEPROCESS
;
119 typedef struct _IO_TIMER
*PIO_TIMER
;
120 typedef struct _KINTERRUPT
*PKINTERRUPT
;
121 typedef struct _KPROCESS
*PKPROCESS
;
122 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
123 typedef struct _CONTEXT
*PCONTEXT
;
126 /******************************************************************************
127 * INTERLOCKED Functions *
128 ******************************************************************************/
130 // Intrinsics (note: taken from our winnt.h)
133 #if defined(__GNUC__)
135 static __inline__ BOOLEAN
136 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
141 __asm__
__volatile__("lock "
144 :"=r" (OldBit
),"+m" (*Base
)
149 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
153 static __inline__ BOOLEAN
154 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
159 __asm__
__volatile__("lock "
162 :"=r" (OldBit
),"+m" (*Base
)
167 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
173 #define BitScanForward _BitScanForward
174 #define BitScanReverse _BitScanReverse
175 #define BitTest _bittest
176 #define BitTestAndComplement _bittestandcomplement
177 #define BitTestAndSet _bittestandset
178 #define BitTestAndReset _bittestandreset
179 #define InterlockedBitTestAndSet _interlockedbittestandset
180 #define InterlockedBitTestAndReset _interlockedbittestandreset
183 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
184 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
187 #if !defined(__INTERLOCKED_DECLARED)
188 #define __INTERLOCKED_DECLARED
191 #if defined(NO_INTERLOCKED_INTRINSICS)
195 InterlockedIncrement(
196 IN OUT LONG
volatile *Addend
);
201 InterlockedDecrement(
202 IN OUT LONG
volatile *Addend
);
207 InterlockedCompareExchange(
208 IN OUT LONG
volatile *Destination
,
216 IN OUT LONG
volatile *Destination
,
222 InterlockedExchangeAdd(
223 IN OUT LONG
volatile *Addend
,
226 #else // !defined(NO_INTERLOCKED_INTRINSICS)
228 #define InterlockedExchange _InterlockedExchange
229 #define InterlockedIncrement _InterlockedIncrement
230 #define InterlockedDecrement _InterlockedDecrement
231 #define InterlockedExchangeAdd _InterlockedExchangeAdd
232 #define InterlockedCompareExchange _InterlockedCompareExchange
233 #define InterlockedOr _InterlockedOr
234 #define InterlockedAnd _InterlockedAnd
235 #define InterlockedXor _InterlockedXor
237 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
239 #endif // defined (_X86_)
241 #if !defined (_WIN64)
244 * InterlockedExchangePointer(
245 * IN OUT PVOID volatile *Target,
248 #define InterlockedExchangePointer(Target, Value) \
249 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
253 * InterlockedCompareExchangePointer(
254 * IN OUT PVOID *Destination,
256 * IN PVOID Comparand)
258 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
259 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
261 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
262 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
263 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
265 #endif // !defined (_WIN64)
267 #if defined (_M_AMD64)
269 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
270 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
271 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
272 #define InterlockedAnd _InterlockedAnd
273 #define InterlockedOr _InterlockedOr
274 #define InterlockedXor _InterlockedXor
275 #define InterlockedIncrement _InterlockedIncrement
276 #define InterlockedDecrement _InterlockedDecrement
277 #define InterlockedAdd _InterlockedAdd
278 #define InterlockedExchange _InterlockedExchange
279 #define InterlockedExchangeAdd _InterlockedExchangeAdd
280 #define InterlockedCompareExchange _InterlockedCompareExchange
281 #define InterlockedAnd64 _InterlockedAnd64
282 #define InterlockedOr64 _InterlockedOr64
283 #define InterlockedXor64 _InterlockedXor64
284 #define InterlockedIncrement64 _InterlockedIncrement64
285 #define InterlockedDecrement64 _InterlockedDecrement64
286 #define InterlockedAdd64 _InterlockedAdd64
287 #define InterlockedExchange64 _InterlockedExchange64
288 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
289 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
290 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
291 #define InterlockedExchangePointer _InterlockedExchangePointer
292 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
293 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
297 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
298 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
302 IN OUT LONG64
volatile *Addend
,
305 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
310 #endif /* !__INTERLOCKED_DECLARED */
313 /******************************************************************************
315 ******************************************************************************/
317 typedef UCHAR KIRQL
, *PKIRQL
;
318 typedef CCHAR KPROCESSOR_MODE
;
319 typedef LONG KPRIORITY
;
321 typedef ULONG EXECUTION_STATE
;
329 /* Processor features */
330 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
331 #define PF_FLOATING_POINT_EMULATED 1
332 #define PF_COMPARE_EXCHANGE_DOUBLE 2
333 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
334 #define PF_PPC_MOVEMEM_64BIT_OK 4
335 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
336 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
337 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
338 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
339 #define PF_PAE_ENABLED 9
340 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
341 #define PF_SSE_DAZ_MODE_AVAILABLE 11
342 #define PF_NX_ENABLED 12
343 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
344 #define PF_COMPARE_EXCHANGE128 14
345 #define PF_COMPARE64_EXCHANGE128 15
346 #define PF_CHANNELS_ENABLED 16
347 #define PF_XSAVE_ENABLED 17
349 #define MAXIMUM_SUPPORTED_EXTENSION 512
350 #define MAXIMUM_WAIT_OBJECTS 64
352 #define ASSERT_APC(Object) \
353 ASSERT((Object)->Type == ApcObject)
355 #define ASSERT_DPC(Object) \
356 ASSERT(((Object)->Type == 0) || \
357 ((Object)->Type == DpcObject) || \
358 ((Object)->Type == ThreadedDpcObject))
360 #define ASSERT_DEVICE_QUEUE(Object) \
361 ASSERT((Object)->Type == DeviceQueueObject)
364 #define DPC_THREADED 1
366 #define GM_LOCK_BIT 0x1
367 #define GM_LOCK_BIT_V 0x0
368 #define GM_LOCK_WAITER_WOKEN 0x2
369 #define GM_LOCK_WAITER_INC 0x4
371 #define LOCK_QUEUE_WAIT 1
372 #define LOCK_QUEUE_OWNER 2
373 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
374 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
376 #define PROCESSOR_FEATURE_MAX 64
378 #define DBG_STATUS_CONTROL_C 1
379 #define DBG_STATUS_SYSRQ 2
380 #define DBG_STATUS_BUGCHECK_FIRST 3
381 #define DBG_STATUS_BUGCHECK_SECOND 4
382 #define DBG_STATUS_FATAL 5
383 #define DBG_STATUS_DEBUG_CONTROL 6
384 #define DBG_STATUS_WORKER 7
386 #define KI_USER_SHARED_DATA 0xffdf0000
387 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
389 #define EFLAG_SIGN 0x8000
390 #define EFLAG_ZERO 0x4000
391 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
393 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
394 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
395 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
398 #define MAXIMUM_PROC_PER_GROUP 64
400 #define MAXIMUM_PROC_PER_GROUP 32
402 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
405 #define KIP0PCRADDRESS 0xffdff000
410 #define PASSIVE_LEVEL 0
413 #define DISPATCH_LEVEL 2
415 #define PROFILE_LEVEL 27
416 #define CLOCK1_LEVEL 28
417 #define CLOCK2_LEVEL 28
419 #define POWER_LEVEL 30
420 #define HIGH_LEVEL 31
421 #define CLOCK_LEVEL (CLOCK2_LEVEL)
423 typedef struct _KFLOATING_SAVE
{
432 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
438 #define PASSIVE_LEVEL 0
441 #define DISPATCH_LEVEL 2
443 #define CLOCK_LEVEL 13
446 #define POWER_LEVEL 14
447 #define PROFILE_LEVEL 15
448 #define HIGH_LEVEL 15
454 #define PASSIVE_LEVEL 0
457 #define DISPATCH_LEVEL 2
459 #define DEVICE_LEVEL_BASE 4
463 #define CLOCK_LEVEL 13
464 #define POWER_LEVEL 15
465 #define PROFILE_LEVEL 15
466 #define HIGH_LEVEL 15
470 /* Exception Records */
471 #define EXCEPTION_NONCONTINUABLE 1
472 #define EXCEPTION_MAXIMUM_PARAMETERS 15
474 typedef struct _EXCEPTION_RECORD
{
475 NTSTATUS ExceptionCode
;
476 ULONG ExceptionFlags
;
477 struct _EXCEPTION_RECORD
*ExceptionRecord
;
478 PVOID ExceptionAddress
;
479 ULONG NumberParameters
;
480 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
481 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
483 typedef struct _EXCEPTION_RECORD32
{
484 NTSTATUS ExceptionCode
;
485 ULONG ExceptionFlags
;
486 ULONG ExceptionRecord
;
487 ULONG ExceptionAddress
;
488 ULONG NumberParameters
;
489 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
490 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
492 typedef struct _EXCEPTION_RECORD64
{
493 NTSTATUS ExceptionCode
;
494 ULONG ExceptionFlags
;
495 ULONG64 ExceptionRecord
;
496 ULONG64 ExceptionAddress
;
497 ULONG NumberParameters
;
498 ULONG __unusedAlignment
;
499 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
500 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
502 typedef struct _EXCEPTION_POINTERS
{
503 PEXCEPTION_RECORD ExceptionRecord
;
504 PCONTEXT ContextRecord
;
505 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
508 typedef enum _KBUGCHECK_CALLBACK_REASON
{
511 KbCallbackSecondaryDumpData
,
514 } KBUGCHECK_CALLBACK_REASON
;
516 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
519 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
520 IN KBUGCHECK_CALLBACK_REASON Reason
,
521 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
522 IN OUT PVOID ReasonSpecificData
,
523 IN ULONG ReasonSpecificDataLength
);
525 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
527 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
530 KBUGCHECK_CALLBACK_REASON Reason
;
532 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
534 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
540 } KBUGCHECK_BUFFER_DUMP_STATE
;
543 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
547 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
549 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
555 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
558 (DDKAPI
*PNMI_CALLBACK
)(
562 typedef enum _KDPC_IMPORTANCE
{
569 typedef enum _TRACE_INFORMATION_CLASS
{
572 TraceEnableFlagsClass
,
573 TraceEnableLevelClass
,
574 GlobalLoggerHandleClass
,
575 EventLoggerHandleClass
,
576 AllLoggerHandlesClass
,
577 TraceHandleByNameClass
,
578 LoggerEventsLostClass
,
579 TraceSessionSettingsClass
,
580 LoggerEventsLoggedClass
,
581 MaxTraceInformationClass
582 } TRACE_INFORMATION_CLASS
;
584 typedef enum _KINTERRUPT_POLARITY
{
585 InterruptPolarityUnknown
,
588 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
590 typedef enum _KPROFILE_SOURCE
{
592 ProfileAlignmentFixup
,
595 ProfileLoadInstructions
,
596 ProfilePipelineFrozen
,
597 ProfileBranchInstructions
,
598 ProfileTotalNonissues
,
602 ProfileBranchMispredictions
,
603 ProfileStoreInstructions
,
604 ProfileFpInstructions
,
605 ProfileIntegerInstructions
,
609 ProfileSpecialInstructions
,
612 ProfileDcacheAccesses
,
613 ProfileMemoryBarrierCycles
,
614 ProfileLoadLinkedIssues
,
618 typedef enum _KWAIT_REASON
{
659 typedef struct _KWAIT_BLOCK
{
660 LIST_ENTRY WaitListEntry
;
661 struct _KTHREAD
*Thread
;
663 struct _KWAIT_BLOCK
*NextWaitBlock
;
666 volatile UCHAR BlockState
;
670 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
672 typedef enum _KINTERRUPT_MODE
{
677 #define THREAD_WAIT_OBJECTS 3
680 (DDKAPI
*PKINTERRUPT_ROUTINE
)(
683 typedef enum _KD_OPTION
{
684 KD_OPTION_SET_BLOCK_ENABLE
,
687 typedef enum _INTERFACE_TYPE
{
688 InterfaceTypeUndefined
= -1,
707 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
710 (DDKAPI
*PKNORMAL_ROUTINE
)(
711 IN PVOID NormalContext
,
712 IN PVOID SystemArgument1
,
713 IN PVOID SystemArgument2
);
716 (DDKAPI
*PKRUNDOWN_ROUTINE
)(
717 IN
struct _KAPC
*Apc
);
720 (DDKAPI
*PKKERNEL_ROUTINE
)(
721 IN
struct _KAPC
*Apc
,
722 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
723 IN OUT PVOID
*NormalContext
,
724 IN OUT PVOID
*SystemArgument1
,
725 IN OUT PVOID
*SystemArgument2
);
734 struct _KTHREAD
*Thread
;
735 LIST_ENTRY ApcListEntry
;
736 PKKERNEL_ROUTINE KernelRoutine
;
737 PKRUNDOWN_ROUTINE RundownRoutine
;
738 PKNORMAL_ROUTINE NormalRoutine
;
740 PVOID SystemArgument1
;
741 PVOID SystemArgument2
;
743 KPROCESSOR_MODE ApcMode
;
745 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
747 typedef struct _KDEVICE_QUEUE_ENTRY
{
748 LIST_ENTRY DeviceListEntry
;
751 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
752 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
754 typedef PVOID PKIPI_CONTEXT
;
758 (NTAPI
*PKIPI_WORKER
)(
759 IN PKIPI_CONTEXT PacketContext
,
767 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
768 IN ULONG_PTR Argument
);
770 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
772 typedef struct _KSPIN_LOCK_QUEUE
{
773 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
774 PKSPIN_LOCK
volatile Lock
;
775 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
777 typedef struct _KLOCK_QUEUE_HANDLE
{
778 KSPIN_LOCK_QUEUE LockQueue
;
780 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
784 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
786 #define LockQueueDispatcherLock 0
787 #define LockQueueExpansionLock 1
788 #define LockQueuePfnLock 2
789 #define LockQueueSystemSpaceLock 3
790 #define LockQueueVacbLock 4
791 #define LockQueueMasterLock 5
792 #define LockQueueNonPagedPoolLock 6
793 #define LockQueueIoCancelLock 7
794 #define LockQueueWorkQueueLock 8
795 #define LockQueueIoVpbLock 9
796 #define LockQueueIoDatabaseLock 10
797 #define LockQueueIoCompletionLock 11
798 #define LockQueueNtfsStructLock 12
799 #define LockQueueAfdWorkQueueLock 13
800 #define LockQueueBcbLock 14
801 #define LockQueueMmNonPagedPoolLock 15
802 #define LockQueueUnusedSpare16 16
803 #define LockQueueTimerTableLock 17
804 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
808 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
809 LockQueueDispatcherLock
,
810 LockQueueExpansionLock
,
812 LockQueueSystemSpaceLock
,
815 LockQueueNonPagedPoolLock
,
816 LockQueueIoCancelLock
,
817 LockQueueWorkQueueLock
,
819 LockQueueIoDatabaseLock
,
820 LockQueueIoCompletionLock
,
821 LockQueueNtfsStructLock
,
822 LockQueueAfdWorkQueueLock
,
824 LockQueueMmNonPagedPoolLock
,
825 LockQueueUnusedSpare16
,
826 LockQueueTimerTableLock
,
827 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
828 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
833 (DDKAPI
*PKDEFERRED_ROUTINE
)(
834 IN
struct _KDPC
*Dpc
,
835 IN PVOID DeferredContext
,
836 IN PVOID SystemArgument1
,
837 IN PVOID SystemArgument2
);
843 volatile USHORT Number
;
844 LIST_ENTRY DpcListEntry
;
845 PKDEFERRED_ROUTINE DeferredRoutine
;
846 PVOID DeferredContext
;
847 PVOID SystemArgument1
;
848 PVOID SystemArgument2
;
849 volatile PVOID DpcData
;
850 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
852 typedef struct _KDPC_WATCHDOG_INFORMATION
{
855 ULONG DpcWatchdogLimit
;
856 ULONG DpcWatchdogCount
;
858 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
860 typedef struct _KDEVICE_QUEUE
{
863 LIST_ENTRY DeviceListHead
;
877 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
879 #define TIMER_EXPIRED_INDEX_BITS 6
880 #define TIMER_PROCESSOR_INDEX_BITS 5
881 typedef struct _DISPATCHER_HEADER
{
882 _ANONYMOUS_UNION
union {
883 _ANONYMOUS_STRUCT
struct {
885 _ANONYMOUS_UNION
union {
886 _ANONYMOUS_UNION
union {
887 UCHAR TimerControlFlags
;
888 _ANONYMOUS_STRUCT
struct {
891 UCHAR KeepShifting
:1;
892 UCHAR EncodedTolerableDelay
:5;
896 #if (NTDDI_VERSION < NTDDI_WIN7)
901 _ANONYMOUS_UNION
union {
902 _ANONYMOUS_UNION
union {
903 UCHAR ThreadControlFlags
;
904 _ANONYMOUS_STRUCT
struct {
905 UCHAR CpuThrottled
:1;
906 UCHAR CycleProfiling
:1;
907 UCHAR CounterProfiling
:1;
914 _ANONYMOUS_UNION
union {
915 #if (NTDDI_VERSION >= NTDDI_WIN7)
916 _ANONYMOUS_UNION
union {
917 UCHAR TimerMiscFlags
;
918 _ANONYMOUS_STRUCT
struct {
920 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
923 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
926 volatile UCHAR Expired
:1;
930 /* Pre Win7 compatibility fix to latest WDK */
933 _ANONYMOUS_UNION
union {
935 _ANONYMOUS_STRUCT
struct {
937 BOOLEAN Instrumented
:1;
939 BOOLEAN UmsScheduled
:1;
940 BOOLEAN UmsPrimary
:1;
942 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
949 LIST_ENTRY WaitListHead
;
950 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
952 typedef struct _KGATE
954 DISPATCHER_HEADER Header
;
955 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
957 typedef struct _KGUARDED_MUTEX
963 __GNU_EXTENSION
union
965 __GNU_EXTENSION
struct
967 SHORT KernelApcDisable
;
968 SHORT SpecialApcDisable
;
970 ULONG CombinedApcDisable
;
972 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
974 typedef struct _KMUTANT
{
975 DISPATCHER_HEADER Header
;
976 LIST_ENTRY MutantListEntry
;
977 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
980 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
982 typedef struct _KTIMER
{
983 DISPATCHER_HEADER Header
;
984 ULARGE_INTEGER DueTime
;
985 LIST_ENTRY TimerListEntry
;
991 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
994 (DDKAPI
*PKSYNCHRONIZE_ROUTINE
)(
995 IN PVOID SynchronizeContext
);
997 typedef enum _POOL_TYPE
{
1000 NonPagedPoolMustSucceed
,
1002 NonPagedPoolCacheAligned
,
1003 PagedPoolCacheAligned
,
1004 NonPagedPoolCacheAlignedMustS
,
1006 NonPagedPoolSession
= 32,
1008 NonPagedPoolMustSucceedSession
,
1009 DontUseThisTypeSession
,
1010 NonPagedPoolCacheAlignedSession
,
1011 PagedPoolCacheAlignedSession
,
1012 NonPagedPoolCacheAlignedMustSSession
1015 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
1020 } ALTERNATIVE_ARCHITECTURE_TYPE
;
1022 typedef struct _KSYSTEM_TIME
1027 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
1029 typedef struct _KEVENT
{
1030 DISPATCHER_HEADER Header
;
1031 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1033 typedef struct _KSEMAPHORE
{
1034 DISPATCHER_HEADER Header
;
1036 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1038 typedef struct _PNP_BUS_INFORMATION
{
1040 INTERFACE_TYPE LegacyBusType
;
1042 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
1044 typedef struct DECLSPEC_ALIGN(16) _M128A
{
1049 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
1056 USHORT ErrorSelector
;
1059 USHORT DataSelector
;
1063 M128A FloatRegisters
[8];
1067 M128A XmmRegisters
[16];
1068 UCHAR Reserved4
[96];
1072 M128A XmmRegisters
[8];
1073 UCHAR Reserved4
[192];
1075 ULONG StackControl
[7];
1080 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
1084 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
1089 /******************************************************************************
1090 * Kernel Functions *
1091 ******************************************************************************/
1105 IN OUT PRKEVENT Event
);
1107 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1109 #if defined(SINGLE_GROUP_LEGACY_API)
1113 KeRevertToUserAffinityThread(VOID
);
1118 KeSetSystemAffinityThread(
1119 IN KAFFINITY Affinity
);
1124 KeSetTargetProcessorDpc(
1131 KeQueryActiveProcessors(
1135 #if !defined(_M_AMD64)
1139 KeQueryInterruptTime(
1146 OUT PLARGE_INTEGER CurrentTime
);
1147 #endif /* !_M_AMD64 */
1154 IN ULONG BugCheckCode
,
1155 IN ULONG_PTR BugCheckParameter1
,
1156 IN ULONG_PTR BugCheckParameter2
,
1157 IN ULONG_PTR BugCheckParameter3
,
1158 IN ULONG_PTR BugCheckParameter4
);
1169 KeDelayExecutionThread(
1170 IN KPROCESSOR_MODE WaitMode
,
1171 IN BOOLEAN Alertable
,
1172 IN PLARGE_INTEGER Interval
);
1177 KeDeregisterBugCheckCallback(
1178 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
1183 KeEnterCriticalRegion(VOID
);
1188 KeInitializeDeviceQueue(
1189 OUT PKDEVICE_QUEUE DeviceQueue
);
1196 IN PKDEFERRED_ROUTINE DeferredRoutine
,
1197 IN PVOID DeferredContext OPTIONAL
);
1209 KeInitializeSemaphore(
1210 OUT PRKSEMAPHORE Semaphore
,
1223 KeInitializeTimerEx(
1225 IN TIMER_TYPE Type
);
1230 KeInsertByKeyDeviceQueue(
1231 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1232 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
1238 KeInsertDeviceQueue(
1239 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1240 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
1247 IN PVOID SystemArgument1 OPTIONAL
,
1248 IN PVOID SystemArgument2 OPTIONAL
);
1253 KeLeaveCriticalRegion(VOID
);
1258 KeQueryPerformanceCounter(
1259 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
1264 KeQueryPriorityThread(
1265 IN PRKTHREAD Thread
);
1270 KeQueryTimeIncrement(
1289 KeReadStateSemaphore(
1290 IN PRKSEMAPHORE Semaphore
);
1301 KeRegisterBugCheckCallback(
1302 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
1303 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
1306 IN PUCHAR Component
);
1312 IN OUT PRKMUTEX Mutex
,
1319 IN OUT PRKSEMAPHORE Semaphore
,
1320 IN KPRIORITY Increment
,
1325 PKDEVICE_QUEUE_ENTRY
1327 KeRemoveByKeyDeviceQueue(
1328 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1332 PKDEVICE_QUEUE_ENTRY
1334 KeRemoveDeviceQueue(
1335 IN OUT PKDEVICE_QUEUE DeviceQueue
);
1340 KeRemoveEntryDeviceQueue(
1341 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1342 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
1354 IN OUT PRKEVENT Event
);
1360 IN OUT PRKEVENT Event
,
1361 IN KPRIORITY Increment
,
1369 IN KDPC_IMPORTANCE Importance
);
1374 KeSetPriorityThread(
1375 IN OUT PKTHREAD Thread
,
1376 IN KPRIORITY Priority
);
1382 IN OUT PKTIMER Timer
,
1383 IN LARGE_INTEGER DueTime
,
1384 IN PKDPC Dpc OPTIONAL
);
1390 IN OUT PKTIMER Timer
,
1391 IN LARGE_INTEGER DueTime
,
1392 IN LONG Period OPTIONAL
,
1393 IN PKDPC Dpc OPTIONAL
);
1398 KeStallExecutionProcessor(
1399 IN ULONG MicroSeconds
);
1404 KeSynchronizeExecution(
1405 IN OUT PKINTERRUPT Interrupt
,
1406 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
1407 IN PVOID SynchronizeContext OPTIONAL
);
1412 KeWaitForMultipleObjects(
1415 IN WAIT_TYPE WaitType
,
1416 IN KWAIT_REASON WaitReason
,
1417 IN KPROCESSOR_MODE WaitMode
,
1418 IN BOOLEAN Alertable
,
1419 IN PLARGE_INTEGER Timeout OPTIONAL
,
1420 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
1422 #define KeWaitForMutexObject KeWaitForSingleObject
1427 KeWaitForSingleObject(
1429 IN KWAIT_REASON WaitReason
,
1430 IN KPROCESSOR_MODE WaitMode
,
1431 IN BOOLEAN Alertable
,
1432 IN PLARGE_INTEGER Timeout OPTIONAL
);
1434 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1436 #if (NTDDI_VERSION >= NTDDI_WINXP)
1438 // _DECL_HAL_KE_IMPORT
1441 KeAcquireInStackQueuedSpinLock(
1442 IN OUT PKSPIN_LOCK SpinLock
,
1443 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1448 KeAcquireInStackQueuedSpinLockAtDpcLevel(
1449 IN OUT PKSPIN_LOCK SpinLock
,
1450 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1455 KeAcquireInterruptSpinLock(
1456 IN OUT PKINTERRUPT Interrupt
);
1461 KeAreApcsDisabled(VOID
);
1466 KeGetRecommendedSharedDataAlignment(VOID
);
1471 KeQueryRuntimeThread(
1473 OUT PULONG UserTime
);
1478 KeReleaseInStackQueuedSpinLockFromDpcLevel(
1479 IN PKLOCK_QUEUE_HANDLE LockHandle
);
1484 KeReleaseInterruptSpinLock(
1485 IN OUT PKINTERRUPT Interrupt
,
1489 PKDEVICE_QUEUE_ENTRY
1491 KeRemoveByKeyDeviceQueueIfBusy(
1492 IN OUT PKDEVICE_QUEUE DeviceQueue
,
1495 //_DECL_HAL_KE_IMPORT
1498 KeReleaseInStackQueuedSpinLock(
1499 IN PKLOCK_QUEUE_HANDLE LockHandle
);
1501 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1503 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
1508 KeDeregisterBugCheckReasonCallback(
1509 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
1514 KeRegisterBugCheckReasonCallback(
1515 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
,
1516 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
,
1517 IN KBUGCHECK_CALLBACK_REASON Reason
,
1518 IN PUCHAR Component
);
1520 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
1522 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1530 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
1532 #if (NTDDI_VERSION >= NTDDI_WS03)
1537 KeRegisterNmiCallback(
1538 IN PNMI_CALLBACK CallbackRoutine
,
1539 IN PVOID Context OPTIONAL
);
1544 KeDeregisterNmiCallback(
1550 KeInitializeThreadedDpc(
1552 IN PKDEFERRED_ROUTINE DeferredRoutine
,
1553 IN PVOID DeferredContext OPTIONAL
);
1559 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
1560 IN ULONG_PTR Context
);
1565 KeAcquireSpinLockForDpc(
1566 IN OUT PKSPIN_LOCK SpinLock
);
1571 KeReleaseSpinLockForDpc(
1572 IN OUT PKSPIN_LOCK SpinLock
,
1575 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
1577 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1582 KeTryToAcquireSpinLockAtDpcLevel(
1583 IN OUT PKSPIN_LOCK SpinLock
);
1588 KeAreAllApcsDisabled(
1594 KeAcquireGuardedMutex(
1595 IN OUT PKGUARDED_MUTEX GuardedMutex
1601 KeAcquireGuardedMutexUnsafe(
1602 IN OUT PKGUARDED_MUTEX GuardedMutex
1608 KeEnterGuardedRegion(
1615 KeLeaveGuardedRegion(
1622 KeInitializeGuardedMutex(
1623 OUT PKGUARDED_MUTEX GuardedMutex
1629 KeReleaseGuardedMutexUnsafe(
1630 IN OUT PKGUARDED_MUTEX GuardedMutex
1636 KeReleaseGuardedMutex(
1637 IN OUT PKGUARDED_MUTEX GuardedMutex
1643 KeTryToAcquireGuardedMutex(
1644 IN OUT PKGUARDED_MUTEX GuardedMutex
1647 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
1649 #if (NTDDI_VERSION >= NTDDI_VISTA)
1654 KeAcquireInStackQueuedSpinLockForDpc(
1655 IN OUT PKSPIN_LOCK SpinLock
,
1656 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
1661 KeReleaseInStackQueuedSpinLockForDpc(
1662 IN PKLOCK_QUEUE_HANDLE LockHandle
);
1667 KeQueryDpcWatchdogInformation(
1668 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation
);
1670 #if defined(SINGLE_GROUP_LEGACY_API)
1674 KeSetSystemAffinityThreadEx(
1675 IN KAFFINITY Affinity
);
1680 KeQueryActiveProcessorCount(
1681 OUT PKAFFINITY ActiveProcessors OPTIONAL
);
1686 KeQueryMaximumProcessorCount(
1690 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1692 #if (NTDDI_VERSION >= NTDDI_WS08)
1695 KeRegisterProcessorChangeCallback(
1696 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction
,
1697 IN PVOID CallbackContext OPTIONAL
,
1701 KeDeregisterProcessorChangeCallback(
1702 IN PVOID CallbackHandle
);
1704 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
1706 #if (NTDDI_VERSION >= NTDDI_WIN7)
1710 KeQueryTotalCycleTimeProcess(
1711 IN OUT PKPROCESS Process
,
1712 OUT PULONG64 CycleTimeStamp
);
1716 KeQueryTotalCycleTimeThread(
1717 IN OUT PKTHREAD Thread
,
1718 OUT PULONG64 CycleTimeStamp
);
1723 KeSetTargetProcessorDpcEx(
1725 IN PPROCESSOR_NUMBER ProcNumber
);
1730 KeSetSystemGroupAffinityThread(
1731 IN PGROUP_AFFINITY Affinity
,
1732 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL
);
1737 KeRevertToUserGroupAffinityThread(
1738 IN PGROUP_AFFINITY PreviousAffinity
);
1743 KeSetCoalescableTimer(
1744 IN OUT PKTIMER Timer
,
1745 IN LARGE_INTEGER DueTime
,
1747 IN ULONG TolerableDelay
,
1748 IN PKDPC Dpc OPTIONAL
);
1753 KeQueryUnbiasedInterruptTime(
1759 KeQueryActiveProcessorCountEx(
1760 IN USHORT GroupNumber
);
1765 KeQueryMaximumProcessorCountEx(
1766 IN USHORT GroupNumber
);
1771 KeQueryActiveGroupCount(
1777 KeQueryMaximumGroupCount(
1783 KeQueryGroupAffinity
1784 IN USHORT GroupNumber
);
1789 KeGetCurrentProcessorNumberEx(
1790 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL
);
1795 KeQueryNodeActiveAffinity(
1796 IN USHORT NodeNumber
,
1797 OUT PGROUP_AFFINITY Affinity OPTIONAL
,
1798 OUT PUSHORT Count OPTIONAL
);
1803 KeQueryNodeMaximumProcessorCount(
1804 IN USHORT NodeNumber
);
1809 KeQueryHighestNodeNumber(
1815 KeGetCurrentNodeNumber(
1821 KeQueryLogicalProcessorRelationship(
1822 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
1823 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
1824 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL
,
1825 IN OUT PULONG Length
);
1830 KeSaveExtendedProcessorState(
1832 OUT PXSTATE_SAVE XStateSave
);
1837 KeRestoreExtendedProcessorState(
1838 IN PXSTATE_SAVE XStateSave
);
1840 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1846 KeSaveFloatingPointState(
1847 OUT PKFLOATING_SAVE FloatSave
);
1852 KeRestoreFloatingPointState(
1853 IN PKFLOATING_SAVE FloatSave
);
1859 KeFlushWriteBuffer(VOID
)
1868 KeFlushWriteBuffer(VOID
);
1875 * IN BOOLEAN ReadOperation,
1876 * IN BOOLEAN DmaOperation)
1878 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
1880 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
1881 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
1882 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
1883 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
1885 #if (NTDDI_VERSION >= NTDDI_WS03)
1890 IN PKSPIN_LOCK SpinLock
1900 #if defined(_M_AMD64)
1903 KeGetCurrentThread (
1906 return (struct _KTHREAD
*)__readgsqword(0x188);
1910 #if defined(_M_IX86) || defined(_M_IA64)
1920 * KeInitializeCallbackRecord(
1921 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1923 #define KeInitializeCallbackRecord(CallbackRecord) \
1924 CallbackRecord->State = BufferEmpty;
1928 #if (NTDDI_VERSION >= NTDDI_VISTA)
1929 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
1931 #define PAGED_ASSERT( exp ) ASSERT( exp )
1934 #define PAGED_CODE() { \
1935 if (KeGetCurrentIrql() > APC_LEVEL) { \
1936 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
1937 PAGED_ASSERT(FALSE); \
1943 #define PAGED_CODE()
1947 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
1950 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1956 IN CONST VOID
*Address
, /* CONST is added */
1958 IN ULONG Alignment
);
1966 IN ULONG Alignment
);
1970 #if defined(_X86_) || defined(_AMD64_)
1972 /* x86 and x64 performs a 0x2C interrupt */
1973 #define DbgRaiseAssertionFailure __int2c
1975 #elif defined(_ARM_)
1982 #error Unsupported Architecture
1986 /******************************************************************************
1987 * Memory manager Types *
1988 ******************************************************************************/
1990 #define PAGE_SIZE 0x1000
1991 #define PAGE_SHIFT 12L
1993 #define MM_DONT_ZERO_ALLOCATION 0x00000001
1994 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
1995 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
1996 #define MM_ALLOCATE_NO_WAIT 0x00000008
1997 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
1998 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
2000 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
2001 #define MDL_PAGES_LOCKED 0x0002
2002 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
2003 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
2004 #define MDL_PARTIAL 0x0010
2005 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
2006 #define MDL_IO_PAGE_READ 0x0040
2007 #define MDL_WRITE_OPERATION 0x0080
2008 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
2009 #define MDL_FREE_EXTRA_PTES 0x0200
2010 #define MDL_DESCRIBES_AWE 0x0400
2011 #define MDL_IO_SPACE 0x0800
2012 #define MDL_NETWORK_HEADER 0x1000
2013 #define MDL_MAPPING_CAN_FAIL 0x2000
2014 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
2015 #define MDL_INTERNAL 0x8000
2017 #define MDL_MAPPING_FLAGS ( \
2018 MDL_MAPPED_TO_SYSTEM_VA | \
2019 MDL_PAGES_LOCKED | \
2020 MDL_SOURCE_IS_NONPAGED_POOL | \
2021 MDL_PARTIAL_HAS_BEEN_MAPPED | \
2022 MDL_PARENT_MAPPED_SYSTEM_VA | \
2026 #define FLUSH_MULTIPLE_MAXIMUM 32
2028 /* Section access rights */
2029 #define SECTION_QUERY 0x0001
2030 #define SECTION_MAP_WRITE 0x0002
2031 #define SECTION_MAP_READ 0x0004
2032 #define SECTION_MAP_EXECUTE 0x0008
2033 #define SECTION_EXTEND_SIZE 0x0010
2034 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
2036 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
2037 SECTION_MAP_WRITE | \
2038 SECTION_MAP_READ | \
2039 SECTION_MAP_EXECUTE | \
2040 SECTION_EXTEND_SIZE)
2042 #define SESSION_QUERY_ACCESS 0x0001
2043 #define SESSION_MODIFY_ACCESS 0x0002
2045 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
2046 SESSION_QUERY_ACCESS | \
2047 SESSION_MODIFY_ACCESS)
2049 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
2051 #define PAGE_NOACCESS 0x01
2052 #define PAGE_READONLY 0x02
2053 #define PAGE_READWRITE 0x04
2054 #define PAGE_WRITECOPY 0x08
2055 #define PAGE_EXECUTE 0x10
2056 #define PAGE_EXECUTE_READ 0x20
2057 #define PAGE_EXECUTE_READWRITE 0x40
2058 #define PAGE_EXECUTE_WRITECOPY 0x80
2059 #define PAGE_GUARD 0x100
2060 #define PAGE_NOCACHE 0x200
2061 #define PAGE_WRITECOMBINE 0x400
2063 #define MEM_COMMIT 0x1000
2064 #define MEM_RESERVE 0x2000
2065 #define MEM_DECOMMIT 0x4000
2066 #define MEM_RELEASE 0x8000
2067 #define MEM_FREE 0x10000
2068 #define MEM_PRIVATE 0x20000
2069 #define MEM_MAPPED 0x40000
2070 #define MEM_RESET 0x80000
2071 #define MEM_TOP_DOWN 0x100000
2072 #define MEM_LARGE_PAGES 0x20000000
2073 #define MEM_4MB_PAGES 0x80000000
2075 #define SEC_RESERVE 0x4000000
2076 #define SEC_COMMIT 0x8000000
2077 #define SEC_LARGE_PAGES 0x80000000
2079 /* Section map options */
2080 typedef enum _SECTION_INHERIT
{
2085 typedef ULONG PFN_COUNT
;
2086 typedef LONG_PTR SPFN_NUMBER
, *PSPFN_NUMBER
;
2087 typedef ULONG_PTR PFN_NUMBER
, *PPFN_NUMBER
;
2089 typedef struct _MDL
{
2093 struct _EPROCESS
*Process
;
2094 PVOID MappedSystemVa
;
2101 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
2102 MmFrameBufferCached
= 2
2103 } MEMORY_CACHING_TYPE_ORIG
;
2105 typedef enum _MEMORY_CACHING_TYPE
{
2106 MmNonCached
= FALSE
,
2108 MmWriteCombined
= MmFrameBufferCached
,
2109 MmHardwareCoherentCached
,
2110 MmNonCachedUnordered
,
2113 } MEMORY_CACHING_TYPE
;
2115 typedef enum _MM_PAGE_PRIORITY
{
2117 NormalPagePriority
= 16,
2118 HighPagePriority
= 32
2121 typedef enum _LOCK_OPERATION
{
2127 typedef enum _MM_SYSTEM_SIZE
{
2134 /******************************************************************************
2135 * Memory manager Functions *
2136 ******************************************************************************/
2141 #define ALIGN_DOWN_BY(size, align) \
2142 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
2144 #define ALIGN_UP_BY(size, align) \
2145 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
2147 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
2148 ((PVOID)ALIGN_DOWN_BY(ptr, align))
2150 #define ALIGN_UP_POINTER_BY(ptr, align) \
2151 ((PVOID)ALIGN_UP_BY(ptr, align))
2153 #define ALIGN_DOWN(size, type) \
2154 ALIGN_DOWN_BY(size, sizeof(type))
2156 #define ALIGN_UP(size, type) \
2157 ALIGN_UP_BY(size, sizeof(type))
2159 #define ALIGN_DOWN_POINTER(ptr, type) \
2160 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
2162 #define ALIGN_UP_POINTER(ptr, type) \
2163 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
2169 #define BYTE_OFFSET(Va) \
2170 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
2176 #define BYTES_TO_PAGES(Size) \
2177 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
2183 #define PAGE_ALIGN(Va) \
2184 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
2188 * IN ULONG_PTR Size)
2190 #define ROUND_TO_PAGES(Size) \
2191 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
2195 * MmGetMdlByteCount(
2198 #define MmGetMdlByteCount(_Mdl) \
2203 * MmGetMdlByteOffset(
2206 #define MmGetMdlByteOffset(_Mdl) \
2207 ((_Mdl)->ByteOffset)
2214 #define MmGetMdlPfnArray(_Mdl) \
2215 ((PPFN_NUMBER) ((_Mdl) + 1))
2219 * MmGetMdlVirtualAddress(
2222 #define MmGetMdlVirtualAddress(_Mdl) \
2223 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
2225 #define MmGetProcedureAddress(Address) (Address)
2227 /* PVOID MmGetSystemAddressForMdl(
2230 #define MmGetSystemAddressForMdl(Mdl) \
2231 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2232 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2233 ((Mdl)->MappedSystemVa) : \
2234 (MmMapLockedPages((Mdl), KernelMode)))
2237 * MmGetSystemAddressForMdlSafe(
2239 * IN MM_PAGE_PRIORITY Priority)
2241 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2242 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2243 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2244 (_Mdl)->MappedSystemVa : \
2245 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2246 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2251 * IN PMDL MemoryDescriptorList,
2255 #define MmInitializeMdl(_MemoryDescriptorList, \
2259 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
2260 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
2261 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
2262 (_MemoryDescriptorList)->MdlFlags = 0; \
2263 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
2264 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
2265 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
2270 * MmPrepareMdlForReuse(
2273 #define MmPrepareMdlForReuse(_Mdl) \
2275 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
2276 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
2277 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
2278 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
2279 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
2283 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2288 MmAllocateContiguousMemory(
2289 IN SIZE_T NumberOfBytes
,
2290 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
2295 MmAllocateContiguousMemorySpecifyCache(
2296 IN SIZE_T NumberOfBytes
,
2297 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
2298 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
2299 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
2300 IN MEMORY_CACHING_TYPE CacheType
);
2305 MmAllocatePagesForMdl(
2306 IN PHYSICAL_ADDRESS LowAddress
,
2307 IN PHYSICAL_ADDRESS HighAddress
,
2308 IN PHYSICAL_ADDRESS SkipBytes
,
2309 IN SIZE_T TotalBytes
);
2314 MmBuildMdlForNonPagedPool(
2315 IN OUT PMDLX MemoryDescriptorList
);
2317 //DECLSPEC_DEPRECATED_DDK
2322 IN PMDL MemoryDescriptorList OPTIONAL
,
2329 MmFreeContiguousMemory(
2330 IN PVOID BaseAddress
);
2335 MmFreeContiguousMemorySpecifyCache(
2336 IN PVOID BaseAddress
,
2337 IN SIZE_T NumberOfBytes
,
2338 IN MEMORY_CACHING_TYPE CacheType
);
2344 IN PMDLX MemoryDescriptorList
);
2349 MmGetSystemRoutineAddress(
2350 IN PUNICODE_STRING SystemRoutineName
);
2355 MmIsDriverVerifying(
2356 IN
struct _DRIVER_OBJECT
*DriverObject
);
2361 MmLockPagableDataSection(
2362 IN PVOID AddressWithinSection
);
2368 IN PHYSICAL_ADDRESS PhysicalAddress
,
2369 IN SIZE_T NumberOfBytes
,
2370 IN MEMORY_CACHING_TYPE CacheEnable
);
2376 IN PMDL MemoryDescriptorList
,
2377 IN KPROCESSOR_MODE AccessMode
);
2382 MmMapLockedPagesSpecifyCache(
2383 IN PMDLX MemoryDescriptorList
,
2384 IN KPROCESSOR_MODE AccessMode
,
2385 IN MEMORY_CACHING_TYPE CacheType
,
2386 IN PVOID BaseAddress OPTIONAL
,
2387 IN ULONG BugCheckOnFailure
,
2388 IN MM_PAGE_PRIORITY Priority
);
2394 IN PVOID AddressWithinSection
);
2399 MmProbeAndLockPages(
2400 IN OUT PMDL MemoryDescriptorList
,
2401 IN KPROCESSOR_MODE AccessMode
,
2402 IN LOCK_OPERATION Operation
);
2413 MmResetDriverPaging(
2414 IN PVOID AddressWithinSection
);
2426 MmUnlockPagableImageSection(
2427 IN PVOID ImageSectionHandle
);
2433 IN OUT PMDL MemoryDescriptorList
);
2439 IN PVOID BaseAddress
,
2440 IN SIZE_T NumberOfBytes
);
2445 MmProbeAndLockProcessPages(
2446 IN OUT PMDL MemoryDescriptorList
,
2447 IN PEPROCESS Process
,
2448 IN KPROCESSOR_MODE AccessMode
,
2449 IN LOCK_OPERATION Operation
);
2455 IN PVOID BaseAddress
,
2456 IN PMDL MemoryDescriptorList
);
2460 #if (NTDDI_VERSION >= NTDDI_WINXP)
2467 IN ULONG NumberOfBytes
);
2472 MmAllocateMappingAddress(
2473 IN SIZE_T NumberOfBytes
,
2479 MmFreeMappingAddress(
2480 IN PVOID BaseAddress
,
2486 MmIsVerifierEnabled(
2487 OUT PULONG VerifierFlags
);
2492 MmMapLockedPagesWithReservedMapping(
2493 IN PVOID MappingAddress
,
2495 IN PMDL MemoryDescriptorList
,
2496 IN MEMORY_CACHING_TYPE CacheType
);
2501 MmProtectMdlSystemAddress(
2502 IN PMDL MemoryDescriptorList
,
2503 IN ULONG NewProtect
);
2508 MmUnmapReservedMapping(
2509 IN PVOID BaseAddress
,
2511 IN PMDL MemoryDescriptorList
);
2515 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2519 MmAllocatePagesForMdlEx(
2520 IN PHYSICAL_ADDRESS LowAddress
,
2521 IN PHYSICAL_ADDRESS HighAddress
,
2522 IN PHYSICAL_ADDRESS SkipBytes
,
2523 IN SIZE_T TotalBytes
,
2524 IN MEMORY_CACHING_TYPE CacheType
,
2528 /******************************************************************************
2529 * Security Manager Types *
2530 ******************************************************************************/
2533 typedef PVOID PSECURITY_DESCRIPTOR
;
2534 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
2535 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
2536 typedef PVOID PACCESS_TOKEN
;
2539 #define DELETE 0x00010000L
2540 #define READ_CONTROL 0x00020000L
2541 #define WRITE_DAC 0x00040000L
2542 #define WRITE_OWNER 0x00080000L
2543 #define SYNCHRONIZE 0x00100000L
2544 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
2545 #define STANDARD_RIGHTS_READ READ_CONTROL
2546 #define STANDARD_RIGHTS_WRITE READ_CONTROL
2547 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
2548 #define STANDARD_RIGHTS_ALL 0x001F0000L
2549 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
2550 #define ACCESS_SYSTEM_SECURITY 0x01000000L
2551 #define MAXIMUM_ALLOWED 0x02000000L
2552 #define GENERIC_READ 0x80000000L
2553 #define GENERIC_WRITE 0x40000000L
2554 #define GENERIC_EXECUTE 0x20000000L
2555 #define GENERIC_ALL 0x10000000L
2557 typedef struct _GENERIC_MAPPING
{
2558 ACCESS_MASK GenericRead
;
2559 ACCESS_MASK GenericWrite
;
2560 ACCESS_MASK GenericExecute
;
2561 ACCESS_MASK GenericAll
;
2562 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
2564 #define ACL_REVISION 2
2565 #define ACL_REVISION_DS 4
2567 #define ACL_REVISION1 1
2568 #define ACL_REVISION2 2
2569 #define ACL_REVISION3 3
2570 #define ACL_REVISION4 4
2571 #define MIN_ACL_REVISION ACL_REVISION2
2572 #define MAX_ACL_REVISION ACL_REVISION4
2574 typedef struct _ACL
{
2582 /* Current security descriptor revision value */
2583 #define SECURITY_DESCRIPTOR_REVISION (1)
2584 #define SECURITY_DESCRIPTOR_REVISION1 (1)
2586 /* Privilege attributes */
2587 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
2588 #define SE_PRIVILEGE_ENABLED (0x00000002L)
2589 #define SE_PRIVILEGE_REMOVED (0X00000004L)
2590 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
2592 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
2593 SE_PRIVILEGE_ENABLED | \
2594 SE_PRIVILEGE_REMOVED | \
2595 SE_PRIVILEGE_USED_FOR_ACCESS)
2597 #include <pshpack4.h>
2598 typedef struct _LUID_AND_ATTRIBUTES
{
2601 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
2602 #include <poppack.h>
2604 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
2605 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
2607 /* Privilege sets */
2608 #define PRIVILEGE_SET_ALL_NECESSARY (1)
2610 typedef struct _PRIVILEGE_SET
{
2611 ULONG PrivilegeCount
;
2613 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
2614 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
2616 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
2618 SecurityIdentification
,
2619 SecurityImpersonation
,
2621 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
2623 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
2624 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
2625 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
2626 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
2628 #define SECURITY_DYNAMIC_TRACKING (TRUE)
2629 #define SECURITY_STATIC_TRACKING (FALSE)
2631 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
2633 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
2635 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2636 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
2637 BOOLEAN EffectiveOnly
;
2638 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
2640 typedef struct _SE_IMPERSONATION_STATE
{
2641 PACCESS_TOKEN Token
;
2643 BOOLEAN EffectiveOnly
;
2644 SECURITY_IMPERSONATION_LEVEL Level
;
2645 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
2647 #define OWNER_SECURITY_INFORMATION (0x00000001L)
2648 #define GROUP_SECURITY_INFORMATION (0x00000002L)
2649 #define DACL_SECURITY_INFORMATION (0x00000004L)
2650 #define SACL_SECURITY_INFORMATION (0x00000008L)
2651 #define LABEL_SECURITY_INFORMATION (0x00000010L)
2653 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
2654 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
2655 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
2656 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
2658 typedef enum _SECURITY_OPERATION_CODE
{
2659 SetSecurityDescriptor
,
2660 QuerySecurityDescriptor
,
2661 DeleteSecurityDescriptor
,
2662 AssignSecurityDescriptor
2663 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
2665 #define INITIAL_PRIVILEGE_COUNT 3
2667 typedef struct _INITIAL_PRIVILEGE_SET
{
2668 ULONG PrivilegeCount
;
2670 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
2671 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
2673 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
2674 #define SE_CREATE_TOKEN_PRIVILEGE 2
2675 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
2676 #define SE_LOCK_MEMORY_PRIVILEGE 4
2677 #define SE_INCREASE_QUOTA_PRIVILEGE 5
2678 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
2679 #define SE_TCB_PRIVILEGE 7
2680 #define SE_SECURITY_PRIVILEGE 8
2681 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
2682 #define SE_LOAD_DRIVER_PRIVILEGE 10
2683 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
2684 #define SE_SYSTEMTIME_PRIVILEGE 12
2685 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
2686 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
2687 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
2688 #define SE_CREATE_PERMANENT_PRIVILEGE 16
2689 #define SE_BACKUP_PRIVILEGE 17
2690 #define SE_RESTORE_PRIVILEGE 18
2691 #define SE_SHUTDOWN_PRIVILEGE 19
2692 #define SE_DEBUG_PRIVILEGE 20
2693 #define SE_AUDIT_PRIVILEGE 21
2694 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
2695 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
2696 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
2697 #define SE_UNDOCK_PRIVILEGE 25
2698 #define SE_SYNC_AGENT_PRIVILEGE 26
2699 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
2700 #define SE_MANAGE_VOLUME_PRIVILEGE 28
2701 #define SE_IMPERSONATE_PRIVILEGE 29
2702 #define SE_CREATE_GLOBAL_PRIVILEGE 30
2703 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
2704 #define SE_RELABEL_PRIVILEGE 32
2705 #define SE_INC_WORKING_SET_PRIVILEGE 33
2706 #define SE_TIME_ZONE_PRIVILEGE 34
2707 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
2708 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
2710 typedef struct _SECURITY_SUBJECT_CONTEXT
{
2711 PACCESS_TOKEN ClientToken
;
2712 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2713 PACCESS_TOKEN PrimaryToken
;
2714 PVOID ProcessAuditId
;
2715 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
2717 typedef struct _ACCESS_STATE
{
2719 BOOLEAN SecurityEvaluated
;
2720 BOOLEAN GenerateAudit
;
2721 BOOLEAN GenerateOnClose
;
2722 BOOLEAN PrivilegesAllocated
;
2724 ACCESS_MASK RemainingDesiredAccess
;
2725 ACCESS_MASK PreviouslyGrantedAccess
;
2726 ACCESS_MASK OriginalDesiredAccess
;
2727 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
2728 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2731 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
2732 PRIVILEGE_SET PrivilegeSet
;
2735 BOOLEAN AuditPrivileges
;
2736 UNICODE_STRING ObjectName
;
2737 UNICODE_STRING ObjectTypeName
;
2738 } ACCESS_STATE
, *PACCESS_STATE
;
2743 #ifndef _NTLSA_AUDIT_
2744 #define _NTLSA_AUDIT_
2746 #define SE_MAX_AUDIT_PARAMETERS 32
2747 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
2749 #define SE_ADT_OBJECT_ONLY 0x1
2751 #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
2752 #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
2753 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
2754 #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
2755 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
2757 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
2758 ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
2759 (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
2761 typedef enum _SE_ADT_PARAMETER_TYPE
{
2762 SeAdtParmTypeNone
= 0,
2763 SeAdtParmTypeString
,
2764 SeAdtParmTypeFileSpec
,
2767 SeAdtParmTypeLogonId
,
2768 SeAdtParmTypeNoLogonId
,
2769 SeAdtParmTypeAccessMask
,
2771 SeAdtParmTypeObjectTypes
,
2772 SeAdtParmTypeHexUlong
,
2777 SeAdtParmTypeHexInt64
,
2778 SeAdtParmTypeStringList
,
2779 SeAdtParmTypeSidList
,
2780 SeAdtParmTypeDuration
,
2781 SeAdtParmTypeUserAccountControl
,
2783 SeAdtParmTypeMessage
,
2784 SeAdtParmTypeDateTime
,
2785 SeAdtParmTypeSockAddr
,
2787 SeAdtParmTypeLogonHours
,
2788 SeAdtParmTypeLogonIdNoSid
,
2789 SeAdtParmTypeUlongNoConv
,
2790 SeAdtParmTypeSockAddrNoPort
,
2791 SeAdtParmTypeAccessReason
2792 } SE_ADT_PARAMETER_TYPE
, *PSE_ADT_PARAMETER_TYPE
;
2794 typedef struct _SE_ADT_OBJECT_TYPE
{
2798 ACCESS_MASK AccessMask
;
2799 } SE_ADT_OBJECT_TYPE
, *PSE_ADT_OBJECT_TYPE
;
2801 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY
{
2802 SE_ADT_PARAMETER_TYPE Type
;
2806 } SE_ADT_PARAMETER_ARRAY_ENTRY
, *PSE_ADT_PARAMETER_ARRAY_ENTRY
;
2808 typedef struct _SE_ADT_ACCESS_REASON
{
2809 ACCESS_MASK AccessMask
;
2810 ULONG AccessReasons
[32];
2811 ULONG ObjectTypeIndex
;
2812 ULONG AccessGranted
;
2813 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2814 } SE_ADT_ACCESS_REASON
, *PSE_ADT_ACCESS_REASON
;
2816 typedef struct _SE_ADT_PARAMETER_ARRAY
{
2819 ULONG ParameterCount
;
2821 USHORT FlatSubCategoryId
;
2824 SE_ADT_PARAMETER_ARRAY_ENTRY Parameters
[ SE_MAX_AUDIT_PARAMETERS
];
2825 } SE_ADT_PARAMETER_ARRAY
, *PSE_ADT_PARAMETER_ARRAY
;
2827 #endif /* !_NTLSA_AUDIT_ */
2828 #endif /* !_NTLSA_IFS_ */
2831 /******************************************************************************
2832 * Security Manager Functions *
2833 ******************************************************************************/
2835 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2841 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
2842 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
2843 IN BOOLEAN SubjectContextLocked
,
2844 IN ACCESS_MASK DesiredAccess
,
2845 IN ACCESS_MASK PreviouslyGrantedAccess
,
2846 OUT PPRIVILEGE_SET
*Privileges OPTIONAL
,
2847 IN PGENERIC_MAPPING GenericMapping
,
2848 IN KPROCESSOR_MODE AccessMode
,
2849 OUT PACCESS_MASK GrantedAccess
,
2850 OUT PNTSTATUS AccessStatus
);
2856 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
2857 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
2858 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
2859 IN BOOLEAN IsDirectoryObject
,
2860 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
2861 IN PGENERIC_MAPPING GenericMapping
,
2862 IN POOL_TYPE PoolType
);
2868 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
2869 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
2870 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
2871 IN GUID
*ObjectType OPTIONAL
,
2872 IN BOOLEAN IsDirectoryObject
,
2873 IN ULONG AutoInheritFlags
,
2874 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
2875 IN PGENERIC_MAPPING GenericMapping
,
2876 IN POOL_TYPE PoolType
);
2882 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
);
2887 SeValidSecurityDescriptor(
2889 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
2894 SeObjectCreateSaclAccessBits(
2895 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
2900 SeReleaseSubjectContext(
2901 IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext
);
2906 SeUnlockSubjectContext(
2907 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
);
2912 SeCaptureSubjectContext(
2913 OUT PSECURITY_SUBJECT_CONTEXT SubjectContext
);
2918 SeLockSubjectContext(
2919 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
);
2921 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2923 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2927 SeSetAuditParameter(
2928 IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters
,
2929 IN SE_ADT_PARAMETER_TYPE Type
,
2935 SeReportSecurityEvent(
2937 IN PUNICODE_STRING SourceName
,
2938 IN PSID UserSid OPTIONAL
,
2939 IN PSE_ADT_PARAMETER_ARRAY AuditParameters
);
2941 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
2943 #if (NTDDI_VERSION >= NTDDI_VISTA)
2948 SeComputeAutoInheritByObjectType(
2949 IN PVOID ObjectType
,
2950 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
,
2951 IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL
);
2953 #ifdef SE_NTFS_WORLD_CACHE
2957 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
2958 IN PGENERIC_MAPPING GenericMapping
,
2959 OUT PACCESS_MASK GrantedAccess
);
2960 #endif /* SE_NTFS_WORLD_CACHE */
2962 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
2966 /******************************************************************************
2967 * Power Management Support Types *
2968 ******************************************************************************/
2973 /* Power States/Levels */
2974 typedef enum _SYSTEM_POWER_STATE
{
2975 PowerSystemUnspecified
,
2977 PowerSystemSleeping1
,
2978 PowerSystemSleeping2
,
2979 PowerSystemSleeping3
,
2980 PowerSystemHibernate
,
2981 PowerSystemShutdown
,
2983 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
2985 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
2987 typedef enum _POWER_INFORMATION_LEVEL
{
2988 SystemPowerPolicyAc
,
2989 SystemPowerPolicyDc
,
2990 VerifySystemPolicyAc
,
2991 VerifySystemPolicyDc
,
2992 SystemPowerCapabilities
,
2994 SystemPowerStateHandler
,
2995 ProcessorStateHandler
,
2996 SystemPowerPolicyCurrent
,
2997 AdministratorPowerPolicy
,
2998 SystemReserveHiberFile
,
2999 ProcessorInformation
,
3000 SystemPowerInformation
,
3001 ProcessorStateHandler2
,
3004 SystemExecutionState
,
3005 SystemPowerStateNotifyHandler
,
3006 ProcessorPowerPolicyAc
,
3007 ProcessorPowerPolicyDc
,
3008 VerifyProcessorPowerPolicyAc
,
3009 VerifyProcessorPowerPolicyDc
,
3010 ProcessorPowerPolicyCurrent
,
3011 SystemPowerStateLogging
,
3012 SystemPowerLoggingEntry
,
3013 SetPowerSettingValue
,
3014 NotifyUserPowerSetting
,
3015 PowerInformationLevelUnused0
,
3016 PowerInformationLevelUnused1
,
3018 TraceApplicationPowerMessage
,
3019 TraceApplicationPowerMessageEnd
,
3020 ProcessorPerfStates
,
3021 ProcessorIdleStates
,
3024 SystemHiberFileInformation
,
3025 TraceServicePowerMessage
,
3027 PowerShutdownNotification
,
3028 MonitorCapabilities
,
3030 SessionDisplayState
,
3033 GetPowerRequestList
,
3034 ProcessorInformationEx
,
3035 NotifyUserModeLegacyPowerEvent
,
3037 ProcessorIdleDomains
,
3039 SystemHiberFileSize
,
3040 PowerInformationLevelMaximum
3041 } POWER_INFORMATION_LEVEL
;
3045 PowerActionReserved
,
3047 PowerActionHibernate
,
3048 PowerActionShutdown
,
3049 PowerActionShutdownReset
,
3050 PowerActionShutdownOff
,
3051 PowerActionWarmEject
3052 } POWER_ACTION
, *PPOWER_ACTION
;
3054 typedef enum _DEVICE_POWER_STATE
{
3055 PowerDeviceUnspecified
,
3061 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
3063 typedef union _POWER_STATE
{
3064 SYSTEM_POWER_STATE SystemState
;
3065 DEVICE_POWER_STATE DeviceState
;
3066 } POWER_STATE
, *PPOWER_STATE
;
3068 typedef enum _POWER_STATE_TYPE
{
3069 SystemPowerState
= 0,
3071 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
3073 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
3077 } BATTERY_REPORTING_SCALE
, *PBATTERY_REPORTING_SCALE
;
3078 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
3080 #endif /* !_PO_DDK_ */
3083 (DDKAPI
*PREQUEST_POWER_COMPLETE
)(
3084 IN
struct _DEVICE_OBJECT
*DeviceObject
,
3085 IN UCHAR MinorFunction
,
3086 IN POWER_STATE PowerState
,
3088 IN
struct _IO_STATUS_BLOCK
*IoStatus
);
3091 /******************************************************************************
3092 * Power Management Support Functions *
3093 ******************************************************************************/
3095 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
3097 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3103 IN
struct _DEVICE_OBJECT
*DeviceObject
,
3104 IN OUT
struct _IRP
*Irp
);
3109 PoRegisterDeviceForIdleDetection(
3110 IN
struct _DEVICE_OBJECT
*DeviceObject
,
3111 IN ULONG ConservationIdleTime
,
3112 IN ULONG PerformanceIdleTime
,
3113 IN DEVICE_POWER_STATE State
);
3118 PoRegisterSystemState(
3119 IN OUT PVOID StateHandle OPTIONAL
,
3120 IN EXECUTION_STATE Flags
);
3126 IN
struct _DEVICE_OBJECT
*DeviceObject
,
3127 IN UCHAR MinorFunction
,
3128 IN POWER_STATE PowerState
,
3129 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL
,
3130 IN PVOID Context OPTIONAL
,
3131 OUT
struct _IRP
**Irp OPTIONAL
);
3137 IN
struct _DEVICE_OBJECT
*DeviceObject
,
3138 IN POWER_STATE_TYPE Type
,
3139 IN POWER_STATE State
);
3145 IN EXECUTION_STATE Flags
);
3150 PoStartNextPowerIrp(
3151 IN OUT
struct _IRP
*Irp
);
3156 PoUnregisterSystemState(
3157 IN OUT PVOID StateHandle
);
3159 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
3161 #if (NTDDI_VERSION >= NTDDI_VISTA)
3167 IN OUT
struct _IRP
*Irp
);
3173 IN
struct _IRP
*Irp
);
3178 PoRegisterPowerSettingCallback(
3179 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
3180 IN LPCGUID SettingGuid
,
3181 IN PPOWER_SETTING_CALLBACK Callback
,
3182 IN PVOID Context OPTIONAL
,
3183 OUT PVOID
*Handle OPTIONAL
);
3188 PoUnregisterPowerSettingCallback(
3189 IN OUT PVOID Handle
);
3191 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
3193 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
3199 IN OUT PULONG IdlePointer
);
3201 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
3203 #if (NTDDI_VERSION >= NTDDI_WIN7)
3208 IN OUT PULONG IdlePointer
);
3214 IN OUT PULONG IdlePointer
);
3219 PoQueryWatchdogTime(
3220 IN PDEVICE_OBJECT Pdo
,
3221 OUT PULONG SecondsRemaining
);
3226 PoDeletePowerRequest(
3227 IN OUT PVOID PowerRequest
);
3233 IN OUT PVOID PowerRequest
,
3234 IN POWER_REQUEST_TYPE Type
);
3239 PoClearPowerRequest(
3240 IN OUT PVOID PowerRequest
,
3241 IN POWER_REQUEST_TYPE Type
);
3246 PoCreatePowerRequest(
3247 OUT PVOID
*PowerRequest
,
3248 IN PDEVICE_OBJECT DeviceObject
,
3249 IN PCOUNTED_REASON_CONTEXT Context
);
3251 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
3254 /******************************************************************************
3255 * Configuration Manager Types *
3256 ******************************************************************************/
3258 /* Resource list definitions */
3259 typedef int CM_RESOURCE_TYPE
;
3261 #define CmResourceTypeNull 0
3262 #define CmResourceTypePort 1
3263 #define CmResourceTypeInterrupt 2
3264 #define CmResourceTypeMemory 3
3265 #define CmResourceTypeDma 4
3266 #define CmResourceTypeDeviceSpecific 5
3267 #define CmResourceTypeBusNumber 6
3268 #define CmResourceTypeNonArbitrated 128
3269 #define CmResourceTypeConfigData 128
3270 #define CmResourceTypeDevicePrivate 129
3271 #define CmResourceTypePcCardConfig 130
3272 #define CmResourceTypeMfCardConfig 131
3274 /* KEY_VALUE_Xxx.Type */
3277 #define REG_EXPAND_SZ 2
3278 #define REG_BINARY 3
3280 #define REG_DWORD_LITTLE_ENDIAN 4
3281 #define REG_DWORD_BIG_ENDIAN 5
3283 #define REG_MULTI_SZ 7
3284 #define REG_RESOURCE_LIST 8
3285 #define REG_FULL_RESOURCE_DESCRIPTOR 9
3286 #define REG_RESOURCE_REQUIREMENTS_LIST 10
3287 #define REG_QWORD 11
3288 #define REG_QWORD_LITTLE_ENDIAN 11
3290 /* Registry Access Rights */
3291 #define KEY_QUERY_VALUE (0x0001)
3292 #define KEY_SET_VALUE (0x0002)
3293 #define KEY_CREATE_SUB_KEY (0x0004)
3294 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
3295 #define KEY_NOTIFY (0x0010)
3296 #define KEY_CREATE_LINK (0x0020)
3297 #define KEY_WOW64_32KEY (0x0200)
3298 #define KEY_WOW64_64KEY (0x0100)
3299 #define KEY_WOW64_RES (0x0300)
3301 #define KEY_READ ((STANDARD_RIGHTS_READ |\
3303 KEY_ENUMERATE_SUB_KEYS |\
3308 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
3310 KEY_CREATE_SUB_KEY) \
3314 #define KEY_EXECUTE ((KEY_READ) \
3318 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
3321 KEY_CREATE_SUB_KEY |\
3322 KEY_ENUMERATE_SUB_KEYS |\
3328 /* Registry Open/Create Options */
3329 #define REG_OPTION_RESERVED (0x00000000L)
3330 #define REG_OPTION_NON_VOLATILE (0x00000000L)
3331 #define REG_OPTION_VOLATILE (0x00000001L)
3332 #define REG_OPTION_CREATE_LINK (0x00000002L)
3333 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
3334 #define REG_OPTION_OPEN_LINK (0x00000008L)
3336 #define REG_LEGAL_OPTION \
3337 (REG_OPTION_RESERVED |\
3338 REG_OPTION_NON_VOLATILE |\
3339 REG_OPTION_VOLATILE |\
3340 REG_OPTION_CREATE_LINK |\
3341 REG_OPTION_BACKUP_RESTORE |\
3342 REG_OPTION_OPEN_LINK)
3344 /* Key creation/open disposition */
3345 #define REG_CREATED_NEW_KEY (0x00000001L)
3346 #define REG_OPENED_EXISTING_KEY (0x00000002L)
3348 /* Key restore & hive load flags */
3349 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
3350 #define REG_REFRESH_HIVE (0x00000002L)
3351 #define REG_NO_LAZY_FLUSH (0x00000004L)
3352 #define REG_FORCE_RESTORE (0x00000008L)
3353 #define REG_APP_HIVE (0x00000010L)
3354 #define REG_PROCESS_PRIVATE (0x00000020L)
3355 #define REG_START_JOURNAL (0x00000040L)
3356 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
3357 #define REG_HIVE_NO_RM (0x00000100L)
3358 #define REG_HIVE_SINGLE_LOG (0x00000200L)
3361 #define REG_FORCE_UNLOAD 1
3363 /* Notify Filter Values */
3364 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
3365 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
3366 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
3367 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
3369 #define REG_LEGAL_CHANGE_FILTER \
3370 (REG_NOTIFY_CHANGE_NAME |\
3371 REG_NOTIFY_CHANGE_ATTRIBUTES |\
3372 REG_NOTIFY_CHANGE_LAST_SET |\
3373 REG_NOTIFY_CHANGE_SECURITY)
3375 typedef struct _CM_FLOPPY_DEVICE_DATA
{
3381 UCHAR StepRateHeadUnloadTime
;
3384 UCHAR SectorLengthCode
;
3385 UCHAR SectorPerTrack
;
3386 UCHAR ReadWriteGapLength
;
3387 UCHAR DataTransferLength
;
3388 UCHAR FormatGapLength
;
3389 UCHAR FormatFillCharacter
;
3390 UCHAR HeadSettleTime
;
3391 UCHAR MotorSettleTime
;
3392 UCHAR MaximumTrackValue
;
3393 UCHAR DataTransferRate
;
3394 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
3396 #include <pshpack4.h>
3397 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
3399 UCHAR ShareDisposition
;
3403 PHYSICAL_ADDRESS Start
;
3407 PHYSICAL_ADDRESS Start
;
3411 #if defined(NT_PROCESSOR_GROUPS)
3420 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3422 __GNU_EXTENSION
union {
3424 #if defined(NT_PROCESSOR_GROUPS)
3429 USHORT MessageCount
;
3434 #if defined(NT_PROCESSOR_GROUPS)
3447 PHYSICAL_ADDRESS Start
;
3467 } DeviceSpecificData
;
3468 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3470 PHYSICAL_ADDRESS Start
;
3474 PHYSICAL_ADDRESS Start
;
3478 PHYSICAL_ADDRESS Start
;
3483 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
3484 #include <poppack.h>
3486 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
3487 #define CmResourceTypeNull 0
3488 #define CmResourceTypePort 1
3489 #define CmResourceTypeInterrupt 2
3490 #define CmResourceTypeMemory 3
3491 #define CmResourceTypeDma 4
3492 #define CmResourceTypeDeviceSpecific 5
3493 #define CmResourceTypeBusNumber 6
3494 #define CmResourceTypeMemoryLarge 7
3495 #define CmResourceTypeNonArbitrated 128
3496 #define CmResourceTypeConfigData 128
3497 #define CmResourceTypeDevicePrivate 129
3498 #define CmResourceTypePcCardConfig 130
3499 #define CmResourceTypeMfCardConfig 131
3501 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
3502 typedef enum _CM_SHARE_DISPOSITION
{
3503 CmResourceShareUndetermined
,
3504 CmResourceShareDeviceExclusive
,
3505 CmResourceShareDriverExclusive
,
3506 CmResourceShareShared
3507 } CM_SHARE_DISPOSITION
;
3509 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
3510 #define CM_RESOURCE_PORT_MEMORY 0x0000
3511 #define CM_RESOURCE_PORT_IO 0x0001
3512 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
3513 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
3514 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
3515 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
3516 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
3517 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
3518 #define CM_RESOURCE_PORT_BAR 0x0100
3520 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
3521 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
3522 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
3523 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
3524 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
3526 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
3527 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
3528 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
3529 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
3530 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
3531 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
3532 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
3533 #define CM_RESOURCE_MEMORY_24 0x0010
3534 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
3535 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
3536 #define CM_RESOURCE_MEMORY_BAR 0x0080
3537 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
3539 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
3540 #define CM_RESOURCE_DMA_8 0x0000
3541 #define CM_RESOURCE_DMA_16 0x0001
3542 #define CM_RESOURCE_DMA_32 0x0002
3543 #define CM_RESOURCE_DMA_8_AND_16 0x0004
3544 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
3545 #define CM_RESOURCE_DMA_TYPE_A 0x0010
3546 #define CM_RESOURCE_DMA_TYPE_B 0x0020
3547 #define CM_RESOURCE_DMA_TYPE_F 0x0040
3549 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
3553 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
3554 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
3556 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
3557 INTERFACE_TYPE InterfaceType
;
3559 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
3560 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
3562 typedef struct _CM_RESOURCE_LIST
{
3564 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
3565 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
3567 #include <pshpack1.h>
3568 typedef struct _CM_INT13_DRIVE_PARAMETER
{
3571 USHORT SectorsPerTrack
;
3573 USHORT NumberDrives
;
3574 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
3576 typedef struct _CM_PNP_BIOS_DEVICE_NODE
{
3580 UCHAR DeviceType
[3];
3581 USHORT DeviceAttributes
;
3582 } CM_PNP_BIOS_DEVICE_NODE
,*PCM_PNP_BIOS_DEVICE_NODE
;
3584 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
{
3588 USHORT ControlField
;
3590 ULONG EventFlagAddress
;
3591 USHORT RealModeEntryOffset
;
3592 USHORT RealModeEntrySegment
;
3593 USHORT ProtectedModeEntryOffset
;
3594 ULONG ProtectedModeCodeBaseAddress
;
3596 USHORT RealModeDataBaseAddress
;
3597 ULONG ProtectedModeDataBaseAddress
;
3598 } CM_PNP_BIOS_INSTALLATION_CHECK
, *PCM_PNP_BIOS_INSTALLATION_CHECK
;
3599 #include <poppack.h>
3601 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
{
3602 ULONG BytesPerSector
;
3603 ULONG NumberOfCylinders
;
3604 ULONG SectorsPerTrack
;
3605 ULONG NumberOfHeads
;
3606 } CM_DISK_GEOMETRY_DEVICE_DATA
, *PCM_DISK_GEOMETRY_DEVICE_DATA
;
3608 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
3613 USHORT KeyboardFlags
;
3614 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
3616 typedef struct _CM_MCA_POS_DATA
{
3622 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
3624 #if (NTDDI_VERSION >= NTDDI_WINXP)
3625 typedef struct CM_Power_Data_s
{
3627 DEVICE_POWER_STATE PD_MostRecentPowerState
;
3628 ULONG PD_Capabilities
;
3632 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
3633 SYSTEM_POWER_STATE PD_DeepestSystemWake
;
3634 } CM_POWER_DATA
, *PCM_POWER_DATA
;
3636 #define PDCAP_D0_SUPPORTED 0x00000001
3637 #define PDCAP_D1_SUPPORTED 0x00000002
3638 #define PDCAP_D2_SUPPORTED 0x00000004
3639 #define PDCAP_D3_SUPPORTED 0x00000008
3640 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
3641 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
3642 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
3643 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
3644 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
3646 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
3648 typedef struct _CM_SCSI_DEVICE_DATA
{
3651 UCHAR HostIdentifier
;
3652 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
3654 typedef struct _CM_SERIAL_DEVICE_DATA
{
3658 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
3660 typedef enum _KEY_INFORMATION_CLASS
{
3661 KeyBasicInformation
,
3665 KeyCachedInformation
,
3667 } KEY_INFORMATION_CLASS
;
3669 typedef struct _KEY_BASIC_INFORMATION
{
3670 LARGE_INTEGER LastWriteTime
;
3674 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
3676 typedef struct _KEY_FULL_INFORMATION
{
3677 LARGE_INTEGER LastWriteTime
;
3685 ULONG MaxValueNameLen
;
3686 ULONG MaxValueDataLen
;
3688 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
3690 typedef struct _KEY_NODE_INFORMATION
{
3691 LARGE_INTEGER LastWriteTime
;
3697 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
3699 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
3704 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
3706 typedef struct _KEY_VALUE_FULL_INFORMATION
{
3713 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
3715 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
3720 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
3722 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
3726 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
3728 typedef struct _KEY_VALUE_ENTRY
{
3729 PUNICODE_STRING ValueName
;
3733 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
3735 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
3736 KeyValueBasicInformation
,
3737 KeyValueFullInformation
,
3738 KeyValuePartialInformation
,
3739 KeyValueFullInformationAlign64
,
3740 KeyValuePartialInformationAlign64
3741 } KEY_VALUE_INFORMATION_CLASS
;
3743 typedef struct _KEY_WRITE_TIME_INFORMATION
{
3744 LARGE_INTEGER LastWriteTime
;
3745 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
3747 typedef enum _KEY_SET_INFORMATION_CLASS
{
3748 KeyWriteTimeInformation
,
3749 KeyWow64FlagsInformation
,
3750 KeyControlFlagsInformation
,
3751 KeySetVirtualizationInformation
,
3752 KeySetDebugInformation
,
3753 KeySetHandleTagsInformation
,
3755 } KEY_SET_INFORMATION_CLASS
;
3757 typedef enum _REG_NOTIFY_CLASS
{
3759 RegNtPreDeleteKey
= RegNtDeleteKey
,
3761 RegNtPreSetValueKey
= RegNtSetValueKey
,
3762 RegNtDeleteValueKey
,
3763 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
3764 RegNtSetInformationKey
,
3765 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
3767 RegNtPreRenameKey
= RegNtRenameKey
,
3769 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
3770 RegNtEnumerateValueKey
,
3771 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
3773 RegNtPreQueryKey
= RegNtQueryKey
,
3775 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
3776 RegNtQueryMultipleValueKey
,
3777 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
3782 RegNtKeyHandleClose
,
3783 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
3785 RegNtPostSetValueKey
,
3786 RegNtPostDeleteValueKey
,
3787 RegNtPostSetInformationKey
,
3789 RegNtPostEnumerateKey
,
3790 RegNtPostEnumerateValueKey
,
3792 RegNtPostQueryValueKey
,
3793 RegNtPostQueryMultipleValueKey
,
3794 RegNtPostKeyHandleClose
,
3795 RegNtPreCreateKeyEx
,
3796 RegNtPostCreateKeyEx
,
3805 RegNtPreQueryKeySecurity
,
3806 RegNtPostQueryKeySecurity
,
3807 RegNtPreSetKeySecurity
,
3808 RegNtPostSetKeySecurity
,
3809 RegNtCallbackObjectContextCleanup
,
3811 RegNtPostRestoreKey
,
3815 RegNtPostReplaceKey
,
3817 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
3820 (NTAPI
*PEX_CALLBACK_FUNCTION
)(
3821 IN PVOID CallbackContext
,
3826 typedef struct _REG_DELETE_KEY_INFORMATION
{
3829 PVOID ObjectContext
;
3831 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
3832 #if (NTDDI_VERSION >= NTDDI_VISTA)
3833 , REG_FLUSH_KEY_INFORMATION
, *PREG_FLUSH_KEY_INFORMATION
3837 typedef struct _REG_SET_VALUE_KEY_INFORMATION
{
3839 PUNICODE_STRING ValueName
;
3845 PVOID ObjectContext
;
3847 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
3849 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
{
3851 PUNICODE_STRING ValueName
;
3853 PVOID ObjectContext
;
3855 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
3857 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
{
3859 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
3860 PVOID KeySetInformation
;
3861 ULONG KeySetInformationLength
;
3863 PVOID ObjectContext
;
3865 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
3867 typedef struct _REG_ENUMERATE_KEY_INFORMATION
{
3870 KEY_INFORMATION_CLASS KeyInformationClass
;
3871 PVOID KeyInformation
;
3873 PULONG ResultLength
;
3875 PVOID ObjectContext
;
3877 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
3879 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
{
3882 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
3883 PVOID KeyValueInformation
;
3885 PULONG ResultLength
;
3887 PVOID ObjectContext
;
3889 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
3891 typedef struct _REG_QUERY_KEY_INFORMATION
{
3893 KEY_INFORMATION_CLASS KeyInformationClass
;
3894 PVOID KeyInformation
;
3896 PULONG ResultLength
;
3898 PVOID ObjectContext
;
3900 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
3902 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
{
3904 PUNICODE_STRING ValueName
;
3905 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
3906 PVOID KeyValueInformation
;
3908 PULONG ResultLength
;
3910 PVOID ObjectContext
;
3912 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
3914 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
{
3916 PKEY_VALUE_ENTRY ValueEntries
;
3919 PULONG BufferLength
;
3920 PULONG RequiredBufferLength
;
3922 PVOID ObjectContext
;
3924 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
3926 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
{
3927 PUNICODE_STRING CompleteName
;
3928 } REG_PRE_CREATE_KEY_INFORMATION
, REG_PRE_OPEN_KEY_INFORMATION
,*PREG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;;
3930 typedef struct _REG_POST_CREATE_KEY_INFORMATION
{
3931 PUNICODE_STRING CompleteName
;
3934 } REG_POST_CREATE_KEY_INFORMATION
,REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
3936 typedef struct _REG_POST_OPERATION_INFORMATION
{
3939 PVOID PreInformation
;
3940 NTSTATUS ReturnStatus
;
3942 PVOID ObjectContext
;
3944 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
3946 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
{
3949 PVOID ObjectContext
;
3951 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
3954 /******************************************************************************
3955 * Configuration Manager Functions *
3956 ******************************************************************************/
3958 #if (NTDDI_VERSION >= NTDDI_WINXP)
3963 IN PEX_CALLBACK_FUNCTION Function
,
3964 IN PVOID Context OPTIONAL
,
3965 OUT PLARGE_INTEGER Cookie
);
3970 CmUnRegisterCallback(
3971 IN LARGE_INTEGER Cookie
);
3975 /******************************************************************************
3977 ******************************************************************************/
3979 #define RTL_REGISTRY_ABSOLUTE 0
3980 #define RTL_REGISTRY_SERVICES 1
3981 #define RTL_REGISTRY_CONTROL 2
3982 #define RTL_REGISTRY_WINDOWS_NT 3
3983 #define RTL_REGISTRY_DEVICEMAP 4
3984 #define RTL_REGISTRY_USER 5
3985 #define RTL_REGISTRY_MAXIMUM 6
3986 #define RTL_REGISTRY_HANDLE 0x40000000
3987 #define RTL_REGISTRY_OPTIONAL 0x80000000
3989 /* RTL_QUERY_REGISTRY_TABLE.Flags */
3990 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3991 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3992 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3993 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3994 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3995 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3996 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
3998 #define HASH_STRING_ALGORITHM_DEFAULT 0
3999 #define HASH_STRING_ALGORITHM_X65599 1
4000 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
4002 typedef struct _RTL_BITMAP
{
4005 } RTL_BITMAP
, *PRTL_BITMAP
;
4007 typedef struct _RTL_BITMAP_RUN
{
4008 ULONG StartingIndex
;
4010 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
4013 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
4017 IN ULONG ValueLength
,
4019 IN PVOID EntryContext
);
4021 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
4022 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
4028 ULONG DefaultLength
;
4029 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
4031 typedef struct _TIME_FIELDS
{
4038 CSHORT Milliseconds
;
4040 } TIME_FIELDS
, *PTIME_FIELDS
;
4043 #ifndef _SLIST_HEADER_
4044 #define _SLIST_HEADER_
4047 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
4048 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
4051 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
4053 ULONGLONG Alignment
;
4058 ULONGLONG Sequence
:9;
4059 ULONGLONG NextEntry
:39;
4060 ULONGLONG HeaderType
:1;
4062 ULONGLONG Reserved
:59;
4067 ULONGLONG Sequence
:48;
4068 ULONGLONG HeaderType
:1;
4070 ULONGLONG Reserved
:2;
4071 ULONGLONG NextEntry
:60;
4073 } SLIST_HEADER
, *PSLIST_HEADER
;
4075 #define SLIST_ENTRY SINGLE_LIST_ENTRY
4076 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
4077 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
4078 typedef union _SLIST_HEADER
{
4079 ULONGLONG Alignment
;
4085 } SLIST_HEADER
, *PSLIST_HEADER
;
4088 #endif /* _SLIST_HEADER_ */
4091 /******************************************************************************
4093 ******************************************************************************/
4098 OUT PLIST_ENTRY ListHead
)
4100 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
4106 IN OUT PLIST_ENTRY ListHead
,
4107 IN OUT PLIST_ENTRY Entry
)
4109 PLIST_ENTRY OldFlink
;
4110 OldFlink
= ListHead
->Flink
;
4111 Entry
->Flink
= OldFlink
;
4112 Entry
->Blink
= ListHead
;
4113 OldFlink
->Blink
= Entry
;
4114 ListHead
->Flink
= Entry
;
4120 IN OUT PLIST_ENTRY ListHead
,
4121 IN OUT PLIST_ENTRY Entry
)
4123 PLIST_ENTRY OldBlink
;
4124 OldBlink
= ListHead
->Blink
;
4125 Entry
->Flink
= ListHead
;
4126 Entry
->Blink
= OldBlink
;
4127 OldBlink
->Flink
= Entry
;
4128 ListHead
->Blink
= Entry
;
4134 IN CONST LIST_ENTRY
* ListHead
)
4136 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
4142 IN OUT PSINGLE_LIST_ENTRY ListHead
)
4144 PSINGLE_LIST_ENTRY FirstEntry
;
4145 FirstEntry
= ListHead
->Next
;
4146 if (FirstEntry
!= NULL
) {
4147 ListHead
->Next
= FirstEntry
->Next
;
4155 IN OUT PSINGLE_LIST_ENTRY ListHead
,
4156 IN OUT PSINGLE_LIST_ENTRY Entry
)
4158 Entry
->Next
= ListHead
->Next
;
4159 ListHead
->Next
= Entry
;
4165 IN PLIST_ENTRY Entry
)
4167 PLIST_ENTRY OldFlink
;
4168 PLIST_ENTRY OldBlink
;
4170 OldFlink
= Entry
->Flink
;
4171 OldBlink
= Entry
->Blink
;
4172 OldFlink
->Blink
= OldBlink
;
4173 OldBlink
->Flink
= OldFlink
;
4174 return (BOOLEAN
)(OldFlink
== OldBlink
);
4180 IN OUT PLIST_ENTRY ListHead
)
4185 Entry
= ListHead
->Flink
;
4186 Flink
= Entry
->Flink
;
4187 ListHead
->Flink
= Flink
;
4188 Flink
->Blink
= ListHead
;
4195 IN OUT PLIST_ENTRY ListHead
)
4200 Entry
= ListHead
->Blink
;
4201 Blink
= Entry
->Blink
;
4202 ListHead
->Blink
= Blink
;
4203 Blink
->Flink
= ListHead
;
4211 IN PVOID FailedAssertion
,
4213 IN ULONG LineNumber
,
4218 * IN VOID UNALIGNED *Destination,
4219 * IN CONST VOID UNALIGNED *Source,
4222 #define RtlCopyMemory(Destination, Source, Length) \
4223 memcpy(Destination, Source, Length)
4225 #define RtlCopyBytes RtlCopyMemory
4227 #if defined(_M_AMD64)
4231 RtlCopyMemoryNonTemporal(
4232 VOID UNALIGNED
*Destination
,
4233 CONST VOID UNALIGNED
*Source
,
4236 #define RtlCopyMemoryNonTemporal RtlCopyMemory
4244 #define RtlEqualLuid(Luid1, Luid2) \
4245 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
4249 * IN VOID UNALIGNED *Destination,
4250 * IN CONST VOID UNALIGNED *Source,
4253 #define RtlEqualMemory(Destination, Source, Length) \
4254 (!memcmp(Destination, Source, Length))
4258 * IN VOID UNALIGNED *Destination,
4262 #define RtlFillMemory(Destination, Length, Fill) \
4263 memset(Destination, Fill, Length)
4265 #define RtlFillBytes RtlFillMemory
4270 RtlFreeUnicodeString(
4271 IN OUT PUNICODE_STRING UnicodeString
);
4277 IN PUNICODE_STRING GuidString
,
4283 RtlInitUnicodeString(
4284 IN OUT PUNICODE_STRING DestinationString
,
4285 IN PCWSTR SourceString OPTIONAL
);
4289 * IN VOID UNALIGNED *Destination,
4290 * IN CONST VOID UNALIGNED *Source,
4293 #define RtlMoveMemory(Destination, Source, Length) \
4294 memmove(Destination, Source, Length)
4301 OUT PUNICODE_STRING GuidString
);
4305 * IN VOID UNALIGNED *Destination,
4308 #define RtlZeroMemory(Destination, Length) \
4309 memset(Destination, 0, Length)
4311 #define RtlZeroBytes RtlZeroMemory
4314 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4319 IN PRTL_BITMAP BitMapHeader
,
4320 IN ULONG StartingIndex
,
4327 IN PRTL_BITMAP BitMapHeader
,
4328 IN ULONG StartingIndex
,
4334 RtlAnsiStringToUnicodeString(
4335 IN OUT PUNICODE_STRING DestinationString
,
4336 IN PANSI_STRING SourceString
,
4337 IN BOOLEAN AllocateDestinationString
);
4342 RtlxAnsiStringToUnicodeSize(
4343 IN PCANSI_STRING AnsiString
);
4345 #define RtlAnsiStringToUnicodeSize(String) ( \
4346 NLS_MB_CODE_PAGE_TAG ? \
4347 RtlxAnsiStringToUnicodeSize(String) : \
4348 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
4354 RtlAppendUnicodeStringToString(
4355 IN OUT PUNICODE_STRING Destination
,
4356 IN PCUNICODE_STRING Source
);
4361 RtlAppendUnicodeToString(
4362 IN OUT PUNICODE_STRING Destination
,
4368 RtlCheckRegistryKey(
4369 IN ULONG RelativeTo
,
4376 IN PRTL_BITMAP BitMapHeader
);
4382 IN PRTL_BITMAP BitMapHeader
,
4383 IN ULONG StartingIndex
,
4384 IN ULONG NumberToClear
);
4390 IN CONST VOID
*Source1
,
4391 IN CONST VOID
*Source2
,
4397 RtlCompareUnicodeString(
4398 IN PCUNICODE_STRING String1
,
4399 IN PCUNICODE_STRING String2
,
4400 IN BOOLEAN CaseInSensitive
);
4405 RtlCompareUnicodeStrings(
4407 IN SIZE_T String1Length
,
4409 IN SIZE_T String2Length
,
4410 IN BOOLEAN CaseInSensitive
);
4415 RtlCopyUnicodeString(
4416 IN OUT PUNICODE_STRING DestinationString
,
4417 IN PCUNICODE_STRING SourceString
);
4422 RtlCreateRegistryKey(
4423 IN ULONG RelativeTo
,
4429 RtlCreateSecurityDescriptor(
4430 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
4436 RtlDeleteRegistryValue(
4437 IN ULONG RelativeTo
,
4439 IN PCWSTR ValueName
);
4444 RtlEqualUnicodeString(
4445 IN CONST UNICODE_STRING
*String1
,
4446 IN CONST UNICODE_STRING
*String2
,
4447 IN BOOLEAN CaseInSensitive
);
4449 #if !defined(_AMD64_) && !defined(_IA64_)
4453 RtlExtendedIntegerMultiply(
4454 IN LARGE_INTEGER Multiplicand
,
4455 IN LONG Multiplier
);
4460 RtlExtendedLargeIntegerDivide(
4461 IN LARGE_INTEGER Dividend
,
4463 IN OUT PULONG Remainder
);
4466 #if defined(_X86_) || defined(_IA64_)
4470 RtlExtendedMagicDivide(
4471 IN LARGE_INTEGER Dividend
,
4472 IN LARGE_INTEGER MagicDivisor
,
4473 IN CCHAR ShiftCount
);
4480 IN PANSI_STRING AnsiString
);
4486 IN PRTL_BITMAP BitMapHeader
,
4487 IN ULONG NumberToFind
,
4488 IN ULONG HintIndex
);
4493 RtlFindClearBitsAndSet(
4494 IN PRTL_BITMAP BitMapHeader
,
4495 IN ULONG NumberToFind
,
4496 IN ULONG HintIndex
);
4501 RtlFindFirstRunClear(
4502 IN PRTL_BITMAP BitMapHeader
,
4503 OUT PULONG StartingIndex
);
4509 IN PRTL_BITMAP BitMapHeader
,
4510 OUT PRTL_BITMAP_RUN RunArray
,
4511 IN ULONG SizeOfRunArray
,
4512 IN BOOLEAN LocateLongestRuns
);
4517 RtlFindLastBackwardRunClear(
4518 IN PRTL_BITMAP BitMapHeader
,
4520 OUT PULONG StartingRunIndex
);
4525 RtlFindLeastSignificantBit(
4531 RtlFindLongestRunClear(
4532 IN PRTL_BITMAP BitMapHeader
,
4533 OUT PULONG StartingIndex
);
4538 RtlFindMostSignificantBit(
4544 RtlFindNextForwardRunClear(
4545 IN PRTL_BITMAP BitMapHeader
,
4547 OUT PULONG StartingRunIndex
);
4553 IN PRTL_BITMAP BitMapHeader
,
4554 IN ULONG NumberToFind
,
4555 IN ULONG HintIndex
);
4560 RtlFindSetBitsAndClear(
4561 IN PRTL_BITMAP BitMapHeader
,
4562 IN ULONG NumberToFind
,
4563 IN ULONG HintIndex
);
4568 RtlHashUnicodeString(
4569 IN CONST UNICODE_STRING
*String
,
4570 IN BOOLEAN CaseInSensitive
,
4571 IN ULONG HashAlgorithm
,
4572 OUT PULONG HashValue
);
4578 IN OUT PANSI_STRING DestinationString
,
4579 IN PCSZ SourceString
);
4584 RtlInitializeBitMap(
4585 IN PRTL_BITMAP BitMapHeader
,
4586 IN PULONG BitMapBuffer
,
4587 IN ULONG SizeOfBitMap
);
4593 IN OUT PSTRING DestinationString
,
4594 IN PCSZ SourceString
);
4599 RtlIntegerToUnicodeString(
4601 IN ULONG Base OPTIONAL
,
4602 IN OUT PUNICODE_STRING String
);
4607 RtlInt64ToUnicodeString(
4609 IN ULONG Base OPTIONAL
,
4610 IN OUT PUNICODE_STRING String
);
4613 #define RtlIntPtrToUnicodeString(Value, Base, String) \
4614 RtlInt64ToUnicodeString(Value, Base, String)
4616 #define RtlIntPtrToUnicodeString(Value, Base, String) \
4617 RtlIntegerToUnicodeString(Value, Base, String)
4624 #define RtlIsZeroLuid(_L1) \
4625 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
4630 RtlLengthSecurityDescriptor(
4631 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
4636 RtlNumberOfClearBits(
4637 IN PRTL_BITMAP BitMapHeader
);
4643 IN PRTL_BITMAP BitMapHeader
);
4648 RtlQueryRegistryValues(
4649 IN ULONG RelativeTo
,
4651 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
4653 IN PVOID Environment OPTIONAL
);
4655 #define LONG_SIZE (sizeof(LONG))
4656 #define LONG_MASK (LONG_SIZE - 1)
4660 * PULONG DestinationAddress,
4661 * PULONG SourceAddress);
4663 #if defined(_AMD64_)
4664 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
4665 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
4667 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
4668 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
4670 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
4671 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
4672 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
4673 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
4677 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
4682 * RtlRetrieveUshort(
4683 * PUSHORT DestinationAddress,
4684 * PUSHORT SourceAddress);
4686 #if defined(_AMD64_)
4687 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
4688 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
4690 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
4691 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
4693 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
4694 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
4698 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
4706 IN PRTL_BITMAP BitMapHeader
);
4712 IN PRTL_BITMAP BitMapHeader
,
4713 IN ULONG StartingIndex
,
4714 IN ULONG NumberToSet
);
4719 RtlSetDaclSecurityDescriptor(
4720 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
4721 IN BOOLEAN DaclPresent
,
4722 IN PACL Dacl OPTIONAL
,
4723 IN BOOLEAN DaclDefaulted OPTIONAL
);
4727 * IN PULONG Address,
4730 #if defined(_AMD64_)
4731 #define RtlStoreUlong(Address,Value) \
4732 *(ULONG UNALIGNED *)(Address) = (Value)
4734 #define RtlStoreUlong(Address,Value) \
4735 if ((ULONG_PTR)(Address) & LONG_MASK) { \
4736 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
4737 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
4738 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
4739 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
4742 *((PULONG)(Address)) = (ULONG) (Value); \
4747 * RtlStoreUlonglong(
4748 * IN OUT PULONGLONG Address,
4751 #if defined(_AMD64_)
4752 #define RtlStoreUlonglong(Address,Value) \
4753 *(ULONGLONG UNALIGNED *)(Address) = (Value)
4755 #define RtlStoreUlonglong(Address,Value) \
4756 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
4757 RtlStoreUlong((ULONG_PTR)(Address), \
4758 (ULONGLONG)(Value) & 0xFFFFFFFF); \
4759 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
4760 (ULONGLONG)(Value) >> 32); \
4762 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
4768 * IN OUT PULONG_PTR Address,
4769 * IN ULONG_PTR Value);
4772 #define RtlStoreUlongPtr(Address,Value) \
4773 RtlStoreUlonglong(Address,Value)
4775 #define RtlStoreUlongPtr(Address,Value) \
4776 RtlStoreUlong(Address,Value)
4781 * IN PUSHORT Address,
4784 #if defined(_AMD64_)
4785 #define RtlStoreUshort(Address,Value) \
4786 *(USHORT UNALIGNED *)(Address) = (Value)
4788 #define RtlStoreUshort(Address,Value) \
4789 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
4790 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
4791 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
4794 *((PUSHORT) (Address)) = (USHORT)Value; \
4801 RtlTimeFieldsToTime(
4802 IN PTIME_FIELDS TimeFields
,
4803 IN PLARGE_INTEGER Time
);
4808 RtlTimeToTimeFields(
4809 IN PLARGE_INTEGER Time
,
4810 IN PTIME_FIELDS TimeFields
);
4821 RtlUlonglongByteSwap(
4822 IN ULONGLONG Source
);
4827 RtlUnicodeStringToAnsiString(
4828 IN OUT PANSI_STRING DestinationString
,
4829 IN PCUNICODE_STRING SourceString
,
4830 IN BOOLEAN AllocateDestinationString
);
4835 RtlxUnicodeStringToAnsiSize(
4836 IN PCUNICODE_STRING UnicodeString
);
4838 #define RtlUnicodeStringToAnsiSize(String) ( \
4839 NLS_MB_CODE_PAGE_TAG ? \
4840 RtlxUnicodeStringToAnsiSize(String) : \
4841 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
4847 RtlUnicodeStringToInteger(
4848 IN PCUNICODE_STRING String
,
4849 IN ULONG Base OPTIONAL
,
4855 RtlUpcaseUnicodeChar(
4856 IN WCHAR SourceCharacter
);
4867 RtlValidRelativeSecurityDescriptor(
4868 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
4869 IN ULONG SecurityDescriptorLength
,
4870 IN SECURITY_INFORMATION RequiredInformation
);
4875 RtlValidSecurityDescriptor(
4876 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
4881 RtlWriteRegistryValue(
4882 IN ULONG RelativeTo
,
4884 IN PCWSTR ValueName
,
4887 IN ULONG ValueLength
);
4889 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
4891 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
4895 RtlPrefetchMemoryNonTemporal(
4900 #if (NTDDI_VERSION >= NTDDI_WINXP)
4905 PRTL_BITMAP BitMapHeader
,
4911 RtlDowncaseUnicodeChar(
4912 IN WCHAR SourceCharacter
);
4918 PRTL_BITMAP BitMapHeader
,
4925 IN PRTL_BITMAP BitMapHeader
,
4926 IN ULONG BitNumber
);
4928 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
4930 #if (NTDDI_VERSION >= NTDDI_VISTA)
4934 RtlNumberOfSetBitsUlongPtr(
4935 IN ULONG_PTR Target
);
4940 RtlIoDecodeMemIoResource (
4941 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
4942 OUT PULONGLONG Alignment OPTIONAL
,
4943 OUT PULONGLONG MinimumAddress OPTIONAL
,
4944 OUT PULONGLONG MaximumAddress OPTIONAL
);
4949 RtlIoEncodeMemIoResource(
4950 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
4952 IN ULONGLONG Length
,
4953 IN ULONGLONG Alignment
,
4954 IN ULONGLONG MinimumAddress
,
4955 IN ULONGLONG MaximumAddress
);
4960 RtlCmDecodeMemIoResource(
4961 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
4962 OUT PULONGLONG Start OPTIONAL
);
4967 RtlFindClosestEncodableLength(
4968 IN ULONGLONG SourceLength
,
4969 OUT PULONGLONG TargetLength
);
4973 #if !defined(MIDL_PASS)
4974 /* inline funftions */
4975 //DECLSPEC_DEPRECATED_DDK_WINXP
4979 RtlConvertLongToLargeInteger(LONG SignedInteger
)
4982 ret
.QuadPart
= SignedInteger
;
4986 //DECLSPEC_DEPRECATED_DDK_WINXP
4990 RtlConvertUlongToLargeInteger(
4991 ULONG UnsignedInteger
)
4994 ret
.QuadPart
= UnsignedInteger
;
4998 //DECLSPEC_DEPRECATED_DDK
5002 RtlEnlargedUnsignedDivide(
5003 IN ULARGE_INTEGER Dividend
,
5005 IN OUT PULONG Remainder
)
5008 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
5009 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
5012 //DECLSPEC_DEPRECATED_DDK
5016 RtlEnlargedUnsignedMultiply(
5017 IN ULONG Multiplicand
,
5018 IN ULONG Multiplier
)
5021 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
5025 //DECLSPEC_DEPRECATED_DDK
5029 RtlEnlargedIntegerMultiply(
5030 IN LONG Multiplicand
,
5034 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
5040 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString
,
5042 IN USHORT BufferSize
)
5044 AnsiString
->Length
= 0;
5045 AnsiString
->MaximumLength
= BufferSize
;
5046 AnsiString
->Buffer
= Buffer
;
5051 RtlInitEmptyUnicodeString(
5052 OUT PUNICODE_STRING UnicodeString
,
5054 IN USHORT BufferSize
)
5056 UnicodeString
->Length
= 0;
5057 UnicodeString
->MaximumLength
= BufferSize
;
5058 UnicodeString
->Buffer
= Buffer
;
5061 #if defined(_AMD64_) || defined(_IA64_)
5065 RtlExtendedIntegerMultiply(
5066 LARGE_INTEGER Multiplicand
,
5070 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
5077 RtlExtendedLargeIntegerDivide(
5078 LARGE_INTEGER Dividend
,
5083 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
5085 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
5090 #if defined(_AMD64_)
5092 #define MultiplyHigh __mulh
5093 #define UnsignedMultiplyHigh __umulh
5095 //DECLSPEC_DEPRECATED_DDK
5099 RtlExtendedMagicDivide(
5100 IN LARGE_INTEGER Dividend
,
5101 IN LARGE_INTEGER MagicDivisor
,
5102 IN CCHAR ShiftCount
)
5107 Pos
= (Dividend
.QuadPart
>= 0);
5108 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
5109 MagicDivisor
.QuadPart
);
5110 ret64
>>= ShiftCount
;
5111 ret
.QuadPart
= Pos
? ret64
: -ret64
;
5116 //DECLSPEC_DEPRECATED_DDK
5121 IN LARGE_INTEGER Addend1
,
5122 IN LARGE_INTEGER Addend2
)
5125 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
5130 * RtlLargeIntegerAnd(
5131 * IN OUT LARGE_INTEGER Result,
5132 * IN LARGE_INTEGER Source,
5133 * IN LARGE_INTEGER Mask);
5135 #define RtlLargeIntegerAnd(Result, Source, Mask) \
5136 Result.QuadPart = Source.QuadPart & Mask.QuadPart
5138 //DECLSPEC_DEPRECATED_DDK
5142 RtlLargeIntegerArithmeticShift(
5143 IN LARGE_INTEGER LargeInteger
,
5144 IN CCHAR ShiftCount
)
5147 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
5152 * RtlLargeIntegerEqualTo(
5153 * IN LARGE_INTEGER Operand1,
5154 * IN LARGE_INTEGER Operand2);
5156 #define RtlLargeIntegerEqualTo(X,Y) \
5157 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
5161 RtlSecureZeroMemory(
5165 volatile char* vptr
= (volatile char*)Pointer
;
5166 #if defined(_M_AMD64)
5167 __stosb((PUCHAR
)vptr
, 0, Size
);
5169 char * endptr
= (char *)vptr
+ Size
;
5170 while (vptr
< endptr
)
5178 #if defined(_M_AMD64)
5182 IN PRTL_BITMAP BitMapHeader
,
5183 IN ULONG BitPosition
)
5185 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
5188 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
5189 #endif // defined(_M_AMD64)
5191 #endif // !defined(MIDL_PASS)
5193 /* Byte Swap Functions */
5194 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
5195 ((defined(_M_AMD64) || defined(_M_IA64)) \
5196 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
5198 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
5199 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
5200 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
5206 #define ASSERT(exp) \
5208 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
5210 #define ASSERTMSG(msg, exp) \
5212 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
5214 #define RTL_SOFT_ASSERT(exp) \
5216 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5218 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5220 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5222 #define RTL_VERIFY(exp) ASSERT(exp)
5223 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
5225 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5226 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5228 #if defined(_MSC_VER)
5230 #define NT_ASSERT(exp) \
5232 (__annotation(L"Debug", L"AssertFail", L#exp), \
5233 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5235 #define NT_ASSERTMSG(msg, exp) \
5237 (__annotation(L"Debug", L"AssertFail", L##msg), \
5238 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5240 #define NT_ASSERTMSGW(msg, exp) \
5242 (__annotation(L"Debug", L"AssertFail", msg), \
5243 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5247 /* GCC doesn't support __annotation (nor PDB) */
5248 #define NT_ASSERT(exp) \
5249 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
5251 #define NT_ASSERTMSG NT_ASSERT
5252 #define NT_ASSERTMSGW NT_ASSERT
5258 #define ASSERT(exp) ((VOID) 0)
5259 #define ASSERTMSG(msg, exp) ((VOID) 0)
5261 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5262 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5264 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5265 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5267 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5268 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5270 #define NT_ASSERT(exp) ((VOID)0)
5271 #define NT_ASSERTMSG(exp) ((VOID)0)
5272 #define NT_ASSERTMSGW(exp) ((VOID)0)
5277 /******************************************************************************
5278 * I/O Manager Types *
5279 ******************************************************************************/
5281 /* PCI_COMMON_CONFIG.Command */
5282 #define PCI_ENABLE_IO_SPACE 0x0001
5283 #define PCI_ENABLE_MEMORY_SPACE 0x0002
5284 #define PCI_ENABLE_BUS_MASTER 0x0004
5285 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
5286 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
5287 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
5288 #define PCI_ENABLE_PARITY 0x0040
5289 #define PCI_ENABLE_WAIT_CYCLE 0x0080
5290 #define PCI_ENABLE_SERR 0x0100
5291 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
5292 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
5294 /* PCI_COMMON_CONFIG.Status */
5295 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
5296 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
5297 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
5298 #define PCI_STATUS_UDF_SUPPORTED 0x0040
5299 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
5300 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
5301 #define PCI_STATUS_DEVSEL 0x0600
5302 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
5303 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
5304 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
5305 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
5306 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
5308 /* PCI_COMMON_CONFIG.HeaderType */
5309 #define PCI_MULTIFUNCTION 0x80
5310 #define PCI_DEVICE_TYPE 0x00
5311 #define PCI_BRIDGE_TYPE 0x01
5312 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
5314 #define PCI_CONFIGURATION_TYPE(PciData) \
5315 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
5317 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
5318 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
5320 /* PCI device classes */
5321 #define PCI_CLASS_PRE_20 0x00
5322 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
5323 #define PCI_CLASS_NETWORK_CTLR 0x02
5324 #define PCI_CLASS_DISPLAY_CTLR 0x03
5325 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
5326 #define PCI_CLASS_MEMORY_CTLR 0x05
5327 #define PCI_CLASS_BRIDGE_DEV 0x06
5328 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
5329 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
5330 #define PCI_CLASS_INPUT_DEV 0x09
5331 #define PCI_CLASS_DOCKING_STATION 0x0a
5332 #define PCI_CLASS_PROCESSOR 0x0b
5333 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
5334 #define PCI_CLASS_WIRELESS_CTLR 0x0d
5335 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
5336 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
5337 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
5338 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
5340 /* PCI device subclasses for class 0 */
5341 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
5342 #define PCI_SUBCLASS_PRE_20_VGA 0x01
5344 /* PCI device subclasses for class 1 (mass storage controllers)*/
5345 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
5346 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
5347 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
5348 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
5349 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
5350 #define PCI_SUBCLASS_MSC_OTHER 0x80
5352 /* PCI device subclasses for class 2 (network controllers)*/
5353 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
5354 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
5355 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
5356 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
5357 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
5358 #define PCI_SUBCLASS_NET_OTHER 0x80
5360 /* PCI device subclasses for class 3 (display controllers)*/
5361 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
5362 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
5363 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
5364 #define PCI_SUBCLASS_VID_OTHER 0x80
5366 /* PCI device subclasses for class 4 (multimedia device)*/
5367 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
5368 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
5369 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
5370 #define PCI_SUBCLASS_MM_OTHER 0x80
5372 /* PCI device subclasses for class 5 (memory controller)*/
5373 #define PCI_SUBCLASS_MEM_RAM 0x00
5374 #define PCI_SUBCLASS_MEM_FLASH 0x01
5375 #define PCI_SUBCLASS_MEM_OTHER 0x80
5377 /* PCI device subclasses for class 6 (bridge device)*/
5378 #define PCI_SUBCLASS_BR_HOST 0x00
5379 #define PCI_SUBCLASS_BR_ISA 0x01
5380 #define PCI_SUBCLASS_BR_EISA 0x02
5381 #define PCI_SUBCLASS_BR_MCA 0x03
5382 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
5383 #define PCI_SUBCLASS_BR_PCMCIA 0x05
5384 #define PCI_SUBCLASS_BR_NUBUS 0x06
5385 #define PCI_SUBCLASS_BR_CARDBUS 0x07
5386 #define PCI_SUBCLASS_BR_RACEWAY 0x08
5387 #define PCI_SUBCLASS_BR_OTHER 0x80
5389 /* PCI device subclasses for class C (serial bus controller)*/
5390 #define PCI_SUBCLASS_SB_IEEE1394 0x00
5391 #define PCI_SUBCLASS_SB_ACCESS 0x01
5392 #define PCI_SUBCLASS_SB_SSA 0x02
5393 #define PCI_SUBCLASS_SB_USB 0x03
5394 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
5395 #define PCI_SUBCLASS_SB_SMBUS 0x05
5397 #define PCI_MAX_DEVICES 32
5398 #define PCI_MAX_FUNCTION 8
5399 #define PCI_MAX_BRIDGE_NUMBER 0xFF
5400 #define PCI_INVALID_VENDORID 0xFFFF
5401 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
5403 #define PCI_ADDRESS_IO_SPACE 0x00000001
5404 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
5405 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
5406 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
5407 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
5408 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
5410 #define PCI_TYPE_32BIT 0
5411 #define PCI_TYPE_20BIT 2
5412 #define PCI_TYPE_64BIT 4
5414 #define POOL_COLD_ALLOCATION 256
5415 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
5416 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
5418 #define PCI_TYPE0_ADDRESSES 6
5419 #define PCI_TYPE1_ADDRESSES 2
5420 #define PCI_TYPE2_ADDRESSES 5
5422 #define IO_TYPE_ADAPTER 1
5423 #define IO_TYPE_CONTROLLER 2
5424 #define IO_TYPE_DEVICE 3
5425 #define IO_TYPE_DRIVER 4
5426 #define IO_TYPE_FILE 5
5427 #define IO_TYPE_IRP 6
5428 #define IO_TYPE_MASTER_ADAPTER 7
5429 #define IO_TYPE_OPEN_PACKET 8
5430 #define IO_TYPE_TIMER 9
5431 #define IO_TYPE_VPB 10
5432 #define IO_TYPE_ERROR_LOG 11
5433 #define IO_TYPE_ERROR_MESSAGE 12
5434 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
5436 #define IO_TYPE_CSQ_IRP_CONTEXT 1
5437 #define IO_TYPE_CSQ 2
5438 #define IO_TYPE_CSQ_EX 3
5440 /* IO_RESOURCE_DESCRIPTOR.Option */
5441 #define IO_RESOURCE_PREFERRED 0x01
5442 #define IO_RESOURCE_DEFAULT 0x02
5443 #define IO_RESOURCE_ALTERNATIVE 0x08
5445 /* DEVICE_OBJECT.Flags */
5446 #define DO_VERIFY_VOLUME 0x00000002
5447 #define DO_BUFFERED_IO 0x00000004
5448 #define DO_EXCLUSIVE 0x00000008
5449 #define DO_DIRECT_IO 0x00000010
5450 #define DO_MAP_IO_BUFFER 0x00000020
5451 #define DO_DEVICE_INITIALIZING 0x00000080
5452 #define DO_SHUTDOWN_REGISTERED 0x00000800
5453 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
5454 #define DO_POWER_PAGABLE 0x00002000
5455 #define DO_POWER_INRUSH 0x00004000
5457 /* DEVICE_OBJECT.Characteristics */
5458 #define FILE_REMOVABLE_MEDIA 0x00000001
5459 #define FILE_READ_ONLY_DEVICE 0x00000002
5460 #define FILE_FLOPPY_DISKETTE 0x00000004
5461 #define FILE_WRITE_ONCE_MEDIA 0x00000008
5462 #define FILE_REMOTE_DEVICE 0x00000010
5463 #define FILE_DEVICE_IS_MOUNTED 0x00000020
5464 #define FILE_VIRTUAL_VOLUME 0x00000040
5465 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
5466 #define FILE_DEVICE_SECURE_OPEN 0x00000100
5467 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
5468 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
5469 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
5471 /* DEVICE_OBJECT.AlignmentRequirement */
5472 #define FILE_BYTE_ALIGNMENT 0x00000000
5473 #define FILE_WORD_ALIGNMENT 0x00000001
5474 #define FILE_LONG_ALIGNMENT 0x00000003
5475 #define FILE_QUAD_ALIGNMENT 0x00000007
5476 #define FILE_OCTA_ALIGNMENT 0x0000000f
5477 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
5478 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
5479 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
5480 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
5481 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
5483 /* DEVICE_OBJECT.DeviceType */
5484 #define DEVICE_TYPE ULONG
5486 #define FILE_DEVICE_BEEP 0x00000001
5487 #define FILE_DEVICE_CD_ROM 0x00000002
5488 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
5489 #define FILE_DEVICE_CONTROLLER 0x00000004
5490 #define FILE_DEVICE_DATALINK 0x00000005
5491 #define FILE_DEVICE_DFS 0x00000006
5492 #define FILE_DEVICE_DISK 0x00000007
5493 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
5494 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
5495 #define FILE_DEVICE_INPORT_PORT 0x0000000a
5496 #define FILE_DEVICE_KEYBOARD 0x0000000b
5497 #define FILE_DEVICE_MAILSLOT 0x0000000c
5498 #define FILE_DEVICE_MIDI_IN 0x0000000d
5499 #define FILE_DEVICE_MIDI_OUT 0x0000000e
5500 #define FILE_DEVICE_MOUSE 0x0000000f
5501 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
5502 #define FILE_DEVICE_NAMED_PIPE 0x00000011
5503 #define FILE_DEVICE_NETWORK 0x00000012
5504 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
5505 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
5506 #define FILE_DEVICE_NULL 0x00000015
5507 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
5508 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
5509 #define FILE_DEVICE_PRINTER 0x00000018
5510 #define FILE_DEVICE_SCANNER 0x00000019
5511 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
5512 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
5513 #define FILE_DEVICE_SCREEN 0x0000001c
5514 #define FILE_DEVICE_SOUND 0x0000001d
5515 #define FILE_DEVICE_STREAMS 0x0000001e
5516 #define FILE_DEVICE_TAPE 0x0000001f
5517 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
5518 #define FILE_DEVICE_TRANSPORT 0x00000021
5519 #define FILE_DEVICE_UNKNOWN 0x00000022
5520 #define FILE_DEVICE_VIDEO 0x00000023
5521 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
5522 #define FILE_DEVICE_WAVE_IN 0x00000025
5523 #define FILE_DEVICE_WAVE_OUT 0x00000026
5524 #define FILE_DEVICE_8042_PORT 0x00000027
5525 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
5526 #define FILE_DEVICE_BATTERY 0x00000029
5527 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
5528 #define FILE_DEVICE_MODEM 0x0000002b
5529 #define FILE_DEVICE_VDM 0x0000002c
5530 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
5531 #define FILE_DEVICE_SMB 0x0000002e
5532 #define FILE_DEVICE_KS 0x0000002f
5533 #define FILE_DEVICE_CHANGER 0x00000030
5534 #define FILE_DEVICE_SMARTCARD 0x00000031
5535 #define FILE_DEVICE_ACPI 0x00000032
5536 #define FILE_DEVICE_DVD 0x00000033
5537 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
5538 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
5539 #define FILE_DEVICE_DFS_VOLUME 0x00000036
5540 #define FILE_DEVICE_SERENUM 0x00000037
5541 #define FILE_DEVICE_TERMSRV 0x00000038
5542 #define FILE_DEVICE_KSEC 0x00000039
5543 #define FILE_DEVICE_FIPS 0x0000003A
5544 #define FILE_DEVICE_INFINIBAND 0x0000003B
5545 #define FILE_DEVICE_VMBUS 0x0000003E
5546 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
5547 #define FILE_DEVICE_WPD 0x00000040
5548 #define FILE_DEVICE_BLUETOOTH 0x00000041
5549 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
5550 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
5551 #define FILE_DEVICE_BIOMETRIC 0x00000044
5552 #define FILE_DEVICE_PMI 0x00000045
5554 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
5556 typedef struct _OBJECT_HANDLE_INFORMATION
{
5557 ULONG HandleAttributes
;
5558 ACCESS_MASK GrantedAccess
;
5559 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
5561 typedef struct _CLIENT_ID
{
5562 HANDLE UniqueProcess
;
5563 HANDLE UniqueThread
;
5564 } CLIENT_ID
, *PCLIENT_ID
;
5567 (DDKAPI
*PKSTART_ROUTINE
)(
5568 IN PVOID StartContext
);
5570 typedef struct _VPB
{
5574 USHORT VolumeLabelLength
;
5575 struct _DEVICE_OBJECT
*DeviceObject
;
5576 struct _DEVICE_OBJECT
*RealDevice
;
5578 ULONG ReferenceCount
;
5579 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
5582 typedef enum _IO_ALLOCATION_ACTION
{
5585 DeallocateObjectKeepRegisters
5586 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
5588 typedef IO_ALLOCATION_ACTION
5589 (DDKAPI
*PDRIVER_CONTROL
)(
5590 IN
struct _DEVICE_OBJECT
*DeviceObject
,
5591 IN
struct _IRP
*Irp
,
5592 IN PVOID MapRegisterBase
,
5595 typedef struct _WAIT_CONTEXT_BLOCK
{
5596 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
5597 PDRIVER_CONTROL DeviceRoutine
;
5598 PVOID DeviceContext
;
5599 ULONG NumberOfMapRegisters
;
5602 PKDPC BufferChainingDpc
;
5603 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
5605 typedef struct _DEVICE_OBJECT
{
5608 LONG ReferenceCount
;
5609 struct _DRIVER_OBJECT
*DriverObject
;
5610 struct _DEVICE_OBJECT
*NextDevice
;
5611 struct _DEVICE_OBJECT
*AttachedDevice
;
5612 struct _IRP
*CurrentIrp
;
5615 ULONG Characteristics
;
5617 PVOID DeviceExtension
;
5618 DEVICE_TYPE DeviceType
;
5621 LIST_ENTRY ListEntry
;
5622 WAIT_CONTEXT_BLOCK Wcb
;
5624 ULONG AlignmentRequirement
;
5625 KDEVICE_QUEUE DeviceQueue
;
5627 ULONG ActiveThreadCount
;
5628 PSECURITY_DESCRIPTOR SecurityDescriptor
;
5632 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
5634 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
5636 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
5638 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
5640 BOOLEAN Reserved
[3];
5641 volatile LONG IoCount
;
5643 } IO_REMOVE_LOCK_COMMON_BLOCK
;
5645 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
5648 LONGLONG MaxLockedTicks
;
5650 LIST_ENTRY LockList
;
5652 volatile LONG LowMemoryCount
;
5655 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
5656 } IO_REMOVE_LOCK_DBG_BLOCK
;
5658 typedef struct _IO_REMOVE_LOCK
{
5659 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
5661 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
5663 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
5665 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
5668 (DDKAPI IO_WORKITEM_ROUTINE
)(
5669 IN PDEVICE_OBJECT DeviceObject
,
5671 typedef IO_WORKITEM_ROUTINE
*PIO_WORKITEM_ROUTINE
;
5673 typedef struct _SHARE_ACCESS
{
5681 } SHARE_ACCESS
, *PSHARE_ACCESS
;
5683 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
5684 inheritance, even from a struct renders the type non-POD. So we use
5686 #define PCI_COMMON_HEADER_LAYOUT \
5695 UCHAR CacheLineSize; \
5696 UCHAR LatencyTimer; \
5700 struct _PCI_HEADER_TYPE_0 { \
5701 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
5703 USHORT SubVendorID; \
5704 USHORT SubSystemID; \
5705 ULONG ROMBaseAddress; \
5706 UCHAR CapabilitiesPtr; \
5707 UCHAR Reserved1[3]; \
5709 UCHAR InterruptLine; \
5710 UCHAR InterruptPin; \
5711 UCHAR MinimumGrant; \
5712 UCHAR MaximumLatency; \
5714 struct _PCI_HEADER_TYPE_1 { \
5715 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
5717 UCHAR SecondaryBus; \
5718 UCHAR SubordinateBus; \
5719 UCHAR SecondaryLatency; \
5722 USHORT SecondaryStatus; \
5723 USHORT MemoryBase; \
5724 USHORT MemoryLimit; \
5725 USHORT PrefetchBase; \
5726 USHORT PrefetchLimit; \
5727 ULONG PrefetchBaseUpper32; \
5728 ULONG PrefetchLimitUpper32; \
5729 USHORT IOBaseUpper16; \
5730 USHORT IOLimitUpper16; \
5731 UCHAR CapabilitiesPtr; \
5732 UCHAR Reserved1[3]; \
5733 ULONG ROMBaseAddress; \
5734 UCHAR InterruptLine; \
5735 UCHAR InterruptPin; \
5736 USHORT BridgeControl; \
5738 struct _PCI_HEADER_TYPE_2 { \
5739 ULONG SocketRegistersBaseAddress; \
5740 UCHAR CapabilitiesPtr; \
5742 USHORT SecondaryStatus; \
5744 UCHAR SecondaryBus; \
5745 UCHAR SubordinateBus; \
5746 UCHAR SecondaryLatency; \
5750 } Range[PCI_TYPE2_ADDRESSES-1]; \
5751 UCHAR InterruptLine; \
5752 UCHAR InterruptPin; \
5753 USHORT BridgeControl; \
5757 typedef struct _PCI_COMMON_HEADER
{
5758 PCI_COMMON_HEADER_LAYOUT
5759 } PCI_COMMON_HEADER
, *PPCI_COMMON_HEADER
;
5762 typedef struct _PCI_COMMON_CONFIG
{
5763 PCI_COMMON_HEADER_LAYOUT
5764 UCHAR DeviceSpecific
[192];
5765 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
5767 typedef struct _PCI_COMMON_CONFIG
{
5768 PCI_COMMON_HEADER DUMMYSTRUCTNAME
;
5769 UCHAR DeviceSpecific
[192];
5770 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
5773 typedef enum _CREATE_FILE_TYPE
{
5775 CreateFileTypeNamedPipe
,
5776 CreateFileTypeMailslot
5779 #define IO_FORCE_ACCESS_CHECK 0x001
5780 #define IO_NO_PARAMETER_CHECKING 0x100
5782 #define IO_REPARSE 0x0
5783 #define IO_REMOUNT 0x1
5785 typedef struct _IO_STATUS_BLOCK
{
5786 _ANONYMOUS_UNION
union {
5790 ULONG_PTR Information
;
5791 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
5793 typedef struct _PCI_SLOT_NUMBER
{
5796 ULONG DeviceNumber
: 5;
5797 ULONG FunctionNumber
: 3;
5798 ULONG Reserved
: 24;
5802 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
5805 (DDKAPI
*PIO_APC_ROUTINE
)(
5806 IN PVOID ApcContext
,
5807 IN PIO_STATUS_BLOCK IoStatusBlock
,
5811 (DDKAPI
*WMI_NOTIFICATION_CALLBACK
)(
5815 #define EVENT_INCREMENT 1
5816 #define IO_NO_INCREMENT 0
5817 #define IO_CD_ROM_INCREMENT 1
5818 #define IO_DISK_INCREMENT 1
5819 #define IO_KEYBOARD_INCREMENT 6
5820 #define IO_MAILSLOT_INCREMENT 2
5821 #define IO_MOUSE_INCREMENT 6
5822 #define IO_NAMED_PIPE_INCREMENT 2
5823 #define IO_NETWORK_INCREMENT 2
5824 #define IO_PARALLEL_INCREMENT 1
5825 #define IO_SERIAL_INCREMENT 2
5826 #define IO_SOUND_INCREMENT 8
5827 #define IO_VIDEO_INCREMENT 1
5828 #define SEMAPHORE_INCREMENT 1
5830 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
5832 typedef struct _BOOTDISK_INFORMATION
{
5833 LONGLONG BootPartitionOffset
;
5834 LONGLONG SystemPartitionOffset
;
5835 ULONG BootDeviceSignature
;
5836 ULONG SystemDeviceSignature
;
5837 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
5839 typedef struct _BOOTDISK_INFORMATION_EX
{
5840 LONGLONG BootPartitionOffset
;
5841 LONGLONG SystemPartitionOffset
;
5842 ULONG BootDeviceSignature
;
5843 ULONG SystemDeviceSignature
;
5844 GUID BootDeviceGuid
;
5845 GUID SystemDeviceGuid
;
5846 BOOLEAN BootDeviceIsGpt
;
5847 BOOLEAN SystemDeviceIsGpt
;
5848 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
5850 typedef struct _EISA_MEMORY_TYPE
{
5851 UCHAR ReadWrite
: 1;
5853 UCHAR Reserved0
: 1;
5856 UCHAR Reserved1
: 1;
5857 UCHAR MoreEntries
: 1;
5858 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
5860 #include <pshpack1.h>
5861 typedef struct _EISA_MEMORY_CONFIGURATION
{
5862 EISA_MEMORY_TYPE ConfigurationByte
;
5864 USHORT AddressLowWord
;
5865 UCHAR AddressHighByte
;
5867 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
5868 #include <poppack.h>
5870 typedef struct _EISA_IRQ_DESCRIPTOR
{
5871 UCHAR Interrupt
: 4;
5873 UCHAR LevelTriggered
: 1;
5875 UCHAR MoreEntries
: 1;
5876 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
5878 typedef struct _EISA_IRQ_CONFIGURATION
{
5879 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
5881 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
5883 typedef struct _DMA_CONFIGURATION_BYTE0
{
5887 UCHAR MoreEntries
: 1;
5888 } DMA_CONFIGURATION_BYTE0
;
5890 typedef struct _DMA_CONFIGURATION_BYTE1
{
5891 UCHAR Reserved0
: 2;
5892 UCHAR TransferSize
: 2;
5894 UCHAR Reserved1
: 2;
5895 } DMA_CONFIGURATION_BYTE1
;
5897 typedef struct _EISA_DMA_CONFIGURATION
{
5898 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
5899 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
5900 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
5902 #include <pshpack1.h>
5903 typedef struct _EISA_PORT_DESCRIPTOR
{
5904 UCHAR NumberPorts
: 5;
5907 UCHAR MoreEntries
: 1;
5908 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
5910 typedef struct _EISA_PORT_CONFIGURATION
{
5911 EISA_PORT_DESCRIPTOR Configuration
;
5913 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
5914 #include <poppack.h>
5916 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
5920 UCHAR MinorRevision
;
5921 UCHAR MajorRevision
;
5922 UCHAR Selections
[26];
5923 UCHAR FunctionFlags
;
5924 UCHAR TypeString
[80];
5925 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
5926 EISA_IRQ_CONFIGURATION EisaIrq
[7];
5927 EISA_DMA_CONFIGURATION EisaDma
[4];
5928 EISA_PORT_CONFIGURATION EisaPort
[20];
5929 UCHAR InitializationData
[60];
5930 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
5932 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
5934 #define EISA_FUNCTION_ENABLED 0x80
5935 #define EISA_FREE_FORM_DATA 0x40
5936 #define EISA_HAS_PORT_INIT_ENTRY 0x20
5937 #define EISA_HAS_PORT_RANGE 0x10
5938 #define EISA_HAS_DMA_ENTRY 0x08
5939 #define EISA_HAS_IRQ_ENTRY 0x04
5940 #define EISA_HAS_MEMORY_ENTRY 0x02
5941 #define EISA_HAS_TYPE_ENTRY 0x01
5942 #define EISA_HAS_INFORMATION \
5943 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
5944 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
5946 typedef struct _CM_EISA_SLOT_INFORMATION
{
5949 UCHAR MajorRevision
;
5950 UCHAR MinorRevision
;
5952 UCHAR NumberFunctions
;
5953 UCHAR FunctionInformation
;
5955 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
5957 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
5959 #define EISA_INVALID_SLOT 0x80
5960 #define EISA_INVALID_FUNCTION 0x81
5961 #define EISA_INVALID_CONFIGURATION 0x82
5962 #define EISA_EMPTY_SLOT 0x83
5963 #define EISA_INVALID_BIOS_CALL 0x86
5966 ** Plug and Play structures
5970 (DDKAPI
*PINTERFACE_REFERENCE
)(
5974 (DDKAPI
*PINTERFACE_DEREFERENCE
)(
5978 (DDKAPI
*PTRANSLATE_BUS_ADDRESS
)(
5980 IN PHYSICAL_ADDRESS BusAddress
,
5982 IN OUT PULONG AddressSpace
,
5983 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
5985 typedef struct _DMA_ADAPTER
*
5986 (DDKAPI
*PGET_DMA_ADAPTER
)(
5988 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
5989 OUT PULONG NumberOfMapRegisters
);
5992 (DDKAPI
*PGET_SET_DEVICE_DATA
)(
5999 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
6000 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
6001 #define PCI_USE_REVISION 0x00000002
6002 #define PCI_USE_VENDEV_IDS 0x00000004
6003 #define PCI_USE_CLASS_SUBCLASS 0x00000008
6004 #define PCI_USE_PROGIF 0x00000010
6005 #define PCI_USE_LOCAL_BUS 0x00000020
6006 #define PCI_USE_LOCAL_DEVICE 0x00000040
6008 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS
{
6019 } PCI_DEVICE_PRESENCE_PARAMETERS
, *PPCI_DEVICE_PRESENCE_PARAMETERS
;
6022 (DDKAPI
*PPCI_IS_DEVICE_PRESENT
)(
6025 IN UCHAR RevisionID
,
6026 IN USHORT SubVendorID
,
6027 IN USHORT SubSystemID
,
6031 (DDKAPI
*PPCI_IS_DEVICE_PRESENT_EX
)(
6033 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
);
6035 typedef struct _BUS_INTERFACE_STANDARD
{
6039 PINTERFACE_REFERENCE InterfaceReference
;
6040 PINTERFACE_DEREFERENCE InterfaceDereference
;
6041 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
6042 PGET_DMA_ADAPTER GetDmaAdapter
;
6043 PGET_SET_DEVICE_DATA SetBusData
;
6044 PGET_SET_DEVICE_DATA GetBusData
;
6045 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
6047 typedef struct _PCI_DEVICE_PRESENT_INTERFACE
{
6051 PINTERFACE_REFERENCE InterfaceReference
;
6052 PINTERFACE_DEREFERENCE InterfaceDereference
;
6053 PPCI_IS_DEVICE_PRESENT IsDevicePresent
;
6054 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx
;
6055 } PCI_DEVICE_PRESENT_INTERFACE
, *PPCI_DEVICE_PRESENT_INTERFACE
;
6057 typedef struct _DEVICE_CAPABILITIES
{
6062 ULONG LockSupported
: 1;
6063 ULONG EjectSupported
: 1;
6064 ULONG Removable
: 1;
6065 ULONG DockDevice
: 1;
6067 ULONG SilentInstall
: 1;
6068 ULONG RawDeviceOK
: 1;
6069 ULONG SurpriseRemovalOK
: 1;
6070 ULONG WakeFromD0
: 1;
6071 ULONG WakeFromD1
: 1;
6072 ULONG WakeFromD2
: 1;
6073 ULONG WakeFromD3
: 1;
6074 ULONG HardwareDisabled
: 1;
6075 ULONG NonDynamic
: 1;
6076 ULONG WarmEjectSupported
: 1;
6077 ULONG NoDisplayInUI
: 1;
6078 ULONG Reserved
: 14;
6081 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
6082 SYSTEM_POWER_STATE SystemWake
;
6083 DEVICE_POWER_STATE DeviceWake
;
6087 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
6089 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
6093 GUID InterfaceClassGuid
;
6094 PUNICODE_STRING SymbolicLinkName
;
6095 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
6097 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
6101 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
6105 typedef struct _INTERFACE
{
6109 PINTERFACE_REFERENCE InterfaceReference
;
6110 PINTERFACE_DEREFERENCE InterfaceDereference
;
6111 } INTERFACE
, *PINTERFACE
;
6113 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
6117 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
6119 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
6121 /* PNP_DEVICE_STATE */
6123 #define PNP_DEVICE_DISABLED 0x00000001
6124 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
6125 #define PNP_DEVICE_FAILED 0x00000004
6126 #define PNP_DEVICE_REMOVED 0x00000008
6127 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
6128 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
6130 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
6134 struct _FILE_OBJECT
*FileObject
;
6135 LONG NameBufferOffset
;
6136 UCHAR CustomDataBuffer
[1];
6137 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
6139 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
6143 struct _FILE_OBJECT
*FileObject
;
6144 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
6146 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
6147 DeviceUsageTypeUndefined
,
6148 DeviceUsageTypePaging
,
6149 DeviceUsageTypeHibernation
,
6150 DeviceUsageTypeDumpFile
6151 } DEVICE_USAGE_NOTIFICATION_TYPE
;
6153 typedef struct _POWER_SEQUENCE
{
6157 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
6160 DevicePropertyDeviceDescription
= 0x0,
6161 DevicePropertyHardwareID
= 0x1,
6162 DevicePropertyCompatibleIDs
= 0x2,
6163 DevicePropertyBootConfiguration
= 0x3,
6164 DevicePropertyBootConfigurationTranslated
= 0x4,
6165 DevicePropertyClassName
= 0x5,
6166 DevicePropertyClassGuid
= 0x6,
6167 DevicePropertyDriverKeyName
= 0x7,
6168 DevicePropertyManufacturer
= 0x8,
6169 DevicePropertyFriendlyName
= 0x9,
6170 DevicePropertyLocationInformation
= 0xa,
6171 DevicePropertyPhysicalDeviceObjectName
= 0xb,
6172 DevicePropertyBusTypeGuid
= 0xc,
6173 DevicePropertyLegacyBusType
= 0xd,
6174 DevicePropertyBusNumber
= 0xe,
6175 DevicePropertyEnumeratorName
= 0xf,
6176 DevicePropertyAddress
= 0x10,
6177 DevicePropertyUINumber
= 0x11,
6178 DevicePropertyInstallState
= 0x12,
6179 DevicePropertyRemovalPolicy
= 0x13,
6180 DevicePropertyResourceRequirements
= 0x14,
6181 DevicePropertyAllocatedResources
= 0x15,
6182 DevicePropertyContainerID
= 0x16
6183 } DEVICE_REGISTRY_PROPERTY
;
6185 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
6186 EventCategoryReserved
,
6187 EventCategoryHardwareProfileChange
,
6188 EventCategoryDeviceInterfaceChange
,
6189 EventCategoryTargetDeviceChange
6190 } IO_NOTIFICATION_EVENT_CATEGORY
;
6192 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
6195 (DDKAPI
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
6196 IN PVOID NotificationStructure
,
6200 (DDKAPI
*PDEVICE_CHANGE_COMPLETE_CALLBACK
)(
6203 typedef enum _FILE_INFORMATION_CLASS
{
6204 FileDirectoryInformation
= 1,
6205 FileFullDirectoryInformation
,
6206 FileBothDirectoryInformation
,
6207 FileBasicInformation
,
6208 FileStandardInformation
,
6209 FileInternalInformation
,
6211 FileAccessInformation
,
6212 FileNameInformation
,
6213 FileRenameInformation
,
6214 FileLinkInformation
,
6215 FileNamesInformation
,
6216 FileDispositionInformation
,
6217 FilePositionInformation
,
6218 FileFullEaInformation
,
6219 FileModeInformation
,
6220 FileAlignmentInformation
,
6222 FileAllocationInformation
,
6223 FileEndOfFileInformation
,
6224 FileAlternateNameInformation
,
6225 FileStreamInformation
,
6226 FilePipeInformation
,
6227 FilePipeLocalInformation
,
6228 FilePipeRemoteInformation
,
6229 FileMailslotQueryInformation
,
6230 FileMailslotSetInformation
,
6231 FileCompressionInformation
,
6232 FileObjectIdInformation
,
6233 FileCompletionInformation
,
6234 FileMoveClusterInformation
,
6235 FileQuotaInformation
,
6236 FileReparsePointInformation
,
6237 FileNetworkOpenInformation
,
6238 FileAttributeTagInformation
,
6239 FileTrackingInformation
,
6240 FileIdBothDirectoryInformation
,
6241 FileIdFullDirectoryInformation
,
6242 FileValidDataLengthInformation
,
6243 FileShortNameInformation
,
6244 FileIoCompletionNotificationInformation
,
6245 FileIoStatusBlockRangeInformation
,
6246 FileIoPriorityHintInformation
,
6247 FileSfioReserveInformation
,
6248 FileSfioVolumeInformation
,
6249 FileHardLinkInformation
,
6250 FileProcessIdsUsingFileInformation
,
6251 FileNormalizedNameInformation
,
6252 FileNetworkPhysicalNameInformation
,
6253 FileIdGlobalTxDirectoryInformation
,
6254 FileIsRemoteDeviceInformation
,
6255 FileAttributeCacheInformation
,
6256 FileNumaNodeInformation
,
6257 FileStandardLinkInformation
,
6258 FileRemoteProtocolInformation
,
6259 FileMaximumInformation
6260 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
6262 typedef struct _FILE_POSITION_INFORMATION
{
6263 LARGE_INTEGER CurrentByteOffset
;
6264 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
6266 #include <pshpack8.h>
6267 typedef struct _FILE_BASIC_INFORMATION
{
6268 LARGE_INTEGER CreationTime
;
6269 LARGE_INTEGER LastAccessTime
;
6270 LARGE_INTEGER LastWriteTime
;
6271 LARGE_INTEGER ChangeTime
;
6272 ULONG FileAttributes
;
6273 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
6274 #include <poppack.h>
6276 typedef struct _FILE_STANDARD_INFORMATION
{
6277 LARGE_INTEGER AllocationSize
;
6278 LARGE_INTEGER EndOfFile
;
6279 ULONG NumberOfLinks
;
6280 BOOLEAN DeletePending
;
6282 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
6284 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
6285 LARGE_INTEGER CreationTime
;
6286 LARGE_INTEGER LastAccessTime
;
6287 LARGE_INTEGER LastWriteTime
;
6288 LARGE_INTEGER ChangeTime
;
6289 LARGE_INTEGER AllocationSize
;
6290 LARGE_INTEGER EndOfFile
;
6291 ULONG FileAttributes
;
6292 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
6294 typedef enum _FSINFOCLASS
{
6295 FileFsVolumeInformation
= 1,
6296 FileFsLabelInformation
,
6297 FileFsSizeInformation
,
6298 FileFsDeviceInformation
,
6299 FileFsAttributeInformation
,
6300 FileFsControlInformation
,
6301 FileFsFullSizeInformation
,
6302 FileFsObjectIdInformation
,
6303 FileFsDriverPathInformation
,
6304 FileFsVolumeFlagsInformation
,
6305 FileFsMaximumInformation
6306 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
6308 typedef struct _FILE_FS_DEVICE_INFORMATION
{
6309 DEVICE_TYPE DeviceType
;
6310 ULONG Characteristics
;
6311 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
6313 typedef struct _FILE_FULL_EA_INFORMATION
{
6314 ULONG NextEntryOffset
;
6317 USHORT EaValueLength
;
6319 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
6321 #define FM_LOCK_BIT (0x1)
6322 #define FM_LOCK_BIT_V (0x0)
6323 #define FM_LOCK_WAITER_WOKEN (0x2)
6324 #define FM_LOCK_WAITER_INC (0x4)
6326 typedef struct _FAST_MUTEX
{
6327 volatile LONG Count
;
6332 } FAST_MUTEX
, *PFAST_MUTEX
;
6334 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
6336 typedef struct _OWNER_ENTRY
{
6337 ERESOURCE_THREAD OwnerThread
;
6338 _ANONYMOUS_UNION
union {
6342 } OWNER_ENTRY
, *POWNER_ENTRY
;
6344 typedef struct _ERESOURCE
6346 LIST_ENTRY SystemResourcesList
;
6347 POWNER_ENTRY OwnerTable
;
6350 volatile PKSEMAPHORE SharedWaiters
;
6351 volatile PKEVENT ExclusiveWaiters
;
6352 OWNER_ENTRY OwnerEntry
;
6353 ULONG ActiveEntries
;
6354 ULONG ContentionCount
;
6355 ULONG NumberOfSharedWaiters
;
6356 ULONG NumberOfExclusiveWaiters
;
6357 __GNU_EXTENSION
union
6360 ULONG_PTR CreatorBackTraceIndex
;
6362 KSPIN_LOCK SpinLock
;
6363 } ERESOURCE
, *PERESOURCE
;
6365 /* ERESOURCE.Flag */
6366 #define ResourceNeverExclusive 0x0010
6367 #define ResourceReleaseByOtherThread 0x0020
6368 #define ResourceOwnedExclusive 0x0080
6370 #define RESOURCE_HASH_TABLE_SIZE 64
6373 (DDKAPI
*PFAST_IO_CHECK_IF_POSSIBLE
)(
6374 IN
struct _FILE_OBJECT
*FileObject
,
6375 IN PLARGE_INTEGER FileOffset
,
6379 IN BOOLEAN CheckForReadOperation
,
6380 OUT PIO_STATUS_BLOCK IoStatus
,
6381 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6384 (DDKAPI
*PFAST_IO_READ
)(
6385 IN
struct _FILE_OBJECT
*FileObject
,
6386 IN PLARGE_INTEGER FileOffset
,
6391 OUT PIO_STATUS_BLOCK IoStatus
,
6392 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6395 (DDKAPI
*PFAST_IO_WRITE
)(
6396 IN
struct _FILE_OBJECT
*FileObject
,
6397 IN PLARGE_INTEGER FileOffset
,
6402 OUT PIO_STATUS_BLOCK IoStatus
,
6403 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6406 (DDKAPI
*PFAST_IO_QUERY_BASIC_INFO
)(
6407 IN
struct _FILE_OBJECT
*FileObject
,
6409 OUT PFILE_BASIC_INFORMATION Buffer
,
6410 OUT PIO_STATUS_BLOCK IoStatus
,
6411 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6414 (DDKAPI
*PFAST_IO_QUERY_STANDARD_INFO
)(
6415 IN
struct _FILE_OBJECT
*FileObject
,
6417 OUT PFILE_STANDARD_INFORMATION Buffer
,
6418 OUT PIO_STATUS_BLOCK IoStatus
,
6419 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6422 (DDKAPI
*PFAST_IO_LOCK
)(
6423 IN
struct _FILE_OBJECT
*FileObject
,
6424 IN PLARGE_INTEGER FileOffset
,
6425 IN PLARGE_INTEGER Length
,
6426 PEPROCESS ProcessId
,
6428 BOOLEAN FailImmediately
,
6429 BOOLEAN ExclusiveLock
,
6430 OUT PIO_STATUS_BLOCK IoStatus
,
6431 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6434 (DDKAPI
*PFAST_IO_UNLOCK_SINGLE
)(
6435 IN
struct _FILE_OBJECT
*FileObject
,
6436 IN PLARGE_INTEGER FileOffset
,
6437 IN PLARGE_INTEGER Length
,
6438 PEPROCESS ProcessId
,
6440 OUT PIO_STATUS_BLOCK IoStatus
,
6441 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6444 (DDKAPI
*PFAST_IO_UNLOCK_ALL
)(
6445 IN
struct _FILE_OBJECT
*FileObject
,
6446 PEPROCESS ProcessId
,
6447 OUT PIO_STATUS_BLOCK IoStatus
,
6448 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6451 (DDKAPI
*PFAST_IO_UNLOCK_ALL_BY_KEY
)(
6452 IN
struct _FILE_OBJECT
*FileObject
,
6455 OUT PIO_STATUS_BLOCK IoStatus
,
6456 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6459 (DDKAPI
*PFAST_IO_DEVICE_CONTROL
)(
6460 IN
struct _FILE_OBJECT
*FileObject
,
6462 IN PVOID InputBuffer OPTIONAL
,
6463 IN ULONG InputBufferLength
,
6464 OUT PVOID OutputBuffer OPTIONAL
,
6465 IN ULONG OutputBufferLength
,
6466 IN ULONG IoControlCode
,
6467 OUT PIO_STATUS_BLOCK IoStatus
,
6468 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6471 (DDKAPI
*PFAST_IO_ACQUIRE_FILE
)(
6472 IN
struct _FILE_OBJECT
*FileObject
);
6475 (DDKAPI
*PFAST_IO_RELEASE_FILE
)(
6476 IN
struct _FILE_OBJECT
*FileObject
);
6479 (DDKAPI
*PFAST_IO_DETACH_DEVICE
)(
6480 IN
struct _DEVICE_OBJECT
*SourceDevice
,
6481 IN
struct _DEVICE_OBJECT
*TargetDevice
);
6484 (DDKAPI
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
)(
6485 IN
struct _FILE_OBJECT
*FileObject
,
6487 OUT
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
6488 OUT
struct _IO_STATUS_BLOCK
*IoStatus
,
6489 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6492 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
6493 IN
struct _FILE_OBJECT
*FileObject
,
6494 IN PLARGE_INTEGER EndingOffset
,
6495 OUT
struct _ERESOURCE
**ResourceToRelease
,
6496 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6499 (DDKAPI
*PFAST_IO_MDL_READ
)(
6500 IN
struct _FILE_OBJECT
*FileObject
,
6501 IN PLARGE_INTEGER FileOffset
,
6505 OUT PIO_STATUS_BLOCK IoStatus
,
6506 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6509 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE
)(
6510 IN
struct _FILE_OBJECT
*FileObject
,
6512 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6515 (DDKAPI
*PFAST_IO_PREPARE_MDL_WRITE
)(
6516 IN
struct _FILE_OBJECT
*FileObject
,
6517 IN PLARGE_INTEGER FileOffset
,
6521 OUT PIO_STATUS_BLOCK IoStatus
,
6522 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6525 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE
)(
6526 IN
struct _FILE_OBJECT
*FileObject
,
6527 IN PLARGE_INTEGER FileOffset
,
6529 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6532 (DDKAPI
*PFAST_IO_READ_COMPRESSED
)(
6533 IN
struct _FILE_OBJECT
*FileObject
,
6534 IN PLARGE_INTEGER FileOffset
,
6539 OUT PIO_STATUS_BLOCK IoStatus
,
6540 OUT
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
6541 IN ULONG CompressedDataInfoLength
,
6542 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6545 (DDKAPI
*PFAST_IO_WRITE_COMPRESSED
)(
6546 IN
struct _FILE_OBJECT
*FileObject
,
6547 IN PLARGE_INTEGER FileOffset
,
6552 OUT PIO_STATUS_BLOCK IoStatus
,
6553 IN
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
6554 IN ULONG CompressedDataInfoLength
,
6555 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6558 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
6559 IN
struct _FILE_OBJECT
*FileObject
,
6561 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6564 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
6565 IN
struct _FILE_OBJECT
*FileObject
,
6566 IN PLARGE_INTEGER FileOffset
,
6568 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6571 (DDKAPI
*PFAST_IO_QUERY_OPEN
)(
6572 IN
struct _IRP
*Irp
,
6573 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
6574 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6577 (DDKAPI
*PFAST_IO_RELEASE_FOR_MOD_WRITE
)(
6578 IN
struct _FILE_OBJECT
*FileObject
,
6579 IN
struct _ERESOURCE
*ResourceToRelease
,
6580 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6583 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
)(
6584 IN
struct _FILE_OBJECT
*FileObject
,
6585 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6588 (DDKAPI
*PFAST_IO_RELEASE_FOR_CCFLUSH
) (
6589 IN
struct _FILE_OBJECT
*FileObject
,
6590 IN
struct _DEVICE_OBJECT
*DeviceObject
);
6592 typedef struct _FAST_IO_DISPATCH
{
6593 ULONG SizeOfFastIoDispatch
;
6594 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
6595 PFAST_IO_READ FastIoRead
;
6596 PFAST_IO_WRITE FastIoWrite
;
6597 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
6598 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
6599 PFAST_IO_LOCK FastIoLock
;
6600 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
6601 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
6602 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
6603 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
6604 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
6605 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
6606 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
6607 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
6608 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
6609 PFAST_IO_MDL_READ MdlRead
;
6610 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
6611 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
6612 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
6613 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
6614 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
6615 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
6616 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
6617 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
6618 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
6619 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
6620 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
6621 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
6623 typedef struct _SECTION_OBJECT_POINTERS
{
6624 PVOID DataSectionObject
;
6625 PVOID SharedCacheMap
;
6626 PVOID ImageSectionObject
;
6627 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
6629 typedef struct _IO_COMPLETION_CONTEXT
{
6632 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
6634 /* FILE_OBJECT.Flags */
6635 #define FO_FILE_OPEN 0x00000001
6636 #define FO_SYNCHRONOUS_IO 0x00000002
6637 #define FO_ALERTABLE_IO 0x00000004
6638 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
6639 #define FO_WRITE_THROUGH 0x00000010
6640 #define FO_SEQUENTIAL_ONLY 0x00000020
6641 #define FO_CACHE_SUPPORTED 0x00000040
6642 #define FO_NAMED_PIPE 0x00000080
6643 #define FO_STREAM_FILE 0x00000100
6644 #define FO_MAILSLOT 0x00000200
6645 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
6646 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
6647 #define FO_DIRECT_DEVICE_OPEN 0x00000800
6648 #define FO_FILE_MODIFIED 0x00001000
6649 #define FO_FILE_SIZE_CHANGED 0x00002000
6650 #define FO_CLEANUP_COMPLETE 0x00004000
6651 #define FO_TEMPORARY_FILE 0x00008000
6652 #define FO_DELETE_ON_CLOSE 0x00010000
6653 #define FO_OPENED_CASE_SENSITIVE 0x00020000
6654 #define FO_HANDLE_CREATED 0x00040000
6655 #define FO_FILE_FAST_IO_READ 0x00080000
6656 #define FO_RANDOM_ACCESS 0x00100000
6657 #define FO_FILE_OPEN_CANCELLED 0x00200000
6658 #define FO_VOLUME_OPEN 0x00400000
6659 #define FO_REMOTE_ORIGIN 0x01000000
6660 #define FO_DISALLOW_EXCLUSIVE 0x02000000
6661 #define FO_SKIP_COMPLETION_PORT 0x02000000
6662 #define FO_SKIP_SET_EVENT 0x04000000
6663 #define FO_SKIP_SET_FAST_IO 0x08000000
6666 #define VPB_MOUNTED 0x0001
6667 #define VPB_LOCKED 0x0002
6668 #define VPB_PERSISTENT 0x0004
6669 #define VPB_REMOVE_PENDING 0x0008
6670 #define VPB_RAW_MOUNT 0x0010
6671 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
6675 #define SL_FORCE_ACCESS_CHECK 0x01
6676 #define SL_OPEN_PAGING_FILE 0x02
6677 #define SL_OPEN_TARGET_DIRECTORY 0x04
6678 #define SL_CASE_SENSITIVE 0x80
6680 #define SL_KEY_SPECIFIED 0x01
6681 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
6682 #define SL_WRITE_THROUGH 0x04
6683 #define SL_FT_SEQUENTIAL_WRITE 0x08
6685 #define SL_FAIL_IMMEDIATELY 0x01
6686 #define SL_EXCLUSIVE_LOCK 0x02
6688 #define SL_RESTART_SCAN 0x01
6689 #define SL_RETURN_SINGLE_ENTRY 0x02
6690 #define SL_INDEX_SPECIFIED 0x04
6692 #define SL_WATCH_TREE 0x01
6694 #define SL_ALLOW_RAW_MOUNT 0x01
6696 #define CTL_CODE(DeviceType, Function, Method, Access) \
6697 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
6699 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
6701 #define IRP_NOCACHE 0x00000001
6702 #define IRP_PAGING_IO 0x00000002
6703 #define IRP_MOUNT_COMPLETION 0x00000002
6704 #define IRP_SYNCHRONOUS_API 0x00000004
6705 #define IRP_ASSOCIATED_IRP 0x00000008
6706 #define IRP_BUFFERED_IO 0x00000010
6707 #define IRP_DEALLOCATE_BUFFER 0x00000020
6708 #define IRP_INPUT_OPERATION 0x00000040
6709 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
6710 #define IRP_CREATE_OPERATION 0x00000080
6711 #define IRP_READ_OPERATION 0x00000100
6712 #define IRP_WRITE_OPERATION 0x00000200
6713 #define IRP_CLOSE_OPERATION 0x00000400
6714 #define IRP_DEFER_IO_COMPLETION 0x00000800
6715 #define IRP_OB_QUERY_NAME 0x00001000
6716 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
6718 #define IRP_QUOTA_CHARGED 0x01
6719 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
6720 #define IRP_ALLOCATED_FIXED_SIZE 0x04
6721 #define IRP_LOOKASIDE_ALLOCATION 0x08
6724 ** IRP function codes
6727 #define IRP_MJ_CREATE 0x00
6728 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
6729 #define IRP_MJ_CLOSE 0x02
6730 #define IRP_MJ_READ 0x03
6731 #define IRP_MJ_WRITE 0x04
6732 #define IRP_MJ_QUERY_INFORMATION 0x05
6733 #define IRP_MJ_SET_INFORMATION 0x06
6734 #define IRP_MJ_QUERY_EA 0x07
6735 #define IRP_MJ_SET_EA 0x08
6736 #define IRP_MJ_FLUSH_BUFFERS 0x09
6737 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
6738 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
6739 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
6740 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
6741 #define IRP_MJ_DEVICE_CONTROL 0x0e
6742 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
6743 #define IRP_MJ_SCSI 0x0f
6744 #define IRP_MJ_SHUTDOWN 0x10
6745 #define IRP_MJ_LOCK_CONTROL 0x11
6746 #define IRP_MJ_CLEANUP 0x12
6747 #define IRP_MJ_CREATE_MAILSLOT 0x13
6748 #define IRP_MJ_QUERY_SECURITY 0x14
6749 #define IRP_MJ_SET_SECURITY 0x15
6750 #define IRP_MJ_POWER 0x16
6751 #define IRP_MJ_SYSTEM_CONTROL 0x17
6752 #define IRP_MJ_DEVICE_CHANGE 0x18
6753 #define IRP_MJ_QUERY_QUOTA 0x19
6754 #define IRP_MJ_SET_QUOTA 0x1a
6755 #define IRP_MJ_PNP 0x1b
6756 #define IRP_MJ_PNP_POWER 0x1b
6757 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
6759 #define IRP_MN_SCSI_CLASS 0x01
6761 #define IRP_MN_START_DEVICE 0x00
6762 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
6763 #define IRP_MN_REMOVE_DEVICE 0x02
6764 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
6765 #define IRP_MN_STOP_DEVICE 0x04
6766 #define IRP_MN_QUERY_STOP_DEVICE 0x05
6767 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
6769 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
6770 #define IRP_MN_QUERY_INTERFACE 0x08
6771 #define IRP_MN_QUERY_CAPABILITIES 0x09
6772 #define IRP_MN_QUERY_RESOURCES 0x0A
6773 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
6774 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
6775 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
6777 #define IRP_MN_READ_CONFIG 0x0F
6778 #define IRP_MN_WRITE_CONFIG 0x10
6779 #define IRP_MN_EJECT 0x11
6780 #define IRP_MN_SET_LOCK 0x12
6781 #define IRP_MN_QUERY_ID 0x13
6782 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
6783 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
6784 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
6785 #define IRP_MN_SURPRISE_REMOVAL 0x17
6787 #define IRP_MN_WAIT_WAKE 0x00
6788 #define IRP_MN_POWER_SEQUENCE 0x01
6789 #define IRP_MN_SET_POWER 0x02
6790 #define IRP_MN_QUERY_POWER 0x03
6792 #define IRP_MN_QUERY_ALL_DATA 0x00
6793 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
6794 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
6795 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
6796 #define IRP_MN_ENABLE_EVENTS 0x04
6797 #define IRP_MN_DISABLE_EVENTS 0x05
6798 #define IRP_MN_ENABLE_COLLECTION 0x06
6799 #define IRP_MN_DISABLE_COLLECTION 0x07
6800 #define IRP_MN_REGINFO 0x08
6801 #define IRP_MN_EXECUTE_METHOD 0x09
6803 #define IRP_MN_REGINFO_EX 0x0b
6805 typedef struct _FILE_OBJECT
6809 PDEVICE_OBJECT DeviceObject
;
6813 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
6814 PVOID PrivateCacheMap
;
6815 NTSTATUS FinalStatus
;
6816 struct _FILE_OBJECT
*RelatedFileObject
;
6817 BOOLEAN LockOperation
;
6818 BOOLEAN DeletePending
;
6820 BOOLEAN WriteAccess
;
6821 BOOLEAN DeleteAccess
;
6823 BOOLEAN SharedWrite
;
6824 BOOLEAN SharedDelete
;
6826 UNICODE_STRING FileName
;
6827 LARGE_INTEGER CurrentByteOffset
;
6828 volatile ULONG Waiters
;
6829 volatile ULONG Busy
;
6833 volatile PIO_COMPLETION_CONTEXT CompletionContext
;
6834 KSPIN_LOCK IrpListLock
;
6836 volatile PVOID FileObjectExtension
;
6837 } FILE_OBJECT
, *PFILE_OBJECT
;
6839 typedef struct _IO_ERROR_LOG_PACKET
{
6840 UCHAR MajorFunctionCode
;
6842 USHORT DumpDataSize
;
6843 USHORT NumberOfStrings
;
6844 USHORT StringOffset
;
6845 USHORT EventCategory
;
6847 ULONG UniqueErrorValue
;
6848 NTSTATUS FinalStatus
;
6849 ULONG SequenceNumber
;
6850 ULONG IoControlCode
;
6851 LARGE_INTEGER DeviceOffset
;
6853 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
6855 typedef struct _IO_ERROR_LOG_MESSAGE
{
6858 USHORT DriverNameLength
;
6859 LARGE_INTEGER TimeStamp
;
6860 ULONG DriverNameOffset
;
6861 IO_ERROR_LOG_PACKET EntryData
;
6862 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
6864 #define ERROR_LOG_LIMIT_SIZE 240
6865 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
6866 sizeof(IO_ERROR_LOG_PACKET) + \
6867 (sizeof(WCHAR) * 40))
6868 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
6869 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6870 #define IO_ERROR_LOG_MESSAGE_LENGTH \
6871 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
6872 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
6873 PORT_MAXIMUM_MESSAGE_LENGTH)
6874 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
6875 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6877 typedef enum _DMA_WIDTH
{
6882 } DMA_WIDTH
, *PDMA_WIDTH
;
6884 typedef enum _DMA_SPEED
{
6891 } DMA_SPEED
, *PDMA_SPEED
;
6893 /* DEVICE_DESCRIPTION.Version */
6895 #define DEVICE_DESCRIPTION_VERSION 0x0000
6896 #define DEVICE_DESCRIPTION_VERSION1 0x0001
6897 #define DEVICE_DESCRIPTION_VERSION2 0x0002
6899 typedef struct _DEVICE_DESCRIPTION
{
6902 BOOLEAN ScatterGather
;
6904 BOOLEAN AutoInitialize
;
6905 BOOLEAN Dma32BitAddresses
;
6906 BOOLEAN IgnoreCount
;
6908 BOOLEAN Dma64BitAddresses
;
6911 INTERFACE_TYPE InterfaceType
;
6914 ULONG MaximumLength
;
6916 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
6918 typedef enum _DEVICE_RELATION_TYPE
{
6923 TargetDeviceRelation
,
6926 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
6928 typedef struct _DEVICE_RELATIONS
{
6930 PDEVICE_OBJECT Objects
[1];
6931 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
6933 typedef struct _DEVOBJ_EXTENSION
6937 PDEVICE_OBJECT DeviceObject
;
6938 } DEVOBJ_EXTENSION
, *PDEVOBJ_EXTENSION
;
6940 typedef struct _SCATTER_GATHER_ELEMENT
{
6941 PHYSICAL_ADDRESS Address
;
6944 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
6946 #if defined(_MSC_EXTENSIONS)
6948 #if _MSC_VER >= 1200
6949 #pragma warning(push)
6951 #pragma warning(disable:4200)
6952 typedef struct _SCATTER_GATHER_LIST
{
6953 ULONG NumberOfElements
;
6955 SCATTER_GATHER_ELEMENT Elements
[1];
6956 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
6958 #if _MSC_VER >= 1200
6959 #pragma warning(pop)
6961 #pragma warning(default:4200)
6966 struct _SCATTER_GATHER_LIST
;
6967 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
6972 (DDKAPI DRIVER_ADD_DEVICE
)(
6973 IN
struct _DRIVER_OBJECT
*DriverObject
,
6974 IN
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
6975 typedef DRIVER_ADD_DEVICE
*PDRIVER_ADD_DEVICE
;
6977 typedef struct _DRIVER_EXTENSION
{
6978 struct _DRIVER_OBJECT
*DriverObject
;
6979 PDRIVER_ADD_DEVICE AddDevice
;
6981 UNICODE_STRING ServiceKeyName
;
6982 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
6984 #define DRVO_UNLOAD_INVOKED 0x00000001
6985 #define DRVO_LEGACY_DRIVER 0x00000002
6986 #define DRVO_BUILTIN_DRIVER 0x00000004
6989 (DDKAPI DRIVER_INITIALIZE
)(
6990 IN
struct _DRIVER_OBJECT
*DriverObject
,
6991 IN PUNICODE_STRING RegistryPath
);
6992 typedef DRIVER_INITIALIZE
*PDRIVER_INITIALIZE
;
6995 (DDKAPI DRIVER_STARTIO
)(
6996 IN
struct _DEVICE_OBJECT
*DeviceObject
,
6997 IN
struct _IRP
*Irp
);
6998 typedef DRIVER_STARTIO
*PDRIVER_STARTIO
;
7001 (DDKAPI DRIVER_UNLOAD
)(
7002 IN
struct _DRIVER_OBJECT
*DriverObject
);
7003 typedef DRIVER_UNLOAD
*PDRIVER_UNLOAD
;
7006 (DDKAPI DRIVER_DISPATCH
)(
7007 IN
struct _DEVICE_OBJECT
*DeviceObject
,
7008 IN
struct _IRP
*Irp
);
7009 typedef DRIVER_DISPATCH
*PDRIVER_DISPATCH
;
7011 typedef struct _DRIVER_OBJECT
{
7014 PDEVICE_OBJECT DeviceObject
;
7018 PVOID DriverSection
;
7019 PDRIVER_EXTENSION DriverExtension
;
7020 UNICODE_STRING DriverName
;
7021 PUNICODE_STRING HardwareDatabase
;
7022 struct _FAST_IO_DISPATCH
*FastIoDispatch
;
7023 PDRIVER_INITIALIZE DriverInit
;
7024 PDRIVER_STARTIO DriverStartIo
;
7025 PDRIVER_UNLOAD DriverUnload
;
7026 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
7028 typedef struct _DRIVER_OBJECT
*PDRIVER_OBJECT
;
7030 typedef struct _DMA_ADAPTER
{
7033 struct _DMA_OPERATIONS
* DmaOperations
;
7034 } DMA_ADAPTER
, *PDMA_ADAPTER
;
7037 (DDKAPI
*PPUT_DMA_ADAPTER
)(
7038 IN PDMA_ADAPTER DmaAdapter
);
7041 (DDKAPI
*PALLOCATE_COMMON_BUFFER
)(
7042 IN PDMA_ADAPTER DmaAdapter
,
7044 OUT PPHYSICAL_ADDRESS LogicalAddress
,
7045 IN BOOLEAN CacheEnabled
);
7048 (DDKAPI
*PFREE_COMMON_BUFFER
)(
7049 IN PDMA_ADAPTER DmaAdapter
,
7051 IN PHYSICAL_ADDRESS LogicalAddress
,
7052 IN PVOID VirtualAddress
,
7053 IN BOOLEAN CacheEnabled
);
7056 (DDKAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
7057 IN PDMA_ADAPTER DmaAdapter
,
7058 IN PDEVICE_OBJECT DeviceObject
,
7059 IN ULONG NumberOfMapRegisters
,
7060 IN PDRIVER_CONTROL ExecutionRoutine
,
7064 (DDKAPI
*PFLUSH_ADAPTER_BUFFERS
)(
7065 IN PDMA_ADAPTER DmaAdapter
,
7067 IN PVOID MapRegisterBase
,
7070 IN BOOLEAN WriteToDevice
);
7073 (DDKAPI
*PFREE_ADAPTER_CHANNEL
)(
7074 IN PDMA_ADAPTER DmaAdapter
);
7077 (DDKAPI
*PFREE_MAP_REGISTERS
)(
7078 IN PDMA_ADAPTER DmaAdapter
,
7079 PVOID MapRegisterBase
,
7080 ULONG NumberOfMapRegisters
);
7082 typedef PHYSICAL_ADDRESS
7083 (DDKAPI
*PMAP_TRANSFER
)(
7084 IN PDMA_ADAPTER DmaAdapter
,
7086 IN PVOID MapRegisterBase
,
7088 IN OUT PULONG Length
,
7089 IN BOOLEAN WriteToDevice
);
7092 (DDKAPI
*PGET_DMA_ALIGNMENT
)(
7093 IN PDMA_ADAPTER DmaAdapter
);
7096 (DDKAPI
*PREAD_DMA_COUNTER
)(
7097 IN PDMA_ADAPTER DmaAdapter
);
7100 (DDKAPI
*PDRIVER_LIST_CONTROL
)(
7101 IN
struct _DEVICE_OBJECT
*DeviceObject
,
7102 IN
struct _IRP
*Irp
,
7103 IN
struct _SCATTER_GATHER_LIST
*ScatterGather
,
7107 (DDKAPI
*PGET_SCATTER_GATHER_LIST
)(
7108 IN PDMA_ADAPTER DmaAdapter
,
7109 IN PDEVICE_OBJECT DeviceObject
,
7113 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
7115 IN BOOLEAN WriteToDevice
);
7118 (DDKAPI
*PPUT_SCATTER_GATHER_LIST
)(
7119 IN PDMA_ADAPTER DmaAdapter
,
7120 IN PSCATTER_GATHER_LIST ScatterGather
,
7121 IN BOOLEAN WriteToDevice
);
7124 (DDKAPI
*PCALCULATE_SCATTER_GATHER_LIST_SIZE
)(
7125 IN PDMA_ADAPTER DmaAdapter
,
7126 IN PMDL Mdl OPTIONAL
,
7129 OUT PULONG ScatterGatherListSize
,
7130 OUT PULONG pNumberOfMapRegisters OPTIONAL
);
7133 (DDKAPI
*PBUILD_SCATTER_GATHER_LIST
)(
7134 IN PDMA_ADAPTER DmaAdapter
,
7135 IN PDEVICE_OBJECT DeviceObject
,
7139 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
7141 IN BOOLEAN WriteToDevice
,
7142 IN PVOID ScatterGatherBuffer
,
7143 IN ULONG ScatterGatherLength
);
7146 (DDKAPI
*PBUILD_MDL_FROM_SCATTER_GATHER_LIST
)(
7147 IN PDMA_ADAPTER DmaAdapter
,
7148 IN PSCATTER_GATHER_LIST ScatterGather
,
7149 IN PMDL OriginalMdl
,
7150 OUT PMDL
*TargetMdl
);
7152 typedef struct _DMA_OPERATIONS
{
7154 PPUT_DMA_ADAPTER PutDmaAdapter
;
7155 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
;
7156 PFREE_COMMON_BUFFER FreeCommonBuffer
;
7157 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
7158 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
7159 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
7160 PFREE_MAP_REGISTERS FreeMapRegisters
;
7161 PMAP_TRANSFER MapTransfer
;
7162 PGET_DMA_ALIGNMENT GetDmaAlignment
;
7163 PREAD_DMA_COUNTER ReadDmaCounter
;
7164 PGET_SCATTER_GATHER_LIST GetScatterGatherList
;
7165 PPUT_SCATTER_GATHER_LIST PutScatterGatherList
;
7166 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList
;
7167 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList
;
7168 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList
;
7169 } DMA_OPERATIONS
, *PDMA_OPERATIONS
;
7171 typedef struct _IO_RESOURCE_DESCRIPTOR
{
7174 UCHAR ShareDisposition
;
7182 PHYSICAL_ADDRESS MinimumAddress
;
7183 PHYSICAL_ADDRESS MaximumAddress
;
7188 PHYSICAL_ADDRESS MinimumAddress
;
7189 PHYSICAL_ADDRESS MaximumAddress
;
7192 ULONG MinimumVector
;
7193 ULONG MaximumVector
;
7196 ULONG MinimumChannel
;
7197 ULONG MaximumChannel
;
7202 PHYSICAL_ADDRESS MinimumAddress
;
7203 PHYSICAL_ADDRESS MaximumAddress
;
7220 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
7222 typedef struct _IO_RESOURCE_LIST
{
7226 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
7227 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
7229 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
7231 INTERFACE_TYPE InterfaceType
;
7235 ULONG AlternativeLists
;
7236 IO_RESOURCE_LIST List
[1];
7237 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
7240 (DDKAPI DRIVER_CANCEL
)(
7241 IN
struct _DEVICE_OBJECT
*DeviceObject
,
7242 IN
struct _IRP
*Irp
);
7243 typedef DRIVER_CANCEL
*PDRIVER_CANCEL
;
7245 typedef struct _IRP
{
7248 struct _MDL
*MdlAddress
;
7251 struct _IRP
*MasterIrp
;
7252 volatile LONG IrpCount
;
7255 LIST_ENTRY ThreadListEntry
;
7256 IO_STATUS_BLOCK IoStatus
;
7257 KPROCESSOR_MODE RequestorMode
;
7258 BOOLEAN PendingReturned
;
7260 CHAR CurrentLocation
;
7263 CCHAR ApcEnvironment
;
7264 UCHAR AllocationFlags
;
7265 PIO_STATUS_BLOCK UserIosb
;
7269 _ANONYMOUS_UNION
union {
7270 PIO_APC_ROUTINE UserApcRoutine
;
7271 PVOID IssuingProcess
;
7273 PVOID UserApcContext
;
7274 } AsynchronousParameters
;
7275 LARGE_INTEGER AllocationSize
;
7277 volatile PDRIVER_CANCEL CancelRoutine
;
7281 _ANONYMOUS_UNION
union {
7282 KDEVICE_QUEUE_ENTRY DeviceQueueEntry
;
7283 _ANONYMOUS_STRUCT
struct {
7284 PVOID DriverContext
[4];
7288 PCHAR AuxiliaryBuffer
;
7289 _ANONYMOUS_STRUCT
struct {
7290 LIST_ENTRY ListEntry
;
7291 _ANONYMOUS_UNION
union {
7292 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
7296 struct _FILE_OBJECT
*OriginalFileObject
;
7299 PVOID CompletionKey
;
7302 typedef struct _IRP
*PIRP
;
7304 typedef enum _IO_PAGING_PRIORITY
{
7305 IoPagingPriorityInvalid
,
7306 IoPagingPriorityNormal
,
7307 IoPagingPriorityHigh
,
7308 IoPagingPriorityReserved1
,
7309 IoPagingPriorityReserved2
7310 } IO_PAGING_PRIORITY
;
7313 (DDKAPI IO_COMPLETION_ROUTINE
)(
7314 IN
struct _DEVICE_OBJECT
*DeviceObject
,
7315 IN
struct _IRP
*Irp
,
7317 typedef IO_COMPLETION_ROUTINE
*PIO_COMPLETION_ROUTINE
;
7320 (DDKAPI
*PIO_DPC_ROUTINE
)(
7321 IN
struct _KDPC
*Dpc
,
7322 IN
struct _DEVICE_OBJECT
*DeviceObject
,
7323 IN
struct _IRP
*Irp
,
7327 (DDKAPI
*PMM_DLL_INITIALIZE
)(
7328 IN PUNICODE_STRING RegistryPath
);
7331 (DDKAPI
*PMM_DLL_UNLOAD
)(
7335 (DDKAPI KSERVICE_ROUTINE
)(
7336 IN
struct _KINTERRUPT
*Interrupt
,
7337 IN PVOID ServiceContext
);
7338 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
7341 (DDKAPI
*PIO_TIMER_ROUTINE
)(
7342 IN
struct _DEVICE_OBJECT
*DeviceObject
,
7345 typedef struct _IO_SECURITY_CONTEXT
{
7346 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
7347 PACCESS_STATE AccessState
;
7348 ACCESS_MASK DesiredAccess
;
7349 ULONG FullCreateOptions
;
7350 } IO_SECURITY_CONTEXT
, *PIO_SECURITY_CONTEXT
;
7354 typedef struct _IO_CSQ_IRP_CONTEXT
{
7357 struct _IO_CSQ
*Csq
;
7358 } IO_CSQ_IRP_CONTEXT
, *PIO_CSQ_IRP_CONTEXT
;
7361 (DDKAPI
*PIO_CSQ_INSERT_IRP
)(
7362 IN
struct _IO_CSQ
*Csq
,
7366 (DDKAPI
*PIO_CSQ_REMOVE_IRP
)(
7367 IN
struct _IO_CSQ
*Csq
,
7371 (DDKAPI
*PIO_CSQ_PEEK_NEXT_IRP
)(
7372 IN
struct _IO_CSQ
*Csq
,
7374 IN PVOID PeekContext
);
7377 (DDKAPI
*PIO_CSQ_ACQUIRE_LOCK
)(
7378 IN
struct _IO_CSQ
*Csq
,
7382 (DDKAPI
*PIO_CSQ_RELEASE_LOCK
)(
7383 IN
struct _IO_CSQ
*Csq
,
7387 (DDKAPI
*PIO_CSQ_COMPLETE_CANCELED_IRP
)(
7388 IN
struct _IO_CSQ
*Csq
,
7391 typedef struct _IO_CSQ
{
7393 PIO_CSQ_INSERT_IRP CsqInsertIrp
;
7394 PIO_CSQ_REMOVE_IRP CsqRemoveIrp
;
7395 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
;
7396 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
;
7397 PIO_CSQ_RELEASE_LOCK CsqReleaseLock
;
7398 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
;
7399 PVOID ReservePointer
;
7402 typedef enum _BUS_QUERY_ID_TYPE
{
7404 BusQueryHardwareIDs
,
7405 BusQueryCompatibleIDs
,
7407 BusQueryDeviceSerialNumber
7408 } BUS_QUERY_ID_TYPE
, *PBUS_QUERY_ID_TYPE
;
7410 typedef enum _DEVICE_TEXT_TYPE
{
7411 DeviceTextDescription
,
7412 DeviceTextLocationInformation
7413 } DEVICE_TEXT_TYPE
, *PDEVICE_TEXT_TYPE
;
7415 typedef enum _WORK_QUEUE_TYPE
{
7418 HyperCriticalWorkQueue
,
7422 #if !defined(_AMD64_) && !defined(_IA64_)
7423 #include <pshpack4.h>
7425 typedef struct _IO_STACK_LOCATION
{
7426 UCHAR MajorFunction
;
7427 UCHAR MinorFunction
;
7432 PIO_SECURITY_CONTEXT SecurityContext
;
7434 USHORT POINTER_ALIGNMENT FileAttributes
;
7436 ULONG POINTER_ALIGNMENT EaLength
;
7440 ULONG POINTER_ALIGNMENT Key
;
7441 LARGE_INTEGER ByteOffset
;
7445 ULONG POINTER_ALIGNMENT Key
;
7446 LARGE_INTEGER ByteOffset
;
7450 PUNICODE_STRING FileName
;
7451 FILE_INFORMATION_CLASS FileInformationClass
;
7456 ULONG CompletionFilter
;
7460 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
7464 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
7465 PFILE_OBJECT FileObject
;
7466 _ANONYMOUS_UNION
union {
7467 _ANONYMOUS_STRUCT
struct {
7468 BOOLEAN ReplaceIfExists
;
7469 BOOLEAN AdvanceOnly
;
7472 HANDLE DeleteHandle
;
7486 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass
;
7490 FS_INFORMATION_CLASS FsInformationClass
;
7493 ULONG OutputBufferLength
;
7494 ULONG InputBufferLength
;
7495 ULONG FsControlCode
;
7496 PVOID Type3InputBuffer
;
7497 } FileSystemControl
;
7499 PLARGE_INTEGER Length
;
7501 LARGE_INTEGER ByteOffset
;
7504 ULONG OutputBufferLength
;
7505 ULONG POINTER_ALIGNMENT InputBufferLength
;
7506 ULONG POINTER_ALIGNMENT IoControlCode
;
7507 PVOID Type3InputBuffer
;
7510 SECURITY_INFORMATION SecurityInformation
;
7511 ULONG POINTER_ALIGNMENT Length
;
7514 SECURITY_INFORMATION SecurityInformation
;
7515 PSECURITY_DESCRIPTOR SecurityDescriptor
;
7519 PDEVICE_OBJECT DeviceObject
;
7523 PDEVICE_OBJECT DeviceObject
;
7526 struct _SCSI_REQUEST_BLOCK
*Srb
;
7531 struct _FILE_GET_QUOTA_INFORMATION
*SidList
;
7532 ULONG SidListLength
;
7538 DEVICE_RELATION_TYPE Type
;
7539 } QueryDeviceRelations
;
7541 CONST GUID
*InterfaceType
;
7544 PINTERFACE Interface
;
7545 PVOID InterfaceSpecificData
;
7548 PDEVICE_CAPABILITIES Capabilities
;
7549 } DeviceCapabilities
;
7551 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList
;
7552 } FilterResourceRequirements
;
7557 ULONG POINTER_ALIGNMENT Length
;
7563 BUS_QUERY_ID_TYPE IdType
;
7566 DEVICE_TEXT_TYPE DeviceTextType
;
7567 LCID POINTER_ALIGNMENT LocaleId
;
7571 BOOLEAN Reserved
[3];
7572 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type
;
7573 } UsageNotification
;
7575 SYSTEM_POWER_STATE PowerState
;
7578 PPOWER_SEQUENCE PowerSequence
;
7581 ULONG SystemContext
;
7582 POWER_STATE_TYPE POINTER_ALIGNMENT Type
;
7583 POWER_STATE POINTER_ALIGNMENT State
;
7584 POWER_ACTION POINTER_ALIGNMENT ShutdownType
;
7587 PCM_RESOURCE_LIST AllocatedResources
;
7588 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
7591 ULONG_PTR ProviderId
;
7603 PDEVICE_OBJECT DeviceObject
;
7604 PFILE_OBJECT FileObject
;
7605 PIO_COMPLETION_ROUTINE CompletionRoutine
;
7607 } IO_STACK_LOCATION
, *PIO_STACK_LOCATION
;
7608 #if !defined(_AMD64_) && !defined(_IA64_)
7609 #include <poppack.h>
7612 /* IO_STACK_LOCATION.Control */
7614 #define SL_PENDING_RETURNED 0x01
7615 #define SL_ERROR_RETURNED 0x02
7616 #define SL_INVOKE_ON_CANCEL 0x20
7617 #define SL_INVOKE_ON_SUCCESS 0x40
7618 #define SL_INVOKE_ON_ERROR 0x80
7620 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
7622 #define PCI_WHICHSPACE_CONFIG 0x0
7623 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
7626 /******************************************************************************
7627 * I/O Manager Functions *
7628 ******************************************************************************/
7630 #if !defined(_M_AMD64)
7634 READ_PORT_BUFFER_UCHAR(
7642 READ_PORT_BUFFER_ULONG(
7650 READ_PORT_BUFFER_USHORT(
7676 READ_REGISTER_BUFFER_UCHAR(
7684 READ_REGISTER_BUFFER_ULONG(
7692 READ_REGISTER_BUFFER_USHORT(
7693 IN PUSHORT Register
,
7700 READ_REGISTER_UCHAR(
7701 IN PUCHAR Register
);
7706 READ_REGISTER_ULONG(
7707 IN PULONG Register
);
7712 READ_REGISTER_USHORT(
7713 IN PUSHORT Register
);
7718 WRITE_PORT_BUFFER_UCHAR(
7726 WRITE_PORT_BUFFER_ULONG(
7734 WRITE_PORT_BUFFER_USHORT(
7763 WRITE_REGISTER_BUFFER_UCHAR(
7771 WRITE_REGISTER_BUFFER_ULONG(
7779 WRITE_REGISTER_BUFFER_USHORT(
7780 IN PUSHORT Register
,
7787 WRITE_REGISTER_UCHAR(
7794 WRITE_REGISTER_ULONG(
7801 WRITE_REGISTER_USHORT(
7802 IN PUSHORT Register
,
7809 READ_PORT_BUFFER_UCHAR(
7814 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7819 READ_PORT_BUFFER_ULONG(
7824 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7829 READ_PORT_BUFFER_USHORT(
7834 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7842 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
7850 return __indword((USHORT
)(ULONG_PTR
)Port
);
7858 return __inword((USHORT
)(ULONG_PTR
)Port
);
7863 READ_REGISTER_BUFFER_UCHAR(
7868 __movsb(Register
, Buffer
, Count
);
7873 READ_REGISTER_BUFFER_ULONG(
7878 __movsd(Register
, Buffer
, Count
);
7883 READ_REGISTER_BUFFER_USHORT(
7884 IN PUSHORT Register
,
7888 __movsw(Register
, Buffer
, Count
);
7893 READ_REGISTER_UCHAR(
7894 IN
volatile UCHAR
*Register
)
7901 READ_REGISTER_ULONG(
7902 IN
volatile ULONG
*Register
)
7909 READ_REGISTER_USHORT(
7910 IN
volatile USHORT
*Register
)
7917 WRITE_PORT_BUFFER_UCHAR(
7922 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7927 WRITE_PORT_BUFFER_ULONG(
7932 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7937 WRITE_PORT_BUFFER_USHORT(
7942 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
7951 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
7960 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
7969 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
7974 WRITE_REGISTER_BUFFER_UCHAR(
7980 __movsb(Register
, Buffer
, Count
);
7981 InterlockedOr(&Synch
, 1);
7986 WRITE_REGISTER_BUFFER_ULONG(
7992 __movsd(Register
, Buffer
, Count
);
7993 InterlockedOr(&Synch
, 1);
7998 WRITE_REGISTER_BUFFER_USHORT(
7999 IN PUSHORT Register
,
8004 __movsw(Register
, Buffer
, Count
);
8005 InterlockedOr(&Synch
, 1);
8010 WRITE_REGISTER_UCHAR(
8011 IN
volatile UCHAR
*Register
,
8016 InterlockedOr(&Synch
, 1);
8021 WRITE_REGISTER_ULONG(
8022 IN
volatile ULONG
*Register
,
8027 InterlockedOr(&Synch
, 1);
8032 WRITE_REGISTER_USHORT(
8033 IN
volatile USHORT
*Register
,
8038 InterlockedOr(&Sync
, 1);
8042 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
8043 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
8045 #define DMA_MACROS_DEFINED
8049 IoAllocateAdapterChannel(
8050 IN PDMA_ADAPTER DmaAdapter
,
8051 IN PDEVICE_OBJECT DeviceObject
,
8052 IN ULONG NumberOfMapRegisters
,
8053 IN PDRIVER_CONTROL ExecutionRoutine
,
8056 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
8057 AllocateAdapterChannel
=
8058 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
8059 ASSERT(AllocateAdapterChannel
);
8060 return AllocateAdapterChannel(DmaAdapter
,
8062 NumberOfMapRegisters
,
8070 IoFlushAdapterBuffers(
8071 IN PDMA_ADAPTER DmaAdapter
,
8073 IN PVOID MapRegisterBase
,
8076 IN BOOLEAN WriteToDevice
)
8078 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
8079 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
8080 ASSERT(FlushAdapterBuffers
);
8081 return FlushAdapterBuffers(DmaAdapter
,
8092 IoFreeAdapterChannel(
8093 IN PDMA_ADAPTER DmaAdapter
)
8095 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
8096 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
8097 ASSERT(FreeAdapterChannel
);
8098 FreeAdapterChannel(DmaAdapter
);
8105 IN PDMA_ADAPTER DmaAdapter
,
8106 IN PVOID MapRegisterBase
,
8107 IN ULONG NumberOfMapRegisters
)
8109 PFREE_MAP_REGISTERS FreeMapRegisters
;
8110 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
8111 ASSERT(FreeMapRegisters
);
8112 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
8119 IN PDMA_ADAPTER DmaAdapter
,
8121 IN PVOID MapRegisterBase
,
8123 IN OUT PULONG Length
,
8124 IN BOOLEAN WriteToDevice
)
8126 PMAP_TRANSFER MapTransfer
;
8128 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
8129 ASSERT(MapTransfer
);
8130 return MapTransfer(DmaAdapter
,
8139 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8143 IoAcquireCancelSpinLock(
8149 IoAcquireRemoveLockEx(
8150 IN PIO_REMOVE_LOCK RemoveLock
,
8151 IN PVOID Tag OPTIONAL
,
8154 IN ULONG RemlockSize
);
8159 * IoAcquireRemoveLock(
8160 * IN PIO_REMOVE_LOCK RemoveLock,
8161 * IN OPTIONAL PVOID Tag)
8164 #define IoAcquireRemoveLock(RemoveLock, Tag) \
8165 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
8167 #define IoAcquireRemoveLock(RemoveLock, Tag) \
8168 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
8173 * IoAdjustPagingPathCount(
8175 * IN BOOLEAN Increment)
8177 #define IoAdjustPagingPathCount(_Count, \
8182 InterlockedIncrement(_Count); \
8186 InterlockedDecrement(_Count); \
8190 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8195 IoAllocateDriverObjectExtension(
8196 IN PDRIVER_OBJECT DriverObject
,
8197 IN PVOID ClientIdentificationAddress
,
8198 IN ULONG DriverObjectExtensionSize
,
8199 OUT PVOID
*DriverObjectExtension
);
8204 IoAllocateErrorLogEntry(
8206 IN UCHAR EntrySize
);
8213 IN BOOLEAN ChargeQuota
);
8219 IN PVOID VirtualAddress OPTIONAL
,
8221 IN BOOLEAN SecondaryBuffer
,
8222 IN BOOLEAN ChargeQuota
,
8223 IN OUT PIRP Irp OPTIONAL
);
8229 IN PDEVICE_OBJECT DeviceObject
);
8235 IN PDEVICE_OBJECT SourceDevice
,
8236 IN PUNICODE_STRING TargetDevice
,
8237 OUT PDEVICE_OBJECT
*AttachedDevice
);
8242 IoAttachDeviceToDeviceStack(
8243 IN PDEVICE_OBJECT SourceDevice
,
8244 IN PDEVICE_OBJECT TargetDevice
);
8249 IoBuildAsynchronousFsdRequest(
8250 IN ULONG MajorFunction
,
8251 IN PDEVICE_OBJECT DeviceObject
,
8252 IN OUT PVOID Buffer OPTIONAL
,
8253 IN ULONG Length OPTIONAL
,
8254 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
8255 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
8260 IoBuildDeviceIoControlRequest(
8261 IN ULONG IoControlCode
,
8262 IN PDEVICE_OBJECT DeviceObject
,
8263 IN PVOID InputBuffer OPTIONAL
,
8264 IN ULONG InputBufferLength
,
8265 OUT PVOID OutputBuffer OPTIONAL
,
8266 IN ULONG OutputBufferLength
,
8267 IN BOOLEAN InternalDeviceIoControl
,
8269 OUT PIO_STATUS_BLOCK IoStatusBlock
);
8276 IN OUT PMDL TargetMdl
,
8277 IN PVOID VirtualAddress
,
8283 IoBuildSynchronousFsdRequest(
8284 IN ULONG MajorFunction
,
8285 IN PDEVICE_OBJECT DeviceObject
,
8286 IN OUT PVOID Buffer OPTIONAL
,
8287 IN ULONG Length OPTIONAL
,
8288 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
8290 OUT PIO_STATUS_BLOCK IoStatusBlock
);
8296 IN PDEVICE_OBJECT DeviceObject
,
8298 #define IoCallDriver IofCallDriver
8305 IN CCHAR PriorityBoost
);
8306 #define IoCompleteRequest IofCompleteRequest
8318 IN ACCESS_MASK DesiredAccess
,
8319 IN ULONG DesiredShareAccess
,
8320 IN OUT PFILE_OBJECT FileObject
,
8321 IN OUT PSHARE_ACCESS ShareAccess
,
8329 IN CCHAR PriorityBoost
);
8335 OUT PKINTERRUPT
*InterruptObject
,
8336 IN PKSERVICE_ROUTINE ServiceRoutine
,
8337 IN PVOID ServiceContext OPTIONAL
,
8338 IN PKSPIN_LOCK SpinLock OPTIONAL
,
8341 IN KIRQL SynchronizeIrql
,
8342 IN KINTERRUPT_MODE InterruptMode
,
8343 IN BOOLEAN ShareVector
,
8344 IN KAFFINITY ProcessorEnableMask
,
8345 IN BOOLEAN FloatingSave
);
8351 IN PDRIVER_OBJECT DriverObject
,
8352 IN ULONG DeviceExtensionSize
,
8353 IN PUNICODE_STRING DeviceName OPTIONAL
,
8354 IN DEVICE_TYPE DeviceType
,
8355 IN ULONG DeviceCharacteristics
,
8356 IN BOOLEAN Exclusive
,
8357 OUT PDEVICE_OBJECT
*DeviceObject
);
8363 OUT PHANDLE FileHandle
,
8364 IN ACCESS_MASK DesiredAccess
,
8365 IN POBJECT_ATTRIBUTES ObjectAttributes
,
8366 OUT PIO_STATUS_BLOCK IoStatusBlock
,
8367 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
8368 IN ULONG FileAttributes
,
8369 IN ULONG ShareAccess
,
8370 IN ULONG Disposition
,
8371 IN ULONG CreateOptions
,
8372 IN PVOID EaBuffer OPTIONAL
,
8374 IN CREATE_FILE_TYPE CreateFileType
,
8375 IN PVOID InternalParameters OPTIONAL
,
8381 IoCreateNotificationEvent(
8382 IN PUNICODE_STRING EventName
,
8383 OUT PHANDLE EventHandle
);
8388 IoCreateSymbolicLink(
8389 IN PUNICODE_STRING SymbolicLinkName
,
8390 IN PUNICODE_STRING DeviceName
);
8395 IoCreateSynchronizationEvent(
8396 IN PUNICODE_STRING EventName
,
8397 OUT PHANDLE EventHandle
);
8402 IoCreateUnprotectedSymbolicLink(
8403 IN PUNICODE_STRING SymbolicLinkName
,
8404 IN PUNICODE_STRING DeviceName
);
8410 IN PDEVICE_OBJECT DeviceObject
);
8415 IoDeleteSymbolicLink(
8416 IN PUNICODE_STRING SymbolicLinkName
);
8422 IN OUT PDEVICE_OBJECT TargetDevice
);
8427 IoDisconnectInterrupt(
8428 IN PKINTERRUPT InterruptObject
);
8446 IN PIO_WORKITEM IoWorkItem
);
8451 IoGetAttachedDevice(
8452 IN PDEVICE_OBJECT DeviceObject
);
8457 IoGetAttachedDeviceReference(
8458 IN PDEVICE_OBJECT DeviceObject
);
8463 IoGetBootDiskInformation(
8464 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
8470 IoGetDeviceInterfaceAlias(
8471 IN PUNICODE_STRING SymbolicLinkName
,
8472 IN CONST GUID
*AliasInterfaceClassGuid
,
8473 OUT PUNICODE_STRING AliasSymbolicLinkName
);
8478 IoGetCurrentProcess(
8484 IoGetDeviceInterfaces(
8485 IN CONST GUID
*InterfaceClassGuid
,
8486 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
8488 OUT PWSTR
*SymbolicLinkList
);
8493 IoGetDeviceObjectPointer(
8494 IN PUNICODE_STRING ObjectName
,
8495 IN ACCESS_MASK DesiredAccess
,
8496 OUT PFILE_OBJECT
*FileObject
,
8497 OUT PDEVICE_OBJECT
*DeviceObject
);
8502 IoGetDeviceProperty(
8503 IN PDEVICE_OBJECT DeviceObject
,
8504 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
8505 IN ULONG BufferLength
,
8506 OUT PVOID PropertyBuffer
,
8507 OUT PULONG ResultLength
);
8513 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
8514 IN PDEVICE_DESCRIPTION DeviceDescription
,
8515 IN OUT PULONG NumberOfMapRegisters
);
8520 IoGetDriverObjectExtension(
8521 IN PDRIVER_OBJECT DriverObject
,
8522 IN PVOID ClientIdentificationAddress
);
8533 IoGetRelatedDeviceObject(
8534 IN PFILE_OBJECT FileObject
);
8540 IN PIO_WORKITEM IoWorkItem
,
8541 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
8542 IN WORK_QUEUE_TYPE QueueType
,
8543 IN PVOID Context OPTIONAL
);
8550 IN USHORT PacketSize
,
8551 IN CCHAR StackSize
);
8556 IoInitializeRemoveLockEx(
8557 IN PIO_REMOVE_LOCK Lock
,
8558 IN ULONG AllocateTag
,
8559 IN ULONG MaxLockedMinutes
,
8560 IN ULONG HighWatermark
,
8561 IN ULONG RemlockSize
);
8567 IN PDEVICE_OBJECT DeviceObject
,
8568 IN PIO_TIMER_ROUTINE TimerRoutine
,
8569 IN PVOID Context OPTIONAL
);
8574 IoInvalidateDeviceRelations(
8575 IN PDEVICE_OBJECT DeviceObject
,
8576 IN DEVICE_RELATION_TYPE Type
);
8581 IoInvalidateDeviceState(
8582 IN PDEVICE_OBJECT PhysicalDeviceObject
);
8587 IoIsWdmVersionAvailable(
8588 IN UCHAR MajorVersion
,
8589 IN UCHAR MinorVersion
);
8594 IoOpenDeviceInterfaceRegistryKey(
8595 IN PUNICODE_STRING SymbolicLinkName
,
8596 IN ACCESS_MASK DesiredAccess
,
8597 OUT PHANDLE DeviceInterfaceKey
);
8602 IoOpenDeviceRegistryKey(
8603 IN PDEVICE_OBJECT DeviceObject
,
8604 IN ULONG DevInstKeyType
,
8605 IN ACCESS_MASK DesiredAccess
,
8606 OUT PHANDLE DevInstRegKey
);
8611 IoRegisterDeviceInterface(
8612 IN PDEVICE_OBJECT PhysicalDeviceObject
,
8613 IN CONST GUID
*InterfaceClassGuid
,
8614 IN PUNICODE_STRING ReferenceString OPTIONAL
,
8615 OUT PUNICODE_STRING SymbolicLinkName
);
8620 IoRegisterPlugPlayNotification(
8621 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
8622 IN ULONG EventCategoryFlags
,
8623 IN PVOID EventCategoryData OPTIONAL
,
8624 IN PDRIVER_OBJECT DriverObject
,
8625 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
8626 IN OUT PVOID Context OPTIONAL
,
8627 OUT PVOID
*NotificationEntry
);
8632 IoRegisterShutdownNotification(
8633 IN PDEVICE_OBJECT DeviceObject
);
8638 IoReleaseCancelSpinLock(
8644 IoReleaseRemoveLockAndWaitEx(
8645 IN PIO_REMOVE_LOCK RemoveLock
,
8646 IN PVOID Tag OPTIONAL
,
8647 IN ULONG RemlockSize
);
8652 IoReleaseRemoveLockEx(
8653 IN PIO_REMOVE_LOCK RemoveLock
,
8654 IN PVOID Tag OPTIONAL
,
8655 IN ULONG RemlockSize
);
8660 IoRemoveShareAccess(
8661 IN PFILE_OBJECT FileObject
,
8662 IN OUT PSHARE_ACCESS ShareAccess
);
8667 IoReportTargetDeviceChange(
8668 IN PDEVICE_OBJECT PhysicalDeviceObject
,
8669 IN PVOID NotificationStructure
);
8674 IoReportTargetDeviceChangeAsynchronous(
8675 IN PDEVICE_OBJECT PhysicalDeviceObject
,
8676 IN PVOID NotificationStructure
,
8677 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
8678 IN PVOID Context OPTIONAL
);
8683 IoRequestDeviceEject(
8684 IN PDEVICE_OBJECT PhysicalDeviceObject
);
8691 IN NTSTATUS Status
);
8696 IoSetDeviceInterfaceState(
8697 IN PUNICODE_STRING SymbolicLinkName
,
8704 IN ACCESS_MASK DesiredAccess
,
8705 IN ULONG DesiredShareAccess
,
8706 IN OUT PFILE_OBJECT FileObject
,
8707 OUT PSHARE_ACCESS ShareAccess
);
8713 IN PDEVICE_OBJECT DeviceObject
,
8714 IN BOOLEAN Cancelable
);
8719 IoStartNextPacketByKey(
8720 IN PDEVICE_OBJECT DeviceObject
,
8721 IN BOOLEAN Cancelable
,
8728 IN PDEVICE_OBJECT DeviceObject
,
8730 IN PULONG Key OPTIONAL
,
8731 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
8737 IN PDEVICE_OBJECT DeviceObject
);
8743 IN PDEVICE_OBJECT DeviceObject
);
8748 IoUnregisterPlugPlayNotification(
8749 IN PVOID NotificationEntry
);
8754 IoUnregisterShutdownNotification(
8755 IN PDEVICE_OBJECT DeviceObject
);
8760 IoUpdateShareAccess(
8761 IN PFILE_OBJECT FileObject
,
8762 IN OUT PSHARE_ACCESS ShareAccess
);
8767 IoWMIAllocateInstanceIds(
8769 IN ULONG InstanceCount
,
8770 OUT ULONG
*FirstInstanceId
);
8775 IoWMIQuerySingleInstanceMultiple(
8776 IN PVOID
*DataBlockObjectList
,
8777 IN PUNICODE_STRING InstanceNames
,
8778 IN ULONG ObjectCount
,
8779 IN OUT ULONG
*InOutBufferSize
,
8780 OUT PVOID OutBuffer
);
8785 IoWMIRegistrationControl(
8786 IN PDEVICE_OBJECT DeviceObject
,
8792 IoWMISuggestInstanceName(
8793 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
8794 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
8795 IN BOOLEAN CombineNames
,
8796 OUT PUNICODE_STRING SuggestedInstanceName
);
8802 IN PVOID WnodeEventItem
);
8807 IoWriteErrorLogEntry(
8812 #if (NTDDI_VERSION >= NTDDI_WINXP)
8819 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
8820 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
8821 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
8822 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
8823 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
8824 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
8832 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
);
8839 IN PIO_CSQ_IRP_CONTEXT Context
);
8846 IN PVOID PeekContext
);
8851 IoForwardIrpSynchronously(
8852 IN PDEVICE_OBJECT DeviceObject
,
8855 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
8860 IoFreeErrorLogEntry(
8866 IoSetCompletionRoutineEx(
8867 IN PDEVICE_OBJECT DeviceObject
,
8869 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
8871 IN BOOLEAN InvokeOnSuccess
,
8872 IN BOOLEAN InvokeOnError
,
8873 IN BOOLEAN InvokeOnCancel
);
8878 IoSetStartIoAttributes(
8879 IN PDEVICE_OBJECT DeviceObject
,
8880 IN BOOLEAN DeferredStartIo
,
8881 IN BOOLEAN NonCancelable
);
8886 IoWMIDeviceObjectToInstanceName(
8887 IN PVOID DataBlockObject
,
8888 IN PDEVICE_OBJECT DeviceObject
,
8889 OUT PUNICODE_STRING InstanceName
);
8895 IN PVOID DataBlockObject
,
8896 IN PUNICODE_STRING InstanceName
,
8898 IN ULONG InBufferSize
,
8899 IN OUT PULONG OutBufferSize
,
8900 IN OUT PUCHAR InOutBuffer
);
8905 IoWMIHandleToInstanceName(
8906 IN PVOID DataBlockObject
,
8907 IN HANDLE FileHandle
,
8908 OUT PUNICODE_STRING InstanceName
);
8914 IN GUID
*DataBlockGuid
,
8915 IN ULONG DesiredAccess
,
8916 OUT PVOID
*DataBlockObject
);
8922 IN PVOID DataBlockObject
,
8923 IN OUT ULONG
*InOutBufferSize
,
8924 OUT PVOID OutBuffer
);
8929 IoWMIQueryAllDataMultiple(
8930 IN PVOID
*DataBlockObjectList
,
8931 IN ULONG ObjectCount
,
8932 IN OUT ULONG
*InOutBufferSize
,
8933 OUT PVOID OutBuffer
);
8938 IoWMIQuerySingleInstance(
8939 IN PVOID DataBlockObject
,
8940 IN PUNICODE_STRING InstanceName
,
8941 IN OUT ULONG
*InOutBufferSize
,
8942 OUT PVOID OutBuffer
);
8947 IoWMISetNotificationCallback(
8948 IN OUT PVOID Object
,
8949 IN WMI_NOTIFICATION_CALLBACK Callback
,
8950 IN PVOID Context OPTIONAL
);
8955 IoWMISetSingleInstance(
8956 IN PVOID DataBlockObject
,
8957 IN PUNICODE_STRING InstanceName
,
8959 IN ULONG ValueBufferSize
,
8960 IN PVOID ValueBuffer
);
8966 IN PVOID DataBlockObject
,
8967 IN PUNICODE_STRING InstanceName
,
8968 IN ULONG DataItemId
,
8970 IN ULONG ValueBufferSize
,
8971 IN PVOID ValueBuffer
);
8979 IoWMIDeviceObjectToProviderId(
8980 IN PDEVICE_OBJECT DeviceObject
);
8982 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
8988 * IN CCHAR StackSize)
8990 #define IoSizeOfIrp(_StackSize) \
8991 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
8995 IoSkipCurrentIrpStackLocation (
8998 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
8999 Irp
->CurrentLocation
++;
9000 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
9005 IoSetNextIrpStackLocation (
9008 ASSERT(Irp
->CurrentLocation
> 0);
9009 Irp
->CurrentLocation
--;
9010 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
9015 IoGetNextIrpStackLocation(
9018 ASSERT(Irp
->CurrentLocation
> 0);
9019 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
9024 IoSetCompletionRoutine(
9026 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
9027 IN PVOID Context OPTIONAL
,
9028 IN BOOLEAN InvokeOnSuccess
,
9029 IN BOOLEAN InvokeOnError
,
9030 IN BOOLEAN InvokeOnCancel
)
9032 PIO_STACK_LOCATION irpSp
;
9033 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
9034 irpSp
= IoGetNextIrpStackLocation(Irp
);
9035 irpSp
->CompletionRoutine
= CompletionRoutine
;
9036 irpSp
->Context
= Context
;
9039 if (InvokeOnSuccess
) {
9040 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
9043 if (InvokeOnError
) {
9044 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
9047 if (InvokeOnCancel
) {
9048 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
9054 * IoSetCancelRoutine(
9056 * IN PDRIVER_CANCEL CancelRoutine)
9058 #define IoSetCancelRoutine(_Irp, \
9060 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
9061 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
9066 * IN PDEVICE_OBJECT DeviceObject,
9068 * IN PVOID Context);
9070 #define IoRequestDpc(DeviceObject, Irp, Context)( \
9071 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
9075 * IoReleaseRemoveLock(
9076 * IN PIO_REMOVE_LOCK RemoveLock,
9079 #define IoReleaseRemoveLock(_RemoveLock, \
9081 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
9085 * IoReleaseRemoveLockAndWait(
9086 * IN PIO_REMOVE_LOCK RemoveLock,
9089 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
9091 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
9098 IN PIRP Irp OPTIONAL
);
9102 #define PLUGPLAY_REGKEY_DEVICE 1
9103 #define PLUGPLAY_REGKEY_DRIVER 2
9104 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
9108 IoGetCurrentIrpStackLocation(
9111 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
9112 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
9120 IoGetCurrentIrpStackLocation( (Irp
) )->Control
|= SL_PENDING_RETURNED
;
9125 * IoIsErrorUserInduced(
9126 * IN NTSTATUS Status);
9128 #define IoIsErrorUserInduced(Status) \
9129 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
9130 ((Status) == STATUS_IO_TIMEOUT) || \
9131 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
9132 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
9133 ((Status) == STATUS_VERIFY_REQUIRED) || \
9134 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
9135 ((Status) == STATUS_WRONG_VOLUME)))
9138 * IoInitializeRemoveLock(
9139 * IN PIO_REMOVE_LOCK Lock,
9140 * IN ULONG AllocateTag,
9141 * IN ULONG MaxLockedMinutes,
9142 * IN ULONG HighWatermark)
9144 #define IoInitializeRemoveLock( \
9145 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
9146 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
9147 HighWatermark, sizeof(IO_REMOVE_LOCK))
9151 IoInitializeDpcRequest(
9152 IN PDEVICE_OBJECT DeviceObject
,
9153 IN PIO_DPC_ROUTINE DpcRoutine
)
9155 KeInitializeDpc( &DeviceObject
->Dpc
,
9156 (PKDEFERRED_ROUTINE
) DpcRoutine
,
9160 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
9164 * IoGetFunctionCodeFromCtlCode(
9165 * IN ULONG ControlCode)
9167 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
9168 (((_ControlCode) >> 2) & 0x00000FFF)
9172 IoCopyCurrentIrpStackLocationToNext(
9175 PIO_STACK_LOCATION irpSp
;
9176 PIO_STACK_LOCATION nextIrpSp
;
9177 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
9178 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
9179 RtlCopyMemory( nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
9180 nextIrpSp
->Control
= 0;
9187 OUT PULONG_PTR LowLimit
,
9188 OUT PULONG_PTR HighLimit
);
9192 IoGetRemainingStackSize(
9195 ULONG_PTR End
, Begin
;
9198 IoGetStackLimits(&Begin
, &End
);
9199 Result
= (ULONG_PTR
)(&End
) - Begin
;
9204 /******************************************************************************
9205 * WINBASE Functions *
9206 ******************************************************************************/
9207 #if !defined(_WINBASE_)
9209 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
9213 InitializeSListHead(
9214 OUT PSLIST_HEADER SListHead
);
9220 InitializeSListHead(
9221 OUT PSLIST_HEADER SListHead
)
9224 ULONG64 FeatureBits
;
9228 if (((ULONG_PTR
)SListHead
& 0xf) != 0)
9230 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
9234 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
9237 FeatureBits
= __getReg(CV_IA64_CPUID4
);
9238 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0)
9240 SListHead
->Header16
.HeaderType
= 1;
9241 SListHead
->Header16
.Init
= 1;
9250 #define InterlockedPopEntrySList(Head) \
9251 ExpInterlockedPopEntrySList(Head)
9253 #define InterlockedPushEntrySList(Head, Entry) \
9254 ExpInterlockedPushEntrySList(Head, Entry)
9256 #define InterlockedFlushSList(Head) \
9257 ExpInterlockedFlushSList(Head)
9259 #define QueryDepthSList(Head) \
9260 ExQueryDepthSList(Head)
9262 #else // !defined(_WIN64)
9267 InterlockedPopEntrySList(
9268 IN PSLIST_HEADER ListHead
);
9273 InterlockedPushEntrySList(
9274 IN PSLIST_HEADER ListHead
,
9275 IN PSLIST_ENTRY ListEntry
);
9277 #define InterlockedFlushSList(ListHead) \
9278 ExInterlockedFlushSList(ListHead)
9280 #define QueryDepthSList(Head) \
9281 ExQueryDepthSList(Head)
9283 #endif // !defined(_WIN64)
9285 #endif // !defined(_WINBASE_)
9288 /******************************************************************************
9290 ******************************************************************************/
9292 #define EX_RUNDOWN_ACTIVE 0x1
9293 #define EX_RUNDOWN_COUNT_SHIFT 0x1
9294 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
9297 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
9299 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
9302 typedef enum _SUITE_TYPE
{
9306 CommunicationServer
,
9308 SmallBusinessRestricted
,
9322 typedef enum _EX_POOL_PRIORITY
{
9324 LowPoolPrioritySpecialPoolOverrun
= 8,
9325 LowPoolPrioritySpecialPoolUnderrun
= 9,
9326 NormalPoolPriority
= 16,
9327 NormalPoolPrioritySpecialPoolOverrun
= 24,
9328 NormalPoolPrioritySpecialPoolUnderrun
= 25,
9329 HighPoolPriority
= 32,
9330 HighPoolPrioritySpecialPoolOverrun
= 40,
9331 HighPoolPrioritySpecialPoolUnderrun
= 41
9334 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
9335 #define LOOKASIDE_ALIGN
9337 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
9340 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
9343 (DDKAPI
*PALLOCATE_FUNCTION
)(
9344 IN POOL_TYPE PoolType
,
9345 IN SIZE_T NumberOfBytes
,
9349 (DDKAPI
*PALLOCATE_FUNCTION_EX
)(
9350 IN POOL_TYPE PoolType
,
9351 IN SIZE_T NumberOfBytes
,
9353 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
9356 (DDKAPI
*PFREE_FUNCTION
)(
9360 (DDKAPI
*PFREE_FUNCTION_EX
)(
9362 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
9365 (DDKAPI
*PCALLBACK_FUNCTION
)(
9366 IN PVOID CallbackContext
,
9368 IN PVOID Argument2
);
9370 #define GENERAL_LOOKASIDE_LAYOUT \
9372 SLIST_HEADER ListHead; \
9373 SINGLE_LIST_ENTRY SingleListHead; \
9376 USHORT MaximumDepth; \
9377 ULONG TotalAllocates; \
9379 ULONG AllocateMisses; \
9380 ULONG AllocateHits; \
9381 } DUMMYUNIONNAME2; \
9387 } DUMMYUNIONNAME3; \
9393 PALLOCATE_FUNCTION_EX AllocateEx; \
9394 PALLOCATE_FUNCTION Allocate; \
9395 } DUMMYUNIONNAME4; \
9398 PFREE_FUNCTION_EX FreeEx; \
9399 PFREE_FUNCTION Free; \
9400 } DUMMYUNIONNAME5; \
9402 LIST_ENTRY ListEntry; \
9403 ULONG LastTotalAllocates; \
9405 ULONG LastAllocateMisses; \
9406 ULONG LastAllocateHits; \
9407 } DUMMYUNIONNAME6; \
9410 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
9411 GENERAL_LOOKASIDE_LAYOUT
9412 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
9414 typedef struct _GENERAL_LOOKASIDE_POOL
{
9415 GENERAL_LOOKASIDE_LAYOUT
9416 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
9418 typedef struct _PAGED_LOOKASIDE_LIST
{
9419 GENERAL_LOOKASIDE L
;
9420 #if !defined(_AMD64_) && !defined(_IA64_)
9421 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
9423 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
9425 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
9426 GENERAL_LOOKASIDE L
;
9427 #if !defined(_AMD64_) && !defined(_IA64_)
9428 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
9430 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
9432 typedef struct _LOOKASIDE_LIST_EX
{
9433 GENERAL_LOOKASIDE_POOL L
;
9434 } LOOKASIDE_LIST_EX
;
9436 typedef struct _EX_RUNDOWN_REF
{
9437 __GNU_EXTENSION
union {
9438 volatile ULONG_PTR Count
;
9441 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
9443 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
9446 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
9447 IN PVOID Parameter
);
9449 typedef struct _WORK_QUEUE_ITEM
{
9451 PWORKER_THREAD_ROUTINE WorkerRoutine
;
9452 volatile PVOID Parameter
;
9453 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
9456 /******************************************************************************
9457 * Executive Functions *
9458 ******************************************************************************/
9460 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
9461 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
9462 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
9464 #define ExInitializeSListHead InitializeSListHead
9467 #if defined(_NTHAL_)
9468 #define ExAcquireFastMutex ExiAcquireFastMutex
9469 #define ExReleaseFastMutex ExiReleaseFastMutex
9470 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
9472 #define ExInterlockedAddUlong ExfInterlockedAddUlong
9473 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
9474 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
9475 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
9476 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
9477 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
9482 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
9483 defined(_NTHAL_) || defined(_NTOSP_)
9486 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
9490 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
9492 return (USHORT
)(ListHead
->Alignment
& 0xffff);
9498 ExpInterlockedFlushSList(
9499 PSLIST_HEADER ListHead
);
9503 ExpInterlockedPopEntrySList(
9504 PSLIST_HEADER ListHead
);
9508 ExpInterlockedPushEntrySList(
9509 PSLIST_HEADER ListHead
,
9510 PSLIST_ENTRY ListEntry
);
9512 #define ExInterlockedFlushSList(Head) \
9513 ExpInterlockedFlushSList(Head)
9514 #define ExInterlockedPopEntrySList(Head, Lock) \
9515 ExpInterlockedPopEntrySList(Head)
9516 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
9517 ExpInterlockedPushEntrySList(Head, Entry)
9519 #else // !defined(_WIN64)
9521 #define ExQueryDepthSList(listhead) (listhead)->Depth
9526 ExInterlockedFlushSList(
9527 IN PSLIST_HEADER ListHead
);
9529 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
9533 ExInterlockedPopEntrySList(
9534 IN PSLIST_HEADER ListHead
,
9535 IN PKSPIN_LOCK Lock
);
9540 ExInterlockedPushEntrySList(
9541 IN PSLIST_HEADER ListHead
,
9542 IN PSINGLE_LIST_ENTRY ListEntry
,
9543 IN PKSPIN_LOCK Lock
);
9545 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
9546 InterlockedPopEntrySList(_ListHead)
9547 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
9548 InterlockedPushEntrySList(_ListHead, _ListEntry)
9549 #endif // _WIN2K_COMPAT_SLIST_USAGE
9551 #endif // !defined(_WIN64)
9554 * ExGetCurrentResourceThread(
9557 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
9559 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
9562 * ExInitializeWorkItem(
9563 * IN PWORK_QUEUE_ITEM Item,
9564 * IN PWORKER_THREAD_ROUTINE Routine,
9567 #define ExInitializeWorkItem(Item, Routine, Context) \
9569 (Item)->WorkerRoutine = Routine; \
9570 (Item)->Parameter = Context; \
9571 (Item)->List.Flink = NULL; \
9576 ExInitializeFastMutex(
9577 OUT PFAST_MUTEX FastMutex
)
9579 FastMutex
->Count
= FM_LOCK_BIT
;
9580 FastMutex
->Owner
= NULL
;
9581 FastMutex
->Contention
= 0;
9582 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
9586 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9592 IN OUT PFAST_MUTEX FastMutex
);
9598 IN OUT PFAST_MUTEX FastMutex
);
9603 ExTryToAcquireFastMutex(
9604 IN OUT PFAST_MUTEX FastMutex
);
9609 ExAcquireFastMutexUnsafe(
9610 IN OUT PFAST_MUTEX FastMutex
);
9615 ExReleaseFastMutexUnsafe(
9616 IN OUT PFAST_MUTEX FastMutex
);
9621 ExAcquireResourceExclusiveLite(
9622 IN PERESOURCE Resource
,
9628 ExAcquireResourceSharedLite(
9629 IN PERESOURCE Resource
,
9635 ExAcquireSharedStarveExclusive(
9636 IN PERESOURCE Resource
,
9642 ExAcquireSharedWaitForExclusive(
9643 IN PERESOURCE Resource
,
9650 IN POOL_TYPE PoolType
,
9651 IN SIZE_T NumberOfBytes
);
9654 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
9655 #endif /* POOL_TAGGING */
9660 ExAllocatePoolWithQuota(
9661 IN POOL_TYPE PoolType
,
9662 IN SIZE_T NumberOfBytes
);
9665 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
9666 #endif /* POOL_TAGGING */
9671 ExAllocatePoolWithQuotaTag(
9672 IN POOL_TYPE PoolType
,
9673 IN SIZE_T NumberOfBytes
,
9676 #ifndef POOL_TAGGING
9677 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
9678 #endif /* POOL_TAGGING */
9683 ExAllocatePoolWithTag(
9684 IN POOL_TYPE PoolType
,
9685 IN SIZE_T NumberOfBytes
,
9691 ExAllocatePoolWithTagPriority(
9692 IN POOL_TYPE PoolType
,
9693 IN SIZE_T NumberOfBytes
,
9695 IN EX_POOL_PRIORITY Priority
);
9700 ExConvertExclusiveToSharedLite(
9701 IN PERESOURCE Resource
);
9707 OUT PCALLBACK_OBJECT
*CallbackObject
,
9708 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9710 IN BOOLEAN AllowMultipleCallbacks
);
9715 ExDeleteNPagedLookasideList(
9716 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
9721 ExDeletePagedLookasideList(
9722 IN PPAGED_LOOKASIDE_LIST Lookaside
);
9727 ExDeleteResourceLite(
9728 IN PERESOURCE Resource
);
9737 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
9750 ExGetExclusiveWaiterCount(
9751 IN PERESOURCE Resource
);
9762 ExGetSharedWaiterCount(
9763 IN PERESOURCE Resource
);
9768 ExInitializeNPagedLookasideList(
9769 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
9770 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
9771 IN PFREE_FUNCTION Free OPTIONAL
,
9780 ExInitializePagedLookasideList(
9781 IN PPAGED_LOOKASIDE_LIST Lookaside
,
9782 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
9783 IN PFREE_FUNCTION Free OPTIONAL
,
9792 ExInitializeResourceLite(
9793 IN PERESOURCE Resource
);
9798 ExInterlockedAddLargeInteger(
9799 IN PLARGE_INTEGER Addend
,
9800 IN LARGE_INTEGER Increment
,
9801 IN PKSPIN_LOCK Lock
);
9804 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
9805 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
9807 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
9808 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
9814 ExInterlockedAddUlong(
9819 #if defined(_AMD64_) || defined(_IA64_)
9820 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
9821 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
9822 #elif defined(_X86_)
9826 ExfInterlockedCompareExchange64(
9827 IN OUT LONGLONG
volatile *Destination
,
9828 IN PLONGLONG Exchange
,
9829 IN PLONGLONG Comperand
);
9830 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
9831 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
9836 ExInterlockedCompareExchange64(
9837 IN OUT LONGLONG
volatile *Destination
,
9838 IN PLONGLONG Exchange
,
9839 IN PLONGLONG Comparand
,
9840 IN PKSPIN_LOCK Lock
);
9846 ExInterlockedInsertHeadList(
9847 IN PLIST_ENTRY ListHead
,
9848 IN PLIST_ENTRY ListEntry
,
9849 IN PKSPIN_LOCK Lock
);
9854 ExInterlockedInsertTailList(
9855 IN PLIST_ENTRY ListHead
,
9856 IN PLIST_ENTRY ListEntry
,
9857 IN PKSPIN_LOCK Lock
);
9862 ExInterlockedPopEntryList(
9863 IN PSINGLE_LIST_ENTRY ListHead
,
9864 IN PKSPIN_LOCK Lock
);
9869 ExInterlockedPushEntryList(
9870 IN PSINGLE_LIST_ENTRY ListHead
,
9871 IN PSINGLE_LIST_ENTRY ListEntry
,
9872 IN PKSPIN_LOCK Lock
);
9877 ExInterlockedRemoveHeadList(
9878 IN PLIST_ENTRY ListHead
,
9879 IN PKSPIN_LOCK Lock
);
9884 ExIsProcessorFeaturePresent(
9885 IN ULONG ProcessorFeature
);
9890 ExIsResourceAcquiredExclusiveLite(
9891 IN PERESOURCE Resource
);
9896 ExIsResourceAcquiredSharedLite(
9897 IN PERESOURCE Resource
);
9899 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
9904 ExLocalTimeToSystemTime(
9905 IN PLARGE_INTEGER LocalTime
,
9906 OUT PLARGE_INTEGER SystemTime
);
9912 IN PCALLBACK_OBJECT CallbackObject
,
9914 IN PVOID Argument2
);
9920 IN PWORK_QUEUE_ITEM WorkItem
,
9921 IN WORK_QUEUE_TYPE QueueType
);
9928 IN NTSTATUS Status
);
9934 IN PCALLBACK_OBJECT CallbackObject
,
9935 IN PCALLBACK_FUNCTION CallbackFunction
,
9936 IN PVOID CallbackContext
);
9941 ExReinitializeResourceLite(
9942 IN PERESOURCE Resource
);
9947 ExReleaseResourceForThreadLite(
9948 IN PERESOURCE Resource
,
9949 IN ERESOURCE_THREAD ResourceThreadId
);
9954 ExReleaseResourceLite(
9955 IN PERESOURCE Resource
);
9960 ExSetResourceOwnerPointer(
9961 IN PERESOURCE Resource
,
9962 IN PVOID OwnerPointer
);
9967 ExSetTimerResolution(
9968 IN ULONG DesiredTime
,
9969 IN BOOLEAN SetResolution
);
9974 ExSystemTimeToLocalTime(
9975 IN PLARGE_INTEGER SystemTime
,
9976 OUT PLARGE_INTEGER LocalTime
);
9981 ExUnregisterCallback(
9982 IN PVOID CbRegistration
);
9985 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
9987 #if (NTDDI_VERSION >= NTDDI_WINXP)
9991 ExAcquireRundownProtection(
9992 IN OUT PEX_RUNDOWN_REF RunRef
);
9997 ExInitializeRundownProtection(
9998 OUT PEX_RUNDOWN_REF RunRef
);
10003 ExReInitializeRundownProtection(
10004 OUT PEX_RUNDOWN_REF RunRef
);
10009 ExReleaseRundownProtection(
10010 IN OUT PEX_RUNDOWN_REF RunRef
);
10015 ExRundownCompleted(
10016 OUT PEX_RUNDOWN_REF RunRef
);
10022 IN SUITE_TYPE SuiteType
);
10027 ExWaitForRundownProtectionRelease(
10028 IN OUT PEX_RUNDOWN_REF RunRef
);
10030 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
10032 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
10036 ExAcquireRundownProtectionEx(
10037 IN OUT PEX_RUNDOWN_REF RunRef
,
10043 ExReleaseRundownProtectionEx(
10044 IN OUT PEX_RUNDOWN_REF RunRef
,
10046 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
10048 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10050 PEX_RUNDOWN_REF_CACHE_AWARE
10052 ExAllocateCacheAwareRundownProtection(
10053 IN POOL_TYPE PoolType
,
10059 ExSizeOfRundownProtectionCacheAware(VOID
);
10060 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
10062 #if (NTDDI_VERSION >= NTDDI_VISTA)
10066 ExInitializeLookasideListEx(
10067 OUT PLOOKASIDE_LIST_EX Lookaside
,
10068 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
10069 IN PFREE_FUNCTION_EX Free OPTIONAL
,
10070 IN POOL_TYPE PoolType
,
10077 #if !defined(MIDL_PASS)
10079 static __inline PVOID
10080 ExAllocateFromNPagedLookasideList(
10081 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
10085 Lookaside
->L
.TotalAllocates
++;
10086 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
10087 if (Entry
== NULL
) {
10088 Lookaside
->L
.AllocateMisses
++;
10089 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
10096 static __inline PVOID
10097 ExAllocateFromPagedLookasideList(
10098 IN PPAGED_LOOKASIDE_LIST Lookaside
)
10102 Lookaside
->L
.TotalAllocates
++;
10103 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
10104 if (Entry
== NULL
) {
10105 Lookaside
->L
.AllocateMisses
++;
10106 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
10113 static __inline VOID
10114 ExFreeToNPagedLookasideList(
10115 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
10118 Lookaside
->L
.TotalFrees
++;
10119 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
10120 Lookaside
->L
.FreeMisses
++;
10121 (Lookaside
->L
.Free
)(Entry
);
10123 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
10127 static __inline VOID
10128 ExFreeToPagedLookasideList(
10129 IN PPAGED_LOOKASIDE_LIST Lookaside
,
10132 Lookaside
->L
.TotalFrees
++;
10133 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
10134 Lookaside
->L
.FreeMisses
++;
10135 (Lookaside
->L
.Free
)(Entry
);
10137 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
10141 #endif // !defined(MIDL_PASS)
10143 /******************************************************************************
10144 * Object Manager Functions *
10145 ******************************************************************************/
10149 * ObDereferenceObject(
10152 #define ObDereferenceObject ObfDereferenceObject
10156 * ObReferenceObject(
10159 #define ObReferenceObject ObfReferenceObject
10161 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10166 ObfDereferenceObject(
10172 ObGetObjectSecurity(
10174 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
10175 OUT PBOOLEAN MemoryAllocated
);
10180 ObfReferenceObject(
10186 ObReferenceObjectByHandle(
10188 IN ACCESS_MASK DesiredAccess
,
10189 IN POBJECT_TYPE ObjectType OPTIONAL
,
10190 IN KPROCESSOR_MODE AccessMode
,
10192 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
10197 ObReferenceObjectByPointer(
10199 IN ACCESS_MASK DesiredAccess
,
10200 IN POBJECT_TYPE ObjectType OPTIONAL
,
10201 IN KPROCESSOR_MODE AccessMode
);
10206 ObReleaseObjectSecurity(
10207 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
10208 IN BOOLEAN MemoryAllocated
);
10212 /******************************************************************************
10213 * Process Manager Functions *
10214 ******************************************************************************/
10218 * PsGetCurrentProcess(VOID)
10220 #define PsGetCurrentProcess IoGetCurrentProcess
10222 #if !defined(_PSGETCURRENTTHREAD_)
10224 #define _PSGETCURRENTTHREAD_
10229 PsGetCurrentThread (
10232 return (PETHREAD
)KeGetCurrentThread();
10237 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10242 PsCreateSystemThread(
10243 OUT PHANDLE ThreadHandle
,
10244 IN ULONG DesiredAccess
,
10245 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10246 IN HANDLE ProcessHandle OPTIONAL
,
10247 OUT PCLIENT_ID ClientId OPTIONAL
,
10248 IN PKSTART_ROUTINE StartRoutine
,
10249 IN PVOID StartContext OPTIONAL
);
10254 PsTerminateSystemThread(
10255 IN NTSTATUS ExitStatus
);
10259 /******************************************************************************
10260 * ZwXxx Functions *
10261 ******************************************************************************/
10263 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10274 ZwCreateDirectoryObject(
10275 OUT PHANDLE DirectoryHandle
,
10276 IN ACCESS_MASK DesiredAccess
,
10277 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10283 OUT PHANDLE FileHandle
,
10284 IN ACCESS_MASK DesiredAccess
,
10285 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10286 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10287 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
10288 IN ULONG FileAttributes
,
10289 IN ULONG ShareAccess
,
10290 IN ULONG CreateDisposition
,
10291 IN ULONG CreateOptions
,
10292 IN PVOID EaBuffer OPTIONAL
,
10293 IN ULONG EaLength
);
10299 OUT PHANDLE KeyHandle
,
10300 IN ACCESS_MASK DesiredAccess
,
10301 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10302 IN ULONG TitleIndex
,
10303 IN PUNICODE_STRING Class OPTIONAL
,
10304 IN ULONG CreateOptions
,
10305 OUT PULONG Disposition OPTIONAL
);
10311 OUT PHANDLE SectionHandle
,
10312 IN ACCESS_MASK DesiredAccess
,
10313 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10314 IN PLARGE_INTEGER MaximumSize OPTIONAL
,
10315 IN ULONG SectionPageProtection
,
10316 IN ULONG AllocationAttributes
,
10317 IN HANDLE FileHandle OPTIONAL
);
10323 IN HANDLE KeyHandle
);
10329 IN HANDLE KeyHandle
,
10330 IN PUNICODE_STRING ValueName
);
10336 IN HANDLE KeyHandle
,
10338 IN KEY_INFORMATION_CLASS KeyInformationClass
,
10339 OUT PVOID KeyInformation OPTIONAL
,
10341 OUT PULONG ResultLength
);
10346 ZwEnumerateValueKey(
10347 IN HANDLE KeyHandle
,
10349 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
10350 OUT PVOID KeyValueInformation OPTIONAL
,
10352 OUT PULONG ResultLength
);
10358 IN HANDLE KeyHandle
);
10364 IN PUNICODE_STRING DriverServiceName
);
10369 ZwMakeTemporaryObject(
10375 ZwMapViewOfSection(
10376 IN HANDLE SectionHandle
,
10377 IN HANDLE ProcessHandle
,
10378 IN OUT PVOID
*BaseAddress
,
10379 IN ULONG_PTR ZeroBits
,
10380 IN SIZE_T CommitSize
,
10381 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
10382 IN OUT PSIZE_T ViewSize
,
10383 IN SECTION_INHERIT InheritDisposition
,
10384 IN ULONG AllocationType
,
10391 OUT PHANDLE FileHandle
,
10392 IN ACCESS_MASK DesiredAccess
,
10393 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10394 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10395 IN ULONG ShareAccess
,
10396 IN ULONG OpenOptions
);
10402 OUT PHANDLE KeyHandle
,
10403 IN ACCESS_MASK DesiredAccess
,
10404 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10410 OUT PHANDLE SectionHandle
,
10411 IN ACCESS_MASK DesiredAccess
,
10412 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10417 ZwOpenSymbolicLinkObject(
10418 OUT PHANDLE LinkHandle
,
10419 IN ACCESS_MASK DesiredAccess
,
10420 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10425 ZwQueryInformationFile(
10426 IN HANDLE FileHandle
,
10427 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10428 OUT PVOID FileInformation
,
10430 IN FILE_INFORMATION_CLASS FileInformationClass
);
10436 IN HANDLE KeyHandle
,
10437 IN KEY_INFORMATION_CLASS KeyInformationClass
,
10438 OUT PVOID KeyInformation OPTIONAL
,
10440 OUT PULONG ResultLength
);
10445 ZwQuerySymbolicLinkObject(
10446 IN HANDLE LinkHandle
,
10447 IN OUT PUNICODE_STRING LinkTarget
,
10448 OUT PULONG ReturnedLength OPTIONAL
);
10454 IN HANDLE KeyHandle
,
10455 IN PUNICODE_STRING ValueName
,
10456 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
10457 OUT PVOID KeyValueInformation OPTIONAL
,
10459 OUT PULONG ResultLength
);
10465 IN HANDLE FileHandle
,
10466 IN HANDLE Event OPTIONAL
,
10467 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
10468 IN PVOID ApcContext OPTIONAL
,
10469 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10472 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
10473 IN PULONG Key OPTIONAL
);
10478 ZwSetInformationFile(
10479 IN HANDLE FileHandle
,
10480 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10481 IN PVOID FileInformation
,
10483 IN FILE_INFORMATION_CLASS FileInformationClass
);
10489 IN HANDLE KeyHandle
,
10490 IN PUNICODE_STRING ValueName
,
10491 IN ULONG TitleIndex OPTIONAL
,
10493 IN PVOID Data OPTIONAL
,
10494 IN ULONG DataSize
);
10500 IN PUNICODE_STRING DriverServiceName
);
10505 ZwUnmapViewOfSection(
10506 IN HANDLE ProcessHandle
,
10507 IN PVOID BaseAddress OPTIONAL
);
10513 IN HANDLE FileHandle
,
10514 IN HANDLE Event OPTIONAL
,
10515 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
10516 IN PVOID ApcContext OPTIONAL
,
10517 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10520 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
10521 IN PULONG Key OPTIONAL
);
10526 ZwQueryFullAttributesFile(
10527 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10528 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation
);
10532 #if (NTDDI_VERSION >= NTDDI_WIN2003)
10538 OUT PHANDLE EventHandle
,
10539 IN ACCESS_MASK DesiredAccess
,
10540 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10544 #if (NTDDI_VERSION >= NTDDI_VISTA)
10548 ZwCreateKeyTransacted(
10549 OUT PHANDLE KeyHandle
,
10550 IN ACCESS_MASK DesiredAccess
,
10551 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10552 IN ULONG TitleIndex
,
10553 IN PUNICODE_STRING Class OPTIONAL
,
10554 IN ULONG CreateOptions
,
10555 IN HANDLE TransactionHandle
,
10556 OUT PULONG Disposition OPTIONAL
);
10561 ZwOpenKeyTransacted(
10562 OUT PHANDLE KeyHandle
,
10563 IN ACCESS_MASK DesiredAccess
,
10564 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10565 IN HANDLE TransactionHandle
);
10570 ZwCreateTransactionManager(
10571 OUT PHANDLE TmHandle
,
10572 IN ACCESS_MASK DesiredAccess
,
10573 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10574 IN PUNICODE_STRING LogFileName OPTIONAL
,
10575 IN ULONG CreateOptions OPTIONAL
,
10576 IN ULONG CommitStrength OPTIONAL
);
10581 ZwOpenTransactionManager(
10582 OUT PHANDLE TmHandle
,
10583 IN ACCESS_MASK DesiredAccess
,
10584 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10585 IN PUNICODE_STRING LogFileName OPTIONAL
,
10586 IN LPGUID TmIdentity OPTIONAL
,
10587 IN ULONG OpenOptions OPTIONAL
);
10592 ZwRollforwardTransactionManager(
10593 IN HANDLE TransactionManagerHandle
,
10594 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10599 ZwRecoverTransactionManager(
10600 IN HANDLE TransactionManagerHandle
);
10605 ZwQueryInformationTransactionManager(
10606 IN HANDLE TransactionManagerHandle
,
10607 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
10608 OUT PVOID TransactionManagerInformation
,
10609 IN ULONG TransactionManagerInformationLength
,
10610 OUT PULONG ReturnLength OPTIONAL
);
10615 ZwSetInformationTransactionManager(
10616 IN HANDLE TmHandle
,
10617 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
10618 IN PVOID TransactionManagerInformation
,
10619 IN ULONG TransactionManagerInformationLength
);
10624 ZwEnumerateTransactionObject(
10625 IN HANDLE RootObjectHandle OPTIONAL
,
10626 IN KTMOBJECT_TYPE QueryType
,
10627 IN OUT PKTMOBJECT_CURSOR ObjectCursor
,
10628 IN ULONG ObjectCursorLength
,
10629 OUT PULONG ReturnLength
);
10634 ZwCreateTransaction(
10635 OUT PHANDLE TransactionHandle
,
10636 IN ACCESS_MASK DesiredAccess
,
10637 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10638 IN LPGUID Uow OPTIONAL
,
10639 IN HANDLE TmHandle OPTIONAL
,
10640 IN ULONG CreateOptions OPTIONAL
,
10641 IN ULONG IsolationLevel OPTIONAL
,
10642 IN ULONG IsolationFlags OPTIONAL
,
10643 IN PLARGE_INTEGER Timeout OPTIONAL
,
10644 IN PUNICODE_STRING Description OPTIONAL
);
10650 OUT PHANDLE TransactionHandle
,
10651 IN ACCESS_MASK DesiredAccess
,
10652 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10654 IN HANDLE TmHandle OPTIONAL
);
10659 ZwQueryInformationTransaction(
10660 IN HANDLE TransactionHandle
,
10661 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
10662 OUT PVOID TransactionInformation
,
10663 IN ULONG TransactionInformationLength
,
10664 OUT PULONG ReturnLength OPTIONAL
);
10669 ZwSetInformationTransaction(
10670 IN HANDLE TransactionHandle
,
10671 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
10672 IN PVOID TransactionInformation
,
10673 IN ULONG TransactionInformationLength
);
10678 ZwCommitTransaction(
10679 IN HANDLE TransactionHandle
,
10685 ZwRollbackTransaction(
10686 IN HANDLE TransactionHandle
,
10692 ZwCreateResourceManager(
10693 OUT PHANDLE ResourceManagerHandle
,
10694 IN ACCESS_MASK DesiredAccess
,
10695 IN HANDLE TmHandle
,
10696 IN LPGUID ResourceManagerGuid OPTIONAL
,
10697 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10698 IN ULONG CreateOptions OPTIONAL
,
10699 IN PUNICODE_STRING Description OPTIONAL
);
10704 ZwOpenResourceManager(
10705 OUT PHANDLE ResourceManagerHandle
,
10706 IN ACCESS_MASK DesiredAccess
,
10707 IN HANDLE TmHandle
,
10708 IN LPGUID ResourceManagerGuid
,
10709 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
);
10714 ZwRecoverResourceManager(
10715 IN HANDLE ResourceManagerHandle
);
10720 ZwGetNotificationResourceManager(
10721 IN HANDLE ResourceManagerHandle
,
10722 OUT PTRANSACTION_NOTIFICATION TransactionNotification
,
10723 IN ULONG NotificationLength
,
10724 IN PLARGE_INTEGER Timeout
,
10725 IN PULONG ReturnLength OPTIONAL
,
10726 IN ULONG Asynchronous
,
10727 IN ULONG_PTR AsynchronousContext OPTIONAL
);
10732 ZwQueryInformationResourceManager(
10733 IN HANDLE ResourceManagerHandle
,
10734 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
10735 OUT PVOID ResourceManagerInformation
,
10736 IN ULONG ResourceManagerInformationLength
,
10737 IN PULONG ReturnLength OPTIONAL
);
10742 ZwSetInformationResourceManager(
10743 IN HANDLE ResourceManagerHandle
,
10744 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
10745 IN PVOID ResourceManagerInformation
,
10746 IN ULONG ResourceManagerInformationLength
);
10751 ZwCreateEnlistment(
10752 OUT PHANDLE EnlistmentHandle
,
10753 IN ACCESS_MASK DesiredAccess
,
10754 IN HANDLE ResourceManagerHandle
,
10755 IN HANDLE TransactionHandle
,
10756 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10757 IN ULONG CreateOptions OPTIONAL
,
10758 IN NOTIFICATION_MASK NotificationMask
,
10759 IN PVOID EnlistmentKey OPTIONAL
);
10765 OUT PHANDLE EnlistmentHandle
,
10766 IN ACCESS_MASK DesiredAccess
,
10767 IN HANDLE RmHandle
,
10768 IN LPGUID EnlistmentGuid
,
10769 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
);
10774 ZwQueryInformationEnlistment(
10775 IN HANDLE EnlistmentHandle
,
10776 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
10777 OUT PVOID EnlistmentInformation
,
10778 IN ULONG EnlistmentInformationLength
,
10779 IN PULONG ReturnLength OPTIONAL
);
10784 ZwSetInformationEnlistment(
10785 IN HANDLE EnlistmentHandle
,
10786 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
10787 IN PVOID EnlistmentInformation
,
10788 IN ULONG EnlistmentInformationLength
);
10793 ZwRecoverEnlistment(
10794 IN HANDLE EnlistmentHandle
,
10795 IN PVOID EnlistmentKey OPTIONAL
);
10800 ZwPrePrepareEnlistment(
10801 IN HANDLE EnlistmentHandle
,
10802 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10807 ZwPrepareEnlistment(
10808 IN HANDLE EnlistmentHandle
,
10809 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10814 ZwCommitEnlistment(
10815 IN HANDLE EnlistmentHandle
,
10816 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10821 ZwRollbackEnlistment(
10822 IN HANDLE EnlistmentHandle
,
10823 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10828 ZwPrePrepareComplete(
10829 IN HANDLE EnlistmentHandle
,
10830 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10836 IN HANDLE EnlistmentHandle
,
10837 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10843 IN HANDLE EnlistmentHandle
,
10844 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10849 ZwReadOnlyEnlistment(
10850 IN HANDLE EnlistmentHandle
,
10851 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10856 ZwRollbackComplete(
10857 IN HANDLE EnlistmentHandle
,
10858 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10863 ZwSinglePhaseReject(
10864 IN HANDLE EnlistmentHandle
,
10865 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
10870 #if (NTDDI_VERSION >= NTDDI_WIN7)
10876 OUT PHANDLE KeyHandle
,
10877 IN ACCESS_MASK DesiredAccess
,
10878 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10879 IN ULONG OpenOptions
);
10884 ZwOpenKeyTransactedEx(
10885 OUT PHANDLE KeyHandle
,
10886 IN ACCESS_MASK DesiredAccess
,
10887 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10888 IN ULONG OpenOptions
,
10889 IN HANDLE TransactionHandle
);
10894 ZwNotifyChangeMultipleKeys(
10895 IN HANDLE MasterKeyHandle
,
10896 IN ULONG Count OPTIONAL
,
10897 IN OBJECT_ATTRIBUTES SubordinateObjects
[] OPTIONAL
,
10898 IN HANDLE Event OPTIONAL
,
10899 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
10900 IN PVOID ApcContext OPTIONAL
,
10901 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10902 IN ULONG CompletionFilter
,
10903 IN BOOLEAN WatchTree
,
10904 OUT PVOID Buffer OPTIONAL
,
10905 IN ULONG BufferSize
,
10906 IN BOOLEAN Asynchronous
);
10911 ZwQueryMultipleValueKey(
10912 IN HANDLE KeyHandle
,
10913 IN OUT PKEY_VALUE_ENTRY ValueEntries
,
10914 IN ULONG EntryCount
,
10915 OUT PVOID ValueBuffer
,
10916 IN OUT PULONG BufferLength
,
10917 OUT PULONG RequiredBufferLength OPTIONAL
);
10923 IN HANDLE KeyHandle
,
10924 IN PUNICODE_STRING NewName
);
10929 ZwSetInformationKey(
10930 IN HANDLE KeyHandle
,
10931 IN KEY_SET_INFORMATION_CLASS KeySetInformationClass
,
10932 IN PVOID KeySetInformation
,
10933 IN ULONG KeySetInformationLength
);
10937 /******************************************************************************
10938 * WMI Library Support Functions *
10939 ******************************************************************************/
10943 #if (NTDDI_VERSION >= NTDDI_WINXP)
10948 IN TRACEHANDLE LoggerHandle
,
10949 IN ULONG MessageFlags
,
10950 IN LPGUID MessageGuid
,
10951 IN USHORT MessageNumber
,
10957 #if (NTDDI_VERSION >= NTDDI_WINXP)
10962 WmiQueryTraceInformation(
10963 IN TRACE_INFORMATION_CLASS TraceInformationClass
,
10964 OUT PVOID TraceInformation
,
10965 IN ULONG TraceInformationLength
,
10966 OUT PULONG RequiredLength OPTIONAL
,
10967 IN PVOID Buffer OPTIONAL
);
10970 /* FIXME: Get va_list from where? */
10975 IN TRACEHANDLE LoggerHandle
,
10976 IN ULONG MessageFlags
,
10977 IN LPGUID MessageGuid
,
10978 IN USHORT MessageNumber
,
10979 IN
va_list MessageArgList
);
10984 /******************************************************************************
10985 * Kernel Debugger Functions *
10986 ******************************************************************************/
10998 #define KdPrint(_x_) DbgPrint _x_
10999 #define KdPrintEx(_x_) DbgPrintEx _x_
11000 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
11001 #define KdBreakPoint() DbgBreakPoint()
11002 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
11006 #define KdPrint(_x_)
11007 #define KdPrintEx(_x_)
11008 #define vKdPrintExWithPrefix(_x_)
11009 #define KdBreakPoint()
11010 #define KdBreakPointWithStatus(s)
11014 #if defined(__GNUC__)
11016 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent
;
11017 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled
;
11018 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
11019 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
11021 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
11023 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent
;
11024 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled
;
11025 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
11026 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
11030 extern BOOLEAN KdDebuggerNotPresent
;
11031 extern BOOLEAN KdDebuggerEnabled
;
11032 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
11033 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
11037 #ifdef _VA_LIST_DEFINED
11038 #if (NTDDI_VERSION >= NTDDI_WINXP)
11044 IN ULONG ComponentId
,
11052 vDbgPrintExWithPrefix(
11054 IN ULONG ComponentId
,
11060 #endif // _VA_LIST_DEFINED
11062 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11076 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
11077 #define DbgBreakPoint __debugbreak
11088 DbgBreakPointWithStatus(
11094 DbgPrintReturnControlC(
11100 #if (NTDDI_VERSION >= NTDDI_WINXP)
11106 IN ULONG ComponentId
,
11114 DbgQueryDebugFilterState(
11115 IN ULONG ComponentId
,
11121 DbgSetDebugFilterState(
11122 IN ULONG ComponentId
,
11128 #if (NTDDI_VERSION >= NTDDI_WS03)
11133 KdRefreshDebuggerNotPresent(
11139 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11144 IN KD_OPTION Option
,
11145 IN ULONG InBufferBytes OPTIONAL
,
11147 IN ULONG OutBufferBytes OPTIONAL
,
11148 OUT PVOID OutBuffer
,
11149 OUT PULONG OutBufferNeeded OPTIONAL
);
11154 /******************************************************************************
11156 ******************************************************************************/
11161 #ifndef __IID_ALIGNED__
11162 #define __IID_ALIGNED__
11164 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
11166 return ((*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) && (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)));
11169 #define IsEqualGUIDAligned(guid1, guid2) \
11170 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
11174 #define ES_SYSTEM_REQUIRED 0x00000001
11175 #define ES_DISPLAY_REQUIRED 0x00000002
11176 #define ES_USER_PRESENT 0x00000004
11177 #define ES_CONTINUOUS 0x80000000
11185 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
11186 #define ZwCurrentProcess() NtCurrentProcess()
11187 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
11188 #define ZwCurrentThread() NtCurrentThread()
11190 #define METHOD_BUFFERED 0
11191 #define METHOD_IN_DIRECT 1
11192 #define METHOD_OUT_DIRECT 2
11193 #define METHOD_NEITHER 3
11195 #define LOW_PRIORITY 0
11196 #define LOW_REALTIME_PRIORITY 16
11197 #define HIGH_PRIORITY 31
11198 #define MAXIMUM_PRIORITY 32
11200 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
11202 #define MAXIMUM_FILENAME_LENGTH 256
11204 #define FILE_SUPERSEDED 0x00000000
11205 #define FILE_OPENED 0x00000001
11206 #define FILE_CREATED 0x00000002
11207 #define FILE_OVERWRITTEN 0x00000003
11208 #define FILE_EXISTS 0x00000004
11209 #define FILE_DOES_NOT_EXIST 0x00000005
11211 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
11212 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
11214 /* also in winnt.h */
11215 #define FILE_LIST_DIRECTORY 0x00000001
11216 #define FILE_READ_DATA 0x00000001
11217 #define FILE_ADD_FILE 0x00000002
11218 #define FILE_WRITE_DATA 0x00000002
11219 #define FILE_ADD_SUBDIRECTORY 0x00000004
11220 #define FILE_APPEND_DATA 0x00000004
11221 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
11222 #define FILE_READ_EA 0x00000008
11223 #define FILE_WRITE_EA 0x00000010
11224 #define FILE_EXECUTE 0x00000020
11225 #define FILE_TRAVERSE 0x00000020
11226 #define FILE_DELETE_CHILD 0x00000040
11227 #define FILE_READ_ATTRIBUTES 0x00000080
11228 #define FILE_WRITE_ATTRIBUTES 0x00000100
11230 #define FILE_SHARE_READ 0x00000001
11231 #define FILE_SHARE_WRITE 0x00000002
11232 #define FILE_SHARE_DELETE 0x00000004
11233 #define FILE_SHARE_VALID_FLAGS 0x00000007
11235 #define FILE_ATTRIBUTE_READONLY 0x00000001
11236 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
11237 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
11238 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
11239 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
11240 #define FILE_ATTRIBUTE_DEVICE 0x00000040
11241 #define FILE_ATTRIBUTE_NORMAL 0x00000080
11242 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
11243 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
11244 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
11245 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
11246 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
11247 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
11248 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
11250 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
11251 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
11253 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
11254 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
11255 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
11256 #define FILE_VALID_SET_FLAGS 0x00000036
11258 #define FILE_SUPERSEDE 0x00000000
11259 #define FILE_OPEN 0x00000001
11260 #define FILE_CREATE 0x00000002
11261 #define FILE_OPEN_IF 0x00000003
11262 #define FILE_OVERWRITE 0x00000004
11263 #define FILE_OVERWRITE_IF 0x00000005
11264 #define FILE_MAXIMUM_DISPOSITION 0x00000005
11266 #define FILE_DIRECTORY_FILE 0x00000001
11267 #define FILE_WRITE_THROUGH 0x00000002
11268 #define FILE_SEQUENTIAL_ONLY 0x00000004
11269 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
11270 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
11271 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
11272 #define FILE_NON_DIRECTORY_FILE 0x00000040
11273 #define FILE_CREATE_TREE_CONNECTION 0x00000080
11274 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
11275 #define FILE_NO_EA_KNOWLEDGE 0x00000200
11276 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
11277 #define FILE_RANDOM_ACCESS 0x00000800
11278 #define FILE_DELETE_ON_CLOSE 0x00001000
11279 #define FILE_OPEN_BY_FILE_ID 0x00002000
11280 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
11281 #define FILE_NO_COMPRESSION 0x00008000
11282 #define FILE_RESERVE_OPFILTER 0x00100000
11283 #define FILE_OPEN_REPARSE_POINT 0x00200000
11284 #define FILE_OPEN_NO_RECALL 0x00400000
11285 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
11287 #define FILE_ANY_ACCESS 0x00000000
11288 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
11289 #define FILE_READ_ACCESS 0x00000001
11290 #define FILE_WRITE_ACCESS 0x00000002
11292 #define FILE_ALL_ACCESS \
11293 (STANDARD_RIGHTS_REQUIRED | \
11297 #define FILE_GENERIC_EXECUTE \
11298 (STANDARD_RIGHTS_EXECUTE | \
11299 FILE_READ_ATTRIBUTES | \
11303 #define FILE_GENERIC_READ \
11304 (STANDARD_RIGHTS_READ | \
11306 FILE_READ_ATTRIBUTES | \
11310 #define FILE_GENERIC_WRITE \
11311 (STANDARD_RIGHTS_WRITE | \
11312 FILE_WRITE_DATA | \
11313 FILE_WRITE_ATTRIBUTES | \
11315 FILE_APPEND_DATA | \
11320 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
11322 #define OBJECT_TYPE_CREATE (0x0001)
11323 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
11325 #define DIRECTORY_QUERY (0x0001)
11326 #define DIRECTORY_TRAVERSE (0x0002)
11327 #define DIRECTORY_CREATE_OBJECT (0x0004)
11328 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
11329 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
11331 #define EVENT_QUERY_STATE (0x0001)
11332 #define EVENT_MODIFY_STATE (0x0002)
11333 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
11335 #define SEMAPHORE_QUERY_STATE (0x0001)
11336 #define SEMAPHORE_MODIFY_STATE (0x0002)
11337 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
11341 ** System structures
11344 #define SYMBOLIC_LINK_QUERY 0x0001
11345 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
11347 /* also in winnt,h */
11348 #define DUPLICATE_CLOSE_SOURCE 0x00000001
11349 #define DUPLICATE_SAME_ACCESS 0x00000002
11350 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
11353 typedef struct _OBJECT_NAME_INFORMATION
{
11354 UNICODE_STRING Name
;
11355 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
11357 /* Global debug flag */
11358 extern ULONG NtGlobalFlag
;
11360 #define PROCESS_DUP_HANDLE (0x0040)
11362 #if (NTDDI_VERSION >= NTDDI_VISTA)
11363 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
11366 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
11371 #if defined(_M_IX86)
11372 #define YieldProcessor _mm_pause
11373 #elif defined (_M_AMD64)
11374 #define YieldProcessor _mm_pause
11375 #elif defined(_M_PPC)
11376 #define YieldProcessor() __asm__ __volatile__("nop");
11377 #elif defined(_M_MIPS)
11378 #define YieldProcessor() __asm__ __volatile__("nop");
11379 #elif defined(_M_ARM)
11380 #define YieldProcessor()
11382 #error Unknown architecture
11385 /* Thread Access Rights */
11386 #define THREAD_TERMINATE (0x0001)
11387 #define THREAD_SUSPEND_RESUME (0x0002)
11388 #define THREAD_ALERT (0x0004)
11389 #define THREAD_GET_CONTEXT (0x0008)
11390 #define THREAD_SET_CONTEXT (0x0010)
11391 #define THREAD_SET_INFORMATION (0x0020)
11392 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
11393 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
11394 #if (NTDDI_VERSION >= NTDDI_VISTA)
11395 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
11398 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
11402 /* Service Start Types */
11403 #define SERVICE_BOOT_START 0x00000000
11404 #define SERVICE_SYSTEM_START 0x00000001
11405 #define SERVICE_AUTO_START 0x00000002
11406 #define SERVICE_DEMAND_START 0x00000003
11407 #define SERVICE_DISABLED 0x00000004
11409 /* Process Qoutas */
11410 typedef struct _QUOTA_LIMITS
{
11411 SIZE_T PagedPoolLimit
;
11412 SIZE_T NonPagedPoolLimit
;
11413 SIZE_T MinimumWorkingSetSize
;
11414 SIZE_T MaximumWorkingSetSize
;
11415 SIZE_T PagefileLimit
;
11416 LARGE_INTEGER TimeLimit
;
11417 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
11419 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
11420 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
11421 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
11422 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
11423 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
11425 /* Exported object types */
11426 extern POBJECT_TYPE NTSYSAPI ExEventObjectType
;
11427 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType
;
11428 extern POBJECT_TYPE NTSYSAPI IoFileObjectType
;
11429 extern POBJECT_TYPE NTSYSAPI PsThreadType
;
11430 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType
;
11431 extern POBJECT_TYPE NTSYSAPI PsProcessType
;
11433 #if defined(_IA64_)
11435 extern volatile LARGE_INTEGER KeTickCount
;
11437 #elif defined(_X86_)
11439 extern volatile KSYSTEM_TIME KeTickCount
;
11443 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
11444 #if defined(_NTSYSTEM_) || defined(__GNUC__)
11445 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
11446 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
11448 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
11449 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
11450 #endif /* _NT_SYSTEM */
11451 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG
;
11452 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG
;
11454 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11458 HalAllocateCommonBuffer(
11459 IN PDMA_ADAPTER DmaAdapter
,
11461 OUT PPHYSICAL_ADDRESS LogicalAddress
,
11462 IN BOOLEAN CacheEnabled
)
11464 PALLOCATE_COMMON_BUFFER allocateCommonBuffer
;
11465 PVOID commonBuffer
;
11467 allocateCommonBuffer
= *(DmaAdapter
)->DmaOperations
->AllocateCommonBuffer
;
11468 ASSERT( allocateCommonBuffer
!= NULL
);
11469 commonBuffer
= allocateCommonBuffer( DmaAdapter
, Length
, LogicalAddress
, CacheEnabled
);
11470 return commonBuffer
;
11476 HalFreeCommonBuffer(
11477 IN PDMA_ADAPTER DmaAdapter
,
11479 IN PHYSICAL_ADDRESS LogicalAddress
,
11480 IN PVOID VirtualAddress
,
11481 IN BOOLEAN CacheEnabled
)
11483 PFREE_COMMON_BUFFER freeCommonBuffer
;
11485 freeCommonBuffer
= *(DmaAdapter
)->DmaOperations
->FreeCommonBuffer
;
11486 ASSERT( freeCommonBuffer
!= NULL
);
11487 freeCommonBuffer( DmaAdapter
, Length
, LogicalAddress
, VirtualAddress
, CacheEnabled
);
11494 IN PDMA_ADAPTER DmaAdapter
)
11496 PREAD_DMA_COUNTER readDmaCounter
;
11499 readDmaCounter
= *(DmaAdapter
)->DmaOperations
->ReadDmaCounter
;
11500 ASSERT( readDmaCounter
!= NULL
);
11501 counter
= readDmaCounter( DmaAdapter
);
11511 #endif /* !_WDMDDK_ */