1 /******************************************************************************
3 ******************************************************************************/
6 typedef UCHAR KIRQL
, *PKIRQL
;
7 typedef CCHAR KPROCESSOR_MODE
;
8 typedef LONG KPRIORITY
;
16 #define CACHE_FULLY_ASSOCIATIVE 0xFF
17 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
19 #define EVENT_QUERY_STATE (0x0001)
20 #define EVENT_MODIFY_STATE (0x0002)
21 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
23 #define LTP_PC_SMT 0x1
25 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
26 #define SINGLE_GROUP_LEGACY_API 1
29 #define SEMAPHORE_QUERY_STATE (0x0001)
30 #define SEMAPHORE_MODIFY_STATE (0x0002)
31 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
33 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP
{
34 RelationProcessorCore
,
37 RelationProcessorPackage
,
40 } LOGICAL_PROCESSOR_RELATIONSHIP
;
42 typedef enum _PROCESSOR_CACHE_TYPE
{
47 } PROCESSOR_CACHE_TYPE
;
49 typedef struct _CACHE_DESCRIPTOR
{
54 PROCESSOR_CACHE_TYPE Type
;
55 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
57 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION
{
58 ULONG_PTR ProcessorMask
;
59 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
60 _ANONYMOUS_UNION
union {
67 CACHE_DESCRIPTOR Cache
;
68 ULONGLONG Reserved
[2];
70 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION
;
72 typedef struct _PROCESSOR_RELATIONSHIP
{
76 _Field_size_(GroupCount
) GROUP_AFFINITY GroupMask
[ANYSIZE_ARRAY
];
77 } PROCESSOR_RELATIONSHIP
, *PPROCESSOR_RELATIONSHIP
;
79 typedef struct _NUMA_NODE_RELATIONSHIP
{
82 GROUP_AFFINITY GroupMask
;
83 } NUMA_NODE_RELATIONSHIP
, *PNUMA_NODE_RELATIONSHIP
;
85 typedef struct _CACHE_RELATIONSHIP
{
90 PROCESSOR_CACHE_TYPE Type
;
92 GROUP_AFFINITY GroupMask
;
93 } CACHE_RELATIONSHIP
, *PCACHE_RELATIONSHIP
;
95 typedef struct _PROCESSOR_GROUP_INFO
{
96 UCHAR MaximumProcessorCount
;
97 UCHAR ActiveProcessorCount
;
99 KAFFINITY ActiveProcessorMask
;
100 } PROCESSOR_GROUP_INFO
, *PPROCESSOR_GROUP_INFO
;
102 typedef struct _GROUP_RELATIONSHIP
{
103 USHORT MaximumGroupCount
;
104 USHORT ActiveGroupCount
;
106 PROCESSOR_GROUP_INFO GroupInfo
[ANYSIZE_ARRAY
];
107 } GROUP_RELATIONSHIP
, *PGROUP_RELATIONSHIP
;
109 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
{
110 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
112 _ANONYMOUS_UNION
union {
113 PROCESSOR_RELATIONSHIP Processor
;
114 NUMA_NODE_RELATIONSHIP NumaNode
;
115 CACHE_RELATIONSHIP Cache
;
116 GROUP_RELATIONSHIP Group
;
118 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
;;
120 /* Processor features */
121 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
122 #define PF_FLOATING_POINT_EMULATED 1
123 #define PF_COMPARE_EXCHANGE_DOUBLE 2
124 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
125 #define PF_PPC_MOVEMEM_64BIT_OK 4
126 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
127 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
128 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
129 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
130 #define PF_PAE_ENABLED 9
131 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
132 #define PF_SSE_DAZ_MODE_AVAILABLE 11
133 #define PF_NX_ENABLED 12
134 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
135 #define PF_COMPARE_EXCHANGE128 14
136 #define PF_COMPARE64_EXCHANGE128 15
137 #define PF_CHANNELS_ENABLED 16
138 #define PF_XSAVE_ENABLED 17
140 #define MAXIMUM_WAIT_OBJECTS 64
142 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
144 #define ASSERT_DPC(Object) \
145 ASSERT(((Object)->Type == 0) || \
146 ((Object)->Type == DpcObject) || \
147 ((Object)->Type == ThreadedDpcObject))
149 #define ASSERT_GATE(object) \
150 NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
151 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
153 #define ASSERT_DEVICE_QUEUE(Object) \
154 NT_ASSERT((Object)->Type == DeviceQueueObject)
156 #define ASSERT_TIMER(E) \
157 NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
158 ((E)->Header.Type == TimerSynchronizationObject))
160 #define ASSERT_MUTANT(E) \
161 NT_ASSERT((E)->Header.Type == MutantObject)
163 #define ASSERT_SEMAPHORE(E) \
164 NT_ASSERT((E)->Header.Type == SemaphoreObject)
166 #define ASSERT_EVENT(E) \
167 NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
168 ((E)->Header.Type == SynchronizationEvent))
171 #define DPC_THREADED 1
173 #define GM_LOCK_BIT 0x1
174 #define GM_LOCK_BIT_V 0x0
175 #define GM_LOCK_WAITER_WOKEN 0x2
176 #define GM_LOCK_WAITER_INC 0x4
178 #define LOCK_QUEUE_WAIT_BIT 0
179 #define LOCK_QUEUE_OWNER_BIT 1
181 #define LOCK_QUEUE_WAIT 1
182 #define LOCK_QUEUE_OWNER 2
183 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
184 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
186 #define PROCESSOR_FEATURE_MAX 64
188 #define DBG_STATUS_CONTROL_C 1
189 #define DBG_STATUS_SYSRQ 2
190 #define DBG_STATUS_BUGCHECK_FIRST 3
191 #define DBG_STATUS_BUGCHECK_SECOND 4
192 #define DBG_STATUS_FATAL 5
193 #define DBG_STATUS_DEBUG_CONTROL 6
194 #define DBG_STATUS_WORKER 7
197 #define MAXIMUM_PROC_PER_GROUP 64
199 #define MAXIMUM_PROC_PER_GROUP 32
201 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
203 /* Exception Records */
204 #define EXCEPTION_NONCONTINUABLE 1
205 #define EXCEPTION_MAXIMUM_PARAMETERS 15
207 #define EXCEPTION_DIVIDED_BY_ZERO 0
208 #define EXCEPTION_DEBUG 1
209 #define EXCEPTION_NMI 2
210 #define EXCEPTION_INT3 3
211 #define EXCEPTION_BOUND_CHECK 5
212 #define EXCEPTION_INVALID_OPCODE 6
213 #define EXCEPTION_NPX_NOT_AVAILABLE 7
214 #define EXCEPTION_DOUBLE_FAULT 8
215 #define EXCEPTION_NPX_OVERRUN 9
216 #define EXCEPTION_INVALID_TSS 0x0A
217 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
218 #define EXCEPTION_STACK_FAULT 0x0C
219 #define EXCEPTION_GP_FAULT 0x0D
220 #define EXCEPTION_RESERVED_TRAP 0x0F
221 #define EXCEPTION_NPX_ERROR 0x010
222 #define EXCEPTION_ALIGNMENT_CHECK 0x011
224 typedef struct _EXCEPTION_RECORD
{
225 NTSTATUS ExceptionCode
;
226 ULONG ExceptionFlags
;
227 struct _EXCEPTION_RECORD
*ExceptionRecord
;
228 PVOID ExceptionAddress
;
229 ULONG NumberParameters
;
230 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
231 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
233 typedef struct _EXCEPTION_RECORD32
{
234 NTSTATUS ExceptionCode
;
235 ULONG ExceptionFlags
;
236 ULONG ExceptionRecord
;
237 ULONG ExceptionAddress
;
238 ULONG NumberParameters
;
239 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
240 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
242 typedef struct _EXCEPTION_RECORD64
{
243 NTSTATUS ExceptionCode
;
244 ULONG ExceptionFlags
;
245 ULONG64 ExceptionRecord
;
246 ULONG64 ExceptionAddress
;
247 ULONG NumberParameters
;
248 ULONG __unusedAlignment
;
249 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
250 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
252 typedef struct _EXCEPTION_POINTERS
{
253 PEXCEPTION_RECORD ExceptionRecord
;
254 PCONTEXT ContextRecord
;
255 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
257 typedef enum _KBUGCHECK_CALLBACK_REASON
{
260 KbCallbackSecondaryDumpData
,
263 } KBUGCHECK_CALLBACK_REASON
;
265 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
267 _Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE
)
270 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE
)(
271 _In_ KBUGCHECK_CALLBACK_REASON Reason
,
272 _In_
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
273 _Inout_ PVOID ReasonSpecificData
,
274 _In_ ULONG ReasonSpecificDataLength
);
275 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
;
277 typedef struct _KBUGCHECK_ADD_PAGES
{
278 _Inout_ PVOID Context
;
280 _In_ ULONG BugCheckCode
;
281 _Out_ ULONG_PTR Address
;
282 _Out_ ULONG_PTR Count
;
283 } KBUGCHECK_ADD_PAGES
, *PKBUGCHECK_ADD_PAGES
;
285 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA
{
287 _In_ ULONG InBufferLength
;
288 _In_ ULONG MaximumAllowed
;
290 _Out_ PVOID OutBuffer
;
291 _Out_ ULONG OutBufferLength
;
292 } KBUGCHECK_SECONDARY_DUMP_DATA
, *PKBUGCHECK_SECONDARY_DUMP_DATA
;
294 typedef enum _KBUGCHECK_DUMP_IO_TYPE
{
298 KbDumpIoSecondaryData
,
300 } KBUGCHECK_DUMP_IO_TYPE
;
302 typedef struct _KBUGCHECK_DUMP_IO
{
305 _In_ ULONG BufferLength
;
306 _In_ KBUGCHECK_DUMP_IO_TYPE Type
;
307 } KBUGCHECK_DUMP_IO
, *PKBUGCHECK_DUMP_IO
;
309 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
310 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
311 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
313 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
315 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
318 KBUGCHECK_CALLBACK_REASON Reason
;
320 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
322 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
328 } KBUGCHECK_BUFFER_DUMP_STATE
;
330 _Function_class_(KBUGCHECK_CALLBACK_ROUTINE
)
333 (NTAPI KBUGCHECK_CALLBACK_ROUTINE
)(
336 typedef KBUGCHECK_CALLBACK_ROUTINE
*PKBUGCHECK_CALLBACK_ROUTINE
;
338 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
340 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
341 _Field_size_bytes_opt_(Length
) PVOID Buffer
;
346 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
348 _Function_class_(NMI_CALLBACK
)
351 (NTAPI NMI_CALLBACK
)(
352 _In_opt_ PVOID Context
,
353 _In_ BOOLEAN Handled
);
354 typedef NMI_CALLBACK
*PNMI_CALLBACK
;
356 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE
{
357 KeProcessorAddStartNotify
= 0,
358 KeProcessorAddCompleteNotify
,
359 KeProcessorAddFailureNotify
360 } KE_PROCESSOR_CHANGE_NOTIFY_STATE
;
362 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
{
363 KE_PROCESSOR_CHANGE_NOTIFY_STATE State
;
366 #if (NTDDI_VERSION >= NTDDI_WIN7)
367 PROCESSOR_NUMBER ProcNumber
;
369 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
;
372 _Function_class_(PROCESSOR_CALLBACK_FUNCTION
)
374 (NTAPI PROCESSOR_CALLBACK_FUNCTION
)(
375 _In_ PVOID CallbackContext
,
376 _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext
,
377 _Inout_ PNTSTATUS OperationStatus
);
378 typedef PROCESSOR_CALLBACK_FUNCTION
*PPROCESSOR_CALLBACK_FUNCTION
;
380 #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
382 #define INVALID_PROCESSOR_INDEX 0xffffffff
384 typedef enum _KINTERRUPT_POLARITY
{
385 InterruptPolarityUnknown
,
388 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
390 typedef enum _KPROFILE_SOURCE
{
392 ProfileAlignmentFixup
,
395 ProfileLoadInstructions
,
396 ProfilePipelineFrozen
,
397 ProfileBranchInstructions
,
398 ProfileTotalNonissues
,
402 ProfileBranchMispredictions
,
403 ProfileStoreInstructions
,
404 ProfileFpInstructions
,
405 ProfileIntegerInstructions
,
409 ProfileSpecialInstructions
,
412 ProfileDcacheAccesses
,
413 ProfileMemoryBarrierCycles
,
414 ProfileLoadLinkedIssues
,
418 typedef enum _KWAIT_REASON
{
459 typedef struct _KWAIT_BLOCK
{
460 LIST_ENTRY WaitListEntry
;
461 struct _KTHREAD
*Thread
;
463 struct _KWAIT_BLOCK
*NextWaitBlock
;
466 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
467 volatile UCHAR BlockState
;
474 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
476 typedef enum _KINTERRUPT_MODE
{
481 #define THREAD_WAIT_OBJECTS 3
484 _Function_class_(KSTART_ROUTINE
)
486 (NTAPI KSTART_ROUTINE
)(
487 _In_ PVOID StartContext
);
488 typedef KSTART_ROUTINE
*PKSTART_ROUTINE
;
491 (NTAPI
*PKINTERRUPT_ROUTINE
)(
494 _Function_class_(KSERVICE_ROUTINE
)
495 _IRQL_requires_(HIGH_LEVEL
)
498 (NTAPI KSERVICE_ROUTINE
)(
499 _In_
struct _KINTERRUPT
*Interrupt
,
500 _In_ PVOID ServiceContext
);
501 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
503 _Function_class_(KMESSAGE_SERVICE_ROUTINE
)
506 (NTAPI KMESSAGE_SERVICE_ROUTINE
)(
507 _In_
struct _KINTERRUPT
*Interrupt
,
508 _In_ PVOID ServiceContext
,
509 _In_ ULONG MessageID
);
510 typedef KMESSAGE_SERVICE_ROUTINE
*PKMESSAGE_SERVICE_ROUTINE
;
512 typedef enum _KD_OPTION
{
513 KD_OPTION_SET_BLOCK_ENABLE
,
517 (NTAPI
*PKNORMAL_ROUTINE
)(
518 IN PVOID NormalContext OPTIONAL
,
519 IN PVOID SystemArgument1 OPTIONAL
,
520 IN PVOID SystemArgument2 OPTIONAL
);
523 (NTAPI
*PKRUNDOWN_ROUTINE
)(
524 IN
struct _KAPC
*Apc
);
527 (NTAPI
*PKKERNEL_ROUTINE
)(
528 IN
struct _KAPC
*Apc
,
529 IN OUT PKNORMAL_ROUTINE
*NormalRoutine OPTIONAL
,
530 IN OUT PVOID
*NormalContext OPTIONAL
,
531 IN OUT PVOID
*SystemArgument1 OPTIONAL
,
532 IN OUT PVOID
*SystemArgument2 OPTIONAL
);
534 typedef struct _KAPC
{
540 struct _KTHREAD
*Thread
;
541 LIST_ENTRY ApcListEntry
;
542 PKKERNEL_ROUTINE KernelRoutine
;
543 PKRUNDOWN_ROUTINE RundownRoutine
;
544 PKNORMAL_ROUTINE NormalRoutine
;
546 PVOID SystemArgument1
;
547 PVOID SystemArgument2
;
549 KPROCESSOR_MODE ApcMode
;
551 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
553 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
554 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
555 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
556 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
557 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
558 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
559 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
561 typedef struct _KDEVICE_QUEUE_ENTRY
{
562 LIST_ENTRY DeviceListEntry
;
565 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
566 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
568 typedef PVOID PKIPI_CONTEXT
;
571 (NTAPI
*PKIPI_WORKER
)(
572 IN OUT PKIPI_CONTEXT PacketContext
,
573 IN PVOID Parameter1 OPTIONAL
,
574 IN PVOID Parameter2 OPTIONAL
,
575 IN PVOID Parameter3 OPTIONAL
);
577 typedef struct _KIPI_COUNTS
{
583 ULONG FlushMultipleTb
;
589 ULONG SweepIcacheRange
;
590 ULONG FlushIoBuffers
;
592 } KIPI_COUNTS
, *PKIPI_COUNTS
;
595 _Function_class_(KIPI_BROADCAST_WORKER
)
596 _IRQL_requires_(IPI_LEVEL
)
598 (NTAPI KIPI_BROADCAST_WORKER
)(
599 _In_ ULONG_PTR Argument
);
600 typedef KIPI_BROADCAST_WORKER
*PKIPI_BROADCAST_WORKER
;
602 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
604 typedef struct _KSPIN_LOCK_QUEUE
{
605 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
606 PKSPIN_LOCK
volatile Lock
;
607 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
609 typedef struct _KLOCK_QUEUE_HANDLE
{
610 KSPIN_LOCK_QUEUE LockQueue
;
612 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
616 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
618 #define LockQueueDispatcherLock 0
619 #define LockQueueExpansionLock 1
620 #define LockQueuePfnLock 2
621 #define LockQueueSystemSpaceLock 3
622 #define LockQueueVacbLock 4
623 #define LockQueueMasterLock 5
624 #define LockQueueNonPagedPoolLock 6
625 #define LockQueueIoCancelLock 7
626 #define LockQueueWorkQueueLock 8
627 #define LockQueueIoVpbLock 9
628 #define LockQueueIoDatabaseLock 10
629 #define LockQueueIoCompletionLock 11
630 #define LockQueueNtfsStructLock 12
631 #define LockQueueAfdWorkQueueLock 13
632 #define LockQueueBcbLock 14
633 #define LockQueueMmNonPagedPoolLock 15
634 #define LockQueueUnusedSpare16 16
635 #define LockQueueTimerTableLock 17
636 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
640 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
641 LockQueueDispatcherLock
,
642 LockQueueExpansionLock
,
644 LockQueueSystemSpaceLock
,
647 LockQueueNonPagedPoolLock
,
648 LockQueueIoCancelLock
,
649 LockQueueWorkQueueLock
,
651 LockQueueIoDatabaseLock
,
652 LockQueueIoCompletionLock
,
653 LockQueueNtfsStructLock
,
654 LockQueueAfdWorkQueueLock
,
656 LockQueueMmNonPagedPoolLock
,
657 LockQueueUnusedSpare16
,
658 LockQueueTimerTableLock
,
659 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
660 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
662 #endif /* defined(_AMD64_) */
664 _Function_class_(KDEFERRED_ROUTINE
)
665 _IRQL_requires_(DISPATCH_LEVEL
)
668 (NTAPI KDEFERRED_ROUTINE
)(
669 _In_
struct _KDPC
*Dpc
,
670 _In_opt_ PVOID DeferredContext
,
671 _In_opt_ PVOID SystemArgument1
,
672 _In_opt_ PVOID SystemArgument2
);
673 typedef KDEFERRED_ROUTINE
*PKDEFERRED_ROUTINE
;
675 typedef enum _KDPC_IMPORTANCE
{
682 typedef struct _KDPC
{
685 volatile USHORT Number
;
686 LIST_ENTRY DpcListEntry
;
687 PKDEFERRED_ROUTINE DeferredRoutine
;
688 PVOID DeferredContext
;
689 PVOID SystemArgument1
;
690 PVOID SystemArgument2
;
691 volatile PVOID DpcData
;
692 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
694 typedef struct _KDPC_WATCHDOG_INFORMATION
{
697 ULONG DpcWatchdogLimit
;
698 ULONG DpcWatchdogCount
;
700 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
702 typedef struct _KDEVICE_QUEUE
{
705 LIST_ENTRY DeviceListHead
;
707 # if defined(_AMD64_)
708 _ANONYMOUS_UNION
union {
710 _ANONYMOUS_STRUCT
struct {
718 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
720 #define TIMER_EXPIRED_INDEX_BITS 6
721 #define TIMER_PROCESSOR_INDEX_BITS 5
723 typedef struct _DISPATCHER_HEADER
{
724 _ANONYMOUS_UNION
union {
725 _ANONYMOUS_STRUCT
struct {
727 _ANONYMOUS_UNION
union {
728 _ANONYMOUS_UNION
union {
729 UCHAR TimerControlFlags
;
730 _ANONYMOUS_STRUCT
struct {
733 UCHAR KeepShifting
:1;
734 UCHAR EncodedTolerableDelay
:5;
738 #if (NTDDI_VERSION < NTDDI_WIN7)
743 _ANONYMOUS_UNION
union {
744 _ANONYMOUS_UNION
union {
745 UCHAR ThreadControlFlags
;
746 _ANONYMOUS_STRUCT
struct {
747 UCHAR CpuThrottled
:1;
748 UCHAR CycleProfiling
:1;
749 UCHAR CounterProfiling
:1;
756 _ANONYMOUS_UNION
union {
757 #if (NTDDI_VERSION >= NTDDI_WIN7)
758 _ANONYMOUS_UNION
union {
759 UCHAR TimerMiscFlags
;
760 _ANONYMOUS_STRUCT
struct {
762 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
765 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
768 volatile UCHAR Expired
:1;
772 /* Pre Win7 compatibility fix to latest WDK */
775 _ANONYMOUS_UNION
union {
777 _ANONYMOUS_STRUCT
struct {
779 BOOLEAN Instrumented
:1;
781 BOOLEAN UmsScheduled
:1;
782 BOOLEAN UmsPrimary
:1;
784 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
791 LIST_ENTRY WaitListHead
;
792 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
794 typedef struct _KEVENT
{
795 DISPATCHER_HEADER Header
;
796 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
798 typedef struct _KSEMAPHORE
{
799 DISPATCHER_HEADER Header
;
801 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
803 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
805 typedef struct _KGATE
{
806 DISPATCHER_HEADER Header
;
807 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
809 typedef struct _KGUARDED_MUTEX
{
814 _ANONYMOUS_UNION
union {
815 _ANONYMOUS_STRUCT
struct {
816 SHORT KernelApcDisable
;
817 SHORT SpecialApcDisable
;
819 ULONG CombinedApcDisable
;
821 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
823 typedef struct _KMUTANT
{
824 DISPATCHER_HEADER Header
;
825 LIST_ENTRY MutantListEntry
;
826 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
829 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
831 #define TIMER_TABLE_SIZE 512
832 #define TIMER_TABLE_SHIFT 9
834 typedef struct _KTIMER
{
835 DISPATCHER_HEADER Header
;
836 ULARGE_INTEGER DueTime
;
837 LIST_ENTRY TimerListEntry
;
843 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
845 typedef enum _LOCK_OPERATION
{
851 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
853 _Function_class_(KSYNCHRONIZE_ROUTINE
)
856 (NTAPI KSYNCHRONIZE_ROUTINE
)(
857 _In_ PVOID SynchronizeContext
);
858 typedef KSYNCHRONIZE_ROUTINE
*PKSYNCHRONIZE_ROUTINE
;
860 typedef enum _POOL_TYPE
{
863 NonPagedPoolMustSucceed
,
865 NonPagedPoolCacheAligned
,
866 PagedPoolCacheAligned
,
867 NonPagedPoolCacheAlignedMustS
,
869 NonPagedPoolSession
= 32,
871 NonPagedPoolMustSucceedSession
,
872 DontUseThisTypeSession
,
873 NonPagedPoolCacheAlignedSession
,
874 PagedPoolCacheAlignedSession
,
875 NonPagedPoolCacheAlignedMustSSession
878 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
882 } ALTERNATIVE_ARCHITECTURE_TYPE
;
887 #define IsNEC_98 (FALSE)
891 #define IsNotNEC_98 (TRUE)
904 typedef struct _KSYSTEM_TIME
{
908 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
910 typedef struct DECLSPEC_ALIGN(16) _M128A
{
915 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
922 USHORT ErrorSelector
;
929 M128A FloatRegisters
[8];
931 M128A XmmRegisters
[16];
934 M128A XmmRegisters
[8];
935 UCHAR Reserved4
[192];
936 ULONG StackControl
[7];
939 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
941 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
944 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
946 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
947 XSAVE_FORMAT LegacyState
;
948 XSAVE_AREA_HEADER Header
;
949 } XSAVE_AREA
, *PXSAVE_AREA
;
951 typedef struct _XSTATE_CONTEXT
{
955 _Field_size_bytes_opt_(Length
) PXSAVE_AREA Area
;
963 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
965 typedef struct _XSTATE_SAVE
{
967 struct _XSTATE_SAVE
* Prev
;
968 struct _KTHREAD
* Thread
;
970 XSTATE_CONTEXT XStateContext
;
971 #elif defined(_IA64_)
974 _ANONYMOUS_UNION
union {
975 _ANONYMOUS_STRUCT
struct {
978 struct _XSTATE_SAVE
* Prev
;
979 PXSAVE_AREA Reserved3
;
980 struct _KTHREAD
* Thread
;
984 XSTATE_CONTEXT XStateContext
;
987 } XSTATE_SAVE
, *PXSTATE_SAVE
;
991 #define MAXIMUM_SUPPORTED_EXTENSION 512
993 #if !defined(__midl) && !defined(MIDL_PASS)
994 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
999 #define XSAVE_ALIGN 64
1000 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
1002 #if !defined(__midl) && !defined(MIDL_PASS)
1003 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
1004 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
1005 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
1008 typedef struct _CONTEXT_CHUNK
{
1011 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
1013 typedef struct _CONTEXT_EX
{
1015 CONTEXT_CHUNK Legacy
;
1016 CONTEXT_CHUNK XState
;
1017 } CONTEXT_EX
, *PCONTEXT_EX
;
1019 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1021 #if (NTDDI_VERSION >= NTDDI_VISTA)
1022 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1023 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1024 extern NTSYSAPI CCHAR KeNumberProcessors
;
1026 extern PCCHAR KeNumberProcessors
;
1032 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
1033 #define NX_SUPPORT_POLICY_ALWAYSON 1
1034 #define NX_SUPPORT_POLICY_OPTIN 2
1035 #define NX_SUPPORT_POLICY_OPTOUT 3
1037 _IRQL_requires_same_
1038 _Function_class_(EXPAND_STACK_CALLOUT
)
1040 (NTAPI EXPAND_STACK_CALLOUT
)(
1041 _In_opt_ PVOID Parameter
);
1042 typedef EXPAND_STACK_CALLOUT
*PEXPAND_STACK_CALLOUT
;
1045 (NTAPI
*PTIMER_APC_ROUTINE
)(
1046 _In_ PVOID TimerContext
,
1047 _In_ ULONG TimerLowValue
,
1048 _In_ LONG TimerHighValue
);
1050 typedef enum _TIMER_SET_INFORMATION_CLASS
{
1051 TimerSetCoalescableTimer
,
1053 } TIMER_SET_INFORMATION_CLASS
;
1055 #if (NTDDI_VERSION >= NTDDI_WIN7)
1056 typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO
{
1057 _In_ LARGE_INTEGER DueTime
;
1058 _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine
;
1059 _In_opt_ PVOID TimerContext
;
1060 _In_opt_
struct _COUNTED_REASON_CONTEXT
*WakeContext
;
1061 _In_opt_ ULONG Period
;
1062 _In_ ULONG TolerableDelay
;
1063 _Out_opt_ PBOOLEAN PreviousState
;
1064 } TIMER_SET_COALESCABLE_TIMER_INFO
, *PTIMER_SET_COALESCABLE_TIMER_INFO
;
1065 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1067 #define XSTATE_LEGACY_FLOATING_POINT 0
1068 #define XSTATE_LEGACY_SSE 1
1069 #define XSTATE_GSSE 2
1071 #define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT))
1072 #define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE))
1073 #define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
1074 #define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE))
1076 #define MAXIMUM_XSTATE_FEATURES 64
1078 typedef struct _XSTATE_FEATURE
{
1081 } XSTATE_FEATURE
, *PXSTATE_FEATURE
;
1083 typedef struct _XSTATE_CONFIGURATION
{
1084 ULONG64 EnabledFeatures
;
1086 ULONG OptimizedSave
:1;
1087 XSTATE_FEATURE Features
[MAXIMUM_XSTATE_FEATURES
];
1088 } XSTATE_CONFIGURATION
, *PXSTATE_CONFIGURATION
;
1090 #define MAX_WOW64_SHARED_ENTRIES 16
1092 typedef struct _KUSER_SHARED_DATA
{
1093 ULONG TickCountLowDeprecated
;
1094 ULONG TickCountMultiplier
;
1095 volatile KSYSTEM_TIME InterruptTime
;
1096 volatile KSYSTEM_TIME SystemTime
;
1097 volatile KSYSTEM_TIME TimeZoneBias
;
1098 USHORT ImageNumberLow
;
1099 USHORT ImageNumberHigh
;
1100 WCHAR NtSystemRoot
[260];
1101 ULONG MaxStackTraceDepth
;
1102 ULONG CryptoExponent
;
1104 ULONG LargePageMinimum
;
1106 NT_PRODUCT_TYPE NtProductType
;
1107 BOOLEAN ProductTypeIsValid
;
1108 ULONG NtMajorVersion
;
1109 ULONG NtMinorVersion
;
1110 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
1113 volatile ULONG TimeSlip
;
1114 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
1115 ULONG AltArchitecturePad
[1];
1116 LARGE_INTEGER SystemExpirationDate
;
1118 BOOLEAN KdDebuggerEnabled
;
1119 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1120 UCHAR NXSupportPolicy
;
1122 volatile ULONG ActiveConsoleId
;
1123 volatile ULONG DismountCount
;
1124 ULONG ComPlusPackage
;
1125 ULONG LastSystemRITEventTickCount
;
1126 ULONG NumberOfPhysicalPages
;
1127 BOOLEAN SafeBootMode
;
1128 #if (NTDDI_VERSION >= NTDDI_WIN7)
1129 _ANONYMOUS_UNION
union {
1131 _ANONYMOUS_STRUCT
struct {
1132 UCHAR TscQpcEnabled
:1;
1133 UCHAR TscQpcSpareFlag
:1;
1134 UCHAR TscQpcShift
:6;
1139 #if (NTDDI_VERSION >= NTDDI_VISTA)
1140 _ANONYMOUS_UNION
union {
1141 ULONG SharedDataFlags
;
1142 _ANONYMOUS_STRUCT
struct {
1143 ULONG DbgErrorPortPresent
:1;
1144 ULONG DbgElevationEnabled
:1;
1145 ULONG DbgVirtEnabled
:1;
1146 ULONG DbgInstallerDetectEnabled
:1;
1147 ULONG DbgSystemDllRelocated
:1;
1148 ULONG DbgDynProcessorEnabled
:1;
1149 ULONG DbgSEHValidationEnabled
:1;
1156 ULONG DataFlagsPad
[1];
1157 ULONGLONG TestRetInstruction
;
1159 ULONG SystemCallReturn
;
1160 ULONGLONG SystemCallPad
[3];
1161 _ANONYMOUS_UNION
union {
1162 volatile KSYSTEM_TIME TickCount
;
1163 volatile ULONG64 TickCountQuad
;
1164 _ANONYMOUS_STRUCT
struct {
1165 ULONG ReservedTickCountOverlay
[3];
1166 ULONG TickCountPad
[1];
1171 #if (NTDDI_VERSION >= NTDDI_WS03)
1172 LONGLONG ConsoleSessionForegroundProcessId
;
1173 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
1175 #if (NTDDI_VERSION >= NTDDI_VISTA)
1176 #if (NTDDI_VERSION >= NTDDI_WIN7)
1177 USHORT UserModeGlobalLogger
[16];
1179 USHORT UserModeGlobalLogger
[8];
1180 ULONG HeapTracingPid
[2];
1181 ULONG CritSecTracingPid
[2];
1183 ULONG ImageFileExecutionOptions
;
1184 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
1185 ULONG LangGenerationCount
;
1187 /* 4 bytes padding */
1189 ULONGLONG Reserved5
;
1190 volatile ULONG64 InterruptTimeBias
;
1192 #if (NTDDI_VERSION >= NTDDI_WIN7)
1193 volatile ULONG64 TscQpcBias
;
1194 volatile ULONG ActiveProcessorCount
;
1195 volatile USHORT ActiveGroupCount
;
1197 volatile ULONG AitSamplingValue
;
1198 volatile ULONG AppCompatFlag
;
1199 ULONGLONG SystemDllNativeRelocation
;
1200 ULONG SystemDllWowRelocation
;
1202 XSTATE_CONFIGURATION XState
;
1204 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
1206 #if (NTDDI_VERSION >= NTDDI_VISTA)
1207 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1208 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1209 extern NTSYSAPI CCHAR KeNumberProcessors
;
1211 extern PCCHAR KeNumberProcessors
;
1216 typedef struct _KAPC_STATE
{
1217 LIST_ENTRY ApcListHead
[MaximumMode
];
1219 BOOLEAN KernelApcInProgress
;
1220 BOOLEAN KernelApcPending
;
1221 BOOLEAN UserApcPending
;
1222 } KAPC_STATE
, *PKAPC_STATE
, *RESTRICTED_POINTER PRKAPC_STATE
;
1224 #define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN))
1226 #define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject);
1228 typedef struct _KQUEUE
{
1229 DISPATCHER_HEADER Header
;
1230 LIST_ENTRY EntryListHead
;
1231 volatile ULONG CurrentCount
;
1233 LIST_ENTRY ThreadListHead
;
1234 } KQUEUE
, *PKQUEUE
, *RESTRICTED_POINTER PRKQUEUE
;