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
44 #include <kernelspecs.h>
54 #endif /* _INC_STRING */
60 typedef GUID UOW
, *PUOW
;
65 #if (NTDDI_VERSION >= NTDDI_WINXP)
71 __internal_kernel_driver
72 __drv_Mode_impl(WDM_INCLUDED
)
78 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
79 #define NTHALAPI DECLSPEC_IMPORT
85 #if !defined(_NTOSKRNL_) && !defined(_BLDR_) && !defined(_NTSYSTEM_)
86 #define NTKERNELAPI DECLSPEC_IMPORT
94 #if defined(_X86_) && !defined(_NTHAL_)
95 #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT
97 #define _DECL_HAL_KE_IMPORT
99 #define _DECL_HAL_KE_IMPORT NTKERNELAPI
103 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
105 #define POINTER_ALIGNMENT
108 /* Helper macro to enable gcc's extension. */
109 #ifndef __GNU_EXTENSION
111 #define __GNU_EXTENSION __extension__
113 #define __GNU_EXTENSION
117 #if defined(_MSC_VER)
119 /* Disable some warnings */
120 #pragma warning(disable:4115) /* Named type definition in parentheses */
121 #pragma warning(disable:4201) /* Nameless unions and structs */
122 #pragma warning(disable:4214) /* Bit fields of other types than int */
123 #pragma warning(disable:4820) /* Padding added, due to alignment requirement */
125 /* Indicate if #pragma alloc_text() is supported */
126 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
127 #define ALLOC_PRAGMA 1
130 /* Indicate if #pragma data_seg() is supported */
131 #if defined(_M_IX86) || defined(_M_AMD64)
132 #define ALLOC_DATA_PRAGMA 1
135 #endif /* _MSC_VER */
137 /* These macros are used to create aliases for imported data. We need to do
138 this to have declarations that are compatible with MS DDK */
140 #define __SYMBOL(_Name) "_"#_Name
141 #define __IMPORTSYMBOL(_Name) "__imp__"#_Name
142 #define __IMPORTNAME(_Name) __imp__##_Name
144 #define __SYMBOL(_Name) #_Name
145 #define __IMPORTSYMBOL(_Name) "__imp_"#_Name
146 #define __IMPORTNAME(_Name) __imp_##_Name
149 #define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \
150 __pragma(comment(linker, "/alternatename:"__SYMBOL(_Name) "=" __IMPORTSYMBOL(_Name)))
151 #else /* !_MSC_VER */
153 #define __STRINGIFY(_exp) #_exp
155 #define _Pragma_redefine_extname(_Name, _Target) _Pragma(__STRINGIFY(redefine_extname _Name _Target))
156 #define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \
157 _Pragma_redefine_extname(_Name,__IMPORTNAME(_Name))
161 #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
162 #define USE_DMA_MACROS
164 #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__)
165 #define NO_LEGACY_DRIVERS
167 #endif /* defined(_WIN64) */
169 /* Forward declarations */
176 struct _DEVICE_OBJECT
;
177 struct _DRIVER_OBJECT
;
178 struct _IO_STATUS_BLOCK
;
179 struct _DEVICE_DESCRIPTION
;
180 struct _SCATTER_GATHER_LIST
;
181 struct _DRIVE_LAYOUT_INFORMATION
;
182 struct _COMPRESSED_DATA_INFO
;
183 struct _IO_RESOURCE_DESCRIPTOR
;
185 /* Structures not exposed to drivers */
186 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
187 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
188 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
189 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
190 typedef struct _EPROCESS
*PEPROCESS
;
191 typedef struct _ETHREAD
*PETHREAD
;
192 typedef struct _IO_TIMER
*PIO_TIMER
;
193 typedef struct _KINTERRUPT
*PKINTERRUPT
;
194 typedef struct _KPROCESS
*PKPROCESS
;
195 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
196 typedef struct _CONTEXT
*PCONTEXT
;
198 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
199 typedef struct _DMA_ADAPTER
*PADAPTER_OBJECT
;
200 #elif defined(_WDM_INCLUDED_)
201 typedef struct _DMA_ADAPTER
*PADAPTER_OBJECT
;
203 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
206 #ifndef DEFINE_GUIDEX
208 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
210 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
212 #endif /* DEFINE_GUIDEX */
215 #define STATICGUIDOF(guid) STATIC_##guid
218 /* GUID Comparison */
219 #ifndef __IID_ALIGNED__
220 #define __IID_ALIGNED__
222 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
224 return ( (*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) &&
225 (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)) );
228 #define IsEqualGUIDAligned(guid1, guid2) \
229 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
230 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
231 #endif /* __cplusplus */
232 #endif /* !__IID_ALIGNED__ */
235 /******************************************************************************
236 * INTERLOCKED Functions *
237 ******************************************************************************/
239 #define BitScanForward _BitScanForward
240 #define BitScanReverse _BitScanReverse
241 #define BitTest _bittest
242 #define BitTestAndComplement _bittestandcomplement
243 #define BitTestAndSet _bittestandset
244 #define BitTestAndReset _bittestandreset
245 #define InterlockedBitTestAndSet _interlockedbittestandset
246 #define InterlockedBitTestAndReset _interlockedbittestandreset
249 #define BitScanForward64 _BitScanForward64
250 #define BitScanReverse64 _BitScanReverse64
251 #define BitTest64 _bittest64
252 #define BitTestAndComplement64 _bittestandcomplement64
253 #define BitTestAndSet64 _bittestandset64
254 #define BitTestAndReset64 _bittestandreset64
255 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
256 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
259 #if !defined(__INTERLOCKED_DECLARED)
260 #define __INTERLOCKED_DECLARED
263 #if defined(NO_INTERLOCKED_INTRINSICS)
267 InterlockedIncrement(
268 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
);
273 InterlockedDecrement(
274 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
);
279 InterlockedCompareExchange(
280 _Inout_ _Interlocked_operand_ LONG
volatile *Destination
,
282 _In_ LONG Comparand
);
288 _Inout_ _Interlocked_operand_ LONG
volatile *Destination
,
294 InterlockedExchangeAdd(
295 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
,
298 #else /* !defined(NO_INTERLOCKED_INTRINSICS) */
300 #define InterlockedExchange _InterlockedExchange
301 #define InterlockedIncrement _InterlockedIncrement
302 #define InterlockedDecrement _InterlockedDecrement
303 #define InterlockedExchangeAdd _InterlockedExchangeAdd
304 #define InterlockedCompareExchange _InterlockedCompareExchange
305 #define InterlockedOr _InterlockedOr
306 #define InterlockedAnd _InterlockedAnd
307 #define InterlockedXor _InterlockedXor
309 #endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
311 #endif /* defined (_X86_) */
313 #if !defined (_WIN64)
316 * InterlockedExchangePointer(
317 * IN OUT PVOID volatile *Target,
320 #define InterlockedExchangePointer(Target, Value) \
321 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
325 * InterlockedCompareExchangePointer(
326 * IN OUT PVOID *Destination,
328 * IN PVOID Comparand)
330 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
331 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
333 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
334 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
335 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
337 #endif // !defined (_WIN64)
339 #if defined (_M_AMD64)
341 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
342 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
343 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
344 #define InterlockedAnd _InterlockedAnd
345 #define InterlockedOr _InterlockedOr
346 #define InterlockedXor _InterlockedXor
347 #define InterlockedIncrement _InterlockedIncrement
348 #define InterlockedDecrement _InterlockedDecrement
349 #define InterlockedAdd _InterlockedAdd
350 #define InterlockedExchange _InterlockedExchange
351 #define InterlockedExchangeAdd _InterlockedExchangeAdd
352 #define InterlockedCompareExchange _InterlockedCompareExchange
353 #define InterlockedAnd64 _InterlockedAnd64
354 #define InterlockedOr64 _InterlockedOr64
355 #define InterlockedXor64 _InterlockedXor64
356 #define InterlockedIncrement64 _InterlockedIncrement64
357 #define InterlockedDecrement64 _InterlockedDecrement64
358 #define InterlockedAdd64 _InterlockedAdd64
359 #define InterlockedExchange64 _InterlockedExchange64
360 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
361 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
362 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
363 #define InterlockedExchangePointer _InterlockedExchangePointer
364 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
365 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
369 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
370 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
374 _Inout_ _Interlocked_operand_ LONG64
volatile *Addend
,
377 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
382 #endif /* !__INTERLOCKED_DECLARED */
385 /******************************************************************************
386 * Runtime Library Types *
387 ******************************************************************************/
389 #define RTL_REGISTRY_ABSOLUTE 0
390 #define RTL_REGISTRY_SERVICES 1
391 #define RTL_REGISTRY_CONTROL 2
392 #define RTL_REGISTRY_WINDOWS_NT 3
393 #define RTL_REGISTRY_DEVICEMAP 4
394 #define RTL_REGISTRY_USER 5
395 #define RTL_REGISTRY_MAXIMUM 6
396 #define RTL_REGISTRY_HANDLE 0x40000000
397 #define RTL_REGISTRY_OPTIONAL 0x80000000
399 /* RTL_QUERY_REGISTRY_TABLE.Flags */
400 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
401 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
402 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
403 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
404 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
405 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
406 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
408 #define HASH_STRING_ALGORITHM_DEFAULT 0
409 #define HASH_STRING_ALGORITHM_X65599 1
410 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
412 typedef struct _RTL_BITMAP
{
415 } RTL_BITMAP
, *PRTL_BITMAP
;
417 typedef struct _RTL_BITMAP_RUN
{
420 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
422 _Function_class_(RTL_QUERY_REGISTRY_ROUTINE
)
423 _IRQL_requires_max_(PASSIVE_LEVEL
)
426 (NTAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
427 _In_z_ PWSTR ValueName
,
428 _In_ ULONG ValueType
,
429 _In_reads_bytes_opt_(ValueLength
) PVOID ValueData
,
430 _In_ ULONG ValueLength
,
431 _In_opt_ PVOID Context
,
432 _In_opt_ PVOID EntryContext
);
434 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
435 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
442 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
444 typedef struct _TIME_FIELDS
{
453 } TIME_FIELDS
, *PTIME_FIELDS
;
456 #ifndef _SLIST_HEADER_
457 #define _SLIST_HEADER_
461 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
462 struct _SLIST_ENTRY
*Next
;
463 } SLIST_ENTRY
, *PSLIST_ENTRY
;
465 typedef struct _SLIST_ENTRY32
{
467 } SLIST_ENTRY32
, *PSLIST_ENTRY32
;
469 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
470 _ANONYMOUS_STRUCT
struct {
476 ULONGLONG Sequence
:9;
477 ULONGLONG NextEntry
:39;
478 ULONGLONG HeaderType
:1;
480 ULONGLONG Reserved
:59;
485 ULONGLONG Sequence
:48;
486 ULONGLONG HeaderType
:1;
488 ULONGLONG Reserved
:2;
489 ULONGLONG NextEntry
:60;
493 ULONGLONG Sequence
:48;
494 ULONGLONG HeaderType
:1;
495 ULONGLONG Reserved
:3;
496 ULONGLONG NextEntry
:60;
498 } SLIST_HEADER
, *PSLIST_HEADER
;
500 typedef union _SLIST_HEADER32
{
502 _ANONYMOUS_STRUCT
struct {
507 } SLIST_HEADER32
, *PSLIST_HEADER32
;
511 #define SLIST_ENTRY SINGLE_LIST_ENTRY
512 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
513 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
515 typedef SLIST_ENTRY SLIST_ENTRY32
, *PSLIST_ENTRY32
;
517 typedef union _SLIST_HEADER
{
519 _ANONYMOUS_STRUCT
struct {
524 } SLIST_HEADER
, *PSLIST_HEADER
;
526 typedef SLIST_HEADER SLIST_HEADER32
, *PSLIST_HEADER32
;
528 #endif /* defined(_WIN64) */
530 #endif /* _SLIST_HEADER_ */
532 /* Exception record flags */
533 #define EXCEPTION_NONCONTINUABLE 0x01
534 #define EXCEPTION_UNWINDING 0x02
535 #define EXCEPTION_EXIT_UNWIND 0x04
536 #define EXCEPTION_STACK_INVALID 0x08
537 #define EXCEPTION_NESTED_CALL 0x10
538 #define EXCEPTION_TARGET_UNWIND 0x20
539 #define EXCEPTION_COLLIDED_UNWIND 0x40
540 #define EXCEPTION_UNWIND (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND | \
541 EXCEPTION_TARGET_UNWIND | EXCEPTION_COLLIDED_UNWIND)
543 #define IS_UNWINDING(Flag) ((Flag & EXCEPTION_UNWIND) != 0)
544 #define IS_DISPATCHING(Flag) ((Flag & EXCEPTION_UNWIND) == 0)
545 #define IS_TARGET_UNWIND(Flag) (Flag & EXCEPTION_TARGET_UNWIND)
547 #define EXCEPTION_MAXIMUM_PARAMETERS 15
549 /* Exception records */
550 typedef struct _EXCEPTION_RECORD
{
551 NTSTATUS ExceptionCode
;
552 ULONG ExceptionFlags
;
553 struct _EXCEPTION_RECORD
*ExceptionRecord
;
554 PVOID ExceptionAddress
;
555 ULONG NumberParameters
;
556 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
557 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
559 typedef struct _EXCEPTION_RECORD32
{
560 NTSTATUS ExceptionCode
;
561 ULONG ExceptionFlags
;
562 ULONG ExceptionRecord
;
563 ULONG ExceptionAddress
;
564 ULONG NumberParameters
;
565 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
566 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
568 typedef struct _EXCEPTION_RECORD64
{
569 NTSTATUS ExceptionCode
;
570 ULONG ExceptionFlags
;
571 ULONG64 ExceptionRecord
;
572 ULONG64 ExceptionAddress
;
573 ULONG NumberParameters
;
574 ULONG __unusedAlignment
;
575 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
576 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
578 typedef struct _EXCEPTION_POINTERS
{
579 PEXCEPTION_RECORD ExceptionRecord
;
580 PCONTEXT ContextRecord
;
581 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
584 extern BOOLEAN NlsMbCodePageTag
;
585 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
586 extern BOOLEAN NlsMbOemCodePageTag
;
587 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
589 __CREATE_NTOS_DATA_IMPORT_ALIAS(NlsMbCodePageTag
)
590 extern BOOLEAN
*NlsMbCodePageTag
;
591 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
592 __CREATE_NTOS_DATA_IMPORT_ALIAS(NlsMbOemCodePageTag
)
593 extern BOOLEAN
*NlsMbOemCodePageTag
;
594 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
597 #define SHORT_LEAST_SIGNIFICANT_BIT 0
598 #define SHORT_MOST_SIGNIFICANT_BIT 1
600 #define LONG_LEAST_SIGNIFICANT_BIT 0
601 #define LONG_3RD_MOST_SIGNIFICANT_BIT 1
602 #define LONG_2ND_MOST_SIGNIFICANT_BIT 2
603 #define LONG_MOST_SIGNIFICANT_BIT 3
605 #define RTLVERLIB_DDI(x) Wdmlib##x
608 (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE
)(
612 (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED
)(
615 typedef struct _OSVERSIONINFOA
{
616 ULONG dwOSVersionInfoSize
;
617 ULONG dwMajorVersion
;
618 ULONG dwMinorVersion
;
621 CHAR szCSDVersion
[128];
622 } OSVERSIONINFOA
, *POSVERSIONINFOA
, *LPOSVERSIONINFOA
;
624 typedef struct _OSVERSIONINFOW
{
625 ULONG dwOSVersionInfoSize
;
626 ULONG dwMajorVersion
;
627 ULONG dwMinorVersion
;
630 WCHAR szCSDVersion
[128];
631 } OSVERSIONINFOW
, *POSVERSIONINFOW
, *LPOSVERSIONINFOW
, RTL_OSVERSIONINFOW
, *PRTL_OSVERSIONINFOW
;
633 typedef struct _OSVERSIONINFOEXA
{
634 ULONG dwOSVersionInfoSize
;
635 ULONG dwMajorVersion
;
636 ULONG dwMinorVersion
;
639 CHAR szCSDVersion
[128];
640 USHORT wServicePackMajor
;
641 USHORT wServicePackMinor
;
645 } OSVERSIONINFOEXA
, *POSVERSIONINFOEXA
, *LPOSVERSIONINFOEXA
;
647 typedef struct _OSVERSIONINFOEXW
{
648 ULONG dwOSVersionInfoSize
;
649 ULONG dwMajorVersion
;
650 ULONG dwMinorVersion
;
653 WCHAR szCSDVersion
[128];
654 USHORT wServicePackMajor
;
655 USHORT wServicePackMinor
;
659 } OSVERSIONINFOEXW
, *POSVERSIONINFOEXW
, *LPOSVERSIONINFOEXW
, RTL_OSVERSIONINFOEXW
, *PRTL_OSVERSIONINFOEXW
;
662 typedef OSVERSIONINFOEXW OSVERSIONINFOEX
;
663 typedef POSVERSIONINFOEXW POSVERSIONINFOEX
;
664 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX
;
665 typedef OSVERSIONINFOW OSVERSIONINFO
;
666 typedef POSVERSIONINFOW POSVERSIONINFO
;
667 typedef LPOSVERSIONINFOW LPOSVERSIONINFO
;
669 typedef OSVERSIONINFOEXA OSVERSIONINFOEX
;
670 typedef POSVERSIONINFOEXA POSVERSIONINFOEX
;
671 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX
;
672 typedef OSVERSIONINFOA OSVERSIONINFO
;
673 typedef POSVERSIONINFOA POSVERSIONINFO
;
674 typedef LPOSVERSIONINFOA LPOSVERSIONINFO
;
677 /******************************************************************************
679 ******************************************************************************/
681 typedef UCHAR KIRQL
, *PKIRQL
;
682 typedef CCHAR KPROCESSOR_MODE
;
683 typedef LONG KPRIORITY
;
691 #define CACHE_FULLY_ASSOCIATIVE 0xFF
692 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
694 #define EVENT_QUERY_STATE (0x0001)
695 #define EVENT_MODIFY_STATE (0x0002)
696 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
698 #define LTP_PC_SMT 0x1
700 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
701 #define SINGLE_GROUP_LEGACY_API 1
704 #define SEMAPHORE_QUERY_STATE (0x0001)
705 #define SEMAPHORE_MODIFY_STATE (0x0002)
706 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
708 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP
{
709 RelationProcessorCore
,
712 RelationProcessorPackage
,
715 } LOGICAL_PROCESSOR_RELATIONSHIP
;
717 typedef enum _PROCESSOR_CACHE_TYPE
{
722 } PROCESSOR_CACHE_TYPE
;
724 typedef struct _CACHE_DESCRIPTOR
{
729 PROCESSOR_CACHE_TYPE Type
;
730 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
732 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION
{
733 ULONG_PTR ProcessorMask
;
734 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
735 _ANONYMOUS_UNION
union {
742 CACHE_DESCRIPTOR Cache
;
743 ULONGLONG Reserved
[2];
745 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION
;
747 typedef struct _PROCESSOR_RELATIONSHIP
{
751 _Field_size_(GroupCount
) GROUP_AFFINITY GroupMask
[ANYSIZE_ARRAY
];
752 } PROCESSOR_RELATIONSHIP
, *PPROCESSOR_RELATIONSHIP
;
754 typedef struct _NUMA_NODE_RELATIONSHIP
{
757 GROUP_AFFINITY GroupMask
;
758 } NUMA_NODE_RELATIONSHIP
, *PNUMA_NODE_RELATIONSHIP
;
760 typedef struct _CACHE_RELATIONSHIP
{
765 PROCESSOR_CACHE_TYPE Type
;
767 GROUP_AFFINITY GroupMask
;
768 } CACHE_RELATIONSHIP
, *PCACHE_RELATIONSHIP
;
770 typedef struct _PROCESSOR_GROUP_INFO
{
771 UCHAR MaximumProcessorCount
;
772 UCHAR ActiveProcessorCount
;
774 KAFFINITY ActiveProcessorMask
;
775 } PROCESSOR_GROUP_INFO
, *PPROCESSOR_GROUP_INFO
;
777 typedef struct _GROUP_RELATIONSHIP
{
778 USHORT MaximumGroupCount
;
779 USHORT ActiveGroupCount
;
781 PROCESSOR_GROUP_INFO GroupInfo
[ANYSIZE_ARRAY
];
782 } GROUP_RELATIONSHIP
, *PGROUP_RELATIONSHIP
;
784 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
{
785 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
787 _ANONYMOUS_UNION
union {
788 PROCESSOR_RELATIONSHIP Processor
;
789 NUMA_NODE_RELATIONSHIP NumaNode
;
790 CACHE_RELATIONSHIP Cache
;
791 GROUP_RELATIONSHIP Group
;
793 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
;;
795 /* Processor features */
796 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
797 #define PF_FLOATING_POINT_EMULATED 1
798 #define PF_COMPARE_EXCHANGE_DOUBLE 2
799 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
800 #define PF_PPC_MOVEMEM_64BIT_OK 4
801 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
802 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
803 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
804 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
805 #define PF_PAE_ENABLED 9
806 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
807 #define PF_SSE_DAZ_MODE_AVAILABLE 11
808 #define PF_NX_ENABLED 12
809 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
810 #define PF_COMPARE_EXCHANGE128 14
811 #define PF_COMPARE64_EXCHANGE128 15
812 #define PF_CHANNELS_ENABLED 16
813 #define PF_XSAVE_ENABLED 17
815 #define MAXIMUM_WAIT_OBJECTS 64
817 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
819 #define ASSERT_DPC(Object) \
820 ASSERT(((Object)->Type == 0) || \
821 ((Object)->Type == DpcObject) || \
822 ((Object)->Type == ThreadedDpcObject))
824 #define ASSERT_GATE(object) \
825 NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
826 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
828 #define ASSERT_DEVICE_QUEUE(Object) \
829 NT_ASSERT((Object)->Type == DeviceQueueObject)
831 #define ASSERT_TIMER(E) \
832 NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
833 ((E)->Header.Type == TimerSynchronizationObject))
835 #define ASSERT_MUTANT(E) \
836 NT_ASSERT((E)->Header.Type == MutantObject)
838 #define ASSERT_SEMAPHORE(E) \
839 NT_ASSERT((E)->Header.Type == SemaphoreObject)
841 #define ASSERT_EVENT(E) \
842 NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
843 ((E)->Header.Type == SynchronizationEvent))
846 #define DPC_THREADED 1
848 #define GM_LOCK_BIT 0x1
849 #define GM_LOCK_BIT_V 0x0
850 #define GM_LOCK_WAITER_WOKEN 0x2
851 #define GM_LOCK_WAITER_INC 0x4
853 #define LOCK_QUEUE_WAIT_BIT 0
854 #define LOCK_QUEUE_OWNER_BIT 1
856 #define LOCK_QUEUE_WAIT 1
857 #define LOCK_QUEUE_OWNER 2
858 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
859 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
861 #define PROCESSOR_FEATURE_MAX 64
863 #define DBG_STATUS_CONTROL_C 1
864 #define DBG_STATUS_SYSRQ 2
865 #define DBG_STATUS_BUGCHECK_FIRST 3
866 #define DBG_STATUS_BUGCHECK_SECOND 4
867 #define DBG_STATUS_FATAL 5
868 #define DBG_STATUS_DEBUG_CONTROL 6
869 #define DBG_STATUS_WORKER 7
872 #define MAXIMUM_PROC_PER_GROUP 64
874 #define MAXIMUM_PROC_PER_GROUP 32
876 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
878 #define EXCEPTION_DIVIDED_BY_ZERO 0
879 #define EXCEPTION_DEBUG 1
880 #define EXCEPTION_NMI 2
881 #define EXCEPTION_INT3 3
882 #define EXCEPTION_BOUND_CHECK 5
883 #define EXCEPTION_INVALID_OPCODE 6
884 #define EXCEPTION_NPX_NOT_AVAILABLE 7
885 #define EXCEPTION_DOUBLE_FAULT 8
886 #define EXCEPTION_NPX_OVERRUN 9
887 #define EXCEPTION_INVALID_TSS 0x0A
888 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
889 #define EXCEPTION_STACK_FAULT 0x0C
890 #define EXCEPTION_GP_FAULT 0x0D
891 #define EXCEPTION_RESERVED_TRAP 0x0F
892 #define EXCEPTION_NPX_ERROR 0x010
893 #define EXCEPTION_ALIGNMENT_CHECK 0x011
895 typedef enum _KBUGCHECK_CALLBACK_REASON
{
898 KbCallbackSecondaryDumpData
,
901 } KBUGCHECK_CALLBACK_REASON
;
903 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
905 _Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE
)
908 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE
)(
909 _In_ KBUGCHECK_CALLBACK_REASON Reason
,
910 _In_
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
911 _Inout_ PVOID ReasonSpecificData
,
912 _In_ ULONG ReasonSpecificDataLength
);
913 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
;
915 typedef struct _KBUGCHECK_ADD_PAGES
{
916 _Inout_ PVOID Context
;
918 _In_ ULONG BugCheckCode
;
919 _Out_ ULONG_PTR Address
;
920 _Out_ ULONG_PTR Count
;
921 } KBUGCHECK_ADD_PAGES
, *PKBUGCHECK_ADD_PAGES
;
923 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA
{
925 _In_ ULONG InBufferLength
;
926 _In_ ULONG MaximumAllowed
;
928 _Out_ PVOID OutBuffer
;
929 _Out_ ULONG OutBufferLength
;
930 } KBUGCHECK_SECONDARY_DUMP_DATA
, *PKBUGCHECK_SECONDARY_DUMP_DATA
;
932 typedef enum _KBUGCHECK_DUMP_IO_TYPE
{
936 KbDumpIoSecondaryData
,
938 } KBUGCHECK_DUMP_IO_TYPE
;
940 typedef struct _KBUGCHECK_DUMP_IO
{
943 _In_ ULONG BufferLength
;
944 _In_ KBUGCHECK_DUMP_IO_TYPE Type
;
945 } KBUGCHECK_DUMP_IO
, *PKBUGCHECK_DUMP_IO
;
947 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
948 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
949 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
951 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
953 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
956 KBUGCHECK_CALLBACK_REASON Reason
;
958 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
960 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
966 } KBUGCHECK_BUFFER_DUMP_STATE
;
968 _Function_class_(KBUGCHECK_CALLBACK_ROUTINE
)
971 (NTAPI KBUGCHECK_CALLBACK_ROUTINE
)(
974 typedef KBUGCHECK_CALLBACK_ROUTINE
*PKBUGCHECK_CALLBACK_ROUTINE
;
976 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
978 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
979 _Field_size_bytes_opt_(Length
) PVOID Buffer
;
984 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
986 _Function_class_(NMI_CALLBACK
)
989 (NTAPI NMI_CALLBACK
)(
990 _In_opt_ PVOID Context
,
991 _In_ BOOLEAN Handled
);
992 typedef NMI_CALLBACK
*PNMI_CALLBACK
;
994 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE
{
995 KeProcessorAddStartNotify
= 0,
996 KeProcessorAddCompleteNotify
,
997 KeProcessorAddFailureNotify
998 } KE_PROCESSOR_CHANGE_NOTIFY_STATE
;
1000 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
{
1001 KE_PROCESSOR_CHANGE_NOTIFY_STATE State
;
1004 #if (NTDDI_VERSION >= NTDDI_WIN7)
1005 PROCESSOR_NUMBER ProcNumber
;
1007 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
;
1009 _IRQL_requires_same_
1010 _Function_class_(PROCESSOR_CALLBACK_FUNCTION
)
1012 (NTAPI PROCESSOR_CALLBACK_FUNCTION
)(
1013 _In_ PVOID CallbackContext
,
1014 _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext
,
1015 _Inout_ PNTSTATUS OperationStatus
);
1016 typedef PROCESSOR_CALLBACK_FUNCTION
*PPROCESSOR_CALLBACK_FUNCTION
;
1018 #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
1020 #define INVALID_PROCESSOR_INDEX 0xffffffff
1022 typedef enum _KINTERRUPT_POLARITY
{
1023 InterruptPolarityUnknown
,
1024 InterruptActiveHigh
,
1026 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
1028 typedef enum _KPROFILE_SOURCE
{
1030 ProfileAlignmentFixup
,
1033 ProfileLoadInstructions
,
1034 ProfilePipelineFrozen
,
1035 ProfileBranchInstructions
,
1036 ProfileTotalNonissues
,
1037 ProfileDcacheMisses
,
1038 ProfileIcacheMisses
,
1040 ProfileBranchMispredictions
,
1041 ProfileStoreInstructions
,
1042 ProfileFpInstructions
,
1043 ProfileIntegerInstructions
,
1047 ProfileSpecialInstructions
,
1049 ProfileIcacheIssues
,
1050 ProfileDcacheAccesses
,
1051 ProfileMemoryBarrierCycles
,
1052 ProfileLoadLinkedIssues
,
1056 typedef enum _KWAIT_REASON
{
1097 typedef struct _KWAIT_BLOCK
{
1098 LIST_ENTRY WaitListEntry
;
1099 struct _KTHREAD
*Thread
;
1101 struct _KWAIT_BLOCK
*NextWaitBlock
;
1104 #if (NTDDI_VERSION >= NTDDI_WIN7)
1105 volatile UCHAR BlockState
;
1112 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
1114 typedef enum _KINTERRUPT_MODE
{
1119 #define THREAD_WAIT_OBJECTS 3
1121 _IRQL_requires_same_
1122 _Function_class_(KSTART_ROUTINE
)
1124 (NTAPI KSTART_ROUTINE
)(
1125 _In_ PVOID StartContext
);
1126 typedef KSTART_ROUTINE
*PKSTART_ROUTINE
;
1129 (NTAPI
*PKINTERRUPT_ROUTINE
)(
1132 _Function_class_(KSERVICE_ROUTINE
)
1133 _IRQL_requires_(HIGH_LEVEL
)
1134 _IRQL_requires_same_
1136 (NTAPI KSERVICE_ROUTINE
)(
1137 _In_
struct _KINTERRUPT
*Interrupt
,
1138 _In_ PVOID ServiceContext
);
1139 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
1141 _Function_class_(KMESSAGE_SERVICE_ROUTINE
)
1142 _IRQL_requires_same_
1144 (NTAPI KMESSAGE_SERVICE_ROUTINE
)(
1145 _In_
struct _KINTERRUPT
*Interrupt
,
1146 _In_ PVOID ServiceContext
,
1147 _In_ ULONG MessageID
);
1148 typedef KMESSAGE_SERVICE_ROUTINE
*PKMESSAGE_SERVICE_ROUTINE
;
1150 typedef enum _KD_OPTION
{
1151 KD_OPTION_SET_BLOCK_ENABLE
,
1155 (NTAPI
*PKNORMAL_ROUTINE
)(
1156 IN PVOID NormalContext OPTIONAL
,
1157 IN PVOID SystemArgument1 OPTIONAL
,
1158 IN PVOID SystemArgument2 OPTIONAL
);
1161 (NTAPI
*PKRUNDOWN_ROUTINE
)(
1162 IN
struct _KAPC
*Apc
);
1165 (NTAPI
*PKKERNEL_ROUTINE
)(
1166 IN
struct _KAPC
*Apc
,
1167 IN OUT PKNORMAL_ROUTINE
*NormalRoutine OPTIONAL
,
1168 IN OUT PVOID
*NormalContext OPTIONAL
,
1169 IN OUT PVOID
*SystemArgument1 OPTIONAL
,
1170 IN OUT PVOID
*SystemArgument2 OPTIONAL
);
1172 typedef struct _KAPC
{
1178 struct _KTHREAD
*Thread
;
1179 LIST_ENTRY ApcListEntry
;
1180 PKKERNEL_ROUTINE KernelRoutine
;
1181 PKRUNDOWN_ROUTINE RundownRoutine
;
1182 PKNORMAL_ROUTINE NormalRoutine
;
1183 PVOID NormalContext
;
1184 PVOID SystemArgument1
;
1185 PVOID SystemArgument2
;
1186 CCHAR ApcStateIndex
;
1187 KPROCESSOR_MODE ApcMode
;
1189 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
1191 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
1192 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
1193 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
1194 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
1195 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
1196 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
1197 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
1199 typedef struct _KDEVICE_QUEUE_ENTRY
{
1200 LIST_ENTRY DeviceListEntry
;
1203 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
1204 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
1206 typedef PVOID PKIPI_CONTEXT
;
1209 (NTAPI
*PKIPI_WORKER
)(
1210 IN OUT PKIPI_CONTEXT PacketContext
,
1211 IN PVOID Parameter1 OPTIONAL
,
1212 IN PVOID Parameter2 OPTIONAL
,
1213 IN PVOID Parameter3 OPTIONAL
);
1215 typedef struct _KIPI_COUNTS
{
1220 ULONG FlushSingleTb
;
1221 ULONG FlushMultipleTb
;
1222 ULONG FlushEntireTb
;
1227 ULONG SweepIcacheRange
;
1228 ULONG FlushIoBuffers
;
1229 ULONG GratuitousDPC
;
1230 } KIPI_COUNTS
, *PKIPI_COUNTS
;
1232 _IRQL_requires_same_
1233 _Function_class_(KIPI_BROADCAST_WORKER
)
1234 _IRQL_requires_(IPI_LEVEL
)
1236 (NTAPI KIPI_BROADCAST_WORKER
)(
1237 _In_ ULONG_PTR Argument
);
1238 typedef KIPI_BROADCAST_WORKER
*PKIPI_BROADCAST_WORKER
;
1240 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1242 typedef struct _KSPIN_LOCK_QUEUE
{
1243 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
1244 PKSPIN_LOCK
volatile Lock
;
1245 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
1247 typedef struct _KLOCK_QUEUE_HANDLE
{
1248 KSPIN_LOCK_QUEUE LockQueue
;
1250 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
1252 #if defined(_AMD64_)
1254 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
1256 #define LockQueueDispatcherLock 0
1257 #define LockQueueExpansionLock 1
1258 #define LockQueuePfnLock 2
1259 #define LockQueueSystemSpaceLock 3
1260 #define LockQueueVacbLock 4
1261 #define LockQueueMasterLock 5
1262 #define LockQueueNonPagedPoolLock 6
1263 #define LockQueueIoCancelLock 7
1264 #define LockQueueWorkQueueLock 8
1265 #define LockQueueIoVpbLock 9
1266 #define LockQueueIoDatabaseLock 10
1267 #define LockQueueIoCompletionLock 11
1268 #define LockQueueNtfsStructLock 12
1269 #define LockQueueAfdWorkQueueLock 13
1270 #define LockQueueBcbLock 14
1271 #define LockQueueMmNonPagedPoolLock 15
1272 #define LockQueueUnusedSpare16 16
1273 #define LockQueueTimerTableLock 17
1274 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
1278 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
1279 LockQueueDispatcherLock
,
1280 LockQueueExpansionLock
,
1282 LockQueueSystemSpaceLock
,
1284 LockQueueMasterLock
,
1285 LockQueueNonPagedPoolLock
,
1286 LockQueueIoCancelLock
,
1287 LockQueueWorkQueueLock
,
1289 LockQueueIoDatabaseLock
,
1290 LockQueueIoCompletionLock
,
1291 LockQueueNtfsStructLock
,
1292 LockQueueAfdWorkQueueLock
,
1294 LockQueueMmNonPagedPoolLock
,
1295 LockQueueUnusedSpare16
,
1296 LockQueueTimerTableLock
,
1297 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
1298 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
1300 #endif /* defined(_AMD64_) */
1302 _Function_class_(KDEFERRED_ROUTINE
)
1303 _IRQL_requires_(DISPATCH_LEVEL
)
1304 _IRQL_requires_same_
1306 (NTAPI KDEFERRED_ROUTINE
)(
1307 _In_
struct _KDPC
*Dpc
,
1308 _In_opt_ PVOID DeferredContext
,
1309 _In_opt_ PVOID SystemArgument1
,
1310 _In_opt_ PVOID SystemArgument2
);
1311 typedef KDEFERRED_ROUTINE
*PKDEFERRED_ROUTINE
;
1313 typedef enum _KDPC_IMPORTANCE
{
1317 MediumHighImportance
1320 typedef struct _KDPC
{
1323 volatile USHORT Number
;
1324 LIST_ENTRY DpcListEntry
;
1325 PKDEFERRED_ROUTINE DeferredRoutine
;
1326 PVOID DeferredContext
;
1327 PVOID SystemArgument1
;
1328 PVOID SystemArgument2
;
1329 volatile PVOID DpcData
;
1330 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
1332 typedef struct _KDPC_WATCHDOG_INFORMATION
{
1335 ULONG DpcWatchdogLimit
;
1336 ULONG DpcWatchdogCount
;
1338 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
1340 typedef struct _KDEVICE_QUEUE
{
1343 LIST_ENTRY DeviceListHead
;
1345 # if defined(_AMD64_)
1346 _ANONYMOUS_UNION
union {
1348 _ANONYMOUS_STRUCT
struct {
1356 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
1358 #define TIMER_EXPIRED_INDEX_BITS 6
1359 #define TIMER_PROCESSOR_INDEX_BITS 5
1361 typedef struct _DISPATCHER_HEADER
{
1362 _ANONYMOUS_UNION
union {
1363 _ANONYMOUS_STRUCT
struct {
1365 _ANONYMOUS_UNION
union {
1366 _ANONYMOUS_UNION
union {
1367 UCHAR TimerControlFlags
;
1368 _ANONYMOUS_STRUCT
struct {
1370 UCHAR Coalescable
:1;
1371 UCHAR KeepShifting
:1;
1372 UCHAR EncodedTolerableDelay
:5;
1376 #if (NTDDI_VERSION < NTDDI_WIN7)
1381 _ANONYMOUS_UNION
union {
1382 _ANONYMOUS_UNION
union {
1383 UCHAR ThreadControlFlags
;
1384 _ANONYMOUS_STRUCT
struct {
1385 UCHAR CpuThrottled
:1;
1386 UCHAR CycleProfiling
:1;
1387 UCHAR CounterProfiling
:1;
1394 _ANONYMOUS_UNION
union {
1395 #if (NTDDI_VERSION >= NTDDI_WIN7)
1396 _ANONYMOUS_UNION
union {
1397 UCHAR TimerMiscFlags
;
1398 _ANONYMOUS_STRUCT
struct {
1400 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
1403 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
1406 volatile UCHAR Expired
:1;
1410 /* Pre Win7 compatibility fix to latest WDK */
1413 _ANONYMOUS_UNION
union {
1414 BOOLEAN DebugActive
;
1415 _ANONYMOUS_STRUCT
struct {
1416 BOOLEAN ActiveDR7
:1;
1417 BOOLEAN Instrumented
:1;
1418 BOOLEAN Reserved2
:4;
1419 BOOLEAN UmsScheduled
:1;
1420 BOOLEAN UmsPrimary
:1;
1422 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
1429 LIST_ENTRY WaitListHead
;
1430 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1432 typedef struct _KEVENT
{
1433 DISPATCHER_HEADER Header
;
1434 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1436 typedef struct _KSEMAPHORE
{
1437 DISPATCHER_HEADER Header
;
1439 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1441 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
1443 typedef struct _KGATE
{
1444 DISPATCHER_HEADER Header
;
1445 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
1447 typedef struct _KGUARDED_MUTEX
{
1448 volatile LONG Count
;
1452 _ANONYMOUS_UNION
union {
1453 _ANONYMOUS_STRUCT
struct {
1454 SHORT KernelApcDisable
;
1455 SHORT SpecialApcDisable
;
1457 ULONG CombinedApcDisable
;
1459 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
1461 typedef struct _KMUTANT
{
1462 DISPATCHER_HEADER Header
;
1463 LIST_ENTRY MutantListEntry
;
1464 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
1467 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
1469 #define TIMER_TABLE_SIZE 512
1470 #define TIMER_TABLE_SHIFT 9
1472 typedef struct _KTIMER
{
1473 DISPATCHER_HEADER Header
;
1474 ULARGE_INTEGER DueTime
;
1475 LIST_ENTRY TimerListEntry
;
1477 #if (NTDDI_VERSION >= NTDDI_WIN7) && !defined(_X86_)
1481 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
1483 typedef enum _LOCK_OPERATION
{
1489 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
1491 _Function_class_(KSYNCHRONIZE_ROUTINE
)
1492 _IRQL_requires_same_
1494 (NTAPI KSYNCHRONIZE_ROUTINE
)(
1495 _In_ PVOID SynchronizeContext
);
1496 typedef KSYNCHRONIZE_ROUTINE
*PKSYNCHRONIZE_ROUTINE
;
1498 typedef enum _POOL_TYPE
{
1501 NonPagedPoolMustSucceed
,
1503 NonPagedPoolCacheAligned
,
1504 PagedPoolCacheAligned
,
1505 NonPagedPoolCacheAlignedMustS
,
1507 NonPagedPoolSession
= 32,
1509 NonPagedPoolMustSucceedSession
,
1510 DontUseThisTypeSession
,
1511 NonPagedPoolCacheAlignedSession
,
1512 PagedPoolCacheAlignedSession
,
1513 NonPagedPoolCacheAlignedMustSSession
1516 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
1520 } ALTERNATIVE_ARCHITECTURE_TYPE
;
1525 #define IsNEC_98 (FALSE)
1529 #define IsNotNEC_98 (TRUE)
1536 #ifndef SetNotNEC_98
1537 #define SetNotNEC_98
1542 typedef struct _KSYSTEM_TIME
{
1546 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
1548 typedef struct DECLSPEC_ALIGN(16) _M128A
{
1553 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
1560 USHORT ErrorSelector
;
1563 USHORT DataSelector
;
1567 M128A FloatRegisters
[8];
1569 M128A XmmRegisters
[16];
1570 UCHAR Reserved4
[96];
1572 M128A XmmRegisters
[8];
1573 UCHAR Reserved4
[192];
1574 ULONG StackControl
[7];
1577 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
1579 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
1581 ULONG64 Reserved
[7];
1582 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
1584 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
1585 XSAVE_FORMAT LegacyState
;
1586 XSAVE_AREA_HEADER Header
;
1587 } XSAVE_AREA
, *PXSAVE_AREA
;
1589 typedef struct _XSTATE_CONTEXT
{
1593 _Field_size_bytes_opt_(Length
) PXSAVE_AREA Area
;
1601 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
1603 typedef struct _XSTATE_SAVE
{
1604 #if defined(_AMD64_)
1605 struct _XSTATE_SAVE
* Prev
;
1606 struct _KTHREAD
* Thread
;
1608 XSTATE_CONTEXT XStateContext
;
1609 #elif defined(_IA64_) || defined(_ARM_)
1611 #elif defined(_X86_)
1612 _ANONYMOUS_UNION
union {
1613 _ANONYMOUS_STRUCT
struct {
1616 struct _XSTATE_SAVE
* Prev
;
1617 PXSAVE_AREA Reserved3
;
1618 struct _KTHREAD
* Thread
;
1622 XSTATE_CONTEXT XStateContext
;
1625 } XSTATE_SAVE
, *PXSTATE_SAVE
;
1629 #define MAXIMUM_SUPPORTED_EXTENSION 512
1631 #if !defined(__midl) && !defined(MIDL_PASS)
1632 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
1637 #define XSAVE_ALIGN 64
1638 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
1640 #if !defined(__midl) && !defined(MIDL_PASS)
1641 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
1642 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
1643 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
1646 typedef struct _CONTEXT_CHUNK
{
1649 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
1651 typedef struct _CONTEXT_EX
{
1653 CONTEXT_CHUNK Legacy
;
1654 CONTEXT_CHUNK XState
;
1655 } CONTEXT_EX
, *PCONTEXT_EX
;
1657 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1659 #if (NTDDI_VERSION >= NTDDI_VISTA)
1660 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1661 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1662 extern NTSYSAPI CCHAR KeNumberProcessors
;
1664 extern PCCHAR KeNumberProcessors
;
1665 __CREATE_NTOS_DATA_IMPORT_ALIAS(KeNumberProcessors
)
1669 /******************************************************************************
1670 * Memory manager Types *
1671 ******************************************************************************/
1673 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1674 typedef ULONG NODE_REQUIREMENT
;
1675 #define MM_ANY_NODE_OK 0x80000000
1678 #define MM_DONT_ZERO_ALLOCATION 0x00000001
1679 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
1680 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
1681 #define MM_ALLOCATE_NO_WAIT 0x00000008
1682 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
1683 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
1685 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1686 #define MDL_PAGES_LOCKED 0x0002
1687 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1688 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1689 #define MDL_PARTIAL 0x0010
1690 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1691 #define MDL_IO_PAGE_READ 0x0040
1692 #define MDL_WRITE_OPERATION 0x0080
1693 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1694 #define MDL_FREE_EXTRA_PTES 0x0200
1695 #define MDL_DESCRIBES_AWE 0x0400
1696 #define MDL_IO_SPACE 0x0800
1697 #define MDL_NETWORK_HEADER 0x1000
1698 #define MDL_MAPPING_CAN_FAIL 0x2000
1699 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1700 #define MDL_INTERNAL 0x8000
1702 #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \
1703 MDL_PAGES_LOCKED | \
1704 MDL_SOURCE_IS_NONPAGED_POOL | \
1705 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1706 MDL_PARENT_MAPPED_SYSTEM_VA | \
1710 #define FLUSH_MULTIPLE_MAXIMUM 32
1712 /* Section access rights */
1713 #define SECTION_QUERY 0x0001
1714 #define SECTION_MAP_WRITE 0x0002
1715 #define SECTION_MAP_READ 0x0004
1716 #define SECTION_MAP_EXECUTE 0x0008
1717 #define SECTION_EXTEND_SIZE 0x0010
1718 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
1720 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
1721 SECTION_MAP_WRITE | \
1722 SECTION_MAP_READ | \
1723 SECTION_MAP_EXECUTE | \
1724 SECTION_EXTEND_SIZE)
1726 #define SESSION_QUERY_ACCESS 0x0001
1727 #define SESSION_MODIFY_ACCESS 0x0002
1729 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
1730 SESSION_QUERY_ACCESS | \
1731 SESSION_MODIFY_ACCESS)
1733 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1735 #define PAGE_NOACCESS 0x01
1736 #define PAGE_READONLY 0x02
1737 #define PAGE_READWRITE 0x04
1738 #define PAGE_WRITECOPY 0x08
1739 #define PAGE_EXECUTE 0x10
1740 #define PAGE_EXECUTE_READ 0x20
1741 #define PAGE_EXECUTE_READWRITE 0x40
1742 #define PAGE_EXECUTE_WRITECOPY 0x80
1743 #define PAGE_GUARD 0x100
1744 #define PAGE_NOCACHE 0x200
1745 #define PAGE_WRITECOMBINE 0x400
1747 #define MEM_COMMIT 0x1000
1748 #define MEM_RESERVE 0x2000
1749 #define MEM_DECOMMIT 0x4000
1750 #define MEM_RELEASE 0x8000
1751 #define MEM_FREE 0x10000
1752 #define MEM_PRIVATE 0x20000
1753 #define MEM_MAPPED 0x40000
1754 #define MEM_RESET 0x80000
1755 #define MEM_TOP_DOWN 0x100000
1756 #define MEM_LARGE_PAGES 0x20000000
1757 #define MEM_4MB_PAGES 0x80000000
1759 #define SEC_RESERVE 0x4000000
1760 #define SEC_COMMIT 0x8000000
1761 #define SEC_LARGE_PAGES 0x80000000
1763 /* Section map options */
1764 typedef enum _SECTION_INHERIT
{
1769 typedef ULONG PFN_COUNT
;
1770 typedef LONG_PTR SPFN_NUMBER
, *PSPFN_NUMBER
;
1771 typedef ULONG_PTR PFN_NUMBER
, *PPFN_NUMBER
;
1773 _Struct_size_bytes_(_Inexpressible_(sizeof(struct _MDL
) +
1774 (ByteOffset
+ ByteCount
+ PAGE_SIZE
-1) / PAGE_SIZE
* sizeof(PFN_NUMBER
)))
1775 typedef struct _MDL
{
1779 struct _EPROCESS
*Process
;
1780 PVOID MappedSystemVa
;
1785 #if (_MSC_VER >= 1600)
1786 typedef _Readable_bytes_(_Inexpressible_(polymorphism
)) MDL
*PMDLX
;
1791 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
1792 MmFrameBufferCached
= 2
1793 } MEMORY_CACHING_TYPE_ORIG
;
1795 typedef enum _MEMORY_CACHING_TYPE
{
1796 MmNonCached
= FALSE
,
1798 MmWriteCombined
= MmFrameBufferCached
,
1799 MmHardwareCoherentCached
,
1800 MmNonCachedUnordered
,
1803 } MEMORY_CACHING_TYPE
;
1805 typedef enum _MM_PAGE_PRIORITY
{
1807 NormalPagePriority
= 16,
1808 HighPagePriority
= 32
1811 typedef enum _MM_SYSTEM_SIZE
{
1818 extern PBOOLEAN Mm64BitPhysicalAddress
;
1819 __CREATE_NTOS_DATA_IMPORT_ALIAS(Mm64BitPhysicalAddress
)
1821 extern NTKERNELAPI PVOID MmBadPointer
;
1824 /******************************************************************************
1826 ******************************************************************************/
1827 #define EX_RUNDOWN_ACTIVE 0x1
1828 #define EX_RUNDOWN_COUNT_SHIFT 0x1
1829 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
1831 typedef struct _FAST_MUTEX
{
1832 volatile LONG Count
;
1837 } FAST_MUTEX
, *PFAST_MUTEX
;
1839 typedef enum _SUITE_TYPE
{
1843 CommunicationServer
,
1845 SmallBusinessRestricted
,
1859 typedef enum _EX_POOL_PRIORITY
{
1861 LowPoolPrioritySpecialPoolOverrun
= 8,
1862 LowPoolPrioritySpecialPoolUnderrun
= 9,
1863 NormalPoolPriority
= 16,
1864 NormalPoolPrioritySpecialPoolOverrun
= 24,
1865 NormalPoolPrioritySpecialPoolUnderrun
= 25,
1866 HighPoolPriority
= 32,
1867 HighPoolPrioritySpecialPoolOverrun
= 40,
1868 HighPoolPrioritySpecialPoolUnderrun
= 41
1871 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
1872 #define LOOKASIDE_ALIGN
1874 #define LOOKASIDE_ALIGN DECLSPEC_CACHEALIGN
1877 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
1879 _IRQL_requires_same_
1880 _Function_class_(ALLOCATE_FUNCTION
)
1882 (NTAPI
*PALLOCATE_FUNCTION
)(
1883 _In_ POOL_TYPE PoolType
,
1884 _In_ SIZE_T NumberOfBytes
,
1887 _IRQL_requires_same_
1888 _Function_class_(ALLOCATE_FUNCTION_EX
)
1890 (NTAPI
*PALLOCATE_FUNCTION_EX
)(
1891 _In_ POOL_TYPE PoolType
,
1892 _In_ SIZE_T NumberOfBytes
,
1894 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
1896 _IRQL_requires_same_
1897 _Function_class_(FREE_FUNCTION
)
1899 (NTAPI
*PFREE_FUNCTION
)(
1902 _IRQL_requires_same_
1903 _Function_class_(FREE_FUNCTION_EX
)
1905 (NTAPI
*PFREE_FUNCTION_EX
)(
1907 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
1909 _IRQL_requires_same_
1910 _Function_class_(CALLBACK_FUNCTION
)
1912 (NTAPI CALLBACK_FUNCTION
)(
1913 _In_opt_ PVOID CallbackContext
,
1914 _In_opt_ PVOID Argument1
,
1915 _In_opt_ PVOID Argument2
);
1916 typedef CALLBACK_FUNCTION
*PCALLBACK_FUNCTION
;
1918 #define GENERAL_LOOKASIDE_LAYOUT \
1919 _ANONYMOUS_UNION union { \
1920 SLIST_HEADER ListHead; \
1921 SINGLE_LIST_ENTRY SingleListHead; \
1924 USHORT MaximumDepth; \
1925 ULONG TotalAllocates; \
1926 _ANONYMOUS_UNION union { \
1927 ULONG AllocateMisses; \
1928 ULONG AllocateHits; \
1929 } DUMMYUNIONNAME2; \
1931 _ANONYMOUS_UNION union { \
1934 } DUMMYUNIONNAME3; \
1938 _ANONYMOUS_UNION union { \
1939 PALLOCATE_FUNCTION_EX AllocateEx; \
1940 PALLOCATE_FUNCTION Allocate; \
1941 } DUMMYUNIONNAME4; \
1942 _ANONYMOUS_UNION union { \
1943 PFREE_FUNCTION_EX FreeEx; \
1944 PFREE_FUNCTION Free; \
1945 } DUMMYUNIONNAME5; \
1946 LIST_ENTRY ListEntry; \
1947 ULONG LastTotalAllocates; \
1948 _ANONYMOUS_UNION union { \
1949 ULONG LastAllocateMisses; \
1950 ULONG LastAllocateHits; \
1951 } DUMMYUNIONNAME6; \
1954 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
1955 GENERAL_LOOKASIDE_LAYOUT
1956 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
1958 typedef struct _GENERAL_LOOKASIDE_POOL
{
1959 GENERAL_LOOKASIDE_LAYOUT
1960 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
1962 #define LOOKASIDE_CHECK(f) \
1963 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
1965 LOOKASIDE_CHECK(TotalFrees
);
1966 LOOKASIDE_CHECK(Tag
);
1967 LOOKASIDE_CHECK(Future
);
1969 typedef struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST
{
1970 GENERAL_LOOKASIDE L
;
1971 #if !defined(_AMD64_) && !defined(_IA64_)
1972 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
1974 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
1976 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
1977 GENERAL_LOOKASIDE L
;
1978 #if !defined(_AMD64_) && !defined(_IA64_)
1979 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
1981 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
1983 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
1985 typedef struct _LOOKASIDE_LIST_EX
{
1986 GENERAL_LOOKASIDE_POOL L
;
1987 } LOOKASIDE_LIST_EX
;
1989 #if (NTDDI_VERSION >= NTDDI_VISTA)
1991 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
1992 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
1994 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
1995 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
1997 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1999 typedef struct _EX_RUNDOWN_REF
{
2000 _ANONYMOUS_UNION
union {
2001 volatile ULONG_PTR Count
;
2004 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
2006 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
2008 typedef enum _WORK_QUEUE_TYPE
{
2011 HyperCriticalWorkQueue
,
2015 _IRQL_requires_same_
2016 _Function_class_(WORKER_THREAD_ROUTINE
)
2018 (NTAPI WORKER_THREAD_ROUTINE
)(
2019 _In_ PVOID Parameter
);
2020 typedef WORKER_THREAD_ROUTINE
*PWORKER_THREAD_ROUTINE
;
2022 typedef struct _WORK_QUEUE_ITEM
{
2024 PWORKER_THREAD_ROUTINE WorkerRoutine
;
2025 volatile PVOID Parameter
;
2026 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
2028 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
2030 typedef struct _OWNER_ENTRY
{
2031 ERESOURCE_THREAD OwnerThread
;
2032 _ANONYMOUS_UNION
union {
2033 _ANONYMOUS_STRUCT
struct {
2034 ULONG IoPriorityBoosted
:1;
2035 ULONG OwnerReferenced
:1;
2036 ULONG OwnerCount
:30;
2040 } OWNER_ENTRY
, *POWNER_ENTRY
;
2042 typedef struct _ERESOURCE
{
2043 LIST_ENTRY SystemResourcesList
;
2044 POWNER_ENTRY OwnerTable
;
2047 volatile PKSEMAPHORE SharedWaiters
;
2048 volatile PKEVENT ExclusiveWaiters
;
2049 OWNER_ENTRY OwnerEntry
;
2050 ULONG ActiveEntries
;
2051 ULONG ContentionCount
;
2052 ULONG NumberOfSharedWaiters
;
2053 ULONG NumberOfExclusiveWaiters
;
2057 _ANONYMOUS_UNION
union {
2059 ULONG_PTR CreatorBackTraceIndex
;
2061 KSPIN_LOCK SpinLock
;
2062 } ERESOURCE
, *PERESOURCE
;
2064 /* ERESOURCE.Flag */
2065 #define ResourceNeverExclusive 0x0010
2066 #define ResourceReleaseByOtherThread 0x0020
2067 #define ResourceOwnedExclusive 0x0080
2069 #define RESOURCE_HASH_TABLE_SIZE 64
2071 typedef struct _RESOURCE_HASH_ENTRY
{
2072 LIST_ENTRY ListEntry
;
2074 ULONG ContentionCount
;
2076 } RESOURCE_HASH_ENTRY
, *PRESOURCE_HASH_ENTRY
;
2078 typedef struct _RESOURCE_PERFORMANCE_DATA
{
2079 ULONG ActiveResourceCount
;
2080 ULONG TotalResourceCount
;
2081 ULONG ExclusiveAcquire
;
2082 ULONG SharedFirstLevel
;
2083 ULONG SharedSecondLevel
;
2084 ULONG StarveFirstLevel
;
2085 ULONG StarveSecondLevel
;
2086 ULONG WaitForExclusive
;
2087 ULONG OwnerTableExpands
;
2088 ULONG MaximumTableExpand
;
2089 LIST_ENTRY HashTable
[RESOURCE_HASH_TABLE_SIZE
];
2090 } RESOURCE_PERFORMANCE_DATA
, *PRESOURCE_PERFORMANCE_DATA
;
2092 /* Global debug flag */
2094 extern NTKERNELAPI ULONG NtGlobalFlag
;
2095 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
2097 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
2100 /******************************************************************************
2101 * Security Manager Types *
2102 ******************************************************************************/
2105 typedef PVOID PSECURITY_DESCRIPTOR
;
2106 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
2107 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
2108 typedef PVOID PACCESS_TOKEN
;
2111 #define DELETE 0x00010000L
2112 #define READ_CONTROL 0x00020000L
2113 #define WRITE_DAC 0x00040000L
2114 #define WRITE_OWNER 0x00080000L
2115 #define SYNCHRONIZE 0x00100000L
2116 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
2117 #define STANDARD_RIGHTS_READ READ_CONTROL
2118 #define STANDARD_RIGHTS_WRITE READ_CONTROL
2119 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
2120 #define STANDARD_RIGHTS_ALL 0x001F0000L
2121 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
2122 #define ACCESS_SYSTEM_SECURITY 0x01000000L
2123 #define MAXIMUM_ALLOWED 0x02000000L
2124 #define GENERIC_READ 0x80000000L
2125 #define GENERIC_WRITE 0x40000000L
2126 #define GENERIC_EXECUTE 0x20000000L
2127 #define GENERIC_ALL 0x10000000L
2129 typedef struct _GENERIC_MAPPING
{
2130 ACCESS_MASK GenericRead
;
2131 ACCESS_MASK GenericWrite
;
2132 ACCESS_MASK GenericExecute
;
2133 ACCESS_MASK GenericAll
;
2134 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
2136 #define ACL_REVISION 2
2137 #define ACL_REVISION_DS 4
2139 #define ACL_REVISION1 1
2140 #define ACL_REVISION2 2
2141 #define ACL_REVISION3 3
2142 #define ACL_REVISION4 4
2143 #define MIN_ACL_REVISION ACL_REVISION2
2144 #define MAX_ACL_REVISION ACL_REVISION4
2146 typedef struct _ACL
{
2154 /* Current security descriptor revision value */
2155 #define SECURITY_DESCRIPTOR_REVISION (1)
2156 #define SECURITY_DESCRIPTOR_REVISION1 (1)
2158 /* Privilege attributes */
2159 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
2160 #define SE_PRIVILEGE_ENABLED (0x00000002L)
2161 #define SE_PRIVILEGE_REMOVED (0X00000004L)
2162 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
2164 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
2165 SE_PRIVILEGE_ENABLED | \
2166 SE_PRIVILEGE_REMOVED | \
2167 SE_PRIVILEGE_USED_FOR_ACCESS)
2169 #include <pshpack4.h>
2170 typedef struct _LUID_AND_ATTRIBUTES
{
2173 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
2174 #include <poppack.h>
2176 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
2177 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
2179 /* Privilege sets */
2180 #define PRIVILEGE_SET_ALL_NECESSARY (1)
2182 typedef struct _PRIVILEGE_SET
{
2183 ULONG PrivilegeCount
;
2185 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
2186 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
2188 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
2190 SecurityIdentification
,
2191 SecurityImpersonation
,
2193 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
2195 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
2196 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
2197 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
2198 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
2200 #define SECURITY_DYNAMIC_TRACKING (TRUE)
2201 #define SECURITY_STATIC_TRACKING (FALSE)
2203 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
2205 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
2207 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2208 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
2209 BOOLEAN EffectiveOnly
;
2210 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
2212 typedef struct _SE_IMPERSONATION_STATE
{
2213 PACCESS_TOKEN Token
;
2215 BOOLEAN EffectiveOnly
;
2216 SECURITY_IMPERSONATION_LEVEL Level
;
2217 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
2219 #define OWNER_SECURITY_INFORMATION (0x00000001L)
2220 #define GROUP_SECURITY_INFORMATION (0x00000002L)
2221 #define DACL_SECURITY_INFORMATION (0x00000004L)
2222 #define SACL_SECURITY_INFORMATION (0x00000008L)
2223 #define LABEL_SECURITY_INFORMATION (0x00000010L)
2225 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
2226 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
2227 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
2228 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
2230 typedef enum _SECURITY_OPERATION_CODE
{
2231 SetSecurityDescriptor
,
2232 QuerySecurityDescriptor
,
2233 DeleteSecurityDescriptor
,
2234 AssignSecurityDescriptor
2235 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
2237 #define INITIAL_PRIVILEGE_COUNT 3
2239 typedef struct _INITIAL_PRIVILEGE_SET
{
2240 ULONG PrivilegeCount
;
2242 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
2243 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
2245 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
2246 #define SE_CREATE_TOKEN_PRIVILEGE 2
2247 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
2248 #define SE_LOCK_MEMORY_PRIVILEGE 4
2249 #define SE_INCREASE_QUOTA_PRIVILEGE 5
2250 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
2251 #define SE_TCB_PRIVILEGE 7
2252 #define SE_SECURITY_PRIVILEGE 8
2253 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
2254 #define SE_LOAD_DRIVER_PRIVILEGE 10
2255 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
2256 #define SE_SYSTEMTIME_PRIVILEGE 12
2257 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
2258 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
2259 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
2260 #define SE_CREATE_PERMANENT_PRIVILEGE 16
2261 #define SE_BACKUP_PRIVILEGE 17
2262 #define SE_RESTORE_PRIVILEGE 18
2263 #define SE_SHUTDOWN_PRIVILEGE 19
2264 #define SE_DEBUG_PRIVILEGE 20
2265 #define SE_AUDIT_PRIVILEGE 21
2266 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
2267 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
2268 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
2269 #define SE_UNDOCK_PRIVILEGE 25
2270 #define SE_SYNC_AGENT_PRIVILEGE 26
2271 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
2272 #define SE_MANAGE_VOLUME_PRIVILEGE 28
2273 #define SE_IMPERSONATE_PRIVILEGE 29
2274 #define SE_CREATE_GLOBAL_PRIVILEGE 30
2275 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
2276 #define SE_RELABEL_PRIVILEGE 32
2277 #define SE_INC_WORKING_SET_PRIVILEGE 33
2278 #define SE_TIME_ZONE_PRIVILEGE 34
2279 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
2280 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
2282 typedef struct _SECURITY_SUBJECT_CONTEXT
{
2283 PACCESS_TOKEN ClientToken
;
2284 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2285 PACCESS_TOKEN PrimaryToken
;
2286 PVOID ProcessAuditId
;
2287 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
2289 typedef struct _ACCESS_STATE
{
2291 BOOLEAN SecurityEvaluated
;
2292 BOOLEAN GenerateAudit
;
2293 BOOLEAN GenerateOnClose
;
2294 BOOLEAN PrivilegesAllocated
;
2296 ACCESS_MASK RemainingDesiredAccess
;
2297 ACCESS_MASK PreviouslyGrantedAccess
;
2298 ACCESS_MASK OriginalDesiredAccess
;
2299 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
2300 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2303 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
2304 PRIVILEGE_SET PrivilegeSet
;
2306 BOOLEAN AuditPrivileges
;
2307 UNICODE_STRING ObjectName
;
2308 UNICODE_STRING ObjectTypeName
;
2309 } ACCESS_STATE
, *PACCESS_STATE
;
2312 (NTAPI
*PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR
)(
2314 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
2318 #ifndef _NTLSA_AUDIT_
2319 #define _NTLSA_AUDIT_
2321 #define SE_MAX_AUDIT_PARAMETERS 32
2322 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
2324 #define SE_ADT_OBJECT_ONLY 0x1
2326 #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
2327 #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
2328 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
2329 #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
2330 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
2332 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
2333 ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
2334 (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
2336 typedef enum _SE_ADT_PARAMETER_TYPE
{
2337 SeAdtParmTypeNone
= 0,
2338 SeAdtParmTypeString
,
2339 SeAdtParmTypeFileSpec
,
2342 SeAdtParmTypeLogonId
,
2343 SeAdtParmTypeNoLogonId
,
2344 SeAdtParmTypeAccessMask
,
2346 SeAdtParmTypeObjectTypes
,
2347 SeAdtParmTypeHexUlong
,
2352 SeAdtParmTypeHexInt64
,
2353 SeAdtParmTypeStringList
,
2354 SeAdtParmTypeSidList
,
2355 SeAdtParmTypeDuration
,
2356 SeAdtParmTypeUserAccountControl
,
2358 SeAdtParmTypeMessage
,
2359 SeAdtParmTypeDateTime
,
2360 SeAdtParmTypeSockAddr
,
2362 SeAdtParmTypeLogonHours
,
2363 SeAdtParmTypeLogonIdNoSid
,
2364 SeAdtParmTypeUlongNoConv
,
2365 SeAdtParmTypeSockAddrNoPort
,
2366 SeAdtParmTypeAccessReason
2367 } SE_ADT_PARAMETER_TYPE
, *PSE_ADT_PARAMETER_TYPE
;
2369 typedef struct _SE_ADT_OBJECT_TYPE
{
2373 ACCESS_MASK AccessMask
;
2374 } SE_ADT_OBJECT_TYPE
, *PSE_ADT_OBJECT_TYPE
;
2376 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY
{
2377 SE_ADT_PARAMETER_TYPE Type
;
2381 } SE_ADT_PARAMETER_ARRAY_ENTRY
, *PSE_ADT_PARAMETER_ARRAY_ENTRY
;
2383 typedef struct _SE_ADT_ACCESS_REASON
{
2384 ACCESS_MASK AccessMask
;
2385 ULONG AccessReasons
[32];
2386 ULONG ObjectTypeIndex
;
2387 ULONG AccessGranted
;
2388 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2389 } SE_ADT_ACCESS_REASON
, *PSE_ADT_ACCESS_REASON
;
2391 typedef struct _SE_ADT_PARAMETER_ARRAY
{
2394 ULONG ParameterCount
;
2396 USHORT FlatSubCategoryId
;
2399 SE_ADT_PARAMETER_ARRAY_ENTRY Parameters
[ SE_MAX_AUDIT_PARAMETERS
];
2400 } SE_ADT_PARAMETER_ARRAY
, *PSE_ADT_PARAMETER_ARRAY
;
2402 #endif /* !_NTLSA_AUDIT_ */
2403 #endif /* !_NTLSA_IFS_ */
2404 /******************************************************************************
2405 * Power Management Support Types *
2406 ******************************************************************************/
2411 #define PO_CB_SYSTEM_POWER_POLICY 0
2412 #define PO_CB_AC_STATUS 1
2413 #define PO_CB_BUTTON_COLLISION 2
2414 #define PO_CB_SYSTEM_STATE_LOCK 3
2415 #define PO_CB_LID_SWITCH_STATE 4
2416 #define PO_CB_PROCESSOR_POWER_POLICY 5
2418 /* Power States/Levels */
2419 typedef enum _SYSTEM_POWER_STATE
{
2420 PowerSystemUnspecified
= 0,
2422 PowerSystemSleeping1
,
2423 PowerSystemSleeping2
,
2424 PowerSystemSleeping3
,
2425 PowerSystemHibernate
,
2426 PowerSystemShutdown
,
2428 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
2430 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
2432 typedef enum _POWER_INFORMATION_LEVEL
{
2433 SystemPowerPolicyAc
,
2434 SystemPowerPolicyDc
,
2435 VerifySystemPolicyAc
,
2436 VerifySystemPolicyDc
,
2437 SystemPowerCapabilities
,
2439 SystemPowerStateHandler
,
2440 ProcessorStateHandler
,
2441 SystemPowerPolicyCurrent
,
2442 AdministratorPowerPolicy
,
2443 SystemReserveHiberFile
,
2444 ProcessorInformation
,
2445 SystemPowerInformation
,
2446 ProcessorStateHandler2
,
2449 SystemExecutionState
,
2450 SystemPowerStateNotifyHandler
,
2451 ProcessorPowerPolicyAc
,
2452 ProcessorPowerPolicyDc
,
2453 VerifyProcessorPowerPolicyAc
,
2454 VerifyProcessorPowerPolicyDc
,
2455 ProcessorPowerPolicyCurrent
,
2456 SystemPowerStateLogging
,
2457 SystemPowerLoggingEntry
,
2458 SetPowerSettingValue
,
2459 NotifyUserPowerSetting
,
2460 PowerInformationLevelUnused0
,
2461 PowerInformationLevelUnused1
,
2463 TraceApplicationPowerMessage
,
2464 TraceApplicationPowerMessageEnd
,
2465 ProcessorPerfStates
,
2466 ProcessorIdleStates
,
2469 SystemHiberFileInformation
,
2470 TraceServicePowerMessage
,
2472 PowerShutdownNotification
,
2473 MonitorCapabilities
,
2475 SessionDisplayState
,
2478 GetPowerRequestList
,
2479 ProcessorInformationEx
,
2480 NotifyUserModeLegacyPowerEvent
,
2482 ProcessorIdleDomains
,
2484 SystemHiberFileSize
,
2485 PowerInformationLevelMaximum
2486 } POWER_INFORMATION_LEVEL
;
2489 PowerActionNone
= 0,
2490 PowerActionReserved
,
2492 PowerActionHibernate
,
2493 PowerActionShutdown
,
2494 PowerActionShutdownReset
,
2495 PowerActionShutdownOff
,
2496 PowerActionWarmEject
2497 } POWER_ACTION
, *PPOWER_ACTION
;
2499 typedef enum _DEVICE_POWER_STATE
{
2500 PowerDeviceUnspecified
= 0,
2506 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
2508 typedef enum _MONITOR_DISPLAY_STATE
{
2509 PowerMonitorOff
= 0,
2512 } MONITOR_DISPLAY_STATE
, *PMONITOR_DISPLAY_STATE
;
2514 typedef union _POWER_STATE
{
2515 SYSTEM_POWER_STATE SystemState
;
2516 DEVICE_POWER_STATE DeviceState
;
2517 } POWER_STATE
, *PPOWER_STATE
;
2519 typedef enum _POWER_STATE_TYPE
{
2520 SystemPowerState
= 0,
2522 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
2524 #if (NTDDI_VERSION >= NTDDI_VISTA)
2525 typedef struct _SYSTEM_POWER_STATE_CONTEXT
{
2526 _ANONYMOUS_UNION
union {
2527 _ANONYMOUS_STRUCT
struct {
2529 ULONG TargetSystemState
:4;
2530 ULONG EffectiveSystemState
:4;
2531 ULONG CurrentSystemState
:4;
2532 ULONG IgnoreHibernationPath
:1;
2533 ULONG PseudoTransition
:1;
2536 ULONG ContextAsUlong
;
2538 } SYSTEM_POWER_STATE_CONTEXT
, *PSYSTEM_POWER_STATE_CONTEXT
;
2541 #if (NTDDI_VERSION >= NTDDI_WIN7)
2542 typedef struct _COUNTED_REASON_CONTEXT
{
2545 _ANONYMOUS_UNION
union {
2546 _ANONYMOUS_STRUCT
struct {
2547 UNICODE_STRING ResourceFileName
;
2548 USHORT ResourceReasonId
;
2550 PUNICODE_STRING ReasonStrings
;
2552 UNICODE_STRING SimpleString
;
2554 } COUNTED_REASON_CONTEXT
, *PCOUNTED_REASON_CONTEXT
;
2557 #define IOCTL_QUERY_DEVICE_POWER_STATE \
2558 CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS)
2560 #define IOCTL_SET_DEVICE_WAKE \
2561 CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
2563 #define IOCTL_CANCEL_DEVICE_WAKE \
2564 CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
2566 #define ES_SYSTEM_REQUIRED 0x00000001
2567 #define ES_DISPLAY_REQUIRED 0x00000002
2568 #define ES_USER_PRESENT 0x00000004
2569 #define ES_CONTINUOUS 0x80000000
2571 typedef ULONG EXECUTION_STATE
, *PEXECUTION_STATE
;
2578 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
2579 #define DIAGNOSTIC_REASON_VERSION 0
2580 #define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001
2581 #define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002
2582 #define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000
2583 #define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003)
2586 #define POWER_REQUEST_CONTEXT_VERSION 0
2587 #define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001
2588 #define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002
2590 #define PowerRequestMaximum 3
2592 typedef enum _POWER_REQUEST_TYPE
{
2593 PowerRequestDisplayRequired
,
2594 PowerRequestSystemRequired
,
2595 PowerRequestAwayModeRequired
2596 } POWER_REQUEST_TYPE
, *PPOWER_REQUEST_TYPE
;
2598 #if (NTDDI_VERSION >= NTDDI_WINXP)
2600 #define PDCAP_D0_SUPPORTED 0x00000001
2601 #define PDCAP_D1_SUPPORTED 0x00000002
2602 #define PDCAP_D2_SUPPORTED 0x00000004
2603 #define PDCAP_D3_SUPPORTED 0x00000008
2604 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2605 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2606 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2607 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2608 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2610 typedef struct CM_Power_Data_s
{
2612 DEVICE_POWER_STATE PD_MostRecentPowerState
;
2613 ULONG PD_Capabilities
;
2617 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
2618 SYSTEM_POWER_STATE PD_DeepestSystemWake
;
2619 } CM_POWER_DATA
, *PCM_POWER_DATA
;
2621 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2623 typedef enum _SYSTEM_POWER_CONDITION
{
2628 } SYSTEM_POWER_CONDITION
;
2630 typedef struct _SET_POWER_SETTING_VALUE
{
2633 SYSTEM_POWER_CONDITION PowerCondition
;
2635 UCHAR Data
[ANYSIZE_ARRAY
];
2636 } SET_POWER_SETTING_VALUE
, *PSET_POWER_SETTING_VALUE
;
2638 #define POWER_SETTING_VALUE_VERSION (0x1)
2640 typedef struct _NOTIFY_USER_POWER_SETTING
{
2642 } NOTIFY_USER_POWER_SETTING
, *PNOTIFY_USER_POWER_SETTING
;
2644 typedef struct _APPLICATIONLAUNCH_SETTING_VALUE
{
2645 LARGE_INTEGER ActivationTime
;
2647 ULONG ButtonInstanceID
;
2648 } APPLICATIONLAUNCH_SETTING_VALUE
, *PAPPLICATIONLAUNCH_SETTING_VALUE
;
2650 typedef enum _POWER_PLATFORM_ROLE
{
2651 PlatformRoleUnspecified
= 0,
2652 PlatformRoleDesktop
,
2654 PlatformRoleWorkstation
,
2655 PlatformRoleEnterpriseServer
,
2656 PlatformRoleSOHOServer
,
2657 PlatformRoleAppliancePC
,
2658 PlatformRolePerformanceServer
,
2660 } POWER_PLATFORM_ROLE
;
2662 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
2666 } BATTERY_REPORTING_SCALE
, *PBATTERY_REPORTING_SCALE
;
2667 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
2669 #endif /* !_PO_DDK_ */
2671 #define CORE_PARKING_POLICY_CHANGE_IDEAL 0
2672 #define CORE_PARKING_POLICY_CHANGE_SINGLE 1
2673 #define CORE_PARKING_POLICY_CHANGE_ROCKET 2
2674 #define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
2676 DEFINE_GUID(GUID_MAX_POWER_SAVINGS
, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
2677 DEFINE_GUID(GUID_MIN_POWER_SAVINGS
, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
2678 DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS
, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
2679 DEFINE_GUID(NO_SUBGROUP_GUID
, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
2680 DEFINE_GUID(ALL_POWERSCHEMES_GUID
, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
2681 DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY
, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
2682 DEFINE_GUID(GUID_ACTIVE_POWERSCHEME
, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
2683 DEFINE_GUID(GUID_VIDEO_SUBGROUP
, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
2684 DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT
, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
2685 DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT
, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
2686 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE
, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
2687 DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT
, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
2688 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN
, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
2689 DEFINE_GUID(GUID_MONITOR_POWER_ON
, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
2690 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS
, 0xaded5e82L
, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
2691 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS
, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
2692 DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS
, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
2693 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS
, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
2694 DEFINE_GUID(GUID_SESSION_DISPLAY_STATE
, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
2695 DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE
, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
2696 DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED
, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
2697 DEFINE_GUID(GUID_DISK_SUBGROUP
, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
2698 DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT
, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
2699 DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD
, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
2700 DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN
, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
2701 DEFINE_GUID(GUID_SLEEP_SUBGROUP
, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
2702 DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD
, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
2703 DEFINE_GUID(GUID_STANDBY_TIMEOUT
, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
2704 DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT
, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
2705 DEFINE_GUID(GUID_HIBERNATE_TIMEOUT
, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
2706 DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY
, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
2707 DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION
, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
2708 DEFINE_GUID(GUID_SYSTEM_AWAYMODE
, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
2709 DEFINE_GUID(GUID_ALLOW_AWAYMODE
, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
2710 DEFINE_GUID(GUID_ALLOW_STANDBY_STATES
, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
2711 DEFINE_GUID(GUID_ALLOW_RTC_WAKE
, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
2712 DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED
, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
2713 DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP
, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
2714 DEFINE_GUID(GUID_POWERBUTTON_ACTION
, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
2715 DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS
, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
2716 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION
, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
2717 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS
, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
2718 DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION
, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
2719 DEFINE_GUID(GUID_LIDCLOSE_ACTION
, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
2720 DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS
, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
2721 DEFINE_GUID(GUID_LIDOPEN_POWERSTATE
, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
2722 DEFINE_GUID(GUID_BATTERY_SUBGROUP
, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
2723 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0
, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
2724 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0
, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
2725 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0
, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
2726 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1
, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
2727 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1
, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
2728 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1
, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
2729 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2
, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
2730 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2
, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
2731 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2
, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
2732 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3
, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
2733 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3
, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
2734 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3
, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
2735 DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP
, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
2736 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY
, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
2737 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM
, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
2738 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM
, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
2739 DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING
, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
2740 DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY
, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
2741 DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY
, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
2742 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD
, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
2743 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD
, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
2744 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY
, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
2745 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY
, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
2746 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME
, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
2747 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_TIME
, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
2748 DEFINE_GUID(GUID_PROCESSOR_PERF_TIME_CHECK
, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
2749 DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY
, 0x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
2750 DEFINE_GUID(GUID_PROCESSOR_IDLE_ALLOW_SCALING
, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
2751 DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE
, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
2752 DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK
, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
2753 DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD
, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
2754 DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD
, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
2755 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD
, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
2756 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD
, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
2757 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY
, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
2758 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY
, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
2759 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MAX_CORES
, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
2760 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MIN_CORES
, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
2761 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME
, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
2762 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME
, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
2763 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR
, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
2764 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD
, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
2765 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING
, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
2766 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR
, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
2767 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD
, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
2768 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING
, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
2769 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD
, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
2770 DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE
, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
2771 DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE
, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
2772 DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY
, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
2773 DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY
, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
2774 DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE
, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
2775 DEFINE_GUID(GUID_DEVICE_IDLE_POLICY
, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
2776 DEFINE_GUID(GUID_ACDC_POWER_SOURCE
, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
2777 DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE
, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
2778 DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING
, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
2779 DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK
, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
2780 DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION
, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
2781 DEFINE_GUID(GUID_APPLAUNCH_BUTTON
, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
2782 DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP
, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
2783 DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY
, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
2784 DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN
, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
2786 #define PERFSTATE_POLICY_CHANGE_IDEAL 0
2787 #define PERFSTATE_POLICY_CHANGE_SINGLE 1
2788 #define PERFSTATE_POLICY_CHANGE_ROCKET 2
2789 #define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKET
2791 #define PROCESSOR_PERF_BOOST_POLICY_DISABLED 0
2792 #define PROCESSOR_PERF_BOOST_POLICY_MAX 100
2794 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0
2795 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1
2797 _Function_class_(REQUEST_POWER_COMPLETE
)
2798 _IRQL_requires_same_
2800 (NTAPI REQUEST_POWER_COMPLETE
)(
2801 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
2802 _In_ UCHAR MinorFunction
,
2803 _In_ POWER_STATE PowerState
,
2804 _In_opt_ PVOID Context
,
2805 _In_
struct _IO_STATUS_BLOCK
*IoStatus
);
2806 typedef REQUEST_POWER_COMPLETE
*PREQUEST_POWER_COMPLETE
;
2808 _Function_class_(POWER_SETTING_CALLBACK
)
2809 _IRQL_requires_same_
2811 (NTAPI POWER_SETTING_CALLBACK
)(
2812 _In_ LPCGUID SettingGuid
,
2813 _In_reads_bytes_(ValueLength
) PVOID Value
,
2814 _In_ ULONG ValueLength
,
2815 _Inout_opt_ PVOID Context
);
2816 typedef POWER_SETTING_CALLBACK
*PPOWER_SETTING_CALLBACK
;
2818 /******************************************************************************
2819 * Configuration Manager Types *
2820 ******************************************************************************/
2822 /* Resource list definitions */
2823 typedef int CM_RESOURCE_TYPE
;
2825 #define CmResourceTypeNull 0
2826 #define CmResourceTypePort 1
2827 #define CmResourceTypeInterrupt 2
2828 #define CmResourceTypeMemory 3
2829 #define CmResourceTypeDma 4
2830 #define CmResourceTypeDeviceSpecific 5
2831 #define CmResourceTypeBusNumber 6
2832 #define CmResourceTypeNonArbitrated 128
2833 #define CmResourceTypeConfigData 128
2834 #define CmResourceTypeDevicePrivate 129
2835 #define CmResourceTypePcCardConfig 130
2836 #define CmResourceTypeMfCardConfig 131
2838 /* KEY_VALUE_Xxx.Type */
2841 #define REG_EXPAND_SZ 2
2842 #define REG_BINARY 3
2844 #define REG_DWORD_LITTLE_ENDIAN 4
2845 #define REG_DWORD_BIG_ENDIAN 5
2847 #define REG_MULTI_SZ 7
2848 #define REG_RESOURCE_LIST 8
2849 #define REG_FULL_RESOURCE_DESCRIPTOR 9
2850 #define REG_RESOURCE_REQUIREMENTS_LIST 10
2851 #define REG_QWORD 11
2852 #define REG_QWORD_LITTLE_ENDIAN 11
2854 /* Registry Access Rights */
2855 #define KEY_QUERY_VALUE (0x0001)
2856 #define KEY_SET_VALUE (0x0002)
2857 #define KEY_CREATE_SUB_KEY (0x0004)
2858 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
2859 #define KEY_NOTIFY (0x0010)
2860 #define KEY_CREATE_LINK (0x0020)
2861 #define KEY_WOW64_32KEY (0x0200)
2862 #define KEY_WOW64_64KEY (0x0100)
2863 #define KEY_WOW64_RES (0x0300)
2865 #define KEY_READ ((STANDARD_RIGHTS_READ |\
2867 KEY_ENUMERATE_SUB_KEYS |\
2872 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
2874 KEY_CREATE_SUB_KEY) \
2878 #define KEY_EXECUTE ((KEY_READ) \
2882 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
2885 KEY_CREATE_SUB_KEY |\
2886 KEY_ENUMERATE_SUB_KEYS |\
2892 /* Registry Open/Create Options */
2893 #define REG_OPTION_RESERVED (0x00000000L)
2894 #define REG_OPTION_NON_VOLATILE (0x00000000L)
2895 #define REG_OPTION_VOLATILE (0x00000001L)
2896 #define REG_OPTION_CREATE_LINK (0x00000002L)
2897 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
2898 #define REG_OPTION_OPEN_LINK (0x00000008L)
2900 #define REG_LEGAL_OPTION \
2901 (REG_OPTION_RESERVED |\
2902 REG_OPTION_NON_VOLATILE |\
2903 REG_OPTION_VOLATILE |\
2904 REG_OPTION_CREATE_LINK |\
2905 REG_OPTION_BACKUP_RESTORE |\
2906 REG_OPTION_OPEN_LINK)
2908 #define REG_OPEN_LEGAL_OPTION \
2909 (REG_OPTION_RESERVED |\
2910 REG_OPTION_BACKUP_RESTORE |\
2911 REG_OPTION_OPEN_LINK)
2913 #define REG_STANDARD_FORMAT 1
2914 #define REG_LATEST_FORMAT 2
2915 #define REG_NO_COMPRESSION 4
2917 /* Key creation/open disposition */
2918 #define REG_CREATED_NEW_KEY (0x00000001L)
2919 #define REG_OPENED_EXISTING_KEY (0x00000002L)
2921 /* Key restore & hive load flags */
2922 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
2923 #define REG_REFRESH_HIVE (0x00000002L)
2924 #define REG_NO_LAZY_FLUSH (0x00000004L)
2925 #define REG_FORCE_RESTORE (0x00000008L)
2926 #define REG_APP_HIVE (0x00000010L)
2927 #define REG_PROCESS_PRIVATE (0x00000020L)
2928 #define REG_START_JOURNAL (0x00000040L)
2929 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
2930 #define REG_HIVE_NO_RM (0x00000100L)
2931 #define REG_HIVE_SINGLE_LOG (0x00000200L)
2932 #define REG_BOOT_HIVE (0x00000400L)
2935 #define REG_FORCE_UNLOAD 1
2937 /* Notify Filter Values */
2938 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
2939 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
2940 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
2941 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
2943 #define REG_LEGAL_CHANGE_FILTER \
2944 (REG_NOTIFY_CHANGE_NAME |\
2945 REG_NOTIFY_CHANGE_ATTRIBUTES |\
2946 REG_NOTIFY_CHANGE_LAST_SET |\
2947 REG_NOTIFY_CHANGE_SECURITY)
2949 #include <pshpack4.h>
2950 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
2952 UCHAR ShareDisposition
;
2956 PHYSICAL_ADDRESS Start
;
2960 PHYSICAL_ADDRESS Start
;
2964 #if defined(NT_PROCESSOR_GROUPS)
2973 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2975 _ANONYMOUS_UNION
union {
2977 #if defined(NT_PROCESSOR_GROUPS)
2982 USHORT MessageCount
;
2987 #if defined(NT_PROCESSOR_GROUPS)
3000 PHYSICAL_ADDRESS Start
;
3020 } DeviceSpecificData
;
3021 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3023 PHYSICAL_ADDRESS Start
;
3027 PHYSICAL_ADDRESS Start
;
3031 PHYSICAL_ADDRESS Start
;
3036 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
3037 #include <poppack.h>
3039 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
3040 #define CmResourceTypeNull 0
3041 #define CmResourceTypePort 1
3042 #define CmResourceTypeInterrupt 2
3043 #define CmResourceTypeMemory 3
3044 #define CmResourceTypeDma 4
3045 #define CmResourceTypeDeviceSpecific 5
3046 #define CmResourceTypeBusNumber 6
3047 #define CmResourceTypeMemoryLarge 7
3048 #define CmResourceTypeNonArbitrated 128
3049 #define CmResourceTypeConfigData 128
3050 #define CmResourceTypeDevicePrivate 129
3051 #define CmResourceTypePcCardConfig 130
3052 #define CmResourceTypeMfCardConfig 131
3054 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
3055 typedef enum _CM_SHARE_DISPOSITION
{
3056 CmResourceShareUndetermined
= 0,
3057 CmResourceShareDeviceExclusive
,
3058 CmResourceShareDriverExclusive
,
3059 CmResourceShareShared
3060 } CM_SHARE_DISPOSITION
;
3062 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
3063 #define CM_RESOURCE_PORT_MEMORY 0x0000
3064 #define CM_RESOURCE_PORT_IO 0x0001
3065 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
3066 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
3067 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
3068 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
3069 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
3070 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
3071 #define CM_RESOURCE_PORT_BAR 0x0100
3073 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
3074 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
3075 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
3076 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
3077 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
3079 #define CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS 0x0001
3081 #define CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN ((ULONG)-2)
3083 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
3084 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
3085 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
3086 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
3087 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
3088 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
3089 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
3090 #define CM_RESOURCE_MEMORY_24 0x0010
3091 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
3092 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
3093 #define CM_RESOURCE_MEMORY_BAR 0x0080
3094 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
3096 #define CM_RESOURCE_MEMORY_LARGE 0x0E00
3097 #define CM_RESOURCE_MEMORY_LARGE_40 0x0200
3098 #define CM_RESOURCE_MEMORY_LARGE_48 0x0400
3099 #define CM_RESOURCE_MEMORY_LARGE_64 0x0800
3101 #define CM_RESOURCE_MEMORY_LARGE_40_MAXLEN 0x000000FFFFFFFF00
3102 #define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN 0x0000FFFFFFFF0000
3103 #define CM_RESOURCE_MEMORY_LARGE_64_MAXLEN 0xFFFFFFFF00000000
3105 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
3106 #define CM_RESOURCE_DMA_8 0x0000
3107 #define CM_RESOURCE_DMA_16 0x0001
3108 #define CM_RESOURCE_DMA_32 0x0002
3109 #define CM_RESOURCE_DMA_8_AND_16 0x0004
3110 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
3111 #define CM_RESOURCE_DMA_TYPE_A 0x0010
3112 #define CM_RESOURCE_DMA_TYPE_B 0x0020
3113 #define CM_RESOURCE_DMA_TYPE_F 0x0040
3115 typedef struct _DEVICE_FLAGS
{
3123 } DEVICE_FLAGS
, *PDEVICE_FLAGS
;
3125 typedef enum _INTERFACE_TYPE
{
3126 InterfaceTypeUndefined
= -1,
3144 MaximumInterfaceType
3145 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
3147 typedef struct _CM_COMPONENT_INFORMATION
{
3151 KAFFINITY AffinityMask
;
3152 } CM_COMPONENT_INFORMATION
, *PCM_COMPONENT_INFORMATION
;
3154 typedef struct _CM_ROM_BLOCK
{
3157 } CM_ROM_BLOCK
, *PCM_ROM_BLOCK
;
3159 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
3163 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
3164 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
3166 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
3167 INTERFACE_TYPE InterfaceType
;
3169 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
3170 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
3172 typedef struct _CM_RESOURCE_LIST
{
3174 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
3175 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
3177 typedef struct _PNP_BUS_INFORMATION
{
3179 INTERFACE_TYPE LegacyBusType
;
3181 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
3183 #include <pshpack1.h>
3185 typedef struct _CM_INT13_DRIVE_PARAMETER
{
3188 USHORT SectorsPerTrack
;
3190 USHORT NumberDrives
;
3191 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
3193 typedef struct _CM_MCA_POS_DATA
{
3199 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
3201 typedef struct _CM_PNP_BIOS_DEVICE_NODE
{
3205 UCHAR DeviceType
[3];
3206 USHORT DeviceAttributes
;
3207 } CM_PNP_BIOS_DEVICE_NODE
,*PCM_PNP_BIOS_DEVICE_NODE
;
3209 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
{
3213 USHORT ControlField
;
3215 ULONG EventFlagAddress
;
3216 USHORT RealModeEntryOffset
;
3217 USHORT RealModeEntrySegment
;
3218 USHORT ProtectedModeEntryOffset
;
3219 ULONG ProtectedModeCodeBaseAddress
;
3221 USHORT RealModeDataBaseAddress
;
3222 ULONG ProtectedModeDataBaseAddress
;
3223 } CM_PNP_BIOS_INSTALLATION_CHECK
, *PCM_PNP_BIOS_INSTALLATION_CHECK
;
3225 #include <poppack.h>
3227 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
{
3228 ULONG BytesPerSector
;
3229 ULONG NumberOfCylinders
;
3230 ULONG SectorsPerTrack
;
3231 ULONG NumberOfHeads
;
3232 } CM_DISK_GEOMETRY_DEVICE_DATA
, *PCM_DISK_GEOMETRY_DEVICE_DATA
;
3234 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
3239 USHORT KeyboardFlags
;
3240 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
3242 typedef struct _CM_SCSI_DEVICE_DATA
{
3245 UCHAR HostIdentifier
;
3246 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
3248 typedef struct _CM_VIDEO_DEVICE_DATA
{
3252 } CM_VIDEO_DEVICE_DATA
, *PCM_VIDEO_DEVICE_DATA
;
3254 typedef struct _CM_SONIC_DEVICE_DATA
{
3257 USHORT DataConfigurationRegister
;
3258 UCHAR EthernetAddress
[8];
3259 } CM_SONIC_DEVICE_DATA
, *PCM_SONIC_DEVICE_DATA
;
3261 typedef struct _CM_SERIAL_DEVICE_DATA
{
3265 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
3267 typedef struct _CM_MONITOR_DEVICE_DATA
{
3270 USHORT HorizontalScreenSize
;
3271 USHORT VerticalScreenSize
;
3272 USHORT HorizontalResolution
;
3273 USHORT VerticalResolution
;
3274 USHORT HorizontalDisplayTimeLow
;
3275 USHORT HorizontalDisplayTime
;
3276 USHORT HorizontalDisplayTimeHigh
;
3277 USHORT HorizontalBackPorchLow
;
3278 USHORT HorizontalBackPorch
;
3279 USHORT HorizontalBackPorchHigh
;
3280 USHORT HorizontalFrontPorchLow
;
3281 USHORT HorizontalFrontPorch
;
3282 USHORT HorizontalFrontPorchHigh
;
3283 USHORT HorizontalSyncLow
;
3284 USHORT HorizontalSync
;
3285 USHORT HorizontalSyncHigh
;
3286 USHORT VerticalBackPorchLow
;
3287 USHORT VerticalBackPorch
;
3288 USHORT VerticalBackPorchHigh
;
3289 USHORT VerticalFrontPorchLow
;
3290 USHORT VerticalFrontPorch
;
3291 USHORT VerticalFrontPorchHigh
;
3292 USHORT VerticalSyncLow
;
3293 USHORT VerticalSync
;
3294 USHORT VerticalSyncHigh
;
3295 } CM_MONITOR_DEVICE_DATA
, *PCM_MONITOR_DEVICE_DATA
;
3297 typedef struct _CM_FLOPPY_DEVICE_DATA
{
3303 UCHAR StepRateHeadUnloadTime
;
3306 UCHAR SectorLengthCode
;
3307 UCHAR SectorPerTrack
;
3308 UCHAR ReadWriteGapLength
;
3309 UCHAR DataTransferLength
;
3310 UCHAR FormatGapLength
;
3311 UCHAR FormatFillCharacter
;
3312 UCHAR HeadSettleTime
;
3313 UCHAR MotorSettleTime
;
3314 UCHAR MaximumTrackValue
;
3315 UCHAR DataTransferRate
;
3316 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
3318 typedef enum _KEY_INFORMATION_CLASS
{
3319 KeyBasicInformation
,
3323 KeyCachedInformation
,
3324 KeyFlagsInformation
,
3325 KeyVirtualizationInformation
,
3326 KeyHandleTagsInformation
,
3328 } KEY_INFORMATION_CLASS
;
3330 typedef struct _KEY_BASIC_INFORMATION
{
3331 LARGE_INTEGER LastWriteTime
;
3335 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
3337 typedef struct _KEY_CONTROL_FLAGS_INFORMATION
{
3339 } KEY_CONTROL_FLAGS_INFORMATION
, *PKEY_CONTROL_FLAGS_INFORMATION
;
3341 typedef struct _KEY_FULL_INFORMATION
{
3342 LARGE_INTEGER LastWriteTime
;
3350 ULONG MaxValueNameLen
;
3351 ULONG MaxValueDataLen
;
3353 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
3355 typedef struct _KEY_HANDLE_TAGS_INFORMATION
{
3357 } KEY_HANDLE_TAGS_INFORMATION
, *PKEY_HANDLE_TAGS_INFORMATION
;
3359 typedef struct _KEY_NODE_INFORMATION
{
3360 LARGE_INTEGER LastWriteTime
;
3366 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
3368 typedef enum _KEY_SET_INFORMATION_CLASS
{
3369 KeyWriteTimeInformation
,
3370 KeyWow64FlagsInformation
,
3371 KeyControlFlagsInformation
,
3372 KeySetVirtualizationInformation
,
3373 KeySetDebugInformation
,
3374 KeySetHandleTagsInformation
,
3376 } KEY_SET_INFORMATION_CLASS
;
3378 typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION
{
3379 ULONG VirtualTarget
:1;
3380 ULONG VirtualStore
:1;
3381 ULONG VirtualSource
:1;
3383 } KEY_SET_VIRTUALIZATION_INFORMATION
, *PKEY_SET_VIRTUALIZATION_INFORMATION
;
3385 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
3390 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
3392 typedef struct _KEY_VALUE_FULL_INFORMATION
{
3399 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
3401 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
3405 _Field_size_bytes_(DataLength
) UCHAR Data
[1];
3406 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
3408 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
3411 _Field_size_bytes_(DataLength
) UCHAR Data
[1];
3412 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
3414 typedef struct _KEY_VALUE_ENTRY
{
3415 PUNICODE_STRING ValueName
;
3419 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
3421 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
3422 KeyValueBasicInformation
,
3423 KeyValueFullInformation
,
3424 KeyValuePartialInformation
,
3425 KeyValueFullInformationAlign64
,
3426 KeyValuePartialInformationAlign64
3427 } KEY_VALUE_INFORMATION_CLASS
;
3429 typedef struct _KEY_WOW64_FLAGS_INFORMATION
{
3431 } KEY_WOW64_FLAGS_INFORMATION
, *PKEY_WOW64_FLAGS_INFORMATION
;
3433 typedef struct _KEY_WRITE_TIME_INFORMATION
{
3434 LARGE_INTEGER LastWriteTime
;
3435 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
3437 #if (NTDDI_VERSION < NTDDI_VISTA)
3438 typedef struct _KEY_USER_FLAGS_INFORMATION
{
3440 } KEY_USER_FLAGS_INFORMATION
, *PKEY_USER_FLAGS_INFORMATION
;
3443 typedef enum _REG_NOTIFY_CLASS
{
3445 RegNtPreDeleteKey
= RegNtDeleteKey
,
3447 RegNtPreSetValueKey
= RegNtSetValueKey
,
3448 RegNtDeleteValueKey
,
3449 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
3450 RegNtSetInformationKey
,
3451 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
3453 RegNtPreRenameKey
= RegNtRenameKey
,
3455 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
3456 RegNtEnumerateValueKey
,
3457 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
3459 RegNtPreQueryKey
= RegNtQueryKey
,
3461 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
3462 RegNtQueryMultipleValueKey
,
3463 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
3468 RegNtKeyHandleClose
,
3469 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
3471 RegNtPostSetValueKey
,
3472 RegNtPostDeleteValueKey
,
3473 RegNtPostSetInformationKey
,
3475 RegNtPostEnumerateKey
,
3476 RegNtPostEnumerateValueKey
,
3478 RegNtPostQueryValueKey
,
3479 RegNtPostQueryMultipleValueKey
,
3480 RegNtPostKeyHandleClose
,
3481 RegNtPreCreateKeyEx
,
3482 RegNtPostCreateKeyEx
,
3491 RegNtPreQueryKeySecurity
,
3492 RegNtPostQueryKeySecurity
,
3493 RegNtPreSetKeySecurity
,
3494 RegNtPostSetKeySecurity
,
3495 RegNtCallbackObjectContextCleanup
,
3497 RegNtPostRestoreKey
,
3501 RegNtPostReplaceKey
,
3503 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
3505 _IRQL_requires_same_
3506 _Function_class_(EX_CALLBACK_FUNCTION
)
3508 (NTAPI EX_CALLBACK_FUNCTION
)(
3509 _In_ PVOID CallbackContext
,
3510 _In_opt_ PVOID Argument1
,
3511 _In_opt_ PVOID Argument2
);
3512 typedef EX_CALLBACK_FUNCTION
*PEX_CALLBACK_FUNCTION
;
3514 typedef struct _REG_DELETE_KEY_INFORMATION
{
3517 PVOID ObjectContext
;
3519 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
3520 #if (NTDDI_VERSION >= NTDDI_VISTA)
3521 , REG_FLUSH_KEY_INFORMATION
, *PREG_FLUSH_KEY_INFORMATION
3525 typedef struct _REG_SET_VALUE_KEY_INFORMATION
{
3527 PUNICODE_STRING ValueName
;
3533 PVOID ObjectContext
;
3535 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
3537 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
{
3539 PUNICODE_STRING ValueName
;
3541 PVOID ObjectContext
;
3543 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
3545 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
{
3547 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
3548 PVOID KeySetInformation
;
3549 ULONG KeySetInformationLength
;
3551 PVOID ObjectContext
;
3553 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
3555 typedef struct _REG_ENUMERATE_KEY_INFORMATION
{
3558 KEY_INFORMATION_CLASS KeyInformationClass
;
3559 PVOID KeyInformation
;
3561 PULONG ResultLength
;
3563 PVOID ObjectContext
;
3565 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
3567 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
{
3570 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
3571 PVOID KeyValueInformation
;
3573 PULONG ResultLength
;
3575 PVOID ObjectContext
;
3577 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
3579 typedef struct _REG_QUERY_KEY_INFORMATION
{
3581 KEY_INFORMATION_CLASS KeyInformationClass
;
3582 PVOID KeyInformation
;
3584 PULONG ResultLength
;
3586 PVOID ObjectContext
;
3588 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
3590 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
{
3592 PUNICODE_STRING ValueName
;
3593 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
3594 PVOID KeyValueInformation
;
3596 PULONG ResultLength
;
3598 PVOID ObjectContext
;
3600 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
3602 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
{
3604 PKEY_VALUE_ENTRY ValueEntries
;
3607 PULONG BufferLength
;
3608 PULONG RequiredBufferLength
;
3610 PVOID ObjectContext
;
3612 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
3614 typedef struct _REG_RENAME_KEY_INFORMATION
{
3616 PUNICODE_STRING NewName
;
3618 PVOID ObjectContext
;
3620 } REG_RENAME_KEY_INFORMATION
, *PREG_RENAME_KEY_INFORMATION
;
3622 typedef struct _REG_CREATE_KEY_INFORMATION
{
3623 PUNICODE_STRING CompleteName
;
3626 ULONG CreateOptions
;
3627 PUNICODE_STRING Class
;
3628 PVOID SecurityDescriptor
;
3629 PVOID SecurityQualityOfService
;
3630 ACCESS_MASK DesiredAccess
;
3631 ACCESS_MASK GrantedAccess
;
3633 PVOID
*ResultObject
;
3635 PVOID RootObjectContext
;
3638 } REG_CREATE_KEY_INFORMATION
, REG_OPEN_KEY_INFORMATION
,*PREG_CREATE_KEY_INFORMATION
, *PREG_OPEN_KEY_INFORMATION
;
3640 typedef struct _REG_CREATE_KEY_INFORMATION_V1
{
3641 PUNICODE_STRING CompleteName
;
3645 PUNICODE_STRING Class
;
3646 PVOID SecurityDescriptor
;
3647 PVOID SecurityQualityOfService
;
3648 ACCESS_MASK DesiredAccess
;
3649 ACCESS_MASK GrantedAccess
;
3651 PVOID
*ResultObject
;
3653 PVOID RootObjectContext
;
3656 PUNICODE_STRING RemainingName
;
3659 KPROCESSOR_MODE CheckAccessMode
;
3660 } REG_CREATE_KEY_INFORMATION_V1
, REG_OPEN_KEY_INFORMATION_V1
,*PREG_CREATE_KEY_INFORMATION_V1
, *PREG_OPEN_KEY_INFORMATION_V1
;
3662 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
{
3663 PUNICODE_STRING CompleteName
;
3664 } REG_PRE_CREATE_KEY_INFORMATION
, REG_PRE_OPEN_KEY_INFORMATION
,*PREG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;;
3666 typedef struct _REG_POST_CREATE_KEY_INFORMATION
{
3667 PUNICODE_STRING CompleteName
;
3670 } REG_POST_CREATE_KEY_INFORMATION
,REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
3672 typedef struct _REG_POST_OPERATION_INFORMATION
{
3675 PVOID PreInformation
;
3676 NTSTATUS ReturnStatus
;
3678 PVOID ObjectContext
;
3680 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
3682 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
{
3685 PVOID ObjectContext
;
3687 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
3689 #if (NTDDI_VERSION >= NTDDI_VISTA)
3691 typedef struct _REG_LOAD_KEY_INFORMATION
{
3693 PUNICODE_STRING KeyName
;
3694 PUNICODE_STRING SourceFile
;
3696 PVOID TrustClassObject
;
3698 ACCESS_MASK DesiredAccess
;
3701 PVOID ObjectContext
;
3703 } REG_LOAD_KEY_INFORMATION
, *PREG_LOAD_KEY_INFORMATION
;
3705 typedef struct _REG_UNLOAD_KEY_INFORMATION
{
3709 PVOID ObjectContext
;
3711 } REG_UNLOAD_KEY_INFORMATION
, *PREG_UNLOAD_KEY_INFORMATION
;
3713 typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION
{
3715 PVOID ObjectContext
;
3717 } REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION
, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION
;
3719 typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION
{
3721 PSECURITY_INFORMATION SecurityInformation
;
3722 PSECURITY_DESCRIPTOR SecurityDescriptor
;
3725 PVOID ObjectContext
;
3727 } REG_QUERY_KEY_SECURITY_INFORMATION
, *PREG_QUERY_KEY_SECURITY_INFORMATION
;
3729 typedef struct _REG_SET_KEY_SECURITY_INFORMATION
{
3731 PSECURITY_INFORMATION SecurityInformation
;
3732 PSECURITY_DESCRIPTOR SecurityDescriptor
;
3734 PVOID ObjectContext
;
3736 } REG_SET_KEY_SECURITY_INFORMATION
, *PREG_SET_KEY_SECURITY_INFORMATION
;
3738 typedef struct _REG_RESTORE_KEY_INFORMATION
{
3743 PVOID ObjectContext
;
3745 } REG_RESTORE_KEY_INFORMATION
, *PREG_RESTORE_KEY_INFORMATION
;
3747 typedef struct _REG_SAVE_KEY_INFORMATION
{
3752 PVOID ObjectContext
;
3754 } REG_SAVE_KEY_INFORMATION
, *PREG_SAVE_KEY_INFORMATION
;
3756 typedef struct _REG_REPLACE_KEY_INFORMATION
{
3758 PUNICODE_STRING OldFileName
;
3759 PUNICODE_STRING NewFileName
;
3761 PVOID ObjectContext
;
3763 } REG_REPLACE_KEY_INFORMATION
, *PREG_REPLACE_KEY_INFORMATION
;
3765 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
3767 #define SERVICE_KERNEL_DRIVER 0x00000001
3768 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
3769 #define SERVICE_ADAPTER 0x00000004
3770 #define SERVICE_RECOGNIZER_DRIVER 0x00000008
3772 #define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \
3773 SERVICE_FILE_SYSTEM_DRIVER | \
3774 SERVICE_RECOGNIZER_DRIVER)
3776 #define SERVICE_WIN32_OWN_PROCESS 0x00000010
3777 #define SERVICE_WIN32_SHARE_PROCESS 0x00000020
3778 #define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \
3779 SERVICE_WIN32_SHARE_PROCESS)
3781 #define SERVICE_INTERACTIVE_PROCESS 0x00000100
3783 #define SERVICE_TYPE_ALL (SERVICE_WIN32 | \
3786 SERVICE_INTERACTIVE_PROCESS)
3788 /* Service Start Types */
3789 #define SERVICE_BOOT_START 0x00000000
3790 #define SERVICE_SYSTEM_START 0x00000001
3791 #define SERVICE_AUTO_START 0x00000002
3792 #define SERVICE_DEMAND_START 0x00000003
3793 #define SERVICE_DISABLED 0x00000004
3795 #define SERVICE_ERROR_IGNORE 0x00000000
3796 #define SERVICE_ERROR_NORMAL 0x00000001
3797 #define SERVICE_ERROR_SEVERE 0x00000002
3798 #define SERVICE_ERROR_CRITICAL 0x00000003
3800 typedef enum _CM_SERVICE_NODE_TYPE
{
3801 DriverType
= SERVICE_KERNEL_DRIVER
,
3802 FileSystemType
= SERVICE_FILE_SYSTEM_DRIVER
,
3803 Win32ServiceOwnProcess
= SERVICE_WIN32_OWN_PROCESS
,
3804 Win32ServiceShareProcess
= SERVICE_WIN32_SHARE_PROCESS
,
3805 AdapterType
= SERVICE_ADAPTER
,
3806 RecognizerType
= SERVICE_RECOGNIZER_DRIVER
3807 } SERVICE_NODE_TYPE
;
3809 typedef enum _CM_SERVICE_LOAD_TYPE
{
3810 BootLoad
= SERVICE_BOOT_START
,
3811 SystemLoad
= SERVICE_SYSTEM_START
,
3812 AutoLoad
= SERVICE_AUTO_START
,
3813 DemandLoad
= SERVICE_DEMAND_START
,
3814 DisableLoad
= SERVICE_DISABLED
3815 } SERVICE_LOAD_TYPE
;
3817 typedef enum _CM_ERROR_CONTROL_TYPE
{
3818 IgnoreError
= SERVICE_ERROR_IGNORE
,
3819 NormalError
= SERVICE_ERROR_NORMAL
,
3820 SevereError
= SERVICE_ERROR_SEVERE
,
3821 CriticalError
= SERVICE_ERROR_CRITICAL
3822 } SERVICE_ERROR_TYPE
;
3824 #define CM_SERVICE_NETWORK_BOOT_LOAD 0x00000001
3825 #define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
3826 #define CM_SERVICE_USB_DISK_BOOT_LOAD 0x00000004
3828 #define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD | \
3829 CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \
3830 CM_SERVICE_USB_DISK_BOOT_LOAD)
3832 /******************************************************************************
3833 * I/O Manager Types *
3834 ******************************************************************************/
3837 #define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS
3839 #define CONNECT_FULLY_SPECIFIED 0x1
3840 #define CONNECT_LINE_BASED 0x2
3841 #define CONNECT_MESSAGE_BASED 0x3
3842 #define CONNECT_FULLY_SPECIFIED_GROUP 0x4
3843 #define CONNECT_CURRENT_VERSION 0x4
3845 #define POOL_COLD_ALLOCATION 256
3846 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
3847 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
3849 #define IO_TYPE_ADAPTER 1
3850 #define IO_TYPE_CONTROLLER 2
3851 #define IO_TYPE_DEVICE 3
3852 #define IO_TYPE_DRIVER 4
3853 #define IO_TYPE_FILE 5
3854 #define IO_TYPE_IRP 6
3855 #define IO_TYPE_MASTER_ADAPTER 7
3856 #define IO_TYPE_OPEN_PACKET 8
3857 #define IO_TYPE_TIMER 9
3858 #define IO_TYPE_VPB 10
3859 #define IO_TYPE_ERROR_LOG 11
3860 #define IO_TYPE_ERROR_MESSAGE 12
3861 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
3863 #define IO_TYPE_CSQ_IRP_CONTEXT 1
3864 #define IO_TYPE_CSQ 2
3865 #define IO_TYPE_CSQ_EX 3
3867 /* IO_RESOURCE_DESCRIPTOR.Option */
3868 #define IO_RESOURCE_PREFERRED 0x01
3869 #define IO_RESOURCE_DEFAULT 0x02
3870 #define IO_RESOURCE_ALTERNATIVE 0x08
3872 #define FILE_DEVICE_BEEP 0x00000001
3873 #define FILE_DEVICE_CD_ROM 0x00000002
3874 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
3875 #define FILE_DEVICE_CONTROLLER 0x00000004
3876 #define FILE_DEVICE_DATALINK 0x00000005
3877 #define FILE_DEVICE_DFS 0x00000006
3878 #define FILE_DEVICE_DISK 0x00000007
3879 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
3880 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
3881 #define FILE_DEVICE_INPORT_PORT 0x0000000a
3882 #define FILE_DEVICE_KEYBOARD 0x0000000b
3883 #define FILE_DEVICE_MAILSLOT 0x0000000c
3884 #define FILE_DEVICE_MIDI_IN 0x0000000d
3885 #define FILE_DEVICE_MIDI_OUT 0x0000000e
3886 #define FILE_DEVICE_MOUSE 0x0000000f
3887 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
3888 #define FILE_DEVICE_NAMED_PIPE 0x00000011
3889 #define FILE_DEVICE_NETWORK 0x00000012
3890 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
3891 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
3892 #define FILE_DEVICE_NULL 0x00000015
3893 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
3894 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
3895 #define FILE_DEVICE_PRINTER 0x00000018
3896 #define FILE_DEVICE_SCANNER 0x00000019
3897 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
3898 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
3899 #define FILE_DEVICE_SCREEN 0x0000001c
3900 #define FILE_DEVICE_SOUND 0x0000001d
3901 #define FILE_DEVICE_STREAMS 0x0000001e
3902 #define FILE_DEVICE_TAPE 0x0000001f
3903 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
3904 #define FILE_DEVICE_TRANSPORT 0x00000021
3905 #define FILE_DEVICE_UNKNOWN 0x00000022
3906 #define FILE_DEVICE_VIDEO 0x00000023
3907 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
3908 #define FILE_DEVICE_WAVE_IN 0x00000025
3909 #define FILE_DEVICE_WAVE_OUT 0x00000026
3910 #define FILE_DEVICE_8042_PORT 0x00000027
3911 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
3912 #define FILE_DEVICE_BATTERY 0x00000029
3913 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
3914 #define FILE_DEVICE_MODEM 0x0000002b
3915 #define FILE_DEVICE_VDM 0x0000002c
3916 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
3917 #define FILE_DEVICE_SMB 0x0000002e
3918 #define FILE_DEVICE_KS 0x0000002f
3919 #define FILE_DEVICE_CHANGER 0x00000030
3920 #define FILE_DEVICE_SMARTCARD 0x00000031
3921 #define FILE_DEVICE_ACPI 0x00000032
3922 #define FILE_DEVICE_DVD 0x00000033
3923 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
3924 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
3925 #define FILE_DEVICE_DFS_VOLUME 0x00000036
3926 #define FILE_DEVICE_SERENUM 0x00000037
3927 #define FILE_DEVICE_TERMSRV 0x00000038
3928 #define FILE_DEVICE_KSEC 0x00000039
3929 #define FILE_DEVICE_FIPS 0x0000003A
3930 #define FILE_DEVICE_INFINIBAND 0x0000003B
3931 #define FILE_DEVICE_VMBUS 0x0000003E
3932 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
3933 #define FILE_DEVICE_WPD 0x00000040
3934 #define FILE_DEVICE_BLUETOOTH 0x00000041
3935 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
3936 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
3937 #define FILE_DEVICE_BIOMETRIC 0x00000044
3938 #define FILE_DEVICE_PMI 0x00000045
3940 #if defined(NT_PROCESSOR_GROUPS)
3942 typedef USHORT IRQ_DEVICE_POLICY
, *PIRQ_DEVICE_POLICY
;
3944 typedef enum _IRQ_DEVICE_POLICY_USHORT
{
3945 IrqPolicyMachineDefault
= 0,
3946 IrqPolicyAllCloseProcessors
= 1,
3947 IrqPolicyOneCloseProcessor
= 2,
3948 IrqPolicyAllProcessorsInMachine
= 3,
3949 IrqPolicyAllProcessorsInGroup
= 3,
3950 IrqPolicySpecifiedProcessors
= 4,
3951 IrqPolicySpreadMessagesAcrossAllProcessors
= 5};
3953 #else /* defined(NT_PROCESSOR_GROUPS) */
3955 typedef enum _IRQ_DEVICE_POLICY
{
3956 IrqPolicyMachineDefault
= 0,
3957 IrqPolicyAllCloseProcessors
,
3958 IrqPolicyOneCloseProcessor
,
3959 IrqPolicyAllProcessorsInMachine
,
3960 IrqPolicySpecifiedProcessors
,
3961 IrqPolicySpreadMessagesAcrossAllProcessors
3962 } IRQ_DEVICE_POLICY
, *PIRQ_DEVICE_POLICY
;
3966 typedef enum _IRQ_PRIORITY
{
3967 IrqPriorityUndefined
= 0,
3971 } IRQ_PRIORITY
, *PIRQ_PRIORITY
;
3973 typedef enum _IRQ_GROUP_POLICY
{
3974 GroupAffinityAllGroupZero
= 0,
3975 GroupAffinityDontCare
3976 } IRQ_GROUP_POLICY
, *PIRQ_GROUP_POLICY
;
3978 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
3980 typedef struct _OBJECT_HANDLE_INFORMATION
{
3981 ULONG HandleAttributes
;
3982 ACCESS_MASK GrantedAccess
;
3983 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
3985 typedef struct _CLIENT_ID
{
3986 HANDLE UniqueProcess
;
3987 HANDLE UniqueThread
;
3988 } CLIENT_ID
, *PCLIENT_ID
;
3990 typedef struct _VPB
{
3994 USHORT VolumeLabelLength
;
3995 struct _DEVICE_OBJECT
*DeviceObject
;
3996 struct _DEVICE_OBJECT
*RealDevice
;
3998 ULONG ReferenceCount
;
3999 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
4002 typedef enum _IO_ALLOCATION_ACTION
{
4005 DeallocateObjectKeepRegisters
4006 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
4008 _Function_class_(DRIVER_CONTROL
)
4009 _IRQL_requires_same_
4010 typedef IO_ALLOCATION_ACTION
4011 (NTAPI DRIVER_CONTROL
)(
4012 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
4013 _Inout_
struct _IRP
*Irp
,
4014 _In_ PVOID MapRegisterBase
,
4015 _In_ PVOID Context
);
4016 typedef DRIVER_CONTROL
*PDRIVER_CONTROL
;
4018 typedef struct _WAIT_CONTEXT_BLOCK
{
4019 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
4020 PDRIVER_CONTROL DeviceRoutine
;
4021 PVOID DeviceContext
;
4022 ULONG NumberOfMapRegisters
;
4025 PKDPC BufferChainingDpc
;
4026 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
4028 /* DEVICE_OBJECT.Flags */
4029 #define DO_VERIFY_VOLUME 0x00000002
4030 #define DO_BUFFERED_IO 0x00000004
4031 #define DO_EXCLUSIVE 0x00000008
4032 #define DO_DIRECT_IO 0x00000010
4033 #define DO_MAP_IO_BUFFER 0x00000020
4034 #define DO_DEVICE_INITIALIZING 0x00000080
4035 #define DO_SHUTDOWN_REGISTERED 0x00000800
4036 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
4037 #define DO_POWER_PAGABLE 0x00002000
4038 #define DO_POWER_INRUSH 0x00004000
4040 /* DEVICE_OBJECT.Characteristics */
4041 #define FILE_REMOVABLE_MEDIA 0x00000001
4042 #define FILE_READ_ONLY_DEVICE 0x00000002
4043 #define FILE_FLOPPY_DISKETTE 0x00000004
4044 #define FILE_WRITE_ONCE_MEDIA 0x00000008
4045 #define FILE_REMOTE_DEVICE 0x00000010
4046 #define FILE_DEVICE_IS_MOUNTED 0x00000020
4047 #define FILE_VIRTUAL_VOLUME 0x00000040
4048 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
4049 #define FILE_DEVICE_SECURE_OPEN 0x00000100
4050 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
4051 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
4052 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
4054 /* DEVICE_OBJECT.AlignmentRequirement */
4055 #define FILE_BYTE_ALIGNMENT 0x00000000
4056 #define FILE_WORD_ALIGNMENT 0x00000001
4057 #define FILE_LONG_ALIGNMENT 0x00000003
4058 #define FILE_QUAD_ALIGNMENT 0x00000007
4059 #define FILE_OCTA_ALIGNMENT 0x0000000f
4060 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
4061 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
4062 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
4063 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
4064 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
4066 /* DEVICE_OBJECT.DeviceType */
4067 #define DEVICE_TYPE ULONG
4069 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT
) _DEVICE_OBJECT
{
4072 LONG ReferenceCount
;
4073 struct _DRIVER_OBJECT
*DriverObject
;
4074 struct _DEVICE_OBJECT
*NextDevice
;
4075 struct _DEVICE_OBJECT
*AttachedDevice
;
4076 struct _IRP
*CurrentIrp
;
4079 ULONG Characteristics
;
4081 PVOID DeviceExtension
;
4082 DEVICE_TYPE DeviceType
;
4085 LIST_ENTRY ListEntry
;
4086 WAIT_CONTEXT_BLOCK Wcb
;
4088 ULONG AlignmentRequirement
;
4089 KDEVICE_QUEUE DeviceQueue
;
4091 ULONG ActiveThreadCount
;
4092 PSECURITY_DESCRIPTOR SecurityDescriptor
;
4096 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
4098 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
4100 typedef enum _IO_SESSION_STATE
{
4101 IoSessionStateCreated
= 1,
4102 IoSessionStateInitialized
,
4103 IoSessionStateConnected
,
4104 IoSessionStateDisconnected
,
4105 IoSessionStateDisconnectedLoggedOn
,
4106 IoSessionStateLoggedOn
,
4107 IoSessionStateLoggedOff
,
4108 IoSessionStateTerminated
,
4110 } IO_SESSION_STATE
, *PIO_SESSION_STATE
;
4112 typedef enum _IO_COMPLETION_ROUTINE_RESULT
{
4113 ContinueCompletion
= STATUS_CONTINUE_COMPLETION
,
4114 StopCompletion
= STATUS_MORE_PROCESSING_REQUIRED
4115 } IO_COMPLETION_ROUTINE_RESULT
, *PIO_COMPLETION_ROUTINE_RESULT
;
4117 typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY
{
4118 PHYSICAL_ADDRESS MessageAddress
;
4119 KAFFINITY TargetProcessorSet
;
4120 PKINTERRUPT InterruptObject
;
4124 KINTERRUPT_MODE Mode
;
4125 KINTERRUPT_POLARITY Polarity
;
4126 } IO_INTERRUPT_MESSAGE_INFO_ENTRY
, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY
;
4128 typedef struct _IO_INTERRUPT_MESSAGE_INFO
{
4131 IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo
[1];
4132 } IO_INTERRUPT_MESSAGE_INFO
, *PIO_INTERRUPT_MESSAGE_INFO
;
4134 typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS
{
4135 _In_ PDEVICE_OBJECT PhysicalDeviceObject
;
4136 _Out_ PKINTERRUPT
*InterruptObject
;
4137 _In_ PKSERVICE_ROUTINE ServiceRoutine
;
4138 _In_ PVOID ServiceContext
;
4139 _In_opt_ PKSPIN_LOCK SpinLock
;
4140 _In_ KIRQL SynchronizeIrql
;
4141 _In_ BOOLEAN FloatingSave
;
4142 _In_ BOOLEAN ShareVector
;
4145 _In_ KINTERRUPT_MODE InterruptMode
;
4146 _In_ KAFFINITY ProcessorEnableMask
;
4148 } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS
, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS
;
4150 typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS
{
4151 _In_ PDEVICE_OBJECT PhysicalDeviceObject
;
4152 _Out_ PKINTERRUPT
*InterruptObject
;
4153 _In_ PKSERVICE_ROUTINE ServiceRoutine
;
4154 _In_ PVOID ServiceContext
;
4155 _In_opt_ PKSPIN_LOCK SpinLock
;
4156 _In_opt_ KIRQL SynchronizeIrql
;
4157 _In_ BOOLEAN FloatingSave
;
4158 } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS
, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS
;
4160 typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS
{
4161 _In_ PDEVICE_OBJECT PhysicalDeviceObject
;
4163 _Out_ PVOID
*Generic
;
4164 _Out_ PIO_INTERRUPT_MESSAGE_INFO
*InterruptMessageTable
;
4165 _Out_ PKINTERRUPT
*InterruptObject
;
4166 } ConnectionContext
;
4167 _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine
;
4168 _In_ PVOID ServiceContext
;
4169 _In_opt_ PKSPIN_LOCK SpinLock
;
4170 _In_opt_ KIRQL SynchronizeIrql
;
4171 _In_ BOOLEAN FloatingSave
;
4172 _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine
;
4173 } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS
, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS
;
4175 typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS
{
4176 _Inout_ ULONG Version
;
4177 _ANONYMOUS_UNION
union {
4178 IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified
;
4179 IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased
;
4180 IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased
;
4182 } IO_CONNECT_INTERRUPT_PARAMETERS
, *PIO_CONNECT_INTERRUPT_PARAMETERS
;
4184 typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS
{
4188 _In_ PKINTERRUPT InterruptObject
;
4189 _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable
;
4190 } ConnectionContext
;
4191 } IO_DISCONNECT_INTERRUPT_PARAMETERS
, *PIO_DISCONNECT_INTERRUPT_PARAMETERS
;
4193 typedef enum _IO_ACCESS_TYPE
{
4199 typedef enum _IO_ACCESS_MODE
{
4204 typedef enum _IO_CONTAINER_NOTIFICATION_CLASS
{
4205 IoSessionStateNotification
,
4206 IoMaxContainerNotificationClass
4207 } IO_CONTAINER_NOTIFICATION_CLASS
;
4209 typedef struct _IO_SESSION_STATE_NOTIFICATION
{
4215 } IO_SESSION_STATE_NOTIFICATION
, *PIO_SESSION_STATE_NOTIFICATION
;
4217 typedef enum _IO_CONTAINER_INFORMATION_CLASS
{
4218 IoSessionStateInformation
,
4219 IoMaxContainerInformationClass
4220 } IO_CONTAINER_INFORMATION_CLASS
;
4222 typedef struct _IO_SESSION_STATE_INFORMATION
{
4224 IO_SESSION_STATE SessionState
;
4225 BOOLEAN LocalSession
;
4226 } IO_SESSION_STATE_INFORMATION
, *PIO_SESSION_STATE_INFORMATION
;
4228 #if (NTDDI_VERSION >= NTDDI_WIN7)
4231 (NTAPI
*PIO_CONTAINER_NOTIFICATION_FUNCTION
)(
4235 (NTAPI IO_SESSION_NOTIFICATION_FUNCTION
)(
4236 _In_ PVOID SessionObject
,
4237 _In_ PVOID IoObject
,
4240 _In_reads_bytes_opt_(PayloadLength
) PVOID NotificationPayload
,
4241 _In_ ULONG PayloadLength
);
4243 typedef IO_SESSION_NOTIFICATION_FUNCTION
*PIO_SESSION_NOTIFICATION_FUNCTION
;
4247 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
4249 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
4251 BOOLEAN Reserved
[3];
4252 volatile LONG IoCount
;
4254 } IO_REMOVE_LOCK_COMMON_BLOCK
;
4256 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
4259 LONGLONG MaxLockedTicks
;
4261 LIST_ENTRY LockList
;
4263 volatile LONG LowMemoryCount
;
4266 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
4267 } IO_REMOVE_LOCK_DBG_BLOCK
;
4269 typedef struct _IO_REMOVE_LOCK
{
4270 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
4272 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
4274 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
4276 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
4278 _Function_class_(IO_WORKITEM_ROUTINE
)
4279 _IRQL_requires_(PASSIVE_LEVEL
)
4280 _IRQL_requires_same_
4282 (NTAPI IO_WORKITEM_ROUTINE
)(
4283 _In_ PDEVICE_OBJECT DeviceObject
,
4284 _In_opt_ PVOID Context
);
4285 typedef IO_WORKITEM_ROUTINE
*PIO_WORKITEM_ROUTINE
;
4288 (NTAPI IO_WORKITEM_ROUTINE_EX
)(
4289 _In_ PVOID IoObject
,
4290 _In_opt_ PVOID Context
,
4291 _In_ PIO_WORKITEM IoWorkItem
);
4292 typedef IO_WORKITEM_ROUTINE_EX
*PIO_WORKITEM_ROUTINE_EX
;
4294 typedef struct _SHARE_ACCESS
{
4302 } SHARE_ACCESS
, *PSHARE_ACCESS
;
4304 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
4305 inheritance, even from a struct renders the type non-POD. So we use
4307 #define PCI_COMMON_HEADER_LAYOUT \
4316 UCHAR CacheLineSize; \
4317 UCHAR LatencyTimer; \
4321 struct _PCI_HEADER_TYPE_0 { \
4322 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
4324 USHORT SubVendorID; \
4325 USHORT SubSystemID; \
4326 ULONG ROMBaseAddress; \
4327 UCHAR CapabilitiesPtr; \
4328 UCHAR Reserved1[3]; \
4330 UCHAR InterruptLine; \
4331 UCHAR InterruptPin; \
4332 UCHAR MinimumGrant; \
4333 UCHAR MaximumLatency; \
4335 struct _PCI_HEADER_TYPE_1 { \
4336 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
4338 UCHAR SecondaryBus; \
4339 UCHAR SubordinateBus; \
4340 UCHAR SecondaryLatency; \
4343 USHORT SecondaryStatus; \
4344 USHORT MemoryBase; \
4345 USHORT MemoryLimit; \
4346 USHORT PrefetchBase; \
4347 USHORT PrefetchLimit; \
4348 ULONG PrefetchBaseUpper32; \
4349 ULONG PrefetchLimitUpper32; \
4350 USHORT IOBaseUpper16; \
4351 USHORT IOLimitUpper16; \
4352 UCHAR CapabilitiesPtr; \
4353 UCHAR Reserved1[3]; \
4354 ULONG ROMBaseAddress; \
4355 UCHAR InterruptLine; \
4356 UCHAR InterruptPin; \
4357 USHORT BridgeControl; \
4359 struct _PCI_HEADER_TYPE_2 { \
4360 ULONG SocketRegistersBaseAddress; \
4361 UCHAR CapabilitiesPtr; \
4363 USHORT SecondaryStatus; \
4365 UCHAR SecondaryBus; \
4366 UCHAR SubordinateBus; \
4367 UCHAR SecondaryLatency; \
4371 } Range[PCI_TYPE2_ADDRESSES-1]; \
4372 UCHAR InterruptLine; \
4373 UCHAR InterruptPin; \
4374 USHORT BridgeControl; \
4378 typedef enum _CREATE_FILE_TYPE
{
4380 CreateFileTypeNamedPipe
,
4381 CreateFileTypeMailslot
4384 #define IO_FORCE_ACCESS_CHECK 0x001
4385 #define IO_NO_PARAMETER_CHECKING 0x100
4387 #define IO_REPARSE 0x0
4388 #define IO_REMOUNT 0x1
4390 typedef struct _IO_STATUS_BLOCK
{
4391 _ANONYMOUS_UNION
union {
4395 ULONG_PTR Information
;
4396 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
4399 typedef struct _IO_STATUS_BLOCK32
{
4402 } IO_STATUS_BLOCK32
, *PIO_STATUS_BLOCK32
;
4406 (NTAPI
*PIO_APC_ROUTINE
)(
4407 _In_ PVOID ApcContext
,
4408 _In_ PIO_STATUS_BLOCK IoStatusBlock
,
4409 _In_ ULONG Reserved
);
4411 #define PIO_APC_ROUTINE_DEFINED
4413 typedef enum _IO_SESSION_EVENT
{
4414 IoSessionEventIgnore
= 0,
4415 IoSessionEventCreated
,
4416 IoSessionEventTerminated
,
4417 IoSessionEventConnected
,
4418 IoSessionEventDisconnected
,
4419 IoSessionEventLogon
,
4420 IoSessionEventLogoff
,
4422 } IO_SESSION_EVENT
, *PIO_SESSION_EVENT
;
4424 #define IO_SESSION_STATE_ALL_EVENTS 0xffffffff
4425 #define IO_SESSION_STATE_CREATION_EVENT 0x00000001
4426 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
4427 #define IO_SESSION_STATE_CONNECT_EVENT 0x00000004
4428 #define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008
4429 #define IO_SESSION_STATE_LOGON_EVENT 0x00000010
4430 #define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020
4432 #define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f
4434 #define IO_SESSION_MAX_PAYLOAD_SIZE 256L
4436 typedef struct _IO_SESSION_CONNECT_INFO
{
4438 BOOLEAN LocalSession
;
4439 } IO_SESSION_CONNECT_INFO
, *PIO_SESSION_CONNECT_INFO
;
4441 #define EVENT_INCREMENT 1
4442 #define IO_NO_INCREMENT 0
4443 #define IO_CD_ROM_INCREMENT 1
4444 #define IO_DISK_INCREMENT 1
4445 #define IO_KEYBOARD_INCREMENT 6
4446 #define IO_MAILSLOT_INCREMENT 2
4447 #define IO_MOUSE_INCREMENT 6
4448 #define IO_NAMED_PIPE_INCREMENT 2
4449 #define IO_NETWORK_INCREMENT 2
4450 #define IO_PARALLEL_INCREMENT 1
4451 #define IO_SERIAL_INCREMENT 2
4452 #define IO_SOUND_INCREMENT 8
4453 #define IO_VIDEO_INCREMENT 1
4454 #define SEMAPHORE_INCREMENT 1
4456 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
4458 typedef struct _BOOTDISK_INFORMATION
{
4459 LONGLONG BootPartitionOffset
;
4460 LONGLONG SystemPartitionOffset
;
4461 ULONG BootDeviceSignature
;
4462 ULONG SystemDeviceSignature
;
4463 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
4465 typedef struct _BOOTDISK_INFORMATION_EX
{
4466 LONGLONG BootPartitionOffset
;
4467 LONGLONG SystemPartitionOffset
;
4468 ULONG BootDeviceSignature
;
4469 ULONG SystemDeviceSignature
;
4470 GUID BootDeviceGuid
;
4471 GUID SystemDeviceGuid
;
4472 BOOLEAN BootDeviceIsGpt
;
4473 BOOLEAN SystemDeviceIsGpt
;
4474 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
4476 #if (NTDDI_VERSION >= NTDDI_WIN7)
4478 typedef struct _LOADER_PARTITION_INFORMATION_EX
{
4479 ULONG PartitionStyle
;
4480 ULONG PartitionNumber
;
4481 _ANONYMOUS_UNION
union {
4486 } LOADER_PARTITION_INFORMATION_EX
, *PLOADER_PARTITION_INFORMATION_EX
;
4488 typedef struct _BOOTDISK_INFORMATION_LITE
{
4489 ULONG NumberEntries
;
4490 LOADER_PARTITION_INFORMATION_EX Entries
[1];
4491 } BOOTDISK_INFORMATION_LITE
, *PBOOTDISK_INFORMATION_LITE
;
4495 #if (NTDDI_VERSION >= NTDDI_VISTA)
4496 typedef struct _BOOTDISK_INFORMATION_LITE
{
4497 ULONG BootDeviceSignature
;
4498 ULONG SystemDeviceSignature
;
4499 GUID BootDeviceGuid
;
4500 GUID SystemDeviceGuid
;
4501 BOOLEAN BootDeviceIsGpt
;
4502 BOOLEAN SystemDeviceIsGpt
;
4503 } BOOTDISK_INFORMATION_LITE
, *PBOOTDISK_INFORMATION_LITE
;
4504 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4506 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4508 #include <pshpack1.h>
4510 typedef struct _EISA_MEMORY_TYPE
{
4517 UCHAR MoreEntries
:1;
4518 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
4520 typedef struct _EISA_MEMORY_CONFIGURATION
{
4521 EISA_MEMORY_TYPE ConfigurationByte
;
4523 USHORT AddressLowWord
;
4524 UCHAR AddressHighByte
;
4526 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
4528 typedef struct _EISA_IRQ_DESCRIPTOR
{
4531 UCHAR LevelTriggered
:1;
4533 UCHAR MoreEntries
:1;
4534 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
4536 typedef struct _EISA_IRQ_CONFIGURATION
{
4537 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
4539 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
4541 typedef struct _DMA_CONFIGURATION_BYTE0
{
4545 UCHAR MoreEntries
:1;
4546 } DMA_CONFIGURATION_BYTE0
;
4548 typedef struct _DMA_CONFIGURATION_BYTE1
{
4550 UCHAR TransferSize
:2;
4553 } DMA_CONFIGURATION_BYTE1
;
4555 typedef struct _EISA_DMA_CONFIGURATION
{
4556 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
4557 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
4558 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
4560 typedef struct _EISA_PORT_DESCRIPTOR
{
4561 UCHAR NumberPorts
:5;
4564 UCHAR MoreEntries
:1;
4565 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
4567 typedef struct _EISA_PORT_CONFIGURATION
{
4568 EISA_PORT_DESCRIPTOR Configuration
;
4570 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
4572 typedef struct _CM_EISA_SLOT_INFORMATION
{
4575 UCHAR MajorRevision
;
4576 UCHAR MinorRevision
;
4578 UCHAR NumberFunctions
;
4579 UCHAR FunctionInformation
;
4581 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
4583 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
4587 UCHAR MinorRevision
;
4588 UCHAR MajorRevision
;
4589 UCHAR Selections
[26];
4590 UCHAR FunctionFlags
;
4591 UCHAR TypeString
[80];
4592 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
4593 EISA_IRQ_CONFIGURATION EisaIrq
[7];
4594 EISA_DMA_CONFIGURATION EisaDma
[4];
4595 EISA_PORT_CONFIGURATION EisaPort
[20];
4596 UCHAR InitializationData
[60];
4597 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
4599 #include <poppack.h>
4601 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
4603 #define EISA_FUNCTION_ENABLED 0x80
4604 #define EISA_FREE_FORM_DATA 0x40
4605 #define EISA_HAS_PORT_INIT_ENTRY 0x20
4606 #define EISA_HAS_PORT_RANGE 0x10
4607 #define EISA_HAS_DMA_ENTRY 0x08
4608 #define EISA_HAS_IRQ_ENTRY 0x04
4609 #define EISA_HAS_MEMORY_ENTRY 0x02
4610 #define EISA_HAS_TYPE_ENTRY 0x01
4611 #define EISA_HAS_INFORMATION \
4612 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
4613 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
4615 #define EISA_MORE_ENTRIES 0x80
4616 #define EISA_SYSTEM_MEMORY 0x00
4617 #define EISA_MEMORY_TYPE_RAM 0x01
4619 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
4621 #define EISA_INVALID_SLOT 0x80
4622 #define EISA_INVALID_FUNCTION 0x81
4623 #define EISA_INVALID_CONFIGURATION 0x82
4624 #define EISA_EMPTY_SLOT 0x83
4625 #define EISA_INVALID_BIOS_CALL 0x86
4628 ** Plug and Play structures
4632 (NTAPI
*PINTERFACE_REFERENCE
)(
4636 (NTAPI
*PINTERFACE_DEREFERENCE
)(
4639 _Function_class_(TRANSLATE_BUS_ADDRESS
)
4640 _IRQL_requires_same_
4642 (NTAPI TRANSLATE_BUS_ADDRESS
)(
4643 _Inout_opt_ PVOID Context
,
4644 _In_ PHYSICAL_ADDRESS BusAddress
,
4646 _Out_ PULONG AddressSpace
,
4647 _Out_ PPHYSICAL_ADDRESS TranslatedAddress
);
4648 typedef TRANSLATE_BUS_ADDRESS
*PTRANSLATE_BUS_ADDRESS
;
4650 _Function_class_(GET_DMA_ADAPTER
)
4651 _IRQL_requires_same_
4652 typedef struct _DMA_ADAPTER
*
4653 (NTAPI GET_DMA_ADAPTER
)(
4654 _Inout_opt_ PVOID Context
,
4655 _In_
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
4656 _Out_ PULONG NumberOfMapRegisters
);
4657 typedef GET_DMA_ADAPTER
*PGET_DMA_ADAPTER
;
4659 _Function_class_(GET_SET_DEVICE_DATA
)
4660 _IRQL_requires_same_
4662 (NTAPI GET_SET_DEVICE_DATA
)(
4663 _Inout_opt_ PVOID Context
,
4664 _In_ ULONG DataType
,
4665 _Inout_updates_bytes_(Length
) PVOID Buffer
,
4668 typedef GET_SET_DEVICE_DATA
*PGET_SET_DEVICE_DATA
;
4670 typedef enum _DEVICE_INSTALL_STATE
{
4671 InstallStateInstalled
,
4672 InstallStateNeedsReinstall
,
4673 InstallStateFailedInstall
,
4674 InstallStateFinishInstall
4675 } DEVICE_INSTALL_STATE
, *PDEVICE_INSTALL_STATE
;
4677 typedef struct _LEGACY_BUS_INFORMATION
{
4679 INTERFACE_TYPE LegacyBusType
;
4681 } LEGACY_BUS_INFORMATION
, *PLEGACY_BUS_INFORMATION
;
4683 typedef enum _DEVICE_REMOVAL_POLICY
{
4684 RemovalPolicyExpectNoRemoval
= 1,
4685 RemovalPolicyExpectOrderlyRemoval
= 2,
4686 RemovalPolicyExpectSurpriseRemoval
= 3
4687 } DEVICE_REMOVAL_POLICY
, *PDEVICE_REMOVAL_POLICY
;
4690 (NTAPI
*PREENUMERATE_SELF
)(
4691 _In_ PVOID Context
);
4693 typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD
{
4697 PINTERFACE_REFERENCE InterfaceReference
;
4698 PINTERFACE_DEREFERENCE InterfaceDereference
;
4699 PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf
;
4700 } REENUMERATE_SELF_INTERFACE_STANDARD
, *PREENUMERATE_SELF_INTERFACE_STANDARD
;
4703 (NTAPI
*PIO_DEVICE_EJECT_CALLBACK
)(
4704 _In_ NTSTATUS Status
,
4705 _Inout_opt_ PVOID Context
);
4707 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1
4709 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
4710 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
4711 #define PCI_USE_REVISION 0x00000002
4712 #define PCI_USE_VENDEV_IDS 0x00000004
4713 #define PCI_USE_CLASS_SUBCLASS 0x00000008
4714 #define PCI_USE_PROGIF 0x00000010
4715 #define PCI_USE_LOCAL_BUS 0x00000020
4716 #define PCI_USE_LOCAL_DEVICE 0x00000040
4718 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS
{
4729 } PCI_DEVICE_PRESENCE_PARAMETERS
, *PPCI_DEVICE_PRESENCE_PARAMETERS
;
4731 _IRQL_requires_max_(PASSIVE_LEVEL
)
4732 _Must_inspect_result_
4734 (NTAPI PCI_IS_DEVICE_PRESENT
)(
4735 _In_ USHORT VendorID
,
4736 _In_ USHORT DeviceID
,
4737 _In_ UCHAR RevisionID
,
4738 _In_ USHORT SubVendorID
,
4739 _In_ USHORT SubSystemID
,
4741 typedef PCI_IS_DEVICE_PRESENT
*PPCI_IS_DEVICE_PRESENT
;
4743 _IRQL_requires_max_(PASSIVE_LEVEL
)
4744 _Must_inspect_result_
4746 (NTAPI PCI_IS_DEVICE_PRESENT_EX
)(
4748 _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
);
4749 typedef PCI_IS_DEVICE_PRESENT_EX
*PPCI_IS_DEVICE_PRESENT_EX
;
4751 typedef struct _BUS_INTERFACE_STANDARD
{
4755 PINTERFACE_REFERENCE InterfaceReference
;
4756 PINTERFACE_DEREFERENCE InterfaceDereference
;
4757 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
4758 PGET_DMA_ADAPTER GetDmaAdapter
;
4759 PGET_SET_DEVICE_DATA SetBusData
;
4760 PGET_SET_DEVICE_DATA GetBusData
;
4761 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
4763 typedef struct _PCI_DEVICE_PRESENT_INTERFACE
{
4767 PINTERFACE_REFERENCE InterfaceReference
;
4768 PINTERFACE_DEREFERENCE InterfaceDereference
;
4769 PPCI_IS_DEVICE_PRESENT IsDevicePresent
;
4770 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx
;
4771 } PCI_DEVICE_PRESENT_INTERFACE
, *PPCI_DEVICE_PRESENT_INTERFACE
;
4773 _Struct_size_bytes_(Size
)
4774 typedef struct _DEVICE_CAPABILITIES
{
4775 _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES
)) USHORT Size
;
4779 ULONG LockSupported
:1;
4780 ULONG EjectSupported
:1;
4784 ULONG SilentInstall
:1;
4785 ULONG RawDeviceOK
:1;
4786 ULONG SurpriseRemovalOK
:1;
4791 ULONG HardwareDisabled
:1;
4793 ULONG WarmEjectSupported
:1;
4794 ULONG NoDisplayInUI
:1;
4798 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
4799 SYSTEM_POWER_STATE SystemWake
;
4800 DEVICE_POWER_STATE DeviceWake
;
4804 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
4806 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
4810 GUID InterfaceClassGuid
;
4811 PUNICODE_STRING SymbolicLinkName
;
4812 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
4814 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
4818 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
4822 typedef struct _INTERFACE
{
4826 PINTERFACE_REFERENCE InterfaceReference
;
4827 PINTERFACE_DEREFERENCE InterfaceDereference
;
4828 } INTERFACE
, *PINTERFACE
;
4830 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
4834 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
4836 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
4838 /* PNP_DEVICE_STATE */
4840 #define PNP_DEVICE_DISABLED 0x00000001
4841 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
4842 #define PNP_DEVICE_FAILED 0x00000004
4843 #define PNP_DEVICE_REMOVED 0x00000008
4844 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
4845 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
4847 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
4851 struct _FILE_OBJECT
*FileObject
;
4852 LONG NameBufferOffset
;
4853 UCHAR CustomDataBuffer
[1];
4854 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
4856 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
4860 struct _FILE_OBJECT
*FileObject
;
4861 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
4863 #if (NTDDI_VERSION >= NTDDI_VISTA)
4864 #include <devpropdef.h>
4865 #define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001
4868 #define PNP_REPLACE_NO_MAP MAXLONGLONG
4870 _Must_inspect_result_
4872 (NTAPI
*PREPLACE_MAP_MEMORY
)(
4873 _In_ PHYSICAL_ADDRESS TargetPhysicalAddress
,
4874 _In_ PHYSICAL_ADDRESS SparePhysicalAddress
,
4875 _Inout_ PLARGE_INTEGER NumberOfBytes
,
4876 _Outptr_ PVOID
*TargetAddress
,
4877 _Outptr_ PVOID
*SpareAddress
);
4879 typedef struct _PNP_REPLACE_MEMORY_LIST
{
4880 ULONG AllocatedCount
;
4882 ULONGLONG TotalLength
;
4884 PHYSICAL_ADDRESS Address
;
4886 } Ranges
[ANYSIZE_ARRAY
];
4887 } PNP_REPLACE_MEMORY_LIST
, *PPNP_REPLACE_MEMORY_LIST
;
4889 typedef struct _PNP_REPLACE_PROCESSOR_LIST
{
4890 PKAFFINITY Affinity
;
4891 _Field_range_(<=, MAXIMUM_GROUPS
) ULONG GroupCount
;
4892 ULONG AllocatedCount
;
4894 ULONG ApicIds
[ANYSIZE_ARRAY
];
4895 } PNP_REPLACE_PROCESSOR_LIST
, *PPNP_REPLACE_PROCESSOR_LIST
;
4897 typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1
{
4898 KAFFINITY AffinityMask
;
4899 ULONG AllocatedCount
;
4901 ULONG ApicIds
[ANYSIZE_ARRAY
];
4902 } PNP_REPLACE_PROCESSOR_LIST_V1
, *PPNP_REPLACE_PROCESSOR_LIST_V1
;
4904 #define PNP_REPLACE_PARAMETERS_VERSION 2
4906 typedef struct _PNP_REPLACE_PARAMETERS
{
4911 PPNP_REPLACE_PROCESSOR_LIST TargetProcessors
;
4912 PPNP_REPLACE_PROCESSOR_LIST SpareProcessors
;
4913 PPNP_REPLACE_MEMORY_LIST TargetMemory
;
4914 PPNP_REPLACE_MEMORY_LIST SpareMemory
;
4915 PREPLACE_MAP_MEMORY MapMemory
;
4916 } PNP_REPLACE_PARAMETERS
, *PPNP_REPLACE_PARAMETERS
;
4919 (NTAPI
*PREPLACE_UNLOAD
)(
4922 _Must_inspect_result_
4924 (NTAPI
*PREPLACE_BEGIN
)(
4925 _In_ PPNP_REPLACE_PARAMETERS Parameters
,
4926 _Outptr_ PVOID
*Context
);
4928 _Must_inspect_result_
4930 (NTAPI
*PREPLACE_END
)(
4931 _In_ PVOID Context
);
4933 _Must_inspect_result_
4935 (NTAPI
*PREPLACE_MIRROR_PHYSICAL_MEMORY
)(
4937 _In_ PHYSICAL_ADDRESS PhysicalAddress
,
4938 _In_ LARGE_INTEGER ByteCount
);
4940 _Must_inspect_result_
4942 (NTAPI
*PREPLACE_SET_PROCESSOR_ID
)(
4945 _In_ BOOLEAN Target
);
4947 _Must_inspect_result_
4949 (NTAPI
*PREPLACE_SWAP
)(
4950 _In_ PVOID Context
);
4952 _Must_inspect_result_
4954 (NTAPI
*PREPLACE_INITIATE_HARDWARE_MIRROR
)(
4955 _In_ PVOID Context
);
4957 _Must_inspect_result_
4959 (NTAPI
*PREPLACE_MIRROR_PLATFORM_MEMORY
)(
4960 _In_ PVOID Context
);
4962 _Must_inspect_result_
4964 (NTAPI
*PREPLACE_GET_MEMORY_DESTINATION
)(
4966 _In_ PHYSICAL_ADDRESS SourceAddress
,
4967 _Out_ PPHYSICAL_ADDRESS DestinationAddress
);
4969 _Must_inspect_result_
4971 (NTAPI
*PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE
)(
4973 _In_ BOOLEAN Enable
);
4975 #define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1
4976 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
4977 FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
4979 #define PNP_REPLACE_MEMORY_SUPPORTED 0x0001
4980 #define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002
4981 #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004
4982 #define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008
4983 #define PNP_REPLACE_HARDWARE_QUIESCE 0x0010
4985 typedef struct _PNP_REPLACE_DRIVER_INTERFACE
{
4989 PREPLACE_UNLOAD Unload
;
4990 PREPLACE_BEGIN BeginReplace
;
4991 PREPLACE_END EndReplace
;
4992 PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory
;
4993 PREPLACE_SET_PROCESSOR_ID SetProcessorId
;
4995 PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror
;
4996 PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory
;
4997 PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination
;
4998 PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce
;
4999 } PNP_REPLACE_DRIVER_INTERFACE
, *PPNP_REPLACE_DRIVER_INTERFACE
;
5001 _Must_inspect_result_
5003 (NTAPI
*PREPLACE_DRIVER_INIT
)(
5004 _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface
,
5007 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
5008 DeviceUsageTypeUndefined
,
5009 DeviceUsageTypePaging
,
5010 DeviceUsageTypeHibernation
,
5011 DeviceUsageTypeDumpFile
5012 } DEVICE_USAGE_NOTIFICATION_TYPE
;
5014 typedef struct _POWER_SEQUENCE
{
5018 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
5021 #define __string_type 0x1000
5022 #define __guid_type 0x2000
5023 #define __multiString_type 0x4000
5025 #define __string_type 0
5026 #define __guid_type 0
5027 #define __multiString_type 0
5031 DevicePropertyDeviceDescription
= 0x0 | __string_type
,
5032 DevicePropertyHardwareID
= 0x1 | __multiString_type
,
5033 DevicePropertyCompatibleIDs
= 0x2 | __multiString_type
,
5034 DevicePropertyBootConfiguration
= 0x3,
5035 DevicePropertyBootConfigurationTranslated
= 0x4,
5036 DevicePropertyClassName
= 0x5 | __string_type
,
5037 DevicePropertyClassGuid
= 0x6 | __string_type
,
5038 DevicePropertyDriverKeyName
= 0x7 | __string_type
,
5039 DevicePropertyManufacturer
= 0x8 | __string_type
,
5040 DevicePropertyFriendlyName
= 0x9 | __string_type
,
5041 DevicePropertyLocationInformation
= 0xa | __string_type
,
5042 DevicePropertyPhysicalDeviceObjectName
= 0xb | __string_type
,
5043 DevicePropertyBusTypeGuid
= 0xc | __guid_type
,
5044 DevicePropertyLegacyBusType
= 0xd,
5045 DevicePropertyBusNumber
= 0xe,
5046 DevicePropertyEnumeratorName
= 0xf | __string_type
,
5047 DevicePropertyAddress
= 0x10,
5048 DevicePropertyUINumber
= 0x11,
5049 DevicePropertyInstallState
= 0x12,
5050 DevicePropertyRemovalPolicy
= 0x13,
5051 DevicePropertyResourceRequirements
= 0x14,
5052 DevicePropertyAllocatedResources
= 0x15,
5053 DevicePropertyContainerID
= 0x16 | __string_type
5054 } DEVICE_REGISTRY_PROPERTY
;
5056 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
5057 EventCategoryReserved
,
5058 EventCategoryHardwareProfileChange
,
5059 EventCategoryDeviceInterfaceChange
,
5060 EventCategoryTargetDeviceChange
5061 } IO_NOTIFICATION_EVENT_CATEGORY
;
5063 typedef enum _IO_PRIORITY_HINT
{
5064 IoPriorityVeryLow
= 0,
5072 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
5074 _Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE
)
5075 _IRQL_requires_max_(PASSIVE_LEVEL
)
5077 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
5078 _In_ PVOID NotificationStructure
,
5079 _Inout_opt_ PVOID Context
);
5080 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
;
5082 _Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK
)
5083 _IRQL_requires_same_
5085 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK
)(
5086 _Inout_opt_ PVOID Context
);
5087 typedef DEVICE_CHANGE_COMPLETE_CALLBACK
*PDEVICE_CHANGE_COMPLETE_CALLBACK
;
5089 typedef enum _FILE_INFORMATION_CLASS
{
5090 FileDirectoryInformation
= 1,
5091 FileFullDirectoryInformation
,
5092 FileBothDirectoryInformation
,
5093 FileBasicInformation
,
5094 FileStandardInformation
,
5095 FileInternalInformation
,
5097 FileAccessInformation
,
5098 FileNameInformation
,
5099 FileRenameInformation
,
5100 FileLinkInformation
,
5101 FileNamesInformation
,
5102 FileDispositionInformation
,
5103 FilePositionInformation
,
5104 FileFullEaInformation
,
5105 FileModeInformation
,
5106 FileAlignmentInformation
,
5108 FileAllocationInformation
,
5109 FileEndOfFileInformation
,
5110 FileAlternateNameInformation
,
5111 FileStreamInformation
,
5112 FilePipeInformation
,
5113 FilePipeLocalInformation
,
5114 FilePipeRemoteInformation
,
5115 FileMailslotQueryInformation
,
5116 FileMailslotSetInformation
,
5117 FileCompressionInformation
,
5118 FileObjectIdInformation
,
5119 FileCompletionInformation
,
5120 FileMoveClusterInformation
,
5121 FileQuotaInformation
,
5122 FileReparsePointInformation
,
5123 FileNetworkOpenInformation
,
5124 FileAttributeTagInformation
,
5125 FileTrackingInformation
,
5126 FileIdBothDirectoryInformation
,
5127 FileIdFullDirectoryInformation
,
5128 FileValidDataLengthInformation
,
5129 FileShortNameInformation
,
5130 #if (NTDDI_VERSION >= NTDDI_VISTA)
5131 FileIoCompletionNotificationInformation
,
5132 FileIoStatusBlockRangeInformation
,
5133 FileIoPriorityHintInformation
,
5134 FileSfioReserveInformation
,
5135 FileSfioVolumeInformation
,
5136 FileHardLinkInformation
,
5137 FileProcessIdsUsingFileInformation
,
5138 FileNormalizedNameInformation
,
5139 FileNetworkPhysicalNameInformation
,
5141 #if (NTDDI_VERSION >= NTDDI_WIN7)
5142 FileIdGlobalTxDirectoryInformation
,
5143 FileIsRemoteDeviceInformation
,
5144 FileAttributeCacheInformation
,
5145 FileNumaNodeInformation
,
5146 FileStandardLinkInformation
,
5147 FileRemoteProtocolInformation
,
5149 FileMaximumInformation
5150 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
5152 typedef struct _FILE_POSITION_INFORMATION
{
5153 LARGE_INTEGER CurrentByteOffset
;
5154 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
5156 typedef struct _FILE_BASIC_INFORMATION
{
5157 LARGE_INTEGER CreationTime
;
5158 LARGE_INTEGER LastAccessTime
;
5159 LARGE_INTEGER LastWriteTime
;
5160 LARGE_INTEGER ChangeTime
;
5161 ULONG FileAttributes
;
5162 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
5164 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION
{
5165 IO_PRIORITY_HINT PriorityHint
;
5166 } FILE_IO_PRIORITY_HINT_INFORMATION
, *PFILE_IO_PRIORITY_HINT_INFORMATION
;
5168 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION
{
5170 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION
, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION
;
5172 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION
{
5173 PUCHAR IoStatusBlockRange
;
5175 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION
, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION
;
5177 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION
{
5179 } FILE_IS_REMOTE_DEVICE_INFORMATION
, *PFILE_IS_REMOTE_DEVICE_INFORMATION
;
5181 typedef struct _FILE_NUMA_NODE_INFORMATION
{
5183 } FILE_NUMA_NODE_INFORMATION
, *PFILE_NUMA_NODE_INFORMATION
;
5185 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION
{
5186 ULONG NumberOfProcessIdsInList
;
5187 ULONG_PTR ProcessIdList
[1];
5188 } FILE_PROCESS_IDS_USING_FILE_INFORMATION
, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION
;
5190 typedef struct _FILE_STANDARD_INFORMATION
{
5191 LARGE_INTEGER AllocationSize
;
5192 LARGE_INTEGER EndOfFile
;
5193 ULONG NumberOfLinks
;
5194 BOOLEAN DeletePending
;
5196 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
5198 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
5199 LARGE_INTEGER CreationTime
;
5200 LARGE_INTEGER LastAccessTime
;
5201 LARGE_INTEGER LastWriteTime
;
5202 LARGE_INTEGER ChangeTime
;
5203 LARGE_INTEGER AllocationSize
;
5204 LARGE_INTEGER EndOfFile
;
5205 ULONG FileAttributes
;
5206 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
5208 typedef enum _FSINFOCLASS
{
5209 FileFsVolumeInformation
= 1,
5210 FileFsLabelInformation
,
5211 FileFsSizeInformation
,
5212 FileFsDeviceInformation
,
5213 FileFsAttributeInformation
,
5214 FileFsControlInformation
,
5215 FileFsFullSizeInformation
,
5216 FileFsObjectIdInformation
,
5217 FileFsDriverPathInformation
,
5218 FileFsVolumeFlagsInformation
,
5219 FileFsMaximumInformation
5220 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
5222 typedef struct _FILE_FS_DEVICE_INFORMATION
{
5223 DEVICE_TYPE DeviceType
;
5224 ULONG Characteristics
;
5225 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
5227 typedef struct _FILE_FULL_EA_INFORMATION
{
5228 ULONG NextEntryOffset
;
5231 USHORT EaValueLength
;
5233 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
5235 typedef struct _FILE_SFIO_RESERVE_INFORMATION
{
5236 ULONG RequestsPerPeriod
;
5238 BOOLEAN RetryFailures
;
5239 BOOLEAN Discardable
;
5241 ULONG NumOutstandingRequests
;
5242 } FILE_SFIO_RESERVE_INFORMATION
, *PFILE_SFIO_RESERVE_INFORMATION
;
5244 typedef struct _FILE_SFIO_VOLUME_INFORMATION
{
5245 ULONG MaximumRequestsPerPeriod
;
5246 ULONG MinimumPeriod
;
5247 ULONG MinimumTransferSize
;
5248 } FILE_SFIO_VOLUME_INFORMATION
, *PFILE_SFIO_VOLUME_INFORMATION
;
5250 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1
5251 #define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2
5252 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4
5254 #define FM_LOCK_BIT (0x1)
5255 #define FM_LOCK_BIT_V (0x0)
5256 #define FM_LOCK_WAITER_WOKEN (0x2)
5257 #define FM_LOCK_WAITER_INC (0x4)
5259 _Function_class_(FAST_IO_CHECK_IF_POSSIBLE
)
5260 _IRQL_requires_same_
5262 (NTAPI FAST_IO_CHECK_IF_POSSIBLE
)(
5263 _In_
struct _FILE_OBJECT
*FileObject
,
5264 _In_ PLARGE_INTEGER FileOffset
,
5268 _In_ BOOLEAN CheckForReadOperation
,
5269 _Out_ PIO_STATUS_BLOCK IoStatus
,
5270 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5271 typedef FAST_IO_CHECK_IF_POSSIBLE
*PFAST_IO_CHECK_IF_POSSIBLE
;
5273 _Function_class_(FAST_IO_READ
)
5274 _IRQL_requires_same_
5276 (NTAPI FAST_IO_READ
)(
5277 _In_
struct _FILE_OBJECT
*FileObject
,
5278 _In_ PLARGE_INTEGER FileOffset
,
5283 _Out_ PIO_STATUS_BLOCK IoStatus
,
5284 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5285 typedef FAST_IO_READ
*PFAST_IO_READ
;
5287 _Function_class_(FAST_IO_WRITE
)
5288 _IRQL_requires_same_
5290 (NTAPI FAST_IO_WRITE
)(
5291 _In_
struct _FILE_OBJECT
*FileObject
,
5292 _In_ PLARGE_INTEGER FileOffset
,
5297 _Out_ PIO_STATUS_BLOCK IoStatus
,
5298 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5299 typedef FAST_IO_WRITE
*PFAST_IO_WRITE
;
5301 _Function_class_(FAST_IO_QUERY_BASIC_INFO
)
5302 _IRQL_requires_same_
5304 (NTAPI FAST_IO_QUERY_BASIC_INFO
)(
5305 _In_
struct _FILE_OBJECT
*FileObject
,
5307 _Out_ PFILE_BASIC_INFORMATION Buffer
,
5308 _Out_ PIO_STATUS_BLOCK IoStatus
,
5309 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5310 typedef FAST_IO_QUERY_BASIC_INFO
*PFAST_IO_QUERY_BASIC_INFO
;
5312 _Function_class_(FAST_IO_QUERY_STANDARD_INFO
)
5313 _IRQL_requires_same_
5315 (NTAPI FAST_IO_QUERY_STANDARD_INFO
)(
5316 _In_
struct _FILE_OBJECT
*FileObject
,
5318 _Out_ PFILE_STANDARD_INFORMATION Buffer
,
5319 _Out_ PIO_STATUS_BLOCK IoStatus
,
5320 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5321 typedef FAST_IO_QUERY_STANDARD_INFO
*PFAST_IO_QUERY_STANDARD_INFO
;
5323 _Function_class_(FAST_IO_LOCK
)
5324 _IRQL_requires_same_
5326 (NTAPI FAST_IO_LOCK
)(
5327 _In_
struct _FILE_OBJECT
*FileObject
,
5328 _In_ PLARGE_INTEGER FileOffset
,
5329 _In_ PLARGE_INTEGER Length
,
5330 _In_ PEPROCESS ProcessId
,
5332 _In_ BOOLEAN FailImmediately
,
5333 _In_ BOOLEAN ExclusiveLock
,
5334 _Out_ PIO_STATUS_BLOCK IoStatus
,
5335 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5336 typedef FAST_IO_LOCK
*PFAST_IO_LOCK
;
5338 _Function_class_(FAST_IO_UNLOCK_SINGLE
)
5339 _IRQL_requires_same_
5341 (NTAPI FAST_IO_UNLOCK_SINGLE
)(
5342 _In_
struct _FILE_OBJECT
*FileObject
,
5343 _In_ PLARGE_INTEGER FileOffset
,
5344 _In_ PLARGE_INTEGER Length
,
5345 _In_ PEPROCESS ProcessId
,
5347 _Out_ PIO_STATUS_BLOCK IoStatus
,
5348 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5349 typedef FAST_IO_UNLOCK_SINGLE
*PFAST_IO_UNLOCK_SINGLE
;
5351 _Function_class_(FAST_IO_UNLOCK_ALL
)
5352 _IRQL_requires_same_
5354 (NTAPI FAST_IO_UNLOCK_ALL
)(
5355 _In_
struct _FILE_OBJECT
*FileObject
,
5356 _In_ PEPROCESS ProcessId
,
5357 _Out_ PIO_STATUS_BLOCK IoStatus
,
5358 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5359 typedef FAST_IO_UNLOCK_ALL
*PFAST_IO_UNLOCK_ALL
;
5361 _Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY
)
5362 _IRQL_requires_same_
5364 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY
)(
5365 _In_
struct _FILE_OBJECT
*FileObject
,
5366 _In_ PVOID ProcessId
,
5368 _Out_ PIO_STATUS_BLOCK IoStatus
,
5369 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5370 typedef FAST_IO_UNLOCK_ALL_BY_KEY
*PFAST_IO_UNLOCK_ALL_BY_KEY
;
5372 _Function_class_(FAST_IO_DEVICE_CONTROL
)
5373 _IRQL_requires_same_
5375 (NTAPI FAST_IO_DEVICE_CONTROL
)(
5376 _In_
struct _FILE_OBJECT
*FileObject
,
5378 _In_opt_ PVOID InputBuffer
,
5379 _In_ ULONG InputBufferLength
,
5380 _Out_opt_ PVOID OutputBuffer
,
5381 _In_ ULONG OutputBufferLength
,
5382 _In_ ULONG IoControlCode
,
5383 _Out_ PIO_STATUS_BLOCK IoStatus
,
5384 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5385 typedef FAST_IO_DEVICE_CONTROL
*PFAST_IO_DEVICE_CONTROL
;
5387 _Function_class_(FAST_IO_ACQUIRE_FILE
)
5388 _IRQL_requires_same_
5390 (NTAPI FAST_IO_ACQUIRE_FILE
)(
5391 _In_
struct _FILE_OBJECT
*FileObject
);
5392 typedef FAST_IO_ACQUIRE_FILE
*PFAST_IO_ACQUIRE_FILE
;
5394 _Function_class_(FAST_IO_RELEASE_FILE
)
5395 _IRQL_requires_same_
5397 (NTAPI FAST_IO_RELEASE_FILE
)(
5398 _In_
struct _FILE_OBJECT
*FileObject
);
5399 typedef FAST_IO_RELEASE_FILE
*PFAST_IO_RELEASE_FILE
;
5401 _Function_class_(FAST_IO_DETACH_DEVICE
)
5402 _IRQL_requires_same_
5404 (NTAPI FAST_IO_DETACH_DEVICE
)(
5405 _In_
struct _DEVICE_OBJECT
*SourceDevice
,
5406 _In_
struct _DEVICE_OBJECT
*TargetDevice
);
5407 typedef FAST_IO_DETACH_DEVICE
*PFAST_IO_DETACH_DEVICE
;
5409 _Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO
)
5410 _IRQL_requires_same_
5412 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO
)(
5413 _In_
struct _FILE_OBJECT
*FileObject
,
5415 _Out_
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
5416 _Out_
struct _IO_STATUS_BLOCK
*IoStatus
,
5417 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5418 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
;
5420 _Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE
)
5421 _IRQL_requires_same_
5423 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
5424 _In_
struct _FILE_OBJECT
*FileObject
,
5425 _In_ PLARGE_INTEGER EndingOffset
,
5426 _Out_
struct _ERESOURCE
**ResourceToRelease
,
5427 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5428 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
;
5430 _Function_class_(FAST_IO_MDL_READ
)
5431 _IRQL_requires_same_
5433 (NTAPI FAST_IO_MDL_READ
)(
5434 _In_
struct _FILE_OBJECT
*FileObject
,
5435 _In_ PLARGE_INTEGER FileOffset
,
5438 _Out_ PMDL
*MdlChain
,
5439 _Out_ PIO_STATUS_BLOCK IoStatus
,
5440 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5441 typedef FAST_IO_MDL_READ
*PFAST_IO_MDL_READ
;
5443 _Function_class_(FAST_IO_MDL_READ_COMPLETE
)
5444 _IRQL_requires_same_
5446 (NTAPI FAST_IO_MDL_READ_COMPLETE
)(
5447 _In_
struct _FILE_OBJECT
*FileObject
,
5449 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5450 typedef FAST_IO_MDL_READ_COMPLETE
*PFAST_IO_MDL_READ_COMPLETE
;
5452 _Function_class_(FAST_IO_PREPARE_MDL_WRITE
)
5453 _IRQL_requires_same_
5455 (NTAPI FAST_IO_PREPARE_MDL_WRITE
)(
5456 _In_
struct _FILE_OBJECT
*FileObject
,
5457 _In_ PLARGE_INTEGER FileOffset
,
5460 _Out_ PMDL
*MdlChain
,
5461 _Out_ PIO_STATUS_BLOCK IoStatus
,
5462 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5463 typedef FAST_IO_PREPARE_MDL_WRITE
*PFAST_IO_PREPARE_MDL_WRITE
;
5465 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE
)
5466 _IRQL_requires_same_
5468 (NTAPI FAST_IO_MDL_WRITE_COMPLETE
)(
5469 _In_
struct _FILE_OBJECT
*FileObject
,
5470 _In_ PLARGE_INTEGER FileOffset
,
5472 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5473 typedef FAST_IO_MDL_WRITE_COMPLETE
*PFAST_IO_MDL_WRITE_COMPLETE
;
5475 _Function_class_(FAST_IO_READ_COMPRESSED
)
5476 _IRQL_requires_same_
5478 (NTAPI FAST_IO_READ_COMPRESSED
)(
5479 _In_
struct _FILE_OBJECT
*FileObject
,
5480 _In_ PLARGE_INTEGER FileOffset
,
5484 _Out_ PMDL
*MdlChain
,
5485 _Out_ PIO_STATUS_BLOCK IoStatus
,
5486 _Out_
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
5487 _In_ ULONG CompressedDataInfoLength
,
5488 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5489 typedef FAST_IO_READ_COMPRESSED
*PFAST_IO_READ_COMPRESSED
;
5491 _Function_class_(FAST_IO_WRITE_COMPRESSED
)
5492 _IRQL_requires_same_
5494 (NTAPI FAST_IO_WRITE_COMPRESSED
)(
5495 _In_
struct _FILE_OBJECT
*FileObject
,
5496 _In_ PLARGE_INTEGER FileOffset
,
5500 _Out_ PMDL
*MdlChain
,
5501 _Out_ PIO_STATUS_BLOCK IoStatus
,
5502 _In_
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
5503 _In_ ULONG CompressedDataInfoLength
,
5504 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5505 typedef FAST_IO_WRITE_COMPRESSED
*PFAST_IO_WRITE_COMPRESSED
;
5507 _Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED
)
5508 _IRQL_requires_same_
5510 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
5511 _In_
struct _FILE_OBJECT
*FileObject
,
5513 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5514 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
;
5516 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)
5517 _IRQL_requires_same_
5519 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
5520 _In_
struct _FILE_OBJECT
*FileObject
,
5521 _In_ PLARGE_INTEGER FileOffset
,
5523 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5524 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
;
5526 _Function_class_(FAST_IO_QUERY_OPEN
)
5527 _IRQL_requires_same_
5529 (NTAPI FAST_IO_QUERY_OPEN
)(
5530 _Inout_
struct _IRP
*Irp
,
5531 _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
5532 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5533 typedef FAST_IO_QUERY_OPEN
*PFAST_IO_QUERY_OPEN
;
5535 _Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE
)
5536 _IRQL_requires_same_
5538 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE
)(
5539 _In_
struct _FILE_OBJECT
*FileObject
,
5540 _In_
struct _ERESOURCE
*ResourceToRelease
,
5541 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5542 typedef FAST_IO_RELEASE_FOR_MOD_WRITE
*PFAST_IO_RELEASE_FOR_MOD_WRITE
;
5544 _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH
)
5545 _IRQL_requires_same_
5547 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH
)(
5548 _In_
struct _FILE_OBJECT
*FileObject
,
5549 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5550 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
;
5552 _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH
)
5553 _IRQL_requires_same_
5555 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH
)(
5556 _In_
struct _FILE_OBJECT
*FileObject
,
5557 _In_
struct _DEVICE_OBJECT
*DeviceObject
);
5558 typedef FAST_IO_RELEASE_FOR_CCFLUSH
*PFAST_IO_RELEASE_FOR_CCFLUSH
;
5560 typedef struct _FAST_IO_DISPATCH
{
5561 ULONG SizeOfFastIoDispatch
;
5562 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
5563 PFAST_IO_READ FastIoRead
;
5564 PFAST_IO_WRITE FastIoWrite
;
5565 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
5566 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
5567 PFAST_IO_LOCK FastIoLock
;
5568 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
5569 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
5570 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
5571 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
5572 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
5573 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
5574 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
5575 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
5576 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
5577 PFAST_IO_MDL_READ MdlRead
;
5578 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
5579 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
5580 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
5581 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
5582 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
5583 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
5584 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
5585 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
5586 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
5587 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
5588 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
5589 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
5591 typedef struct _SECTION_OBJECT_POINTERS
{
5592 PVOID DataSectionObject
;
5593 PVOID SharedCacheMap
;
5594 PVOID ImageSectionObject
;
5595 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
5597 typedef struct _IO_COMPLETION_CONTEXT
{
5600 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
5602 /* FILE_OBJECT.Flags */
5603 #define FO_FILE_OPEN 0x00000001
5604 #define FO_SYNCHRONOUS_IO 0x00000002
5605 #define FO_ALERTABLE_IO 0x00000004
5606 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
5607 #define FO_WRITE_THROUGH 0x00000010
5608 #define FO_SEQUENTIAL_ONLY 0x00000020
5609 #define FO_CACHE_SUPPORTED 0x00000040
5610 #define FO_NAMED_PIPE 0x00000080
5611 #define FO_STREAM_FILE 0x00000100
5612 #define FO_MAILSLOT 0x00000200
5613 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
5614 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
5615 #define FO_DIRECT_DEVICE_OPEN 0x00000800
5616 #define FO_FILE_MODIFIED 0x00001000
5617 #define FO_FILE_SIZE_CHANGED 0x00002000
5618 #define FO_CLEANUP_COMPLETE 0x00004000
5619 #define FO_TEMPORARY_FILE 0x00008000
5620 #define FO_DELETE_ON_CLOSE 0x00010000
5621 #define FO_OPENED_CASE_SENSITIVE 0x00020000
5622 #define FO_HANDLE_CREATED 0x00040000
5623 #define FO_FILE_FAST_IO_READ 0x00080000
5624 #define FO_RANDOM_ACCESS 0x00100000
5625 #define FO_FILE_OPEN_CANCELLED 0x00200000
5626 #define FO_VOLUME_OPEN 0x00400000
5627 #define FO_REMOTE_ORIGIN 0x01000000
5628 #define FO_DISALLOW_EXCLUSIVE 0x02000000
5629 #define FO_SKIP_COMPLETION_PORT 0x02000000
5630 #define FO_SKIP_SET_EVENT 0x04000000
5631 #define FO_SKIP_SET_FAST_IO 0x08000000
5632 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
5635 #define VPB_MOUNTED 0x0001
5636 #define VPB_LOCKED 0x0002
5637 #define VPB_PERSISTENT 0x0004
5638 #define VPB_REMOVE_PENDING 0x0008
5639 #define VPB_RAW_MOUNT 0x0010
5640 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
5644 #define SL_FORCE_ACCESS_CHECK 0x01
5645 #define SL_OPEN_PAGING_FILE 0x02
5646 #define SL_OPEN_TARGET_DIRECTORY 0x04
5647 #define SL_STOP_ON_SYMLINK 0x08
5648 #define SL_CASE_SENSITIVE 0x80
5650 #define SL_KEY_SPECIFIED 0x01
5651 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
5652 #define SL_WRITE_THROUGH 0x04
5653 #define SL_FT_SEQUENTIAL_WRITE 0x08
5654 #define SL_FORCE_DIRECT_WRITE 0x10
5655 #define SL_REALTIME_STREAM 0x20
5657 #define SL_READ_ACCESS_GRANTED 0x01
5658 #define SL_WRITE_ACCESS_GRANTED 0x04
5660 #define SL_FAIL_IMMEDIATELY 0x01
5661 #define SL_EXCLUSIVE_LOCK 0x02
5663 #define SL_RESTART_SCAN 0x01
5664 #define SL_RETURN_SINGLE_ENTRY 0x02
5665 #define SL_INDEX_SPECIFIED 0x04
5667 #define SL_WATCH_TREE 0x01
5669 #define SL_ALLOW_RAW_MOUNT 0x01
5671 #define CTL_CODE(DeviceType, Function, Method, Access) \
5672 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
5674 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
5676 #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
5678 #define IRP_NOCACHE 0x00000001
5679 #define IRP_PAGING_IO 0x00000002
5680 #define IRP_MOUNT_COMPLETION 0x00000002
5681 #define IRP_SYNCHRONOUS_API 0x00000004
5682 #define IRP_ASSOCIATED_IRP 0x00000008
5683 #define IRP_BUFFERED_IO 0x00000010
5684 #define IRP_DEALLOCATE_BUFFER 0x00000020
5685 #define IRP_INPUT_OPERATION 0x00000040
5686 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
5687 #define IRP_CREATE_OPERATION 0x00000080
5688 #define IRP_READ_OPERATION 0x00000100
5689 #define IRP_WRITE_OPERATION 0x00000200
5690 #define IRP_CLOSE_OPERATION 0x00000400
5691 #define IRP_DEFER_IO_COMPLETION 0x00000800
5692 #define IRP_OB_QUERY_NAME 0x00001000
5693 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
5694 /* The following 2 are missing in latest WDK */
5695 #define IRP_RETRY_IO_COMPLETION 0x00004000
5696 #define IRP_CLASS_CACHE_OPERATION 0x00008000
5698 #define IRP_QUOTA_CHARGED 0x01
5699 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
5700 #define IRP_ALLOCATED_FIXED_SIZE 0x04
5701 #define IRP_LOOKASIDE_ALLOCATION 0x08
5704 ** IRP function codes
5707 #define IRP_MJ_CREATE 0x00
5708 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
5709 #define IRP_MJ_CLOSE 0x02
5710 #define IRP_MJ_READ 0x03
5711 #define IRP_MJ_WRITE 0x04
5712 #define IRP_MJ_QUERY_INFORMATION 0x05
5713 #define IRP_MJ_SET_INFORMATION 0x06
5714 #define IRP_MJ_QUERY_EA 0x07
5715 #define IRP_MJ_SET_EA 0x08
5716 #define IRP_MJ_FLUSH_BUFFERS 0x09
5717 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
5718 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
5719 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
5720 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
5721 #define IRP_MJ_DEVICE_CONTROL 0x0e
5722 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
5723 #define IRP_MJ_SCSI 0x0f
5724 #define IRP_MJ_SHUTDOWN 0x10
5725 #define IRP_MJ_LOCK_CONTROL 0x11
5726 #define IRP_MJ_CLEANUP 0x12
5727 #define IRP_MJ_CREATE_MAILSLOT 0x13
5728 #define IRP_MJ_QUERY_SECURITY 0x14
5729 #define IRP_MJ_SET_SECURITY 0x15
5730 #define IRP_MJ_POWER 0x16
5731 #define IRP_MJ_SYSTEM_CONTROL 0x17
5732 #define IRP_MJ_DEVICE_CHANGE 0x18
5733 #define IRP_MJ_QUERY_QUOTA 0x19
5734 #define IRP_MJ_SET_QUOTA 0x1a
5735 #define IRP_MJ_PNP 0x1b
5736 #define IRP_MJ_PNP_POWER 0x1b
5737 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
5739 #define IRP_MN_SCSI_CLASS 0x01
5741 #define IRP_MN_START_DEVICE 0x00
5742 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
5743 #define IRP_MN_REMOVE_DEVICE 0x02
5744 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
5745 #define IRP_MN_STOP_DEVICE 0x04
5746 #define IRP_MN_QUERY_STOP_DEVICE 0x05
5747 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
5749 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
5750 #define IRP_MN_QUERY_INTERFACE 0x08
5751 #define IRP_MN_QUERY_CAPABILITIES 0x09
5752 #define IRP_MN_QUERY_RESOURCES 0x0A
5753 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
5754 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
5755 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
5757 #define IRP_MN_READ_CONFIG 0x0F
5758 #define IRP_MN_WRITE_CONFIG 0x10
5759 #define IRP_MN_EJECT 0x11
5760 #define IRP_MN_SET_LOCK 0x12
5761 #define IRP_MN_QUERY_ID 0x13
5762 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
5763 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
5764 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
5765 #define IRP_MN_SURPRISE_REMOVAL 0x17
5766 #if (NTDDI_VERSION >= NTDDI_WIN7)
5767 #define IRP_MN_DEVICE_ENUMERATED 0x19
5770 #define IRP_MN_WAIT_WAKE 0x00
5771 #define IRP_MN_POWER_SEQUENCE 0x01
5772 #define IRP_MN_SET_POWER 0x02
5773 #define IRP_MN_QUERY_POWER 0x03
5775 #define IRP_MN_QUERY_ALL_DATA 0x00
5776 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
5777 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
5778 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
5779 #define IRP_MN_ENABLE_EVENTS 0x04
5780 #define IRP_MN_DISABLE_EVENTS 0x05
5781 #define IRP_MN_ENABLE_COLLECTION 0x06
5782 #define IRP_MN_DISABLE_COLLECTION 0x07
5783 #define IRP_MN_REGINFO 0x08
5784 #define IRP_MN_EXECUTE_METHOD 0x09
5786 #define IRP_MN_REGINFO_EX 0x0b
5788 typedef struct _FILE_OBJECT
{
5791 PDEVICE_OBJECT DeviceObject
;
5795 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
5796 PVOID PrivateCacheMap
;
5797 NTSTATUS FinalStatus
;
5798 struct _FILE_OBJECT
*RelatedFileObject
;
5799 BOOLEAN LockOperation
;
5800 BOOLEAN DeletePending
;
5802 BOOLEAN WriteAccess
;
5803 BOOLEAN DeleteAccess
;
5805 BOOLEAN SharedWrite
;
5806 BOOLEAN SharedDelete
;
5808 UNICODE_STRING FileName
;
5809 LARGE_INTEGER CurrentByteOffset
;
5810 volatile ULONG Waiters
;
5811 volatile ULONG Busy
;
5815 volatile PIO_COMPLETION_CONTEXT CompletionContext
;
5816 KSPIN_LOCK IrpListLock
;
5818 volatile PVOID FileObjectExtension
;
5819 } FILE_OBJECT
, *PFILE_OBJECT
;
5821 typedef struct _IO_ERROR_LOG_PACKET
{
5822 UCHAR MajorFunctionCode
;
5824 USHORT DumpDataSize
;
5825 USHORT NumberOfStrings
;
5826 USHORT StringOffset
;
5827 USHORT EventCategory
;
5829 ULONG UniqueErrorValue
;
5830 NTSTATUS FinalStatus
;
5831 ULONG SequenceNumber
;
5832 ULONG IoControlCode
;
5833 LARGE_INTEGER DeviceOffset
;
5835 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
5837 typedef struct _IO_ERROR_LOG_MESSAGE
{
5840 USHORT DriverNameLength
;
5841 LARGE_INTEGER TimeStamp
;
5842 ULONG DriverNameOffset
;
5843 IO_ERROR_LOG_PACKET EntryData
;
5844 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
5846 #define ERROR_LOG_LIMIT_SIZE 240
5847 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
5848 sizeof(IO_ERROR_LOG_PACKET) + \
5849 (sizeof(WCHAR) * 40))
5850 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
5851 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5852 #define IO_ERROR_LOG_MESSAGE_LENGTH \
5853 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
5854 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
5855 PORT_MAXIMUM_MESSAGE_LENGTH)
5856 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
5857 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
5860 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
5862 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
5865 typedef enum _DMA_WIDTH
{
5870 } DMA_WIDTH
, *PDMA_WIDTH
;
5872 typedef enum _DMA_SPEED
{
5879 } DMA_SPEED
, *PDMA_SPEED
;
5881 /* DEVICE_DESCRIPTION.Version */
5883 #define DEVICE_DESCRIPTION_VERSION 0x0000
5884 #define DEVICE_DESCRIPTION_VERSION1 0x0001
5885 #define DEVICE_DESCRIPTION_VERSION2 0x0002
5887 typedef struct _DEVICE_DESCRIPTION
{
5890 BOOLEAN ScatterGather
;
5892 BOOLEAN AutoInitialize
;
5893 BOOLEAN Dma32BitAddresses
;
5894 BOOLEAN IgnoreCount
;
5896 BOOLEAN Dma64BitAddresses
;
5899 INTERFACE_TYPE InterfaceType
;
5902 ULONG MaximumLength
;
5904 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
5906 typedef enum _DEVICE_RELATION_TYPE
{
5911 TargetDeviceRelation
,
5914 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
5916 typedef struct _DEVICE_RELATIONS
{
5918 PDEVICE_OBJECT Objects
[1];
5919 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
5921 typedef struct _DEVOBJ_EXTENSION
{
5924 PDEVICE_OBJECT DeviceObject
;
5925 } DEVOBJ_EXTENSION
, *PDEVOBJ_EXTENSION
;
5927 typedef struct _SCATTER_GATHER_ELEMENT
{
5928 PHYSICAL_ADDRESS Address
;
5931 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
5933 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
5935 #if defined(_MSC_VER)
5936 #if _MSC_VER >= 1200
5937 #pragma warning(push)
5939 #pragma warning(disable:4200)
5940 #endif /* _MSC_VER */
5942 typedef struct _SCATTER_GATHER_LIST
{
5943 ULONG NumberOfElements
;
5945 SCATTER_GATHER_ELEMENT Elements
[1];
5946 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
5948 #if defined(_MSC_VER)
5949 #if _MSC_VER >= 1200
5950 #pragma warning(pop)
5952 #pragma warning(default:4200)
5954 #endif /* _MSC_VER */
5956 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
5958 struct _SCATTER_GATHER_LIST
;
5959 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
5961 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
5963 _Function_class_(DRIVER_ADD_DEVICE
)
5964 _IRQL_requires_(PASSIVE_LEVEL
)
5965 _IRQL_requires_same_
5966 _When_(return>=0, _Kernel_clear_do_init_(__yes
))
5968 (NTAPI DRIVER_ADD_DEVICE
)(
5969 _In_
struct _DRIVER_OBJECT
*DriverObject
,
5970 _In_
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
5971 typedef DRIVER_ADD_DEVICE
*PDRIVER_ADD_DEVICE
;
5973 typedef struct _DRIVER_EXTENSION
{
5974 struct _DRIVER_OBJECT
*DriverObject
;
5975 PDRIVER_ADD_DEVICE AddDevice
;
5977 UNICODE_STRING ServiceKeyName
;
5978 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
5980 #define DRVO_UNLOAD_INVOKED 0x00000001
5981 #define DRVO_LEGACY_DRIVER 0x00000002
5982 #define DRVO_BUILTIN_DRIVER 0x00000004
5984 _Function_class_(DRIVER_INITIALIZE
)
5985 _IRQL_requires_same_
5987 (NTAPI DRIVER_INITIALIZE
)(
5988 _In_
struct _DRIVER_OBJECT
*DriverObject
,
5989 _In_ PUNICODE_STRING RegistryPath
);
5990 typedef DRIVER_INITIALIZE
*PDRIVER_INITIALIZE
;
5992 _Function_class_(DRIVER_STARTIO
)
5993 _IRQL_always_function_min_(DISPATCH_LEVEL
)
5994 _IRQL_requires_(DISPATCH_LEVEL
)
5995 _IRQL_requires_same_
5997 (NTAPI DRIVER_STARTIO
)(
5998 _Inout_
struct _DEVICE_OBJECT
*DeviceObject
,
5999 _Inout_
struct _IRP
*Irp
);
6000 typedef DRIVER_STARTIO
*PDRIVER_STARTIO
;
6002 _Function_class_(DRIVER_UNLOAD
)
6003 _IRQL_requires_(PASSIVE_LEVEL
)
6004 _IRQL_requires_same_
6006 (NTAPI DRIVER_UNLOAD
)(
6007 _In_
struct _DRIVER_OBJECT
*DriverObject
);
6008 typedef DRIVER_UNLOAD
*PDRIVER_UNLOAD
;
6010 _Function_class_(DRIVER_DISPATCH
)
6011 _IRQL_requires_(PASSIVE_LEVEL
)
6012 _IRQL_requires_same_
6014 (NTAPI DRIVER_DISPATCH
)(
6015 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6016 _Inout_
struct _IRP
*Irp
);
6017 typedef DRIVER_DISPATCH
*PDRIVER_DISPATCH
;
6019 typedef struct _DRIVER_OBJECT
{
6022 PDEVICE_OBJECT DeviceObject
;
6026 PVOID DriverSection
;
6027 PDRIVER_EXTENSION DriverExtension
;
6028 UNICODE_STRING DriverName
;
6029 PUNICODE_STRING HardwareDatabase
;
6030 struct _FAST_IO_DISPATCH
*FastIoDispatch
;
6031 PDRIVER_INITIALIZE DriverInit
;
6032 PDRIVER_STARTIO DriverStartIo
;
6033 PDRIVER_UNLOAD DriverUnload
;
6034 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
6035 } DRIVER_OBJECT
, *PDRIVER_OBJECT
;
6037 typedef struct _DMA_ADAPTER
{
6040 struct _DMA_OPERATIONS
* DmaOperations
;
6041 } DMA_ADAPTER
, *PDMA_ADAPTER
;
6044 (NTAPI
*PPUT_DMA_ADAPTER
)(
6045 PDMA_ADAPTER DmaAdapter
);
6048 (NTAPI
*PALLOCATE_COMMON_BUFFER
)(
6049 _In_ PDMA_ADAPTER DmaAdapter
,
6051 _Out_ PPHYSICAL_ADDRESS LogicalAddress
,
6052 _In_ BOOLEAN CacheEnabled
);
6055 (NTAPI
*PFREE_COMMON_BUFFER
)(
6056 _In_ PDMA_ADAPTER DmaAdapter
,
6058 _In_ PHYSICAL_ADDRESS LogicalAddress
,
6059 _In_ PVOID VirtualAddress
,
6060 _In_ BOOLEAN CacheEnabled
);
6063 (NTAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
6064 _In_ PDMA_ADAPTER DmaAdapter
,
6065 _In_ PDEVICE_OBJECT DeviceObject
,
6066 _In_ ULONG NumberOfMapRegisters
,
6067 _In_ PDRIVER_CONTROL ExecutionRoutine
,
6068 _In_ PVOID Context
);
6071 (NTAPI
*PFLUSH_ADAPTER_BUFFERS
)(
6072 _In_ PDMA_ADAPTER DmaAdapter
,
6074 _In_ PVOID MapRegisterBase
,
6075 _In_ PVOID CurrentVa
,
6077 _In_ BOOLEAN WriteToDevice
);
6080 (NTAPI
*PFREE_ADAPTER_CHANNEL
)(
6081 _In_ PDMA_ADAPTER DmaAdapter
);
6084 (NTAPI
*PFREE_MAP_REGISTERS
)(
6085 _In_ PDMA_ADAPTER DmaAdapter
,
6086 PVOID MapRegisterBase
,
6087 ULONG NumberOfMapRegisters
);
6089 typedef PHYSICAL_ADDRESS
6090 (NTAPI
*PMAP_TRANSFER
)(
6091 _In_ PDMA_ADAPTER DmaAdapter
,
6093 _In_ PVOID MapRegisterBase
,
6094 _In_ PVOID CurrentVa
,
6095 _Inout_ PULONG Length
,
6096 _In_ BOOLEAN WriteToDevice
);
6099 (NTAPI
*PGET_DMA_ALIGNMENT
)(
6100 _In_ PDMA_ADAPTER DmaAdapter
);
6103 (NTAPI
*PREAD_DMA_COUNTER
)(
6104 _In_ PDMA_ADAPTER DmaAdapter
);
6106 _Function_class_(DRIVER_LIST_CONTROL
)
6107 _IRQL_requires_same_
6109 (NTAPI DRIVER_LIST_CONTROL
)(
6110 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6111 _In_
struct _IRP
*Irp
,
6112 _In_
struct _SCATTER_GATHER_LIST
*ScatterGather
,
6113 _In_ PVOID Context
);
6114 typedef DRIVER_LIST_CONTROL
*PDRIVER_LIST_CONTROL
;
6117 (NTAPI
*PGET_SCATTER_GATHER_LIST
)(
6118 _In_ PDMA_ADAPTER DmaAdapter
,
6119 _In_ PDEVICE_OBJECT DeviceObject
,
6121 _In_ PVOID CurrentVa
,
6123 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine
,
6125 _In_ BOOLEAN WriteToDevice
);
6128 (NTAPI
*PPUT_SCATTER_GATHER_LIST
)(
6129 _In_ PDMA_ADAPTER DmaAdapter
,
6130 _In_ PSCATTER_GATHER_LIST ScatterGather
,
6131 _In_ BOOLEAN WriteToDevice
);
6134 (NTAPI
*PCALCULATE_SCATTER_GATHER_LIST_SIZE
)(
6135 _In_ PDMA_ADAPTER DmaAdapter
,
6136 _In_ PMDL Mdl OPTIONAL
,
6137 _In_ PVOID CurrentVa
,
6139 _Out_ PULONG ScatterGatherListSize
,
6140 _Out_ OPTIONAL PULONG pNumberOfMapRegisters
);
6143 (NTAPI
*PBUILD_SCATTER_GATHER_LIST
)(
6144 _In_ PDMA_ADAPTER DmaAdapter
,
6145 _In_ PDEVICE_OBJECT DeviceObject
,
6147 _In_ PVOID CurrentVa
,
6149 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine
,
6151 _In_ BOOLEAN WriteToDevice
,
6152 _In_ PVOID ScatterGatherBuffer
,
6153 _In_ ULONG ScatterGatherLength
);
6156 (NTAPI
*PBUILD_MDL_FROM_SCATTER_GATHER_LIST
)(
6157 _In_ PDMA_ADAPTER DmaAdapter
,
6158 _In_ PSCATTER_GATHER_LIST ScatterGather
,
6159 _In_ PMDL OriginalMdl
,
6160 _Out_ PMDL
*TargetMdl
);
6162 typedef struct _DMA_OPERATIONS
{
6164 PPUT_DMA_ADAPTER PutDmaAdapter
;
6165 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
;
6166 PFREE_COMMON_BUFFER FreeCommonBuffer
;
6167 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
6168 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
6169 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
6170 PFREE_MAP_REGISTERS FreeMapRegisters
;
6171 PMAP_TRANSFER MapTransfer
;
6172 PGET_DMA_ALIGNMENT GetDmaAlignment
;
6173 PREAD_DMA_COUNTER ReadDmaCounter
;
6174 PGET_SCATTER_GATHER_LIST GetScatterGatherList
;
6175 PPUT_SCATTER_GATHER_LIST PutScatterGatherList
;
6176 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList
;
6177 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList
;
6178 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList
;
6179 } DMA_OPERATIONS
, *PDMA_OPERATIONS
;
6181 typedef struct _IO_RESOURCE_DESCRIPTOR
{
6184 UCHAR ShareDisposition
;
6192 PHYSICAL_ADDRESS MinimumAddress
;
6193 PHYSICAL_ADDRESS MaximumAddress
;
6198 PHYSICAL_ADDRESS MinimumAddress
;
6199 PHYSICAL_ADDRESS MaximumAddress
;
6202 ULONG MinimumVector
;
6203 ULONG MaximumVector
;
6206 ULONG MinimumChannel
;
6207 ULONG MaximumChannel
;
6212 PHYSICAL_ADDRESS MinimumAddress
;
6213 PHYSICAL_ADDRESS MaximumAddress
;
6230 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
6232 typedef struct _IO_RESOURCE_LIST
{
6236 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
6237 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
6239 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
6241 INTERFACE_TYPE InterfaceType
;
6245 ULONG AlternativeLists
;
6246 IO_RESOURCE_LIST List
[1];
6247 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
6249 _Function_class_(DRIVER_CANCEL
)
6250 _Requires_lock_held_(_Global_cancel_spin_lock_
)
6251 _Releases_lock_(_Global_cancel_spin_lock_
)
6252 _IRQL_requires_min_(DISPATCH_LEVEL
)
6253 _IRQL_requires_(DISPATCH_LEVEL
)
6255 (NTAPI DRIVER_CANCEL
)(
6256 _Inout_
struct _DEVICE_OBJECT
*DeviceObject
,
6257 _Inout_ _IRQL_uses_cancel_
struct _IRP
*Irp
);
6258 typedef DRIVER_CANCEL
*PDRIVER_CANCEL
;
6260 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT
) _IRP
{
6263 struct _MDL
*MdlAddress
;
6266 struct _IRP
*MasterIrp
;
6267 volatile LONG IrpCount
;
6270 LIST_ENTRY ThreadListEntry
;
6271 IO_STATUS_BLOCK IoStatus
;
6272 KPROCESSOR_MODE RequestorMode
;
6273 BOOLEAN PendingReturned
;
6275 CHAR CurrentLocation
;
6278 CCHAR ApcEnvironment
;
6279 UCHAR AllocationFlags
;
6280 PIO_STATUS_BLOCK UserIosb
;
6284 _ANONYMOUS_UNION
union {
6285 PIO_APC_ROUTINE UserApcRoutine
;
6286 PVOID IssuingProcess
;
6288 PVOID UserApcContext
;
6289 } AsynchronousParameters
;
6290 LARGE_INTEGER AllocationSize
;
6292 volatile PDRIVER_CANCEL CancelRoutine
;
6296 _ANONYMOUS_UNION
union {
6297 KDEVICE_QUEUE_ENTRY DeviceQueueEntry
;
6298 _ANONYMOUS_STRUCT
struct {
6299 PVOID DriverContext
[4];
6303 PCHAR AuxiliaryBuffer
;
6304 _ANONYMOUS_STRUCT
struct {
6305 LIST_ENTRY ListEntry
;
6306 _ANONYMOUS_UNION
union {
6307 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
6311 struct _FILE_OBJECT
*OriginalFileObject
;
6314 PVOID CompletionKey
;
6318 typedef enum _IO_PAGING_PRIORITY
{
6319 IoPagingPriorityInvalid
,
6320 IoPagingPriorityNormal
,
6321 IoPagingPriorityHigh
,
6322 IoPagingPriorityReserved1
,
6323 IoPagingPriorityReserved2
6324 } IO_PAGING_PRIORITY
;
6326 _Function_class_(IO_COMPLETION_ROUTINE
)
6327 _IRQL_requires_same_
6329 (NTAPI IO_COMPLETION_ROUTINE
)(
6330 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6331 _In_
struct _IRP
*Irp
,
6332 _In_opt_ PVOID Context
);
6333 typedef IO_COMPLETION_ROUTINE
*PIO_COMPLETION_ROUTINE
;
6335 _Function_class_(IO_DPC_ROUTINE
)
6336 _IRQL_always_function_min_(DISPATCH_LEVEL
)
6337 _IRQL_requires_(DISPATCH_LEVEL
)
6338 _IRQL_requires_same_
6340 (NTAPI IO_DPC_ROUTINE
)(
6341 _In_
struct _KDPC
*Dpc
,
6342 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6343 _Inout_
struct _IRP
*Irp
,
6344 _In_opt_ PVOID Context
);
6345 typedef IO_DPC_ROUTINE
*PIO_DPC_ROUTINE
;
6348 (NTAPI
*PMM_DLL_INITIALIZE
)(
6349 _In_ PUNICODE_STRING RegistryPath
);
6352 (NTAPI
*PMM_DLL_UNLOAD
)(
6355 _Function_class_(IO_TIMER_ROUTINE
)
6356 _IRQL_requires_same_
6358 (NTAPI IO_TIMER_ROUTINE
)(
6359 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
6360 _In_opt_ PVOID Context
);
6361 typedef IO_TIMER_ROUTINE
*PIO_TIMER_ROUTINE
;
6363 typedef struct _IO_SECURITY_CONTEXT
{
6364 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
6365 PACCESS_STATE AccessState
;
6366 ACCESS_MASK DesiredAccess
;
6367 ULONG FullCreateOptions
;
6368 } IO_SECURITY_CONTEXT
, *PIO_SECURITY_CONTEXT
;
6372 typedef struct _IO_CSQ_IRP_CONTEXT
{
6375 struct _IO_CSQ
*Csq
;
6376 } IO_CSQ_IRP_CONTEXT
, *PIO_CSQ_IRP_CONTEXT
;
6379 (NTAPI
*PIO_CSQ_INSERT_IRP
)(
6380 _In_
struct _IO_CSQ
*Csq
,
6384 (NTAPI IO_CSQ_INSERT_IRP_EX
)(
6385 _In_
struct _IO_CSQ
*Csq
,
6387 _In_ PVOID InsertContext
);
6388 typedef IO_CSQ_INSERT_IRP_EX
*PIO_CSQ_INSERT_IRP_EX
;
6391 (NTAPI
*PIO_CSQ_REMOVE_IRP
)(
6392 _In_
struct _IO_CSQ
*Csq
,
6396 (NTAPI
*PIO_CSQ_PEEK_NEXT_IRP
)(
6397 _In_
struct _IO_CSQ
*Csq
,
6399 _In_ PVOID PeekContext
);
6402 (NTAPI
*PIO_CSQ_ACQUIRE_LOCK
)(
6403 _In_
struct _IO_CSQ
*Csq
,
6407 (NTAPI
*PIO_CSQ_RELEASE_LOCK
)(
6408 _In_
struct _IO_CSQ
*Csq
,
6412 (NTAPI
*PIO_CSQ_COMPLETE_CANCELED_IRP
)(
6413 _In_
struct _IO_CSQ
*Csq
,
6416 typedef struct _IO_CSQ
{
6418 PIO_CSQ_INSERT_IRP CsqInsertIrp
;
6419 PIO_CSQ_REMOVE_IRP CsqRemoveIrp
;
6420 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
;
6421 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
;
6422 PIO_CSQ_RELEASE_LOCK CsqReleaseLock
;
6423 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
;
6424 PVOID ReservePointer
;
6427 typedef enum _BUS_QUERY_ID_TYPE
{
6429 BusQueryHardwareIDs
,
6430 BusQueryCompatibleIDs
,
6432 BusQueryDeviceSerialNumber
6433 } BUS_QUERY_ID_TYPE
, *PBUS_QUERY_ID_TYPE
;
6435 typedef enum _DEVICE_TEXT_TYPE
{
6436 DeviceTextDescription
,
6437 DeviceTextLocationInformation
6438 } DEVICE_TEXT_TYPE
, *PDEVICE_TEXT_TYPE
;
6441 (NTAPI
*PGPE_SERVICE_ROUTINE
)(
6445 _IRQL_requires_max_(DISPATCH_LEVEL
)
6446 _Must_inspect_result_
6448 (NTAPI
*PGPE_CONNECT_VECTOR
)(
6453 PGPE_SERVICE_ROUTINE
,
6457 _IRQL_requires_max_(DISPATCH_LEVEL
)
6458 _Must_inspect_result_
6460 (NTAPI
*PGPE_DISCONNECT_VECTOR
)(
6463 _IRQL_requires_max_(DISPATCH_LEVEL
)
6464 _Must_inspect_result_
6466 (NTAPI
*PGPE_ENABLE_EVENT
)(
6470 _IRQL_requires_max_(DISPATCH_LEVEL
)
6471 _Must_inspect_result_
6473 (NTAPI
*PGPE_DISABLE_EVENT
)(
6477 _IRQL_requires_max_(DISPATCH_LEVEL
)
6478 _Must_inspect_result_
6480 (NTAPI
*PGPE_CLEAR_STATUS
)(
6485 (NTAPI
*PDEVICE_NOTIFY_CALLBACK
)(
6489 _IRQL_requires_max_(DISPATCH_LEVEL
)
6490 _Must_inspect_result_
6492 (NTAPI
*PREGISTER_FOR_DEVICE_NOTIFICATIONS
)(
6494 PDEVICE_NOTIFY_CALLBACK
,
6497 _IRQL_requires_max_(DISPATCH_LEVEL
)
6499 (NTAPI
*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS
)(
6501 PDEVICE_NOTIFY_CALLBACK
);
6503 typedef struct _ACPI_INTERFACE_STANDARD
{
6507 PINTERFACE_REFERENCE InterfaceReference
;
6508 PINTERFACE_DEREFERENCE InterfaceDereference
;
6509 PGPE_CONNECT_VECTOR GpeConnectVector
;
6510 PGPE_DISCONNECT_VECTOR GpeDisconnectVector
;
6511 PGPE_ENABLE_EVENT GpeEnableEvent
;
6512 PGPE_DISABLE_EVENT GpeDisableEvent
;
6513 PGPE_CLEAR_STATUS GpeClearStatus
;
6514 PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications
;
6515 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications
;
6516 } ACPI_INTERFACE_STANDARD
, *PACPI_INTERFACE_STANDARD
;
6519 (NTAPI
*PGPE_SERVICE_ROUTINE2
)(
6520 PVOID ObjectContext
,
6521 PVOID ServiceContext
);
6523 _IRQL_requires_max_(DISPATCH_LEVEL
)
6524 _Must_inspect_result_
6526 (NTAPI
*PGPE_CONNECT_VECTOR2
)(
6529 KINTERRUPT_MODE Mode
,
6531 PGPE_SERVICE_ROUTINE ServiceRoutine
,
6532 PVOID ServiceContext
,
6533 PVOID
*ObjectContext
);
6535 _IRQL_requires_max_(DISPATCH_LEVEL
)
6536 _Must_inspect_result_
6538 (NTAPI
*PGPE_DISCONNECT_VECTOR2
)(
6540 PVOID ObjectContext
);
6542 _IRQL_requires_max_(DISPATCH_LEVEL
)
6543 _Must_inspect_result_
6545 (NTAPI
*PGPE_ENABLE_EVENT2
)(
6547 PVOID ObjectContext
);
6549 _IRQL_requires_max_(DISPATCH_LEVEL
)
6550 _Must_inspect_result_
6552 (NTAPI
*PGPE_DISABLE_EVENT2
)(
6554 PVOID ObjectContext
);
6556 _IRQL_requires_max_(DISPATCH_LEVEL
)
6557 _Must_inspect_result_
6559 (NTAPI
*PGPE_CLEAR_STATUS2
)(
6561 PVOID ObjectContext
);
6563 _IRQL_requires_max_(DISPATCH_LEVEL
)
6565 (NTAPI
*PDEVICE_NOTIFY_CALLBACK2
)(
6566 PVOID NotificationContext
,
6569 _IRQL_requires_max_(DISPATCH_LEVEL
)
6570 _Must_inspect_result_
6572 (NTAPI
*PREGISTER_FOR_DEVICE_NOTIFICATIONS2
)(
6574 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler
,
6575 PVOID NotificationContext
);
6577 _IRQL_requires_max_(DISPATCH_LEVEL
)
6579 (NTAPI
*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2
)(
6582 typedef struct _ACPI_INTERFACE_STANDARD2
{
6586 PINTERFACE_REFERENCE InterfaceReference
;
6587 PINTERFACE_DEREFERENCE InterfaceDereference
;
6588 PGPE_CONNECT_VECTOR2 GpeConnectVector
;
6589 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector
;
6590 PGPE_ENABLE_EVENT2 GpeEnableEvent
;
6591 PGPE_DISABLE_EVENT2 GpeDisableEvent
;
6592 PGPE_CLEAR_STATUS2 GpeClearStatus
;
6593 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications
;
6594 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications
;
6595 } ACPI_INTERFACE_STANDARD2
, *PACPI_INTERFACE_STANDARD2
;
6597 #if !defined(_AMD64_) && !defined(_IA64_)
6598 #include <pshpack4.h>
6600 typedef struct _IO_STACK_LOCATION
{
6601 UCHAR MajorFunction
;
6602 UCHAR MinorFunction
;
6607 PIO_SECURITY_CONTEXT SecurityContext
;
6609 USHORT POINTER_ALIGNMENT FileAttributes
;
6611 ULONG POINTER_ALIGNMENT EaLength
;
6615 ULONG POINTER_ALIGNMENT Key
;
6616 LARGE_INTEGER ByteOffset
;
6620 ULONG POINTER_ALIGNMENT Key
;
6621 LARGE_INTEGER ByteOffset
;
6625 PUNICODE_STRING FileName
;
6626 FILE_INFORMATION_CLASS FileInformationClass
;
6631 ULONG CompletionFilter
;
6635 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
6639 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
6640 PFILE_OBJECT FileObject
;
6641 _ANONYMOUS_UNION
union {
6642 _ANONYMOUS_STRUCT
struct {
6643 BOOLEAN ReplaceIfExists
;
6644 BOOLEAN AdvanceOnly
;
6647 HANDLE DeleteHandle
;
6661 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass
;
6665 FS_INFORMATION_CLASS FsInformationClass
;
6668 ULONG OutputBufferLength
;
6669 ULONG InputBufferLength
;
6670 ULONG FsControlCode
;
6671 PVOID Type3InputBuffer
;
6672 } FileSystemControl
;
6674 PLARGE_INTEGER Length
;
6676 LARGE_INTEGER ByteOffset
;
6679 ULONG OutputBufferLength
;
6680 ULONG POINTER_ALIGNMENT InputBufferLength
;
6681 ULONG POINTER_ALIGNMENT IoControlCode
;
6682 PVOID Type3InputBuffer
;
6685 SECURITY_INFORMATION SecurityInformation
;
6686 ULONG POINTER_ALIGNMENT Length
;
6689 SECURITY_INFORMATION SecurityInformation
;
6690 PSECURITY_DESCRIPTOR SecurityDescriptor
;
6694 PDEVICE_OBJECT DeviceObject
;
6698 PDEVICE_OBJECT DeviceObject
;
6701 struct _SCSI_REQUEST_BLOCK
*Srb
;
6706 struct _FILE_GET_QUOTA_INFORMATION
*SidList
;
6707 ULONG SidListLength
;
6713 DEVICE_RELATION_TYPE Type
;
6714 } QueryDeviceRelations
;
6716 CONST GUID
*InterfaceType
;
6719 PINTERFACE Interface
;
6720 PVOID InterfaceSpecificData
;
6723 PDEVICE_CAPABILITIES Capabilities
;
6724 } DeviceCapabilities
;
6726 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList
;
6727 } FilterResourceRequirements
;
6732 ULONG POINTER_ALIGNMENT Length
;
6738 BUS_QUERY_ID_TYPE IdType
;
6741 DEVICE_TEXT_TYPE DeviceTextType
;
6742 LCID POINTER_ALIGNMENT LocaleId
;
6746 BOOLEAN Reserved
[3];
6747 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type
;
6748 } UsageNotification
;
6750 SYSTEM_POWER_STATE PowerState
;
6753 PPOWER_SEQUENCE PowerSequence
;
6756 ULONG SystemContext
;
6757 POWER_STATE_TYPE POINTER_ALIGNMENT Type
;
6758 POWER_STATE POINTER_ALIGNMENT State
;
6759 POWER_ACTION POINTER_ALIGNMENT ShutdownType
;
6762 PCM_RESOURCE_LIST AllocatedResources
;
6763 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
6766 ULONG_PTR ProviderId
;
6778 PDEVICE_OBJECT DeviceObject
;
6779 PFILE_OBJECT FileObject
;
6780 PIO_COMPLETION_ROUTINE CompletionRoutine
;
6782 } IO_STACK_LOCATION
, *PIO_STACK_LOCATION
;
6783 #if !defined(_AMD64_) && !defined(_IA64_)
6784 #include <poppack.h>
6787 /* IO_STACK_LOCATION.Control */
6789 #define SL_PENDING_RETURNED 0x01
6790 #define SL_ERROR_RETURNED 0x02
6791 #define SL_INVOKE_ON_CANCEL 0x20
6792 #define SL_INVOKE_ON_SUCCESS 0x40
6793 #define SL_INVOKE_ON_ERROR 0x80
6795 #define METHOD_BUFFERED 0
6796 #define METHOD_IN_DIRECT 1
6797 #define METHOD_OUT_DIRECT 2
6798 #define METHOD_NEITHER 3
6800 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
6801 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
6803 #define FILE_SUPERSEDED 0x00000000
6804 #define FILE_OPENED 0x00000001
6805 #define FILE_CREATED 0x00000002
6806 #define FILE_OVERWRITTEN 0x00000003
6807 #define FILE_EXISTS 0x00000004
6808 #define FILE_DOES_NOT_EXIST 0x00000005
6810 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
6811 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
6813 /* also in winnt.h */
6814 #define FILE_LIST_DIRECTORY 0x00000001
6815 #define FILE_READ_DATA 0x00000001
6816 #define FILE_ADD_FILE 0x00000002
6817 #define FILE_WRITE_DATA 0x00000002
6818 #define FILE_ADD_SUBDIRECTORY 0x00000004
6819 #define FILE_APPEND_DATA 0x00000004
6820 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
6821 #define FILE_READ_EA 0x00000008
6822 #define FILE_WRITE_EA 0x00000010
6823 #define FILE_EXECUTE 0x00000020
6824 #define FILE_TRAVERSE 0x00000020
6825 #define FILE_DELETE_CHILD 0x00000040
6826 #define FILE_READ_ATTRIBUTES 0x00000080
6827 #define FILE_WRITE_ATTRIBUTES 0x00000100
6829 #define FILE_SHARE_READ 0x00000001
6830 #define FILE_SHARE_WRITE 0x00000002
6831 #define FILE_SHARE_DELETE 0x00000004
6832 #define FILE_SHARE_VALID_FLAGS 0x00000007
6834 #define FILE_ATTRIBUTE_READONLY 0x00000001
6835 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
6836 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
6837 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
6838 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
6839 #define FILE_ATTRIBUTE_DEVICE 0x00000040
6840 #define FILE_ATTRIBUTE_NORMAL 0x00000080
6841 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
6842 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
6843 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
6844 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
6845 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
6846 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
6847 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
6848 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
6850 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
6851 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
6853 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
6854 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
6855 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
6856 #define FILE_VALID_SET_FLAGS 0x00000036
6858 #define FILE_SUPERSEDE 0x00000000
6859 #define FILE_OPEN 0x00000001
6860 #define FILE_CREATE 0x00000002
6861 #define FILE_OPEN_IF 0x00000003
6862 #define FILE_OVERWRITE 0x00000004
6863 #define FILE_OVERWRITE_IF 0x00000005
6864 #define FILE_MAXIMUM_DISPOSITION 0x00000005
6866 #define FILE_DIRECTORY_FILE 0x00000001
6867 #define FILE_WRITE_THROUGH 0x00000002
6868 #define FILE_SEQUENTIAL_ONLY 0x00000004
6869 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
6870 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
6871 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
6872 #define FILE_NON_DIRECTORY_FILE 0x00000040
6873 #define FILE_CREATE_TREE_CONNECTION 0x00000080
6874 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
6875 #define FILE_NO_EA_KNOWLEDGE 0x00000200
6876 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
6877 #define FILE_RANDOM_ACCESS 0x00000800
6878 #define FILE_DELETE_ON_CLOSE 0x00001000
6879 #define FILE_OPEN_BY_FILE_ID 0x00002000
6880 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
6881 #define FILE_NO_COMPRESSION 0x00008000
6882 #if (NTDDI_VERSION >= NTDDI_WIN7)
6883 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
6884 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
6885 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
6886 #define FILE_RESERVE_OPFILTER 0x00100000
6887 #define FILE_OPEN_REPARSE_POINT 0x00200000
6888 #define FILE_OPEN_NO_RECALL 0x00400000
6889 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
6891 #define FILE_ANY_ACCESS 0x00000000
6892 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
6893 #define FILE_READ_ACCESS 0x00000001
6894 #define FILE_WRITE_ACCESS 0x00000002
6896 #define FILE_ALL_ACCESS \
6897 (STANDARD_RIGHTS_REQUIRED | \
6901 #define FILE_GENERIC_EXECUTE \
6902 (STANDARD_RIGHTS_EXECUTE | \
6903 FILE_READ_ATTRIBUTES | \
6907 #define FILE_GENERIC_READ \
6908 (STANDARD_RIGHTS_READ | \
6910 FILE_READ_ATTRIBUTES | \
6914 #define FILE_GENERIC_WRITE \
6915 (STANDARD_RIGHTS_WRITE | \
6917 FILE_WRITE_ATTRIBUTES | \
6919 FILE_APPEND_DATA | \
6924 #define WMIREG_ACTION_REGISTER 1
6925 #define WMIREG_ACTION_DEREGISTER 2
6926 #define WMIREG_ACTION_REREGISTER 3
6927 #define WMIREG_ACTION_UPDATE_GUIDS 4
6928 #define WMIREG_ACTION_BLOCK_IRPS 5
6930 #define WMIREGISTER 0
6933 _Function_class_(WMI_NOTIFICATION_CALLBACK
)
6934 _IRQL_requires_same_
6936 (NTAPI FWMI_NOTIFICATION_CALLBACK
)(
6939 typedef FWMI_NOTIFICATION_CALLBACK
*WMI_NOTIFICATION_CALLBACK
;
6944 typedef struct _PCI_SLOT_NUMBER
{
6947 ULONG DeviceNumber
:5;
6948 ULONG FunctionNumber
:3;
6953 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
6955 #define PCI_TYPE0_ADDRESSES 6
6956 #define PCI_TYPE1_ADDRESSES 2
6957 #define PCI_TYPE2_ADDRESSES 5
6959 typedef struct _PCI_COMMON_HEADER
{
6960 PCI_COMMON_HEADER_LAYOUT
6961 } PCI_COMMON_HEADER
, *PPCI_COMMON_HEADER
;
6964 typedef struct _PCI_COMMON_CONFIG
{
6965 PCI_COMMON_HEADER_LAYOUT
6966 UCHAR DeviceSpecific
[192];
6967 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
6969 typedef struct _PCI_COMMON_CONFIG
{
6970 PCI_COMMON_HEADER DUMMYSTRUCTNAME
;
6971 UCHAR DeviceSpecific
[192];
6972 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
6975 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
6977 #define PCI_EXTENDED_CONFIG_LENGTH 0x1000
6979 #define PCI_MAX_DEVICES 32
6980 #define PCI_MAX_FUNCTION 8
6981 #define PCI_MAX_BRIDGE_NUMBER 0xFF
6982 #define PCI_INVALID_VENDORID 0xFFFF
6984 /* PCI_COMMON_CONFIG.HeaderType */
6985 #define PCI_MULTIFUNCTION 0x80
6986 #define PCI_DEVICE_TYPE 0x00
6987 #define PCI_BRIDGE_TYPE 0x01
6988 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
6990 #define PCI_CONFIGURATION_TYPE(PciData) \
6991 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
6993 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
6994 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
6996 /* PCI_COMMON_CONFIG.Command */
6997 #define PCI_ENABLE_IO_SPACE 0x0001
6998 #define PCI_ENABLE_MEMORY_SPACE 0x0002
6999 #define PCI_ENABLE_BUS_MASTER 0x0004
7000 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
7001 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
7002 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
7003 #define PCI_ENABLE_PARITY 0x0040
7004 #define PCI_ENABLE_WAIT_CYCLE 0x0080
7005 #define PCI_ENABLE_SERR 0x0100
7006 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
7007 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
7009 /* PCI_COMMON_CONFIG.Status */
7010 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
7011 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
7012 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
7013 #define PCI_STATUS_UDF_SUPPORTED 0x0040
7014 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
7015 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
7016 #define PCI_STATUS_DEVSEL 0x0600
7017 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
7018 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
7019 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
7020 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
7021 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
7023 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
7025 #define PCI_WHICHSPACE_CONFIG 0x0
7026 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
7028 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
7029 #define PCI_CAPABILITY_ID_AGP 0x02
7030 #define PCI_CAPABILITY_ID_VPD 0x03
7031 #define PCI_CAPABILITY_ID_SLOT_ID 0x04
7032 #define PCI_CAPABILITY_ID_MSI 0x05
7033 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06
7034 #define PCI_CAPABILITY_ID_PCIX 0x07
7035 #define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08
7036 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09
7037 #define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A
7038 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B
7039 #define PCI_CAPABILITY_ID_SHPC 0x0C
7040 #define PCI_CAPABILITY_ID_P2P_SSID 0x0D
7041 #define PCI_CAPABILITY_ID_AGP_TARGET 0x0E
7042 #define PCI_CAPABILITY_ID_SECURE 0x0F
7043 #define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
7044 #define PCI_CAPABILITY_ID_MSIX 0x11
7046 typedef struct _PCI_CAPABILITIES_HEADER
{
7049 } PCI_CAPABILITIES_HEADER
, *PPCI_CAPABILITIES_HEADER
;
7051 typedef struct _PCI_PMC
{
7055 UCHAR DeviceSpecificInitialization
:1;
7057 struct _PM_SUPPORT
{
7067 } PCI_PMC
, *PPCI_PMC
;
7069 typedef struct _PCI_PMCSR
{
7070 USHORT PowerState
:2;
7073 USHORT DataSelect
:4;
7076 } PCI_PMCSR
, *PPCI_PMCSR
;
7078 typedef struct _PCI_PMCSR_BSE
{
7080 UCHAR D3HotSupportsStopClock
:1;
7081 UCHAR BusPowerClockControlEnabled
:1;
7082 } PCI_PMCSR_BSE
, *PPCI_PMCSR_BSE
;
7084 typedef struct _PCI_PM_CAPABILITY
{
7085 PCI_CAPABILITIES_HEADER Header
;
7087 PCI_PMC Capabilities
;
7091 PCI_PMCSR ControlStatus
;
7095 PCI_PMCSR_BSE BridgeSupport
;
7099 } PCI_PM_CAPABILITY
, *PPCI_PM_CAPABILITY
;
7102 PCI_CAPABILITIES_HEADER Header
;
7105 USHORT DataParityErrorRecoveryEnable
:1;
7106 USHORT EnableRelaxedOrdering
:1;
7107 USHORT MaxMemoryReadByteCount
:2;
7108 USHORT MaxOutstandingSplitTransactions
:3;
7115 ULONG FunctionNumber
:3;
7116 ULONG DeviceNumber
:5;
7118 ULONG Device64Bit
:1;
7119 ULONG Capable133MHz
:1;
7120 ULONG SplitCompletionDiscarded
:1;
7121 ULONG UnexpectedSplitCompletion
:1;
7122 ULONG DeviceComplexity
:1;
7123 ULONG DesignedMaxMemoryReadByteCount
:2;
7124 ULONG DesignedMaxOutstandingSplitTransactions
:3;
7125 ULONG DesignedMaxCumulativeReadSize
:3;
7126 ULONG ReceivedSplitCompletionErrorMessage
:1;
7127 ULONG CapablePCIX266
:1;
7128 ULONG CapablePCIX533
:1;
7132 } PCI_X_CAPABILITY
, *PPCI_X_CAPABILITY
;
7134 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001
7135 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002
7136 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003
7137 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004
7138 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005
7139 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006
7140 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007
7141 #define PCI_EXPRESS_MFVC_CAP_ID 0x0008
7142 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009
7143 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A
7144 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010
7146 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER
{
7147 USHORT CapabilityID
;
7150 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER
, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER
;
7152 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY
{
7153 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7154 ULONG LowSerialNumber
;
7155 ULONG HighSerialNumber
;
7156 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY
, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY
;
7158 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS
{
7159 _ANONYMOUS_STRUCT
struct {
7162 ULONG DataLinkProtocolError
:1;
7163 ULONG SurpriseDownError
:1;
7165 ULONG PoisonedTLP
:1;
7166 ULONG FlowControlProtocolError
:1;
7167 ULONG CompletionTimeout
:1;
7168 ULONG CompleterAbort
:1;
7169 ULONG UnexpectedCompletion
:1;
7170 ULONG ReceiverOverflow
:1;
7171 ULONG MalformedTLP
:1;
7173 ULONG UnsupportedRequestError
:1;
7177 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS
, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS
;
7179 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK
{
7180 _ANONYMOUS_STRUCT
struct {
7183 ULONG DataLinkProtocolError
:1;
7184 ULONG SurpriseDownError
:1;
7186 ULONG PoisonedTLP
:1;
7187 ULONG FlowControlProtocolError
:1;
7188 ULONG CompletionTimeout
:1;
7189 ULONG CompleterAbort
:1;
7190 ULONG UnexpectedCompletion
:1;
7191 ULONG ReceiverOverflow
:1;
7192 ULONG MalformedTLP
:1;
7194 ULONG UnsupportedRequestError
:1;
7198 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK
, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK
;
7200 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY
{
7201 _ANONYMOUS_STRUCT
struct {
7204 ULONG DataLinkProtocolError
:1;
7205 ULONG SurpriseDownError
:1;
7207 ULONG PoisonedTLP
:1;
7208 ULONG FlowControlProtocolError
:1;
7209 ULONG CompletionTimeout
:1;
7210 ULONG CompleterAbort
:1;
7211 ULONG UnexpectedCompletion
:1;
7212 ULONG ReceiverOverflow
:1;
7213 ULONG MalformedTLP
:1;
7215 ULONG UnsupportedRequestError
:1;
7219 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY
, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY
;
7221 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS
{
7222 _ANONYMOUS_STRUCT
struct {
7223 ULONG ReceiverError
:1;
7227 ULONG ReplayNumRollover
:1;
7229 ULONG ReplayTimerTimeout
:1;
7230 ULONG AdvisoryNonFatalError
:1;
7234 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS
, *PPCI_CORRECTABLE_ERROR_STATUS
;
7236 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK
{
7237 _ANONYMOUS_STRUCT
struct {
7238 ULONG ReceiverError
:1;
7242 ULONG ReplayNumRollover
:1;
7244 ULONG ReplayTimerTimeout
:1;
7245 ULONG AdvisoryNonFatalError
:1;
7249 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK
, *PPCI_CORRECTABLE_ERROR_MASK
;
7251 typedef union _PCI_EXPRESS_AER_CAPABILITIES
{
7252 _ANONYMOUS_STRUCT
struct {
7253 ULONG FirstErrorPointer
:5;
7254 ULONG ECRCGenerationCapable
:1;
7255 ULONG ECRCGenerationEnable
:1;
7256 ULONG ECRCCheckCapable
:1;
7257 ULONG ECRCCheckEnable
:1;
7261 } PCI_EXPRESS_AER_CAPABILITIES
, *PPCI_EXPRESS_AER_CAPABILITIES
;
7263 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND
{
7264 _ANONYMOUS_STRUCT
struct {
7265 ULONG CorrectableErrorReportingEnable
:1;
7266 ULONG NonFatalErrorReportingEnable
:1;
7267 ULONG FatalErrorReportingEnable
:1;
7271 } PCI_EXPRESS_ROOT_ERROR_COMMAND
, *PPCI_EXPRESS_ROOT_ERROR_COMMAND
;
7273 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS
{
7274 _ANONYMOUS_STRUCT
struct {
7275 ULONG CorrectableErrorReceived
:1;
7276 ULONG MultipleCorrectableErrorsReceived
:1;
7277 ULONG UncorrectableErrorReceived
:1;
7278 ULONG MultipleUncorrectableErrorsReceived
:1;
7279 ULONG FirstUncorrectableFatal
:1;
7280 ULONG NonFatalErrorMessagesReceived
:1;
7281 ULONG FatalErrorMessagesReceived
:1;
7283 ULONG AdvancedErrorInterruptMessageNumber
:5;
7286 } PCI_EXPRESS_ROOT_ERROR_STATUS
, *PPCI_EXPRESS_ROOT_ERROR_STATUS
;
7288 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID
{
7289 _ANONYMOUS_STRUCT
struct {
7290 USHORT CorrectableSourceIdFun
:3;
7291 USHORT CorrectableSourceIdDev
:5;
7292 USHORT CorrectableSourceIdBus
:8;
7293 USHORT UncorrectableSourceIdFun
:3;
7294 USHORT UncorrectableSourceIdDev
:5;
7295 USHORT UncorrectableSourceIdBus
:8;
7298 } PCI_EXPRESS_ERROR_SOURCE_ID
, *PPCI_EXPRESS_ERROR_SOURCE_ID
;
7300 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS
{
7301 _ANONYMOUS_STRUCT
struct {
7302 ULONG TargetAbortOnSplitCompletion
:1;
7303 ULONG MasterAbortOnSplitCompletion
:1;
7304 ULONG ReceivedTargetAbort
:1;
7305 ULONG ReceivedMasterAbort
:1;
7307 ULONG UnexpectedSplitCompletionError
:1;
7308 ULONG UncorrectableSplitCompletion
:1;
7309 ULONG UncorrectableDataError
:1;
7310 ULONG UncorrectableAttributeError
:1;
7311 ULONG UncorrectableAddressError
:1;
7312 ULONG DelayedTransactionDiscardTimerExpired
:1;
7313 ULONG PERRAsserted
:1;
7314 ULONG SERRAsserted
:1;
7315 ULONG InternalBridgeError
:1;
7319 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS
, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS
;
7321 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK
{
7322 _ANONYMOUS_STRUCT
struct {
7323 ULONG TargetAbortOnSplitCompletion
:1;
7324 ULONG MasterAbortOnSplitCompletion
:1;
7325 ULONG ReceivedTargetAbort
:1;
7326 ULONG ReceivedMasterAbort
:1;
7328 ULONG UnexpectedSplitCompletionError
:1;
7329 ULONG UncorrectableSplitCompletion
:1;
7330 ULONG UncorrectableDataError
:1;
7331 ULONG UncorrectableAttributeError
:1;
7332 ULONG UncorrectableAddressError
:1;
7333 ULONG DelayedTransactionDiscardTimerExpired
:1;
7334 ULONG PERRAsserted
:1;
7335 ULONG SERRAsserted
:1;
7336 ULONG InternalBridgeError
:1;
7340 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK
, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK
;
7342 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY
{
7343 _ANONYMOUS_STRUCT
struct {
7344 ULONG TargetAbortOnSplitCompletion
:1;
7345 ULONG MasterAbortOnSplitCompletion
:1;
7346 ULONG ReceivedTargetAbort
:1;
7347 ULONG ReceivedMasterAbort
:1;
7349 ULONG UnexpectedSplitCompletionError
:1;
7350 ULONG UncorrectableSplitCompletion
:1;
7351 ULONG UncorrectableDataError
:1;
7352 ULONG UncorrectableAttributeError
:1;
7353 ULONG UncorrectableAddressError
:1;
7354 ULONG DelayedTransactionDiscardTimerExpired
:1;
7355 ULONG PERRAsserted
:1;
7356 ULONG SERRAsserted
:1;
7357 ULONG InternalBridgeError
:1;
7361 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY
, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY
;
7363 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES
{
7364 _ANONYMOUS_STRUCT
struct {
7365 ULONG SecondaryUncorrectableFirstErrorPtr
:5;
7369 } PCI_EXPRESS_SEC_AER_CAPABILITIES
, *PPCI_EXPRESS_SEC_AER_CAPABILITIES
;
7371 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001
7372 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002
7373 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004
7375 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
7376 (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
7377 ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
7378 ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
7380 typedef struct _PCI_EXPRESS_AER_CAPABILITY
{
7381 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7382 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus
;
7383 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask
;
7384 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity
;
7385 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus
;
7386 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask
;
7387 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl
;
7389 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus
;
7390 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask
;
7391 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity
;
7392 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl
;
7393 ULONG SecHeaderLog
[4];
7394 } PCI_EXPRESS_AER_CAPABILITY
, *PPCI_EXPRESS_AER_CAPABILITY
;
7396 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY
{
7397 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7398 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus
;
7399 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask
;
7400 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity
;
7401 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus
;
7402 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask
;
7403 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl
;
7405 PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand
;
7406 PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus
;
7407 PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId
;
7408 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY
, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY
;
7410 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY
{
7411 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7412 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus
;
7413 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask
;
7414 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity
;
7415 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus
;
7416 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask
;
7417 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl
;
7419 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus
;
7420 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask
;
7421 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity
;
7422 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl
;
7423 ULONG SecHeaderLog
[4];
7424 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY
, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY
;
7426 typedef union _PCI_EXPRESS_SRIOV_CAPS
{
7427 _ANONYMOUS_STRUCT
struct {
7428 ULONG VFMigrationCapable
:1;
7430 ULONG VFMigrationInterruptNumber
:11;
7433 } PCI_EXPRESS_SRIOV_CAPS
, *PPCI_EXPRESS_SRIOV_CAPS
;
7435 typedef union _PCI_EXPRESS_SRIOV_CONTROL
{
7436 _ANONYMOUS_STRUCT
struct {
7438 USHORT VFMigrationEnable
:1;
7439 USHORT VFMigrationInterruptEnable
:1;
7440 USHORT VFMemorySpaceEnable
:1;
7441 USHORT ARICapableHierarchy
:1;
7442 USHORT Reserved1
:11;
7445 } PCI_EXPRESS_SRIOV_CONTROL
, *PPCI_EXPRESS_SRIOV_CONTROL
;
7447 typedef union _PCI_EXPRESS_SRIOV_STATUS
{
7448 _ANONYMOUS_STRUCT
struct {
7449 USHORT VFMigrationStatus
:1;
7450 USHORT Reserved1
:15;
7453 } PCI_EXPRESS_SRIOV_STATUS
, *PPCI_EXPRESS_SRIOV_STATUS
;
7455 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY
{
7456 _ANONYMOUS_STRUCT
struct {
7457 ULONG VFMigrationStateBIR
:3;
7458 ULONG VFMigrationStateOffset
:29;
7461 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY
, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY
;
7463 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY
{
7464 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header
;
7465 PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities
;
7466 PCI_EXPRESS_SRIOV_CONTROL SRIOVControl
;
7467 PCI_EXPRESS_SRIOV_STATUS SRIOVStatus
;
7471 UCHAR FunctionDependencyLink
;
7473 USHORT FirstVFOffset
;
7477 ULONG SupportedPageSizes
;
7478 ULONG SystemPageSize
;
7479 ULONG BaseAddresses
[PCI_TYPE0_ADDRESSES
];
7480 PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset
;
7481 } PCI_EXPRESS_SRIOV_CAPABILITY
, *PPCI_EXPRESS_SRIOV_CAPABILITY
;
7483 /* PCI device classes */
7484 #define PCI_CLASS_PRE_20 0x00
7485 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
7486 #define PCI_CLASS_NETWORK_CTLR 0x02
7487 #define PCI_CLASS_DISPLAY_CTLR 0x03
7488 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
7489 #define PCI_CLASS_MEMORY_CTLR 0x05
7490 #define PCI_CLASS_BRIDGE_DEV 0x06
7491 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
7492 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
7493 #define PCI_CLASS_INPUT_DEV 0x09
7494 #define PCI_CLASS_DOCKING_STATION 0x0a
7495 #define PCI_CLASS_PROCESSOR 0x0b
7496 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
7497 #define PCI_CLASS_WIRELESS_CTLR 0x0d
7498 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
7499 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
7500 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
7501 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
7502 #define PCI_CLASS_NOT_DEFINED 0xff
7504 /* PCI device subclasses for class 0 */
7505 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
7506 #define PCI_SUBCLASS_PRE_20_VGA 0x01
7508 /* PCI device subclasses for class 1 (mass storage controllers)*/
7509 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
7510 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
7511 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
7512 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
7513 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
7514 #define PCI_SUBCLASS_MSC_OTHER 0x80
7516 /* PCI device subclasses for class 2 (network controllers)*/
7517 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
7518 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
7519 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
7520 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
7521 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
7522 #define PCI_SUBCLASS_NET_OTHER 0x80
7524 /* PCI device subclasses for class 3 (display controllers)*/
7525 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
7526 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
7527 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
7528 #define PCI_SUBCLASS_VID_OTHER 0x80
7530 /* PCI device subclasses for class 4 (multimedia device)*/
7531 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
7532 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
7533 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
7534 #define PCI_SUBCLASS_MM_OTHER 0x80
7536 /* PCI device subclasses for class 5 (memory controller)*/
7537 #define PCI_SUBCLASS_MEM_RAM 0x00
7538 #define PCI_SUBCLASS_MEM_FLASH 0x01
7539 #define PCI_SUBCLASS_MEM_OTHER 0x80
7541 /* PCI device subclasses for class 6 (bridge device)*/
7542 #define PCI_SUBCLASS_BR_HOST 0x00
7543 #define PCI_SUBCLASS_BR_ISA 0x01
7544 #define PCI_SUBCLASS_BR_EISA 0x02
7545 #define PCI_SUBCLASS_BR_MCA 0x03
7546 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
7547 #define PCI_SUBCLASS_BR_PCMCIA 0x05
7548 #define PCI_SUBCLASS_BR_NUBUS 0x06
7549 #define PCI_SUBCLASS_BR_CARDBUS 0x07
7550 #define PCI_SUBCLASS_BR_RACEWAY 0x08
7551 #define PCI_SUBCLASS_BR_OTHER 0x80
7553 #define PCI_SUBCLASS_COM_SERIAL 0x00
7554 #define PCI_SUBCLASS_COM_PARALLEL 0x01
7555 #define PCI_SUBCLASS_COM_MULTIPORT 0x02
7556 #define PCI_SUBCLASS_COM_MODEM 0x03
7557 #define PCI_SUBCLASS_COM_OTHER 0x80
7559 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00
7560 #define PCI_SUBCLASS_SYS_DMA_CTLR 0x01
7561 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02
7562 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03
7563 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04
7564 #define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05
7565 #define PCI_SUBCLASS_SYS_OTHER 0x80
7567 #define PCI_SUBCLASS_INP_KEYBOARD 0x00
7568 #define PCI_SUBCLASS_INP_DIGITIZER 0x01
7569 #define PCI_SUBCLASS_INP_MOUSE 0x02
7570 #define PCI_SUBCLASS_INP_SCANNER 0x03
7571 #define PCI_SUBCLASS_INP_GAMEPORT 0x04
7572 #define PCI_SUBCLASS_INP_OTHER 0x80
7574 #define PCI_SUBCLASS_DOC_GENERIC 0x00
7575 #define PCI_SUBCLASS_DOC_OTHER 0x80
7577 #define PCI_SUBCLASS_PROC_386 0x00
7578 #define PCI_SUBCLASS_PROC_486 0x01
7579 #define PCI_SUBCLASS_PROC_PENTIUM 0x02
7580 #define PCI_SUBCLASS_PROC_ALPHA 0x10
7581 #define PCI_SUBCLASS_PROC_POWERPC 0x20
7582 #define PCI_SUBCLASS_PROC_COPROCESSOR 0x40
7584 /* PCI device subclasses for class C (serial bus controller)*/
7585 #define PCI_SUBCLASS_SB_IEEE1394 0x00
7586 #define PCI_SUBCLASS_SB_ACCESS 0x01
7587 #define PCI_SUBCLASS_SB_SSA 0x02
7588 #define PCI_SUBCLASS_SB_USB 0x03
7589 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
7590 #define PCI_SUBCLASS_SB_SMBUS 0x05
7592 #define PCI_SUBCLASS_WIRELESS_IRDA 0x00
7593 #define PCI_SUBCLASS_WIRELESS_CON_IR 0x01
7594 #define PCI_SUBCLASS_WIRELESS_RF 0x10
7595 #define PCI_SUBCLASS_WIRELESS_OTHER 0x80
7597 #define PCI_SUBCLASS_INTIO_I2O 0x00
7599 #define PCI_SUBCLASS_SAT_TV 0x01
7600 #define PCI_SUBCLASS_SAT_AUDIO 0x02
7601 #define PCI_SUBCLASS_SAT_VOICE 0x03
7602 #define PCI_SUBCLASS_SAT_DATA 0x04
7604 #define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00
7605 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10
7606 #define PCI_SUBCLASS_CRYPTO_OTHER 0x80
7608 #define PCI_SUBCLASS_DASP_DPIO 0x00
7609 #define PCI_SUBCLASS_DASP_OTHER 0x80
7611 #define PCI_ADDRESS_IO_SPACE 0x00000001
7612 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
7613 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
7614 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
7615 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
7616 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
7618 #define PCI_TYPE_32BIT 0
7619 #define PCI_TYPE_20BIT 2
7620 #define PCI_TYPE_64BIT 4
7622 #define PCI_ROMADDRESS_ENABLED 0x00000001
7624 #endif /* _PCI_X_ */
7626 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1
7628 _IRQL_requires_max_(PASSIVE_LEVEL
)
7629 _Must_inspect_result_
7631 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE
)(
7632 _Inout_ PVOID Context
);
7633 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE
*PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE
;
7635 _IRQL_requires_max_(PASSIVE_LEVEL
)
7636 _Must_inspect_result_
7638 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE
)(
7639 _Inout_ PVOID Context
);
7640 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE
*PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE
;
7642 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE
{
7646 PINTERFACE_REFERENCE InterfaceReference
;
7647 PINTERFACE_DEREFERENCE InterfaceDereference
;
7648 PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode
;
7649 PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode
;
7650 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE
, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE
;
7652 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1
7655 (NTAPI
*PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE
)(
7657 _Out_writes_bytes_(Length
) PVOID Buffer
,
7662 (NTAPI
*PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE
)(
7664 _In_reads_bytes_(Length
) PVOID Buffer
,
7668 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE
{
7672 PINTERFACE_REFERENCE InterfaceReference
;
7673 PINTERFACE_DEREFERENCE InterfaceDereference
;
7674 PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace
;
7675 PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace
;
7676 } PCI_EXPRESS_ROOT_PORT_INTERFACE
, *PPCI_EXPRESS_ROOT_PORT_INTERFACE
;
7678 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1
7680 _Must_inspect_result_
7682 (NTAPI PCI_MSIX_SET_ENTRY
)(
7684 _In_ ULONG TableEntry
,
7685 _In_ ULONG MessageNumber
);
7686 typedef PCI_MSIX_SET_ENTRY
*PPCI_MSIX_SET_ENTRY
;
7688 _Must_inspect_result_
7690 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY
)(
7692 _In_ ULONG TableEntry
);
7693 typedef PCI_MSIX_MASKUNMASK_ENTRY
*PPCI_MSIX_MASKUNMASK_ENTRY
;
7695 _Must_inspect_result_
7697 (NTAPI PCI_MSIX_GET_ENTRY
)(
7699 _In_ ULONG TableEntry
,
7700 _Out_ PULONG MessageNumber
,
7701 _Out_ PBOOLEAN Masked
);
7702 typedef PCI_MSIX_GET_ENTRY
*PPCI_MSIX_GET_ENTRY
;
7704 _Must_inspect_result_
7706 (NTAPI PCI_MSIX_GET_TABLE_SIZE
)(
7708 _Out_ PULONG TableSize
);
7709 typedef PCI_MSIX_GET_TABLE_SIZE
*PPCI_MSIX_GET_TABLE_SIZE
;
7711 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE
{
7715 PINTERFACE_REFERENCE InterfaceReference
;
7716 PINTERFACE_DEREFERENCE InterfaceDereference
;
7717 PPCI_MSIX_SET_ENTRY SetTableEntry
;
7718 PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry
;
7719 PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry
;
7720 PPCI_MSIX_GET_ENTRY GetTableEntry
;
7721 PPCI_MSIX_GET_TABLE_SIZE GetTableSize
;
7722 } PCI_MSIX_TABLE_CONFIG_INTERFACE
, *PPCI_MSIX_TABLE_CONFIG_INTERFACE
;
7724 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
7725 RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
7727 /******************************************************************************
7728 * Object Manager Types *
7729 ******************************************************************************/
7731 #define MAXIMUM_FILENAME_LENGTH 256
7732 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
7734 #define OBJECT_TYPE_CREATE 0x0001
7735 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
7737 #define DIRECTORY_QUERY 0x0001
7738 #define DIRECTORY_TRAVERSE 0x0002
7739 #define DIRECTORY_CREATE_OBJECT 0x0004
7740 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
7741 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
7743 #define SYMBOLIC_LINK_QUERY 0x0001
7744 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
7746 #define DUPLICATE_CLOSE_SOURCE 0x00000001
7747 #define DUPLICATE_SAME_ACCESS 0x00000002
7748 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
7750 #define OB_FLT_REGISTRATION_VERSION_0100 0x0100
7751 #define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
7753 typedef ULONG OB_OPERATION
;
7755 #define OB_OPERATION_HANDLE_CREATE 0x00000001
7756 #define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
7758 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION
{
7759 _Inout_ ACCESS_MASK DesiredAccess
;
7760 _In_ ACCESS_MASK OriginalDesiredAccess
;
7761 } OB_PRE_CREATE_HANDLE_INFORMATION
, *POB_PRE_CREATE_HANDLE_INFORMATION
;
7763 typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION
{
7764 _Inout_ ACCESS_MASK DesiredAccess
;
7765 _In_ ACCESS_MASK OriginalDesiredAccess
;
7766 _In_ PVOID SourceProcess
;
7767 _In_ PVOID TargetProcess
;
7768 } OB_PRE_DUPLICATE_HANDLE_INFORMATION
, *POB_PRE_DUPLICATE_HANDLE_INFORMATION
;
7770 typedef union _OB_PRE_OPERATION_PARAMETERS
{
7771 _Inout_ OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation
;
7772 _Inout_ OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation
;
7773 } OB_PRE_OPERATION_PARAMETERS
, *POB_PRE_OPERATION_PARAMETERS
;
7775 typedef struct _OB_PRE_OPERATION_INFORMATION
{
7776 _In_ OB_OPERATION Operation
;
7777 _ANONYMOUS_UNION
union {
7779 _ANONYMOUS_STRUCT
struct {
7780 _In_ ULONG KernelHandle
:1;
7781 _In_ ULONG Reserved
:31;
7785 _In_ POBJECT_TYPE ObjectType
;
7786 _Out_ PVOID CallContext
;
7787 _In_ POB_PRE_OPERATION_PARAMETERS Parameters
;
7788 } OB_PRE_OPERATION_INFORMATION
, *POB_PRE_OPERATION_INFORMATION
;
7790 typedef struct _OB_POST_CREATE_HANDLE_INFORMATION
{
7791 _In_ ACCESS_MASK GrantedAccess
;
7792 } OB_POST_CREATE_HANDLE_INFORMATION
, *POB_POST_CREATE_HANDLE_INFORMATION
;
7794 typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION
{
7795 _In_ ACCESS_MASK GrantedAccess
;
7796 } OB_POST_DUPLICATE_HANDLE_INFORMATION
, *POB_POST_DUPLICATE_HANDLE_INFORMATION
;
7798 typedef union _OB_POST_OPERATION_PARAMETERS
{
7799 _In_ OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation
;
7800 _In_ OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation
;
7801 } OB_POST_OPERATION_PARAMETERS
, *POB_POST_OPERATION_PARAMETERS
;
7803 typedef struct _OB_POST_OPERATION_INFORMATION
{
7804 _In_ OB_OPERATION Operation
;
7805 _ANONYMOUS_UNION
union {
7807 _ANONYMOUS_STRUCT
struct {
7808 _In_ ULONG KernelHandle
:1;
7809 _In_ ULONG Reserved
:31;
7813 _In_ POBJECT_TYPE ObjectType
;
7814 _In_ PVOID CallContext
;
7815 _In_ NTSTATUS ReturnStatus
;
7816 _In_ POB_POST_OPERATION_PARAMETERS Parameters
;
7817 } OB_POST_OPERATION_INFORMATION
,*POB_POST_OPERATION_INFORMATION
;
7819 typedef enum _OB_PREOP_CALLBACK_STATUS
{
7821 } OB_PREOP_CALLBACK_STATUS
, *POB_PREOP_CALLBACK_STATUS
;
7823 typedef OB_PREOP_CALLBACK_STATUS
7824 (NTAPI
*POB_PRE_OPERATION_CALLBACK
)(
7825 _In_ PVOID RegistrationContext
,
7826 _Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation
);
7829 (NTAPI
*POB_POST_OPERATION_CALLBACK
)(
7830 _In_ PVOID RegistrationContext
,
7831 _In_ POB_POST_OPERATION_INFORMATION OperationInformation
);
7833 typedef struct _OB_OPERATION_REGISTRATION
{
7834 _In_ POBJECT_TYPE
*ObjectType
;
7835 _In_ OB_OPERATION Operations
;
7836 _In_ POB_PRE_OPERATION_CALLBACK PreOperation
;
7837 _In_ POB_POST_OPERATION_CALLBACK PostOperation
;
7838 } OB_OPERATION_REGISTRATION
, *POB_OPERATION_REGISTRATION
;
7840 typedef struct _OB_CALLBACK_REGISTRATION
{
7841 _In_ USHORT Version
;
7842 _In_ USHORT OperationRegistrationCount
;
7843 _In_ UNICODE_STRING Altitude
;
7844 _In_ PVOID RegistrationContext
;
7845 _In_ OB_OPERATION_REGISTRATION
*OperationRegistration
;
7846 } OB_CALLBACK_REGISTRATION
, *POB_CALLBACK_REGISTRATION
;
7848 typedef struct _OBJECT_NAME_INFORMATION
{
7849 UNICODE_STRING Name
;
7850 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
7852 /* Exported object types */
7854 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType
;
7855 extern POBJECT_TYPE NTSYSAPI ExEventObjectType
;
7856 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType
;
7857 extern POBJECT_TYPE NTSYSAPI IoFileObjectType
;
7858 extern POBJECT_TYPE NTSYSAPI PsThreadType
;
7859 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType
;
7860 extern POBJECT_TYPE NTSYSAPI PsProcessType
;
7862 extern POBJECT_TYPE
*CmKeyObjectType
;
7863 extern POBJECT_TYPE
*IoFileObjectType
;
7864 extern POBJECT_TYPE
*ExEventObjectType
;
7865 extern POBJECT_TYPE
*ExSemaphoreObjectType
;
7866 extern POBJECT_TYPE
*TmTransactionManagerObjectType
;
7867 extern POBJECT_TYPE
*TmResourceManagerObjectType
;
7868 extern POBJECT_TYPE
*TmEnlistmentObjectType
;
7869 extern POBJECT_TYPE
*TmTransactionObjectType
;
7870 extern POBJECT_TYPE
*PsProcessType
;
7871 extern POBJECT_TYPE
*PsThreadType
;
7872 extern POBJECT_TYPE
*SeTokenObjectType
;
7873 __CREATE_NTOS_DATA_IMPORT_ALIAS(CmKeyObjectType
)
7874 __CREATE_NTOS_DATA_IMPORT_ALIAS(IoFileObjectType
)
7875 __CREATE_NTOS_DATA_IMPORT_ALIAS(ExEventObjectType
)
7876 __CREATE_NTOS_DATA_IMPORT_ALIAS(ExSemaphoreObjectType
)
7877 __CREATE_NTOS_DATA_IMPORT_ALIAS(TmTransactionManagerObjectType
)
7878 __CREATE_NTOS_DATA_IMPORT_ALIAS(TmResourceManagerObjectType
)
7879 __CREATE_NTOS_DATA_IMPORT_ALIAS(TmEnlistmentObjectType
)
7880 __CREATE_NTOS_DATA_IMPORT_ALIAS(TmTransactionObjectType
)
7881 __CREATE_NTOS_DATA_IMPORT_ALIAS(PsProcessType
)
7882 __CREATE_NTOS_DATA_IMPORT_ALIAS(PsThreadType
)
7883 __CREATE_NTOS_DATA_IMPORT_ALIAS(SeTokenObjectType
)
7887 /******************************************************************************
7888 * Process Manager Types *
7889 ******************************************************************************/
7891 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
7892 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
7893 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
7894 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
7895 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
7897 /* Thread Access Rights */
7898 #define THREAD_TERMINATE 0x0001
7899 #define THREAD_SUSPEND_RESUME 0x0002
7900 #define THREAD_ALERT 0x0004
7901 #define THREAD_GET_CONTEXT 0x0008
7902 #define THREAD_SET_CONTEXT 0x0010
7903 #define THREAD_SET_INFORMATION 0x0020
7904 #define THREAD_SET_LIMITED_INFORMATION 0x0400
7905 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
7907 #define PROCESS_DUP_HANDLE (0x0040)
7909 #if (NTDDI_VERSION >= NTDDI_VISTA)
7910 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
7912 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
7915 #if (NTDDI_VERSION >= NTDDI_VISTA)
7916 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
7918 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
7921 #define LOW_PRIORITY 0
7922 #define LOW_REALTIME_PRIORITY 16
7923 #define HIGH_PRIORITY 31
7924 #define MAXIMUM_PRIORITY 32
7927 /******************************************************************************
7928 * WMI Library Support Types *
7929 ******************************************************************************/
7932 #include <evntrace.h>
7936 #ifndef _TRACEHANDLE_DEFINED
7937 #define _TRACEHANDLE_DEFINED
7938 typedef ULONG64 TRACEHANDLE
, *PTRACEHANDLE
;
7941 #ifndef TRACE_INFORMATION_CLASS_DEFINE
7943 typedef struct _ETW_TRACE_SESSION_SETTINGS
{
7946 ULONG MinimumBuffers
;
7947 ULONG MaximumBuffers
;
7950 ULONG FlushThreshold
;
7952 } ETW_TRACE_SESSION_SETTINGS
, *PETW_TRACE_SESSION_SETTINGS
;
7954 typedef enum _TRACE_INFORMATION_CLASS
{
7957 TraceEnableFlagsClass
,
7958 TraceEnableLevelClass
,
7959 GlobalLoggerHandleClass
,
7960 EventLoggerHandleClass
,
7961 AllLoggerHandlesClass
,
7962 TraceHandleByNameClass
,
7963 LoggerEventsLostClass
,
7964 TraceSessionSettingsClass
,
7965 LoggerEventsLoggedClass
,
7966 MaxTraceInformationClass
7967 } TRACE_INFORMATION_CLASS
;
7969 #endif /* TRACE_INFORMATION_CLASS_DEFINE */
7975 #include <evntprov.h>
7977 _IRQL_requires_same_
7979 (NTAPI
*PETWENABLECALLBACK
)(
7980 _In_ LPCGUID SourceId
,
7981 _In_ ULONG ControlCode
,
7983 _In_ ULONGLONG MatchAnyKeyword
,
7984 _In_ ULONGLONG MatchAllKeyword
,
7985 _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData
,
7986 _Inout_opt_ PVOID CallbackContext
);
7988 #define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001
7991 /******************************************************************************
7992 * Kernel Functions *
7993 ******************************************************************************/
7994 #if defined(_M_IX86)
7995 /** Kernel definitions for x86 **/
7997 /* Interrupt request levels */
7998 #define PASSIVE_LEVEL 0
8001 #define DISPATCH_LEVEL 2
8002 #define CMCI_LEVEL 5
8003 #define PROFILE_LEVEL 27
8004 #define CLOCK1_LEVEL 28
8005 #define CLOCK2_LEVEL 28
8006 #define IPI_LEVEL 29
8007 #define POWER_LEVEL 30
8008 #define HIGH_LEVEL 31
8009 #define CLOCK_LEVEL CLOCK2_LEVEL
8011 #define KIP0PCRADDRESS 0xffdff000
8012 #define KI_USER_SHARED_DATA 0xffdf0000
8013 #define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
8015 #define PAGE_SIZE 0x1000
8016 #define PAGE_SHIFT 12L
8017 #define KeGetDcacheFillSize() 1L
8019 #define EFLAG_SIGN 0x8000
8020 #define EFLAG_ZERO 0x4000
8021 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
8023 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
8024 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
8025 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
8028 typedef struct _KFLOATING_SAVE
{
8032 ULONG ErrorSelector
;
8037 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
8039 extern NTKERNELAPI
volatile KSYSTEM_TIME KeTickCount
;
8041 #define YieldProcessor _mm_pause
8045 KeMemoryBarrier(VOID
)
8047 LONG Barrier
, *Dummy
= &Barrier
;
8048 UNREFERENCED_LOCAL_VARIABLE(Dummy
);
8050 #if defined(__GNUC__)
8051 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
8052 #elif defined(_MSC_VER)
8053 __asm xchg
[Barrier
], eax
8057 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
8059 _IRQL_requires_max_(HIGH_LEVEL
)
8064 KeGetCurrentIrql(VOID
);
8066 _IRQL_requires_max_(HIGH_LEVEL
)
8071 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql
);
8072 #define KeLowerIrql(a) KfLowerIrql(a)
8074 _IRQL_requires_max_(HIGH_LEVEL
)
8075 _IRQL_raises_(NewIrql
)
8081 _In_ KIRQL NewIrql
);
8082 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8084 _IRQL_requires_max_(DISPATCH_LEVEL
)
8086 _IRQL_raises_(DISPATCH_LEVEL
)
8090 KeRaiseIrqlToDpcLevel(VOID
);
8095 KeRaiseIrqlToSynchLevel(VOID
);
8097 _Requires_lock_not_held_(*SpinLock
)
8098 _Acquires_lock_(*SpinLock
)
8099 _IRQL_requires_max_(DISPATCH_LEVEL
)
8101 _IRQL_raises_(DISPATCH_LEVEL
)
8106 _Inout_ PKSPIN_LOCK SpinLock
);
8107 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
8109 _Requires_lock_held_(*SpinLock
)
8110 _Releases_lock_(*SpinLock
)
8111 _IRQL_requires_(DISPATCH_LEVEL
)
8116 _Inout_ PKSPIN_LOCK SpinLock
,
8117 _In_ _IRQL_restores_ KIRQL NewIrql
);
8118 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
8120 _Requires_lock_not_held_(*SpinLock
)
8121 _Acquires_lock_(*SpinLock
)
8122 _IRQL_requires_min_(DISPATCH_LEVEL
)
8126 KefAcquireSpinLockAtDpcLevel(
8127 _Inout_ PKSPIN_LOCK SpinLock
);
8128 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
8130 _Requires_lock_held_(*SpinLock
)
8131 _Releases_lock_(*SpinLock
)
8132 _IRQL_requires_min_(DISPATCH_LEVEL
)
8136 KefReleaseSpinLockFromDpcLevel(
8137 _Inout_ PKSPIN_LOCK SpinLock
);
8138 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
8143 KeGetCurrentThread(VOID
);
8145 _Always_(_Post_satisfies_(return<=0))
8146 _Must_inspect_result_
8147 _IRQL_requires_max_(DISPATCH_LEVEL
)
8148 _Kernel_float_saved_
8149 _At_(*FloatSave
, _Kernel_requires_resource_not_held_(FloatState
) _Kernel_acquires_resource_(FloatState
))
8153 KeSaveFloatingPointState(
8154 _Out_ PKFLOATING_SAVE FloatSave
);
8157 _Kernel_float_restored_
8158 _At_(*FloatSave
, _Kernel_requires_resource_held_(FloatState
) _Kernel_releases_resource_(FloatState
))
8162 KeRestoreFloatingPointState(
8163 _In_ PKFLOATING_SAVE FloatSave
);
8168 * IN BOOLEAN ReadOperation,
8169 * IN BOOLEAN DmaOperation)
8171 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8173 /* x86 and x64 performs a 0x2C interrupt */
8174 #define DbgRaiseAssertionFailure __int2c
8179 OUT PLARGE_INTEGER CurrentCount
)
8182 #ifdef NONAMELESSUNION
8183 CurrentCount
->s
.HighPart
= KeTickCount
.High1Time
;
8184 CurrentCount
->s
.LowPart
= KeTickCount
.LowPart
;
8185 if (CurrentCount
->s
.HighPart
== KeTickCount
.High2Time
) break;
8187 CurrentCount
->HighPart
= KeTickCount
.High1Time
;
8188 CurrentCount
->LowPart
= KeTickCount
.LowPart
;
8189 if (CurrentCount
->HighPart
== KeTickCount
.High2Time
) break;
8194 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
8200 #elif defined(_M_AMD64)
8201 /** Kernel definitions for AMD64 **/
8203 /* Interrupt request levels */
8204 #define PASSIVE_LEVEL 0
8207 #define DISPATCH_LEVEL 2
8208 #define CMCI_LEVEL 5
8209 #define CLOCK_LEVEL 13
8210 #define IPI_LEVEL 14
8211 #define DRS_LEVEL 14
8212 #define POWER_LEVEL 14
8213 #define PROFILE_LEVEL 15
8214 #define HIGH_LEVEL 15
8216 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
8217 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
8218 #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
8219 #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
8220 #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
8222 #define PAGE_SIZE 0x1000
8223 #define PAGE_SHIFT 12L
8225 #define EFLAG_SIGN 0x8000
8226 #define EFLAG_ZERO 0x4000
8227 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
8229 typedef struct _KFLOATING_SAVE
{
8231 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
8233 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
8235 #define KeQueryInterruptTime() \
8236 (*(volatile ULONG64*)SharedInterruptTime)
8238 #define KeQuerySystemTime(CurrentCount) \
8239 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
8241 #define KeQueryTickCount(CurrentCount) \
8242 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
8244 #define KeGetDcacheFillSize() 1L
8246 #define YieldProcessor _mm_pause
8247 #define MemoryBarrier __faststorefence
8248 #define FastFence __faststorefence
8249 #define LoadFence _mm_lfence
8250 #define MemoryFence _mm_mfence
8251 #define StoreFence _mm_sfence
8252 #define LFENCE_ACQUIRE() LoadFence()
8256 KeMemoryBarrier(VOID
)
8258 // FIXME: Do we really need lfence after the __faststorefence ?
8263 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
8267 KeGetCurrentIrql(VOID
)
8269 return (KIRQL
)__readcr8();
8274 KeLowerIrql(IN KIRQL NewIrql
)
8276 //ASSERT((KIRQL)__readcr8() >= NewIrql);
8277 __writecr8(NewIrql
);
8282 KfRaiseIrql(IN KIRQL NewIrql
)
8286 OldIrql
= (KIRQL
)__readcr8();
8287 //ASSERT(OldIrql <= NewIrql);
8288 __writecr8(NewIrql
);
8291 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8295 KeRaiseIrqlToDpcLevel(VOID
)
8297 return KfRaiseIrql(DISPATCH_LEVEL
);
8302 KeRaiseIrqlToSynchLevel(VOID
)
8304 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
8309 KeGetCurrentThread(VOID
)
8311 return (struct _KTHREAD
*)__readgsqword(0x188);
8316 KeSaveFloatingPointState(PVOID FloatingState
)
8318 UNREFERENCED_PARAMETER(FloatingState
);
8319 return STATUS_SUCCESS
;
8324 KeRestoreFloatingPointState(PVOID FloatingState
)
8326 UNREFERENCED_PARAMETER(FloatingState
);
8327 return STATUS_SUCCESS
;
8333 * IN BOOLEAN ReadOperation,
8334 * IN BOOLEAN DmaOperation)
8336 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8338 /* x86 and x64 performs a 0x2C interrupt */
8339 #define DbgRaiseAssertionFailure __int2c
8341 #elif defined(_M_IA64)
8342 /** Kernel definitions for IA64 **/
8344 /* Interrupt request levels */
8345 #define PASSIVE_LEVEL 0
8348 #define DISPATCH_LEVEL 2
8350 #define DEVICE_LEVEL_BASE 4
8352 #define IPI_LEVEL 14
8353 #define DRS_LEVEL 14
8354 #define CLOCK_LEVEL 13
8355 #define POWER_LEVEL 15
8356 #define PROFILE_LEVEL 15
8357 #define HIGH_LEVEL 15
8359 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
8360 extern NTKERNELAPI
volatile LARGE_INTEGER KeTickCount
;
8362 #define PAUSE_PROCESSOR __yield();
8366 KeFlushWriteBuffer(VOID
)
8375 KeGetCurrentThread(VOID
);
8378 #elif defined(_M_PPC)
8380 /* Interrupt request levels */
8381 #define PASSIVE_LEVEL 0
8384 #define DISPATCH_LEVEL 2
8385 #define PROFILE_LEVEL 27
8386 #define CLOCK1_LEVEL 28
8387 #define CLOCK2_LEVEL 28
8388 #define IPI_LEVEL 29
8389 #define POWER_LEVEL 30
8390 #define HIGH_LEVEL 31
8393 // Used to contain PFNs and PFN counts
8395 typedef ULONG PFN_COUNT
;
8396 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
8397 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
8400 typedef struct _KFLOATING_SAVE
{
8402 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
8404 typedef struct _KPCR_TIB
{
8405 PVOID ExceptionList
; /* 00 */
8406 PVOID StackBase
; /* 04 */
8407 PVOID StackLimit
; /* 08 */
8408 PVOID SubSystemTib
; /* 0C */
8409 _ANONYMOUS_UNION
union {
8410 PVOID FiberData
; /* 10 */
8411 ULONG Version
; /* 10 */
8413 PVOID ArbitraryUserPointer
; /* 14 */
8414 struct _KPCR_TIB
*Self
; /* 18 */
8415 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
8417 #define PCR_MINOR_VERSION 1
8418 #define PCR_MAJOR_VERSION 1
8420 typedef struct _KPCR
{
8421 KPCR_TIB Tib
; /* 00 */
8422 struct _KPCR
*Self
; /* 1C */
8423 struct _KPRCB
*Prcb
; /* 20 */
8424 KIRQL Irql
; /* 24 */
8426 ULONG IrrActive
; /* 2C */
8428 PVOID KdVersionBlock
; /* 34 */
8429 PUSHORT IDT
; /* 38 */
8430 PUSHORT GDT
; /* 3C */
8431 struct _KTSS
*TSS
; /* 40 */
8432 USHORT MajorVersion
; /* 44 */
8433 USHORT MinorVersion
; /* 46 */
8434 KAFFINITY SetMember
; /* 48 */
8435 ULONG StallScaleFactor
; /* 4C */
8436 UCHAR SpareUnused
; /* 50 */
8437 UCHAR Number
; /* 51 */
8438 } KPCR
, *PKPCR
; /* 54 */
8440 #define KeGetPcr() PCR
8442 #define YieldProcessor() __asm__ __volatile__("nop");
8447 KeGetCurrentProcessorNumber(VOID
)
8450 __asm__
__volatile__ (
8453 : "i" (FIELD_OFFSET(KPCR
, Number
))
8463 #define KeLowerIrql(a) KfLowerIrql(a)
8470 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8475 KeRaiseIrqlToDpcLevel(VOID
);
8480 KeRaiseIrqlToSynchLevel(VOID
);
8484 #elif defined(_M_MIPS)
8485 #error MIPS Headers are totally incorrect
8488 // Used to contain PFNs and PFN counts
8490 typedef ULONG PFN_COUNT
;
8491 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
8492 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
8494 #define PASSIVE_LEVEL 0
8496 #define DISPATCH_LEVEL 2
8497 #define PROFILE_LEVEL 27
8498 #define IPI_LEVEL 29
8499 #define HIGH_LEVEL 31
8501 typedef struct _KPCR
{
8502 struct _KPRCB
*Prcb
; /* 20 */
8503 KIRQL Irql
; /* 24 */
8508 #define KeGetPcr() PCR
8510 typedef struct _KFLOATING_SAVE
{
8511 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
8516 KeGetCurrentProcessorNumber(VOID
)
8521 #define YieldProcessor() __asm__ __volatile__("nop");
8523 #define KeLowerIrql(a) KfLowerIrql(a)
8524 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8541 KeRaiseIrqlToDpcLevel(VOID
);
8546 KeRaiseIrqlToSynchLevel(VOID
);
8549 #elif defined(_M_ARM)
8552 #error Unknown Architecture
8559 _Out_ PRKEVENT Event
,
8560 _In_ EVENT_TYPE Type
,
8561 _In_ BOOLEAN State
);
8563 _IRQL_requires_max_(DISPATCH_LEVEL
)
8568 _Inout_ PRKEVENT Event
);
8570 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8572 #if defined(_NTDDK_) || defined(_NTIFS_)
8573 _Maybe_raises_SEH_exception_
8574 _IRQL_requires_max_(APC_LEVEL
)
8579 __in_data_source(USER_MODE
) _In_reads_bytes_(Length
) CONST VOID
*Address
, /* CONST is added */
8581 _In_ ULONG Alignment
);
8582 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
8584 _Maybe_raises_SEH_exception_
8585 _IRQL_requires_max_(APC_LEVEL
)
8590 __in_data_source(USER_MODE
) _Out_writes_bytes_(Length
) PVOID Address
,
8592 _In_ ULONG Alignment
);
8594 #if defined(SINGLE_GROUP_LEGACY_API)
8596 _IRQL_requires_min_(PASSIVE_LEVEL
)
8597 _IRQL_requires_max_(APC_LEVEL
)
8601 KeRevertToUserAffinityThread(VOID
);
8603 _IRQL_requires_min_(PASSIVE_LEVEL
)
8604 _IRQL_requires_max_(APC_LEVEL
)
8608 KeSetSystemAffinityThread(
8609 _In_ KAFFINITY Affinity
);
8614 KeSetTargetProcessorDpc(
8621 KeQueryActiveProcessors(VOID
);
8622 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
8624 #if !defined(_M_AMD64)
8628 KeQueryInterruptTime(VOID
);
8634 _Out_ PLARGE_INTEGER CurrentTime
);
8635 #endif /* !_M_AMD64 */
8637 #if !defined(_X86_) && !defined(_M_ARM)
8638 _Requires_lock_not_held_(*SpinLock
)
8639 _Acquires_lock_(*SpinLock
)
8640 _IRQL_requires_max_(DISPATCH_LEVEL
)
8642 _IRQL_raises_(DISPATCH_LEVEL
)
8646 KeAcquireSpinLockRaiseToDpc(
8647 _Inout_ PKSPIN_LOCK SpinLock
);
8649 #define KeAcquireSpinLock(SpinLock, OldIrql) \
8650 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
8652 _Requires_lock_not_held_(*SpinLock
)
8653 _Acquires_lock_(*SpinLock
)
8654 _IRQL_requires_min_(DISPATCH_LEVEL
)
8658 KeAcquireSpinLockAtDpcLevel(
8659 _Inout_ PKSPIN_LOCK SpinLock
);
8661 _Requires_lock_held_(*SpinLock
)
8662 _Releases_lock_(*SpinLock
)
8663 _IRQL_requires_(DISPATCH_LEVEL
)
8668 _Inout_ PKSPIN_LOCK SpinLock
,
8669 _In_ _IRQL_restores_ KIRQL NewIrql
);
8671 _Requires_lock_held_(*SpinLock
)
8672 _Releases_lock_(*SpinLock
)
8673 _IRQL_requires_min_(DISPATCH_LEVEL
)
8677 KeReleaseSpinLockFromDpcLevel(
8678 _Inout_ PKSPIN_LOCK SpinLock
);
8681 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
8685 KeInitializeSpinLock(
8686 _Out_ PKSPIN_LOCK SpinLock
);
8690 KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock
)
8692 /* Clear the lock */
8702 _In_ ULONG BugCheckCode
,
8703 _In_ ULONG_PTR BugCheckParameter1
,
8704 _In_ ULONG_PTR BugCheckParameter2
,
8705 _In_ ULONG_PTR BugCheckParameter3
,
8706 _In_ ULONG_PTR BugCheckParameter4
);
8708 _IRQL_requires_max_(DISPATCH_LEVEL
)
8715 _IRQL_requires_min_(PASSIVE_LEVEL
)
8716 _IRQL_requires_max_(APC_LEVEL
)
8720 KeDelayExecutionThread(
8721 _In_ KPROCESSOR_MODE WaitMode
,
8722 _In_ BOOLEAN Alertable
,
8723 _In_ PLARGE_INTEGER Interval
);
8725 _Must_inspect_result_
8729 KeDeregisterBugCheckCallback(
8730 _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
8732 _Acquires_lock_(_Global_critical_region_
)
8733 _IRQL_requires_max_(APC_LEVEL
)
8737 KeEnterCriticalRegion(VOID
);
8739 _IRQL_requires_max_(DISPATCH_LEVEL
)
8743 KeInitializeDeviceQueue(
8744 _Out_ PKDEVICE_QUEUE DeviceQueue
);
8750 _Out_ __drv_aliasesMem PRKDPC Dpc
,
8751 _In_ PKDEFERRED_ROUTINE DeferredRoutine
,
8752 _In_opt_ __drv_aliasesMem PVOID DeferredContext
);
8758 _Out_ PRKMUTEX Mutex
,
8761 _IRQL_requires_max_(PASSIVE_LEVEL
)
8765 KeInitializeSemaphore(
8766 _Out_ PRKSEMAPHORE Semaphore
,
8770 _IRQL_requires_max_(DISPATCH_LEVEL
)
8775 _Out_ PKTIMER Timer
);
8777 _IRQL_requires_max_(DISPATCH_LEVEL
)
8781 KeInitializeTimerEx(
8782 _Out_ PKTIMER Timer
,
8783 _In_ TIMER_TYPE Type
);
8785 _IRQL_requires_(DISPATCH_LEVEL
)
8789 KeInsertByKeyDeviceQueue(
8790 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
8791 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
8792 _In_ ULONG SortKey
);
8794 _IRQL_requires_(DISPATCH_LEVEL
)
8798 KeInsertDeviceQueue(
8799 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
8800 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
8807 _In_opt_ PVOID SystemArgument1
,
8808 _In_opt_ PVOID SystemArgument2
);
8810 _Releases_lock_(_Global_critical_region_
)
8811 _IRQL_requires_max_(APC_LEVEL
)
8815 KeLeaveCriticalRegion(VOID
);
8820 KeQueryPerformanceCounter(
8821 _Out_opt_ PLARGE_INTEGER PerformanceFrequency
);
8823 _IRQL_requires_max_(PASSIVE_LEVEL
)
8827 KeQueryPriorityThread(
8828 _In_ PRKTHREAD Thread
);
8833 KeQueryTimeIncrement(VOID
);
8835 _IRQL_requires_max_(DISPATCH_LEVEL
)
8840 _In_ PRKEVENT Event
);
8842 _IRQL_requires_max_(DISPATCH_LEVEL
)
8847 _In_ PRKMUTEX Mutex
);
8849 _IRQL_requires_max_(DISPATCH_LEVEL
)
8853 KeReadStateSemaphore(
8854 _In_ PRKSEMAPHORE Semaphore
);
8856 _IRQL_requires_max_(DISPATCH_LEVEL
)
8861 _In_ PKTIMER Timer
);
8863 _Must_inspect_result_
8867 KeRegisterBugCheckCallback(
8868 _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
8869 _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
8870 _In_reads_bytes_opt_(Length
) PVOID Buffer
,
8872 _In_ PUCHAR Component
);
8874 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
8875 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
8880 _Inout_ PRKMUTEX Mutex
,
8883 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
8884 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
8889 _Inout_ PRKSEMAPHORE Semaphore
,
8890 _In_ KPRIORITY Increment
,
8891 _In_ LONG Adjustment
,
8892 _In_ _Literal_ BOOLEAN Wait
);
8894 _IRQL_requires_(DISPATCH_LEVEL
)
8896 PKDEVICE_QUEUE_ENTRY
8898 KeRemoveByKeyDeviceQueue(
8899 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
8900 _In_ ULONG SortKey
);
8902 _IRQL_requires_(DISPATCH_LEVEL
)
8904 PKDEVICE_QUEUE_ENTRY
8906 KeRemoveDeviceQueue(
8907 _Inout_ PKDEVICE_QUEUE DeviceQueue
);
8909 _IRQL_requires_max_(DISPATCH_LEVEL
)
8913 KeRemoveEntryDeviceQueue(
8914 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
8915 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
8917 _IRQL_requires_max_(HIGH_LEVEL
)
8922 _Inout_ PRKDPC Dpc
);
8924 _IRQL_requires_max_(DISPATCH_LEVEL
)
8929 _Inout_ PRKEVENT Event
);
8931 _When_(Wait
==0, _IRQL_requires_max_(DISPATCH_LEVEL
))
8932 _When_(Wait
==1, _IRQL_requires_max_(APC_LEVEL
))
8937 _Inout_ PRKEVENT Event
,
8938 _In_ KPRIORITY Increment
,
8939 _In_ _Literal_ BOOLEAN Wait
);
8946 _In_ KDPC_IMPORTANCE Importance
);
8948 _IRQL_requires_min_(PASSIVE_LEVEL
)
8949 _IRQL_requires_max_(DISPATCH_LEVEL
)
8953 KeSetPriorityThread(
8954 _Inout_ PKTHREAD Thread
,
8955 _In_ KPRIORITY Priority
);
8957 _IRQL_requires_max_(DISPATCH_LEVEL
)
8962 _Inout_ PKTIMER Timer
,
8963 _In_ LARGE_INTEGER DueTime
,
8964 _In_opt_ PKDPC Dpc
);
8966 _IRQL_requires_max_(DISPATCH_LEVEL
)
8971 _Inout_ PKTIMER Timer
,
8972 _In_ LARGE_INTEGER DueTime
,
8973 _In_ LONG Period OPTIONAL
,
8974 _In_opt_ PKDPC Dpc
);
8979 KeStallExecutionProcessor(
8980 _In_ ULONG MicroSeconds
);
8982 _IRQL_requires_max_(HIGH_LEVEL
)
8986 KeSynchronizeExecution(
8987 _Inout_ PKINTERRUPT Interrupt
,
8988 _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
8989 _In_opt_ __drv_aliasesMem PVOID SynchronizeContext
);
8991 _IRQL_requires_min_(PASSIVE_LEVEL
)
8992 _When_((Timeout
==NULL
|| Timeout
->QuadPart
!=0), _IRQL_requires_max_(APC_LEVEL
))
8993 _When_((Timeout
!=NULL
&& Timeout
->QuadPart
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
8997 KeWaitForMultipleObjects(
8999 _In_reads_(Count
) PVOID Object
[],
9000 _In_
__drv_strictTypeMatch(__drv_typeConst
) WAIT_TYPE WaitType
,
9001 _In_
__drv_strictTypeMatch(__drv_typeCond
) KWAIT_REASON WaitReason
,
9002 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
) KPROCESSOR_MODE WaitMode
,
9003 _In_ BOOLEAN Alertable
,
9004 _In_opt_ PLARGE_INTEGER Timeout
,
9005 _Out_opt_ PKWAIT_BLOCK WaitBlockArray
);
9007 #define KeWaitForMutexObject KeWaitForSingleObject
9009 _IRQL_requires_min_(PASSIVE_LEVEL
)
9010 _When_((Timeout
==NULL
|| Timeout
->QuadPart
!=0), _IRQL_requires_max_(APC_LEVEL
))
9011 _When_((Timeout
!=NULL
&& Timeout
->QuadPart
==0), _IRQL_requires_max_(DISPATCH_LEVEL
))
9015 KeWaitForSingleObject(
9016 _In_ _Points_to_data_ PVOID Object
,
9017 _In_
__drv_strictTypeMatch(__drv_typeCond
) KWAIT_REASON WaitReason
,
9018 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
) KPROCESSOR_MODE WaitMode
,
9019 _In_ BOOLEAN Alertable
,
9020 _In_opt_ PLARGE_INTEGER Timeout
);
9022 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
9024 #if (NTDDI_VERSION >= NTDDI_WINXP)
9026 _Requires_lock_not_held_(*LockHandle
)
9027 _Acquires_lock_(*LockHandle
)
9028 _Post_same_lock_(*SpinLock
, *LockHandle
)
9029 _IRQL_requires_max_(DISPATCH_LEVEL
)
9030 _IRQL_saves_global_(QueuedSpinLock
,LockHandle
)
9031 _IRQL_raises_(DISPATCH_LEVEL
)
9035 KeAcquireInStackQueuedSpinLock(
9036 _Inout_ PKSPIN_LOCK SpinLock
,
9037 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
9039 _Requires_lock_not_held_(*LockHandle
)
9040 _Acquires_lock_(*LockHandle
)
9041 _Post_same_lock_(*SpinLock
, *LockHandle
)
9042 _IRQL_requires_min_(DISPATCH_LEVEL
)
9046 KeAcquireInStackQueuedSpinLockAtDpcLevel(
9047 _Inout_ PKSPIN_LOCK SpinLock
,
9048 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
9050 _Requires_lock_not_held_(*Interrupt
->ActualLock
)
9051 _Acquires_lock_(*Interrupt
->ActualLock
)
9052 _IRQL_requires_max_(HIGH_LEVEL
)
9054 _IRQL_raises_(HIGH_LEVEL
)
9058 KeAcquireInterruptSpinLock(
9059 _Inout_ PKINTERRUPT Interrupt
);
9061 _IRQL_requires_min_(PASSIVE_LEVEL
)
9062 _IRQL_requires_max_(DISPATCH_LEVEL
)
9066 KeAreApcsDisabled(VOID
);
9071 KeGetRecommendedSharedDataAlignment(VOID
);
9073 _IRQL_requires_max_(PASSIVE_LEVEL
)
9077 KeQueryRuntimeThread(
9078 _In_ PKTHREAD Thread
,
9079 _Out_ PULONG UserTime
);
9081 _Requires_lock_held_(*LockHandle
)
9082 _Releases_lock_(*LockHandle
)
9083 _IRQL_requires_(DISPATCH_LEVEL
)
9087 KeReleaseInStackQueuedSpinLockFromDpcLevel(
9088 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
9090 _Requires_lock_held_(*Interrupt
->ActualLock
)
9091 _Releases_lock_(*Interrupt
->ActualLock
)
9092 _IRQL_requires_(HIGH_LEVEL
)
9096 KeReleaseInterruptSpinLock(
9097 _Inout_ PKINTERRUPT Interrupt
,
9098 _In_ _IRQL_restores_ KIRQL OldIrql
);
9100 _IRQL_requires_(DISPATCH_LEVEL
)
9102 PKDEVICE_QUEUE_ENTRY
9104 KeRemoveByKeyDeviceQueueIfBusy(
9105 _Inout_ PKDEVICE_QUEUE DeviceQueue
,
9106 _In_ ULONG SortKey
);
9108 _Requires_lock_held_(*LockHandle
)
9109 _Releases_lock_(*LockHandle
)
9110 _IRQL_requires_(DISPATCH_LEVEL
)
9111 _IRQL_restores_global_(QueuedSpinLock
,LockHandle
)
9115 KeReleaseInStackQueuedSpinLock(
9116 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
9118 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
9120 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
9122 _Must_inspect_result_
9126 KeDeregisterBugCheckReasonCallback(
9127 _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
9129 _Must_inspect_result_
9133 KeRegisterBugCheckReasonCallback(
9134 _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
,
9135 _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
,
9136 _In_ KBUGCHECK_CALLBACK_REASON Reason
,
9137 _In_ PUCHAR Component
);
9139 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
9141 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
9142 _IRQL_requires_max_(APC_LEVEL
)
9146 KeFlushQueuedDpcs(VOID
);
9147 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
9148 #if (NTDDI_VERSION >= NTDDI_WS03)
9150 _IRQL_requires_max_(APC_LEVEL
)
9154 KeRegisterNmiCallback(
9155 _In_ PNMI_CALLBACK CallbackRoutine
,
9156 _In_opt_ PVOID Context
);
9158 _IRQL_requires_max_(APC_LEVEL
)
9162 KeDeregisterNmiCallback(
9168 KeInitializeThreadedDpc(
9170 _In_ PKDEFERRED_ROUTINE DeferredRoutine
,
9171 _In_opt_ PVOID DeferredContext
);
9173 _IRQL_requires_min_(PASSIVE_LEVEL
)
9174 _IRQL_requires_max_(IPI_LEVEL
-1)
9179 _In_ PKIPI_BROADCAST_WORKER BroadcastFunction
,
9180 _In_ ULONG_PTR Context
);
9182 _Requires_lock_not_held_(*SpinLock
)
9183 _Acquires_lock_(*SpinLock
)
9184 _IRQL_requires_max_(DISPATCH_LEVEL
)
9189 KeAcquireSpinLockForDpc(
9190 _Inout_ PKSPIN_LOCK SpinLock
);
9192 _Requires_lock_held_(*SpinLock
)
9193 _Releases_lock_(*SpinLock
)
9194 _IRQL_requires_(DISPATCH_LEVEL
)
9198 KeReleaseSpinLockForDpc(
9199 _Inout_ PKSPIN_LOCK SpinLock
,
9200 _In_ _IRQL_restores_ KIRQL OldIrql
);
9202 _Must_inspect_result_
9207 _In_ PKSPIN_LOCK SpinLock
);
9209 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
9210 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
9212 _Must_inspect_result_
9213 _IRQL_requires_min_(DISPATCH_LEVEL
)
9214 _Post_satisfies_(return == 1 || return == 0)
9218 KeTryToAcquireSpinLockAtDpcLevel(
9219 _Inout_
_Requires_lock_not_held_(*_Curr_
)
9220 _When_(return!=0, _Acquires_lock_(*_Curr_
))
9221 PKSPIN_LOCK SpinLock
);
9223 _IRQL_requires_min_(PASSIVE_LEVEL
)
9224 _IRQL_requires_max_(DISPATCH_LEVEL
)
9228 KeAreAllApcsDisabled(VOID
);
9230 _Acquires_lock_(_Global_critical_region_
)
9231 _Requires_lock_not_held_(*Mutex
)
9232 _Acquires_lock_(*Mutex
)
9233 _IRQL_requires_max_(APC_LEVEL
)
9234 _IRQL_requires_min_(PASSIVE_LEVEL
)
9238 KeAcquireGuardedMutex(
9239 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
9241 _Requires_lock_not_held_(*FastMutex
)
9242 _Acquires_lock_(*FastMutex
)
9243 _IRQL_requires_max_(APC_LEVEL
)
9244 _IRQL_requires_min_(PASSIVE_LEVEL
)
9248 KeAcquireGuardedMutexUnsafe(
9249 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
9251 _Acquires_lock_(_Global_critical_region_
)
9252 _IRQL_requires_max_(APC_LEVEL
)
9256 KeEnterGuardedRegion(VOID
);
9258 _Releases_lock_(_Global_critical_region_
)
9259 _IRQL_requires_max_(APC_LEVEL
)
9263 KeLeaveGuardedRegion(VOID
);
9265 _IRQL_requires_max_(APC_LEVEL
)
9266 _IRQL_requires_min_(PASSIVE_LEVEL
)
9270 KeInitializeGuardedMutex(
9271 _Out_ PKGUARDED_MUTEX GuardedMutex
);
9273 _Requires_lock_held_(*FastMutex
)
9274 _Releases_lock_(*FastMutex
)
9275 _IRQL_requires_max_(APC_LEVEL
)
9279 KeReleaseGuardedMutexUnsafe(
9280 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
9282 _Releases_lock_(_Global_critical_region_
)
9283 _Requires_lock_held_(*Mutex
)
9284 _Releases_lock_(*Mutex
)
9285 _IRQL_requires_max_(APC_LEVEL
)
9289 KeReleaseGuardedMutex(
9290 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
9292 _Must_inspect_result_
9293 _Success_(return != FALSE
)
9294 _IRQL_requires_max_(APC_LEVEL
)
9295 _Post_satisfies_(return == 1 || return == 0)
9299 KeTryToAcquireGuardedMutex(
9300 _When_ (return, _Requires_lock_not_held_(*_Curr_
) _Acquires_exclusive_lock_(*_Curr_
)) _Acquires_lock_(_Global_critical_region_
)
9301 _Inout_ PKGUARDED_MUTEX GuardedMutex
);
9302 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
9304 #if (NTDDI_VERSION >= NTDDI_VISTA)
9305 _Requires_lock_not_held_(*LockHandle
)
9306 _Acquires_lock_(*LockHandle
)
9307 _Post_same_lock_(*SpinLock
, *LockHandle
)
9308 _IRQL_requires_max_(DISPATCH_LEVEL
)
9309 _IRQL_saves_global_(QueuedSpinLock
,LockHandle
)
9313 KeAcquireInStackQueuedSpinLockForDpc(
9314 _Inout_ PKSPIN_LOCK SpinLock
,
9315 _Out_ PKLOCK_QUEUE_HANDLE LockHandle
);
9317 _Requires_lock_held_(*LockHandle
)
9318 _Releases_lock_(*LockHandle
)
9319 _IRQL_requires_(DISPATCH_LEVEL
)
9320 _IRQL_restores_global_(QueuedSpinLock
,LockHandle
)
9324 KeReleaseInStackQueuedSpinLockForDpc(
9325 _In_ PKLOCK_QUEUE_HANDLE LockHandle
);
9327 _IRQL_requires_(DISPATCH_LEVEL
)
9331 KeQueryDpcWatchdogInformation(
9332 _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation
);
9333 #if defined(SINGLE_GROUP_LEGACY_API)
9335 _IRQL_requires_min_(PASSIVE_LEVEL
)
9336 _IRQL_requires_max_(APC_LEVEL
)
9340 KeSetSystemAffinityThreadEx(
9341 _In_ KAFFINITY Affinity
);
9343 _IRQL_requires_min_(PASSIVE_LEVEL
)
9344 _IRQL_requires_max_(APC_LEVEL
)
9348 KeRevertToUserAffinityThreadEx(
9349 _In_ KAFFINITY Affinity
);
9354 KeQueryActiveProcessorCount(
9355 _Out_opt_ PKAFFINITY ActiveProcessors
);
9360 KeQueryMaximumProcessorCount(VOID
);
9361 #endif /* SINGLE_GROUP_LEGACY_API */
9363 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
9365 #if (NTDDI_VERSION >= NTDDI_WS08)
9367 _IRQL_requires_max_(APC_LEVEL
)
9370 KeRegisterProcessorChangeCallback(
9371 _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction
,
9372 _In_opt_ PVOID CallbackContext
,
9375 _IRQL_requires_max_(APC_LEVEL
)
9378 KeDeregisterProcessorChangeCallback(
9379 _In_ PVOID CallbackHandle
);
9381 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
9382 #if (NTDDI_VERSION >= NTDDI_WIN7)
9384 _IRQL_requires_max_(DISPATCH_LEVEL
)
9385 _IRQL_requires_min_(PASSIVE_LEVEL
)
9386 _IRQL_requires_same_
9389 KeQueryTotalCycleTimeProcess(
9390 _Inout_ PKPROCESS Process
,
9391 _Out_ PULONG64 CycleTimeStamp
);
9393 _IRQL_requires_max_(APC_LEVEL
)
9394 _IRQL_requires_min_(PASSIVE_LEVEL
)
9395 _IRQL_requires_same_
9398 KeQueryTotalCycleTimeThread(
9399 _Inout_ PKTHREAD Thread
,
9400 _Out_ PULONG64 CycleTimeStamp
);
9402 _Must_inspect_result_
9406 KeSetTargetProcessorDpcEx(
9408 _In_ PPROCESSOR_NUMBER ProcNumber
);
9410 _IRQL_requires_min_(PASSIVE_LEVEL
)
9411 _IRQL_requires_max_(APC_LEVEL
)
9415 KeSetSystemGroupAffinityThread(
9416 _In_ PGROUP_AFFINITY Affinity
,
9417 _Out_opt_ PGROUP_AFFINITY PreviousAffinity
);
9419 _IRQL_requires_min_(PASSIVE_LEVEL
)
9420 _IRQL_requires_max_(APC_LEVEL
)
9424 KeRevertToUserGroupAffinityThread(
9425 _In_ PGROUP_AFFINITY PreviousAffinity
);
9427 _IRQL_requires_max_(DISPATCH_LEVEL
)
9431 KeSetCoalescableTimer(
9432 _Inout_ PKTIMER Timer
,
9433 _In_ LARGE_INTEGER DueTime
,
9435 _In_ ULONG TolerableDelay
,
9436 _In_opt_ PKDPC Dpc
);
9441 KeQueryUnbiasedInterruptTime(VOID
);
9446 KeQueryActiveProcessorCountEx(
9447 _In_ USHORT GroupNumber
);
9452 KeQueryMaximumProcessorCountEx(
9453 _In_ USHORT GroupNumber
);
9458 KeQueryActiveGroupCount(VOID
);
9463 KeQueryMaximumGroupCount(VOID
);
9468 KeQueryGroupAffinity(
9469 _In_ USHORT GroupNumber
);
9474 KeGetCurrentProcessorNumberEx(
9475 _Out_opt_ PPROCESSOR_NUMBER ProcNumber
);
9480 KeQueryNodeActiveAffinity(
9481 _In_ USHORT NodeNumber
,
9482 _Out_opt_ PGROUP_AFFINITY Affinity
,
9483 _Out_opt_ PUSHORT Count
);
9488 KeQueryNodeMaximumProcessorCount(
9489 _In_ USHORT NodeNumber
);
9494 KeQueryHighestNodeNumber(VOID
);
9499 KeGetCurrentNodeNumber(VOID
);
9501 _IRQL_requires_max_(DISPATCH_LEVEL
)
9505 KeQueryLogicalProcessorRelationship(
9506 _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
9507 _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
9508 _Out_writes_bytes_opt_(*Length
) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information
,
9509 _Inout_ PULONG Length
);
9511 _Must_inspect_result_
9512 _IRQL_requires_max_(DISPATCH_LEVEL
)
9514 _When_(return==0, _Kernel_float_saved_
)
9518 KeSaveExtendedProcessorState(
9520 _Out_
_Requires_lock_not_held_(*_Curr_
)
9521 _When_(return==0, _Acquires_lock_(*_Curr_
))
9522 PXSTATE_SAVE XStateSave
);
9524 _Kernel_float_restored_
9528 KeRestoreExtendedProcessorState(
9529 _In_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
9530 PXSTATE_SAVE XStateSave
);
9534 KeGetProcessorNumberFromIndex(
9535 _In_ ULONG ProcIndex
,
9536 _Out_ PPROCESSOR_NUMBER ProcNumber
);
9540 KeGetProcessorIndexFromNumber(
9541 _In_ PPROCESSOR_NUMBER ProcNumber
);
9542 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
9543 #if !defined(_IA64_)
9547 KeFlushWriteBuffer(VOID
);
9551 * KeInitializeCallbackRecord(
9552 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
9554 #define KeInitializeCallbackRecord(CallbackRecord) \
9555 CallbackRecord->State = BufferEmpty;
9557 #if defined(_PREFAST_)
9559 void __PREfastPagedCode(void);
9560 void __PREfastPagedCodeLocked(void);
9561 #define PAGED_CODE() __PREfastPagedCode();
9562 #define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked();
9566 #if (NTDDI_VERSION >= NTDDI_VISTA)
9567 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
9569 #define PAGED_ASSERT( exp ) ASSERT( exp )
9572 #define PAGED_CODE() { \
9573 if (KeGetCurrentIrql() > APC_LEVEL) { \
9574 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
9575 PAGED_ASSERT(FALSE); \
9579 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
9583 #define PAGED_CODE() NOP_FUNCTION;
9584 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
9588 /******************************************************************************
9589 * Runtime Library Functions *
9590 ******************************************************************************/
9593 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
9595 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
9600 _Out_ PLIST_ENTRY ListHead
)
9602 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
9605 _Must_inspect_result_
9609 _In_
const LIST_ENTRY
* ListHead
)
9611 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
9617 _In_ PLIST_ENTRY Entry
)
9619 PLIST_ENTRY OldFlink
;
9620 PLIST_ENTRY OldBlink
;
9622 OldFlink
= Entry
->Flink
;
9623 OldBlink
= Entry
->Blink
;
9624 OldFlink
->Blink
= OldBlink
;
9625 OldBlink
->Flink
= OldFlink
;
9626 return (BOOLEAN
)(OldFlink
== OldBlink
);
9632 _Inout_ PLIST_ENTRY ListHead
)
9637 Entry
= ListHead
->Flink
;
9638 Flink
= Entry
->Flink
;
9639 ListHead
->Flink
= Flink
;
9640 Flink
->Blink
= ListHead
;
9647 _Inout_ PLIST_ENTRY ListHead
)
9652 Entry
= ListHead
->Blink
;
9653 Blink
= Entry
->Blink
;
9654 ListHead
->Blink
= Blink
;
9655 Blink
->Flink
= ListHead
;
9662 _Inout_ PLIST_ENTRY ListHead
,
9663 _Inout_ __drv_aliasesMem PLIST_ENTRY Entry
)
9665 PLIST_ENTRY OldBlink
;
9666 OldBlink
= ListHead
->Blink
;
9667 Entry
->Flink
= ListHead
;
9668 Entry
->Blink
= OldBlink
;
9669 OldBlink
->Flink
= Entry
;
9670 ListHead
->Blink
= Entry
;
9676 _Inout_ PLIST_ENTRY ListHead
,
9677 _Inout_ __drv_aliasesMem PLIST_ENTRY Entry
)
9679 PLIST_ENTRY OldFlink
;
9680 OldFlink
= ListHead
->Flink
;
9681 Entry
->Flink
= OldFlink
;
9682 Entry
->Blink
= ListHead
;
9683 OldFlink
->Blink
= Entry
;
9684 ListHead
->Flink
= Entry
;
9690 _Inout_ PLIST_ENTRY ListHead
,
9691 _Inout_ PLIST_ENTRY ListToAppend
)
9693 PLIST_ENTRY ListEnd
= ListHead
->Blink
;
9695 ListHead
->Blink
->Flink
= ListToAppend
;
9696 ListHead
->Blink
= ListToAppend
->Blink
;
9697 ListToAppend
->Blink
->Flink
= ListHead
;
9698 ListToAppend
->Blink
= ListEnd
;
9704 _Inout_ PSINGLE_LIST_ENTRY ListHead
)
9706 PSINGLE_LIST_ENTRY FirstEntry
;
9707 FirstEntry
= ListHead
->Next
;
9708 if (FirstEntry
!= NULL
) {
9709 ListHead
->Next
= FirstEntry
->Next
;
9717 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
9718 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry
)
9720 Entry
->Next
= ListHead
->Next
;
9721 ListHead
->Next
= Entry
;
9724 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
9731 _In_ PVOID FailedAssertion
,
9732 _In_ PVOID FileName
,
9733 _In_ ULONG LineNumber
,
9734 _In_opt_z_ PSTR Message
);
9738 * IN VOID UNALIGNED *Destination,
9739 * IN CONST VOID UNALIGNED *Source,
9742 #define RtlCopyMemory(Destination, Source, Length) \
9743 memcpy(Destination, Source, Length)
9745 #define RtlCopyBytes RtlCopyMemory
9747 #if defined(_M_AMD64)
9751 RtlCopyMemoryNonTemporal(
9752 _Out_writes_bytes_all_(Length
) VOID UNALIGNED
*Destination
,
9753 _In_reads_bytes_(Length
) const VOID UNALIGNED
*Source
,
9754 _In_ SIZE_T Length
);
9756 #define RtlCopyMemoryNonTemporal RtlCopyMemory
9764 #define RtlEqualLuid(Luid1, Luid2) \
9765 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
9769 * IN VOID UNALIGNED *Destination,
9770 * IN CONST VOID UNALIGNED *Source,
9773 #define RtlEqualMemory(Destination, Source, Length) \
9774 (!memcmp(Destination, Source, Length))
9778 * IN VOID UNALIGNED *Destination,
9782 #define RtlFillMemory(Destination, Length, Fill) \
9783 memset(Destination, Fill, Length)
9785 #define RtlFillBytes RtlFillMemory
9787 _IRQL_requires_max_(PASSIVE_LEVEL
)
9791 RtlFreeUnicodeString(
9792 _Inout_
_At_(UnicodeString
->Buffer
, __drv_freesMem(Mem
))
9793 PUNICODE_STRING UnicodeString
);
9795 _IRQL_requires_max_(PASSIVE_LEVEL
)
9796 _Must_inspect_result_
9801 _In_ PUNICODE_STRING GuidString
,
9804 _IRQL_requires_max_(DISPATCH_LEVEL
)
9805 _At_(DestinationString
->Buffer
, _Post_equal_to_(SourceString
))
9806 _When_(SourceString
!= NULL
,
9807 _At_(DestinationString
->Length
, _Post_equal_to_(_String_length_(SourceString
) * sizeof(WCHAR
)))
9808 _At_(DestinationString
->MaximumLength
, _Post_equal_to_(DestinationString
->Length
+ sizeof(WCHAR
))))
9809 _When_(SourceString
== NULL
,
9810 _At_(DestinationString
->Length
, _Post_equal_to_(0))
9811 _At_(DestinationString
->MaximumLength
, _Post_equal_to_(0)))
9815 RtlInitUnicodeString(
9816 _Out_ PUNICODE_STRING DestinationString
,
9817 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
);
9821 * IN VOID UNALIGNED *Destination,
9822 * IN CONST VOID UNALIGNED *Source,
9825 #define RtlMoveMemory(Destination, Source, Length) \
9826 memmove(Destination, Source, Length)
9828 _IRQL_requires_max_(PASSIVE_LEVEL
)
9829 _Must_inspect_result_
9835 _Out_
_At_(GuidString
->Buffer
, __drv_allocatesMem(Mem
))
9836 PUNICODE_STRING GuidString
);
9840 * IN VOID UNALIGNED *Destination,
9843 #define RtlZeroMemory(Destination, Length) \
9844 memset(Destination, 0, Length)
9846 #define RtlZeroBytes RtlZeroMemory
9848 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9850 _Must_inspect_result_
9855 _In_ PRTL_BITMAP BitMapHeader
,
9856 _In_ ULONG StartingIndex
,
9859 _Must_inspect_result_
9864 _In_ PRTL_BITMAP BitMapHeader
,
9865 _In_ ULONG StartingIndex
,
9868 _IRQL_requires_max_(PASSIVE_LEVEL
)
9869 _Must_inspect_result_
9873 RtlAnsiStringToUnicodeString(
9874 _When_(AllocateDestinationString
, _Out_
_At_(DestinationString
->Buffer
, __drv_allocatesMem(Mem
)))
9875 _When_(!AllocateDestinationString
, _Inout_
)
9876 PUNICODE_STRING DestinationString
,
9877 _In_ PANSI_STRING SourceString
,
9878 _In_ BOOLEAN AllocateDestinationString
);
9880 _IRQL_requires_max_(PASSIVE_LEVEL
)
9884 RtlxAnsiStringToUnicodeSize(
9885 _In_ PCANSI_STRING AnsiString
);
9887 #define RtlAnsiStringToUnicodeSize(String) ( \
9888 NLS_MB_CODE_PAGE_TAG ? \
9889 RtlxAnsiStringToUnicodeSize(String) : \
9890 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
9894 _Unchanged_(Destination
->MaximumLength
)
9895 _Unchanged_(Destination
->Buffer
)
9896 _When_(_Old_(Destination
->Length
) + Source
->Length
<= Destination
->MaximumLength
,
9897 _At_(Destination
->Length
, _Post_equal_to_(_Old_(Destination
->Length
) + Source
->Length
))
9898 _At_(return, _Out_range_(==, 0)))
9899 _When_(_Old_(Destination
->Length
) + Source
->Length
> Destination
->MaximumLength
,
9900 _Unchanged_(Destination
->Length
)
9901 _At_(return, _Out_range_(<, 0)))
9905 RtlAppendUnicodeStringToString(
9906 _Inout_ PUNICODE_STRING Destination
,
9907 _In_ PCUNICODE_STRING Source
);
9910 _Unchanged_(Destination
->MaximumLength
)
9911 _Unchanged_(Destination
->Buffer
)
9912 /* _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) <= Destination->MaximumLength,
9913 _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR)))
9914 _At_(return, _Out_range_(==, 0)))
9915 _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) > Destination->MaximumLength,
9916 _Unchanged_(Destination->Length)
9917 _At_(return, _Out_range_(<, 0))) */
9921 RtlAppendUnicodeToString(
9922 _Inout_ PUNICODE_STRING Destination
,
9923 _In_opt_z_ PCWSTR Source
);
9925 _IRQL_requires_max_(PASSIVE_LEVEL
)
9926 _Must_inspect_result_
9930 RtlCheckRegistryKey(
9931 _In_ ULONG RelativeTo
,
9938 _In_ PRTL_BITMAP BitMapHeader
);
9944 _In_ PRTL_BITMAP BitMapHeader
,
9945 _In_range_(0, BitMapHeader
->SizeOfBitMap
- NumberToClear
) ULONG StartingIndex
,
9946 _In_range_(0, BitMapHeader
->SizeOfBitMap
- StartingIndex
) ULONG NumberToClear
);
9948 _Must_inspect_result_
9953 _In_
const VOID
*Source1
,
9954 _In_
const VOID
*Source2
,
9955 _In_ SIZE_T Length
);
9957 _IRQL_requires_max_(PASSIVE_LEVEL
)
9958 _Must_inspect_result_
9962 RtlCompareUnicodeString(
9963 _In_ PCUNICODE_STRING String1
,
9964 _In_ PCUNICODE_STRING String2
,
9965 _In_ BOOLEAN CaseInSensitive
);
9967 _IRQL_requires_max_(PASSIVE_LEVEL
)
9968 _Must_inspect_result_
9972 RtlCompareUnicodeStrings(
9973 _In_reads_(String1Length
) PCWCH String1
,
9974 _In_ SIZE_T String1Length
,
9975 _In_reads_(String2Length
) PCWCH String2
,
9976 _In_ SIZE_T String2Length
,
9977 _In_ BOOLEAN CaseInSensitive
);
9979 _Unchanged_(DestinationString
->Buffer
)
9980 _Unchanged_(DestinationString
->MaximumLength
)
9981 _At_(DestinationString
->Length
,
9982 _When_(SourceString
->Length
> DestinationString
->MaximumLength
,
9983 _Post_equal_to_(DestinationString
->MaximumLength
))
9984 _When_(SourceString
->Length
<= DestinationString
->MaximumLength
,
9985 _Post_equal_to_(SourceString
->Length
)))
9989 RtlCopyUnicodeString(
9990 _Inout_ PUNICODE_STRING DestinationString
,
9991 _In_opt_ PCUNICODE_STRING SourceString
);
9993 _IRQL_requires_max_(PASSIVE_LEVEL
)
9997 RtlCreateRegistryKey(
9998 _In_ ULONG RelativeTo
,
10001 _IRQL_requires_max_(APC_LEVEL
)
10005 RtlCreateSecurityDescriptor(
10006 _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
10007 _In_ ULONG Revision
);
10009 _IRQL_requires_max_(PASSIVE_LEVEL
)
10013 RtlDeleteRegistryValue(
10014 _In_ ULONG RelativeTo
,
10016 _In_z_ PCWSTR ValueName
);
10018 _IRQL_requires_max_(PASSIVE_LEVEL
)
10019 _Must_inspect_result_
10023 RtlEqualUnicodeString(
10024 _In_ CONST UNICODE_STRING
*String1
,
10025 _In_ CONST UNICODE_STRING
*String2
,
10026 _In_ BOOLEAN CaseInSensitive
);
10028 #if !defined(_AMD64_) && !defined(_IA64_)
10032 RtlExtendedIntegerMultiply(
10033 _In_ LARGE_INTEGER Multiplicand
,
10034 _In_ LONG Multiplier
);
10039 RtlExtendedLargeIntegerDivide(
10040 _In_ LARGE_INTEGER Dividend
,
10041 _In_ ULONG Divisor
,
10042 _Out_opt_ PULONG Remainder
);
10045 #if defined(_X86_) || defined(_IA64_)
10049 RtlExtendedMagicDivide(
10050 _In_ LARGE_INTEGER Dividend
,
10051 _In_ LARGE_INTEGER MagicDivisor
,
10052 _In_ CCHAR ShiftCount
);
10055 _IRQL_requires_max_(PASSIVE_LEVEL
)
10060 _Inout_
_At_(AnsiString
->Buffer
, __drv_freesMem(Mem
))
10061 PANSI_STRING AnsiString
);
10063 _Success_(return != -1)
10064 _Must_inspect_result_
10069 _In_ PRTL_BITMAP BitMapHeader
,
10070 _In_ ULONG NumberToFind
,
10071 _In_ ULONG HintIndex
);
10073 _Success_(return != -1)
10077 RtlFindClearBitsAndSet(
10078 _In_ PRTL_BITMAP BitMapHeader
,
10079 _In_ ULONG NumberToFind
,
10080 _In_ ULONG HintIndex
);
10085 RtlFindFirstRunClear(
10086 _In_ PRTL_BITMAP BitMapHeader
,
10087 _Out_ PULONG StartingIndex
);
10093 _In_ PRTL_BITMAP BitMapHeader
,
10094 _Out_writes_to_(SizeOfRunArray
, return) PRTL_BITMAP_RUN RunArray
,
10095 _In_range_(>, 0) ULONG SizeOfRunArray
,
10096 _In_ BOOLEAN LocateLongestRuns
);
10101 RtlFindLastBackwardRunClear(
10102 _In_ PRTL_BITMAP BitMapHeader
,
10103 _In_ ULONG FromIndex
,
10104 _Out_ PULONG StartingRunIndex
);
10106 _Success_(return != -1)
10107 _Must_inspect_result_
10111 RtlFindLeastSignificantBit(
10112 _In_ ULONGLONG Set
);
10117 RtlFindLongestRunClear(
10118 _In_ PRTL_BITMAP BitMapHeader
,
10119 _Out_ PULONG StartingIndex
);
10121 _Success_(return != -1)
10122 _Must_inspect_result_
10126 RtlFindMostSignificantBit(
10127 _In_ ULONGLONG Set
);
10132 RtlFindNextForwardRunClear(
10133 _In_ PRTL_BITMAP BitMapHeader
,
10134 _In_ ULONG FromIndex
,
10135 _Out_ PULONG StartingRunIndex
);
10137 _Success_(return != -1)
10138 _Must_inspect_result_
10143 _In_ PRTL_BITMAP BitMapHeader
,
10144 _In_ ULONG NumberToFind
,
10145 _In_ ULONG HintIndex
);
10147 _Success_(return != -1)
10151 RtlFindSetBitsAndClear(
10152 _In_ PRTL_BITMAP BitMapHeader
,
10153 _In_ ULONG NumberToFind
,
10154 _In_ ULONG HintIndex
);
10156 _IRQL_requires_max_(DISPATCH_LEVEL
)
10161 _Out_ PANSI_STRING DestinationString
,
10162 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
);
10164 _At_(BitMapHeader
->SizeOfBitMap
, _Post_equal_to_(SizeOfBitMap
))
10165 _At_(BitMapHeader
->Buffer
, _Post_equal_to_(BitMapBuffer
))
10169 RtlInitializeBitMap(
10170 _Out_ PRTL_BITMAP BitMapHeader
,
10171 _In_opt_ __drv_aliasesMem PULONG BitMapBuffer
,
10172 _In_opt_ ULONG SizeOfBitMap
);
10174 _IRQL_requires_max_(DISPATCH_LEVEL
)
10179 _Out_ PSTRING DestinationString
,
10180 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
);
10182 _IRQL_requires_max_(PASSIVE_LEVEL
)
10183 _At_(String
->MaximumLength
, _Const_
)
10187 RtlIntegerToUnicodeString(
10189 _In_opt_ ULONG Base
,
10190 _Inout_ PUNICODE_STRING String
);
10192 _IRQL_requires_max_(PASSIVE_LEVEL
)
10193 _At_(String
->MaximumLength
, _Const_
)
10197 RtlInt64ToUnicodeString(
10198 _In_ ULONGLONG Value
,
10199 _In_opt_ ULONG Base
,
10200 _Inout_ PUNICODE_STRING String
);
10203 #define RtlIntPtrToUnicodeString(Value, Base, String) \
10204 RtlInt64ToUnicodeString(Value, Base, String)
10206 #define RtlIntPtrToUnicodeString(Value, Base, String) \
10207 RtlIntegerToUnicodeString(Value, Base, String)
10214 #define RtlIsZeroLuid(_L1) \
10215 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
10217 _IRQL_requires_max_(APC_LEVEL
)
10221 RtlLengthSecurityDescriptor(
10222 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
10227 RtlNumberOfClearBits(
10228 _In_ PRTL_BITMAP BitMapHeader
);
10233 RtlNumberOfSetBits(
10234 _In_ PRTL_BITMAP BitMapHeader
);
10236 _IRQL_requires_max_(PASSIVE_LEVEL
)
10240 RtlQueryRegistryValues(
10241 _In_ ULONG RelativeTo
,
10243 _Inout_
_At_(*(*QueryTable
).EntryContext
, _Pre_unknown_
)
10244 PRTL_QUERY_REGISTRY_TABLE QueryTable
,
10245 _In_opt_ PVOID Context
,
10246 _In_opt_ PVOID Environment
);
10248 #define SHORT_SIZE (sizeof(USHORT))
10249 #define SHORT_MASK (SHORT_SIZE - 1)
10250 #define LONG_SIZE (sizeof(LONG))
10251 #define LONGLONG_SIZE (sizeof(LONGLONG))
10252 #define LONG_MASK (LONG_SIZE - 1)
10253 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
10254 #define LOWBYTE_MASK 0x00FF
10256 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
10257 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
10258 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
10259 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
10265 _In_ PRTL_BITMAP BitMapHeader
);
10271 _In_ PRTL_BITMAP BitMapHeader
,
10272 _In_range_(0, BitMapHeader
->SizeOfBitMap
- NumberToSet
) ULONG StartingIndex
,
10273 _In_range_(0, BitMapHeader
->SizeOfBitMap
- StartingIndex
) ULONG NumberToSet
);
10275 _IRQL_requires_max_(APC_LEVEL
)
10279 RtlSetDaclSecurityDescriptor(
10280 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
10281 _In_ BOOLEAN DaclPresent
,
10282 _In_opt_ PACL Dacl
,
10283 _In_opt_ BOOLEAN DaclDefaulted
);
10285 #if defined(_AMD64_)
10289 * IN PULONG Address,
10292 #define RtlStoreUlong(Address,Value) \
10293 *(ULONG UNALIGNED *)(Address) = (Value)
10296 * RtlStoreUlonglong(
10297 * IN OUT PULONGLONG Address,
10298 * ULONGLONG Value);
10300 #define RtlStoreUlonglong(Address,Value) \
10301 *(ULONGLONG UNALIGNED *)(Address) = (Value)
10305 * IN PUSHORT Address,
10306 * IN USHORT Value);
10308 #define RtlStoreUshort(Address,Value) \
10309 *(USHORT UNALIGNED *)(Address) = (Value)
10312 * RtlRetrieveUshort(
10313 * PUSHORT DestinationAddress,
10314 * PUSHORT SourceAddress);
10316 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
10317 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
10320 * RtlRetrieveUlong(
10321 * PULONG DestinationAddress,
10322 * PULONG SourceAddress);
10324 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
10325 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
10329 #define RtlStoreUlong(Address,Value) \
10330 if ((ULONG_PTR)(Address) & LONG_MASK) { \
10331 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
10332 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
10333 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
10334 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
10337 *((PULONG)(Address)) = (ULONG) (Value); \
10340 #define RtlStoreUlonglong(Address,Value) \
10341 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
10342 RtlStoreUlong((ULONG_PTR)(Address), \
10343 (ULONGLONG)(Value) & 0xFFFFFFFF); \
10344 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
10345 (ULONGLONG)(Value) >> 32); \
10347 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
10350 #define RtlStoreUshort(Address,Value) \
10351 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
10352 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
10353 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
10356 *((PUSHORT) (Address)) = (USHORT)Value; \
10359 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
10360 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
10362 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
10363 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
10367 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
10370 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
10371 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
10373 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
10374 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
10375 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
10376 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
10380 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
10383 #endif /* defined(_AMD64_) */
10387 * RtlStoreUlongPtr(
10388 * IN OUT PULONG_PTR Address,
10389 * IN ULONG_PTR Value);
10391 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
10393 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
10394 #endif /* _WIN64 */
10396 _Success_(return!=FALSE
)
10397 _Must_inspect_result_
10401 RtlTimeFieldsToTime(
10402 _In_ PTIME_FIELDS TimeFields
,
10403 _Out_ PLARGE_INTEGER Time
);
10408 RtlTimeToTimeFields(
10409 _In_ PLARGE_INTEGER Time
,
10410 _Out_ PTIME_FIELDS TimeFields
);
10416 _In_ ULONG Source
);
10421 RtlUlonglongByteSwap(
10422 _In_ ULONGLONG Source
);
10424 _When_(AllocateDestinationString
,
10425 _At_(DestinationString
->MaximumLength
,
10426 _Out_range_(<=, (SourceString
->MaximumLength
/ sizeof(WCHAR
)))))
10427 _When_(!AllocateDestinationString
,
10428 _At_(DestinationString
->Buffer
, _Const_
)
10429 _At_(DestinationString
->MaximumLength
, _Const_
))
10430 _IRQL_requires_max_(PASSIVE_LEVEL
)
10431 _When_(AllocateDestinationString
, _Must_inspect_result_
)
10435 RtlUnicodeStringToAnsiString(
10436 _When_(AllocateDestinationString
, _Out_
_At_(DestinationString
->Buffer
, __drv_allocatesMem(Mem
)))
10437 _When_(!AllocateDestinationString
, _Inout_
)
10438 PANSI_STRING DestinationString
,
10439 _In_ PCUNICODE_STRING SourceString
,
10440 _In_ BOOLEAN AllocateDestinationString
);
10442 _IRQL_requires_max_(PASSIVE_LEVEL
)
10446 RtlxUnicodeStringToAnsiSize(
10447 _In_ PCUNICODE_STRING UnicodeString
);
10449 #define RtlUnicodeStringToAnsiSize(String) ( \
10450 NLS_MB_CODE_PAGE_TAG ? \
10451 RtlxUnicodeStringToAnsiSize(String) : \
10452 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
10455 _IRQL_requires_max_(PASSIVE_LEVEL
)
10459 RtlUnicodeStringToInteger(
10460 _In_ PCUNICODE_STRING String
,
10461 _In_opt_ ULONG Base
,
10462 _Out_ PULONG Value
);
10464 _IRQL_requires_max_(PASSIVE_LEVEL
)
10468 RtlUpcaseUnicodeChar(
10469 _In_ WCHAR SourceCharacter
);
10475 _In_ USHORT Source
);
10477 _IRQL_requires_max_(APC_LEVEL
)
10478 _Must_inspect_result_
10482 RtlValidRelativeSecurityDescriptor(
10483 _In_reads_bytes_(SecurityDescriptorLength
) PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
10484 _In_ ULONG SecurityDescriptorLength
,
10485 _In_ SECURITY_INFORMATION RequiredInformation
);
10487 _IRQL_requires_max_(APC_LEVEL
)
10488 _Must_inspect_result_
10492 RtlValidSecurityDescriptor(
10493 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
10495 _IRQL_requires_max_(PASSIVE_LEVEL
)
10501 _At_(lpVersionInformation
->dwOSVersionInfoSize
, _Pre_ _Valid_
)
10502 _When_(lpVersionInformation
->dwOSVersionInfoSize
== sizeof(RTL_OSVERSIONINFOEXW
),
10503 _At_((PRTL_OSVERSIONINFOEXW
)lpVersionInformation
, _Out_
))
10504 PRTL_OSVERSIONINFOW lpVersionInformation
);
10506 _IRQL_requires_max_(PASSIVE_LEVEL
)
10507 _Must_inspect_result_
10511 RtlVerifyVersionInfo(
10512 _In_ PRTL_OSVERSIONINFOEXW VersionInfo
,
10513 _In_ ULONG TypeMask
,
10514 _In_ ULONGLONG ConditionMask
);
10516 _IRQL_requires_max_(PASSIVE_LEVEL
)
10520 RtlWriteRegistryValue(
10521 _In_ ULONG RelativeTo
,
10523 _In_z_ PCWSTR ValueName
,
10524 _In_ ULONG ValueType
,
10525 _In_reads_bytes_opt_(ValueLength
) PVOID ValueData
,
10526 _In_ ULONG ValueLength
);
10529 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10532 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
10536 RtlPrefetchMemoryNonTemporal(
10538 _In_ SIZE_T Length
);
10542 #if (NTDDI_VERSION >= NTDDI_WINXP)
10549 _In_ PRTL_BITMAP BitMapHeader
,
10550 _In_range_(<, BitMapHeader
->SizeOfBitMap
) ULONG BitNumber
);
10552 _IRQL_requires_max_(PASSIVE_LEVEL
)
10556 RtlDowncaseUnicodeChar(
10557 _In_ WCHAR SourceCharacter
);
10563 _In_ PRTL_BITMAP BitMapHeader
,
10564 _In_range_(<, BitMapHeader
->SizeOfBitMap
) ULONG BitNumber
);
10566 _Must_inspect_result_
10571 _In_ PRTL_BITMAP BitMapHeader
,
10572 _In_range_(<, BitMapHeader
->SizeOfBitMap
) ULONG BitNumber
);
10574 _IRQL_requires_max_(PASSIVE_LEVEL
)
10578 RtlHashUnicodeString(
10579 _In_ CONST UNICODE_STRING
*String
,
10580 _In_ BOOLEAN CaseInSensitive
,
10581 _In_ ULONG HashAlgorithm
,
10582 _Out_ PULONG HashValue
);
10586 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10589 #if (NTDDI_VERSION >= NTDDI_VISTA)
10594 RtlNumberOfSetBitsUlongPtr(
10595 _In_ ULONG_PTR Target
);
10600 RtlIoDecodeMemIoResource(
10601 _In_
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
10602 _Out_opt_ PULONGLONG Alignment
,
10603 _Out_opt_ PULONGLONG MinimumAddress
,
10604 _Out_opt_ PULONGLONG MaximumAddress
);
10609 RtlIoEncodeMemIoResource(
10610 _In_
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
10612 _In_ ULONGLONG Length
,
10613 _In_ ULONGLONG Alignment
,
10614 _In_ ULONGLONG MinimumAddress
,
10615 _In_ ULONGLONG MaximumAddress
);
10620 RtlCmDecodeMemIoResource(
10621 _In_
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
*Descriptor
,
10622 _Out_opt_ PULONGLONG Start
);
10627 RtlFindClosestEncodableLength(
10628 _In_ ULONGLONG SourceLength
,
10629 _Out_ PULONGLONG TargetLength
);
10634 RtlCmEncodeMemIoResource(
10635 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
,
10637 _In_ ULONGLONG Length
,
10638 _In_ ULONGLONG Start
);
10641 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10643 #if (NTDDI_VERSION >= NTDDI_WIN7)
10645 _IRQL_requires_max_(PASSIVE_LEVEL
)
10646 _Must_inspect_result_
10651 _Out_writes_bytes_to_(UTF8StringMaxByteCount
, *UTF8StringActualByteCount
)
10652 PCHAR UTF8StringDestination
,
10653 _In_ ULONG UTF8StringMaxByteCount
,
10654 _Out_ PULONG UTF8StringActualByteCount
,
10655 _In_reads_bytes_(UnicodeStringByteCount
) PCWCH UnicodeStringSource
,
10656 _In_ ULONG UnicodeStringByteCount
);
10658 _IRQL_requires_max_(PASSIVE_LEVEL
)
10659 _Must_inspect_result_
10664 _Out_writes_bytes_to_(UnicodeStringMaxByteCount
, *UnicodeStringActualByteCount
)
10665 PWSTR UnicodeStringDestination
,
10666 _In_ ULONG UnicodeStringMaxByteCount
,
10667 _Out_ PULONG UnicodeStringActualByteCount
,
10668 _In_reads_bytes_(UTF8StringByteCount
) PCCH UTF8StringSource
,
10669 _In_ ULONG UTF8StringByteCount
);
10674 RtlGetEnabledExtendedFeatures(
10675 IN ULONG64 FeatureMask
);
10678 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
10681 #if !defined(MIDL_PASS)
10682 /* inline funftions */
10683 //DECLSPEC_DEPRECATED_DDK_WINXP
10687 RtlConvertLongToLargeInteger(
10688 _In_ LONG SignedInteger
)
10691 ret
.QuadPart
= SignedInteger
;
10695 //DECLSPEC_DEPRECATED_DDK_WINXP
10699 RtlConvertUlongToLargeInteger(
10700 _In_ ULONG UnsignedInteger
)
10703 ret
.QuadPart
= UnsignedInteger
;
10707 //DECLSPEC_DEPRECATED_DDK_WINXP
10711 RtlLargeIntegerShiftLeft(
10712 _In_ LARGE_INTEGER LargeInteger
,
10713 _In_ CCHAR ShiftCount
)
10715 LARGE_INTEGER Result
;
10717 Result
.QuadPart
= LargeInteger
.QuadPart
<< ShiftCount
;
10721 //DECLSPEC_DEPRECATED_DDK_WINXP
10725 RtlLargeIntegerShiftRight(
10726 _In_ LARGE_INTEGER LargeInteger
,
10727 _In_ CCHAR ShiftCount
)
10729 LARGE_INTEGER Result
;
10731 Result
.QuadPart
= (ULONG64
)LargeInteger
.QuadPart
>> ShiftCount
;
10735 //DECLSPEC_DEPRECATED_DDK
10739 RtlEnlargedUnsignedDivide(
10740 _In_ ULARGE_INTEGER Dividend
,
10741 _In_ ULONG Divisor
,
10742 _Out_opt_ PULONG Remainder
)
10745 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
10746 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
10749 //DECLSPEC_DEPRECATED_DDK
10753 RtlLargeIntegerNegate(
10754 _In_ LARGE_INTEGER Subtrahend
)
10756 LARGE_INTEGER Difference
;
10758 Difference
.QuadPart
= -Subtrahend
.QuadPart
;
10762 //DECLSPEC_DEPRECATED_DDK
10766 RtlLargeIntegerSubtract(
10767 _In_ LARGE_INTEGER Minuend
,
10768 _In_ LARGE_INTEGER Subtrahend
)
10770 LARGE_INTEGER Difference
;
10772 Difference
.QuadPart
= Minuend
.QuadPart
- Subtrahend
.QuadPart
;
10776 //DECLSPEC_DEPRECATED_DDK
10780 RtlEnlargedUnsignedMultiply(
10781 _In_ ULONG Multiplicand
,
10782 _In_ ULONG Multiplier
)
10785 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
10789 //DECLSPEC_DEPRECATED_DDK
10793 RtlEnlargedIntegerMultiply(
10794 _In_ LONG Multiplicand
,
10795 _In_ LONG Multiplier
)
10798 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
10802 _At_(AnsiString
->Buffer
, _Post_equal_to_(Buffer
))
10803 _At_(AnsiString
->Length
, _Post_equal_to_(0))
10804 _At_(AnsiString
->MaximumLength
, _Post_equal_to_(BufferSize
))
10807 RtlInitEmptyAnsiString(
10808 _Out_ PANSI_STRING AnsiString
,
10809 _Pre_maybenull_
_Pre_readable_size_(BufferSize
) __drv_aliasesMem PCHAR Buffer
,
10810 _In_ USHORT BufferSize
)
10812 AnsiString
->Length
= 0;
10813 AnsiString
->MaximumLength
= BufferSize
;
10814 AnsiString
->Buffer
= Buffer
;
10817 _At_(UnicodeString
->Buffer
, _Post_equal_to_(Buffer
))
10818 _At_(UnicodeString
->Length
, _Post_equal_to_(0))
10819 _At_(UnicodeString
->MaximumLength
, _Post_equal_to_(BufferSize
))
10822 RtlInitEmptyUnicodeString(
10823 _Out_ PUNICODE_STRING UnicodeString
,
10824 _Writable_bytes_(BufferSize
)
10825 _When_(BufferSize
!= 0, _Notnull_
)
10826 __drv_aliasesMem PWSTR Buffer
,
10827 _In_ USHORT BufferSize
)
10829 UnicodeString
->Length
= 0;
10830 UnicodeString
->MaximumLength
= BufferSize
;
10831 UnicodeString
->Buffer
= Buffer
;
10834 #if defined(_AMD64_) || defined(_IA64_)
10840 RtlExtendedIntegerMultiply(
10841 _In_ LARGE_INTEGER Multiplicand
,
10842 _In_ LONG Multiplier
)
10845 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
10852 RtlExtendedLargeIntegerDivide(
10853 _In_ LARGE_INTEGER Dividend
,
10854 _In_ ULONG Divisor
,
10855 _Out_opt_ PULONG Remainder
)
10858 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
10860 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
10866 #endif /* defined(_AMD64_) || defined(_IA64_) */
10869 #if defined(_AMD64_)
10871 #define MultiplyHigh __mulh
10872 #define UnsignedMultiplyHigh __umulh
10874 //DECLSPEC_DEPRECATED_DDK
10878 RtlExtendedMagicDivide(
10879 _In_ LARGE_INTEGER Dividend
,
10880 _In_ LARGE_INTEGER MagicDivisor
,
10881 _In_ CCHAR ShiftCount
)
10886 Pos
= (Dividend
.QuadPart
>= 0);
10887 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
10888 MagicDivisor
.QuadPart
);
10889 ret64
>>= ShiftCount
;
10890 ret
.QuadPart
= Pos
? ret64
: -(LONG64
)ret64
;
10895 //DECLSPEC_DEPRECATED_DDK
10899 RtlLargeIntegerAdd(
10900 _In_ LARGE_INTEGER Addend1
,
10901 _In_ LARGE_INTEGER Addend2
)
10904 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
10909 * RtlLargeIntegerAnd(
10910 * IN OUT LARGE_INTEGER Result,
10911 * IN LARGE_INTEGER Source,
10912 * IN LARGE_INTEGER Mask);
10914 #define RtlLargeIntegerAnd(Result, Source, Mask) \
10915 Result.QuadPart = Source.QuadPart & Mask.QuadPart
10917 //DECLSPEC_DEPRECATED_DDK
10921 RtlLargeIntegerArithmeticShift(
10922 _In_ LARGE_INTEGER LargeInteger
,
10923 _In_ CCHAR ShiftCount
)
10926 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
10931 * RtlLargeIntegerEqualTo(
10932 * IN LARGE_INTEGER Operand1,
10933 * IN LARGE_INTEGER Operand2);
10935 #define RtlLargeIntegerEqualTo(X,Y) \
10936 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
10940 RtlSecureZeroMemory(
10941 _Out_writes_bytes_all_(Size
) PVOID Pointer
,
10944 volatile char* vptr
= (volatile char*)Pointer
;
10945 #if defined(_M_AMD64)
10946 __stosb((PUCHAR
)vptr
, 0, Size
);
10948 char * endptr
= (char *)vptr
+ Size
;
10949 while (vptr
< endptr
) {
10956 #if defined(_M_AMD64)
10957 _Must_inspect_result_
10961 _In_ PRTL_BITMAP BitMapHeader
,
10962 _In_range_(<, BitMapHeader
->SizeOfBitMap
) ULONG BitPosition
)
10964 return BitTest64((LONG64 CONST
*)BitMapHeader
->Buffer
, (LONG64
)BitPosition
);
10967 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
10968 #endif /* defined(_M_AMD64) */
10970 #define RtlLargeIntegerGreaterThan(X,Y) ( \
10971 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
10972 ((X).HighPart > (Y).HighPart) \
10975 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
10976 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
10977 ((X).HighPart > (Y).HighPart) \
10980 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
10981 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
10984 #define RtlLargeIntegerLessThan(X,Y) ( \
10985 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
10986 ((X).HighPart < (Y).HighPart) \
10989 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
10990 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
10991 ((X).HighPart < (Y).HighPart) \
10994 #define RtlLargeIntegerGreaterThanZero(X) ( \
10995 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
10996 ((X).HighPart > 0 ) \
10999 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
11001 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
11003 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
11005 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
11007 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
11009 #endif /* !defined(MIDL_PASS) */
11011 /* Byte Swap Functions */
11012 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
11013 ((defined(_M_AMD64) || defined(_M_IA64)) \
11014 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
11016 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
11017 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
11018 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
11024 #define RTL_VERIFY(exp) \
11026 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
11028 #define RTL_VERIFYMSG(msg, exp) \
11030 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
11032 #define RTL_SOFT_VERIFY(exp) \
11034 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
11036 #define RTL_SOFT_VERIFYMSG(msg, exp) \
11038 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
11040 /* The ASSERTs must be cast to void to avoid warnings about unused results.
11041 * We also cannot invoke the VERIFY versions because the indirection messes
11042 * with stringify. */
11043 #define ASSERT(exp) \
11044 ((VOID)((!(exp)) ? \
11045 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE))
11047 #define ASSERTMSG(msg, exp) \
11048 ((VOID)((!(exp)) ? \
11049 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE))
11051 #define RTL_SOFT_ASSERT(exp) \
11052 ((VOID)((!(exp)) ? \
11053 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE))
11055 #define RTL_SOFT_ASSERTMSG(msg, exp) \
11056 ((VOID)((!(exp)) ? \
11057 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE))
11059 #if defined(_MSC_VER)
11060 # define __assert_annotationA(msg) __annotation(L"Debug", L"AssertFail", L ## msg)
11061 # define __assert_annotationW(msg) __annotation(L"Debug", L"AssertFail", msg)
11063 # define __assert_annotationA(msg) \
11064 DbgPrint("Assertion %s(%d): %s", __FILE__, __LINE__, msg)
11065 # define __assert_annotationW(msg) \
11066 DbgPrint("Assertion %s(%d): %S", __FILE__, __LINE__, msg)
11069 #define NT_VERIFY(exp) \
11071 (__assert_annotationA(#exp), \
11072 DbgRaiseAssertionFailure(), FALSE) : TRUE)
11074 #define NT_VERIFYMSG(msg, exp) \
11076 (__assert_annotationA(msg), \
11077 DbgRaiseAssertionFailure(), FALSE) : TRUE)
11079 #define NT_VERIFYMSGW(msg, exp) \
11081 (__assert_annotationW(msg), \
11082 DbgRaiseAssertionFailure(), FALSE) : TRUE)
11084 /* Can't reuse verify, see above */
11085 #define NT_ASSERT(exp) \
11086 ((VOID)((!(exp)) ? \
11087 (__assert_annotationA(#exp), \
11088 DbgRaiseAssertionFailure(), FALSE) : TRUE))
11090 #define NT_ASSERTMSG(msg, exp) \
11091 ((VOID)((!(exp)) ? \
11092 (__assert_annotationA(msg), \
11093 DbgRaiseAssertionFailure(), FALSE) : TRUE))
11095 #define NT_ASSERTMSGW(msg, exp) \
11096 ((VOID)((!(exp)) ? \
11097 (__assert_annotationW(msg), \
11098 DbgRaiseAssertionFailure(), FALSE) : TRUE))
11102 #define ASSERT(exp) ((VOID) 0)
11103 #define ASSERTMSG(msg, exp) ((VOID) 0)
11105 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
11106 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
11108 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
11109 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
11111 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
11112 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
11114 #define NT_ASSERT(exp) ((VOID)0)
11115 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
11116 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
11118 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
11119 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
11120 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
11124 #define InitializeListHead32(ListHead) (\
11125 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
11127 #if !defined(_WINBASE_)
11129 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
11133 InitializeSListHead(
11134 _Out_ PSLIST_HEADER SListHead
);
11140 InitializeSListHead(
11141 _Out_ PSLIST_HEADER SListHead
)
11143 #if defined(_IA64_)
11144 ULONG64 FeatureBits
;
11147 #if defined(_WIN64)
11148 if (((ULONG_PTR
)SListHead
& 0xf) != 0) {
11149 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
11152 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
11153 #if defined(_IA64_)
11154 FeatureBits
= __getReg(CV_IA64_CPUID4
);
11155 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0) {
11156 SListHead
->Header16
.HeaderType
= 1;
11157 SListHead
->Header16
.Init
= 1;
11164 #if defined(_WIN64)
11166 #define InterlockedPopEntrySList(Head) \
11167 ExpInterlockedPopEntrySList(Head)
11169 #define InterlockedPushEntrySList(Head, Entry) \
11170 ExpInterlockedPushEntrySList(Head, Entry)
11172 #define InterlockedFlushSList(Head) \
11173 ExpInterlockedFlushSList(Head)
11175 #define QueryDepthSList(Head) \
11176 ExQueryDepthSList(Head)
11178 #else /* !defined(_WIN64) */
11183 InterlockedPopEntrySList(
11184 _Inout_ PSLIST_HEADER ListHead
);
11189 InterlockedPushEntrySList(
11190 _Inout_ PSLIST_HEADER ListHead
,
11191 _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry
);
11193 #define InterlockedFlushSList(ListHead) \
11194 ExInterlockedFlushSList(ListHead)
11196 #define QueryDepthSList(Head) \
11197 ExQueryDepthSList(Head)
11199 #endif /* !defined(_WIN64) */
11201 #endif /* !defined(_WINBASE_) */
11203 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
11204 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
11205 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
11206 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
11207 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
11208 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
11209 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
11210 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
11211 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
11212 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
11213 (PCONTEXT_EX)(Context + 1), \
11217 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable
)(
11218 _In_ ULONG Version
);
11221 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled
)(
11222 _In_ ULONG Version
);
11224 #ifndef RtlIsNtDdiVersionAvailable
11225 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
11228 #ifndef RtlIsServicePackVersionInstalled
11229 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
11232 #define RtlInterlockedSetBits(Flags, Flag) \
11233 InterlockedOr((PLONG)(Flags), Flag)
11235 #define RtlInterlockedAndBits(Flags, Flag) \
11236 InterlockedAnd((PLONG)(Flags), Flag)
11238 #define RtlInterlockedClearBits(Flags, Flag) \
11239 RtlInterlockedAndBits(Flags, ~(Flag))
11241 #define RtlInterlockedXorBits(Flags, Flag) \
11242 InterlockedXor(Flags, Flag)
11244 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
11245 (VOID) RtlInterlockedSetBits(Flags, Flag)
11247 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
11248 (VOID) RtlInterlockedAndBits(Flags, Flag)
11250 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
11251 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
11254 /******************************************************************************
11255 * Memory manager Functions *
11256 ******************************************************************************/
11257 /* Alignment Macros */
11258 #define ALIGN_DOWN_BY(size, align) \
11259 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
11261 #define ALIGN_UP_BY(size, align) \
11262 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
11264 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
11265 ((PVOID)ALIGN_DOWN_BY(ptr, align))
11267 #define ALIGN_UP_POINTER_BY(ptr, align) \
11268 ((PVOID)ALIGN_UP_BY(ptr, align))
11270 #define ALIGN_DOWN(size, type) \
11271 ALIGN_DOWN_BY(size, sizeof(type))
11273 #define ALIGN_UP(size, type) \
11274 ALIGN_UP_BY(size, sizeof(type))
11276 #define ALIGN_DOWN_POINTER(ptr, type) \
11277 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
11279 #define ALIGN_UP_POINTER(ptr, type) \
11280 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
11282 #ifndef FIELD_OFFSET
11283 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
11287 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
11290 #define POOL_TAGGING 1
11293 #define IF_DEBUG if (TRUE)
11295 #define IF_DEBUG if (FALSE)
11302 #define BYTE_OFFSET(Va) \
11303 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
11309 * Note: This needs to be like this to avoid overflows!
11311 #define BYTES_TO_PAGES(Size) \
11312 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
11318 #define PAGE_ALIGN(Va) \
11319 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
11323 * _In_ ULONG_PTR Size)
11325 #define ROUND_TO_PAGES(Size) \
11326 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
11329 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
11333 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
11334 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
11335 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
11337 #define COMPUTE_PAGES_SPANNED(Va, Size) \
11338 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
11342 * MmGetMdlByteCount(
11345 #define MmGetMdlByteCount(_Mdl) \
11346 ((_Mdl)->ByteCount)
11350 * MmGetMdlByteOffset(
11353 #define MmGetMdlByteOffset(_Mdl) \
11354 ((_Mdl)->ByteOffset)
11356 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
11360 * MmGetMdlPfnArray(
11363 #define MmGetMdlPfnArray(_Mdl) \
11364 ((PPFN_NUMBER) ((_Mdl) + 1))
11368 * MmGetMdlVirtualAddress(
11371 #define MmGetMdlVirtualAddress(_Mdl) \
11372 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
11374 #define MmGetProcedureAddress(Address) (Address)
11375 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
11377 /* PVOID MmGetSystemAddressForMdl(
11380 #define MmGetSystemAddressForMdl(Mdl) \
11381 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
11382 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
11383 ((Mdl)->MappedSystemVa) : \
11384 (MmMapLockedPages((Mdl), KernelMode)))
11387 * MmGetSystemAddressForMdlSafe(
11389 * _In_ MM_PAGE_PRIORITY Priority)
11391 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
11392 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
11393 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
11394 (_Mdl)->MappedSystemVa : \
11395 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
11396 KernelMode, MmCached, NULL, FALSE, (_Priority)))
11401 * _In_ PMDL MemoryDescriptorList,
11402 * _In_ PVOID BaseVa,
11403 * _In_ SIZE_T Length)
11405 #define MmInitializeMdl(_MemoryDescriptorList, \
11409 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
11410 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
11411 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
11412 (_MemoryDescriptorList)->MdlFlags = 0; \
11413 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
11414 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
11415 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
11420 * MmPrepareMdlForReuse(
11423 #define MmPrepareMdlForReuse(_Mdl) \
11425 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
11426 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
11427 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
11428 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
11429 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
11433 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11434 _Must_inspect_result_
11435 _IRQL_requires_max_(DISPATCH_LEVEL
)
11436 _When_ (return != NULL
, _Post_writable_byte_size_ (NumberOfBytes
))
11440 MmAllocateContiguousMemory(
11441 _In_ SIZE_T NumberOfBytes
,
11442 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress
);
11444 _Must_inspect_result_
11445 _IRQL_requires_max_(DISPATCH_LEVEL
)
11446 _When_ (return != NULL
, _Post_writable_byte_size_ (NumberOfBytes
))
11450 MmAllocateContiguousMemorySpecifyCache(
11451 _In_ SIZE_T NumberOfBytes
,
11452 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress
,
11453 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress
,
11454 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple
,
11455 _In_ MEMORY_CACHING_TYPE CacheType
);
11457 _Must_inspect_result_
11458 _IRQL_requires_max_(DISPATCH_LEVEL
)
11462 MmAllocatePagesForMdl(
11463 _In_ PHYSICAL_ADDRESS LowAddress
,
11464 _In_ PHYSICAL_ADDRESS HighAddress
,
11465 _In_ PHYSICAL_ADDRESS SkipBytes
,
11466 _In_ SIZE_T TotalBytes
);
11468 _IRQL_requires_max_(DISPATCH_LEVEL
)
11472 MmBuildMdlForNonPagedPool(
11473 _Inout_ PMDLX MemoryDescriptorList
);
11475 //DECLSPEC_DEPRECATED_DDK
11480 _Out_writes_bytes_opt_ (sizeof (MDL
) + (sizeof (PFN_NUMBER
) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base
, Length
)))
11481 PMDL MemoryDescriptorList
,
11482 _In_reads_bytes_opt_ (Length
) PVOID Base
,
11483 _In_ SIZE_T Length
);
11485 _IRQL_requires_max_(DISPATCH_LEVEL
)
11489 MmFreeContiguousMemory(
11490 _In_ PVOID BaseAddress
);
11492 _IRQL_requires_max_ (DISPATCH_LEVEL
)
11496 MmFreeContiguousMemorySpecifyCache(
11497 _In_reads_bytes_ (NumberOfBytes
) PVOID BaseAddress
,
11498 _In_ SIZE_T NumberOfBytes
,
11499 _In_ MEMORY_CACHING_TYPE CacheType
);
11501 _IRQL_requires_max_(DISPATCH_LEVEL
)
11505 MmFreePagesFromMdl(
11506 _Inout_ PMDLX MemoryDescriptorList
);
11508 _IRQL_requires_max_(PASSIVE_LEVEL
)
11512 MmGetSystemRoutineAddress(
11513 _In_ PUNICODE_STRING SystemRoutineName
);
11518 MmIsDriverVerifying(
11519 _In_
struct _DRIVER_OBJECT
*DriverObject
);
11521 _Must_inspect_result_
11522 _IRQL_requires_max_(APC_LEVEL
)
11526 MmLockPagableDataSection(
11527 _In_ PVOID AddressWithinSection
);
11529 _Must_inspect_result_
11530 _IRQL_requires_max_(DISPATCH_LEVEL
)
11531 _Out_writes_bytes_opt_ (NumberOfBytes
)
11536 _In_ PHYSICAL_ADDRESS PhysicalAddress
,
11537 _In_ SIZE_T NumberOfBytes
,
11538 _In_ MEMORY_CACHING_TYPE CacheType
);
11540 _Must_inspect_result_
11541 _When_(AccessMode
==KernelMode
, _IRQL_requires_max_(DISPATCH_LEVEL
))
11542 _When_(AccessMode
==UserMode
, _Maybe_raises_SEH_exception_
_IRQL_requires_max_(APC_LEVEL
))
11547 _Inout_ PMDL MemoryDescriptorList
,
11548 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
)
11549 KPROCESSOR_MODE AccessMode
);
11551 _Post_writable_byte_size_(MemoryDescriptorList
->ByteCount
)
11552 _When_(AccessMode
==KernelMode
, _IRQL_requires_max_(DISPATCH_LEVEL
))
11553 _When_(AccessMode
==UserMode
, _Maybe_raises_SEH_exception_
_IRQL_requires_max_(APC_LEVEL
) _Post_notnull_
)
11554 _At_(MemoryDescriptorList
->MappedSystemVa
, _Post_writable_byte_size_(MemoryDescriptorList
->ByteCount
))
11555 _Must_inspect_result_
11556 _Success_(return != NULL
)
11560 MmMapLockedPagesSpecifyCache(
11561 _Inout_ PMDLX MemoryDescriptorList
,
11562 _In_
__drv_strictType(KPROCESSOR_MODE
/enum _MODE
,__drv_typeConst
)
11563 KPROCESSOR_MODE AccessMode
,
11564 _In_
__drv_strictTypeMatch(__drv_typeCond
) MEMORY_CACHING_TYPE CacheType
,
11565 _In_opt_ PVOID BaseAddress
,
11566 _In_ ULONG BugCheckOnFailure
,
11567 _In_ MM_PAGE_PRIORITY Priority
);
11569 _IRQL_requires_max_(APC_LEVEL
)
11573 MmPageEntireDriver(
11574 _In_ PVOID AddressWithinSection
);
11576 _IRQL_requires_max_(DISPATCH_LEVEL
)
11577 _At_(MemoryDescriptorList
->StartVa
+ MemoryDescriptorList
->ByteOffset
,
11578 _Field_size_bytes_opt_(MemoryDescriptorList
->ByteCount
))
11582 MmProbeAndLockPages(
11583 _Inout_ PMDLX MemoryDescriptorList
,
11584 _In_ KPROCESSOR_MODE AccessMode
,
11585 _In_ LOCK_OPERATION Operation
);
11590 MmQuerySystemSize(VOID
);
11592 _IRQL_requires_max_(APC_LEVEL
)
11596 MmResetDriverPaging(
11597 _In_ PVOID AddressWithinSection
);
11603 _In_reads_bytes_opt_ (Length
) PVOID Base
,
11604 _In_ SIZE_T Length
);
11606 _IRQL_requires_max_(DISPATCH_LEVEL
)
11610 MmUnlockPagableImageSection(
11611 _In_ PVOID ImageSectionHandle
);
11613 _IRQL_requires_max_(DISPATCH_LEVEL
)
11618 _Inout_ PMDLX MemoryDescriptorList
);
11620 _IRQL_requires_max_(DISPATCH_LEVEL
)
11625 _In_reads_bytes_ (NumberOfBytes
) PVOID BaseAddress
,
11626 _In_ SIZE_T NumberOfBytes
);
11628 _IRQL_requires_max_ (APC_LEVEL
)
11632 MmProbeAndLockProcessPages(
11633 _Inout_ PMDL MemoryDescriptorList
,
11634 _In_ PEPROCESS Process
,
11635 _In_ KPROCESSOR_MODE AccessMode
,
11636 _In_ LOCK_OPERATION Operation
);
11638 _IRQL_requires_max_(DISPATCH_LEVEL
)
11642 MmUnmapLockedPages(
11643 _In_ PVOID BaseAddress
,
11644 _Inout_ PMDL MemoryDescriptorList
);
11646 _Must_inspect_result_
11647 _IRQL_requires_max_(DISPATCH_LEVEL
)
11648 _When_ (return != NULL
, _Post_writable_byte_size_ (NumberOfBytes
))
11652 MmAllocateContiguousMemorySpecifyCacheNode(
11653 _In_ SIZE_T NumberOfBytes
,
11654 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress
,
11655 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress
,
11656 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple
,
11657 _In_ MEMORY_CACHING_TYPE CacheType
,
11658 _In_ NODE_REQUIREMENT PreferredNode
);
11660 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11662 #if (NTDDI_VERSION >= NTDDI_WINXP)
11664 _IRQL_requires_max_(DISPATCH_LEVEL
)
11670 _In_ ULONG NumberOfBytes
);
11672 _Must_inspect_result_
11673 _IRQL_requires_max_(APC_LEVEL
)
11674 _When_ (return != NULL
, _Out_writes_bytes_opt_ (NumberOfBytes
))
11678 MmAllocateMappingAddress(
11679 _In_ SIZE_T NumberOfBytes
,
11680 _In_ ULONG PoolTag
);
11682 _IRQL_requires_max_(APC_LEVEL
)
11686 MmFreeMappingAddress(
11687 _In_ PVOID BaseAddress
,
11688 _In_ ULONG PoolTag
);
11690 _IRQL_requires_max_ (APC_LEVEL
)
11694 MmIsVerifierEnabled(
11695 _Out_ PULONG VerifierFlags
);
11697 _Post_writable_byte_size_(MemoryDescriptorList
->ByteCount
)
11698 _IRQL_requires_max_(DISPATCH_LEVEL
)
11699 _At_(MemoryDescriptorList
->MappedSystemVa
+ MemoryDescriptorList
->ByteOffset
,
11700 _Post_writable_byte_size_(MemoryDescriptorList
->ByteCount
))
11701 _Must_inspect_result_
11702 _Success_(return != NULL
)
11706 MmMapLockedPagesWithReservedMapping(
11707 _In_ PVOID MappingAddress
,
11708 _In_ ULONG PoolTag
,
11709 _Inout_ PMDLX MemoryDescriptorList
,
11710 _In_
__drv_strictTypeMatch(__drv_typeCond
)
11711 MEMORY_CACHING_TYPE CacheType
);
11713 _Must_inspect_result_
11714 _IRQL_requires_max_(DISPATCH_LEVEL
)
11718 MmProtectMdlSystemAddress(
11719 _In_ PMDLX MemoryDescriptorList
,
11720 _In_ ULONG NewProtect
);
11722 _IRQL_requires_max_(DISPATCH_LEVEL
)
11726 MmUnmapReservedMapping(
11727 _In_ PVOID BaseAddress
,
11728 _In_ ULONG PoolTag
,
11729 _Inout_ PMDLX MemoryDescriptorList
);
11731 _IRQL_requires_max_ (APC_LEVEL
)
11735 MmAddVerifierThunks(
11736 _In_reads_bytes_ (ThunkBufferSize
) PVOID ThunkBuffer
,
11737 _In_ ULONG ThunkBufferSize
);
11739 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
11740 #if (NTDDI_VERSION >= NTDDI_WS03)
11741 _IRQL_requires_max_ (DISPATCH_LEVEL
)
11746 _In_ PHYSICAL_ADDRESS StartAddress
,
11747 _In_ SIZE_T NumberOfBytes
);
11749 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
11750 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11751 _Must_inspect_result_
11752 _IRQL_requires_max_ (DISPATCH_LEVEL
)
11756 MmAllocatePagesForMdlEx(
11757 _In_ PHYSICAL_ADDRESS LowAddress
,
11758 _In_ PHYSICAL_ADDRESS HighAddress
,
11759 _In_ PHYSICAL_ADDRESS SkipBytes
,
11760 _In_ SIZE_T TotalBytes
,
11761 _In_ MEMORY_CACHING_TYPE CacheType
,
11765 #if (NTDDI_VERSION >= NTDDI_VISTA)
11766 _IRQL_requires_max_ (APC_LEVEL
)
11770 MmIsDriverVerifyingByAddress(
11771 _In_ PVOID AddressWithinSection
);
11772 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11774 /******************************************************************************
11775 * Security Manager Functions *
11776 ******************************************************************************/
11778 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11779 _IRQL_requires_max_(PASSIVE_LEVEL
)
11784 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
11785 _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
11786 _In_ BOOLEAN SubjectContextLocked
,
11787 _In_ ACCESS_MASK DesiredAccess
,
11788 _In_ ACCESS_MASK PreviouslyGrantedAccess
,
11789 _Outptr_opt_ PPRIVILEGE_SET
*Privileges
,
11790 _In_ PGENERIC_MAPPING GenericMapping
,
11791 _In_ KPROCESSOR_MODE AccessMode
,
11792 _Out_ PACCESS_MASK GrantedAccess
,
11793 _Out_ PNTSTATUS AccessStatus
);
11795 _IRQL_requires_max_(PASSIVE_LEVEL
)
11800 _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor
,
11801 _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor
,
11802 _Out_ PSECURITY_DESCRIPTOR
*NewDescriptor
,
11803 _In_ BOOLEAN IsDirectoryObject
,
11804 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext
,
11805 _In_ PGENERIC_MAPPING GenericMapping
,
11806 _In_ POOL_TYPE PoolType
);
11811 SeAssignSecurityEx(
11812 _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor
,
11813 _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor
,
11814 _Out_ PSECURITY_DESCRIPTOR
*NewDescriptor
,
11815 _In_opt_ GUID
*ObjectType
,
11816 _In_ BOOLEAN IsDirectoryObject
,
11817 _In_ ULONG AutoInheritFlags
,
11818 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext
,
11819 _In_ PGENERIC_MAPPING GenericMapping
,
11820 _In_ POOL_TYPE PoolType
);
11822 _IRQL_requires_max_(PASSIVE_LEVEL
)
11826 SeDeassignSecurity(
11827 _Inout_ PSECURITY_DESCRIPTOR
*SecurityDescriptor
);
11829 _IRQL_requires_max_(PASSIVE_LEVEL
)
11833 SeValidSecurityDescriptor(
11835 _In_reads_bytes_(Length
) PSECURITY_DESCRIPTOR SecurityDescriptor
);
11840 SeObjectCreateSaclAccessBits(
11841 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
11846 SeReleaseSubjectContext(
11847 _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext
);
11852 SeUnlockSubjectContext(
11853 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext
);
11858 SeCaptureSubjectContext(
11859 _Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext
);
11864 SeLockSubjectContext(
11865 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext
);
11868 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11870 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11872 _At_(AuditParameters
->ParameterCount
, _Const_
)
11875 SeSetAuditParameter(
11876 _Inout_ PSE_ADT_PARAMETER_ARRAY AuditParameters
,
11877 _In_ SE_ADT_PARAMETER_TYPE Type
,
11878 _In_range_(<,SE_MAX_AUDIT_PARAMETERS
) ULONG Index
,
11879 _In_reads_(_Inexpressible_("depends on SE_ADT_PARAMETER_TYPE"))
11884 SeReportSecurityEvent(
11886 _In_ PUNICODE_STRING SourceName
,
11887 _In_opt_ PSID UserSid
,
11888 _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters
);
11890 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
11892 #if (NTDDI_VERSION >= NTDDI_VISTA)
11896 SeComputeAutoInheritByObjectType(
11897 _In_ PVOID ObjectType
,
11898 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
11899 _In_opt_ PSECURITY_DESCRIPTOR ParentSecurityDescriptor
);
11901 #ifdef SE_NTFS_WORLD_CACHE
11905 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
11906 _In_ PGENERIC_MAPPING GenericMapping
,
11907 _Out_ PACCESS_MASK GrantedAccess
);
11908 #endif /* SE_NTFS_WORLD_CACHE */
11909 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11910 /******************************************************************************
11911 * Configuration Manager Functions *
11912 ******************************************************************************/
11914 #if (NTDDI_VERSION >= NTDDI_WINXP)
11915 _IRQL_requires_max_(APC_LEVEL
)
11919 CmRegisterCallback(
11920 _In_ PEX_CALLBACK_FUNCTION Function
,
11921 _In_opt_ PVOID Context
,
11922 _Out_ PLARGE_INTEGER Cookie
);
11924 _IRQL_requires_max_(APC_LEVEL
)
11928 CmUnRegisterCallback(
11929 _In_ LARGE_INTEGER Cookie
);
11932 #if (NTDDI_VERSION >= NTDDI_VISTA)
11934 _IRQL_requires_max_(APC_LEVEL
)
11938 CmRegisterCallbackEx(
11939 _In_ PEX_CALLBACK_FUNCTION Function
,
11940 _In_ PCUNICODE_STRING Altitude
,
11942 _In_opt_ PVOID Context
,
11943 _Out_ PLARGE_INTEGER Cookie
,
11944 _Reserved_ PVOID Reserved
);
11946 _IRQL_requires_max_(APC_LEVEL
)
11950 CmGetCallbackVersion(
11951 _Out_opt_ PULONG Major
,
11952 _Out_opt_ PULONG Minor
);
11954 _IRQL_requires_max_(APC_LEVEL
)
11958 CmSetCallbackObjectContext(
11959 _Inout_ PVOID Object
,
11960 _In_ PLARGE_INTEGER Cookie
,
11961 _In_ PVOID NewContext
,
11962 _Out_opt_ PVOID
*OldContext
);
11964 _IRQL_requires_max_(APC_LEVEL
)
11968 CmCallbackGetKeyObjectID(
11969 _In_ PLARGE_INTEGER Cookie
,
11971 _Out_opt_ PULONG_PTR ObjectID
,
11972 _Outptr_opt_ PCUNICODE_STRING
*ObjectName
);
11974 _IRQL_requires_max_(APC_LEVEL
)
11978 CmGetBoundTransaction(
11979 _In_ PLARGE_INTEGER Cookie
,
11980 _In_ PVOID Object
);
11982 #endif // NTDDI_VERSION >= NTDDI_VISTA
11985 /******************************************************************************
11986 * I/O Manager Functions *
11987 ******************************************************************************/
11991 * IoAcquireRemoveLock(
11992 * IN PIO_REMOVE_LOCK RemoveLock,
11993 * IN OPTIONAL PVOID Tag)
11996 #define IoAcquireRemoveLock(RemoveLock, Tag) \
11997 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
11999 #define IoAcquireRemoveLock(RemoveLock, Tag) \
12000 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
12005 * IoAdjustPagingPathCount(
12007 * IN BOOLEAN Increment)
12009 #define IoAdjustPagingPathCount(_Count, \
12014 InterlockedIncrement(_Count); \
12018 InterlockedDecrement(_Count); \
12022 #if !defined(_M_AMD64)
12026 READ_PORT_BUFFER_UCHAR(
12034 READ_PORT_BUFFER_ULONG(
12042 READ_PORT_BUFFER_USHORT(
12068 READ_REGISTER_BUFFER_UCHAR(
12069 IN PUCHAR Register
,
12076 READ_REGISTER_BUFFER_ULONG(
12077 IN PULONG Register
,
12084 READ_REGISTER_BUFFER_USHORT(
12085 IN PUSHORT Register
,
12092 READ_REGISTER_UCHAR(
12093 IN PUCHAR Register
);
12098 READ_REGISTER_ULONG(
12099 IN PULONG Register
);
12104 READ_REGISTER_USHORT(
12105 IN PUSHORT Register
);
12110 WRITE_PORT_BUFFER_UCHAR(
12118 WRITE_PORT_BUFFER_ULONG(
12126 WRITE_PORT_BUFFER_USHORT(
12155 WRITE_REGISTER_BUFFER_UCHAR(
12156 IN PUCHAR Register
,
12163 WRITE_REGISTER_BUFFER_ULONG(
12164 IN PULONG Register
,
12171 WRITE_REGISTER_BUFFER_USHORT(
12172 IN PUSHORT Register
,
12179 WRITE_REGISTER_UCHAR(
12180 IN PUCHAR Register
,
12186 WRITE_REGISTER_ULONG(
12187 IN PULONG Register
,
12193 WRITE_REGISTER_USHORT(
12194 IN PUSHORT Register
,
12201 READ_PORT_BUFFER_UCHAR(
12206 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12211 READ_PORT_BUFFER_ULONG(
12216 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12221 READ_PORT_BUFFER_USHORT(
12226 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12234 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
12242 return __indword((USHORT
)(ULONG_PTR
)Port
);
12250 return __inword((USHORT
)(ULONG_PTR
)Port
);
12255 READ_REGISTER_BUFFER_UCHAR(
12256 IN PUCHAR Register
,
12260 __movsb(Register
, Buffer
, Count
);
12265 READ_REGISTER_BUFFER_ULONG(
12266 IN PULONG Register
,
12270 __movsd(Register
, Buffer
, Count
);
12275 READ_REGISTER_BUFFER_USHORT(
12276 IN PUSHORT Register
,
12280 __movsw(Register
, Buffer
, Count
);
12285 READ_REGISTER_UCHAR(
12286 IN
volatile UCHAR
*Register
)
12293 READ_REGISTER_ULONG(
12294 IN
volatile ULONG
*Register
)
12301 READ_REGISTER_USHORT(
12302 IN
volatile USHORT
*Register
)
12309 WRITE_PORT_BUFFER_UCHAR(
12314 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12319 WRITE_PORT_BUFFER_ULONG(
12324 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12329 WRITE_PORT_BUFFER_USHORT(
12334 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
12343 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
12352 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
12361 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
12366 WRITE_REGISTER_BUFFER_UCHAR(
12367 IN PUCHAR Register
,
12372 __movsb(Register
, Buffer
, Count
);
12373 InterlockedOr(&Synch
, 1);
12378 WRITE_REGISTER_BUFFER_ULONG(
12379 IN PULONG Register
,
12384 __movsd(Register
, Buffer
, Count
);
12385 InterlockedOr(&Synch
, 1);
12390 WRITE_REGISTER_BUFFER_USHORT(
12391 IN PUSHORT Register
,
12396 __movsw(Register
, Buffer
, Count
);
12397 InterlockedOr(&Synch
, 1);
12402 WRITE_REGISTER_UCHAR(
12403 IN
volatile UCHAR
*Register
,
12408 InterlockedOr(&Synch
, 1);
12413 WRITE_REGISTER_ULONG(
12414 IN
volatile ULONG
*Register
,
12419 InterlockedOr(&Synch
, 1);
12424 WRITE_REGISTER_USHORT(
12425 IN
volatile USHORT
*Register
,
12430 InterlockedOr(&Sync
, 1);
12434 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
12435 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
12437 #define DMA_MACROS_DEFINED
12439 _IRQL_requires_max_(DISPATCH_LEVEL
)
12440 _IRQL_requires_min_(DISPATCH_LEVEL
)
12443 IoAllocateAdapterChannel(
12444 _In_ PDMA_ADAPTER DmaAdapter
,
12445 _In_ PDEVICE_OBJECT DeviceObject
,
12446 _In_ ULONG NumberOfMapRegisters
,
12447 _In_ PDRIVER_CONTROL ExecutionRoutine
,
12448 _In_ PVOID Context
)
12450 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
12451 AllocateAdapterChannel
=
12452 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
12453 ASSERT(AllocateAdapterChannel
);
12454 return AllocateAdapterChannel(DmaAdapter
,
12456 NumberOfMapRegisters
,
12464 IoFlushAdapterBuffers(
12465 _In_ PDMA_ADAPTER DmaAdapter
,
12467 _In_ PVOID MapRegisterBase
,
12468 _In_ PVOID CurrentVa
,
12470 _In_ BOOLEAN WriteToDevice
)
12472 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
12473 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
12474 ASSERT(FlushAdapterBuffers
);
12475 return FlushAdapterBuffers(DmaAdapter
,
12486 IoFreeAdapterChannel(
12487 _In_ PDMA_ADAPTER DmaAdapter
)
12489 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
12490 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
12491 ASSERT(FreeAdapterChannel
);
12492 FreeAdapterChannel(DmaAdapter
);
12498 IoFreeMapRegisters(
12499 _In_ PDMA_ADAPTER DmaAdapter
,
12500 _In_ PVOID MapRegisterBase
,
12501 _In_ ULONG NumberOfMapRegisters
)
12503 PFREE_MAP_REGISTERS FreeMapRegisters
;
12504 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
12505 ASSERT(FreeMapRegisters
);
12506 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
12513 _In_ PDMA_ADAPTER DmaAdapter
,
12515 _In_ PVOID MapRegisterBase
,
12516 _In_ PVOID CurrentVa
,
12517 _Inout_ PULONG Length
,
12518 _In_ BOOLEAN WriteToDevice
)
12520 PMAP_TRANSFER MapTransfer
;
12522 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
12523 ASSERT(MapTransfer
);
12524 return MapTransfer(DmaAdapter
,
12533 #if (NTDDI_VERSION >= NTDDI_WIN2K)
12535 _Acquires_lock_(_Global_cancel_spin_lock_
)
12536 _Requires_lock_not_held_(_Global_cancel_spin_lock_
)
12537 _IRQL_requires_max_(DISPATCH_LEVEL
)
12538 _IRQL_raises_(DISPATCH_LEVEL
)
12542 IoAcquireCancelSpinLock(
12543 _Out_
_At_(*Irql
, _IRQL_saves_
) PKIRQL Irql
);
12545 _IRQL_requires_max_(DISPATCH_LEVEL
)
12549 IoAcquireRemoveLockEx(
12550 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
12551 _In_opt_ PVOID Tag
,
12554 _In_ ULONG RemlockSize
);
12556 _IRQL_requires_max_(DISPATCH_LEVEL
)
12561 IoAllocateDriverObjectExtension(
12562 _In_ PDRIVER_OBJECT DriverObject
,
12563 _In_ PVOID ClientIdentificationAddress
,
12564 _In_ ULONG DriverObjectExtensionSize
,
12565 _Post_
_At_(*DriverObjectExtension
, _When_(return==0,
12566 __drv_aliasesMem
__drv_allocatesMem(Mem
) _Post_notnull_
))
12567 _When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize
))
12568 PVOID
*DriverObjectExtension
);
12570 _IRQL_requires_max_(DISPATCH_LEVEL
)
12574 IoAllocateErrorLogEntry(
12575 _In_ PVOID IoObject
,
12576 _In_ UCHAR EntrySize
);
12578 _Must_inspect_result_
12579 _IRQL_requires_max_(DISPATCH_LEVEL
)
12584 _In_ CCHAR StackSize
,
12585 _In_ BOOLEAN ChargeQuota
);
12587 _IRQL_requires_max_(DISPATCH_LEVEL
)
12592 _In_opt_ __drv_aliasesMem PVOID VirtualAddress
,
12594 _In_ BOOLEAN SecondaryBuffer
,
12595 _In_ BOOLEAN ChargeQuota
,
12596 _Inout_opt_ PIRP Irp
);
12598 __drv_allocatesMem(Mem
)
12599 _IRQL_requires_max_(DISPATCH_LEVEL
)
12603 IoAllocateWorkItem(
12604 _In_ PDEVICE_OBJECT DeviceObject
);
12606 _IRQL_requires_max_(APC_LEVEL
)
12612 _In_
_Kernel_requires_resource_held_(Memory
) _When_(return==0, __drv_aliasesMem
)
12613 PDEVICE_OBJECT SourceDevice
,
12614 _In_ PUNICODE_STRING TargetDevice
,
12615 _Out_ PDEVICE_OBJECT
*AttachedDevice
);
12617 _Must_inspect_result_
12618 _IRQL_requires_max_(DISPATCH_LEVEL
)
12622 IoAttachDeviceToDeviceStack(
12623 _In_
_Kernel_requires_resource_held_(Memory
) _When_(return!=0, __drv_aliasesMem
)
12624 PDEVICE_OBJECT SourceDevice
,
12625 _In_ PDEVICE_OBJECT TargetDevice
);
12627 _Must_inspect_result_
12629 _IRQL_requires_max_(DISPATCH_LEVEL
)
12633 IoBuildAsynchronousFsdRequest(
12634 _In_ ULONG MajorFunction
,
12635 _In_ PDEVICE_OBJECT DeviceObject
,
12636 _Inout_opt_ PVOID Buffer
,
12637 _In_opt_ ULONG Length
,
12638 _In_opt_ PLARGE_INTEGER StartingOffset
,
12639 _In_opt_ PIO_STATUS_BLOCK IoStatusBlock
);
12641 _Must_inspect_result_
12643 _IRQL_requires_max_(PASSIVE_LEVEL
)
12647 IoBuildDeviceIoControlRequest(
12648 _In_ ULONG IoControlCode
,
12649 _In_ PDEVICE_OBJECT DeviceObject
,
12650 _In_opt_ PVOID InputBuffer
,
12651 _In_ ULONG InputBufferLength
,
12652 _Out_opt_ PVOID OutputBuffer
,
12653 _In_ ULONG OutputBufferLength
,
12654 _In_ BOOLEAN InternalDeviceIoControl
,
12655 _In_opt_ PKEVENT Event
,
12656 _Out_ PIO_STATUS_BLOCK IoStatusBlock
);
12658 _IRQL_requires_max_(DISPATCH_LEVEL
)
12663 _In_ PMDL SourceMdl
,
12664 _Inout_ PMDL TargetMdl
,
12665 _In_ PVOID VirtualAddress
,
12666 _In_ ULONG Length
);
12668 _Must_inspect_result_
12670 _IRQL_requires_max_(PASSIVE_LEVEL
)
12674 IoBuildSynchronousFsdRequest(
12675 _In_ ULONG MajorFunction
,
12676 _In_ PDEVICE_OBJECT DeviceObject
,
12677 _Inout_opt_ PVOID Buffer
,
12678 _In_opt_ ULONG Length
,
12679 _In_opt_ PLARGE_INTEGER StartingOffset
,
12680 _In_ PKEVENT Event
,
12681 _Out_ PIO_STATUS_BLOCK IoStatusBlock
);
12683 _IRQL_requires_max_(DISPATCH_LEVEL
)
12689 _In_ PDEVICE_OBJECT DeviceObject
,
12690 _Inout_ __drv_aliasesMem PIRP Irp
);
12691 #define IoCallDriver IofCallDriver
12693 _IRQL_requires_max_(DISPATCH_LEVEL
)
12697 IofCompleteRequest(
12699 _In_ CCHAR PriorityBoost
);
12700 #define IoCompleteRequest IofCompleteRequest
12702 _IRQL_requires_max_(DISPATCH_LEVEL
)
12709 _IRQL_requires_max_(PASSIVE_LEVEL
)
12713 IoCheckShareAccess(
12714 _In_ ACCESS_MASK DesiredAccess
,
12715 _In_ ULONG DesiredShareAccess
,
12716 _Inout_ PFILE_OBJECT FileObject
,
12717 _Inout_ PSHARE_ACCESS ShareAccess
,
12718 _In_ BOOLEAN Update
);
12720 _IRQL_requires_max_(DISPATCH_LEVEL
)
12724 IofCompleteRequest(
12726 _In_ CCHAR PriorityBoost
);
12728 _IRQL_requires_max_(PASSIVE_LEVEL
)
12732 IoConnectInterrupt(
12733 _Out_ PKINTERRUPT
*InterruptObject
,
12734 _In_ PKSERVICE_ROUTINE ServiceRoutine
,
12735 _In_opt_ PVOID ServiceContext
,
12736 _In_opt_ PKSPIN_LOCK SpinLock
,
12739 _In_ KIRQL SynchronizeIrql
,
12740 _In_ KINTERRUPT_MODE InterruptMode
,
12741 _In_ BOOLEAN ShareVector
,
12742 _In_ KAFFINITY ProcessorEnableMask
,
12743 _In_ BOOLEAN FloatingSave
);
12745 _IRQL_requires_max_(APC_LEVEL
)
12751 _In_ PDRIVER_OBJECT DriverObject
,
12752 _In_ ULONG DeviceExtensionSize
,
12753 _In_opt_ PUNICODE_STRING DeviceName
,
12754 _In_ DEVICE_TYPE DeviceType
,
12755 _In_ ULONG DeviceCharacteristics
,
12756 _In_ BOOLEAN Exclusive
,
12757 _Outptr_result_nullonfailure_
12758 _At_(*DeviceObject
,
12759 __drv_allocatesMem(Mem
)
12760 _When_(((_In_function_class_(DRIVER_INITIALIZE
))
12761 ||(_In_function_class_(DRIVER_DISPATCH
))),
12763 PDEVICE_OBJECT
*DeviceObject
);
12765 _IRQL_requires_max_(PASSIVE_LEVEL
)
12770 _Out_ PHANDLE FileHandle
,
12771 _In_ ACCESS_MASK DesiredAccess
,
12772 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
12773 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
12774 _In_opt_ PLARGE_INTEGER AllocationSize
,
12775 _In_ ULONG FileAttributes
,
12776 _In_ ULONG ShareAccess
,
12777 _In_ ULONG Disposition
,
12778 _In_ ULONG CreateOptions
,
12779 _In_opt_ PVOID EaBuffer
,
12780 _In_ ULONG EaLength
,
12781 _In_ CREATE_FILE_TYPE CreateFileType
,
12782 _In_opt_ PVOID InternalParameters
,
12783 _In_ ULONG Options
);
12785 _IRQL_requires_max_(PASSIVE_LEVEL
)
12789 IoCreateNotificationEvent(
12790 _In_ PUNICODE_STRING EventName
,
12791 _Out_ PHANDLE EventHandle
);
12793 _IRQL_requires_max_(PASSIVE_LEVEL
)
12797 IoCreateSymbolicLink(
12798 _In_ PUNICODE_STRING SymbolicLinkName
,
12799 _In_ PUNICODE_STRING DeviceName
);
12801 _IRQL_requires_max_(PASSIVE_LEVEL
)
12805 IoCreateSynchronizationEvent(
12806 _In_ PUNICODE_STRING EventName
,
12807 _Out_ PHANDLE EventHandle
);
12809 _IRQL_requires_max_(PASSIVE_LEVEL
)
12813 IoCreateUnprotectedSymbolicLink(
12814 _In_ PUNICODE_STRING SymbolicLinkName
,
12815 _In_ PUNICODE_STRING DeviceName
);
12817 _IRQL_requires_max_(APC_LEVEL
)
12818 _Kernel_clear_do_init_(__yes
)
12823 _In_
_Kernel_requires_resource_held_(Memory
) __drv_freesMem(Mem
)
12824 PDEVICE_OBJECT DeviceObject
);
12826 _IRQL_requires_max_(PASSIVE_LEVEL
)
12830 IoDeleteSymbolicLink(
12831 _In_ PUNICODE_STRING SymbolicLinkName
);
12833 _IRQL_requires_max_(PASSIVE_LEVEL
)
12838 _Inout_ PDEVICE_OBJECT TargetDevice
);
12840 _IRQL_requires_max_(PASSIVE_LEVEL
)
12844 IoDisconnectInterrupt(
12845 _In_ PKINTERRUPT InterruptObject
);
12847 __drv_freesMem(Mem
)
12848 _IRQL_requires_max_(DISPATCH_LEVEL
)
12855 _IRQL_requires_max_(DISPATCH_LEVEL
)
12862 _IRQL_requires_max_(DISPATCH_LEVEL
)
12867 _In_
__drv_freesMem(Mem
) PIO_WORKITEM IoWorkItem
);
12872 IoGetAttachedDevice(
12873 IN PDEVICE_OBJECT DeviceObject
);
12875 _IRQL_requires_max_(DISPATCH_LEVEL
)
12879 IoGetAttachedDeviceReference(
12880 _In_ PDEVICE_OBJECT DeviceObject
);
12885 IoGetBootDiskInformation(
12886 _Inout_ PBOOTDISK_INFORMATION BootDiskInformation
,
12889 _IRQL_requires_max_(PASSIVE_LEVEL
)
12890 _Must_inspect_result_
12894 IoGetDeviceInterfaceAlias(
12895 _In_ PUNICODE_STRING SymbolicLinkName
,
12896 _In_ CONST GUID
*AliasInterfaceClassGuid
,
12898 _When_(return==0, _At_(AliasSymbolicLinkName
->Buffer
, __drv_allocatesMem(Mem
)))
12899 PUNICODE_STRING AliasSymbolicLinkName
);
12904 IoGetCurrentProcess(VOID
);
12906 _IRQL_requires_max_(PASSIVE_LEVEL
)
12907 _Must_inspect_result_
12911 IoGetDeviceInterfaces(
12912 _In_ CONST GUID
*InterfaceClassGuid
,
12913 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
12915 _Outptr_result_nullonfailure_
12916 _At_(*SymbolicLinkList
, _When_(return==0, __drv_allocatesMem(Mem
)))
12917 PZZWSTR
*SymbolicLinkList
);
12919 _IRQL_requires_max_(PASSIVE_LEVEL
)
12923 IoGetDeviceObjectPointer(
12924 _In_ PUNICODE_STRING ObjectName
,
12925 _In_ ACCESS_MASK DesiredAccess
,
12926 _Out_ PFILE_OBJECT
*FileObject
,
12927 _Out_ PDEVICE_OBJECT
*DeviceObject
);
12929 _IRQL_requires_max_(PASSIVE_LEVEL
)
12930 _When_((DeviceProperty
& __string_type
),
12931 _At_(PropertyBuffer
, _Post_z_
))
12932 _When_((DeviceProperty
& __multiString_type
),
12933 _At_(PropertyBuffer
, _Post_ _NullNull_terminated_
))
12937 IoGetDeviceProperty(
12938 _In_ PDEVICE_OBJECT DeviceObject
,
12939 _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty
,
12940 _In_ ULONG BufferLength
,
12941 _Out_writes_bytes_opt_(BufferLength
) PVOID PropertyBuffer
,
12942 _Deref_out_range_(<=, BufferLength
) PULONG ResultLength
);
12944 _Must_inspect_result_
12945 _IRQL_requires_max_(PASSIVE_LEVEL
)
12950 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
12951 _In_ PDEVICE_DESCRIPTION DeviceDescription
,
12952 _Out_
_When_(return!=0, _Kernel_IoGetDmaAdapter_
_At_(*NumberOfMapRegisters
, _Must_inspect_result_
))
12953 PULONG NumberOfMapRegisters
);
12956 _IRQL_requires_max_(DISPATCH_LEVEL
)
12960 IoGetDriverObjectExtension(
12961 _In_ PDRIVER_OBJECT DriverObject
,
12962 _In_ PVOID ClientIdentificationAddress
);
12964 _IRQL_requires_max_(APC_LEVEL
)
12968 IoGetInitialStack(VOID
);
12973 IoGetRelatedDeviceObject(
12974 _In_ PFILE_OBJECT FileObject
);
12976 _IRQL_requires_max_(DISPATCH_LEVEL
)
12981 _Inout_ PIO_WORKITEM IoWorkItem
,
12982 _In_ PIO_WORKITEM_ROUTINE WorkerRoutine
,
12983 _In_ WORK_QUEUE_TYPE QueueType
,
12984 _In_opt_ __drv_aliasesMem PVOID Context
);
12986 _IRQL_requires_max_(DISPATCH_LEVEL
)
12992 _In_ USHORT PacketSize
,
12993 _In_ CCHAR StackSize
);
12995 _IRQL_requires_max_(PASSIVE_LEVEL
)
12999 IoInitializeRemoveLockEx(
13000 _Out_ PIO_REMOVE_LOCK Lock
,
13001 _In_ ULONG AllocateTag
,
13002 _In_ ULONG MaxLockedMinutes
,
13003 _In_ ULONG HighWatermark
,
13004 _In_ ULONG RemlockSize
);
13006 _IRQL_requires_max_(PASSIVE_LEVEL
)
13011 _In_ PDEVICE_OBJECT DeviceObject
,
13012 _In_ PIO_TIMER_ROUTINE TimerRoutine
,
13013 _In_opt_ __drv_aliasesMem PVOID Context
);
13015 _IRQL_requires_max_(DISPATCH_LEVEL
)
13019 IoInvalidateDeviceRelations(
13020 _In_ PDEVICE_OBJECT DeviceObject
,
13021 _In_ DEVICE_RELATION_TYPE Type
);
13023 _IRQL_requires_max_(DISPATCH_LEVEL
)
13027 IoInvalidateDeviceState(
13028 _In_ PDEVICE_OBJECT PhysicalDeviceObject
);
13030 _IRQL_requires_max_(PASSIVE_LEVEL
)
13034 IoIsWdmVersionAvailable(
13035 _When_(MajorVersion
!=1&&MajorVersion
!=6, _In_
__drv_reportError("MajorVersion must be 1 or 6"))
13036 UCHAR MajorVersion
,
13037 _In_
_When_(MinorVersion
!=0 && MinorVersion
!=5 &&
13038 MinorVersion
!=16 && MinorVersion
!=32 &&
13039 MinorVersion
!=48, __drv_reportError("MinorVersion must be 0, 0x5, 0x10, 0x20, or 0x30"))
13040 UCHAR MinorVersion
);
13042 _IRQL_requires_max_(PASSIVE_LEVEL
)
13043 _Must_inspect_result_
13047 IoOpenDeviceInterfaceRegistryKey(
13048 _In_ PUNICODE_STRING SymbolicLinkName
,
13049 _In_ ACCESS_MASK DesiredAccess
,
13050 _Out_ PHANDLE DeviceInterfaceKey
);
13052 _IRQL_requires_max_(PASSIVE_LEVEL
)
13053 _Must_inspect_result_
13057 IoOpenDeviceRegistryKey(
13058 _In_ PDEVICE_OBJECT DeviceObject
,
13059 _In_ ULONG DevInstKeyType
,
13060 _In_ ACCESS_MASK DesiredAccess
,
13061 _Out_ PHANDLE DevInstRegKey
);
13063 _IRQL_requires_max_(PASSIVE_LEVEL
)
13064 _Must_inspect_result_
13068 IoRegisterDeviceInterface(
13069 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
13070 _In_ CONST GUID
*InterfaceClassGuid
,
13071 _In_opt_ PUNICODE_STRING ReferenceString
,
13072 _Out_
_When_(return==0, _At_(SymbolicLinkName
->Buffer
, __drv_allocatesMem(Mem
)))
13073 PUNICODE_STRING SymbolicLinkName
);
13075 _IRQL_requires_max_(PASSIVE_LEVEL
)
13076 _Must_inspect_result_
13080 IoRegisterPlugPlayNotification(
13081 _In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
13082 _In_ ULONG EventCategoryFlags
,
13083 _In_opt_ PVOID EventCategoryData
,
13084 _In_ PDRIVER_OBJECT DriverObject
,
13085 _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
13086 _Inout_opt_ __drv_aliasesMem PVOID Context
,
13087 _Outptr_result_nullonfailure_
13088 _At_(*NotificationEntry
, _When_(return==0, __drv_allocatesMem(Mem
)))
13089 PVOID
*NotificationEntry
);
13091 _IRQL_requires_max_(PASSIVE_LEVEL
)
13095 IoRegisterShutdownNotification(
13096 _In_ PDEVICE_OBJECT DeviceObject
);
13098 _Requires_lock_held_(_Global_cancel_spin_lock_
)
13099 _Releases_lock_(_Global_cancel_spin_lock_
)
13100 _IRQL_requires_max_(DISPATCH_LEVEL
)
13101 _IRQL_requires_min_(DISPATCH_LEVEL
)
13105 IoReleaseCancelSpinLock(
13106 _In_ _IRQL_restores_ _IRQL_uses_cancel_ KIRQL Irql
);
13108 _IRQL_requires_max_(PASSIVE_LEVEL
)
13112 IoReleaseRemoveLockAndWaitEx(
13113 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
13114 _In_opt_ PVOID Tag
,
13115 _In_ ULONG RemlockSize
);
13120 IoReleaseRemoveLockEx(
13121 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
13122 _In_opt_ PVOID Tag
,
13123 _In_ ULONG RemlockSize
);
13125 _IRQL_requires_max_(PASSIVE_LEVEL
)
13129 IoRemoveShareAccess(
13130 _In_ PFILE_OBJECT FileObject
,
13131 _Inout_ PSHARE_ACCESS ShareAccess
);
13133 _IRQL_requires_max_(PASSIVE_LEVEL
)
13137 IoReportTargetDeviceChange(
13138 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
13139 _In_ PVOID NotificationStructure
);
13141 _IRQL_requires_max_(DISPATCH_LEVEL
)
13145 IoReportTargetDeviceChangeAsynchronous(
13146 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
13147 _In_ PVOID NotificationStructure
,
13148 _In_opt_ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback
,
13149 _In_opt_ PVOID Context
);
13151 _IRQL_requires_max_(DISPATCH_LEVEL
)
13155 IoRequestDeviceEject(
13156 _In_ PDEVICE_OBJECT PhysicalDeviceObject
);
13158 _IRQL_requires_max_(DISPATCH_LEVEL
)
13164 _In_ NTSTATUS Status
);
13166 _IRQL_requires_max_(PASSIVE_LEVEL
)
13167 _Must_inspect_result_
13171 IoSetDeviceInterfaceState(
13172 _In_ PUNICODE_STRING SymbolicLinkName
,
13173 _In_ BOOLEAN Enable
);
13179 _In_ ACCESS_MASK DesiredAccess
,
13180 _In_ ULONG DesiredShareAccess
,
13181 _Inout_ PFILE_OBJECT FileObject
,
13182 _Out_ PSHARE_ACCESS ShareAccess
);
13184 _IRQL_requires_max_(DISPATCH_LEVEL
)
13185 _IRQL_requires_min_(DISPATCH_LEVEL
)
13190 _In_ PDEVICE_OBJECT DeviceObject
,
13191 _In_ BOOLEAN Cancelable
);
13193 _IRQL_requires_max_(DISPATCH_LEVEL
)
13197 IoStartNextPacketByKey(
13198 _In_ PDEVICE_OBJECT DeviceObject
,
13199 _In_ BOOLEAN Cancelable
,
13202 _IRQL_requires_max_(DISPATCH_LEVEL
)
13207 _In_ PDEVICE_OBJECT DeviceObject
,
13209 _In_opt_ PULONG Key
,
13210 _In_opt_ PDRIVER_CANCEL CancelFunction
);
13212 _IRQL_requires_max_(DISPATCH_LEVEL
)
13217 _In_ PDEVICE_OBJECT DeviceObject
);
13219 _IRQL_requires_max_(DISPATCH_LEVEL
)
13224 _In_ PDEVICE_OBJECT DeviceObject
);
13226 _IRQL_requires_max_(PASSIVE_LEVEL
)
13227 __drv_freesMem(Pool
)
13231 IoUnregisterPlugPlayNotification(
13232 _In_ PVOID NotificationEntry
);
13234 _IRQL_requires_max_(PASSIVE_LEVEL
)
13238 IoUnregisterShutdownNotification(
13239 _In_ PDEVICE_OBJECT DeviceObject
);
13241 _IRQL_requires_max_(PASSIVE_LEVEL
)
13245 IoUpdateShareAccess(
13246 _In_ PFILE_OBJECT FileObject
,
13247 _Inout_ PSHARE_ACCESS ShareAccess
);
13249 _IRQL_requires_max_(PASSIVE_LEVEL
)
13253 IoWMIAllocateInstanceIds(
13255 _In_ ULONG InstanceCount
,
13256 _Out_ ULONG
*FirstInstanceId
);
13261 IoWMIQuerySingleInstanceMultiple(
13262 _In_reads_(ObjectCount
) PVOID
*DataBlockObjectList
,
13263 _In_reads_(ObjectCount
) PUNICODE_STRING InstanceNames
,
13264 _In_ ULONG ObjectCount
,
13265 _Inout_ ULONG
*InOutBufferSize
,
13266 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
13268 _IRQL_requires_max_(PASSIVE_LEVEL
)
13272 IoWMIRegistrationControl(
13273 _In_ PDEVICE_OBJECT DeviceObject
,
13274 _In_ ULONG Action
);
13279 IoWMISuggestInstanceName(
13280 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
13281 _In_opt_ PUNICODE_STRING SymbolicLinkName
,
13282 _In_ BOOLEAN CombineNames
,
13283 _Out_ PUNICODE_STRING SuggestedInstanceName
);
13285 _Must_inspect_result_
13286 _IRQL_requires_max_(DISPATCH_LEVEL
)
13292 _Inout_
_When_(return==0, __drv_aliasesMem
) PVOID WnodeEventItem
);
13294 _IRQL_requires_max_(DISPATCH_LEVEL
)
13298 IoWriteErrorLogEntry(
13299 _In_ PVOID ElEntry
);
13304 IoGetTopLevelIrp(VOID
);
13306 _IRQL_requires_max_(PASSIVE_LEVEL
)
13310 IoRegisterLastChanceShutdownNotification(
13311 _In_ PDEVICE_OBJECT DeviceObject
);
13317 _In_opt_ PIRP Irp
);
13320 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
13323 #if (NTDDI_VERSION >= NTDDI_WINXP)
13330 _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp
,
13331 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
13332 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
13333 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
13334 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
13335 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
13341 _Inout_ PIO_CSQ Csq
,
13343 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context
);
13349 _Inout_ PIO_CSQ Csq
,
13350 _Inout_ PIO_CSQ_IRP_CONTEXT Context
);
13355 IoCsqRemoveNextIrp(
13356 _Inout_ PIO_CSQ Csq
,
13357 _In_opt_ PVOID PeekContext
);
13362 IoForwardIrpSynchronously(
13363 _In_ PDEVICE_OBJECT DeviceObject
,
13366 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
13371 IoFreeErrorLogEntry(
13372 _In_ PVOID ElEntry
);
13374 _IRQL_requires_max_(DISPATCH_LEVEL
)
13375 _Must_inspect_result_
13379 IoSetCompletionRoutineEx(
13380 _In_ PDEVICE_OBJECT DeviceObject
,
13382 _In_ PIO_COMPLETION_ROUTINE CompletionRoutine
,
13383 _In_opt_ PVOID Context
,
13384 _In_ BOOLEAN InvokeOnSuccess
,
13385 _In_ BOOLEAN InvokeOnError
,
13386 _In_ BOOLEAN InvokeOnCancel
);
13390 IoSetStartIoAttributes(
13391 _In_ PDEVICE_OBJECT DeviceObject
,
13392 _In_ BOOLEAN DeferredStartIo
,
13393 _In_ BOOLEAN NonCancelable
);
13398 IoWMIDeviceObjectToInstanceName(
13399 _In_ PVOID DataBlockObject
,
13400 _In_ PDEVICE_OBJECT DeviceObject
,
13401 _Out_ PUNICODE_STRING InstanceName
);
13406 IoWMIExecuteMethod(
13407 _In_ PVOID DataBlockObject
,
13408 _In_ PUNICODE_STRING InstanceName
,
13409 _In_ ULONG MethodId
,
13410 _In_ ULONG InBufferSize
,
13411 _Inout_ PULONG OutBufferSize
,
13412 _Inout_updates_bytes_to_opt_(*OutBufferSize
, InBufferSize
) PUCHAR InOutBuffer
);
13417 IoWMIHandleToInstanceName(
13418 _In_ PVOID DataBlockObject
,
13419 _In_ HANDLE FileHandle
,
13420 _Out_ PUNICODE_STRING InstanceName
);
13426 _In_ GUID
*DataBlockGuid
,
13427 _In_ ULONG DesiredAccess
,
13428 _Out_ PVOID
*DataBlockObject
);
13434 _In_ PVOID DataBlockObject
,
13435 _Inout_ ULONG
*InOutBufferSize
,
13436 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
13441 IoWMIQueryAllDataMultiple(
13442 _In_reads_(ObjectCount
) PVOID
*DataBlockObjectList
,
13443 _In_ ULONG ObjectCount
,
13444 _Inout_ ULONG
*InOutBufferSize
,
13445 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
13450 IoWMIQuerySingleInstance(
13451 _In_ PVOID DataBlockObject
,
13452 _In_ PUNICODE_STRING InstanceName
,
13453 _Inout_ ULONG
*InOutBufferSize
,
13454 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
13459 IoWMISetNotificationCallback(
13460 _Inout_ PVOID Object
,
13461 _In_ WMI_NOTIFICATION_CALLBACK Callback
,
13462 _In_opt_ PVOID Context
);
13467 IoWMISetSingleInstance(
13468 _In_ PVOID DataBlockObject
,
13469 _In_ PUNICODE_STRING InstanceName
,
13470 _In_ ULONG Version
,
13471 _In_ ULONG ValueBufferSize
,
13472 _In_reads_bytes_(ValueBufferSize
) PVOID ValueBuffer
);
13477 IoWMISetSingleItem(
13478 _In_ PVOID DataBlockObject
,
13479 _In_ PUNICODE_STRING InstanceName
,
13480 _In_ ULONG DataItemId
,
13481 _In_ ULONG Version
,
13482 _In_ ULONG ValueBufferSize
,
13483 _In_reads_bytes_(ValueBufferSize
) PVOID ValueBuffer
);
13485 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
13487 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
13491 IoValidateDeviceIoControlAccess(
13493 _In_ ULONG RequiredAccess
);
13496 #if (NTDDI_VERSION >= NTDDI_WS03)
13502 _In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrp
,
13503 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
13504 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
13505 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
13506 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
13507 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
13513 _Inout_ PIO_CSQ Csq
,
13515 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context
,
13516 _In_opt_ PVOID InsertContext
);
13517 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
13520 #if (NTDDI_VERSION >= NTDDI_VISTA)
13524 IoGetBootDiskInformationLite(
13525 _Outptr_ PBOOTDISK_INFORMATION_LITE
*BootDiskInformation
);
13530 IoCheckShareAccessEx(
13531 _In_ ACCESS_MASK DesiredAccess
,
13532 _In_ ULONG DesiredShareAccess
,
13533 _Inout_ PFILE_OBJECT FileObject
,
13534 _Inout_ PSHARE_ACCESS ShareAccess
,
13535 _In_ BOOLEAN Update
,
13536 _In_ PBOOLEAN WritePermission
);
13541 IoConnectInterruptEx(
13542 _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters
);
13547 IoDisconnectInterruptEx(
13548 _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters
);
13552 IoWithinStackLimits(
13553 _In_ ULONG_PTR RegionStart
,
13554 _In_ SIZE_T RegionSize
);
13559 IoSetShareAccessEx(
13560 _In_ ACCESS_MASK DesiredAccess
,
13561 _In_ ULONG DesiredShareAccess
,
13562 _Inout_ PFILE_OBJECT FileObject
,
13563 _Out_ PSHARE_ACCESS ShareAccess
,
13564 _In_ PBOOLEAN WritePermission
);
13568 IoSizeofWorkItem(VOID
);
13572 IoInitializeWorkItem(
13573 _In_ PVOID IoObject
,
13574 _Out_ PIO_WORKITEM IoWorkItem
);
13578 IoUninitializeWorkItem(
13579 _Inout_ PIO_WORKITEM IoWorkItem
);
13581 _IRQL_requires_max_(DISPATCH_LEVEL
)
13585 _Inout_ PIO_WORKITEM IoWorkItem
,
13586 _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine
,
13587 _In_ WORK_QUEUE_TYPE QueueType
,
13588 _In_opt_ __drv_aliasesMem PVOID Context
);
13592 IoGetIoPriorityHint(
13597 IoSetIoPriorityHint(
13599 _In_ IO_PRIORITY_HINT PriorityHint
);
13603 IoAllocateSfioStreamIdentifier(
13604 _In_ PFILE_OBJECT FileObject
,
13606 _In_ PVOID Signature
,
13607 _Out_ PVOID
*StreamIdentifier
);
13611 IoGetSfioStreamIdentifier(
13612 _In_ PFILE_OBJECT FileObject
,
13613 _In_ PVOID Signature
);
13617 IoFreeSfioStreamIdentifier(
13618 _In_ PFILE_OBJECT FileObject
,
13619 _In_ PVOID Signature
);
13621 _IRQL_requires_max_(DISPATCH_LEVEL
)
13622 _Must_inspect_result_
13626 IoRequestDeviceEjectEx(
13627 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
13628 _In_opt_ PIO_DEVICE_EJECT_CALLBACK Callback
,
13629 _In_opt_ PVOID Context
,
13630 _In_opt_ PDRIVER_OBJECT DriverObject
);
13632 _IRQL_requires_max_(PASSIVE_LEVEL
)
13633 _Must_inspect_result_
13637 IoSetDevicePropertyData(
13638 _In_ PDEVICE_OBJECT Pdo
,
13639 _In_ CONST DEVPROPKEY
*PropertyKey
,
13642 _In_ DEVPROPTYPE Type
,
13644 _In_opt_ PVOID Data
);
13646 _IRQL_requires_max_(PASSIVE_LEVEL
)
13647 _Must_inspect_result_
13651 IoGetDevicePropertyData(
13652 _In_ PDEVICE_OBJECT Pdo
,
13653 _In_ CONST DEVPROPKEY
*PropertyKey
,
13655 _Reserved_ ULONG Flags
,
13658 _Out_ PULONG RequiredSize
,
13659 _Out_ PDEVPROPTYPE Type
);
13661 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
13663 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
13665 #if (NTDDI_VERSION >= NTDDI_WS08)
13666 _IRQL_requires_max_(PASSIVE_LEVEL
)
13667 _Must_inspect_result_
13671 IoReplacePartitionUnit(
13672 _In_ PDEVICE_OBJECT TargetPdo
,
13673 _In_ PDEVICE_OBJECT SparePdo
,
13677 #if (NTDDI_VERSION >= NTDDI_WIN7)
13682 IoGetAffinityInterrupt(
13683 _In_ PKINTERRUPT InterruptObject
,
13684 _Out_ PGROUP_AFFINITY GroupAffinity
);
13688 IoGetContainerInformation(
13689 _In_ IO_CONTAINER_INFORMATION_CLASS InformationClass
,
13690 _In_opt_ PVOID ContainerObject
,
13691 _Inout_updates_bytes_opt_(BufferLength
) PVOID Buffer
,
13692 _In_ ULONG BufferLength
);
13696 IoRegisterContainerNotification(
13697 _In_ IO_CONTAINER_NOTIFICATION_CLASS NotificationClass
,
13698 _In_ PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction
,
13699 _In_reads_bytes_opt_(NotificationInformationLength
) PVOID NotificationInformation
,
13700 _In_ ULONG NotificationInformationLength
,
13701 _Out_ PVOID CallbackRegistration
);
13705 IoUnregisterContainerNotification(
13706 _In_ PVOID CallbackRegistration
);
13708 _IRQL_requires_max_(PASSIVE_LEVEL
)
13709 __drv_freesMem(Pool
)
13713 IoUnregisterPlugPlayNotificationEx(
13714 _In_ PVOID NotificationEntry
);
13716 _IRQL_requires_max_(PASSIVE_LEVEL
)
13717 _Must_inspect_result_
13721 IoGetDeviceNumaNode(
13722 _In_ PDEVICE_OBJECT Pdo
,
13723 _Out_ PUSHORT NodeNumber
);
13725 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
13727 #if defined(_WIN64)
13731 IoWMIDeviceObjectToProviderId(
13732 _In_ PDEVICE_OBJECT DeviceObject
);
13734 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
13740 * IN CCHAR StackSize)
13742 #define IoSizeOfIrp(_StackSize) \
13743 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
13747 IoSkipCurrentIrpStackLocation(
13750 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
13751 Irp
->CurrentLocation
++;
13752 #ifdef NONAMELESSUNION
13753 Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
++;
13755 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
13761 IoSetNextIrpStackLocation(
13764 ASSERT(Irp
->CurrentLocation
> 0);
13765 Irp
->CurrentLocation
--;
13766 #ifdef NONAMELESSUNION
13767 Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
--;
13769 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
13776 IoGetNextIrpStackLocation(
13779 ASSERT(Irp
->CurrentLocation
> 0);
13780 #ifdef NONAMELESSUNION
13781 return ((Irp
)->Tail
.Overlay
.s
.u
.CurrentStackLocation
- 1 );
13783 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
13787 _IRQL_requires_max_(DISPATCH_LEVEL
)
13790 IoSetCompletionRoutine(
13792 _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine
,
13793 _In_opt_ __drv_aliasesMem PVOID Context
,
13794 _In_ BOOLEAN InvokeOnSuccess
,
13795 _In_ BOOLEAN InvokeOnError
,
13796 _In_ BOOLEAN InvokeOnCancel
)
13798 PIO_STACK_LOCATION irpSp
;
13799 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
13800 irpSp
= IoGetNextIrpStackLocation(Irp
);
13801 irpSp
->CompletionRoutine
= CompletionRoutine
;
13802 irpSp
->Context
= Context
;
13803 irpSp
->Control
= 0;
13805 if (InvokeOnSuccess
) {
13806 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
13809 if (InvokeOnError
) {
13810 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
13813 if (InvokeOnCancel
) {
13814 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
13818 _IRQL_requires_max_(DISPATCH_LEVEL
)
13822 IoSetCancelRoutine(
13824 _In_opt_ PDRIVER_CANCEL CancelRoutine
)
13826 return (PDRIVER_CANCEL
)(ULONG_PTR
) InterlockedExchangePointer((PVOID
*)&(Irp
)->CancelRoutine
, (PVOID
)(ULONG_PTR
)(CancelRoutine
));
13832 _Inout_ PDEVICE_OBJECT DeviceObject
,
13834 _In_opt_ __drv_aliasesMem PVOID Context
)
13836 KeInsertQueueDpc(&DeviceObject
->Dpc
, Irp
, Context
);
13841 * IoReleaseRemoveLock(
13842 * IN PIO_REMOVE_LOCK RemoveLock,
13845 #define IoReleaseRemoveLock(_RemoveLock, \
13847 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
13851 * IoReleaseRemoveLockAndWait(
13852 * IN PIO_REMOVE_LOCK RemoveLock,
13855 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
13857 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
13859 #if defined(_WIN64)
13860 _IRQL_requires_max_(DISPATCH_LEVEL
)
13864 _In_opt_ PIRP Irp
);
13867 #define PLUGPLAY_REGKEY_DEVICE 1
13868 #define PLUGPLAY_REGKEY_DRIVER 2
13869 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
13874 IoGetCurrentIrpStackLocation(
13877 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
13878 #ifdef NONAMELESSUNION
13879 return Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
;
13881 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
13890 IoGetCurrentIrpStackLocation((Irp
))->Control
|= SL_PENDING_RETURNED
;
13895 * IoIsErrorUserInduced(
13896 * IN NTSTATUS Status);
13898 #define IoIsErrorUserInduced(Status) \
13899 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
13900 ((Status) == STATUS_IO_TIMEOUT) || \
13901 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
13902 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
13903 ((Status) == STATUS_VERIFY_REQUIRED) || \
13904 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
13905 ((Status) == STATUS_WRONG_VOLUME)))
13908 * IoInitializeRemoveLock(
13909 * IN PIO_REMOVE_LOCK Lock,
13910 * IN ULONG AllocateTag,
13911 * IN ULONG MaxLockedMinutes,
13912 * IN ULONG HighWatermark)
13914 #define IoInitializeRemoveLock( \
13915 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
13916 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
13917 HighWatermark, sizeof(IO_REMOVE_LOCK))
13921 IoInitializeDpcRequest(
13922 _In_ PDEVICE_OBJECT DeviceObject
,
13923 _In_ PIO_DPC_ROUTINE DpcRoutine
)
13926 #pragma warning(push)
13927 #pragma warning(disable:28024)
13929 KeInitializeDpc(&DeviceObject
->Dpc
,
13930 (PKDEFERRED_ROUTINE
) DpcRoutine
,
13933 #pragma warning(pop)
13937 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
13941 * IoGetFunctionCodeFromCtlCode(
13942 * IN ULONG ControlCode)
13944 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
13945 (((_ControlCode) >> 2) & 0x00000FFF)
13949 IoCopyCurrentIrpStackLocationToNext(
13952 PIO_STACK_LOCATION irpSp
;
13953 PIO_STACK_LOCATION nextIrpSp
;
13954 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
13955 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
13956 RtlCopyMemory(nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
13957 nextIrpSp
->Control
= 0;
13960 _IRQL_requires_max_(APC_LEVEL
)
13965 _Out_ PULONG_PTR LowLimit
,
13966 _Out_ PULONG_PTR HighLimit
);
13968 _IRQL_requires_max_(APC_LEVEL
)
13971 IoGetRemainingStackSize(VOID
)
13973 ULONG_PTR End
, Begin
;
13976 IoGetStackLimits(&Begin
, &End
);
13977 Result
= (ULONG_PTR
)(&End
) - Begin
;
13981 #if (NTDDI_VERSION >= NTDDI_WS03)
13984 IoInitializeThreadedDpcRequest(
13985 _In_ PDEVICE_OBJECT DeviceObject
,
13986 _In_ PIO_DPC_ROUTINE DpcRoutine
)
13989 #pragma warning(push)
13990 #pragma warning(disable:28024)
13991 #pragma warning(disable:28128)
13993 KeInitializeThreadedDpc(&DeviceObject
->Dpc
,
13994 (PKDEFERRED_ROUTINE
) DpcRoutine
,
13997 #pragma warning(pop)
14002 /******************************************************************************
14003 * Power Management Support Functions *
14004 ******************************************************************************/
14006 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
14008 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14010 _IRQL_requires_max_(DISPATCH_LEVEL
)
14015 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
14016 _Inout_ __drv_aliasesMem
struct _IRP
*Irp
);
14018 _IRQL_requires_max_(APC_LEVEL
)
14022 PoRegisterDeviceForIdleDetection(
14023 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
14024 _In_ ULONG ConservationIdleTime
,
14025 _In_ ULONG PerformanceIdleTime
,
14026 _In_ DEVICE_POWER_STATE State
);
14028 _IRQL_requires_max_(APC_LEVEL
)
14032 PoRegisterSystemState(
14033 _Inout_opt_ PVOID StateHandle
,
14034 _In_ EXECUTION_STATE Flags
);
14036 _IRQL_requires_max_(DISPATCH_LEVEL
)
14041 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
14042 _In_ UCHAR MinorFunction
,
14043 _In_ POWER_STATE PowerState
,
14044 _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction
,
14045 _In_opt_ __drv_aliasesMem PVOID Context
,
14046 _Outptr_opt_
struct _IRP
**Irp
);
14048 _IRQL_requires_max_(DISPATCH_LEVEL
)
14053 _In_
struct _DEVICE_OBJECT
*DeviceObject
,
14054 _In_ POWER_STATE_TYPE Type
,
14055 _In_ POWER_STATE State
);
14057 _IRQL_requires_max_(DISPATCH_LEVEL
)
14062 _In_ EXECUTION_STATE Flags
);
14064 _IRQL_requires_max_(DISPATCH_LEVEL
)
14068 PoStartNextPowerIrp(
14069 _Inout_
struct _IRP
*Irp
);
14071 _IRQL_requires_max_(APC_LEVEL
)
14075 PoUnregisterSystemState(
14076 _Inout_ PVOID StateHandle
);
14081 PoRequestShutdownEvent(
14084 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14086 #if (NTDDI_VERSION >= NTDDI_VISTA)
14088 _IRQL_requires_max_(DISPATCH_LEVEL
)
14093 _Inout_
struct _IRP
*Irp
);
14095 _IRQL_requires_max_(DISPATCH_LEVEL
)
14100 _In_
struct _IRP
*Irp
);
14102 _IRQL_requires_max_(APC_LEVEL
)
14106 PoRegisterPowerSettingCallback(
14107 _In_opt_ PDEVICE_OBJECT DeviceObject
,
14108 _In_ LPCGUID SettingGuid
,
14109 _In_ PPOWER_SETTING_CALLBACK Callback
,
14110 _In_opt_ PVOID Context
,
14111 _Outptr_opt_ PVOID
*Handle
);
14113 _IRQL_requires_max_(APC_LEVEL
)
14117 PoUnregisterPowerSettingCallback(
14118 _Inout_ PVOID Handle
);
14120 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14122 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
14127 _Inout_ PULONG IdlePointer
);
14128 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
14130 #if (NTDDI_VERSION >= NTDDI_WIN7)
14136 _Inout_ PULONG IdlePointer
);
14142 _Inout_ PULONG IdlePointer
);
14144 _IRQL_requires_max_(DISPATCH_LEVEL
)
14148 PoQueryWatchdogTime(
14149 _In_ PDEVICE_OBJECT Pdo
,
14150 _Out_ PULONG SecondsRemaining
);
14152 _IRQL_requires_max_(APC_LEVEL
)
14156 PoDeletePowerRequest(
14157 _Inout_ PVOID PowerRequest
);
14159 _IRQL_requires_max_(DISPATCH_LEVEL
)
14164 _Inout_ PVOID PowerRequest
,
14165 _In_ POWER_REQUEST_TYPE Type
);
14167 _IRQL_requires_max_(DISPATCH_LEVEL
)
14171 PoClearPowerRequest(
14172 _Inout_ PVOID PowerRequest
,
14173 _In_ POWER_REQUEST_TYPE Type
);
14175 _IRQL_requires_max_(APC_LEVEL
)
14179 PoCreatePowerRequest(
14180 _Outptr_ PVOID
*PowerRequest
,
14181 _In_ PDEVICE_OBJECT DeviceObject
,
14182 _In_opt_ PCOUNTED_REASON_CONTEXT Context
);
14184 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14186 /******************************************************************************
14187 * Executive Functions *
14188 ******************************************************************************/
14190 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
14191 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
14192 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
14194 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
14195 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
14196 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
14197 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
14199 #define ExInitializeSListHead InitializeSListHead
14201 #if defined(_NTHAL_) && defined(_X86_)
14206 ExiAcquireFastMutex(
14207 IN OUT PFAST_MUTEX FastMutex
);
14212 ExiReleaseFastMutex(
14213 IN OUT PFAST_MUTEX FastMutex
);
14218 ExiTryToAcquireFastMutex(
14219 IN OUT PFAST_MUTEX FastMutex
);
14221 #define ExAcquireFastMutex ExiAcquireFastMutex
14222 #define ExReleaseFastMutex ExiReleaseFastMutex
14223 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
14227 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14229 _IRQL_raises_(APC_LEVEL
)
14230 _IRQL_saves_global_(OldIrql
, FastMutex
)
14234 ExAcquireFastMutex(
14235 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
14236 PFAST_MUTEX FastMutex
);
14238 _IRQL_requires_(APC_LEVEL
)
14239 _IRQL_restores_global_(OldIrql
, FastMutex
)
14243 ExReleaseFastMutex(
14244 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
14245 PFAST_MUTEX FastMutex
);
14247 _Must_inspect_result_
14248 _Success_(return!=FALSE
)
14249 _IRQL_raises_(APC_LEVEL
)
14250 _IRQL_saves_global_(OldIrql
, FastMutex
)
14254 ExTryToAcquireFastMutex(
14255 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
14256 PFAST_MUTEX FastMutex
);
14258 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14260 #endif /* defined(_NTHAL_) && defined(_X86_) */
14263 #define ExInterlockedAddUlong ExfInterlockedAddUlong
14264 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
14265 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
14266 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
14267 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
14268 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
14269 #endif /* defined(_X86_) */
14271 #if defined(_WIN64)
14273 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
14274 defined(_NTHAL_) || defined(_NTOSP_)
14277 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead
);
14281 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead
)
14283 return (USHORT
)(ListHead
->Alignment
& 0xffff);
14289 ExpInterlockedFlushSList(
14290 PSLIST_HEADER ListHead
);
14294 ExpInterlockedPopEntrySList(
14295 _Inout_ PSLIST_HEADER ListHead
);
14299 ExpInterlockedPushEntrySList(
14300 _Inout_ PSLIST_HEADER ListHead
,
14301 _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry
);
14303 #define ExInterlockedFlushSList(Head) \
14304 ExpInterlockedFlushSList(Head)
14305 #define ExInterlockedPopEntrySList(Head, Lock) \
14306 ExpInterlockedPopEntrySList(Head)
14307 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
14308 ExpInterlockedPushEntrySList(Head, Entry)
14310 #else /* !defined(_WIN64) */
14312 #ifdef NONAMELESSUNION
14313 #define ExQueryDepthSList(listhead) (listhead)->s.Depth
14315 #define ExQueryDepthSList(listhead) (listhead)->Depth
14321 ExInterlockedFlushSList(
14322 _Inout_ PSLIST_HEADER ListHead
);
14324 #endif /* !defined(_WIN64) */
14326 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
14331 ExInterlockedPopEntrySList(
14332 _Inout_ PSLIST_HEADER ListHead
,
14333 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14338 ExInterlockedPushEntrySList(
14339 _Inout_ PSLIST_HEADER ListHead
,
14340 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry
,
14341 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14343 _IRQL_requires_max_(APC_LEVEL
)
14347 ExAllocateFromPagedLookasideList(
14348 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
14350 _IRQL_requires_max_(APC_LEVEL
)
14354 ExFreeToPagedLookasideList(
14355 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
,
14358 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
14360 #if !defined(_WIN64)
14361 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
14362 InterlockedPopEntrySList(_ListHead)
14363 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
14364 InterlockedPushEntrySList(_ListHead, _ListEntry)
14367 _IRQL_requires_max_(APC_LEVEL
)
14370 ExAllocateFromPagedLookasideList(
14371 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
)
14375 Lookaside
->L
.TotalAllocates
++;
14376 #ifdef NONAMELESSUNION
14377 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
14378 if (Entry
== NULL
) {
14379 Lookaside
->L
.u2
.AllocateMisses
++;
14380 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
14384 #else /* NONAMELESSUNION */
14385 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
14386 if (Entry
== NULL
) {
14387 Lookaside
->L
.AllocateMisses
++;
14388 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
14392 #endif /* NONAMELESSUNION */
14396 _IRQL_requires_max_(APC_LEVEL
)
14399 ExFreeToPagedLookasideList(
14400 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
,
14403 Lookaside
->L
.TotalFrees
++;
14404 #ifdef NONAMELESSUNION
14405 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
14406 Lookaside
->L
.u3
.FreeMisses
++;
14407 (Lookaside
->L
.u5
.Free
)(Entry
);
14409 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
14411 #else /* NONAMELESSUNION */
14412 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
14413 Lookaside
->L
.FreeMisses
++;
14414 (Lookaside
->L
.Free
)(Entry
);
14416 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
14418 #endif /* NONAMELESSUNION */
14421 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
14424 /* ERESOURCE_THREAD
14425 * ExGetCurrentResourceThread(
14428 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
14430 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
14433 * ExInitializeWorkItem(
14434 * IN PWORK_QUEUE_ITEM Item,
14435 * IN PWORKER_THREAD_ROUTINE Routine,
14436 * IN PVOID Context)
14438 #define ExInitializeWorkItem(Item, Routine, Context) \
14440 (Item)->WorkerRoutine = Routine; \
14441 (Item)->Parameter = Context; \
14442 (Item)->List.Flink = NULL; \
14447 ExInitializeFastMutex(
14448 _Out_ PFAST_MUTEX FastMutex
)
14450 FastMutex
->Count
= FM_LOCK_BIT
;
14451 FastMutex
->Owner
= NULL
;
14452 FastMutex
->Contention
= 0;
14453 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
14458 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14459 _IRQL_requires_max_(APC_LEVEL
)
14460 _Requires_lock_held_(_Global_critical_region_
)
14464 ExAcquireFastMutexUnsafe(
14465 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
14466 PFAST_MUTEX FastMutex
);
14468 _IRQL_requires_max_(APC_LEVEL
)
14469 _Requires_lock_held_(_Global_critical_region_
)
14473 ExReleaseFastMutexUnsafe(
14474 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
14475 PFAST_MUTEX FastMutex
);
14477 _Requires_lock_held_(_Global_critical_region_
)
14478 _Requires_lock_not_held_(*Resource
)
14479 _When_(Wait
!=0, _Acquires_exclusive_lock_(*Resource
))
14480 _IRQL_requires_max_(APC_LEVEL
)
14481 _When_(Wait
!=0, _Post_satisfies_(return == 1))
14482 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
14486 ExAcquireResourceExclusiveLite(
14487 _Inout_ PERESOURCE Resource
,
14488 _In_ _Literal_ BOOLEAN Wait
);
14490 _IRQL_requires_max_(APC_LEVEL
)
14491 _Requires_lock_held_(_Global_critical_region_
)
14492 _When_(Wait
!=0, _Post_satisfies_(return == 1))
14493 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
14497 ExAcquireResourceSharedLite(
14498 _Inout_
_Requires_lock_not_held_(*_Curr_
)
14499 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
14500 PERESOURCE Resource
,
14501 _In_ BOOLEAN Wait
);
14503 _IRQL_requires_max_(APC_LEVEL
)
14504 _Requires_lock_held_(_Global_critical_region_
)
14505 _When_(Wait
!=0, _Post_satisfies_(return == 1))
14506 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
14510 ExAcquireSharedStarveExclusive(
14511 _Inout_
_Requires_lock_not_held_(*_Curr_
)
14512 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
14513 PERESOURCE Resource
,
14514 _In_ BOOLEAN Wait
);
14516 _IRQL_requires_max_(APC_LEVEL
)
14517 _Requires_lock_held_(_Global_critical_region_
)
14518 _When_(Wait
!=0, _Post_satisfies_(return == 1))
14519 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
14523 ExAcquireSharedWaitForExclusive(
14524 _Inout_
_Requires_lock_not_held_(*_Curr_
)
14525 _When_(return!=0, _Acquires_lock_(*_Curr_
))
14526 PERESOURCE Resource
,
14527 _In_ BOOLEAN Wait
);
14529 __drv_preferredFunction("ExAllocatePoolWithTag",
14530 "No tag interferes with debugging.")
14531 __drv_allocatesMem(Mem
)
14532 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14533 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14534 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14535 __drv_reportError("Must succeed pool allocations are forbidden. "
14536 "Allocation failures cause a system crash"))
14537 _When_((PoolType
& (NonPagedPoolMustSucceed
|
14538 POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
14539 _Post_maybenull_ _Must_inspect_result_
)
14540 _When_((PoolType
& (NonPagedPoolMustSucceed
|
14541 POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
14543 _Post_writable_byte_size_(NumberOfBytes
)
14548 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
14549 _In_ SIZE_T NumberOfBytes
);
14551 __drv_preferredFunction("ExAllocatePoolWithQuotaTag",
14552 "No tag interferes with debugging.")
14553 __drv_allocatesMem(Mem
)
14554 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14555 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14556 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14557 __drv_reportError("Must succeed pool allocations are forbidden. "
14558 "Allocation failures cause a system crash"))
14559 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
14560 _Post_maybenull_ _Must_inspect_result_
)
14561 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
14562 _Post_writable_byte_size_(NumberOfBytes
)
14566 ExAllocatePoolWithQuota(
14567 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
14568 _In_ SIZE_T NumberOfBytes
);
14570 __drv_allocatesMem(Mem
)
14571 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14572 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14573 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14574 __drv_reportError("Must succeed pool allocations are forbidden. "
14575 "Allocation failures cause a system crash"))
14576 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
14577 _Post_maybenull_ _Must_inspect_result_
)
14578 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
14579 _Post_writable_byte_size_(NumberOfBytes
)
14583 ExAllocatePoolWithQuotaTag(
14584 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
14585 _In_ SIZE_T NumberOfBytes
,
14588 #ifndef POOL_TAGGING
14589 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
14592 __drv_allocatesMem(Mem
)
14593 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14594 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14595 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14596 __drv_reportError("Must succeed pool allocations are forbidden. "
14597 "Allocation failures cause a system crash"))
14598 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
14599 _Post_maybenull_ _Must_inspect_result_
)
14600 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
14602 _Post_writable_byte_size_(NumberOfBytes
)
14603 _Function_class_(ALLOCATE_FUNCTION
)
14607 ExAllocatePoolWithTag(
14608 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
14609 _In_ SIZE_T NumberOfBytes
,
14612 #ifndef POOL_TAGGING
14613 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
14616 __drv_allocatesMem(Mem
)
14617 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
14618 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
14619 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
14620 __drv_reportError("Must succeed pool allocations are forbidden. "
14621 "Allocation failures cause a system crash"))
14622 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
14623 _Post_maybenull_ _Must_inspect_result_
)
14624 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
14626 _Post_writable_byte_size_(NumberOfBytes
)
14630 ExAllocatePoolWithTagPriority(
14631 _In_
__drv_strictTypeMatch(__drv_typeCond
) POOL_TYPE PoolType
,
14632 _In_ SIZE_T NumberOfBytes
,
14634 _In_
__drv_strictTypeMatch(__drv_typeExpr
) EX_POOL_PRIORITY Priority
);
14636 _IRQL_requires_max_(DISPATCH_LEVEL
)
14640 ExConvertExclusiveToSharedLite(
14641 _Inout_
_Requires_lock_held_(*_Curr_
) PERESOURCE Resource
);
14643 _IRQL_requires_max_(APC_LEVEL
)
14648 _Outptr_ PCALLBACK_OBJECT
*CallbackObject
,
14649 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
14650 _In_ BOOLEAN Create
,
14651 _In_ BOOLEAN AllowMultipleCallbacks
);
14656 ExDeleteNPagedLookasideList(
14657 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
);
14659 _IRQL_requires_max_(APC_LEVEL
)
14663 ExDeletePagedLookasideList(
14664 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
14666 _IRQL_requires_max_(DISPATCH_LEVEL
)
14670 ExDeleteResourceLite(
14671 _Inout_ PERESOURCE Resource
);
14673 _IRQL_requires_max_(DISPATCH_LEVEL
)
14674 _Function_class_(FREE_FUNCTION
)
14679 _In_
__drv_freesMem(Mem
) PVOID P
);
14681 _IRQL_requires_max_(DISPATCH_LEVEL
)
14686 _In_
__drv_freesMem(Mem
) PVOID P
,
14689 _IRQL_requires_max_(DISPATCH_LEVEL
)
14693 ExGetExclusiveWaiterCount(
14694 _In_ PERESOURCE Resource
);
14696 _IRQL_requires_max_(DISPATCH_LEVEL
)
14700 ExGetPreviousMode(VOID
);
14702 _IRQL_requires_max_(DISPATCH_LEVEL
)
14706 ExGetSharedWaiterCount(
14707 _In_ PERESOURCE Resource
);
14709 _IRQL_requires_max_(DISPATCH_LEVEL
)
14713 ExInitializeNPagedLookasideList(
14714 _Out_ PNPAGED_LOOKASIDE_LIST Lookaside
,
14715 _In_opt_ PALLOCATE_FUNCTION Allocate
,
14716 _In_opt_ PFREE_FUNCTION Free
,
14720 _In_ USHORT Depth
);
14722 _IRQL_requires_max_(APC_LEVEL
)
14726 ExInitializePagedLookasideList(
14727 _Out_ PPAGED_LOOKASIDE_LIST Lookaside
,
14728 _In_opt_ PALLOCATE_FUNCTION Allocate
,
14729 _In_opt_ PFREE_FUNCTION Free
,
14733 _In_ USHORT Depth
);
14735 _IRQL_requires_max_(DISPATCH_LEVEL
)
14739 ExInitializeResourceLite(
14740 _Out_ PERESOURCE Resource
);
14745 ExInterlockedAddLargeInteger(
14746 _Inout_ PLARGE_INTEGER Addend
,
14747 _In_ LARGE_INTEGER Increment
,
14748 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14750 #if defined(_WIN64)
14751 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
14752 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
14754 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
14755 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
14761 ExInterlockedAddUlong(
14762 _Inout_ PULONG Addend
,
14763 _In_ ULONG Increment
,
14764 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14766 #if defined(_AMD64_) || defined(_IA64_)
14768 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
14769 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
14771 #elif defined(_X86_)
14776 ExfInterlockedCompareExchange64(
14777 _Inout_ _Interlocked_operand_ LONGLONG
volatile *Destination
,
14778 _In_ PLONGLONG Exchange
,
14779 _In_ PLONGLONG Comperand
);
14781 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
14782 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
14789 ExInterlockedCompareExchange64(
14790 IN OUT LONGLONG
volatile *Destination
,
14791 IN PLONGLONG Exchange
,
14792 IN PLONGLONG Comparand
,
14793 IN PKSPIN_LOCK Lock
);
14795 #endif /* defined(_AMD64_) || defined(_IA64_) */
14800 ExInterlockedInsertHeadList(
14801 _Inout_ PLIST_ENTRY ListHead
,
14802 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry
,
14803 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14808 ExInterlockedInsertTailList(
14809 _Inout_ PLIST_ENTRY ListHead
,
14810 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry
,
14811 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14816 ExInterlockedPopEntryList(
14817 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
14818 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14823 ExInterlockedPushEntryList(
14824 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
14825 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry
,
14826 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14831 ExInterlockedRemoveHeadList(
14832 _Inout_ PLIST_ENTRY ListHead
,
14833 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
14835 _IRQL_requires_max_(PASSIVE_LEVEL
)
14839 ExIsProcessorFeaturePresent(
14840 _In_ ULONG ProcessorFeature
);
14842 _IRQL_requires_max_(DISPATCH_LEVEL
)
14846 ExIsResourceAcquiredExclusiveLite(
14847 _In_ PERESOURCE Resource
);
14849 _IRQL_requires_max_(DISPATCH_LEVEL
)
14853 ExIsResourceAcquiredSharedLite(
14854 _In_ PERESOURCE Resource
);
14856 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
14861 ExLocalTimeToSystemTime(
14862 _In_ PLARGE_INTEGER LocalTime
,
14863 _Out_ PLARGE_INTEGER SystemTime
);
14865 _IRQL_requires_max_(DISPATCH_LEVEL
)
14870 _In_ PCALLBACK_OBJECT CallbackObject
,
14871 _In_opt_ PVOID Argument1
,
14872 _In_opt_ PVOID Argument2
);
14874 _IRQL_requires_max_(DISPATCH_LEVEL
)
14879 _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem
,
14880 __drv_strictTypeMatch(__drv_typeExpr
) _In_ WORK_QUEUE_TYPE QueueType
);
14882 _IRQL_requires_max_(APC_LEVEL
)
14888 _In_ NTSTATUS Status
);
14890 _IRQL_requires_max_(APC_LEVEL
)
14894 ExRegisterCallback(
14895 _Inout_ PCALLBACK_OBJECT CallbackObject
,
14896 _In_ PCALLBACK_FUNCTION CallbackFunction
,
14897 _In_opt_ PVOID CallbackContext
);
14899 _IRQL_requires_max_(DISPATCH_LEVEL
)
14903 ExReinitializeResourceLite(
14904 _Inout_ PERESOURCE Resource
);
14906 _IRQL_requires_max_(DISPATCH_LEVEL
)
14907 _Requires_lock_held_(_Global_critical_region_
)
14911 ExReleaseResourceForThreadLite(
14912 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
14913 PERESOURCE Resource
,
14914 _In_ ERESOURCE_THREAD ResourceThreadId
);
14916 _Requires_lock_held_(_Global_critical_region_
)
14917 _Requires_lock_held_(*Resource
)
14918 _Releases_lock_(*Resource
)
14919 _IRQL_requires_max_(DISPATCH_LEVEL
)
14923 ExReleaseResourceLite(
14924 _Inout_ PERESOURCE Resource
);
14926 _IRQL_requires_max_(DISPATCH_LEVEL
)
14930 ExSetResourceOwnerPointer(
14931 _Inout_ PERESOURCE Resource
,
14932 _In_ PVOID OwnerPointer
);
14934 _IRQL_requires_max_(APC_LEVEL
)
14938 ExSetTimerResolution(
14939 _In_ ULONG DesiredTime
,
14940 _In_ BOOLEAN SetResolution
);
14945 ExSystemTimeToLocalTime(
14946 _In_ PLARGE_INTEGER SystemTime
,
14947 _Out_ PLARGE_INTEGER LocalTime
);
14949 _IRQL_requires_max_(APC_LEVEL
)
14953 ExUnregisterCallback(
14954 _Inout_ PVOID CbRegistration
);
14956 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14958 #if (NTDDI_VERSION >= NTDDI_WINXP)
14960 _Must_inspect_result_
14961 _Post_satisfies_(return == 0 || return == 1)
14965 ExAcquireRundownProtection(
14966 _Inout_ PEX_RUNDOWN_REF RunRef
);
14971 ExInitializeRundownProtection(
14972 _Out_ PEX_RUNDOWN_REF RunRef
);
14977 ExReInitializeRundownProtection(
14978 _Inout_ PEX_RUNDOWN_REF RunRef
);
14983 ExReleaseRundownProtection(
14984 _Inout_ PEX_RUNDOWN_REF RunRef
);
14989 ExRundownCompleted(
14990 _Out_ PEX_RUNDOWN_REF RunRef
);
14996 __drv_strictTypeMatch(__drv_typeExpr
) _In_ SUITE_TYPE SuiteType
);
15001 ExWaitForRundownProtectionRelease(
15002 _Inout_ PEX_RUNDOWN_REF RunRef
);
15003 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15005 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
15007 _Must_inspect_result_
15008 _Post_satisfies_(return == 0 || return == 1)
15012 ExAcquireRundownProtectionEx(
15013 _Inout_ PEX_RUNDOWN_REF RunRef
,
15019 ExReleaseRundownProtectionEx(
15020 _Inout_ PEX_RUNDOWN_REF RunRef
,
15023 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
15025 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
15027 _Must_inspect_result_
15028 _IRQL_requires_max_(APC_LEVEL
)
15030 PEX_RUNDOWN_REF_CACHE_AWARE
15032 ExAllocateCacheAwareRundownProtection(
15033 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
15034 _In_ ULONG PoolTag
);
15036 _IRQL_requires_max_(APC_LEVEL
)
15040 ExSizeOfRundownProtectionCacheAware(VOID
);
15042 _IRQL_requires_max_(APC_LEVEL
)
15043 _Acquires_lock_(_Global_critical_region_
)
15047 ExEnterCriticalRegionAndAcquireResourceShared(
15048 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_shared_lock_(*_Curr_
)
15049 PERESOURCE Resource
);
15051 _IRQL_requires_max_(APC_LEVEL
)
15052 _Acquires_lock_(_Global_critical_region_
)
15056 ExEnterCriticalRegionAndAcquireResourceExclusive(
15057 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_exclusive_lock_(*_Curr_
)
15058 PERESOURCE Resource
);
15060 _IRQL_requires_max_(APC_LEVEL
)
15061 _Acquires_lock_(_Global_critical_region_
)
15065 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
15066 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
15067 PERESOURCE Resource
);
15069 _IRQL_requires_max_(DISPATCH_LEVEL
)
15070 _Releases_lock_(_Global_critical_region_
)
15074 ExReleaseResourceAndLeaveCriticalRegion(
15075 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
15076 PERESOURCE Resource
);
15078 _IRQL_requires_max_(APC_LEVEL
)
15082 ExInitializeRundownProtectionCacheAware(
15083 _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
15084 _In_ SIZE_T RunRefSize
);
15086 _IRQL_requires_max_(APC_LEVEL
)
15090 ExFreeCacheAwareRundownProtection(
15091 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
15093 _Must_inspect_result_
15094 _Post_satisfies_(return == 0 || return == 1)
15098 ExAcquireRundownProtectionCacheAware(
15099 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
15104 ExReleaseRundownProtectionCacheAware(
15105 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
15107 _Must_inspect_result_
15108 _Post_satisfies_(return == 0 || return == 1)
15112 ExAcquireRundownProtectionCacheAwareEx(
15113 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
15119 ExReleaseRundownProtectionCacheAwareEx(
15120 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef
,
15126 ExWaitForRundownProtectionReleaseCacheAware(
15127 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
);
15132 ExReInitializeRundownProtectionCacheAware(
15133 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
15138 ExRundownCompletedCacheAware(
15139 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
15141 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
15143 #if (NTDDI_VERSION >= NTDDI_VISTA)
15145 _IRQL_requires_max_(DISPATCH_LEVEL
)
15149 ExInitializeLookasideListEx(
15150 _Out_ PLOOKASIDE_LIST_EX Lookaside
,
15151 _In_opt_ PALLOCATE_FUNCTION_EX Allocate
,
15152 _In_opt_ PFREE_FUNCTION_EX Free
,
15153 _In_ POOL_TYPE PoolType
,
15157 _In_ USHORT Depth
);
15159 _IRQL_requires_max_(DISPATCH_LEVEL
)
15163 ExDeleteLookasideListEx(
15164 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
15166 _IRQL_requires_max_(DISPATCH_LEVEL
)
15170 ExFlushLookasideListEx(
15171 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
15173 _Must_inspect_result_
15174 _IRQL_requires_max_(DISPATCH_LEVEL
)
15177 ExAllocateFromLookasideListEx(
15178 _Inout_ PLOOKASIDE_LIST_EX Lookaside
)
15182 Lookaside
->L
.TotalAllocates
+= 1;
15183 #ifdef NONAMELESSUNION
15184 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
15185 if (Entry
== NULL
) {
15186 Lookaside
->L
.u2
.AllocateMisses
+= 1;
15187 Entry
= (Lookaside
->L
.u4
.AllocateEx
)(Lookaside
->L
.Type
,
15192 #else /* NONAMELESSUNION */
15193 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
15194 if (Entry
== NULL
) {
15195 Lookaside
->L
.AllocateMisses
+= 1;
15196 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
15201 #endif /* NONAMELESSUNION */
15205 _IRQL_requires_max_(DISPATCH_LEVEL
)
15208 ExFreeToLookasideListEx(
15209 _Inout_ PLOOKASIDE_LIST_EX Lookaside
,
15212 Lookaside
->L
.TotalFrees
+= 1;
15213 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
15214 Lookaside
->L
.FreeMisses
+= 1;
15215 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
15217 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
15222 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15224 #if (NTDDI_VERSION >= NTDDI_WIN7)
15226 _IRQL_requires_max_(DISPATCH_LEVEL
)
15230 ExSetResourceOwnerPointerEx(
15231 _Inout_ PERESOURCE Resource
,
15232 _In_ PVOID OwnerPointer
,
15235 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
15237 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15239 _IRQL_requires_max_(DISPATCH_LEVEL
)
15240 static __inline PVOID
15241 ExAllocateFromNPagedLookasideList(
15242 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
)
15246 Lookaside
->L
.TotalAllocates
++;
15247 #ifdef NONAMELESSUNION
15248 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15249 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
,
15250 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
15252 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
15254 if (Entry
== NULL
) {
15255 Lookaside
->L
.u2
.AllocateMisses
++;
15256 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
15260 #else /* NONAMELESSUNION */
15261 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15262 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
15263 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
15265 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
15267 if (Entry
== NULL
) {
15268 Lookaside
->L
.AllocateMisses
++;
15269 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
15273 #endif /* NONAMELESSUNION */
15277 _IRQL_requires_max_(DISPATCH_LEVEL
)
15278 static __inline VOID
15279 ExFreeToNPagedLookasideList(
15280 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
,
15283 Lookaside
->L
.TotalFrees
++;
15284 #ifdef NONAMELESSUNION
15285 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
15286 Lookaside
->L
.u3
.FreeMisses
++;
15287 (Lookaside
->L
.u5
.Free
)(Entry
);
15289 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15290 ExInterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
,
15291 (PSLIST_ENTRY
)Entry
,
15292 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
15294 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
15297 #else /* NONAMELESSUNION */
15298 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
15299 Lookaside
->L
.FreeMisses
++;
15300 (Lookaside
->L
.Free
)(Entry
);
15302 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15303 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
15304 (PSLIST_ENTRY
)Entry
,
15305 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
15307 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
15310 #endif /* NONAMELESSUNION */
15313 /******************************************************************************
15314 * Object Manager Functions *
15315 ******************************************************************************/
15317 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15318 _IRQL_requires_max_(DISPATCH_LEVEL
)
15322 ObfDereferenceObject(
15323 _In_ PVOID Object
);
15324 #define ObDereferenceObject ObfDereferenceObject
15326 _IRQL_requires_max_(APC_LEVEL
)
15330 ObGetObjectSecurity(
15332 _Out_ PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
15333 _Out_ PBOOLEAN MemoryAllocated
);
15335 _IRQL_requires_max_(DISPATCH_LEVEL
)
15339 ObfReferenceObject(
15340 _In_ PVOID Object
);
15341 #define ObReferenceObject ObfReferenceObject
15343 _IRQL_requires_max_(APC_LEVEL
)
15347 ObReferenceObjectByHandle(
15348 _In_ HANDLE Handle
,
15349 _In_ ACCESS_MASK DesiredAccess
,
15350 _In_opt_ POBJECT_TYPE ObjectType
,
15351 _In_ KPROCESSOR_MODE AccessMode
,
15352 _Out_ PVOID
*Object
,
15353 _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
);
15355 _IRQL_requires_max_(DISPATCH_LEVEL
)
15359 ObReferenceObjectByPointer(
15361 _In_ ACCESS_MASK DesiredAccess
,
15362 _In_opt_ POBJECT_TYPE ObjectType
,
15363 _In_ KPROCESSOR_MODE AccessMode
);
15365 _IRQL_requires_max_(APC_LEVEL
)
15369 ObReleaseObjectSecurity(
15370 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
15371 _In_ BOOLEAN MemoryAllocated
);
15372 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15374 #if (NTDDI_VERSION >= NTDDI_VISTA)
15378 ObDereferenceObjectDeferDelete(
15379 _In_ PVOID Object
);
15382 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
15386 ObRegisterCallbacks(
15387 _In_ POB_CALLBACK_REGISTRATION CallbackRegistration
,
15388 _Outptr_ PVOID
*RegistrationHandle
);
15393 ObUnRegisterCallbacks(
15394 _In_ PVOID RegistrationHandle
);
15399 ObGetFilterVersion(VOID
);
15401 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
15403 #if (NTDDI_VERSION >= NTDDI_WIN7)
15404 _IRQL_requires_max_(APC_LEVEL
)
15408 ObReferenceObjectByHandleWithTag(
15409 _In_ HANDLE Handle
,
15410 _In_ ACCESS_MASK DesiredAccess
,
15411 _In_opt_ POBJECT_TYPE ObjectType
,
15412 _In_ KPROCESSOR_MODE AccessMode
,
15414 _Out_ PVOID
*Object
,
15415 _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
);
15417 _IRQL_requires_max_(DISPATCH_LEVEL
)
15421 ObfReferenceObjectWithTag(
15425 _IRQL_requires_max_(DISPATCH_LEVEL
)
15429 ObReferenceObjectByPointerWithTag(
15431 _In_ ACCESS_MASK DesiredAccess
,
15432 _In_opt_ POBJECT_TYPE ObjectType
,
15433 _In_ KPROCESSOR_MODE AccessMode
,
15436 _IRQL_requires_max_(DISPATCH_LEVEL
)
15440 ObfDereferenceObjectWithTag(
15447 ObDereferenceObjectDeferDeleteWithTag(
15451 #define ObDereferenceObject ObfDereferenceObject
15452 #define ObReferenceObject ObfReferenceObject
15453 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
15454 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
15455 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
15457 /******************************************************************************
15458 * Process Manager Functions *
15459 ******************************************************************************/
15464 PsWrapApcWow64Thread(
15465 _Inout_ PVOID
*ApcContext
,
15466 _Inout_ PVOID
*ApcRoutine
);
15470 * PsGetCurrentProcess(VOID)
15472 #define PsGetCurrentProcess IoGetCurrentProcess
15474 #if !defined(_PSGETCURRENTTHREAD_)
15475 #define _PSGETCURRENTTHREAD_
15476 _IRQL_requires_max_(DISPATCH_LEVEL
)
15480 PsGetCurrentThread(VOID
)
15482 return (PETHREAD
)KeGetCurrentThread();
15484 #endif /* !_PSGETCURRENTTHREAD_ */
15487 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15489 _IRQL_requires_max_(APC_LEVEL
)
15490 _Post_satisfies_(return <= 0)
15491 _Must_inspect_result_
15495 PsCreateSystemThread(
15496 _Out_ PHANDLE ThreadHandle
,
15497 _In_ ULONG DesiredAccess
,
15498 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
15499 _In_opt_ HANDLE ProcessHandle
,
15500 _Out_opt_ PCLIENT_ID ClientId
,
15501 _In_ PKSTART_ROUTINE StartRoutine
,
15502 _In_opt_
_When_(return==0, __drv_aliasesMem
) PVOID StartContext
);
15504 _IRQL_requires_max_(PASSIVE_LEVEL
)
15508 PsTerminateSystemThread(
15509 _In_ NTSTATUS ExitStatus
);
15511 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15514 /******************************************************************************
15515 * WMI Library Support Functions *
15516 ******************************************************************************/
15519 #if (NTDDI_VERSION >= NTDDI_WINXP)
15520 _IRQL_requires_max_(HIGH_LEVEL
)
15525 _In_ TRACEHANDLE LoggerHandle
,
15526 _In_ ULONG MessageFlags
,
15527 _In_ LPGUID MessageGuid
,
15528 _In_ USHORT MessageNumber
,
15531 #endif /* RUN_WPP */
15533 #if (NTDDI_VERSION >= NTDDI_WINXP)
15535 _IRQL_requires_max_(APC_LEVEL
)
15539 WmiQueryTraceInformation(
15540 _In_ TRACE_INFORMATION_CLASS TraceInformationClass
,
15541 _Out_writes_bytes_(TraceInformationLength
) PVOID TraceInformation
,
15542 _In_ ULONG TraceInformationLength
,
15543 _Out_opt_ PULONG RequiredLength
,
15544 _In_opt_ PVOID Buffer
);
15547 /* FIXME: Get va_list from where? */
15548 _IRQL_requires_max_(HIGH_LEVEL
)
15553 _In_ TRACEHANDLE LoggerHandle
,
15554 _In_ ULONG MessageFlags
,
15555 _In_ LPGUID MessageGuid
,
15556 _In_ USHORT MessageNumber
,
15557 _In_
va_list MessageArgList
);
15560 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15562 #ifndef TRACE_INFORMATION_CLASS_DEFINE
15564 #if (NTDDI_VERSION >= NTDDI_WINXP)
15565 _IRQL_requires_max_(APC_LEVEL
)
15569 WmiQueryTraceInformation(
15570 _In_ TRACE_INFORMATION_CLASS TraceInformationClass
,
15571 _Out_writes_bytes_(TraceInformationLength
) PVOID TraceInformation
,
15572 _In_ ULONG TraceInformationLength
,
15573 _Out_opt_ PULONG RequiredLength
,
15574 _In_opt_ PVOID Buffer
);
15577 #define TRACE_INFORMATION_CLASS_DEFINE
15579 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
15581 #if (NTDDI_VERSION >= NTDDI_VISTA)
15583 _IRQL_requires_max_(PASSIVE_LEVEL
)
15588 _In_ LPCGUID ProviderId
,
15589 _In_opt_ PETWENABLECALLBACK EnableCallback
,
15590 _In_opt_ PVOID CallbackContext
,
15591 _Out_ PREGHANDLE RegHandle
);
15593 _IRQL_requires_max_(PASSIVE_LEVEL
)
15598 _In_ REGHANDLE RegHandle
);
15600 _IRQL_requires_max_(HIGH_LEVEL
)
15605 _In_ REGHANDLE RegHandle
,
15606 _In_ PCEVENT_DESCRIPTOR EventDescriptor
);
15608 _IRQL_requires_max_(HIGH_LEVEL
)
15612 EtwProviderEnabled(
15613 _In_ REGHANDLE RegHandle
,
15615 _In_ ULONGLONG Keyword
);
15617 _When_(ControlCode
==EVENT_ACTIVITY_CTRL_CREATE_ID
, _IRQL_requires_max_(HIGH_LEVEL
))
15618 _When_(ControlCode
!=EVENT_ACTIVITY_CTRL_CREATE_ID
, _IRQL_requires_max_(APC_LEVEL
))
15622 EtwActivityIdControl(
15623 _In_ ULONG ControlCode
,
15624 _Inout_updates_bytes_(sizeof(GUID
)) LPGUID ActivityId
);
15626 _IRQL_requires_max_(HIGH_LEVEL
)
15631 _In_ REGHANDLE RegHandle
,
15632 _In_ PCEVENT_DESCRIPTOR EventDescriptor
,
15633 _In_opt_ LPCGUID ActivityId
,
15634 _In_ ULONG UserDataCount
,
15635 _In_reads_opt_(UserDataCount
) PEVENT_DATA_DESCRIPTOR UserData
);
15637 _IRQL_requires_max_(HIGH_LEVEL
)
15642 _In_ REGHANDLE RegHandle
,
15643 _In_ PCEVENT_DESCRIPTOR EventDescriptor
,
15644 _In_opt_ LPCGUID ActivityId
,
15645 _In_opt_ LPCGUID RelatedActivityId
,
15646 _In_ ULONG UserDataCount
,
15647 _In_reads_opt_(UserDataCount
) PEVENT_DATA_DESCRIPTOR UserData
);
15649 _IRQL_requires_max_(HIGH_LEVEL
)
15654 _In_ REGHANDLE RegHandle
,
15656 _In_ ULONGLONG Keyword
,
15657 _In_opt_ LPCGUID ActivityId
,
15658 _In_ PCWSTR String
);
15660 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15662 #if (NTDDI_VERSION >= NTDDI_WIN7)
15663 _IRQL_requires_max_(HIGH_LEVEL
)
15668 _In_ REGHANDLE RegHandle
,
15669 _In_ PCEVENT_DESCRIPTOR EventDescriptor
,
15670 _In_ ULONG64 Filter
,
15672 _In_opt_ LPCGUID ActivityId
,
15673 _In_opt_ LPCGUID RelatedActivityId
,
15674 _In_ ULONG UserDataCount
,
15675 _In_reads_opt_(UserDataCount
) PEVENT_DATA_DESCRIPTOR UserData
);
15680 /******************************************************************************
15681 * Kernel Debugger Functions *
15682 ******************************************************************************/
15689 _In_z_ _Printf_format_string_ PCSTR Format
,
15692 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15696 DbgPrintReturnControlC(
15697 _In_z_ _Printf_format_string_ PCCH Format
,
15701 #if (NTDDI_VERSION >= NTDDI_WINXP)
15707 _In_ ULONG ComponentId
,
15709 _In_z_ _Printf_format_string_ PCSTR Format
,
15712 #ifdef _VA_LIST_DEFINED
15718 _In_ ULONG ComponentId
,
15720 _In_z_ PCCH Format
,
15726 vDbgPrintExWithPrefix(
15727 _In_z_ PCCH Prefix
,
15728 _In_ ULONG ComponentId
,
15730 _In_z_ PCCH Format
,
15733 #endif /* _VA_LIST_DEFINED */
15738 DbgQueryDebugFilterState(
15739 _In_ ULONG ComponentId
,
15745 DbgSetDebugFilterState(
15746 _In_ ULONG ComponentId
,
15748 _In_ BOOLEAN State
);
15750 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15752 #if (NTDDI_VERSION >= NTDDI_VISTA)
15755 (*PDEBUG_PRINT_CALLBACK
)(
15756 _In_ PSTRING Output
,
15757 _In_ ULONG ComponentId
,
15763 DbgSetDebugPrintCallback(
15764 _In_ PDEBUG_PRINT_CALLBACK DebugPrintCallback
,
15765 _In_ BOOLEAN Enable
);
15767 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15769 #endif /* _DBGNT_ */
15773 #define KdPrint(_x_) DbgPrint _x_
15774 #define KdPrintEx(_x_) DbgPrintEx _x_
15775 #define vKdPrintEx(_x_) vDbgPrintEx _x_
15776 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
15777 #define KdBreakPoint() DbgBreakPoint()
15778 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
15782 #define KdPrint(_x_)
15783 #define KdPrintEx(_x_)
15784 #define vKdPrintEx(_x_)
15785 #define vKdPrintExWithPrefix(_x_)
15786 #define KdBreakPoint()
15787 #define KdBreakPointWithStatus(s)
15792 extern BOOLEAN KdDebuggerEnabled
;
15793 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
15794 extern BOOLEAN KdDebuggerNotPresent
;
15795 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
15797 extern BOOLEAN
*KdDebuggerEnabled
;
15798 __CREATE_NTOS_DATA_IMPORT_ALIAS(KdDebuggerEnabled
)
15799 #define KD_DEBUGGER_ENABLED (*KdDebuggerEnabled)
15800 extern BOOLEAN
*KdDebuggerNotPresent
;
15801 __CREATE_NTOS_DATA_IMPORT_ALIAS(KdDebuggerNotPresent
)
15802 #define KD_DEBUGGER_NOT_PRESENT (*KdDebuggerNotPresent)
15805 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15810 KdDisableDebugger(VOID
);
15815 KdEnableDebugger(VOID
);
15817 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
15818 #define DbgBreakPoint __debugbreak
15820 __analysis_noreturn
15823 DbgBreakPoint(VOID
);
15826 __analysis_noreturn
15830 DbgBreakPointWithStatus(
15831 _In_ ULONG Status
);
15833 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15835 #if (NTDDI_VERSION >= NTDDI_WS03)
15839 KdRefreshDebuggerNotPresent(VOID
);
15842 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
15847 _In_ KD_OPTION Option
,
15848 _In_opt_ ULONG InBufferBytes
,
15849 _In_ PVOID InBuffer
,
15850 _In_opt_ ULONG OutBufferBytes
,
15851 _Out_ PVOID OutBuffer
,
15852 _Out_opt_ PULONG OutBufferNeeded
);
15854 /* Hardware Abstraction Layer Functions */
15856 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15858 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
15860 __drv_preferredFunction("AllocateCommonBuffer","Obsolete")
15864 HalAllocateCommonBuffer(
15865 _In_ PDMA_ADAPTER DmaAdapter
,
15867 _Out_ PPHYSICAL_ADDRESS LogicalAddress
,
15868 _In_ BOOLEAN CacheEnabled
)
15870 PALLOCATE_COMMON_BUFFER allocateCommonBuffer
;
15871 PVOID commonBuffer
;
15873 allocateCommonBuffer
= *(DmaAdapter
)->DmaOperations
->AllocateCommonBuffer
;
15874 ASSERT( allocateCommonBuffer
!= NULL
);
15875 commonBuffer
= allocateCommonBuffer( DmaAdapter
, Length
, LogicalAddress
, CacheEnabled
);
15876 return commonBuffer
;
15879 __drv_preferredFunction("FreeCommonBuffer","Obsolete")
15883 HalFreeCommonBuffer(
15884 _In_ PDMA_ADAPTER DmaAdapter
,
15886 _In_ PHYSICAL_ADDRESS LogicalAddress
,
15887 _In_ PVOID VirtualAddress
,
15888 _In_ BOOLEAN CacheEnabled
)
15890 PFREE_COMMON_BUFFER freeCommonBuffer
;
15892 freeCommonBuffer
= *(DmaAdapter
)->DmaOperations
->FreeCommonBuffer
;
15893 ASSERT( freeCommonBuffer
!= NULL
);
15894 freeCommonBuffer( DmaAdapter
, Length
, LogicalAddress
, VirtualAddress
, CacheEnabled
);
15897 __drv_preferredFunction("ReadDmaCounter","Obsolete")
15902 _In_ PDMA_ADAPTER DmaAdapter
)
15904 PREAD_DMA_COUNTER readDmaCounter
;
15907 readDmaCounter
= *(DmaAdapter
)->DmaOperations
->ReadDmaCounter
;
15908 ASSERT( readDmaCounter
!= NULL
);
15909 counter
= readDmaCounter( DmaAdapter
);
15915 HalGetDmaAlignment(
15916 _In_ PDMA_ADAPTER DmaAdapter
)
15918 PGET_DMA_ALIGNMENT getDmaAlignment
;
15921 getDmaAlignment
= *(DmaAdapter
)->DmaOperations
->GetDmaAlignment
;
15922 ASSERT( getDmaAlignment
!= NULL
);
15923 alignment
= getDmaAlignment( DmaAdapter
);
15927 #endif /* USE_DMA_MACROS ... */
15929 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15934 #include <ktmtypes.h>
15936 #define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001)
15937 #define TRANSACTIONMANAGER_SET_INFORMATION (0x0002)
15938 #define TRANSACTIONMANAGER_RECOVER (0x0004)
15939 #define TRANSACTIONMANAGER_RENAME (0x0008)
15940 #define TRANSACTIONMANAGER_CREATE_RM (0x0010)
15941 #define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020)
15943 #define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
15944 TRANSACTIONMANAGER_QUERY_INFORMATION)
15946 #define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15947 TRANSACTIONMANAGER_SET_INFORMATION |\
15948 TRANSACTIONMANAGER_RECOVER |\
15949 TRANSACTIONMANAGER_RENAME |\
15950 TRANSACTIONMANAGER_CREATE_RM)
15952 #define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
15954 #define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15955 TRANSACTIONMANAGER_GENERIC_READ |\
15956 TRANSACTIONMANAGER_GENERIC_WRITE |\
15957 TRANSACTIONMANAGER_GENERIC_EXECUTE |\
15958 TRANSACTIONMANAGER_BIND_TRANSACTION)
15960 #define TRANSACTION_QUERY_INFORMATION (0x0001)
15961 #define TRANSACTION_SET_INFORMATION (0x0002)
15962 #define TRANSACTION_ENLIST (0x0004)
15963 #define TRANSACTION_COMMIT (0x0008)
15964 #define TRANSACTION_ROLLBACK (0x0010)
15965 #define TRANSACTION_PROPAGATE (0x0020)
15966 #define TRANSACTION_RIGHT_RESERVED1 (0x0040)
15968 #define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
15969 TRANSACTION_QUERY_INFORMATION |\
15972 #define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
15973 TRANSACTION_SET_INFORMATION |\
15974 TRANSACTION_COMMIT |\
15975 TRANSACTION_ENLIST |\
15976 TRANSACTION_ROLLBACK |\
15977 TRANSACTION_PROPAGATE |\
15980 #define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
15981 TRANSACTION_COMMIT |\
15982 TRANSACTION_ROLLBACK |\
15985 #define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
15986 TRANSACTION_GENERIC_READ |\
15987 TRANSACTION_GENERIC_WRITE |\
15988 TRANSACTION_GENERIC_EXECUTE)
15990 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
15991 STANDARD_RIGHTS_WRITE |\
15992 TRANSACTION_SET_INFORMATION |\
15993 TRANSACTION_ENLIST |\
15994 TRANSACTION_ROLLBACK |\
15995 TRANSACTION_PROPAGATE |\
15998 #define RESOURCEMANAGER_QUERY_INFORMATION (0x0001)
15999 #define RESOURCEMANAGER_SET_INFORMATION (0x0002)
16000 #define RESOURCEMANAGER_RECOVER (0x0004)
16001 #define RESOURCEMANAGER_ENLIST (0x0008)
16002 #define RESOURCEMANAGER_GET_NOTIFICATION (0x0010)
16003 #define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020)
16004 #define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040)
16006 #define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
16007 RESOURCEMANAGER_QUERY_INFORMATION |\
16010 #define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
16011 RESOURCEMANAGER_SET_INFORMATION |\
16012 RESOURCEMANAGER_RECOVER |\
16013 RESOURCEMANAGER_ENLIST |\
16014 RESOURCEMANAGER_GET_NOTIFICATION |\
16015 RESOURCEMANAGER_REGISTER_PROTOCOL |\
16016 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
16019 #define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
16020 RESOURCEMANAGER_RECOVER |\
16021 RESOURCEMANAGER_ENLIST |\
16022 RESOURCEMANAGER_GET_NOTIFICATION |\
16023 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
16026 #define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
16027 RESOURCEMANAGER_GENERIC_READ |\
16028 RESOURCEMANAGER_GENERIC_WRITE |\
16029 RESOURCEMANAGER_GENERIC_EXECUTE)
16031 #define ENLISTMENT_QUERY_INFORMATION (0x0001)
16032 #define ENLISTMENT_SET_INFORMATION (0x0002)
16033 #define ENLISTMENT_RECOVER (0x0004)
16034 #define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008)
16035 #define ENLISTMENT_SUPERIOR_RIGHTS (0x0010)
16037 #define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
16038 ENLISTMENT_QUERY_INFORMATION)
16040 #define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
16041 ENLISTMENT_SET_INFORMATION |\
16042 ENLISTMENT_RECOVER |\
16043 ENLISTMENT_SUBORDINATE_RIGHTS |\
16044 ENLISTMENT_SUPERIOR_RIGHTS)
16046 #define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
16047 ENLISTMENT_RECOVER |\
16048 ENLISTMENT_SUBORDINATE_RIGHTS |\
16049 ENLISTMENT_SUPERIOR_RIGHTS)
16051 #define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
16052 ENLISTMENT_GENERIC_READ |\
16053 ENLISTMENT_GENERIC_WRITE |\
16054 ENLISTMENT_GENERIC_EXECUTE)
16056 typedef enum _TRANSACTION_OUTCOME
{
16057 TransactionOutcomeUndetermined
= 1,
16058 TransactionOutcomeCommitted
,
16059 TransactionOutcomeAborted
,
16060 } TRANSACTION_OUTCOME
;
16063 typedef enum _TRANSACTION_STATE
{
16064 TransactionStateNormal
= 1,
16065 TransactionStateIndoubt
,
16066 TransactionStateCommittedNotify
,
16067 } TRANSACTION_STATE
;
16070 typedef struct _TRANSACTION_BASIC_INFORMATION
{
16071 GUID TransactionId
;
16074 } TRANSACTION_BASIC_INFORMATION
, *PTRANSACTION_BASIC_INFORMATION
;
16076 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION
{
16078 LARGE_INTEGER VirtualClock
;
16079 } TRANSACTIONMANAGER_BASIC_INFORMATION
, *PTRANSACTIONMANAGER_BASIC_INFORMATION
;
16081 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION
{
16083 } TRANSACTIONMANAGER_LOG_INFORMATION
, *PTRANSACTIONMANAGER_LOG_INFORMATION
;
16085 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION
{
16086 ULONG LogPathLength
;
16087 _Field_size_(LogPathLength
) WCHAR LogPath
[1];
16088 } TRANSACTIONMANAGER_LOGPATH_INFORMATION
, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION
;
16090 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION
{
16091 ULONGLONG LastRecoveredLsn
;
16092 } TRANSACTIONMANAGER_RECOVERY_INFORMATION
, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION
;
16095 typedef struct _TRANSACTION_PROPERTIES_INFORMATION
{
16096 ULONG IsolationLevel
;
16097 ULONG IsolationFlags
;
16098 LARGE_INTEGER Timeout
;
16100 ULONG DescriptionLength
;
16101 WCHAR Description
[1];
16102 } TRANSACTION_PROPERTIES_INFORMATION
, *PTRANSACTION_PROPERTIES_INFORMATION
;
16104 typedef struct _TRANSACTION_BIND_INFORMATION
{
16106 } TRANSACTION_BIND_INFORMATION
, *PTRANSACTION_BIND_INFORMATION
;
16108 typedef struct _TRANSACTION_ENLISTMENT_PAIR
{
16110 GUID ResourceManagerId
;
16111 } TRANSACTION_ENLISTMENT_PAIR
, *PTRANSACTION_ENLISTMENT_PAIR
;
16113 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION
{
16114 ULONG NumberOfEnlistments
;
16115 TRANSACTION_ENLISTMENT_PAIR EnlistmentPair
[1];
16116 } TRANSACTION_ENLISTMENTS_INFORMATION
, *PTRANSACTION_ENLISTMENTS_INFORMATION
;
16118 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION
{
16119 TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair
;
16120 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION
, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION
;
16122 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION
{
16123 GUID ResourceManagerId
;
16124 ULONG DescriptionLength
;
16125 WCHAR Description
[1];
16126 } RESOURCEMANAGER_BASIC_INFORMATION
, *PRESOURCEMANAGER_BASIC_INFORMATION
;
16128 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION
{
16129 HANDLE IoCompletionPortHandle
;
16130 ULONG_PTR CompletionKey
;
16131 } RESOURCEMANAGER_COMPLETION_INFORMATION
, *PRESOURCEMANAGER_COMPLETION_INFORMATION
;
16133 typedef enum _KTMOBJECT_TYPE
{
16134 KTMOBJECT_TRANSACTION
,
16135 KTMOBJECT_TRANSACTION_MANAGER
,
16136 KTMOBJECT_RESOURCE_MANAGER
,
16137 KTMOBJECT_ENLISTMENT
,
16139 } KTMOBJECT_TYPE
, *PKTMOBJECT_TYPE
;
16141 typedef struct _KTMOBJECT_CURSOR
{
16143 unsigned long ObjectIdCount
;
16145 } KTMOBJECT_CURSOR
, *PKTMOBJECT_CURSOR
;
16147 typedef enum _TRANSACTION_INFORMATION_CLASS
{
16148 TransactionBasicInformation
,
16149 TransactionPropertiesInformation
,
16150 TransactionEnlistmentInformation
,
16151 TransactionSuperiorEnlistmentInformation
,
16152 } TRANSACTION_INFORMATION_CLASS
;
16154 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS
{
16155 TransactionManagerBasicInformation
,
16156 TransactionManagerLogInformation
,
16157 TransactionManagerLogPathInformation
,
16158 TransactionManagerRecoveryInformation
= 4,
16159 } TRANSACTIONMANAGER_INFORMATION_CLASS
;
16161 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS
{
16162 ResourceManagerBasicInformation
,
16163 ResourceManagerCompletionInformation
,
16164 } RESOURCEMANAGER_INFORMATION_CLASS
;
16166 typedef struct _ENLISTMENT_BASIC_INFORMATION
{
16168 GUID TransactionId
;
16169 GUID ResourceManagerId
;
16170 } ENLISTMENT_BASIC_INFORMATION
, *PENLISTMENT_BASIC_INFORMATION
;
16172 typedef struct _ENLISTMENT_CRM_INFORMATION
{
16173 GUID CrmTransactionManagerId
;
16174 GUID CrmResourceManagerId
;
16175 GUID CrmEnlistmentId
;
16176 } ENLISTMENT_CRM_INFORMATION
, *PENLISTMENT_CRM_INFORMATION
;
16178 typedef enum _ENLISTMENT_INFORMATION_CLASS
{
16179 EnlistmentBasicInformation
,
16180 EnlistmentRecoveryInformation
,
16181 EnlistmentCrmInformation
16182 } ENLISTMENT_INFORMATION_CLASS
;
16184 typedef struct _TRANSACTION_LIST_ENTRY
{
16185 #if defined(__cplusplus)
16190 } TRANSACTION_LIST_ENTRY
, *PTRANSACTION_LIST_ENTRY
;
16192 typedef struct _TRANSACTION_LIST_INFORMATION
{
16193 ULONG NumberOfTransactions
;
16194 TRANSACTION_LIST_ENTRY TransactionInformation
[1];
16195 } TRANSACTION_LIST_INFORMATION
, *PTRANSACTION_LIST_INFORMATION
;
16198 (NTAPI
*PFN_NT_CREATE_TRANSACTION
)(
16199 _Out_ PHANDLE TransactionHandle
,
16200 _In_ ACCESS_MASK DesiredAccess
,
16201 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16202 _In_opt_ LPGUID Uow
,
16203 _In_opt_ HANDLE TmHandle
,
16204 _In_opt_ ULONG CreateOptions
,
16205 _In_opt_ ULONG IsolationLevel
,
16206 _In_opt_ ULONG IsolationFlags
,
16207 _In_opt_ PLARGE_INTEGER Timeout
,
16208 _In_opt_ PUNICODE_STRING Description
);
16211 (NTAPI
*PFN_NT_OPEN_TRANSACTION
)(
16212 _Out_ PHANDLE TransactionHandle
,
16213 _In_ ACCESS_MASK DesiredAccess
,
16214 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16215 _In_opt_ LPGUID Uow
,
16216 _In_opt_ HANDLE TmHandle
);
16219 (NTAPI
*PFN_NT_QUERY_INFORMATION_TRANSACTION
)(
16220 _In_ HANDLE TransactionHandle
,
16221 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16222 _Out_writes_bytes_(TransactionInformationLength
) PVOID TransactionInformation
,
16223 _In_ ULONG TransactionInformationLength
,
16224 _Out_opt_ PULONG ReturnLength
);
16227 (NTAPI
*PFN_NT_SET_INFORMATION_TRANSACTION
)(
16228 _In_ HANDLE TransactionHandle
,
16229 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16230 _In_ PVOID TransactionInformation
,
16231 _In_ ULONG TransactionInformationLength
);
16234 (NTAPI
*PFN_NT_COMMIT_TRANSACTION
)(
16235 _In_ HANDLE TransactionHandle
,
16236 _In_ BOOLEAN Wait
);
16239 (NTAPI
*PFN_NT_ROLLBACK_TRANSACTION
)(
16240 _In_ HANDLE TransactionHandle
,
16241 _In_ BOOLEAN Wait
);
16243 #if (NTDDI_VERSION >= NTDDI_VISTA)
16245 _Must_inspect_result_
16246 _IRQL_requires_max_ (APC_LEVEL
)
16251 NtCreateTransactionManager(
16252 _Out_ PHANDLE TmHandle
,
16253 _In_ ACCESS_MASK DesiredAccess
,
16254 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16255 _In_opt_ PUNICODE_STRING LogFileName
,
16256 _In_opt_ ULONG CreateOptions
,
16257 _In_opt_ ULONG CommitStrength
);
16259 _Must_inspect_result_
16260 _IRQL_requires_max_ (APC_LEVEL
)
16265 NtOpenTransactionManager(
16266 _Out_ PHANDLE TmHandle
,
16267 _In_ ACCESS_MASK DesiredAccess
,
16268 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16269 _In_opt_ PUNICODE_STRING LogFileName
,
16270 _In_opt_ LPGUID TmIdentity
,
16271 _In_opt_ ULONG OpenOptions
);
16273 _Must_inspect_result_
16274 _IRQL_requires_max_ (APC_LEVEL
)
16279 NtRenameTransactionManager(
16280 _In_ PUNICODE_STRING LogFileName
,
16281 _In_ LPGUID ExistingTransactionManagerGuid
);
16283 _Must_inspect_result_
16284 _IRQL_requires_max_ (APC_LEVEL
)
16289 NtRollforwardTransactionManager(
16290 _In_ HANDLE TransactionManagerHandle
,
16291 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16293 _Must_inspect_result_
16294 _IRQL_requires_max_ (APC_LEVEL
)
16299 NtRecoverTransactionManager(
16300 _In_ HANDLE TransactionManagerHandle
);
16302 _Must_inspect_result_
16303 _IRQL_requires_max_ (APC_LEVEL
)
16308 NtQueryInformationTransactionManager(
16309 _In_ HANDLE TransactionManagerHandle
,
16310 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
16311 _Out_writes_bytes_(TransactionManagerInformationLength
) PVOID TransactionManagerInformation
,
16312 _In_ ULONG TransactionManagerInformationLength
,
16313 _Out_ PULONG ReturnLength
);
16315 _Must_inspect_result_
16316 _IRQL_requires_max_ (APC_LEVEL
)
16321 NtSetInformationTransactionManager(
16322 _In_opt_ HANDLE TmHandle
,
16323 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
16324 _In_reads_bytes_(TransactionManagerInformationLength
) PVOID TransactionManagerInformation
,
16325 _In_ ULONG TransactionManagerInformationLength
);
16327 _Must_inspect_result_
16328 _IRQL_requires_max_ (APC_LEVEL
)
16333 NtEnumerateTransactionObject(
16334 _In_opt_ HANDLE RootObjectHandle
,
16335 _In_ KTMOBJECT_TYPE QueryType
,
16336 _Inout_updates_bytes_(ObjectCursorLength
) PKTMOBJECT_CURSOR ObjectCursor
,
16337 _In_ ULONG ObjectCursorLength
,
16338 _Out_ PULONG ReturnLength
);
16340 _Must_inspect_result_
16341 _IRQL_requires_max_ (APC_LEVEL
)
16346 NtCreateTransaction(
16347 _Out_ PHANDLE TransactionHandle
,
16348 _In_ ACCESS_MASK DesiredAccess
,
16349 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16350 _In_opt_ LPGUID Uow
,
16351 _In_opt_ HANDLE TmHandle
,
16352 _In_opt_ ULONG CreateOptions
,
16353 _In_opt_ ULONG IsolationLevel
,
16354 _In_opt_ ULONG IsolationFlags
,
16355 _In_opt_ PLARGE_INTEGER Timeout
,
16356 _In_opt_ PUNICODE_STRING Description
);
16358 _Must_inspect_result_
16359 _IRQL_requires_max_ (APC_LEVEL
)
16365 _Out_ PHANDLE TransactionHandle
,
16366 _In_ ACCESS_MASK DesiredAccess
,
16367 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16369 _In_opt_ HANDLE TmHandle
);
16371 _Must_inspect_result_
16372 _IRQL_requires_max_ (APC_LEVEL
)
16377 NtQueryInformationTransaction(
16378 _In_ HANDLE TransactionHandle
,
16379 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16380 _Out_writes_bytes_(TransactionInformationLength
) PVOID TransactionInformation
,
16381 _In_ ULONG TransactionInformationLength
,
16382 _Out_opt_ PULONG ReturnLength
);
16384 _Must_inspect_result_
16385 _IRQL_requires_max_ (APC_LEVEL
)
16390 NtSetInformationTransaction(
16391 _In_ HANDLE TransactionHandle
,
16392 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
16393 _In_reads_bytes_(TransactionInformationLength
) PVOID TransactionInformation
,
16394 _In_ ULONG TransactionInformationLength
);
16396 _IRQL_requires_max_ (APC_LEVEL
)
16401 NtCommitTransaction(
16402 _In_ HANDLE TransactionHandle
,
16403 _In_ BOOLEAN Wait
);
16405 _IRQL_requires_max_ (APC_LEVEL
)
16410 NtRollbackTransaction(
16411 _In_ HANDLE TransactionHandle
,
16412 _In_ BOOLEAN Wait
);
16414 _Must_inspect_result_
16415 _IRQL_requires_max_ (APC_LEVEL
)
16420 NtCreateEnlistment(
16421 _Out_ PHANDLE EnlistmentHandle
,
16422 _In_ ACCESS_MASK DesiredAccess
,
16423 _In_ HANDLE ResourceManagerHandle
,
16424 _In_ HANDLE TransactionHandle
,
16425 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16426 _In_opt_ ULONG CreateOptions
,
16427 _In_ NOTIFICATION_MASK NotificationMask
,
16428 _In_opt_ PVOID EnlistmentKey
);
16430 _Must_inspect_result_
16431 _IRQL_requires_max_ (APC_LEVEL
)
16437 _Out_ PHANDLE EnlistmentHandle
,
16438 _In_ ACCESS_MASK DesiredAccess
,
16439 _In_ HANDLE ResourceManagerHandle
,
16440 _In_ LPGUID EnlistmentGuid
,
16441 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
);
16443 _Must_inspect_result_
16444 _IRQL_requires_max_ (APC_LEVEL
)
16449 NtQueryInformationEnlistment(
16450 _In_ HANDLE EnlistmentHandle
,
16451 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
16452 _Out_writes_bytes_(EnlistmentInformationLength
) PVOID EnlistmentInformation
,
16453 _In_ ULONG EnlistmentInformationLength
,
16454 _Out_ PULONG ReturnLength
);
16456 _Must_inspect_result_
16457 _IRQL_requires_max_ (APC_LEVEL
)
16462 NtSetInformationEnlistment(
16463 _In_opt_ HANDLE EnlistmentHandle
,
16464 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
16465 _In_reads_bytes_(EnlistmentInformationLength
) PVOID EnlistmentInformation
,
16466 _In_ ULONG EnlistmentInformationLength
);
16468 _Must_inspect_result_
16469 _IRQL_requires_max_ (APC_LEVEL
)
16474 NtRecoverEnlistment(
16475 _In_ HANDLE EnlistmentHandle
,
16476 _In_opt_ PVOID EnlistmentKey
);
16478 _Must_inspect_result_
16479 _IRQL_requires_max_ (APC_LEVEL
)
16484 NtPrePrepareEnlistment(
16485 _In_ HANDLE EnlistmentHandle
,
16486 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16488 _Must_inspect_result_
16489 _IRQL_requires_max_ (APC_LEVEL
)
16494 NtPrepareEnlistment(
16495 _In_ HANDLE EnlistmentHandle
,
16496 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16498 _Must_inspect_result_
16499 _IRQL_requires_max_ (APC_LEVEL
)
16504 NtCommitEnlistment(
16505 _In_ HANDLE EnlistmentHandle
,
16506 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16508 _IRQL_requires_max_ (APC_LEVEL
)
16513 NtRollbackEnlistment(
16514 _In_ HANDLE EnlistmentHandle
,
16515 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16517 _IRQL_requires_max_ (APC_LEVEL
)
16522 NtPrePrepareComplete(
16523 _In_ HANDLE EnlistmentHandle
,
16524 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16526 _IRQL_requires_max_ (APC_LEVEL
)
16532 _In_ HANDLE EnlistmentHandle
,
16533 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16535 _IRQL_requires_max_ (APC_LEVEL
)
16541 _In_ HANDLE EnlistmentHandle
,
16542 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16544 _IRQL_requires_max_ (APC_LEVEL
)
16549 NtReadOnlyEnlistment(
16550 _In_ HANDLE EnlistmentHandle
,
16551 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16553 _IRQL_requires_max_ (APC_LEVEL
)
16558 NtRollbackComplete(
16559 _In_ HANDLE EnlistmentHandle
,
16560 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16562 _IRQL_requires_max_ (APC_LEVEL
)
16567 NtSinglePhaseReject(
16568 _In_ HANDLE EnlistmentHandle
,
16569 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
16571 _Must_inspect_result_
16572 _IRQL_requires_max_ (APC_LEVEL
)
16577 NtCreateResourceManager(
16578 _Out_ PHANDLE ResourceManagerHandle
,
16579 _In_ ACCESS_MASK DesiredAccess
,
16580 _In_ HANDLE TmHandle
,
16581 _In_ LPGUID RmGuid
,
16582 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16583 _In_opt_ ULONG CreateOptions
,
16584 _In_opt_ PUNICODE_STRING Description
);
16586 _Must_inspect_result_
16587 _IRQL_requires_max_ (APC_LEVEL
)
16592 NtOpenResourceManager(
16593 _Out_ PHANDLE ResourceManagerHandle
,
16594 _In_ ACCESS_MASK DesiredAccess
,
16595 _In_ HANDLE TmHandle
,
16596 _In_opt_ LPGUID ResourceManagerGuid
,
16597 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
);
16599 _Must_inspect_result_
16600 _IRQL_requires_max_ (APC_LEVEL
)
16605 NtRecoverResourceManager(
16606 _In_ HANDLE ResourceManagerHandle
);
16608 _Must_inspect_result_
16609 _IRQL_requires_max_ (APC_LEVEL
)
16614 NtGetNotificationResourceManager(
16615 _In_ HANDLE ResourceManagerHandle
,
16616 _Out_ PTRANSACTION_NOTIFICATION TransactionNotification
,
16617 _In_ ULONG NotificationLength
,
16618 _In_opt_ PLARGE_INTEGER Timeout
,
16619 _Out_opt_ PULONG ReturnLength
,
16620 _In_ ULONG Asynchronous
,
16621 _In_opt_ ULONG_PTR AsynchronousContext
);
16623 _Must_inspect_result_
16624 _IRQL_requires_max_ (APC_LEVEL
)
16629 NtQueryInformationResourceManager(
16630 _In_ HANDLE ResourceManagerHandle
,
16631 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
16632 _Out_writes_bytes_(ResourceManagerInformationLength
) PVOID ResourceManagerInformation
,
16633 _In_ ULONG ResourceManagerInformationLength
,
16634 _Out_opt_ PULONG ReturnLength
);
16636 _Must_inspect_result_
16637 _IRQL_requires_max_ (APC_LEVEL
)
16642 NtSetInformationResourceManager(
16643 _In_ HANDLE ResourceManagerHandle
,
16644 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
16645 _In_reads_bytes_(ResourceManagerInformationLength
) PVOID ResourceManagerInformation
,
16646 _In_ ULONG ResourceManagerInformationLength
);
16648 _Must_inspect_result_
16649 _IRQL_requires_max_ (APC_LEVEL
)
16654 NtRegisterProtocolAddressInformation(
16655 _In_ HANDLE ResourceManager
,
16656 _In_ PCRM_PROTOCOL_ID ProtocolId
,
16657 _In_ ULONG ProtocolInformationSize
,
16658 _In_ PVOID ProtocolInformation
,
16659 _In_opt_ ULONG CreateOptions
);
16661 _IRQL_requires_max_ (APC_LEVEL
)
16666 NtPropagationComplete(
16667 _In_ HANDLE ResourceManagerHandle
,
16668 _In_ ULONG RequestCookie
,
16669 _In_ ULONG BufferLength
,
16670 _In_ PVOID Buffer
);
16672 _IRQL_requires_max_ (APC_LEVEL
)
16677 NtPropagationFailed(
16678 _In_ HANDLE ResourceManagerHandle
,
16679 _In_ ULONG RequestCookie
,
16680 _In_ NTSTATUS PropStatus
);
16682 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
16684 #endif /* !_NTTMAPI_ */
16685 /******************************************************************************
16686 * ZwXxx Functions *
16687 ******************************************************************************/
16691 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
16692 #define ZwCurrentProcess() NtCurrentProcess()
16693 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
16694 #define ZwCurrentThread() NtCurrentThread()
16697 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16699 _IRQL_requires_max_(PASSIVE_LEVEL
)
16704 _In_ HANDLE Handle
);
16706 _IRQL_requires_max_(PASSIVE_LEVEL
)
16710 ZwCreateDirectoryObject(
16711 _Out_ PHANDLE DirectoryHandle
,
16712 _In_ ACCESS_MASK DesiredAccess
,
16713 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16715 _IRQL_requires_max_(PASSIVE_LEVEL
)
16720 _Out_ PHANDLE FileHandle
,
16721 _In_ ACCESS_MASK DesiredAccess
,
16722 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16723 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16724 _In_opt_ PLARGE_INTEGER AllocationSize
,
16725 _In_ ULONG FileAttributes
,
16726 _In_ ULONG ShareAccess
,
16727 _In_ ULONG CreateDisposition
,
16728 _In_ ULONG CreateOptions
,
16729 _In_reads_bytes_opt_(EaLength
) PVOID EaBuffer
,
16730 _In_ ULONG EaLength
16733 _IRQL_requires_max_(PASSIVE_LEVEL
)
16738 _Out_ PHANDLE KeyHandle
,
16739 _In_ ACCESS_MASK DesiredAccess
,
16740 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16741 _Reserved_ ULONG TitleIndex
,
16742 _In_opt_ PUNICODE_STRING Class
,
16743 _In_ ULONG CreateOptions
,
16744 _Out_opt_ PULONG Disposition
);
16746 _IRQL_requires_max_(APC_LEVEL
)
16751 _Out_ PHANDLE SectionHandle
,
16752 _In_ ACCESS_MASK DesiredAccess
,
16753 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
16754 _In_opt_ PLARGE_INTEGER MaximumSize
,
16755 _In_ ULONG SectionPageProtection
,
16756 _In_ ULONG AllocationAttributes
,
16757 _In_opt_ HANDLE FileHandle
);
16759 _IRQL_requires_max_(PASSIVE_LEVEL
)
16764 _In_ HANDLE KeyHandle
);
16766 _IRQL_requires_max_(PASSIVE_LEVEL
)
16771 _In_ HANDLE KeyHandle
,
16772 _In_ PUNICODE_STRING ValueName
);
16774 _IRQL_requires_max_(PASSIVE_LEVEL
)
16775 _When_(Length
== 0, _Post_satisfies_(return < 0))
16776 _When_(Length
> 0, _Post_satisfies_(return <= 0))
16781 _In_ HANDLE KeyHandle
,
16783 _In_ KEY_INFORMATION_CLASS KeyInformationClass
,
16784 _Out_writes_bytes_opt_(Length
) PVOID KeyInformation
,
16786 _Out_ PULONG ResultLength
);
16788 _IRQL_requires_max_(PASSIVE_LEVEL
)
16789 _When_(Length
== 0, _Post_satisfies_(return < 0))
16790 _When_(Length
> 0, _Post_satisfies_(return <= 0))
16794 ZwEnumerateValueKey(
16795 _In_ HANDLE KeyHandle
,
16797 _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
16798 _Out_writes_bytes_opt_(Length
) PVOID KeyValueInformation
,
16800 _Out_ PULONG ResultLength
);
16802 _IRQL_requires_max_(PASSIVE_LEVEL
)
16807 _In_ HANDLE KeyHandle
);
16809 _IRQL_requires_max_(PASSIVE_LEVEL
)
16814 _In_ PUNICODE_STRING DriverServiceName
);
16816 _IRQL_requires_max_(PASSIVE_LEVEL
)
16820 ZwMakeTemporaryObject(
16821 _In_ HANDLE Handle
);
16823 _IRQL_requires_max_(PASSIVE_LEVEL
)
16827 ZwMapViewOfSection(
16828 _In_ HANDLE SectionHandle
,
16829 _In_ HANDLE ProcessHandle
,
16830 _Outptr_result_bytebuffer_(*ViewSize
) PVOID
*BaseAddress
,
16831 _In_ ULONG_PTR ZeroBits
,
16832 _In_ SIZE_T CommitSize
,
16833 _Inout_opt_ PLARGE_INTEGER SectionOffset
,
16834 _Inout_ PSIZE_T ViewSize
,
16835 _In_ SECTION_INHERIT InheritDisposition
,
16836 _In_ ULONG AllocationType
,
16837 _In_ ULONG Protect
);
16839 _IRQL_requires_max_(PASSIVE_LEVEL
)
16844 _Out_ PHANDLE FileHandle
,
16845 _In_ ACCESS_MASK DesiredAccess
,
16846 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16847 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16848 _In_ ULONG ShareAccess
,
16849 _In_ ULONG OpenOptions
);
16851 _IRQL_requires_max_(PASSIVE_LEVEL
)
16856 _Out_ PHANDLE KeyHandle
,
16857 _In_ ACCESS_MASK DesiredAccess
,
16858 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16860 _IRQL_requires_max_(PASSIVE_LEVEL
)
16865 _Out_ PHANDLE SectionHandle
,
16866 _In_ ACCESS_MASK DesiredAccess
,
16867 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16869 _IRQL_requires_max_(PASSIVE_LEVEL
)
16873 ZwOpenSymbolicLinkObject(
16874 _Out_ PHANDLE LinkHandle
,
16875 _In_ ACCESS_MASK DesiredAccess
,
16876 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
16878 _IRQL_requires_max_(PASSIVE_LEVEL
)
16882 ZwQueryInformationFile(
16883 _In_ HANDLE FileHandle
,
16884 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16885 _Out_writes_bytes_(Length
) PVOID FileInformation
,
16887 _In_ FILE_INFORMATION_CLASS FileInformationClass
);
16889 _IRQL_requires_max_(PASSIVE_LEVEL
)
16890 _When_(Length
== 0, _Post_satisfies_(return < 0))
16891 _When_(Length
> 0, _Post_satisfies_(return <= 0))
16896 _In_ HANDLE KeyHandle
,
16897 _In_ KEY_INFORMATION_CLASS KeyInformationClass
,
16898 _Out_writes_bytes_opt_(Length
) PVOID KeyInformation
,
16900 _Out_ PULONG ResultLength
);
16902 _IRQL_requires_max_(PASSIVE_LEVEL
)
16906 ZwQuerySymbolicLinkObject(
16907 _In_ HANDLE LinkHandle
,
16908 _Inout_ PUNICODE_STRING LinkTarget
,
16909 _Out_opt_ PULONG ReturnedLength
);
16911 _IRQL_requires_max_(PASSIVE_LEVEL
)
16912 _When_(Length
== 0, _Post_satisfies_(return < 0))
16913 _When_(Length
> 0, _Post_satisfies_(return <= 0))
16918 _In_ HANDLE KeyHandle
,
16919 _In_ PUNICODE_STRING ValueName
,
16920 _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
16921 _Out_writes_bytes_opt_(Length
) PVOID KeyValueInformation
,
16923 _Out_ PULONG ResultLength
);
16925 _IRQL_requires_max_(PASSIVE_LEVEL
)
16930 _In_ HANDLE FileHandle
,
16931 _In_opt_ HANDLE Event
,
16932 _In_opt_ PIO_APC_ROUTINE ApcRoutine
,
16933 _In_opt_ PVOID ApcContext
,
16934 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16935 _Out_writes_bytes_(Length
) PVOID Buffer
,
16937 _In_opt_ PLARGE_INTEGER ByteOffset
,
16938 _In_opt_ PULONG Key
);
16940 _IRQL_requires_max_(PASSIVE_LEVEL
)
16944 ZwSetInformationFile(
16945 _In_ HANDLE FileHandle
,
16946 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16947 _In_reads_bytes_(Length
) PVOID FileInformation
,
16949 _In_ FILE_INFORMATION_CLASS FileInformationClass
);
16951 _IRQL_requires_max_(PASSIVE_LEVEL
)
16956 _In_ HANDLE KeyHandle
,
16957 _In_ PUNICODE_STRING ValueName
,
16958 _In_opt_ ULONG TitleIndex
,
16960 _In_reads_bytes_opt_(DataSize
) PVOID Data
,
16961 _In_ ULONG DataSize
);
16963 _IRQL_requires_max_(PASSIVE_LEVEL
)
16968 _In_ PUNICODE_STRING DriverServiceName
);
16970 _IRQL_requires_max_(PASSIVE_LEVEL
)
16974 ZwUnmapViewOfSection(
16975 _In_ HANDLE ProcessHandle
,
16976 _In_opt_ PVOID BaseAddress
);
16978 _IRQL_requires_max_(PASSIVE_LEVEL
)
16983 _In_ HANDLE FileHandle
,
16984 _In_opt_ HANDLE Event
,
16985 _In_opt_ PIO_APC_ROUTINE ApcRoutine
,
16986 _In_opt_ PVOID ApcContext
,
16987 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
16988 _In_reads_bytes_(Length
) PVOID Buffer
,
16990 _In_opt_ PLARGE_INTEGER ByteOffset
,
16991 _In_opt_ PULONG Key
);
16993 _IRQL_requires_max_(PASSIVE_LEVEL
)
16997 ZwQueryFullAttributesFile(
16998 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
16999 _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation
);
17001 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
17004 #if (NTDDI_VERSION >= NTDDI_WS03)
17005 _IRQL_requires_max_(PASSIVE_LEVEL
)
17010 _Out_ PHANDLE EventHandle
,
17011 _In_ ACCESS_MASK DesiredAccess
,
17012 _In_ POBJECT_ATTRIBUTES ObjectAttributes
);
17015 #if (NTDDI_VERSION >= NTDDI_VISTA)
17017 _IRQL_requires_max_(PASSIVE_LEVEL
)
17020 ZwCreateKeyTransacted(
17021 _Out_ PHANDLE KeyHandle
,
17022 _In_ ACCESS_MASK DesiredAccess
,
17023 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
17024 _Reserved_ ULONG TitleIndex
,
17025 _In_opt_ PUNICODE_STRING Class
,
17026 _In_ ULONG CreateOptions
,
17027 _In_ HANDLE TransactionHandle
,
17028 _Out_opt_ PULONG Disposition
);
17030 _IRQL_requires_max_(PASSIVE_LEVEL
)
17034 ZwOpenKeyTransacted(
17035 _Out_ PHANDLE KeyHandle
,
17036 _In_ ACCESS_MASK DesiredAccess
,
17037 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
17038 _In_ HANDLE TransactionHandle
);
17040 _IRQL_requires_max_(PASSIVE_LEVEL
)
17044 ZwCreateTransactionManager(
17045 _Out_ PHANDLE TmHandle
,
17046 _In_ ACCESS_MASK DesiredAccess
,
17047 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
17048 _In_opt_ PUNICODE_STRING LogFileName
,
17049 _In_opt_ ULONG CreateOptions
,
17050 _In_opt_ ULONG CommitStrength
);
17052 _IRQL_requires_max_(PASSIVE_LEVEL
)
17056 ZwOpenTransactionManager(
17057 _Out_ PHANDLE TmHandle
,
17058 _In_ ACCESS_MASK DesiredAccess
,
17059 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
17060 _In_opt_ PUNICODE_STRING LogFileName
,
17061 _In_opt_ LPGUID TmIdentity
,
17062 _In_opt_ ULONG OpenOptions
);
17064 _IRQL_requires_max_(PASSIVE_LEVEL
)
17068 ZwRollforwardTransactionManager(
17069 _In_ HANDLE TransactionManagerHandle
,
17070 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17072 _IRQL_requires_max_(PASSIVE_LEVEL
)
17076 ZwRecoverTransactionManager(
17077 _In_ HANDLE TransactionManagerHandle
);
17079 _IRQL_requires_max_(PASSIVE_LEVEL
)
17083 ZwQueryInformationTransactionManager(
17084 _In_ HANDLE TransactionManagerHandle
,
17085 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
17086 _Out_writes_bytes_(TransactionManagerInformationLength
) PVOID TransactionManagerInformation
,
17087 _In_ ULONG TransactionManagerInformationLength
,
17088 _Out_opt_ PULONG ReturnLength
);
17090 _IRQL_requires_max_(PASSIVE_LEVEL
)
17094 ZwSetInformationTransactionManager(
17095 _In_ HANDLE TmHandle
,
17096 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
17097 _In_ PVOID TransactionManagerInformation
,
17098 _In_ ULONG TransactionManagerInformationLength
);
17100 _IRQL_requires_max_(PASSIVE_LEVEL
)
17104 ZwEnumerateTransactionObject(
17105 _In_opt_ HANDLE RootObjectHandle
,
17106 _In_ KTMOBJECT_TYPE QueryType
,
17107 _Inout_updates_bytes_(ObjectCursorLength
) PKTMOBJECT_CURSOR ObjectCursor
,
17108 _In_ ULONG ObjectCursorLength
,
17109 _Out_ PULONG ReturnLength
);
17111 _IRQL_requires_max_(PASSIVE_LEVEL
)
17115 ZwCreateTransaction(
17116 _Out_ PHANDLE TransactionHandle
,
17117 _In_ ACCESS_MASK DesiredAccess
,
17118 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
17119 _In_opt_ LPGUID Uow
,
17120 _In_opt_ HANDLE TmHandle
,
17121 _In_opt_ ULONG CreateOptions
,
17122 _In_opt_ ULONG IsolationLevel
,
17123 _In_opt_ ULONG IsolationFlags
,
17124 _In_opt_ PLARGE_INTEGER Timeout
,
17125 _In_opt_ PUNICODE_STRING Description
);
17127 _IRQL_requires_max_(PASSIVE_LEVEL
)
17132 _Out_ PHANDLE TransactionHandle
,
17133 _In_ ACCESS_MASK DesiredAccess
,
17134 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
17136 _In_opt_ HANDLE TmHandle
);
17138 _IRQL_requires_max_(PASSIVE_LEVEL
)
17142 ZwQueryInformationTransaction(
17143 _In_ HANDLE TransactionHandle
,
17144 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
17145 _Out_writes_bytes_(TransactionInformationLength
) PVOID TransactionInformation
,
17146 _In_ ULONG TransactionInformationLength
,
17147 _Out_opt_ PULONG ReturnLength
);
17149 _IRQL_requires_max_(PASSIVE_LEVEL
)
17153 ZwSetInformationTransaction(
17154 _In_ HANDLE TransactionHandle
,
17155 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
17156 _In_ PVOID TransactionInformation
,
17157 _In_ ULONG TransactionInformationLength
);
17159 _IRQL_requires_max_(PASSIVE_LEVEL
)
17163 ZwCommitTransaction(
17164 _In_ HANDLE TransactionHandle
,
17165 _In_ BOOLEAN Wait
);
17167 _IRQL_requires_max_(PASSIVE_LEVEL
)
17171 ZwRollbackTransaction(
17172 _In_ HANDLE TransactionHandle
,
17173 _In_ BOOLEAN Wait
);
17175 _IRQL_requires_max_(PASSIVE_LEVEL
)
17179 ZwCreateResourceManager(
17180 _Out_ PHANDLE ResourceManagerHandle
,
17181 _In_ ACCESS_MASK DesiredAccess
,
17182 _In_ HANDLE TmHandle
,
17183 _In_opt_ LPGUID ResourceManagerGuid
,
17184 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
17185 _In_opt_ ULONG CreateOptions
,
17186 _In_opt_ PUNICODE_STRING Description
);
17188 _IRQL_requires_max_(PASSIVE_LEVEL
)
17192 ZwOpenResourceManager(
17193 _Out_ PHANDLE ResourceManagerHandle
,
17194 _In_ ACCESS_MASK DesiredAccess
,
17195 _In_ HANDLE TmHandle
,
17196 _In_ LPGUID ResourceManagerGuid
,
17197 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
);
17199 _IRQL_requires_max_(PASSIVE_LEVEL
)
17203 ZwRecoverResourceManager(
17204 _In_ HANDLE ResourceManagerHandle
);
17206 _IRQL_requires_max_(PASSIVE_LEVEL
)
17210 ZwGetNotificationResourceManager(
17211 _In_ HANDLE ResourceManagerHandle
,
17212 _Out_ PTRANSACTION_NOTIFICATION TransactionNotification
,
17213 _In_ ULONG NotificationLength
,
17214 _In_ PLARGE_INTEGER Timeout
,
17215 _Out_opt_ PULONG ReturnLength
,
17216 _In_ ULONG Asynchronous
,
17217 _In_opt_ ULONG_PTR AsynchronousContext
);
17219 _IRQL_requires_max_(PASSIVE_LEVEL
)
17223 ZwQueryInformationResourceManager(
17224 _In_ HANDLE ResourceManagerHandle
,
17225 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
17226 _Out_writes_bytes_(ResourceManagerInformationLength
) PVOID ResourceManagerInformation
,
17227 _In_ ULONG ResourceManagerInformationLength
,
17228 _Out_opt_ PULONG ReturnLength
);
17230 _IRQL_requires_max_(PASSIVE_LEVEL
)
17234 ZwSetInformationResourceManager(
17235 _In_ HANDLE ResourceManagerHandle
,
17236 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
17237 _In_reads_bytes_(ResourceManagerInformationLength
) PVOID ResourceManagerInformation
,
17238 _In_ ULONG ResourceManagerInformationLength
);
17240 _IRQL_requires_max_(PASSIVE_LEVEL
)
17244 ZwCreateEnlistment(
17245 _Out_ PHANDLE EnlistmentHandle
,
17246 _In_ ACCESS_MASK DesiredAccess
,
17247 _In_ HANDLE ResourceManagerHandle
,
17248 _In_ HANDLE TransactionHandle
,
17249 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
,
17250 _In_opt_ ULONG CreateOptions
,
17251 _In_ NOTIFICATION_MASK NotificationMask
,
17252 _In_opt_ PVOID EnlistmentKey
);
17254 _IRQL_requires_max_(PASSIVE_LEVEL
)
17259 _Out_ PHANDLE EnlistmentHandle
,
17260 _In_ ACCESS_MASK DesiredAccess
,
17261 _In_ HANDLE RmHandle
,
17262 _In_ LPGUID EnlistmentGuid
,
17263 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes
);
17265 _IRQL_requires_max_(PASSIVE_LEVEL
)
17269 ZwQueryInformationEnlistment(
17270 _In_ HANDLE EnlistmentHandle
,
17271 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
17272 _Out_writes_bytes_(EnlistmentInformationLength
) PVOID EnlistmentInformation
,
17273 _In_ ULONG EnlistmentInformationLength
,
17274 _Out_opt_ PULONG ReturnLength
);
17276 _IRQL_requires_max_(PASSIVE_LEVEL
)
17280 ZwSetInformationEnlistment(
17281 _In_ HANDLE EnlistmentHandle
,
17282 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
17283 _In_reads_bytes_(EnlistmentInformationLength
) PVOID EnlistmentInformation
,
17284 _In_ ULONG EnlistmentInformationLength
);
17286 _IRQL_requires_max_(PASSIVE_LEVEL
)
17290 ZwRecoverEnlistment(
17291 _In_ HANDLE EnlistmentHandle
,
17292 _In_opt_ PVOID EnlistmentKey
);
17294 _IRQL_requires_max_(PASSIVE_LEVEL
)
17298 ZwPrePrepareEnlistment(
17299 _In_ HANDLE EnlistmentHandle
,
17300 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17302 _IRQL_requires_max_(PASSIVE_LEVEL
)
17306 ZwPrepareEnlistment(
17307 _In_ HANDLE EnlistmentHandle
,
17308 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17310 _IRQL_requires_max_(PASSIVE_LEVEL
)
17314 ZwCommitEnlistment(
17315 _In_ HANDLE EnlistmentHandle
,
17316 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17318 _IRQL_requires_max_(PASSIVE_LEVEL
)
17322 ZwRollbackEnlistment(
17323 _In_ HANDLE EnlistmentHandle
,
17324 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17326 _IRQL_requires_max_(PASSIVE_LEVEL
)
17330 ZwPrePrepareComplete(
17331 _In_ HANDLE EnlistmentHandle
,
17332 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17334 _IRQL_requires_max_(PASSIVE_LEVEL
)
17339 _In_ HANDLE EnlistmentHandle
,
17340 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17342 _IRQL_requires_max_(PASSIVE_LEVEL
)
17347 _In_ HANDLE EnlistmentHandle
,
17348 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17350 _IRQL_requires_max_(PASSIVE_LEVEL
)
17354 ZwReadOnlyEnlistment(
17355 _In_ HANDLE EnlistmentHandle
,
17356 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17361 ZwRollbackComplete(
17362 _In_ HANDLE EnlistmentHandle
,
17363 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17368 ZwSinglePhaseReject(
17369 _In_ HANDLE EnlistmentHandle
,
17370 _In_opt_ PLARGE_INTEGER TmVirtualClock
);
17371 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
17372 #if (NTDDI_VERSION >= NTDDI_WIN7)
17374 _IRQL_requires_max_(PASSIVE_LEVEL
)
17379 _Out_ PHANDLE KeyHandle
,
17380 _In_ ACCESS_MASK DesiredAccess
,
17381 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
17382 _In_ ULONG OpenOptions
);
17384 _IRQL_requires_max_(PASSIVE_LEVEL
)
17388 ZwOpenKeyTransactedEx(
17389 _Out_ PHANDLE KeyHandle
,
17390 _In_ ACCESS_MASK DesiredAccess
,
17391 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
17392 _In_ ULONG OpenOptions
,
17393 _In_ HANDLE TransactionHandle
);
17398 ZwNotifyChangeMultipleKeys(
17399 _In_ HANDLE MasterKeyHandle
,
17400 _In_opt_ ULONG Count
,
17401 _In_opt_ OBJECT_ATTRIBUTES SubordinateObjects
[],
17402 _In_opt_ HANDLE Event
,
17403 _In_opt_ PIO_APC_ROUTINE ApcRoutine
,
17404 _In_opt_ PVOID ApcContext
,
17405 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
17406 _In_ ULONG CompletionFilter
,
17407 _In_ BOOLEAN WatchTree
,
17408 _Out_opt_ PVOID Buffer
,
17409 _In_ ULONG BufferSize
,
17410 _In_ BOOLEAN Asynchronous
);
17415 ZwQueryMultipleValueKey(
17416 _In_ HANDLE KeyHandle
,
17417 _Inout_ PKEY_VALUE_ENTRY ValueEntries
,
17418 _In_ ULONG EntryCount
,
17419 _Out_ PVOID ValueBuffer
,
17420 _Inout_ PULONG BufferLength
,
17421 _Out_opt_ PULONG RequiredBufferLength
);
17423 _IRQL_requires_max_(PASSIVE_LEVEL
)
17428 _In_ HANDLE KeyHandle
,
17429 _In_ PUNICODE_STRING NewName
);
17431 _IRQL_requires_max_(PASSIVE_LEVEL
)
17435 ZwSetInformationKey(
17436 _In_ HANDLE KeyHandle
,
17437 _In_
__drv_strictTypeMatch(__drv_typeConst
) KEY_SET_INFORMATION_CLASS KeySetInformationClass
,
17438 _In_reads_bytes_(KeySetInformationLength
) PVOID KeySetInformation
,
17439 _In_ ULONG KeySetInformationLength
);
17441 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
17448 #endif /* !_WDMDDK_ */