4 * Windows NT WDM Driver Developer Kit
6 * This file is part of the ReactOS DDK package.
9 * Amine Khaldi (amine.khaldi@reactos.org)
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 #define WDM_MAJORVERSION 0x06
29 #define WDM_MINORVERSION 0x00
31 /* Included via ntddk.h? */
34 #define _WDM_INCLUDED_
36 #define NO_INTERLOCKED_INTRINSICS
53 #endif /* _INC_STRING */
59 typedef GUID UOW
, *PUOW
;
64 #if (NTDDI_VERSION >= NTDDI_WINXP)
70 __internal_kernel_driver
71 __drv_Mode_impl(WDM_INCLUDED
)
77 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
78 #define NTHALAPI DECLSPEC_IMPORT
84 #if !defined(_NTOSKRNL_) && !defined(_BLDR_)
85 #define NTKERNELAPI DECLSPEC_IMPORT
90 #if defined(_X86_) && !defined(_NTHAL_)
91 #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT
93 #define _DECL_HAL_KE_IMPORT
95 #define _DECL_HAL_KE_IMPORT NTKERNELAPI
99 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
101 #define POINTER_ALIGNMENT
104 /* Helper macro to enable gcc's extension. */
105 #ifndef __GNU_EXTENSION
107 #define __GNU_EXTENSION __extension__
109 #define __GNU_EXTENSION
113 #if defined(_MSC_VER)
115 /* Disable some warnings */
116 #pragma warning(disable:4115) /* Named type definition in parentheses */
117 #pragma warning(disable:4201) /* Nameless unions and structs */
118 #pragma warning(disable:4214) /* Bit fields of other types than int */
119 #pragma warning(disable:4820) /* Padding added, due to alignemnet requirement */
121 /* Indicate if #pragma alloc_text() is supported */
122 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
123 #define ALLOC_PRAGMA 1
126 /* Indicate if #pragma data_seg() is supported */
127 #if defined(_M_IX86) || defined(_M_AMD64)
128 #define ALLOC_DATA_PRAGMA 1
134 #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
135 #define USE_DMA_MACROS
137 #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__)
138 #define NO_LEGACY_DRIVERS
140 #endif /* defined(_WIN64) */
142 /* Forward declarations */
149 struct _DEVICE_OBJECT
;
150 struct _DRIVER_OBJECT
;
151 struct _IO_STATUS_BLOCK
;
152 struct _DEVICE_DESCRIPTION
;
153 struct _SCATTER_GATHER_LIST
;
154 struct _DRIVE_LAYOUT_INFORMATION
;
155 struct _COMPRESSED_DATA_INFO
;
156 struct _IO_RESOURCE_DESCRIPTOR
;
158 /* Structures not exposed to drivers */
159 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
160 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
161 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
162 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
163 typedef struct _EPROCESS
*PEPROCESS
;
164 typedef struct _ETHREAD
*PETHREAD
;
165 typedef struct _IO_TIMER
*PIO_TIMER
;
166 typedef struct _KINTERRUPT
*PKINTERRUPT
;
167 typedef struct _KPROCESS
*PKPROCESS
;
168 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
169 typedef struct _CONTEXT
*PCONTEXT
;
171 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
172 typedef struct _DMA_ADAPTER
*PADAPTER_OBJECT
;
173 #elif defined(_WDM_INCLUDED_)
174 typedef struct _DMA_ADAPTER
*PADAPTER_OBJECT
;
176 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
179 #ifndef DEFINE_GUIDEX
181 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
183 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
185 #endif /* DEFINE_GUIDEX */
188 #define STATICGUIDOF(guid) STATIC_##guid
191 /* GUID Comparison */
192 #ifndef __IID_ALIGNED__
193 #define __IID_ALIGNED__
195 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
197 return ( (*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) &&
198 (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)) );
201 #define IsEqualGUIDAligned(guid1, guid2) \
202 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
203 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
204 #endif /* __cplusplus */
205 #endif /* !__IID_ALIGNED__ */
208 /******************************************************************************
209 * INTERLOCKED Functions *
210 ******************************************************************************/
212 // Intrinsics (note: taken from our winnt.h)
215 #if defined(__GNUC__)
217 static __inline__ BOOLEAN
218 InterlockedBitTestAndSet(
219 _Inout_updates_bytes_((Bit
+7)/8) _Interlocked_operand_ LONG
volatile *Base
,
224 __asm__
__volatile__("lock "
227 :"=r" (OldBit
),"+m" (*Base
)
232 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
236 static __inline__ BOOLEAN
237 InterlockedBitTestAndReset(
238 _Inout_updates_bytes_((Bit
+7)/8) _Interlocked_operand_ LONG
volatile *Base
,
243 __asm__
__volatile__("lock "
246 :"=r" (OldBit
),"+m" (*Base
)
251 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
255 #endif /* defined(__GNUC__) */
257 #define BitScanForward _BitScanForward
258 #define BitScanReverse _BitScanReverse
259 #define BitTest _bittest
260 #define BitTestAndComplement _bittestandcomplement
261 #define BitTestAndSet _bittestandset
262 #define BitTestAndReset _bittestandreset
263 #define InterlockedBitTestAndSet _interlockedbittestandset
264 #define InterlockedBitTestAndReset _interlockedbittestandreset
267 #define BitTest64 _bittest64
268 #define BitTestAndComplement64 _bittestandcomplement64
269 #define BitTestAndSet64 _bittestandset64
270 #define BitTestAndReset64 _bittestandreset64
271 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
272 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
275 #if !defined(__INTERLOCKED_DECLARED)
276 #define __INTERLOCKED_DECLARED
279 #if defined(NO_INTERLOCKED_INTRINSICS)
283 InterlockedIncrement(
284 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
);
289 InterlockedDecrement(
290 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
);
295 InterlockedCompareExchange(
296 _Inout_ _Interlocked_operand_ LONG
volatile *Destination
,
298 _In_ LONG Comparand
);
304 _Inout_ _Interlocked_operand_ LONG
volatile *Destination
,
310 InterlockedExchangeAdd(
311 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
,
314 #else /* !defined(NO_INTERLOCKED_INTRINSICS) */
316 #define InterlockedExchange _InterlockedExchange
317 #define InterlockedIncrement _InterlockedIncrement
318 #define InterlockedDecrement _InterlockedDecrement
319 #define InterlockedExchangeAdd _InterlockedExchangeAdd
320 #define InterlockedCompareExchange _InterlockedCompareExchange
321 #define InterlockedOr _InterlockedOr
322 #define InterlockedAnd _InterlockedAnd
323 #define InterlockedXor _InterlockedXor
325 #endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
327 #endif /* defined (_X86_) */
329 #if !defined (_WIN64)
332 * InterlockedExchangePointer(
333 * IN OUT PVOID volatile *Target,
336 #define InterlockedExchangePointer(Target, Value) \
337 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
341 * InterlockedCompareExchangePointer(
342 * IN OUT PVOID *Destination,
344 * IN PVOID Comparand)
346 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
347 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
349 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
350 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
351 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
353 #endif // !defined (_WIN64)
355 #if defined (_M_AMD64)
357 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
358 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
359 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
360 #define InterlockedAnd _InterlockedAnd
361 #define InterlockedOr _InterlockedOr
362 #define InterlockedXor _InterlockedXor
363 #define InterlockedIncrement _InterlockedIncrement
364 #define InterlockedDecrement _InterlockedDecrement
365 #define InterlockedAdd _InterlockedAdd
366 #define InterlockedExchange _InterlockedExchange
367 #define InterlockedExchangeAdd _InterlockedExchangeAdd
368 #define InterlockedCompareExchange _InterlockedCompareExchange
369 #define InterlockedAnd64 _InterlockedAnd64
370 #define InterlockedOr64 _InterlockedOr64
371 #define InterlockedXor64 _InterlockedXor64
372 #define InterlockedIncrement64 _InterlockedIncrement64
373 #define InterlockedDecrement64 _InterlockedDecrement64
374 #define InterlockedAdd64 _InterlockedAdd64
375 #define InterlockedExchange64 _InterlockedExchange64
376 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
377 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
378 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
379 #define InterlockedExchangePointer _InterlockedExchangePointer
380 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
381 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
385 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
386 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
390 _Inout_ _Interlocked_operand_ LONG64
volatile *Addend
,
393 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
398 #endif /* !__INTERLOCKED_DECLARED */
401 /******************************************************************************
402 * Runtime Library Types *
403 ******************************************************************************/
405 #define RTL_REGISTRY_ABSOLUTE 0
406 #define RTL_REGISTRY_SERVICES 1
407 #define RTL_REGISTRY_CONTROL 2
408 #define RTL_REGISTRY_WINDOWS_NT 3
409 #define RTL_REGISTRY_DEVICEMAP 4
410 #define RTL_REGISTRY_USER 5
411 #define RTL_REGISTRY_MAXIMUM 6
412 #define RTL_REGISTRY_HANDLE 0x40000000
413 #define RTL_REGISTRY_OPTIONAL 0x80000000
415 /* RTL_QUERY_REGISTRY_TABLE.Flags */
416 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
417 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
418 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
419 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
420 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
421 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
422 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
424 #define HASH_STRING_ALGORITHM_DEFAULT 0
425 #define HASH_STRING_ALGORITHM_X65599 1
426 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
428 typedef struct _RTL_BITMAP
{
431 } RTL_BITMAP
, *PRTL_BITMAP
;
433 typedef struct _RTL_BITMAP_RUN
{
436 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
438 _Function_class_(RTL_QUERY_REGISTRY_ROUTINE
)
439 _IRQL_requires_max_(PASSIVE_LEVEL
)
442 (NTAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
443 _In_z_ PWSTR ValueName
,
444 _In_ ULONG ValueType
,
445 _In_reads_bytes_opt_(ValueLength
) PVOID ValueData
,
446 _In_ ULONG ValueLength
,
447 _In_opt_ PVOID Context
,
448 _In_opt_ PVOID EntryContext
);
450 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
451 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
458 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
460 typedef struct _TIME_FIELDS
{
469 } TIME_FIELDS
, *PTIME_FIELDS
;
472 #ifndef _SLIST_HEADER_
473 #define _SLIST_HEADER_
477 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
478 struct _SLIST_ENTRY
*Next
;
479 } SLIST_ENTRY
, *PSLIST_ENTRY
;
481 typedef struct _SLIST_ENTRY32
{
483 } SLIST_ENTRY32
, *PSLIST_ENTRY32
;
485 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
486 _ANONYMOUS_STRUCT
struct {
492 ULONGLONG Sequence
:9;
493 ULONGLONG NextEntry
:39;
494 ULONGLONG HeaderType
:1;
496 ULONGLONG Reserved
:59;
501 ULONGLONG Sequence
:48;
502 ULONGLONG HeaderType
:1;
504 ULONGLONG Reserved
:2;
505 ULONGLONG NextEntry
:60;
509 ULONGLONG Sequence
:48;
510 ULONGLONG HeaderType
:1;
511 ULONGLONG Reserved
:3;
512 ULONGLONG NextEntry
:60;
514 } SLIST_HEADER
, *PSLIST_HEADER
;
516 typedef union _SLIST_HEADER32
{
518 _ANONYMOUS_STRUCT
struct {
523 } SLIST_HEADER32
, *PSLIST_HEADER32
;
527 #define SLIST_ENTRY SINGLE_LIST_ENTRY
528 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
529 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
531 typedef SLIST_ENTRY SLIST_ENTRY32
, *PSLIST_ENTRY32
;
533 typedef union _SLIST_HEADER
{
535 _ANONYMOUS_STRUCT
struct {
540 } SLIST_HEADER
, *PSLIST_HEADER
;
542 typedef SLIST_HEADER SLIST_HEADER32
, *PSLIST_HEADER32
;
544 #endif /* defined(_WIN64) */
546 #endif /* _SLIST_HEADER_ */
548 /* MS definition is broken! */
549 extern BOOLEAN NTSYSAPI NlsMbCodePageTag
;
550 extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag
;
551 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
552 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
554 #define SHORT_LEAST_SIGNIFICANT_BIT 0
555 #define SHORT_MOST_SIGNIFICANT_BIT 1
557 #define LONG_LEAST_SIGNIFICANT_BIT 0
558 #define LONG_3RD_MOST_SIGNIFICANT_BIT 1
559 #define LONG_2ND_MOST_SIGNIFICANT_BIT 2
560 #define LONG_MOST_SIGNIFICANT_BIT 3
562 #define RTLVERLIB_DDI(x) Wdmlib##x
565 (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE
)(
569 (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED
)(
572 /******************************************************************************
574 ******************************************************************************/
576 typedef UCHAR KIRQL
, *PKIRQL
;
577 typedef CCHAR KPROCESSOR_MODE
;
578 typedef LONG KPRIORITY
;
586 #define CACHE_FULLY_ASSOCIATIVE 0xFF
587 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
589 #define EVENT_QUERY_STATE (0x0001)
590 #define EVENT_MODIFY_STATE (0x0002)
591 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
593 #define LTP_PC_SMT 0x1
595 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
596 #define SINGLE_GROUP_LEGACY_API 1
599 #define SEMAPHORE_QUERY_STATE (0x0001)
600 #define SEMAPHORE_MODIFY_STATE (0x0002)
601 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
603 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP
{
604 RelationProcessorCore
,
607 RelationProcessorPackage
,
610 } LOGICAL_PROCESSOR_RELATIONSHIP
;
612 typedef enum _PROCESSOR_CACHE_TYPE
{
617 } PROCESSOR_CACHE_TYPE
;
619 typedef struct _CACHE_DESCRIPTOR
{
624 PROCESSOR_CACHE_TYPE Type
;
625 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
627 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION
{
628 ULONG_PTR ProcessorMask
;
629 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
630 _ANONYMOUS_UNION
union {
637 CACHE_DESCRIPTOR Cache
;
638 ULONGLONG Reserved
[2];
640 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION
;
642 typedef struct _PROCESSOR_RELATIONSHIP
{
646 _Field_size_(GroupCount
) GROUP_AFFINITY GroupMask
[ANYSIZE_ARRAY
];
647 } PROCESSOR_RELATIONSHIP
, *PPROCESSOR_RELATIONSHIP
;
649 typedef struct _NUMA_NODE_RELATIONSHIP
{
652 GROUP_AFFINITY GroupMask
;
653 } NUMA_NODE_RELATIONSHIP
, *PNUMA_NODE_RELATIONSHIP
;
655 typedef struct _CACHE_RELATIONSHIP
{
660 PROCESSOR_CACHE_TYPE Type
;
662 GROUP_AFFINITY GroupMask
;
663 } CACHE_RELATIONSHIP
, *PCACHE_RELATIONSHIP
;
665 typedef struct _PROCESSOR_GROUP_INFO
{
666 UCHAR MaximumProcessorCount
;
667 UCHAR ActiveProcessorCount
;
669 KAFFINITY ActiveProcessorMask
;
670 } PROCESSOR_GROUP_INFO
, *PPROCESSOR_GROUP_INFO
;
672 typedef struct _GROUP_RELATIONSHIP
{
673 USHORT MaximumGroupCount
;
674 USHORT ActiveGroupCount
;
676 PROCESSOR_GROUP_INFO GroupInfo
[ANYSIZE_ARRAY
];
677 } GROUP_RELATIONSHIP
, *PGROUP_RELATIONSHIP
;
679 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
{
680 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
682 _ANONYMOUS_UNION
union {
683 PROCESSOR_RELATIONSHIP Processor
;
684 NUMA_NODE_RELATIONSHIP NumaNode
;
685 CACHE_RELATIONSHIP Cache
;
686 GROUP_RELATIONSHIP Group
;
688 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
;;
690 /* Processor features */
691 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
692 #define PF_FLOATING_POINT_EMULATED 1
693 #define PF_COMPARE_EXCHANGE_DOUBLE 2
694 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
695 #define PF_PPC_MOVEMEM_64BIT_OK 4
696 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
697 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
698 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
699 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
700 #define PF_PAE_ENABLED 9
701 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
702 #define PF_SSE_DAZ_MODE_AVAILABLE 11
703 #define PF_NX_ENABLED 12
704 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
705 #define PF_COMPARE_EXCHANGE128 14
706 #define PF_COMPARE64_EXCHANGE128 15
707 #define PF_CHANNELS_ENABLED 16
708 #define PF_XSAVE_ENABLED 17
710 #define MAXIMUM_WAIT_OBJECTS 64
712 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
714 #define ASSERT_DPC(Object) \
715 ASSERT(((Object)->Type == 0) || \
716 ((Object)->Type == DpcObject) || \
717 ((Object)->Type == ThreadedDpcObject))
719 #define ASSERT_GATE(object) \
720 NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
721 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
723 #define ASSERT_DEVICE_QUEUE(Object) \
724 NT_ASSERT((Object)->Type == DeviceQueueObject)
726 #define ASSERT_TIMER(E) \
727 NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
728 ((E)->Header.Type == TimerSynchronizationObject))
730 #define ASSERT_MUTANT(E) \
731 NT_ASSERT((E)->Header.Type == MutantObject)
733 #define ASSERT_SEMAPHORE(E) \
734 NT_ASSERT((E)->Header.Type == SemaphoreObject)
736 #define ASSERT_EVENT(E) \
737 NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
738 ((E)->Header.Type == SynchronizationEvent))
741 #define DPC_THREADED 1
743 #define GM_LOCK_BIT 0x1
744 #define GM_LOCK_BIT_V 0x0
745 #define GM_LOCK_WAITER_WOKEN 0x2
746 #define GM_LOCK_WAITER_INC 0x4
748 #define LOCK_QUEUE_WAIT_BIT 0
749 #define LOCK_QUEUE_OWNER_BIT 1
751 #define LOCK_QUEUE_WAIT 1
752 #define LOCK_QUEUE_OWNER 2
753 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
754 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
756 #define PROCESSOR_FEATURE_MAX 64
758 #define DBG_STATUS_CONTROL_C 1
759 #define DBG_STATUS_SYSRQ 2
760 #define DBG_STATUS_BUGCHECK_FIRST 3
761 #define DBG_STATUS_BUGCHECK_SECOND 4
762 #define DBG_STATUS_FATAL 5
763 #define DBG_STATUS_DEBUG_CONTROL 6
764 #define DBG_STATUS_WORKER 7
767 #define MAXIMUM_PROC_PER_GROUP 64
769 #define MAXIMUM_PROC_PER_GROUP 32
771 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
773 /* Exception Records */
774 #define EXCEPTION_NONCONTINUABLE 1
775 #define EXCEPTION_MAXIMUM_PARAMETERS 15
777 #define EXCEPTION_DIVIDED_BY_ZERO 0
778 #define EXCEPTION_DEBUG 1
779 #define EXCEPTION_NMI 2
780 #define EXCEPTION_INT3 3
781 #define EXCEPTION_BOUND_CHECK 5
782 #define EXCEPTION_INVALID_OPCODE 6
783 #define EXCEPTION_NPX_NOT_AVAILABLE 7
784 #define EXCEPTION_DOUBLE_FAULT 8
785 #define EXCEPTION_NPX_OVERRUN 9
786 #define EXCEPTION_INVALID_TSS 0x0A
787 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
788 #define EXCEPTION_STACK_FAULT 0x0C
789 #define EXCEPTION_GP_FAULT 0x0D
790 #define EXCEPTION_RESERVED_TRAP 0x0F
791 #define EXCEPTION_NPX_ERROR 0x010
792 #define EXCEPTION_ALIGNMENT_CHECK 0x011
794 typedef struct _EXCEPTION_RECORD
{
795 NTSTATUS ExceptionCode
;
796 ULONG ExceptionFlags
;
797 struct _EXCEPTION_RECORD
*ExceptionRecord
;
798 PVOID ExceptionAddress
;
799 ULONG NumberParameters
;
800 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
801 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
803 typedef struct _EXCEPTION_RECORD32
{
804 NTSTATUS ExceptionCode
;
805 ULONG ExceptionFlags
;
806 ULONG ExceptionRecord
;
807 ULONG ExceptionAddress
;
808 ULONG NumberParameters
;
809 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
810 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
812 typedef struct _EXCEPTION_RECORD64
{
813 NTSTATUS ExceptionCode
;
814 ULONG ExceptionFlags
;
815 ULONG64 ExceptionRecord
;
816 ULONG64 ExceptionAddress
;
817 ULONG NumberParameters
;
818 ULONG __unusedAlignment
;
819 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
820 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
822 typedef struct _EXCEPTION_POINTERS
{
823 PEXCEPTION_RECORD ExceptionRecord
;
824 PCONTEXT ContextRecord
;
825 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
827 typedef enum _KBUGCHECK_CALLBACK_REASON
{
830 KbCallbackSecondaryDumpData
,
833 } KBUGCHECK_CALLBACK_REASON
;
835 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
837 _Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE
)
840 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE
)(
841 _In_ KBUGCHECK_CALLBACK_REASON Reason
,
842 _In_
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
843 _Inout_ PVOID ReasonSpecificData
,
844 _In_ ULONG ReasonSpecificDataLength
);
845 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
;
847 typedef struct _KBUGCHECK_ADD_PAGES
{
848 _Inout_ PVOID Context
;
850 _In_ ULONG BugCheckCode
;
851 _Out_ ULONG_PTR Address
;
852 _Out_ ULONG_PTR Count
;
853 } KBUGCHECK_ADD_PAGES
, *PKBUGCHECK_ADD_PAGES
;
855 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA
{
857 _In_ ULONG InBufferLength
;
858 _In_ ULONG MaximumAllowed
;
860 _Out_ PVOID OutBuffer
;
861 _Out_ ULONG OutBufferLength
;
862 } KBUGCHECK_SECONDARY_DUMP_DATA
, *PKBUGCHECK_SECONDARY_DUMP_DATA
;
864 typedef enum _KBUGCHECK_DUMP_IO_TYPE
{
868 KbDumpIoSecondaryData
,
870 } KBUGCHECK_DUMP_IO_TYPE
;
872 typedef struct _KBUGCHECK_DUMP_IO
{
875 _In_ ULONG BufferLength
;
876 _In_ KBUGCHECK_DUMP_IO_TYPE Type
;
877 } KBUGCHECK_DUMP_IO
, *PKBUGCHECK_DUMP_IO
;
879 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
880 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
881 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
883 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
885 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
888 KBUGCHECK_CALLBACK_REASON Reason
;
890 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
892 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
898 } KBUGCHECK_BUFFER_DUMP_STATE
;
900 _Function_class_(KBUGCHECK_CALLBACK_ROUTINE
)
903 (NTAPI KBUGCHECK_CALLBACK_ROUTINE
)(
906 typedef KBUGCHECK_CALLBACK_ROUTINE
*PKBUGCHECK_CALLBACK_ROUTINE
;
908 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
910 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
911 _Field_size_bytes_opt_(Length
) PVOID Buffer
;
916 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
918 _Function_class_(NMI_CALLBACK
)
921 (NTAPI NMI_CALLBACK
)(
922 _In_opt_ PVOID Context
,
923 _In_ BOOLEAN Handled
);
924 typedef NMI_CALLBACK
*PNMI_CALLBACK
;
926 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE
{
927 KeProcessorAddStartNotify
= 0,
928 KeProcessorAddCompleteNotify
,
929 KeProcessorAddFailureNotify
930 } KE_PROCESSOR_CHANGE_NOTIFY_STATE
;
932 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
{
933 KE_PROCESSOR_CHANGE_NOTIFY_STATE State
;
936 #if (NTDDI_VERSION >= NTDDI_WIN7)
937 PROCESSOR_NUMBER ProcNumber
;
939 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
;
942 _Function_class_(PROCESSOR_CALLBACK_FUNCTION
)
944 (NTAPI PROCESSOR_CALLBACK_FUNCTION
)(
945 _In_ PVOID CallbackContext
,
946 _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext
,
947 _Inout_ PNTSTATUS OperationStatus
);
948 typedef PROCESSOR_CALLBACK_FUNCTION
*PPROCESSOR_CALLBACK_FUNCTION
;
950 #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
952 #define INVALID_PROCESSOR_INDEX 0xffffffff
954 typedef enum _KINTERRUPT_POLARITY
{
955 InterruptPolarityUnknown
,
958 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
960 typedef enum _KPROFILE_SOURCE
{
962 ProfileAlignmentFixup
,
965 ProfileLoadInstructions
,
966 ProfilePipelineFrozen
,
967 ProfileBranchInstructions
,
968 ProfileTotalNonissues
,
972 ProfileBranchMispredictions
,
973 ProfileStoreInstructions
,
974 ProfileFpInstructions
,
975 ProfileIntegerInstructions
,
979 ProfileSpecialInstructions
,
982 ProfileDcacheAccesses
,
983 ProfileMemoryBarrierCycles
,
984 ProfileLoadLinkedIssues
,
988 typedef enum _KWAIT_REASON
{
1029 typedef struct _KWAIT_BLOCK
{
1030 LIST_ENTRY WaitListEntry
;
1031 struct _KTHREAD
*Thread
;
1033 struct _KWAIT_BLOCK
*NextWaitBlock
;
1036 volatile UCHAR BlockState
;
1040 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
1042 typedef enum _KINTERRUPT_MODE
{
1047 #define THREAD_WAIT_OBJECTS 3
1049 _IRQL_requires_same_
1050 _Function_class_(KSTART_ROUTINE
)
1052 (NTAPI KSTART_ROUTINE
)(
1053 _In_ PVOID StartContext
);
1054 typedef KSTART_ROUTINE
*PKSTART_ROUTINE
;
1057 (NTAPI
*PKINTERRUPT_ROUTINE
)(
1060 _Function_class_(KSERVICE_ROUTINE
)
1061 _IRQL_requires_(HIGH_LEVEL
)
1062 _IRQL_requires_same_
1064 (NTAPI KSERVICE_ROUTINE
)(
1065 _In_
struct _KINTERRUPT
*Interrupt
,
1066 _In_ PVOID ServiceContext
);
1067 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
1069 _Function_class_(KMESSAGE_SERVICE_ROUTINE
)
1070 _IRQL_requires_same_
1072 (NTAPI KMESSAGE_SERVICE_ROUTINE
)(
1073 _In_
struct _KINTERRUPT
*Interrupt
,
1074 _In_ PVOID ServiceContext
,
1075 _In_ ULONG MessageID
);
1076 typedef KMESSAGE_SERVICE_ROUTINE
*PKMESSAGE_SERVICE_ROUTINE
;
1078 typedef enum _KD_OPTION
{
1079 KD_OPTION_SET_BLOCK_ENABLE
,
1083 (NTAPI
*PKNORMAL_ROUTINE
)(
1084 IN PVOID NormalContext OPTIONAL
,
1085 IN PVOID SystemArgument1 OPTIONAL
,
1086 IN PVOID SystemArgument2 OPTIONAL
);
1089 (NTAPI
*PKRUNDOWN_ROUTINE
)(
1090 IN
struct _KAPC
*Apc
);
1093 (NTAPI
*PKKERNEL_ROUTINE
)(
1094 IN
struct _KAPC
*Apc
,
1095 IN OUT PKNORMAL_ROUTINE
*NormalRoutine OPTIONAL
,
1096 IN OUT PVOID
*NormalContext OPTIONAL
,
1097 IN OUT PVOID
*SystemArgument1 OPTIONAL
,
1098 IN OUT PVOID
*SystemArgument2 OPTIONAL
);
1100 typedef struct _KAPC
{
1106 struct _KTHREAD
*Thread
;
1107 LIST_ENTRY ApcListEntry
;
1108 PKKERNEL_ROUTINE KernelRoutine
;
1109 PKRUNDOWN_ROUTINE RundownRoutine
;
1110 PKNORMAL_ROUTINE NormalRoutine
;
1111 PVOID NormalContext
;
1112 PVOID SystemArgument1
;
1113 PVOID SystemArgument2
;
1114 CCHAR ApcStateIndex
;
1115 KPROCESSOR_MODE ApcMode
;
1117 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
1119 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
1120 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
1121 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
1122 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
1123 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
1124 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
1125 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
1127 typedef struct _KDEVICE_QUEUE_ENTRY
{
1128 LIST_ENTRY DeviceListEntry
;
1131 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
1132 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
1134 typedef PVOID PKIPI_CONTEXT
;
1137 (NTAPI
*PKIPI_WORKER
)(
1138 IN OUT PKIPI_CONTEXT PacketContext
,
1139 IN PVOID Parameter1 OPTIONAL
,
1140 IN PVOID Parameter2 OPTIONAL
,
1141 IN PVOID Parameter3 OPTIONAL
);
1143 typedef struct _KIPI_COUNTS
{
1148 ULONG FlushSingleTb
;
1149 ULONG FlushMultipleTb
;
1150 ULONG FlushEntireTb
;
1155 ULONG SweepIcacheRange
;
1156 ULONG FlushIoBuffers
;
1157 ULONG GratuitousDPC
;
1158 } KIPI_COUNTS
, *PKIPI_COUNTS
;
1160 _IRQL_requires_same_
1161 _Function_class_(KIPI_BROADCAST_WORKER
)
1162 _IRQL_requires_(IPI_LEVEL
)
1164 (NTAPI KIPI_BROADCAST_WORKER
)(
1165 _In_ ULONG_PTR Argument
);
1166 typedef KIPI_BROADCAST_WORKER
*PKIPI_BROADCAST_WORKER
;
1168 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1170 typedef struct _KSPIN_LOCK_QUEUE
{
1171 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
1172 PKSPIN_LOCK
volatile Lock
;
1173 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
1175 typedef struct _KLOCK_QUEUE_HANDLE
{
1176 KSPIN_LOCK_QUEUE LockQueue
;
1178 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
1180 #if defined(_AMD64_)
1182 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
1184 #define LockQueueDispatcherLock 0
1185 #define LockQueueExpansionLock 1
1186 #define LockQueuePfnLock 2
1187 #define LockQueueSystemSpaceLock 3
1188 #define LockQueueVacbLock 4
1189 #define LockQueueMasterLock 5
1190 #define LockQueueNonPagedPoolLock 6
1191 #define LockQueueIoCancelLock 7
1192 #define LockQueueWorkQueueLock 8
1193 #define LockQueueIoVpbLock 9
1194 #define LockQueueIoDatabaseLock 10
1195 #define LockQueueIoCompletionLock 11
1196 #define LockQueueNtfsStructLock 12
1197 #define LockQueueAfdWorkQueueLock 13
1198 #define LockQueueBcbLock 14
1199 #define LockQueueMmNonPagedPoolLock 15
1200 #define LockQueueUnusedSpare16 16
1201 #define LockQueueTimerTableLock 17
1202 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
1206 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
1207 LockQueueDispatcherLock
,
1208 LockQueueExpansionLock
,
1210 LockQueueSystemSpaceLock
,
1212 LockQueueMasterLock
,
1213 LockQueueNonPagedPoolLock
,
1214 LockQueueIoCancelLock
,
1215 LockQueueWorkQueueLock
,
1217 LockQueueIoDatabaseLock
,
1218 LockQueueIoCompletionLock
,
1219 LockQueueNtfsStructLock
,
1220 LockQueueAfdWorkQueueLock
,
1222 LockQueueMmNonPagedPoolLock
,
1223 LockQueueUnusedSpare16
,
1224 LockQueueTimerTableLock
,
1225 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
1226 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
1228 #endif /* defined(_AMD64_) */
1230 _Function_class_(KDEFERRED_ROUTINE
)
1231 _IRQL_requires_(DISPATCH_LEVEL
)
1232 _IRQL_requires_same_
1234 (NTAPI KDEFERRED_ROUTINE
)(
1235 _In_
struct _KDPC
*Dpc
,
1236 _In_opt_ PVOID DeferredContext
,
1237 _In_opt_ PVOID SystemArgument1
,
1238 _In_opt_ PVOID SystemArgument2
);
1239 typedef KDEFERRED_ROUTINE
*PKDEFERRED_ROUTINE
;
1241 typedef enum _KDPC_IMPORTANCE
{
1245 MediumHighImportance
1248 typedef struct _KDPC
{
1251 volatile USHORT Number
;
1252 LIST_ENTRY DpcListEntry
;
1253 PKDEFERRED_ROUTINE DeferredRoutine
;
1254 PVOID DeferredContext
;
1255 PVOID SystemArgument1
;
1256 PVOID SystemArgument2
;
1257 volatile PVOID DpcData
;
1258 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
1260 typedef struct _KDPC_WATCHDOG_INFORMATION
{
1263 ULONG DpcWatchdogLimit
;
1264 ULONG DpcWatchdogCount
;
1266 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
1268 typedef struct _KDEVICE_QUEUE
{
1271 LIST_ENTRY DeviceListHead
;
1273 # if defined(_AMD64_)
1274 _ANONYMOUS_UNION
union {
1276 _ANONYMOUS_STRUCT
struct {
1284 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
1286 #define TIMER_EXPIRED_INDEX_BITS 6
1287 #define TIMER_PROCESSOR_INDEX_BITS 5
1289 typedef struct _DISPATCHER_HEADER
{
1290 _ANONYMOUS_UNION
union {
1291 _ANONYMOUS_STRUCT
struct {
1293 _ANONYMOUS_UNION
union {
1294 _ANONYMOUS_UNION
union {
1295 UCHAR TimerControlFlags
;
1296 _ANONYMOUS_STRUCT
struct {
1298 UCHAR Coalescable
:1;
1299 UCHAR KeepShifting
:1;
1300 UCHAR EncodedTolerableDelay
:5;
1304 #if (NTDDI_VERSION < NTDDI_WIN7)
1309 _ANONYMOUS_UNION
union {
1310 _ANONYMOUS_UNION
union {
1311 UCHAR ThreadControlFlags
;
1312 _ANONYMOUS_STRUCT
struct {
1313 UCHAR CpuThrottled
:1;
1314 UCHAR CycleProfiling
:1;
1315 UCHAR CounterProfiling
:1;
1322 _ANONYMOUS_UNION
union {
1323 #if (NTDDI_VERSION >= NTDDI_WIN7)
1324 _ANONYMOUS_UNION
union {
1325 UCHAR TimerMiscFlags
;
1326 _ANONYMOUS_STRUCT
struct {
1328 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
1331 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
1334 volatile UCHAR Expired
:1;
1338 /* Pre Win7 compatibility fix to latest WDK */
1341 _ANONYMOUS_UNION
union {
1342 BOOLEAN DebugActive
;
1343 _ANONYMOUS_STRUCT
struct {
1344 BOOLEAN ActiveDR7
:1;
1345 BOOLEAN Instrumented
:1;
1346 BOOLEAN Reserved2
:4;
1347 BOOLEAN UmsScheduled
:1;
1348 BOOLEAN UmsPrimary
:1;
1350 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
1357 LIST_ENTRY WaitListHead
;
1358 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1360 typedef struct _KEVENT
{
1361 DISPATCHER_HEADER Header
;
1362 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1364 typedef struct _KSEMAPHORE
{
1365 DISPATCHER_HEADER Header
;
1367 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1369 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
1371 typedef struct _KGATE
{
1372 DISPATCHER_HEADER Header
;
1373 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
1375 typedef struct _KGUARDED_MUTEX
{
1376 volatile LONG Count
;
1380 _ANONYMOUS_UNION
union {
1381 _ANONYMOUS_STRUCT
struct {
1382 SHORT KernelApcDisable
;
1383 SHORT SpecialApcDisable
;
1385 ULONG CombinedApcDisable
;
1387 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
1389 typedef struct _KMUTANT
{
1390 DISPATCHER_HEADER Header
;
1391 LIST_ENTRY MutantListEntry
;
1392 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
1395 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
1397 #define TIMER_TABLE_SIZE 512
1398 #define TIMER_TABLE_SHIFT 9
1400 typedef struct _KTIMER
{
1401 DISPATCHER_HEADER Header
;
1402 ULARGE_INTEGER DueTime
;
1403 LIST_ENTRY TimerListEntry
;
1405 # if !defined(_X86_)
1409 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
1411 typedef enum _LOCK_OPERATION
{
1417 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
1419 _Function_class_(KSYNCHRONIZE_ROUTINE
)
1420 _IRQL_requires_same_
1422 (NTAPI KSYNCHRONIZE_ROUTINE
)(
1423 _In_ PVOID SynchronizeContext
);
1424 typedef KSYNCHRONIZE_ROUTINE
*PKSYNCHRONIZE_ROUTINE
;
1426 typedef enum _POOL_TYPE
{
1429 NonPagedPoolMustSucceed
,
1431 NonPagedPoolCacheAligned
,
1432 PagedPoolCacheAligned
,
1433 NonPagedPoolCacheAlignedMustS
,
1435 NonPagedPoolSession
= 32,
1437 NonPagedPoolMustSucceedSession
,
1438 DontUseThisTypeSession
,
1439 NonPagedPoolCacheAlignedSession
,
1440 PagedPoolCacheAlignedSession
,
1441 NonPagedPoolCacheAlignedMustSSession
1444 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
1448 } ALTERNATIVE_ARCHITECTURE_TYPE
;
1453 #define IsNEC_98 (FALSE)
1457 #define IsNotNEC_98 (TRUE)
1464 #ifndef SetNotNEC_98
1465 #define SetNotNEC_98
1470 typedef struct _KSYSTEM_TIME
{
1474 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
1476 typedef struct DECLSPEC_ALIGN(16) _M128A
{
1481 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
1488 USHORT ErrorSelector
;
1491 USHORT DataSelector
;
1495 M128A FloatRegisters
[8];
1497 M128A XmmRegisters
[16];
1498 UCHAR Reserved4
[96];
1500 M128A XmmRegisters
[8];
1501 UCHAR Reserved4
[192];
1502 ULONG StackControl
[7];
1505 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
1507 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
1509 ULONG64 Reserved
[7];
1510 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
1512 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
1513 XSAVE_FORMAT LegacyState
;
1514 XSAVE_AREA_HEADER Header
;
1515 } XSAVE_AREA
, *PXSAVE_AREA
;
1517 typedef struct _XSTATE_CONTEXT
{
1521 _Field_size_bytes_opt_(Length
) PXSAVE_AREA Area
;
1529 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
1531 typedef struct _XSTATE_SAVE
{
1532 #if defined(_AMD64_)
1533 struct _XSTATE_SAVE
* Prev
;
1534 struct _KTHREAD
* Thread
;
1536 XSTATE_CONTEXT XStateContext
;
1537 #elif defined(_IA64_)
1539 #elif defined(_X86_)
1540 _ANONYMOUS_UNION
union {
1541 _ANONYMOUS_STRUCT
struct {
1544 struct _XSTATE_SAVE
* Prev
;
1545 PXSAVE_AREA Reserved3
;
1546 struct _KTHREAD
* Thread
;
1550 XSTATE_CONTEXT XStateContext
;
1553 } XSTATE_SAVE
, *PXSTATE_SAVE
;
1557 #define MAXIMUM_SUPPORTED_EXTENSION 512
1559 #if !defined(__midl) && !defined(MIDL_PASS)
1560 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
1565 #define XSAVE_ALIGN 64
1566 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
1568 #if !defined(__midl) && !defined(MIDL_PASS)
1569 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
1570 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
1571 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
1574 typedef struct _CONTEXT_CHUNK
{
1577 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
1579 typedef struct _CONTEXT_EX
{
1581 CONTEXT_CHUNK Legacy
;
1582 CONTEXT_CHUNK XState
;
1583 } CONTEXT_EX
, *PCONTEXT_EX
;
1585 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1587 #if (NTDDI_VERSION >= NTDDI_VISTA)
1588 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1589 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1590 extern NTSYSAPI CCHAR KeNumberProcessors
;
1592 extern PCCHAR KeNumberProcessors
;
1597 #if defined(_M_IX86)
1598 /** Kernel definitions for x86 **/
1600 /* Interrupt request levels */
1601 #define PASSIVE_LEVEL 0
1604 #define DISPATCH_LEVEL 2
1605 #define CMCI_LEVEL 5
1606 #define PROFILE_LEVEL 27
1607 #define CLOCK1_LEVEL 28
1608 #define CLOCK2_LEVEL 28
1609 #define IPI_LEVEL 29
1610 #define POWER_LEVEL 30
1611 #define HIGH_LEVEL 31
1612 #define CLOCK_LEVEL CLOCK2_LEVEL
1614 #define KIP0PCRADDRESS 0xffdff000
1615 #define KI_USER_SHARED_DATA 0xffdf0000
1616 #define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
1618 #define PAGE_SIZE 0x1000
1619 #define PAGE_SHIFT 12L
1620 #define KeGetDcacheFillSize() 1L
1622 #define EFLAG_SIGN 0x8000
1623 #define EFLAG_ZERO 0x4000
1624 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
1626 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
1627 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
1628 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
1631 typedef struct _KFLOATING_SAVE
{
1635 ULONG ErrorSelector
;
1640 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
1642 extern NTKERNELAPI
volatile KSYSTEM_TIME KeTickCount
;
1644 #define YieldProcessor _mm_pause
1648 KeMemoryBarrier(VOID
)
1650 LONG Barrier
, *Dummy
= &Barrier
;
1651 UNREFERENCED_LOCAL_VARIABLE(Dummy
);
1653 #if defined(__GNUC__)
1654 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
1655 #elif defined(_MSC_VER)
1656 __asm xchg
[Barrier
], eax
1660 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
1662 _IRQL_requires_max_(HIGH_LEVEL
)
1667 KeGetCurrentIrql(VOID
);
1669 _IRQL_requires_max_(HIGH_LEVEL
)
1674 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql
);
1675 #define KeLowerIrql(a) KfLowerIrql(a)
1677 _IRQL_requires_max_(HIGH_LEVEL
)
1678 _IRQL_raises_(NewIrql
)
1684 _In_ KIRQL NewIrql
);
1685 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1687 _IRQL_requires_max_(DISPATCH_LEVEL
)
1689 _IRQL_raises_(DISPATCH_LEVEL
)
1693 KeRaiseIrqlToDpcLevel(VOID
);
1698 KeRaiseIrqlToSynchLevel(VOID
);
1700 _Requires_lock_not_held_(*SpinLock
)
1701 _Acquires_lock_(*SpinLock
)
1702 _IRQL_requires_max_(DISPATCH_LEVEL
)
1704 _IRQL_raises_(DISPATCH_LEVEL
)
1709 _Inout_ PKSPIN_LOCK SpinLock
);
1710 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
1712 _Requires_lock_held_(*SpinLock
)
1713 _Releases_lock_(*SpinLock
)
1714 _IRQL_requires_(DISPATCH_LEVEL
)
1719 _Inout_ PKSPIN_LOCK SpinLock
,
1720 _In_ _IRQL_restores_ KIRQL NewIrql
);
1721 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
1723 _Requires_lock_not_held_(*SpinLock
)
1724 _Acquires_lock_(*SpinLock
)
1725 _IRQL_requires_min_(DISPATCH_LEVEL
)
1729 KefAcquireSpinLockAtDpcLevel(
1730 _Inout_ PKSPIN_LOCK SpinLock
);
1731 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
1733 _Requires_lock_held_(*SpinLock
)
1734 _Releases_lock_(*SpinLock
)
1735 _IRQL_requires_min_(DISPATCH_LEVEL
)
1739 KefReleaseSpinLockFromDpcLevel(
1740 _Inout_ PKSPIN_LOCK SpinLock
);
1741 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
1746 KeGetCurrentThread(VOID
);
1748 _Always_(_Post_satisfies_(return<=0))
1749 _Must_inspect_result_
1750 _IRQL_requires_max_(DISPATCH_LEVEL
)
1751 _Kernel_float_saved_
1752 _At_(*FloatSave
, _Kernel_requires_resource_not_held_(FloatState
) _Kernel_acquires_resource_(FloatState
))
1756 KeSaveFloatingPointState(
1757 _Out_ PKFLOATING_SAVE FloatSave
);
1760 _Kernel_float_restored_
1761 _At_(*FloatSave
, _Kernel_requires_resource_held_(FloatState
) _Kernel_releases_resource_(FloatState
))
1765 KeRestoreFloatingPointState(
1766 _In_ PKFLOATING_SAVE FloatSave
);
1771 * IN BOOLEAN ReadOperation,
1772 * IN BOOLEAN DmaOperation)
1774 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
1776 /* x86 and x64 performs a 0x2C interrupt */
1777 #define DbgRaiseAssertionFailure __int2c
1782 OUT PLARGE_INTEGER CurrentCount
)
1785 #ifdef NONAMELESSUNION
1786 CurrentCount
->s
.HighPart
= KeTickCount
.High1Time
;
1787 CurrentCount
->s
.LowPart
= KeTickCount
.LowPart
;
1788 if (CurrentCount
->s
.HighPart
== KeTickCount
.High2Time
) break;
1790 CurrentCount
->HighPart
= KeTickCount
.High1Time
;
1791 CurrentCount
->LowPart
= KeTickCount
.LowPart
;
1792 if (CurrentCount
->HighPart
== KeTickCount
.High2Time
) break;
1797 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
1803 #elif defined(_M_AMD64)
1804 /** Kernel definitions for AMD64 **/
1806 /* Interrupt request levels */
1807 #define PASSIVE_LEVEL 0
1810 #define DISPATCH_LEVEL 2
1811 #define CMCI_LEVEL 5
1812 #define CLOCK_LEVEL 13
1813 #define IPI_LEVEL 14
1814 #define DRS_LEVEL 14
1815 #define POWER_LEVEL 14
1816 #define PROFILE_LEVEL 15
1817 #define HIGH_LEVEL 15
1819 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
1820 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
1821 #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
1822 #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
1823 #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
1825 #define PAGE_SIZE 0x1000
1826 #define PAGE_SHIFT 12L
1828 #define EFLAG_SIGN 0x8000
1829 #define EFLAG_ZERO 0x4000
1830 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
1832 typedef struct _KFLOATING_SAVE
{
1834 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
1836 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
1838 #define KeQueryInterruptTime() \
1839 (*(volatile ULONG64*)SharedInterruptTime)
1841 #define KeQuerySystemTime(CurrentCount) \
1842 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
1844 #define KeQueryTickCount(CurrentCount) \
1845 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
1847 #define KeGetDcacheFillSize() 1L
1849 #define YieldProcessor _mm_pause
1850 #define FastFence __faststorefence
1851 #define LoadFence _mm_lfence
1852 #define MemoryFence _mm_mfence
1853 #define StoreFence _mm_sfence
1854 #define LFENCE_ACQUIRE() LoadFence()
1858 KeMemoryBarrier(VOID
)
1860 // FIXME: Do we really need lfence after the __faststorefence ?
1865 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
1869 KeGetCurrentIrql(VOID
)
1871 return (KIRQL
)__readcr8();
1876 KeLowerIrql(IN KIRQL NewIrql
)
1878 //ASSERT(KeGetCurrentIrql() >= NewIrql);
1879 __writecr8(NewIrql
);
1884 KfRaiseIrql(IN KIRQL NewIrql
)
1888 OldIrql
= (KIRQL
)__readcr8();
1889 //ASSERT(OldIrql <= NewIrql);
1890 __writecr8(NewIrql
);
1893 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
1897 KeRaiseIrqlToDpcLevel(VOID
)
1899 return KfRaiseIrql(DISPATCH_LEVEL
);
1904 KeRaiseIrqlToSynchLevel(VOID
)
1906 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
1911 KeGetCurrentThread(VOID
)
1913 return (struct _KTHREAD
*)__readgsqword(0x188);
1918 KeSaveFloatingPointState(PVOID FloatingState
)
1920 UNREFERENCED_PARAMETER(FloatingState
);
1921 return STATUS_SUCCESS
;
1926 KeRestoreFloatingPointState(PVOID FloatingState
)
1928 UNREFERENCED_PARAMETER(FloatingState
);
1929 return STATUS_SUCCESS
;
1935 * IN BOOLEAN ReadOperation,
1936 * IN BOOLEAN DmaOperation)
1938 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
1940 /* x86 and x64 performs a 0x2C interrupt */
1941 #define DbgRaiseAssertionFailure __int2c
1943 #elif defined(_M_IA64)
1944 /** Kernel definitions for IA64 **/
1946 /* Interrupt request levels */
1947 #define PASSIVE_LEVEL 0
1950 #define DISPATCH_LEVEL 2
1952 #define DEVICE_LEVEL_BASE 4
1954 #define IPI_LEVEL 14
1955 #define DRS_LEVEL 14
1956 #define CLOCK_LEVEL 13
1957 #define POWER_LEVEL 15
1958 #define PROFILE_LEVEL 15
1959 #define HIGH_LEVEL 15
1961 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
1962 extern volatile LARGE_INTEGER KeTickCount
;
1964 #define PAUSE_PROCESSOR __yield();
1968 KeFlushWriteBuffer(VOID
)
1977 KeGetCurrentThread(VOID
);
1980 #elif defined(_M_PPC)
1982 /* Interrupt request levels */
1983 #define PASSIVE_LEVEL 0
1986 #define DISPATCH_LEVEL 2
1987 #define PROFILE_LEVEL 27
1988 #define CLOCK1_LEVEL 28
1989 #define CLOCK2_LEVEL 28
1990 #define IPI_LEVEL 29
1991 #define POWER_LEVEL 30
1992 #define HIGH_LEVEL 31
1995 // Used to contain PFNs and PFN counts
1997 typedef ULONG PFN_COUNT
;
1998 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
1999 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2002 typedef struct _KFLOATING_SAVE
{
2004 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2006 typedef struct _KPCR_TIB
{
2007 PVOID ExceptionList
; /* 00 */
2008 PVOID StackBase
; /* 04 */
2009 PVOID StackLimit
; /* 08 */
2010 PVOID SubSystemTib
; /* 0C */
2011 _ANONYMOUS_UNION
union {
2012 PVOID FiberData
; /* 10 */
2013 ULONG Version
; /* 10 */
2015 PVOID ArbitraryUserPointer
; /* 14 */
2016 struct _KPCR_TIB
*Self
; /* 18 */
2017 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
2019 #define PCR_MINOR_VERSION 1
2020 #define PCR_MAJOR_VERSION 1
2022 typedef struct _KPCR
{
2023 KPCR_TIB Tib
; /* 00 */
2024 struct _KPCR
*Self
; /* 1C */
2025 struct _KPRCB
*Prcb
; /* 20 */
2026 KIRQL Irql
; /* 24 */
2028 ULONG IrrActive
; /* 2C */
2030 PVOID KdVersionBlock
; /* 34 */
2031 PUSHORT IDT
; /* 38 */
2032 PUSHORT GDT
; /* 3C */
2033 struct _KTSS
*TSS
; /* 40 */
2034 USHORT MajorVersion
; /* 44 */
2035 USHORT MinorVersion
; /* 46 */
2036 KAFFINITY SetMember
; /* 48 */
2037 ULONG StallScaleFactor
; /* 4C */
2038 UCHAR SpareUnused
; /* 50 */
2039 UCHAR Number
; /* 51 */
2040 } KPCR
, *PKPCR
; /* 54 */
2042 #define KeGetPcr() PCR
2044 #define YieldProcessor() __asm__ __volatile__("nop");
2049 KeGetCurrentProcessorNumber(VOID
)
2052 __asm__
__volatile__ (
2055 : "i" (FIELD_OFFSET(KPCR
, Number
))
2065 #define KeLowerIrql(a) KfLowerIrql(a)
2072 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
2077 KeRaiseIrqlToDpcLevel(VOID
);
2082 KeRaiseIrqlToSynchLevel(VOID
);
2086 #elif defined(_M_MIPS)
2087 #error MIPS Headers are totally incorrect
2090 // Used to contain PFNs and PFN counts
2092 typedef ULONG PFN_COUNT
;
2093 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
2094 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
2096 #define PASSIVE_LEVEL 0
2098 #define DISPATCH_LEVEL 2
2099 #define PROFILE_LEVEL 27
2100 #define IPI_LEVEL 29
2101 #define HIGH_LEVEL 31
2103 typedef struct _KPCR
{
2104 struct _KPRCB
*Prcb
; /* 20 */
2105 KIRQL Irql
; /* 24 */
2110 #define KeGetPcr() PCR
2112 typedef struct _KFLOATING_SAVE
{
2113 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
2118 KeGetCurrentProcessorNumber(VOID
)
2123 #define YieldProcessor() __asm__ __volatile__("nop");
2125 #define KeLowerIrql(a) KfLowerIrql(a)
2126 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
2143 KeRaiseIrqlToDpcLevel(VOID
);
2148 KeRaiseIrqlToSynchLevel(VOID
);
2151 #elif defined(_M_ARM)
2154 #error Unknown Architecture
2157 /******************************************************************************
2158 * Memory manager Types *
2159 ******************************************************************************/
2161 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2162 typedef ULONG NODE_REQUIREMENT
;
2163 #define MM_ANY_NODE_OK 0x80000000
2166 #define MM_DONT_ZERO_ALLOCATION 0x00000001
2167 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
2168 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
2169 #define MM_ALLOCATE_NO_WAIT 0x00000008
2170 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
2171 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
2173 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
2174 #define MDL_PAGES_LOCKED 0x0002
2175 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
2176 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
2177 #define MDL_PARTIAL 0x0010
2178 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
2179 #define MDL_IO_PAGE_READ 0x0040
2180 #define MDL_WRITE_OPERATION 0x0080
2181 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
2182 #define MDL_FREE_EXTRA_PTES 0x0200
2183 #define MDL_DESCRIBES_AWE 0x0400
2184 #define MDL_IO_SPACE 0x0800
2185 #define MDL_NETWORK_HEADER 0x1000
2186 #define MDL_MAPPING_CAN_FAIL 0x2000
2187 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
2188 #define MDL_INTERNAL 0x8000
2190 #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \
2191 MDL_PAGES_LOCKED | \
2192 MDL_SOURCE_IS_NONPAGED_POOL | \
2193 MDL_PARTIAL_HAS_BEEN_MAPPED | \
2194 MDL_PARENT_MAPPED_SYSTEM_VA | \
2198 #define FLUSH_MULTIPLE_MAXIMUM 32
2200 /* Section access rights */
2201 #define SECTION_QUERY 0x0001
2202 #define SECTION_MAP_WRITE 0x0002
2203 #define SECTION_MAP_READ 0x0004
2204 #define SECTION_MAP_EXECUTE 0x0008
2205 #define SECTION_EXTEND_SIZE 0x0010
2206 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
2208 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
2209 SECTION_MAP_WRITE | \
2210 SECTION_MAP_READ | \
2211 SECTION_MAP_EXECUTE | \
2212 SECTION_EXTEND_SIZE)
2214 #define SESSION_QUERY_ACCESS 0x0001
2215 #define SESSION_MODIFY_ACCESS 0x0002
2217 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
2218 SESSION_QUERY_ACCESS | \
2219 SESSION_MODIFY_ACCESS)
2221 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
2223 #define PAGE_NOACCESS 0x01
2224 #define PAGE_READONLY 0x02
2225 #define PAGE_READWRITE 0x04
2226 #define PAGE_WRITECOPY 0x08
2227 #define PAGE_EXECUTE 0x10
2228 #define PAGE_EXECUTE_READ 0x20
2229 #define PAGE_EXECUTE_READWRITE 0x40
2230 #define PAGE_EXECUTE_WRITECOPY 0x80
2231 #define PAGE_GUARD 0x100
2232 #define PAGE_NOCACHE 0x200
2233 #define PAGE_WRITECOMBINE 0x400
2235 #define MEM_COMMIT 0x1000
2236 #define MEM_RESERVE 0x2000
2237 #define MEM_DECOMMIT 0x4000
2238 #define MEM_RELEASE 0x8000
2239 #define MEM_FREE 0x10000
2240 #define MEM_PRIVATE 0x20000
2241 #define MEM_MAPPED 0x40000
2242 #define MEM_RESET 0x80000
2243 #define MEM_TOP_DOWN 0x100000
2244 #define MEM_LARGE_PAGES 0x20000000
2245 #define MEM_4MB_PAGES 0x80000000
2247 #define SEC_RESERVE 0x4000000
2248 #define SEC_COMMIT 0x8000000
2249 #define SEC_LARGE_PAGES 0x80000000
2251 /* Section map options */
2252 typedef enum _SECTION_INHERIT
{
2257 typedef ULONG PFN_COUNT
;
2258 typedef LONG_PTR SPFN_NUMBER
, *PSPFN_NUMBER
;
2259 typedef ULONG_PTR PFN_NUMBER
, *PPFN_NUMBER
;
2261 _Struct_size_bytes_(_Inexpressible_(sizeof(struct _MDL
) +
2262 (ByteOffset
+ ByteCount
+ PAGE_SIZE
-1) / PAGE_SIZE
* sizeof(PFN_NUMBER
)))
2263 typedef struct _MDL
{
2267 struct _EPROCESS
*Process
;
2268 PVOID MappedSystemVa
;
2273 #if (_MSC_VER >= 1600)
2274 typedef _Readable_bytes_(_Inexpressible_(polymorphism
)) MDL
*PMDLX
;
2279 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
2280 MmFrameBufferCached
= 2
2281 } MEMORY_CACHING_TYPE_ORIG
;
2283 typedef enum _MEMORY_CACHING_TYPE
{
2284 MmNonCached
= FALSE
,
2286 MmWriteCombined
= MmFrameBufferCached
,
2287 MmHardwareCoherentCached
,
2288 MmNonCachedUnordered
,
2291 } MEMORY_CACHING_TYPE
;
2293 typedef enum _MM_PAGE_PRIORITY
{
2295 NormalPagePriority
= 16,
2296 HighPagePriority
= 32
2299 typedef enum _MM_SYSTEM_SIZE
{
2305 extern NTKERNELAPI BOOLEAN Mm64BitPhysicalAddress
;
2306 extern PVOID MmBadPointer
;
2309 /******************************************************************************
2311 ******************************************************************************/
2312 #define EX_RUNDOWN_ACTIVE 0x1
2313 #define EX_RUNDOWN_COUNT_SHIFT 0x1
2314 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
2316 typedef struct _FAST_MUTEX
{
2317 volatile LONG Count
;
2322 } FAST_MUTEX
, *PFAST_MUTEX
;
2324 typedef enum _SUITE_TYPE
{
2328 CommunicationServer
,
2330 SmallBusinessRestricted
,
2344 typedef enum _EX_POOL_PRIORITY
{
2346 LowPoolPrioritySpecialPoolOverrun
= 8,
2347 LowPoolPrioritySpecialPoolUnderrun
= 9,
2348 NormalPoolPriority
= 16,
2349 NormalPoolPrioritySpecialPoolOverrun
= 24,
2350 NormalPoolPrioritySpecialPoolUnderrun
= 25,
2351 HighPoolPriority
= 32,
2352 HighPoolPrioritySpecialPoolOverrun
= 40,
2353 HighPoolPrioritySpecialPoolUnderrun
= 41
2356 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2357 #define LOOKASIDE_ALIGN
2359 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2362 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
2364 _IRQL_requires_same_
2365 _Function_class_(ALLOCATE_FUNCTION
)
2367 (NTAPI
*PALLOCATE_FUNCTION
)(
2368 _In_ POOL_TYPE PoolType
,
2369 _In_ SIZE_T NumberOfBytes
,
2372 _IRQL_requires_same_
2373 _Function_class_(ALLOCATE_FUNCTION_EX
)
2375 (NTAPI
*PALLOCATE_FUNCTION_EX
)(
2376 _In_ POOL_TYPE PoolType
,
2377 _In_ SIZE_T NumberOfBytes
,
2379 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
2381 _IRQL_requires_same_
2382 _Function_class_(FREE_FUNCTION
)
2384 (NTAPI
*PFREE_FUNCTION
)(
2387 _IRQL_requires_same_
2388 _Function_class_(FREE_FUNCTION_EX
)
2390 (NTAPI
*PFREE_FUNCTION_EX
)(
2392 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
2394 _IRQL_requires_same_
2395 _Function_class_(CALLBACK_FUNCTION
)
2397 (NTAPI CALLBACK_FUNCTION
)(
2398 _In_opt_ PVOID CallbackContext
,
2399 _In_opt_ PVOID Argument1
,
2400 _In_opt_ PVOID Argument2
);
2401 typedef CALLBACK_FUNCTION
*PCALLBACK_FUNCTION
;
2403 #define GENERAL_LOOKASIDE_LAYOUT \
2404 _ANONYMOUS_UNION union { \
2405 SLIST_HEADER ListHead; \
2406 SINGLE_LIST_ENTRY SingleListHead; \
2409 USHORT MaximumDepth; \
2410 ULONG TotalAllocates; \
2411 _ANONYMOUS_UNION union { \
2412 ULONG AllocateMisses; \
2413 ULONG AllocateHits; \
2414 } DUMMYUNIONNAME2; \
2416 _ANONYMOUS_UNION union { \
2419 } DUMMYUNIONNAME3; \
2423 _ANONYMOUS_UNION union { \
2424 PALLOCATE_FUNCTION_EX AllocateEx; \
2425 PALLOCATE_FUNCTION Allocate; \
2426 } DUMMYUNIONNAME4; \
2427 _ANONYMOUS_UNION union { \
2428 PFREE_FUNCTION_EX FreeEx; \
2429 PFREE_FUNCTION Free; \
2430 } DUMMYUNIONNAME5; \
2431 LIST_ENTRY ListEntry; \
2432 ULONG LastTotalAllocates; \
2433 _ANONYMOUS_UNION union { \
2434 ULONG LastAllocateMisses; \
2435 ULONG LastAllocateHits; \
2436 } DUMMYUNIONNAME6; \
2439 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
2440 GENERAL_LOOKASIDE_LAYOUT
2441 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
2443 typedef struct _GENERAL_LOOKASIDE_POOL
{
2444 GENERAL_LOOKASIDE_LAYOUT
2445 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
2447 #define LOOKASIDE_CHECK(f) \
2448 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
2450 LOOKASIDE_CHECK(TotalFrees
);
2451 LOOKASIDE_CHECK(Tag
);
2452 LOOKASIDE_CHECK(Future
);
2454 typedef struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST
{
2455 GENERAL_LOOKASIDE L
;
2456 #if !defined(_AMD64_) && !defined(_IA64_)
2457 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
2459 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
2461 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
2462 GENERAL_LOOKASIDE L
;
2463 #if !defined(_AMD64_) && !defined(_IA64_)
2464 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
2466 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
2468 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
2470 typedef struct _LOOKASIDE_LIST_EX
{
2471 GENERAL_LOOKASIDE_POOL L
;
2472 } LOOKASIDE_LIST_EX
;
2474 #if (NTDDI_VERSION >= NTDDI_VISTA)
2476 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
2477 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
2479 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
2480 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
2482 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
2484 typedef struct _EX_RUNDOWN_REF
{
2485 _ANONYMOUS_UNION
union {
2486 volatile ULONG_PTR Count
;
2489 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2491 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2493 typedef enum _WORK_QUEUE_TYPE
{
2496 HyperCriticalWorkQueue
,
2500 _IRQL_requires_same_
2501 _Function_class_(WORKER_THREAD_ROUTINE
)
2503 (NTAPI WORKER_THREAD_ROUTINE
)(
2504 _In_ PVOID Parameter
);
2505 typedef WORKER_THREAD_ROUTINE
*PWORKER_THREAD_ROUTINE
;
2507 typedef struct _WORK_QUEUE_ITEM
{
2509 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2510 volatile PVOID Parameter
;
2511 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2513 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2515 typedef struct _OWNER_ENTRY
{
2516 ERESOURCE_THREAD OwnerThread
;
2517 _ANONYMOUS_UNION
union {
2518 _ANONYMOUS_STRUCT
struct {
2519 ULONG IoPriorityBoosted
:1;
2520 ULONG OwnerReferenced
:1;
2521 ULONG OwnerCount
:30;
2525 } OWNER_ENTRY
, *POWNER_ENTRY
;
2527 typedef struct _ERESOURCE
{
2528 LIST_ENTRY SystemResourcesList
;
2529 POWNER_ENTRY OwnerTable
;
2532 volatile PKSEMAPHORE SharedWaiters
;
2533 volatile PKEVENT ExclusiveWaiters
;
2534 OWNER_ENTRY OwnerEntry
;
2535 ULONG ActiveEntries
;
2536 ULONG ContentionCount
;
2537 ULONG NumberOfSharedWaiters
;
2538 ULONG NumberOfExclusiveWaiters
;
2542 _ANONYMOUS_UNION
union {
2544 ULONG_PTR CreatorBackTraceIndex
;
2546 KSPIN_LOCK SpinLock
;
2547 } ERESOURCE
, *PERESOURCE
;
2549 /* ERESOURCE.Flag */
2550 #define ResourceNeverExclusive 0x0010
2551 #define ResourceReleaseByOtherThread 0x0020
2552 #define ResourceOwnedExclusive 0x0080
2554 #define RESOURCE_HASH_TABLE_SIZE 64
2556 typedef struct _RESOURCE_HASH_ENTRY
{
2557 LIST_ENTRY ListEntry
;
2559 ULONG ContentionCount
;
2561 } RESOURCE_HASH_ENTRY
, *PRESOURCE_HASH_ENTRY
;
2563 typedef struct _RESOURCE_PERFORMANCE_DATA
{
2564 ULONG ActiveResourceCount
;
2565 ULONG TotalResourceCount
;
2566 ULONG ExclusiveAcquire
;
2567 ULONG SharedFirstLevel
;
2568 ULONG SharedSecondLevel
;
2569 ULONG StarveFirstLevel
;
2570 ULONG StarveSecondLevel
;
2571 ULONG WaitForExclusive
;
2572 ULONG OwnerTableExpands
;
2573 ULONG MaximumTableExpand
;
2574 LIST_ENTRY HashTable
[RESOURCE_HASH_TABLE_SIZE
];
2575 } RESOURCE_PERFORMANCE_DATA
, *PRESOURCE_PERFORMANCE_DATA
;
2577 /* Global debug flag */
2579 extern ULONG NtGlobalFlag
;
2580 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
2582 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
2585 /******************************************************************************
2586 * Security Manager Types *
2587 ******************************************************************************/
2590 typedef PVOID PSECURITY_DESCRIPTOR
;
2591 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
2592 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
2593 typedef PVOID PACCESS_TOKEN
;
2596 #define DELETE 0x00010000L
2597 #define READ_CONTROL 0x00020000L
2598 #define WRITE_DAC 0x00040000L
2599 #define WRITE_OWNER 0x00080000L
2600 #define SYNCHRONIZE 0x00100000L
2601 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
2602 #define STANDARD_RIGHTS_READ READ_CONTROL
2603 #define STANDARD_RIGHTS_WRITE READ_CONTROL
2604 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
2605 #define STANDARD_RIGHTS_ALL 0x001F0000L
2606 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
2607 #define ACCESS_SYSTEM_SECURITY 0x01000000L
2608 #define MAXIMUM_ALLOWED 0x02000000L
2609 #define GENERIC_READ 0x80000000L
2610 #define GENERIC_WRITE 0x40000000L
2611 #define GENERIC_EXECUTE 0x20000000L
2612 #define GENERIC_ALL 0x10000000L
2614 typedef struct _GENERIC_MAPPING
{
2615 ACCESS_MASK GenericRead
;
2616 ACCESS_MASK GenericWrite
;
2617 ACCESS_MASK GenericExecute
;
2618 ACCESS_MASK GenericAll
;
2619 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
2621 #define ACL_REVISION 2
2622 #define ACL_REVISION_DS 4
2624 #define ACL_REVISION1 1
2625 #define ACL_REVISION2 2
2626 #define ACL_REVISION3 3
2627 #define ACL_REVISION4 4
2628 #define MIN_ACL_REVISION ACL_REVISION2
2629 #define MAX_ACL_REVISION ACL_REVISION4
2631 typedef struct _ACL
{
2639 /* Current security descriptor revision value */
2640 #define SECURITY_DESCRIPTOR_REVISION (1)
2641 #define SECURITY_DESCRIPTOR_REVISION1 (1)
2643 /* Privilege attributes */
2644 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
2645 #define SE_PRIVILEGE_ENABLED (0x00000002L)
2646 #define SE_PRIVILEGE_REMOVED (0X00000004L)
2647 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
2649 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
2650 SE_PRIVILEGE_ENABLED | \
2651 SE_PRIVILEGE_REMOVED | \
2652 SE_PRIVILEGE_USED_FOR_ACCESS)
2654 #include <pshpack4.h>
2655 typedef struct _LUID_AND_ATTRIBUTES
{
2658 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
2659 #include <poppack.h>
2661 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
2662 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
2664 /* Privilege sets */
2665 #define PRIVILEGE_SET_ALL_NECESSARY (1)
2667 typedef struct _PRIVILEGE_SET
{
2668 ULONG PrivilegeCount
;
2670 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
2671 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
2673 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
2675 SecurityIdentification
,
2676 SecurityImpersonation
,
2678 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
2680 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
2681 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
2682 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
2683 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
2685 #define SECURITY_DYNAMIC_TRACKING (TRUE)
2686 #define SECURITY_STATIC_TRACKING (FALSE)
2688 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
2690 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
2692 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2693 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
2694 BOOLEAN EffectiveOnly
;
2695 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
2697 typedef struct _SE_IMPERSONATION_STATE
{
2698 PACCESS_TOKEN Token
;
2700 BOOLEAN EffectiveOnly
;
2701 SECURITY_IMPERSONATION_LEVEL Level
;
2702 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
2704 #define OWNER_SECURITY_INFORMATION (0x00000001L)
2705 #define GROUP_SECURITY_INFORMATION (0x00000002L)
2706 #define DACL_SECURITY_INFORMATION (0x00000004L)
2707 #define SACL_SECURITY_INFORMATION (0x00000008L)
2708 #define LABEL_SECURITY_INFORMATION (0x00000010L)
2710 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
2711 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
2712 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
2713 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
2715 typedef enum _SECURITY_OPERATION_CODE
{
2716 SetSecurityDescriptor
,
2717 QuerySecurityDescriptor
,
2718 DeleteSecurityDescriptor
,
2719 AssignSecurityDescriptor
2720 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
2722 #define INITIAL_PRIVILEGE_COUNT 3
2724 typedef struct _INITIAL_PRIVILEGE_SET
{
2725 ULONG PrivilegeCount
;
2727 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
2728 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
2730 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
2731 #define SE_CREATE_TOKEN_PRIVILEGE 2
2732 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
2733 #define SE_LOCK_MEMORY_PRIVILEGE 4
2734 #define SE_INCREASE_QUOTA_PRIVILEGE 5
2735 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
2736 #define SE_TCB_PRIVILEGE 7
2737 #define SE_SECURITY_PRIVILEGE 8
2738 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
2739 #define SE_LOAD_DRIVER_PRIVILEGE 10
2740 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
2741 #define SE_SYSTEMTIME_PRIVILEGE 12
2742 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
2743 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
2744 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
2745 #define SE_CREATE_PERMANENT_PRIVILEGE 16
2746 #define SE_BACKUP_PRIVILEGE 17
2747 #define SE_RESTORE_PRIVILEGE 18
2748 #define SE_SHUTDOWN_PRIVILEGE 19
2749 #define SE_DEBUG_PRIVILEGE 20
2750 #define SE_AUDIT_PRIVILEGE 21
2751 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
2752 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
2753 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
2754 #define SE_UNDOCK_PRIVILEGE 25
2755 #define SE_SYNC_AGENT_PRIVILEGE 26
2756 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
2757 #define SE_MANAGE_VOLUME_PRIVILEGE 28
2758 #define SE_IMPERSONATE_PRIVILEGE 29
2759 #define SE_CREATE_GLOBAL_PRIVILEGE 30
2760 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
2761 #define SE_RELABEL_PRIVILEGE 32
2762 #define SE_INC_WORKING_SET_PRIVILEGE 33
2763 #define SE_TIME_ZONE_PRIVILEGE 34
2764 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
2765 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
2767 typedef struct _SECURITY_SUBJECT_CONTEXT
{
2768 PACCESS_TOKEN ClientToken
;
2769 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2770 PACCESS_TOKEN PrimaryToken
;
2771 PVOID ProcessAuditId
;
2772 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
2774 typedef struct _ACCESS_STATE
{
2776 BOOLEAN SecurityEvaluated
;
2777 BOOLEAN GenerateAudit
;
2778 BOOLEAN GenerateOnClose
;
2779 BOOLEAN PrivilegesAllocated
;
2781 ACCESS_MASK RemainingDesiredAccess
;
2782 ACCESS_MASK PreviouslyGrantedAccess
;
2783 ACCESS_MASK OriginalDesiredAccess
;
2784 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
2785 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2788 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
2789 PRIVILEGE_SET PrivilegeSet
;
2791 BOOLEAN AuditPrivileges
;
2792 UNICODE_STRING ObjectName
;
2793 UNICODE_STRING ObjectTypeName
;
2794 } ACCESS_STATE
, *PACCESS_STATE
;
2797 (NTAPI
*PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR
)(
2799 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
2803 #ifndef _NTLSA_AUDIT_
2804 #define _NTLSA_AUDIT_
2806 #define SE_MAX_AUDIT_PARAMETERS 32
2807 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
2809 #define SE_ADT_OBJECT_ONLY 0x1
2811 #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
2812 #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
2813 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
2814 #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
2815 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
2817 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
2818 ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
2819 (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
2821 typedef enum _SE_ADT_PARAMETER_TYPE
{
2822 SeAdtParmTypeNone
= 0,
2823 SeAdtParmTypeString
,
2824 SeAdtParmTypeFileSpec
,
2827 SeAdtParmTypeLogonId
,
2828 SeAdtParmTypeNoLogonId
,
2829 SeAdtParmTypeAccessMask
,
2831 SeAdtParmTypeObjectTypes
,
2832 SeAdtParmTypeHexUlong
,
2837 SeAdtParmTypeHexInt64
,
2838 SeAdtParmTypeStringList
,
2839 SeAdtParmTypeSidList
,
2840 SeAdtParmTypeDuration
,
2841 SeAdtParmTypeUserAccountControl
,
2843 SeAdtParmTypeMessage
,
2844 SeAdtParmTypeDateTime
,
2845 SeAdtParmTypeSockAddr
,
2847 SeAdtParmTypeLogonHours
,
2848 SeAdtParmTypeLogonIdNoSid
,
2849 SeAdtParmTypeUlongNoConv
,
2850 SeAdtParmTypeSockAddrNoPort
,
2851 SeAdtParmTypeAccessReason
2852 } SE_ADT_PARAMETER_TYPE
, *PSE_ADT_PARAMETER_TYPE
;
2854 typedef struct _SE_ADT_OBJECT_TYPE
{
2858 ACCESS_MASK AccessMask
;
2859 } SE_ADT_OBJECT_TYPE
, *PSE_ADT_OBJECT_TYPE
;
2861 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY
{
2862 SE_ADT_PARAMETER_TYPE Type
;
2866 } SE_ADT_PARAMETER_ARRAY_ENTRY
, *PSE_ADT_PARAMETER_ARRAY_ENTRY
;
2868 typedef struct _SE_ADT_ACCESS_REASON
{
2869 ACCESS_MASK AccessMask
;
2870 ULONG AccessReasons
[32];
2871 ULONG ObjectTypeIndex
;
2872 ULONG AccessGranted
;
2873 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2874 } SE_ADT_ACCESS_REASON
, *PSE_ADT_ACCESS_REASON
;
2876 typedef struct _SE_ADT_PARAMETER_ARRAY
{
2879 ULONG ParameterCount
;
2881 USHORT FlatSubCategoryId
;
2884 SE_ADT_PARAMETER_ARRAY_ENTRY Parameters
[ SE_MAX_AUDIT_PARAMETERS
];
2885 } SE_ADT_PARAMETER_ARRAY
, *PSE_ADT_PARAMETER_ARRAY
;
2887 #endif /* !_NTLSA_AUDIT_ */
2888 #endif /* !_NTLSA_IFS_ */
2889 /******************************************************************************
2890 * Power Management Support Types *
2891 ******************************************************************************/
2896 #define PO_CB_SYSTEM_POWER_POLICY 0
2897 #define PO_CB_AC_STATUS 1
2898 #define PO_CB_BUTTON_COLLISION 2
2899 #define PO_CB_SYSTEM_STATE_LOCK 3
2900 #define PO_CB_LID_SWITCH_STATE 4
2901 #define PO_CB_PROCESSOR_POWER_POLICY 5
2903 /* Power States/Levels */
2904 typedef enum _SYSTEM_POWER_STATE
{
2905 PowerSystemUnspecified
= 0,
2907 PowerSystemSleeping1
,
2908 PowerSystemSleeping2
,
2909 PowerSystemSleeping3
,
2910 PowerSystemHibernate
,
2911 PowerSystemShutdown
,
2913 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
2915 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
2917 typedef enum _POWER_INFORMATION_LEVEL
{
2918 SystemPowerPolicyAc
,
2919 SystemPowerPolicyDc
,
2920 VerifySystemPolicyAc
,
2921 VerifySystemPolicyDc
,
2922 SystemPowerCapabilities
,
2924 SystemPowerStateHandler
,
2925 ProcessorStateHandler
,
2926 SystemPowerPolicyCurrent
,
2927 AdministratorPowerPolicy
,
2928 SystemReserveHiberFile
,
2929 ProcessorInformation
,
2930 SystemPowerInformation
,
2931 ProcessorStateHandler2
,
2934 SystemExecutionState
,
2935 SystemPowerStateNotifyHandler
,
2936 ProcessorPowerPolicyAc
,
2937 ProcessorPowerPolicyDc
,
2938 VerifyProcessorPowerPolicyAc
,
2939 VerifyProcessorPowerPolicyDc
,
2940 ProcessorPowerPolicyCurrent
,
2941 SystemPowerStateLogging
,
2942 SystemPowerLoggingEntry
,
2943 SetPowerSettingValue
,
2944 NotifyUserPowerSetting
,
2945 PowerInformationLevelUnused0
,
2946 PowerInformationLevelUnused1
,
2948 TraceApplicationPowerMessage
,
2949 TraceApplicationPowerMessageEnd
,
2950 ProcessorPerfStates
,
2951 ProcessorIdleStates
,
2954 SystemHiberFileInformation
,
2955 TraceServicePowerMessage
,
2957 PowerShutdownNotification
,
2958 MonitorCapabilities
,
2960 SessionDisplayState
,
2963 GetPowerRequestList
,
2964 ProcessorInformationEx
,
2965 NotifyUserModeLegacyPowerEvent
,
2967 ProcessorIdleDomains
,
2969 SystemHiberFileSize
,
2970 PowerInformationLevelMaximum
2971 } POWER_INFORMATION_LEVEL
;
2974 PowerActionNone
= 0,
2975 PowerActionReserved
,
2977 PowerActionHibernate
,
2978 PowerActionShutdown
,
2979 PowerActionShutdownReset
,
2980 PowerActionShutdownOff
,
2981 PowerActionWarmEject
2982 } POWER_ACTION
, *PPOWER_ACTION
;
2984 typedef enum _DEVICE_POWER_STATE
{
2985 PowerDeviceUnspecified
= 0,
2991 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
2993 typedef enum _MONITOR_DISPLAY_STATE
{
2994 PowerMonitorOff
= 0,
2997 } MONITOR_DISPLAY_STATE
, *PMONITOR_DISPLAY_STATE
;
2999 typedef union _POWER_STATE
{
3000 SYSTEM_POWER_STATE SystemState
;
3001 DEVICE_POWER_STATE DeviceState
;
3002 } POWER_STATE
, *PPOWER_STATE
;
3004 typedef enum _POWER_STATE_TYPE
{
3005 SystemPowerState
= 0,
3007 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
3009 #if (NTDDI_VERSION >= NTDDI_VISTA)
3010 typedef struct _SYSTEM_POWER_STATE_CONTEXT
{
3011 _ANONYMOUS_UNION
union {
3012 _ANONYMOUS_STRUCT
struct {
3014 ULONG TargetSystemState
:4;
3015 ULONG EffectiveSystemState
:4;
3016 ULONG CurrentSystemState
:4;
3017 ULONG IgnoreHibernationPath
:1;
3018 ULONG PseudoTransition
:1;
3021 ULONG ContextAsUlong
;
3023 } SYSTEM_POWER_STATE_CONTEXT
, *PSYSTEM_POWER_STATE_CONTEXT
;
3026 #if (NTDDI_VERSION >= NTDDI_WIN7)
3027 typedef struct _COUNTED_REASON_CONTEXT
{
3030 _ANONYMOUS_UNION
union {
3031 _ANONYMOUS_STRUCT
struct {
3032 UNICODE_STRING ResourceFileName
;
3033 USHORT ResourceReasonId
;
3035 PUNICODE_STRING ReasonStrings
;
3037 UNICODE_STRING SimpleString
;
3039 } COUNTED_REASON_CONTEXT
, *PCOUNTED_REASON_CONTEXT
;
3042 #define IOCTL_QUERY_DEVICE_POWER_STATE \
3043 CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS)
3045 #define IOCTL_SET_DEVICE_WAKE \
3046 CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
3048 #define IOCTL_CANCEL_DEVICE_WAKE \
3049 CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
3051 #define ES_SYSTEM_REQUIRED 0x00000001
3052 #define ES_DISPLAY_REQUIRED 0x00000002
3053 #define ES_USER_PRESENT 0x00000004
3054 #define ES_CONTINUOUS 0x80000000
3056 typedef ULONG EXECUTION_STATE
, *PEXECUTION_STATE
;
3063 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
3064 #define DIAGNOSTIC_REASON_VERSION 0
3065 #define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001
3066 #define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002
3067 #define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000
3068 #define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003)
3071 #define POWER_REQUEST_CONTEXT_VERSION 0
3072 #define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001
3073 #define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002
3075 #define PowerRequestMaximum 3
3077 typedef enum _POWER_REQUEST_TYPE
{
3078 PowerRequestDisplayRequired
,
3079 PowerRequestSystemRequired
,
3080 PowerRequestAwayModeRequired
3081 } POWER_REQUEST_TYPE
, *PPOWER_REQUEST_TYPE
;
3083 #if (NTDDI_VERSION >= NTDDI_WINXP)
3085 #define PDCAP_D0_SUPPORTED 0x00000001
3086 #define PDCAP_D1_SUPPORTED 0x00000002
3087 #define PDCAP_D2_SUPPORTED 0x00000004
3088 #define PDCAP_D3_SUPPORTED 0x00000008
3089 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
3090 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
3091 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
3092 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
3093 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
3095 typedef struct CM_Power_Data_s
{
3097 DEVICE_POWER_STATE PD_MostRecentPowerState
;
3098 ULONG PD_Capabilities
;
3102 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
3103 SYSTEM_POWER_STATE PD_DeepestSystemWake
;
3104 } CM_POWER_DATA
, *PCM_POWER_DATA
;
3106 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
3108 typedef enum _SYSTEM_POWER_CONDITION
{
3113 } SYSTEM_POWER_CONDITION
;
3115 typedef struct _SET_POWER_SETTING_VALUE
{
3118 SYSTEM_POWER_CONDITION PowerCondition
;
3120 UCHAR Data
[ANYSIZE_ARRAY
];
3121 } SET_POWER_SETTING_VALUE
, *PSET_POWER_SETTING_VALUE
;
3123 #define POWER_SETTING_VALUE_VERSION (0x1)
3125 typedef struct _NOTIFY_USER_POWER_SETTING
{
3127 } NOTIFY_USER_POWER_SETTING
, *PNOTIFY_USER_POWER_SETTING
;
3129 typedef struct _APPLICATIONLAUNCH_SETTING_VALUE
{
3130 LARGE_INTEGER ActivationTime
;
3132 ULONG ButtonInstanceID
;
3133 } APPLICATIONLAUNCH_SETTING_VALUE
, *PAPPLICATIONLAUNCH_SETTING_VALUE
;
3135 typedef enum _POWER_PLATFORM_ROLE
{
3136 PlatformRoleUnspecified
= 0,
3137 PlatformRoleDesktop
,
3139 PlatformRoleWorkstation
,
3140 PlatformRoleEnterpriseServer
,
3141 PlatformRoleSOHOServer
,
3142 PlatformRoleAppliancePC
,
3143 PlatformRolePerformanceServer
,
3145 } POWER_PLATFORM_ROLE
;
3147 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
3151 } BATTERY_REPORTING_SCALE
, *PBATTERY_REPORTING_SCALE
;
3152 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
3154 #endif /* !_PO_DDK_ */
3156 #define CORE_PARKING_POLICY_CHANGE_IDEAL 0
3157 #define CORE_PARKING_POLICY_CHANGE_SINGLE 1
3158 #define CORE_PARKING_POLICY_CHANGE_ROCKET 2
3159 #define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
3161 DEFINE_GUID(GUID_MAX_POWER_SAVINGS
, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
3162 DEFINE_GUID(GUID_MIN_POWER_SAVINGS
, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
3163 DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS
, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
3164 DEFINE_GUID(NO_SUBGROUP_GUID
, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
3165 DEFINE_GUID(ALL_POWERSCHEMES_GUID
, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
3166 DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY
, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
3167 DEFINE_GUID(GUID_ACTIVE_POWERSCHEME
, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
3168 DEFINE_GUID(GUID_VIDEO_SUBGROUP
, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
3169 DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT
, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
3170 DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT
, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
3171 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE
, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
3172 DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT
, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
3173 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN
, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
3174 DEFINE_GUID(GUID_MONITOR_POWER_ON
, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
3175 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS
, 0xaded5e82L
, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
3176 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS
, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
3177 DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS
, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
3178 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS
, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
3179 DEFINE_GUID(GUID_SESSION_DISPLAY_STATE
, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
3180 DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE
, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
3181 DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED
, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
3182 DEFINE_GUID(GUID_DISK_SUBGROUP
, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
3183 DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT
, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
3184 DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD
, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
3185 DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN
, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
3186 DEFINE_GUID(GUID_SLEEP_SUBGROUP
, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
3187 DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD
, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
3188 DEFINE_GUID(GUID_STANDBY_TIMEOUT
, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
3189 DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT
, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
3190 DEFINE_GUID(GUID_HIBERNATE_TIMEOUT
, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
3191 DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY
, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
3192 DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION
, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
3193 DEFINE_GUID(GUID_SYSTEM_AWAYMODE
, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
3194 DEFINE_GUID(GUID_ALLOW_AWAYMODE
, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
3195 DEFINE_GUID(GUID_ALLOW_STANDBY_STATES
, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
3196 DEFINE_GUID(GUID_ALLOW_RTC_WAKE
, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
3197 DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED
, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
3198 DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP
, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
3199 DEFINE_GUID(GUID_POWERBUTTON_ACTION
, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
3200 DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS
, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
3201 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION
, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
3202 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS
, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
3203 DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION
, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
3204 DEFINE_GUID(GUID_LIDCLOSE_ACTION
, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
3205 DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS
, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
3206 DEFINE_GUID(GUID_LIDOPEN_POWERSTATE
, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
3207 DEFINE_GUID(GUID_BATTERY_SUBGROUP
, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
3208 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0
, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
3209 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0
, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
3210 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0
, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
3211 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1
, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
3212 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1
, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
3213 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1
, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
3214 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2
, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
3215 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2
, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
3216 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2
, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
3217 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3
, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
3218 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3
, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
3219 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3
, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
3220 DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP
, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
3221 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY
, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
3222 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM
, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
3223 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM
, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
3224 DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING
, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
3225 DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY
, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
3226 DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY
, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
3227 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD
, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
3228 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD
, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
3229 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY
, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
3230 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY
, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
3231 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME
, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
3232 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_TIME
, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
3233 DEFINE_GUID(GUID_PROCESSOR_PERF_TIME_CHECK
, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
3234 DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY
, 0x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
3235 DEFINE_GUID(GUID_PROCESSOR_IDLE_ALLOW_SCALING
, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
3236 DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE
, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
3237 DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK
, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
3238 DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD
, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
3239 DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD
, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
3240 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD
, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
3241 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD
, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
3242 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY
, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
3243 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY
, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
3244 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MAX_CORES
, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
3245 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MIN_CORES
, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
3246 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME
, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
3247 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME
, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
3248 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR
, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
3249 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD
, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
3250 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING
, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
3251 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR
, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
3252 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD
, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
3253 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING
, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
3254 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD
, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
3255 DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE
, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
3256 DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE
, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
3257 DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY
, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
3258 DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY
, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
3259 DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE
, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
3260 DEFINE_GUID(GUID_DEVICE_IDLE_POLICY
, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
3261 DEFINE_GUID(GUID_ACDC_POWER_SOURCE
, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
3262 DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE
, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
3263 DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING
, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
3264 DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK
, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
3265 DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION
, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
3266 DEFINE_GUID(GUID_APPLAUNCH_BUTTON
, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
3267 DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP
, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
3268 DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY
, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
3269 DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN
, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
3271 #define PERFSTATE_POLICY_CHANGE_IDEAL 0
3272 #define PERFSTATE_POLICY_CHANGE_SINGLE 1
3273 #define PERFSTATE_POLICY_CHANGE_ROCKET 2
3274 #define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKET
3276 #define PROCESSOR_PERF_BOOST_POLICY_DISABLED 0
3277 #define PROCESSOR_PERF_BOOST_POLICY_MAX 100
3279 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0
3280 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1
3282 _Function_class_(REQUEST_POWER_COMPLETE
)
3283 _IRQL_requires_same_
3285 (NTAPI REQUEST_POWER_COMPLETE
)(
3286 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
3287 _In_ UCHAR MinorFunction
,
3288 _In_ POWER_STATE PowerState
,
3289 _In_opt_ PVOID Context
,
3290 _In_
struct _IO_STATUS_BLOCK
*IoStatus
);
3291 typedef REQUEST_POWER_COMPLETE
*PREQUEST_POWER_COMPLETE
;
3293 _Function_class_(POWER_SETTING_CALLBACK
)
3294 _IRQL_requires_same_
3296 (NTAPI POWER_SETTING_CALLBACK
)(
3297 _In_ LPCGUID SettingGuid
,
3298 _In_reads_bytes_(ValueLength
) PVOID Value
,
3299 _In_ ULONG ValueLength
,
3300 _Inout_opt_ PVOID Context
);
3301 typedef POWER_SETTING_CALLBACK
*PPOWER_SETTING_CALLBACK
;
3303 /******************************************************************************
3304 * Configuration Manager Types *
3305 ******************************************************************************/
3307 /* Resource list definitions */
3308 typedef int CM_RESOURCE_TYPE
;
3310 #define CmResourceTypeNull 0
3311 #define CmResourceTypePort 1
3312 #define CmResourceTypeInterrupt 2
3313 #define CmResourceTypeMemory 3
3314 #define CmResourceTypeDma 4
3315 #define CmResourceTypeDeviceSpecific 5
3316 #define CmResourceTypeBusNumber 6
3317 #define CmResourceTypeNonArbitrated 128
3318 #define CmResourceTypeConfigData 128
3319 #define CmResourceTypeDevicePrivate 129
3320 #define CmResourceTypePcCardConfig 130
3321 #define CmResourceTypeMfCardConfig 131
3323 /* KEY_VALUE_Xxx.Type */
3326 #define REG_EXPAND_SZ 2
3327 #define REG_BINARY 3
3329 #define REG_DWORD_LITTLE_ENDIAN 4
3330 #define REG_DWORD_BIG_ENDIAN 5
3332 #define REG_MULTI_SZ 7
3333 #define REG_RESOURCE_LIST 8
3334 #define REG_FULL_RESOURCE_DESCRIPTOR 9
3335 #define REG_RESOURCE_REQUIREMENTS_LIST 10
3336 #define REG_QWORD 11
3337 #define REG_QWORD_LITTLE_ENDIAN 11
3339 /* Registry Access Rights */
3340 #define KEY_QUERY_VALUE (0x0001)
3341 #define KEY_SET_VALUE (0x0002)
3342 #define KEY_CREATE_SUB_KEY (0x0004)
3343 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
3344 #define KEY_NOTIFY (0x0010)
3345 #define KEY_CREATE_LINK (0x0020)
3346 #define KEY_WOW64_32KEY (0x0200)
3347 #define KEY_WOW64_64KEY (0x0100)
3348 #define KEY_WOW64_RES (0x0300)
3350 #define KEY_READ ((STANDARD_RIGHTS_READ |\
3352 KEY_ENUMERATE_SUB_KEYS |\
3357 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
3359 KEY_CREATE_SUB_KEY) \
3363 #define KEY_EXECUTE ((KEY_READ) \
3367 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
3370 KEY_CREATE_SUB_KEY |\
3371 KEY_ENUMERATE_SUB_KEYS |\
3377 /* Registry Open/Create Options */
3378 #define REG_OPTION_RESERVED (0x00000000L)
3379 #define REG_OPTION_NON_VOLATILE (0x00000000L)
3380 #define REG_OPTION_VOLATILE (0x00000001L)
3381 #define REG_OPTION_CREATE_LINK (0x00000002L)
3382 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
3383 #define REG_OPTION_OPEN_LINK (0x00000008L)
3385 #define REG_LEGAL_OPTION \
3386 (REG_OPTION_RESERVED |\
3387 REG_OPTION_NON_VOLATILE |\
3388 REG_OPTION_VOLATILE |\
3389 REG_OPTION_CREATE_LINK |\
3390 REG_OPTION_BACKUP_RESTORE |\
3391 REG_OPTION_OPEN_LINK)
3393 #define REG_OPEN_LEGAL_OPTION \
3394 (REG_OPTION_RESERVED |\
3395 REG_OPTION_BACKUP_RESTORE |\
3396 REG_OPTION_OPEN_LINK)
3398 #define REG_STANDARD_FORMAT 1
3399 #define REG_LATEST_FORMAT 2
3400 #define REG_NO_COMPRESSION 4
3402 /* Key creation/open disposition */
3403 #define REG_CREATED_NEW_KEY (0x00000001L)
3404 #define REG_OPENED_EXISTING_KEY (0x00000002L)
3406 /* Key restore & hive load flags */
3407 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
3408 #define REG_REFRESH_HIVE (0x00000002L)
3409 #define REG_NO_LAZY_FLUSH (0x00000004L)
3410 #define REG_FORCE_RESTORE (0x00000008L)
3411 #define REG_APP_HIVE (0x00000010L)
3412 #define REG_PROCESS_PRIVATE (0x00000020L)
3413 #define REG_START_JOURNAL (0x00000040L)
3414 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
3415 #define REG_HIVE_NO_RM (0x00000100L)
3416 #define REG_HIVE_SINGLE_LOG (0x00000200L)
3417 #define REG_BOOT_HIVE (0x00000400L)
3420 #define REG_FORCE_UNLOAD 1
3422 /* Notify Filter Values */
3423 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
3424 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
3425 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
3426 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
3428 #define REG_LEGAL_CHANGE_FILTER \
3429 (REG_NOTIFY_CHANGE_NAME |\
3430 REG_NOTIFY_CHANGE_ATTRIBUTES |\
3431 REG_NOTIFY_CHANGE_LAST_SET |\
3432 REG_NOTIFY_CHANGE_SECURITY)
3434 #include <pshpack4.h>
3435 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
3437 UCHAR ShareDisposition
;
3441 PHYSICAL_ADDRESS Start
;
3445 PHYSICAL_ADDRESS Start
;
3449 #if defined(NT_PROCESSOR_GROUPS)
3458 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3460 _ANONYMOUS_UNION
union {
3462 #if defined(NT_PROCESSOR_GROUPS)
3467 USHORT MessageCount
;
3472 #if defined(NT_PROCESSOR_GROUPS)
3485 PHYSICAL_ADDRESS Start
;
3505 } DeviceSpecificData
;
3506 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3508 PHYSICAL_ADDRESS Start
;
3512 PHYSICAL_ADDRESS Start
;
3516 PHYSICAL_ADDRESS Start
;
3521 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
3522 #include <poppack.h>
3524 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
3525 #define CmResourceTypeNull 0
3526 #define CmResourceTypePort 1
3527 #define CmResourceTypeInterrupt 2
3528 #define CmResourceTypeMemory 3
3529 #define CmResourceTypeDma 4
3530 #define CmResourceTypeDeviceSpecific 5
3531 #define CmResourceTypeBusNumber 6
3532 #define CmResourceTypeMemoryLarge 7
3533 #define CmResourceTypeNonArbitrated 128
3534 #define CmResourceTypeConfigData 128
3535 #define CmResourceTypeDevicePrivate 129
3536 #define CmResourceTypePcCardConfig 130
3537 #define CmResourceTypeMfCardConfig 131
3539 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
3540 typedef enum _CM_SHARE_DISPOSITION
{
3541 CmResourceShareUndetermined
= 0,
3542 CmResourceShareDeviceExclusive
,
3543 CmResourceShareDriverExclusive
,
3544 CmResourceShareShared
3545 } CM_SHARE_DISPOSITION
;
3547 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
3548 #define CM_RESOURCE_PORT_MEMORY 0x0000
3549 #define CM_RESOURCE_PORT_IO 0x0001
3550 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
3551 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
3552 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
3553 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
3554 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
3555 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
3556 #define CM_RESOURCE_PORT_BAR 0x0100
3558 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
3559 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
3560 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
3561 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
3562 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
3564 #define CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS 0x0001
3566 #define CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN ((ULONG)-2)
3568 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
3569 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
3570 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
3571 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
3572 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
3573 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
3574 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
3575 #define CM_RESOURCE_MEMORY_24 0x0010
3576 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
3577 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
3578 #define CM_RESOURCE_MEMORY_BAR 0x0080
3579 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
3581 #define CM_RESOURCE_MEMORY_LARGE 0x0E00
3582 #define CM_RESOURCE_MEMORY_LARGE_40 0x0200
3583 #define CM_RESOURCE_MEMORY_LARGE_48 0x0400
3584 #define CM_RESOURCE_MEMORY_LARGE_64 0x0800
3586 #define CM_RESOURCE_MEMORY_LARGE_40_MAXLEN 0x000000FFFFFFFF00
3587 #define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN 0x0000FFFFFFFF0000
3588 #define CM_RESOURCE_MEMORY_LARGE_64_MAXLEN 0xFFFFFFFF00000000
3590 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
3591 #define CM_RESOURCE_DMA_8 0x0000
3592 #define CM_RESOURCE_DMA_16 0x0001
3593 #define CM_RESOURCE_DMA_32 0x0002
3594 #define CM_RESOURCE_DMA_8_AND_16 0x0004
3595 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
3596 #define CM_RESOURCE_DMA_TYPE_A 0x0010
3597 #define CM_RESOURCE_DMA_TYPE_B 0x0020
3598 #define CM_RESOURCE_DMA_TYPE_F 0x0040
3600 typedef struct _DEVICE_FLAGS
{
3608 } DEVICE_FLAGS
, *PDEVICE_FLAGS
;
3610 typedef enum _INTERFACE_TYPE
{
3611 InterfaceTypeUndefined
= -1,
3629 MaximumInterfaceType
3630 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
3632 typedef struct _CM_COMPONENT_INFORMATION
{
3636 KAFFINITY AffinityMask
;
3637 } CM_COMPONENT_INFORMATION
, *PCM_COMPONENT_INFORMATION
;
3639 typedef struct _CM_ROM_BLOCK
{
3642 } CM_ROM_BLOCK
, *PCM_ROM_BLOCK
;
3644 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
3648 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
3649 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
3651 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
3652 INTERFACE_TYPE InterfaceType
;
3654 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
3655 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
3657 typedef struct _CM_RESOURCE_LIST
{
3659 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
3660 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
3662 typedef struct _PNP_BUS_INFORMATION
{
3664 INTERFACE_TYPE LegacyBusType
;
3666 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
3668 #include <pshpack1.h>
3670 typedef struct _CM_INT13_DRIVE_PARAMETER
{
3673 USHORT SectorsPerTrack
;
3675 USHORT NumberDrives
;
3676 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
3678 typedef struct _CM_MCA_POS_DATA
{
3684 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
3686 typedef struct _CM_PNP_BIOS_DEVICE_NODE
{
3690 UCHAR DeviceType
[3];
3691 USHORT DeviceAttributes
;
3692 } CM_PNP_BIOS_DEVICE_NODE
,*PCM_PNP_BIOS_DEVICE_NODE
;
3694 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
{
3698 USHORT ControlField
;
3700 ULONG EventFlagAddress
;
3701 USHORT RealModeEntryOffset
;
3702 USHORT RealModeEntrySegment
;
3703 USHORT ProtectedModeEntryOffset
;
3704 ULONG ProtectedModeCodeBaseAddress
;
3706 USHORT RealModeDataBaseAddress
;
3707 ULONG ProtectedModeDataBaseAddress
;
3708 } CM_PNP_BIOS_INSTALLATION_CHECK
, *PCM_PNP_BIOS_INSTALLATION_CHECK
;
3710 #include <poppack.h>
3712 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
{
3713 ULONG BytesPerSector
;
3714 ULONG NumberOfCylinders
;
3715 ULONG SectorsPerTrack
;
3716 ULONG NumberOfHeads
;
3717 } CM_DISK_GEOMETRY_DEVICE_DATA
, *PCM_DISK_GEOMETRY_DEVICE_DATA
;
3719 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
3724 USHORT KeyboardFlags
;
3725 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
3727 typedef struct _CM_SCSI_DEVICE_DATA
{
3730 UCHAR HostIdentifier
;
3731 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
3733 typedef struct _CM_VIDEO_DEVICE_DATA
{
3737 } CM_VIDEO_DEVICE_DATA
, *PCM_VIDEO_DEVICE_DATA
;
3739 typedef struct _CM_SONIC_DEVICE_DATA
{
3742 USHORT DataConfigurationRegister
;
3743 UCHAR EthernetAddress
[8];
3744 } CM_SONIC_DEVICE_DATA
, *PCM_SONIC_DEVICE_DATA
;
3746 typedef struct _CM_SERIAL_DEVICE_DATA
{
3750 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
3752 typedef struct _CM_MONITOR_DEVICE_DATA
{
3755 USHORT HorizontalScreenSize
;
3756 USHORT VerticalScreenSize
;
3757 USHORT HorizontalResolution
;
3758 USHORT VerticalResolution
;
3759 USHORT HorizontalDisplayTimeLow
;
3760 USHORT HorizontalDisplayTime
;
3761 USHORT HorizontalDisplayTimeHigh
;
3762 USHORT HorizontalBackPorchLow
;
3763 USHORT HorizontalBackPorch
;
3764 USHORT HorizontalBackPorchHigh
;
3765 USHORT HorizontalFrontPorchLow
;
3766 USHORT HorizontalFrontPorch
;
3767 USHORT HorizontalFrontPorchHigh
;
3768 USHORT HorizontalSyncLow
;
3769 USHORT HorizontalSync
;
3770 USHORT HorizontalSyncHigh
;
3771 USHORT VerticalBackPorchLow
;
3772 USHORT VerticalBackPorch
;
3773 USHORT VerticalBackPorchHigh
;
3774 USHORT VerticalFrontPorchLow
;
3775 USHORT VerticalFrontPorch
;
3776 USHORT VerticalFrontPorchHigh
;
3777 USHORT VerticalSyncLow
;
3778 USHORT VerticalSync
;
3779 USHORT VerticalSyncHigh
;
3780 } CM_MONITOR_DEVICE_DATA
, *PCM_MONITOR_DEVICE_DATA
;
3782 typedef struct _CM_FLOPPY_DEVICE_DATA
{
3788 UCHAR StepRateHeadUnloadTime
;
3791 UCHAR SectorLengthCode
;
3792 UCHAR SectorPerTrack
;
3793 UCHAR ReadWriteGapLength
;
3794 UCHAR DataTransferLength
;
3795 UCHAR FormatGapLength
;
3796 UCHAR FormatFillCharacter
;
3797 UCHAR HeadSettleTime
;
3798 UCHAR MotorSettleTime
;
3799 UCHAR MaximumTrackValue
;
3800 UCHAR DataTransferRate
;
3801 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
3803 typedef enum _KEY_INFORMATION_CLASS
{
3804 KeyBasicInformation
,
3808 KeyCachedInformation
,
3809 KeyFlagsInformation
,
3810 KeyVirtualizationInformation
,
3811 KeyHandleTagsInformation
,
3813 } KEY_INFORMATION_CLASS
;
3815 typedef struct _KEY_BASIC_INFORMATION
{
3816 LARGE_INTEGER LastWriteTime
;
3820 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
3822 typedef struct _KEY_CONTROL_FLAGS_INFORMATION
{
3824 } KEY_CONTROL_FLAGS_INFORMATION
, *PKEY_CONTROL_FLAGS_INFORMATION
;
3826 typedef struct _KEY_FULL_INFORMATION
{
3827 LARGE_INTEGER LastWriteTime
;
3835 ULONG MaxValueNameLen
;
3836 ULONG MaxValueDataLen
;
3838 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
3840 typedef struct _KEY_HANDLE_TAGS_INFORMATION
{
3842 } KEY_HANDLE_TAGS_INFORMATION
, *PKEY_HANDLE_TAGS_INFORMATION
;
3844 typedef struct _KEY_NODE_INFORMATION
{
3845 LARGE_INTEGER LastWriteTime
;
3851 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
3853 typedef enum _KEY_SET_INFORMATION_CLASS
{
3854 KeyWriteTimeInformation
,
3855 KeyWow64FlagsInformation
,
3856 KeyControlFlagsInformation
,
3857 KeySetVirtualizationInformation
,
3858 KeySetDebugInformation
,
3859 KeySetHandleTagsInformation
,
3861 } KEY_SET_INFORMATION_CLASS
;
3863 typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION
{
3864 ULONG VirtualTarget
:1;
3865 ULONG VirtualStore
:1;
3866 ULONG VirtualSource
:1;
3868 } KEY_SET_VIRTUALIZATION_INFORMATION
, *PKEY_SET_VIRTUALIZATION_INFORMATION
;
3870 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
3875 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
3877 typedef struct _KEY_VALUE_FULL_INFORMATION
{
3884 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
3886 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
3890 _Field_size_bytes_(DataLength
) UCHAR Data
[1];
3891 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
3893 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
3896 _Field_size_bytes_(DataLength
) UCHAR Data
[1];
3897 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
3899 typedef struct _KEY_VALUE_ENTRY
{
3900 PUNICODE_STRING ValueName
;
3904 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
3906 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
3907 KeyValueBasicInformation
,
3908 KeyValueFullInformation
,
3909 KeyValuePartialInformation
,
3910 KeyValueFullInformationAlign64
,
3911 KeyValuePartialInformationAlign64
3912 } KEY_VALUE_INFORMATION_CLASS
;
3914 typedef struct _KEY_WOW64_FLAGS_INFORMATION
{
3916 } KEY_WOW64_FLAGS_INFORMATION
, *PKEY_WOW64_FLAGS_INFORMATION
;
3918 typedef struct _KEY_WRITE_TIME_INFORMATION
{
3919 LARGE_INTEGER LastWriteTime
;
3920 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
3922 typedef enum _REG_NOTIFY_CLASS
{
3924 RegNtPreDeleteKey
= RegNtDeleteKey
,
3926 RegNtPreSetValueKey
= RegNtSetValueKey
,
3927 RegNtDeleteValueKey
,
3928 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
3929 RegNtSetInformationKey
,
3930 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
3932 RegNtPreRenameKey
= RegNtRenameKey
,
3934 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
3935 RegNtEnumerateValueKey
,
3936 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
3938 RegNtPreQueryKey
= RegNtQueryKey
,
3940 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
3941 RegNtQueryMultipleValueKey
,
3942 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
3947 RegNtKeyHandleClose
,
3948 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
3950 RegNtPostSetValueKey
,
3951 RegNtPostDeleteValueKey
,
3952 RegNtPostSetInformationKey
,
3954 RegNtPostEnumerateKey
,
3955 RegNtPostEnumerateValueKey
,
3957 RegNtPostQueryValueKey
,
3958 RegNtPostQueryMultipleValueKey
,
3959 RegNtPostKeyHandleClose
,
3960 RegNtPreCreateKeyEx
,
3961 RegNtPostCreateKeyEx
,
3970 RegNtPreQueryKeySecurity
,
3971 RegNtPostQueryKeySecurity
,
3972 RegNtPreSetKeySecurity
,
3973 RegNtPostSetKeySecurity
,
3974 RegNtCallbackObjectContextCleanup
,
3976 RegNtPostRestoreKey
,
3980 RegNtPostReplaceKey
,
3982 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
3984 _IRQL_requires_same_
3985 _Function_class_(EX_CALLBACK_FUNCTION
)
3987 (NTAPI EX_CALLBACK_FUNCTION
)(
3988 _In_ PVOID CallbackContext
,
3989 _In_opt_ PVOID Argument1
,
3990 _In_opt_ PVOID Argument2
);
3991 typedef EX_CALLBACK_FUNCTION
*PEX_CALLBACK_FUNCTION
;
3993 typedef struct _REG_DELETE_KEY_INFORMATION
{
3996 PVOID ObjectContext
;
3998 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
3999 #if (NTDDI_VERSION >= NTDDI_VISTA)
4000 , REG_FLUSH_KEY_INFORMATION
, *PREG_FLUSH_KEY_INFORMATION
4004 typedef struct _REG_SET_VALUE_KEY_INFORMATION
{
4006 PUNICODE_STRING ValueName
;
4012 PVOID ObjectContext
;
4014 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
4016 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
{
4018 PUNICODE_STRING ValueName
;
4020 PVOID ObjectContext
;
4022 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
4024 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
{
4026 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
4027 PVOID KeySetInformation
;
4028 ULONG KeySetInformationLength
;
4030 PVOID ObjectContext
;
4032 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
4034 typedef struct _REG_ENUMERATE_KEY_INFORMATION
{
4037 KEY_INFORMATION_CLASS KeyInformationClass
;
4038 PVOID KeyInformation
;
4040 PULONG ResultLength
;
4042 PVOID ObjectContext
;
4044 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
4046 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
{
4049 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
4050 PVOID KeyValueInformation
;
4052 PULONG ResultLength
;
4054 PVOID ObjectContext
;
4056 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
4058 typedef struct _REG_QUERY_KEY_INFORMATION
{
4060 KEY_INFORMATION_CLASS KeyInformationClass
;
4061 PVOID KeyInformation
;
4063 PULONG ResultLength
;
4065 PVOID ObjectContext
;
4067 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
4069 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
{
4071 PUNICODE_STRING ValueName
;
4072 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
4073 PVOID KeyValueInformation
;
4075 PULONG ResultLength
;
4077 PVOID ObjectContext
;
4079 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
4081 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
{
4083 PKEY_VALUE_ENTRY ValueEntries
;
4086 PULONG BufferLength
;
4087 PULONG RequiredBufferLength
;
4089 PVOID ObjectContext
;
4091 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
4093 typedef struct _REG_RENAME_KEY_INFORMATION
{
4095 PUNICODE_STRING NewName
;
4097 PVOID ObjectContext
;
4099 } REG_RENAME_KEY_INFORMATION
, *PREG_RENAME_KEY_INFORMATION
;
4101 typedef struct _REG_CREATE_KEY_INFORMATION
{
4102 PUNICODE_STRING CompleteName
;
4105 ULONG CreateOptions
;
4106 PUNICODE_STRING Class
;
4107 PVOID SecurityDescriptor
;
4108 PVOID SecurityQualityOfService
;
4109 ACCESS_MASK DesiredAccess
;
4110 ACCESS_MASK GrantedAccess
;
4112 PVOID
*ResultObject
;
4114 PVOID RootObjectContext
;
4117 } REG_CREATE_KEY_INFORMATION
, REG_OPEN_KEY_INFORMATION
,*PREG_CREATE_KEY_INFORMATION
, *PREG_OPEN_KEY_INFORMATION
;
4119 typedef struct _REG_CREATE_KEY_INFORMATION_V1
{
4120 PUNICODE_STRING CompleteName
;
4124 PUNICODE_STRING Class
;
4125 PVOID SecurityDescriptor
;
4126 PVOID SecurityQualityOfService
;
4127 ACCESS_MASK DesiredAccess
;
4128 ACCESS_MASK GrantedAccess
;
4130 PVOID
*ResultObject
;
4132 PVOID RootObjectContext
;
4135 PUNICODE_STRING RemainingName
;
4138 KPROCESSOR_MODE CheckAccessMode
;
4139 } REG_CREATE_KEY_INFORMATION_V1
, REG_OPEN_KEY_INFORMATION_V1
,*PREG_CREATE_KEY_INFORMATION_V1
, *PREG_OPEN_KEY_INFORMATION_V1
;
4141 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
{
4142 PUNICODE_STRING CompleteName
;
4143 } REG_PRE_CREATE_KEY_INFORMATION
, REG_PRE_OPEN_KEY_INFORMATION
,*PREG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;;
4145 typedef struct _REG_POST_CREATE_KEY_INFORMATION
{
4146 PUNICODE_STRING CompleteName
;
4149 } REG_POST_CREATE_KEY_INFORMATION
,REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
4151 typedef struct _REG_POST_OPERATION_INFORMATION
{
4154 PVOID PreInformation
;
4155 NTSTATUS ReturnStatus
;
4157 PVOID ObjectContext
;
4159 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
4161 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
{
4164 PVOID ObjectContext
;
4166 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
4168 #if (NTDDI_VERSION >= NTDDI_VISTA)
4170 typedef struct _REG_LOAD_KEY_INFORMATION
{
4172 PUNICODE_STRING KeyName
;
4173 PUNICODE_STRING SourceFile
;
4175 PVOID TrustClassObject
;
4177 ACCESS_MASK DesiredAccess
;
4180 PVOID ObjectContext
;
4182 } REG_LOAD_KEY_INFORMATION
, *PREG_LOAD_KEY_INFORMATION
;
4184 typedef struct _REG_UNLOAD_KEY_INFORMATION
{
4188 PVOID ObjectContext
;
4190 } REG_UNLOAD_KEY_INFORMATION
, *PREG_UNLOAD_KEY_INFORMATION
;
4192 typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION
{
4194 PVOID ObjectContext
;
4196 } REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION
, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION
;
4198 typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION
{
4200 PSECURITY_INFORMATION SecurityInformation
;
4201 PSECURITY_DESCRIPTOR SecurityDescriptor
;
4204 PVOID ObjectContext
;
4206 } REG_QUERY_KEY_SECURITY_INFORMATION
, *PREG_QUERY_KEY_SECURITY_INFORMATION
;
4208 typedef struct _REG_SET_KEY_SECURITY_INFORMATION
{
4210 PSECURITY_INFORMATION SecurityInformation
;
4211 PSECURITY_DESCRIPTOR SecurityDescriptor
;
4213 PVOID ObjectContext
;
4215 } REG_SET_KEY_SECURITY_INFORMATION
, *PREG_SET_KEY_SECURITY_INFORMATION
;
4217 typedef struct _REG_RESTORE_KEY_INFORMATION
{
4222 PVOID ObjectContext
;
4224 } REG_RESTORE_KEY_INFORMATION
, *PREG_RESTORE_KEY_INFORMATION
;
4226 typedef struct _REG_SAVE_KEY_INFORMATION
{
4231 PVOID ObjectContext
;
4233 } REG_SAVE_KEY_INFORMATION
, *PREG_SAVE_KEY_INFORMATION
;
4235 typedef struct _REG_REPLACE_KEY_INFORMATION
{
4237 PUNICODE_STRING OldFileName
;
4238 PUNICODE_STRING NewFileName
;
4240 PVOID ObjectContext
;
4242 } REG_REPLACE_KEY_INFORMATION
, *PREG_REPLACE_KEY_INFORMATION
;
4244 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
4246 #define SERVICE_KERNEL_DRIVER 0x00000001
4247 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
4248 #define SERVICE_ADAPTER 0x00000004
4249 #define SERVICE_RECOGNIZER_DRIVER 0x00000008
4251 #define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \
4252 SERVICE_FILE_SYSTEM_DRIVER | \
4253 SERVICE_RECOGNIZER_DRIVER)
4255 #define SERVICE_WIN32_OWN_PROCESS 0x00000010
4256 #define SERVICE_WIN32_SHARE_PROCESS 0x00000020
4257 #define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \
4258 SERVICE_WIN32_SHARE_PROCESS)
4260 #define SERVICE_INTERACTIVE_PROCESS 0x00000100
4262 #define SERVICE_TYPE_ALL (SERVICE_WIN32 | \
4265 SERVICE_INTERACTIVE_PROCESS)
4267 /* Service Start Types */
4268 #define SERVICE_BOOT_START 0x00000000
4269 #define SERVICE_SYSTEM_START 0x00000001
4270 #define SERVICE_AUTO_START 0x00000002
4271 #define SERVICE_DEMAND_START 0x00000003
4272 #define SERVICE_DISABLED 0x00000004
4274 #define SERVICE_ERROR_IGNORE 0x00000000
4275 #define SERVICE_ERROR_NORMAL 0x00000001
4276 #define SERVICE_ERROR_SEVERE 0x00000002
4277 #define SERVICE_ERROR_CRITICAL 0x00000003
4279 typedef enum _CM_SERVICE_NODE_TYPE
{
4280 DriverType
= SERVICE_KERNEL_DRIVER
,
4281 FileSystemType
= SERVICE_FILE_SYSTEM_DRIVER
,
4282 Win32ServiceOwnProcess
= SERVICE_WIN32_OWN_PROCESS
,
4283 Win32ServiceShareProcess
= SERVICE_WIN32_SHARE_PROCESS
,
4284 AdapterType
= SERVICE_ADAPTER
,
4285 RecognizerType
= SERVICE_RECOGNIZER_DRIVER
4286 } SERVICE_NODE_TYPE
;
4288 typedef enum _CM_SERVICE_LOAD_TYPE
{
4289 BootLoad
= SERVICE_BOOT_START
,
4290 SystemLoad
= SERVICE_SYSTEM_START
,
4291 AutoLoad
= SERVICE_AUTO_START
,
4292 DemandLoad
= SERVICE_DEMAND_START
,
4293 DisableLoad
= SERVICE_DISABLED
4294 } SERVICE_LOAD_TYPE
;
4296 typedef enum _CM_ERROR_CONTROL_TYPE
{
4297 IgnoreError
= SERVICE_ERROR_IGNORE
,
4298 NormalError
= SERVICE_ERROR_NORMAL
,
4299 SevereError
= SERVICE_ERROR_SEVERE
,
4300 CriticalError
= SERVICE_ERROR_CRITICAL
4301 } SERVICE_ERROR_TYPE
;
4303 #define CM_SERVICE_NETWORK_BOOT_LOAD 0x00000001
4304 #define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
4305 #define CM_SERVICE_USB_DISK_BOOT_LOAD 0x00000004
4307 #define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD | \
4308 CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \
4309 CM_SERVICE_USB_DISK_BOOT_LOAD)
4311 /******************************************************************************
4312 * I/O Manager Types *
4313 ******************************************************************************/
4316 #define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS
4318 #define CONNECT_FULLY_SPECIFIED 0x1
4319 #define CONNECT_LINE_BASED 0x2
4320 #define CONNECT_MESSAGE_BASED 0x3
4321 #define CONNECT_FULLY_SPECIFIED_GROUP 0x4
4322 #define CONNECT_CURRENT_VERSION 0x4
4324 #define POOL_COLD_ALLOCATION 256
4325 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
4326 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
4328 #define IO_TYPE_ADAPTER 1
4329 #define IO_TYPE_CONTROLLER 2
4330 #define IO_TYPE_DEVICE 3
4331 #define IO_TYPE_DRIVER 4
4332 #define IO_TYPE_FILE 5
4333 #define IO_TYPE_IRP 6
4334 #define IO_TYPE_MASTER_ADAPTER 7
4335 #define IO_TYPE_OPEN_PACKET 8
4336 #define IO_TYPE_TIMER 9
4337 #define IO_TYPE_VPB 10
4338 #define IO_TYPE_ERROR_LOG 11
4339 #define IO_TYPE_ERROR_MESSAGE 12
4340 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
4342 #define IO_TYPE_CSQ_IRP_CONTEXT 1
4343 #define IO_TYPE_CSQ 2
4344 #define IO_TYPE_CSQ_EX 3
4346 /* IO_RESOURCE_DESCRIPTOR.Option */
4347 #define IO_RESOURCE_PREFERRED 0x01
4348 #define IO_RESOURCE_DEFAULT 0x02
4349 #define IO_RESOURCE_ALTERNATIVE 0x08
4351 #define FILE_DEVICE_BEEP 0x00000001
4352 #define FILE_DEVICE_CD_ROM 0x00000002
4353 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
4354 #define FILE_DEVICE_CONTROLLER 0x00000004
4355 #define FILE_DEVICE_DATALINK 0x00000005
4356 #define FILE_DEVICE_DFS 0x00000006
4357 #define FILE_DEVICE_DISK 0x00000007
4358 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
4359 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
4360 #define FILE_DEVICE_INPORT_PORT 0x0000000a
4361 #define FILE_DEVICE_KEYBOARD 0x0000000b
4362 #define FILE_DEVICE_MAILSLOT 0x0000000c
4363 #define FILE_DEVICE_MIDI_IN 0x0000000d
4364 #define FILE_DEVICE_MIDI_OUT 0x0000000e
4365 #define FILE_DEVICE_MOUSE 0x0000000f
4366 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
4367 #define FILE_DEVICE_NAMED_PIPE 0x00000011
4368 #define FILE_DEVICE_NETWORK 0x00000012
4369 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
4370 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
4371 #define FILE_DEVICE_NULL 0x00000015
4372 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
4373 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
4374 #define FILE_DEVICE_PRINTER 0x00000018
4375 #define FILE_DEVICE_SCANNER 0x00000019
4376 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
4377 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
4378 #define FILE_DEVICE_SCREEN 0x0000001c
4379 #define FILE_DEVICE_SOUND 0x0000001d
4380 #define FILE_DEVICE_STREAMS 0x0000001e
4381 #define FILE_DEVICE_TAPE 0x0000001f
4382 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
4383 #define FILE_DEVICE_TRANSPORT 0x00000021
4384 #define FILE_DEVICE_UNKNOWN 0x00000022
4385 #define FILE_DEVICE_VIDEO 0x00000023
4386 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
4387 #define FILE_DEVICE_WAVE_IN 0x00000025
4388 #define FILE_DEVICE_WAVE_OUT 0x00000026
4389 #define FILE_DEVICE_8042_PORT 0x00000027
4390 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
4391 #define FILE_DEVICE_BATTERY 0x00000029
4392 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
4393 #define FILE_DEVICE_MODEM 0x0000002b
4394 #define FILE_DEVICE_VDM 0x0000002c
4395 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
4396 #define FILE_DEVICE_SMB 0x0000002e
4397 #define FILE_DEVICE_KS 0x0000002f
4398 #define FILE_DEVICE_CHANGER 0x00000030
4399 #define FILE_DEVICE_SMARTCARD 0x00000031
4400 #define FILE_DEVICE_ACPI 0x00000032
4401 #define FILE_DEVICE_DVD 0x00000033
4402 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
4403 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
4404 #define FILE_DEVICE_DFS_VOLUME 0x00000036
4405 #define FILE_DEVICE_SERENUM 0x00000037
4406 #define FILE_DEVICE_TERMSRV 0x00000038
4407 #define FILE_DEVICE_KSEC 0x00000039
4408 #define FILE_DEVICE_FIPS 0x0000003A
4409 #define FILE_DEVICE_INFINIBAND 0x0000003B
4410 #define FILE_DEVICE_VMBUS 0x0000003E
4411 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
4412 #define FILE_DEVICE_WPD 0x00000040
4413 #define FILE_DEVICE_BLUETOOTH 0x00000041
4414 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
4415 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
4416 #define FILE_DEVICE_BIOMETRIC 0x00000044
4417 #define FILE_DEVICE_PMI 0x00000045
4419 #if defined(NT_PROCESSOR_GROUPS)
4421 typedef USHORT IRQ_DEVICE_POLICY
, *PIRQ_DEVICE_POLICY
;
4423 typedef enum _IRQ_DEVICE_POLICY_USHORT
{
4424 IrqPolicyMachineDefault
= 0,
4425 IrqPolicyAllCloseProcessors
= 1,
4426 IrqPolicyOneCloseProcessor
= 2,
4427 IrqPolicyAllProcessorsInMachine
= 3,
4428 IrqPolicyAllProcessorsInGroup
= 3,
4429 IrqPolicySpecifiedProcessors
= 4,
4430 IrqPolicySpreadMessagesAcrossAllProcessors
= 5};
4432 #else /* defined(NT_PROCESSOR_GROUPS) */
4434 typedef enum _IRQ_DEVICE_POLICY
{
4435 IrqPolicyMachineDefault
= 0,
4436 IrqPolicyAllCloseProcessors
,
4437 IrqPolicyOneCloseProcessor
,
4438 IrqPolicyAllProcessorsInMachine
,
4439 IrqPolicySpecifiedProcessors
,
4440 IrqPolicySpreadMessagesAcrossAllProcessors
4441 } IRQ_DEVICE_POLICY
, *PIRQ_DEVICE_POLICY
;
4445 typedef enum _IRQ_PRIORITY
{
4446 IrqPriorityUndefined
= 0,
4450 } IRQ_PRIORITY
, *PIRQ_PRIORITY
;
4452 typedef enum _IRQ_GROUP_POLICY
{
4453 GroupAffinityAllGroupZero
= 0,
4454 GroupAffinityDontCare
4455 } IRQ_GROUP_POLICY
, *PIRQ_GROUP_POLICY
;
4457 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
4459 typedef struct _OBJECT_HANDLE_INFORMATION
{
4460 ULONG HandleAttributes
;
4461 ACCESS_MASK GrantedAccess
;
4462 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
4464 typedef struct _CLIENT_ID
{
4465 HANDLE UniqueProcess
;
4466 HANDLE UniqueThread
;
4467 } CLIENT_ID
, *PCLIENT_ID
;
4469 typedef struct _VPB
{
4473 USHORT VolumeLabelLength
;
4474 struct _DEVICE_OBJECT
*DeviceObject
;
4475 struct _DEVICE_OBJECT
*RealDevice
;
4477 ULONG ReferenceCount
;
4478 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
4481 typedef enum _IO_ALLOCATION_ACTION
{
4484 DeallocateObjectKeepRegisters
4485 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
4487 _Function_class_(DRIVER_CONTROL
)
4488 _IRQL_requires_same_
4489 typedef IO_ALLOCATION_ACTION
4490 (NTAPI DRIVER_CONTROL
)(
4491 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
4492 _Inout_
struct _IRP
*Irp
,
4493 _In_ PVOID MapRegisterBase
,
4494 _In_ PVOID Context
);
4495 typedef DRIVER_CONTROL
*PDRIVER_CONTROL
;
4497 typedef struct _WAIT_CONTEXT_BLOCK
{
4498 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
4499 PDRIVER_CONTROL DeviceRoutine
;
4500 PVOID DeviceContext
;
4501 ULONG NumberOfMapRegisters
;
4504 PKDPC BufferChainingDpc
;
4505 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
4507 /* DEVICE_OBJECT.Flags */
4508 #define DO_VERIFY_VOLUME 0x00000002
4509 #define DO_BUFFERED_IO 0x00000004
4510 #define DO_EXCLUSIVE 0x00000008
4511 #define DO_DIRECT_IO 0x00000010
4512 #define DO_MAP_IO_BUFFER 0x00000020
4513 #define DO_DEVICE_INITIALIZING 0x00000080
4514 #define DO_SHUTDOWN_REGISTERED 0x00000800
4515 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
4516 #define DO_POWER_PAGABLE 0x00002000
4517 #define DO_POWER_INRUSH 0x00004000
4519 /* DEVICE_OBJECT.Characteristics */
4520 #define FILE_REMOVABLE_MEDIA 0x00000001
4521 #define FILE_READ_ONLY_DEVICE 0x00000002
4522 #define FILE_FLOPPY_DISKETTE 0x00000004
4523 #define FILE_WRITE_ONCE_MEDIA 0x00000008
4524 #define FILE_REMOTE_DEVICE 0x00000010
4525 #define FILE_DEVICE_IS_MOUNTED 0x00000020
4526 #define FILE_VIRTUAL_VOLUME 0x00000040
4527 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
4528 #define FILE_DEVICE_SECURE_OPEN 0x00000100
4529 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
4530 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
4531 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
4533 /* DEVICE_OBJECT.AlignmentRequirement */
4534 #define FILE_BYTE_ALIGNMENT 0x00000000
4535 #define FILE_WORD_ALIGNMENT 0x00000001
4536 #define FILE_LONG_ALIGNMENT 0x00000003
4537 #define FILE_QUAD_ALIGNMENT 0x00000007
4538 #define FILE_OCTA_ALIGNMENT 0x0000000f
4539 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
4540 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
4541 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
4542 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
4543 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
4545 /* DEVICE_OBJECT.DeviceType */
4546 #define DEVICE_TYPE ULONG
4548 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT
) _DEVICE_OBJECT
{
4551 LONG ReferenceCount
;
4552 struct _DRIVER_OBJECT
*DriverObject
;
4553 struct _DEVICE_OBJECT
*NextDevice
;
4554 struct _DEVICE_OBJECT
*AttachedDevice
;
4555 struct _IRP
*CurrentIrp
;
4558 ULONG Characteristics
;
4560 PVOID DeviceExtension
;
4561 DEVICE_TYPE DeviceType
;
4564 LIST_ENTRY ListEntry
;
4565 WAIT_CONTEXT_BLOCK Wcb
;
4567 ULONG AlignmentRequirement
;
4568 KDEVICE_QUEUE DeviceQueue
;
4570 ULONG ActiveThreadCount
;
4571 PSECURITY_DESCRIPTOR SecurityDescriptor
;
4575 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
4577 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
4579 typedef enum _IO_SESSION_STATE
{
4580 IoSessionStateCreated
= 1,
4581 IoSessionStateInitialized
,
4582 IoSessionStateConnected
,
4583 IoSessionStateDisconnected
,
4584 IoSessionStateDisconnectedLoggedOn
,
4585 IoSessionStateLoggedOn
,
4586 IoSessionStateLoggedOff
,
4587 IoSessionStateTerminated
,
4589 } IO_SESSION_STATE
, *PIO_SESSION_STATE
;
4591 typedef enum _IO_COMPLETION_ROUTINE_RESULT
{
4592 ContinueCompletion
= STATUS_CONTINUE_COMPLETION
,
4593 StopCompletion
= STATUS_MORE_PROCESSING_REQUIRED
4594 } IO_COMPLETION_ROUTINE_RESULT
, *PIO_COMPLETION_ROUTINE_RESULT
;
4596 typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY
{
4597 PHYSICAL_ADDRESS MessageAddress
;
4598 KAFFINITY TargetProcessorSet
;
4599 PKINTERRUPT InterruptObject
;
4603 KINTERRUPT_MODE Mode
;
4604 KINTERRUPT_POLARITY Polarity
;
4605 } IO_INTERRUPT_MESSAGE_INFO_ENTRY
, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY
;
4607 typedef struct _IO_INTERRUPT_MESSAGE_INFO
{
4610 IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo
[1];
4611 } IO_INTERRUPT_MESSAGE_INFO
, *PIO_INTERRUPT_MESSAGE_INFO
;
4613 typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS
{
4614 _In_ PDEVICE_OBJECT PhysicalDeviceObject
;
4615 _Out_ PKINTERRUPT
*InterruptObject
;
4616 _In_ PKSERVICE_ROUTINE ServiceRoutine
;
4617 _In_ PVOID ServiceContext
;
4618 _In_opt_ PKSPIN_LOCK SpinLock
;
4619 _In_ KIRQL SynchronizeIrql
;
4620 _In_ BOOLEAN FloatingSave
;
4621 _In_ BOOLEAN ShareVector
;
4624 _In_ KINTERRUPT_MODE InterruptMode
;
4625 _In_ KAFFINITY ProcessorEnableMask
;
4627 } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS
, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS
;
4629 typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS
{
4630 _In_ PDEVICE_OBJECT PhysicalDeviceObject
;
4631 _Out_ PKINTERRUPT
*InterruptObject
;
4632 _In_ PKSERVICE_ROUTINE ServiceRoutine
;
4633 _In_ PVOID ServiceContext
;
4634 _In_opt_ PKSPIN_LOCK SpinLock
;
4635 _In_opt_ KIRQL SynchronizeIrql
;
4636 _In_ BOOLEAN FloatingSave
;
4637 } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS
, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS
;
4639 typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS
{
4640 _In_ PDEVICE_OBJECT PhysicalDeviceObject
;
4642 _Out_ PVOID
*Generic
;
4643 _Out_ PIO_INTERRUPT_MESSAGE_INFO
*InterruptMessageTable
;
4644 _Out_ PKINTERRUPT
*InterruptObject
;
4645 } ConnectionContext
;
4646 _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine
;
4647 _In_ PVOID ServiceContext
;
4648 _In_opt_ PKSPIN_LOCK SpinLock
;
4649 _In_opt_ KIRQL SynchronizeIrql
;
4650 _In_ BOOLEAN FloatingSave
;
4651 _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine
;
4652 } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS
, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS
;
4654 typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS
{
4655 _Inout_ ULONG Version
;
4656 _ANONYMOUS_UNION
union {
4657 IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified
;
4658 IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased
;
4659 IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased
;
4661 } IO_CONNECT_INTERRUPT_PARAMETERS
, *PIO_CONNECT_INTERRUPT_PARAMETERS
;
4663 typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS
{
4667 _In_ PKINTERRUPT InterruptObject
;
4668 _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable
;
4669 } ConnectionContext
;
4670 } IO_DISCONNECT_INTERRUPT_PARAMETERS
, *PIO_DISCONNECT_INTERRUPT_PARAMETERS
;
4672 typedef enum _IO_ACCESS_TYPE
{
4678 typedef enum _IO_ACCESS_MODE
{
4683 typedef enum _IO_CONTAINER_NOTIFICATION_CLASS
{
4684 IoSessionStateNotification
,
4685 IoMaxContainerNotificationClass
4686 } IO_CONTAINER_NOTIFICATION_CLASS
;
4688 typedef struct _IO_SESSION_STATE_NOTIFICATION
{
4694 } IO_SESSION_STATE_NOTIFICATION
, *PIO_SESSION_STATE_NOTIFICATION
;
4696 typedef enum _IO_CONTAINER_INFORMATION_CLASS
{
4697 IoSessionStateInformation
,
4698 IoMaxContainerInformationClass
4699 } IO_CONTAINER_INFORMATION_CLASS
;
4701 typedef struct _IO_SESSION_STATE_INFORMATION
{
4703 IO_SESSION_STATE SessionState
;
4704 BOOLEAN LocalSession
;
4705 } IO_SESSION_STATE_INFORMATION
, *PIO_SESSION_STATE_INFORMATION
;
4707 #if (NTDDI_VERSION >= NTDDI_WIN7)
4710 (NTAPI
*PIO_CONTAINER_NOTIFICATION_FUNCTION
)(
4714 (NTAPI IO_SESSION_NOTIFICATION_FUNCTION
)(
4715 _In_ PVOID SessionObject
,
4716 _In_ PVOID IoObject
,
4719 _In_reads_bytes_opt_(PayloadLength
) PVOID NotificationPayload
,
4720 _In_ ULONG PayloadLength
);
4722 typedef IO_SESSION_NOTIFICATION_FUNCTION
*PIO_SESSION_NOTIFICATION_FUNCTION
;
4726 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
4728 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
4730 BOOLEAN Reserved
[3];
4731 volatile LONG IoCount
;
4733 } IO_REMOVE_LOCK_COMMON_BLOCK
;
4735 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
4738 LONGLONG MaxLockedTicks
;
4740 LIST_ENTRY LockList
;
4742 volatile LONG LowMemoryCount
;
4745 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
4746 } IO_REMOVE_LOCK_DBG_BLOCK
;
4748 typedef struct _IO_REMOVE_LOCK
{
4749 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
4751 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
4753 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
4755 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
4757 _Function_class_(IO_WORKITEM_ROUTINE
)
4758 _IRQL_requires_(PASSIVE_LEVEL
)
4759 _IRQL_requires_same_
4761 (NTAPI IO_WORKITEM_ROUTINE
)(
4762 _In_ PDEVICE_OBJECT DeviceObject
,
4763 _In_opt_ PVOID Context
);
4764 typedef IO_WORKITEM_ROUTINE
*PIO_WORKITEM_ROUTINE
;
4767 (NTAPI IO_WORKITEM_ROUTINE_EX
)(
4768 _In_ PVOID IoObject
,
4769 _In_opt_ PVOID Context
,
4770 _In_ PIO_WORKITEM IoWorkItem
);
4771 typedef IO_WORKITEM_ROUTINE_EX
*PIO_WORKITEM_ROUTINE_EX
;
4773 typedef struct _SHARE_ACCESS
{
4781 } SHARE_ACCESS
, *PSHARE_ACCESS
;
4783 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
4784 inheritance, even from a struct renders the type non-POD. So we use
4786 #define PCI_COMMON_HEADER_LAYOUT \
4795 UCHAR CacheLineSize; \
4796 UCHAR LatencyTimer; \
4800 struct _PCI_HEADER_TYPE_0 { \
4801 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
4803 USHORT SubVendorID; \
4804 USHORT SubSystemID; \
4805 ULONG ROMBaseAddress; \
4806 UCHAR CapabilitiesPtr; \
4807 UCHAR Reserved1[3]; \
4809 UCHAR InterruptLine; \
4810 UCHAR InterruptPin; \
4811 UCHAR MinimumGrant; \
4812 UCHAR MaximumLatency; \
4814 struct _PCI_HEADER_TYPE_1 { \
4815 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
4817 UCHAR SecondaryBus; \
4818 UCHAR SubordinateBus; \
4819 UCHAR SecondaryLatency; \
4822 USHORT SecondaryStatus; \
4823 USHORT MemoryBase; \
4824 USHORT MemoryLimit; \
4825 USHORT PrefetchBase; \
4826 USHORT PrefetchLimit; \
4827 ULONG PrefetchBaseUpper32; \
4828 ULONG PrefetchLimitUpper32; \
4829 USHORT IOBaseUpper16; \
4830 USHORT IOLimitUpper16; \
4831 UCHAR CapabilitiesPtr; \
4832 UCHAR Reserved1[3]; \
4833 ULONG ROMBaseAddress; \
4834 UCHAR InterruptLine; \
4835 UCHAR InterruptPin; \
4836 USHORT BridgeControl; \
4838 struct _PCI_HEADER_TYPE_2 { \
4839 ULONG SocketRegistersBaseAddress; \
4840 UCHAR CapabilitiesPtr; \
4842 USHORT SecondaryStatus; \
4844 UCHAR SecondaryBus; \
4845 UCHAR SubordinateBus; \
4846 UCHAR SecondaryLatency; \
4850 } Range[PCI_TYPE2_ADDRESSES-1]; \
4851 UCHAR InterruptLine; \
4852 UCHAR InterruptPin; \
4853 USHORT BridgeControl; \
4857 typedef enum _CREATE_FILE_TYPE
{
4859 CreateFileTypeNamedPipe
,
4860 CreateFileTypeMailslot
4863 #define IO_FORCE_ACCESS_CHECK 0x001
4864 #define IO_NO_PARAMETER_CHECKING 0x100
4866 #define IO_REPARSE 0x0
4867 #define IO_REMOUNT 0x1
4869 typedef struct _IO_STATUS_BLOCK
{
4870 _ANONYMOUS_UNION
union {
4874 ULONG_PTR Information
;
4875 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
4878 typedef struct _IO_STATUS_BLOCK32
{
4881 } IO_STATUS_BLOCK32
, *PIO_STATUS_BLOCK32
;
4885 (NTAPI
*PIO_APC_ROUTINE
)(
4886 _In_ PVOID ApcContext
,
4887 _In_ PIO_STATUS_BLOCK IoStatusBlock
,
4888 _In_ ULONG Reserved
);
4890 #define PIO_APC_ROUTINE_DEFINED
4892 typedef enum _IO_SESSION_EVENT
{
4893 IoSessionEventIgnore
= 0,
4894 IoSessionEventCreated
,
4895 IoSessionEventTerminated
,
4896 IoSessionEventConnected
,
4897 IoSessionEventDisconnected
,
4898 IoSessionEventLogon
,
4899 IoSessionEventLogoff
,
4901 } IO_SESSION_EVENT
, *PIO_SESSION_EVENT
;
4903 #define IO_SESSION_STATE_ALL_EVENTS 0xffffffff
4904 #define IO_SESSION_STATE_CREATION_EVENT 0x00000001
4905 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
4906 #define IO_SESSION_STATE_CONNECT_EVENT 0x00000004
4907 #define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008
4908 #define IO_SESSION_STATE_LOGON_EVENT 0x00000010
4909 #define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020
4911 #define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f
4913 #define IO_SESSION_MAX_PAYLOAD_SIZE 256L
4915 typedef struct _IO_SESSION_CONNECT_INFO
{
4917 BOOLEAN LocalSession
;
4918 } IO_SESSION_CONNECT_INFO
, *PIO_SESSION_CONNECT_INFO
;
4920 #define EVENT_INCREMENT 1
4921 #define IO_NO_INCREMENT 0
4922 #define IO_CD_ROM_INCREMENT 1
4923 #define IO_DISK_INCREMENT 1
4924 #define IO_KEYBOARD_INCREMENT 6
4925 #define IO_MAILSLOT_INCREMENT 2
4926 #define IO_MOUSE_INCREMENT 6
4927 #define IO_NAMED_PIPE_INCREMENT 2
4928 #define IO_NETWORK_INCREMENT 2
4929 #define IO_PARALLEL_INCREMENT 1
4930 #define IO_SERIAL_INCREMENT 2
4931 #define IO_SOUND_INCREMENT 8
4932 #define IO_VIDEO_INCREMENT 1
4933 #define SEMAPHORE_INCREMENT 1
4935 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
4937 typedef struct _BOOTDISK_INFORMATION
{
4938 LONGLONG BootPartitionOffset
;
4939 LONGLONG SystemPartitionOffset
;
4940 ULONG BootDeviceSignature
;
4941 ULONG SystemDeviceSignature
;
4942 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
4944 typedef struct _BOOTDISK_INFORMATION_EX
{
4945 LONGLONG BootPartitionOffset
;
4946 LONGLONG SystemPartitionOffset
;
4947 ULONG BootDeviceSignature
;
4948 ULONG SystemDeviceSignature
;
4949 GUID BootDeviceGuid
;
4950 GUID SystemDeviceGuid
;
4951 BOOLEAN BootDeviceIsGpt
;
4952 BOOLEAN SystemDeviceIsGpt
;
4953 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
4955 #if (NTDDI_VERSION >= NTDDI_WIN7)
4957 typedef struct _LOADER_PARTITION_INFORMATION_EX
{
4958 ULONG PartitionStyle
;
4959 ULONG PartitionNumber
;
4960 _ANONYMOUS_UNION
union {
4965 } LOADER_PARTITION_INFORMATION_EX
, *PLOADER_PARTITION_INFORMATION_EX
;
4967 typedef struct _BOOTDISK_INFORMATION_LITE
{
4968 ULONG NumberEntries
;
4969 LOADER_PARTITION_INFORMATION_EX Entries
[1];
4970 } BOOTDISK_INFORMATION_LITE
, *PBOOTDISK_INFORMATION_LITE
;
4974 #if (NTDDI_VERSION >= NTDDI_VISTA)
4975 typedef struct _BOOTDISK_INFORMATION_LITE
{
4976 ULONG BootDeviceSignature
;
4977 ULONG SystemDeviceSignature
;
4978 GUID BootDeviceGuid
;
4979 GUID SystemDeviceGuid
;
4980 BOOLEAN BootDeviceIsGpt
;
4981 BOOLEAN SystemDeviceIsGpt
;
4982 } BOOTDISK_INFORMATION_LITE
, *PBOOTDISK_INFORMATION_LITE
;
4983 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4985 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4987 #include <pshpack1.h>
4989 typedef struct _EISA_MEMORY_TYPE
{
4996 UCHAR MoreEntries
:1;
4997 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
4999 typedef struct _EISA_MEMORY_CONFIGURATION
{
5000 EISA_MEMORY_TYPE ConfigurationByte
;
5002 USHORT AddressLowWord
;
5003 UCHAR AddressHighByte
;
5005 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
5007 typedef struct _EISA_IRQ_DESCRIPTOR
{
5010 UCHAR LevelTriggered
:1;
5012 UCHAR MoreEntries
:1;
5013 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
5015 typedef struct _EISA_IRQ_CONFIGURATION
{
5016 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
5018 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
5020 typedef struct _DMA_CONFIGURATION_BYTE0
{
5024 UCHAR MoreEntries
:1;
5025 } DMA_CONFIGURATION_BYTE0
;
5027 typedef struct _DMA_CONFIGURATION_BYTE1
{
5029 UCHAR TransferSize
:2;
5032 } DMA_CONFIGURATION_BYTE1
;
5034 typedef struct _EISA_DMA_CONFIGURATION
{
5035 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
5036 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
5037 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
5039 typedef struct _EISA_PORT_DESCRIPTOR
{
5040 UCHAR NumberPorts
:5;
5043 UCHAR MoreEntries
:1;
5044 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
5046 typedef struct _EISA_PORT_CONFIGURATION
{
5047 EISA_PORT_DESCRIPTOR Configuration
;
5049 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
5051 typedef struct _CM_EISA_SLOT_INFORMATION
{
5054 UCHAR MajorRevision
;
5055 UCHAR MinorRevision
;
5057 UCHAR NumberFunctions
;
5058 UCHAR FunctionInformation
;
5060 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
5062 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
5066 UCHAR MinorRevision
;
5067 UCHAR MajorRevision
;
5068 UCHAR Selections
[26];
5069 UCHAR FunctionFlags
;
5070 UCHAR TypeString
[80];
5071 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
5072 EISA_IRQ_CONFIGURATION EisaIrq
[7];
5073 EISA_DMA_CONFIGURATION EisaDma
[4];
5074 EISA_PORT_CONFIGURATION EisaPort
[20];
5075 UCHAR InitializationData
[60];
5076 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
5078 #include <poppack.h>
5080 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
5082 #define EISA_FUNCTION_ENABLED 0x80
5083 #define EISA_FREE_FORM_DATA 0x40
5084 #define EISA_HAS_PORT_INIT_ENTRY 0x20
5085 #define EISA_HAS_PORT_RANGE 0x10
5086 #define EISA_HAS_DMA_ENTRY 0x08
5087 #define EISA_HAS_IRQ_ENTRY 0x04
5088 #define EISA_HAS_MEMORY_ENTRY 0x02
5089 #define EISA_HAS_TYPE_ENTRY 0x01
5090 #define EISA_HAS_INFORMATION \
5091 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
5092 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
5094 #define EISA_MORE_ENTRIES 0x80
5095 #define EISA_SYSTEM_MEMORY 0x00
5096 #define EISA_MEMORY_TYPE_RAM 0x01
5098 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
5100 #define EISA_INVALID_SLOT 0x80
5101 #define EISA_INVALID_FUNCTION 0x81
5102 #define EISA_INVALID_CONFIGURATION 0x82
5103 #define EISA_EMPTY_SLOT 0x83
5104 #define EISA_INVALID_BIOS_CALL 0x86
5107 ** Plug and Play structures
5111 (NTAPI
*PINTERFACE_REFERENCE
)(
5115 (NTAPI
*PINTERFACE_DEREFERENCE
)(
5118 _Function_class_(TRANSLATE_BUS_ADDRESS
)
5119 _IRQL_requires_same_
5121 (NTAPI TRANSLATE_BUS_ADDRESS
)(
5122 _Inout_opt_ PVOID Context
,
5123 _In_ PHYSICAL_ADDRESS BusAddress
,
5125 _Out_ PULONG AddressSpace
,
5126 _Out_ PPHYSICAL_ADDRESS TranslatedAddress
);
5127 typedef TRANSLATE_BUS_ADDRESS
*PTRANSLATE_BUS_ADDRESS
;
5129 _Function_class_(GET_DMA_ADAPTER
)
5130 _IRQL_requires_same_
5131 typedef struct _DMA_ADAPTER
*
5132 (NTAPI GET_DMA_ADAPTER
)(
5133 _Inout_opt_ PVOID Context
,
5134 _In_
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
5135 _Out_ PULONG NumberOfMapRegisters
);
5136 typedef GET_DMA_ADAPTER
*PGET_DMA_ADAPTER
;
5138 _Function_class_(GET_SET_DEVICE_DATA
)
5139 _IRQL_requires_same_
5141 (NTAPI GET_SET_DEVICE_DATA
)(
5142 _Inout_opt_ PVOID Context
,
5143 _In_ ULONG DataType
,
5144 _Inout_updates_bytes_(Length
) PVOID Buffer
,
5147 typedef GET_SET_DEVICE_DATA
*PGET_SET_DEVICE_DATA
;
5149 typedef enum _DEVICE_INSTALL_STATE
{
5150 InstallStateInstalled
,
5151 InstallStateNeedsReinstall
,
5152 InstallStateFailedInstall
,
5153 InstallStateFinishInstall
5154 } DEVICE_INSTALL_STATE
, *PDEVICE_INSTALL_STATE
;
5156 typedef struct _LEGACY_BUS_INFORMATION
{
5158 INTERFACE_TYPE LegacyBusType
;
5160 } LEGACY_BUS_INFORMATION
, *PLEGACY_BUS_INFORMATION
;
5162 typedef enum _DEVICE_REMOVAL_POLICY
{
5163 RemovalPolicyExpectNoRemoval
= 1,
5164 RemovalPolicyExpectOrderlyRemoval
= 2,
5165 RemovalPolicyExpectSurpriseRemoval
= 3
5166 } DEVICE_REMOVAL_POLICY
, *PDEVICE_REMOVAL_POLICY
;
5169 (NTAPI
*PREENUMERATE_SELF
)(
5170 _In_ PVOID Context
);
5172 typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD
{
5176 PINTERFACE_REFERENCE InterfaceReference
;
5177 PINTERFACE_DEREFERENCE InterfaceDereference
;
5178 PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf
;
5179 } REENUMERATE_SELF_INTERFACE_STANDARD
, *PREENUMERATE_SELF_INTERFACE_STANDARD
;
5182 (NTAPI
*PIO_DEVICE_EJECT_CALLBACK
)(
5183 _In_ NTSTATUS Status
,
5184 _Inout_opt_ PVOID Context
);
5186 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1
5188 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
5189 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
5190 #define PCI_USE_REVISION 0x00000002
5191 #define PCI_USE_VENDEV_IDS 0x00000004
5192 #define PCI_USE_CLASS_SUBCLASS 0x00000008
5193 #define PCI_USE_PROGIF 0x00000010
5194 #define PCI_USE_LOCAL_BUS 0x00000020
5195 #define PCI_USE_LOCAL_DEVICE 0x00000040
5197 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS
{
5208 } PCI_DEVICE_PRESENCE_PARAMETERS
, *PPCI_DEVICE_PRESENCE_PARAMETERS
;
5210 _IRQL_requires_max_(PASSIVE_LEVEL
)
5211 _Must_inspect_result_
5213 (NTAPI PCI_IS_DEVICE_PRESENT
)(
5214 _In_ USHORT VendorID
,
5215 _In_ USHORT DeviceID
,
5216 _In_ UCHAR RevisionID
,
5217 _In_ USHORT SubVendorID
,
5218 _In_ USHORT SubSystemID
,
5220 typedef PCI_IS_DEVICE_PRESENT
*PPCI_IS_DEVICE_PRESENT
;
5222 _IRQL_requires_max_(PASSIVE_LEVEL
)
5223 _Must_inspect_result_
5225 (NTAPI PCI_IS_DEVICE_PRESENT_EX
)(
5227 _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
);
5228 typedef PCI_IS_DEVICE_PRESENT_EX
*PPCI_IS_DEVICE_PRESENT_EX
;
5230 typedef struct _BUS_INTERFACE_STANDARD
{
5234 PINTERFACE_REFERENCE InterfaceReference
;
5235 PINTERFACE_DEREFERENCE InterfaceDereference
;
5236 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
5237 PGET_DMA_ADAPTER GetDmaAdapter
;
5238 PGET_SET_DEVICE_DATA SetBusData
;
5239 PGET_SET_DEVICE_DATA GetBusData
;
5240 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
5242 typedef struct _PCI_DEVICE_PRESENT_INTERFACE
{
5246 PINTERFACE_REFERENCE InterfaceReference
;
5247 PINTERFACE_DEREFERENCE InterfaceDereference
;
5248 PPCI_IS_DEVICE_PRESENT IsDevicePresent
;
5249 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx
;
5250 } PCI_DEVICE_PRESENT_INTERFACE
, *PPCI_DEVICE_PRESENT_INTERFACE
;
5252 _Struct_size_bytes_(Size
)
5253 typedef struct _DEVICE_CAPABILITIES
{
5254 _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES
)) USHORT Size
;
5258 ULONG LockSupported
:1;
5259 ULONG EjectSupported
:1;
5263 ULONG SilentInstall
:1;
5264 ULONG RawDeviceOK
:1;
5265 ULONG SurpriseRemovalOK
:1;
5270 ULONG HardwareDisabled
:1;
5272 ULONG WarmEjectSupported
:1;
5273 ULONG NoDisplayInUI
:1;
5277 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
5278 SYSTEM_POWER_STATE SystemWake
;
5279 DEVICE_POWER_STATE DeviceWake
;
5283 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
5285 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
5289 GUID InterfaceClassGuid
;
5290 PUNICODE_STRING SymbolicLinkName
;
5291 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
5293 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
5297 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
5301 typedef struct _INTERFACE
{
5305 PINTERFACE_REFERENCE InterfaceReference
;
5306 PINTERFACE_DEREFERENCE InterfaceDereference
;
5307 } INTERFACE
, *PINTERFACE
;
5309 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
5313 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
5315 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
5317 /* PNP_DEVICE_STATE */
5319 #define PNP_DEVICE_DISABLED 0x00000001
5320 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
5321 #define PNP_DEVICE_FAILED 0x00000004
5322 #define PNP_DEVICE_REMOVED 0x00000008
5323 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
5324 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
5326 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
5330 struct _FILE_OBJECT
*FileObject
;
5331 LONG NameBufferOffset
;
5332 UCHAR CustomDataBuffer
[1];
5333 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
5335 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
5339 struct _FILE_OBJECT
*FileObject
;
5340 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
5342 #if (NTDDI_VERSION >= NTDDI_VISTA)
5343 #include <devpropdef.h>
5344 #define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001
5347 #define PNP_REPLACE_NO_MAP MAXLONGLONG
5349 _Must_inspect_result_
5351 (NTAPI
*PREPLACE_MAP_MEMORY
)(
5352 _In_ PHYSICAL_ADDRESS TargetPhysicalAddress
,
5353 _In_ PHYSICAL_ADDRESS SparePhysicalAddress
,
5354 _Inout_ PLARGE_INTEGER NumberOfBytes
,
5355 _Outptr_ PVOID
*TargetAddress
,
5356 _Outptr_ PVOID
*SpareAddress
);
5358 typedef struct _PNP_REPLACE_MEMORY_LIST
{
5359 ULONG AllocatedCount
;
5361 ULONGLONG TotalLength
;
5363 PHYSICAL_ADDRESS Address
;
5365 } Ranges
[ANYSIZE_ARRAY
];
5366 } PNP_REPLACE_MEMORY_LIST
, *PPNP_REPLACE_MEMORY_LIST
;
5368 typedef struct _PNP_REPLACE_PROCESSOR_LIST
{
5369 PKAFFINITY Affinity
;
5370 _Field_range_(<=, MAXIMUM_GROUPS
) ULONG GroupCount
;
5371 ULONG AllocatedCount
;
5373 ULONG ApicIds
[ANYSIZE_ARRAY
];
5374 } PNP_REPLACE_PROCESSOR_LIST
, *PPNP_REPLACE_PROCESSOR_LIST
;
5376 typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1
{
5377 KAFFINITY AffinityMask
;
5378 ULONG AllocatedCount
;
5380 ULONG ApicIds
[ANYSIZE_ARRAY
];
5381 } PNP_REPLACE_PROCESSOR_LIST_V1
, *PPNP_REPLACE_PROCESSOR_LIST_V1
;
5383 #define PNP_REPLACE_PARAMETERS_VERSION 2
5385 typedef struct _PNP_REPLACE_PARAMETERS
{
5390 PPNP_REPLACE_PROCESSOR_LIST TargetProcessors
;
5391 PPNP_REPLACE_PROCESSOR_LIST SpareProcessors
;
5392 PPNP_REPLACE_MEMORY_LIST TargetMemory
;
5393 PPNP_REPLACE_MEMORY_LIST SpareMemory
;
5394 PREPLACE_MAP_MEMORY MapMemory
;
5395 } PNP_REPLACE_PARAMETERS
, *PPNP_REPLACE_PARAMETERS
;
5398 (NTAPI
*PREPLACE_UNLOAD
)(
5401 _Must_inspect_result_
5403 (NTAPI
*PREPLACE_BEGIN
)(
5404 _In_ PPNP_REPLACE_PARAMETERS Parameters
,
5405 _Outptr_ PVOID
*Context
);
5407 _Must_inspect_result_
5409 (NTAPI
*PREPLACE_END
)(
5410 _In_ PVOID Context
);
5412 _Must_inspect_result_
5414 (NTAPI
*PREPLACE_MIRROR_PHYSICAL_MEMORY
)(
5416 _In_ PHYSICAL_ADDRESS PhysicalAddress
,
5417 _In_ LARGE_INTEGER ByteCount
);
5419 _Must_inspect_result_
5421 (NTAPI
*PREPLACE_SET_PROCESSOR_ID
)(
5424 _In_ BOOLEAN Target
);
5426 _Must_inspect_result_
5428 (NTAPI
*PREPLACE_SWAP
)(
5429 _In_ PVOID Context
);
5431 _Must_inspect_result_
5433 (NTAPI
*PREPLACE_INITIATE_HARDWARE_MIRROR
)(
5434 _In_ PVOID Context
);
5436 _Must_inspect_result_
5438 (NTAPI
*PREPLACE_MIRROR_PLATFORM_MEMORY
)(
5439 _In_ PVOID Context
);
5441 _Must_inspect_result_
5443 (NTAPI
*PREPLACE_GET_MEMORY_DESTINATION
)(
5445 _In_ PHYSICAL_ADDRESS SourceAddress
,
5446 _Out_ PPHYSICAL_ADDRESS DestinationAddress
);
5448 _Must_inspect_result_
5450 (NTAPI
*PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE
)(
5452 _In_ BOOLEAN Enable
);
5454 #define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1
5455 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
5456 FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
5458 #define PNP_REPLACE_MEMORY_SUPPORTED 0x0001
5459 #define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002
5460 #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004
5461 #define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008
5462 #define PNP_REPLACE_HARDWARE_QUIESCE 0x0010
5464 typedef struct _PNP_REPLACE_DRIVER_INTERFACE
{
5468 PREPLACE_UNLOAD Unload
;
5469 PREPLACE_BEGIN BeginReplace
;
5470 PREPLACE_END EndReplace
;
5471 PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory
;
5472 PREPLACE_SET_PROCESSOR_ID SetProcessorId
;
5474 PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror
;
5475 PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory
;
5476 PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination
;
5477 PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce
;
5478 } PNP_REPLACE_DRIVER_INTERFACE
, *PPNP_REPLACE_DRIVER_INTERFACE
;
5480 _Must_inspect_result_
5482 (NTAPI
*PREPLACE_DRIVER_INIT
)(
5483 _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface
,
5486 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
5487 DeviceUsageTypeUndefined
,
5488 DeviceUsageTypePaging
,
5489 DeviceUsageTypeHibernation
,
5490 DeviceUsageTypeDumpFile
5491 } DEVICE_USAGE_NOTIFICATION_TYPE
;
5493 typedef struct _POWER_SEQUENCE
{
5497 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
5500 #define __string_type 0x1000
5501 #define __guid_type 0x2000
5502 #define __multiString_type 0x4000
5504 #define __string_type 0
5505 #define __guid_type 0
5506 #define __multiString_type 0
5510 DevicePropertyDeviceDescription
= 0x0 | __string_type
,
5511 DevicePropertyHardwareID
= 0x1 | __multiString_type
,
5512 DevicePropertyCompatibleIDs
= 0x2 | __multiString_type
,
5513 DevicePropertyBootConfiguration
= 0x3,
5514 DevicePropertyBootConfigurationTranslated
= 0x4,
5515 DevicePropertyClassName
= 0x5 | __string_type
,
5516 DevicePropertyClassGuid
= 0x6 | __string_type
,
5517 DevicePropertyDriverKeyName
= 0x7 | __string_type
,
5518 DevicePropertyManufacturer
= 0x8 | __string_type
,
5519 DevicePropertyFriendlyName
= 0x9 | __string_type
,
5520 DevicePropertyLocationInformation
= 0xa | __string_type
,
5521 DevicePropertyPhysicalDeviceObjectName
= 0xb | __string_type
,
5522 DevicePropertyBusTypeGuid
= 0xc | __guid_type
,
5523 DevicePropertyLegacyBusType
= 0xd,
5524 DevicePropertyBusNumber
= 0xe,
5525 DevicePropertyEnumeratorName
= 0xf | __string_type
,
5526 DevicePropertyAddress
= 0x10,
5527 DevicePropertyUINumber
= 0x11,
5528 DevicePropertyInstallState
= 0x12,
5529 DevicePropertyRemovalPolicy
= 0x13,
5530 DevicePropertyResourceRequirements
= 0x14,
5531 DevicePropertyAllocatedResources
= 0x15,
5532 DevicePropertyContainerID
= 0x16 | __string_type
5533 } DEVICE_REGISTRY_PROPERTY
;
5535 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
5536 EventCategoryReserved
,
5537 EventCategoryHardwareProfileChange
,
5538 EventCategoryDeviceInterfaceChange
,
5539 EventCategoryTargetDeviceChange
5540 } IO_NOTIFICATION_EVENT_CATEGORY
;
5542 typedef enum _IO_PRIORITY_HINT
{
5543 IoPriorityVeryLow
= 0,
5551 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
5553 _Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE
)
5554 _IRQL_requires_max_(PASSIVE_LEVEL
)
5556 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
5557 _In_ PVOID NotificationStructure
,
5558 _Inout_opt_ PVOID Context
);
5559 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
;
5561 _Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK
)
5562 _IRQL_requires_same_
5564 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK
)(
5565 _Inout_opt_ PVOID Context
);
5566 typedef DEVICE_CHANGE_COMPLETE_CALLBACK
*PDEVICE_CHANGE_COMPLETE_CALLBACK
;
5568 typedef enum _FILE_INFORMATION_CLASS
{
5569 FileDirectoryInformation
= 1,
5570 FileFullDirectoryInformation
,
5571 FileBothDirectoryInformation
,
5572 FileBasicInformation
,
5573 FileStandardInformation
,
5574 FileInternalInformation
,
5576 FileAccessInformation
,
5577 FileNameInformation
,
5578 FileRenameInformation
,
5579 FileLinkInformation
,
5580 FileNamesInformation
,
5581 FileDispositionInformation
,
5582 FilePositionInformation
,
5583 FileFullEaInformation
,
5584 FileModeInformation
,
5585 FileAlignmentInformation
,
5587 FileAllocationInformation
,
5588 FileEndOfFileInformation
,
5589 FileAlternateNameInformation
,
5590 FileStreamInformation
,
5591 FilePipeInformation
,
5592 FilePipeLocalInformation
,
5593 FilePipeRemoteInformation
,
5594 FileMailslotQueryInformation
,
5595 FileMailslotSetInformation
,
5596 FileCompressionInformation
,
5597 FileObjectIdInformation
,
5598 FileCompletionInformation
,
5599 FileMoveClusterInformation
,
5600 FileQuotaInformation
,
5601 FileReparsePointInformation
,
5602 FileNetworkOpenInformation
,
5603 FileAttributeTagInformation
,
5604 FileTrackingInformation
,
5605 FileIdBothDirectoryInformation
,
5606 FileIdFullDirectoryInformation
,
5607 FileValidDataLengthInformation
,
5608 FileShortNameInformation
,
5609 #if (NTDDI_VERSION >= NTDDI_VISTA)
5610 FileIoCompletionNotificationInformation
,
5611 FileIoStatusBlockRangeInformation
,
5612 FileIoPriorityHintInformation
,
5613 FileSfioReserveInformation
,
5614 FileSfioVolumeInformation
,
5615 FileHardLinkInformation
,
5616 FileProcessIdsUsingFileInformation
,
5617 FileNormalizedNameInformation
,
5618 FileNetworkPhysicalNameInformation
,
5620 #if (NTDDI_VERSION >= NTDDI_WIN7)
5621 FileIdGlobalTxDirectoryInformation
,
5622 FileIsRemoteDeviceInformation
,
5623 FileAttributeCacheInformation
,
5624 FileNumaNodeInformation
,
5625 FileStandardLinkInformation
,
5626 FileRemoteProtocolInformation
,
5628 FileMaximumInformation
5629 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
5631 typedef struct _FILE_POSITION_INFORMATION
{
5632 LARGE_INTEGER CurrentByteOffset
;
5633 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
5635 typedef struct _FILE_BASIC_INFORMATION
{
5636 LARGE_INTEGER CreationTime
;
5637 LARGE_INTEGER LastAccessTime
;
5638 LARGE_INTEGER LastWriteTime
;
5639 LARGE_INTEGER ChangeTime
;
5640 ULONG FileAttributes
;
5641 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
5643 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION
{
5644 IO_PRIORITY_HINT PriorityHint
;
5645 } FILE_IO_PRIORITY_HINT_INFORMATION
, *PFILE_IO_PRIORITY_HINT_INFORMATION
;
5647 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION
{
5649 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION
, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION
;
5651 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION
{
5652 PUCHAR IoStatusBlockRange
;
5654 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION
, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION
;
5656 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION
{
5658 } FILE_IS_REMOTE_DEVICE_INFORMATION
, *PFILE_IS_REMOTE_DEVICE_INFORMATION
;
5660 typedef struct _FILE_NUMA_NODE_INFORMATION
{
5662 } FILE_NUMA_NODE_INFORMATION
, *PFILE_NUMA_NODE_INFORMATION
;
5664 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION
{
5665 ULONG NumberOfProcessIdsInList
;
5666 ULONG_PTR ProcessIdList
[1];
5667 } FILE_PROCESS_IDS_USING_FILE_INFORMATION
, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION
;
5669 typedef struct _FILE_STANDARD_INFORMATION
{
5670 LARGE_INTEGER AllocationSize
;
5671 LARGE_INTEGER EndOfFile
;
5672 ULONG NumberOfLinks
;
5673 BOOLEAN DeletePending
;
5675 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
5677 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
5678 LARGE_INTEGER CreationTime
;
5679 LARGE_INTEGER LastAccessTime
;
5680 LARGE_INTEGER LastWriteTime
;
5681 LARGE_INTEGER ChangeTime
;
5682 LARGE_INTEGER AllocationSize
;
5683 LARGE_INTEGER EndOfFile
;
5684 ULONG FileAttributes
;
5685 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
5687 typedef enum _FSINFOCLASS
{
5688 FileFsVolumeInformation
= 1,
5689 FileFsLabelInformation
,
5690 FileFsSizeInformation
,
5691 FileFsDeviceInformation
,
5692 FileFsAttributeInformation
,
5693 FileFsControlInformation
,
5694 FileFsFullSizeInformation
,
5695 FileFsObjectIdInformation
,
5696 FileFsDriverPathInformation
,
5697 FileFsVolumeFlagsInformation
,
5698 FileFsMaximumInformation
5699 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
5701 typedef struct _FILE_FS_DEVICE_INFORMATION
{
5702 DEVICE_TYPE DeviceType
;
5703 ULONG Characteristics
;
5704 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
5706 typedef struct _FILE_FULL_EA_INFORMATION
{
5707 ULONG NextEntryOffset
;
5710 USHORT EaValueLength
;
5712 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
5714 typedef struct _FILE_SFIO_RESERVE_INFORMATION
{
5715 ULONG RequestsPerPeriod
;
5717 BOOLEAN RetryFailures
;
5718 BOOLEAN Discardable
;
5720 ULONG NumOutstandingRequests
;
5721 } FILE_SFIO_RESERVE_INFORMATION
, *PFILE_SFIO_RESERVE_INFORMATION
;
5723 typedef struct _FILE_SFIO_VOLUME_INFORMATION
{
5724 ULONG MaximumRequestsPerPeriod
;
5725 ULONG MinimumPeriod
;
5726 ULONG MinimumTransferSize
;
5727 } FILE_SFIO_VOLUME_INFORMATION
, *PFILE_SFIO_VOLUME_INFORMATION
;
5729 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1
5730 #define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2
5731 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4
5733 #define FM_LOCK_BIT (0x1)
5734 #define FM_LOCK_BIT_V (0x0)
5735 #define FM_LOCK_WAITER_WOKEN (0x2)
5736 #define FM_LOCK_WAITER_INC (0x4)
5738 _Function_class_(FAST_IO_CHECK_IF_POSSIBLE
)
5739 _IRQL_requires_same_
5741 (NTAPI FAST_IO_CHECK_IF_POSSIBLE
)(
5742 _In_
struct _FILE_OBJECT
*FileObject
,
5743 _In_ PLARGE_INTEGER FileOffset
,
5747 _In_ BOOLEAN CheckForReadOperation
,
5748 _Out_ PIO_STATUS_BLOCK IoStatus
,
5749 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5750 typedef FAST_IO_CHECK_IF_POSSIBLE
*PFAST_IO_CHECK_IF_POSSIBLE
;
5752 _Function_class_(FAST_IO_READ
)
5753 _IRQL_requires_same_
5755 (NTAPI FAST_IO_READ
)(
5756 _In_
struct _FILE_OBJECT
*FileObject
,
5757 _In_ PLARGE_INTEGER FileOffset
,
5762 _Out_ PIO_STATUS_BLOCK IoStatus
,
5763 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5764 typedef FAST_IO_READ
*PFAST_IO_READ
;
5766 _Function_class_(FAST_IO_WRITE
)
5767 _IRQL_requires_same_
5769 (NTAPI FAST_IO_WRITE
)(
5770 _In_
struct _FILE_OBJECT
*FileObject
,
5771 _In_ PLARGE_INTEGER FileOffset
,
5776 _Out_ PIO_STATUS_BLOCK IoStatus
,
5777 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5778 typedef FAST_IO_WRITE
*PFAST_IO_WRITE
;
5780 _Function_class_(FAST_IO_QUERY_BASIC_INFO
)
5781 _IRQL_requires_same_
5783 (NTAPI FAST_IO_QUERY_BASIC_INFO
)(
5784 _In_
struct _FILE_OBJECT
*FileObject
,
5786 _Out_ PFILE_BASIC_INFORMATION Buffer
,
5787 _Out_ PIO_STATUS_BLOCK IoStatus
,
5788 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5789 typedef FAST_IO_QUERY_BASIC_INFO
*PFAST_IO_QUERY_BASIC_INFO
;
5791 _Function_class_(FAST_IO_QUERY_STANDARD_INFO
)
5792 _IRQL_requires_same_
5794 (NTAPI FAST_IO_QUERY_STANDARD_INFO
)(
5795 _In_
struct _FILE_OBJECT
*FileObject
,
5797 _Out_ PFILE_STANDARD_INFORMATION Buffer
,
5798 _Out_ PIO_STATUS_BLOCK IoStatus
,
5799 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5800 typedef FAST_IO_QUERY_STANDARD_INFO
*PFAST_IO_QUERY_STANDARD_INFO
;
5802 _Function_class_(FAST_IO_LOCK
)
5803 _IRQL_requires_same_
5805 (NTAPI FAST_IO_LOCK
)(
5806 _In_
struct _FILE_OBJECT
*FileObject
,
5807 _In_ PLARGE_INTEGER FileOffset
,
5808 _In_ PLARGE_INTEGER Length
,
5809 _In_ PEPROCESS ProcessId
,
5811 _In_ BOOLEAN FailImmediately
,
5812 _In_ BOOLEAN ExclusiveLock
,
5813 _Out_ PIO_STATUS_BLOCK IoStatus
,
5814 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5815 typedef FAST_IO_LOCK
*PFAST_IO_LOCK
;
5817 _Function_class_(FAST_IO_UNLOCK_SINGLE
)
5818 _IRQL_requires_same_
5820 (NTAPI FAST_IO_UNLOCK_SINGLE
)(
5821 _In_
struct _FILE_OBJECT
*FileObject
,
5822 _In_ PLARGE_INTEGER FileOffset
,
5823 _In_ PLARGE_INTEGER Length
,
5824 _In_ PEPROCESS ProcessId
,
5826 _Out_ PIO_STATUS_BLOCK IoStatus
,
5827 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5828 typedef FAST_IO_UNLOCK_SINGLE
*PFAST_IO_UNLOCK_SINGLE
;
5830 _Function_class_(FAST_IO_UNLOCK_ALL
)
5831 _IRQL_requires_same_
5833 (NTAPI FAST_IO_UNLOCK_ALL
)(
5834 _In_
struct _FILE_OBJECT
*FileObject
,
5835 _In_ PEPROCESS ProcessId
,
5836 _Out_ PIO_STATUS_BLOCK IoStatus
,
5837 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5838 typedef FAST_IO_UNLOCK_ALL
*PFAST_IO_UNLOCK_ALL
;
5840 _Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY
)
5841 _IRQL_requires_same_
5843 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY
)(
5844 _In_
struct _FILE_OBJECT
*FileObject
,
5845 _In_ PVOID ProcessId
,
5847 _Out_ PIO_STATUS_BLOCK IoStatus
,
5848 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5849 typedef FAST_IO_UNLOCK_ALL_BY_KEY
*PFAST_IO_UNLOCK_ALL_BY_KEY
;
5851 _Function_class_(FAST_IO_DEVICE_CONTROL
)
5852 _IRQL_requires_same_
5854 (NTAPI FAST_IO_DEVICE_CONTROL
)(
5855 _In_
struct _FILE_OBJECT
*FileObject
,
5857 _In_opt_ PVOID InputBuffer
,
5858 _In_ ULONG InputBufferLength
,
5859 _Out_opt_ PVOID OutputBuffer
,
5860 _In_ ULONG OutputBufferLength
,
5861 _In_ ULONG IoControlCode
,
5862 _Out_ PIO_STATUS_BLOCK IoStatus
,
5863 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5864 typedef FAST_IO_DEVICE_CONTROL
*PFAST_IO_DEVICE_CONTROL
;
5866 _Function_class_(FAST_IO_ACQUIRE_FILE
)
5867 _IRQL_requires_same_
5869 (NTAPI FAST_IO_ACQUIRE_FILE
)(
5870 _In_
struct _FILE_OBJECT
*FileObject
);
5871 typedef FAST_IO_ACQUIRE_FILE
*PFAST_IO_ACQUIRE_FILE
;
5873 _Function_class_(FAST_IO_RELEASE_FILE
)
5874 _IRQL_requires_same_
5876 (NTAPI FAST_IO_RELEASE_FILE
)(
5877 _In_
struct _FILE_OBJECT
*FileObject
);
5878 typedef FAST_IO_RELEASE_FILE
*PFAST_IO_RELEASE_FILE
;
5880 _Function_class_(FAST_IO_DETACH_DEVICE
)
5881 _IRQL_requires_same_
5883 (NTAPI FAST_IO_DETACH_DEVICE
)(
5884 _In_
struct _DEVICE_OBJECT
*SourceDevice
,
5885 _In_
struct _DEVICE_OBJECT
*TargetDevice
);
5886 typedef FAST_IO_DETACH_DEVICE
*PFAST_IO_DETACH_DEVICE
;
5888 _Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO
)
5889 _IRQL_requires_same_
5891 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO
)(
5892 _In_
struct _FILE_OBJECT
*FileObject
,
5894 _Out_
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
5895 _Out_
struct _IO_STATUS_BLOCK
*IoStatus
,
5896 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5897 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
;
5899 _Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE
)
5900 _IRQL_requires_same_
5902 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
5903 _In_
struct _FILE_OBJECT
*FileObject
,
5904 _In_ PLARGE_INTEGER EndingOffset
,
5905 _Out_
struct _ERESOURCE
**ResourceToRelease
,
5906 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5907 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
;
5909 _Function_class_(FAST_IO_MDL_READ
)
5910 _IRQL_requires_same_
5912 (NTAPI FAST_IO_MDL_READ
)(
5913 _In_
struct _FILE_OBJECT
*FileObject
,
5914 _In_ PLARGE_INTEGER FileOffset
,
5917 _Out_ PMDL
*MdlChain
,
5918 _Out_ PIO_STATUS_BLOCK IoStatus
,
5919 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5920 typedef FAST_IO_MDL_READ
*PFAST_IO_MDL_READ
;
5922 _Function_class_(FAST_IO_MDL_READ_COMPLETE
)
5923 _IRQL_requires_same_
5925 (NTAPI FAST_IO_MDL_READ_COMPLETE
)(
5926 _In_
struct _FILE_OBJECT
*FileObject
,
5928 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5929 typedef FAST_IO_MDL_READ_COMPLETE
*PFAST_IO_MDL_READ_COMPLETE
;
5931 _Function_class_(FAST_IO_PREPARE_MDL_WRITE
)
5932 _IRQL_requires_same_
5934 (NTAPI FAST_IO_PREPARE_MDL_WRITE
)(
5935 _In_
struct _FILE_OBJECT
*FileObject
,
5936 _In_ PLARGE_INTEGER FileOffset
,
5939 _Out_ PMDL
*MdlChain
,
5940 _Out_ PIO_STATUS_BLOCK IoStatus
,
5941 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5942 typedef FAST_IO_PREPARE_MDL_WRITE
*PFAST_IO_PREPARE_MDL_WRITE
;
5944 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE
)
5945 _IRQL_requires_same_
5947 (NTAPI FAST_IO_MDL_WRITE_COMPLETE
)(
5948 _In_
struct _FILE_OBJECT
*FileObject
,
5949 _In_ PLARGE_INTEGER FileOffset
,
5951 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5952 typedef FAST_IO_MDL_WRITE_COMPLETE
*PFAST_IO_MDL_WRITE_COMPLETE
;
5954 _Function_class_(FAST_IO_READ_COMPRESSED
)
5955 _IRQL_requires_same_
5957 (NTAPI FAST_IO_READ_COMPRESSED
)(
5958 _In_
struct _FILE_OBJECT
*FileObject
,
5959 _In_ PLARGE_INTEGER FileOffset
,
5963 _Out_ PMDL
*MdlChain
,
5964 _Out_ PIO_STATUS_BLOCK IoStatus
,
5965 _Out_
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
5966 _In_ ULONG CompressedDataInfoLength
,
5967 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5968 typedef FAST_IO_READ_COMPRESSED
*PFAST_IO_READ_COMPRESSED
;
5970 _Function_class_(FAST_IO_WRITE_COMPRESSED
)
5971 _IRQL_requires_same_
5973 (NTAPI FAST_IO_WRITE_COMPRESSED
)(
5974 _In_
struct _FILE_OBJECT
*FileObject
,
5975 _In_ PLARGE_INTEGER FileOffset
,
5979 _Out_ PMDL
*MdlChain
,
5980 _Out_ PIO_STATUS_BLOCK IoStatus
,
5981 _In_
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
5982 _In_ ULONG CompressedDataInfoLength
,
5983 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5984 typedef FAST_IO_WRITE_COMPRESSED
*PFAST_IO_WRITE_COMPRESSED
;
5986 _Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED
)
5987 _IRQL_requires_same_
5989 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
5990 _In_
struct _FILE_OBJECT
*FileObject
,
5992 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5993 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
;
5995 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)
5996 _IRQL_requires_same_
5998 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
5999 _In_
struct _FILE_OBJECT
*FileObject
,
6000 _In_ PLARGE_INTEGER FileOffset
,
6002 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
6003 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
;
6005 _Function_class_(FAST_IO_QUERY_OPEN
)
6006 _IRQL_requires_same_
6008 (NTAPI FAST_IO_QUERY_OPEN
)(
6009 _Inout_
struct _IRP
*Irp
,
6010 _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
6011 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
6012 typedef FAST_IO_QUERY_OPEN
*PFAST_IO_QUERY_OPEN
;
6014 _Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE
)
6015 _IRQL_requires_same_
6017 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE
)(
6018 _In_
struct _FILE_OBJECT
*FileObject
,
6019 _In_
struct _ERESOURCE
*ResourceToRelease
,
6020 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
6021 typedef FAST_IO_RELEASE_FOR_MOD_WRITE
*PFAST_IO_RELEASE_FOR_MOD_WRITE
;
6023 _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH
)
6024 _IRQL_requires_same_
6026 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH
)(
6027 _In_
struct _FILE_OBJECT
*FileObject
,
6028 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
6029 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
;
6031 _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH
)
6032 _IRQL_requires_same_
6034 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH
)(
6035 _In_
struct _FILE_OBJECT
*FileObject
,
6036 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
6037 typedef FAST_IO_RELEASE_FOR_CCFLUSH
*PFAST_IO_RELEASE_FOR_CCFLUSH
;
6039 typedef struct _FAST_IO_DISPATCH
{
6040 ULONG SizeOfFastIoDispatch
;
6041 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
6042 PFAST_IO_READ FastIoRead
;
6043 PFAST_IO_WRITE FastIoWrite
;
6044 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
6045 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
6046 PFAST_IO_LOCK FastIoLock
;
6047 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
6048 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
6049 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
6050 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
6051 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
6052 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
6053 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
6054 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
6055 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
6056 PFAST_IO_MDL_READ MdlRead
;
6057 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
6058 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
6059 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
6060 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
6061 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
6062 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
6063 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
6064 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
6065 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
6066 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
6067 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
6068 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
6070 typedef struct _SECTION_OBJECT_POINTERS
{
6071 PVOID DataSectionObject
;
6072 PVOID SharedCacheMap
;
6073 PVOID ImageSectionObject
;
6074 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
6076 typedef struct _IO_COMPLETION_CONTEXT
{
6079 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
6081 /* FILE_OBJECT.Flags */
6082 #define FO_FILE_OPEN 0x00000001
6083 #define FO_SYNCHRONOUS_IO 0x00000002
6084 #define FO_ALERTABLE_IO 0x00000004
6085 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
6086 #define FO_WRITE_THROUGH 0x00000010
6087 #define FO_SEQUENTIAL_ONLY 0x00000020
6088 #define FO_CACHE_SUPPORTED 0x00000040
6089 #define FO_NAMED_PIPE 0x00000080
6090 #define FO_STREAM_FILE 0x00000100
6091 #define FO_MAILSLOT 0x00000200
6092 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
6093 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
6094 #define FO_DIRECT_DEVICE_OPEN 0x00000800
6095 #define FO_FILE_MODIFIED 0x00001000
6096 #define FO_FILE_SIZE_CHANGED 0x00002000
6097 #define FO_CLEANUP_COMPLETE 0x00004000
6098 #define FO_TEMPORARY_FILE 0x00008000
6099 #define FO_DELETE_ON_CLOSE 0x00010000
6100 #define FO_OPENED_CASE_SENSITIVE 0x00020000
6101 #define FO_HANDLE_CREATED 0x00040000
6102 #define FO_FILE_FAST_IO_READ 0x00080000
6103 #define FO_RANDOM_ACCESS 0x00100000
6104 #define FO_FILE_OPEN_CANCELLED 0x00200000
6105 #define FO_VOLUME_OPEN 0x00400000
6106 #define FO_REMOTE_ORIGIN 0x01000000
6107 #define FO_DISALLOW_EXCLUSIVE 0x02000000
6108 #define FO_SKIP_COMPLETION_PORT 0x02000000
6109 #define FO_SKIP_SET_EVENT 0x04000000
6110 #define FO_SKIP_SET_FAST_IO 0x08000000
6111 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
6114 #define VPB_MOUNTED 0x0001
6115 #define VPB_LOCKED 0x0002
6116 #define VPB_PERSISTENT 0x0004
6117 #define VPB_REMOVE_PENDING 0x0008
6118 #define VPB_RAW_MOUNT 0x0010
6119 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
6123 #define SL_FORCE_ACCESS_CHECK 0x01
6124 #define SL_OPEN_PAGING_FILE 0x02
6125 #define SL_OPEN_TARGET_DIRECTORY 0x04
6126 #define SL_STOP_ON_SYMLINK 0x08
6127 #define SL_CASE_SENSITIVE 0x80
6129 #define SL_KEY_SPECIFIED 0x01
6130 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
6131 #define SL_WRITE_THROUGH 0x04
6132 #define SL_FT_SEQUENTIAL_WRITE 0x08
6133 #define SL_FORCE_DIRECT_WRITE 0x10
6134 #define SL_REALTIME_STREAM 0x20
6136 #define SL_READ_ACCESS_GRANTED 0x01
6137 #define SL_WRITE_ACCESS_GRANTED 0x04
6139 #define SL_FAIL_IMMEDIATELY 0x01
6140 #define SL_EXCLUSIVE_LOCK 0x02
6142 #define SL_RESTART_SCAN 0x01
6143 #define SL_RETURN_SINGLE_ENTRY 0x02
6144 #define SL_INDEX_SPECIFIED 0x04
6146 #define SL_WATCH_TREE 0x01
6148 #define SL_ALLOW_RAW_MOUNT 0x01
6150 #define CTL_CODE(DeviceType, Function, Method, Access) \
6151 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
6153 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
6155 #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
6157 #define IRP_NOCACHE 0x00000001
6158 #define IRP_PAGING_IO 0x00000002
6159 #define IRP_MOUNT_COMPLETION 0x00000002
6160 #define IRP_SYNCHRONOUS_API 0x00000004
6161 #define IRP_ASSOCIATED_IRP 0x00000008
6162 #define IRP_BUFFERED_IO 0x00000010
6163 #define IRP_DEALLOCATE_BUFFER 0x00000020
6164 #define IRP_INPUT_OPERATION 0x00000040
6165 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
6166 #define IRP_CREATE_OPERATION 0x00000080
6167 #define IRP_READ_OPERATION 0x00000100
6168 #define IRP_WRITE_OPERATION 0x00000200
6169 #define IRP_CLOSE_OPERATION 0x00000400
6170 #define IRP_DEFER_IO_COMPLETION 0x00000800
6171 #define IRP_OB_QUERY_NAME 0x00001000
6172 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
6173 /* The following 2 are missing in latest WDK */
6174 #define IRP_RETRY_IO_COMPLETION 0x00004000
6175 #define IRP_CLASS_CACHE_OPERATION 0x00008000
6177 #define IRP_QUOTA_CHARGED 0x01
6178 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
6179 #define IRP_ALLOCATED_FIXED_SIZE 0x04
6180 #define IRP_LOOKASIDE_ALLOCATION 0x08
6183 ** IRP function codes
6186 #define IRP_MJ_CREATE 0x00
6187 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
6188 #define IRP_MJ_CLOSE 0x02
6189 #define IRP_MJ_READ 0x03
6190 #define IRP_MJ_WRITE 0x04
6191 #define IRP_MJ_QUERY_INFORMATION 0x05
6192 #define IRP_MJ_SET_INFORMATION 0x06
6193 #define IRP_MJ_QUERY_EA 0x07
6194 #define IRP_MJ_SET_EA 0x08
6195 #define IRP_MJ_FLUSH_BUFFERS 0x09
6196 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
6197 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
6198 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
6199 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
6200 #define IRP_MJ_DEVICE_CONTROL 0x0e
6201 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
6202 #define IRP_MJ_SCSI 0x0f
6203 #define IRP_MJ_SHUTDOWN 0x10
6204 #define IRP_MJ_LOCK_CONTROL 0x11
6205 #define IRP_MJ_CLEANUP 0x12
6206 #define IRP_MJ_CREATE_MAILSLOT 0x13
6207 #define IRP_MJ_QUERY_SECURITY 0x14
6208 #define IRP_MJ_SET_SECURITY 0x15
6209 #define IRP_MJ_POWER 0x16
6210 #define IRP_MJ_SYSTEM_CONTROL 0x17
6211 #define IRP_MJ_DEVICE_CHANGE 0x18
6212 #define IRP_MJ_QUERY_QUOTA 0x19
6213 #define IRP_MJ_SET_QUOTA 0x1a
6214 #define IRP_MJ_PNP 0x1b
6215 #define IRP_MJ_PNP_POWER 0x1b
6216 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
6218 #define IRP_MN_SCSI_CLASS 0x01
6220 #define IRP_MN_START_DEVICE 0x00
6221 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
6222 #define IRP_MN_REMOVE_DEVICE 0x02
6223 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
6224 #define IRP_MN_STOP_DEVICE 0x04
6225 #define IRP_MN_QUERY_STOP_DEVICE 0x05
6226 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
6228 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
6229 #define IRP_MN_QUERY_INTERFACE 0x08
6230 #define IRP_MN_QUERY_CAPABILITIES 0x09
6231 #define IRP_MN_QUERY_RESOURCES 0x0A
6232 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
6233 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
6234 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
6236 #define IRP_MN_READ_CONFIG 0x0F
6237 #define IRP_MN_WRITE_CONFIG 0x10
6238 #define IRP_MN_EJECT 0x11
6239 #define IRP_MN_SET_LOCK 0x12
6240 #define IRP_MN_QUERY_ID 0x13
6241 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
6242 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
6243 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
6244 #define IRP_MN_SURPRISE_REMOVAL 0x17
6245 #if (NTDDI_VERSION >= NTDDI_WIN7)
6246 #define IRP_MN_DEVICE_ENUMERATED 0x19
6249 #define IRP_MN_WAIT_WAKE 0x00
6250 #define IRP_MN_POWER_SEQUENCE 0x01
6251 #define IRP_MN_SET_POWER 0x02
6252 #define IRP_MN_QUERY_POWER 0x03
6254 #define IRP_MN_QUERY_ALL_DATA 0x00
6255 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
6256 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
6257 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
6258 #define IRP_MN_ENABLE_EVENTS 0x04
6259 #define IRP_MN_DISABLE_EVENTS 0x05
6260 #define IRP_MN_ENABLE_COLLECTION 0x06
6261 #define IRP_MN_DISABLE_COLLECTION 0x07
6262 #define IRP_MN_REGINFO 0x08
6263 #define IRP_MN_EXECUTE_METHOD 0x09
6265 #define IRP_MN_REGINFO_EX 0x0b
6267 typedef struct _FILE_OBJECT
{
6270 PDEVICE_OBJECT DeviceObject
;
6274 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
6275 PVOID PrivateCacheMap
;
6276 NTSTATUS FinalStatus
;
6277 struct _FILE_OBJECT
*RelatedFileObject
;
6278 BOOLEAN LockOperation
;
6279 BOOLEAN DeletePending
;
6281 BOOLEAN WriteAccess
;
6282 BOOLEAN DeleteAccess
;
6284 BOOLEAN SharedWrite
;
6285 BOOLEAN SharedDelete
;
6287 UNICODE_STRING FileName
;
6288 LARGE_INTEGER CurrentByteOffset
;
6289 volatile ULONG Waiters
;
6290 volatile ULONG Busy
;
6294 volatile PIO_COMPLETION_CONTEXT CompletionContext
;
6295 KSPIN_LOCK IrpListLock
;
6297 volatile PVOID FileObjectExtension
;
6298 } FILE_OBJECT
, *PFILE_OBJECT
;
6300 typedef struct _IO_ERROR_LOG_PACKET
{
6301 UCHAR MajorFunctionCode
;
6303 USHORT DumpDataSize
;
6304 USHORT NumberOfStrings
;
6305 USHORT StringOffset
;
6306 USHORT EventCategory
;
6308 ULONG UniqueErrorValue
;
6309 NTSTATUS FinalStatus
;
6310 ULONG SequenceNumber
;
6311 ULONG IoControlCode
;
6312 LARGE_INTEGER DeviceOffset
;
6314 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
6316 typedef struct _IO_ERROR_LOG_MESSAGE
{
6319 USHORT DriverNameLength
;
6320 LARGE_INTEGER TimeStamp
;
6321 ULONG DriverNameOffset
;
6322 IO_ERROR_LOG_PACKET EntryData
;
6323 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
6325 #define ERROR_LOG_LIMIT_SIZE 240
6326 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
6327 sizeof(IO_ERROR_LOG_PACKET) + \
6328 (sizeof(WCHAR) * 40))
6329 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
6330 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6331 #define IO_ERROR_LOG_MESSAGE_LENGTH \
6332 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
6333 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
6334 PORT_MAXIMUM_MESSAGE_LENGTH)
6335 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
6336 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6339 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
6341 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
6344 typedef enum _DMA_WIDTH
{
6349 } DMA_WIDTH
, *PDMA_WIDTH
;
6351 typedef enum _DMA_SPEED
{
6358 } DMA_SPEED
, *PDMA_SPEED
;
6360 /* DEVICE_DESCRIPTION.Version */
6362 #define DEVICE_DESCRIPTION_VERSION 0x0000
6363 #define DEVICE_DESCRIPTION_VERSION1 0x0001
6364 #define DEVICE_DESCRIPTION_VERSION2 0x0002
6366 typedef struct _DEVICE_DESCRIPTION
{
6369 BOOLEAN ScatterGather
;
6371 BOOLEAN AutoInitialize
;
6372 BOOLEAN Dma32BitAddresses
;
6373 BOOLEAN IgnoreCount
;
6375 BOOLEAN Dma64BitAddresses
;
6378 INTERFACE_TYPE InterfaceType
;
6381 ULONG MaximumLength
;
6383 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
6385 typedef enum _DEVICE_RELATION_TYPE
{
6390 TargetDeviceRelation
,
6393 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
6395 typedef struct _DEVICE_RELATIONS
{
6397 PDEVICE_OBJECT Objects
[1];
6398 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
6400 typedef struct _DEVOBJ_EXTENSION
{
6403 PDEVICE_OBJECT DeviceObject
;
6404 } DEVOBJ_EXTENSION
, *PDEVOBJ_EXTENSION
;
6406 typedef struct _SCATTER_GATHER_ELEMENT
{
6407 PHYSICAL_ADDRESS Address
;
6410 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
6412 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
6414 #if defined(_MSC_VER)
6415 #if _MSC_VER >= 1200
6416 #pragma warning(push)
6418 #pragma warning(disable:4200)
6419 #endif /* _MSC_VER */
6421 typedef struct _SCATTER_GATHER_LIST
{
6422 ULONG NumberOfElements
;
6424 SCATTER_GATHER_ELEMENT Elements
[1];
6425 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
6427 #if defined(_MSC_VER)
6428 #if _MSC_VER >= 1200
6429 #pragma warning(pop)
6431 #pragma warning(default:4200)
6433 #endif /* _MSC_VER */
6435 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
6437 struct _SCATTER_GATHER_LIST
;
6438 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
6440 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
6442 _Function_class_(DRIVER_ADD_DEVICE
)
6443 _IRQL_requires_(PASSIVE_LEVEL
)
6444 _IRQL_requires_same_
6445 _When_(return>=0, _Kernel_clear_do_init_(__yes
))
6447 (NTAPI DRIVER_ADD_DEVICE
)(
6448 _In_
struct _DRIVER_OBJECT
*DriverObject
,
6449 _In_
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
6450 typedef DRIVER_ADD_DEVICE
*PDRIVER_ADD_DEVICE
;
6452 typedef struct _DRIVER_EXTENSION
{
6453 struct _DRIVER_OBJECT
*DriverObject
;
6454 PDRIVER_ADD_DEVICE AddDevice
;
6456 UNICODE_STRING ServiceKeyName
;
6457 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
6459 #define DRVO_UNLOAD_INVOKED 0x00000001
6460 #define DRVO_LEGACY_DRIVER 0x00000002
6461 #define DRVO_BUILTIN_DRIVER 0x00000004
6463 _Function_class_(DRIVER_INITIALIZE
)
6464 _IRQL_requires_same_
6466 (NTAPI DRIVER_INITIALIZE
)(
6467 _In_
struct _DRIVER_OBJECT
*DriverObject
,
6468 _In_ PUNICODE_STRING RegistryPath
);
6469 typedef DRIVER_INITIALIZE
*PDRIVER_INITIALIZE
;
6471 _Function_class_(DRIVER_STARTIO
)
6472 _IRQL_always_function_min_(DISPATCH_LEVEL
)
6473 _IRQL_requires_(DISPATCH_LEVEL
)
6474 _IRQL_requires_same_
6476 (NTAPI DRIVER_STARTIO
)(
6477 _Inout_
struct _DEVICE_OBJECT
*DeviceObject
,
6478 _Inout_
struct _IRP
*Irp
);
6479 typedef DRIVER_STARTIO
*PDRIVER_STARTIO
;
6481 _Function_class_(DRIVER_UNLOAD
)
6482 _IRQL_requires_(PASSIVE_LEVEL
)
6483 _IRQL_requires_same_
6485 (NTAPI DRIVER_UNLOAD
)(
6486 _In_
struct _DRIVER_OBJECT
*DriverObject
);
6487 typedef DRIVER_UNLOAD
*PDRIVER_UNLOAD
;
6489 _Function_class_(DRIVER_DISPATCH
)
6490 _IRQL_requires_(PASSIVE_LEVEL
)
6491 _IRQL_requires_same_
6493 (NTAPI DRIVER_DISPATCH
)(
6494 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6495 _Inout_
struct _IRP
*Irp
);
6496 typedef DRIVER_DISPATCH
*PDRIVER_DISPATCH
;
6498 typedef struct _DRIVER_OBJECT
{
6501 PDEVICE_OBJECT DeviceObject
;
6505 PVOID DriverSection
;
6506 PDRIVER_EXTENSION DriverExtension
;
6507 UNICODE_STRING DriverName
;
6508 PUNICODE_STRING HardwareDatabase
;
6509 struct _FAST_IO_DISPATCH
*FastIoDispatch
;
6510 PDRIVER_INITIALIZE DriverInit
;
6511 PDRIVER_STARTIO DriverStartIo
;
6512 PDRIVER_UNLOAD DriverUnload
;
6513 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
6514 } DRIVER_OBJECT
, *PDRIVER_OBJECT
;
6516 typedef struct _DMA_ADAPTER
{
6519 struct _DMA_OPERATIONS
* DmaOperations
;
6520 } DMA_ADAPTER
, *PDMA_ADAPTER
;
6523 (NTAPI
*PPUT_DMA_ADAPTER
)(
6524 PDMA_ADAPTER DmaAdapter
);
6527 (NTAPI
*PALLOCATE_COMMON_BUFFER
)(
6528 _In_ PDMA_ADAPTER DmaAdapter
,
6530 _Out_ PPHYSICAL_ADDRESS LogicalAddress
,
6531 _In_ BOOLEAN CacheEnabled
);
6534 (NTAPI
*PFREE_COMMON_BUFFER
)(
6535 _In_ PDMA_ADAPTER DmaAdapter
,
6537 _In_ PHYSICAL_ADDRESS LogicalAddress
,
6538 _In_ PVOID VirtualAddress
,
6539 _In_ BOOLEAN CacheEnabled
);
6542 (NTAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
6543 _In_ PDMA_ADAPTER DmaAdapter
,
6544 _In_ PDEVICE_OBJECT DeviceObject
,
6545 _In_ ULONG NumberOfMapRegisters
,
6546 _In_ PDRIVER_CONTROL ExecutionRoutine
,
6547 _In_ PVOID Context
);
6550 (NTAPI
*PFLUSH_ADAPTER_BUFFERS
)(
6551 _In_ PDMA_ADAPTER DmaAdapter
,
6553 _In_ PVOID MapRegisterBase
,
6554 _In_ PVOID CurrentVa
,
6556 _In_ BOOLEAN WriteToDevice
);
6559 (NTAPI
*PFREE_ADAPTER_CHANNEL
)(
6560 _In_ PDMA_ADAPTER DmaAdapter
);
6563 (NTAPI
*PFREE_MAP_REGISTERS
)(
6564 _In_ PDMA_ADAPTER DmaAdapter
,
6565 PVOID MapRegisterBase
,
6566 ULONG NumberOfMapRegisters
);
6568 typedef PHYSICAL_ADDRESS
6569 (NTAPI
*PMAP_TRANSFER
)(
6570 _In_ PDMA_ADAPTER DmaAdapter
,
6572 _In_ PVOID MapRegisterBase
,
6573 _In_ PVOID CurrentVa
,
6574 _Inout_ PULONG Length
,
6575 _In_ BOOLEAN WriteToDevice
);
6578 (NTAPI
*PGET_DMA_ALIGNMENT
)(
6579 _In_ PDMA_ADAPTER DmaAdapter
);
6582 (NTAPI
*PREAD_DMA_COUNTER
)(
6583 _In_ PDMA_ADAPTER DmaAdapter
);
6585 _Function_class_(DRIVER_LIST_CONTROL
)
6586 _IRQL_requires_same_
6588 (NTAPI DRIVER_LIST_CONTROL
)(
6589 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6590 _In_
struct _IRP
*Irp
,
6591 _In_
struct _SCATTER_GATHER_LIST
*ScatterGather
,
6592 _In_ PVOID Context
);
6593 typedef DRIVER_LIST_CONTROL
*PDRIVER_LIST_CONTROL
;
6596 (NTAPI
*PGET_SCATTER_GATHER_LIST
)(
6597 _In_ PDMA_ADAPTER DmaAdapter
,
6598 _In_ PDEVICE_OBJECT DeviceObject
,
6600 _In_ PVOID CurrentVa
,
6602 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine
,
6604 _In_ BOOLEAN WriteToDevice
);
6607 (NTAPI
*PPUT_SCATTER_GATHER_LIST
)(
6608 _In_ PDMA_ADAPTER DmaAdapter
,
6609 _In_ PSCATTER_GATHER_LIST ScatterGather
,
6610 _In_ BOOLEAN WriteToDevice
);
6613 (NTAPI
*PCALCULATE_SCATTER_GATHER_LIST_SIZE
)(
6614 _In_ PDMA_ADAPTER DmaAdapter
,
6615 _In_ PMDL Mdl OPTIONAL
,
6616 _In_ PVOID CurrentVa
,
6618 _Out_ PULONG ScatterGatherListSize
,
6619 _Out_ OPTIONAL PULONG pNumberOfMapRegisters
);
6622 (NTAPI
*PBUILD_SCATTER_GATHER_LIST
)(
6623 _In_ PDMA_ADAPTER DmaAdapter
,
6624 _In_ PDEVICE_OBJECT DeviceObject
,
6626 _In_ PVOID CurrentVa
,
6628 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine
,
6630 _In_ BOOLEAN WriteToDevice
,
6631 _In_ PVOID ScatterGatherBuffer
,
6632 _In_ ULONG ScatterGatherLength
);
6635 (NTAPI
*PBUILD_MDL_FROM_SCATTER_GATHER_LIST
)(
6636 _In_ PDMA_ADAPTER DmaAdapter
,
6637 _In_ PSCATTER_GATHER_LIST ScatterGather
,
6638 _In_ PMDL OriginalMdl
,
6639 _Out_ PMDL
*TargetMdl
);
6641 typedef struct _DMA_OPERATIONS
{
6643 PPUT_DMA_ADAPTER PutDmaAdapter
;
6644 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
;
6645 PFREE_COMMON_BUFFER FreeCommonBuffer
;
6646 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
6647 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
6648 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
6649 PFREE_MAP_REGISTERS FreeMapRegisters
;
6650 PMAP_TRANSFER MapTransfer
;
6651 PGET_DMA_ALIGNMENT GetDmaAlignment
;
6652 PREAD_DMA_COUNTER ReadDmaCounter
;
6653 PGET_SCATTER_GATHER_LIST GetScatterGatherList
;
6654 PPUT_SCATTER_GATHER_LIST PutScatterGatherList
;
6655 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList
;
6656 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList
;
6657 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList
;
6658 } DMA_OPERATIONS
, *PDMA_OPERATIONS
;
6660 typedef struct _IO_RESOURCE_DESCRIPTOR
{
6663 UCHAR ShareDisposition
;
6671 PHYSICAL_ADDRESS MinimumAddress
;
6672 PHYSICAL_ADDRESS MaximumAddress
;
6677 PHYSICAL_ADDRESS MinimumAddress
;
6678 PHYSICAL_ADDRESS MaximumAddress
;
6681 ULONG MinimumVector
;
6682 ULONG MaximumVector
;
6685 ULONG MinimumChannel
;
6686 ULONG MaximumChannel
;
6691 PHYSICAL_ADDRESS MinimumAddress
;
6692 PHYSICAL_ADDRESS MaximumAddress
;
6709 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
6711 typedef struct _IO_RESOURCE_LIST
{
6715 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
6716 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
6718 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
6720 INTERFACE_TYPE InterfaceType
;
6724 ULONG AlternativeLists
;
6725 IO_RESOURCE_LIST List
[1];
6726 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
6728 _Function_class_(DRIVER_CANCEL
)
6729 _Requires_lock_held_(_Global_cancel_spin_lock_
)
6730 _Releases_lock_(_Global_cancel_spin_lock_
)
6731 _IRQL_requires_min_(DISPATCH_LEVEL
)
6732 _IRQL_requires_(DISPATCH_LEVEL
)
6734 (NTAPI DRIVER_CANCEL
)(
6735 _Inout_
struct _DEVICE_OBJECT
*DeviceObject
,
6736 _Inout_ _IRQL_uses_cancel_
struct _IRP
*Irp
);
6737 typedef DRIVER_CANCEL
*PDRIVER_CANCEL
;
6739 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT
) _IRP
{
6742 struct _MDL
*MdlAddress
;
6745 struct _IRP
*MasterIrp
;
6746 volatile LONG IrpCount
;
6749 LIST_ENTRY ThreadListEntry
;
6750 IO_STATUS_BLOCK IoStatus
;
6751 KPROCESSOR_MODE RequestorMode
;
6752 BOOLEAN PendingReturned
;
6754 CHAR CurrentLocation
;
6757 CCHAR ApcEnvironment
;
6758 UCHAR AllocationFlags
;
6759 PIO_STATUS_BLOCK UserIosb
;
6763 _ANONYMOUS_UNION
union {
6764 PIO_APC_ROUTINE UserApcRoutine
;
6765 PVOID IssuingProcess
;
6767 PVOID UserApcContext
;
6768 } AsynchronousParameters
;
6769 LARGE_INTEGER AllocationSize
;
6771 volatile PDRIVER_CANCEL CancelRoutine
;
6775 _ANONYMOUS_UNION
union {
6776 KDEVICE_QUEUE_ENTRY DeviceQueueEntry
;
6777 _ANONYMOUS_STRUCT
struct {
6778 PVOID DriverContext
[4];
6782 PCHAR AuxiliaryBuffer
;
6783 _ANONYMOUS_STRUCT
struct {
6784 LIST_ENTRY ListEntry
;
6785 _ANONYMOUS_UNION
union {
6786 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
6790 struct _FILE_OBJECT
*OriginalFileObject
;
6793 PVOID CompletionKey
;
6797 typedef enum _IO_PAGING_PRIORITY
{
6798 IoPagingPriorityInvalid
,
6799 IoPagingPriorityNormal
,
6800 IoPagingPriorityHigh
,
6801 IoPagingPriorityReserved1
,
6802 IoPagingPriorityReserved2
6803 } IO_PAGING_PRIORITY
;
6805 _Function_class_(IO_COMPLETION_ROUTINE
)
6806 _IRQL_requires_same_
6808 (NTAPI IO_COMPLETION_ROUTINE
)(
6809 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6810 _In_
struct _IRP
*Irp
,
6811 _In_opt_ PVOID Context
);
6812 typedef IO_COMPLETION_ROUTINE
*PIO_COMPLETION_ROUTINE
;
6814 _Function_class_(IO_DPC_ROUTINE
)
6815 _IRQL_always_function_min_(DISPATCH_LEVEL
)
6816 _IRQL_requires_(DISPATCH_LEVEL
)
6817 _IRQL_requires_same_
6819 (NTAPI IO_DPC_ROUTINE
)(
6820 _In_
struct _KDPC
*Dpc
,
6821 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6822 _Inout_
struct _IRP
*Irp
,
6823 _In_opt_ PVOID Context
);
6824 typedef IO_DPC_ROUTINE
*PIO_DPC_ROUTINE
;
6827 (NTAPI
*PMM_DLL_INITIALIZE
)(
6828 _In_ PUNICODE_STRING RegistryPath
);
6831 (NTAPI
*PMM_DLL_UNLOAD
)(
6834 _Function_class_(IO_TIMER_ROUTINE
)
6835 _IRQL_requires_same_
6837 (NTAPI IO_TIMER_ROUTINE
)(
6838 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6839 _In_opt_ PVOID Context
);
6840 typedef IO_TIMER_ROUTINE
*PIO_TIMER_ROUTINE
;
6842 typedef struct _IO_SECURITY_CONTEXT
{
6843 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
6844 PACCESS_STATE AccessState
;
6845 ACCESS_MASK DesiredAccess
;
6846 ULONG FullCreateOptions
;
6847 } IO_SECURITY_CONTEXT
, *PIO_SECURITY_CONTEXT
;
6851 typedef struct _IO_CSQ_IRP_CONTEXT
{
6854 struct _IO_CSQ
*Csq
;
6855 } IO_CSQ_IRP_CONTEXT
, *PIO_CSQ_IRP_CONTEXT
;
6858 (NTAPI
*PIO_CSQ_INSERT_IRP
)(
6859 _In_
struct _IO_CSQ
*Csq
,
6863 (NTAPI IO_CSQ_INSERT_IRP_EX
)(
6864 _In_
struct _IO_CSQ
*Csq
,
6866 _In_ PVOID InsertContext
);
6867 typedef IO_CSQ_INSERT_IRP_EX
*PIO_CSQ_INSERT_IRP_EX
;
6870 (NTAPI
*PIO_CSQ_REMOVE_IRP
)(
6871 _In_
struct _IO_CSQ
*Csq
,
6875 (NTAPI
*PIO_CSQ_PEEK_NEXT_IRP
)(
6876 _In_
struct _IO_CSQ
*Csq
,
6878 _In_ PVOID PeekContext
);
6881 (NTAPI
*PIO_CSQ_ACQUIRE_LOCK
)(
6882 _In_
struct _IO_CSQ
*Csq
,
6886 (NTAPI
*PIO_CSQ_RELEASE_LOCK
)(
6887 _In_
struct _IO_CSQ
*Csq
,
6891 (NTAPI
*PIO_CSQ_COMPLETE_CANCELED_IRP
)(
6892 _In_
struct _IO_CSQ
*Csq
,
6895 typedef struct _IO_CSQ
{
6897 PIO_CSQ_INSERT_IRP CsqInsertIrp
;
6898 PIO_CSQ_REMOVE_IRP CsqRemoveIrp
;
6899 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
;
6900 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
;
6901 PIO_CSQ_RELEASE_LOCK CsqReleaseLock
;
6902 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
;
6903 PVOID ReservePointer
;
6906 typedef enum _BUS_QUERY_ID_TYPE
{
6908 BusQueryHardwareIDs
,
6909 BusQueryCompatibleIDs
,
6911 BusQueryDeviceSerialNumber
6912 } BUS_QUERY_ID_TYPE
, *PBUS_QUERY_ID_TYPE
;
6914 typedef enum _DEVICE_TEXT_TYPE
{
6915 DeviceTextDescription
,
6916 DeviceTextLocationInformation
6917 } DEVICE_TEXT_TYPE
, *PDEVICE_TEXT_TYPE
;
6920 (NTAPI
*PGPE_SERVICE_ROUTINE
)(
6924 _IRQL_requires_max_(DISPATCH_LEVEL
)
6925 _Must_inspect_result_
6927 (NTAPI
*PGPE_CONNECT_VECTOR
)(
6932 PGPE_SERVICE_ROUTINE
,
6936 _IRQL_requires_max_(DISPATCH_LEVEL
)
6937 _Must_inspect_result_
6939 (NTAPI
*PGPE_DISCONNECT_VECTOR
)(
6942 _IRQL_requires_max_(DISPATCH_LEVEL
)
6943 _Must_inspect_result_
6945 (NTAPI
*PGPE_ENABLE_EVENT
)(
6949 _IRQL_requires_max_(DISPATCH_LEVEL
)
6950 _Must_inspect_result_
6952 (NTAPI
*PGPE_DISABLE_EVENT
)(
6956 _IRQL_requires_max_(DISPATCH_LEVEL
)
6957 _Must_inspect_result_
6959 (NTAPI
*PGPE_CLEAR_STATUS
)(
6964 (NTAPI
*PDEVICE_NOTIFY_CALLBACK
)(
6968 _IRQL_requires_max_(DISPATCH_LEVEL
)
6969 _Must_inspect_result_
6971 (NTAPI
*PREGISTER_FOR_DEVICE_NOTIFICATIONS
)(
6973 PDEVICE_NOTIFY_CALLBACK
,
6976 _IRQL_requires_max_(DISPATCH_LEVEL
)
6978 (NTAPI
*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS
)(
6980 PDEVICE_NOTIFY_CALLBACK
);
6982 typedef struct _ACPI_INTERFACE_STANDARD
{
6986 PINTERFACE_REFERENCE InterfaceReference
;
6987 PINTERFACE_DEREFERENCE InterfaceDereference
;
6988 PGPE_CONNECT_VECTOR GpeConnectVector
;
6989 PGPE_DISCONNECT_VECTOR GpeDisconnectVector
;
6990 PGPE_ENABLE_EVENT GpeEnableEvent
;
6991 PGPE_DISABLE_EVENT GpeDisableEvent
;
6992 PGPE_CLEAR_STATUS GpeClearStatus
;
6993 PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications
;
6994 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications
;
6995 } ACPI_INTERFACE_STANDARD
, *PACPI_INTERFACE_STANDARD
;
6998 (NTAPI
*PGPE_SERVICE_ROUTINE2
)(
6999 PVOID ObjectContext
,
7000 PVOID ServiceContext
);
7002 _IRQL_requires_max_(DISPATCH_LEVEL
)
7003 _Must_inspect_result_
7005 (NTAPI
*PGPE_CONNECT_VECTOR2
)(
7008 KINTERRUPT_MODE Mode
,
7010 PGPE_SERVICE_ROUTINE ServiceRoutine
,
7011 PVOID ServiceContext
,
7012 PVOID
*ObjectContext
);
7014 _IRQL_requires_max_(DISPATCH_LEVEL
)
7015 _Must_inspect_result_
7017 (NTAPI
*PGPE_DISCONNECT_VECTOR2
)(
7019 PVOID ObjectContext
);
7021 _IRQL_requires_max_(DISPATCH_LEVEL
)
7022 _Must_inspect_result_
7024 (NTAPI
*PGPE_ENABLE_EVENT2
)(
7026 PVOID ObjectContext
);
7028 _IRQL_requires_max_(DISPATCH_LEVEL
)
7029 _Must_inspect_result_
7031 (NTAPI
*PGPE_DISABLE_EVENT2
)(
7033 PVOID ObjectContext
);
7035 _IRQL_requires_max_(DISPATCH_LEVEL
)
7036 _Must_inspect_result_
7038 (NTAPI
*PGPE_CLEAR_STATUS2
)(
7040 PVOID ObjectContext
);
7042 _IRQL_requires_max_(DISPATCH_LEVEL
)
7044 (NTAPI
*PDEVICE_NOTIFY_CALLBACK2
)(
7045 PVOID NotificationContext
,
7048 _IRQL_requires_max_(DISPATCH_LEVEL
)
7049 _Must_inspect_result_
7051 (NTAPI
*PREGISTER_FOR_DEVICE_NOTIFICATIONS2
)(
7053 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler
,
7054 PVOID NotificationContext
);
7056 _IRQL_requires_max_(DISPATCH_LEVEL
)
7058 (NTAPI
*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2
)(
7061 typedef struct _ACPI_INTERFACE_STANDARD2
{
7065 PINTERFACE_REFERENCE InterfaceReference
;
7066 PINTERFACE_DEREFERENCE InterfaceDereference
;
7067 PGPE_CONNECT_VECTOR2 GpeConnectVector
;
7068 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector
;
7069 PGPE_ENABLE_EVENT2 GpeEnableEvent
;
7070 PGPE_DISABLE_EVENT2 GpeDisableEvent
;
7071 PGPE_CLEAR_STATUS2 GpeClearStatus
;
7072 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications
;
7073 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications
;
7074 } ACPI_INTERFACE_STANDARD2
, *PACPI_INTERFACE_STANDARD2
;
7076 #if !defined(_AMD64_) && !defined(_IA64_)
7077 #include <pshpack4.h>
7079 typedef struct _IO_STACK_LOCATION
{
7080 UCHAR MajorFunction
;
7081 UCHAR MinorFunction
;
7086 PIO_SECURITY_CONTEXT SecurityContext
;
7088 USHORT POINTER_ALIGNMENT FileAttributes
;
7090 ULONG POINTER_ALIGNMENT EaLength
;
7094 ULONG POINTER_ALIGNMENT Key
;
7095 LARGE_INTEGER ByteOffset
;
7099 ULONG POINTER_ALIGNMENT Key
;
7100 LARGE_INTEGER ByteOffset
;
7104 PUNICODE_STRING FileName
;
7105 FILE_INFORMATION_CLASS FileInformationClass
;
7110 ULONG CompletionFilter
;
7114 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
7118 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
7119 PFILE_OBJECT FileObject
;
7120 _ANONYMOUS_UNION
union {
7121 _ANONYMOUS_STRUCT
struct {
7122 BOOLEAN ReplaceIfExists
;
7123 BOOLEAN AdvanceOnly
;
7126 HANDLE DeleteHandle
;
7140 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass
;
7144 FS_INFORMATION_CLASS FsInformationClass
;
7147 ULONG OutputBufferLength
;
7148 ULONG InputBufferLength
;
7149 ULONG FsControlCode
;
7150 PVOID Type3InputBuffer
;
7151 } FileSystemControl
;
7153 PLARGE_INTEGER Length
;
7155 LARGE_INTEGER ByteOffset
;
7158 ULONG OutputBufferLength
;
7159 ULONG POINTER_ALIGNMENT InputBufferLength
;
7160 ULONG POINTER_ALIGNMENT IoControlCode
;
7161 PVOID Type3InputBuffer
;
7164 SECURITY_INFORMATION SecurityInformation
;
7165 ULONG POINTER_ALIGNMENT Length
;
7168 SECURITY_INFORMATION SecurityInformation
;
7169 PSECURITY_DESCRIPTOR SecurityDescriptor
;
7173 PDEVICE_OBJECT DeviceObject
;
7177 PDEVICE_OBJECT DeviceObject
;
7180 struct _SCSI_REQUEST_BLOCK
*Srb
;
7185 struct _FILE_GET_QUOTA_INFORMATION
*SidList
;
7186 ULONG SidListLength
;
7192 DEVICE_RELATION_TYPE Type
;
7193 } QueryDeviceRelations
;
7195 CONST GUID
*InterfaceType
;
7198 PINTERFACE Interface
;
7199 PVOID InterfaceSpecificData
;
7202 PDEVICE_CAPABILITIES Capabilities
;
7203 } DeviceCapabilities
;
7205 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList
;
7206 } FilterResourceRequirements
;
7211 ULONG POINTER_ALIGNMENT Length
;
7217 BUS_QUERY_ID_TYPE IdType
;
7220 DEVICE_TEXT_TYPE DeviceTextType
;
7221 LCID POINTER_ALIGNMENT LocaleId
;
7225 BOOLEAN Reserved
[3];
7226 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type
;
7227 } UsageNotification
;
7229 SYSTEM_POWER_STATE PowerState
;
7232 PPOWER_SEQUENCE PowerSequence
;
7235 ULONG SystemContext
;
7236 POWER_STATE_TYPE POINTER_ALIGNMENT Type
;
7237 POWER_STATE POINTER_ALIGNMENT State
;
7238 POWER_ACTION POINTER_ALIGNMENT ShutdownType
;
7241 PCM_RESOURCE_LIST AllocatedResources
;
7242 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
7245 ULONG_PTR ProviderId
;
7257 PDEVICE_OBJECT DeviceObject
;
7258 PFILE_OBJECT FileObject
;
7259 PIO_COMPLETION_ROUTINE CompletionRoutine
;
7261 } IO_STACK_LOCATION
, *PIO_STACK_LOCATION
;
7262 #if !defined(_AMD64_) && !defined(_IA64_)
7263 #include <poppack.h>
7266 /* IO_STACK_LOCATION.Control */
7268 #define SL_PENDING_RETURNED 0x01
7269 #define SL_ERROR_RETURNED 0x02
7270 #define SL_INVOKE_ON_CANCEL 0x20
7271 #define SL_INVOKE_ON_SUCCESS 0x40
7272 #define SL_INVOKE_ON_ERROR 0x80
7274 #define METHOD_BUFFERED 0
7275 #define METHOD_IN_DIRECT 1
7276 #define METHOD_OUT_DIRECT 2
7277 #define METHOD_NEITHER 3
7279 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
7280 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
7282 #define FILE_SUPERSEDED 0x00000000
7283 #define FILE_OPENED 0x00000001
7284 #define FILE_CREATED 0x00000002
7285 #define FILE_OVERWRITTEN 0x00000003
7286 #define FILE_EXISTS 0x00000004
7287 #define FILE_DOES_NOT_EXIST 0x00000005
7289 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
7290 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
7292 /* also in winnt.h */
7293 #define FILE_LIST_DIRECTORY 0x00000001
7294 #define FILE_READ_DATA 0x00000001
7295 #define FILE_ADD_FILE 0x00000002
7296 #define FILE_WRITE_DATA 0x00000002
7297 #define FILE_ADD_SUBDIRECTORY 0x00000004
7298 #define FILE_APPEND_DATA 0x00000004
7299 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
7300 #define FILE_READ_EA 0x00000008
7301 #define FILE_WRITE_EA 0x00000010
7302 #define FILE_EXECUTE 0x00000020
7303 #define FILE_TRAVERSE 0x00000020
7304 #define FILE_DELETE_CHILD 0x00000040
7305 #define FILE_READ_ATTRIBUTES 0x00000080
7306 #define FILE_WRITE_ATTRIBUTES 0x00000100
7308 #define FILE_SHARE_READ 0x00000001
7309 #define FILE_SHARE_WRITE 0x00000002
7310 #define FILE_SHARE_DELETE 0x00000004
7311 #define FILE_SHARE_VALID_FLAGS 0x00000007
7313 #define FILE_ATTRIBUTE_READONLY 0x00000001
7314 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
7315 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
7316 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
7317 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
7318 #define FILE_ATTRIBUTE_DEVICE 0x00000040
7319 #define FILE_ATTRIBUTE_NORMAL 0x00000080
7320 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
7321 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
7322 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
7323 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
7324 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
7325 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
7326 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
7327 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
7329 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
7330 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
7332 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
7333 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
7334 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
7335 #define FILE_VALID_SET_FLAGS 0x00000036
7337 #define FILE_SUPERSEDE 0x00000000
7338 #define FILE_OPEN 0x00000001
7339 #define FILE_CREATE 0x00000002
7340 #define FILE_OPEN_IF 0x00000003
7341 #define FILE_OVERWRITE 0x00000004
7342 #define FILE_OVERWRITE_IF 0x00000005
7343 #define FILE_MAXIMUM_DISPOSITION 0x00000005
7345 #define FILE_DIRECTORY_FILE 0x00000001
7346 #define FILE_WRITE_THROUGH 0x00000002
7347 #define FILE_SEQUENTIAL_ONLY 0x00000004
7348 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
7349 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
7350 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
7351 #define FILE_NON_DIRECTORY_FILE 0x00000040
7352 #define FILE_CREATE_TREE_CONNECTION 0x00000080
7353 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
7354 #define FILE_NO_EA_KNOWLEDGE 0x00000200
7355 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
7356 #define FILE_RANDOM_ACCESS 0x00000800
7357 #define FILE_DELETE_ON_CLOSE 0x00001000
7358 #define FILE_OPEN_BY_FILE_ID 0x00002000
7359 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
7360 #define FILE_NO_COMPRESSION 0x00008000
7361 #if (NTDDI_VERSION >= NTDDI_WIN7)
7362 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
7363 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
7364 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
7365 #define FILE_RESERVE_OPFILTER 0x00100000
7366 #define FILE_OPEN_REPARSE_POINT 0x00200000
7367 #define FILE_OPEN_NO_RECALL 0x00400000
7368 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
7370 #define FILE_ANY_ACCESS 0x00000000
7371 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
7372 #define FILE_READ_ACCESS 0x00000001
7373 #define FILE_WRITE_ACCESS 0x00000002
7375 #define FILE_ALL_ACCESS \
7376 (STANDARD_RIGHTS_REQUIRED | \
7380 #define FILE_GENERIC_EXECUTE \
7381 (STANDARD_RIGHTS_EXECUTE | \
7382 FILE_READ_ATTRIBUTES | \
7386 #define FILE_GENERIC_READ \
7387 (STANDARD_RIGHTS_READ | \
7389 FILE_READ_ATTRIBUTES | \
7393 #define FILE_GENERIC_WRITE \
7394 (STANDARD_RIGHTS_WRITE | \
7396 FILE_WRITE_ATTRIBUTES | \
7398 FILE_APPEND_DATA | \
7403 #define WMIREG_ACTION_REGISTER 1
7404 #define WMIREG_ACTION_DEREGISTER 2
7405 #define WMIREG_ACTION_REREGISTER 3
7406 #define WMIREG_ACTION_UPDATE_GUIDS 4
7407 #define WMIREG_ACTION_BLOCK_IRPS 5
7409 #define WMIREGISTER 0
7412 _Function_class_(WMI_NOTIFICATION_CALLBACK
)
7413 _IRQL_requires_same_
7415 (NTAPI FWMI_NOTIFICATION_CALLBACK
)(
7418 typedef FWMI_NOTIFICATION_CALLBACK
*WMI_NOTIFICATION_CALLBACK
;
7423 typedef struct _PCI_SLOT_NUMBER
{
7426 ULONG DeviceNumber
:5;
7427 ULONG FunctionNumber
:3;
7432 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
7434 #define PCI_TYPE0_ADDRESSES 6
7435 #define PCI_TYPE1_ADDRESSES 2
7436 #define PCI_TYPE2_ADDRESSES 5
7438 typedef struct _PCI_COMMON_HEADER
{
7439 PCI_COMMON_HEADER_LAYOUT
7440 } PCI_COMMON_HEADER
, *PPCI_COMMON_HEADER
;
7443 typedef struct _PCI_COMMON_CONFIG
{
7444 PCI_COMMON_HEADER_LAYOUT
7445 UCHAR DeviceSpecific
[192];
7446 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
7448 typedef struct _PCI_COMMON_CONFIG
{
7449 PCI_COMMON_HEADER DUMMYSTRUCTNAME
;
7450 UCHAR DeviceSpecific
[192];
7451 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
7454 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
7456 #define PCI_EXTENDED_CONFIG_LENGTH 0x1000
7458 #define PCI_MAX_DEVICES 32
7459 #define PCI_MAX_FUNCTION 8
7460 #define PCI_MAX_BRIDGE_NUMBER 0xFF
7461 #define PCI_INVALID_VENDORID 0xFFFF
7463 /* PCI_COMMON_CONFIG.HeaderType */
7464 #define PCI_MULTIFUNCTION 0x80
7465 #define PCI_DEVICE_TYPE 0x00
7466 #define PCI_BRIDGE_TYPE 0x01
7467 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
7469 #define PCI_CONFIGURATION_TYPE(PciData) \
7470 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
7472 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
7473 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
7475 /* PCI_COMMON_CONFIG.Command */
7476 #define PCI_ENABLE_IO_SPACE 0x0001
7477 #define PCI_ENABLE_MEMORY_SPACE 0x0002
7478 #define PCI_ENABLE_BUS_MASTER 0x0004
7479 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
7480 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
7481 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
7482 #define PCI_ENABLE_PARITY 0x0040
7483 #define PCI_ENABLE_WAIT_CYCLE 0x0080
7484 #define PCI_ENABLE_SERR 0x0100
7485 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
7486 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
7488 /* PCI_COMMON_CONFIG.Status */
7489 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
7490 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
7491 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
7492 #define PCI_STATUS_UDF_SUPPORTED 0x0040
7493 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
7494 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
7495 #define PCI_STATUS_DEVSEL 0x0600
7496 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
7497 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
7498 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
7499 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
7500 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
7502 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
7504 #define PCI_WHICHSPACE_CONFIG 0x0
7505 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
7507 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
7508 #define PCI_CAPABILITY_ID_AGP 0x02
7509 #define PCI_CAPABILITY_ID_VPD 0x03
7510 #define PCI_CAPABILITY_ID_SLOT_ID 0x04
7511 #define PCI_CAPABILITY_ID_MSI 0x05
7512 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06
7513 #define PCI_CAPABILITY_ID_PCIX 0x07
7514 #define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08
7515 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09
7516 #define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A
7517 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B
7518 #define PCI_CAPABILITY_ID_SHPC 0x0C
7519 #define PCI_CAPABILITY_ID_P2P_SSID 0x0D
7520 #define PCI_CAPABILITY_ID_AGP_TARGET 0x0E
7521 #define PCI_CAPABILITY_ID_SECURE 0x0F
7522 #define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
7523 #define PCI_CAPABILITY_ID_MSIX 0x11
7525 typedef struct _PCI_CAPABILITIES_HEADER
{
7528 } PCI_CAPABILITIES_HEADER
, *PPCI_CAPABILITIES_HEADER
;
7530 typedef struct _PCI_PMC
{
7534 UCHAR DeviceSpecificInitialization
:1;
7536 struct _PM_SUPPORT
{
7546 } PCI_PMC
, *PPCI_PMC
;
7548 typedef struct _PCI_PMCSR
{
7549 USHORT PowerState
:2;
7552 USHORT DataSelect
:4;
7555 } PCI_PMCSR
, *PPCI_PMCSR
;
7557 typedef struct _PCI_PMCSR_BSE
{
7559 UCHAR D3HotSupportsStopClock
:1;
7560 UCHAR BusPowerClockControlEnabled
:1;
7561 } PCI_PMCSR_BSE
, *PPCI_PMCSR_BSE
;
7563 typedef struct _PCI_PM_CAPABILITY
{
7564 PCI_CAPABILITIES_HEADER Header
;
7566 PCI_PMC Capabilities
;
7570 PCI_PMCSR ControlStatus
;
7574 PCI_PMCSR_BSE BridgeSupport
;
7578 } PCI_PM_CAPABILITY
, *PPCI_PM_CAPABILITY
;
7581 PCI_CAPABILITIES_HEADER Header
;
7584 USHORT DataParityErrorRecoveryEnable
:1;
7585 USHORT EnableRelaxedOrdering
:1;
7586 USHORT MaxMemoryReadByteCount
:2;
7587 USHORT MaxOutstandingSplitTransactions
:3;
7594 ULONG FunctionNumber
:3;
7595 ULONG DeviceNumber
:5;
7597 ULONG Device64Bit
:1;
7598 ULONG Capable133MHz
:1;
7599 ULONG SplitCompletionDiscarded
:1;
7600 ULONG UnexpectedSplitCompletion
:1;
7601 ULONG DeviceComplexity
:1;
7602 ULONG DesignedMaxMemoryReadByteCount
:2;
7603 ULONG DesignedMaxOutstandingSplitTransactions
:3;
7604 ULONG DesignedMaxCumulativeReadSize
:3;
7605 ULONG ReceivedSplitCompletionErrorMessage
:1;
7606 ULONG CapablePCIX266
:1;
7607 ULONG CapablePCIX533
:1;
7611 } PCI_X_CAPABILITY
, *PPCI_X_CAPABILITY
;
7613 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001
7614 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002
7615 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003
7616 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004
7617 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005
7618 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006
7619 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007
7620 #define PCI_EXPRESS_MFVC_CAP_ID 0x0008
7621 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009
7622 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A
7623 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010
7625 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER
{
7626 USHORT CapabilityID
;
7629 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER
, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER
;
7631 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY
{
7632 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7633 ULONG LowSerialNumber
;
7634 ULONG HighSerialNumber
;
7635 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY
, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY
;
7637 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS
{
7638 _ANONYMOUS_STRUCT
struct {
7641 ULONG DataLinkProtocolError
:1;
7642 ULONG SurpriseDownError
:1;
7644 ULONG PoisonedTLP
:1;
7645 ULONG FlowControlProtocolError
:1;
7646 ULONG CompletionTimeout
:1;
7647 ULONG CompleterAbort
:1;
7648 ULONG UnexpectedCompletion
:1;
7649 ULONG ReceiverOverflow
:1;
7650 ULONG MalformedTLP
:1;
7652 ULONG UnsupportedRequestError
:1;
7656 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS
, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS
;
7658 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK
{
7659 _ANONYMOUS_STRUCT
struct {
7662 ULONG DataLinkProtocolError
:1;
7663 ULONG SurpriseDownError
:1;
7665 ULONG PoisonedTLP
:1;
7666 ULONG FlowControlProtocolError
:1;
7667 ULONG CompletionTimeout
:1;
7668 ULONG CompleterAbort
:1;
7669 ULONG UnexpectedCompletion
:1;
7670 ULONG ReceiverOverflow
:1;
7671 ULONG MalformedTLP
:1;
7673 ULONG UnsupportedRequestError
:1;
7677 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK
, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK
;
7679 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY
{
7680 _ANONYMOUS_STRUCT
struct {
7683 ULONG DataLinkProtocolError
:1;
7684 ULONG SurpriseDownError
:1;
7686 ULONG PoisonedTLP
:1;
7687 ULONG FlowControlProtocolError
:1;
7688 ULONG CompletionTimeout
:1;
7689 ULONG CompleterAbort
:1;
7690 ULONG UnexpectedCompletion
:1;
7691 ULONG ReceiverOverflow
:1;
7692 ULONG MalformedTLP
:1;
7694 ULONG UnsupportedRequestError
:1;
7698 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY
, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY
;
7700 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS
{
7701 _ANONYMOUS_STRUCT
struct {
7702 ULONG ReceiverError
:1;
7706 ULONG ReplayNumRollover
:1;
7708 ULONG ReplayTimerTimeout
:1;
7709 ULONG AdvisoryNonFatalError
:1;
7713 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS
, *PPCI_CORRECTABLE_ERROR_STATUS
;
7715 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK
{
7716 _ANONYMOUS_STRUCT
struct {
7717 ULONG ReceiverError
:1;
7721 ULONG ReplayNumRollover
:1;
7723 ULONG ReplayTimerTimeout
:1;
7724 ULONG AdvisoryNonFatalError
:1;
7728 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK
, *PPCI_CORRECTABLE_ERROR_MASK
;
7730 typedef union _PCI_EXPRESS_AER_CAPABILITIES
{
7731 _ANONYMOUS_STRUCT
struct {
7732 ULONG FirstErrorPointer
:5;
7733 ULONG ECRCGenerationCapable
:1;
7734 ULONG ECRCGenerationEnable
:1;
7735 ULONG ECRCCheckCapable
:1;
7736 ULONG ECRCCheckEnable
:1;
7740 } PCI_EXPRESS_AER_CAPABILITIES
, *PPCI_EXPRESS_AER_CAPABILITIES
;
7742 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND
{
7743 _ANONYMOUS_STRUCT
struct {
7744 ULONG CorrectableErrorReportingEnable
:1;
7745 ULONG NonFatalErrorReportingEnable
:1;
7746 ULONG FatalErrorReportingEnable
:1;
7750 } PCI_EXPRESS_ROOT_ERROR_COMMAND
, *PPCI_EXPRESS_ROOT_ERROR_COMMAND
;
7752 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS
{
7753 _ANONYMOUS_STRUCT
struct {
7754 ULONG CorrectableErrorReceived
:1;
7755 ULONG MultipleCorrectableErrorsReceived
:1;
7756 ULONG UncorrectableErrorReceived
:1;
7757 ULONG MultipleUncorrectableErrorsReceived
:1;
7758 ULONG FirstUncorrectableFatal
:1;
7759 ULONG NonFatalErrorMessagesReceived
:1;
7760 ULONG FatalErrorMessagesReceived
:1;
7762 ULONG AdvancedErrorInterruptMessageNumber
:5;
7765 } PCI_EXPRESS_ROOT_ERROR_STATUS
, *PPCI_EXPRESS_ROOT_ERROR_STATUS
;
7767 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID
{
7768 _ANONYMOUS_STRUCT
struct {
7769 USHORT CorrectableSourceIdFun
:3;
7770 USHORT CorrectableSourceIdDev
:5;
7771 USHORT CorrectableSourceIdBus
:8;
7772 USHORT UncorrectableSourceIdFun
:3;
7773 USHORT UncorrectableSourceIdDev
:5;
7774 USHORT UncorrectableSourceIdBus
:8;
7777 } PCI_EXPRESS_ERROR_SOURCE_ID
, *PPCI_EXPRESS_ERROR_SOURCE_ID
;
7779 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS
{
7780 _ANONYMOUS_STRUCT
struct {
7781 ULONG TargetAbortOnSplitCompletion
:1;
7782 ULONG MasterAbortOnSplitCompletion
:1;
7783 ULONG ReceivedTargetAbort
:1;
7784 ULONG ReceivedMasterAbort
:1;
7786 ULONG UnexpectedSplitCompletionError
:1;
7787 ULONG UncorrectableSplitCompletion
:1;
7788 ULONG UncorrectableDataError
:1;
7789 ULONG UncorrectableAttributeError
:1;
7790 ULONG UncorrectableAddressError
:1;
7791 ULONG DelayedTransactionDiscardTimerExpired
:1;
7792 ULONG PERRAsserted
:1;
7793 ULONG SERRAsserted
:1;
7794 ULONG InternalBridgeError
:1;
7798 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS
, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS
;
7800 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK
{
7801 _ANONYMOUS_STRUCT
struct {
7802 ULONG TargetAbortOnSplitCompletion
:1;
7803 ULONG MasterAbortOnSplitCompletion
:1;
7804 ULONG ReceivedTargetAbort
:1;
7805 ULONG ReceivedMasterAbort
:1;
7807 ULONG UnexpectedSplitCompletionError
:1;
7808 ULONG UncorrectableSplitCompletion
:1;
7809 ULONG UncorrectableDataError
:1;
7810 ULONG UncorrectableAttributeError
:1;
7811 ULONG UncorrectableAddressError
:1;
7812 ULONG DelayedTransactionDiscardTimerExpired
:1;
7813 ULONG PERRAsserted
:1;
7814 ULONG SERRAsserted
:1;
7815 ULONG InternalBridgeError
:1;
7819 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK
, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK
;
7821 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY
{
7822 _ANONYMOUS_STRUCT
struct {
7823 ULONG TargetAbortOnSplitCompletion
:1;
7824 ULONG MasterAbortOnSplitCompletion
:1;
7825 ULONG ReceivedTargetAbort
:1;
7826 ULONG ReceivedMasterAbort
:1;
7828 ULONG UnexpectedSplitCompletionError
:1;
7829 ULONG UncorrectableSplitCompletion
:1;
7830 ULONG UncorrectableDataError
:1;
7831 ULONG UncorrectableAttributeError
:1;
7832 ULONG UncorrectableAddressError
:1;
7833 ULONG DelayedTransactionDiscardTimerExpired
:1;
7834 ULONG PERRAsserted
:1;
7835 ULONG SERRAsserted
:1;
7836 ULONG InternalBridgeError
:1;
7840 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY
, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY
;
7842 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES
{
7843 _ANONYMOUS_STRUCT
struct {
7844 ULONG SecondaryUncorrectableFirstErrorPtr
:5;
7848 } PCI_EXPRESS_SEC_AER_CAPABILITIES
, *PPCI_EXPRESS_SEC_AER_CAPABILITIES
;
7850 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001
7851 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002
7852 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004
7854 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
7855 (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
7856 ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
7857 ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
7859 typedef struct _PCI_EXPRESS_AER_CAPABILITY
{
7860 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7861 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus
;
7862 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask
;
7863 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity
;
7864 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus
;
7865 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask
;
7866 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl
;
7868 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus
;
7869 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask
;
7870 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity
;
7871 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl
;
7872 ULONG SecHeaderLog
[4];
7873 } PCI_EXPRESS_AER_CAPABILITY
, *PPCI_EXPRESS_AER_CAPABILITY
;
7875 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY
{
7876 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7877 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus
;
7878 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask
;
7879 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity
;
7880 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus
;
7881 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask
;
7882 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl
;
7884 PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand
;
7885 PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus
;
7886 PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId
;
7887 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY
, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY
;
7889 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY
{
7890 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7891 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus
;
7892 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask
;
7893 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity
;
7894 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus
;
7895 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask
;
7896 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl
;
7898 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus
;
7899 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask
;
7900 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity
;
7901 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl
;
7902 ULONG SecHeaderLog
[4];
7903 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY
, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY
;
7905 typedef union _PCI_EXPRESS_SRIOV_CAPS
{
7906 _ANONYMOUS_STRUCT
struct {
7907 ULONG VFMigrationCapable
:1;
7909 ULONG VFMigrationInterruptNumber
:11;
7912 } PCI_EXPRESS_SRIOV_CAPS
, *PPCI_EXPRESS_SRIOV_CAPS
;
7914 typedef union _PCI_EXPRESS_SRIOV_CONTROL
{
7915 _ANONYMOUS_STRUCT
struct {
7917 USHORT VFMigrationEnable
:1;
7918 USHORT VFMigrationInterruptEnable
:1;
7919 USHORT VFMemorySpaceEnable
:1;
7920 USHORT ARICapableHierarchy
:1;
7921 USHORT Reserved1
:11;
7924 } PCI_EXPRESS_SRIOV_CONTROL
, *PPCI_EXPRESS_SRIOV_CONTROL
;
7926 typedef union _PCI_EXPRESS_SRIOV_STATUS
{
7927 _ANONYMOUS_STRUCT
struct {
7928 USHORT VFMigrationStatus
:1;
7929 USHORT Reserved1
:15;
7932 } PCI_EXPRESS_SRIOV_STATUS
, *PPCI_EXPRESS_SRIOV_STATUS
;
7934 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY
{
7935 _ANONYMOUS_STRUCT
struct {
7936 ULONG VFMigrationStateBIR
:3;
7937 ULONG VFMigrationStateOffset
:29;
7940 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY
, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY
;
7942 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY
{
7943 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7944 PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities
;
7945 PCI_EXPRESS_SRIOV_CONTROL SRIOVControl
;
7946 PCI_EXPRESS_SRIOV_STATUS SRIOVStatus
;
7950 UCHAR FunctionDependencyLink
;
7952 USHORT FirstVFOffset
;
7956 ULONG SupportedPageSizes
;
7957 ULONG SystemPageSize
;
7958 ULONG BaseAddresses
[PCI_TYPE0_ADDRESSES
];
7959 PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset
;
7960 } PCI_EXPRESS_SRIOV_CAPABILITY
, *PPCI_EXPRESS_SRIOV_CAPABILITY
;
7962 /* PCI device classes */
7963 #define PCI_CLASS_PRE_20 0x00
7964 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
7965 #define PCI_CLASS_NETWORK_CTLR 0x02
7966 #define PCI_CLASS_DISPLAY_CTLR 0x03
7967 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
7968 #define PCI_CLASS_MEMORY_CTLR 0x05
7969 #define PCI_CLASS_BRIDGE_DEV 0x06
7970 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
7971 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
7972 #define PCI_CLASS_INPUT_DEV 0x09
7973 #define PCI_CLASS_DOCKING_STATION 0x0a
7974 #define PCI_CLASS_PROCESSOR 0x0b
7975 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
7976 #define PCI_CLASS_WIRELESS_CTLR 0x0d
7977 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
7978 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
7979 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
7980 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
7981 #define PCI_CLASS_NOT_DEFINED 0xff
7983 /* PCI device subclasses for class 0 */
7984 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
7985 #define PCI_SUBCLASS_PRE_20_VGA 0x01
7987 /* PCI device subclasses for class 1 (mass storage controllers)*/
7988 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
7989 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
7990 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
7991 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
7992 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
7993 #define PCI_SUBCLASS_MSC_OTHER 0x80
7995 /* PCI device subclasses for class 2 (network controllers)*/
7996 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
7997 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
7998 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
7999 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
8000 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
8001 #define PCI_SUBCLASS_NET_OTHER 0x80
8003 /* PCI device subclasses for class 3 (display controllers)*/
8004 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
8005 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
8006 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
8007 #define PCI_SUBCLASS_VID_OTHER 0x80
8009 /* PCI device subclasses for class 4 (multimedia device)*/
8010 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
8011 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
8012 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
8013 #define PCI_SUBCLASS_MM_OTHER 0x80
8015 /* PCI device subclasses for class 5 (memory controller)*/
8016 #define PCI_SUBCLASS_MEM_RAM 0x00
8017 #define PCI_SUBCLASS_MEM_FLASH 0x01
8018 #define PCI_SUBCLASS_MEM_OTHER 0x80
8020 /* PCI device subclasses for class 6 (bridge device)*/
8021 #define PCI_SUBCLASS_BR_HOST 0x00
8022 #define PCI_SUBCLASS_BR_ISA 0x01
8023 #define PCI_SUBCLASS_BR_EISA 0x02
8024 #define PCI_SUBCLASS_BR_MCA 0x03
8025 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
8026 #define PCI_SUBCLASS_BR_PCMCIA 0x05
8027 #define PCI_SUBCLASS_BR_NUBUS 0x06
8028 #define PCI_SUBCLASS_BR_CARDBUS 0x07
8029 #define PCI_SUBCLASS_BR_RACEWAY 0x08
8030 #define PCI_SUBCLASS_BR_OTHER 0x80
8032 #define PCI_SUBCLASS_COM_SERIAL 0x00
8033 #define PCI_SUBCLASS_COM_PARALLEL 0x01
8034 #define PCI_SUBCLASS_COM_MULTIPORT 0x02
8035 #define PCI_SUBCLASS_COM_MODEM 0x03
8036 #define PCI_SUBCLASS_COM_OTHER 0x80
8038 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00
8039 #define PCI_SUBCLASS_SYS_DMA_CTLR 0x01
8040 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02
8041 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03
8042 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04
8043 #define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05
8044 #define PCI_SUBCLASS_SYS_OTHER 0x80
8046 #define PCI_SUBCLASS_INP_KEYBOARD 0x00
8047 #define PCI_SUBCLASS_INP_DIGITIZER 0x01
8048 #define PCI_SUBCLASS_INP_MOUSE 0x02
8049 #define PCI_SUBCLASS_INP_SCANNER 0x03
8050 #define PCI_SUBCLASS_INP_GAMEPORT 0x04
8051 #define PCI_SUBCLASS_INP_OTHER 0x80
8053 #define PCI_SUBCLASS_DOC_GENERIC 0x00
8054 #define PCI_SUBCLASS_DOC_OTHER 0x80
8056 #define PCI_SUBCLASS_PROC_386 0x00
8057 #define PCI_SUBCLASS_PROC_486 0x01
8058 #define PCI_SUBCLASS_PROC_PENTIUM 0x02
8059 #define PCI_SUBCLASS_PROC_ALPHA 0x10
8060 #define PCI_SUBCLASS_PROC_POWERPC 0x20
8061 #define PCI_SUBCLASS_PROC_COPROCESSOR 0x40
8063 /* PCI device subclasses for class C (serial bus controller)*/
8064 #define PCI_SUBCLASS_SB_IEEE1394 0x00
8065 #define PCI_SUBCLASS_SB_ACCESS 0x01
8066 #define PCI_SUBCLASS_SB_SSA 0x02
8067 #define PCI_SUBCLASS_SB_USB 0x03
8068 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
8069 #define PCI_SUBCLASS_SB_SMBUS 0x05
8071 #define PCI_SUBCLASS_WIRELESS_IRDA 0x00
8072 #define PCI_SUBCLASS_WIRELESS_CON_IR 0x01
8073 #define PCI_SUBCLASS_WIRELESS_RF 0x10
8074 #define PCI_SUBCLASS_WIRELESS_OTHER 0x80
8076 #define PCI_SUBCLASS_INTIO_I2O 0x00
8078 #define PCI_SUBCLASS_SAT_TV 0x01
8079 #define PCI_SUBCLASS_SAT_AUDIO 0x02
8080 #define PCI_SUBCLASS_SAT_VOICE 0x03
8081 #define PCI_SUBCLASS_SAT_DATA 0x04
8083 #define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00
8084 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10
8085 #define PCI_SUBCLASS_CRYPTO_OTHER 0x80
8087 #define PCI_SUBCLASS_DASP_DPIO 0x00
8088 #define PCI_SUBCLASS_DASP_OTHER 0x80
8090 #define PCI_ADDRESS_IO_SPACE 0x00000001
8091 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
8092 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
8093 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
8094 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
8095 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
8097 #define PCI_TYPE_32BIT 0
8098 #define PCI_TYPE_20BIT 2
8099 #define PCI_TYPE_64BIT 4
8101 #define PCI_ROMADDRESS_ENABLED 0x00000001
8103 #endif /* _PCI_X_ */
8105 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1
8107 _IRQL_requires_max_(PASSIVE_LEVEL
)
8108 _Must_inspect_result_
8110 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE
)(
8111 _Inout_ PVOID Context
);
8112 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE
*PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE
;
8114 _IRQL_requires_max_(PASSIVE_LEVEL
)
8115 _Must_inspect_result_
8117 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE
)(
8118 _Inout_ PVOID Context
);
8119 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE
*PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE
;
8121 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE
{
8125 PINTERFACE_REFERENCE InterfaceReference
;
8126 PINTERFACE_DEREFERENCE InterfaceDereference
;
8127 PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode
;
8128 PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode
;
8129 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE
, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE
;
8131 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1
8134 (NTAPI
*PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE
)(
8136 _Out_writes_bytes_(Length
) PVOID Buffer
,
8141 (NTAPI
*PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE
)(
8143 _In_reads_bytes_(Length
) PVOID Buffer
,
8147 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE
{
8151 PINTERFACE_REFERENCE InterfaceReference
;
8152 PINTERFACE_DEREFERENCE InterfaceDereference
;
8153 PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace
;
8154 PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace
;
8155 } PCI_EXPRESS_ROOT_PORT_INTERFACE
, *PPCI_EXPRESS_ROOT_PORT_INTERFACE
;
8157 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1
8159 _Must_inspect_result_
8161 (NTAPI PCI_MSIX_SET_ENTRY
)(
8163 _In_ ULONG TableEntry
,
8164 _In_ ULONG MessageNumber
);
8165 typedef PCI_MSIX_SET_ENTRY
*PPCI_MSIX_SET_ENTRY
;
8167 _Must_inspect_result_
8169 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY
)(
8171 _In_ ULONG TableEntry
);
8172 typedef PCI_MSIX_MASKUNMASK_ENTRY
*PPCI_MSIX_MASKUNMASK_ENTRY
;
8174 _Must_inspect_result_
8176 (NTAPI PCI_MSIX_GET_ENTRY
)(
8178 _In_ ULONG TableEntry
,
8179 _Out_ PULONG MessageNumber
,
8180 _Out_ PBOOLEAN Masked
);
8181 typedef PCI_MSIX_GET_ENTRY
*PPCI_MSIX_GET_ENTRY
;
8183 _Must_inspect_result_
8185 (NTAPI PCI_MSIX_GET_TABLE_SIZE
)(
8187 _Out_ PULONG TableSize
);
8188 typedef PCI_MSIX_GET_TABLE_SIZE
*PPCI_MSIX_GET_TABLE_SIZE
;
8190 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE
{
8194 PINTERFACE_REFERENCE InterfaceReference
;
8195 PINTERFACE_DEREFERENCE InterfaceDereference
;
8196 PPCI_MSIX_SET_ENTRY SetTableEntry
;
8197 PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry
;
8198 PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry
;
8199 PPCI_MSIX_GET_ENTRY GetTableEntry
;
8200 PPCI_MSIX_GET_TABLE_SIZE GetTableSize
;
8201 } PCI_MSIX_TABLE_CONFIG_INTERFACE
, *PPCI_MSIX_TABLE_CONFIG_INTERFACE
;
8203 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
8204 RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
8206 /******************************************************************************
8207 * Object Manager Types *
8208 ******************************************************************************/
8210 #define MAXIMUM_FILENAME_LENGTH 256
8211 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
8213 #define OBJECT_TYPE_CREATE 0x0001
8214 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
8216 #define DIRECTORY_QUERY 0x0001
8217 #define DIRECTORY_TRAVERSE 0x0002
8218 #define DIRECTORY_CREATE_OBJECT 0x0004
8219 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
8220 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
8222 #define SYMBOLIC_LINK_QUERY 0x0001
8223 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
8225 #define DUPLICATE_CLOSE_SOURCE 0x00000001
8226 #define DUPLICATE_SAME_ACCESS 0x00000002
8227 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
8229 #define OB_FLT_REGISTRATION_VERSION_0100 0x0100
8230 #define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
8232 typedef ULONG OB_OPERATION
;
8234 #define OB_OPERATION_HANDLE_CREATE 0x00000001
8235 #define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
8237 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION
{
8238 _Inout_ ACCESS_MASK DesiredAccess
;
8239 _In_ ACCESS_MASK OriginalDesiredAccess
;
8240 } OB_PRE_CREATE_HANDLE_INFORMATION
, *POB_PRE_CREATE_HANDLE_INFORMATION
;
8242 typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION
{
8243 _Inout_ ACCESS_MASK DesiredAccess
;
8244 _In_ ACCESS_MASK OriginalDesiredAccess
;
8245 _In_ PVOID SourceProcess
;
8246 _In_ PVOID TargetProcess
;
8247 } OB_PRE_DUPLICATE_HANDLE_INFORMATION
, *POB_PRE_DUPLICATE_HANDLE_INFORMATION
;
8249 typedef union _OB_PRE_OPERATION_PARAMETERS
{
8250 _Inout_ OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation
;
8251 _Inout_ OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation
;
8252 } OB_PRE_OPERATION_PARAMETERS
, *POB_PRE_OPERATION_PARAMETERS
;
8254 typedef struct _OB_PRE_OPERATION_INFORMATION
{
8255 _In_ OB_OPERATION Operation
;
8256 _ANONYMOUS_UNION
union {
8258 _ANONYMOUS_STRUCT
struct {
8259 _In_ ULONG KernelHandle
:1;
8260 _In_ ULONG Reserved
:31;
8264 _In_ POBJECT_TYPE ObjectType
;
8265 _Out_ PVOID CallContext
;
8266 _In_ POB_PRE_OPERATION_PARAMETERS Parameters
;
8267 } OB_PRE_OPERATION_INFORMATION
, *POB_PRE_OPERATION_INFORMATION
;
8269 typedef struct _OB_POST_CREATE_HANDLE_INFORMATION
{
8270 _In_ ACCESS_MASK GrantedAccess
;
8271 } OB_POST_CREATE_HANDLE_INFORMATION
, *POB_POST_CREATE_HANDLE_INFORMATION
;
8273 typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION
{
8274 _In_ ACCESS_MASK GrantedAccess
;
8275 } OB_POST_DUPLICATE_HANDLE_INFORMATION
, *POB_POST_DUPLICATE_HANDLE_INFORMATION
;
8277 typedef union _OB_POST_OPERATION_PARAMETERS
{
8278 _In_ OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation
;
8279 _In_ OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation
;
8280 } OB_POST_OPERATION_PARAMETERS
, *POB_POST_OPERATION_PARAMETERS
;
8282 typedef struct _OB_POST_OPERATION_INFORMATION
{
8283 _In_ OB_OPERATION Operation
;
8284 _ANONYMOUS_UNION
union {
8286 _ANONYMOUS_STRUCT
struct {
8287 _In_ ULONG KernelHandle
:1;
8288 _In_ ULONG Reserved
:31;
8292 _In_ POBJECT_TYPE ObjectType
;
8293 _In_ PVOID CallContext
;
8294 _In_ NTSTATUS ReturnStatus
;
8295 _In_ POB_POST_OPERATION_PARAMETERS Parameters
;
8296 } OB_POST_OPERATION_INFORMATION
,*POB_POST_OPERATION_INFORMATION
;
8298 typedef enum _OB_PREOP_CALLBACK_STATUS
{
8300 } OB_PREOP_CALLBACK_STATUS
, *POB_PREOP_CALLBACK_STATUS
;
8302 typedef OB_PREOP_CALLBACK_STATUS
8303 (NTAPI
*POB_PRE_OPERATION_CALLBACK
)(
8304 _In_ PVOID RegistrationContext
,
8305 _Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation
);
8308 (NTAPI
*POB_POST_OPERATION_CALLBACK
)(
8309 _In_ PVOID RegistrationContext
,
8310 _In_ POB_POST_OPERATION_INFORMATION OperationInformation
);
8312 typedef struct _OB_OPERATION_REGISTRATION
{
8313 _In_ POBJECT_TYPE
*ObjectType
;
8314 _In_ OB_OPERATION Operations
;
8315 _In_ POB_PRE_OPERATION_CALLBACK PreOperation
;
8316 _In_ POB_POST_OPERATION_CALLBACK PostOperation
;
8317 } OB_OPERATION_REGISTRATION
, *POB_OPERATION_REGISTRATION
;
8319 typedef struct _OB_CALLBACK_REGISTRATION
{
8320 _In_ USHORT Version
;
8321 _In_ USHORT OperationRegistrationCount
;
8322 _In_ UNICODE_STRING Altitude
;
8323 _In_ PVOID RegistrationContext
;
8324 _In_ OB_OPERATION_REGISTRATION
*OperationRegistration
;
8325 } OB_CALLBACK_REGISTRATION
, *POB_CALLBACK_REGISTRATION
;
8327 typedef struct _OBJECT_NAME_INFORMATION
{
8328 UNICODE_STRING Name
;
8329 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
8331 /* Exported object types */
8332 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType
;
8333 extern POBJECT_TYPE NTSYSAPI ExEventObjectType
;
8334 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType
;
8335 extern POBJECT_TYPE NTSYSAPI IoFileObjectType
;
8336 extern POBJECT_TYPE NTSYSAPI PsThreadType
;
8337 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType
;
8338 extern POBJECT_TYPE NTSYSAPI PsProcessType
;
8341 /******************************************************************************
8342 * Process Manager Types *
8343 ******************************************************************************/
8345 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
8346 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
8347 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
8348 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
8349 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
8351 /* Thread Access Rights */
8352 #define THREAD_TERMINATE 0x0001
8353 #define THREAD_SUSPEND_RESUME 0x0002
8354 #define THREAD_ALERT 0x0004
8355 #define THREAD_GET_CONTEXT 0x0008
8356 #define THREAD_SET_CONTEXT 0x0010
8357 #define THREAD_SET_INFORMATION 0x0020
8358 #define THREAD_SET_LIMITED_INFORMATION 0x0400
8359 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
8361 #define PROCESS_DUP_HANDLE (0x0040)
8363 #if (NTDDI_VERSION >= NTDDI_VISTA)
8364 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
8366 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
8369 #if (NTDDI_VERSION >= NTDDI_VISTA)
8370 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
8372 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
8375 #define LOW_PRIORITY 0
8376 #define LOW_REALTIME_PRIORITY 16
8377 #define HIGH_PRIORITY 31
8378 #define MAXIMUM_PRIORITY 32
8381 /******************************************************************************
8382 * WMI Library Support Types *
8383 ******************************************************************************/
8386 #include <evntrace.h>
8390 #ifndef _TRACEHANDLE_DEFINED
8391 #define _TRACEHANDLE_DEFINED
8392 typedef ULONG64 TRACEHANDLE
, *PTRACEHANDLE
;
8395 #ifndef TRACE_INFORMATION_CLASS_DEFINE
8397 typedef struct _ETW_TRACE_SESSION_SETTINGS
{
8400 ULONG MinimumBuffers
;
8401 ULONG MaximumBuffers
;
8404 ULONG FlushThreshold
;
8406 } ETW_TRACE_SESSION_SETTINGS
, *PETW_TRACE_SESSION_SETTINGS
;
8408 typedef enum _TRACE_INFORMATION_CLASS
{
8411 TraceEnableFlagsClass
,
8412 TraceEnableLevelClass
,
8413 GlobalLoggerHandleClass
,
8414 EventLoggerHandleClass
,
8415 AllLoggerHandlesClass
,
8416 TraceHandleByNameClass
,
8417 LoggerEventsLostClass
,
8418 TraceSessionSettingsClass
,
8419 LoggerEventsLoggedClass
,
8420 MaxTraceInformationClass
8421 } TRACE_INFORMATION_CLASS
;
8423 #endif /* TRACE_INFORMATION_CLASS_DEFINE */
8429 #include <evntprov.h>
8431 _IRQL_requires_same_
8433 (NTAPI
*PETWENABLECALLBACK
)(
8434 _In_ LPCGUID SourceId
,
8435 _In_ ULONG ControlCode
,
8437 _In_ ULONGLONG MatchAnyKeyword
,
8438 _In_ ULONGLONG MatchAllKeyword
,
8439 _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData
,
8440 _Inout_opt_ PVOID CallbackContext
);
8442 #define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001
8445 /******************************************************************************
8446 * Runtime Library Functions *
8447 ******************************************************************************/
8450 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
8452 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
8457 _Out_ PLIST_ENTRY ListHead
)
8459 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
8462 _Must_inspect_result_
8466 _In_
const LIST_ENTRY
* ListHead
)
8468 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
8474 _In_ PLIST_ENTRY Entry
)
8476 PLIST_ENTRY OldFlink
;
8477 PLIST_ENTRY OldBlink
;
8479 OldFlink
= Entry
->Flink
;
8480 OldBlink
= Entry
->Blink
;
8481 OldFlink
->Blink
= OldBlink
;
8482 OldBlink
->Flink
= OldFlink
;
8483 return (BOOLEAN
)(OldFlink
== OldBlink
);
8489 _Inout_ PLIST_ENTRY ListHead
)
8494 Entry
= ListHead
->Flink
;
8495 Flink
= Entry
->Flink
;
8496 ListHead
->Flink
= Flink
;
8497 Flink
->Blink
= ListHead
;
8504 _Inout_ PLIST_ENTRY ListHead
)
8509 Entry
= ListHead
->Blink
;
8510 Blink
= Entry
->Blink
;
8511 ListHead
->Blink
= Blink
;
8512 Blink
->Flink
= ListHead
;
8519 _Inout_ PLIST_ENTRY ListHead
,
8520 _Inout_ __drv_aliasesMem PLIST_ENTRY Entry
)
8522 PLIST_ENTRY OldBlink
;
8523 OldBlink
= ListHead
->Blink
;
8524 Entry
->Flink
= ListHead
;
8525 Entry
->Blink
= OldBlink
;
8526 OldBlink
->Flink
= Entry
;
8527 ListHead
->Blink
= Entry
;
8533 _Inout_ PLIST_ENTRY ListHead
,
8534 _Inout_ __drv_aliasesMem PLIST_ENTRY Entry
)
8536 PLIST_ENTRY OldFlink
;
8537 OldFlink
= ListHead
->Flink
;
8538 Entry
->Flink
= OldFlink
;
8539 Entry
->Blink
= ListHead
;
8540 OldFlink
->Blink
= Entry
;
8541 ListHead
->Flink
= Entry
;
8547 _Inout_ PLIST_ENTRY ListHead
,
8548 _Inout_ PLIST_ENTRY ListToAppend
)
8550 PLIST_ENTRY ListEnd
= ListHead
->Blink
;
8552 ListHead
->Blink
->Flink
= ListToAppend
;
8553 ListHead
->Blink
= ListToAppend
->Blink
;
8554 ListToAppend
->Blink
->Flink
= ListHead
;
8555 ListToAppend
->Blink
= ListEnd
;
8561 _Inout_ PSINGLE_LIST_ENTRY ListHead
)
8563 PSINGLE_LIST_ENTRY FirstEntry
;
8564 FirstEntry
= ListHead
->Next
;
8565 if (FirstEntry
!= NULL
) {
8566 ListHead
->Next
= FirstEntry
->Next
;
8574 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
8575 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry
)
8577 Entry
->Next
= ListHead
->Next
;
8578 ListHead
->Next
= Entry
;
8581 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
8588 _In_ PVOID FailedAssertion
,
8589 _In_ PVOID FileName
,
8590 _In_ ULONG LineNumber
,
8591 _In_opt_ PSTR Message
);
8595 * IN VOID UNALIGNED *Destination,
8596 * IN CONST VOID UNALIGNED *Source,
8599 #define RtlCopyMemory(Destination, Source, Length) \
8600 memcpy(Destination, Source, Length)
8602 #define RtlCopyBytes RtlCopyMemory
8604 #if defined(_M_AMD64)
8608 RtlCopyMemoryNonTemporal(
8609 _Out_writes_bytes_all_(Length
) VOID UNALIGNED
*Destination
,
8610 _In_reads_bytes_(Length
) const VOID UNALIGNED
*Source
,
8611 _In_ SIZE_T Length
);
8613 #define RtlCopyMemoryNonTemporal RtlCopyMemory
8621 #define RtlEqualLuid(Luid1, Luid2) \
8622 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
8626 * IN VOID UNALIGNED *Destination,
8627 * IN CONST VOID UNALIGNED *Source,
8630 #define RtlEqualMemory(Destination, Source, Length) \
8631 (!memcmp(Destination, Source, Length))
8635 * IN VOID UNALIGNED *Destination,
8639 #define RtlFillMemory(Destination, Length, Fill) \
8640 memset(Destination, Fill, Length)
8642 #define RtlFillBytes RtlFillMemory
8644 _IRQL_requires_max_(PASSIVE_LEVEL
)
8648 RtlFreeUnicodeString(
8649 _Inout_
_At_(UnicodeString
->Buffer
, __drv_freesMem(Mem
))
8650 PUNICODE_STRING UnicodeString
);
8652 _IRQL_requires_max_(PASSIVE_LEVEL
)
8653 _Must_inspect_result_
8658 _In_ PUNICODE_STRING GuidString
,
8661 _IRQL_requires_max_(DISPATCH_LEVEL
)
8662 _At_(DestinationString
->Buffer
, _Post_equal_to_(SourceString
))
8663 //_At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
8664 _At_(DestinationString
->MaximumLength
, _Post_equal_to_(DestinationString
->Length
+ sizeof(WCHAR
)))
8668 RtlInitUnicodeString(
8669 _Out_ PUNICODE_STRING DestinationString
,
8670 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
);
8674 * IN VOID UNALIGNED *Destination,
8675 * IN CONST VOID UNALIGNED *Source,
8678 #define RtlMoveMemory(Destination, Source, Length) \
8679 memmove(Destination, Source, Length)
8681 _IRQL_requires_max_(PASSIVE_LEVEL
)
8682 _Must_inspect_result_
8688 _Out_
_At_(GuidString
->Buffer
, __drv_allocatesMem(Mem
))
8689 PUNICODE_STRING GuidString
);
8693 * IN VOID UNALIGNED *Destination,
8696 #define RtlZeroMemory(Destination, Length) \
8697 memset(Destination, 0, Length)
8699 #define RtlZeroBytes RtlZeroMemory
8701 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8703 _Must_inspect_result_
8708 _In_ PRTL_BITMAP BitMapHeader
,
8709 _In_ ULONG StartingIndex
,
8712 _Must_inspect_result_
8717 _In_ PRTL_BITMAP BitMapHeader
,
8718 _In_ ULONG StartingIndex
,
8721 _IRQL_requires_max_(PASSIVE_LEVEL
)
8722 _Must_inspect_result_
8726 RtlAnsiStringToUnicodeString(
8727 _When_(AllocateDestinationString
, _Out_
_At_(DestinationString
->Buffer
, __drv_allocatesMem(Mem
)))
8728 _When_(!AllocateDestinationString
, _Inout_
)
8729 PUNICODE_STRING DestinationString
,
8730 _In_ PANSI_STRING SourceString
,
8731 _In_ BOOLEAN AllocateDestinationString
);
8733 _IRQL_requires_max_(PASSIVE_LEVEL
)
8737 RtlxAnsiStringToUnicodeSize(
8738 _In_ PCANSI_STRING AnsiString
);
8740 #define RtlAnsiStringToUnicodeSize(String) ( \
8741 NLS_MB_CODE_PAGE_TAG ? \
8742 RtlxAnsiStringToUnicodeSize(String) : \
8743 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
8747 _Unchanged_(Destination
->MaximumLength
)
8748 _Unchanged_(Destination
->Buffer
)
8749 _When_(_Old_(Destination
->Length
) + Source
->Length
<= Destination
->MaximumLength
,
8750 _At_(Destination
->Length
, _Post_equal_to_(_Old_(Destination
->Length
) + Source
->Length
))
8751 _At_(return, _Out_range_(==, 0)))
8752 _When_(_Old_(Destination
->Length
) + Source
->Length
> Destination
->MaximumLength
,
8753 _Unchanged_(Destination
->Length
)
8754 _At_(return, _Out_range_(<, 0)))
8758 RtlAppendUnicodeStringToString(
8759 _Inout_ PUNICODE_STRING Destination
,
8760 _In_ PCUNICODE_STRING Source
);
8763 _Unchanged_(Destination
->MaximumLength
)
8764 _Unchanged_(Destination
->Buffer
)
8765 /* _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) <= Destination->MaximumLength,
8766 _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR)))
8767 _At_(return, _Out_range_(==, 0)))
8768 _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) > Destination->MaximumLength,
8769 _Unchanged_(Destination->Length)
8770 _At_(return, _Out_range_(<, 0))) */
8774 RtlAppendUnicodeToString(
8775 _Inout_ PUNICODE_STRING Destination
,
8776 _In_opt_z_ PCWSTR Source
);
8778 _IRQL_requires_max_(PASSIVE_LEVEL
)
8779 _Must_inspect_result_
8783 RtlCheckRegistryKey(
8784 _In_ ULONG RelativeTo
,
8791 _In_ PRTL_BITMAP BitMapHeader
);
8797 _In_ PRTL_BITMAP BitMapHeader
,
8798 _In_range_(0, BitMapHeader
->SizeOfBitMap
- NumberToClear
) ULONG StartingIndex
,
8799 _In_range_(0, BitMapHeader
->SizeOfBitMap
- StartingIndex
) ULONG NumberToClear
);
8801 _Must_inspect_result_
8806 _In_
const VOID
*Source1
,
8807 _In_
const VOID
*Source2
,
8808 _In_ SIZE_T Length
);
8810 _IRQL_requires_max_(PASSIVE_LEVEL
)
8811 _Must_inspect_result_
8815 RtlCompareUnicodeString(
8816 _In_ PCUNICODE_STRING String1
,
8817 _In_ PCUNICODE_STRING String2
,
8818 _In_ BOOLEAN CaseInSensitive
);
8820 _IRQL_requires_max_(PASSIVE_LEVEL
)
8821 _Must_inspect_result_
8825 RtlCompareUnicodeStrings(
8826 _In_reads_(String1Length
) PCWCH String1
,
8827 _In_ SIZE_T String1Length
,
8828 _In_reads_(String2Length
) PCWCH String2
,
8829 _In_ SIZE_T String2Length
,
8830 _In_ BOOLEAN CaseInSensitive
);
8832 _Unchanged_(DestinationString
->Buffer
)
8833 _Unchanged_(DestinationString
->MaximumLength
)
8834 _At_(DestinationString
->Length
,
8835 _When_(SourceString
->Length
> DestinationString
->MaximumLength
,
8836 _Post_equal_to_(DestinationString
->MaximumLength
))
8837 _When_(SourceString
->Length
<= DestinationString
->MaximumLength
,
8838 _Post_equal_to_(SourceString
->Length
)))
8842 RtlCopyUnicodeString(
8843 _Inout_ PUNICODE_STRING DestinationString
,
8844 _In_opt_ PCUNICODE_STRING SourceString
);
8846 _IRQL_requires_max_(PASSIVE_LEVEL
)
8850 RtlCreateRegistryKey(
8851 _In_ ULONG RelativeTo
,
8854 _IRQL_requires_max_(APC_LEVEL
)
8858 RtlCreateSecurityDescriptor(
8859 _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
8860 _In_ ULONG Revision
);
8862 _IRQL_requires_max_(PASSIVE_LEVEL
)
8866 RtlDeleteRegistryValue(
8867 _In_ ULONG RelativeTo
,
8869 _In_z_ PCWSTR ValueName
);
8871 _IRQL_requires_max_(PASSIVE_LEVEL
)
8872 _Must_inspect_result_
8876 RtlEqualUnicodeString(
8877 _In_ CONST UNICODE_STRING
*String1
,
8878 _In_ CONST UNICODE_STRING
*String2
,
8879 _In_ BOOLEAN CaseInSensitive
);
8881 #if !defined(_AMD64_) && !defined(_IA64_)
8885 RtlExtendedIntegerMultiply(
8886 _In_ LARGE_INTEGER Multiplicand
,
8887 _In_ LONG Multiplier
);
8892 RtlExtendedLargeIntegerDivide(
8893 _In_ LARGE_INTEGER Dividend
,
8895 _Out_opt_ PULONG Remainder
);
8898 #if defined(_X86_) || defined(_IA64_)
8902 RtlExtendedMagicDivide(
8903 _In_ LARGE_INTEGER Dividend
,
8904 _In_ LARGE_INTEGER MagicDivisor
,
8905 _In_ CCHAR ShiftCount
);
8908 _IRQL_requires_max_(PASSIVE_LEVEL
)
8913 _Inout_
_At_(AnsiString
->Buffer
, __drv_freesMem(Mem
))
8914 PANSI_STRING AnsiString
);
8916 _Success_(return != -1)
8917 _Must_inspect_result_
8922 _In_ PRTL_BITMAP BitMapHeader
,
8923 _In_ ULONG NumberToFind
,
8924 _In_ ULONG HintIndex
);
8926 _Success_(return != -1)
8930 RtlFindClearBitsAndSet(
8931 _In_ PRTL_BITMAP BitMapHeader
,
8932 _In_ ULONG NumberToFind
,
8933 _In_ ULONG HintIndex
);
8938 RtlFindFirstRunClear(
8939 _In_ PRTL_BITMAP BitMapHeader
,
8940 _Out_ PULONG StartingIndex
);
8946 _In_ PRTL_BITMAP BitMapHeader
,
8947 _Out_writes_to_(SizeOfRunArray
, return) PRTL_BITMAP_RUN RunArray
,
8948 _In_range_(>, 0) ULONG SizeOfRunArray
,
8949 _In_ BOOLEAN LocateLongestRuns
);
8954 RtlFindLastBackwardRunClear(
8955 _In_ PRTL_BITMAP BitMapHeader
,
8956 _In_ ULONG FromIndex
,
8957 _Out_ PULONG StartingRunIndex
);
8959 _Success_(return != -1)
8960 _Must_inspect_result_
8964 RtlFindLeastSignificantBit(
8965 _In_ ULONGLONG Set
);
8970 RtlFindLongestRunClear(
8971 _In_ PRTL_BITMAP BitMapHeader
,
8972 _Out_ PULONG StartingIndex
);
8974 _Success_(return != -1)
8975 _Must_inspect_result_
8979 RtlFindMostSignificantBit(
8980 _In_ ULONGLONG Set
);
8985 RtlFindNextForwardRunClear(
8986 _In_ PRTL_BITMAP BitMapHeader
,
8987 _In_ ULONG FromIndex
,
8988 _Out_ PULONG StartingRunIndex
);
8990 _Success_(return != -1)
8991 _Must_inspect_result_
8996 _In_ PRTL_BITMAP BitMapHeader
,
8997 _In_ ULONG NumberToFind
,
8998 _In_ ULONG HintIndex
);
9000 _Success_(return != -1)
9004 RtlFindSetBitsAndClear(
9005 _In_ PRTL_BITMAP BitMapHeader
,
9006 _In_ ULONG NumberToFind
,
9007 _In_ ULONG HintIndex
);
9009 _IRQL_requires_max_(DISPATCH_LEVEL
)
9014 _Out_ PANSI_STRING DestinationString
,
9015 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
);
9020 RtlInitializeBitMap(
9021 _Out_ PRTL_BITMAP BitMapHeader
,
9022 _In_ __drv_aliasesMem PULONG BitMapBuffer
,
9023 _In_ ULONG SizeOfBitMap
);
9025 _IRQL_requires_max_(DISPATCH_LEVEL
)
9030 _Out_ PSTRING DestinationString
,
9031 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
);
9033 _IRQL_requires_max_(PASSIVE_LEVEL
)
9034 _At_(String
->MaximumLength
, _Const_
)
9038 RtlIntegerToUnicodeString(
9040 _In_opt_ ULONG Base
,
9041 _Inout_ PUNICODE_STRING String
);
9043 _IRQL_requires_max_(PASSIVE_LEVEL
)
9044 _At_(String
->MaximumLength
, _Const_
)
9048 RtlInt64ToUnicodeString(
9049 _In_ ULONGLONG Value
,
9050 _In_opt_ ULONG Base
,
9051 _Inout_ PUNICODE_STRING String
);
9054 #define RtlIntPtrToUnicodeString(Value, Base, String) \
9055 RtlInt64ToUnicodeString(Value, Base, String)
9057 #define RtlIntPtrToUnicodeString(Value, Base, String) \
9058 RtlIntegerToUnicodeString(Value, Base, String)
9065 #define RtlIsZeroLuid(_L1) \
9066 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
9068 _IRQL_requires_max_(APC_LEVEL
)
9072 RtlLengthSecurityDescriptor(
9073 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
9078 RtlNumberOfClearBits(
9079 _In_ PRTL_BITMAP BitMapHeader
);
9085 _In_ PRTL_BITMAP BitMapHeader
);
9087 _IRQL_requires_max_(PASSIVE_LEVEL
)
9091 RtlQueryRegistryValues(
9092 _In_ ULONG RelativeTo
,
9094 _Inout_
_At_(*(*QueryTable
).EntryContext
, _Post_valid_
)
9095 PRTL_QUERY_REGISTRY_TABLE QueryTable
,
9096 _In_opt_ PVOID Context
,
9097 _In_opt_ PVOID Environment
);
9099 #define SHORT_SIZE (sizeof(USHORT))
9100 #define SHORT_MASK (SHORT_SIZE - 1)
9101 #define LONG_SIZE (sizeof(LONG))
9102 #define LONGLONG_SIZE (sizeof(LONGLONG))
9103 #define LONG_MASK (LONG_SIZE - 1)
9104 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
9105 #define LOWBYTE_MASK 0x00FF
9107 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
9108 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
9109 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
9110 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
9116 _In_ PRTL_BITMAP BitMapHeader
);
9122 _In_ PRTL_BITMAP BitMapHeader
,
9123 _In_range_(0, BitMapHeader
->SizeOfBitMap
- NumberToSet
) ULONG StartingIndex
,
9124 _In_range_(0, BitMapHeader
->SizeOfBitMap
- StartingIndex
) ULONG NumberToSet
);
9126 _IRQL_requires_max_(APC_LEVEL
)
9130 RtlSetDaclSecurityDescriptor(
9131 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
9132 _In_ BOOLEAN DaclPresent
,
9134 _In_opt_ BOOLEAN DaclDefaulted
);
9136 #if defined(_AMD64_)
9140 * IN PULONG Address,
9143 #define RtlStoreUlong(Address,Value) \
9144 *(ULONG UNALIGNED *)(Address) = (Value)
9147 * RtlStoreUlonglong(
9148 * IN OUT PULONGLONG Address,
9151 #define RtlStoreUlonglong(Address,Value) \
9152 *(ULONGLONG UNALIGNED *)(Address) = (Value)
9156 * IN PUSHORT Address,
9159 #define RtlStoreUshort(Address,Value) \
9160 *(USHORT UNALIGNED *)(Address) = (Value)
9163 * RtlRetrieveUshort(
9164 * PUSHORT DestinationAddress,
9165 * PUSHORT SourceAddress);
9167 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
9168 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
9172 * PULONG DestinationAddress,
9173 * PULONG SourceAddress);
9175 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
9176 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
9180 #define RtlStoreUlong(Address,Value) \
9181 if ((ULONG_PTR)(Address) & LONG_MASK) { \
9182 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
9183 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
9184 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
9185 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
9188 *((PULONG)(Address)) = (ULONG) (Value); \
9191 #define RtlStoreUlonglong(Address,Value) \
9192 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
9193 RtlStoreUlong((ULONG_PTR)(Address), \
9194 (ULONGLONG)(Value) & 0xFFFFFFFF); \
9195 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
9196 (ULONGLONG)(Value) >> 32); \
9198 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
9201 #define RtlStoreUshort(Address,Value) \
9202 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
9203 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
9204 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
9207 *((PUSHORT) (Address)) = (USHORT)Value; \
9210 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
9211 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
9213 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
9214 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
9218 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
9221 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
9222 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
9224 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
9225 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
9226 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
9227 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
9231 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
9234 #endif /* defined(_AMD64_) */
9239 * IN OUT PULONG_PTR Address,
9240 * IN ULONG_PTR Value);
9242 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
9244 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
9247 _Success_(return != 0)
9251 RtlTimeFieldsToTime(
9252 _In_ PTIME_FIELDS TimeFields
,
9253 _Out_ PLARGE_INTEGER Time
);
9258 RtlTimeToTimeFields(
9259 _In_ PLARGE_INTEGER Time
,
9260 _Out_ PTIME_FIELDS TimeFields
);
9271 RtlUlonglongByteSwap(
9272 _In_ ULONGLONG Source
);
9274 _When_(AllocateDestinationString
,
9275 _At_(DestinationString
->MaximumLength
,
9276 _Out_range_(<=, (SourceString
->MaximumLength
/ sizeof(WCHAR
)))))
9277 _When_(!AllocateDestinationString
,
9278 _At_(DestinationString
->Buffer
, _Const_
)
9279 _At_(DestinationString
->MaximumLength
, _Const_
))
9280 _IRQL_requires_max_(PASSIVE_LEVEL
)
9281 _When_(AllocateDestinationString
, _Must_inspect_result_
)
9285 RtlUnicodeStringToAnsiString(
9286 _When_(AllocateDestinationString
, _Out_
_At_(DestinationString
->Buffer
, __drv_allocatesMem(Mem
)))
9287 _When_(!AllocateDestinationString
, _Inout_
)
9288 PANSI_STRING DestinationString
,
9289 _In_ PCUNICODE_STRING SourceString
,
9290 _In_ BOOLEAN AllocateDestinationString
);
9292 _IRQL_requires_max_(PASSIVE_LEVEL
)
9296 RtlxUnicodeStringToAnsiSize(
9297 _In_ PCUNICODE_STRING UnicodeString
);
9299 #define RtlUnicodeStringToAnsiSize(String) ( \
9300 NLS_MB_CODE_PAGE_TAG ? \
9301 RtlxUnicodeStringToAnsiSize(String) : \
9302 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
9305 _IRQL_requires_max_(PASSIVE_LEVEL
)
9309 RtlUnicodeStringToInteger(
9310 _In_ PCUNICODE_STRING String
,
9311 _In_opt_ ULONG Base
,
9312 _Out_ PULONG Value
);
9314 _IRQL_requires_max_(PASSIVE_LEVEL
)
9318 RtlUpcaseUnicodeChar(
9319 _In_ WCHAR SourceCharacter
);
9325 _In_ USHORT Source
);
9327 _IRQL_requires_max_(APC_LEVEL
)
9328 _Must_inspect_result_
9332 RtlValidRelativeSecurityDescriptor(
9333 _In_reads_bytes_(SecurityDescriptorLength
) PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
9334 _In_ ULONG SecurityDescriptorLength
,
9335 _In_ SECURITY_INFORMATION RequiredInformation
);
9337 _IRQL_requires_max_(APC_LEVEL
)
9338 _Must_inspect_result_
9342 RtlValidSecurityDescriptor(
9343 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
9345 _IRQL_requires_max_(PASSIVE_LEVEL
)
9349 RtlWriteRegistryValue(
9350 _In_ ULONG RelativeTo
,
9352 _In_z_ PCWSTR ValueName
,
9353 _In_ ULONG ValueType
,
9354 _In_reads_bytes_opt_(ValueLength
) PVOID ValueData
,
9355 _In_ ULONG ValueLength
);
9358 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
9361 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
9365 RtlPrefetchMemoryNonTemporal(
9367 _In_ SIZE_T Length
);
9371 #if (NTDDI_VERSION >= NTDDI_WINXP)
9378 _In_ PRTL_BITMAP BitMapHeader
,
9379 _In_range_(<, BitMapHeader
->SizeOfBitMap
) ULONG BitNumber
);
9381 _IRQL_requires_max_(PASSIVE_LEVEL
)
9385 RtlDowncaseUnicodeChar(
9386 _In_ WCHAR SourceCharacter
);
9392 _In_ PRTL_BITMAP BitMapHeader
,
9393 _In_range_(<, BitMapHeader
->SizeOfBitMap
) ULONG BitNumber
);
9395 _Must_inspect_result_
9400 _In_ PRTL_BITMAP BitMapHeader
,
9401 _In_range_(<, BitMapHeader
->SizeOfBitMap
) ULONG BitNumber
);
9403 _IRQL_requires_max_(PASSIVE_LEVEL
)
9407 RtlHashUnicodeString(
9408 _In_ CONST UNICODE_STRING
*String
,
9409 _In_ BOOLEAN CaseInSensitive
,
9410 _In_ ULONG HashAlgorithm
,
9411 _Out_ PULONG HashValue
);
9415 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
9418 #if (NTDDI_VERSION >= NTDDI_VISTA)
9423 RtlNumberOfSetBitsUlongPtr(
9424 _In_ ULONG_PTR Target
);
9429 RtlIoDecodeMemIoResource(
9430 _In_
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
9431 _Out_opt_ PULONGLONG Alignment
,
9432 _Out_opt_ PULONGLONG MinimumAddress
,
9433 _Out_opt_ PULONGLONG MaximumAddress
);
9438 RtlIoEncodeMemIoResource(
9439 _In_
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
9441 _In_ ULONGLONG Length
,
9442 _In_ ULONGLONG Alignment
,
9443 _In_ ULONGLONG MinimumAddress
,
9444 _In_ ULONGLONG MaximumAddress
);
9449 RtlCmDecodeMemIoResource(
9450 _In_
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
*Descriptor
,
9451 _Out_opt_ PULONGLONG Start
);
9456 RtlFindClosestEncodableLength(
9457 _In_ ULONGLONG SourceLength
,
9458 _Out_ PULONGLONG TargetLength
);
9463 RtlCmEncodeMemIoResource(
9464 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
9466 _In_ ULONGLONG Length
,
9467 _In_ ULONGLONG Start
);
9470 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
9472 #if (NTDDI_VERSION >= NTDDI_WIN7)
9474 _IRQL_requires_max_(PASSIVE_LEVEL
)
9475 _Must_inspect_result_
9480 _Out_writes_bytes_to_(UTF8StringMaxByteCount
, *UTF8StringActualByteCount
)
9481 PCHAR UTF8StringDestination
,
9482 _In_ ULONG UTF8StringMaxByteCount
,
9483 _Out_ PULONG UTF8StringActualByteCount
,
9484 _In_reads_bytes_(UnicodeStringByteCount
) PCWCH UnicodeStringSource
,
9485 _In_ ULONG UnicodeStringByteCount
);
9487 _IRQL_requires_max_(PASSIVE_LEVEL
)
9488 _Must_inspect_result_
9493 _Out_writes_bytes_to_(UnicodeStringMaxByteCount
, *UnicodeStringActualByteCount
)
9494 PWSTR UnicodeStringDestination
,
9495 _In_ ULONG UnicodeStringMaxByteCount
,
9496 _Out_ PULONG UnicodeStringActualByteCount
,
9497 _In_reads_bytes_(UTF8StringByteCount
) PCCH UTF8StringSource
,
9498 _In_ ULONG UTF8StringByteCount
);
9503 RtlGetEnabledExtendedFeatures(
9504 IN ULONG64 FeatureMask
);
9507 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
9510 #if !defined(MIDL_PASS)
9511 /* inline funftions */
9512 //DECLSPEC_DEPRECATED_DDK_WINXP
9516 RtlConvertLongToLargeInteger(
9517 _In_ LONG SignedInteger
)
9520 ret
.QuadPart
= SignedInteger
;
9524 //DECLSPEC_DEPRECATED_DDK_WINXP
9528 RtlConvertUlongToLargeInteger(
9529 _In_ ULONG UnsignedInteger
)
9532 ret
.QuadPart
= UnsignedInteger
;
9536 //DECLSPEC_DEPRECATED_DDK_WINXP
9540 RtlLargeIntegerShiftLeft(
9541 _In_ LARGE_INTEGER LargeInteger
,
9542 _In_ CCHAR ShiftCount
)
9544 LARGE_INTEGER Result
;
9546 Result
.QuadPart
= LargeInteger
.QuadPart
<< ShiftCount
;
9550 //DECLSPEC_DEPRECATED_DDK_WINXP
9554 RtlLargeIntegerShiftRight(
9555 _In_ LARGE_INTEGER LargeInteger
,
9556 _In_ CCHAR ShiftCount
)
9558 LARGE_INTEGER Result
;
9560 Result
.QuadPart
= (ULONG64
)LargeInteger
.QuadPart
>> ShiftCount
;
9564 //DECLSPEC_DEPRECATED_DDK
9568 RtlEnlargedUnsignedDivide(
9569 _In_ ULARGE_INTEGER Dividend
,
9571 _Out_opt_ PULONG Remainder
)
9574 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
9575 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
9578 //DECLSPEC_DEPRECATED_DDK
9582 RtlLargeIntegerNegate(
9583 _In_ LARGE_INTEGER Subtrahend
)
9585 LARGE_INTEGER Difference
;
9587 Difference
.QuadPart
= -Subtrahend
.QuadPart
;
9591 //DECLSPEC_DEPRECATED_DDK
9595 RtlLargeIntegerSubtract(
9596 _In_ LARGE_INTEGER Minuend
,
9597 _In_ LARGE_INTEGER Subtrahend
)
9599 LARGE_INTEGER Difference
;
9601 Difference
.QuadPart
= Minuend
.QuadPart
- Subtrahend
.QuadPart
;
9605 //DECLSPEC_DEPRECATED_DDK
9609 RtlEnlargedUnsignedMultiply(
9610 _In_ ULONG Multiplicand
,
9611 _In_ ULONG Multiplier
)
9614 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
9618 //DECLSPEC_DEPRECATED_DDK
9622 RtlEnlargedIntegerMultiply(
9623 _In_ LONG Multiplicand
,
9624 _In_ LONG Multiplier
)
9627 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
9631 _At_(AnsiString
->Buffer
, _Post_equal_to_(Buffer
))
9632 _At_(AnsiString
->Length
, _Post_equal_to_(0))
9633 _At_(AnsiString
->MaximumLength
, _Post_equal_to_(BufferSize
))
9636 RtlInitEmptyAnsiString(
9637 _Out_ PANSI_STRING AnsiString
,
9638 _Pre_maybenull_
_Pre_readable_size_(BufferSize
) __drv_aliasesMem PCHAR Buffer
,
9639 _In_ USHORT BufferSize
)
9641 AnsiString
->Length
= 0;
9642 AnsiString
->MaximumLength
= BufferSize
;
9643 AnsiString
->Buffer
= Buffer
;
9646 _At_(UnicodeString
->Buffer
, _Post_equal_to_(Buffer
))
9647 _At_(UnicodeString
->Length
, _Post_equal_to_(0))
9648 _At_(UnicodeString
->MaximumLength
, _Post_equal_to_(BufferSize
))
9651 RtlInitEmptyUnicodeString(
9652 _Out_ PUNICODE_STRING UnicodeString
,
9653 _Writable_bytes_(BufferSize
)
9654 _When_(BufferSize
!= 0, _Notnull_
)
9655 __drv_aliasesMem PWSTR Buffer
,
9656 _In_ USHORT BufferSize
)
9658 UnicodeString
->Length
= 0;
9659 UnicodeString
->MaximumLength
= BufferSize
;
9660 UnicodeString
->Buffer
= Buffer
;
9663 #if defined(_AMD64_) || defined(_IA64_)
9669 RtlExtendedIntegerMultiply(
9670 _In_ LARGE_INTEGER Multiplicand
,
9671 _In_ LONG Multiplier
)
9674 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
9681 RtlExtendedLargeIntegerDivide(
9682 _In_ LARGE_INTEGER Dividend
,
9684 _Out_opt_ PULONG Remainder
)
9687 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
9689 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
9695 #endif /* defined(_AMD64_) || defined(_IA64_) */
9698 #if defined(_AMD64_)
9700 #define MultiplyHigh __mulh
9701 #define UnsignedMultiplyHigh __umulh
9703 //DECLSPEC_DEPRECATED_DDK
9707 RtlExtendedMagicDivide(
9708 _In_ LARGE_INTEGER Dividend
,
9709 _In_ LARGE_INTEGER MagicDivisor
,
9710 _In_ CCHAR ShiftCount
)
9715 Pos
= (Dividend
.QuadPart
>= 0);
9716 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
9717 MagicDivisor
.QuadPart
);
9718 ret64
>>= ShiftCount
;
9719 ret
.QuadPart
= Pos
? ret64
: -(LONG64
)ret64
;
9724 //DECLSPEC_DEPRECATED_DDK
9729 _In_ LARGE_INTEGER Addend1
,
9730 _In_ LARGE_INTEGER Addend2
)
9733 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
9738 * RtlLargeIntegerAnd(
9739 * IN OUT LARGE_INTEGER Result,
9740 * IN LARGE_INTEGER Source,
9741 * IN LARGE_INTEGER Mask);
9743 #define RtlLargeIntegerAnd(Result, Source, Mask) \
9744 Result.QuadPart = Source.QuadPart & Mask.QuadPart
9746 //DECLSPEC_DEPRECATED_DDK
9750 RtlLargeIntegerArithmeticShift(
9751 _In_ LARGE_INTEGER LargeInteger
,
9752 _In_ CCHAR ShiftCount
)
9755 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
9760 * RtlLargeIntegerEqualTo(
9761 * IN LARGE_INTEGER Operand1,
9762 * IN LARGE_INTEGER Operand2);
9764 #define RtlLargeIntegerEqualTo(X,Y) \
9765 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
9769 RtlSecureZeroMemory(
9770 _Out_writes_bytes_all_(Size
) PVOID Pointer
,
9773 volatile char* vptr
= (volatile char*)Pointer
;
9774 #if defined(_M_AMD64)
9775 __stosb((PUCHAR
)vptr
, 0, Size
);
9777 char * endptr
= (char *)vptr
+ Size
;
9778 while (vptr
< endptr
) {
9785 #if defined(_M_AMD64)
9786 _Must_inspect_result_
9790 _In_ PRTL_BITMAP BitMapHeader
,
9791 _In_range_(<, BitMapHeader
->SizeOfBitMap
) ULONG BitPosition
)
9793 return BitTest64((LONG64 CONST
*)BitMapHeader
->Buffer
, (LONG64
)BitPosition
);
9796 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
9797 #endif /* defined(_M_AMD64) */
9799 #define RtlLargeIntegerGreaterThan(X,Y) ( \
9800 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
9801 ((X).HighPart > (Y).HighPart) \
9804 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
9805 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
9806 ((X).HighPart > (Y).HighPart) \
9809 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
9810 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
9813 #define RtlLargeIntegerLessThan(X,Y) ( \
9814 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
9815 ((X).HighPart < (Y).HighPart) \
9818 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
9819 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
9820 ((X).HighPart < (Y).HighPart) \
9823 #define RtlLargeIntegerGreaterThanZero(X) ( \
9824 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
9825 ((X).HighPart > 0 ) \
9828 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
9830 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
9832 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
9834 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
9836 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
9838 #endif /* !defined(MIDL_PASS) */
9840 /* Byte Swap Functions */
9841 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
9842 ((defined(_M_AMD64) || defined(_M_IA64)) \
9843 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
9845 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
9846 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
9847 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
9853 #define ASSERT(exp) \
9855 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
9857 #define ASSERTMSG(msg, exp) \
9859 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
9861 #define RTL_SOFT_ASSERT(exp) \
9863 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
9865 #define RTL_SOFT_ASSERTMSG(msg, exp) \
9867 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
9869 #define RTL_VERIFY(exp) ASSERT(exp)
9870 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
9872 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
9873 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
9875 #if defined(_MSC_VER)
9877 #define NT_ASSERT(exp) \
9879 (__annotation(L"Debug", L"AssertFail", L#exp), \
9880 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9882 #define NT_ASSERTMSG(msg, exp) \
9884 (__annotation(L"Debug", L"AssertFail", L##msg), \
9885 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9887 #define NT_ASSERTMSGW(msg, exp) \
9889 (__annotation(L"Debug", L"AssertFail", msg), \
9890 DbgRaiseAssertionFailure(), FALSE) : TRUE)
9892 #define NT_VERIFY NT_ASSERT
9893 #define NT_VERIFYMSG NT_ASSERTMSG
9894 #define NT_VERIFYMSGW NT_ASSERTMSGW
9898 /* GCC doesn't support __annotation (nor PDB) */
9899 #define NT_ASSERT(exp) \
9900 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
9902 #define NT_ASSERTMSG NT_ASSERT
9903 #define NT_ASSERTMSGW NT_ASSERT
9909 #define ASSERT(exp) ((VOID) 0)
9910 #define ASSERTMSG(msg, exp) ((VOID) 0)
9912 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
9913 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
9915 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
9916 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9918 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
9919 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
9921 #define NT_ASSERT(exp) ((VOID)0)
9922 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
9923 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
9925 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
9926 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
9927 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
9931 #define InitializeListHead32(ListHead) (\
9932 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
9934 #if !defined(_WINBASE_)
9936 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
9940 InitializeSListHead(
9941 _Out_ PSLIST_HEADER SListHead
);
9947 InitializeSListHead(
9948 _Out_ PSLIST_HEADER SListHead
)
9951 ULONG64 FeatureBits
;
9955 if (((ULONG_PTR
)SListHead
& 0xf) != 0) {
9956 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
9959 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
9961 FeatureBits
= __getReg(CV_IA64_CPUID4
);
9962 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0) {
9963 SListHead
->Header16
.HeaderType
= 1;
9964 SListHead
->Header16
.Init
= 1;
9973 #define InterlockedPopEntrySList(Head) \
9974 ExpInterlockedPopEntrySList(Head)
9976 #define InterlockedPushEntrySList(Head, Entry) \
9977 ExpInterlockedPushEntrySList(Head, Entry)
9979 #define InterlockedFlushSList(Head) \
9980 ExpInterlockedFlushSList(Head)
9982 #define QueryDepthSList(Head) \
9983 ExQueryDepthSList(Head)
9985 #else /* !defined(_WIN64) */
9990 InterlockedPopEntrySList(
9991 _Inout_ PSLIST_HEADER ListHead
);
9996 InterlockedPushEntrySList(
9997 _Inout_ PSLIST_HEADER ListHead
,
9998 _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry
);
10000 #define InterlockedFlushSList(ListHead) \
10001 ExInterlockedFlushSList(ListHead)
10003 #define QueryDepthSList(Head) \
10004 ExQueryDepthSList(Head)
10006 #endif /* !defined(_WIN64) */
10008 #endif /* !defined(_WINBASE_) */
10010 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
10011 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
10012 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
10013 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
10014 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
10015 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
10016 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
10017 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
10018 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
10019 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
10020 (PCONTEXT_EX)(Context + 1), \
10024 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable
)(
10025 _In_ ULONG Version
);
10028 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled
)(
10029 _In_ ULONG Version
);
10031 #ifndef RtlIsNtDdiVersionAvailable
10032 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
10035 #ifndef RtlIsServicePackVersionInstalled
10036 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
10039 #define RtlInterlockedSetBits(Flags, Flag) \
10040 InterlockedOr((PLONG)(Flags), Flag)
10042 #define RtlInterlockedAndBits(Flags, Flag) \
10043 InterlockedAnd((PLONG)(Flags), Flag)
10045 #define RtlInterlockedClearBits(Flags, Flag) \
10046 RtlInterlockedAndBits(Flags, ~(Flag))
10048 #define RtlInterlockedXorBits(Flags, Flag) \
10049 InterlockedXor(Flags, Flag)
10051 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
10052 (VOID) RtlInterlockedSetBits(Flags, Flag)
10054 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
10055 (VOID) RtlInterlockedAndBits(Flags, Flag)
10057 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
10058 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
10061 /******************************************************************************
10062 * Kernel Functions *
10063 ******************************************************************************/
10068 _Out_ PRKEVENT Event
,
10069 _In_ EVENT_TYPE Type
,
10070 _In_ BOOLEAN State
);
10072 _IRQL_requires_max_(DISPATCH_LEVEL
)
10077 _Inout_ PRKEVENT Event
);
10079 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10081 #if defined(_NTDDK_) || defined(_NTIFS_)
10082 _Maybe_raises_SEH_exception_
10083 _IRQL_requires_max_(APC_LEVEL
)
10088 __in_data_source(USER_MODE
) _In_reads_bytes_(Length
) CONST VOID
*Address
, /* CONST is added */
10089 _In_ SIZE_T Length
,
10090 _In_ ULONG Alignment
);
10091 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
10093 _Maybe_raises_SEH_exception_
10094 _IRQL_requires_max_(APC_LEVEL
)
10099 __in_data_source(USER_MODE
) _Inout_updates_bytes_(Length
) PVOID Address
,
10100 _In_ SIZE_T Length
,
10101 _In_ ULONG Alignment
);
10103 #if defined(SINGLE_GROUP_LEGACY_API)
10105 _IRQL_requires_min_(PASSIVE_LEVEL
)
10106 _IRQL_requires_max_(APC_LEVEL
)
10110 KeRevertToUserAffinityThread(VOID
);
10112 _IRQL_requires_min_(PASSIVE_LEVEL
)
10113 _IRQL_requires_max_(APC_LEVEL
)
10117 KeSetSystemAffinityThread(
10118 _In_ KAFFINITY Affinity
);
10123 KeSetTargetProcessorDpc(
10124 _Inout_ PRKDPC Dpc
,
10125 _In_ CCHAR Number
);
10130 KeQueryActiveProcessors(VOID
);
10131 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
10133 #if !defined(_M_AMD64)
10137 KeQueryInterruptTime(VOID
);
10143 _Out_ PLARGE_INTEGER CurrentTime
);
10144 #endif /* !_M_AMD64 */
10146 #if !defined(_X86_) && !defined(_M_ARM)
10147 _Requires_lock_not_held_(*SpinLock
)
10148 _Acquires_lock_(*SpinLock
)
10149 _IRQL_requires_max_(DISPATCH_LEVEL
)
10151 _IRQL_raises_(DISPATCH_LEVEL
)
10155 KeAcquireSpinLockRaiseToDpc(
10156 _Inout_ PKSPIN_LOCK SpinLock
);
10158 #define KeAcquireSpinLock(SpinLock, OldIrql) \
10159 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
10161 _Requires_lock_not_held_(*SpinLock
)
10162 _Acquires_lock_(*SpinLock
)
10163 _IRQL_requires_min_(DISPATCH_LEVEL
)
10167 KeAcquireSpinLockAtDpcLevel(
10168 _Inout_ PKSPIN_LOCK SpinLock
);
10170 _Requires_lock_held_(*SpinLock
)
10171 _Releases_lock_(*SpinLock
)
10172 _IRQL_requires_(DISPATCH_LEVEL
)
10177 _Inout_ PKSPIN_LOCK SpinLock
,
10178 _In_ _IRQL_restores_ KIRQL NewIrql
);
10180 _Requires_lock_held_(*SpinLock
)
10181 _Releases_lock_(*SpinLock
)
10182 _IRQL_requires_min_(DISPATCH_LEVEL
)
10186 KeReleaseSpinLockFromDpcLevel(
10187 _Inout_ PKSPIN_LOCK SpinLock
);
10188 #endif /* !_X86_ */
10190 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
10194 KeInitializeSpinLock(
10195 _Out_ PKSPIN_LOCK SpinLock
);
10199 KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock
)
10201 /* Clear the lock */
10206 //DECLSPEC_NORETURN
10211 _In_ ULONG BugCheckCode
,
10212 _In_ ULONG_PTR BugCheckParameter1
,
10213 _In_ ULONG_PTR BugCheckParameter2
,
10214 _In_ ULONG_PTR BugCheckParameter3
,
10215 _In_ ULONG_PTR BugCheckParameter4
);
10217 _IRQL_requires_max_(DISPATCH_LEVEL
)
10224 _IRQL_requires_min_(PASSIVE_LEVEL
)
10225 _IRQL_requires_max_(APC_LEVEL
)
10229 KeDelayExecutionThread(
10230 _In_ KPROCESSOR_MODE WaitMode
,
10231 _In_ BOOLEAN Alertable
,
10232 _In_ PLARGE_INTEGER Interval
);
10234 _Must_inspect_result_
10238 KeDeregisterBugCheckCallback(
10239 _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
10241 _Acquires_lock_(_Global_critical_region_
)
10242 _IRQL_requires_max_(APC_LEVEL
)
10246 KeEnterCriticalRegion(VOID
);
10248 _IRQL_requires_max_(DISPATCH_LEVEL
)
10252 KeInitializeDeviceQueue(
10253 _Out_ PKDEVICE_QUEUE DeviceQueue
);
10259 _Out_ __drv_aliasesMem PRKDPC Dpc
,
10260 _In_ PKDEFERRED_ROUTINE DeferredRoutine
,
10261 _In_opt_ __drv_aliasesMem PVOID DeferredContext
);
10267 _Out_ PRKMUTEX Mutex
,
10270 _IRQL_requires_max_(PASSIVE_LEVEL
)
10274 KeInitializeSemaphore(
10275 _Out_ PRKSEMAPHORE Semaphore
,
10279 _IRQL_requires_max_(DISPATCH_LEVEL
)
10284 _Out_ PKTIMER Timer
);
10286 _IRQL_requires_max_(DISPATCH_LEVEL
)
10290 KeInitializeTimerEx(
10291 _Out_ PKTIMER Timer
,
10292 _In_ TIMER_TYPE Type
);
10294 _IRQL_requires_(DISPATCH_LEVEL
)
10298 KeInsertByKeyDeviceQueue(
10299 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
10300 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
10301 _In_ ULONG SortKey
);
10303 _IRQL_requires_(DISPATCH_LEVEL
)
10307 KeInsertDeviceQueue(
10308 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
10309 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
10315 _Inout_ PRKDPC Dpc
,
10316 _In_opt_ PVOID SystemArgument1
,
10317 _In_opt_ PVOID SystemArgument2
);
10319 _Releases_lock_(_Global_critical_region_
)
10320 _IRQL_requires_max_(APC_LEVEL
)
10324 KeLeaveCriticalRegion(VOID
);
10329 KeQueryPerformanceCounter(
10330 _Out_opt_ PLARGE_INTEGER PerformanceFrequency
);
10332 _IRQL_requires_max_(PASSIVE_LEVEL
)
10336 KeQueryPriorityThread(
10337 _In_ PRKTHREAD Thread
);
10342 KeQueryTimeIncrement(VOID
);
10344 _IRQL_requires_max_(DISPATCH_LEVEL
)
10349 _In_ PRKEVENT Event
);
10351 _IRQL_requires_max_(DISPATCH_LEVEL
)
10356 _In_ PRKMUTEX Mutex
);
10358 _IRQL_requires_max_(DISPATCH_LEVEL
)
10362 KeReadStateSemaphore(
10363 _In_ PRKSEMAPHORE Semaphore
);
10365 _IRQL_requires_max_(DISPATCH_LEVEL
)
10370 _In_ PKTIMER Timer
);
10372 _Must_inspect_result_
10376 KeRegisterBugCheckCallback(
10377 _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
10378 _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
10379 _In_reads_bytes_opt_(Length
) PVOID Buffer
,
10381 _In_ PUCHAR Component
);
10383 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
10384 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
10389 _Inout_ PRKMUTEX Mutex
,
10390 _In_ BOOLEAN Wait
);
10392 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
10393 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
10397 KeReleaseSemaphore(
10398 _Inout_ PRKSEMAPHORE Semaphore
,
10399 _In_ KPRIORITY Increment
,
10400 _In_ LONG Adjustment
,
10401 _In_ _Literal_ BOOLEAN Wait
);
10403 _IRQL_requires_(DISPATCH_LEVEL
)
10405 PKDEVICE_QUEUE_ENTRY
10407 KeRemoveByKeyDeviceQueue(
10408 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
10409 _In_ ULONG SortKey
);
10411 _IRQL_requires_(DISPATCH_LEVEL
)
10413 PKDEVICE_QUEUE_ENTRY
10415 KeRemoveDeviceQueue(
10416 _Inout_ PKDEVICE_QUEUE DeviceQueue
);
10418 _IRQL_requires_max_(DISPATCH_LEVEL
)
10422 KeRemoveEntryDeviceQueue(
10423 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
10424 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
10426 _IRQL_requires_max_(HIGH_LEVEL
)
10431 _Inout_ PRKDPC Dpc
);
10433 _IRQL_requires_max_(DISPATCH_LEVEL
)
10438 _Inout_ PRKEVENT Event
);
10440 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
10441 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
10446 _Inout_ PRKEVENT Event
,
10447 _In_ KPRIORITY Increment
,
10448 _In_ _Literal_ BOOLEAN Wait
);
10453 KeSetImportanceDpc(
10454 _Inout_ PRKDPC Dpc
,
10455 _In_ KDPC_IMPORTANCE Importance
);
10457 _IRQL_requires_min_(PASSIVE_LEVEL
)
10458 _IRQL_requires_max_(DISPATCH_LEVEL
)
10462 KeSetPriorityThread(
10463 _Inout_ PKTHREAD Thread
,
10464 _In_ KPRIORITY Priority
);
10466 _IRQL_requires_max_(DISPATCH_LEVEL
)
10471 _Inout_ PKTIMER Timer
,
10472 _In_ LARGE_INTEGER DueTime
,
10473 _In_opt_ PKDPC Dpc
);
10475 _IRQL_requires_max_(DISPATCH_LEVEL
)
10480 _Inout_ PKTIMER Timer
,
10481 _In_ LARGE_INTEGER DueTime
,
10482 _In_ LONG Period OPTIONAL
,
10483 _In_opt_ PKDPC Dpc
);
10488 KeStallExecutionProcessor(
10489 _In_ ULONG MicroSeconds
);
10491 _IRQL_requires_max_(HIGH_LEVEL
)
10495 KeSynchronizeExecution(
10496 _Inout_ PKINTERRUPT Interrupt
,
10497 _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
10498 _In_opt_ __drv_aliasesMem PVOID SynchronizeContext
);
10500 _IRQL_requires_min_(PASSIVE_LEVEL
)
10501 _When_((Timeout
==NULL
|| *Timeout
!=0), _IRQL_requires_max_(APC_LEVEL
))
10502 _When_((Timeout
!=NULL
&& *Timeout
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
10506 KeWaitForMultipleObjects(
10508 _In_reads_(Count
) PVOID Object
[],
10509 _In_
__drv_strictTypeMatch(__drv_typeConst
) WAIT_TYPE WaitType
,
10510 _In_
__drv_strictTypeMatch(__drv_typeCond
) KWAIT_REASON WaitReason
,
10511 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
) KPROCESSOR_MODE WaitMode
,
10512 _In_ BOOLEAN Alertable
,
10513 _In_opt_ PLARGE_INTEGER Timeout
,
10514 _Out_opt_ PKWAIT_BLOCK WaitBlockArray
);
10516 #define KeWaitForMutexObject KeWaitForSingleObject
10518 _IRQL_requires_min_(PASSIVE_LEVEL
)
10519 _When_((Timeout
==NULL
|| *Timeout
!=0), _IRQL_requires_max_(APC_LEVEL
))
10520 _When_((Timeout
!=NULL
&& *Timeout
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
10524 KeWaitForSingleObject(
10525 _In_ _Points_to_data_ PVOID Object
,
10526 _In_
__drv_strictTypeMatch(__drv_typeCond
) KWAIT_REASON WaitReason
,
10527 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
) KPROCESSOR_MODE WaitMode
,
10528 _In_ BOOLEAN Alertable
,
10529 _In_opt_ PLARGE_INTEGER Timeout
);
10531 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10533 #if (NTDDI_VERSION >= NTDDI_WINXP)
10535 _Requires_lock_not_held_(*LockHandle
)
10536 _Acquires_lock_(*LockHandle
)
10537 _Post_same_lock_(*SpinLock
, *LockHandle
)
10538 _IRQL_requires_max_(DISPATCH_LEVEL
)
10539 _IRQL_saves_global_(QueuedSpinLock
,LockHandle
)
10540 _IRQL_raises_(DISPATCH_LEVEL
)
10541 _DECL_HAL_KE_IMPORT
10544 KeAcquireInStackQueuedSpinLock(
10545 _Inout_ PKSPIN_LOCK SpinLock
,
10546 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
10548 _Requires_lock_not_held_(*LockHandle
)
10549 _Acquires_lock_(*LockHandle
)
10550 _Post_same_lock_(*SpinLock
, *LockHandle
)
10551 _IRQL_requires_min_(DISPATCH_LEVEL
)
10555 KeAcquireInStackQueuedSpinLockAtDpcLevel(
10556 _Inout_ PKSPIN_LOCK SpinLock
,
10557 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
10559 _Requires_lock_not_held_(*Interrupt
->ActualLock
)
10560 _Acquires_lock_(*Interrupt
->ActualLock
)
10561 _IRQL_requires_max_(HIGH_LEVEL
)
10563 _IRQL_raises_(HIGH_LEVEL
)
10567 KeAcquireInterruptSpinLock(
10568 _Inout_ PKINTERRUPT Interrupt
);
10570 _IRQL_requires_min_(PASSIVE_LEVEL
)
10571 _IRQL_requires_max_(DISPATCH_LEVEL
)
10575 KeAreApcsDisabled(VOID
);
10580 KeGetRecommendedSharedDataAlignment(VOID
);
10582 _IRQL_requires_max_(PASSIVE_LEVEL
)
10586 KeQueryRuntimeThread(
10587 _In_ PKTHREAD Thread
,
10588 _Out_ PULONG UserTime
);
10590 _Requires_lock_held_(*LockHandle
)
10591 _Releases_lock_(*LockHandle
)
10592 _IRQL_requires_(DISPATCH_LEVEL
)
10596 KeReleaseInStackQueuedSpinLockFromDpcLevel(
10597 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
10599 _Requires_lock_held_(*Interrupt
->ActualLock
)
10600 _Releases_lock_(*Interrupt
->ActualLock
)
10601 _IRQL_requires_(HIGH_LEVEL
)
10605 KeReleaseInterruptSpinLock(
10606 _Inout_ PKINTERRUPT Interrupt
,
10607 _In_ _IRQL_restores_ KIRQL OldIrql
);
10609 _IRQL_requires_(DISPATCH_LEVEL
)
10611 PKDEVICE_QUEUE_ENTRY
10613 KeRemoveByKeyDeviceQueueIfBusy(
10614 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
10615 _In_ ULONG SortKey
);
10617 _Requires_lock_held_(*LockHandle
)
10618 _Releases_lock_(*LockHandle
)
10619 _IRQL_requires_(DISPATCH_LEVEL
)
10620 _IRQL_restores_global_(QueuedSpinLock
,LockHandle
)
10621 _DECL_HAL_KE_IMPORT
10624 KeReleaseInStackQueuedSpinLock(
10625 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
10627 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10629 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
10631 _Must_inspect_result_
10635 KeDeregisterBugCheckReasonCallback(
10636 _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
10638 _Must_inspect_result_
10642 KeRegisterBugCheckReasonCallback(
10643 _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
,
10644 _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
,
10645 _In_ KBUGCHECK_CALLBACK_REASON Reason
,
10646 _In_ PUCHAR Component
);
10648 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
10650 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
10651 _IRQL_requires_max_(APC_LEVEL
)
10655 KeFlushQueuedDpcs(VOID
);
10656 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
10657 #if (NTDDI_VERSION >= NTDDI_WS03)
10659 _IRQL_requires_max_(APC_LEVEL
)
10663 KeRegisterNmiCallback(
10664 _In_ PNMI_CALLBACK CallbackRoutine
,
10665 _In_opt_ PVOID Context
);
10667 _IRQL_requires_max_(APC_LEVEL
)
10671 KeDeregisterNmiCallback(
10672 _In_ PVOID Handle
);
10677 KeInitializeThreadedDpc(
10679 _In_ PKDEFERRED_ROUTINE DeferredRoutine
,
10680 _In_opt_ PVOID DeferredContext
);
10682 _IRQL_requires_min_(PASSIVE_LEVEL
)
10683 _IRQL_requires_max_(IPI_LEVEL
-1)
10688 _In_ PKIPI_BROADCAST_WORKER BroadcastFunction
,
10689 _In_ ULONG_PTR Context
);
10691 _Requires_lock_not_held_(*SpinLock
)
10692 _Acquires_lock_(*SpinLock
)
10693 _IRQL_requires_max_(DISPATCH_LEVEL
)
10698 KeAcquireSpinLockForDpc(
10699 _Inout_ PKSPIN_LOCK SpinLock
);
10701 _Requires_lock_held_(*SpinLock
)
10702 _Releases_lock_(*SpinLock
)
10703 _IRQL_requires_(DISPATCH_LEVEL
)
10707 KeReleaseSpinLockForDpc(
10708 _Inout_ PKSPIN_LOCK SpinLock
,
10709 _In_ _IRQL_restores_ KIRQL OldIrql
);
10711 _Must_inspect_result_
10716 _In_ PKSPIN_LOCK SpinLock
);
10718 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
10719 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10721 _Must_inspect_result_
10722 _IRQL_requires_min_(DISPATCH_LEVEL
)
10723 _Post_satisfies_(return == 1 || return == 0)
10727 KeTryToAcquireSpinLockAtDpcLevel(
10728 _Inout_
_Requires_lock_not_held_(*_Curr_
)
10729 _When_(return!=0, _Acquires_lock_(*_Curr_
))
10730 PKSPIN_LOCK SpinLock
);
10732 _IRQL_requires_min_(PASSIVE_LEVEL
)
10733 _IRQL_requires_max_(DISPATCH_LEVEL
)
10737 KeAreAllApcsDisabled(VOID
);
10739 _Acquires_lock_(_Global_critical_region_
)
10740 _Requires_lock_not_held_(*Mutex
)
10741 _Acquires_lock_(*Mutex
)
10742 _IRQL_requires_max_(APC_LEVEL
)
10743 _IRQL_requires_min_(PASSIVE_LEVEL
)
10747 KeAcquireGuardedMutex(
10748 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
10750 _Requires_lock_not_held_(*FastMutex
)
10751 _Acquires_lock_(*FastMutex
)
10752 _IRQL_requires_max_(APC_LEVEL
)
10753 _IRQL_requires_min_(PASSIVE_LEVEL
)
10757 KeAcquireGuardedMutexUnsafe(
10758 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
10760 _Acquires_lock_(_Global_critical_region_
)
10761 _IRQL_requires_max_(APC_LEVEL
)
10765 KeEnterGuardedRegion(VOID
);
10767 _Releases_lock_(_Global_critical_region_
)
10768 _IRQL_requires_max_(APC_LEVEL
)
10772 KeLeaveGuardedRegion(VOID
);
10774 _IRQL_requires_max_(APC_LEVEL
)
10775 _IRQL_requires_min_(PASSIVE_LEVEL
)
10779 KeInitializeGuardedMutex(
10780 _Out_ PKGUARDED_MUTEX GuardedMutex
);
10782 _Requires_lock_held_(*FastMutex
)
10783 _Releases_lock_(*FastMutex
)
10784 _IRQL_requires_max_(APC_LEVEL
)
10788 KeReleaseGuardedMutexUnsafe(
10789 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
10791 _Releases_lock_(_Global_critical_region_
)
10792 _Requires_lock_held_(*Mutex
)
10793 _Releases_lock_(*Mutex
)
10794 _IRQL_requires_max_(APC_LEVEL
)
10798 KeReleaseGuardedMutex(
10799 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
10801 _Must_inspect_result_
10802 _Success_(return != FALSE
)
10803 _IRQL_requires_max_(APC_LEVEL
)
10804 _Post_satisfies_(return == 1 || return == 0)
10808 KeTryToAcquireGuardedMutex(
10809 _When_ (return, _Requires_lock_not_held_(*_Curr_
) _Acquires_exclusive_lock_(*_Curr_
)) _Acquires_lock_(_Global_critical_region_
)
10810 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
10811 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
10813 #if (NTDDI_VERSION >= NTDDI_VISTA)
10814 _Requires_lock_not_held_(*LockHandle
)
10815 _Acquires_lock_(*LockHandle
)
10816 _Post_same_lock_(*SpinLock
, *LockHandle
)
10817 _IRQL_requires_max_(DISPATCH_LEVEL
)
10818 _IRQL_saves_global_(QueuedSpinLock
,LockHandle
)
10822 KeAcquireInStackQueuedSpinLockForDpc(
10823 _Inout_ PKSPIN_LOCK SpinLock
,
10824 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
10826 _Requires_lock_held_(*LockHandle
)
10827 _Releases_lock_(*LockHandle
)
10828 _IRQL_requires_(DISPATCH_LEVEL
)
10829 _IRQL_restores_global_(QueuedSpinLock
,LockHandle
)
10833 KeReleaseInStackQueuedSpinLockForDpc(
10834 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
10836 _IRQL_requires_(DISPATCH_LEVEL
)
10840 KeQueryDpcWatchdogInformation(
10841 _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation
);
10842 #if defined(SINGLE_GROUP_LEGACY_API)
10844 _IRQL_requires_min_(PASSIVE_LEVEL
)
10845 _IRQL_requires_max_(APC_LEVEL
)
10849 KeSetSystemAffinityThreadEx(
10850 _In_ KAFFINITY Affinity
);
10852 _IRQL_requires_min_(PASSIVE_LEVEL
)
10853 _IRQL_requires_max_(APC_LEVEL
)
10857 KeRevertToUserAffinityThreadEx(
10858 _In_ KAFFINITY Affinity
);
10863 KeQueryActiveProcessorCount(
10864 _Out_opt_ PKAFFINITY ActiveProcessors
);
10869 KeQueryMaximumProcessorCount(VOID
);
10870 #endif /* SINGLE_GROUP_LEGACY_API */
10872 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10874 #if (NTDDI_VERSION >= NTDDI_WS08)
10876 _IRQL_requires_max_(APC_LEVEL
)
10879 KeRegisterProcessorChangeCallback(
10880 _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction
,
10881 _In_opt_ PVOID CallbackContext
,
10884 _IRQL_requires_max_(APC_LEVEL
)
10887 KeDeregisterProcessorChangeCallback(
10888 _In_ PVOID CallbackHandle
);
10890 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
10891 #if (NTDDI_VERSION >= NTDDI_WIN7)
10893 _IRQL_requires_max_(DISPATCH_LEVEL
)
10894 _IRQL_requires_min_(PASSIVE_LEVEL
)
10895 _IRQL_requires_same_
10898 KeQueryTotalCycleTimeProcess(
10899 _Inout_ PKPROCESS Process
,
10900 _Out_ PULONG64 CycleTimeStamp
);
10902 _IRQL_requires_max_(APC_LEVEL
)
10903 _IRQL_requires_min_(PASSIVE_LEVEL
)
10904 _IRQL_requires_same_
10907 KeQueryTotalCycleTimeThread(
10908 _Inout_ PKTHREAD Thread
,
10909 _Out_ PULONG64 CycleTimeStamp
);
10911 _Must_inspect_result_
10915 KeSetTargetProcessorDpcEx(
10917 _In_ PPROCESSOR_NUMBER ProcNumber
);
10919 _IRQL_requires_min_(PASSIVE_LEVEL
)
10920 _IRQL_requires_max_(APC_LEVEL
)
10924 KeSetSystemGroupAffinityThread(
10925 _In_ PGROUP_AFFINITY Affinity
,
10926 _Out_opt_ PGROUP_AFFINITY PreviousAffinity
);
10928 _IRQL_requires_min_(PASSIVE_LEVEL
)
10929 _IRQL_requires_max_(APC_LEVEL
)
10933 KeRevertToUserGroupAffinityThread(
10934 _In_ PGROUP_AFFINITY PreviousAffinity
);
10936 _IRQL_requires_max_(DISPATCH_LEVEL
)
10940 KeSetCoalescableTimer(
10941 _Inout_ PKTIMER Timer
,
10942 _In_ LARGE_INTEGER DueTime
,
10944 _In_ ULONG TolerableDelay
,
10945 _In_opt_ PKDPC Dpc
);
10950 KeQueryUnbiasedInterruptTime(VOID
);
10955 KeQueryActiveProcessorCountEx(
10956 _In_ USHORT GroupNumber
);
10961 KeQueryMaximumProcessorCountEx(
10962 _In_ USHORT GroupNumber
);
10967 KeQueryActiveGroupCount(VOID
);
10972 KeQueryMaximumGroupCount(VOID
);
10977 KeQueryGroupAffinity(
10978 _In_ USHORT GroupNumber
);
10983 KeGetCurrentProcessorNumberEx(
10984 _Out_opt_ PPROCESSOR_NUMBER ProcNumber
);
10989 KeQueryNodeActiveAffinity(
10990 _In_ USHORT NodeNumber
,
10991 _Out_opt_ PGROUP_AFFINITY Affinity
,
10992 _Out_opt_ PUSHORT Count
);
10997 KeQueryNodeMaximumProcessorCount(
10998 _In_ USHORT NodeNumber
);
11003 KeQueryHighestNodeNumber(VOID
);
11008 KeGetCurrentNodeNumber(VOID
);
11010 _IRQL_requires_max_(DISPATCH_LEVEL
)
11014 KeQueryLogicalProcessorRelationship(
11015 _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
11016 _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
11017 _Out_writes_bytes_opt_(*Length
) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information
,
11018 _Inout_ PULONG Length
);
11020 _Must_inspect_result_
11021 _IRQL_requires_max_(DISPATCH_LEVEL
)
11023 _When_(return==0, _Kernel_float_saved_
)
11027 KeSaveExtendedProcessorState(
11029 _Out_
_Requires_lock_not_held_(*_Curr_
)
11030 _When_(return==0, _Acquires_lock_(*_Curr_
))
11031 PXSTATE_SAVE XStateSave
);
11033 _Kernel_float_restored_
11037 KeRestoreExtendedProcessorState(
11038 _In_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
11039 PXSTATE_SAVE XStateSave
);
11043 KeGetProcessorNumberFromIndex(
11044 _In_ ULONG ProcIndex
,
11045 _Out_ PPROCESSOR_NUMBER ProcNumber
);
11049 KeGetProcessorIndexFromNumber(
11050 _In_ PPROCESSOR_NUMBER ProcNumber
);
11051 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
11052 #if !defined(_IA64_)
11056 KeFlushWriteBuffer(VOID
);
11060 * KeInitializeCallbackRecord(
11061 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
11063 #define KeInitializeCallbackRecord(CallbackRecord) \
11064 CallbackRecord->State = BufferEmpty;
11066 #if defined(_PREFAST_)
11068 void __PREfastPagedCode(void);
11069 void __PREfastPagedCodeLocked(void);
11070 #define PAGED_CODE() __PREfastPagedCode();
11071 #define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked();
11075 #if (NTDDI_VERSION >= NTDDI_VISTA)
11076 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
11078 #define PAGED_ASSERT( exp ) ASSERT( exp )
11081 #define PAGED_CODE() { \
11082 if (KeGetCurrentIrql() > APC_LEVEL) { \
11083 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
11084 PAGED_ASSERT(FALSE); \
11088 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
11092 #define PAGED_CODE() NOP_FUNCTION;
11093 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
11097 /******************************************************************************
11098 * Memory manager Functions *
11099 ******************************************************************************/
11100 /* Alignment Macros */
11101 #define ALIGN_DOWN_BY(size, align) \
11102 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
11104 #define ALIGN_UP_BY(size, align) \
11105 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
11107 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
11108 ((PVOID)ALIGN_DOWN_BY(ptr, align))
11110 #define ALIGN_UP_POINTER_BY(ptr, align) \
11111 ((PVOID)ALIGN_UP_BY(ptr, align))
11113 #define ALIGN_DOWN(size, type) \
11114 ALIGN_DOWN_BY(size, sizeof(type))
11116 #define ALIGN_UP(size, type) \
11117 ALIGN_UP_BY(size, sizeof(type))
11119 #define ALIGN_DOWN_POINTER(ptr, type) \
11120 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
11122 #define ALIGN_UP_POINTER(ptr, type) \
11123 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
11125 #ifndef FIELD_OFFSET
11126 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
11130 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
11133 #define POOL_TAGGING 1
11136 #define IF_DEBUG if (TRUE)
11138 #define IF_DEBUG if (FALSE)
11145 #define BYTE_OFFSET(Va) \
11146 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
11152 #define BYTES_TO_PAGES(Size) \
11153 (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT)
11159 #define PAGE_ALIGN(Va) \
11160 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
11164 * IN ULONG_PTR Size)
11166 #define ROUND_TO_PAGES(Size) \
11167 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
11170 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
11174 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
11175 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
11176 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
11178 #define COMPUTE_PAGES_SPANNED(Va, Size) \
11179 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
11183 * MmGetMdlByteCount(
11186 #define MmGetMdlByteCount(_Mdl) \
11187 ((_Mdl)->ByteCount)
11191 * MmGetMdlByteOffset(
11194 #define MmGetMdlByteOffset(_Mdl) \
11195 ((_Mdl)->ByteOffset)
11197 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
11201 * MmGetMdlPfnArray(
11204 #define MmGetMdlPfnArray(_Mdl) \
11205 ((PPFN_NUMBER) ((_Mdl) + 1))
11209 * MmGetMdlVirtualAddress(
11212 #define MmGetMdlVirtualAddress(_Mdl) \
11213 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
11215 #define MmGetProcedureAddress(Address) (Address)
11216 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
11218 /* PVOID MmGetSystemAddressForMdl(
11221 #define MmGetSystemAddressForMdl(Mdl) \
11222 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
11223 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
11224 ((Mdl)->MappedSystemVa) : \
11225 (MmMapLockedPages((Mdl), KernelMode)))
11228 * MmGetSystemAddressForMdlSafe(
11230 * IN MM_PAGE_PRIORITY Priority)
11232 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
11233 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
11234 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
11235 (_Mdl)->MappedSystemVa : \
11236 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
11237 KernelMode, MmCached, NULL, FALSE, (_Priority)))
11242 * IN PMDL MemoryDescriptorList,
11244 * IN SIZE_T Length)
11246 #define MmInitializeMdl(_MemoryDescriptorList, \
11250 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
11251 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
11252 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
11253 (_MemoryDescriptorList)->MdlFlags = 0; \
11254 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
11255 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
11256 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
11261 * MmPrepareMdlForReuse(
11264 #define MmPrepareMdlForReuse(_Mdl) \
11266 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
11267 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
11268 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
11269 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
11270 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
11274 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11275 _Must_inspect_result_
11276 _IRQL_requires_max_(DISPATCH_LEVEL
)
11277 _When_ (return != NULL
, _Post_writable_byte_size_ (NumberOfBytes
))
11281 MmAllocateContiguousMemory(
11282 _In_ SIZE_T NumberOfBytes
,
11283 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress
);
11285 _Must_inspect_result_
11286 _IRQL_requires_max_(DISPATCH_LEVEL
)
11287 _When_ (return != NULL
, _Post_writable_byte_size_ (NumberOfBytes
))
11291 MmAllocateContiguousMemorySpecifyCache(
11292 _In_ SIZE_T NumberOfBytes
,
11293 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress
,
11294 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress
,
11295 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple
,
11296 _In_ MEMORY_CACHING_TYPE CacheType
);
11298 _Must_inspect_result_
11299 _IRQL_requires_max_(DISPATCH_LEVEL
)
11303 MmAllocatePagesForMdl(
11304 _In_ PHYSICAL_ADDRESS LowAddress
,
11305 _In_ PHYSICAL_ADDRESS HighAddress
,
11306 _In_ PHYSICAL_ADDRESS SkipBytes
,
11307 _In_ SIZE_T TotalBytes
);
11309 _IRQL_requires_max_(DISPATCH_LEVEL
)
11313 MmBuildMdlForNonPagedPool(
11314 _Inout_ PMDLX MemoryDescriptorList
);
11316 //DECLSPEC_DEPRECATED_DDK
11321 _Out_writes_bytes_opt_ (sizeof (MDL
) + (sizeof (PFN_NUMBER
) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base
, Length
)))
11322 PMDL MemoryDescriptorList
,
11323 _In_reads_bytes_opt_ (Length
) PVOID Base
,
11324 _In_ SIZE_T Length
);
11326 _IRQL_requires_max_(DISPATCH_LEVEL
)
11330 MmFreeContiguousMemory(
11331 _In_ PVOID BaseAddress
);
11333 _IRQL_requires_max_ (DISPATCH_LEVEL
)
11337 MmFreeContiguousMemorySpecifyCache(
11338 _In_reads_bytes_ (NumberOfBytes
) PVOID BaseAddress
,
11339 _In_ SIZE_T NumberOfBytes
,
11340 _In_ MEMORY_CACHING_TYPE CacheType
);
11342 _IRQL_requires_max_(DISPATCH_LEVEL
)
11346 MmFreePagesFromMdl(
11347 _Inout_ PMDLX MemoryDescriptorList
);
11349 _IRQL_requires_max_(PASSIVE_LEVEL
)
11353 MmGetSystemRoutineAddress(
11354 _In_ PUNICODE_STRING SystemRoutineName
);
11359 MmIsDriverVerifying(
11360 _In_
struct _DRIVER_OBJECT
*DriverObject
);
11362 _Must_inspect_result_
11363 _IRQL_requires_max_(APC_LEVEL
)
11367 MmLockPagableDataSection(
11368 _In_ PVOID AddressWithinSection
);
11370 _Must_inspect_result_
11371 _IRQL_requires_max_(DISPATCH_LEVEL
)
11372 _Out_writes_bytes_opt_ (NumberOfBytes
)
11377 _In_ PHYSICAL_ADDRESS PhysicalAddress
,
11378 _In_ SIZE_T NumberOfBytes
,
11379 _In_ MEMORY_CACHING_TYPE CacheType
);
11381 _Must_inspect_result_
11382 _When_(AccessMode
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
11383 _When_(AccessMode
==1, _Maybe_raises_SEH_exception_
_IRQL_requires_max_(APC_LEVEL
))
11388 _Inout_ PMDL MemoryDescriptorList
,
11389 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
)
11390 KPROCESSOR_MODE AccessMode
);
11392 _Post_writable_byte_size_(MemoryDescriptorList
->ByteCount
)
11393 _When_(AccessMode
==KernelMode
, _IRQL_requires_max_(DISPATCH_LEVEL
))
11394 _When_(AccessMode
==UserMode
, _Maybe_raises_SEH_exception_
_IRQL_requires_max_(APC_LEVEL
) _Post_notnull_
)
11395 _At_(MemoryDescriptorList
->MappedSystemVa
, _Post_writable_byte_size_(MemoryDescriptorList
->ByteCount
))
11396 _Must_inspect_result_
11397 _Success_(return != NULL
)
11401 MmMapLockedPagesSpecifyCache(
11402 _Inout_ PMDLX MemoryDescriptorList
,
11403 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
)
11404 KPROCESSOR_MODE AccessMode
,
11405 _In_
__drv_strictTypeMatch(__drv_typeCond
) MEMORY_CACHING_TYPE CacheType
,
11406 _In_opt_ PVOID BaseAddress
,
11407 _In_ ULONG BugCheckOnFailure
,
11408 _In_ MM_PAGE_PRIORITY Priority
);
11410 _IRQL_requires_max_(APC_LEVEL
)
11414 MmPageEntireDriver(
11415 _In_ PVOID AddressWithinSection
);
11417 _IRQL_requires_max_(DISPATCH_LEVEL
)
11418 _At_(MemoryDescriptorList
->StartVa
+ MemoryDescriptorList
->ByteOffset
,
11419 _Field_size_bytes_opt_(MemoryDescriptorList
->ByteCount
))
11423 MmProbeAndLockPages(
11424 _Inout_ PMDLX MemoryDescriptorList
,
11425 _In_ KPROCESSOR_MODE AccessMode
,
11426 _In_ LOCK_OPERATION Operation
);
11431 MmQuerySystemSize(VOID
);
11433 _IRQL_requires_max_(APC_LEVEL
)
11437 MmResetDriverPaging(
11438 _In_ PVOID AddressWithinSection
);
11444 _In_reads_bytes_opt_ (Length
) PVOID Base
,
11445 _In_ SIZE_T Length
);
11447 _IRQL_requires_max_(DISPATCH_LEVEL
)
11451 MmUnlockPagableImageSection(
11452 _In_ PVOID ImageSectionHandle
);
11454 _IRQL_requires_max_(DISPATCH_LEVEL
)
11459 _Inout_ PMDLX MemoryDescriptorList
);
11461 _IRQL_requires_max_(DISPATCH_LEVEL
)
11466 _In_reads_bytes_ (NumberOfBytes
) PVOID BaseAddress
,
11467 _In_ SIZE_T NumberOfBytes
);
11469 _IRQL_requires_max_ (APC_LEVEL
)
11473 MmProbeAndLockProcessPages(
11474 _Inout_ PMDL MemoryDescriptorList
,
11475 _In_ PEPROCESS Process
,
11476 _In_ KPROCESSOR_MODE AccessMode
,
11477 _In_ LOCK_OPERATION Operation
);
11479 _IRQL_requires_max_(DISPATCH_LEVEL
)
11483 MmUnmapLockedPages(
11484 _In_ PVOID BaseAddress
,
11485 _Inout_ PMDL MemoryDescriptorList
);
11487 _Must_inspect_result_
11488 _IRQL_requires_max_(DISPATCH_LEVEL
)
11489 _When_ (return != NULL
, _Post_writable_byte_size_ (NumberOfBytes
))
11493 MmAllocateContiguousMemorySpecifyCacheNode(
11494 _In_ SIZE_T NumberOfBytes
,
11495 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress
,
11496 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress
,
11497 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple
,
11498 _In_ MEMORY_CACHING_TYPE CacheType
,
11499 _In_ NODE_REQUIREMENT PreferredNode
);
11501 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11503 #if (NTDDI_VERSION >= NTDDI_WINXP)
11505 _IRQL_requires_max_(DISPATCH_LEVEL
)
11511 _In_ ULONG NumberOfBytes
);
11513 _Must_inspect_result_
11514 _IRQL_requires_max_(APC_LEVEL
)
11515 _When_ (return != NULL
, _Out_writes_bytes_opt_ (NumberOfBytes
))
11519 MmAllocateMappingAddress(
11520 _In_ SIZE_T NumberOfBytes
,
11521 _In_ ULONG PoolTag
);
11523 _IRQL_requires_max_(APC_LEVEL
)
11527 MmFreeMappingAddress(
11528 _In_ PVOID BaseAddress
,
11529 _In_ ULONG PoolTag
);
11531 _IRQL_requires_max_ (APC_LEVEL
)
11535 MmIsVerifierEnabled(
11536 _Out_ PULONG VerifierFlags
);
11538 _Post_writable_byte_size_(MemoryDescriptorList
->ByteCount
)
11539 _IRQL_requires_max_(DISPATCH_LEVEL
)
11540 _At_(MemoryDescriptorList
->MappedSystemVa
+ MemoryDescriptorList
->ByteOffset
,
11541 _Post_writable_byte_size_(MemoryDescriptorList
->ByteCount
))
11542 _Must_inspect_result_
11543 _Success_(return != NULL
)
11547 MmMapLockedPagesWithReservedMapping(
11548 _In_ PVOID MappingAddress
,
11549 _In_ ULONG PoolTag
,
11550 _Inout_ PMDLX MemoryDescriptorList
,
11551 _In_
__drv_strictTypeMatch(__drv_typeCond
)
11552 MEMORY_CACHING_TYPE CacheType
);
11554 _Must_inspect_result_
11555 _IRQL_requires_max_(DISPATCH_LEVEL
)
11559 MmProtectMdlSystemAddress(
11560 _In_ PMDLX MemoryDescriptorList
,
11561 _In_ ULONG NewProtect
);
11563 _IRQL_requires_max_(DISPATCH_LEVEL
)
11567 MmUnmapReservedMapping(
11568 _In_ PVOID BaseAddress
,
11569 _In_ ULONG PoolTag
,
11570 _Inout_ PMDLX MemoryDescriptorList
);
11572 _IRQL_requires_max_ (APC_LEVEL
)
11576 MmAddVerifierThunks(
11577 _In_reads_bytes_ (ThunkBufferSize
) PVOID ThunkBuffer
,
11578 _In_ ULONG ThunkBufferSize
);
11580 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
11581 #if (NTDDI_VERSION >= NTDDI_WS03)
11582 _IRQL_requires_max_ (DISPATCH_LEVEL
)
11587 _In_ PHYSICAL_ADDRESS StartAddress
,
11588 _In_ SIZE_T NumberOfBytes
);
11590 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
11591 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11592 _Must_inspect_result_
11593 _IRQL_requires_max_ (DISPATCH_LEVEL
)
11597 MmAllocatePagesForMdlEx(
11598 _In_ PHYSICAL_ADDRESS LowAddress
,
11599 _In_ PHYSICAL_ADDRESS HighAddress
,
11600 _In_ PHYSICAL_ADDRESS SkipBytes
,
11601 _In_ SIZE_T TotalBytes
,
11602 _In_ MEMORY_CACHING_TYPE CacheType
,
11606 #if (NTDDI_VERSION >= NTDDI_VISTA)
11607 _IRQL_requires_max_ (APC_LEVEL
)
11611 MmIsDriverVerifyingByAddress(
11612 _In_ PVOID AddressWithinSection
);
11613 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11615 /******************************************************************************
11616 * Security Manager Functions *
11617 ******************************************************************************/
11619 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11620 _IRQL_requires_max_(PASSIVE_LEVEL
)
11625 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
11626 _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
11627 _In_ BOOLEAN SubjectContextLocked
,
11628 _In_ ACCESS_MASK DesiredAccess
,
11629 _In_ ACCESS_MASK PreviouslyGrantedAccess
,
11630 _Outptr_opt_ PPRIVILEGE_SET
*Privileges
,
11631 _In_ PGENERIC_MAPPING GenericMapping
,
11632 _In_ KPROCESSOR_MODE AccessMode
,
11633 _Out_ PACCESS_MASK GrantedAccess
,
11634 _Out_ PNTSTATUS AccessStatus
);
11636 _IRQL_requires_max_(PASSIVE_LEVEL
)
11641 _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor
,
11642 _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor
,
11643 _Out_ PSECURITY_DESCRIPTOR
*NewDescriptor
,
11644 _In_ BOOLEAN IsDirectoryObject
,
11645 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext
,
11646 _In_ PGENERIC_MAPPING GenericMapping
,
11647 _In_ POOL_TYPE PoolType
);
11652 SeAssignSecurityEx(
11653 _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor
,
11654 _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor
,
11655 _Out_ PSECURITY_DESCRIPTOR
*NewDescriptor
,
11656 _In_opt_ GUID
*ObjectType
,
11657 _In_ BOOLEAN IsDirectoryObject
,
11658 _In_ ULONG AutoInheritFlags
,
11659 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext
,
11660 _In_ PGENERIC_MAPPING GenericMapping
,
11661 _In_ POOL_TYPE PoolType
);
11663 _IRQL_requires_max_(PASSIVE_LEVEL
)
11667 SeDeassignSecurity(
11668 _Inout_ PSECURITY_DESCRIPTOR
*SecurityDescriptor
);
11670 _IRQL_requires_max_(PASSIVE_LEVEL
)
11674 SeValidSecurityDescriptor(
11676 _In_reads_bytes_(Length
) PSECURITY_DESCRIPTOR SecurityDescriptor
);
11681 SeObjectCreateSaclAccessBits(
11682 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
11687 SeReleaseSubjectContext(
11688 _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext
);
11693 SeUnlockSubjectContext(
11694 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext
);
11699 SeCaptureSubjectContext(
11700 _Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext
);
11705 SeLockSubjectContext(
11706 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext
);
11709 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11711 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11713 _At_(AuditParameters
->ParameterCount
, _Const_
)
11716 SeSetAuditParameter(
11717 _Inout_ PSE_ADT_PARAMETER_ARRAY AuditParameters
,
11718 _In_ SE_ADT_PARAMETER_TYPE Type
,
11719 _In_range_(<,SE_MAX_AUDIT_PARAMETERS
) ULONG Index
,
11720 _In_reads_(_Inexpressible_("depends on SE_ADT_PARAMETER_TYPE"))
11725 SeReportSecurityEvent(
11727 _In_ PUNICODE_STRING SourceName
,
11728 _In_opt_ PSID UserSid
,
11729 _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters
);
11731 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11733 #if (NTDDI_VERSION >= NTDDI_VISTA)
11737 SeComputeAutoInheritByObjectType(
11738 _In_ PVOID ObjectType
,
11739 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
11740 _In_opt_ PSECURITY_DESCRIPTOR ParentSecurityDescriptor
);
11742 #ifdef SE_NTFS_WORLD_CACHE
11746 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
11747 _In_ PGENERIC_MAPPING GenericMapping
,
11748 _Out_ PACCESS_MASK GrantedAccess
);
11749 #endif /* SE_NTFS_WORLD_CACHE */
11750 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11751 /******************************************************************************
11752 * Configuration Manager Functions *
11753 ******************************************************************************/
11755 #if (NTDDI_VERSION >= NTDDI_WINXP)
11756 _IRQL_requires_max_(APC_LEVEL
)
11760 CmRegisterCallback(
11761 _In_ PEX_CALLBACK_FUNCTION Function
,
11762 _In_opt_ PVOID Context
,
11763 _Out_ PLARGE_INTEGER Cookie
);
11765 _IRQL_requires_max_(APC_LEVEL
)
11769 CmUnRegisterCallback(
11770 _In_ LARGE_INTEGER Cookie
);
11773 #if (NTDDI_VERSION >= NTDDI_VISTA)
11775 _IRQL_requires_max_(APC_LEVEL
)
11779 CmRegisterCallbackEx(
11780 _In_ PEX_CALLBACK_FUNCTION Function
,
11781 _In_ PCUNICODE_STRING Altitude
,
11783 _In_opt_ PVOID Context
,
11784 _Out_ PLARGE_INTEGER Cookie
,
11785 _Reserved_ PVOID Reserved
);
11787 _IRQL_requires_max_(APC_LEVEL
)
11791 CmGetCallbackVersion(
11792 _Out_opt_ PULONG Major
,
11793 _Out_opt_ PULONG Minor
);
11795 _IRQL_requires_max_(APC_LEVEL
)
11799 CmSetCallbackObjectContext(
11800 _Inout_ PVOID Object
,
11801 _In_ PLARGE_INTEGER Cookie
,
11802 _In_ PVOID NewContext
,
11803 _Out_opt_ PVOID
*OldContext
);
11805 _IRQL_requires_max_(APC_LEVEL
)
11809 CmCallbackGetKeyObjectID(
11810 _In_ PLARGE_INTEGER Cookie
,
11812 _Out_opt_ PULONG_PTR ObjectID
,
11813 _Outptr_opt_ PCUNICODE_STRING
*ObjectName
);
11815 _IRQL_requires_max_(APC_LEVEL
)
11819 CmGetBoundTransaction(
11820 _In_ PLARGE_INTEGER Cookie
,
11821 _In_ PVOID Object
);
11823 #endif // NTDDI_VERSION >= NTDDI_VISTA
11826 /******************************************************************************
11827 * I/O Manager Functions *
11828 ******************************************************************************/
11832 * IoAcquireRemoveLock(
11833 * IN PIO_REMOVE_LOCK RemoveLock,
11834 * IN OPTIONAL PVOID Tag)
11837 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11838 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
11840 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11841 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
11846 * IoAdjustPagingPathCount(
11848 * IN BOOLEAN Increment)
11850 #define IoAdjustPagingPathCount(_Count, \
11855 InterlockedIncrement(_Count); \
11859 InterlockedDecrement(_Count); \
11863 #if !defined(_M_AMD64)
11867 READ_PORT_BUFFER_UCHAR(
11875 READ_PORT_BUFFER_ULONG(
11883 READ_PORT_BUFFER_USHORT(
11909 READ_REGISTER_BUFFER_UCHAR(
11910 IN PUCHAR Register
,
11917 READ_REGISTER_BUFFER_ULONG(
11918 IN PULONG Register
,
11925 READ_REGISTER_BUFFER_USHORT(
11926 IN PUSHORT Register
,
11933 READ_REGISTER_UCHAR(
11934 IN PUCHAR Register
);
11939 READ_REGISTER_ULONG(
11940 IN PULONG Register
);
11945 READ_REGISTER_USHORT(
11946 IN PUSHORT Register
);
11951 WRITE_PORT_BUFFER_UCHAR(
11959 WRITE_PORT_BUFFER_ULONG(
11967 WRITE_PORT_BUFFER_USHORT(
11996 WRITE_REGISTER_BUFFER_UCHAR(
11997 IN PUCHAR Register
,
12004 WRITE_REGISTER_BUFFER_ULONG(
12005 IN PULONG Register
,
12012 WRITE_REGISTER_BUFFER_USHORT(
12013 IN PUSHORT Register
,
12020 WRITE_REGISTER_UCHAR(
12021 IN PUCHAR Register
,
12027 WRITE_REGISTER_ULONG(
12028 IN PULONG Register
,
12034 WRITE_REGISTER_USHORT(
12035 IN PUSHORT Register
,
12042 READ_PORT_BUFFER_UCHAR(
12047 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12052 READ_PORT_BUFFER_ULONG(
12057 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12062 READ_PORT_BUFFER_USHORT(
12067 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12075 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
12083 return __indword((USHORT
)(ULONG_PTR
)Port
);
12091 return __inword((USHORT
)(ULONG_PTR
)Port
);
12096 READ_REGISTER_BUFFER_UCHAR(
12097 IN PUCHAR Register
,
12101 __movsb(Register
, Buffer
, Count
);
12106 READ_REGISTER_BUFFER_ULONG(
12107 IN PULONG Register
,
12111 __movsd(Register
, Buffer
, Count
);
12116 READ_REGISTER_BUFFER_USHORT(
12117 IN PUSHORT Register
,
12121 __movsw(Register
, Buffer
, Count
);
12126 READ_REGISTER_UCHAR(
12127 IN
volatile UCHAR
*Register
)
12134 READ_REGISTER_ULONG(
12135 IN
volatile ULONG
*Register
)
12142 READ_REGISTER_USHORT(
12143 IN
volatile USHORT
*Register
)
12150 WRITE_PORT_BUFFER_UCHAR(
12155 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12160 WRITE_PORT_BUFFER_ULONG(
12165 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12170 WRITE_PORT_BUFFER_USHORT(
12175 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12184 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
12193 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
12202 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
12207 WRITE_REGISTER_BUFFER_UCHAR(
12208 IN PUCHAR Register
,
12213 __movsb(Register
, Buffer
, Count
);
12214 InterlockedOr(&Synch
, 1);
12219 WRITE_REGISTER_BUFFER_ULONG(
12220 IN PULONG Register
,
12225 __movsd(Register
, Buffer
, Count
);
12226 InterlockedOr(&Synch
, 1);
12231 WRITE_REGISTER_BUFFER_USHORT(
12232 IN PUSHORT Register
,
12237 __movsw(Register
, Buffer
, Count
);
12238 InterlockedOr(&Synch
, 1);
12243 WRITE_REGISTER_UCHAR(
12244 IN
volatile UCHAR
*Register
,
12249 InterlockedOr(&Synch
, 1);
12254 WRITE_REGISTER_ULONG(
12255 IN
volatile ULONG
*Register
,
12260 InterlockedOr(&Synch
, 1);
12265 WRITE_REGISTER_USHORT(
12266 IN
volatile USHORT
*Register
,
12271 InterlockedOr(&Sync
, 1);
12275 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
12276 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
12278 #define DMA_MACROS_DEFINED
12280 _IRQL_requires_max_(DISPATCH_LEVEL
)
12281 _IRQL_requires_min_(DISPATCH_LEVEL
)
12284 IoAllocateAdapterChannel(
12285 _In_ PDMA_ADAPTER DmaAdapter
,
12286 _In_ PDEVICE_OBJECT DeviceObject
,
12287 _In_ ULONG NumberOfMapRegisters
,
12288 _In_ PDRIVER_CONTROL ExecutionRoutine
,
12289 _In_ PVOID Context
)
12291 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
12292 AllocateAdapterChannel
=
12293 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
12294 ASSERT(AllocateAdapterChannel
);
12295 return AllocateAdapterChannel(DmaAdapter
,
12297 NumberOfMapRegisters
,
12305 IoFlushAdapterBuffers(
12306 _In_ PDMA_ADAPTER DmaAdapter
,
12308 _In_ PVOID MapRegisterBase
,
12309 _In_ PVOID CurrentVa
,
12311 _In_ BOOLEAN WriteToDevice
)
12313 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
12314 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
12315 ASSERT(FlushAdapterBuffers
);
12316 return FlushAdapterBuffers(DmaAdapter
,
12327 IoFreeAdapterChannel(
12328 _In_ PDMA_ADAPTER DmaAdapter
)
12330 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
12331 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
12332 ASSERT(FreeAdapterChannel
);
12333 FreeAdapterChannel(DmaAdapter
);
12339 IoFreeMapRegisters(
12340 _In_ PDMA_ADAPTER DmaAdapter
,
12341 _In_ PVOID MapRegisterBase
,
12342 _In_ ULONG NumberOfMapRegisters
)
12344 PFREE_MAP_REGISTERS FreeMapRegisters
;
12345 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
12346 ASSERT(FreeMapRegisters
);
12347 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
12354 _In_ PDMA_ADAPTER DmaAdapter
,
12356 _In_ PVOID MapRegisterBase
,
12357 _In_ PVOID CurrentVa
,
12358 _Inout_ PULONG Length
,
12359 _In_ BOOLEAN WriteToDevice
)
12361 PMAP_TRANSFER MapTransfer
;
12363 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
12364 ASSERT(MapTransfer
);
12365 return MapTransfer(DmaAdapter
,
12374 #if (NTDDI_VERSION >= NTDDI_WIN2K)
12376 _Acquires_lock_(_Global_cancel_spin_lock_
)
12377 _Requires_lock_not_held_(_Global_cancel_spin_lock_
)
12378 _IRQL_requires_max_(DISPATCH_LEVEL
)
12379 _IRQL_raises_(DISPATCH_LEVEL
)
12383 IoAcquireCancelSpinLock(
12384 _Out_
_At_(*Irql
, _IRQL_saves_
) PKIRQL Irql
);
12386 _IRQL_requires_max_(DISPATCH_LEVEL
)
12390 IoAcquireRemoveLockEx(
12391 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
12392 _In_opt_ PVOID Tag
,
12395 _In_ ULONG RemlockSize
);
12397 _IRQL_requires_max_(DISPATCH_LEVEL
)
12402 IoAllocateDriverObjectExtension(
12403 _In_ PDRIVER_OBJECT DriverObject
,
12404 _In_ PVOID ClientIdentificationAddress
,
12405 _In_ ULONG DriverObjectExtensionSize
,
12406 _Post_
_At_(*DriverObjectExtension
, _When_(return==0,
12407 __drv_aliasesMem
__drv_allocatesMem(Mem
) _Post_notnull_
))
12408 _When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize
))
12409 PVOID
*DriverObjectExtension
);
12411 _IRQL_requires_max_(DISPATCH_LEVEL
)
12415 IoAllocateErrorLogEntry(
12416 _In_ PVOID IoObject
,
12417 _In_ UCHAR EntrySize
);
12419 _Must_inspect_result_
12420 _IRQL_requires_max_(DISPATCH_LEVEL
)
12425 _In_ CCHAR StackSize
,
12426 _In_ BOOLEAN ChargeQuota
);
12428 _IRQL_requires_max_(DISPATCH_LEVEL
)
12433 _In_opt_ __drv_aliasesMem PVOID VirtualAddress
,
12435 _In_ BOOLEAN SecondaryBuffer
,
12436 _In_ BOOLEAN ChargeQuota
,
12437 _Inout_opt_ PIRP Irp
);
12439 __drv_allocatesMem(Mem
)
12440 _IRQL_requires_max_(DISPATCH_LEVEL
)
12444 IoAllocateWorkItem(
12445 _In_ PDEVICE_OBJECT DeviceObject
);
12447 _IRQL_requires_max_(APC_LEVEL
)
12453 _In_
_Kernel_requires_resource_held_(Memory
) _When_(return==0, __drv_aliasesMem
)
12454 PDEVICE_OBJECT SourceDevice
,
12455 _In_ PUNICODE_STRING TargetDevice
,
12456 _Out_ PDEVICE_OBJECT
*AttachedDevice
);
12458 _Must_inspect_result_
12459 _IRQL_requires_max_(DISPATCH_LEVEL
)
12463 IoAttachDeviceToDeviceStack(
12464 _In_
_Kernel_requires_resource_held_(Memory
) _When_(return!=0, __drv_aliasesMem
)
12465 PDEVICE_OBJECT SourceDevice
,
12466 _In_ PDEVICE_OBJECT TargetDevice
);
12468 _Must_inspect_result_
12470 _IRQL_requires_max_(DISPATCH_LEVEL
)
12474 IoBuildAsynchronousFsdRequest(
12475 _In_ ULONG MajorFunction
,
12476 _In_ PDEVICE_OBJECT DeviceObject
,
12477 _Inout_opt_ PVOID Buffer
,
12478 _In_opt_ ULONG Length
,
12479 _In_opt_ PLARGE_INTEGER StartingOffset
,
12480 _In_opt_ PIO_STATUS_BLOCK IoStatusBlock
);
12482 _Must_inspect_result_
12484 _IRQL_requires_max_(PASSIVE_LEVEL
)
12488 IoBuildDeviceIoControlRequest(
12489 _In_ ULONG IoControlCode
,
12490 _In_ PDEVICE_OBJECT DeviceObject
,
12491 _In_opt_ PVOID InputBuffer
,
12492 _In_ ULONG InputBufferLength
,
12493 _Out_opt_ PVOID OutputBuffer
,
12494 _In_ ULONG OutputBufferLength
,
12495 _In_ BOOLEAN InternalDeviceIoControl
,
12496 _In_ PKEVENT Event
,
12497 _Out_ PIO_STATUS_BLOCK IoStatusBlock
);
12499 _IRQL_requires_max_(DISPATCH_LEVEL
)
12504 _In_ PMDL SourceMdl
,
12505 _Inout_ PMDL TargetMdl
,
12506 _In_ PVOID VirtualAddress
,
12507 _In_ ULONG Length
);
12509 _Must_inspect_result_
12511 _IRQL_requires_max_(PASSIVE_LEVEL
)
12515 IoBuildSynchronousFsdRequest(
12516 _In_ ULONG MajorFunction
,
12517 _In_ PDEVICE_OBJECT DeviceObject
,
12518 _Inout_opt_ PVOID Buffer
,
12519 _In_opt_ ULONG Length
,
12520 _In_opt_ PLARGE_INTEGER StartingOffset
,
12521 _In_ PKEVENT Event
,
12522 _Out_ PIO_STATUS_BLOCK IoStatusBlock
);
12524 _IRQL_requires_max_(DISPATCH_LEVEL
)
12530 _In_ PDEVICE_OBJECT DeviceObject
,
12531 _Inout_ __drv_aliasesMem PIRP Irp
);
12532 #define IoCallDriver IofCallDriver
12534 _IRQL_requires_max_(DISPATCH_LEVEL
)
12538 IofCompleteRequest(
12540 _In_ CCHAR PriorityBoost
);
12541 #define IoCompleteRequest IofCompleteRequest
12543 _IRQL_requires_max_(DISPATCH_LEVEL
)
12550 _IRQL_requires_max_(PASSIVE_LEVEL
)
12554 IoCheckShareAccess(
12555 _In_ ACCESS_MASK DesiredAccess
,
12556 _In_ ULONG DesiredShareAccess
,
12557 _Inout_ PFILE_OBJECT FileObject
,
12558 _Inout_ PSHARE_ACCESS ShareAccess
,
12559 _In_ BOOLEAN Update
);
12561 _IRQL_requires_max_(DISPATCH_LEVEL
)
12565 IofCompleteRequest(
12567 _In_ CCHAR PriorityBoost
);
12569 _IRQL_requires_max_(PASSIVE_LEVEL
)
12573 IoConnectInterrupt(
12574 _Out_ PKINTERRUPT
*InterruptObject
,
12575 _In_ PKSERVICE_ROUTINE ServiceRoutine
,
12576 _In_opt_ PVOID ServiceContext
,
12577 _In_opt_ PKSPIN_LOCK SpinLock
,
12580 _In_ KIRQL SynchronizeIrql
,
12581 _In_ KINTERRUPT_MODE InterruptMode
,
12582 _In_ BOOLEAN ShareVector
,
12583 _In_ KAFFINITY ProcessorEnableMask
,
12584 _In_ BOOLEAN FloatingSave
);
12586 _IRQL_requires_max_(APC_LEVEL
)
12592 _In_ PDRIVER_OBJECT DriverObject
,
12593 _In_ ULONG DeviceExtensionSize
,
12594 _In_opt_ PUNICODE_STRING DeviceName
,
12595 _In_ DEVICE_TYPE DeviceType
,
12596 _In_ ULONG DeviceCharacteristics
,
12597 _In_ BOOLEAN Exclusive
,
12598 _Outptr_result_nullonfailure_
12599 _At_(*DeviceObject
,
12600 __drv_allocatesMem(Mem
)
12601 _When_((((_In_function_class_(DRIVER_INITIALIZE
))
12602 ||(_In_function_class_(DRIVER_DISPATCH
)))),
12604 PDEVICE_OBJECT
*DeviceObject
);
12606 _IRQL_requires_max_(PASSIVE_LEVEL
)
12611 _Out_ PHANDLE FileHandle
,
12612 _In_ ACCESS_MASK DesiredAccess
,
12613 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
12614 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
12615 _In_opt_ PLARGE_INTEGER AllocationSize
,
12616 _In_ ULONG FileAttributes
,
12617 _In_ ULONG ShareAccess
,
12618 _In_ ULONG Disposition
,
12619 _In_ ULONG CreateOptions
,
12620 _In_opt_ PVOID EaBuffer
,
12621 _In_ ULONG EaLength
,
12622 _In_ CREATE_FILE_TYPE CreateFileType
,
12623 _In_opt_ PVOID InternalParameters
,
12624 _In_ ULONG Options
);
12626 _IRQL_requires_max_(PASSIVE_LEVEL
)
12630 IoCreateNotificationEvent(
12631 _In_ PUNICODE_STRING EventName
,
12632 _Out_ PHANDLE EventHandle
);
12634 _IRQL_requires_max_(PASSIVE_LEVEL
)
12638 IoCreateSymbolicLink(
12639 _In_ PUNICODE_STRING SymbolicLinkName
,
12640 _In_ PUNICODE_STRING DeviceName
);
12642 _IRQL_requires_max_(PASSIVE_LEVEL
)
12646 IoCreateSynchronizationEvent(
12647 _In_ PUNICODE_STRING EventName
,
12648 _Out_ PHANDLE EventHandle
);
12650 _IRQL_requires_max_(PASSIVE_LEVEL
)
12654 IoCreateUnprotectedSymbolicLink(
12655 _In_ PUNICODE_STRING SymbolicLinkName
,
12656 _In_ PUNICODE_STRING DeviceName
);
12658 _IRQL_requires_max_(APC_LEVEL
)
12659 _Kernel_clear_do_init_(__yes
)
12664 _In_
_Kernel_requires_resource_held_(Memory
) __drv_freesMem(Mem
)
12665 PDEVICE_OBJECT DeviceObject
);
12667 _IRQL_requires_max_(PASSIVE_LEVEL
)
12671 IoDeleteSymbolicLink(
12672 _In_ PUNICODE_STRING SymbolicLinkName
);
12674 _IRQL_requires_max_(PASSIVE_LEVEL
)
12679 _Inout_ PDEVICE_OBJECT TargetDevice
);
12681 _IRQL_requires_max_(PASSIVE_LEVEL
)
12685 IoDisconnectInterrupt(
12686 _In_ PKINTERRUPT InterruptObject
);
12688 __drv_freesMem(Mem
)
12689 _IRQL_requires_max_(DISPATCH_LEVEL
)
12696 _IRQL_requires_max_(DISPATCH_LEVEL
)
12703 _IRQL_requires_max_(DISPATCH_LEVEL
)
12708 _In_
__drv_freesMem(Mem
) PIO_WORKITEM IoWorkItem
);
12713 IoGetAttachedDevice(
12714 IN PDEVICE_OBJECT DeviceObject
);
12716 _IRQL_requires_max_(DISPATCH_LEVEL
)
12720 IoGetAttachedDeviceReference(
12721 _In_ PDEVICE_OBJECT DeviceObject
);
12726 IoGetBootDiskInformation(
12727 _Inout_ PBOOTDISK_INFORMATION BootDiskInformation
,
12730 _IRQL_requires_max_(PASSIVE_LEVEL
)
12731 _Must_inspect_result_
12735 IoGetDeviceInterfaceAlias(
12736 _In_ PUNICODE_STRING SymbolicLinkName
,
12737 _In_ CONST GUID
*AliasInterfaceClassGuid
,
12739 _When_(return==0, _At_(AliasSymbolicLinkName
->Buffer
, __drv_allocatesMem(Mem
)))
12740 PUNICODE_STRING AliasSymbolicLinkName
);
12745 IoGetCurrentProcess(VOID
);
12747 _IRQL_requires_max_(PASSIVE_LEVEL
)
12748 _Must_inspect_result_
12752 IoGetDeviceInterfaces(
12753 _In_ CONST GUID
*InterfaceClassGuid
,
12754 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
12756 _Outptr_result_nullonfailure_
12757 _At_(*SymbolicLinkList
, _When_(return==0, __drv_allocatesMem(Mem
)))
12758 PZZWSTR
*SymbolicLinkList
);
12760 _IRQL_requires_max_(PASSIVE_LEVEL
)
12764 IoGetDeviceObjectPointer(
12765 _In_ PUNICODE_STRING ObjectName
,
12766 _In_ ACCESS_MASK DesiredAccess
,
12767 _Out_ PFILE_OBJECT
*FileObject
,
12768 _Out_ PDEVICE_OBJECT
*DeviceObject
);
12770 _IRQL_requires_max_(PASSIVE_LEVEL
)
12771 _When_((DeviceProperty
& __string_type
),
12772 _At_(PropertyBuffer
, _Post_z_
))
12773 _When_((DeviceProperty
& __multiString_type
),
12774 _At_(PropertyBuffer
, _Post_ _NullNull_terminated_
))
12778 IoGetDeviceProperty(
12779 _In_ PDEVICE_OBJECT DeviceObject
,
12780 _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty
,
12781 _In_ ULONG BufferLength
,
12782 _Out_writes_bytes_opt_(BufferLength
) PVOID PropertyBuffer
,
12783 _Deref_out_range_(<=, BufferLength
) PULONG ResultLength
);
12785 _Must_inspect_result_
12786 _IRQL_requires_max_(PASSIVE_LEVEL
)
12791 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
12792 _In_ PDEVICE_DESCRIPTION DeviceDescription
,
12793 _Out_
_When_(return!=0, _Kernel_IoGetDmaAdapter_
_At_(*NumberOfMapRegisters
, _Must_inspect_result_
))
12794 PULONG NumberOfMapRegisters
);
12797 _IRQL_requires_max_(DISPATCH_LEVEL
)
12801 IoGetDriverObjectExtension(
12802 _In_ PDRIVER_OBJECT DriverObject
,
12803 _In_ PVOID ClientIdentificationAddress
);
12805 _IRQL_requires_max_(APC_LEVEL
)
12809 IoGetInitialStack(VOID
);
12814 IoGetRelatedDeviceObject(
12815 _In_ PFILE_OBJECT FileObject
);
12817 _IRQL_requires_max_(DISPATCH_LEVEL
)
12822 _Inout_ PIO_WORKITEM IoWorkItem
,
12823 _In_ PIO_WORKITEM_ROUTINE WorkerRoutine
,
12824 _In_ WORK_QUEUE_TYPE QueueType
,
12825 _In_opt_ __drv_aliasesMem PVOID Context
);
12827 _IRQL_requires_max_(DISPATCH_LEVEL
)
12833 _In_ USHORT PacketSize
,
12834 _In_ CCHAR StackSize
);
12836 _IRQL_requires_max_(PASSIVE_LEVEL
)
12840 IoInitializeRemoveLockEx(
12841 _Out_ PIO_REMOVE_LOCK Lock
,
12842 _In_ ULONG AllocateTag
,
12843 _In_ ULONG MaxLockedMinutes
,
12844 _In_ ULONG HighWatermark
,
12845 _In_ ULONG RemlockSize
);
12847 _IRQL_requires_max_(PASSIVE_LEVEL
)
12852 _In_ PDEVICE_OBJECT DeviceObject
,
12853 _In_ PIO_TIMER_ROUTINE TimerRoutine
,
12854 _In_opt_ __drv_aliasesMem PVOID Context
);
12856 _IRQL_requires_max_(DISPATCH_LEVEL
)
12860 IoInvalidateDeviceRelations(
12861 _In_ PDEVICE_OBJECT DeviceObject
,
12862 _In_ DEVICE_RELATION_TYPE Type
);
12864 _IRQL_requires_max_(DISPATCH_LEVEL
)
12868 IoInvalidateDeviceState(
12869 _In_ PDEVICE_OBJECT PhysicalDeviceObject
);
12871 _IRQL_requires_max_(PASSIVE_LEVEL
)
12875 IoIsWdmVersionAvailable(
12876 _When_(MajorVersion
!=1&&MajorVersion
!=6, _In_
__drv_reportError("MajorVersion must be 1 or 6"))
12877 UCHAR MajorVersion
,
12878 _In_
_When_(MinorVersion
!=0 && MinorVersion
!=5 &&
12879 MinorVersion
!=16 && MinorVersion
!=32 &&
12880 MinorVersion
!=48, __drv_reportError("MinorVersion must be 0, 0x5, 0x10, 0x20, or 0x30"))
12881 UCHAR MinorVersion
);
12883 _IRQL_requires_max_(PASSIVE_LEVEL
)
12884 _Must_inspect_result_
12888 IoOpenDeviceInterfaceRegistryKey(
12889 _In_ PUNICODE_STRING SymbolicLinkName
,
12890 _In_ ACCESS_MASK DesiredAccess
,
12891 _Out_ PHANDLE DeviceInterfaceKey
);
12893 _IRQL_requires_max_(PASSIVE_LEVEL
)
12894 _Must_inspect_result_
12898 IoOpenDeviceRegistryKey(
12899 _In_ PDEVICE_OBJECT DeviceObject
,
12900 _In_ ULONG DevInstKeyType
,
12901 _In_ ACCESS_MASK DesiredAccess
,
12902 _Out_ PHANDLE DevInstRegKey
);
12904 _IRQL_requires_max_(PASSIVE_LEVEL
)
12905 _Must_inspect_result_
12909 IoRegisterDeviceInterface(
12910 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
12911 _In_ CONST GUID
*InterfaceClassGuid
,
12912 _In_opt_ PUNICODE_STRING ReferenceString
,
12913 _Out_
_When_(return==0, _At_(SymbolicLinkName
->Buffer
, __drv_allocatesMem(Mem
)))
12914 PUNICODE_STRING SymbolicLinkName
);
12916 _IRQL_requires_max_(PASSIVE_LEVEL
)
12917 _Must_inspect_result_
12921 IoRegisterPlugPlayNotification(
12922 _In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
12923 _In_ ULONG EventCategoryFlags
,
12924 _In_opt_ PVOID EventCategoryData
,
12925 _In_ PDRIVER_OBJECT DriverObject
,
12926 _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
12927 _Inout_opt_ __drv_aliasesMem PVOID Context
,
12928 _Outptr_result_nullonfailure_
12929 _At_(*NotificationEntry
, _When_(return==0, __drv_allocatesMem(Mem
)))
12930 PVOID
*NotificationEntry
);
12932 _IRQL_requires_max_(PASSIVE_LEVEL
)
12936 IoRegisterShutdownNotification(
12937 _In_ PDEVICE_OBJECT DeviceObject
);
12939 _Requires_lock_held_(_Global_cancel_spin_lock_
)
12940 _Releases_lock_(_Global_cancel_spin_lock_
)
12941 _IRQL_requires_max_(DISPATCH_LEVEL
)
12942 _IRQL_requires_min_(DISPATCH_LEVEL
)
12946 IoReleaseCancelSpinLock(
12947 _In_ _IRQL_restores_ _IRQL_uses_cancel_ KIRQL Irql
);
12949 _IRQL_requires_max_(PASSIVE_LEVEL
)
12953 IoReleaseRemoveLockAndWaitEx(
12954 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
12955 _In_opt_ PVOID Tag
,
12956 _In_ ULONG RemlockSize
);
12961 IoReleaseRemoveLockEx(
12962 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
12963 _In_opt_ PVOID Tag
,
12964 _In_ ULONG RemlockSize
);
12966 _IRQL_requires_max_(PASSIVE_LEVEL
)
12970 IoRemoveShareAccess(
12971 _In_ PFILE_OBJECT FileObject
,
12972 _Inout_ PSHARE_ACCESS ShareAccess
);
12974 _IRQL_requires_max_(PASSIVE_LEVEL
)
12978 IoReportTargetDeviceChange(
12979 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
12980 _In_ PVOID NotificationStructure
);
12982 _IRQL_requires_max_(DISPATCH_LEVEL
)
12986 IoReportTargetDeviceChangeAsynchronous(
12987 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
12988 _In_ PVOID NotificationStructure
,
12989 _In_opt_ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback
,
12990 _In_opt_ PVOID Context
);
12992 _IRQL_requires_max_(DISPATCH_LEVEL
)
12996 IoRequestDeviceEject(
12997 _In_ PDEVICE_OBJECT PhysicalDeviceObject
);
12999 _IRQL_requires_max_(DISPATCH_LEVEL
)
13005 _In_ NTSTATUS Status
);
13007 _IRQL_requires_max_(PASSIVE_LEVEL
)
13008 _Must_inspect_result_
13012 IoSetDeviceInterfaceState(
13013 _In_ PUNICODE_STRING SymbolicLinkName
,
13014 _In_ BOOLEAN Enable
);
13020 _In_ ACCESS_MASK DesiredAccess
,
13021 _In_ ULONG DesiredShareAccess
,
13022 _Inout_ PFILE_OBJECT FileObject
,
13023 _Out_ PSHARE_ACCESS ShareAccess
);
13025 _IRQL_requires_max_(DISPATCH_LEVEL
)
13026 _IRQL_requires_min_(DISPATCH_LEVEL
)
13031 _In_ PDEVICE_OBJECT DeviceObject
,
13032 _In_ BOOLEAN Cancelable
);
13034 _IRQL_requires_max_(DISPATCH_LEVEL
)
13038 IoStartNextPacketByKey(
13039 _In_ PDEVICE_OBJECT DeviceObject
,
13040 _In_ BOOLEAN Cancelable
,
13043 _IRQL_requires_max_(DISPATCH_LEVEL
)
13048 _In_ PDEVICE_OBJECT DeviceObject
,
13050 _In_opt_ PULONG Key
,
13051 _In_opt_ PDRIVER_CANCEL CancelFunction
);
13053 _IRQL_requires_max_(DISPATCH_LEVEL
)
13058 _In_ PDEVICE_OBJECT DeviceObject
);
13060 _IRQL_requires_max_(DISPATCH_LEVEL
)
13065 _In_ PDEVICE_OBJECT DeviceObject
);
13067 _IRQL_requires_max_(PASSIVE_LEVEL
)
13068 __drv_freesMem(Pool
)
13072 IoUnregisterPlugPlayNotification(
13073 _In_ PVOID NotificationEntry
);
13075 _IRQL_requires_max_(PASSIVE_LEVEL
)
13079 IoUnregisterShutdownNotification(
13080 _In_ PDEVICE_OBJECT DeviceObject
);
13082 _IRQL_requires_max_(PASSIVE_LEVEL
)
13086 IoUpdateShareAccess(
13087 _In_ PFILE_OBJECT FileObject
,
13088 _Inout_ PSHARE_ACCESS ShareAccess
);
13090 _IRQL_requires_max_(PASSIVE_LEVEL
)
13094 IoWMIAllocateInstanceIds(
13096 _In_ ULONG InstanceCount
,
13097 _Out_ ULONG
*FirstInstanceId
);
13102 IoWMIQuerySingleInstanceMultiple(
13103 _In_reads_(ObjectCount
) PVOID
*DataBlockObjectList
,
13104 _In_reads_(ObjectCount
) PUNICODE_STRING InstanceNames
,
13105 _In_ ULONG ObjectCount
,
13106 _Inout_ ULONG
*InOutBufferSize
,
13107 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
13109 _IRQL_requires_max_(PASSIVE_LEVEL
)
13113 IoWMIRegistrationControl(
13114 _In_ PDEVICE_OBJECT DeviceObject
,
13115 _In_ ULONG Action
);
13120 IoWMISuggestInstanceName(
13121 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
13122 _In_opt_ PUNICODE_STRING SymbolicLinkName
,
13123 _In_ BOOLEAN CombineNames
,
13124 _Out_ PUNICODE_STRING SuggestedInstanceName
);
13126 _Must_inspect_result_
13127 _IRQL_requires_max_(DISPATCH_LEVEL
)
13133 _Inout_
_When_(return==0, __drv_aliasesMem
) PVOID WnodeEventItem
);
13135 _IRQL_requires_max_(DISPATCH_LEVEL
)
13139 IoWriteErrorLogEntry(
13140 _In_ PVOID ElEntry
);
13145 IoGetTopLevelIrp(VOID
);
13147 _IRQL_requires_max_(PASSIVE_LEVEL
)
13151 IoRegisterLastChanceShutdownNotification(
13152 _In_ PDEVICE_OBJECT DeviceObject
);
13158 _In_opt_ PIRP Irp
);
13161 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13164 #if (NTDDI_VERSION >= NTDDI_WINXP)
13171 _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp
,
13172 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
13173 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
13174 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
13175 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
13176 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
13182 _Inout_ PIO_CSQ Csq
,
13184 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context
);
13190 _Inout_ PIO_CSQ Csq
,
13191 _Inout_ PIO_CSQ_IRP_CONTEXT Context
);
13196 IoCsqRemoveNextIrp(
13197 _Inout_ PIO_CSQ Csq
,
13198 _In_opt_ PVOID PeekContext
);
13203 IoForwardIrpSynchronously(
13204 _In_ PDEVICE_OBJECT DeviceObject
,
13207 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
13212 IoFreeErrorLogEntry(
13213 _In_ PVOID ElEntry
);
13215 _IRQL_requires_max_(DISPATCH_LEVEL
)
13216 _Must_inspect_result_
13220 IoSetCompletionRoutineEx(
13221 _In_ PDEVICE_OBJECT DeviceObject
,
13223 _In_ PIO_COMPLETION_ROUTINE CompletionRoutine
,
13224 _In_opt_ PVOID Context
,
13225 _In_ BOOLEAN InvokeOnSuccess
,
13226 _In_ BOOLEAN InvokeOnError
,
13227 _In_ BOOLEAN InvokeOnCancel
);
13231 IoSetStartIoAttributes(
13232 _In_ PDEVICE_OBJECT DeviceObject
,
13233 _In_ BOOLEAN DeferredStartIo
,
13234 _In_ BOOLEAN NonCancelable
);
13239 IoWMIDeviceObjectToInstanceName(
13240 _In_ PVOID DataBlockObject
,
13241 _In_ PDEVICE_OBJECT DeviceObject
,
13242 _Out_ PUNICODE_STRING InstanceName
);
13247 IoWMIExecuteMethod(
13248 _In_ PVOID DataBlockObject
,
13249 _In_ PUNICODE_STRING InstanceName
,
13250 _In_ ULONG MethodId
,
13251 _In_ ULONG InBufferSize
,
13252 _Inout_ PULONG OutBufferSize
,
13253 _Inout_updates_bytes_to_opt_(*OutBufferSize
, InBufferSize
) PUCHAR InOutBuffer
);
13258 IoWMIHandleToInstanceName(
13259 _In_ PVOID DataBlockObject
,
13260 _In_ HANDLE FileHandle
,
13261 _Out_ PUNICODE_STRING InstanceName
);
13267 _In_ GUID
*DataBlockGuid
,
13268 _In_ ULONG DesiredAccess
,
13269 _Out_ PVOID
*DataBlockObject
);
13275 _In_ PVOID DataBlockObject
,
13276 _Inout_ ULONG
*InOutBufferSize
,
13277 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
13282 IoWMIQueryAllDataMultiple(
13283 _In_reads_(ObjectCount
) PVOID
*DataBlockObjectList
,
13284 _In_ ULONG ObjectCount
,
13285 _Inout_ ULONG
*InOutBufferSize
,
13286 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
13291 IoWMIQuerySingleInstance(
13292 _In_ PVOID DataBlockObject
,
13293 _In_ PUNICODE_STRING InstanceName
,
13294 _Inout_ ULONG
*InOutBufferSize
,
13295 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
13300 IoWMISetNotificationCallback(
13301 _Inout_ PVOID Object
,
13302 _In_ WMI_NOTIFICATION_CALLBACK Callback
,
13303 _In_opt_ PVOID Context
);
13308 IoWMISetSingleInstance(
13309 _In_ PVOID DataBlockObject
,
13310 _In_ PUNICODE_STRING InstanceName
,
13311 _In_ ULONG Version
,
13312 _In_ ULONG ValueBufferSize
,
13313 _In_reads_bytes_(ValueBufferSize
) PVOID ValueBuffer
);
13318 IoWMISetSingleItem(
13319 _In_ PVOID DataBlockObject
,
13320 _In_ PUNICODE_STRING InstanceName
,
13321 _In_ ULONG DataItemId
,
13322 _In_ ULONG Version
,
13323 _In_ ULONG ValueBufferSize
,
13324 _In_reads_bytes_(ValueBufferSize
) PVOID ValueBuffer
);
13326 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
13328 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
13332 IoValidateDeviceIoControlAccess(
13334 _In_ ULONG RequiredAccess
);
13337 #if (NTDDI_VERSION >= NTDDI_WS03)
13343 _In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrp
,
13344 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
13345 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
13346 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
13347 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
13348 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
13354 _Inout_ PIO_CSQ Csq
,
13356 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context
,
13357 _In_opt_ PVOID InsertContext
);
13358 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
13361 #if (NTDDI_VERSION >= NTDDI_VISTA)
13365 IoGetBootDiskInformationLite(
13366 _Outptr_ PBOOTDISK_INFORMATION_LITE
*BootDiskInformation
);
13371 IoCheckShareAccessEx(
13372 _In_ ACCESS_MASK DesiredAccess
,
13373 _In_ ULONG DesiredShareAccess
,
13374 _Inout_ PFILE_OBJECT FileObject
,
13375 _Inout_ PSHARE_ACCESS ShareAccess
,
13376 _In_ BOOLEAN Update
,
13377 _In_ PBOOLEAN WritePermission
);
13382 IoConnectInterruptEx(
13383 _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters
);
13388 IoDisconnectInterruptEx(
13389 _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters
);
13393 IoWithinStackLimits(
13394 _In_ ULONG_PTR RegionStart
,
13395 _In_ SIZE_T RegionSize
);
13400 IoSetShareAccessEx(
13401 _In_ ACCESS_MASK DesiredAccess
,
13402 _In_ ULONG DesiredShareAccess
,
13403 _Inout_ PFILE_OBJECT FileObject
,
13404 _Out_ PSHARE_ACCESS ShareAccess
,
13405 _In_ PBOOLEAN WritePermission
);
13409 IoSizeofWorkItem(VOID
);
13413 IoInitializeWorkItem(
13414 _In_ PVOID IoObject
,
13415 _Out_ PIO_WORKITEM IoWorkItem
);
13419 IoUninitializeWorkItem(
13420 _Inout_ PIO_WORKITEM IoWorkItem
);
13422 _IRQL_requires_max_(DISPATCH_LEVEL
)
13426 _Inout_ PIO_WORKITEM IoWorkItem
,
13427 _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine
,
13428 _In_ WORK_QUEUE_TYPE QueueType
,
13429 _In_opt_ __drv_aliasesMem PVOID Context
);
13433 IoGetIoPriorityHint(
13438 IoSetIoPriorityHint(
13440 _In_ IO_PRIORITY_HINT PriorityHint
);
13444 IoAllocateSfioStreamIdentifier(
13445 _In_ PFILE_OBJECT FileObject
,
13447 _In_ PVOID Signature
,
13448 _Out_ PVOID
*StreamIdentifier
);
13452 IoGetSfioStreamIdentifier(
13453 _In_ PFILE_OBJECT FileObject
,
13454 _In_ PVOID Signature
);
13458 IoFreeSfioStreamIdentifier(
13459 _In_ PFILE_OBJECT FileObject
,
13460 _In_ PVOID Signature
);
13462 _IRQL_requires_max_(DISPATCH_LEVEL
)
13463 _Must_inspect_result_
13467 IoRequestDeviceEjectEx(
13468 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
13469 _In_opt_ PIO_DEVICE_EJECT_CALLBACK Callback
,
13470 _In_opt_ PVOID Context
,
13471 _In_opt_ PDRIVER_OBJECT DriverObject
);
13473 _IRQL_requires_max_(PASSIVE_LEVEL
)
13474 _Must_inspect_result_
13478 IoSetDevicePropertyData(
13479 _In_ PDEVICE_OBJECT Pdo
,
13480 _In_ CONST DEVPROPKEY
*PropertyKey
,
13483 _In_ DEVPROPTYPE Type
,
13485 _In_opt_ PVOID Data
);
13487 _IRQL_requires_max_(PASSIVE_LEVEL
)
13488 _Must_inspect_result_
13492 IoGetDevicePropertyData(
13493 _In_ PDEVICE_OBJECT Pdo
,
13494 _In_ CONST DEVPROPKEY
*PropertyKey
,
13496 _Reserved_ ULONG Flags
,
13499 _Out_ PULONG RequiredSize
,
13500 _Out_ PDEVPROPTYPE Type
);
13502 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13504 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
13506 #if (NTDDI_VERSION >= NTDDI_WS08)
13507 _IRQL_requires_max_(PASSIVE_LEVEL
)
13508 _Must_inspect_result_
13512 IoReplacePartitionUnit(
13513 _In_ PDEVICE_OBJECT TargetPdo
,
13514 _In_ PDEVICE_OBJECT SparePdo
,
13518 #if (NTDDI_VERSION >= NTDDI_WIN7)
13523 IoGetAffinityInterrupt(
13524 _In_ PKINTERRUPT InterruptObject
,
13525 _Out_ PGROUP_AFFINITY GroupAffinity
);
13529 IoGetContainerInformation(
13530 _In_ IO_CONTAINER_INFORMATION_CLASS InformationClass
,
13531 _In_opt_ PVOID ContainerObject
,
13532 _Inout_updates_bytes_opt_(BufferLength
) PVOID Buffer
,
13533 _In_ ULONG BufferLength
);
13537 IoRegisterContainerNotification(
13538 _In_ IO_CONTAINER_NOTIFICATION_CLASS NotificationClass
,
13539 _In_ PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction
,
13540 _In_reads_bytes_opt_(NotificationInformationLength
) PVOID NotificationInformation
,
13541 _In_ ULONG NotificationInformationLength
,
13542 _Out_ PVOID CallbackRegistration
);
13546 IoUnregisterContainerNotification(
13547 _In_ PVOID CallbackRegistration
);
13549 _IRQL_requires_max_(PASSIVE_LEVEL
)
13550 __drv_freesMem(Pool
)
13554 IoUnregisterPlugPlayNotificationEx(
13555 _In_ PVOID NotificationEntry
);
13557 _IRQL_requires_max_(PASSIVE_LEVEL
)
13558 _Must_inspect_result_
13562 IoGetDeviceNumaNode(
13563 _In_ PDEVICE_OBJECT Pdo
,
13564 _Out_ PUSHORT NodeNumber
);
13566 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13568 #if defined(_WIN64)
13572 IoWMIDeviceObjectToProviderId(
13573 _In_ PDEVICE_OBJECT DeviceObject
);
13575 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
13581 * IN CCHAR StackSize)
13583 #define IoSizeOfIrp(_StackSize) \
13584 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
13588 IoSkipCurrentIrpStackLocation(
13591 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
13592 Irp
->CurrentLocation
++;
13593 #ifdef NONAMELESSUNION
13594 Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
++;
13596 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
13602 IoSetNextIrpStackLocation(
13605 ASSERT(Irp
->CurrentLocation
> 0);
13606 Irp
->CurrentLocation
--;
13607 #ifdef NONAMELESSUNION
13608 Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
--;
13610 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
13617 IoGetNextIrpStackLocation(
13620 ASSERT(Irp
->CurrentLocation
> 0);
13621 #ifdef NONAMELESSUNION
13622 return ((Irp
)->Tail
.Overlay
.s
.u
.CurrentStackLocation
- 1 );
13624 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
13628 _IRQL_requires_max_(DISPATCH_LEVEL
)
13631 IoSetCompletionRoutine(
13633 _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine
,
13634 _In_opt_ __drv_aliasesMem PVOID Context
,
13635 _In_ BOOLEAN InvokeOnSuccess
,
13636 _In_ BOOLEAN InvokeOnError
,
13637 _In_ BOOLEAN InvokeOnCancel
)
13639 PIO_STACK_LOCATION irpSp
;
13640 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
13641 irpSp
= IoGetNextIrpStackLocation(Irp
);
13642 irpSp
->CompletionRoutine
= CompletionRoutine
;
13643 irpSp
->Context
= Context
;
13644 irpSp
->Control
= 0;
13646 if (InvokeOnSuccess
) {
13647 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
13650 if (InvokeOnError
) {
13651 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
13654 if (InvokeOnCancel
) {
13655 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
13659 _IRQL_requires_max_(DISPATCH_LEVEL
)
13663 IoSetCancelRoutine(
13665 _In_opt_ PDRIVER_CANCEL CancelRoutine
)
13667 return (PDRIVER_CANCEL
)(ULONG_PTR
) InterlockedExchangePointer((PVOID
*)&(Irp
)->CancelRoutine
, (PVOID
)(ULONG_PTR
)(CancelRoutine
));
13673 _Inout_ PDEVICE_OBJECT DeviceObject
,
13675 _In_opt_ __drv_aliasesMem PVOID Context
)
13677 KeInsertQueueDpc(&DeviceObject
->Dpc
, Irp
, Context
);
13682 * IoReleaseRemoveLock(
13683 * IN PIO_REMOVE_LOCK RemoveLock,
13686 #define IoReleaseRemoveLock(_RemoveLock, \
13688 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
13692 * IoReleaseRemoveLockAndWait(
13693 * IN PIO_REMOVE_LOCK RemoveLock,
13696 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
13698 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
13700 #if defined(_WIN64)
13701 _IRQL_requires_max_(DISPATCH_LEVEL
)
13705 _In_opt_ PIRP Irp
);
13708 #define PLUGPLAY_REGKEY_DEVICE 1
13709 #define PLUGPLAY_REGKEY_DRIVER 2
13710 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
13715 IoGetCurrentIrpStackLocation(
13718 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
13719 #ifdef NONAMELESSUNION
13720 return Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
;
13722 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
13731 IoGetCurrentIrpStackLocation((Irp
))->Control
|= SL_PENDING_RETURNED
;
13736 * IoIsErrorUserInduced(
13737 * IN NTSTATUS Status);
13739 #define IoIsErrorUserInduced(Status) \
13740 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
13741 ((Status) == STATUS_IO_TIMEOUT) || \
13742 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
13743 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
13744 ((Status) == STATUS_VERIFY_REQUIRED) || \
13745 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
13746 ((Status) == STATUS_WRONG_VOLUME)))
13749 * IoInitializeRemoveLock(
13750 * IN PIO_REMOVE_LOCK Lock,
13751 * IN ULONG AllocateTag,
13752 * IN ULONG MaxLockedMinutes,
13753 * IN ULONG HighWatermark)
13755 #define IoInitializeRemoveLock( \
13756 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
13757 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
13758 HighWatermark, sizeof(IO_REMOVE_LOCK))
13762 IoInitializeDpcRequest(
13763 _In_ PDEVICE_OBJECT DeviceObject
,
13764 _In_ PIO_DPC_ROUTINE DpcRoutine
)
13766 KeInitializeDpc(&DeviceObject
->Dpc
,
13767 (PKDEFERRED_ROUTINE
) DpcRoutine
,
13771 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
13775 * IoGetFunctionCodeFromCtlCode(
13776 * IN ULONG ControlCode)
13778 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
13779 (((_ControlCode) >> 2) & 0x00000FFF)
13783 IoCopyCurrentIrpStackLocationToNext(
13786 PIO_STACK_LOCATION irpSp
;
13787 PIO_STACK_LOCATION nextIrpSp
;
13788 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
13789 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
13790 RtlCopyMemory(nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
13791 nextIrpSp
->Control
= 0;
13794 _IRQL_requires_max_(APC_LEVEL
)
13799 _Out_ PULONG_PTR LowLimit
,
13800 _Out_ PULONG_PTR HighLimit
);
13802 _IRQL_requires_max_(APC_LEVEL
)
13805 IoGetRemainingStackSize(VOID
)
13807 ULONG_PTR End
, Begin
;
13810 IoGetStackLimits(&Begin
, &End
);
13811 Result
= (ULONG_PTR
)(&End
) - Begin
;
13815 #if (NTDDI_VERSION >= NTDDI_WS03)
13818 IoInitializeThreadedDpcRequest(
13819 _In_ PDEVICE_OBJECT DeviceObject
,
13820 _In_ PIO_DPC_ROUTINE DpcRoutine
)
13823 #pragma warning(push)
13824 #pragma warning(disable:28128)
13826 KeInitializeThreadedDpc(&DeviceObject
->Dpc
,
13827 (PKDEFERRED_ROUTINE
) DpcRoutine
,
13830 #pragma warning(pop)
13835 /******************************************************************************
13836 * Power Management Support Functions *
13837 ******************************************************************************/
13839 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
13841 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13843 _IRQL_requires_max_(DISPATCH_LEVEL
)
13848 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
13849 _Inout_ __drv_aliasesMem
struct _IRP
*Irp
);
13851 _IRQL_requires_max_(APC_LEVEL
)
13855 PoRegisterDeviceForIdleDetection(
13856 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
13857 _In_ ULONG ConservationIdleTime
,
13858 _In_ ULONG PerformanceIdleTime
,
13859 _In_ DEVICE_POWER_STATE State
);
13861 _IRQL_requires_max_(APC_LEVEL
)
13865 PoRegisterSystemState(
13866 _Inout_opt_ PVOID StateHandle
,
13867 _In_ EXECUTION_STATE Flags
);
13869 _IRQL_requires_max_(DISPATCH_LEVEL
)
13874 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
13875 _In_ UCHAR MinorFunction
,
13876 _In_ POWER_STATE PowerState
,
13877 _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction
,
13878 _In_opt_ __drv_aliasesMem PVOID Context
,
13879 _Outptr_opt_
struct _IRP
**Irp
);
13881 _IRQL_requires_max_(DISPATCH_LEVEL
)
13886 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
13887 _In_ POWER_STATE_TYPE Type
,
13888 _In_ POWER_STATE State
);
13890 _IRQL_requires_max_(DISPATCH_LEVEL
)
13895 _In_ EXECUTION_STATE Flags
);
13897 _IRQL_requires_max_(DISPATCH_LEVEL
)
13901 PoStartNextPowerIrp(
13902 _Inout_
struct _IRP
*Irp
);
13904 _IRQL_requires_max_(APC_LEVEL
)
13908 PoUnregisterSystemState(
13909 _Inout_ PVOID StateHandle
);
13914 PoRequestShutdownEvent(
13917 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13919 #if (NTDDI_VERSION >= NTDDI_VISTA)
13921 _IRQL_requires_max_(DISPATCH_LEVEL
)
13926 _Inout_
struct _IRP
*Irp
);
13928 _IRQL_requires_max_(DISPATCH_LEVEL
)
13933 _In_
struct _IRP
*Irp
);
13935 _IRQL_requires_max_(APC_LEVEL
)
13939 PoRegisterPowerSettingCallback(
13940 _In_opt_ PDEVICE_OBJECT DeviceObject
,
13941 _In_ LPCGUID SettingGuid
,
13942 _In_ PPOWER_SETTING_CALLBACK Callback
,
13943 _In_opt_ PVOID Context
,
13944 _Outptr_opt_ PVOID
*Handle
);
13946 _IRQL_requires_max_(APC_LEVEL
)
13950 PoUnregisterPowerSettingCallback(
13951 _Inout_ PVOID Handle
);
13953 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13955 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
13960 _Inout_ PULONG IdlePointer
);
13961 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
13963 #if (NTDDI_VERSION >= NTDDI_WIN7)
13969 _Inout_ PULONG IdlePointer
);
13975 _Inout_ PULONG IdlePointer
);
13977 _IRQL_requires_max_(DISPATCH_LEVEL
)
13981 PoQueryWatchdogTime(
13982 _In_ PDEVICE_OBJECT Pdo
,
13983 _Out_ PULONG SecondsRemaining
);
13985 _IRQL_requires_max_(APC_LEVEL
)
13989 PoDeletePowerRequest(
13990 _Inout_ PVOID PowerRequest
);
13992 _IRQL_requires_max_(DISPATCH_LEVEL
)
13997 _Inout_ PVOID PowerRequest
,
13998 _In_ POWER_REQUEST_TYPE Type
);
14000 _IRQL_requires_max_(DISPATCH_LEVEL
)
14004 PoClearPowerRequest(
14005 _Inout_ PVOID PowerRequest
,
14006 _In_ POWER_REQUEST_TYPE Type
);
14008 _IRQL_requires_max_(APC_LEVEL
)
14012 PoCreatePowerRequest(
14013 _Outptr_ PVOID
*PowerRequest
,
14014 _In_ PDEVICE_OBJECT DeviceObject
,
14015 _In_opt_ PCOUNTED_REASON_CONTEXT Context
);
14017 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14019 /******************************************************************************
14020 * Executive Functions *
14021 ******************************************************************************/
14023 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
14024 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
14025 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
14027 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
14028 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
14029 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
14030 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
14032 #define ExInitializeSListHead InitializeSListHead
14034 #if defined(_NTHAL_) && defined(_X86_)
14039 ExiAcquireFastMutex(
14040 IN OUT PFAST_MUTEX FastMutex
);
14045 ExiReleaseFastMutex(
14046 IN OUT PFAST_MUTEX FastMutex
);
14051 ExiTryToAcquireFastMutex(
14052 IN OUT PFAST_MUTEX FastMutex
);
14054 #define ExAcquireFastMutex ExiAcquireFastMutex
14055 #define ExReleaseFastMutex ExiReleaseFastMutex
14056 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
14060 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14062 _IRQL_raises_(APC_LEVEL
)
14063 _IRQL_saves_global_(OldIrql
, FastMutex
)
14067 ExAcquireFastMutex(
14068 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
14069 PFAST_MUTEX FastMutex
);
14071 _IRQL_requires_(APC_LEVEL
)
14072 _IRQL_restores_global_(OldIrql
, FastMutex
)
14076 ExReleaseFastMutex(
14077 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
14078 PFAST_MUTEX FastMutex
);
14080 _Must_inspect_result_
14081 _Success_(return!=FALSE
)
14082 _IRQL_raises_(APC_LEVEL
)
14083 _IRQL_saves_global_(OldIrql
, FastMutex
)
14087 ExTryToAcquireFastMutex(
14088 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
14089 PFAST_MUTEX FastMutex
);
14091 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14093 #endif /* defined(_NTHAL_) && defined(_X86_) */
14096 #define ExInterlockedAddUlong ExfInterlockedAddUlong
14097 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
14098 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
14099 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
14100 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
14101 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
14102 #endif /* defined(_X86_) */
14104 #if defined(_WIN64)
14106 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
14107 defined(_NTHAL_) || defined(_NTOSP_)
14110 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead
);
14114 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead
)
14116 return (USHORT
)(ListHead
->Alignment
& 0xffff);
14122 ExpInterlockedFlushSList(
14123 PSLIST_HEADER ListHead
);
14127 ExpInterlockedPopEntrySList(
14128 _Inout_ PSLIST_HEADER ListHead
);
14132 ExpInterlockedPushEntrySList(
14133 _Inout_ PSLIST_HEADER ListHead
,
14134 _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry
);
14136 #define ExInterlockedFlushSList(Head) \
14137 ExpInterlockedFlushSList(Head)
14138 #define ExInterlockedPopEntrySList(Head, Lock) \
14139 ExpInterlockedPopEntrySList(Head)
14140 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
14141 ExpInterlockedPushEntrySList(Head, Entry)
14143 #else /* !defined(_WIN64) */
14145 #ifdef NONAMELESSUNION
14146 #define ExQueryDepthSList(listhead) (listhead)->s.Depth
14148 #define ExQueryDepthSList(listhead) (listhead)->Depth
14154 ExInterlockedFlushSList(
14155 _Inout_ PSLIST_HEADER ListHead
);
14157 #endif /* !defined(_WIN64) */
14159 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14164 ExInterlockedPopEntrySList(
14165 _Inout_ PSLIST_HEADER ListHead
,
14166 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14171 ExInterlockedPushEntrySList(
14172 _Inout_ PSLIST_HEADER ListHead
,
14173 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry
,
14174 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14176 _IRQL_requires_max_(APC_LEVEL
)
14180 ExAllocateFromPagedLookasideList(
14181 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
14183 _IRQL_requires_max_(APC_LEVEL
)
14187 ExFreeToPagedLookasideList(
14188 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
,
14191 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
14193 #if !defined(_WIN64)
14194 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
14195 InterlockedPopEntrySList(_ListHead)
14196 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
14197 InterlockedPushEntrySList(_ListHead, _ListEntry)
14200 _IRQL_requires_max_(APC_LEVEL
)
14203 ExAllocateFromPagedLookasideList(
14204 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
)
14208 Lookaside
->L
.TotalAllocates
++;
14209 #ifdef NONAMELESSUNION
14210 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
14211 if (Entry
== NULL
) {
14212 Lookaside
->L
.u2
.AllocateMisses
++;
14213 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
14217 #else /* NONAMELESSUNION */
14218 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
14219 if (Entry
== NULL
) {
14220 Lookaside
->L
.AllocateMisses
++;
14221 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
14225 #endif /* NONAMELESSUNION */
14229 _IRQL_requires_max_(APC_LEVEL
)
14232 ExFreeToPagedLookasideList(
14233 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
,
14236 Lookaside
->L
.TotalFrees
++;
14237 #ifdef NONAMELESSUNION
14238 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
14239 Lookaside
->L
.u3
.FreeMisses
++;
14240 (Lookaside
->L
.u5
.Free
)(Entry
);
14242 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
14244 #else /* NONAMELESSUNION */
14245 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
14246 Lookaside
->L
.FreeMisses
++;
14247 (Lookaside
->L
.Free
)(Entry
);
14249 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
14251 #endif /* NONAMELESSUNION */
14254 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
14257 /* ERESOURCE_THREAD
14258 * ExGetCurrentResourceThread(
14261 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
14263 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
14266 * ExInitializeWorkItem(
14267 * IN PWORK_QUEUE_ITEM Item,
14268 * IN PWORKER_THREAD_ROUTINE Routine,
14269 * IN PVOID Context)
14271 #define ExInitializeWorkItem(Item, Routine, Context) \
14273 (Item)->WorkerRoutine = Routine; \
14274 (Item)->Parameter = Context; \
14275 (Item)->List.Flink = NULL; \
14280 ExInitializeFastMutex(
14281 _Out_ PFAST_MUTEX FastMutex
)
14283 FastMutex
->Count
= FM_LOCK_BIT
;
14284 FastMutex
->Owner
= NULL
;
14285 FastMutex
->Contention
= 0;
14286 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
14291 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14292 _IRQL_requires_max_(APC_LEVEL
)
14293 _Requires_lock_held_(_Global_critical_region_
)
14297 ExAcquireFastMutexUnsafe(
14298 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
14299 PFAST_MUTEX FastMutex
);
14301 _IRQL_requires_max_(APC_LEVEL
)
14302 _Requires_lock_held_(_Global_critical_region_
)
14306 ExReleaseFastMutexUnsafe(
14307 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
14308 PFAST_MUTEX FastMutex
);
14310 _Requires_lock_held_(_Global_critical_region_
)
14311 _Requires_lock_not_held_(*Resource
)
14312 _When_(Wait
!=0, _Acquires_exclusive_lock_(*Resource
))
14313 _IRQL_requires_max_(APC_LEVEL
)
14314 _When_(Wait
!=0, _Post_satisfies_(return == 1))
14315 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
14319 ExAcquireResourceExclusiveLite(
14320 _Inout_ PERESOURCE Resource
,
14321 _In_ _Literal_ BOOLEAN Wait
);
14323 _IRQL_requires_max_(APC_LEVEL
)
14324 _Requires_lock_held_(_Global_critical_region_
)
14325 _When_(Wait
!=0, _Post_satisfies_(return == 1))
14326 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
14330 ExAcquireResourceSharedLite(
14331 _Inout_
_Requires_lock_not_held_(*_Curr_
)
14332 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
14333 PERESOURCE Resource
,
14334 _In_ BOOLEAN Wait
);
14336 _IRQL_requires_max_(APC_LEVEL
)
14337 _Requires_lock_held_(_Global_critical_region_
)
14338 _When_(Wait
!=0, _Post_satisfies_(return == 1))
14339 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
14343 ExAcquireSharedStarveExclusive(
14344 _Inout_
_Requires_lock_not_held_(*_Curr_
)
14345 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
14346 PERESOURCE Resource
,
14347 _In_ BOOLEAN Wait
);
14349 _IRQL_requires_max_(APC_LEVEL
)
14350 _Requires_lock_held_(_Global_critical_region_
)
14351 _When_(Wait
!=0, _Post_satisfies_(return == 1))
14352 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
14356 ExAcquireSharedWaitForExclusive(
14357 _Inout_
_Requires_lock_not_held_(*_Curr_
)
14358 _When_(return!=0, _Acquires_lock_(*_Curr_
))
14359 PERESOURCE Resource
,
14360 _In_ BOOLEAN Wait
);
14362 __drv_preferredFunction("ExAllocatePoolWithTag",
14363 "No tag interferes with debugging.")
14364 __drv_allocatesMem(Mem
)
14365 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14366 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14367 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14368 __drv_reportError("Must succeed pool allocations are forbidden. "
14369 "Allocation failures cause a system crash"))
14370 _When_((PoolType
& (NonPagedPoolMustSucceed
|
14371 POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
14372 _Post_maybenull_ _Must_inspect_result_
)
14373 _When_((PoolType
& (NonPagedPoolMustSucceed
|
14374 POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
14376 _Post_writable_byte_size_(NumberOfBytes
)
14381 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
14382 _In_ SIZE_T NumberOfBytes
);
14384 __drv_preferredFunction("ExAllocatePoolWithQuotaTag",
14385 "No tag interferes with debugging.")
14386 __drv_allocatesMem(Mem
)
14387 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14388 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14389 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14390 __drv_reportError("Must succeed pool allocations are forbidden. "
14391 "Allocation failures cause a system crash"))
14392 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
14393 _Post_maybenull_ _Must_inspect_result_
)
14394 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
14395 _Post_writable_byte_size_(NumberOfBytes
)
14399 ExAllocatePoolWithQuota(
14400 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
14401 _In_ SIZE_T NumberOfBytes
);
14403 __drv_allocatesMem(Mem
)
14404 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14405 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14406 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14407 __drv_reportError("Must succeed pool allocations are forbidden. "
14408 "Allocation failures cause a system crash"))
14409 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
14410 _Post_maybenull_ _Must_inspect_result_
)
14411 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
14412 _Post_writable_byte_size_(NumberOfBytes
)
14416 ExAllocatePoolWithQuotaTag(
14417 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
14418 _In_ SIZE_T NumberOfBytes
,
14421 #ifndef POOL_TAGGING
14422 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
14425 __drv_allocatesMem(Mem
)
14426 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14427 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14428 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14429 __drv_reportError("Must succeed pool allocations are forbidden. "
14430 "Allocation failures cause a system crash"))
14431 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
14432 _Post_maybenull_ _Must_inspect_result_
)
14433 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
14435 _Post_writable_byte_size_(NumberOfBytes
)
14439 ExAllocatePoolWithTag(
14440 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
14441 _In_ SIZE_T NumberOfBytes
,
14444 #ifndef POOL_TAGGING
14445 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
14448 __drv_allocatesMem(Mem
)
14449 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14450 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14451 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14452 __drv_reportError("Must succeed pool allocations are forbidden. "
14453 "Allocation failures cause a system crash"))
14454 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
14455 _Post_maybenull_ _Must_inspect_result_
)
14456 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
14458 _Post_writable_byte_size_(NumberOfBytes
)
14462 ExAllocatePoolWithTagPriority(
14463 _In_
__drv_strictTypeMatch(__drv_typeCond
) POOL_TYPE PoolType
,
14464 _In_ SIZE_T NumberOfBytes
,
14466 _In_
__drv_strictTypeMatch(__drv_typeExpr
) EX_POOL_PRIORITY Priority
);
14468 _IRQL_requires_max_(DISPATCH_LEVEL
)
14472 ExConvertExclusiveToSharedLite(
14473 _Inout_
_Requires_lock_held_(*_Curr_
) PERESOURCE Resource
);
14475 _IRQL_requires_max_(APC_LEVEL
)
14480 _Outptr_ PCALLBACK_OBJECT
*CallbackObject
,
14481 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
14482 _In_ BOOLEAN Create
,
14483 _In_ BOOLEAN AllowMultipleCallbacks
);
14488 ExDeleteNPagedLookasideList(
14489 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
);
14491 _IRQL_requires_max_(APC_LEVEL
)
14495 ExDeletePagedLookasideList(
14496 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
14498 _IRQL_requires_max_(DISPATCH_LEVEL
)
14502 ExDeleteResourceLite(
14503 _Inout_ PERESOURCE Resource
);
14505 _IRQL_requires_max_(DISPATCH_LEVEL
)
14510 _In_
__drv_freesMem(Mem
) PVOID P
);
14512 _IRQL_requires_max_(DISPATCH_LEVEL
)
14517 _In_
__drv_freesMem(Mem
) PVOID P
,
14520 _IRQL_requires_max_(DISPATCH_LEVEL
)
14524 ExGetExclusiveWaiterCount(
14525 _In_ PERESOURCE Resource
);
14527 _IRQL_requires_max_(DISPATCH_LEVEL
)
14531 ExGetPreviousMode(VOID
);
14533 _IRQL_requires_max_(DISPATCH_LEVEL
)
14537 ExGetSharedWaiterCount(
14538 _In_ PERESOURCE Resource
);
14540 _IRQL_requires_max_(DISPATCH_LEVEL
)
14544 ExInitializeNPagedLookasideList(
14545 _Out_ PNPAGED_LOOKASIDE_LIST Lookaside
,
14546 _In_opt_ PALLOCATE_FUNCTION Allocate
,
14547 _In_opt_ PFREE_FUNCTION Free
,
14551 _In_ USHORT Depth
);
14553 _IRQL_requires_max_(APC_LEVEL
)
14557 ExInitializePagedLookasideList(
14558 _Out_ PPAGED_LOOKASIDE_LIST Lookaside
,
14559 _In_opt_ PALLOCATE_FUNCTION Allocate
,
14560 _In_opt_ PFREE_FUNCTION Free
,
14564 _In_ USHORT Depth
);
14566 _IRQL_requires_max_(DISPATCH_LEVEL
)
14570 ExInitializeResourceLite(
14571 _Out_ PERESOURCE Resource
);
14576 ExInterlockedAddLargeInteger(
14577 _Inout_ PLARGE_INTEGER Addend
,
14578 _In_ LARGE_INTEGER Increment
,
14579 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14581 #if defined(_WIN64)
14582 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
14583 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
14585 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
14586 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
14592 ExInterlockedAddUlong(
14593 _Inout_ PULONG Addend
,
14594 _In_ ULONG Increment
,
14595 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14597 #if defined(_AMD64_) || defined(_IA64_)
14599 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
14600 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
14602 #elif defined(_X86_)
14607 ExfInterlockedCompareExchange64(
14608 _Inout_ _Interlocked_operand_ LONGLONG
volatile *Destination
,
14609 _In_ PLONGLONG Exchange
,
14610 _In_ PLONGLONG Comperand
);
14612 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
14613 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
14620 ExInterlockedCompareExchange64(
14621 IN OUT LONGLONG
volatile *Destination
,
14622 IN PLONGLONG Exchange
,
14623 IN PLONGLONG Comparand
,
14624 IN PKSPIN_LOCK Lock
);
14626 #endif /* defined(_AMD64_) || defined(_IA64_) */
14631 ExInterlockedInsertHeadList(
14632 _Inout_ PLIST_ENTRY ListHead
,
14633 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry
,
14634 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14639 ExInterlockedInsertTailList(
14640 _Inout_ PLIST_ENTRY ListHead
,
14641 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry
,
14642 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14647 ExInterlockedPopEntryList(
14648 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
14649 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14654 ExInterlockedPushEntryList(
14655 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
14656 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry
,
14657 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14662 ExInterlockedRemoveHeadList(
14663 _Inout_ PLIST_ENTRY ListHead
,
14664 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14666 _IRQL_requires_max_(PASSIVE_LEVEL
)
14670 ExIsProcessorFeaturePresent(
14671 _In_ ULONG ProcessorFeature
);
14673 _IRQL_requires_max_(DISPATCH_LEVEL
)
14677 ExIsResourceAcquiredExclusiveLite(
14678 _In_ PERESOURCE Resource
);
14680 _IRQL_requires_max_(DISPATCH_LEVEL
)
14684 ExIsResourceAcquiredSharedLite(
14685 _In_ PERESOURCE Resource
);
14687 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
14692 ExLocalTimeToSystemTime(
14693 _In_ PLARGE_INTEGER LocalTime
,
14694 _Out_ PLARGE_INTEGER SystemTime
);
14696 _IRQL_requires_max_(DISPATCH_LEVEL
)
14701 _In_ PCALLBACK_OBJECT CallbackObject
,
14702 _In_opt_ PVOID Argument1
,
14703 _In_opt_ PVOID Argument2
);
14705 _IRQL_requires_max_(DISPATCH_LEVEL
)
14710 _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem
,
14711 __drv_strictTypeMatch(__drv_typeExpr
) _In_ WORK_QUEUE_TYPE QueueType
);
14713 _IRQL_requires_max_(APC_LEVEL
)
14719 _In_ NTSTATUS Status
);
14721 _IRQL_requires_max_(APC_LEVEL
)
14725 ExRegisterCallback(
14726 _Inout_ PCALLBACK_OBJECT CallbackObject
,
14727 _In_ PCALLBACK_FUNCTION CallbackFunction
,
14728 _In_opt_ PVOID CallbackContext
);
14730 _IRQL_requires_max_(DISPATCH_LEVEL
)
14734 ExReinitializeResourceLite(
14735 _Inout_ PERESOURCE Resource
);
14737 _IRQL_requires_max_(DISPATCH_LEVEL
)
14738 _Requires_lock_held_(_Global_critical_region_
)
14742 ExReleaseResourceForThreadLite(
14743 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
14744 PERESOURCE Resource
,
14745 _In_ ERESOURCE_THREAD ResourceThreadId
);
14747 _Requires_lock_held_(_Global_critical_region_
)
14748 _Requires_lock_held_(*Resource
)
14749 _Releases_lock_(*Resource
)
14750 _IRQL_requires_max_(DISPATCH_LEVEL
)
14754 ExReleaseResourceLite(
14755 _Inout_ PERESOURCE Resource
);
14757 _IRQL_requires_max_(DISPATCH_LEVEL
)
14761 ExSetResourceOwnerPointer(
14762 _Inout_ PERESOURCE Resource
,
14763 _In_ PVOID OwnerPointer
);
14765 _IRQL_requires_max_(APC_LEVEL
)
14769 ExSetTimerResolution(
14770 _In_ ULONG DesiredTime
,
14771 _In_ BOOLEAN SetResolution
);
14776 ExSystemTimeToLocalTime(
14777 _In_ PLARGE_INTEGER SystemTime
,
14778 _Out_ PLARGE_INTEGER LocalTime
);
14780 _IRQL_requires_max_(APC_LEVEL
)
14784 ExUnregisterCallback(
14785 _Inout_ PVOID CbRegistration
);
14787 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14789 #if (NTDDI_VERSION >= NTDDI_WINXP)
14791 _Must_inspect_result_
14792 _Post_satisfies_(return == 0 || return == 1)
14796 ExAcquireRundownProtection(
14797 _Inout_ PEX_RUNDOWN_REF RunRef
);
14802 ExInitializeRundownProtection(
14803 _Out_ PEX_RUNDOWN_REF RunRef
);
14808 ExReInitializeRundownProtection(
14809 _Inout_ PEX_RUNDOWN_REF RunRef
);
14814 ExReleaseRundownProtection(
14815 _Inout_ PEX_RUNDOWN_REF RunRef
);
14820 ExRundownCompleted(
14821 _Out_ PEX_RUNDOWN_REF RunRef
);
14827 __drv_strictTypeMatch(__drv_typeExpr
) _In_ SUITE_TYPE SuiteType
);
14832 ExWaitForRundownProtectionRelease(
14833 _Inout_ PEX_RUNDOWN_REF RunRef
);
14834 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14836 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
14838 _Must_inspect_result_
14839 _Post_satisfies_(return == 0 || return == 1)
14843 ExAcquireRundownProtectionEx(
14844 _Inout_ PEX_RUNDOWN_REF RunRef
,
14850 ExReleaseRundownProtectionEx(
14851 _Inout_ PEX_RUNDOWN_REF RunRef
,
14854 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
14856 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
14858 _Must_inspect_result_
14859 _IRQL_requires_max_(APC_LEVEL
)
14861 PEX_RUNDOWN_REF_CACHE_AWARE
14863 ExAllocateCacheAwareRundownProtection(
14864 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
14865 _In_ ULONG PoolTag
);
14867 _IRQL_requires_max_(APC_LEVEL
)
14871 ExSizeOfRundownProtectionCacheAware(VOID
);
14873 _IRQL_requires_max_(APC_LEVEL
)
14874 _Acquires_lock_(_Global_critical_region_
)
14878 ExEnterCriticalRegionAndAcquireResourceShared(
14879 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_shared_lock_(*_Curr_
)
14880 PERESOURCE Resource
);
14882 _IRQL_requires_max_(APC_LEVEL
)
14883 _Acquires_lock_(_Global_critical_region_
)
14887 ExEnterCriticalRegionAndAcquireResourceExclusive(
14888 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_exclusive_lock_(*_Curr_
)
14889 PERESOURCE Resource
);
14891 _IRQL_requires_max_(APC_LEVEL
)
14892 _Acquires_lock_(_Global_critical_region_
)
14896 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
14897 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
14898 PERESOURCE Resource
);
14900 _IRQL_requires_max_(DISPATCH_LEVEL
)
14901 _Releases_lock_(_Global_critical_region_
)
14905 ExReleaseResourceAndLeaveCriticalRegion(
14906 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
14907 PERESOURCE Resource
);
14909 _IRQL_requires_max_(APC_LEVEL
)
14913 ExInitializeRundownProtectionCacheAware(
14914 _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
14915 _In_ SIZE_T RunRefSize
);
14917 _IRQL_requires_max_(APC_LEVEL
)
14921 ExFreeCacheAwareRundownProtection(
14922 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
14924 _Must_inspect_result_
14925 _Post_satisfies_(return == 0 || return == 1)
14929 ExAcquireRundownProtectionCacheAware(
14930 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
14935 ExReleaseRundownProtectionCacheAware(
14936 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
14938 _Must_inspect_result_
14939 _Post_satisfies_(return == 0 || return == 1)
14943 ExAcquireRundownProtectionCacheAwareEx(
14944 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
14950 ExReleaseRundownProtectionCacheAwareEx(
14951 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef
,
14957 ExWaitForRundownProtectionReleaseCacheAware(
14958 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
);
14963 ExReInitializeRundownProtectionCacheAware(
14964 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
14969 ExRundownCompletedCacheAware(
14970 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
14972 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
14974 #if (NTDDI_VERSION >= NTDDI_VISTA)
14976 _IRQL_requires_max_(DISPATCH_LEVEL
)
14980 ExInitializeLookasideListEx(
14981 _Out_ PLOOKASIDE_LIST_EX Lookaside
,
14982 _In_opt_ PALLOCATE_FUNCTION_EX Allocate
,
14983 _In_opt_ PFREE_FUNCTION_EX Free
,
14984 _In_ POOL_TYPE PoolType
,
14988 _In_ USHORT Depth
);
14990 _IRQL_requires_max_(DISPATCH_LEVEL
)
14994 ExDeleteLookasideListEx(
14995 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
14997 _IRQL_requires_max_(DISPATCH_LEVEL
)
15001 ExFlushLookasideListEx(
15002 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
15004 _Must_inspect_result_
15005 _IRQL_requires_max_(DISPATCH_LEVEL
)
15008 ExAllocateFromLookasideListEx(
15009 _Inout_ PLOOKASIDE_LIST_EX Lookaside
)
15013 Lookaside
->L
.TotalAllocates
+= 1;
15014 #ifdef NONAMELESSUNION
15015 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
15016 if (Entry
== NULL
) {
15017 Lookaside
->L
.u2
.AllocateMisses
+= 1;
15018 Entry
= (Lookaside
->L
.u4
.AllocateEx
)(Lookaside
->L
.Type
,
15023 #else /* NONAMELESSUNION */
15024 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
15025 if (Entry
== NULL
) {
15026 Lookaside
->L
.AllocateMisses
+= 1;
15027 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
15032 #endif /* NONAMELESSUNION */
15036 _IRQL_requires_max_(DISPATCH_LEVEL
)
15039 ExFreeToLookasideListEx(
15040 _Inout_ PLOOKASIDE_LIST_EX Lookaside
,
15043 Lookaside
->L
.TotalFrees
+= 1;
15044 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
15045 Lookaside
->L
.FreeMisses
+= 1;
15046 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
15048 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
15053 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15055 #if (NTDDI_VERSION >= NTDDI_WIN7)
15057 _IRQL_requires_max_(DISPATCH_LEVEL
)
15061 ExSetResourceOwnerPointerEx(
15062 _Inout_ PERESOURCE Resource
,
15063 _In_ PVOID OwnerPointer
,
15066 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
15068 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15070 _IRQL_requires_max_(DISPATCH_LEVEL
)
15071 static __inline PVOID
15072 ExAllocateFromNPagedLookasideList(
15073 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
)
15077 Lookaside
->L
.TotalAllocates
++;
15078 #ifdef NONAMELESSUNION
15079 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15080 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
,
15081 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
15083 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
15085 if (Entry
== NULL
) {
15086 Lookaside
->L
.u2
.AllocateMisses
++;
15087 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
15091 #else /* NONAMELESSUNION */
15092 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15093 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
15094 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
15096 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
15098 if (Entry
== NULL
) {
15099 Lookaside
->L
.AllocateMisses
++;
15100 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
15104 #endif /* NONAMELESSUNION */
15108 _IRQL_requires_max_(DISPATCH_LEVEL
)
15109 static __inline VOID
15110 ExFreeToNPagedLookasideList(
15111 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
,
15114 Lookaside
->L
.TotalFrees
++;
15115 #ifdef NONAMELESSUNION
15116 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
15117 Lookaside
->L
.u3
.FreeMisses
++;
15118 (Lookaside
->L
.u5
.Free
)(Entry
);
15120 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15121 ExInterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
,
15122 (PSLIST_ENTRY
)Entry
,
15123 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
15125 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
15128 #else /* NONAMELESSUNION */
15129 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
15130 Lookaside
->L
.FreeMisses
++;
15131 (Lookaside
->L
.Free
)(Entry
);
15133 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15134 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
15135 (PSLIST_ENTRY
)Entry
,
15136 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
15138 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
15141 #endif /* NONAMELESSUNION */
15144 /******************************************************************************
15145 * Object Manager Functions *
15146 ******************************************************************************/
15148 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15149 _IRQL_requires_max_(DISPATCH_LEVEL
)
15153 ObfDereferenceObject(
15154 _In_ PVOID Object
);
15155 #define ObDereferenceObject ObfDereferenceObject
15157 _IRQL_requires_max_(APC_LEVEL
)
15161 ObGetObjectSecurity(
15163 _Out_ PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
15164 _Out_ PBOOLEAN MemoryAllocated
);
15166 _IRQL_requires_max_(DISPATCH_LEVEL
)
15170 ObfReferenceObject(
15171 _In_ PVOID Object
);
15172 #define ObReferenceObject ObfReferenceObject
15174 _IRQL_requires_max_(APC_LEVEL
)
15178 ObReferenceObjectByHandle(
15179 _In_ HANDLE Handle
,
15180 _In_ ACCESS_MASK DesiredAccess
,
15181 _In_opt_ POBJECT_TYPE ObjectType
,
15182 _In_ KPROCESSOR_MODE AccessMode
,
15183 _Out_ PVOID
*Object
,
15184 _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
);
15186 _IRQL_requires_max_(DISPATCH_LEVEL
)
15190 ObReferenceObjectByPointer(
15192 _In_ ACCESS_MASK DesiredAccess
,
15193 _In_opt_ POBJECT_TYPE ObjectType
,
15194 _In_ KPROCESSOR_MODE AccessMode
);
15196 _IRQL_requires_max_(APC_LEVEL
)
15200 ObReleaseObjectSecurity(
15201 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
15202 _In_ BOOLEAN MemoryAllocated
);
15203 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15205 #if (NTDDI_VERSION >= NTDDI_VISTA)
15209 ObDereferenceObjectDeferDelete(
15210 _In_ PVOID Object
);
15213 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
15217 ObRegisterCallbacks(
15218 _In_ POB_CALLBACK_REGISTRATION CallbackRegistration
,
15219 _Outptr_ PVOID
*RegistrationHandle
);
15224 ObUnRegisterCallbacks(
15225 _In_ PVOID RegistrationHandle
);
15230 ObGetFilterVersion(VOID
);
15232 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
15234 #if (NTDDI_VERSION >= NTDDI_WIN7)
15235 _IRQL_requires_max_(APC_LEVEL
)
15239 ObReferenceObjectByHandleWithTag(
15240 _In_ HANDLE Handle
,
15241 _In_ ACCESS_MASK DesiredAccess
,
15242 _In_opt_ POBJECT_TYPE ObjectType
,
15243 _In_ KPROCESSOR_MODE AccessMode
,
15245 _Out_ PVOID
*Object
,
15246 _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
);
15248 _IRQL_requires_max_(DISPATCH_LEVEL
)
15252 ObfReferenceObjectWithTag(
15256 _IRQL_requires_max_(DISPATCH_LEVEL
)
15260 ObReferenceObjectByPointerWithTag(
15262 _In_ ACCESS_MASK DesiredAccess
,
15263 _In_opt_ POBJECT_TYPE ObjectType
,
15264 _In_ KPROCESSOR_MODE AccessMode
,
15267 _IRQL_requires_max_(DISPATCH_LEVEL
)
15271 ObfDereferenceObjectWithTag(
15278 ObDereferenceObjectDeferDeleteWithTag(
15282 #define ObDereferenceObject ObfDereferenceObject
15283 #define ObReferenceObject ObfReferenceObject
15284 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
15285 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
15286 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15288 /******************************************************************************
15289 * Process Manager Functions *
15290 ******************************************************************************/
15295 PsWrapApcWow64Thread(
15296 _Inout_ PVOID
*ApcContext
,
15297 _Inout_ PVOID
*ApcRoutine
);
15301 * PsGetCurrentProcess(VOID)
15303 #define PsGetCurrentProcess IoGetCurrentProcess
15305 #if !defined(_PSGETCURRENTTHREAD_)
15306 #define _PSGETCURRENTTHREAD_
15307 _IRQL_requires_max_(DISPATCH_LEVEL
)
15311 PsGetCurrentThread(VOID
)
15313 return (PETHREAD
)KeGetCurrentThread();
15315 #endif /* !_PSGETCURRENTTHREAD_ */
15318 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15320 _IRQL_requires_max_(APC_LEVEL
)
15321 _Post_satisfies_(return <= 0)
15322 _Must_inspect_result_
15326 PsCreateSystemThread(
15327 _Out_ PHANDLE ThreadHandle
,
15328 _In_ ULONG DesiredAccess
,
15329 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
15330 _In_opt_ HANDLE ProcessHandle
,
15331 _Out_opt_ PCLIENT_ID ClientId
,
15332 _In_ PKSTART_ROUTINE StartRoutine
,
15333 _In_opt_
_When_(return==0, __drv_aliasesMem
) PVOID StartContext
);
15335 _IRQL_requires_max_(PASSIVE_LEVEL
)
15339 PsTerminateSystemThread(
15340 _In_ NTSTATUS ExitStatus
);
15342 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15345 /******************************************************************************
15346 * WMI Library Support Functions *
15347 ******************************************************************************/
15350 #if (NTDDI_VERSION >= NTDDI_WINXP)
15351 _IRQL_requires_max_(HIGH_LEVEL
)
15356 _In_ TRACEHANDLE LoggerHandle
,
15357 _In_ ULONG MessageFlags
,
15358 _In_ LPGUID MessageGuid
,
15359 _In_ USHORT MessageNumber
,
15362 #endif /* RUN_WPP */
15364 #if (NTDDI_VERSION >= NTDDI_WINXP)
15366 _IRQL_requires_max_(APC_LEVEL
)
15370 WmiQueryTraceInformation(
15371 _In_ TRACE_INFORMATION_CLASS TraceInformationClass
,
15372 _Out_writes_bytes_(TraceInformationLength
) PVOID TraceInformation
,
15373 _In_ ULONG TraceInformationLength
,
15374 _Out_opt_ PULONG RequiredLength
,
15375 _In_opt_ PVOID Buffer
);
15378 /* FIXME: Get va_list from where? */
15379 _IRQL_requires_max_(HIGH_LEVEL
)
15384 _In_ TRACEHANDLE LoggerHandle
,
15385 _In_ ULONG MessageFlags
,
15386 _In_ LPGUID MessageGuid
,
15387 _In_ USHORT MessageNumber
,
15388 _In_
va_list MessageArgList
);
15391 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15393 #ifndef TRACE_INFORMATION_CLASS_DEFINE
15395 #if (NTDDI_VERSION >= NTDDI_WINXP)
15396 _IRQL_requires_max_(APC_LEVEL
)
15400 WmiQueryTraceInformation(
15401 _In_ TRACE_INFORMATION_CLASS TraceInformationClass
,
15402 _Out_writes_bytes_(TraceInformationLength
) PVOID TraceInformation
,
15403 _In_ ULONG TraceInformationLength
,
15404 _Out_opt_ PULONG RequiredLength
,
15405 _In_opt_ PVOID Buffer
);
15408 #define TRACE_INFORMATION_CLASS_DEFINE
15410 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
15412 #if (NTDDI_VERSION >= NTDDI_VISTA)
15414 _IRQL_requires_max_(PASSIVE_LEVEL
)
15419 _In_ LPCGUID ProviderId
,
15420 _In_opt_ PETWENABLECALLBACK EnableCallback
,
15421 _In_opt_ PVOID CallbackContext
,
15422 _Out_ PREGHANDLE RegHandle
);
15424 _IRQL_requires_max_(PASSIVE_LEVEL
)
15429 _In_ REGHANDLE RegHandle
);
15431 _IRQL_requires_max_(HIGH_LEVEL
)
15436 _In_ REGHANDLE RegHandle
,
15437 _In_ PCEVENT_DESCRIPTOR EventDescriptor
);
15439 _IRQL_requires_max_(HIGH_LEVEL
)
15443 EtwProviderEnabled(
15444 _In_ REGHANDLE RegHandle
,
15446 _In_ ULONGLONG Keyword
);
15448 _When_(ControlCode
==EVENT_ACTIVITY_CTRL_CREATE_ID
, _IRQL_requires_max_(HIGH_LEVEL
))
15449 _When_(ControlCode
!=EVENT_ACTIVITY_CTRL_CREATE_ID
, _IRQL_requires_max_(APC_LEVEL
))
15453 EtwActivityIdControl(
15454 _In_ ULONG ControlCode
,
15455 _Inout_updates_bytes_(sizeof(GUID
)) LPGUID ActivityId
);
15457 _IRQL_requires_max_(HIGH_LEVEL
)
15462 _In_ REGHANDLE RegHandle
,
15463 _In_ PCEVENT_DESCRIPTOR EventDescriptor
,
15464 _In_opt_ LPCGUID ActivityId
,
15465 _In_ ULONG UserDataCount
,
15466 _In_reads_opt_(UserDataCount
) PEVENT_DATA_DESCRIPTOR UserData
);
15468 _IRQL_requires_max_(HIGH_LEVEL
)
15473 _In_ REGHANDLE RegHandle
,
15474 _In_ PCEVENT_DESCRIPTOR EventDescriptor
,
15475 _In_opt_ LPCGUID ActivityId
,
15476 _In_opt_ LPCGUID RelatedActivityId
,
15477 _In_ ULONG UserDataCount
,
15478 _In_reads_opt_(UserDataCount
) PEVENT_DATA_DESCRIPTOR UserData
);
15480 _IRQL_requires_max_(HIGH_LEVEL
)
15485 _In_ REGHANDLE RegHandle
,
15487 _In_ ULONGLONG Keyword
,
15488 _In_opt_ LPCGUID ActivityId
,
15489 _In_ PCWSTR String
);
15491 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15493 #if (NTDDI_VERSION >= NTDDI_WIN7)
15494 _IRQL_requires_max_(HIGH_LEVEL
)
15499 _In_ REGHANDLE RegHandle
,
15500 _In_ PCEVENT_DESCRIPTOR EventDescriptor
,
15501 _In_ ULONG64 Filter
,
15503 _In_opt_ LPCGUID ActivityId
,
15504 _In_opt_ LPCGUID RelatedActivityId
,
15505 _In_ ULONG UserDataCount
,
15506 _In_reads_opt_(UserDataCount
) PEVENT_DATA_DESCRIPTOR UserData
);
15511 /******************************************************************************
15512 * Kernel Debugger Functions *
15513 ******************************************************************************/
15520 _In_z_ _Printf_format_string_ PCSTR Format
,
15523 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15527 DbgPrintReturnControlC(
15528 _In_z_ _Printf_format_string_ PCCH Format
,
15532 #if (NTDDI_VERSION >= NTDDI_WINXP)
15538 _In_ ULONG ComponentId
,
15540 _In_z_ _Printf_format_string_ PCSTR Format
,
15543 #ifdef _VA_LIST_DEFINED
15549 _In_ ULONG ComponentId
,
15551 _In_z_ PCCH Format
,
15557 vDbgPrintExWithPrefix(
15558 _In_z_ PCCH Prefix
,
15559 _In_ ULONG ComponentId
,
15561 _In_z_ PCCH Format
,
15564 #endif /* _VA_LIST_DEFINED */
15569 DbgQueryDebugFilterState(
15570 _In_ ULONG ComponentId
,
15576 DbgSetDebugFilterState(
15577 _In_ ULONG ComponentId
,
15579 _In_ BOOLEAN State
);
15581 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15583 #if (NTDDI_VERSION >= NTDDI_VISTA)
15586 (*PDEBUG_PRINT_CALLBACK
)(
15587 _In_ PSTRING Output
,
15588 _In_ ULONG ComponentId
,
15594 DbgSetDebugPrintCallback(
15595 _In_ PDEBUG_PRINT_CALLBACK DebugPrintCallback
,
15596 _In_ BOOLEAN Enable
);
15598 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15600 #endif /* _DBGNT_ */
15604 #define KdPrint(_x_) DbgPrint _x_
15605 #define KdPrintEx(_x_) DbgPrintEx _x_
15606 #define vKdPrintEx(_x_) vDbgPrintEx _x_
15607 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
15608 #define KdBreakPoint() DbgBreakPoint()
15609 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
15613 #define KdPrint(_x_)
15614 #define KdPrintEx(_x_)
15615 #define vKdPrintEx(_x_)
15616 #define vKdPrintExWithPrefix(_x_)
15617 #define KdBreakPoint()
15618 #define KdBreakPointWithStatus(s)
15622 #if defined(__GNUC__)
15624 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent
;
15625 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled
;
15626 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
15627 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
15629 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
15631 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent
;
15632 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled
;
15633 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
15634 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
15638 extern BOOLEAN KdDebuggerNotPresent
;
15639 extern BOOLEAN KdDebuggerEnabled
;
15640 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
15641 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
15645 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15650 KdDisableDebugger(VOID
);
15655 KdEnableDebugger(VOID
);
15657 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
15658 #define DbgBreakPoint __debugbreak
15660 __analysis_noreturn
15663 DbgBreakPoint(VOID
);
15666 __analysis_noreturn
15670 DbgBreakPointWithStatus(
15673 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15675 #if (NTDDI_VERSION >= NTDDI_WS03)
15679 KdRefreshDebuggerNotPresent(VOID
);
15682 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
15687 _In_ KD_OPTION Option
,
15688 _In_opt_ ULONG InBufferBytes
,
15689 _In_ PVOID InBuffer
,
15690 _In_opt_ ULONG OutBufferBytes
,
15691 _Out_ PVOID OutBuffer
,
15692 _Out_opt_ PULONG OutBufferNeeded
);
15694 /* Hardware Abstraction Layer Functions */
15696 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15698 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
15700 __drv_preferredFunction("AllocateCommonBuffer","Obsolete")
15704 HalAllocateCommonBuffer(
15705 _In_ PDMA_ADAPTER DmaAdapter
,
15707 _Out_ PPHYSICAL_ADDRESS LogicalAddress
,
15708 _In_ BOOLEAN CacheEnabled
)
15710 PALLOCATE_COMMON_BUFFER allocateCommonBuffer
;
15711 PVOID commonBuffer
;
15713 allocateCommonBuffer
= *(DmaAdapter
)->DmaOperations
->AllocateCommonBuffer
;
15714 ASSERT( allocateCommonBuffer
!= NULL
);
15715 commonBuffer
= allocateCommonBuffer( DmaAdapter
, Length
, LogicalAddress
, CacheEnabled
);
15716 return commonBuffer
;
15719 __drv_preferredFunction("FreeCommonBuffer","Obsolete")
15723 HalFreeCommonBuffer(
15724 _In_ PDMA_ADAPTER DmaAdapter
,
15726 _In_ PHYSICAL_ADDRESS LogicalAddress
,
15727 _In_ PVOID VirtualAddress
,
15728 _In_ BOOLEAN CacheEnabled
)
15730 PFREE_COMMON_BUFFER freeCommonBuffer
;
15732 freeCommonBuffer
= *(DmaAdapter
)->DmaOperations
->FreeCommonBuffer
;
15733 ASSERT( freeCommonBuffer
!= NULL
);
15734 freeCommonBuffer( DmaAdapter
, Length
, LogicalAddress
, VirtualAddress
, CacheEnabled
);
15737 __drv_preferredFunction("ReadDmaCounter","Obsolete")
15742 _In_ PDMA_ADAPTER DmaAdapter
)
15744 PREAD_DMA_COUNTER readDmaCounter
;
15747 readDmaCounter
= *(DmaAdapter
)->DmaOperations
->ReadDmaCounter
;
15748 ASSERT( readDmaCounter
!= NULL
);
15749 counter
= readDmaCounter( DmaAdapter
);
15755 HalGetDmaAlignment(
15756 _In_ PDMA_ADAPTER DmaAdapter
)
15758 PGET_DMA_ALIGNMENT getDmaAlignment
;
15761 getDmaAlignment
= *(DmaAdapter
)->DmaOperations
->GetDmaAlignment
;
15762 ASSERT( getDmaAlignment
!= NULL
);
15763 alignment
= getDmaAlignment( DmaAdapter
);
15767 #endif /* USE_DMA_MACROS ... */
15769 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15774 #include <ktmtypes.h>
15776 #define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001)
15777 #define TRANSACTIONMANAGER_SET_INFORMATION (0x0002)
15778 #define TRANSACTIONMANAGER_RECOVER (0x0004)
15779 #define TRANSACTIONMANAGER_RENAME (0x0008)
15780 #define TRANSACTIONMANAGER_CREATE_RM (0x0010)
15781 #define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020)
15783 #define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
15784 TRANSACTIONMANAGER_QUERY_INFORMATION)
15786 #define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15787 TRANSACTIONMANAGER_SET_INFORMATION |\
15788 TRANSACTIONMANAGER_RECOVER |\
15789 TRANSACTIONMANAGER_RENAME |\
15790 TRANSACTIONMANAGER_CREATE_RM)
15792 #define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
15794 #define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15795 TRANSACTIONMANAGER_GENERIC_READ |\
15796 TRANSACTIONMANAGER_GENERIC_WRITE |\
15797 TRANSACTIONMANAGER_GENERIC_EXECUTE |\
15798 TRANSACTIONMANAGER_BIND_TRANSACTION)
15800 #define TRANSACTION_QUERY_INFORMATION (0x0001)
15801 #define TRANSACTION_SET_INFORMATION (0x0002)
15802 #define TRANSACTION_ENLIST (0x0004)
15803 #define TRANSACTION_COMMIT (0x0008)
15804 #define TRANSACTION_ROLLBACK (0x0010)
15805 #define TRANSACTION_PROPAGATE (0x0020)
15806 #define TRANSACTION_RIGHT_RESERVED1 (0x0040)
15808 #define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
15809 TRANSACTION_QUERY_INFORMATION |\
15812 #define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15813 TRANSACTION_SET_INFORMATION |\
15814 TRANSACTION_COMMIT |\
15815 TRANSACTION_ENLIST |\
15816 TRANSACTION_ROLLBACK |\
15817 TRANSACTION_PROPAGATE |\
15820 #define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
15821 TRANSACTION_COMMIT |\
15822 TRANSACTION_ROLLBACK |\
15825 #define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15826 TRANSACTION_GENERIC_READ |\
15827 TRANSACTION_GENERIC_WRITE |\
15828 TRANSACTION_GENERIC_EXECUTE)
15830 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
15831 STANDARD_RIGHTS_WRITE |\
15832 TRANSACTION_SET_INFORMATION |\
15833 TRANSACTION_ENLIST |\
15834 TRANSACTION_ROLLBACK |\
15835 TRANSACTION_PROPAGATE |\
15838 #define RESOURCEMANAGER_QUERY_INFORMATION (0x0001)
15839 #define RESOURCEMANAGER_SET_INFORMATION (0x0002)
15840 #define RESOURCEMANAGER_RECOVER (0x0004)
15841 #define RESOURCEMANAGER_ENLIST (0x0008)
15842 #define RESOURCEMANAGER_GET_NOTIFICATION (0x0010)
15843 #define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020)
15844 #define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040)
15846 #define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
15847 RESOURCEMANAGER_QUERY_INFORMATION |\
15850 #define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15851 RESOURCEMANAGER_SET_INFORMATION |\
15852 RESOURCEMANAGER_RECOVER |\
15853 RESOURCEMANAGER_ENLIST |\
15854 RESOURCEMANAGER_GET_NOTIFICATION |\
15855 RESOURCEMANAGER_REGISTER_PROTOCOL |\
15856 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
15859 #define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
15860 RESOURCEMANAGER_RECOVER |\
15861 RESOURCEMANAGER_ENLIST |\
15862 RESOURCEMANAGER_GET_NOTIFICATION |\
15863 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
15866 #define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15867 RESOURCEMANAGER_GENERIC_READ |\
15868 RESOURCEMANAGER_GENERIC_WRITE |\
15869 RESOURCEMANAGER_GENERIC_EXECUTE)
15871 #define ENLISTMENT_QUERY_INFORMATION (0x0001)
15872 #define ENLISTMENT_SET_INFORMATION (0x0002)
15873 #define ENLISTMENT_RECOVER (0x0004)
15874 #define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008)
15875 #define ENLISTMENT_SUPERIOR_RIGHTS (0x0010)
15877 #define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
15878 ENLISTMENT_QUERY_INFORMATION)
15880 #define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15881 ENLISTMENT_SET_INFORMATION |\
15882 ENLISTMENT_RECOVER |\
15883 ENLISTMENT_SUBORDINATE_RIGHTS |\
15884 ENLISTMENT_SUPERIOR_RIGHTS)
15886 #define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
15887 ENLISTMENT_RECOVER |\
15888 ENLISTMENT_SUBORDINATE_RIGHTS |\
15889 ENLISTMENT_SUPERIOR_RIGHTS)
15891 #define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15892 ENLISTMENT_GENERIC_READ |\
15893 ENLISTMENT_GENERIC_WRITE |\
15894 ENLISTMENT_GENERIC_EXECUTE)
15896 typedef enum _TRANSACTION_OUTCOME
{
15897 TransactionOutcomeUndetermined
= 1,
15898 TransactionOutcomeCommitted
,
15899 TransactionOutcomeAborted
,
15900 } TRANSACTION_OUTCOME
;
15903 typedef enum _TRANSACTION_STATE
{
15904 TransactionStateNormal
= 1,
15905 TransactionStateIndoubt
,
15906 TransactionStateCommittedNotify
,
15907 } TRANSACTION_STATE
;
15910 typedef struct _TRANSACTION_BASIC_INFORMATION
{
15911 GUID TransactionId
;
15914 } TRANSACTION_BASIC_INFORMATION
, *PTRANSACTION_BASIC_INFORMATION
;
15916 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION
{
15918 LARGE_INTEGER VirtualClock
;
15919 } TRANSACTIONMANAGER_BASIC_INFORMATION
, *PTRANSACTIONMANAGER_BASIC_INFORMATION
;
15921 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION
{
15923 } TRANSACTIONMANAGER_LOG_INFORMATION
, *PTRANSACTIONMANAGER_LOG_INFORMATION
;
15925 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION
{
15926 ULONG LogPathLength
;
15927 _Field_size_(LogPathLength
) WCHAR LogPath
[1];
15928 } TRANSACTIONMANAGER_LOGPATH_INFORMATION
, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION
;
15930 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION
{
15931 ULONGLONG LastRecoveredLsn
;
15932 } TRANSACTIONMANAGER_RECOVERY_INFORMATION
, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION
;
15934 typedef struct _TRANSACTION_PROPERTIES_INFORMATION
{
15935 ULONG IsolationLevel
;
15936 ULONG IsolationFlags
;
15937 LARGE_INTEGER Timeout
;
15939 ULONG DescriptionLength
;
15940 WCHAR Description
[1];
15941 } TRANSACTION_PROPERTIES_INFORMATION
, *PTRANSACTION_PROPERTIES_INFORMATION
;
15943 typedef struct _TRANSACTION_BIND_INFORMATION
{
15945 } TRANSACTION_BIND_INFORMATION
, *PTRANSACTION_BIND_INFORMATION
;
15947 typedef struct _TRANSACTION_ENLISTMENT_PAIR
{
15949 GUID ResourceManagerId
;
15950 } TRANSACTION_ENLISTMENT_PAIR
, *PTRANSACTION_ENLISTMENT_PAIR
;
15952 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION
{
15953 ULONG NumberOfEnlistments
;
15954 TRANSACTION_ENLISTMENT_PAIR EnlistmentPair
[1];
15955 } TRANSACTION_ENLISTMENTS_INFORMATION
, *PTRANSACTION_ENLISTMENTS_INFORMATION
;
15957 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION
{
15958 TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair
;
15959 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION
, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION
;
15961 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION
{
15962 GUID ResourceManagerId
;
15963 ULONG DescriptionLength
;
15964 WCHAR Description
[1];
15965 } RESOURCEMANAGER_BASIC_INFORMATION
, *PRESOURCEMANAGER_BASIC_INFORMATION
;
15967 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION
{
15968 HANDLE IoCompletionPortHandle
;
15969 ULONG_PTR CompletionKey
;
15970 } RESOURCEMANAGER_COMPLETION_INFORMATION
, *PRESOURCEMANAGER_COMPLETION_INFORMATION
;
15972 typedef enum _KTMOBJECT_TYPE
{
15973 KTMOBJECT_TRANSACTION
,
15974 KTMOBJECT_TRANSACTION_MANAGER
,
15975 KTMOBJECT_RESOURCE_MANAGER
,
15976 KTMOBJECT_ENLISTMENT
,
15978 } KTMOBJECT_TYPE
, *PKTMOBJECT_TYPE
;
15980 typedef struct _KTMOBJECT_CURSOR
{
15982 ULONG ObjectIdCount
;
15984 } KTMOBJECT_CURSOR
, *PKTMOBJECT_CURSOR
;
15986 typedef enum _TRANSACTION_INFORMATION_CLASS
{
15987 TransactionBasicInformation
,
15988 TransactionPropertiesInformation
,
15989 TransactionEnlistmentInformation
,
15990 TransactionSuperiorEnlistmentInformation
15991 } TRANSACTION_INFORMATION_CLASS
;
15993 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS
{
15994 TransactionManagerBasicInformation
,
15995 TransactionManagerLogInformation
,
15996 TransactionManagerLogPathInformation
,
15997 TransactionManagerRecoveryInformation
= 4
15998 } TRANSACTIONMANAGER_INFORMATION_CLASS
;
16000 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS
{
16001 ResourceManagerBasicInformation
,
16002 ResourceManagerCompletionInformation
,
16003 } RESOURCEMANAGER_INFORMATION_CLASS
;
16005 typedef struct _ENLISTMENT_BASIC_INFORMATION
{
16007 GUID TransactionId
;
16008 GUID ResourceManagerId
;
16009 } ENLISTMENT_BASIC_INFORMATION
, *PENLISTMENT_BASIC_INFORMATION
;
16011 typedef struct _ENLISTMENT_CRM_INFORMATION
{
16012 GUID CrmTransactionManagerId
;
16013 GUID CrmResourceManagerId
;
16014 GUID CrmEnlistmentId
;
16015 } ENLISTMENT_CRM_INFORMATION
, *PENLISTMENT_CRM_INFORMATION
;
16017 typedef enum _ENLISTMENT_INFORMATION_CLASS
{
16018 EnlistmentBasicInformation
,
16019 EnlistmentRecoveryInformation
,
16020 EnlistmentCrmInformation
16021 } ENLISTMENT_INFORMATION_CLASS
;
16023 typedef struct _TRANSACTION_LIST_ENTRY
{
16024 #if defined(__cplusplus)
16029 } TRANSACTION_LIST_ENTRY
, *PTRANSACTION_LIST_ENTRY
;
16031 typedef struct _TRANSACTION_LIST_INFORMATION
{
16032 ULONG NumberOfTransactions
;
16033 TRANSACTION_LIST_ENTRY TransactionInformation
[1];
16034 } TRANSACTION_LIST_INFORMATION
, *PTRANSACTION_LIST_INFORMATION
;
16037 (NTAPI
*PFN_NT_CREATE_TRANSACTION
)(
16038 _Out_ PHANDLE TransactionHandle
,
16039 _In_ ACCESS_MASK DesiredAccess
,
16040 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16041 _In_opt_ LPGUID Uow
,
16042 _In_opt_ HANDLE TmHandle
,
16043 _In_opt_ ULONG CreateOptions
,
16044 _In_opt_ ULONG IsolationLevel
,
16045 _In_opt_ ULONG IsolationFlags
,
16046 _In_opt_ PLARGE_INTEGER Timeout
,
16047 _In_opt_ PUNICODE_STRING Description
);
16050 (NTAPI
*PFN_NT_OPEN_TRANSACTION
)(
16051 _Out_ PHANDLE TransactionHandle
,
16052 _In_ ACCESS_MASK DesiredAccess
,
16053 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16054 _In_opt_ LPGUID Uow
,
16055 _In_opt_ HANDLE TmHandle
);
16058 (NTAPI
*PFN_NT_QUERY_INFORMATION_TRANSACTION
)(
16059 _In_ HANDLE TransactionHandle
,
16060 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16061 _Out_writes_bytes_(TransactionInformationLength
) PVOID TransactionInformation
,
16062 _In_ ULONG TransactionInformationLength
,
16063 _Out_opt_ PULONG ReturnLength
);
16066 (NTAPI
*PFN_NT_SET_INFORMATION_TRANSACTION
)(
16067 _In_ HANDLE TransactionHandle
,
16068 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16069 _In_ PVOID TransactionInformation
,
16070 _In_ ULONG TransactionInformationLength
);
16073 (NTAPI
*PFN_NT_COMMIT_TRANSACTION
)(
16074 _In_ HANDLE TransactionHandle
,
16075 _In_ BOOLEAN Wait
);
16078 (NTAPI
*PFN_NT_ROLLBACK_TRANSACTION
)(
16079 _In_ HANDLE TransactionHandle
,
16080 _In_ BOOLEAN Wait
);
16082 #if (NTDDI_VERSION >= NTDDI_VISTA)
16084 _Must_inspect_result_
16085 _IRQL_requires_max_ (APC_LEVEL
)
16090 NtCreateTransactionManager(
16091 _Out_ PHANDLE TmHandle
,
16092 _In_ ACCESS_MASK DesiredAccess
,
16093 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16094 _In_opt_ PUNICODE_STRING LogFileName
,
16095 _In_opt_ ULONG CreateOptions
,
16096 _In_opt_ ULONG CommitStrength
);
16098 _Must_inspect_result_
16099 _IRQL_requires_max_ (APC_LEVEL
)
16104 NtOpenTransactionManager(
16105 _Out_ PHANDLE TmHandle
,
16106 _In_ ACCESS_MASK DesiredAccess
,
16107 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16108 _In_opt_ PUNICODE_STRING LogFileName
,
16109 _In_opt_ LPGUID TmIdentity
,
16110 _In_opt_ ULONG OpenOptions
);
16112 _Must_inspect_result_
16113 _IRQL_requires_max_ (APC_LEVEL
)
16118 NtRenameTransactionManager(
16119 _In_ PUNICODE_STRING LogFileName
,
16120 _In_ LPGUID ExistingTransactionManagerGuid
);
16122 _Must_inspect_result_
16123 _IRQL_requires_max_ (APC_LEVEL
)
16128 NtRollforwardTransactionManager(
16129 _In_ HANDLE TransactionManagerHandle
,
16130 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16132 _Must_inspect_result_
16133 _IRQL_requires_max_ (APC_LEVEL
)
16138 NtRecoverTransactionManager(
16139 _In_ HANDLE TransactionManagerHandle
);
16141 _Must_inspect_result_
16142 _IRQL_requires_max_ (APC_LEVEL
)
16147 NtQueryInformationTransactionManager(
16148 _In_ HANDLE TransactionManagerHandle
,
16149 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
16150 _Out_writes_bytes_(TransactionManagerInformationLength
) PVOID TransactionManagerInformation
,
16151 _In_ ULONG TransactionManagerInformationLength
,
16152 _Out_ PULONG ReturnLength
);
16154 _Must_inspect_result_
16155 _IRQL_requires_max_ (APC_LEVEL
)
16160 NtSetInformationTransactionManager(
16161 _In_opt_ HANDLE TmHandle
,
16162 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
16163 _In_reads_bytes_(TransactionManagerInformationLength
) PVOID TransactionManagerInformation
,
16164 _In_ ULONG TransactionManagerInformationLength
);
16166 _Must_inspect_result_
16167 _IRQL_requires_max_ (APC_LEVEL
)
16172 NtEnumerateTransactionObject(
16173 _In_opt_ HANDLE RootObjectHandle
,
16174 _In_ KTMOBJECT_TYPE QueryType
,
16175 _Inout_updates_bytes_(ObjectCursorLength
) PKTMOBJECT_CURSOR ObjectCursor
,
16176 _In_ ULONG ObjectCursorLength
,
16177 _Out_ PULONG ReturnLength
);
16179 _Must_inspect_result_
16180 _IRQL_requires_max_ (APC_LEVEL
)
16185 NtCreateTransaction(
16186 _Out_ PHANDLE TransactionHandle
,
16187 _In_ ACCESS_MASK DesiredAccess
,
16188 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16189 _In_opt_ LPGUID Uow
,
16190 _In_opt_ HANDLE TmHandle
,
16191 _In_opt_ ULONG CreateOptions
,
16192 _In_opt_ ULONG IsolationLevel
,
16193 _In_opt_ ULONG IsolationFlags
,
16194 _In_opt_ PLARGE_INTEGER Timeout
,
16195 _In_opt_ PUNICODE_STRING Description
);
16197 _Must_inspect_result_
16198 _IRQL_requires_max_ (APC_LEVEL
)
16204 _Out_ PHANDLE TransactionHandle
,
16205 _In_ ACCESS_MASK DesiredAccess
,
16206 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16208 _In_opt_ HANDLE TmHandle
);
16210 _Must_inspect_result_
16211 _IRQL_requires_max_ (APC_LEVEL
)
16216 NtQueryInformationTransaction(
16217 _In_ HANDLE TransactionHandle
,
16218 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16219 _Out_writes_bytes_(TransactionInformationLength
) PVOID TransactionInformation
,
16220 _In_ ULONG TransactionInformationLength
,
16221 _Out_opt_ PULONG ReturnLength
);
16223 _Must_inspect_result_
16224 _IRQL_requires_max_ (APC_LEVEL
)
16229 NtSetInformationTransaction(
16230 _In_ HANDLE TransactionHandle
,
16231 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16232 _In_reads_bytes_(TransactionInformationLength
) PVOID TransactionInformation
,
16233 _In_ ULONG TransactionInformationLength
);
16235 _IRQL_requires_max_ (APC_LEVEL
)
16240 NtCommitTransaction(
16241 _In_ HANDLE TransactionHandle
,
16242 _In_ BOOLEAN Wait
);
16244 _IRQL_requires_max_ (APC_LEVEL
)
16249 NtRollbackTransaction(
16250 _In_ HANDLE TransactionHandle
,
16251 _In_ BOOLEAN Wait
);
16253 _Must_inspect_result_
16254 _IRQL_requires_max_ (APC_LEVEL
)
16259 NtCreateEnlistment(
16260 _Out_ PHANDLE EnlistmentHandle
,
16261 _In_ ACCESS_MASK DesiredAccess
,
16262 _In_ HANDLE ResourceManagerHandle
,
16263 _In_ HANDLE TransactionHandle
,
16264 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16265 _In_opt_ ULONG CreateOptions
,
16266 _In_ NOTIFICATION_MASK NotificationMask
,
16267 _In_opt_ PVOID EnlistmentKey
);
16269 _Must_inspect_result_
16270 _IRQL_requires_max_ (APC_LEVEL
)
16276 _Out_ PHANDLE EnlistmentHandle
,
16277 _In_ ACCESS_MASK DesiredAccess
,
16278 _In_ HANDLE ResourceManagerHandle
,
16279 _In_ LPGUID EnlistmentGuid
,
16280 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
);
16282 _Must_inspect_result_
16283 _IRQL_requires_max_ (APC_LEVEL
)
16288 NtQueryInformationEnlistment(
16289 _In_ HANDLE EnlistmentHandle
,
16290 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
16291 _Out_writes_bytes_(EnlistmentInformationLength
) PVOID EnlistmentInformation
,
16292 _In_ ULONG EnlistmentInformationLength
,
16293 _Out_ PULONG ReturnLength
);
16295 _Must_inspect_result_
16296 _IRQL_requires_max_ (APC_LEVEL
)
16301 NtSetInformationEnlistment(
16302 _In_opt_ HANDLE EnlistmentHandle
,
16303 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
16304 _In_reads_bytes_(EnlistmentInformationLength
) PVOID EnlistmentInformation
,
16305 _In_ ULONG EnlistmentInformationLength
);
16307 _Must_inspect_result_
16308 _IRQL_requires_max_ (APC_LEVEL
)
16313 NtRecoverEnlistment(
16314 _In_ HANDLE EnlistmentHandle
,
16315 _In_opt_ PVOID EnlistmentKey
);
16317 _Must_inspect_result_
16318 _IRQL_requires_max_ (APC_LEVEL
)
16323 NtPrePrepareEnlistment(
16324 _In_ HANDLE EnlistmentHandle
,
16325 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16327 _Must_inspect_result_
16328 _IRQL_requires_max_ (APC_LEVEL
)
16333 NtPrepareEnlistment(
16334 _In_ HANDLE EnlistmentHandle
,
16335 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16337 _Must_inspect_result_
16338 _IRQL_requires_max_ (APC_LEVEL
)
16343 NtCommitEnlistment(
16344 _In_ HANDLE EnlistmentHandle
,
16345 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16347 _IRQL_requires_max_ (APC_LEVEL
)
16352 NtRollbackEnlistment(
16353 _In_ HANDLE EnlistmentHandle
,
16354 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16356 _IRQL_requires_max_ (APC_LEVEL
)
16361 NtPrePrepareComplete(
16362 _In_ HANDLE EnlistmentHandle
,
16363 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16365 _IRQL_requires_max_ (APC_LEVEL
)
16371 _In_ HANDLE EnlistmentHandle
,
16372 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16374 _IRQL_requires_max_ (APC_LEVEL
)
16380 _In_ HANDLE EnlistmentHandle
,
16381 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16383 _IRQL_requires_max_ (APC_LEVEL
)
16388 NtReadOnlyEnlistment(
16389 _In_ HANDLE EnlistmentHandle
,
16390 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16392 _IRQL_requires_max_ (APC_LEVEL
)
16397 NtRollbackComplete(
16398 _In_ HANDLE EnlistmentHandle
,
16399 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16401 _IRQL_requires_max_ (APC_LEVEL
)
16406 NtSinglePhaseReject(
16407 _In_ HANDLE EnlistmentHandle
,
16408 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16410 _Must_inspect_result_
16411 _IRQL_requires_max_ (APC_LEVEL
)
16416 NtCreateResourceManager(
16417 _Out_ PHANDLE ResourceManagerHandle
,
16418 _In_ ACCESS_MASK DesiredAccess
,
16419 _In_ HANDLE TmHandle
,
16420 _In_ LPGUID RmGuid
,
16421 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16422 _In_opt_ ULONG CreateOptions
,
16423 _In_opt_ PUNICODE_STRING Description
);
16425 _Must_inspect_result_
16426 _IRQL_requires_max_ (APC_LEVEL
)
16431 NtOpenResourceManager(
16432 _Out_ PHANDLE ResourceManagerHandle
,
16433 _In_ ACCESS_MASK DesiredAccess
,
16434 _In_ HANDLE TmHandle
,
16435 _In_opt_ LPGUID ResourceManagerGuid
,
16436 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
);
16438 _Must_inspect_result_
16439 _IRQL_requires_max_ (APC_LEVEL
)
16444 NtRecoverResourceManager(
16445 _In_ HANDLE ResourceManagerHandle
);
16447 _Must_inspect_result_
16448 _IRQL_requires_max_ (APC_LEVEL
)
16453 NtGetNotificationResourceManager(
16454 _In_ HANDLE ResourceManagerHandle
,
16455 _Out_ PTRANSACTION_NOTIFICATION TransactionNotification
,
16456 _In_ ULONG NotificationLength
,
16457 _In_opt_ PLARGE_INTEGER Timeout
,
16458 _Out_opt_ PULONG ReturnLength
,
16459 _In_ ULONG Asynchronous
,
16460 _In_opt_ ULONG_PTR AsynchronousContext
);
16462 _Must_inspect_result_
16463 _IRQL_requires_max_ (APC_LEVEL
)
16468 NtQueryInformationResourceManager(
16469 _In_ HANDLE ResourceManagerHandle
,
16470 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
16471 _Out_writes_bytes_(ResourceManagerInformationLength
) PVOID ResourceManagerInformation
,
16472 _In_ ULONG ResourceManagerInformationLength
,
16473 _Out_opt_ PULONG ReturnLength
);
16475 _Must_inspect_result_
16476 _IRQL_requires_max_ (APC_LEVEL
)
16481 NtSetInformationResourceManager(
16482 _In_ HANDLE ResourceManagerHandle
,
16483 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
16484 _In_reads_bytes_(ResourceManagerInformationLength
) PVOID ResourceManagerInformation
,
16485 _In_ ULONG ResourceManagerInformationLength
);
16487 _Must_inspect_result_
16488 _IRQL_requires_max_ (APC_LEVEL
)
16493 NtRegisterProtocolAddressInformation(
16494 _In_ HANDLE ResourceManager
,
16495 _In_ PCRM_PROTOCOL_ID ProtocolId
,
16496 _In_ ULONG ProtocolInformationSize
,
16497 _In_ PVOID ProtocolInformation
,
16498 _In_opt_ ULONG CreateOptions
);
16500 _IRQL_requires_max_ (APC_LEVEL
)
16505 NtPropagationComplete(
16506 _In_ HANDLE ResourceManagerHandle
,
16507 _In_ ULONG RequestCookie
,
16508 _In_ ULONG BufferLength
,
16509 _In_ PVOID Buffer
);
16511 _IRQL_requires_max_ (APC_LEVEL
)
16516 NtPropagationFailed(
16517 _In_ HANDLE ResourceManagerHandle
,
16518 _In_ ULONG RequestCookie
,
16519 _In_ NTSTATUS PropStatus
);
16521 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
16523 #endif /* !_NTTMAPI_ */
16524 /******************************************************************************
16525 * ZwXxx Functions *
16526 ******************************************************************************/
16530 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
16531 #define ZwCurrentProcess() NtCurrentProcess()
16532 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
16533 #define ZwCurrentThread() NtCurrentThread()
16536 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16538 _IRQL_requires_max_(PASSIVE_LEVEL
)
16543 _In_ HANDLE Handle
);
16545 _IRQL_requires_max_(PASSIVE_LEVEL
)
16549 ZwCreateDirectoryObject(
16550 _Out_ PHANDLE DirectoryHandle
,
16551 _In_ ACCESS_MASK DesiredAccess
,
16552 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16554 _IRQL_requires_max_(PASSIVE_LEVEL
)
16559 _Out_ PHANDLE FileHandle
,
16560 _In_ ACCESS_MASK DesiredAccess
,
16561 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16562 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16563 _In_opt_ PLARGE_INTEGER AllocationSize
,
16564 _In_ ULONG FileAttributes
,
16565 _In_ ULONG ShareAccess
,
16566 _In_ ULONG CreateDisposition
,
16567 _In_ ULONG CreateOptions
,
16568 _In_reads_bytes_opt_(EaLength
) PVOID EaBuffer
,
16569 _In_ ULONG EaLength
);
16571 _IRQL_requires_max_(PASSIVE_LEVEL
)
16576 _Out_ PHANDLE KeyHandle
,
16577 _In_ ACCESS_MASK DesiredAccess
,
16578 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16579 _Reserved_ ULONG TitleIndex
,
16580 _In_opt_ PUNICODE_STRING Class
,
16581 _In_ ULONG CreateOptions
,
16582 _Out_opt_ PULONG Disposition
);
16584 _IRQL_requires_max_(APC_LEVEL
)
16589 _Out_ PHANDLE SectionHandle
,
16590 _In_ ACCESS_MASK DesiredAccess
,
16591 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16592 _In_opt_ PLARGE_INTEGER MaximumSize
,
16593 _In_ ULONG SectionPageProtection
,
16594 _In_ ULONG AllocationAttributes
,
16595 _In_opt_ HANDLE FileHandle
);
16597 _IRQL_requires_max_(PASSIVE_LEVEL
)
16602 _In_ HANDLE KeyHandle
);
16604 _IRQL_requires_max_(PASSIVE_LEVEL
)
16609 _In_ HANDLE KeyHandle
,
16610 _In_ PUNICODE_STRING ValueName
);
16612 _IRQL_requires_max_(PASSIVE_LEVEL
)
16613 _When_(Length
== 0, _Post_satisfies_(return < 0))
16614 _When_(Length
> 0, _Post_satisfies_(return <= 0))
16619 _In_ HANDLE KeyHandle
,
16621 _In_ KEY_INFORMATION_CLASS KeyInformationClass
,
16622 _Out_writes_bytes_opt_(Length
) PVOID KeyInformation
,
16624 _Out_ PULONG ResultLength
);
16626 _IRQL_requires_max_(PASSIVE_LEVEL
)
16627 _When_(Length
== 0, _Post_satisfies_(return < 0))
16628 _When_(Length
> 0, _Post_satisfies_(return <= 0))
16632 ZwEnumerateValueKey(
16633 _In_ HANDLE KeyHandle
,
16635 _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
16636 _Out_writes_bytes_opt_(Length
) PVOID KeyValueInformation
,
16638 _Out_ PULONG ResultLength
);
16640 _IRQL_requires_max_(PASSIVE_LEVEL
)
16645 _In_ HANDLE KeyHandle
);
16647 _IRQL_requires_max_(PASSIVE_LEVEL
)
16652 _In_ PUNICODE_STRING DriverServiceName
);
16654 _IRQL_requires_max_(PASSIVE_LEVEL
)
16658 ZwMakeTemporaryObject(
16659 _In_ HANDLE Handle
);
16661 _IRQL_requires_max_(PASSIVE_LEVEL
)
16665 ZwMapViewOfSection(
16666 _In_ HANDLE SectionHandle
,
16667 _In_ HANDLE ProcessHandle
,
16668 _Outptr_result_bytebuffer_(*ViewSize
) PVOID
*BaseAddress
,
16669 _In_ ULONG_PTR ZeroBits
,
16670 _In_ SIZE_T CommitSize
,
16671 _Inout_opt_ PLARGE_INTEGER SectionOffset
,
16672 _Inout_ PSIZE_T ViewSize
,
16673 _In_ SECTION_INHERIT InheritDisposition
,
16674 _In_ ULONG AllocationType
,
16675 _In_ ULONG Protect
);
16677 _IRQL_requires_max_(PASSIVE_LEVEL
)
16682 _Out_ PHANDLE FileHandle
,
16683 _In_ ACCESS_MASK DesiredAccess
,
16684 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16685 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16686 _In_ ULONG ShareAccess
,
16687 _In_ ULONG OpenOptions
);
16689 _IRQL_requires_max_(PASSIVE_LEVEL
)
16694 _Out_ PHANDLE KeyHandle
,
16695 _In_ ACCESS_MASK DesiredAccess
,
16696 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16698 _IRQL_requires_max_(PASSIVE_LEVEL
)
16703 _Out_ PHANDLE SectionHandle
,
16704 _In_ ACCESS_MASK DesiredAccess
,
16705 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16707 _IRQL_requires_max_(PASSIVE_LEVEL
)
16711 ZwOpenSymbolicLinkObject(
16712 _Out_ PHANDLE LinkHandle
,
16713 _In_ ACCESS_MASK DesiredAccess
,
16714 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16716 _IRQL_requires_max_(PASSIVE_LEVEL
)
16720 ZwQueryInformationFile(
16721 _In_ HANDLE FileHandle
,
16722 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16723 _Out_writes_bytes_(Length
) PVOID FileInformation
,
16725 _In_ FILE_INFORMATION_CLASS FileInformationClass
);
16727 _IRQL_requires_max_(PASSIVE_LEVEL
)
16728 _When_(Length
== 0, _Post_satisfies_(return < 0))
16729 _When_(Length
> 0, _Post_satisfies_(return <= 0))
16734 _In_ HANDLE KeyHandle
,
16735 _In_ KEY_INFORMATION_CLASS KeyInformationClass
,
16736 _Out_writes_bytes_opt_(Length
) PVOID KeyInformation
,
16738 _Out_ PULONG ResultLength
);
16740 _IRQL_requires_max_(PASSIVE_LEVEL
)
16744 ZwQuerySymbolicLinkObject(
16745 _In_ HANDLE LinkHandle
,
16746 _Inout_ PUNICODE_STRING LinkTarget
,
16747 _Out_opt_ PULONG ReturnedLength
);
16749 _IRQL_requires_max_(PASSIVE_LEVEL
)
16750 _When_(Length
== 0, _Post_satisfies_(return < 0))
16751 _When_(Length
> 0, _Post_satisfies_(return <= 0))
16756 _In_ HANDLE KeyHandle
,
16757 _In_ PUNICODE_STRING ValueName
,
16758 _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
16759 _Out_writes_bytes_opt_(Length
) PVOID KeyValueInformation
,
16761 _Out_ PULONG ResultLength
);
16763 _IRQL_requires_max_(PASSIVE_LEVEL
)
16768 _In_ HANDLE FileHandle
,
16769 _In_opt_ HANDLE Event
,
16770 _In_opt_ PIO_APC_ROUTINE ApcRoutine
,
16771 _In_opt_ PVOID ApcContext
,
16772 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16773 _Out_writes_bytes_(Length
) PVOID Buffer
,
16775 _In_opt_ PLARGE_INTEGER ByteOffset
,
16776 _In_opt_ PULONG Key
);
16778 _IRQL_requires_max_(PASSIVE_LEVEL
)
16782 ZwSetInformationFile(
16783 _In_ HANDLE FileHandle
,
16784 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16785 _In_reads_bytes_(Length
) PVOID FileInformation
,
16787 _In_ FILE_INFORMATION_CLASS FileInformationClass
);
16789 _IRQL_requires_max_(PASSIVE_LEVEL
)
16794 _In_ HANDLE KeyHandle
,
16795 _In_ PUNICODE_STRING ValueName
,
16796 _In_opt_ ULONG TitleIndex
,
16798 _In_reads_bytes_opt_(DataSize
) PVOID Data
,
16799 _In_ ULONG DataSize
);
16801 _IRQL_requires_max_(PASSIVE_LEVEL
)
16806 _In_ PUNICODE_STRING DriverServiceName
);
16808 _IRQL_requires_max_(PASSIVE_LEVEL
)
16812 ZwUnmapViewOfSection(
16813 _In_ HANDLE ProcessHandle
,
16814 _In_opt_ PVOID BaseAddress
);
16816 _IRQL_requires_max_(PASSIVE_LEVEL
)
16821 _In_ HANDLE FileHandle
,
16822 _In_opt_ HANDLE Event
,
16823 _In_opt_ PIO_APC_ROUTINE ApcRoutine
,
16824 _In_opt_ PVOID ApcContext
,
16825 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16826 _In_reads_bytes_(Length
) PVOID Buffer
,
16828 _In_opt_ PLARGE_INTEGER ByteOffset
,
16829 _In_opt_ PULONG Key
);
16831 _IRQL_requires_max_(PASSIVE_LEVEL
)
16835 ZwQueryFullAttributesFile(
16836 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16837 _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation
);
16839 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
16842 #if (NTDDI_VERSION >= NTDDI_WS03)
16843 _IRQL_requires_max_(PASSIVE_LEVEL
)
16848 _Out_ PHANDLE EventHandle
,
16849 _In_ ACCESS_MASK DesiredAccess
,
16850 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16853 #if (NTDDI_VERSION >= NTDDI_VISTA)
16855 _IRQL_requires_max_(PASSIVE_LEVEL
)
16858 ZwCreateKeyTransacted(
16859 _Out_ PHANDLE KeyHandle
,
16860 _In_ ACCESS_MASK DesiredAccess
,
16861 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16862 _Reserved_ ULONG TitleIndex
,
16863 _In_opt_ PUNICODE_STRING Class
,
16864 _In_ ULONG CreateOptions
,
16865 _In_ HANDLE TransactionHandle
,
16866 _Out_opt_ PULONG Disposition
);
16868 _IRQL_requires_max_(PASSIVE_LEVEL
)
16872 ZwOpenKeyTransacted(
16873 _Out_ PHANDLE KeyHandle
,
16874 _In_ ACCESS_MASK DesiredAccess
,
16875 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16876 _In_ HANDLE TransactionHandle
);
16878 _IRQL_requires_max_(PASSIVE_LEVEL
)
16882 ZwCreateTransactionManager(
16883 _Out_ PHANDLE TmHandle
,
16884 _In_ ACCESS_MASK DesiredAccess
,
16885 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16886 _In_opt_ PUNICODE_STRING LogFileName
,
16887 _In_opt_ ULONG CreateOptions
,
16888 _In_opt_ ULONG CommitStrength
);
16890 _IRQL_requires_max_(PASSIVE_LEVEL
)
16894 ZwOpenTransactionManager(
16895 _Out_ PHANDLE TmHandle
,
16896 _In_ ACCESS_MASK DesiredAccess
,
16897 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16898 _In_opt_ PUNICODE_STRING LogFileName
,
16899 _In_opt_ LPGUID TmIdentity
,
16900 _In_opt_ ULONG OpenOptions
);
16902 _IRQL_requires_max_(PASSIVE_LEVEL
)
16906 ZwRollforwardTransactionManager(
16907 _In_ HANDLE TransactionManagerHandle
,
16908 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16910 _IRQL_requires_max_(PASSIVE_LEVEL
)
16914 ZwRecoverTransactionManager(
16915 _In_ HANDLE TransactionManagerHandle
);
16917 _IRQL_requires_max_(PASSIVE_LEVEL
)
16921 ZwQueryInformationTransactionManager(
16922 _In_ HANDLE TransactionManagerHandle
,
16923 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
16924 _Out_writes_bytes_(TransactionManagerInformationLength
) PVOID TransactionManagerInformation
,
16925 _In_ ULONG TransactionManagerInformationLength
,
16926 _Out_opt_ PULONG ReturnLength
);
16928 _IRQL_requires_max_(PASSIVE_LEVEL
)
16932 ZwSetInformationTransactionManager(
16933 _In_ HANDLE TmHandle
,
16934 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
16935 _In_ PVOID TransactionManagerInformation
,
16936 _In_ ULONG TransactionManagerInformationLength
);
16938 _IRQL_requires_max_(PASSIVE_LEVEL
)
16942 ZwEnumerateTransactionObject(
16943 _In_opt_ HANDLE RootObjectHandle
,
16944 _In_ KTMOBJECT_TYPE QueryType
,
16945 _Inout_updates_bytes_(ObjectCursorLength
) PKTMOBJECT_CURSOR ObjectCursor
,
16946 _In_ ULONG ObjectCursorLength
,
16947 _Out_ PULONG ReturnLength
);
16949 _IRQL_requires_max_(PASSIVE_LEVEL
)
16953 ZwCreateTransaction(
16954 _Out_ PHANDLE TransactionHandle
,
16955 _In_ ACCESS_MASK DesiredAccess
,
16956 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16957 _In_opt_ LPGUID Uow
,
16958 _In_opt_ HANDLE TmHandle
,
16959 _In_opt_ ULONG CreateOptions
,
16960 _In_opt_ ULONG IsolationLevel
,
16961 _In_opt_ ULONG IsolationFlags
,
16962 _In_opt_ PLARGE_INTEGER Timeout
,
16963 _In_opt_ PUNICODE_STRING Description
);
16965 _IRQL_requires_max_(PASSIVE_LEVEL
)
16970 _Out_ PHANDLE TransactionHandle
,
16971 _In_ ACCESS_MASK DesiredAccess
,
16972 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16974 _In_opt_ HANDLE TmHandle
);
16976 _IRQL_requires_max_(PASSIVE_LEVEL
)
16980 ZwQueryInformationTransaction(
16981 _In_ HANDLE TransactionHandle
,
16982 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16983 _Out_writes_bytes_(TransactionInformationLength
) PVOID TransactionInformation
,
16984 _In_ ULONG TransactionInformationLength
,
16985 _Out_opt_ PULONG ReturnLength
);
16987 _IRQL_requires_max_(PASSIVE_LEVEL
)
16991 ZwSetInformationTransaction(
16992 _In_ HANDLE TransactionHandle
,
16993 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16994 _In_ PVOID TransactionInformation
,
16995 _In_ ULONG TransactionInformationLength
);
16997 _IRQL_requires_max_(PASSIVE_LEVEL
)
17001 ZwCommitTransaction(
17002 _In_ HANDLE TransactionHandle
,
17003 _In_ BOOLEAN Wait
);
17005 _IRQL_requires_max_(PASSIVE_LEVEL
)
17009 ZwRollbackTransaction(
17010 _In_ HANDLE TransactionHandle
,
17011 _In_ BOOLEAN Wait
);
17013 _IRQL_requires_max_(PASSIVE_LEVEL
)
17017 ZwCreateResourceManager(
17018 _Out_ PHANDLE ResourceManagerHandle
,
17019 _In_ ACCESS_MASK DesiredAccess
,
17020 _In_ HANDLE TmHandle
,
17021 _In_opt_ LPGUID ResourceManagerGuid
,
17022 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
17023 _In_opt_ ULONG CreateOptions
,
17024 _In_opt_ PUNICODE_STRING Description
);
17026 _IRQL_requires_max_(PASSIVE_LEVEL
)
17030 ZwOpenResourceManager(
17031 _Out_ PHANDLE ResourceManagerHandle
,
17032 _In_ ACCESS_MASK DesiredAccess
,
17033 _In_ HANDLE TmHandle
,
17034 _In_ LPGUID ResourceManagerGuid
,
17035 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
);
17037 _IRQL_requires_max_(PASSIVE_LEVEL
)
17041 ZwRecoverResourceManager(
17042 _In_ HANDLE ResourceManagerHandle
);
17044 _IRQL_requires_max_(PASSIVE_LEVEL
)
17048 ZwGetNotificationResourceManager(
17049 _In_ HANDLE ResourceManagerHandle
,
17050 _Out_ PTRANSACTION_NOTIFICATION TransactionNotification
,
17051 _In_ ULONG NotificationLength
,
17052 _In_ PLARGE_INTEGER Timeout
,
17053 _Out_opt_ PULONG ReturnLength
,
17054 _In_ ULONG Asynchronous
,
17055 _In_opt_ ULONG_PTR AsynchronousContext
);
17057 _IRQL_requires_max_(PASSIVE_LEVEL
)
17061 ZwQueryInformationResourceManager(
17062 _In_ HANDLE ResourceManagerHandle
,
17063 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
17064 _Out_writes_bytes_(ResourceManagerInformationLength
) PVOID ResourceManagerInformation
,
17065 _In_ ULONG ResourceManagerInformationLength
,
17066 _Out_opt_ PULONG ReturnLength
);
17068 _IRQL_requires_max_(PASSIVE_LEVEL
)
17072 ZwSetInformationResourceManager(
17073 _In_ HANDLE ResourceManagerHandle
,
17074 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
17075 _In_reads_bytes_(ResourceManagerInformationLength
) PVOID ResourceManagerInformation
,
17076 _In_ ULONG ResourceManagerInformationLength
);
17078 _IRQL_requires_max_(PASSIVE_LEVEL
)
17082 ZwCreateEnlistment(
17083 _Out_ PHANDLE EnlistmentHandle
,
17084 _In_ ACCESS_MASK DesiredAccess
,
17085 _In_ HANDLE ResourceManagerHandle
,
17086 _In_ HANDLE TransactionHandle
,
17087 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
17088 _In_opt_ ULONG CreateOptions
,
17089 _In_ NOTIFICATION_MASK NotificationMask
,
17090 _In_opt_ PVOID EnlistmentKey
);
17092 _IRQL_requires_max_(PASSIVE_LEVEL
)
17097 _Out_ PHANDLE EnlistmentHandle
,
17098 _In_ ACCESS_MASK DesiredAccess
,
17099 _In_ HANDLE RmHandle
,
17100 _In_ LPGUID EnlistmentGuid
,
17101 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
);
17103 _IRQL_requires_max_(PASSIVE_LEVEL
)
17107 ZwQueryInformationEnlistment(
17108 _In_ HANDLE EnlistmentHandle
,
17109 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
17110 _Out_writes_bytes_(EnlistmentInformationLength
) PVOID EnlistmentInformation
,
17111 _In_ ULONG EnlistmentInformationLength
,
17112 _Out_opt_ PULONG ReturnLength
);
17114 _IRQL_requires_max_(PASSIVE_LEVEL
)
17118 ZwSetInformationEnlistment(
17119 _In_ HANDLE EnlistmentHandle
,
17120 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
17121 _In_reads_bytes_(EnlistmentInformationLength
) PVOID EnlistmentInformation
,
17122 _In_ ULONG EnlistmentInformationLength
);
17124 _IRQL_requires_max_(PASSIVE_LEVEL
)
17128 ZwRecoverEnlistment(
17129 _In_ HANDLE EnlistmentHandle
,
17130 _In_opt_ PVOID EnlistmentKey
);
17132 _IRQL_requires_max_(PASSIVE_LEVEL
)
17136 ZwPrePrepareEnlistment(
17137 _In_ HANDLE EnlistmentHandle
,
17138 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17140 _IRQL_requires_max_(PASSIVE_LEVEL
)
17144 ZwPrepareEnlistment(
17145 _In_ HANDLE EnlistmentHandle
,
17146 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17148 _IRQL_requires_max_(PASSIVE_LEVEL
)
17152 ZwCommitEnlistment(
17153 _In_ HANDLE EnlistmentHandle
,
17154 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17156 _IRQL_requires_max_(PASSIVE_LEVEL
)
17160 ZwRollbackEnlistment(
17161 _In_ HANDLE EnlistmentHandle
,
17162 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17164 _IRQL_requires_max_(PASSIVE_LEVEL
)
17168 ZwPrePrepareComplete(
17169 _In_ HANDLE EnlistmentHandle
,
17170 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17172 _IRQL_requires_max_(PASSIVE_LEVEL
)
17177 _In_ HANDLE EnlistmentHandle
,
17178 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17180 _IRQL_requires_max_(PASSIVE_LEVEL
)
17185 _In_ HANDLE EnlistmentHandle
,
17186 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17188 _IRQL_requires_max_(PASSIVE_LEVEL
)
17192 ZwReadOnlyEnlistment(
17193 _In_ HANDLE EnlistmentHandle
,
17194 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17199 ZwRollbackComplete(
17200 IN HANDLE EnlistmentHandle
,
17201 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
17206 ZwSinglePhaseReject(
17207 _In_ HANDLE EnlistmentHandle
,
17208 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17209 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
17210 #if (NTDDI_VERSION >= NTDDI_WIN7)
17212 _IRQL_requires_max_(PASSIVE_LEVEL
)
17217 _Out_ PHANDLE KeyHandle
,
17218 _In_ ACCESS_MASK DesiredAccess
,
17219 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
17220 _In_ ULONG OpenOptions
);
17222 _IRQL_requires_max_(PASSIVE_LEVEL
)
17226 ZwOpenKeyTransactedEx(
17227 _Out_ PHANDLE KeyHandle
,
17228 _In_ ACCESS_MASK DesiredAccess
,
17229 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
17230 _In_ ULONG OpenOptions
,
17231 _In_ HANDLE TransactionHandle
);
17236 ZwNotifyChangeMultipleKeys(
17237 IN HANDLE MasterKeyHandle
,
17238 IN ULONG Count OPTIONAL
,
17239 IN OBJECT_ATTRIBUTES SubordinateObjects
[] OPTIONAL
,
17240 IN HANDLE Event OPTIONAL
,
17241 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
17242 IN PVOID ApcContext OPTIONAL
,
17243 OUT PIO_STATUS_BLOCK IoStatusBlock
,
17244 IN ULONG CompletionFilter
,
17245 IN BOOLEAN WatchTree
,
17246 OUT PVOID Buffer OPTIONAL
,
17247 IN ULONG BufferSize
,
17248 IN BOOLEAN Asynchronous
);
17253 ZwQueryMultipleValueKey(
17254 IN HANDLE KeyHandle
,
17255 IN OUT PKEY_VALUE_ENTRY ValueEntries
,
17256 IN ULONG EntryCount
,
17257 OUT PVOID ValueBuffer
,
17258 IN OUT PULONG BufferLength
,
17259 OUT PULONG RequiredBufferLength OPTIONAL
);
17261 _IRQL_requires_max_(PASSIVE_LEVEL
)
17266 _In_ HANDLE KeyHandle
,
17267 _In_ PUNICODE_STRING NewName
);
17269 _IRQL_requires_max_(PASSIVE_LEVEL
)
17273 ZwSetInformationKey(
17274 _In_ HANDLE KeyHandle
,
17275 _In_
__drv_strictTypeMatch(__drv_typeConst
) KEY_SET_INFORMATION_CLASS KeySetInformationClass
,
17276 _In_reads_bytes_(KeySetInformationLength
) PVOID KeySetInformation
,
17277 _In_ ULONG KeySetInformationLength
);
17279 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
17286 #endif /* !_WDMDDK_ */