4 * Windows NT WDM Driver Developer Kit
6 * This file is part of the ReactOS DDK package.
10 * Timo Kreuzer (timo.kreuzer@reactos.org)
12 * THIS SOFTWARE IS NOT COPYRIGHTED
14 * This source code is offered for use in the public domain. You may
15 * use, modify or distribute it freely.
17 * This code is distributed in the hope that it will be useful but
18 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
19 * DISCLAIMED. This includes but is not limited to warranties of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
28 /* Included via ntddk.h? */
31 #define _WDM_INCLUDED_
33 #define NO_INTERLOCKED_INTRINSICS
45 #endif /* GUID_DEFINED */
47 #if (NTDDI_VERSION >= NTDDI_WINXP)
57 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
58 #define NTHALAPI DECLSPEC_IMPORT
64 #if !defined(_NTOSKRNL_) && !defined(_BLDR_)
65 #define NTKERNELAPI DECLSPEC_IMPORT
70 #if defined(_X86_) && !defined(_NTHAL_)
71 #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT
73 #define _DECL_HAL_KE_IMPORT
75 #define _DECL_HAL_KE_IMPORT NTKERNELAPI
79 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
81 #define POINTER_ALIGNMENT
84 /* Helper macro to enable gcc's extension. */
85 #ifndef __GNU_EXTENSION
87 #define __GNU_EXTENSION __extension__
89 #define __GNU_EXTENSION
95 /* Indicate if #pragma alloc_text() is supported */
96 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
97 #define ALLOC_PRAGMA 1
100 /* Indicate if #pragma data_seg() is supported */
101 #if defined(_M_IX86) || defined(_M_AMD64)
102 #define ALLOC_DATA_PRAGMA 1
107 /* Forward declarations */
114 struct _DEVICE_OBJECT
;
115 struct _DRIVER_OBJECT
;
116 struct _IO_STATUS_BLOCK
;
117 struct _DEVICE_DESCRIPTION
;
118 struct _SCATTER_GATHER_LIST
;
119 struct _DRIVE_LAYOUT_INFORMATION
;
120 struct _COMPRESSED_DATA_INFO
;
121 struct _IO_RESOURCE_DESCRIPTOR
;
123 /* Structures not exposed to drivers */
124 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
125 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
126 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
127 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
128 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
129 typedef struct _EPROCESS
*PEPROCESS
;
130 typedef struct _ETHREAD
*PETHREAD
;
131 typedef struct _IO_TIMER
*PIO_TIMER
;
132 typedef struct _KINTERRUPT
*PKINTERRUPT
;
133 typedef struct _KPROCESS
*PKPROCESS
;
134 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
135 typedef struct _CONTEXT
*PCONTEXT
;
138 /******************************************************************************
139 * INTERLOCKED Functions *
140 ******************************************************************************/
142 // Intrinsics (note: taken from our winnt.h)
145 #if defined(__GNUC__)
147 static __inline__ BOOLEAN
148 InterlockedBitTestAndSet(
149 IN LONG
volatile *Base
,
154 __asm__
__volatile__("lock "
157 :"=r" (OldBit
),"+m" (*Base
)
162 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
166 static __inline__ BOOLEAN
167 InterlockedBitTestAndReset(
168 IN LONG
volatile *Base
,
173 __asm__
__volatile__("lock "
176 :"=r" (OldBit
),"+m" (*Base
)
181 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
185 #endif /* defined(__GNUC__) */
187 #define BitScanForward _BitScanForward
188 #define BitScanReverse _BitScanReverse
189 #define BitTest _bittest
190 #define BitTestAndComplement _bittestandcomplement
191 #define BitTestAndSet _bittestandset
192 #define BitTestAndReset _bittestandreset
193 #define InterlockedBitTestAndSet _interlockedbittestandset
194 #define InterlockedBitTestAndReset _interlockedbittestandreset
197 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
198 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
201 #if !defined(__INTERLOCKED_DECLARED)
202 #define __INTERLOCKED_DECLARED
205 #if defined(NO_INTERLOCKED_INTRINSICS)
209 InterlockedIncrement(
210 IN OUT LONG
volatile *Addend
);
215 InterlockedDecrement(
216 IN OUT LONG
volatile *Addend
);
221 InterlockedCompareExchange(
222 IN OUT LONG
volatile *Destination
,
230 IN OUT LONG
volatile *Destination
,
236 InterlockedExchangeAdd(
237 IN OUT LONG
volatile *Addend
,
240 #else /* !defined(NO_INTERLOCKED_INTRINSICS) */
242 #define InterlockedExchange _InterlockedExchange
243 #define InterlockedIncrement _InterlockedIncrement
244 #define InterlockedDecrement _InterlockedDecrement
245 #define InterlockedExchangeAdd _InterlockedExchangeAdd
246 #define InterlockedCompareExchange _InterlockedCompareExchange
247 #define InterlockedOr _InterlockedOr
248 #define InterlockedAnd _InterlockedAnd
249 #define InterlockedXor _InterlockedXor
251 #endif /* !defined(NO_INTERLOCKED_INTRINSICS) */
253 #endif /* defined (_X86_) */
255 #if !defined (_WIN64)
258 * InterlockedExchangePointer(
259 * IN OUT PVOID volatile *Target,
262 #define InterlockedExchangePointer(Target, Value) \
263 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
267 * InterlockedCompareExchangePointer(
268 * IN OUT PVOID *Destination,
270 * IN PVOID Comparand)
272 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
273 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
275 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
276 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
277 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
279 #endif // !defined (_WIN64)
281 #if defined (_M_AMD64)
283 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
284 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
285 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
286 #define InterlockedAnd _InterlockedAnd
287 #define InterlockedOr _InterlockedOr
288 #define InterlockedXor _InterlockedXor
289 #define InterlockedIncrement _InterlockedIncrement
290 #define InterlockedDecrement _InterlockedDecrement
291 #define InterlockedAdd _InterlockedAdd
292 #define InterlockedExchange _InterlockedExchange
293 #define InterlockedExchangeAdd _InterlockedExchangeAdd
294 #define InterlockedCompareExchange _InterlockedCompareExchange
295 #define InterlockedAnd64 _InterlockedAnd64
296 #define InterlockedOr64 _InterlockedOr64
297 #define InterlockedXor64 _InterlockedXor64
298 #define InterlockedIncrement64 _InterlockedIncrement64
299 #define InterlockedDecrement64 _InterlockedDecrement64
300 #define InterlockedAdd64 _InterlockedAdd64
301 #define InterlockedExchange64 _InterlockedExchange64
302 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
303 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
304 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
305 #define InterlockedExchangePointer _InterlockedExchangePointer
306 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
307 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
311 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
312 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
316 IN OUT LONG64
volatile *Addend
,
319 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
324 #endif /* !__INTERLOCKED_DECLARED */
327 /******************************************************************************
328 * Runtime Library Types *
329 ******************************************************************************/
331 #define RTL_REGISTRY_ABSOLUTE 0
332 #define RTL_REGISTRY_SERVICES 1
333 #define RTL_REGISTRY_CONTROL 2
334 #define RTL_REGISTRY_WINDOWS_NT 3
335 #define RTL_REGISTRY_DEVICEMAP 4
336 #define RTL_REGISTRY_USER 5
337 #define RTL_REGISTRY_MAXIMUM 6
338 #define RTL_REGISTRY_HANDLE 0x40000000
339 #define RTL_REGISTRY_OPTIONAL 0x80000000
341 /* RTL_QUERY_REGISTRY_TABLE.Flags */
342 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
343 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
344 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
345 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
346 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
347 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
348 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
350 #define HASH_STRING_ALGORITHM_DEFAULT 0
351 #define HASH_STRING_ALGORITHM_X65599 1
352 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
354 typedef struct _RTL_BITMAP
{
357 } RTL_BITMAP
, *PRTL_BITMAP
;
359 typedef struct _RTL_BITMAP_RUN
{
362 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
365 (NTAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
369 IN ULONG ValueLength
,
371 IN PVOID EntryContext
);
373 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
374 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
381 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
383 typedef struct _TIME_FIELDS
{
392 } TIME_FIELDS
, *PTIME_FIELDS
;
395 #ifndef _SLIST_HEADER_
396 #define _SLIST_HEADER_
399 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
400 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
403 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
410 ULONGLONG Sequence
:9;
411 ULONGLONG NextEntry
:39;
412 ULONGLONG HeaderType
:1;
414 ULONGLONG Reserved
:59;
419 ULONGLONG Sequence
:48;
420 ULONGLONG HeaderType
:1;
422 ULONGLONG Reserved
:2;
423 ULONGLONG NextEntry
:60;
425 } SLIST_HEADER
, *PSLIST_HEADER
;
427 #define SLIST_ENTRY SINGLE_LIST_ENTRY
428 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
429 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
430 typedef union _SLIST_HEADER
{
437 } SLIST_HEADER
, *PSLIST_HEADER
;
440 #endif /* _SLIST_HEADER_ */
442 /* MS definition is broken! */
443 extern BOOLEAN NTSYSAPI NlsMbCodePageTag
;
444 extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag
;
445 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
446 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
448 /******************************************************************************
450 ******************************************************************************/
452 typedef UCHAR KIRQL
, *PKIRQL
;
453 typedef CCHAR KPROCESSOR_MODE
;
454 typedef LONG KPRIORITY
;
456 typedef ULONG EXECUTION_STATE
;
464 /* Processor features */
465 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
466 #define PF_FLOATING_POINT_EMULATED 1
467 #define PF_COMPARE_EXCHANGE_DOUBLE 2
468 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
469 #define PF_PPC_MOVEMEM_64BIT_OK 4
470 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
471 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
472 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
473 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
474 #define PF_PAE_ENABLED 9
475 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
476 #define PF_SSE_DAZ_MODE_AVAILABLE 11
477 #define PF_NX_ENABLED 12
478 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
479 #define PF_COMPARE_EXCHANGE128 14
480 #define PF_COMPARE64_EXCHANGE128 15
481 #define PF_CHANNELS_ENABLED 16
482 #define PF_XSAVE_ENABLED 17
484 #define MAXIMUM_WAIT_OBJECTS 64
486 #define ASSERT_APC(Object) \
487 ASSERT((Object)->Type == ApcObject)
489 #define ASSERT_DPC(Object) \
490 ASSERT(((Object)->Type == 0) || \
491 ((Object)->Type == DpcObject) || \
492 ((Object)->Type == ThreadedDpcObject))
494 #define ASSERT_GATE(object) \
495 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
496 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
498 #define ASSERT_DEVICE_QUEUE(Object) \
499 ASSERT((Object)->Type == DeviceQueueObject)
501 #define ASSERT_TIMER(E) \
502 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
503 ((E)->Header.Type == TimerSynchronizationObject))
505 #define ASSERT_MUTANT(E) \
506 ASSERT((E)->Header.Type == MutantObject)
508 #define ASSERT_SEMAPHORE(E) \
509 ASSERT((E)->Header.Type == SemaphoreObject)
511 #define ASSERT_EVENT(E) \
512 ASSERT(((E)->Header.Type == NotificationEvent) || \
513 ((E)->Header.Type == SynchronizationEvent))
516 #define DPC_THREADED 1
518 #define GM_LOCK_BIT 0x1
519 #define GM_LOCK_BIT_V 0x0
520 #define GM_LOCK_WAITER_WOKEN 0x2
521 #define GM_LOCK_WAITER_INC 0x4
523 #define LOCK_QUEUE_WAIT_BIT 0
524 #define LOCK_QUEUE_OWNER_BIT 1
526 #define LOCK_QUEUE_WAIT 1
527 #define LOCK_QUEUE_OWNER 2
528 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
529 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
531 #define PROCESSOR_FEATURE_MAX 64
533 #define DBG_STATUS_CONTROL_C 1
534 #define DBG_STATUS_SYSRQ 2
535 #define DBG_STATUS_BUGCHECK_FIRST 3
536 #define DBG_STATUS_BUGCHECK_SECOND 4
537 #define DBG_STATUS_FATAL 5
538 #define DBG_STATUS_DEBUG_CONTROL 6
539 #define DBG_STATUS_WORKER 7
542 #define MAXIMUM_PROC_PER_GROUP 64
544 #define MAXIMUM_PROC_PER_GROUP 32
546 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
548 /* Exception Records */
549 #define EXCEPTION_NONCONTINUABLE 1
550 #define EXCEPTION_MAXIMUM_PARAMETERS 15
552 typedef struct _EXCEPTION_RECORD
{
553 NTSTATUS ExceptionCode
;
554 ULONG ExceptionFlags
;
555 struct _EXCEPTION_RECORD
*ExceptionRecord
;
556 PVOID ExceptionAddress
;
557 ULONG NumberParameters
;
558 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
559 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
561 typedef struct _EXCEPTION_RECORD32
{
562 NTSTATUS ExceptionCode
;
563 ULONG ExceptionFlags
;
564 ULONG ExceptionRecord
;
565 ULONG ExceptionAddress
;
566 ULONG NumberParameters
;
567 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
568 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
570 typedef struct _EXCEPTION_RECORD64
{
571 NTSTATUS ExceptionCode
;
572 ULONG ExceptionFlags
;
573 ULONG64 ExceptionRecord
;
574 ULONG64 ExceptionAddress
;
575 ULONG NumberParameters
;
576 ULONG __unusedAlignment
;
577 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
578 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
580 typedef struct _EXCEPTION_POINTERS
{
581 PEXCEPTION_RECORD ExceptionRecord
;
582 PCONTEXT ContextRecord
;
583 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
585 typedef enum _KBUGCHECK_CALLBACK_REASON
{
588 KbCallbackSecondaryDumpData
,
591 } KBUGCHECK_CALLBACK_REASON
;
593 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
596 (NTAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
597 IN KBUGCHECK_CALLBACK_REASON Reason
,
598 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
599 IN OUT PVOID ReasonSpecificData
,
600 IN ULONG ReasonSpecificDataLength
);
602 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
604 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
607 KBUGCHECK_CALLBACK_REASON Reason
;
609 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
611 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
617 } KBUGCHECK_BUFFER_DUMP_STATE
;
620 (NTAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
624 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
626 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
632 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
635 (NTAPI
*PNMI_CALLBACK
)(
639 typedef enum _TRACE_INFORMATION_CLASS
{
642 TraceEnableFlagsClass
,
643 TraceEnableLevelClass
,
644 GlobalLoggerHandleClass
,
645 EventLoggerHandleClass
,
646 AllLoggerHandlesClass
,
647 TraceHandleByNameClass
,
648 LoggerEventsLostClass
,
649 TraceSessionSettingsClass
,
650 LoggerEventsLoggedClass
,
651 MaxTraceInformationClass
652 } TRACE_INFORMATION_CLASS
;
654 typedef enum _KINTERRUPT_POLARITY
{
655 InterruptPolarityUnknown
,
658 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
660 typedef enum _KPROFILE_SOURCE
{
662 ProfileAlignmentFixup
,
665 ProfileLoadInstructions
,
666 ProfilePipelineFrozen
,
667 ProfileBranchInstructions
,
668 ProfileTotalNonissues
,
672 ProfileBranchMispredictions
,
673 ProfileStoreInstructions
,
674 ProfileFpInstructions
,
675 ProfileIntegerInstructions
,
679 ProfileSpecialInstructions
,
682 ProfileDcacheAccesses
,
683 ProfileMemoryBarrierCycles
,
684 ProfileLoadLinkedIssues
,
688 typedef enum _KWAIT_REASON
{
729 typedef struct _KWAIT_BLOCK
{
730 LIST_ENTRY WaitListEntry
;
731 struct _KTHREAD
*Thread
;
733 struct _KWAIT_BLOCK
*NextWaitBlock
;
736 volatile UCHAR BlockState
;
740 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
742 typedef enum _KINTERRUPT_MODE
{
747 #define THREAD_WAIT_OBJECTS 3
750 (NTAPI
*PKINTERRUPT_ROUTINE
)(
753 typedef enum _KD_OPTION
{
754 KD_OPTION_SET_BLOCK_ENABLE
,
757 typedef enum _INTERFACE_TYPE
{
758 InterfaceTypeUndefined
= -1,
777 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
780 (NTAPI
*PKNORMAL_ROUTINE
)(
781 IN PVOID NormalContext
,
782 IN PVOID SystemArgument1
,
783 IN PVOID SystemArgument2
);
786 (NTAPI
*PKRUNDOWN_ROUTINE
)(
787 IN
struct _KAPC
*Apc
);
790 (NTAPI
*PKKERNEL_ROUTINE
)(
791 IN
struct _KAPC
*Apc
,
792 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
793 IN OUT PVOID
*NormalContext
,
794 IN OUT PVOID
*SystemArgument1
,
795 IN OUT PVOID
*SystemArgument2
);
797 typedef struct _KAPC
{
803 struct _KTHREAD
*Thread
;
804 LIST_ENTRY ApcListEntry
;
805 PKKERNEL_ROUTINE KernelRoutine
;
806 PKRUNDOWN_ROUTINE RundownRoutine
;
807 PKNORMAL_ROUTINE NormalRoutine
;
809 PVOID SystemArgument1
;
810 PVOID SystemArgument2
;
812 KPROCESSOR_MODE ApcMode
;
814 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
816 typedef struct _KDEVICE_QUEUE_ENTRY
{
817 LIST_ENTRY DeviceListEntry
;
820 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
821 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
823 typedef PVOID PKIPI_CONTEXT
;
826 (NTAPI
*PKIPI_WORKER
)(
827 IN PKIPI_CONTEXT PacketContext
,
830 IN PVOID Parameter3
);
833 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
834 IN ULONG_PTR Argument
);
836 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
838 typedef struct _KSPIN_LOCK_QUEUE
{
839 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
840 PKSPIN_LOCK
volatile Lock
;
841 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
843 typedef struct _KLOCK_QUEUE_HANDLE
{
844 KSPIN_LOCK_QUEUE LockQueue
;
846 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
850 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
852 #define LockQueueDispatcherLock 0
853 #define LockQueueExpansionLock 1
854 #define LockQueuePfnLock 2
855 #define LockQueueSystemSpaceLock 3
856 #define LockQueueVacbLock 4
857 #define LockQueueMasterLock 5
858 #define LockQueueNonPagedPoolLock 6
859 #define LockQueueIoCancelLock 7
860 #define LockQueueWorkQueueLock 8
861 #define LockQueueIoVpbLock 9
862 #define LockQueueIoDatabaseLock 10
863 #define LockQueueIoCompletionLock 11
864 #define LockQueueNtfsStructLock 12
865 #define LockQueueAfdWorkQueueLock 13
866 #define LockQueueBcbLock 14
867 #define LockQueueMmNonPagedPoolLock 15
868 #define LockQueueUnusedSpare16 16
869 #define LockQueueTimerTableLock 17
870 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
874 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
875 LockQueueDispatcherLock
,
876 LockQueueExpansionLock
,
878 LockQueueSystemSpaceLock
,
881 LockQueueNonPagedPoolLock
,
882 LockQueueIoCancelLock
,
883 LockQueueWorkQueueLock
,
885 LockQueueIoDatabaseLock
,
886 LockQueueIoCompletionLock
,
887 LockQueueNtfsStructLock
,
888 LockQueueAfdWorkQueueLock
,
890 LockQueueMmNonPagedPoolLock
,
891 LockQueueUnusedSpare16
,
892 LockQueueTimerTableLock
,
893 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
894 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
896 #endif /* defined(_AMD64_) */
899 (NTAPI
*PKDEFERRED_ROUTINE
)(
900 IN
struct _KDPC
*Dpc
,
901 IN PVOID DeferredContext
,
902 IN PVOID SystemArgument1
,
903 IN PVOID SystemArgument2
);
905 typedef enum _KDPC_IMPORTANCE
{
912 typedef struct _KDPC
{
915 volatile USHORT Number
;
916 LIST_ENTRY DpcListEntry
;
917 PKDEFERRED_ROUTINE DeferredRoutine
;
918 PVOID DeferredContext
;
919 PVOID SystemArgument1
;
920 PVOID SystemArgument2
;
921 volatile PVOID DpcData
;
922 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
924 typedef struct _KDPC_WATCHDOG_INFORMATION
{
927 ULONG DpcWatchdogLimit
;
928 ULONG DpcWatchdogCount
;
930 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
932 typedef struct _KDEVICE_QUEUE
{
935 LIST_ENTRY DeviceListHead
;
948 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
950 #define TIMER_EXPIRED_INDEX_BITS 6
951 #define TIMER_PROCESSOR_INDEX_BITS 5
953 typedef struct _DISPATCHER_HEADER
{
954 _ANONYMOUS_UNION
union {
955 _ANONYMOUS_STRUCT
struct {
957 _ANONYMOUS_UNION
union {
958 _ANONYMOUS_UNION
union {
959 UCHAR TimerControlFlags
;
960 _ANONYMOUS_STRUCT
struct {
963 UCHAR KeepShifting
:1;
964 UCHAR EncodedTolerableDelay
:5;
968 #if (NTDDI_VERSION < NTDDI_WIN7)
973 _ANONYMOUS_UNION
union {
974 _ANONYMOUS_UNION
union {
975 UCHAR ThreadControlFlags
;
976 _ANONYMOUS_STRUCT
struct {
977 UCHAR CpuThrottled
:1;
978 UCHAR CycleProfiling
:1;
979 UCHAR CounterProfiling
:1;
986 _ANONYMOUS_UNION
union {
987 #if (NTDDI_VERSION >= NTDDI_WIN7)
988 _ANONYMOUS_UNION
union {
989 UCHAR TimerMiscFlags
;
990 _ANONYMOUS_STRUCT
struct {
992 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
995 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
998 volatile UCHAR Expired
:1;
1002 /* Pre Win7 compatibility fix to latest WDK */
1005 _ANONYMOUS_UNION
union {
1006 BOOLEAN DebugActive
;
1007 _ANONYMOUS_STRUCT
struct {
1008 BOOLEAN ActiveDR7
:1;
1009 BOOLEAN Instrumented
:1;
1010 BOOLEAN Reserved2
:4;
1011 BOOLEAN UmsScheduled
:1;
1012 BOOLEAN UmsPrimary
:1;
1014 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
1021 LIST_ENTRY WaitListHead
;
1022 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1024 typedef struct _KEVENT
{
1025 DISPATCHER_HEADER Header
;
1026 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1028 typedef struct _KSEMAPHORE
{
1029 DISPATCHER_HEADER Header
;
1031 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1033 typedef struct _KGATE
{
1034 DISPATCHER_HEADER Header
;
1035 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
1037 typedef struct _KGUARDED_MUTEX
{
1038 volatile LONG Count
;
1042 __GNU_EXTENSION
union {
1043 __GNU_EXTENSION
struct {
1044 SHORT KernelApcDisable
;
1045 SHORT SpecialApcDisable
;
1047 ULONG CombinedApcDisable
;
1049 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
1051 typedef struct _KMUTANT
{
1052 DISPATCHER_HEADER Header
;
1053 LIST_ENTRY MutantListEntry
;
1054 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
1057 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
1059 #define TIMER_TABLE_SIZE 512
1060 #define TIMER_TABLE_SHIFT 9
1062 typedef struct _KTIMER
{
1063 DISPATCHER_HEADER Header
;
1064 ULARGE_INTEGER DueTime
;
1065 LIST_ENTRY TimerListEntry
;
1071 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
1074 (NTAPI
*PKSYNCHRONIZE_ROUTINE
)(
1075 IN PVOID SynchronizeContext
);
1077 typedef enum _POOL_TYPE
{
1080 NonPagedPoolMustSucceed
,
1082 NonPagedPoolCacheAligned
,
1083 PagedPoolCacheAligned
,
1084 NonPagedPoolCacheAlignedMustS
,
1086 NonPagedPoolSession
= 32,
1088 NonPagedPoolMustSucceedSession
,
1089 DontUseThisTypeSession
,
1090 NonPagedPoolCacheAlignedSession
,
1091 PagedPoolCacheAlignedSession
,
1092 NonPagedPoolCacheAlignedMustSSession
1095 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
1099 } ALTERNATIVE_ARCHITECTURE_TYPE
;
1101 typedef struct _KSYSTEM_TIME
{
1105 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
1107 typedef struct _PNP_BUS_INFORMATION
{
1109 INTERFACE_TYPE LegacyBusType
;
1111 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
1113 typedef struct DECLSPEC_ALIGN(16) _M128A
{
1118 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
1125 USHORT ErrorSelector
;
1128 USHORT DataSelector
;
1132 M128A FloatRegisters
[8];
1134 M128A XmmRegisters
[16];
1135 UCHAR Reserved4
[96];
1137 M128A XmmRegisters
[8];
1138 UCHAR Reserved4
[192];
1139 ULONG StackControl
[7];
1142 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
1144 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
1146 ULONG64 Reserved
[7];
1147 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
1149 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
1150 XSAVE_FORMAT LegacyState
;
1151 XSAVE_AREA_HEADER Header
;
1152 } XSAVE_AREA
, *PXSAVE_AREA
;
1154 typedef struct _XSTATE_CONTEXT
{
1166 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
1170 #define MAXIMUM_SUPPORTED_EXTENSION 512
1172 #if !defined(__midl) && !defined(MIDL_PASS)
1173 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
1178 #define XSAVE_ALIGN 64
1179 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
1181 #if !defined(__midl) && !defined(MIDL_PASS)
1182 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
1183 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
1184 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
1187 typedef struct _CONTEXT_CHUNK
{
1190 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
1192 typedef struct _CONTEXT_EX
{
1194 CONTEXT_CHUNK Legacy
;
1195 CONTEXT_CHUNK XState
;
1196 } CONTEXT_EX
, *PCONTEXT_EX
;
1198 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1200 #if (NTDDI_VERSION >= NTDDI_VISTA)
1201 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1202 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1203 extern NTSYSAPI CCHAR KeNumberProcessors
;
1205 extern PCCHAR KeNumberProcessors
;
1208 /******************************************************************************
1209 * Memory manager Types *
1210 ******************************************************************************/
1212 #define MM_DONT_ZERO_ALLOCATION 0x00000001
1213 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
1214 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
1215 #define MM_ALLOCATE_NO_WAIT 0x00000008
1216 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
1217 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
1219 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1220 #define MDL_PAGES_LOCKED 0x0002
1221 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1222 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1223 #define MDL_PARTIAL 0x0010
1224 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1225 #define MDL_IO_PAGE_READ 0x0040
1226 #define MDL_WRITE_OPERATION 0x0080
1227 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1228 #define MDL_FREE_EXTRA_PTES 0x0200
1229 #define MDL_DESCRIBES_AWE 0x0400
1230 #define MDL_IO_SPACE 0x0800
1231 #define MDL_NETWORK_HEADER 0x1000
1232 #define MDL_MAPPING_CAN_FAIL 0x2000
1233 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1234 #define MDL_INTERNAL 0x8000
1236 #define MDL_MAPPING_FLAGS ( \
1237 MDL_MAPPED_TO_SYSTEM_VA | \
1238 MDL_PAGES_LOCKED | \
1239 MDL_SOURCE_IS_NONPAGED_POOL | \
1240 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1241 MDL_PARENT_MAPPED_SYSTEM_VA | \
1245 #define FLUSH_MULTIPLE_MAXIMUM 32
1247 /* Section access rights */
1248 #define SECTION_QUERY 0x0001
1249 #define SECTION_MAP_WRITE 0x0002
1250 #define SECTION_MAP_READ 0x0004
1251 #define SECTION_MAP_EXECUTE 0x0008
1252 #define SECTION_EXTEND_SIZE 0x0010
1253 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
1255 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
1256 SECTION_MAP_WRITE | \
1257 SECTION_MAP_READ | \
1258 SECTION_MAP_EXECUTE | \
1259 SECTION_EXTEND_SIZE)
1261 #define SESSION_QUERY_ACCESS 0x0001
1262 #define SESSION_MODIFY_ACCESS 0x0002
1264 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
1265 SESSION_QUERY_ACCESS | \
1266 SESSION_MODIFY_ACCESS)
1268 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1270 #define PAGE_NOACCESS 0x01
1271 #define PAGE_READONLY 0x02
1272 #define PAGE_READWRITE 0x04
1273 #define PAGE_WRITECOPY 0x08
1274 #define PAGE_EXECUTE 0x10
1275 #define PAGE_EXECUTE_READ 0x20
1276 #define PAGE_EXECUTE_READWRITE 0x40
1277 #define PAGE_EXECUTE_WRITECOPY 0x80
1278 #define PAGE_GUARD 0x100
1279 #define PAGE_NOCACHE 0x200
1280 #define PAGE_WRITECOMBINE 0x400
1282 #define MEM_COMMIT 0x1000
1283 #define MEM_RESERVE 0x2000
1284 #define MEM_DECOMMIT 0x4000
1285 #define MEM_RELEASE 0x8000
1286 #define MEM_FREE 0x10000
1287 #define MEM_PRIVATE 0x20000
1288 #define MEM_MAPPED 0x40000
1289 #define MEM_RESET 0x80000
1290 #define MEM_TOP_DOWN 0x100000
1291 #define MEM_LARGE_PAGES 0x20000000
1292 #define MEM_4MB_PAGES 0x80000000
1294 #define SEC_RESERVE 0x4000000
1295 #define SEC_COMMIT 0x8000000
1296 #define SEC_LARGE_PAGES 0x80000000
1298 /* Section map options */
1299 typedef enum _SECTION_INHERIT
{
1304 typedef ULONG PFN_COUNT
;
1305 typedef LONG_PTR SPFN_NUMBER
, *PSPFN_NUMBER
;
1306 typedef ULONG_PTR PFN_NUMBER
, *PPFN_NUMBER
;
1308 typedef struct _MDL
{
1312 struct _EPROCESS
*Process
;
1313 PVOID MappedSystemVa
;
1320 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
1321 MmFrameBufferCached
= 2
1322 } MEMORY_CACHING_TYPE_ORIG
;
1324 typedef enum _MEMORY_CACHING_TYPE
{
1325 MmNonCached
= FALSE
,
1327 MmWriteCombined
= MmFrameBufferCached
,
1328 MmHardwareCoherentCached
,
1329 MmNonCachedUnordered
,
1332 } MEMORY_CACHING_TYPE
;
1334 typedef enum _MM_PAGE_PRIORITY
{
1336 NormalPagePriority
= 16,
1337 HighPagePriority
= 32
1340 typedef enum _LOCK_OPERATION
{
1346 typedef enum _MM_SYSTEM_SIZE
{
1353 /******************************************************************************
1355 ******************************************************************************/
1357 #define EX_RUNDOWN_ACTIVE 0x1
1358 #define EX_RUNDOWN_COUNT_SHIFT 0x1
1359 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
1362 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
1364 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
1367 typedef struct _FAST_MUTEX
{
1368 volatile LONG Count
;
1373 } FAST_MUTEX
, *PFAST_MUTEX
;
1375 typedef enum _SUITE_TYPE
{
1379 CommunicationServer
,
1381 SmallBusinessRestricted
,
1395 typedef enum _EX_POOL_PRIORITY
{
1397 LowPoolPrioritySpecialPoolOverrun
= 8,
1398 LowPoolPrioritySpecialPoolUnderrun
= 9,
1399 NormalPoolPriority
= 16,
1400 NormalPoolPrioritySpecialPoolOverrun
= 24,
1401 NormalPoolPrioritySpecialPoolUnderrun
= 25,
1402 HighPoolPriority
= 32,
1403 HighPoolPrioritySpecialPoolOverrun
= 40,
1404 HighPoolPrioritySpecialPoolUnderrun
= 41
1407 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
1408 #define LOOKASIDE_ALIGN
1410 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
1413 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
1416 (NTAPI
*PALLOCATE_FUNCTION
)(
1417 IN POOL_TYPE PoolType
,
1418 IN SIZE_T NumberOfBytes
,
1422 (NTAPI
*PALLOCATE_FUNCTION_EX
)(
1423 IN POOL_TYPE PoolType
,
1424 IN SIZE_T NumberOfBytes
,
1426 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
1429 (NTAPI
*PFREE_FUNCTION
)(
1433 (NTAPI
*PFREE_FUNCTION_EX
)(
1435 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
1438 (NTAPI
*PCALLBACK_FUNCTION
)(
1439 IN PVOID CallbackContext
,
1441 IN PVOID Argument2
);
1443 #define GENERAL_LOOKASIDE_LAYOUT \
1445 SLIST_HEADER ListHead; \
1446 SINGLE_LIST_ENTRY SingleListHead; \
1449 USHORT MaximumDepth; \
1450 ULONG TotalAllocates; \
1452 ULONG AllocateMisses; \
1453 ULONG AllocateHits; \
1454 } DUMMYUNIONNAME2; \
1460 } DUMMYUNIONNAME3; \
1466 PALLOCATE_FUNCTION_EX AllocateEx; \
1467 PALLOCATE_FUNCTION Allocate; \
1468 } DUMMYUNIONNAME4; \
1471 PFREE_FUNCTION_EX FreeEx; \
1472 PFREE_FUNCTION Free; \
1473 } DUMMYUNIONNAME5; \
1475 LIST_ENTRY ListEntry; \
1476 ULONG LastTotalAllocates; \
1478 ULONG LastAllocateMisses; \
1479 ULONG LastAllocateHits; \
1480 } DUMMYUNIONNAME6; \
1483 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
1484 GENERAL_LOOKASIDE_LAYOUT
1485 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
1487 typedef struct _GENERAL_LOOKASIDE_POOL
{
1488 GENERAL_LOOKASIDE_LAYOUT
1489 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
1491 typedef struct _PAGED_LOOKASIDE_LIST
{
1492 GENERAL_LOOKASIDE L
;
1493 #if !defined(_AMD64_) && !defined(_IA64_)
1494 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
1496 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
1498 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
1499 GENERAL_LOOKASIDE L
;
1500 #if !defined(_AMD64_) && !defined(_IA64_)
1501 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
1503 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
1505 typedef struct _LOOKASIDE_LIST_EX
{
1506 GENERAL_LOOKASIDE_POOL L
;
1507 } LOOKASIDE_LIST_EX
;
1509 typedef struct _EX_RUNDOWN_REF
{
1510 __GNU_EXTENSION
union {
1511 volatile ULONG_PTR Count
;
1514 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
1516 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
1519 (NTAPI
*PWORKER_THREAD_ROUTINE
)(
1520 IN PVOID Parameter
);
1522 typedef struct _WORK_QUEUE_ITEM
{
1524 PWORKER_THREAD_ROUTINE WorkerRoutine
;
1525 volatile PVOID Parameter
;
1526 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
1530 /******************************************************************************
1531 * Security Manager Types *
1532 ******************************************************************************/
1535 typedef PVOID PSECURITY_DESCRIPTOR
;
1536 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
1537 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
1538 typedef PVOID PACCESS_TOKEN
;
1541 #define DELETE 0x00010000L
1542 #define READ_CONTROL 0x00020000L
1543 #define WRITE_DAC 0x00040000L
1544 #define WRITE_OWNER 0x00080000L
1545 #define SYNCHRONIZE 0x00100000L
1546 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
1547 #define STANDARD_RIGHTS_READ READ_CONTROL
1548 #define STANDARD_RIGHTS_WRITE READ_CONTROL
1549 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
1550 #define STANDARD_RIGHTS_ALL 0x001F0000L
1551 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
1552 #define ACCESS_SYSTEM_SECURITY 0x01000000L
1553 #define MAXIMUM_ALLOWED 0x02000000L
1554 #define GENERIC_READ 0x80000000L
1555 #define GENERIC_WRITE 0x40000000L
1556 #define GENERIC_EXECUTE 0x20000000L
1557 #define GENERIC_ALL 0x10000000L
1559 typedef struct _GENERIC_MAPPING
{
1560 ACCESS_MASK GenericRead
;
1561 ACCESS_MASK GenericWrite
;
1562 ACCESS_MASK GenericExecute
;
1563 ACCESS_MASK GenericAll
;
1564 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
1566 #define ACL_REVISION 2
1567 #define ACL_REVISION_DS 4
1569 #define ACL_REVISION1 1
1570 #define ACL_REVISION2 2
1571 #define ACL_REVISION3 3
1572 #define ACL_REVISION4 4
1573 #define MIN_ACL_REVISION ACL_REVISION2
1574 #define MAX_ACL_REVISION ACL_REVISION4
1576 typedef struct _ACL
{
1584 /* Current security descriptor revision value */
1585 #define SECURITY_DESCRIPTOR_REVISION (1)
1586 #define SECURITY_DESCRIPTOR_REVISION1 (1)
1588 /* Privilege attributes */
1589 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
1590 #define SE_PRIVILEGE_ENABLED (0x00000002L)
1591 #define SE_PRIVILEGE_REMOVED (0X00000004L)
1592 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
1594 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
1595 SE_PRIVILEGE_ENABLED | \
1596 SE_PRIVILEGE_REMOVED | \
1597 SE_PRIVILEGE_USED_FOR_ACCESS)
1599 #include <pshpack4.h>
1600 typedef struct _LUID_AND_ATTRIBUTES
{
1603 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
1604 #include <poppack.h>
1606 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
1607 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
1609 /* Privilege sets */
1610 #define PRIVILEGE_SET_ALL_NECESSARY (1)
1612 typedef struct _PRIVILEGE_SET
{
1613 ULONG PrivilegeCount
;
1615 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
1616 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
1618 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
1620 SecurityIdentification
,
1621 SecurityImpersonation
,
1623 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
1625 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
1626 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
1627 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
1628 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
1630 #define SECURITY_DYNAMIC_TRACKING (TRUE)
1631 #define SECURITY_STATIC_TRACKING (FALSE)
1633 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
1635 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
1637 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
1638 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
1639 BOOLEAN EffectiveOnly
;
1640 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
1642 typedef struct _SE_IMPERSONATION_STATE
{
1643 PACCESS_TOKEN Token
;
1645 BOOLEAN EffectiveOnly
;
1646 SECURITY_IMPERSONATION_LEVEL Level
;
1647 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
1649 #define OWNER_SECURITY_INFORMATION (0x00000001L)
1650 #define GROUP_SECURITY_INFORMATION (0x00000002L)
1651 #define DACL_SECURITY_INFORMATION (0x00000004L)
1652 #define SACL_SECURITY_INFORMATION (0x00000008L)
1653 #define LABEL_SECURITY_INFORMATION (0x00000010L)
1655 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
1656 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
1657 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
1658 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
1660 typedef enum _SECURITY_OPERATION_CODE
{
1661 SetSecurityDescriptor
,
1662 QuerySecurityDescriptor
,
1663 DeleteSecurityDescriptor
,
1664 AssignSecurityDescriptor
1665 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
1667 #define INITIAL_PRIVILEGE_COUNT 3
1669 typedef struct _INITIAL_PRIVILEGE_SET
{
1670 ULONG PrivilegeCount
;
1672 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
1673 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
1675 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
1676 #define SE_CREATE_TOKEN_PRIVILEGE 2
1677 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
1678 #define SE_LOCK_MEMORY_PRIVILEGE 4
1679 #define SE_INCREASE_QUOTA_PRIVILEGE 5
1680 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
1681 #define SE_TCB_PRIVILEGE 7
1682 #define SE_SECURITY_PRIVILEGE 8
1683 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
1684 #define SE_LOAD_DRIVER_PRIVILEGE 10
1685 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
1686 #define SE_SYSTEMTIME_PRIVILEGE 12
1687 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
1688 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
1689 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
1690 #define SE_CREATE_PERMANENT_PRIVILEGE 16
1691 #define SE_BACKUP_PRIVILEGE 17
1692 #define SE_RESTORE_PRIVILEGE 18
1693 #define SE_SHUTDOWN_PRIVILEGE 19
1694 #define SE_DEBUG_PRIVILEGE 20
1695 #define SE_AUDIT_PRIVILEGE 21
1696 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
1697 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
1698 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
1699 #define SE_UNDOCK_PRIVILEGE 25
1700 #define SE_SYNC_AGENT_PRIVILEGE 26
1701 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
1702 #define SE_MANAGE_VOLUME_PRIVILEGE 28
1703 #define SE_IMPERSONATE_PRIVILEGE 29
1704 #define SE_CREATE_GLOBAL_PRIVILEGE 30
1705 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
1706 #define SE_RELABEL_PRIVILEGE 32
1707 #define SE_INC_WORKING_SET_PRIVILEGE 33
1708 #define SE_TIME_ZONE_PRIVILEGE 34
1709 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
1710 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
1712 typedef struct _SECURITY_SUBJECT_CONTEXT
{
1713 PACCESS_TOKEN ClientToken
;
1714 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
1715 PACCESS_TOKEN PrimaryToken
;
1716 PVOID ProcessAuditId
;
1717 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
1719 typedef struct _ACCESS_STATE
{
1721 BOOLEAN SecurityEvaluated
;
1722 BOOLEAN GenerateAudit
;
1723 BOOLEAN GenerateOnClose
;
1724 BOOLEAN PrivilegesAllocated
;
1726 ACCESS_MASK RemainingDesiredAccess
;
1727 ACCESS_MASK PreviouslyGrantedAccess
;
1728 ACCESS_MASK OriginalDesiredAccess
;
1729 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
1730 PSECURITY_DESCRIPTOR SecurityDescriptor
;
1733 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
1734 PRIVILEGE_SET PrivilegeSet
;
1736 BOOLEAN AuditPrivileges
;
1737 UNICODE_STRING ObjectName
;
1738 UNICODE_STRING ObjectTypeName
;
1739 } ACCESS_STATE
, *PACCESS_STATE
;
1743 #ifndef _NTLSA_AUDIT_
1744 #define _NTLSA_AUDIT_
1746 #define SE_MAX_AUDIT_PARAMETERS 32
1747 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
1749 #define SE_ADT_OBJECT_ONLY 0x1
1751 #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
1752 #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
1753 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
1754 #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
1755 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
1757 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
1758 ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
1759 (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
1761 typedef enum _SE_ADT_PARAMETER_TYPE
{
1762 SeAdtParmTypeNone
= 0,
1763 SeAdtParmTypeString
,
1764 SeAdtParmTypeFileSpec
,
1767 SeAdtParmTypeLogonId
,
1768 SeAdtParmTypeNoLogonId
,
1769 SeAdtParmTypeAccessMask
,
1771 SeAdtParmTypeObjectTypes
,
1772 SeAdtParmTypeHexUlong
,
1777 SeAdtParmTypeHexInt64
,
1778 SeAdtParmTypeStringList
,
1779 SeAdtParmTypeSidList
,
1780 SeAdtParmTypeDuration
,
1781 SeAdtParmTypeUserAccountControl
,
1783 SeAdtParmTypeMessage
,
1784 SeAdtParmTypeDateTime
,
1785 SeAdtParmTypeSockAddr
,
1787 SeAdtParmTypeLogonHours
,
1788 SeAdtParmTypeLogonIdNoSid
,
1789 SeAdtParmTypeUlongNoConv
,
1790 SeAdtParmTypeSockAddrNoPort
,
1791 SeAdtParmTypeAccessReason
1792 } SE_ADT_PARAMETER_TYPE
, *PSE_ADT_PARAMETER_TYPE
;
1794 typedef struct _SE_ADT_OBJECT_TYPE
{
1798 ACCESS_MASK AccessMask
;
1799 } SE_ADT_OBJECT_TYPE
, *PSE_ADT_OBJECT_TYPE
;
1801 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY
{
1802 SE_ADT_PARAMETER_TYPE Type
;
1806 } SE_ADT_PARAMETER_ARRAY_ENTRY
, *PSE_ADT_PARAMETER_ARRAY_ENTRY
;
1808 typedef struct _SE_ADT_ACCESS_REASON
{
1809 ACCESS_MASK AccessMask
;
1810 ULONG AccessReasons
[32];
1811 ULONG ObjectTypeIndex
;
1812 ULONG AccessGranted
;
1813 PSECURITY_DESCRIPTOR SecurityDescriptor
;
1814 } SE_ADT_ACCESS_REASON
, *PSE_ADT_ACCESS_REASON
;
1816 typedef struct _SE_ADT_PARAMETER_ARRAY
{
1819 ULONG ParameterCount
;
1821 USHORT FlatSubCategoryId
;
1824 SE_ADT_PARAMETER_ARRAY_ENTRY Parameters
[ SE_MAX_AUDIT_PARAMETERS
];
1825 } SE_ADT_PARAMETER_ARRAY
, *PSE_ADT_PARAMETER_ARRAY
;
1827 #endif /* !_NTLSA_AUDIT_ */
1828 #endif /* !_NTLSA_IFS_ */
1831 /******************************************************************************
1832 * Power Management Support Types *
1833 ******************************************************************************/
1838 /* Power States/Levels */
1839 typedef enum _SYSTEM_POWER_STATE
{
1840 PowerSystemUnspecified
,
1842 PowerSystemSleeping1
,
1843 PowerSystemSleeping2
,
1844 PowerSystemSleeping3
,
1845 PowerSystemHibernate
,
1846 PowerSystemShutdown
,
1848 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
1850 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
1852 typedef enum _POWER_INFORMATION_LEVEL
{
1853 SystemPowerPolicyAc
,
1854 SystemPowerPolicyDc
,
1855 VerifySystemPolicyAc
,
1856 VerifySystemPolicyDc
,
1857 SystemPowerCapabilities
,
1859 SystemPowerStateHandler
,
1860 ProcessorStateHandler
,
1861 SystemPowerPolicyCurrent
,
1862 AdministratorPowerPolicy
,
1863 SystemReserveHiberFile
,
1864 ProcessorInformation
,
1865 SystemPowerInformation
,
1866 ProcessorStateHandler2
,
1869 SystemExecutionState
,
1870 SystemPowerStateNotifyHandler
,
1871 ProcessorPowerPolicyAc
,
1872 ProcessorPowerPolicyDc
,
1873 VerifyProcessorPowerPolicyAc
,
1874 VerifyProcessorPowerPolicyDc
,
1875 ProcessorPowerPolicyCurrent
,
1876 SystemPowerStateLogging
,
1877 SystemPowerLoggingEntry
,
1878 SetPowerSettingValue
,
1879 NotifyUserPowerSetting
,
1880 PowerInformationLevelUnused0
,
1881 PowerInformationLevelUnused1
,
1883 TraceApplicationPowerMessage
,
1884 TraceApplicationPowerMessageEnd
,
1885 ProcessorPerfStates
,
1886 ProcessorIdleStates
,
1889 SystemHiberFileInformation
,
1890 TraceServicePowerMessage
,
1892 PowerShutdownNotification
,
1893 MonitorCapabilities
,
1895 SessionDisplayState
,
1898 GetPowerRequestList
,
1899 ProcessorInformationEx
,
1900 NotifyUserModeLegacyPowerEvent
,
1902 ProcessorIdleDomains
,
1904 SystemHiberFileSize
,
1905 PowerInformationLevelMaximum
1906 } POWER_INFORMATION_LEVEL
;
1910 PowerActionReserved
,
1912 PowerActionHibernate
,
1913 PowerActionShutdown
,
1914 PowerActionShutdownReset
,
1915 PowerActionShutdownOff
,
1916 PowerActionWarmEject
1917 } POWER_ACTION
, *PPOWER_ACTION
;
1919 typedef enum _DEVICE_POWER_STATE
{
1920 PowerDeviceUnspecified
,
1926 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
1928 typedef union _POWER_STATE
{
1929 SYSTEM_POWER_STATE SystemState
;
1930 DEVICE_POWER_STATE DeviceState
;
1931 } POWER_STATE
, *PPOWER_STATE
;
1933 typedef enum _POWER_STATE_TYPE
{
1934 SystemPowerState
= 0,
1936 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
1938 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
1942 } BATTERY_REPORTING_SCALE
, *PBATTERY_REPORTING_SCALE
;
1943 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
1945 #endif /* !_PO_DDK_ */
1948 (NTAPI
*PREQUEST_POWER_COMPLETE
)(
1949 IN
struct _DEVICE_OBJECT
*DeviceObject
,
1950 IN UCHAR MinorFunction
,
1951 IN POWER_STATE PowerState
,
1953 IN
struct _IO_STATUS_BLOCK
*IoStatus
);
1957 (NTAPI
*PPOWER_SETTING_CALLBACK
)(
1958 IN LPCGUID SettingGuid
,
1960 IN ULONG ValueLength
,
1961 IN OUT PVOID Context OPTIONAL
);
1964 /******************************************************************************
1965 * Configuration Manager Types *
1966 ******************************************************************************/
1968 /* Resource list definitions */
1969 typedef int CM_RESOURCE_TYPE
;
1971 #define CmResourceTypeNull 0
1972 #define CmResourceTypePort 1
1973 #define CmResourceTypeInterrupt 2
1974 #define CmResourceTypeMemory 3
1975 #define CmResourceTypeDma 4
1976 #define CmResourceTypeDeviceSpecific 5
1977 #define CmResourceTypeBusNumber 6
1978 #define CmResourceTypeNonArbitrated 128
1979 #define CmResourceTypeConfigData 128
1980 #define CmResourceTypeDevicePrivate 129
1981 #define CmResourceTypePcCardConfig 130
1982 #define CmResourceTypeMfCardConfig 131
1984 /* KEY_VALUE_Xxx.Type */
1987 #define REG_EXPAND_SZ 2
1988 #define REG_BINARY 3
1990 #define REG_DWORD_LITTLE_ENDIAN 4
1991 #define REG_DWORD_BIG_ENDIAN 5
1993 #define REG_MULTI_SZ 7
1994 #define REG_RESOURCE_LIST 8
1995 #define REG_FULL_RESOURCE_DESCRIPTOR 9
1996 #define REG_RESOURCE_REQUIREMENTS_LIST 10
1997 #define REG_QWORD 11
1998 #define REG_QWORD_LITTLE_ENDIAN 11
2000 /* Registry Access Rights */
2001 #define KEY_QUERY_VALUE (0x0001)
2002 #define KEY_SET_VALUE (0x0002)
2003 #define KEY_CREATE_SUB_KEY (0x0004)
2004 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
2005 #define KEY_NOTIFY (0x0010)
2006 #define KEY_CREATE_LINK (0x0020)
2007 #define KEY_WOW64_32KEY (0x0200)
2008 #define KEY_WOW64_64KEY (0x0100)
2009 #define KEY_WOW64_RES (0x0300)
2011 #define KEY_READ ((STANDARD_RIGHTS_READ |\
2013 KEY_ENUMERATE_SUB_KEYS |\
2018 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
2020 KEY_CREATE_SUB_KEY) \
2024 #define KEY_EXECUTE ((KEY_READ) \
2028 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
2031 KEY_CREATE_SUB_KEY |\
2032 KEY_ENUMERATE_SUB_KEYS |\
2038 /* Registry Open/Create Options */
2039 #define REG_OPTION_RESERVED (0x00000000L)
2040 #define REG_OPTION_NON_VOLATILE (0x00000000L)
2041 #define REG_OPTION_VOLATILE (0x00000001L)
2042 #define REG_OPTION_CREATE_LINK (0x00000002L)
2043 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
2044 #define REG_OPTION_OPEN_LINK (0x00000008L)
2046 #define REG_LEGAL_OPTION \
2047 (REG_OPTION_RESERVED |\
2048 REG_OPTION_NON_VOLATILE |\
2049 REG_OPTION_VOLATILE |\
2050 REG_OPTION_CREATE_LINK |\
2051 REG_OPTION_BACKUP_RESTORE |\
2052 REG_OPTION_OPEN_LINK)
2054 /* Key creation/open disposition */
2055 #define REG_CREATED_NEW_KEY (0x00000001L)
2056 #define REG_OPENED_EXISTING_KEY (0x00000002L)
2058 /* Key restore & hive load flags */
2059 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
2060 #define REG_REFRESH_HIVE (0x00000002L)
2061 #define REG_NO_LAZY_FLUSH (0x00000004L)
2062 #define REG_FORCE_RESTORE (0x00000008L)
2063 #define REG_APP_HIVE (0x00000010L)
2064 #define REG_PROCESS_PRIVATE (0x00000020L)
2065 #define REG_START_JOURNAL (0x00000040L)
2066 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
2067 #define REG_HIVE_NO_RM (0x00000100L)
2068 #define REG_HIVE_SINGLE_LOG (0x00000200L)
2071 #define REG_FORCE_UNLOAD 1
2073 /* Notify Filter Values */
2074 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
2075 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
2076 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
2077 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
2079 #define REG_LEGAL_CHANGE_FILTER \
2080 (REG_NOTIFY_CHANGE_NAME |\
2081 REG_NOTIFY_CHANGE_ATTRIBUTES |\
2082 REG_NOTIFY_CHANGE_LAST_SET |\
2083 REG_NOTIFY_CHANGE_SECURITY)
2085 typedef struct _CM_FLOPPY_DEVICE_DATA
{
2091 UCHAR StepRateHeadUnloadTime
;
2094 UCHAR SectorLengthCode
;
2095 UCHAR SectorPerTrack
;
2096 UCHAR ReadWriteGapLength
;
2097 UCHAR DataTransferLength
;
2098 UCHAR FormatGapLength
;
2099 UCHAR FormatFillCharacter
;
2100 UCHAR HeadSettleTime
;
2101 UCHAR MotorSettleTime
;
2102 UCHAR MaximumTrackValue
;
2103 UCHAR DataTransferRate
;
2104 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
2106 #include <pshpack4.h>
2107 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
2109 UCHAR ShareDisposition
;
2113 PHYSICAL_ADDRESS Start
;
2117 PHYSICAL_ADDRESS Start
;
2121 #if defined(NT_PROCESSOR_GROUPS)
2130 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2132 __GNU_EXTENSION
union {
2134 #if defined(NT_PROCESSOR_GROUPS)
2139 USHORT MessageCount
;
2144 #if defined(NT_PROCESSOR_GROUPS)
2157 PHYSICAL_ADDRESS Start
;
2177 } DeviceSpecificData
;
2178 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2180 PHYSICAL_ADDRESS Start
;
2184 PHYSICAL_ADDRESS Start
;
2188 PHYSICAL_ADDRESS Start
;
2193 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
2194 #include <poppack.h>
2196 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
2197 #define CmResourceTypeNull 0
2198 #define CmResourceTypePort 1
2199 #define CmResourceTypeInterrupt 2
2200 #define CmResourceTypeMemory 3
2201 #define CmResourceTypeDma 4
2202 #define CmResourceTypeDeviceSpecific 5
2203 #define CmResourceTypeBusNumber 6
2204 #define CmResourceTypeMemoryLarge 7
2205 #define CmResourceTypeNonArbitrated 128
2206 #define CmResourceTypeConfigData 128
2207 #define CmResourceTypeDevicePrivate 129
2208 #define CmResourceTypePcCardConfig 130
2209 #define CmResourceTypeMfCardConfig 131
2211 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
2212 typedef enum _CM_SHARE_DISPOSITION
{
2213 CmResourceShareUndetermined
,
2214 CmResourceShareDeviceExclusive
,
2215 CmResourceShareDriverExclusive
,
2216 CmResourceShareShared
2217 } CM_SHARE_DISPOSITION
;
2219 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
2220 #define CM_RESOURCE_PORT_MEMORY 0x0000
2221 #define CM_RESOURCE_PORT_IO 0x0001
2222 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
2223 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
2224 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
2225 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
2226 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
2227 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
2228 #define CM_RESOURCE_PORT_BAR 0x0100
2230 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
2231 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
2232 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
2233 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
2234 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
2236 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
2237 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
2238 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
2239 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
2240 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
2241 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
2242 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
2243 #define CM_RESOURCE_MEMORY_24 0x0010
2244 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
2245 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
2246 #define CM_RESOURCE_MEMORY_BAR 0x0080
2247 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
2249 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
2250 #define CM_RESOURCE_DMA_8 0x0000
2251 #define CM_RESOURCE_DMA_16 0x0001
2252 #define CM_RESOURCE_DMA_32 0x0002
2253 #define CM_RESOURCE_DMA_8_AND_16 0x0004
2254 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
2255 #define CM_RESOURCE_DMA_TYPE_A 0x0010
2256 #define CM_RESOURCE_DMA_TYPE_B 0x0020
2257 #define CM_RESOURCE_DMA_TYPE_F 0x0040
2259 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
2263 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
2264 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
2266 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
2267 INTERFACE_TYPE InterfaceType
;
2269 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
2270 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
2272 typedef struct _CM_RESOURCE_LIST
{
2274 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
2275 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
2277 #include <pshpack1.h>
2278 typedef struct _CM_INT13_DRIVE_PARAMETER
{
2281 USHORT SectorsPerTrack
;
2283 USHORT NumberDrives
;
2284 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
2286 typedef struct _CM_PNP_BIOS_DEVICE_NODE
{
2290 UCHAR DeviceType
[3];
2291 USHORT DeviceAttributes
;
2292 } CM_PNP_BIOS_DEVICE_NODE
,*PCM_PNP_BIOS_DEVICE_NODE
;
2294 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
{
2298 USHORT ControlField
;
2300 ULONG EventFlagAddress
;
2301 USHORT RealModeEntryOffset
;
2302 USHORT RealModeEntrySegment
;
2303 USHORT ProtectedModeEntryOffset
;
2304 ULONG ProtectedModeCodeBaseAddress
;
2306 USHORT RealModeDataBaseAddress
;
2307 ULONG ProtectedModeDataBaseAddress
;
2308 } CM_PNP_BIOS_INSTALLATION_CHECK
, *PCM_PNP_BIOS_INSTALLATION_CHECK
;
2309 #include <poppack.h>
2311 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
{
2312 ULONG BytesPerSector
;
2313 ULONG NumberOfCylinders
;
2314 ULONG SectorsPerTrack
;
2315 ULONG NumberOfHeads
;
2316 } CM_DISK_GEOMETRY_DEVICE_DATA
, *PCM_DISK_GEOMETRY_DEVICE_DATA
;
2318 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
2323 USHORT KeyboardFlags
;
2324 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
2326 typedef struct _CM_MCA_POS_DATA
{
2332 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
2334 #if (NTDDI_VERSION >= NTDDI_WINXP)
2335 typedef struct CM_Power_Data_s
{
2337 DEVICE_POWER_STATE PD_MostRecentPowerState
;
2338 ULONG PD_Capabilities
;
2342 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
2343 SYSTEM_POWER_STATE PD_DeepestSystemWake
;
2344 } CM_POWER_DATA
, *PCM_POWER_DATA
;
2346 #define PDCAP_D0_SUPPORTED 0x00000001
2347 #define PDCAP_D1_SUPPORTED 0x00000002
2348 #define PDCAP_D2_SUPPORTED 0x00000004
2349 #define PDCAP_D3_SUPPORTED 0x00000008
2350 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2351 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2352 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2353 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2354 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2356 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2358 typedef struct _CM_SCSI_DEVICE_DATA
{
2361 UCHAR HostIdentifier
;
2362 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
2364 typedef struct _CM_SERIAL_DEVICE_DATA
{
2368 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
2370 typedef enum _KEY_INFORMATION_CLASS
{
2371 KeyBasicInformation
,
2375 KeyCachedInformation
,
2377 } KEY_INFORMATION_CLASS
;
2379 typedef struct _KEY_BASIC_INFORMATION
{
2380 LARGE_INTEGER LastWriteTime
;
2384 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
2386 typedef struct _KEY_FULL_INFORMATION
{
2387 LARGE_INTEGER LastWriteTime
;
2395 ULONG MaxValueNameLen
;
2396 ULONG MaxValueDataLen
;
2398 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
2400 typedef struct _KEY_NODE_INFORMATION
{
2401 LARGE_INTEGER LastWriteTime
;
2407 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
2409 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
2414 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
2416 typedef struct _KEY_VALUE_FULL_INFORMATION
{
2423 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
2425 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
2430 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
2432 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
2436 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
2438 typedef struct _KEY_VALUE_ENTRY
{
2439 PUNICODE_STRING ValueName
;
2443 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
2445 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
2446 KeyValueBasicInformation
,
2447 KeyValueFullInformation
,
2448 KeyValuePartialInformation
,
2449 KeyValueFullInformationAlign64
,
2450 KeyValuePartialInformationAlign64
2451 } KEY_VALUE_INFORMATION_CLASS
;
2453 typedef struct _KEY_WRITE_TIME_INFORMATION
{
2454 LARGE_INTEGER LastWriteTime
;
2455 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
2457 typedef enum _KEY_SET_INFORMATION_CLASS
{
2458 KeyWriteTimeInformation
,
2459 KeyWow64FlagsInformation
,
2460 KeyControlFlagsInformation
,
2461 KeySetVirtualizationInformation
,
2462 KeySetDebugInformation
,
2463 KeySetHandleTagsInformation
,
2465 } KEY_SET_INFORMATION_CLASS
;
2467 typedef enum _REG_NOTIFY_CLASS
{
2469 RegNtPreDeleteKey
= RegNtDeleteKey
,
2471 RegNtPreSetValueKey
= RegNtSetValueKey
,
2472 RegNtDeleteValueKey
,
2473 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
2474 RegNtSetInformationKey
,
2475 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
2477 RegNtPreRenameKey
= RegNtRenameKey
,
2479 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
2480 RegNtEnumerateValueKey
,
2481 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
2483 RegNtPreQueryKey
= RegNtQueryKey
,
2485 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
2486 RegNtQueryMultipleValueKey
,
2487 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
2492 RegNtKeyHandleClose
,
2493 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
2495 RegNtPostSetValueKey
,
2496 RegNtPostDeleteValueKey
,
2497 RegNtPostSetInformationKey
,
2499 RegNtPostEnumerateKey
,
2500 RegNtPostEnumerateValueKey
,
2502 RegNtPostQueryValueKey
,
2503 RegNtPostQueryMultipleValueKey
,
2504 RegNtPostKeyHandleClose
,
2505 RegNtPreCreateKeyEx
,
2506 RegNtPostCreateKeyEx
,
2515 RegNtPreQueryKeySecurity
,
2516 RegNtPostQueryKeySecurity
,
2517 RegNtPreSetKeySecurity
,
2518 RegNtPostSetKeySecurity
,
2519 RegNtCallbackObjectContextCleanup
,
2521 RegNtPostRestoreKey
,
2525 RegNtPostReplaceKey
,
2527 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
2530 (NTAPI
*PEX_CALLBACK_FUNCTION
)(
2531 IN PVOID CallbackContext
,
2533 IN PVOID Argument2
);
2535 typedef struct _REG_DELETE_KEY_INFORMATION
{
2538 PVOID ObjectContext
;
2540 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
2541 #if (NTDDI_VERSION >= NTDDI_VISTA)
2542 , REG_FLUSH_KEY_INFORMATION
, *PREG_FLUSH_KEY_INFORMATION
2546 typedef struct _REG_SET_VALUE_KEY_INFORMATION
{
2548 PUNICODE_STRING ValueName
;
2554 PVOID ObjectContext
;
2556 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
2558 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
{
2560 PUNICODE_STRING ValueName
;
2562 PVOID ObjectContext
;
2564 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
2566 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
{
2568 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
2569 PVOID KeySetInformation
;
2570 ULONG KeySetInformationLength
;
2572 PVOID ObjectContext
;
2574 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
2576 typedef struct _REG_ENUMERATE_KEY_INFORMATION
{
2579 KEY_INFORMATION_CLASS KeyInformationClass
;
2580 PVOID KeyInformation
;
2582 PULONG ResultLength
;
2584 PVOID ObjectContext
;
2586 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
2588 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
{
2591 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
2592 PVOID KeyValueInformation
;
2594 PULONG ResultLength
;
2596 PVOID ObjectContext
;
2598 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
2600 typedef struct _REG_QUERY_KEY_INFORMATION
{
2602 KEY_INFORMATION_CLASS KeyInformationClass
;
2603 PVOID KeyInformation
;
2605 PULONG ResultLength
;
2607 PVOID ObjectContext
;
2609 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
2611 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
{
2613 PUNICODE_STRING ValueName
;
2614 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
2615 PVOID KeyValueInformation
;
2617 PULONG ResultLength
;
2619 PVOID ObjectContext
;
2621 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
2623 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
{
2625 PKEY_VALUE_ENTRY ValueEntries
;
2628 PULONG BufferLength
;
2629 PULONG RequiredBufferLength
;
2631 PVOID ObjectContext
;
2633 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
2635 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
{
2636 PUNICODE_STRING CompleteName
;
2637 } REG_PRE_CREATE_KEY_INFORMATION
, REG_PRE_OPEN_KEY_INFORMATION
,*PREG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;;
2639 typedef struct _REG_POST_CREATE_KEY_INFORMATION
{
2640 PUNICODE_STRING CompleteName
;
2643 } REG_POST_CREATE_KEY_INFORMATION
,REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
2645 typedef struct _REG_POST_OPERATION_INFORMATION
{
2648 PVOID PreInformation
;
2649 NTSTATUS ReturnStatus
;
2651 PVOID ObjectContext
;
2653 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
2655 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
{
2658 PVOID ObjectContext
;
2660 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
2664 /******************************************************************************
2665 * I/O Manager Types *
2666 ******************************************************************************/
2668 /* PCI_COMMON_CONFIG.Command */
2669 #define PCI_ENABLE_IO_SPACE 0x0001
2670 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2671 #define PCI_ENABLE_BUS_MASTER 0x0004
2672 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2673 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2674 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2675 #define PCI_ENABLE_PARITY 0x0040
2676 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2677 #define PCI_ENABLE_SERR 0x0100
2678 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2679 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
2681 /* PCI_COMMON_CONFIG.Status */
2682 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
2683 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2684 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2685 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2686 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2687 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2688 #define PCI_STATUS_DEVSEL 0x0600
2689 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2690 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2691 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2692 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2693 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2695 /* PCI_COMMON_CONFIG.HeaderType */
2696 #define PCI_MULTIFUNCTION 0x80
2697 #define PCI_DEVICE_TYPE 0x00
2698 #define PCI_BRIDGE_TYPE 0x01
2699 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2701 #define PCI_CONFIGURATION_TYPE(PciData) \
2702 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2704 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2705 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2707 /* PCI device classes */
2708 #define PCI_CLASS_PRE_20 0x00
2709 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
2710 #define PCI_CLASS_NETWORK_CTLR 0x02
2711 #define PCI_CLASS_DISPLAY_CTLR 0x03
2712 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
2713 #define PCI_CLASS_MEMORY_CTLR 0x05
2714 #define PCI_CLASS_BRIDGE_DEV 0x06
2715 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
2716 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
2717 #define PCI_CLASS_INPUT_DEV 0x09
2718 #define PCI_CLASS_DOCKING_STATION 0x0a
2719 #define PCI_CLASS_PROCESSOR 0x0b
2720 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
2721 #define PCI_CLASS_WIRELESS_CTLR 0x0d
2722 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
2723 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
2724 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
2725 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
2727 /* PCI device subclasses for class 0 */
2728 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
2729 #define PCI_SUBCLASS_PRE_20_VGA 0x01
2731 /* PCI device subclasses for class 1 (mass storage controllers)*/
2732 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
2733 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
2734 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
2735 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
2736 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
2737 #define PCI_SUBCLASS_MSC_OTHER 0x80
2739 /* PCI device subclasses for class 2 (network controllers)*/
2740 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
2741 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
2742 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
2743 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
2744 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
2745 #define PCI_SUBCLASS_NET_OTHER 0x80
2747 /* PCI device subclasses for class 3 (display controllers)*/
2748 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
2749 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
2750 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
2751 #define PCI_SUBCLASS_VID_OTHER 0x80
2753 /* PCI device subclasses for class 4 (multimedia device)*/
2754 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
2755 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
2756 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
2757 #define PCI_SUBCLASS_MM_OTHER 0x80
2759 /* PCI device subclasses for class 5 (memory controller)*/
2760 #define PCI_SUBCLASS_MEM_RAM 0x00
2761 #define PCI_SUBCLASS_MEM_FLASH 0x01
2762 #define PCI_SUBCLASS_MEM_OTHER 0x80
2764 /* PCI device subclasses for class 6 (bridge device)*/
2765 #define PCI_SUBCLASS_BR_HOST 0x00
2766 #define PCI_SUBCLASS_BR_ISA 0x01
2767 #define PCI_SUBCLASS_BR_EISA 0x02
2768 #define PCI_SUBCLASS_BR_MCA 0x03
2769 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
2770 #define PCI_SUBCLASS_BR_PCMCIA 0x05
2771 #define PCI_SUBCLASS_BR_NUBUS 0x06
2772 #define PCI_SUBCLASS_BR_CARDBUS 0x07
2773 #define PCI_SUBCLASS_BR_RACEWAY 0x08
2774 #define PCI_SUBCLASS_BR_OTHER 0x80
2776 /* PCI device subclasses for class C (serial bus controller)*/
2777 #define PCI_SUBCLASS_SB_IEEE1394 0x00
2778 #define PCI_SUBCLASS_SB_ACCESS 0x01
2779 #define PCI_SUBCLASS_SB_SSA 0x02
2780 #define PCI_SUBCLASS_SB_USB 0x03
2781 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
2782 #define PCI_SUBCLASS_SB_SMBUS 0x05
2784 #define PCI_MAX_DEVICES 32
2785 #define PCI_MAX_FUNCTION 8
2786 #define PCI_MAX_BRIDGE_NUMBER 0xFF
2787 #define PCI_INVALID_VENDORID 0xFFFF
2788 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
2790 #define PCI_ADDRESS_IO_SPACE 0x00000001
2791 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
2792 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
2793 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
2794 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
2795 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
2797 #define PCI_TYPE_32BIT 0
2798 #define PCI_TYPE_20BIT 2
2799 #define PCI_TYPE_64BIT 4
2801 #define POOL_COLD_ALLOCATION 256
2802 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
2803 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
2805 #define PCI_TYPE0_ADDRESSES 6
2806 #define PCI_TYPE1_ADDRESSES 2
2807 #define PCI_TYPE2_ADDRESSES 5
2809 #define IO_TYPE_ADAPTER 1
2810 #define IO_TYPE_CONTROLLER 2
2811 #define IO_TYPE_DEVICE 3
2812 #define IO_TYPE_DRIVER 4
2813 #define IO_TYPE_FILE 5
2814 #define IO_TYPE_IRP 6
2815 #define IO_TYPE_MASTER_ADAPTER 7
2816 #define IO_TYPE_OPEN_PACKET 8
2817 #define IO_TYPE_TIMER 9
2818 #define IO_TYPE_VPB 10
2819 #define IO_TYPE_ERROR_LOG 11
2820 #define IO_TYPE_ERROR_MESSAGE 12
2821 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
2823 #define IO_TYPE_CSQ_IRP_CONTEXT 1
2824 #define IO_TYPE_CSQ 2
2825 #define IO_TYPE_CSQ_EX 3
2827 /* IO_RESOURCE_DESCRIPTOR.Option */
2828 #define IO_RESOURCE_PREFERRED 0x01
2829 #define IO_RESOURCE_DEFAULT 0x02
2830 #define IO_RESOURCE_ALTERNATIVE 0x08
2832 /* DEVICE_OBJECT.Flags */
2833 #define DO_VERIFY_VOLUME 0x00000002
2834 #define DO_BUFFERED_IO 0x00000004
2835 #define DO_EXCLUSIVE 0x00000008
2836 #define DO_DIRECT_IO 0x00000010
2837 #define DO_MAP_IO_BUFFER 0x00000020
2838 #define DO_DEVICE_INITIALIZING 0x00000080
2839 #define DO_SHUTDOWN_REGISTERED 0x00000800
2840 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
2841 #define DO_POWER_PAGABLE 0x00002000
2842 #define DO_POWER_INRUSH 0x00004000
2844 /* DEVICE_OBJECT.Characteristics */
2845 #define FILE_REMOVABLE_MEDIA 0x00000001
2846 #define FILE_READ_ONLY_DEVICE 0x00000002
2847 #define FILE_FLOPPY_DISKETTE 0x00000004
2848 #define FILE_WRITE_ONCE_MEDIA 0x00000008
2849 #define FILE_REMOTE_DEVICE 0x00000010
2850 #define FILE_DEVICE_IS_MOUNTED 0x00000020
2851 #define FILE_VIRTUAL_VOLUME 0x00000040
2852 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
2853 #define FILE_DEVICE_SECURE_OPEN 0x00000100
2854 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
2855 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
2856 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
2858 /* DEVICE_OBJECT.AlignmentRequirement */
2859 #define FILE_BYTE_ALIGNMENT 0x00000000
2860 #define FILE_WORD_ALIGNMENT 0x00000001
2861 #define FILE_LONG_ALIGNMENT 0x00000003
2862 #define FILE_QUAD_ALIGNMENT 0x00000007
2863 #define FILE_OCTA_ALIGNMENT 0x0000000f
2864 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
2865 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
2866 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
2867 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
2868 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
2870 /* DEVICE_OBJECT.DeviceType */
2871 #define DEVICE_TYPE ULONG
2873 #define FILE_DEVICE_BEEP 0x00000001
2874 #define FILE_DEVICE_CD_ROM 0x00000002
2875 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
2876 #define FILE_DEVICE_CONTROLLER 0x00000004
2877 #define FILE_DEVICE_DATALINK 0x00000005
2878 #define FILE_DEVICE_DFS 0x00000006
2879 #define FILE_DEVICE_DISK 0x00000007
2880 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
2881 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
2882 #define FILE_DEVICE_INPORT_PORT 0x0000000a
2883 #define FILE_DEVICE_KEYBOARD 0x0000000b
2884 #define FILE_DEVICE_MAILSLOT 0x0000000c
2885 #define FILE_DEVICE_MIDI_IN 0x0000000d
2886 #define FILE_DEVICE_MIDI_OUT 0x0000000e
2887 #define FILE_DEVICE_MOUSE 0x0000000f
2888 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
2889 #define FILE_DEVICE_NAMED_PIPE 0x00000011
2890 #define FILE_DEVICE_NETWORK 0x00000012
2891 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
2892 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
2893 #define FILE_DEVICE_NULL 0x00000015
2894 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
2895 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
2896 #define FILE_DEVICE_PRINTER 0x00000018
2897 #define FILE_DEVICE_SCANNER 0x00000019
2898 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
2899 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
2900 #define FILE_DEVICE_SCREEN 0x0000001c
2901 #define FILE_DEVICE_SOUND 0x0000001d
2902 #define FILE_DEVICE_STREAMS 0x0000001e
2903 #define FILE_DEVICE_TAPE 0x0000001f
2904 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
2905 #define FILE_DEVICE_TRANSPORT 0x00000021
2906 #define FILE_DEVICE_UNKNOWN 0x00000022
2907 #define FILE_DEVICE_VIDEO 0x00000023
2908 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
2909 #define FILE_DEVICE_WAVE_IN 0x00000025
2910 #define FILE_DEVICE_WAVE_OUT 0x00000026
2911 #define FILE_DEVICE_8042_PORT 0x00000027
2912 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
2913 #define FILE_DEVICE_BATTERY 0x00000029
2914 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
2915 #define FILE_DEVICE_MODEM 0x0000002b
2916 #define FILE_DEVICE_VDM 0x0000002c
2917 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
2918 #define FILE_DEVICE_SMB 0x0000002e
2919 #define FILE_DEVICE_KS 0x0000002f
2920 #define FILE_DEVICE_CHANGER 0x00000030
2921 #define FILE_DEVICE_SMARTCARD 0x00000031
2922 #define FILE_DEVICE_ACPI 0x00000032
2923 #define FILE_DEVICE_DVD 0x00000033
2924 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
2925 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
2926 #define FILE_DEVICE_DFS_VOLUME 0x00000036
2927 #define FILE_DEVICE_SERENUM 0x00000037
2928 #define FILE_DEVICE_TERMSRV 0x00000038
2929 #define FILE_DEVICE_KSEC 0x00000039
2930 #define FILE_DEVICE_FIPS 0x0000003A
2931 #define FILE_DEVICE_INFINIBAND 0x0000003B
2932 #define FILE_DEVICE_VMBUS 0x0000003E
2933 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
2934 #define FILE_DEVICE_WPD 0x00000040
2935 #define FILE_DEVICE_BLUETOOTH 0x00000041
2936 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
2937 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
2938 #define FILE_DEVICE_BIOMETRIC 0x00000044
2939 #define FILE_DEVICE_PMI 0x00000045
2941 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
2943 typedef struct _OBJECT_HANDLE_INFORMATION
{
2944 ULONG HandleAttributes
;
2945 ACCESS_MASK GrantedAccess
;
2946 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
2948 typedef struct _CLIENT_ID
{
2949 HANDLE UniqueProcess
;
2950 HANDLE UniqueThread
;
2951 } CLIENT_ID
, *PCLIENT_ID
;
2954 (NTAPI
*PKSTART_ROUTINE
)(
2955 IN PVOID StartContext
);
2957 typedef struct _VPB
{
2961 USHORT VolumeLabelLength
;
2962 struct _DEVICE_OBJECT
*DeviceObject
;
2963 struct _DEVICE_OBJECT
*RealDevice
;
2965 ULONG ReferenceCount
;
2966 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
2969 typedef enum _IO_ALLOCATION_ACTION
{
2972 DeallocateObjectKeepRegisters
2973 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
2975 typedef IO_ALLOCATION_ACTION
2976 (NTAPI
*PDRIVER_CONTROL
)(
2977 IN
struct _DEVICE_OBJECT
*DeviceObject
,
2978 IN
struct _IRP
*Irp
,
2979 IN PVOID MapRegisterBase
,
2982 typedef struct _WAIT_CONTEXT_BLOCK
{
2983 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
2984 PDRIVER_CONTROL DeviceRoutine
;
2985 PVOID DeviceContext
;
2986 ULONG NumberOfMapRegisters
;
2989 PKDPC BufferChainingDpc
;
2990 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
2992 typedef struct _DEVICE_OBJECT
{
2995 LONG ReferenceCount
;
2996 struct _DRIVER_OBJECT
*DriverObject
;
2997 struct _DEVICE_OBJECT
*NextDevice
;
2998 struct _DEVICE_OBJECT
*AttachedDevice
;
2999 struct _IRP
*CurrentIrp
;
3002 ULONG Characteristics
;
3004 PVOID DeviceExtension
;
3005 DEVICE_TYPE DeviceType
;
3008 LIST_ENTRY ListEntry
;
3009 WAIT_CONTEXT_BLOCK Wcb
;
3011 ULONG AlignmentRequirement
;
3012 KDEVICE_QUEUE DeviceQueue
;
3014 ULONG ActiveThreadCount
;
3015 PSECURITY_DESCRIPTOR SecurityDescriptor
;
3019 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
3021 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
3023 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
3025 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
3027 BOOLEAN Reserved
[3];
3028 volatile LONG IoCount
;
3030 } IO_REMOVE_LOCK_COMMON_BLOCK
;
3032 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
3035 LONGLONG MaxLockedTicks
;
3037 LIST_ENTRY LockList
;
3039 volatile LONG LowMemoryCount
;
3042 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
3043 } IO_REMOVE_LOCK_DBG_BLOCK
;
3045 typedef struct _IO_REMOVE_LOCK
{
3046 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
3048 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
3050 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
3052 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
3055 (NTAPI IO_WORKITEM_ROUTINE
)(
3056 IN PDEVICE_OBJECT DeviceObject
,
3058 typedef IO_WORKITEM_ROUTINE
*PIO_WORKITEM_ROUTINE
;
3060 typedef struct _SHARE_ACCESS
{
3068 } SHARE_ACCESS
, *PSHARE_ACCESS
;
3070 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
3071 inheritance, even from a struct renders the type non-POD. So we use
3073 #define PCI_COMMON_HEADER_LAYOUT \
3082 UCHAR CacheLineSize; \
3083 UCHAR LatencyTimer; \
3087 struct _PCI_HEADER_TYPE_0 { \
3088 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
3090 USHORT SubVendorID; \
3091 USHORT SubSystemID; \
3092 ULONG ROMBaseAddress; \
3093 UCHAR CapabilitiesPtr; \
3094 UCHAR Reserved1[3]; \
3096 UCHAR InterruptLine; \
3097 UCHAR InterruptPin; \
3098 UCHAR MinimumGrant; \
3099 UCHAR MaximumLatency; \
3101 struct _PCI_HEADER_TYPE_1 { \
3102 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
3104 UCHAR SecondaryBus; \
3105 UCHAR SubordinateBus; \
3106 UCHAR SecondaryLatency; \
3109 USHORT SecondaryStatus; \
3110 USHORT MemoryBase; \
3111 USHORT MemoryLimit; \
3112 USHORT PrefetchBase; \
3113 USHORT PrefetchLimit; \
3114 ULONG PrefetchBaseUpper32; \
3115 ULONG PrefetchLimitUpper32; \
3116 USHORT IOBaseUpper16; \
3117 USHORT IOLimitUpper16; \
3118 UCHAR CapabilitiesPtr; \
3119 UCHAR Reserved1[3]; \
3120 ULONG ROMBaseAddress; \
3121 UCHAR InterruptLine; \
3122 UCHAR InterruptPin; \
3123 USHORT BridgeControl; \
3125 struct _PCI_HEADER_TYPE_2 { \
3126 ULONG SocketRegistersBaseAddress; \
3127 UCHAR CapabilitiesPtr; \
3129 USHORT SecondaryStatus; \
3131 UCHAR SecondaryBus; \
3132 UCHAR SubordinateBus; \
3133 UCHAR SecondaryLatency; \
3137 } Range[PCI_TYPE2_ADDRESSES-1]; \
3138 UCHAR InterruptLine; \
3139 UCHAR InterruptPin; \
3140 USHORT BridgeControl; \
3144 typedef struct _PCI_CAPABILITIES_HEADER
{
3147 } PCI_CAPABILITIES_HEADER
, *PPCI_CAPABILITIES_HEADER
;
3149 typedef struct _PCI_COMMON_HEADER
{
3150 PCI_COMMON_HEADER_LAYOUT
3151 } PCI_COMMON_HEADER
, *PPCI_COMMON_HEADER
;
3154 typedef struct _PCI_COMMON_CONFIG
{
3155 PCI_COMMON_HEADER_LAYOUT
3156 UCHAR DeviceSpecific
[192];
3157 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
3159 typedef struct _PCI_COMMON_CONFIG
{
3160 PCI_COMMON_HEADER DUMMYSTRUCTNAME
;
3161 UCHAR DeviceSpecific
[192];
3162 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
3165 typedef enum _CREATE_FILE_TYPE
{
3167 CreateFileTypeNamedPipe
,
3168 CreateFileTypeMailslot
3171 #define IO_FORCE_ACCESS_CHECK 0x001
3172 #define IO_NO_PARAMETER_CHECKING 0x100
3174 #define IO_REPARSE 0x0
3175 #define IO_REMOUNT 0x1
3177 typedef struct _IO_STATUS_BLOCK
{
3178 _ANONYMOUS_UNION
union {
3182 ULONG_PTR Information
;
3183 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
3185 typedef struct _PCI_SLOT_NUMBER
{
3188 ULONG DeviceNumber
:5;
3189 ULONG FunctionNumber
:3;
3194 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
3197 (NTAPI
*PIO_APC_ROUTINE
)(
3198 IN PVOID ApcContext
,
3199 IN PIO_STATUS_BLOCK IoStatusBlock
,
3203 (NTAPI
*WMI_NOTIFICATION_CALLBACK
)(
3207 #define EVENT_INCREMENT 1
3208 #define IO_NO_INCREMENT 0
3209 #define IO_CD_ROM_INCREMENT 1
3210 #define IO_DISK_INCREMENT 1
3211 #define IO_KEYBOARD_INCREMENT 6
3212 #define IO_MAILSLOT_INCREMENT 2
3213 #define IO_MOUSE_INCREMENT 6
3214 #define IO_NAMED_PIPE_INCREMENT 2
3215 #define IO_NETWORK_INCREMENT 2
3216 #define IO_PARALLEL_INCREMENT 1
3217 #define IO_SERIAL_INCREMENT 2
3218 #define IO_SOUND_INCREMENT 8
3219 #define IO_VIDEO_INCREMENT 1
3220 #define SEMAPHORE_INCREMENT 1
3222 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
3224 typedef struct _BOOTDISK_INFORMATION
{
3225 LONGLONG BootPartitionOffset
;
3226 LONGLONG SystemPartitionOffset
;
3227 ULONG BootDeviceSignature
;
3228 ULONG SystemDeviceSignature
;
3229 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
3231 typedef struct _BOOTDISK_INFORMATION_EX
{
3232 LONGLONG BootPartitionOffset
;
3233 LONGLONG SystemPartitionOffset
;
3234 ULONG BootDeviceSignature
;
3235 ULONG SystemDeviceSignature
;
3236 GUID BootDeviceGuid
;
3237 GUID SystemDeviceGuid
;
3238 BOOLEAN BootDeviceIsGpt
;
3239 BOOLEAN SystemDeviceIsGpt
;
3240 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
3242 typedef struct _EISA_MEMORY_TYPE
{
3249 UCHAR MoreEntries
:1;
3250 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
3252 #include <pshpack1.h>
3253 typedef struct _EISA_MEMORY_CONFIGURATION
{
3254 EISA_MEMORY_TYPE ConfigurationByte
;
3256 USHORT AddressLowWord
;
3257 UCHAR AddressHighByte
;
3259 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
3260 #include <poppack.h>
3262 typedef struct _EISA_IRQ_DESCRIPTOR
{
3265 UCHAR LevelTriggered
:1;
3267 UCHAR MoreEntries
:1;
3268 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
3270 typedef struct _EISA_IRQ_CONFIGURATION
{
3271 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
3273 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
3275 typedef struct _DMA_CONFIGURATION_BYTE0
{
3279 UCHAR MoreEntries
:1;
3280 } DMA_CONFIGURATION_BYTE0
;
3282 typedef struct _DMA_CONFIGURATION_BYTE1
{
3284 UCHAR TransferSize
:2;
3287 } DMA_CONFIGURATION_BYTE1
;
3289 typedef struct _EISA_DMA_CONFIGURATION
{
3290 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
3291 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
3292 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
3294 #include <pshpack1.h>
3295 typedef struct _EISA_PORT_DESCRIPTOR
{
3296 UCHAR NumberPorts
:5;
3299 UCHAR MoreEntries
:1;
3300 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
3302 typedef struct _EISA_PORT_CONFIGURATION
{
3303 EISA_PORT_DESCRIPTOR Configuration
;
3305 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
3306 #include <poppack.h>
3308 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
3312 UCHAR MinorRevision
;
3313 UCHAR MajorRevision
;
3314 UCHAR Selections
[26];
3315 UCHAR FunctionFlags
;
3316 UCHAR TypeString
[80];
3317 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
3318 EISA_IRQ_CONFIGURATION EisaIrq
[7];
3319 EISA_DMA_CONFIGURATION EisaDma
[4];
3320 EISA_PORT_CONFIGURATION EisaPort
[20];
3321 UCHAR InitializationData
[60];
3322 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
3324 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
3326 #define EISA_FUNCTION_ENABLED 0x80
3327 #define EISA_FREE_FORM_DATA 0x40
3328 #define EISA_HAS_PORT_INIT_ENTRY 0x20
3329 #define EISA_HAS_PORT_RANGE 0x10
3330 #define EISA_HAS_DMA_ENTRY 0x08
3331 #define EISA_HAS_IRQ_ENTRY 0x04
3332 #define EISA_HAS_MEMORY_ENTRY 0x02
3333 #define EISA_HAS_TYPE_ENTRY 0x01
3334 #define EISA_HAS_INFORMATION \
3335 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
3336 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
3338 typedef struct _CM_EISA_SLOT_INFORMATION
{
3341 UCHAR MajorRevision
;
3342 UCHAR MinorRevision
;
3344 UCHAR NumberFunctions
;
3345 UCHAR FunctionInformation
;
3347 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
3349 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
3351 #define EISA_INVALID_SLOT 0x80
3352 #define EISA_INVALID_FUNCTION 0x81
3353 #define EISA_INVALID_CONFIGURATION 0x82
3354 #define EISA_EMPTY_SLOT 0x83
3355 #define EISA_INVALID_BIOS_CALL 0x86
3358 ** Plug and Play structures
3362 (NTAPI
*PINTERFACE_REFERENCE
)(
3366 (NTAPI
*PINTERFACE_DEREFERENCE
)(
3370 (NTAPI
*PTRANSLATE_BUS_ADDRESS
)(
3372 IN PHYSICAL_ADDRESS BusAddress
,
3374 IN OUT PULONG AddressSpace
,
3375 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
3377 typedef struct _DMA_ADAPTER
*
3378 (NTAPI
*PGET_DMA_ADAPTER
)(
3380 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
3381 OUT PULONG NumberOfMapRegisters
);
3384 (NTAPI
*PGET_SET_DEVICE_DATA
)(
3391 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
3392 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
3393 #define PCI_USE_REVISION 0x00000002
3394 #define PCI_USE_VENDEV_IDS 0x00000004
3395 #define PCI_USE_CLASS_SUBCLASS 0x00000008
3396 #define PCI_USE_PROGIF 0x00000010
3397 #define PCI_USE_LOCAL_BUS 0x00000020
3398 #define PCI_USE_LOCAL_DEVICE 0x00000040
3400 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS
{
3411 } PCI_DEVICE_PRESENCE_PARAMETERS
, *PPCI_DEVICE_PRESENCE_PARAMETERS
;
3414 (NTAPI
*PPCI_IS_DEVICE_PRESENT
)(
3417 IN UCHAR RevisionID
,
3418 IN USHORT SubVendorID
,
3419 IN USHORT SubSystemID
,
3423 (NTAPI
*PPCI_IS_DEVICE_PRESENT_EX
)(
3425 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
);
3427 typedef struct _BUS_INTERFACE_STANDARD
{
3431 PINTERFACE_REFERENCE InterfaceReference
;
3432 PINTERFACE_DEREFERENCE InterfaceDereference
;
3433 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
3434 PGET_DMA_ADAPTER GetDmaAdapter
;
3435 PGET_SET_DEVICE_DATA SetBusData
;
3436 PGET_SET_DEVICE_DATA GetBusData
;
3437 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
3439 typedef struct _PCI_DEVICE_PRESENT_INTERFACE
{
3443 PINTERFACE_REFERENCE InterfaceReference
;
3444 PINTERFACE_DEREFERENCE InterfaceDereference
;
3445 PPCI_IS_DEVICE_PRESENT IsDevicePresent
;
3446 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx
;
3447 } PCI_DEVICE_PRESENT_INTERFACE
, *PPCI_DEVICE_PRESENT_INTERFACE
;
3449 typedef struct _DEVICE_CAPABILITIES
{
3454 ULONG LockSupported
:1;
3455 ULONG EjectSupported
:1;
3459 ULONG SilentInstall
:1;
3460 ULONG RawDeviceOK
:1;
3461 ULONG SurpriseRemovalOK
:1;
3466 ULONG HardwareDisabled
:1;
3468 ULONG WarmEjectSupported
:1;
3469 ULONG NoDisplayInUI
:1;
3473 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
3474 SYSTEM_POWER_STATE SystemWake
;
3475 DEVICE_POWER_STATE DeviceWake
;
3479 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
3481 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
3485 GUID InterfaceClassGuid
;
3486 PUNICODE_STRING SymbolicLinkName
;
3487 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
3489 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
3493 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
3497 typedef struct _INTERFACE
{
3501 PINTERFACE_REFERENCE InterfaceReference
;
3502 PINTERFACE_DEREFERENCE InterfaceDereference
;
3503 } INTERFACE
, *PINTERFACE
;
3505 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
3509 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
3511 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
3513 /* PNP_DEVICE_STATE */
3515 #define PNP_DEVICE_DISABLED 0x00000001
3516 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
3517 #define PNP_DEVICE_FAILED 0x00000004
3518 #define PNP_DEVICE_REMOVED 0x00000008
3519 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
3520 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
3522 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
3526 struct _FILE_OBJECT
*FileObject
;
3527 LONG NameBufferOffset
;
3528 UCHAR CustomDataBuffer
[1];
3529 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
3531 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
3535 struct _FILE_OBJECT
*FileObject
;
3536 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
3538 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
3539 DeviceUsageTypeUndefined
,
3540 DeviceUsageTypePaging
,
3541 DeviceUsageTypeHibernation
,
3542 DeviceUsageTypeDumpFile
3543 } DEVICE_USAGE_NOTIFICATION_TYPE
;
3545 typedef struct _POWER_SEQUENCE
{
3549 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
3552 DevicePropertyDeviceDescription
= 0x0,
3553 DevicePropertyHardwareID
= 0x1,
3554 DevicePropertyCompatibleIDs
= 0x2,
3555 DevicePropertyBootConfiguration
= 0x3,
3556 DevicePropertyBootConfigurationTranslated
= 0x4,
3557 DevicePropertyClassName
= 0x5,
3558 DevicePropertyClassGuid
= 0x6,
3559 DevicePropertyDriverKeyName
= 0x7,
3560 DevicePropertyManufacturer
= 0x8,
3561 DevicePropertyFriendlyName
= 0x9,
3562 DevicePropertyLocationInformation
= 0xa,
3563 DevicePropertyPhysicalDeviceObjectName
= 0xb,
3564 DevicePropertyBusTypeGuid
= 0xc,
3565 DevicePropertyLegacyBusType
= 0xd,
3566 DevicePropertyBusNumber
= 0xe,
3567 DevicePropertyEnumeratorName
= 0xf,
3568 DevicePropertyAddress
= 0x10,
3569 DevicePropertyUINumber
= 0x11,
3570 DevicePropertyInstallState
= 0x12,
3571 DevicePropertyRemovalPolicy
= 0x13,
3572 DevicePropertyResourceRequirements
= 0x14,
3573 DevicePropertyAllocatedResources
= 0x15,
3574 DevicePropertyContainerID
= 0x16
3575 } DEVICE_REGISTRY_PROPERTY
;
3577 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
3578 EventCategoryReserved
,
3579 EventCategoryHardwareProfileChange
,
3580 EventCategoryDeviceInterfaceChange
,
3581 EventCategoryTargetDeviceChange
3582 } IO_NOTIFICATION_EVENT_CATEGORY
;
3584 typedef enum _IO_PRIORITY_HINT
{
3585 IoPriorityVeryLow
= 0,
3593 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
3596 (NTAPI
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
3597 IN PVOID NotificationStructure
,
3601 (NTAPI
*PDEVICE_CHANGE_COMPLETE_CALLBACK
)(
3604 typedef enum _FILE_INFORMATION_CLASS
{
3605 FileDirectoryInformation
= 1,
3606 FileFullDirectoryInformation
,
3607 FileBothDirectoryInformation
,
3608 FileBasicInformation
,
3609 FileStandardInformation
,
3610 FileInternalInformation
,
3612 FileAccessInformation
,
3613 FileNameInformation
,
3614 FileRenameInformation
,
3615 FileLinkInformation
,
3616 FileNamesInformation
,
3617 FileDispositionInformation
,
3618 FilePositionInformation
,
3619 FileFullEaInformation
,
3620 FileModeInformation
,
3621 FileAlignmentInformation
,
3623 FileAllocationInformation
,
3624 FileEndOfFileInformation
,
3625 FileAlternateNameInformation
,
3626 FileStreamInformation
,
3627 FilePipeInformation
,
3628 FilePipeLocalInformation
,
3629 FilePipeRemoteInformation
,
3630 FileMailslotQueryInformation
,
3631 FileMailslotSetInformation
,
3632 FileCompressionInformation
,
3633 FileObjectIdInformation
,
3634 FileCompletionInformation
,
3635 FileMoveClusterInformation
,
3636 FileQuotaInformation
,
3637 FileReparsePointInformation
,
3638 FileNetworkOpenInformation
,
3639 FileAttributeTagInformation
,
3640 FileTrackingInformation
,
3641 FileIdBothDirectoryInformation
,
3642 FileIdFullDirectoryInformation
,
3643 FileValidDataLengthInformation
,
3644 FileShortNameInformation
,
3645 FileIoCompletionNotificationInformation
,
3646 FileIoStatusBlockRangeInformation
,
3647 FileIoPriorityHintInformation
,
3648 FileSfioReserveInformation
,
3649 FileSfioVolumeInformation
,
3650 FileHardLinkInformation
,
3651 FileProcessIdsUsingFileInformation
,
3652 FileNormalizedNameInformation
,
3653 FileNetworkPhysicalNameInformation
,
3654 FileIdGlobalTxDirectoryInformation
,
3655 FileIsRemoteDeviceInformation
,
3656 FileAttributeCacheInformation
,
3657 FileNumaNodeInformation
,
3658 FileStandardLinkInformation
,
3659 FileRemoteProtocolInformation
,
3660 FileMaximumInformation
3661 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
3663 typedef struct _FILE_POSITION_INFORMATION
{
3664 LARGE_INTEGER CurrentByteOffset
;
3665 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
3667 #include <pshpack8.h>
3668 typedef struct _FILE_BASIC_INFORMATION
{
3669 LARGE_INTEGER CreationTime
;
3670 LARGE_INTEGER LastAccessTime
;
3671 LARGE_INTEGER LastWriteTime
;
3672 LARGE_INTEGER ChangeTime
;
3673 ULONG FileAttributes
;
3674 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
3675 #include <poppack.h>
3677 typedef struct _FILE_STANDARD_INFORMATION
{
3678 LARGE_INTEGER AllocationSize
;
3679 LARGE_INTEGER EndOfFile
;
3680 ULONG NumberOfLinks
;
3681 BOOLEAN DeletePending
;
3683 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
3685 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
3686 LARGE_INTEGER CreationTime
;
3687 LARGE_INTEGER LastAccessTime
;
3688 LARGE_INTEGER LastWriteTime
;
3689 LARGE_INTEGER ChangeTime
;
3690 LARGE_INTEGER AllocationSize
;
3691 LARGE_INTEGER EndOfFile
;
3692 ULONG FileAttributes
;
3693 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
3695 typedef enum _FSINFOCLASS
{
3696 FileFsVolumeInformation
= 1,
3697 FileFsLabelInformation
,
3698 FileFsSizeInformation
,
3699 FileFsDeviceInformation
,
3700 FileFsAttributeInformation
,
3701 FileFsControlInformation
,
3702 FileFsFullSizeInformation
,
3703 FileFsObjectIdInformation
,
3704 FileFsDriverPathInformation
,
3705 FileFsVolumeFlagsInformation
,
3706 FileFsMaximumInformation
3707 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
3709 typedef struct _FILE_FS_DEVICE_INFORMATION
{
3710 DEVICE_TYPE DeviceType
;
3711 ULONG Characteristics
;
3712 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
3714 typedef struct _FILE_FULL_EA_INFORMATION
{
3715 ULONG NextEntryOffset
;
3718 USHORT EaValueLength
;
3720 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
3722 #define FM_LOCK_BIT (0x1)
3723 #define FM_LOCK_BIT_V (0x0)
3724 #define FM_LOCK_WAITER_WOKEN (0x2)
3725 #define FM_LOCK_WAITER_INC (0x4)
3727 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
3729 typedef struct _OWNER_ENTRY
{
3730 ERESOURCE_THREAD OwnerThread
;
3731 _ANONYMOUS_UNION
union {
3735 } OWNER_ENTRY
, *POWNER_ENTRY
;
3737 typedef struct _ERESOURCE
{
3738 LIST_ENTRY SystemResourcesList
;
3739 POWNER_ENTRY OwnerTable
;
3742 volatile PKSEMAPHORE SharedWaiters
;
3743 volatile PKEVENT ExclusiveWaiters
;
3744 OWNER_ENTRY OwnerEntry
;
3745 ULONG ActiveEntries
;
3746 ULONG ContentionCount
;
3747 ULONG NumberOfSharedWaiters
;
3748 ULONG NumberOfExclusiveWaiters
;
3749 __GNU_EXTENSION
union {
3751 ULONG_PTR CreatorBackTraceIndex
;
3753 KSPIN_LOCK SpinLock
;
3754 } ERESOURCE
, *PERESOURCE
;
3756 /* ERESOURCE.Flag */
3757 #define ResourceNeverExclusive 0x0010
3758 #define ResourceReleaseByOtherThread 0x0020
3759 #define ResourceOwnedExclusive 0x0080
3761 #define RESOURCE_HASH_TABLE_SIZE 64
3764 (NTAPI
*PFAST_IO_CHECK_IF_POSSIBLE
)(
3765 IN
struct _FILE_OBJECT
*FileObject
,
3766 IN PLARGE_INTEGER FileOffset
,
3770 IN BOOLEAN CheckForReadOperation
,
3771 OUT PIO_STATUS_BLOCK IoStatus
,
3772 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3775 (NTAPI
*PFAST_IO_READ
)(
3776 IN
struct _FILE_OBJECT
*FileObject
,
3777 IN PLARGE_INTEGER FileOffset
,
3782 OUT PIO_STATUS_BLOCK IoStatus
,
3783 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3786 (NTAPI
*PFAST_IO_WRITE
)(
3787 IN
struct _FILE_OBJECT
*FileObject
,
3788 IN PLARGE_INTEGER FileOffset
,
3793 OUT PIO_STATUS_BLOCK IoStatus
,
3794 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3797 (NTAPI
*PFAST_IO_QUERY_BASIC_INFO
)(
3798 IN
struct _FILE_OBJECT
*FileObject
,
3800 OUT PFILE_BASIC_INFORMATION Buffer
,
3801 OUT PIO_STATUS_BLOCK IoStatus
,
3802 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3805 (NTAPI
*PFAST_IO_QUERY_STANDARD_INFO
)(
3806 IN
struct _FILE_OBJECT
*FileObject
,
3808 OUT PFILE_STANDARD_INFORMATION Buffer
,
3809 OUT PIO_STATUS_BLOCK IoStatus
,
3810 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3813 (NTAPI
*PFAST_IO_LOCK
)(
3814 IN
struct _FILE_OBJECT
*FileObject
,
3815 IN PLARGE_INTEGER FileOffset
,
3816 IN PLARGE_INTEGER Length
,
3817 PEPROCESS ProcessId
,
3819 BOOLEAN FailImmediately
,
3820 BOOLEAN ExclusiveLock
,
3821 OUT PIO_STATUS_BLOCK IoStatus
,
3822 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3825 (NTAPI
*PFAST_IO_UNLOCK_SINGLE
)(
3826 IN
struct _FILE_OBJECT
*FileObject
,
3827 IN PLARGE_INTEGER FileOffset
,
3828 IN PLARGE_INTEGER Length
,
3829 PEPROCESS ProcessId
,
3831 OUT PIO_STATUS_BLOCK IoStatus
,
3832 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3835 (NTAPI
*PFAST_IO_UNLOCK_ALL
)(
3836 IN
struct _FILE_OBJECT
*FileObject
,
3837 PEPROCESS ProcessId
,
3838 OUT PIO_STATUS_BLOCK IoStatus
,
3839 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3842 (NTAPI
*PFAST_IO_UNLOCK_ALL_BY_KEY
)(
3843 IN
struct _FILE_OBJECT
*FileObject
,
3846 OUT PIO_STATUS_BLOCK IoStatus
,
3847 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3850 (NTAPI
*PFAST_IO_DEVICE_CONTROL
)(
3851 IN
struct _FILE_OBJECT
*FileObject
,
3853 IN PVOID InputBuffer OPTIONAL
,
3854 IN ULONG InputBufferLength
,
3855 OUT PVOID OutputBuffer OPTIONAL
,
3856 IN ULONG OutputBufferLength
,
3857 IN ULONG IoControlCode
,
3858 OUT PIO_STATUS_BLOCK IoStatus
,
3859 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3862 (NTAPI
*PFAST_IO_ACQUIRE_FILE
)(
3863 IN
struct _FILE_OBJECT
*FileObject
);
3866 (NTAPI
*PFAST_IO_RELEASE_FILE
)(
3867 IN
struct _FILE_OBJECT
*FileObject
);
3870 (NTAPI
*PFAST_IO_DETACH_DEVICE
)(
3871 IN
struct _DEVICE_OBJECT
*SourceDevice
,
3872 IN
struct _DEVICE_OBJECT
*TargetDevice
);
3875 (NTAPI
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
)(
3876 IN
struct _FILE_OBJECT
*FileObject
,
3878 OUT
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
3879 OUT
struct _IO_STATUS_BLOCK
*IoStatus
,
3880 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3883 (NTAPI
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
3884 IN
struct _FILE_OBJECT
*FileObject
,
3885 IN PLARGE_INTEGER EndingOffset
,
3886 OUT
struct _ERESOURCE
**ResourceToRelease
,
3887 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3890 (NTAPI
*PFAST_IO_MDL_READ
)(
3891 IN
struct _FILE_OBJECT
*FileObject
,
3892 IN PLARGE_INTEGER FileOffset
,
3896 OUT PIO_STATUS_BLOCK IoStatus
,
3897 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3900 (NTAPI
*PFAST_IO_MDL_READ_COMPLETE
)(
3901 IN
struct _FILE_OBJECT
*FileObject
,
3903 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3906 (NTAPI
*PFAST_IO_PREPARE_MDL_WRITE
)(
3907 IN
struct _FILE_OBJECT
*FileObject
,
3908 IN PLARGE_INTEGER FileOffset
,
3912 OUT PIO_STATUS_BLOCK IoStatus
,
3913 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3916 (NTAPI
*PFAST_IO_MDL_WRITE_COMPLETE
)(
3917 IN
struct _FILE_OBJECT
*FileObject
,
3918 IN PLARGE_INTEGER FileOffset
,
3920 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3923 (NTAPI
*PFAST_IO_READ_COMPRESSED
)(
3924 IN
struct _FILE_OBJECT
*FileObject
,
3925 IN PLARGE_INTEGER FileOffset
,
3930 OUT PIO_STATUS_BLOCK IoStatus
,
3931 OUT
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
3932 IN ULONG CompressedDataInfoLength
,
3933 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3936 (NTAPI
*PFAST_IO_WRITE_COMPRESSED
)(
3937 IN
struct _FILE_OBJECT
*FileObject
,
3938 IN PLARGE_INTEGER FileOffset
,
3943 OUT PIO_STATUS_BLOCK IoStatus
,
3944 IN
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
3945 IN ULONG CompressedDataInfoLength
,
3946 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3949 (NTAPI
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
3950 IN
struct _FILE_OBJECT
*FileObject
,
3952 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3955 (NTAPI
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
3956 IN
struct _FILE_OBJECT
*FileObject
,
3957 IN PLARGE_INTEGER FileOffset
,
3959 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3962 (NTAPI
*PFAST_IO_QUERY_OPEN
)(
3963 IN
struct _IRP
*Irp
,
3964 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
3965 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3968 (NTAPI
*PFAST_IO_RELEASE_FOR_MOD_WRITE
)(
3969 IN
struct _FILE_OBJECT
*FileObject
,
3970 IN
struct _ERESOURCE
*ResourceToRelease
,
3971 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3974 (NTAPI
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
)(
3975 IN
struct _FILE_OBJECT
*FileObject
,
3976 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3979 (NTAPI
*PFAST_IO_RELEASE_FOR_CCFLUSH
) (
3980 IN
struct _FILE_OBJECT
*FileObject
,
3981 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3983 typedef struct _FAST_IO_DISPATCH
{
3984 ULONG SizeOfFastIoDispatch
;
3985 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
3986 PFAST_IO_READ FastIoRead
;
3987 PFAST_IO_WRITE FastIoWrite
;
3988 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
3989 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
3990 PFAST_IO_LOCK FastIoLock
;
3991 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
3992 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
3993 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
3994 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
3995 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
3996 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
3997 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
3998 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
3999 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
4000 PFAST_IO_MDL_READ MdlRead
;
4001 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
4002 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
4003 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
4004 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
4005 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
4006 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
4007 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
4008 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
4009 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
4010 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
4011 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
4012 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
4014 typedef struct _SECTION_OBJECT_POINTERS
{
4015 PVOID DataSectionObject
;
4016 PVOID SharedCacheMap
;
4017 PVOID ImageSectionObject
;
4018 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
4020 typedef struct _IO_COMPLETION_CONTEXT
{
4023 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
4025 /* FILE_OBJECT.Flags */
4026 #define FO_FILE_OPEN 0x00000001
4027 #define FO_SYNCHRONOUS_IO 0x00000002
4028 #define FO_ALERTABLE_IO 0x00000004
4029 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
4030 #define FO_WRITE_THROUGH 0x00000010
4031 #define FO_SEQUENTIAL_ONLY 0x00000020
4032 #define FO_CACHE_SUPPORTED 0x00000040
4033 #define FO_NAMED_PIPE 0x00000080
4034 #define FO_STREAM_FILE 0x00000100
4035 #define FO_MAILSLOT 0x00000200
4036 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
4037 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
4038 #define FO_DIRECT_DEVICE_OPEN 0x00000800
4039 #define FO_FILE_MODIFIED 0x00001000
4040 #define FO_FILE_SIZE_CHANGED 0x00002000
4041 #define FO_CLEANUP_COMPLETE 0x00004000
4042 #define FO_TEMPORARY_FILE 0x00008000
4043 #define FO_DELETE_ON_CLOSE 0x00010000
4044 #define FO_OPENED_CASE_SENSITIVE 0x00020000
4045 #define FO_HANDLE_CREATED 0x00040000
4046 #define FO_FILE_FAST_IO_READ 0x00080000
4047 #define FO_RANDOM_ACCESS 0x00100000
4048 #define FO_FILE_OPEN_CANCELLED 0x00200000
4049 #define FO_VOLUME_OPEN 0x00400000
4050 #define FO_REMOTE_ORIGIN 0x01000000
4051 #define FO_DISALLOW_EXCLUSIVE 0x02000000
4052 #define FO_SKIP_COMPLETION_PORT 0x02000000
4053 #define FO_SKIP_SET_EVENT 0x04000000
4054 #define FO_SKIP_SET_FAST_IO 0x08000000
4057 #define VPB_MOUNTED 0x0001
4058 #define VPB_LOCKED 0x0002
4059 #define VPB_PERSISTENT 0x0004
4060 #define VPB_REMOVE_PENDING 0x0008
4061 #define VPB_RAW_MOUNT 0x0010
4062 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
4066 #define SL_FORCE_ACCESS_CHECK 0x01
4067 #define SL_OPEN_PAGING_FILE 0x02
4068 #define SL_OPEN_TARGET_DIRECTORY 0x04
4069 #define SL_CASE_SENSITIVE 0x80
4071 #define SL_KEY_SPECIFIED 0x01
4072 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
4073 #define SL_WRITE_THROUGH 0x04
4074 #define SL_FT_SEQUENTIAL_WRITE 0x08
4076 #define SL_FAIL_IMMEDIATELY 0x01
4077 #define SL_EXCLUSIVE_LOCK 0x02
4079 #define SL_RESTART_SCAN 0x01
4080 #define SL_RETURN_SINGLE_ENTRY 0x02
4081 #define SL_INDEX_SPECIFIED 0x04
4083 #define SL_WATCH_TREE 0x01
4085 #define SL_ALLOW_RAW_MOUNT 0x01
4087 #define CTL_CODE(DeviceType, Function, Method, Access) \
4088 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
4090 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
4092 #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
4094 #define IRP_NOCACHE 0x00000001
4095 #define IRP_PAGING_IO 0x00000002
4096 #define IRP_MOUNT_COMPLETION 0x00000002
4097 #define IRP_SYNCHRONOUS_API 0x00000004
4098 #define IRP_ASSOCIATED_IRP 0x00000008
4099 #define IRP_BUFFERED_IO 0x00000010
4100 #define IRP_DEALLOCATE_BUFFER 0x00000020
4101 #define IRP_INPUT_OPERATION 0x00000040
4102 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
4103 #define IRP_CREATE_OPERATION 0x00000080
4104 #define IRP_READ_OPERATION 0x00000100
4105 #define IRP_WRITE_OPERATION 0x00000200
4106 #define IRP_CLOSE_OPERATION 0x00000400
4107 #define IRP_DEFER_IO_COMPLETION 0x00000800
4108 #define IRP_OB_QUERY_NAME 0x00001000
4109 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
4111 #define IRP_QUOTA_CHARGED 0x01
4112 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
4113 #define IRP_ALLOCATED_FIXED_SIZE 0x04
4114 #define IRP_LOOKASIDE_ALLOCATION 0x08
4117 ** IRP function codes
4120 #define IRP_MJ_CREATE 0x00
4121 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
4122 #define IRP_MJ_CLOSE 0x02
4123 #define IRP_MJ_READ 0x03
4124 #define IRP_MJ_WRITE 0x04
4125 #define IRP_MJ_QUERY_INFORMATION 0x05
4126 #define IRP_MJ_SET_INFORMATION 0x06
4127 #define IRP_MJ_QUERY_EA 0x07
4128 #define IRP_MJ_SET_EA 0x08
4129 #define IRP_MJ_FLUSH_BUFFERS 0x09
4130 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
4131 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
4132 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
4133 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
4134 #define IRP_MJ_DEVICE_CONTROL 0x0e
4135 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
4136 #define IRP_MJ_SCSI 0x0f
4137 #define IRP_MJ_SHUTDOWN 0x10
4138 #define IRP_MJ_LOCK_CONTROL 0x11
4139 #define IRP_MJ_CLEANUP 0x12
4140 #define IRP_MJ_CREATE_MAILSLOT 0x13
4141 #define IRP_MJ_QUERY_SECURITY 0x14
4142 #define IRP_MJ_SET_SECURITY 0x15
4143 #define IRP_MJ_POWER 0x16
4144 #define IRP_MJ_SYSTEM_CONTROL 0x17
4145 #define IRP_MJ_DEVICE_CHANGE 0x18
4146 #define IRP_MJ_QUERY_QUOTA 0x19
4147 #define IRP_MJ_SET_QUOTA 0x1a
4148 #define IRP_MJ_PNP 0x1b
4149 #define IRP_MJ_PNP_POWER 0x1b
4150 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
4152 #define IRP_MN_SCSI_CLASS 0x01
4154 #define IRP_MN_START_DEVICE 0x00
4155 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
4156 #define IRP_MN_REMOVE_DEVICE 0x02
4157 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
4158 #define IRP_MN_STOP_DEVICE 0x04
4159 #define IRP_MN_QUERY_STOP_DEVICE 0x05
4160 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
4162 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
4163 #define IRP_MN_QUERY_INTERFACE 0x08
4164 #define IRP_MN_QUERY_CAPABILITIES 0x09
4165 #define IRP_MN_QUERY_RESOURCES 0x0A
4166 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
4167 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
4168 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
4170 #define IRP_MN_READ_CONFIG 0x0F
4171 #define IRP_MN_WRITE_CONFIG 0x10
4172 #define IRP_MN_EJECT 0x11
4173 #define IRP_MN_SET_LOCK 0x12
4174 #define IRP_MN_QUERY_ID 0x13
4175 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
4176 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
4177 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
4178 #define IRP_MN_SURPRISE_REMOVAL 0x17
4180 #define IRP_MN_WAIT_WAKE 0x00
4181 #define IRP_MN_POWER_SEQUENCE 0x01
4182 #define IRP_MN_SET_POWER 0x02
4183 #define IRP_MN_QUERY_POWER 0x03
4185 #define IRP_MN_QUERY_ALL_DATA 0x00
4186 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
4187 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
4188 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
4189 #define IRP_MN_ENABLE_EVENTS 0x04
4190 #define IRP_MN_DISABLE_EVENTS 0x05
4191 #define IRP_MN_ENABLE_COLLECTION 0x06
4192 #define IRP_MN_DISABLE_COLLECTION 0x07
4193 #define IRP_MN_REGINFO 0x08
4194 #define IRP_MN_EXECUTE_METHOD 0x09
4196 #define IRP_MN_REGINFO_EX 0x0b
4198 typedef struct _FILE_OBJECT
{
4201 PDEVICE_OBJECT DeviceObject
;
4205 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
4206 PVOID PrivateCacheMap
;
4207 NTSTATUS FinalStatus
;
4208 struct _FILE_OBJECT
*RelatedFileObject
;
4209 BOOLEAN LockOperation
;
4210 BOOLEAN DeletePending
;
4212 BOOLEAN WriteAccess
;
4213 BOOLEAN DeleteAccess
;
4215 BOOLEAN SharedWrite
;
4216 BOOLEAN SharedDelete
;
4218 UNICODE_STRING FileName
;
4219 LARGE_INTEGER CurrentByteOffset
;
4220 volatile ULONG Waiters
;
4221 volatile ULONG Busy
;
4225 volatile PIO_COMPLETION_CONTEXT CompletionContext
;
4226 KSPIN_LOCK IrpListLock
;
4228 volatile PVOID FileObjectExtension
;
4229 } FILE_OBJECT
, *PFILE_OBJECT
;
4231 typedef struct _IO_ERROR_LOG_PACKET
{
4232 UCHAR MajorFunctionCode
;
4234 USHORT DumpDataSize
;
4235 USHORT NumberOfStrings
;
4236 USHORT StringOffset
;
4237 USHORT EventCategory
;
4239 ULONG UniqueErrorValue
;
4240 NTSTATUS FinalStatus
;
4241 ULONG SequenceNumber
;
4242 ULONG IoControlCode
;
4243 LARGE_INTEGER DeviceOffset
;
4245 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
4247 typedef struct _IO_ERROR_LOG_MESSAGE
{
4250 USHORT DriverNameLength
;
4251 LARGE_INTEGER TimeStamp
;
4252 ULONG DriverNameOffset
;
4253 IO_ERROR_LOG_PACKET EntryData
;
4254 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
4256 #define ERROR_LOG_LIMIT_SIZE 240
4257 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
4258 sizeof(IO_ERROR_LOG_PACKET) + \
4259 (sizeof(WCHAR) * 40))
4260 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
4261 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
4262 #define IO_ERROR_LOG_MESSAGE_LENGTH \
4263 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
4264 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
4265 PORT_MAXIMUM_MESSAGE_LENGTH)
4266 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
4267 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
4269 typedef enum _DMA_WIDTH
{
4274 } DMA_WIDTH
, *PDMA_WIDTH
;
4276 typedef enum _DMA_SPEED
{
4283 } DMA_SPEED
, *PDMA_SPEED
;
4285 /* DEVICE_DESCRIPTION.Version */
4287 #define DEVICE_DESCRIPTION_VERSION 0x0000
4288 #define DEVICE_DESCRIPTION_VERSION1 0x0001
4289 #define DEVICE_DESCRIPTION_VERSION2 0x0002
4291 typedef struct _DEVICE_DESCRIPTION
{
4294 BOOLEAN ScatterGather
;
4296 BOOLEAN AutoInitialize
;
4297 BOOLEAN Dma32BitAddresses
;
4298 BOOLEAN IgnoreCount
;
4300 BOOLEAN Dma64BitAddresses
;
4303 INTERFACE_TYPE InterfaceType
;
4306 ULONG MaximumLength
;
4308 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
4310 typedef enum _DEVICE_RELATION_TYPE
{
4315 TargetDeviceRelation
,
4318 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
4320 typedef struct _DEVICE_RELATIONS
{
4322 PDEVICE_OBJECT Objects
[1];
4323 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
4325 typedef struct _DEVOBJ_EXTENSION
{
4328 PDEVICE_OBJECT DeviceObject
;
4329 } DEVOBJ_EXTENSION
, *PDEVOBJ_EXTENSION
;
4331 typedef struct _SCATTER_GATHER_ELEMENT
{
4332 PHYSICAL_ADDRESS Address
;
4335 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
4337 #if defined(_MSC_EXTENSIONS)
4339 #if _MSC_VER >= 1200
4340 #pragma warning(push)
4342 #pragma warning(disable:4200)
4343 typedef struct _SCATTER_GATHER_LIST
{
4344 ULONG NumberOfElements
;
4346 SCATTER_GATHER_ELEMENT Elements
[1];
4347 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
4349 #if _MSC_VER >= 1200
4350 #pragma warning(pop)
4352 #pragma warning(default:4200)
4357 struct _SCATTER_GATHER_LIST
;
4358 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
4363 (NTAPI
*PDRIVER_ADD_DEVICE
)(
4364 IN
struct _DRIVER_OBJECT
*DriverObject
,
4365 IN
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
4367 typedef struct _DRIVER_EXTENSION
{
4368 struct _DRIVER_OBJECT
*DriverObject
;
4369 PDRIVER_ADD_DEVICE AddDevice
;
4371 UNICODE_STRING ServiceKeyName
;
4372 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
4374 #define DRVO_UNLOAD_INVOKED 0x00000001
4375 #define DRVO_LEGACY_DRIVER 0x00000002
4376 #define DRVO_BUILTIN_DRIVER 0x00000004
4379 (NTAPI
*PDRIVER_INITIALIZE
)(
4380 IN
struct _DRIVER_OBJECT
*DriverObject
,
4381 IN PUNICODE_STRING RegistryPath
);
4384 (NTAPI
*PDRIVER_STARTIO
)(
4385 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4386 IN
struct _IRP
*Irp
);
4389 (NTAPI
*PDRIVER_UNLOAD
)(
4390 IN
struct _DRIVER_OBJECT
*DriverObject
);
4393 (NTAPI
*PDRIVER_DISPATCH
)(
4394 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4395 IN
struct _IRP
*Irp
);
4397 typedef struct _DRIVER_OBJECT
{
4400 PDEVICE_OBJECT DeviceObject
;
4404 PVOID DriverSection
;
4405 PDRIVER_EXTENSION DriverExtension
;
4406 UNICODE_STRING DriverName
;
4407 PUNICODE_STRING HardwareDatabase
;
4408 struct _FAST_IO_DISPATCH
*FastIoDispatch
;
4409 PDRIVER_INITIALIZE DriverInit
;
4410 PDRIVER_STARTIO DriverStartIo
;
4411 PDRIVER_UNLOAD DriverUnload
;
4412 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
4413 } DRIVER_OBJECT
, *PDRIVER_OBJECT
;
4415 typedef struct _DMA_ADAPTER
{
4418 struct _DMA_OPERATIONS
* DmaOperations
;
4419 } DMA_ADAPTER
, *PDMA_ADAPTER
;
4422 (NTAPI
*PPUT_DMA_ADAPTER
)(
4423 IN PDMA_ADAPTER DmaAdapter
);
4426 (NTAPI
*PALLOCATE_COMMON_BUFFER
)(
4427 IN PDMA_ADAPTER DmaAdapter
,
4429 OUT PPHYSICAL_ADDRESS LogicalAddress
,
4430 IN BOOLEAN CacheEnabled
);
4433 (NTAPI
*PFREE_COMMON_BUFFER
)(
4434 IN PDMA_ADAPTER DmaAdapter
,
4436 IN PHYSICAL_ADDRESS LogicalAddress
,
4437 IN PVOID VirtualAddress
,
4438 IN BOOLEAN CacheEnabled
);
4441 (NTAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
4442 IN PDMA_ADAPTER DmaAdapter
,
4443 IN PDEVICE_OBJECT DeviceObject
,
4444 IN ULONG NumberOfMapRegisters
,
4445 IN PDRIVER_CONTROL ExecutionRoutine
,
4449 (NTAPI
*PFLUSH_ADAPTER_BUFFERS
)(
4450 IN PDMA_ADAPTER DmaAdapter
,
4452 IN PVOID MapRegisterBase
,
4455 IN BOOLEAN WriteToDevice
);
4458 (NTAPI
*PFREE_ADAPTER_CHANNEL
)(
4459 IN PDMA_ADAPTER DmaAdapter
);
4462 (NTAPI
*PFREE_MAP_REGISTERS
)(
4463 IN PDMA_ADAPTER DmaAdapter
,
4464 PVOID MapRegisterBase
,
4465 ULONG NumberOfMapRegisters
);
4467 typedef PHYSICAL_ADDRESS
4468 (NTAPI
*PMAP_TRANSFER
)(
4469 IN PDMA_ADAPTER DmaAdapter
,
4471 IN PVOID MapRegisterBase
,
4473 IN OUT PULONG Length
,
4474 IN BOOLEAN WriteToDevice
);
4477 (NTAPI
*PGET_DMA_ALIGNMENT
)(
4478 IN PDMA_ADAPTER DmaAdapter
);
4481 (NTAPI
*PREAD_DMA_COUNTER
)(
4482 IN PDMA_ADAPTER DmaAdapter
);
4485 (NTAPI
*PDRIVER_LIST_CONTROL
)(
4486 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4487 IN
struct _IRP
*Irp
,
4488 IN
struct _SCATTER_GATHER_LIST
*ScatterGather
,
4492 (NTAPI
*PGET_SCATTER_GATHER_LIST
)(
4493 IN PDMA_ADAPTER DmaAdapter
,
4494 IN PDEVICE_OBJECT DeviceObject
,
4498 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
4500 IN BOOLEAN WriteToDevice
);
4503 (NTAPI
*PPUT_SCATTER_GATHER_LIST
)(
4504 IN PDMA_ADAPTER DmaAdapter
,
4505 IN PSCATTER_GATHER_LIST ScatterGather
,
4506 IN BOOLEAN WriteToDevice
);
4509 (NTAPI
*PCALCULATE_SCATTER_GATHER_LIST_SIZE
)(
4510 IN PDMA_ADAPTER DmaAdapter
,
4511 IN PMDL Mdl OPTIONAL
,
4514 OUT PULONG ScatterGatherListSize
,
4515 OUT PULONG pNumberOfMapRegisters OPTIONAL
);
4518 (NTAPI
*PBUILD_SCATTER_GATHER_LIST
)(
4519 IN PDMA_ADAPTER DmaAdapter
,
4520 IN PDEVICE_OBJECT DeviceObject
,
4524 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
4526 IN BOOLEAN WriteToDevice
,
4527 IN PVOID ScatterGatherBuffer
,
4528 IN ULONG ScatterGatherLength
);
4531 (NTAPI
*PBUILD_MDL_FROM_SCATTER_GATHER_LIST
)(
4532 IN PDMA_ADAPTER DmaAdapter
,
4533 IN PSCATTER_GATHER_LIST ScatterGather
,
4534 IN PMDL OriginalMdl
,
4535 OUT PMDL
*TargetMdl
);
4537 typedef struct _DMA_OPERATIONS
{
4539 PPUT_DMA_ADAPTER PutDmaAdapter
;
4540 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
;
4541 PFREE_COMMON_BUFFER FreeCommonBuffer
;
4542 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
4543 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
4544 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
4545 PFREE_MAP_REGISTERS FreeMapRegisters
;
4546 PMAP_TRANSFER MapTransfer
;
4547 PGET_DMA_ALIGNMENT GetDmaAlignment
;
4548 PREAD_DMA_COUNTER ReadDmaCounter
;
4549 PGET_SCATTER_GATHER_LIST GetScatterGatherList
;
4550 PPUT_SCATTER_GATHER_LIST PutScatterGatherList
;
4551 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList
;
4552 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList
;
4553 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList
;
4554 } DMA_OPERATIONS
, *PDMA_OPERATIONS
;
4556 typedef struct _IO_RESOURCE_DESCRIPTOR
{
4559 UCHAR ShareDisposition
;
4567 PHYSICAL_ADDRESS MinimumAddress
;
4568 PHYSICAL_ADDRESS MaximumAddress
;
4573 PHYSICAL_ADDRESS MinimumAddress
;
4574 PHYSICAL_ADDRESS MaximumAddress
;
4577 ULONG MinimumVector
;
4578 ULONG MaximumVector
;
4581 ULONG MinimumChannel
;
4582 ULONG MaximumChannel
;
4587 PHYSICAL_ADDRESS MinimumAddress
;
4588 PHYSICAL_ADDRESS MaximumAddress
;
4605 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
4607 typedef struct _IO_RESOURCE_LIST
{
4611 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
4612 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
4614 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
4616 INTERFACE_TYPE InterfaceType
;
4620 ULONG AlternativeLists
;
4621 IO_RESOURCE_LIST List
[1];
4622 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
4625 (NTAPI
*PDRIVER_CANCEL
)(
4626 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4627 IN
struct _IRP
*Irp
);
4629 typedef struct _IRP
{
4632 struct _MDL
*MdlAddress
;
4635 struct _IRP
*MasterIrp
;
4636 volatile LONG IrpCount
;
4639 LIST_ENTRY ThreadListEntry
;
4640 IO_STATUS_BLOCK IoStatus
;
4641 KPROCESSOR_MODE RequestorMode
;
4642 BOOLEAN PendingReturned
;
4644 CHAR CurrentLocation
;
4647 CCHAR ApcEnvironment
;
4648 UCHAR AllocationFlags
;
4649 PIO_STATUS_BLOCK UserIosb
;
4653 _ANONYMOUS_UNION
union {
4654 PIO_APC_ROUTINE UserApcRoutine
;
4655 PVOID IssuingProcess
;
4657 PVOID UserApcContext
;
4658 } AsynchronousParameters
;
4659 LARGE_INTEGER AllocationSize
;
4661 volatile PDRIVER_CANCEL CancelRoutine
;
4665 _ANONYMOUS_UNION
union {
4666 KDEVICE_QUEUE_ENTRY DeviceQueueEntry
;
4667 _ANONYMOUS_STRUCT
struct {
4668 PVOID DriverContext
[4];
4672 PCHAR AuxiliaryBuffer
;
4673 _ANONYMOUS_STRUCT
struct {
4674 LIST_ENTRY ListEntry
;
4675 _ANONYMOUS_UNION
union {
4676 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
4680 struct _FILE_OBJECT
*OriginalFileObject
;
4683 PVOID CompletionKey
;
4687 typedef enum _IO_PAGING_PRIORITY
{
4688 IoPagingPriorityInvalid
,
4689 IoPagingPriorityNormal
,
4690 IoPagingPriorityHigh
,
4691 IoPagingPriorityReserved1
,
4692 IoPagingPriorityReserved2
4693 } IO_PAGING_PRIORITY
;
4696 (NTAPI
*PIO_COMPLETION_ROUTINE
)(
4697 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4698 IN
struct _IRP
*Irp
,
4702 (NTAPI
*PIO_DPC_ROUTINE
)(
4703 IN
struct _KDPC
*Dpc
,
4704 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4705 IN
struct _IRP
*Irp
,
4709 (NTAPI
*PMM_DLL_INITIALIZE
)(
4710 IN PUNICODE_STRING RegistryPath
);
4713 (NTAPI
*PMM_DLL_UNLOAD
)(
4717 (NTAPI
*PKSERVICE_ROUTINE
)(
4718 IN
struct _KINTERRUPT
*Interrupt
,
4719 IN PVOID ServiceContext
);
4722 (NTAPI
*PIO_TIMER_ROUTINE
)(
4723 IN
struct _DEVICE_OBJECT
*DeviceObject
,
4726 typedef struct _IO_SECURITY_CONTEXT
{
4727 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
4728 PACCESS_STATE AccessState
;
4729 ACCESS_MASK DesiredAccess
;
4730 ULONG FullCreateOptions
;
4731 } IO_SECURITY_CONTEXT
, *PIO_SECURITY_CONTEXT
;
4735 typedef struct _IO_CSQ_IRP_CONTEXT
{
4738 struct _IO_CSQ
*Csq
;
4739 } IO_CSQ_IRP_CONTEXT
, *PIO_CSQ_IRP_CONTEXT
;
4742 (NTAPI
*PIO_CSQ_INSERT_IRP
)(
4743 IN
struct _IO_CSQ
*Csq
,
4747 (NTAPI
*PIO_CSQ_REMOVE_IRP
)(
4748 IN
struct _IO_CSQ
*Csq
,
4752 (NTAPI
*PIO_CSQ_PEEK_NEXT_IRP
)(
4753 IN
struct _IO_CSQ
*Csq
,
4755 IN PVOID PeekContext
);
4758 (NTAPI
*PIO_CSQ_ACQUIRE_LOCK
)(
4759 IN
struct _IO_CSQ
*Csq
,
4763 (NTAPI
*PIO_CSQ_RELEASE_LOCK
)(
4764 IN
struct _IO_CSQ
*Csq
,
4768 (NTAPI
*PIO_CSQ_COMPLETE_CANCELED_IRP
)(
4769 IN
struct _IO_CSQ
*Csq
,
4772 typedef struct _IO_CSQ
{
4774 PIO_CSQ_INSERT_IRP CsqInsertIrp
;
4775 PIO_CSQ_REMOVE_IRP CsqRemoveIrp
;
4776 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
;
4777 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
;
4778 PIO_CSQ_RELEASE_LOCK CsqReleaseLock
;
4779 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
;
4780 PVOID ReservePointer
;
4783 typedef enum _BUS_QUERY_ID_TYPE
{
4785 BusQueryHardwareIDs
,
4786 BusQueryCompatibleIDs
,
4788 BusQueryDeviceSerialNumber
4789 } BUS_QUERY_ID_TYPE
, *PBUS_QUERY_ID_TYPE
;
4791 typedef enum _DEVICE_TEXT_TYPE
{
4792 DeviceTextDescription
,
4793 DeviceTextLocationInformation
4794 } DEVICE_TEXT_TYPE
, *PDEVICE_TEXT_TYPE
;
4796 typedef enum _WORK_QUEUE_TYPE
{
4799 HyperCriticalWorkQueue
,
4804 (*PGPE_SERVICE_ROUTINE2
)(
4805 PVOID ObjectContext
,
4806 PVOID ServiceContext
);
4809 (*PGPE_CONNECT_VECTOR2
)(
4812 KINTERRUPT_MODE Mode
,
4814 PGPE_SERVICE_ROUTINE2 ServiceRoutine
,
4815 PVOID ServiceContext
,
4816 PVOID
*ObjectContext
);
4819 (*PGPE_DISCONNECT_VECTOR2
)(
4821 PVOID ObjectContext
);
4824 (*PGPE_ENABLE_EVENT2
)(
4826 PVOID ObjectContext
);
4829 (*PGPE_DISABLE_EVENT2
)(
4831 PVOID ObjectContext
);
4834 (*PGPE_CLEAR_STATUS2
)(
4836 PVOID ObjectContext
);
4839 (*PDEVICE_NOTIFY_CALLBACK2
)(
4840 PVOID NotificationContext
,
4844 (*PREGISTER_FOR_DEVICE_NOTIFICATIONS2
)(
4846 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler
,
4847 PVOID NotificationContext
);
4850 (*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2
)(
4853 typedef struct _ACPI_INTERFACE_STANDARD2
{
4857 PINTERFACE_REFERENCE InterfaceReference
;
4858 PINTERFACE_DEREFERENCE InterfaceDereference
;
4859 PGPE_CONNECT_VECTOR2 GpeConnectVector
;
4860 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector
;
4861 PGPE_ENABLE_EVENT2 GpeEnableEvent
;
4862 PGPE_DISABLE_EVENT2 GpeDisableEvent
;
4863 PGPE_CLEAR_STATUS2 GpeClearStatus
;
4864 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications
;
4865 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications
;
4866 } ACPI_INTERFACE_STANDARD2
, *PACPI_INTERFACE_STANDARD2
;
4868 #if !defined(_AMD64_) && !defined(_IA64_)
4869 #include <pshpack4.h>
4871 typedef struct _IO_STACK_LOCATION
{
4872 UCHAR MajorFunction
;
4873 UCHAR MinorFunction
;
4878 PIO_SECURITY_CONTEXT SecurityContext
;
4880 USHORT POINTER_ALIGNMENT FileAttributes
;
4882 ULONG POINTER_ALIGNMENT EaLength
;
4886 ULONG POINTER_ALIGNMENT Key
;
4887 LARGE_INTEGER ByteOffset
;
4891 ULONG POINTER_ALIGNMENT Key
;
4892 LARGE_INTEGER ByteOffset
;
4896 PUNICODE_STRING FileName
;
4897 FILE_INFORMATION_CLASS FileInformationClass
;
4902 ULONG CompletionFilter
;
4906 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
4910 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
4911 PFILE_OBJECT FileObject
;
4912 _ANONYMOUS_UNION
union {
4913 _ANONYMOUS_STRUCT
struct {
4914 BOOLEAN ReplaceIfExists
;
4915 BOOLEAN AdvanceOnly
;
4918 HANDLE DeleteHandle
;
4932 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass
;
4936 FS_INFORMATION_CLASS FsInformationClass
;
4939 ULONG OutputBufferLength
;
4940 ULONG InputBufferLength
;
4941 ULONG FsControlCode
;
4942 PVOID Type3InputBuffer
;
4943 } FileSystemControl
;
4945 PLARGE_INTEGER Length
;
4947 LARGE_INTEGER ByteOffset
;
4950 ULONG OutputBufferLength
;
4951 ULONG POINTER_ALIGNMENT InputBufferLength
;
4952 ULONG POINTER_ALIGNMENT IoControlCode
;
4953 PVOID Type3InputBuffer
;
4956 SECURITY_INFORMATION SecurityInformation
;
4957 ULONG POINTER_ALIGNMENT Length
;
4960 SECURITY_INFORMATION SecurityInformation
;
4961 PSECURITY_DESCRIPTOR SecurityDescriptor
;
4965 PDEVICE_OBJECT DeviceObject
;
4969 PDEVICE_OBJECT DeviceObject
;
4972 struct _SCSI_REQUEST_BLOCK
*Srb
;
4977 struct _FILE_GET_QUOTA_INFORMATION
*SidList
;
4978 ULONG SidListLength
;
4984 DEVICE_RELATION_TYPE Type
;
4985 } QueryDeviceRelations
;
4987 CONST GUID
*InterfaceType
;
4990 PINTERFACE Interface
;
4991 PVOID InterfaceSpecificData
;
4994 PDEVICE_CAPABILITIES Capabilities
;
4995 } DeviceCapabilities
;
4997 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList
;
4998 } FilterResourceRequirements
;
5003 ULONG POINTER_ALIGNMENT Length
;
5009 BUS_QUERY_ID_TYPE IdType
;
5012 DEVICE_TEXT_TYPE DeviceTextType
;
5013 LCID POINTER_ALIGNMENT LocaleId
;
5017 BOOLEAN Reserved
[3];
5018 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type
;
5019 } UsageNotification
;
5021 SYSTEM_POWER_STATE PowerState
;
5024 PPOWER_SEQUENCE PowerSequence
;
5027 ULONG SystemContext
;
5028 POWER_STATE_TYPE POINTER_ALIGNMENT Type
;
5029 POWER_STATE POINTER_ALIGNMENT State
;
5030 POWER_ACTION POINTER_ALIGNMENT ShutdownType
;
5033 PCM_RESOURCE_LIST AllocatedResources
;
5034 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
5037 ULONG_PTR ProviderId
;
5049 PDEVICE_OBJECT DeviceObject
;
5050 PFILE_OBJECT FileObject
;
5051 PIO_COMPLETION_ROUTINE CompletionRoutine
;
5053 } IO_STACK_LOCATION
, *PIO_STACK_LOCATION
;
5054 #if !defined(_AMD64_) && !defined(_IA64_)
5055 #include <poppack.h>
5058 /* IO_STACK_LOCATION.Control */
5060 #define SL_PENDING_RETURNED 0x01
5061 #define SL_ERROR_RETURNED 0x02
5062 #define SL_INVOKE_ON_CANCEL 0x20
5063 #define SL_INVOKE_ON_SUCCESS 0x40
5064 #define SL_INVOKE_ON_ERROR 0x80
5066 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
5068 #define PCI_WHICHSPACE_CONFIG 0x0
5069 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
5071 #define METHOD_BUFFERED 0
5072 #define METHOD_IN_DIRECT 1
5073 #define METHOD_OUT_DIRECT 2
5074 #define METHOD_NEITHER 3
5076 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
5077 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
5079 #define FILE_SUPERSEDED 0x00000000
5080 #define FILE_OPENED 0x00000001
5081 #define FILE_CREATED 0x00000002
5082 #define FILE_OVERWRITTEN 0x00000003
5083 #define FILE_EXISTS 0x00000004
5084 #define FILE_DOES_NOT_EXIST 0x00000005
5086 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
5087 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
5089 /* also in winnt.h */
5090 #define FILE_LIST_DIRECTORY 0x00000001
5091 #define FILE_READ_DATA 0x00000001
5092 #define FILE_ADD_FILE 0x00000002
5093 #define FILE_WRITE_DATA 0x00000002
5094 #define FILE_ADD_SUBDIRECTORY 0x00000004
5095 #define FILE_APPEND_DATA 0x00000004
5096 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
5097 #define FILE_READ_EA 0x00000008
5098 #define FILE_WRITE_EA 0x00000010
5099 #define FILE_EXECUTE 0x00000020
5100 #define FILE_TRAVERSE 0x00000020
5101 #define FILE_DELETE_CHILD 0x00000040
5102 #define FILE_READ_ATTRIBUTES 0x00000080
5103 #define FILE_WRITE_ATTRIBUTES 0x00000100
5105 #define FILE_SHARE_READ 0x00000001
5106 #define FILE_SHARE_WRITE 0x00000002
5107 #define FILE_SHARE_DELETE 0x00000004
5108 #define FILE_SHARE_VALID_FLAGS 0x00000007
5110 #define FILE_ATTRIBUTE_READONLY 0x00000001
5111 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
5112 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
5113 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
5114 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
5115 #define FILE_ATTRIBUTE_DEVICE 0x00000040
5116 #define FILE_ATTRIBUTE_NORMAL 0x00000080
5117 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
5118 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
5119 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
5120 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
5121 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
5122 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
5123 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
5125 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
5126 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
5128 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
5129 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
5130 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
5131 #define FILE_VALID_SET_FLAGS 0x00000036
5133 #define FILE_SUPERSEDE 0x00000000
5134 #define FILE_OPEN 0x00000001
5135 #define FILE_CREATE 0x00000002
5136 #define FILE_OPEN_IF 0x00000003
5137 #define FILE_OVERWRITE 0x00000004
5138 #define FILE_OVERWRITE_IF 0x00000005
5139 #define FILE_MAXIMUM_DISPOSITION 0x00000005
5141 #define FILE_DIRECTORY_FILE 0x00000001
5142 #define FILE_WRITE_THROUGH 0x00000002
5143 #define FILE_SEQUENTIAL_ONLY 0x00000004
5144 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
5145 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
5146 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
5147 #define FILE_NON_DIRECTORY_FILE 0x00000040
5148 #define FILE_CREATE_TREE_CONNECTION 0x00000080
5149 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
5150 #define FILE_NO_EA_KNOWLEDGE 0x00000200
5151 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
5152 #define FILE_RANDOM_ACCESS 0x00000800
5153 #define FILE_DELETE_ON_CLOSE 0x00001000
5154 #define FILE_OPEN_BY_FILE_ID 0x00002000
5155 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
5156 #define FILE_NO_COMPRESSION 0x00008000
5157 #define FILE_RESERVE_OPFILTER 0x00100000
5158 #define FILE_OPEN_REPARSE_POINT 0x00200000
5159 #define FILE_OPEN_NO_RECALL 0x00400000
5160 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
5162 #define FILE_ANY_ACCESS 0x00000000
5163 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
5164 #define FILE_READ_ACCESS 0x00000001
5165 #define FILE_WRITE_ACCESS 0x00000002
5167 #define FILE_ALL_ACCESS \
5168 (STANDARD_RIGHTS_REQUIRED | \
5172 #define FILE_GENERIC_EXECUTE \
5173 (STANDARD_RIGHTS_EXECUTE | \
5174 FILE_READ_ATTRIBUTES | \
5178 #define FILE_GENERIC_READ \
5179 (STANDARD_RIGHTS_READ | \
5181 FILE_READ_ATTRIBUTES | \
5185 #define FILE_GENERIC_WRITE \
5186 (STANDARD_RIGHTS_WRITE | \
5188 FILE_WRITE_ATTRIBUTES | \
5190 FILE_APPEND_DATA | \
5195 /******************************************************************************
5196 * Object Manager Types *
5197 ******************************************************************************/
5199 typedef struct _OBJECT_NAME_INFORMATION
{
5200 UNICODE_STRING Name
;
5201 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
5203 /* Exported object types */
5204 extern POBJECT_TYPE NTSYSAPI ExEventObjectType
;
5205 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType
;
5206 extern POBJECT_TYPE NTSYSAPI IoFileObjectType
;
5207 extern POBJECT_TYPE NTSYSAPI PsThreadType
;
5208 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType
;
5209 extern POBJECT_TYPE NTSYSAPI PsProcessType
;
5212 /******************************************************************************
5213 * Process Manager Types *
5214 ******************************************************************************/
5216 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
5217 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
5218 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
5219 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
5220 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
5222 /* Thread Access Rights */
5223 #define THREAD_TERMINATE 0x0001
5224 #define THREAD_SUSPEND_RESUME 0x0002
5225 #define THREAD_ALERT 0x0004
5226 #define THREAD_GET_CONTEXT 0x0008
5227 #define THREAD_SET_CONTEXT 0x0010
5228 #define THREAD_SET_INFORMATION 0x0020
5229 #define THREAD_SET_LIMITED_INFORMATION 0x0400
5230 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
5232 #define PROCESS_DUP_HANDLE (0x0040)
5234 #if (NTDDI_VERSION >= NTDDI_VISTA)
5235 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
5237 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
5240 #if (NTDDI_VERSION >= NTDDI_VISTA)
5241 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
5243 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
5246 #define ES_SYSTEM_REQUIRED 0x00000001
5247 #define ES_DISPLAY_REQUIRED 0x00000002
5248 #define ES_USER_PRESENT 0x00000004
5249 #define ES_CONTINUOUS 0x80000000
5251 #define LOW_PRIORITY 0
5252 #define LOW_REALTIME_PRIORITY 16
5253 #define HIGH_PRIORITY 31
5254 #define MAXIMUM_PRIORITY 32
5257 #if defined(_M_IX86)
5258 /** Kernel definitions for x86 **/
5260 /* Interrupt request levels */
5261 #define PASSIVE_LEVEL 0
5264 #define DISPATCH_LEVEL 2
5265 #define CMCI_LEVEL 5
5266 #define PROFILE_LEVEL 27
5267 #define CLOCK1_LEVEL 28
5268 #define CLOCK2_LEVEL 28
5269 #define IPI_LEVEL 29
5270 #define POWER_LEVEL 30
5271 #define HIGH_LEVEL 31
5272 #define CLOCK_LEVEL CLOCK2_LEVEL
5274 #define KIP0PCRADDRESS 0xffdff000
5275 #define KI_USER_SHARED_DATA 0xffdf0000
5276 #define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
5278 #define PAGE_SIZE 0x1000
5279 #define PAGE_SHIFT 12L
5280 #define KeGetDcacheFillSize() 1L
5282 #define EFLAG_SIGN 0x8000
5283 #define EFLAG_ZERO 0x4000
5284 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
5286 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5287 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
5288 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5291 typedef struct _KFLOATING_SAVE
{
5295 ULONG ErrorSelector
;
5300 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
5302 extern NTKERNELAPI
volatile KSYSTEM_TIME KeTickCount
;
5304 #define YieldProcessor _mm_pause
5308 KeMemoryBarrier(VOID
)
5310 volatile LONG Barrier
;
5311 #if defined(__GNUC__)
5312 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
5313 #elif defined(_MSC_VER)
5314 __asm xchg
[Barrier
], eax
5323 #define KeLowerIrql(a) KfLowerIrql(a)
5330 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
5335 KeRaiseIrqlToDpcLevel(VOID
);
5340 KeRaiseIrqlToSynchLevel(VOID
);
5346 IN PKSPIN_LOCK SpinLock
);
5347 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5353 IN PKSPIN_LOCK SpinLock
,
5355 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5360 KefAcquireSpinLockAtDpcLevel(
5361 IN PKSPIN_LOCK SpinLock
);
5362 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5367 KefReleaseSpinLockFromDpcLevel(
5368 IN PKSPIN_LOCK SpinLock
);
5369 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5374 KeGetCurrentThread(VOID
);
5379 KeSaveFloatingPointState(
5380 OUT PKFLOATING_SAVE FloatSave
);
5385 KeRestoreFloatingPointState(
5386 IN PKFLOATING_SAVE FloatSave
);
5391 * IN BOOLEAN ReadOperation,
5392 * IN BOOLEAN DmaOperation)
5394 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
5396 /* x86 and x64 performs a 0x2C interrupt */
5397 #define DbgRaiseAssertionFailure __int2c
5402 OUT PLARGE_INTEGER CurrentCount
)
5405 CurrentCount
->HighPart
= KeTickCount
.High1Time
;
5406 CurrentCount
->LowPart
= KeTickCount
.LowPart
;
5407 if (CurrentCount
->HighPart
== KeTickCount
.High2Time
) break;
5411 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
5415 #elif defined(_M_AMD64)
5416 /** Kernel definitions for AMD64 **/
5418 /* Interrupt request levels */
5419 #define PASSIVE_LEVEL 0
5422 #define DISPATCH_LEVEL 2
5423 #define CMCI_LEVEL 5
5424 #define CLOCK_LEVEL 13
5425 #define IPI_LEVEL 14
5426 #define DRS_LEVEL 14
5427 #define POWER_LEVEL 14
5428 #define PROFILE_LEVEL 15
5429 #define HIGH_LEVEL 15
5431 #define PAGE_SIZE 0x1000
5432 #define PAGE_SHIFT 12L
5434 #define KI_USER_SHARED_DATA 0xFFFFF78000000000UI64
5435 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
5438 typedef struct _KFLOATING_SAVE
{
5440 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
5442 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
5444 #define KeQueryInterruptTime() \
5445 (*(volatile ULONG64*)SharedInterruptTime)
5447 #define KeQuerySystemTime(CurrentCount) \
5448 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
5450 #define KeQueryTickCount(CurrentCount) \
5451 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
5453 #define KeGetDcacheFillSize() 1L
5455 #define YieldProcessor _mm_pause
5459 KeGetCurrentIrql(VOID
)
5461 return (KIRQL
)__readcr8();
5466 KeLowerIrql(IN KIRQL NewIrql
)
5468 ASSERT(KeGetCurrentIrql() >= NewIrql
);
5469 __writecr8(NewIrql
);
5474 KfRaiseIrql(IN KIRQL NewIrql
)
5478 OldIrql
= __readcr8();
5479 ASSERT(OldIrql
<= NewIrql
);
5480 __writecr8(NewIrql
);
5483 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
5487 KeRaiseIrqlToDpcLevel(VOID
)
5489 return KfRaiseIrql(DISPATCH_LEVEL
);
5494 KeRaiseIrqlToSynchLevel(VOID
)
5496 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
5501 KeGetCurrentThread(VOID
)
5503 return (struct _KTHREAD
*)__readgsqword(0x188);
5506 /* x86 and x64 performs a 0x2C interrupt */
5507 #define DbgRaiseAssertionFailure __int2c
5509 #elif defined(_M_IA64)
5510 /** Kernel definitions for IA64 **/
5512 /* Interrupt request levels */
5513 #define PASSIVE_LEVEL 0
5516 #define DISPATCH_LEVEL 2
5518 #define DEVICE_LEVEL_BASE 4
5520 #define IPI_LEVEL 14
5521 #define DRS_LEVEL 14
5522 #define CLOCK_LEVEL 13
5523 #define POWER_LEVEL 15
5524 #define PROFILE_LEVEL 15
5525 #define HIGH_LEVEL 15
5527 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
5528 extern volatile LARGE_INTEGER KeTickCount
;
5532 KeFlushWriteBuffer(VOID
)
5541 KeGetCurrentThread(VOID
);
5544 #elif defined(_M_PPC)
5546 /* Interrupt request levels */
5547 #define PASSIVE_LEVEL 0
5550 #define DISPATCH_LEVEL 2
5551 #define PROFILE_LEVEL 27
5552 #define CLOCK1_LEVEL 28
5553 #define CLOCK2_LEVEL 28
5554 #define IPI_LEVEL 29
5555 #define POWER_LEVEL 30
5556 #define HIGH_LEVEL 31
5559 // Used to contain PFNs and PFN counts
5561 typedef ULONG PFN_COUNT
;
5562 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
5563 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
5566 typedef struct _KFLOATING_SAVE
{
5568 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
5570 typedef struct _KPCR_TIB
{
5571 PVOID ExceptionList
; /* 00 */
5572 PVOID StackBase
; /* 04 */
5573 PVOID StackLimit
; /* 08 */
5574 PVOID SubSystemTib
; /* 0C */
5575 _ANONYMOUS_UNION
union {
5576 PVOID FiberData
; /* 10 */
5577 ULONG Version
; /* 10 */
5579 PVOID ArbitraryUserPointer
; /* 14 */
5580 struct _KPCR_TIB
*Self
; /* 18 */
5581 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
5583 #define PCR_MINOR_VERSION 1
5584 #define PCR_MAJOR_VERSION 1
5586 typedef struct _KPCR
{
5587 KPCR_TIB Tib
; /* 00 */
5588 struct _KPCR
*Self
; /* 1C */
5589 struct _KPRCB
*Prcb
; /* 20 */
5590 KIRQL Irql
; /* 24 */
5592 ULONG IrrActive
; /* 2C */
5594 PVOID KdVersionBlock
; /* 34 */
5595 PUSHORT IDT
; /* 38 */
5596 PUSHORT GDT
; /* 3C */
5597 struct _KTSS
*TSS
; /* 40 */
5598 USHORT MajorVersion
; /* 44 */
5599 USHORT MinorVersion
; /* 46 */
5600 KAFFINITY SetMember
; /* 48 */
5601 ULONG StallScaleFactor
; /* 4C */
5602 UCHAR SpareUnused
; /* 50 */
5603 UCHAR Number
; /* 51 */
5604 } KPCR
, *PKPCR
; /* 54 */
5606 #define KeGetPcr() PCR
5608 #define YieldProcessor() __asm__ __volatile__("nop");
5613 KeGetCurrentProcessorNumber(VOID
)
5616 __asm__
__volatile__ (
5619 : "i" (FIELD_OFFSET(KPCR
, Number
))
5629 #define KeLowerIrql(a) KfLowerIrql(a)
5636 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
5641 KeRaiseIrqlToDpcLevel(VOID
);
5646 KeRaiseIrqlToSynchLevel(VOID
);
5650 #elif defined(_M_MIPS)
5651 #error MIPS Headers are totally incorrect
5654 // Used to contain PFNs and PFN counts
5656 typedef ULONG PFN_COUNT
;
5657 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
5658 typedef LONG SPFN_NUMBER
, *PSPFN_NUMBER
;
5660 #define PASSIVE_LEVEL 0
5662 #define DISPATCH_LEVEL 2
5663 #define PROFILE_LEVEL 27
5664 #define IPI_LEVEL 29
5665 #define HIGH_LEVEL 31
5667 typedef struct _KPCR
{
5668 struct _KPRCB
*Prcb
; /* 20 */
5669 KIRQL Irql
; /* 24 */
5674 #define KeGetPcr() PCR
5676 typedef struct _KFLOATING_SAVE
{
5677 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
5682 KeGetCurrentProcessorNumber(VOID
)
5687 #define YieldProcessor() __asm__ __volatile__("nop");
5689 #define KeLowerIrql(a) KfLowerIrql(a)
5690 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
5707 KeRaiseIrqlToDpcLevel(VOID
);
5712 KeRaiseIrqlToSynchLevel(VOID
);
5715 #elif defined(_M_ARM)
5718 #error Unknown Architecture
5721 /******************************************************************************
5722 * Runtime Library Functions *
5723 ******************************************************************************/
5728 OUT PLIST_ENTRY ListHead
)
5730 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
5736 IN OUT PLIST_ENTRY ListHead
,
5737 IN OUT PLIST_ENTRY Entry
)
5739 PLIST_ENTRY OldFlink
;
5740 OldFlink
= ListHead
->Flink
;
5741 Entry
->Flink
= OldFlink
;
5742 Entry
->Blink
= ListHead
;
5743 OldFlink
->Blink
= Entry
;
5744 ListHead
->Flink
= Entry
;
5750 IN OUT PLIST_ENTRY ListHead
,
5751 IN OUT PLIST_ENTRY Entry
)
5753 PLIST_ENTRY OldBlink
;
5754 OldBlink
= ListHead
->Blink
;
5755 Entry
->Flink
= ListHead
;
5756 Entry
->Blink
= OldBlink
;
5757 OldBlink
->Flink
= Entry
;
5758 ListHead
->Blink
= Entry
;
5764 IN CONST LIST_ENTRY
* ListHead
)
5766 return (BOOLEAN
)(ListHead
->Flink
== ListHead
);
5772 IN OUT PSINGLE_LIST_ENTRY ListHead
)
5774 PSINGLE_LIST_ENTRY FirstEntry
;
5775 FirstEntry
= ListHead
->Next
;
5776 if (FirstEntry
!= NULL
) {
5777 ListHead
->Next
= FirstEntry
->Next
;
5785 IN OUT PSINGLE_LIST_ENTRY ListHead
,
5786 IN OUT PSINGLE_LIST_ENTRY Entry
)
5788 Entry
->Next
= ListHead
->Next
;
5789 ListHead
->Next
= Entry
;
5795 IN PLIST_ENTRY Entry
)
5797 PLIST_ENTRY OldFlink
;
5798 PLIST_ENTRY OldBlink
;
5800 OldFlink
= Entry
->Flink
;
5801 OldBlink
= Entry
->Blink
;
5802 OldFlink
->Blink
= OldBlink
;
5803 OldBlink
->Flink
= OldFlink
;
5804 return (BOOLEAN
)(OldFlink
== OldBlink
);
5810 IN OUT PLIST_ENTRY ListHead
)
5815 Entry
= ListHead
->Flink
;
5816 Flink
= Entry
->Flink
;
5817 ListHead
->Flink
= Flink
;
5818 Flink
->Blink
= ListHead
;
5825 IN OUT PLIST_ENTRY ListHead
)
5830 Entry
= ListHead
->Blink
;
5831 Blink
= Entry
->Blink
;
5832 ListHead
->Blink
= Blink
;
5833 Blink
->Flink
= ListHead
;
5841 IN PVOID FailedAssertion
,
5843 IN ULONG LineNumber
,
5848 * IN VOID UNALIGNED *Destination,
5849 * IN CONST VOID UNALIGNED *Source,
5852 #define RtlCopyMemory(Destination, Source, Length) \
5853 memcpy(Destination, Source, Length)
5855 #define RtlCopyBytes RtlCopyMemory
5857 #if defined(_M_AMD64)
5861 RtlCopyMemoryNonTemporal(
5862 VOID UNALIGNED
*Destination
,
5863 CONST VOID UNALIGNED
*Source
,
5866 #define RtlCopyMemoryNonTemporal RtlCopyMemory
5874 #define RtlEqualLuid(Luid1, Luid2) \
5875 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
5879 * IN VOID UNALIGNED *Destination,
5880 * IN CONST VOID UNALIGNED *Source,
5883 #define RtlEqualMemory(Destination, Source, Length) \
5884 (!memcmp(Destination, Source, Length))
5888 * IN VOID UNALIGNED *Destination,
5892 #define RtlFillMemory(Destination, Length, Fill) \
5893 memset(Destination, Fill, Length)
5895 #define RtlFillBytes RtlFillMemory
5900 RtlFreeUnicodeString(
5901 IN OUT PUNICODE_STRING UnicodeString
);
5907 IN PUNICODE_STRING GuidString
,
5913 RtlInitUnicodeString(
5914 IN OUT PUNICODE_STRING DestinationString
,
5915 IN PCWSTR SourceString OPTIONAL
);
5919 * IN VOID UNALIGNED *Destination,
5920 * IN CONST VOID UNALIGNED *Source,
5923 #define RtlMoveMemory(Destination, Source, Length) \
5924 memmove(Destination, Source, Length)
5931 OUT PUNICODE_STRING GuidString
);
5935 * IN VOID UNALIGNED *Destination,
5938 #define RtlZeroMemory(Destination, Length) \
5939 memset(Destination, 0, Length)
5941 #define RtlZeroBytes RtlZeroMemory
5943 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5949 IN PRTL_BITMAP BitMapHeader
,
5950 IN ULONG StartingIndex
,
5957 IN PRTL_BITMAP BitMapHeader
,
5958 IN ULONG StartingIndex
,
5964 RtlAnsiStringToUnicodeString(
5965 IN OUT PUNICODE_STRING DestinationString
,
5966 IN PANSI_STRING SourceString
,
5967 IN BOOLEAN AllocateDestinationString
);
5972 RtlxAnsiStringToUnicodeSize(
5973 IN PCANSI_STRING AnsiString
);
5975 #define RtlAnsiStringToUnicodeSize(String) ( \
5976 NLS_MB_CODE_PAGE_TAG ? \
5977 RtlxAnsiStringToUnicodeSize(String) : \
5978 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
5984 RtlAppendUnicodeStringToString(
5985 IN OUT PUNICODE_STRING Destination
,
5986 IN PCUNICODE_STRING Source
);
5991 RtlAppendUnicodeToString(
5992 IN OUT PUNICODE_STRING Destination
,
5998 RtlCheckRegistryKey(
5999 IN ULONG RelativeTo
,
6006 IN PRTL_BITMAP BitMapHeader
);
6012 IN PRTL_BITMAP BitMapHeader
,
6013 IN ULONG StartingIndex
,
6014 IN ULONG NumberToClear
);
6020 IN CONST VOID
*Source1
,
6021 IN CONST VOID
*Source2
,
6027 RtlCompareUnicodeString(
6028 IN PCUNICODE_STRING String1
,
6029 IN PCUNICODE_STRING String2
,
6030 IN BOOLEAN CaseInSensitive
);
6035 RtlCompareUnicodeStrings(
6037 IN SIZE_T String1Length
,
6039 IN SIZE_T String2Length
,
6040 IN BOOLEAN CaseInSensitive
);
6045 RtlCopyUnicodeString(
6046 IN OUT PUNICODE_STRING DestinationString
,
6047 IN PCUNICODE_STRING SourceString
);
6052 RtlCreateRegistryKey(
6053 IN ULONG RelativeTo
,
6059 RtlCreateSecurityDescriptor(
6060 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
6066 RtlDeleteRegistryValue(
6067 IN ULONG RelativeTo
,
6069 IN PCWSTR ValueName
);
6074 RtlEqualUnicodeString(
6075 IN CONST UNICODE_STRING
*String1
,
6076 IN CONST UNICODE_STRING
*String2
,
6077 IN BOOLEAN CaseInSensitive
);
6079 #if !defined(_AMD64_) && !defined(_IA64_)
6083 RtlExtendedIntegerMultiply(
6084 IN LARGE_INTEGER Multiplicand
,
6085 IN LONG Multiplier
);
6090 RtlExtendedLargeIntegerDivide(
6091 IN LARGE_INTEGER Dividend
,
6093 IN OUT PULONG Remainder
);
6096 #if defined(_X86_) || defined(_IA64_)
6100 RtlExtendedMagicDivide(
6101 IN LARGE_INTEGER Dividend
,
6102 IN LARGE_INTEGER MagicDivisor
,
6103 IN CCHAR ShiftCount
);
6110 IN PANSI_STRING AnsiString
);
6116 IN PRTL_BITMAP BitMapHeader
,
6117 IN ULONG NumberToFind
,
6118 IN ULONG HintIndex
);
6123 RtlFindClearBitsAndSet(
6124 IN PRTL_BITMAP BitMapHeader
,
6125 IN ULONG NumberToFind
,
6126 IN ULONG HintIndex
);
6131 RtlFindFirstRunClear(
6132 IN PRTL_BITMAP BitMapHeader
,
6133 OUT PULONG StartingIndex
);
6139 IN PRTL_BITMAP BitMapHeader
,
6140 OUT PRTL_BITMAP_RUN RunArray
,
6141 IN ULONG SizeOfRunArray
,
6142 IN BOOLEAN LocateLongestRuns
);
6147 RtlFindLastBackwardRunClear(
6148 IN PRTL_BITMAP BitMapHeader
,
6150 OUT PULONG StartingRunIndex
);
6155 RtlFindLeastSignificantBit(
6161 RtlFindLongestRunClear(
6162 IN PRTL_BITMAP BitMapHeader
,
6163 OUT PULONG StartingIndex
);
6168 RtlFindMostSignificantBit(
6174 RtlFindNextForwardRunClear(
6175 IN PRTL_BITMAP BitMapHeader
,
6177 OUT PULONG StartingRunIndex
);
6183 IN PRTL_BITMAP BitMapHeader
,
6184 IN ULONG NumberToFind
,
6185 IN ULONG HintIndex
);
6190 RtlFindSetBitsAndClear(
6191 IN PRTL_BITMAP BitMapHeader
,
6192 IN ULONG NumberToFind
,
6193 IN ULONG HintIndex
);
6198 RtlHashUnicodeString(
6199 IN CONST UNICODE_STRING
*String
,
6200 IN BOOLEAN CaseInSensitive
,
6201 IN ULONG HashAlgorithm
,
6202 OUT PULONG HashValue
);
6208 IN OUT PANSI_STRING DestinationString
,
6209 IN PCSZ SourceString
);
6214 RtlInitializeBitMap(
6215 IN PRTL_BITMAP BitMapHeader
,
6216 IN PULONG BitMapBuffer
,
6217 IN ULONG SizeOfBitMap
);
6223 IN OUT PSTRING DestinationString
,
6224 IN PCSZ SourceString
);
6229 RtlIntegerToUnicodeString(
6231 IN ULONG Base OPTIONAL
,
6232 IN OUT PUNICODE_STRING String
);
6237 RtlInt64ToUnicodeString(
6239 IN ULONG Base OPTIONAL
,
6240 IN OUT PUNICODE_STRING String
);
6243 #define RtlIntPtrToUnicodeString(Value, Base, String) \
6244 RtlInt64ToUnicodeString(Value, Base, String)
6246 #define RtlIntPtrToUnicodeString(Value, Base, String) \
6247 RtlIntegerToUnicodeString(Value, Base, String)
6254 #define RtlIsZeroLuid(_L1) \
6255 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
6260 RtlLengthSecurityDescriptor(
6261 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
6266 RtlNumberOfClearBits(
6267 IN PRTL_BITMAP BitMapHeader
);
6273 IN PRTL_BITMAP BitMapHeader
);
6278 RtlQueryRegistryValues(
6279 IN ULONG RelativeTo
,
6281 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
6283 IN PVOID Environment OPTIONAL
);
6285 #define LONG_SIZE (sizeof(LONG))
6286 #define LONG_MASK (LONG_SIZE - 1)
6290 * PULONG DestinationAddress,
6291 * PULONG SourceAddress);
6293 #if defined(_AMD64_)
6294 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6295 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
6297 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6298 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6300 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6301 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6302 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
6303 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
6307 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
6312 * RtlRetrieveUshort(
6313 * PUSHORT DestinationAddress,
6314 * PUSHORT SourceAddress);
6316 #if defined(_AMD64_)
6317 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
6318 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
6320 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
6321 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6323 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6324 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6328 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
6336 IN PRTL_BITMAP BitMapHeader
);
6342 IN PRTL_BITMAP BitMapHeader
,
6343 IN ULONG StartingIndex
,
6344 IN ULONG NumberToSet
);
6349 RtlSetDaclSecurityDescriptor(
6350 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
6351 IN BOOLEAN DaclPresent
,
6352 IN PACL Dacl OPTIONAL
,
6353 IN BOOLEAN DaclDefaulted OPTIONAL
);
6357 * IN PULONG Address,
6360 #if defined(_AMD64_)
6361 #define RtlStoreUlong(Address,Value) \
6362 *(ULONG UNALIGNED *)(Address) = (Value)
6364 #define RtlStoreUlong(Address,Value) \
6365 if ((ULONG_PTR)(Address) & LONG_MASK) { \
6366 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
6367 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
6368 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
6369 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
6372 *((PULONG)(Address)) = (ULONG) (Value); \
6377 * RtlStoreUlonglong(
6378 * IN OUT PULONGLONG Address,
6381 #if defined(_AMD64_)
6382 #define RtlStoreUlonglong(Address,Value) \
6383 *(ULONGLONG UNALIGNED *)(Address) = (Value)
6385 #define RtlStoreUlonglong(Address,Value) \
6386 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
6387 RtlStoreUlong((ULONG_PTR)(Address), \
6388 (ULONGLONG)(Value) & 0xFFFFFFFF); \
6389 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
6390 (ULONGLONG)(Value) >> 32); \
6392 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
6398 * IN OUT PULONG_PTR Address,
6399 * IN ULONG_PTR Value);
6402 #define RtlStoreUlongPtr(Address,Value) \
6403 RtlStoreUlonglong(Address,Value)
6405 #define RtlStoreUlongPtr(Address,Value) \
6406 RtlStoreUlong(Address,Value)
6411 * IN PUSHORT Address,
6414 #if defined(_AMD64_)
6415 #define RtlStoreUshort(Address,Value) \
6416 *(USHORT UNALIGNED *)(Address) = (Value)
6418 #define RtlStoreUshort(Address,Value) \
6419 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
6420 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
6421 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
6424 *((PUSHORT) (Address)) = (USHORT)Value; \
6431 RtlTimeFieldsToTime(
6432 IN PTIME_FIELDS TimeFields
,
6433 IN PLARGE_INTEGER Time
);
6438 RtlTimeToTimeFields(
6439 IN PLARGE_INTEGER Time
,
6440 IN PTIME_FIELDS TimeFields
);
6451 RtlUlonglongByteSwap(
6452 IN ULONGLONG Source
);
6457 RtlUnicodeStringToAnsiString(
6458 IN OUT PANSI_STRING DestinationString
,
6459 IN PCUNICODE_STRING SourceString
,
6460 IN BOOLEAN AllocateDestinationString
);
6465 RtlxUnicodeStringToAnsiSize(
6466 IN PCUNICODE_STRING UnicodeString
);
6468 #define RtlUnicodeStringToAnsiSize(String) ( \
6469 NLS_MB_CODE_PAGE_TAG ? \
6470 RtlxUnicodeStringToAnsiSize(String) : \
6471 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
6477 RtlUnicodeStringToInteger(
6478 IN PCUNICODE_STRING String
,
6479 IN ULONG Base OPTIONAL
,
6485 RtlUpcaseUnicodeChar(
6486 IN WCHAR SourceCharacter
);
6497 RtlValidRelativeSecurityDescriptor(
6498 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
6499 IN ULONG SecurityDescriptorLength
,
6500 IN SECURITY_INFORMATION RequiredInformation
);
6505 RtlValidSecurityDescriptor(
6506 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
6511 RtlWriteRegistryValue(
6512 IN ULONG RelativeTo
,
6514 IN PCWSTR ValueName
,
6517 IN ULONG ValueLength
);
6519 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
6521 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
6525 RtlPrefetchMemoryNonTemporal(
6530 #if (NTDDI_VERSION >= NTDDI_WINXP)
6536 PRTL_BITMAP BitMapHeader
,
6542 RtlDowncaseUnicodeChar(
6543 IN WCHAR SourceCharacter
);
6549 PRTL_BITMAP BitMapHeader
,
6556 IN PRTL_BITMAP BitMapHeader
,
6557 IN ULONG BitNumber
);
6559 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
6561 #if (NTDDI_VERSION >= NTDDI_VISTA)
6566 RtlNumberOfSetBitsUlongPtr(
6567 IN ULONG_PTR Target
);
6572 RtlIoDecodeMemIoResource (
6573 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
6574 OUT PULONGLONG Alignment OPTIONAL
,
6575 OUT PULONGLONG MinimumAddress OPTIONAL
,
6576 OUT PULONGLONG MaximumAddress OPTIONAL
);
6581 RtlIoEncodeMemIoResource(
6582 IN
struct _IO_RESOURCE_DESCRIPTOR
*Descriptor
,
6584 IN ULONGLONG Length
,
6585 IN ULONGLONG Alignment
,
6586 IN ULONGLONG MinimumAddress
,
6587 IN ULONGLONG MaximumAddress
);
6592 RtlCmDecodeMemIoResource(
6593 IN
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
*Descriptor
,
6594 OUT PULONGLONG Start OPTIONAL
);
6599 RtlFindClosestEncodableLength(
6600 IN ULONGLONG SourceLength
,
6601 OUT PULONGLONG TargetLength
);
6605 #if !defined(MIDL_PASS)
6606 /* inline funftions */
6607 //DECLSPEC_DEPRECATED_DDK_WINXP
6611 RtlConvertLongToLargeInteger(LONG SignedInteger
)
6614 ret
.QuadPart
= SignedInteger
;
6618 //DECLSPEC_DEPRECATED_DDK_WINXP
6622 RtlConvertUlongToLargeInteger(
6623 ULONG UnsignedInteger
)
6626 ret
.QuadPart
= UnsignedInteger
;
6630 //DECLSPEC_DEPRECATED_DDK
6634 RtlEnlargedUnsignedDivide(
6635 IN ULARGE_INTEGER Dividend
,
6637 IN OUT PULONG Remainder
)
6640 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
6641 return (ULONG
)(Dividend
.QuadPart
/ Divisor
);
6644 //DECLSPEC_DEPRECATED_DDK
6648 RtlEnlargedUnsignedMultiply(
6649 IN ULONG Multiplicand
,
6650 IN ULONG Multiplier
)
6653 ret
.QuadPart
= (ULONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
6657 //DECLSPEC_DEPRECATED_DDK
6661 RtlEnlargedIntegerMultiply(
6662 IN LONG Multiplicand
,
6666 ret
.QuadPart
= (LONGLONG
)Multiplicand
* (ULONGLONG
)Multiplier
;
6672 RtlInitEmptyAnsiString(
6673 OUT PANSI_STRING AnsiString
,
6675 IN USHORT BufferSize
)
6677 AnsiString
->Length
= 0;
6678 AnsiString
->MaximumLength
= BufferSize
;
6679 AnsiString
->Buffer
= Buffer
;
6684 RtlInitEmptyUnicodeString(
6685 OUT PUNICODE_STRING UnicodeString
,
6687 IN USHORT BufferSize
)
6689 UnicodeString
->Length
= 0;
6690 UnicodeString
->MaximumLength
= BufferSize
;
6691 UnicodeString
->Buffer
= Buffer
;
6694 #if defined(_AMD64_) || defined(_IA64_)
6698 RtlExtendedIntegerMultiply(
6699 LARGE_INTEGER Multiplicand
,
6703 ret
.QuadPart
= Multiplicand
.QuadPart
* Multiplier
;
6710 RtlExtendedLargeIntegerDivide(
6711 LARGE_INTEGER Dividend
,
6716 ret
.QuadPart
= (ULONG64
)Dividend
.QuadPart
/ Divisor
;
6718 *Remainder
= (ULONG
)(Dividend
.QuadPart
% Divisor
);
6723 #if defined(_AMD64_)
6725 #define MultiplyHigh __mulh
6726 #define UnsignedMultiplyHigh __umulh
6728 //DECLSPEC_DEPRECATED_DDK
6732 RtlExtendedMagicDivide(
6733 IN LARGE_INTEGER Dividend
,
6734 IN LARGE_INTEGER MagicDivisor
,
6735 IN CCHAR ShiftCount
)
6740 Pos
= (Dividend
.QuadPart
>= 0);
6741 ret64
= UnsignedMultiplyHigh(Pos
? Dividend
.QuadPart
: -Dividend
.QuadPart
,
6742 MagicDivisor
.QuadPart
);
6743 ret64
>>= ShiftCount
;
6744 ret
.QuadPart
= Pos
? ret64
: -ret64
;
6749 //DECLSPEC_DEPRECATED_DDK
6754 IN LARGE_INTEGER Addend1
,
6755 IN LARGE_INTEGER Addend2
)
6758 ret
.QuadPart
= Addend1
.QuadPart
+ Addend2
.QuadPart
;
6763 * RtlLargeIntegerAnd(
6764 * IN OUT LARGE_INTEGER Result,
6765 * IN LARGE_INTEGER Source,
6766 * IN LARGE_INTEGER Mask);
6768 #define RtlLargeIntegerAnd(Result, Source, Mask) \
6769 Result.QuadPart = Source.QuadPart & Mask.QuadPart
6771 //DECLSPEC_DEPRECATED_DDK
6775 RtlLargeIntegerArithmeticShift(
6776 IN LARGE_INTEGER LargeInteger
,
6777 IN CCHAR ShiftCount
)
6780 ret
.QuadPart
= LargeInteger
.QuadPart
>> ShiftCount
;
6785 * RtlLargeIntegerEqualTo(
6786 * IN LARGE_INTEGER Operand1,
6787 * IN LARGE_INTEGER Operand2);
6789 #define RtlLargeIntegerEqualTo(X,Y) \
6790 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
6794 RtlSecureZeroMemory(
6798 volatile char* vptr
= (volatile char*)Pointer
;
6799 #if defined(_M_AMD64)
6800 __stosb((PUCHAR
)vptr
, 0, Size
);
6802 char * endptr
= (char *)vptr
+ Size
;
6803 while (vptr
< endptr
) {
6810 #if defined(_M_AMD64)
6814 IN PRTL_BITMAP BitMapHeader
,
6815 IN ULONG BitPosition
)
6817 return BitTest((LONG CONST
*)BitMapHeader
->Buffer
, BitPosition
);
6820 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
6821 #endif /* defined(_M_AMD64) */
6823 #endif /* !defined(MIDL_PASS) */
6825 /* Byte Swap Functions */
6826 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
6827 ((defined(_M_AMD64) || defined(_M_IA64)) \
6828 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
6830 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
6831 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
6832 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
6838 #define ASSERT(exp) \
6840 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
6842 #define ASSERTMSG(msg, exp) \
6844 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
6846 #define RTL_SOFT_ASSERT(exp) \
6848 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
6850 #define RTL_SOFT_ASSERTMSG(msg, exp) \
6852 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
6854 #define RTL_VERIFY(exp) ASSERT(exp)
6855 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
6857 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
6858 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
6860 #if defined(_MSC_VER)
6862 #define NT_ASSERT(exp) \
6864 (__annotation(L"Debug", L"AssertFail", L#exp), \
6865 DbgRaiseAssertionFailure(), FALSE) : TRUE)
6867 #define NT_ASSERTMSG(msg, exp) \
6869 (__annotation(L"Debug", L"AssertFail", L##msg), \
6870 DbgRaiseAssertionFailure(), FALSE) : TRUE)
6872 #define NT_ASSERTMSGW(msg, exp) \
6874 (__annotation(L"Debug", L"AssertFail", msg), \
6875 DbgRaiseAssertionFailure(), FALSE) : TRUE)
6879 /* GCC doesn't support __annotation (nor PDB) */
6880 #define NT_ASSERT(exp) \
6881 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
6883 #define NT_ASSERTMSG NT_ASSERT
6884 #define NT_ASSERTMSGW NT_ASSERT
6890 #define ASSERT(exp) ((VOID) 0)
6891 #define ASSERTMSG(msg, exp) ((VOID) 0)
6893 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
6894 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
6896 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
6897 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
6899 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
6900 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
6902 #define NT_ASSERT(exp) ((VOID)0)
6903 #define NT_ASSERTMSG(exp) ((VOID)0)
6904 #define NT_ASSERTMSGW(exp) ((VOID)0)
6908 #if !defined(_WINBASE_)
6910 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
6914 InitializeSListHead(
6915 OUT PSLIST_HEADER SListHead
);
6921 InitializeSListHead(
6922 OUT PSLIST_HEADER SListHead
)
6925 ULONG64 FeatureBits
;
6929 if (((ULONG_PTR
)SListHead
& 0xf) != 0) {
6930 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
6933 RtlZeroMemory(SListHead
, sizeof(SLIST_HEADER
));
6935 FeatureBits
= __getReg(CV_IA64_CPUID4
);
6936 if ((FeatureBits
& KF_16BYTE_INSTR
) != 0) {
6937 SListHead
->Header16
.HeaderType
= 1;
6938 SListHead
->Header16
.Init
= 1;
6947 #define InterlockedPopEntrySList(Head) \
6948 ExpInterlockedPopEntrySList(Head)
6950 #define InterlockedPushEntrySList(Head, Entry) \
6951 ExpInterlockedPushEntrySList(Head, Entry)
6953 #define InterlockedFlushSList(Head) \
6954 ExpInterlockedFlushSList(Head)
6956 #define QueryDepthSList(Head) \
6957 ExQueryDepthSList(Head)
6959 #else /* !defined(_WIN64) */
6964 InterlockedPopEntrySList(
6965 IN PSLIST_HEADER ListHead
);
6970 InterlockedPushEntrySList(
6971 IN PSLIST_HEADER ListHead
,
6972 IN PSLIST_ENTRY ListEntry
);
6974 #define InterlockedFlushSList(ListHead) \
6975 ExInterlockedFlushSList(ListHead)
6977 #define QueryDepthSList(Head) \
6978 ExQueryDepthSList(Head)
6980 #endif /* !defined(_WIN64) */
6982 #endif /* !defined(_WINBASE_) */
6984 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
6985 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
6986 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
6987 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
6988 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
6989 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
6990 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
6991 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
6992 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
6993 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
6994 (PCONTEXT_EX)(Context + 1), \
6997 /******************************************************************************
6998 * Kernel Functions *
6999 ******************************************************************************/
7004 KeGetCurrentIrql(VOID
);
7018 IN OUT PRKEVENT Event
);
7020 #if (NTDDI_VERSION >= NTDDI_WIN2K)
7026 IN CONST VOID
*Address
, /* CONST is added */
7028 IN ULONG Alignment
);
7036 IN ULONG Alignment
);
7038 #if defined(SINGLE_GROUP_LEGACY_API)
7042 KeRevertToUserAffinityThread(VOID
);
7047 KeSetSystemAffinityThread(
7048 IN KAFFINITY Affinity
);
7053 KeSetTargetProcessorDpc(
7060 KeQueryActiveProcessors(VOID
);
7063 #if !defined(_M_AMD64)
7068 KeQueryInterruptTime(VOID
);
7074 OUT PLARGE_INTEGER CurrentTime
);
7076 #endif /* !_M_AMD64 */
7078 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
7082 KeInitializeSpinLock(
7083 IN PKSPIN_LOCK SpinLock
);
7087 KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock
)
7089 /* Clear the lock */
7099 IN ULONG BugCheckCode
,
7100 IN ULONG_PTR BugCheckParameter1
,
7101 IN ULONG_PTR BugCheckParameter2
,
7102 IN ULONG_PTR BugCheckParameter3
,
7103 IN ULONG_PTR BugCheckParameter4
);
7114 KeDelayExecutionThread(
7115 IN KPROCESSOR_MODE WaitMode
,
7116 IN BOOLEAN Alertable
,
7117 IN PLARGE_INTEGER Interval
);
7122 KeDeregisterBugCheckCallback(
7123 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
7128 KeEnterCriticalRegion(VOID
);
7133 KeInitializeDeviceQueue(
7134 OUT PKDEVICE_QUEUE DeviceQueue
);
7141 IN PKDEFERRED_ROUTINE DeferredRoutine
,
7142 IN PVOID DeferredContext OPTIONAL
);
7154 KeInitializeSemaphore(
7155 OUT PRKSEMAPHORE Semaphore
,
7168 KeInitializeTimerEx(
7170 IN TIMER_TYPE Type
);
7175 KeInsertByKeyDeviceQueue(
7176 IN OUT PKDEVICE_QUEUE DeviceQueue
,
7177 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
7183 KeInsertDeviceQueue(
7184 IN OUT PKDEVICE_QUEUE DeviceQueue
,
7185 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
7192 IN PVOID SystemArgument1 OPTIONAL
,
7193 IN PVOID SystemArgument2 OPTIONAL
);
7198 KeLeaveCriticalRegion(VOID
);
7203 KeQueryPerformanceCounter(
7204 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
7209 KeQueryPriorityThread(
7210 IN PRKTHREAD Thread
);
7215 KeQueryTimeIncrement(VOID
);
7232 KeReadStateSemaphore(
7233 IN PRKSEMAPHORE Semaphore
);
7244 KeRegisterBugCheckCallback(
7245 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
7246 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
7249 IN PUCHAR Component
);
7255 IN OUT PRKMUTEX Mutex
,
7262 IN OUT PRKSEMAPHORE Semaphore
,
7263 IN KPRIORITY Increment
,
7268 PKDEVICE_QUEUE_ENTRY
7270 KeRemoveByKeyDeviceQueue(
7271 IN OUT PKDEVICE_QUEUE DeviceQueue
,
7275 PKDEVICE_QUEUE_ENTRY
7277 KeRemoveDeviceQueue(
7278 IN OUT PKDEVICE_QUEUE DeviceQueue
);
7283 KeRemoveEntryDeviceQueue(
7284 IN OUT PKDEVICE_QUEUE DeviceQueue
,
7285 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
7297 IN OUT PRKEVENT Event
);
7303 IN OUT PRKEVENT Event
,
7304 IN KPRIORITY Increment
,
7312 IN KDPC_IMPORTANCE Importance
);
7317 KeSetPriorityThread(
7318 IN OUT PKTHREAD Thread
,
7319 IN KPRIORITY Priority
);
7325 IN OUT PKTIMER Timer
,
7326 IN LARGE_INTEGER DueTime
,
7327 IN PKDPC Dpc OPTIONAL
);
7333 IN OUT PKTIMER Timer
,
7334 IN LARGE_INTEGER DueTime
,
7335 IN LONG Period OPTIONAL
,
7336 IN PKDPC Dpc OPTIONAL
);
7341 KeStallExecutionProcessor(
7342 IN ULONG MicroSeconds
);
7347 KeSynchronizeExecution(
7348 IN OUT PKINTERRUPT Interrupt
,
7349 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
7350 IN PVOID SynchronizeContext OPTIONAL
);
7355 KeWaitForMultipleObjects(
7358 IN WAIT_TYPE WaitType
,
7359 IN KWAIT_REASON WaitReason
,
7360 IN KPROCESSOR_MODE WaitMode
,
7361 IN BOOLEAN Alertable
,
7362 IN PLARGE_INTEGER Timeout OPTIONAL
,
7363 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
7365 #define KeWaitForMutexObject KeWaitForSingleObject
7370 KeWaitForSingleObject(
7372 IN KWAIT_REASON WaitReason
,
7373 IN KPROCESSOR_MODE WaitMode
,
7374 IN BOOLEAN Alertable
,
7375 IN PLARGE_INTEGER Timeout OPTIONAL
);
7377 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
7379 #if (NTDDI_VERSION >= NTDDI_WINXP)
7384 KeAcquireInStackQueuedSpinLock(
7385 IN OUT PKSPIN_LOCK SpinLock
,
7386 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
7391 KeAcquireInStackQueuedSpinLockAtDpcLevel(
7392 IN OUT PKSPIN_LOCK SpinLock
,
7393 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
7398 KeAcquireInterruptSpinLock(
7399 IN OUT PKINTERRUPT Interrupt
);
7404 KeAreApcsDisabled(VOID
);
7409 KeGetRecommendedSharedDataAlignment(VOID
);
7414 KeQueryRuntimeThread(
7416 OUT PULONG UserTime
);
7421 KeReleaseInStackQueuedSpinLockFromDpcLevel(
7422 IN PKLOCK_QUEUE_HANDLE LockHandle
);
7427 KeReleaseInterruptSpinLock(
7428 IN OUT PKINTERRUPT Interrupt
,
7432 PKDEVICE_QUEUE_ENTRY
7434 KeRemoveByKeyDeviceQueueIfBusy(
7435 IN OUT PKDEVICE_QUEUE DeviceQueue
,
7441 KeReleaseInStackQueuedSpinLock(
7442 IN PKLOCK_QUEUE_HANDLE LockHandle
);
7444 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
7446 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
7451 KeDeregisterBugCheckReasonCallback(
7452 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
7457 KeRegisterBugCheckReasonCallback(
7458 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
,
7459 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
,
7460 IN KBUGCHECK_CALLBACK_REASON Reason
,
7461 IN PUCHAR Component
);
7463 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
7465 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
7469 KeFlushQueuedDpcs(VOID
);
7470 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
7472 #if (NTDDI_VERSION >= NTDDI_WS03)
7477 KeRegisterNmiCallback(
7478 IN PNMI_CALLBACK CallbackRoutine
,
7479 IN PVOID Context OPTIONAL
);
7484 KeDeregisterNmiCallback(
7490 KeInitializeThreadedDpc(
7492 IN PKDEFERRED_ROUTINE DeferredRoutine
,
7493 IN PVOID DeferredContext OPTIONAL
);
7499 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
7500 IN ULONG_PTR Context
);
7505 KeAcquireSpinLockForDpc(
7506 IN OUT PKSPIN_LOCK SpinLock
);
7511 KeReleaseSpinLockForDpc(
7512 IN OUT PKSPIN_LOCK SpinLock
,
7519 IN PKSPIN_LOCK SpinLock
);
7521 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
7523 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
7528 KeTryToAcquireSpinLockAtDpcLevel(
7529 IN OUT PKSPIN_LOCK SpinLock
);
7534 KeAreAllApcsDisabled(VOID
);
7539 KeAcquireGuardedMutex(
7540 IN OUT PKGUARDED_MUTEX GuardedMutex
);
7545 KeAcquireGuardedMutexUnsafe(
7546 IN OUT PKGUARDED_MUTEX GuardedMutex
);
7551 KeEnterGuardedRegion(VOID
);
7556 KeLeaveGuardedRegion(VOID
);
7561 KeInitializeGuardedMutex(
7562 OUT PKGUARDED_MUTEX GuardedMutex
);
7567 KeReleaseGuardedMutexUnsafe(
7568 IN OUT PKGUARDED_MUTEX GuardedMutex
);
7573 KeReleaseGuardedMutex(
7574 IN OUT PKGUARDED_MUTEX GuardedMutex
);
7579 KeTryToAcquireGuardedMutex(
7580 IN OUT PKGUARDED_MUTEX GuardedMutex
);
7582 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
7584 #if (NTDDI_VERSION >= NTDDI_VISTA)
7589 KeAcquireInStackQueuedSpinLockForDpc(
7590 IN OUT PKSPIN_LOCK SpinLock
,
7591 OUT PKLOCK_QUEUE_HANDLE LockHandle
);
7596 KeReleaseInStackQueuedSpinLockForDpc(
7597 IN PKLOCK_QUEUE_HANDLE LockHandle
);
7602 KeQueryDpcWatchdogInformation(
7603 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation
);
7605 #if defined(SINGLE_GROUP_LEGACY_API)
7609 KeSetSystemAffinityThreadEx(
7610 IN KAFFINITY Affinity
);
7615 KeQueryActiveProcessorCount(
7616 OUT PKAFFINITY ActiveProcessors OPTIONAL
);
7621 KeQueryMaximumProcessorCount(VOID
);
7624 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
7626 #if (NTDDI_VERSION >= NTDDI_WS08)
7629 KeRegisterProcessorChangeCallback(
7630 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction
,
7631 IN PVOID CallbackContext OPTIONAL
,
7635 KeDeregisterProcessorChangeCallback(
7636 IN PVOID CallbackHandle
);
7638 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
7640 #if (NTDDI_VERSION >= NTDDI_WIN7)
7644 KeQueryTotalCycleTimeProcess(
7645 IN OUT PKPROCESS Process
,
7646 OUT PULONG64 CycleTimeStamp
);
7650 KeQueryTotalCycleTimeThread(
7651 IN OUT PKTHREAD Thread
,
7652 OUT PULONG64 CycleTimeStamp
);
7657 KeSetTargetProcessorDpcEx(
7659 IN PPROCESSOR_NUMBER ProcNumber
);
7664 KeSetSystemGroupAffinityThread(
7665 IN PGROUP_AFFINITY Affinity
,
7666 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL
);
7671 KeRevertToUserGroupAffinityThread(
7672 IN PGROUP_AFFINITY PreviousAffinity
);
7677 KeSetCoalescableTimer(
7678 IN OUT PKTIMER Timer
,
7679 IN LARGE_INTEGER DueTime
,
7681 IN ULONG TolerableDelay
,
7682 IN PKDPC Dpc OPTIONAL
);
7687 KeQueryUnbiasedInterruptTime(VOID
);
7692 KeQueryActiveProcessorCountEx(
7693 IN USHORT GroupNumber
);
7698 KeQueryMaximumProcessorCountEx(
7699 IN USHORT GroupNumber
);
7704 KeQueryActiveGroupCount(VOID
);
7709 KeQueryMaximumGroupCount(VOID
);
7714 KeQueryGroupAffinity(
7715 IN USHORT GroupNumber
);
7720 KeGetCurrentProcessorNumberEx(
7721 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL
);
7726 KeQueryNodeActiveAffinity(
7727 IN USHORT NodeNumber
,
7728 OUT PGROUP_AFFINITY Affinity OPTIONAL
,
7729 OUT PUSHORT Count OPTIONAL
);
7734 KeQueryNodeMaximumProcessorCount(
7735 IN USHORT NodeNumber
);
7740 KeQueryHighestNodeNumber(VOID
);
7745 KeGetCurrentNodeNumber(VOID
);
7750 KeQueryLogicalProcessorRelationship(
7751 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL
,
7752 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType
,
7753 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL
,
7754 IN OUT PULONG Length
);
7759 KeSaveExtendedProcessorState(
7761 OUT PXSTATE_SAVE XStateSave
);
7766 KeRestoreExtendedProcessorState(
7767 IN PXSTATE_SAVE XStateSave
);
7769 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
7771 #if !defined(_IA64_)
7775 KeFlushWriteBuffer(VOID
);
7779 * KeInitializeCallbackRecord(
7780 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
7782 #define KeInitializeCallbackRecord(CallbackRecord) \
7783 CallbackRecord->State = BufferEmpty;
7787 #if (NTDDI_VERSION >= NTDDI_VISTA)
7788 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
7790 #define PAGED_ASSERT( exp ) ASSERT( exp )
7793 #define PAGED_CODE() { \
7794 if (KeGetCurrentIrql() > APC_LEVEL) { \
7795 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
7796 PAGED_ASSERT(FALSE); \
7802 #define PAGED_CODE()
7806 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
7808 /******************************************************************************
7809 * Memory manager Functions *
7810 ******************************************************************************/
7812 /* Alignment Macros */
7813 #define ALIGN_DOWN_BY(size, align) \
7814 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
7816 #define ALIGN_UP_BY(size, align) \
7817 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
7819 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
7820 ((PVOID)ALIGN_DOWN_BY(ptr, align))
7822 #define ALIGN_UP_POINTER_BY(ptr, align) \
7823 ((PVOID)ALIGN_UP_BY(ptr, align))
7825 #define ALIGN_DOWN(size, type) \
7826 ALIGN_DOWN_BY(size, sizeof(type))
7828 #define ALIGN_UP(size, type) \
7829 ALIGN_UP_BY(size, sizeof(type))
7831 #define ALIGN_DOWN_POINTER(ptr, type) \
7832 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
7834 #define ALIGN_UP_POINTER(ptr, type) \
7835 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
7841 #define BYTE_OFFSET(Va) \
7842 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
7848 #define BYTES_TO_PAGES(Size) \
7849 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
7855 #define PAGE_ALIGN(Va) \
7856 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
7860 * IN ULONG_PTR Size)
7862 #define ROUND_TO_PAGES(Size) \
7863 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
7866 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
7870 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
7871 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
7872 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
7876 * MmGetMdlByteCount(
7879 #define MmGetMdlByteCount(_Mdl) \
7884 * MmGetMdlByteOffset(
7887 #define MmGetMdlByteOffset(_Mdl) \
7888 ((_Mdl)->ByteOffset)
7895 #define MmGetMdlPfnArray(_Mdl) \
7896 ((PPFN_NUMBER) ((_Mdl) + 1))
7900 * MmGetMdlVirtualAddress(
7903 #define MmGetMdlVirtualAddress(_Mdl) \
7904 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
7906 #define MmGetProcedureAddress(Address) (Address)
7908 /* PVOID MmGetSystemAddressForMdl(
7911 #define MmGetSystemAddressForMdl(Mdl) \
7912 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
7913 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
7914 ((Mdl)->MappedSystemVa) : \
7915 (MmMapLockedPages((Mdl), KernelMode)))
7918 * MmGetSystemAddressForMdlSafe(
7920 * IN MM_PAGE_PRIORITY Priority)
7922 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
7923 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
7924 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
7925 (_Mdl)->MappedSystemVa : \
7926 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
7927 KernelMode, MmCached, NULL, FALSE, (_Priority)))
7932 * IN PMDL MemoryDescriptorList,
7936 #define MmInitializeMdl(_MemoryDescriptorList, \
7940 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
7941 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
7942 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
7943 (_MemoryDescriptorList)->MdlFlags = 0; \
7944 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
7945 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
7946 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
7951 * MmPrepareMdlForReuse(
7954 #define MmPrepareMdlForReuse(_Mdl) \
7956 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
7957 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
7958 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
7959 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
7960 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
7964 #if (NTDDI_VERSION >= NTDDI_WIN2K)
7969 MmAllocateContiguousMemory(
7970 IN SIZE_T NumberOfBytes
,
7971 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
7976 MmAllocateContiguousMemorySpecifyCache(
7977 IN SIZE_T NumberOfBytes
,
7978 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
7979 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
7980 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
7981 IN MEMORY_CACHING_TYPE CacheType
);
7986 MmAllocatePagesForMdl(
7987 IN PHYSICAL_ADDRESS LowAddress
,
7988 IN PHYSICAL_ADDRESS HighAddress
,
7989 IN PHYSICAL_ADDRESS SkipBytes
,
7990 IN SIZE_T TotalBytes
);
7995 MmBuildMdlForNonPagedPool(
7996 IN OUT PMDLX MemoryDescriptorList
);
7998 //DECLSPEC_DEPRECATED_DDK
8003 IN PMDL MemoryDescriptorList OPTIONAL
,
8010 MmFreeContiguousMemory(
8011 IN PVOID BaseAddress
);
8016 MmFreeContiguousMemorySpecifyCache(
8017 IN PVOID BaseAddress
,
8018 IN SIZE_T NumberOfBytes
,
8019 IN MEMORY_CACHING_TYPE CacheType
);
8025 IN PMDLX MemoryDescriptorList
);
8030 MmGetSystemRoutineAddress(
8031 IN PUNICODE_STRING SystemRoutineName
);
8036 MmIsDriverVerifying(
8037 IN
struct _DRIVER_OBJECT
*DriverObject
);
8042 MmLockPagableDataSection(
8043 IN PVOID AddressWithinSection
);
8049 IN PHYSICAL_ADDRESS PhysicalAddress
,
8050 IN SIZE_T NumberOfBytes
,
8051 IN MEMORY_CACHING_TYPE CacheEnable
);
8057 IN PMDL MemoryDescriptorList
,
8058 IN KPROCESSOR_MODE AccessMode
);
8063 MmMapLockedPagesSpecifyCache(
8064 IN PMDLX MemoryDescriptorList
,
8065 IN KPROCESSOR_MODE AccessMode
,
8066 IN MEMORY_CACHING_TYPE CacheType
,
8067 IN PVOID BaseAddress OPTIONAL
,
8068 IN ULONG BugCheckOnFailure
,
8069 IN MM_PAGE_PRIORITY Priority
);
8075 IN PVOID AddressWithinSection
);
8080 MmProbeAndLockPages(
8081 IN OUT PMDL MemoryDescriptorList
,
8082 IN KPROCESSOR_MODE AccessMode
,
8083 IN LOCK_OPERATION Operation
);
8088 MmQuerySystemSize(VOID
);
8093 MmResetDriverPaging(
8094 IN PVOID AddressWithinSection
);
8106 MmUnlockPagableImageSection(
8107 IN PVOID ImageSectionHandle
);
8113 IN OUT PMDL MemoryDescriptorList
);
8119 IN PVOID BaseAddress
,
8120 IN SIZE_T NumberOfBytes
);
8125 MmProbeAndLockProcessPages(
8126 IN OUT PMDL MemoryDescriptorList
,
8127 IN PEPROCESS Process
,
8128 IN KPROCESSOR_MODE AccessMode
,
8129 IN LOCK_OPERATION Operation
);
8135 IN PVOID BaseAddress
,
8136 IN PMDL MemoryDescriptorList
);
8138 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8140 #if (NTDDI_VERSION >= NTDDI_WINXP)
8147 IN ULONG NumberOfBytes
);
8152 MmAllocateMappingAddress(
8153 IN SIZE_T NumberOfBytes
,
8159 MmFreeMappingAddress(
8160 IN PVOID BaseAddress
,
8166 MmIsVerifierEnabled(
8167 OUT PULONG VerifierFlags
);
8172 MmMapLockedPagesWithReservedMapping(
8173 IN PVOID MappingAddress
,
8175 IN PMDL MemoryDescriptorList
,
8176 IN MEMORY_CACHING_TYPE CacheType
);
8181 MmProtectMdlSystemAddress(
8182 IN PMDL MemoryDescriptorList
,
8183 IN ULONG NewProtect
);
8188 MmUnmapReservedMapping(
8189 IN PVOID BaseAddress
,
8191 IN PMDL MemoryDescriptorList
);
8193 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
8195 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8199 MmAllocatePagesForMdlEx(
8200 IN PHYSICAL_ADDRESS LowAddress
,
8201 IN PHYSICAL_ADDRESS HighAddress
,
8202 IN PHYSICAL_ADDRESS SkipBytes
,
8203 IN SIZE_T TotalBytes
,
8204 IN MEMORY_CACHING_TYPE CacheType
,
8208 /******************************************************************************
8209 * Security Manager Functions *
8210 ******************************************************************************/
8212 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8218 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
8219 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
8220 IN BOOLEAN SubjectContextLocked
,
8221 IN ACCESS_MASK DesiredAccess
,
8222 IN ACCESS_MASK PreviouslyGrantedAccess
,
8223 OUT PPRIVILEGE_SET
*Privileges OPTIONAL
,
8224 IN PGENERIC_MAPPING GenericMapping
,
8225 IN KPROCESSOR_MODE AccessMode
,
8226 OUT PACCESS_MASK GrantedAccess
,
8227 OUT PNTSTATUS AccessStatus
);
8233 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
8234 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
8235 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
8236 IN BOOLEAN IsDirectoryObject
,
8237 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
8238 IN PGENERIC_MAPPING GenericMapping
,
8239 IN POOL_TYPE PoolType
);
8245 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
8246 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
8247 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
8248 IN GUID
*ObjectType OPTIONAL
,
8249 IN BOOLEAN IsDirectoryObject
,
8250 IN ULONG AutoInheritFlags
,
8251 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
8252 IN PGENERIC_MAPPING GenericMapping
,
8253 IN POOL_TYPE PoolType
);
8259 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
);
8264 SeValidSecurityDescriptor(
8266 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
8271 SeObjectCreateSaclAccessBits(
8272 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
8277 SeReleaseSubjectContext(
8278 IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext
);
8283 SeUnlockSubjectContext(
8284 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
);
8289 SeCaptureSubjectContext(
8290 OUT PSECURITY_SUBJECT_CONTEXT SubjectContext
);
8295 SeLockSubjectContext(
8296 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
);
8298 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
8300 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
8304 SeSetAuditParameter(
8305 IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters
,
8306 IN SE_ADT_PARAMETER_TYPE Type
,
8312 SeReportSecurityEvent(
8314 IN PUNICODE_STRING SourceName
,
8315 IN PSID UserSid OPTIONAL
,
8316 IN PSE_ADT_PARAMETER_ARRAY AuditParameters
);
8318 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
8320 #if (NTDDI_VERSION >= NTDDI_VISTA)
8325 SeComputeAutoInheritByObjectType(
8326 IN PVOID ObjectType
,
8327 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
,
8328 IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL
);
8330 #ifdef SE_NTFS_WORLD_CACHE
8334 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
8335 IN PGENERIC_MAPPING GenericMapping
,
8336 OUT PACCESS_MASK GrantedAccess
);
8337 #endif /* SE_NTFS_WORLD_CACHE */
8339 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
8341 /******************************************************************************
8342 * Configuration Manager Functions *
8343 ******************************************************************************/
8345 #if (NTDDI_VERSION >= NTDDI_WINXP)
8350 IN PEX_CALLBACK_FUNCTION Function
,
8351 IN PVOID Context OPTIONAL
,
8352 OUT PLARGE_INTEGER Cookie
);
8357 CmUnRegisterCallback(
8358 IN LARGE_INTEGER Cookie
);
8362 /******************************************************************************
8363 * I/O Manager Functions *
8364 ******************************************************************************/
8366 #if !defined(_M_AMD64)
8370 READ_PORT_BUFFER_UCHAR(
8378 READ_PORT_BUFFER_ULONG(
8386 READ_PORT_BUFFER_USHORT(
8412 READ_REGISTER_BUFFER_UCHAR(
8420 READ_REGISTER_BUFFER_ULONG(
8428 READ_REGISTER_BUFFER_USHORT(
8429 IN PUSHORT Register
,
8436 READ_REGISTER_UCHAR(
8437 IN PUCHAR Register
);
8442 READ_REGISTER_ULONG(
8443 IN PULONG Register
);
8448 READ_REGISTER_USHORT(
8449 IN PUSHORT Register
);
8454 WRITE_PORT_BUFFER_UCHAR(
8462 WRITE_PORT_BUFFER_ULONG(
8470 WRITE_PORT_BUFFER_USHORT(
8499 WRITE_REGISTER_BUFFER_UCHAR(
8507 WRITE_REGISTER_BUFFER_ULONG(
8515 WRITE_REGISTER_BUFFER_USHORT(
8516 IN PUSHORT Register
,
8523 WRITE_REGISTER_UCHAR(
8530 WRITE_REGISTER_ULONG(
8537 WRITE_REGISTER_USHORT(
8538 IN PUSHORT Register
,
8545 READ_PORT_BUFFER_UCHAR(
8550 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
8555 READ_PORT_BUFFER_ULONG(
8560 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
8565 READ_PORT_BUFFER_USHORT(
8570 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
8578 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
8586 return __indword((USHORT
)(ULONG_PTR
)Port
);
8594 return __inword((USHORT
)(ULONG_PTR
)Port
);
8599 READ_REGISTER_BUFFER_UCHAR(
8604 __movsb(Register
, Buffer
, Count
);
8609 READ_REGISTER_BUFFER_ULONG(
8614 __movsd(Register
, Buffer
, Count
);
8619 READ_REGISTER_BUFFER_USHORT(
8620 IN PUSHORT Register
,
8624 __movsw(Register
, Buffer
, Count
);
8629 READ_REGISTER_UCHAR(
8630 IN
volatile UCHAR
*Register
)
8637 READ_REGISTER_ULONG(
8638 IN
volatile ULONG
*Register
)
8645 READ_REGISTER_USHORT(
8646 IN
volatile USHORT
*Register
)
8653 WRITE_PORT_BUFFER_UCHAR(
8658 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
8663 WRITE_PORT_BUFFER_ULONG(
8668 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
8673 WRITE_PORT_BUFFER_USHORT(
8678 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
8687 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
8696 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
8705 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
8710 WRITE_REGISTER_BUFFER_UCHAR(
8716 __movsb(Register
, Buffer
, Count
);
8717 InterlockedOr(&Synch
, 1);
8722 WRITE_REGISTER_BUFFER_ULONG(
8728 __movsd(Register
, Buffer
, Count
);
8729 InterlockedOr(&Synch
, 1);
8734 WRITE_REGISTER_BUFFER_USHORT(
8735 IN PUSHORT Register
,
8740 __movsw(Register
, Buffer
, Count
);
8741 InterlockedOr(&Synch
, 1);
8746 WRITE_REGISTER_UCHAR(
8747 IN
volatile UCHAR
*Register
,
8752 InterlockedOr(&Synch
, 1);
8757 WRITE_REGISTER_ULONG(
8758 IN
volatile ULONG
*Register
,
8763 InterlockedOr(&Synch
, 1);
8768 WRITE_REGISTER_USHORT(
8769 IN
volatile USHORT
*Register
,
8774 InterlockedOr(&Sync
, 1);
8778 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
8779 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
8781 #define DMA_MACROS_DEFINED
8785 IoAllocateAdapterChannel(
8786 IN PDMA_ADAPTER DmaAdapter
,
8787 IN PDEVICE_OBJECT DeviceObject
,
8788 IN ULONG NumberOfMapRegisters
,
8789 IN PDRIVER_CONTROL ExecutionRoutine
,
8792 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
8793 AllocateAdapterChannel
=
8794 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
8795 ASSERT(AllocateAdapterChannel
);
8796 return AllocateAdapterChannel(DmaAdapter
,
8798 NumberOfMapRegisters
,
8806 IoFlushAdapterBuffers(
8807 IN PDMA_ADAPTER DmaAdapter
,
8809 IN PVOID MapRegisterBase
,
8812 IN BOOLEAN WriteToDevice
)
8814 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
8815 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
8816 ASSERT(FlushAdapterBuffers
);
8817 return FlushAdapterBuffers(DmaAdapter
,
8828 IoFreeAdapterChannel(
8829 IN PDMA_ADAPTER DmaAdapter
)
8831 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
8832 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
8833 ASSERT(FreeAdapterChannel
);
8834 FreeAdapterChannel(DmaAdapter
);
8841 IN PDMA_ADAPTER DmaAdapter
,
8842 IN PVOID MapRegisterBase
,
8843 IN ULONG NumberOfMapRegisters
)
8845 PFREE_MAP_REGISTERS FreeMapRegisters
;
8846 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
8847 ASSERT(FreeMapRegisters
);
8848 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
8855 IN PDMA_ADAPTER DmaAdapter
,
8857 IN PVOID MapRegisterBase
,
8859 IN OUT PULONG Length
,
8860 IN BOOLEAN WriteToDevice
)
8862 PMAP_TRANSFER MapTransfer
;
8864 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
8865 ASSERT(MapTransfer
);
8866 return MapTransfer(DmaAdapter
,
8875 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8880 IoAcquireCancelSpinLock(
8886 IoAcquireRemoveLockEx(
8887 IN PIO_REMOVE_LOCK RemoveLock
,
8888 IN PVOID Tag OPTIONAL
,
8891 IN ULONG RemlockSize
);
8897 * IoAcquireRemoveLock(
8898 * IN PIO_REMOVE_LOCK RemoveLock,
8899 * IN OPTIONAL PVOID Tag)
8902 #define IoAcquireRemoveLock(RemoveLock, Tag) \
8903 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
8905 #define IoAcquireRemoveLock(RemoveLock, Tag) \
8906 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
8911 * IoAdjustPagingPathCount(
8913 * IN BOOLEAN Increment)
8915 #define IoAdjustPagingPathCount(_Count, \
8920 InterlockedIncrement(_Count); \
8924 InterlockedDecrement(_Count); \
8928 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8933 IoAllocateDriverObjectExtension(
8934 IN PDRIVER_OBJECT DriverObject
,
8935 IN PVOID ClientIdentificationAddress
,
8936 IN ULONG DriverObjectExtensionSize
,
8937 OUT PVOID
*DriverObjectExtension
);
8942 IoAllocateErrorLogEntry(
8944 IN UCHAR EntrySize
);
8951 IN BOOLEAN ChargeQuota
);
8957 IN PVOID VirtualAddress OPTIONAL
,
8959 IN BOOLEAN SecondaryBuffer
,
8960 IN BOOLEAN ChargeQuota
,
8961 IN OUT PIRP Irp OPTIONAL
);
8967 IN PDEVICE_OBJECT DeviceObject
);
8973 IN PDEVICE_OBJECT SourceDevice
,
8974 IN PUNICODE_STRING TargetDevice
,
8975 OUT PDEVICE_OBJECT
*AttachedDevice
);
8980 IoAttachDeviceToDeviceStack(
8981 IN PDEVICE_OBJECT SourceDevice
,
8982 IN PDEVICE_OBJECT TargetDevice
);
8987 IoBuildAsynchronousFsdRequest(
8988 IN ULONG MajorFunction
,
8989 IN PDEVICE_OBJECT DeviceObject
,
8990 IN OUT PVOID Buffer OPTIONAL
,
8991 IN ULONG Length OPTIONAL
,
8992 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
8993 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
8998 IoBuildDeviceIoControlRequest(
8999 IN ULONG IoControlCode
,
9000 IN PDEVICE_OBJECT DeviceObject
,
9001 IN PVOID InputBuffer OPTIONAL
,
9002 IN ULONG InputBufferLength
,
9003 OUT PVOID OutputBuffer OPTIONAL
,
9004 IN ULONG OutputBufferLength
,
9005 IN BOOLEAN InternalDeviceIoControl
,
9007 OUT PIO_STATUS_BLOCK IoStatusBlock
);
9014 IN OUT PMDL TargetMdl
,
9015 IN PVOID VirtualAddress
,
9021 IoBuildSynchronousFsdRequest(
9022 IN ULONG MajorFunction
,
9023 IN PDEVICE_OBJECT DeviceObject
,
9024 IN OUT PVOID Buffer OPTIONAL
,
9025 IN ULONG Length OPTIONAL
,
9026 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
9028 OUT PIO_STATUS_BLOCK IoStatusBlock
);
9034 IN PDEVICE_OBJECT DeviceObject
,
9036 #define IoCallDriver IofCallDriver
9043 IN CCHAR PriorityBoost
);
9044 #define IoCompleteRequest IofCompleteRequest
9056 IN ACCESS_MASK DesiredAccess
,
9057 IN ULONG DesiredShareAccess
,
9058 IN OUT PFILE_OBJECT FileObject
,
9059 IN OUT PSHARE_ACCESS ShareAccess
,
9067 IN CCHAR PriorityBoost
);
9073 OUT PKINTERRUPT
*InterruptObject
,
9074 IN PKSERVICE_ROUTINE ServiceRoutine
,
9075 IN PVOID ServiceContext OPTIONAL
,
9076 IN PKSPIN_LOCK SpinLock OPTIONAL
,
9079 IN KIRQL SynchronizeIrql
,
9080 IN KINTERRUPT_MODE InterruptMode
,
9081 IN BOOLEAN ShareVector
,
9082 IN KAFFINITY ProcessorEnableMask
,
9083 IN BOOLEAN FloatingSave
);
9089 IN PDRIVER_OBJECT DriverObject
,
9090 IN ULONG DeviceExtensionSize
,
9091 IN PUNICODE_STRING DeviceName OPTIONAL
,
9092 IN DEVICE_TYPE DeviceType
,
9093 IN ULONG DeviceCharacteristics
,
9094 IN BOOLEAN Exclusive
,
9095 OUT PDEVICE_OBJECT
*DeviceObject
);
9101 OUT PHANDLE FileHandle
,
9102 IN ACCESS_MASK DesiredAccess
,
9103 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9104 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9105 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
9106 IN ULONG FileAttributes
,
9107 IN ULONG ShareAccess
,
9108 IN ULONG Disposition
,
9109 IN ULONG CreateOptions
,
9110 IN PVOID EaBuffer OPTIONAL
,
9112 IN CREATE_FILE_TYPE CreateFileType
,
9113 IN PVOID InternalParameters OPTIONAL
,
9119 IoCreateNotificationEvent(
9120 IN PUNICODE_STRING EventName
,
9121 OUT PHANDLE EventHandle
);
9126 IoCreateSymbolicLink(
9127 IN PUNICODE_STRING SymbolicLinkName
,
9128 IN PUNICODE_STRING DeviceName
);
9133 IoCreateSynchronizationEvent(
9134 IN PUNICODE_STRING EventName
,
9135 OUT PHANDLE EventHandle
);
9140 IoCreateUnprotectedSymbolicLink(
9141 IN PUNICODE_STRING SymbolicLinkName
,
9142 IN PUNICODE_STRING DeviceName
);
9148 IN PDEVICE_OBJECT DeviceObject
);
9153 IoDeleteSymbolicLink(
9154 IN PUNICODE_STRING SymbolicLinkName
);
9160 IN OUT PDEVICE_OBJECT TargetDevice
);
9165 IoDisconnectInterrupt(
9166 IN PKINTERRUPT InterruptObject
);
9184 IN PIO_WORKITEM IoWorkItem
);
9189 IoGetAttachedDevice(
9190 IN PDEVICE_OBJECT DeviceObject
);
9195 IoGetAttachedDeviceReference(
9196 IN PDEVICE_OBJECT DeviceObject
);
9201 IoGetBootDiskInformation(
9202 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
9208 IoGetDeviceInterfaceAlias(
9209 IN PUNICODE_STRING SymbolicLinkName
,
9210 IN CONST GUID
*AliasInterfaceClassGuid
,
9211 OUT PUNICODE_STRING AliasSymbolicLinkName
);
9216 IoGetCurrentProcess(VOID
);
9221 IoGetDeviceInterfaces(
9222 IN CONST GUID
*InterfaceClassGuid
,
9223 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
9225 OUT PWSTR
*SymbolicLinkList
);
9230 IoGetDeviceObjectPointer(
9231 IN PUNICODE_STRING ObjectName
,
9232 IN ACCESS_MASK DesiredAccess
,
9233 OUT PFILE_OBJECT
*FileObject
,
9234 OUT PDEVICE_OBJECT
*DeviceObject
);
9239 IoGetDeviceProperty(
9240 IN PDEVICE_OBJECT DeviceObject
,
9241 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
9242 IN ULONG BufferLength
,
9243 OUT PVOID PropertyBuffer
,
9244 OUT PULONG ResultLength
);
9250 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
9251 IN PDEVICE_DESCRIPTION DeviceDescription
,
9252 IN OUT PULONG NumberOfMapRegisters
);
9257 IoGetDriverObjectExtension(
9258 IN PDRIVER_OBJECT DriverObject
,
9259 IN PVOID ClientIdentificationAddress
);
9264 IoGetInitialStack(VOID
);
9269 IoGetRelatedDeviceObject(
9270 IN PFILE_OBJECT FileObject
);
9276 IN PIO_WORKITEM IoWorkItem
,
9277 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
9278 IN WORK_QUEUE_TYPE QueueType
,
9279 IN PVOID Context OPTIONAL
);
9286 IN USHORT PacketSize
,
9287 IN CCHAR StackSize
);
9292 IoInitializeRemoveLockEx(
9293 IN PIO_REMOVE_LOCK Lock
,
9294 IN ULONG AllocateTag
,
9295 IN ULONG MaxLockedMinutes
,
9296 IN ULONG HighWatermark
,
9297 IN ULONG RemlockSize
);
9303 IN PDEVICE_OBJECT DeviceObject
,
9304 IN PIO_TIMER_ROUTINE TimerRoutine
,
9305 IN PVOID Context OPTIONAL
);
9310 IoInvalidateDeviceRelations(
9311 IN PDEVICE_OBJECT DeviceObject
,
9312 IN DEVICE_RELATION_TYPE Type
);
9317 IoInvalidateDeviceState(
9318 IN PDEVICE_OBJECT PhysicalDeviceObject
);
9323 IoIsWdmVersionAvailable(
9324 IN UCHAR MajorVersion
,
9325 IN UCHAR MinorVersion
);
9330 IoOpenDeviceInterfaceRegistryKey(
9331 IN PUNICODE_STRING SymbolicLinkName
,
9332 IN ACCESS_MASK DesiredAccess
,
9333 OUT PHANDLE DeviceInterfaceKey
);
9338 IoOpenDeviceRegistryKey(
9339 IN PDEVICE_OBJECT DeviceObject
,
9340 IN ULONG DevInstKeyType
,
9341 IN ACCESS_MASK DesiredAccess
,
9342 OUT PHANDLE DevInstRegKey
);
9347 IoRegisterDeviceInterface(
9348 IN PDEVICE_OBJECT PhysicalDeviceObject
,
9349 IN CONST GUID
*InterfaceClassGuid
,
9350 IN PUNICODE_STRING ReferenceString OPTIONAL
,
9351 OUT PUNICODE_STRING SymbolicLinkName
);
9356 IoRegisterPlugPlayNotification(
9357 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
9358 IN ULONG EventCategoryFlags
,
9359 IN PVOID EventCategoryData OPTIONAL
,
9360 IN PDRIVER_OBJECT DriverObject
,
9361 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
9362 IN OUT PVOID Context OPTIONAL
,
9363 OUT PVOID
*NotificationEntry
);
9368 IoRegisterShutdownNotification(
9369 IN PDEVICE_OBJECT DeviceObject
);
9374 IoReleaseCancelSpinLock(
9380 IoReleaseRemoveLockAndWaitEx(
9381 IN PIO_REMOVE_LOCK RemoveLock
,
9382 IN PVOID Tag OPTIONAL
,
9383 IN ULONG RemlockSize
);
9388 IoReleaseRemoveLockEx(
9389 IN PIO_REMOVE_LOCK RemoveLock
,
9390 IN PVOID Tag OPTIONAL
,
9391 IN ULONG RemlockSize
);
9396 IoRemoveShareAccess(
9397 IN PFILE_OBJECT FileObject
,
9398 IN OUT PSHARE_ACCESS ShareAccess
);
9403 IoReportTargetDeviceChange(
9404 IN PDEVICE_OBJECT PhysicalDeviceObject
,
9405 IN PVOID NotificationStructure
);
9410 IoReportTargetDeviceChangeAsynchronous(
9411 IN PDEVICE_OBJECT PhysicalDeviceObject
,
9412 IN PVOID NotificationStructure
,
9413 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
9414 IN PVOID Context OPTIONAL
);
9419 IoRequestDeviceEject(
9420 IN PDEVICE_OBJECT PhysicalDeviceObject
);
9427 IN NTSTATUS Status
);
9432 IoSetDeviceInterfaceState(
9433 IN PUNICODE_STRING SymbolicLinkName
,
9440 IN ACCESS_MASK DesiredAccess
,
9441 IN ULONG DesiredShareAccess
,
9442 IN OUT PFILE_OBJECT FileObject
,
9443 OUT PSHARE_ACCESS ShareAccess
);
9449 IN PDEVICE_OBJECT DeviceObject
,
9450 IN BOOLEAN Cancelable
);
9455 IoStartNextPacketByKey(
9456 IN PDEVICE_OBJECT DeviceObject
,
9457 IN BOOLEAN Cancelable
,
9464 IN PDEVICE_OBJECT DeviceObject
,
9466 IN PULONG Key OPTIONAL
,
9467 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
9473 IN PDEVICE_OBJECT DeviceObject
);
9479 IN PDEVICE_OBJECT DeviceObject
);
9484 IoUnregisterPlugPlayNotification(
9485 IN PVOID NotificationEntry
);
9490 IoUnregisterShutdownNotification(
9491 IN PDEVICE_OBJECT DeviceObject
);
9496 IoUpdateShareAccess(
9497 IN PFILE_OBJECT FileObject
,
9498 IN OUT PSHARE_ACCESS ShareAccess
);
9503 IoWMIAllocateInstanceIds(
9505 IN ULONG InstanceCount
,
9506 OUT ULONG
*FirstInstanceId
);
9511 IoWMIQuerySingleInstanceMultiple(
9512 IN PVOID
*DataBlockObjectList
,
9513 IN PUNICODE_STRING InstanceNames
,
9514 IN ULONG ObjectCount
,
9515 IN OUT ULONG
*InOutBufferSize
,
9516 OUT PVOID OutBuffer
);
9521 IoWMIRegistrationControl(
9522 IN PDEVICE_OBJECT DeviceObject
,
9528 IoWMISuggestInstanceName(
9529 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
9530 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
9531 IN BOOLEAN CombineNames
,
9532 OUT PUNICODE_STRING SuggestedInstanceName
);
9538 IN PVOID WnodeEventItem
);
9543 IoWriteErrorLogEntry(
9546 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
9548 #if (NTDDI_VERSION >= NTDDI_WINXP)
9555 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
9556 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
9557 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
9558 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
9559 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
9560 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
9568 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
);
9575 IN PIO_CSQ_IRP_CONTEXT Context
);
9582 IN PVOID PeekContext
);
9587 IoForwardIrpSynchronously(
9588 IN PDEVICE_OBJECT DeviceObject
,
9591 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
9596 IoFreeErrorLogEntry(
9602 IoSetCompletionRoutineEx(
9603 IN PDEVICE_OBJECT DeviceObject
,
9605 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
9607 IN BOOLEAN InvokeOnSuccess
,
9608 IN BOOLEAN InvokeOnError
,
9609 IN BOOLEAN InvokeOnCancel
);
9613 IoSetStartIoAttributes(
9614 IN PDEVICE_OBJECT DeviceObject
,
9615 IN BOOLEAN DeferredStartIo
,
9616 IN BOOLEAN NonCancelable
);
9621 IoWMIDeviceObjectToInstanceName(
9622 IN PVOID DataBlockObject
,
9623 IN PDEVICE_OBJECT DeviceObject
,
9624 OUT PUNICODE_STRING InstanceName
);
9630 IN PVOID DataBlockObject
,
9631 IN PUNICODE_STRING InstanceName
,
9633 IN ULONG InBufferSize
,
9634 IN OUT PULONG OutBufferSize
,
9635 IN OUT PUCHAR InOutBuffer
);
9640 IoWMIHandleToInstanceName(
9641 IN PVOID DataBlockObject
,
9642 IN HANDLE FileHandle
,
9643 OUT PUNICODE_STRING InstanceName
);
9649 IN GUID
*DataBlockGuid
,
9650 IN ULONG DesiredAccess
,
9651 OUT PVOID
*DataBlockObject
);
9657 IN PVOID DataBlockObject
,
9658 IN OUT ULONG
*InOutBufferSize
,
9659 OUT PVOID OutBuffer
);
9664 IoWMIQueryAllDataMultiple(
9665 IN PVOID
*DataBlockObjectList
,
9666 IN ULONG ObjectCount
,
9667 IN OUT ULONG
*InOutBufferSize
,
9668 OUT PVOID OutBuffer
);
9673 IoWMIQuerySingleInstance(
9674 IN PVOID DataBlockObject
,
9675 IN PUNICODE_STRING InstanceName
,
9676 IN OUT ULONG
*InOutBufferSize
,
9677 OUT PVOID OutBuffer
);
9682 IoWMISetNotificationCallback(
9683 IN OUT PVOID Object
,
9684 IN WMI_NOTIFICATION_CALLBACK Callback
,
9685 IN PVOID Context OPTIONAL
);
9690 IoWMISetSingleInstance(
9691 IN PVOID DataBlockObject
,
9692 IN PUNICODE_STRING InstanceName
,
9694 IN ULONG ValueBufferSize
,
9695 IN PVOID ValueBuffer
);
9701 IN PVOID DataBlockObject
,
9702 IN PUNICODE_STRING InstanceName
,
9703 IN ULONG DataItemId
,
9705 IN ULONG ValueBufferSize
,
9706 IN PVOID ValueBuffer
);
9708 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
9714 IoWMIDeviceObjectToProviderId(
9715 IN PDEVICE_OBJECT DeviceObject
);
9717 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
9723 * IN CCHAR StackSize)
9725 #define IoSizeOfIrp(_StackSize) \
9726 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
9730 IoSkipCurrentIrpStackLocation(
9733 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
9734 Irp
->CurrentLocation
++;
9735 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
9740 IoSetNextIrpStackLocation(
9743 ASSERT(Irp
->CurrentLocation
> 0);
9744 Irp
->CurrentLocation
--;
9745 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
9750 IoGetNextIrpStackLocation(
9753 ASSERT(Irp
->CurrentLocation
> 0);
9754 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
9759 IoSetCompletionRoutine(
9761 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
9762 IN PVOID Context OPTIONAL
,
9763 IN BOOLEAN InvokeOnSuccess
,
9764 IN BOOLEAN InvokeOnError
,
9765 IN BOOLEAN InvokeOnCancel
)
9767 PIO_STACK_LOCATION irpSp
;
9768 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
9769 irpSp
= IoGetNextIrpStackLocation(Irp
);
9770 irpSp
->CompletionRoutine
= CompletionRoutine
;
9771 irpSp
->Context
= Context
;
9774 if (InvokeOnSuccess
) {
9775 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
9778 if (InvokeOnError
) {
9779 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
9782 if (InvokeOnCancel
) {
9783 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
9789 * IoSetCancelRoutine(
9791 * IN PDRIVER_CANCEL CancelRoutine)
9793 #define IoSetCancelRoutine(_Irp, \
9795 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
9796 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
9801 * IN PDEVICE_OBJECT DeviceObject,
9803 * IN PVOID Context);
9805 #define IoRequestDpc(DeviceObject, Irp, Context)( \
9806 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
9810 * IoReleaseRemoveLock(
9811 * IN PIO_REMOVE_LOCK RemoveLock,
9814 #define IoReleaseRemoveLock(_RemoveLock, \
9816 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
9820 * IoReleaseRemoveLockAndWait(
9821 * IN PIO_REMOVE_LOCK RemoveLock,
9824 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
9826 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
9832 IN PIRP Irp OPTIONAL
);
9835 #define PLUGPLAY_REGKEY_DEVICE 1
9836 #define PLUGPLAY_REGKEY_DRIVER 2
9837 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
9841 IoGetCurrentIrpStackLocation(
9844 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
9845 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
9853 IoGetCurrentIrpStackLocation( (Irp
) )->Control
|= SL_PENDING_RETURNED
;
9858 * IoIsErrorUserInduced(
9859 * IN NTSTATUS Status);
9861 #define IoIsErrorUserInduced(Status) \
9862 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
9863 ((Status) == STATUS_IO_TIMEOUT) || \
9864 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
9865 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
9866 ((Status) == STATUS_VERIFY_REQUIRED) || \
9867 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
9868 ((Status) == STATUS_WRONG_VOLUME)))
9871 * IoInitializeRemoveLock(
9872 * IN PIO_REMOVE_LOCK Lock,
9873 * IN ULONG AllocateTag,
9874 * IN ULONG MaxLockedMinutes,
9875 * IN ULONG HighWatermark)
9877 #define IoInitializeRemoveLock( \
9878 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
9879 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
9880 HighWatermark, sizeof(IO_REMOVE_LOCK))
9884 IoInitializeDpcRequest(
9885 IN PDEVICE_OBJECT DeviceObject
,
9886 IN PIO_DPC_ROUTINE DpcRoutine
)
9888 KeInitializeDpc( &DeviceObject
->Dpc
,
9889 (PKDEFERRED_ROUTINE
) DpcRoutine
,
9893 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
9897 * IoGetFunctionCodeFromCtlCode(
9898 * IN ULONG ControlCode)
9900 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
9901 (((_ControlCode) >> 2) & 0x00000FFF)
9905 IoCopyCurrentIrpStackLocationToNext(
9908 PIO_STACK_LOCATION irpSp
;
9909 PIO_STACK_LOCATION nextIrpSp
;
9910 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
9911 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
9912 RtlCopyMemory( nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
9913 nextIrpSp
->Control
= 0;
9920 OUT PULONG_PTR LowLimit
,
9921 OUT PULONG_PTR HighLimit
);
9925 IoGetRemainingStackSize(VOID
)
9927 ULONG_PTR End
, Begin
;
9930 IoGetStackLimits(&Begin
, &End
);
9931 Result
= (ULONG_PTR
)(&End
) - Begin
;
9935 /******************************************************************************
9936 * Power Management Support Functions *
9937 ******************************************************************************/
9939 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
9941 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9947 IN
struct _DEVICE_OBJECT
*DeviceObject
,
9948 IN OUT
struct _IRP
*Irp
);
9953 PoRegisterDeviceForIdleDetection(
9954 IN
struct _DEVICE_OBJECT
*DeviceObject
,
9955 IN ULONG ConservationIdleTime
,
9956 IN ULONG PerformanceIdleTime
,
9957 IN DEVICE_POWER_STATE State
);
9962 PoRegisterSystemState(
9963 IN OUT PVOID StateHandle OPTIONAL
,
9964 IN EXECUTION_STATE Flags
);
9970 IN
struct _DEVICE_OBJECT
*DeviceObject
,
9971 IN UCHAR MinorFunction
,
9972 IN POWER_STATE PowerState
,
9973 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL
,
9974 IN PVOID Context OPTIONAL
,
9975 OUT
struct _IRP
**Irp OPTIONAL
);
9981 IN
struct _DEVICE_OBJECT
*DeviceObject
,
9982 IN POWER_STATE_TYPE Type
,
9983 IN POWER_STATE State
);
9989 IN EXECUTION_STATE Flags
);
9994 PoStartNextPowerIrp(
9995 IN OUT
struct _IRP
*Irp
);
10000 PoUnregisterSystemState(
10001 IN OUT PVOID StateHandle
);
10006 PoRequestShutdownEvent(
10009 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10011 #if (NTDDI_VERSION >= NTDDI_VISTA)
10017 IN OUT
struct _IRP
*Irp
);
10023 IN
struct _IRP
*Irp
);
10028 PoRegisterPowerSettingCallback(
10029 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
10030 IN LPCGUID SettingGuid
,
10031 IN PPOWER_SETTING_CALLBACK Callback
,
10032 IN PVOID Context OPTIONAL
,
10033 OUT PVOID
*Handle OPTIONAL
);
10038 PoUnregisterPowerSettingCallback(
10039 IN OUT PVOID Handle
);
10041 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10043 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
10048 IN OUT PULONG IdlePointer
);
10049 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
10051 #if (NTDDI_VERSION >= NTDDI_WIN7)
10057 IN OUT PULONG IdlePointer
);
10063 IN OUT PULONG IdlePointer
);
10068 PoQueryWatchdogTime(
10069 IN PDEVICE_OBJECT Pdo
,
10070 OUT PULONG SecondsRemaining
);
10075 PoDeletePowerRequest(
10076 IN OUT PVOID PowerRequest
);
10082 IN OUT PVOID PowerRequest
,
10083 IN POWER_REQUEST_TYPE Type
);
10088 PoClearPowerRequest(
10089 IN OUT PVOID PowerRequest
,
10090 IN POWER_REQUEST_TYPE Type
);
10095 PoCreatePowerRequest(
10096 OUT PVOID
*PowerRequest
,
10097 IN PDEVICE_OBJECT DeviceObject
,
10098 IN PCOUNTED_REASON_CONTEXT Context
);
10100 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
10102 /******************************************************************************
10103 * Executive Functions *
10104 ******************************************************************************/
10106 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
10107 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
10108 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
10110 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
10111 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
10112 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
10113 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
10115 #define ExInitializeSListHead InitializeSListHead
10118 #if defined(_NTHAL_)
10119 #define ExAcquireFastMutex ExiAcquireFastMutex
10120 #define ExReleaseFastMutex ExiReleaseFastMutex
10121 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
10123 #define ExInterlockedAddUlong ExfInterlockedAddUlong
10124 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
10125 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
10126 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
10127 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
10128 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
10131 #if defined(_WIN64)
10133 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
10134 defined(_NTHAL_) || defined(_NTOSP_)
10137 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
10141 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
10143 return (USHORT
)(ListHead
->Alignment
& 0xffff);
10149 ExpInterlockedFlushSList(
10150 PSLIST_HEADER ListHead
);
10154 ExpInterlockedPopEntrySList(
10155 PSLIST_HEADER ListHead
);
10159 ExpInterlockedPushEntrySList(
10160 PSLIST_HEADER ListHead
,
10161 PSLIST_ENTRY ListEntry
);
10163 #define ExInterlockedFlushSList(Head) \
10164 ExpInterlockedFlushSList(Head)
10165 #define ExInterlockedPopEntrySList(Head, Lock) \
10166 ExpInterlockedPopEntrySList(Head)
10167 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
10168 ExpInterlockedPushEntrySList(Head, Entry)
10170 #else /* !defined(_WIN64) */
10172 #define ExQueryDepthSList(listhead) (listhead)->Depth
10177 ExInterlockedFlushSList(
10178 IN PSLIST_HEADER ListHead
);
10180 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
10184 ExInterlockedPopEntrySList(
10185 IN PSLIST_HEADER ListHead
,
10186 IN PKSPIN_LOCK Lock
);
10191 ExInterlockedPushEntrySList(
10192 IN PSLIST_HEADER ListHead
,
10193 IN PSINGLE_LIST_ENTRY ListEntry
,
10194 IN PKSPIN_LOCK Lock
);
10196 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
10197 InterlockedPopEntrySList(_ListHead)
10198 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
10199 InterlockedPushEntrySList(_ListHead, _ListEntry)
10200 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
10202 #endif /* !defined(_WIN64) */
10204 /* ERESOURCE_THREAD
10205 * ExGetCurrentResourceThread(
10208 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
10210 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
10213 * ExInitializeWorkItem(
10214 * IN PWORK_QUEUE_ITEM Item,
10215 * IN PWORKER_THREAD_ROUTINE Routine,
10216 * IN PVOID Context)
10218 #define ExInitializeWorkItem(Item, Routine, Context) \
10220 (Item)->WorkerRoutine = Routine; \
10221 (Item)->Parameter = Context; \
10222 (Item)->List.Flink = NULL; \
10227 ExInitializeFastMutex(
10228 OUT PFAST_MUTEX FastMutex
)
10230 FastMutex
->Count
= FM_LOCK_BIT
;
10231 FastMutex
->Owner
= NULL
;
10232 FastMutex
->Contention
= 0;
10233 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
10237 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10242 ExAcquireFastMutex(
10243 IN OUT PFAST_MUTEX FastMutex
);
10248 ExReleaseFastMutex(
10249 IN OUT PFAST_MUTEX FastMutex
);
10254 ExTryToAcquireFastMutex(
10255 IN OUT PFAST_MUTEX FastMutex
);
10260 ExAcquireFastMutexUnsafe(
10261 IN OUT PFAST_MUTEX FastMutex
);
10266 ExReleaseFastMutexUnsafe(
10267 IN OUT PFAST_MUTEX FastMutex
);
10272 ExAcquireResourceExclusiveLite(
10273 IN PERESOURCE Resource
,
10279 ExAcquireResourceSharedLite(
10280 IN PERESOURCE Resource
,
10286 ExAcquireSharedStarveExclusive(
10287 IN PERESOURCE Resource
,
10293 ExAcquireSharedWaitForExclusive(
10294 IN PERESOURCE Resource
,
10301 IN POOL_TYPE PoolType
,
10302 IN SIZE_T NumberOfBytes
);
10304 #ifdef POOL_TAGGING
10305 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
10306 #endif /* POOL_TAGGING */
10311 ExAllocatePoolWithQuota(
10312 IN POOL_TYPE PoolType
,
10313 IN SIZE_T NumberOfBytes
);
10315 #ifdef POOL_TAGGING
10316 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
10317 #endif /* POOL_TAGGING */
10322 ExAllocatePoolWithQuotaTag(
10323 IN POOL_TYPE PoolType
,
10324 IN SIZE_T NumberOfBytes
,
10327 #ifndef POOL_TAGGING
10328 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
10329 #endif /* POOL_TAGGING */
10334 ExAllocatePoolWithTag(
10335 IN POOL_TYPE PoolType
,
10336 IN SIZE_T NumberOfBytes
,
10342 ExAllocatePoolWithTagPriority(
10343 IN POOL_TYPE PoolType
,
10344 IN SIZE_T NumberOfBytes
,
10346 IN EX_POOL_PRIORITY Priority
);
10351 ExConvertExclusiveToSharedLite(
10352 IN PERESOURCE Resource
);
10358 OUT PCALLBACK_OBJECT
*CallbackObject
,
10359 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10361 IN BOOLEAN AllowMultipleCallbacks
);
10366 ExDeleteNPagedLookasideList(
10367 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
10372 ExDeletePagedLookasideList(
10373 IN PPAGED_LOOKASIDE_LIST Lookaside
);
10378 ExDeleteResourceLite(
10379 IN PERESOURCE Resource
);
10387 #ifdef POOL_TAGGING
10388 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
10401 ExGetExclusiveWaiterCount(
10402 IN PERESOURCE Resource
);
10407 ExGetPreviousMode(VOID
);
10412 ExGetSharedWaiterCount(
10413 IN PERESOURCE Resource
);
10418 ExInitializeNPagedLookasideList(
10419 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
10420 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
10421 IN PFREE_FUNCTION Free OPTIONAL
,
10430 ExInitializePagedLookasideList(
10431 IN PPAGED_LOOKASIDE_LIST Lookaside
,
10432 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
10433 IN PFREE_FUNCTION Free OPTIONAL
,
10442 ExInitializeResourceLite(
10443 IN PERESOURCE Resource
);
10448 ExInterlockedAddLargeInteger(
10449 IN PLARGE_INTEGER Addend
,
10450 IN LARGE_INTEGER Increment
,
10451 IN PKSPIN_LOCK Lock
);
10453 #if defined(_WIN64)
10454 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
10455 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
10457 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
10458 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
10464 ExInterlockedAddUlong(
10466 IN ULONG Increment
,
10469 #if defined(_AMD64_) || defined(_IA64_)
10471 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
10472 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
10474 #elif defined(_X86_)
10479 ExfInterlockedCompareExchange64(
10480 IN OUT LONGLONG
volatile *Destination
,
10481 IN PLONGLONG Exchange
,
10482 IN PLONGLONG Comperand
);
10484 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
10485 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
10492 ExInterlockedCompareExchange64(
10493 IN OUT LONGLONG
volatile *Destination
,
10494 IN PLONGLONG Exchange
,
10495 IN PLONGLONG Comparand
,
10496 IN PKSPIN_LOCK Lock
);
10498 #endif /* defined(_AMD64_) || defined(_IA64_) */
10503 ExInterlockedInsertHeadList(
10504 IN PLIST_ENTRY ListHead
,
10505 IN PLIST_ENTRY ListEntry
,
10506 IN PKSPIN_LOCK Lock
);
10511 ExInterlockedInsertTailList(
10512 IN PLIST_ENTRY ListHead
,
10513 IN PLIST_ENTRY ListEntry
,
10514 IN PKSPIN_LOCK Lock
);
10519 ExInterlockedPopEntryList(
10520 IN PSINGLE_LIST_ENTRY ListHead
,
10521 IN PKSPIN_LOCK Lock
);
10526 ExInterlockedPushEntryList(
10527 IN PSINGLE_LIST_ENTRY ListHead
,
10528 IN PSINGLE_LIST_ENTRY ListEntry
,
10529 IN PKSPIN_LOCK Lock
);
10534 ExInterlockedRemoveHeadList(
10535 IN PLIST_ENTRY ListHead
,
10536 IN PKSPIN_LOCK Lock
);
10541 ExIsProcessorFeaturePresent(
10542 IN ULONG ProcessorFeature
);
10547 ExIsResourceAcquiredExclusiveLite(
10548 IN PERESOURCE Resource
);
10553 ExIsResourceAcquiredSharedLite(
10554 IN PERESOURCE Resource
);
10556 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
10561 ExLocalTimeToSystemTime(
10562 IN PLARGE_INTEGER LocalTime
,
10563 OUT PLARGE_INTEGER SystemTime
);
10569 IN PCALLBACK_OBJECT CallbackObject
,
10570 IN PVOID Argument1
,
10571 IN PVOID Argument2
);
10577 IN PWORK_QUEUE_ITEM WorkItem
,
10578 IN WORK_QUEUE_TYPE QueueType
);
10585 IN NTSTATUS Status
);
10590 ExRegisterCallback(
10591 IN PCALLBACK_OBJECT CallbackObject
,
10592 IN PCALLBACK_FUNCTION CallbackFunction
,
10593 IN PVOID CallbackContext
);
10598 ExReinitializeResourceLite(
10599 IN PERESOURCE Resource
);
10604 ExReleaseResourceForThreadLite(
10605 IN PERESOURCE Resource
,
10606 IN ERESOURCE_THREAD ResourceThreadId
);
10611 ExReleaseResourceLite(
10612 IN PERESOURCE Resource
);
10617 ExSetResourceOwnerPointer(
10618 IN PERESOURCE Resource
,
10619 IN PVOID OwnerPointer
);
10624 ExSetTimerResolution(
10625 IN ULONG DesiredTime
,
10626 IN BOOLEAN SetResolution
);
10631 ExSystemTimeToLocalTime(
10632 IN PLARGE_INTEGER SystemTime
,
10633 OUT PLARGE_INTEGER LocalTime
);
10638 ExUnregisterCallback(
10639 IN PVOID CbRegistration
);
10641 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10643 #if (NTDDI_VERSION >= NTDDI_WINXP)
10648 ExAcquireRundownProtection(
10649 IN OUT PEX_RUNDOWN_REF RunRef
);
10654 ExInitializeRundownProtection(
10655 OUT PEX_RUNDOWN_REF RunRef
);
10660 ExReInitializeRundownProtection(
10661 OUT PEX_RUNDOWN_REF RunRef
);
10666 ExReleaseRundownProtection(
10667 IN OUT PEX_RUNDOWN_REF RunRef
);
10672 ExRundownCompleted(
10673 OUT PEX_RUNDOWN_REF RunRef
);
10679 IN SUITE_TYPE SuiteType
);
10684 ExWaitForRundownProtectionRelease(
10685 IN OUT PEX_RUNDOWN_REF RunRef
);
10687 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
10689 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
10694 ExAcquireRundownProtectionEx(
10695 IN OUT PEX_RUNDOWN_REF RunRef
,
10701 ExReleaseRundownProtectionEx(
10702 IN OUT PEX_RUNDOWN_REF RunRef
,
10705 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
10707 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
10710 PEX_RUNDOWN_REF_CACHE_AWARE
10712 ExAllocateCacheAwareRundownProtection(
10713 IN POOL_TYPE PoolType
,
10719 ExSizeOfRundownProtectionCacheAware(VOID
);
10721 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
10723 #if (NTDDI_VERSION >= NTDDI_VISTA)
10727 ExInitializeLookasideListEx(
10728 OUT PLOOKASIDE_LIST_EX Lookaside
,
10729 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
10730 IN PFREE_FUNCTION_EX Free OPTIONAL
,
10731 IN POOL_TYPE PoolType
,
10738 #if !defined(MIDL_PASS)
10740 static __inline PVOID
10741 ExAllocateFromNPagedLookasideList(
10742 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
10746 Lookaside
->L
.TotalAllocates
++;
10747 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
10748 if (Entry
== NULL
) {
10749 Lookaside
->L
.AllocateMisses
++;
10750 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
10757 static __inline PVOID
10758 ExAllocateFromPagedLookasideList(
10759 IN PPAGED_LOOKASIDE_LIST Lookaside
)
10763 Lookaside
->L
.TotalAllocates
++;
10764 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
10765 if (Entry
== NULL
) {
10766 Lookaside
->L
.AllocateMisses
++;
10767 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
10774 static __inline VOID
10775 ExFreeToNPagedLookasideList(
10776 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
10779 Lookaside
->L
.TotalFrees
++;
10780 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
10781 Lookaside
->L
.FreeMisses
++;
10782 (Lookaside
->L
.Free
)(Entry
);
10784 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
10788 static __inline VOID
10789 ExFreeToPagedLookasideList(
10790 IN PPAGED_LOOKASIDE_LIST Lookaside
,
10793 Lookaside
->L
.TotalFrees
++;
10794 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
10795 Lookaside
->L
.FreeMisses
++;
10796 (Lookaside
->L
.Free
)(Entry
);
10798 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
10802 #endif /* !defined(MIDL_PASS) */
10805 /******************************************************************************
10806 * Object Manager Functions *
10807 ******************************************************************************/
10809 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10814 ObfDereferenceObject(
10816 #define ObDereferenceObject ObfDereferenceObject
10821 ObGetObjectSecurity(
10823 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
10824 OUT PBOOLEAN MemoryAllocated
);
10829 ObfReferenceObject(
10831 #define ObReferenceObject ObfReferenceObject
10836 ObReferenceObjectByHandle(
10838 IN ACCESS_MASK DesiredAccess
,
10839 IN POBJECT_TYPE ObjectType OPTIONAL
,
10840 IN KPROCESSOR_MODE AccessMode
,
10842 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
10847 ObReferenceObjectByPointer(
10849 IN ACCESS_MASK DesiredAccess
,
10850 IN POBJECT_TYPE ObjectType OPTIONAL
,
10851 IN KPROCESSOR_MODE AccessMode
);
10856 ObReleaseObjectSecurity(
10857 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
10858 IN BOOLEAN MemoryAllocated
);
10860 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
10863 /******************************************************************************
10864 * Process Manager Functions *
10865 ******************************************************************************/
10869 * PsGetCurrentProcess(VOID)
10871 #define PsGetCurrentProcess IoGetCurrentProcess
10873 #if !defined(_PSGETCURRENTTHREAD_)
10875 #define _PSGETCURRENTTHREAD_
10880 PsGetCurrentThread(VOID
)
10882 return (PETHREAD
)KeGetCurrentThread();
10887 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10892 PsCreateSystemThread(
10893 OUT PHANDLE ThreadHandle
,
10894 IN ULONG DesiredAccess
,
10895 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
10896 IN HANDLE ProcessHandle OPTIONAL
,
10897 OUT PCLIENT_ID ClientId OPTIONAL
,
10898 IN PKSTART_ROUTINE StartRoutine
,
10899 IN PVOID StartContext OPTIONAL
);
10904 PsTerminateSystemThread(
10905 IN NTSTATUS ExitStatus
);
10909 /******************************************************************************
10910 * WMI Library Support Functions *
10911 ******************************************************************************/
10915 #if (NTDDI_VERSION >= NTDDI_WINXP)
10920 IN TRACEHANDLE LoggerHandle
,
10921 IN ULONG MessageFlags
,
10922 IN LPGUID MessageGuid
,
10923 IN USHORT MessageNumber
,
10929 #if (NTDDI_VERSION >= NTDDI_WINXP)
10934 WmiQueryTraceInformation(
10935 IN TRACE_INFORMATION_CLASS TraceInformationClass
,
10936 OUT PVOID TraceInformation
,
10937 IN ULONG TraceInformationLength
,
10938 OUT PULONG RequiredLength OPTIONAL
,
10939 IN PVOID Buffer OPTIONAL
);
10942 /* FIXME: Get va_list from where? */
10947 IN TRACEHANDLE LoggerHandle
,
10948 IN ULONG MessageFlags
,
10949 IN LPGUID MessageGuid
,
10950 IN USHORT MessageNumber
,
10951 IN
va_list MessageArgList
);
10956 /******************************************************************************
10957 * Kernel Debugger Functions *
10958 ******************************************************************************/
10970 #define KdPrint(_x_) DbgPrint _x_
10971 #define KdPrintEx(_x_) DbgPrintEx _x_
10972 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
10973 #define KdBreakPoint() DbgBreakPoint()
10974 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
10978 #define KdPrint(_x_)
10979 #define KdPrintEx(_x_)
10980 #define vKdPrintExWithPrefix(_x_)
10981 #define KdBreakPoint()
10982 #define KdBreakPointWithStatus(s)
10986 #if defined(__GNUC__)
10988 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent
;
10989 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled
;
10990 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10991 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10993 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
10995 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent
;
10996 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled
;
10997 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
10998 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
11002 extern BOOLEAN KdDebuggerNotPresent
;
11003 extern BOOLEAN KdDebuggerEnabled
;
11004 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
11005 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
11009 #ifdef _VA_LIST_DEFINED
11010 #if (NTDDI_VERSION >= NTDDI_WINXP)
11016 IN ULONG ComponentId
,
11024 vDbgPrintExWithPrefix(
11026 IN ULONG ComponentId
,
11032 #endif /* _VA_LIST_DEFINED */
11034 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11039 KdDisableDebugger(VOID
);
11044 KdEnableDebugger(VOID
);
11046 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
11047 #define DbgBreakPoint __debugbreak
11051 DbgBreakPoint(VOID
);
11057 DbgBreakPointWithStatus(
11063 DbgPrintReturnControlC(
11067 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11069 #if (NTDDI_VERSION >= NTDDI_WINXP)
11075 IN ULONG ComponentId
,
11083 DbgQueryDebugFilterState(
11084 IN ULONG ComponentId
,
11090 DbgSetDebugFilterState(
11091 IN ULONG ComponentId
,
11097 #if (NTDDI_VERSION >= NTDDI_WS03)
11101 KdRefreshDebuggerNotPresent(VOID
);
11104 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11109 IN KD_OPTION Option
,
11110 IN ULONG InBufferBytes OPTIONAL
,
11112 IN ULONG OutBufferBytes OPTIONAL
,
11113 OUT PVOID OutBuffer
,
11114 OUT PULONG OutBufferNeeded OPTIONAL
);
11117 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11121 HalAllocateCommonBuffer(
11122 IN PDMA_ADAPTER DmaAdapter
,
11124 OUT PPHYSICAL_ADDRESS LogicalAddress
,
11125 IN BOOLEAN CacheEnabled
)
11127 PALLOCATE_COMMON_BUFFER allocateCommonBuffer
;
11128 PVOID commonBuffer
;
11130 allocateCommonBuffer
= *(DmaAdapter
)->DmaOperations
->AllocateCommonBuffer
;
11131 ASSERT( allocateCommonBuffer
!= NULL
);
11132 commonBuffer
= allocateCommonBuffer( DmaAdapter
, Length
, LogicalAddress
, CacheEnabled
);
11133 return commonBuffer
;
11139 HalFreeCommonBuffer(
11140 IN PDMA_ADAPTER DmaAdapter
,
11142 IN PHYSICAL_ADDRESS LogicalAddress
,
11143 IN PVOID VirtualAddress
,
11144 IN BOOLEAN CacheEnabled
)
11146 PFREE_COMMON_BUFFER freeCommonBuffer
;
11148 freeCommonBuffer
= *(DmaAdapter
)->DmaOperations
->FreeCommonBuffer
;
11149 ASSERT( freeCommonBuffer
!= NULL
);
11150 freeCommonBuffer( DmaAdapter
, Length
, LogicalAddress
, VirtualAddress
, CacheEnabled
);
11157 IN PDMA_ADAPTER DmaAdapter
)
11159 PREAD_DMA_COUNTER readDmaCounter
;
11162 readDmaCounter
= *(DmaAdapter
)->DmaOperations
->ReadDmaCounter
;
11163 ASSERT( readDmaCounter
!= NULL
);
11164 counter
= readDmaCounter( DmaAdapter
);
11173 #include <ktmtypes.h>
11175 typedef enum _KTMOBJECT_TYPE
{
11176 KTMOBJECT_TRANSACTION
,
11177 KTMOBJECT_TRANSACTION_MANAGER
,
11178 KTMOBJECT_RESOURCE_MANAGER
,
11179 KTMOBJECT_ENLISTMENT
,
11181 } KTMOBJECT_TYPE
, *PKTMOBJECT_TYPE
;
11183 typedef struct _KTMOBJECT_CURSOR
{
11185 ULONG ObjectIdCount
;
11187 } KTMOBJECT_CURSOR
, *PKTMOBJECT_CURSOR
;
11189 typedef enum _TRANSACTION_INFORMATION_CLASS
{
11190 TransactionBasicInformation
,
11191 TransactionPropertiesInformation
,
11192 TransactionEnlistmentInformation
,
11193 TransactionSuperiorEnlistmentInformation
11194 } TRANSACTION_INFORMATION_CLASS
;
11196 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS
{
11197 TransactionManagerBasicInformation
,
11198 TransactionManagerLogInformation
,
11199 TransactionManagerLogPathInformation
,
11200 TransactionManagerRecoveryInformation
= 4
11201 } TRANSACTIONMANAGER_INFORMATION_CLASS
;
11203 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS
{
11204 ResourceManagerBasicInformation
,
11205 ResourceManagerCompletionInformation
,
11206 } RESOURCEMANAGER_INFORMATION_CLASS
;
11208 typedef enum _ENLISTMENT_INFORMATION_CLASS
{
11209 EnlistmentBasicInformation
,
11210 EnlistmentRecoveryInformation
,
11211 EnlistmentCrmInformation
11212 } ENLISTMENT_INFORMATION_CLASS
;
11214 #endif /* !_NTTMAPI_ */
11215 /******************************************************************************
11216 * ZwXxx Functions *
11217 ******************************************************************************/
11220 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
11221 #define ZwCurrentProcess() NtCurrentProcess()
11222 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
11223 #define ZwCurrentThread() NtCurrentThread()
11225 #if (NTDDI_VERSION >= NTDDI_WIN2K)
11236 ZwCreateDirectoryObject(
11237 OUT PHANDLE DirectoryHandle
,
11238 IN ACCESS_MASK DesiredAccess
,
11239 IN POBJECT_ATTRIBUTES ObjectAttributes
);
11245 OUT PHANDLE FileHandle
,
11246 IN ACCESS_MASK DesiredAccess
,
11247 IN POBJECT_ATTRIBUTES ObjectAttributes
,
11248 OUT PIO_STATUS_BLOCK IoStatusBlock
,
11249 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
11250 IN ULONG FileAttributes
,
11251 IN ULONG ShareAccess
,
11252 IN ULONG CreateDisposition
,
11253 IN ULONG CreateOptions
,
11254 IN PVOID EaBuffer OPTIONAL
,
11255 IN ULONG EaLength
);
11261 OUT PHANDLE KeyHandle
,
11262 IN ACCESS_MASK DesiredAccess
,
11263 IN POBJECT_ATTRIBUTES ObjectAttributes
,
11264 IN ULONG TitleIndex
,
11265 IN PUNICODE_STRING Class OPTIONAL
,
11266 IN ULONG CreateOptions
,
11267 OUT PULONG Disposition OPTIONAL
);
11273 OUT PHANDLE SectionHandle
,
11274 IN ACCESS_MASK DesiredAccess
,
11275 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
11276 IN PLARGE_INTEGER MaximumSize OPTIONAL
,
11277 IN ULONG SectionPageProtection
,
11278 IN ULONG AllocationAttributes
,
11279 IN HANDLE FileHandle OPTIONAL
);
11285 IN HANDLE KeyHandle
);
11291 IN HANDLE KeyHandle
,
11292 IN PUNICODE_STRING ValueName
);
11298 IN HANDLE KeyHandle
,
11300 IN KEY_INFORMATION_CLASS KeyInformationClass
,
11301 OUT PVOID KeyInformation OPTIONAL
,
11303 OUT PULONG ResultLength
);
11308 ZwEnumerateValueKey(
11309 IN HANDLE KeyHandle
,
11311 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
11312 OUT PVOID KeyValueInformation OPTIONAL
,
11314 OUT PULONG ResultLength
);
11320 IN HANDLE KeyHandle
);
11326 IN PUNICODE_STRING DriverServiceName
);
11331 ZwMakeTemporaryObject(
11337 ZwMapViewOfSection(
11338 IN HANDLE SectionHandle
,
11339 IN HANDLE ProcessHandle
,
11340 IN OUT PVOID
*BaseAddress
,
11341 IN ULONG_PTR ZeroBits
,
11342 IN SIZE_T CommitSize
,
11343 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
11344 IN OUT PSIZE_T ViewSize
,
11345 IN SECTION_INHERIT InheritDisposition
,
11346 IN ULONG AllocationType
,
11353 OUT PHANDLE FileHandle
,
11354 IN ACCESS_MASK DesiredAccess
,
11355 IN POBJECT_ATTRIBUTES ObjectAttributes
,
11356 OUT PIO_STATUS_BLOCK IoStatusBlock
,
11357 IN ULONG ShareAccess
,
11358 IN ULONG OpenOptions
);
11364 OUT PHANDLE KeyHandle
,
11365 IN ACCESS_MASK DesiredAccess
,
11366 IN POBJECT_ATTRIBUTES ObjectAttributes
);
11372 OUT PHANDLE SectionHandle
,
11373 IN ACCESS_MASK DesiredAccess
,
11374 IN POBJECT_ATTRIBUTES ObjectAttributes
);
11379 ZwOpenSymbolicLinkObject(
11380 OUT PHANDLE LinkHandle
,
11381 IN ACCESS_MASK DesiredAccess
,
11382 IN POBJECT_ATTRIBUTES ObjectAttributes
);
11387 ZwQueryInformationFile(
11388 IN HANDLE FileHandle
,
11389 OUT PIO_STATUS_BLOCK IoStatusBlock
,
11390 OUT PVOID FileInformation
,
11392 IN FILE_INFORMATION_CLASS FileInformationClass
);
11398 IN HANDLE KeyHandle
,
11399 IN KEY_INFORMATION_CLASS KeyInformationClass
,
11400 OUT PVOID KeyInformation OPTIONAL
,
11402 OUT PULONG ResultLength
);
11407 ZwQuerySymbolicLinkObject(
11408 IN HANDLE LinkHandle
,
11409 IN OUT PUNICODE_STRING LinkTarget
,
11410 OUT PULONG ReturnedLength OPTIONAL
);
11416 IN HANDLE KeyHandle
,
11417 IN PUNICODE_STRING ValueName
,
11418 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
11419 OUT PVOID KeyValueInformation OPTIONAL
,
11421 OUT PULONG ResultLength
);
11427 IN HANDLE FileHandle
,
11428 IN HANDLE Event OPTIONAL
,
11429 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
11430 IN PVOID ApcContext OPTIONAL
,
11431 OUT PIO_STATUS_BLOCK IoStatusBlock
,
11434 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
11435 IN PULONG Key OPTIONAL
);
11440 ZwSetInformationFile(
11441 IN HANDLE FileHandle
,
11442 OUT PIO_STATUS_BLOCK IoStatusBlock
,
11443 IN PVOID FileInformation
,
11445 IN FILE_INFORMATION_CLASS FileInformationClass
);
11451 IN HANDLE KeyHandle
,
11452 IN PUNICODE_STRING ValueName
,
11453 IN ULONG TitleIndex OPTIONAL
,
11455 IN PVOID Data OPTIONAL
,
11456 IN ULONG DataSize
);
11462 IN PUNICODE_STRING DriverServiceName
);
11467 ZwUnmapViewOfSection(
11468 IN HANDLE ProcessHandle
,
11469 IN PVOID BaseAddress OPTIONAL
);
11475 IN HANDLE FileHandle
,
11476 IN HANDLE Event OPTIONAL
,
11477 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
11478 IN PVOID ApcContext OPTIONAL
,
11479 OUT PIO_STATUS_BLOCK IoStatusBlock
,
11482 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
11483 IN PULONG Key OPTIONAL
);
11488 ZwQueryFullAttributesFile(
11489 IN POBJECT_ATTRIBUTES ObjectAttributes
,
11490 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation
);
11492 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11494 #if (NTDDI_VERSION >= NTDDI_WIN2003)
11499 OUT PHANDLE EventHandle
,
11500 IN ACCESS_MASK DesiredAccess
,
11501 IN POBJECT_ATTRIBUTES ObjectAttributes
);
11504 #if (NTDDI_VERSION >= NTDDI_VISTA)
11508 ZwCreateKeyTransacted(
11509 OUT PHANDLE KeyHandle
,
11510 IN ACCESS_MASK DesiredAccess
,
11511 IN POBJECT_ATTRIBUTES ObjectAttributes
,
11512 IN ULONG TitleIndex
,
11513 IN PUNICODE_STRING Class OPTIONAL
,
11514 IN ULONG CreateOptions
,
11515 IN HANDLE TransactionHandle
,
11516 OUT PULONG Disposition OPTIONAL
);
11521 ZwOpenKeyTransacted(
11522 OUT PHANDLE KeyHandle
,
11523 IN ACCESS_MASK DesiredAccess
,
11524 IN POBJECT_ATTRIBUTES ObjectAttributes
,
11525 IN HANDLE TransactionHandle
);
11530 ZwCreateTransactionManager(
11531 OUT PHANDLE TmHandle
,
11532 IN ACCESS_MASK DesiredAccess
,
11533 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
11534 IN PUNICODE_STRING LogFileName OPTIONAL
,
11535 IN ULONG CreateOptions OPTIONAL
,
11536 IN ULONG CommitStrength OPTIONAL
);
11541 ZwOpenTransactionManager(
11542 OUT PHANDLE TmHandle
,
11543 IN ACCESS_MASK DesiredAccess
,
11544 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
11545 IN PUNICODE_STRING LogFileName OPTIONAL
,
11546 IN LPGUID TmIdentity OPTIONAL
,
11547 IN ULONG OpenOptions OPTIONAL
);
11552 ZwRollforwardTransactionManager(
11553 IN HANDLE TransactionManagerHandle
,
11554 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11559 ZwRecoverTransactionManager(
11560 IN HANDLE TransactionManagerHandle
);
11565 ZwQueryInformationTransactionManager(
11566 IN HANDLE TransactionManagerHandle
,
11567 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
11568 OUT PVOID TransactionManagerInformation
,
11569 IN ULONG TransactionManagerInformationLength
,
11570 OUT PULONG ReturnLength OPTIONAL
);
11575 ZwSetInformationTransactionManager(
11576 IN HANDLE TmHandle
,
11577 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass
,
11578 IN PVOID TransactionManagerInformation
,
11579 IN ULONG TransactionManagerInformationLength
);
11584 ZwEnumerateTransactionObject(
11585 IN HANDLE RootObjectHandle OPTIONAL
,
11586 IN KTMOBJECT_TYPE QueryType
,
11587 IN OUT PKTMOBJECT_CURSOR ObjectCursor
,
11588 IN ULONG ObjectCursorLength
,
11589 OUT PULONG ReturnLength
);
11594 ZwCreateTransaction(
11595 OUT PHANDLE TransactionHandle
,
11596 IN ACCESS_MASK DesiredAccess
,
11597 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
11598 IN LPGUID Uow OPTIONAL
,
11599 IN HANDLE TmHandle OPTIONAL
,
11600 IN ULONG CreateOptions OPTIONAL
,
11601 IN ULONG IsolationLevel OPTIONAL
,
11602 IN ULONG IsolationFlags OPTIONAL
,
11603 IN PLARGE_INTEGER Timeout OPTIONAL
,
11604 IN PUNICODE_STRING Description OPTIONAL
);
11610 OUT PHANDLE TransactionHandle
,
11611 IN ACCESS_MASK DesiredAccess
,
11612 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
11614 IN HANDLE TmHandle OPTIONAL
);
11619 ZwQueryInformationTransaction(
11620 IN HANDLE TransactionHandle
,
11621 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
11622 OUT PVOID TransactionInformation
,
11623 IN ULONG TransactionInformationLength
,
11624 OUT PULONG ReturnLength OPTIONAL
);
11629 ZwSetInformationTransaction(
11630 IN HANDLE TransactionHandle
,
11631 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass
,
11632 IN PVOID TransactionInformation
,
11633 IN ULONG TransactionInformationLength
);
11638 ZwCommitTransaction(
11639 IN HANDLE TransactionHandle
,
11645 ZwRollbackTransaction(
11646 IN HANDLE TransactionHandle
,
11652 ZwCreateResourceManager(
11653 OUT PHANDLE ResourceManagerHandle
,
11654 IN ACCESS_MASK DesiredAccess
,
11655 IN HANDLE TmHandle
,
11656 IN LPGUID ResourceManagerGuid OPTIONAL
,
11657 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
11658 IN ULONG CreateOptions OPTIONAL
,
11659 IN PUNICODE_STRING Description OPTIONAL
);
11664 ZwOpenResourceManager(
11665 OUT PHANDLE ResourceManagerHandle
,
11666 IN ACCESS_MASK DesiredAccess
,
11667 IN HANDLE TmHandle
,
11668 IN LPGUID ResourceManagerGuid
,
11669 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
);
11674 ZwRecoverResourceManager(
11675 IN HANDLE ResourceManagerHandle
);
11680 ZwGetNotificationResourceManager(
11681 IN HANDLE ResourceManagerHandle
,
11682 OUT PTRANSACTION_NOTIFICATION TransactionNotification
,
11683 IN ULONG NotificationLength
,
11684 IN PLARGE_INTEGER Timeout
,
11685 IN PULONG ReturnLength OPTIONAL
,
11686 IN ULONG Asynchronous
,
11687 IN ULONG_PTR AsynchronousContext OPTIONAL
);
11692 ZwQueryInformationResourceManager(
11693 IN HANDLE ResourceManagerHandle
,
11694 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
11695 OUT PVOID ResourceManagerInformation
,
11696 IN ULONG ResourceManagerInformationLength
,
11697 IN PULONG ReturnLength OPTIONAL
);
11702 ZwSetInformationResourceManager(
11703 IN HANDLE ResourceManagerHandle
,
11704 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass
,
11705 IN PVOID ResourceManagerInformation
,
11706 IN ULONG ResourceManagerInformationLength
);
11711 ZwCreateEnlistment(
11712 OUT PHANDLE EnlistmentHandle
,
11713 IN ACCESS_MASK DesiredAccess
,
11714 IN HANDLE ResourceManagerHandle
,
11715 IN HANDLE TransactionHandle
,
11716 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
11717 IN ULONG CreateOptions OPTIONAL
,
11718 IN NOTIFICATION_MASK NotificationMask
,
11719 IN PVOID EnlistmentKey OPTIONAL
);
11725 OUT PHANDLE EnlistmentHandle
,
11726 IN ACCESS_MASK DesiredAccess
,
11727 IN HANDLE RmHandle
,
11728 IN LPGUID EnlistmentGuid
,
11729 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
);
11734 ZwQueryInformationEnlistment(
11735 IN HANDLE EnlistmentHandle
,
11736 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
11737 OUT PVOID EnlistmentInformation
,
11738 IN ULONG EnlistmentInformationLength
,
11739 IN PULONG ReturnLength OPTIONAL
);
11744 ZwSetInformationEnlistment(
11745 IN HANDLE EnlistmentHandle
,
11746 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass
,
11747 IN PVOID EnlistmentInformation
,
11748 IN ULONG EnlistmentInformationLength
);
11753 ZwRecoverEnlistment(
11754 IN HANDLE EnlistmentHandle
,
11755 IN PVOID EnlistmentKey OPTIONAL
);
11760 ZwPrePrepareEnlistment(
11761 IN HANDLE EnlistmentHandle
,
11762 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11767 ZwPrepareEnlistment(
11768 IN HANDLE EnlistmentHandle
,
11769 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11774 ZwCommitEnlistment(
11775 IN HANDLE EnlistmentHandle
,
11776 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11781 ZwRollbackEnlistment(
11782 IN HANDLE EnlistmentHandle
,
11783 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11788 ZwPrePrepareComplete(
11789 IN HANDLE EnlistmentHandle
,
11790 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11796 IN HANDLE EnlistmentHandle
,
11797 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11803 IN HANDLE EnlistmentHandle
,
11804 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11809 ZwReadOnlyEnlistment(
11810 IN HANDLE EnlistmentHandle
,
11811 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11816 ZwRollbackComplete(
11817 IN HANDLE EnlistmentHandle
,
11818 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11823 ZwSinglePhaseReject(
11824 IN HANDLE EnlistmentHandle
,
11825 IN PLARGE_INTEGER TmVirtualClock OPTIONAL
);
11828 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11830 #if (NTDDI_VERSION >= NTDDI_WIN7)
11836 OUT PHANDLE KeyHandle
,
11837 IN ACCESS_MASK DesiredAccess
,
11838 IN POBJECT_ATTRIBUTES ObjectAttributes
,
11839 IN ULONG OpenOptions
);
11844 ZwOpenKeyTransactedEx(
11845 OUT PHANDLE KeyHandle
,
11846 IN ACCESS_MASK DesiredAccess
,
11847 IN POBJECT_ATTRIBUTES ObjectAttributes
,
11848 IN ULONG OpenOptions
,
11849 IN HANDLE TransactionHandle
);
11854 ZwNotifyChangeMultipleKeys(
11855 IN HANDLE MasterKeyHandle
,
11856 IN ULONG Count OPTIONAL
,
11857 IN OBJECT_ATTRIBUTES SubordinateObjects
[] OPTIONAL
,
11858 IN HANDLE Event OPTIONAL
,
11859 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
11860 IN PVOID ApcContext OPTIONAL
,
11861 OUT PIO_STATUS_BLOCK IoStatusBlock
,
11862 IN ULONG CompletionFilter
,
11863 IN BOOLEAN WatchTree
,
11864 OUT PVOID Buffer OPTIONAL
,
11865 IN ULONG BufferSize
,
11866 IN BOOLEAN Asynchronous
);
11871 ZwQueryMultipleValueKey(
11872 IN HANDLE KeyHandle
,
11873 IN OUT PKEY_VALUE_ENTRY ValueEntries
,
11874 IN ULONG EntryCount
,
11875 OUT PVOID ValueBuffer
,
11876 IN OUT PULONG BufferLength
,
11877 OUT PULONG RequiredBufferLength OPTIONAL
);
11883 IN HANDLE KeyHandle
,
11884 IN PUNICODE_STRING NewName
);
11889 ZwSetInformationKey(
11890 IN HANDLE KeyHandle
,
11891 IN KEY_SET_INFORMATION_CLASS KeySetInformationClass
,
11892 IN PVOID KeySetInformation
,
11893 IN ULONG KeySetInformationLength
);
11895 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
11897 /******************************************************************************
11899 ******************************************************************************/
11901 /* GUID Comparison */
11902 #ifndef __IID_ALIGNED__
11903 #define __IID_ALIGNED__
11905 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
11907 return ( (*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) &&
11908 (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)) );
11911 #define IsEqualGUIDAligned(guid1, guid2) \
11912 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
11913 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
11914 #endif /* __cplusplus */
11915 #endif /* !__IID_ALIGNED__ */
11922 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
11924 #define MAXIMUM_FILENAME_LENGTH 256
11926 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
11928 #define OBJECT_TYPE_CREATE (0x0001)
11929 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
11931 #define DIRECTORY_QUERY (0x0001)
11932 #define DIRECTORY_TRAVERSE (0x0002)
11933 #define DIRECTORY_CREATE_OBJECT (0x0004)
11934 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
11935 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
11937 #define EVENT_QUERY_STATE (0x0001)
11938 #define EVENT_MODIFY_STATE (0x0002)
11939 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
11941 #define SEMAPHORE_QUERY_STATE (0x0001)
11942 #define SEMAPHORE_MODIFY_STATE (0x0002)
11943 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
11945 #define SYMBOLIC_LINK_QUERY 0x0001
11946 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
11948 #define DUPLICATE_CLOSE_SOURCE 0x00000001
11949 #define DUPLICATE_SAME_ACCESS 0x00000002
11950 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
11952 /* Global debug flag */
11953 extern ULONG NtGlobalFlag
;
11955 /* Service Start Types */
11956 #define SERVICE_BOOT_START 0x00000000
11957 #define SERVICE_SYSTEM_START 0x00000001
11958 #define SERVICE_AUTO_START 0x00000002
11959 #define SERVICE_DEMAND_START 0x00000003
11960 #define SERVICE_DISABLED 0x00000004
11962 #ifndef _TRACEHANDLE_DEFINED
11963 #define _TRACEHANDLE_DEFINED
11964 typedef ULONG64 TRACEHANDLE
, *PTRACEHANDLE
;
11973 #endif /* !_WDMDDK_ */