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)
34 $
if(_WDMDDK_
|| _WINNT_
)
36 typedef struct _PROCESSOR_GROUP_INFO
{
37 UCHAR MaximumProcessorCount
;
38 UCHAR ActiveProcessorCount
;
40 KAFFINITY ActiveProcessorMask
;
41 } PROCESSOR_GROUP_INFO
, *PPROCESSOR_GROUP_INFO
;
43 typedef enum _PROCESSOR_CACHE_TYPE
{
48 } PROCESSOR_CACHE_TYPE
;
50 typedef struct _CACHE_DESCRIPTOR
{
55 PROCESSOR_CACHE_TYPE Type
;
56 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
58 typedef struct _NUMA_NODE_RELATIONSHIP
{
61 GROUP_AFFINITY GroupMask
;
62 } NUMA_NODE_RELATIONSHIP
, *PNUMA_NODE_RELATIONSHIP
;
64 typedef struct _CACHE_RELATIONSHIP
{
69 PROCESSOR_CACHE_TYPE Type
;
71 GROUP_AFFINITY GroupMask
;
72 } CACHE_RELATIONSHIP
, *PCACHE_RELATIONSHIP
;
74 typedef struct _GROUP_RELATIONSHIP
{
75 USHORT MaximumGroupCount
;
76 USHORT ActiveGroupCount
;
78 PROCESSOR_GROUP_INFO GroupInfo
[ANYSIZE_ARRAY
];
79 } GROUP_RELATIONSHIP
, *PGROUP_RELATIONSHIP
;
81 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP
{
82 RelationProcessorCore
,
85 RelationProcessorPackage
,
88 } LOGICAL_PROCESSOR_RELATIONSHIP
;
90 typedef struct _PROCESSOR_RELATIONSHIP
{
94 _Field_size_(GroupCount
) GROUP_AFFINITY GroupMask
[ANYSIZE_ARRAY
];
95 } PROCESSOR_RELATIONSHIP
, *PPROCESSOR_RELATIONSHIP
;
97 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION
{
98 ULONG_PTR ProcessorMask
;
99 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
100 _ANONYMOUS_UNION
union {
107 CACHE_DESCRIPTOR Cache
;
108 ULONGLONG Reserved
[2];
110 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION
;
112 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
{
113 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
115 _ANONYMOUS_UNION
union {
116 PROCESSOR_RELATIONSHIP Processor
;
117 NUMA_NODE_RELATIONSHIP NumaNode
;
118 CACHE_RELATIONSHIP Cache
;
119 GROUP_RELATIONSHIP Group
;
121 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
;
123 $
endif(_WDMDDK_
|| _WINNT_
)
126 /* Processor features */
127 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
128 #define PF_FLOATING_POINT_EMULATED 1
129 #define PF_COMPARE_EXCHANGE_DOUBLE 2
130 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
131 #define PF_PPC_MOVEMEM_64BIT_OK 4
132 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
133 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
134 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
135 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
136 #define PF_PAE_ENABLED 9
137 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
138 #define PF_SSE_DAZ_MODE_AVAILABLE 11
139 #define PF_NX_ENABLED 12
140 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
141 #define PF_COMPARE_EXCHANGE128 14
142 #define PF_COMPARE64_EXCHANGE128 15
143 #define PF_CHANNELS_ENABLED 16
144 #define PF_XSAVE_ENABLED 17
145 #define PF_ARM_VFP_32_REGISTERS_AVAILABLE 18
146 #define PF_ARM_NEON_INSTRUCTIONS_AVAILABLE 19
147 #define PF_SECOND_LEVEL_ADDRESS_TRANSLATION 20
148 #define PF_VIRT_FIRMWARE_ENABLED 21
149 #define PF_RDWRFSGSBASE_AVAILABLE 22
150 #define PF_FASTFAIL_AVAILABLE 23
151 #define PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE 24
152 #define PF_ARM_64BIT_LOADSTORE_ATOMIC 25
153 #define PF_ARM_EXTERNAL_CACHE_AVAILABLE 26
154 #define PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE 27
155 #define PF_RDRAND_INSTRUCTION_AVAILABLE 28
156 #define PF_ARM_V8_INSTRUCTIONS_AVAILABLE 29
157 #define PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE 30
158 #define PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE 31
160 #define MAXIMUM_WAIT_OBJECTS 64
162 #define ASSERT_APC(Object) \
163 NT_ASSERT((Object)->Type == ApcObject)
165 #define ASSERT_DPC(Object) \
166 NT_ASSERT(((Object)->Type == 0) || \
167 ((Object)->Type == DpcObject) || \
168 ((Object)->Type == ThreadedDpcObject))
170 #define ASSERT_GATE(Object) \
171 NT_ASSERT((((Object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
172 (((Object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
174 #define ASSERT_DEVICE_QUEUE(Object) \
175 NT_ASSERT((Object)->Type == DeviceQueueObject)
177 #define ASSERT_TIMER(Object) \
178 NT_ASSERT(((Object)->Header.Type == TimerNotificationObject) || \
179 ((Object)->Header.Type == TimerSynchronizationObject))
181 #define ASSERT_MUTANT(Object) \
182 NT_ASSERT((Object)->Header.Type == MutantObject)
184 #define ASSERT_SEMAPHORE(Object) \
185 NT_ASSERT((Object)->Header.Type == SemaphoreObject)
187 #define ASSERT_EVENT(Object) \
188 NT_ASSERT(((Object)->Header.Type == NotificationEvent) || \
189 ((Object)->Header.Type == SynchronizationEvent))
192 #define DPC_THREADED 1
194 #define GM_LOCK_BIT 0x1
195 #define GM_LOCK_BIT_V 0x0
196 #define GM_LOCK_WAITER_WOKEN 0x2
197 #define GM_LOCK_WAITER_INC 0x4
199 #define LOCK_QUEUE_WAIT_BIT 0
200 #define LOCK_QUEUE_OWNER_BIT 1
202 #define LOCK_QUEUE_WAIT 1
203 #define LOCK_QUEUE_OWNER 2
204 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
205 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
207 #define PROCESSOR_FEATURE_MAX 64
209 #define DBG_STATUS_CONTROL_C 1
210 #define DBG_STATUS_SYSRQ 2
211 #define DBG_STATUS_BUGCHECK_FIRST 3
212 #define DBG_STATUS_BUGCHECK_SECOND 4
213 #define DBG_STATUS_FATAL 5
214 #define DBG_STATUS_DEBUG_CONTROL 6
215 #define DBG_STATUS_WORKER 7
218 #define MAXIMUM_PROC_PER_GROUP 64
220 #define MAXIMUM_PROC_PER_GROUP 32
222 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
224 #define EXCEPTION_DIVIDED_BY_ZERO 0
225 #define EXCEPTION_DEBUG 1
226 #define EXCEPTION_NMI 2
227 #define EXCEPTION_INT3 3
228 #define EXCEPTION_BOUND_CHECK 5
229 #define EXCEPTION_INVALID_OPCODE 6
230 #define EXCEPTION_NPX_NOT_AVAILABLE 7
231 #define EXCEPTION_DOUBLE_FAULT 8
232 #define EXCEPTION_NPX_OVERRUN 9
233 #define EXCEPTION_INVALID_TSS 0x0A
234 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
235 #define EXCEPTION_STACK_FAULT 0x0C
236 #define EXCEPTION_GP_FAULT 0x0D
237 #define EXCEPTION_RESERVED_TRAP 0x0F
238 #define EXCEPTION_NPX_ERROR 0x010
239 #define EXCEPTION_ALIGNMENT_CHECK 0x011
241 typedef enum _KBUGCHECK_CALLBACK_REASON
{
244 KbCallbackSecondaryDumpData
,
247 } KBUGCHECK_CALLBACK_REASON
;
249 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
251 _Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE
)
254 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE
)(
255 _In_ KBUGCHECK_CALLBACK_REASON Reason
,
256 _In_
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
257 _Inout_ PVOID ReasonSpecificData
,
258 _In_ ULONG ReasonSpecificDataLength
);
259 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
;
261 typedef struct _KBUGCHECK_ADD_PAGES
{
262 _Inout_ PVOID Context
;
264 _In_ ULONG BugCheckCode
;
265 _Out_ ULONG_PTR Address
;
266 _Out_ ULONG_PTR Count
;
267 } KBUGCHECK_ADD_PAGES
, *PKBUGCHECK_ADD_PAGES
;
269 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA
{
271 _In_ ULONG InBufferLength
;
272 _In_ ULONG MaximumAllowed
;
274 _Out_ PVOID OutBuffer
;
275 _Out_ ULONG OutBufferLength
;
276 } KBUGCHECK_SECONDARY_DUMP_DATA
, *PKBUGCHECK_SECONDARY_DUMP_DATA
;
278 typedef enum _KBUGCHECK_DUMP_IO_TYPE
{
282 KbDumpIoSecondaryData
,
284 } KBUGCHECK_DUMP_IO_TYPE
;
286 typedef struct _KBUGCHECK_DUMP_IO
{
289 _In_ ULONG BufferLength
;
290 _In_ KBUGCHECK_DUMP_IO_TYPE Type
;
291 } KBUGCHECK_DUMP_IO
, *PKBUGCHECK_DUMP_IO
;
293 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
294 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
295 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
297 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
299 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
302 KBUGCHECK_CALLBACK_REASON Reason
;
304 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
306 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
312 } KBUGCHECK_BUFFER_DUMP_STATE
;
314 _Function_class_(KBUGCHECK_CALLBACK_ROUTINE
)
317 (NTAPI KBUGCHECK_CALLBACK_ROUTINE
)(
320 typedef KBUGCHECK_CALLBACK_ROUTINE
*PKBUGCHECK_CALLBACK_ROUTINE
;
322 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
324 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
325 _Field_size_bytes_opt_(Length
) PVOID Buffer
;
330 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
332 _Function_class_(NMI_CALLBACK
)
335 (NTAPI NMI_CALLBACK
)(
336 _In_opt_ PVOID Context
,
337 _In_ BOOLEAN Handled
);
338 typedef NMI_CALLBACK
*PNMI_CALLBACK
;
340 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE
{
341 KeProcessorAddStartNotify
= 0,
342 KeProcessorAddCompleteNotify
,
343 KeProcessorAddFailureNotify
344 } KE_PROCESSOR_CHANGE_NOTIFY_STATE
;
346 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
{
347 KE_PROCESSOR_CHANGE_NOTIFY_STATE State
;
350 #if (NTDDI_VERSION >= NTDDI_WIN7)
351 PROCESSOR_NUMBER ProcNumber
;
353 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
;
356 _Function_class_(PROCESSOR_CALLBACK_FUNCTION
)
358 (NTAPI PROCESSOR_CALLBACK_FUNCTION
)(
359 _In_ PVOID CallbackContext
,
360 _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext
,
361 _Inout_ PNTSTATUS OperationStatus
);
362 typedef PROCESSOR_CALLBACK_FUNCTION
*PPROCESSOR_CALLBACK_FUNCTION
;
364 #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
366 #define INVALID_PROCESSOR_INDEX 0xffffffff
368 typedef enum _KINTERRUPT_POLARITY
{
369 InterruptPolarityUnknown
,
372 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
374 typedef enum _KPROFILE_SOURCE
{
376 ProfileAlignmentFixup
,
379 ProfileLoadInstructions
,
380 ProfilePipelineFrozen
,
381 ProfileBranchInstructions
,
382 ProfileTotalNonissues
,
386 ProfileBranchMispredictions
,
387 ProfileStoreInstructions
,
388 ProfileFpInstructions
,
389 ProfileIntegerInstructions
,
393 ProfileSpecialInstructions
,
396 ProfileDcacheAccesses
,
397 ProfileMemoryBarrierCycles
,
398 ProfileLoadLinkedIssues
,
402 typedef enum _KWAIT_REASON
{
443 typedef struct _KWAIT_BLOCK
{
444 LIST_ENTRY WaitListEntry
;
445 #if (NTDDI_VERSION >= NTDDI_WIN8)
447 volatile UCHAR BlockState
;
453 struct _KTHREAD
*Thread
;
454 struct _KQUEUE
*NotificationQueue
;
459 struct _KTHREAD
*Thread
;
461 struct _KWAIT_BLOCK
*NextWaitBlock
;
464 #if (NTDDI_VERSION >= NTDDI_WIN7)
465 volatile UCHAR BlockState
;
473 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
475 typedef enum _KINTERRUPT_MODE
{
480 #define THREAD_WAIT_OBJECTS 3
483 _Function_class_(KSTART_ROUTINE
)
485 (NTAPI KSTART_ROUTINE
)(
486 _In_ PVOID StartContext
);
487 typedef KSTART_ROUTINE
*PKSTART_ROUTINE
;
490 (NTAPI
*PKINTERRUPT_ROUTINE
)(
493 _Function_class_(KSERVICE_ROUTINE
)
494 _IRQL_requires_(HIGH_LEVEL
)
497 (NTAPI KSERVICE_ROUTINE
)(
498 _In_
struct _KINTERRUPT
*Interrupt
,
499 _In_ PVOID ServiceContext
);
500 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
502 _Function_class_(KMESSAGE_SERVICE_ROUTINE
)
505 (NTAPI KMESSAGE_SERVICE_ROUTINE
)(
506 _In_
struct _KINTERRUPT
*Interrupt
,
507 _In_ PVOID ServiceContext
,
508 _In_ ULONG MessageID
);
509 typedef KMESSAGE_SERVICE_ROUTINE
*PKMESSAGE_SERVICE_ROUTINE
;
511 typedef enum _KD_OPTION
{
512 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
);
535 typedef struct _KAPC
{
541 struct _KTHREAD
*Thread
;
542 LIST_ENTRY ApcListEntry
;
544 PKKERNEL_ROUTINE KernelRoutine
;
545 PKRUNDOWN_ROUTINE RundownRoutine
;
546 PKNORMAL_ROUTINE NormalRoutine
;
551 PVOID SystemArgument1
;
552 PVOID SystemArgument2
;
554 KPROCESSOR_MODE ApcMode
;
556 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
558 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
559 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
560 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
561 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
562 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
563 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
564 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
566 typedef struct _KDEVICE_QUEUE_ENTRY
{
567 LIST_ENTRY DeviceListEntry
;
570 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
571 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
573 typedef PVOID PKIPI_CONTEXT
;
576 (NTAPI
*PKIPI_WORKER
)(
577 IN OUT PKIPI_CONTEXT PacketContext
,
578 IN PVOID Parameter1 OPTIONAL
,
579 IN PVOID Parameter2 OPTIONAL
,
580 IN PVOID Parameter3 OPTIONAL
);
582 typedef struct _KIPI_COUNTS
{
588 ULONG FlushMultipleTb
;
594 ULONG SweepIcacheRange
;
595 ULONG FlushIoBuffers
;
597 } KIPI_COUNTS
, *PKIPI_COUNTS
;
600 _Function_class_(KIPI_BROADCAST_WORKER
)
601 _IRQL_requires_(IPI_LEVEL
)
603 (NTAPI KIPI_BROADCAST_WORKER
)(
604 _In_ ULONG_PTR Argument
);
605 typedef KIPI_BROADCAST_WORKER
*PKIPI_BROADCAST_WORKER
;
607 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
609 typedef struct _KSPIN_LOCK_QUEUE
{
610 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
611 PKSPIN_LOCK
volatile Lock
;
612 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
614 typedef struct _KLOCK_QUEUE_HANDLE
{
615 KSPIN_LOCK_QUEUE LockQueue
;
617 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
621 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
623 #define LockQueueDispatcherLock 0
624 #define LockQueueExpansionLock 1
625 #define LockQueuePfnLock 2
626 #define LockQueueSystemSpaceLock 3
627 #define LockQueueVacbLock 4
628 #define LockQueueMasterLock 5
629 #define LockQueueNonPagedPoolLock 6
630 #define LockQueueIoCancelLock 7
631 #define LockQueueWorkQueueLock 8
632 #define LockQueueIoVpbLock 9
633 #define LockQueueIoDatabaseLock 10
634 #define LockQueueIoCompletionLock 11
635 #define LockQueueNtfsStructLock 12
636 #define LockQueueAfdWorkQueueLock 13
637 #define LockQueueBcbLock 14
638 #define LockQueueMmNonPagedPoolLock 15
639 #define LockQueueUnusedSpare16 16
640 #define LockQueueTimerTableLock 17
641 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
645 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
646 LockQueueDispatcherLock
,
647 LockQueueExpansionLock
,
649 LockQueueSystemSpaceLock
,
652 LockQueueNonPagedPoolLock
,
653 LockQueueIoCancelLock
,
654 LockQueueWorkQueueLock
,
656 LockQueueIoDatabaseLock
,
657 LockQueueIoCompletionLock
,
658 LockQueueNtfsStructLock
,
659 LockQueueAfdWorkQueueLock
,
661 LockQueueMmNonPagedPoolLock
,
662 LockQueueUnusedSpare16
,
663 LockQueueTimerTableLock
,
664 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
665 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
667 #endif /* defined(_AMD64_) */
669 _Function_class_(KDEFERRED_ROUTINE
)
670 _IRQL_requires_(DISPATCH_LEVEL
)
673 (NTAPI KDEFERRED_ROUTINE
)(
674 _In_
struct _KDPC
*Dpc
,
675 _In_opt_ PVOID DeferredContext
,
676 _In_opt_ PVOID SystemArgument1
,
677 _In_opt_ PVOID SystemArgument2
);
678 typedef KDEFERRED_ROUTINE
*PKDEFERRED_ROUTINE
;
680 typedef enum _KDPC_IMPORTANCE
{
687 typedef struct _KDPC
{
690 volatile USHORT Number
;
691 LIST_ENTRY DpcListEntry
;
692 PKDEFERRED_ROUTINE DeferredRoutine
;
693 PVOID DeferredContext
;
694 PVOID SystemArgument1
;
695 PVOID SystemArgument2
;
696 volatile PVOID DpcData
;
697 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
699 typedef struct _KDPC_WATCHDOG_INFORMATION
{
702 ULONG DpcWatchdogLimit
;
703 ULONG DpcWatchdogCount
;
705 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
707 typedef struct _KDEVICE_QUEUE
{
710 LIST_ENTRY DeviceListHead
;
712 # if defined(_AMD64_)
713 _ANONYMOUS_UNION
union {
715 _ANONYMOUS_STRUCT
struct {
723 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
725 #define TIMER_EXPIRED_INDEX_BITS 6
726 #define TIMER_PROCESSOR_INDEX_BITS 5
728 typedef struct _DISPATCHER_HEADER
{
729 _ANONYMOUS_UNION
union {
730 _ANONYMOUS_STRUCT
struct {
732 _ANONYMOUS_UNION
union {
733 _ANONYMOUS_UNION
union {
734 UCHAR TimerControlFlags
;
735 _ANONYMOUS_STRUCT
struct {
738 UCHAR KeepShifting
:1;
739 UCHAR EncodedTolerableDelay
:5;
743 #if (NTDDI_VERSION < NTDDI_WIN7)
748 _ANONYMOUS_UNION
union {
749 _ANONYMOUS_UNION
union {
750 UCHAR ThreadControlFlags
;
751 _ANONYMOUS_STRUCT
struct {
752 UCHAR CpuThrottled
:1;
753 UCHAR CycleProfiling
:1;
754 UCHAR CounterProfiling
:1;
761 _ANONYMOUS_UNION
union {
762 #if (NTDDI_VERSION >= NTDDI_WIN7)
763 _ANONYMOUS_UNION
union {
764 UCHAR TimerMiscFlags
;
765 _ANONYMOUS_STRUCT
struct {
767 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
770 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
773 volatile UCHAR Expired
:1;
777 /* Pre Win7 compatibility fix to latest WDK */
780 _ANONYMOUS_UNION
union {
782 _ANONYMOUS_STRUCT
struct {
784 BOOLEAN Instrumented
:1;
786 BOOLEAN UmsScheduled
:1;
787 BOOLEAN UmsPrimary
:1;
789 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
796 LIST_ENTRY WaitListHead
;
797 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
799 typedef struct _KEVENT
{
800 DISPATCHER_HEADER Header
;
801 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
803 typedef struct _KSEMAPHORE
{
804 DISPATCHER_HEADER Header
;
806 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
808 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
810 typedef struct _KGATE
{
811 DISPATCHER_HEADER Header
;
812 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
814 typedef struct _KGUARDED_MUTEX
{
819 _ANONYMOUS_UNION
union {
820 _ANONYMOUS_STRUCT
struct {
821 SHORT KernelApcDisable
;
822 SHORT SpecialApcDisable
;
824 ULONG CombinedApcDisable
;
826 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
828 typedef struct _KMUTANT
{
829 DISPATCHER_HEADER Header
;
830 LIST_ENTRY MutantListEntry
;
831 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
834 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
836 #define TIMER_TABLE_SIZE 512
837 #define TIMER_TABLE_SHIFT 9
839 typedef struct _KTIMER
{
840 DISPATCHER_HEADER Header
;
841 ULARGE_INTEGER DueTime
;
842 LIST_ENTRY TimerListEntry
;
844 #if (NTDDI_VERSION >= NTDDI_WIN7) && !defined(_X86_)
848 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
850 typedef enum _LOCK_OPERATION
{
856 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
858 _Function_class_(KSYNCHRONIZE_ROUTINE
)
861 (NTAPI KSYNCHRONIZE_ROUTINE
)(
862 _In_ PVOID SynchronizeContext
);
863 typedef KSYNCHRONIZE_ROUTINE
*PKSYNCHRONIZE_ROUTINE
;
865 typedef enum _POOL_TYPE
{
868 NonPagedPoolMustSucceed
,
870 NonPagedPoolCacheAligned
,
871 PagedPoolCacheAligned
,
872 NonPagedPoolCacheAlignedMustS
,
874 NonPagedPoolSession
= 32,
876 NonPagedPoolMustSucceedSession
,
877 DontUseThisTypeSession
,
878 NonPagedPoolCacheAlignedSession
,
879 PagedPoolCacheAlignedSession
,
880 NonPagedPoolCacheAlignedMustSSession
883 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
887 } ALTERNATIVE_ARCHITECTURE_TYPE
;
892 #define IsNEC_98 (FALSE)
896 #define IsNotNEC_98 (TRUE)
909 typedef struct _KSYSTEM_TIME
{
913 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
915 typedef struct DECLSPEC_ALIGN(16) _M128A
{
920 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
927 USHORT ErrorSelector
;
934 M128A FloatRegisters
[8];
936 M128A XmmRegisters
[16];
939 M128A XmmRegisters
[8];
940 UCHAR Reserved4
[192];
941 ULONG StackControl
[7];
944 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
946 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
949 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
951 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
952 XSAVE_FORMAT LegacyState
;
953 XSAVE_AREA_HEADER Header
;
954 } XSAVE_AREA
, *PXSAVE_AREA
;
956 typedef struct _XSTATE_CONTEXT
{
960 _Field_size_bytes_opt_(Length
) PXSAVE_AREA Area
;
968 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
970 typedef struct _XSTATE_SAVE
{
972 struct _XSTATE_SAVE
* Prev
;
973 struct _KTHREAD
* Thread
;
975 XSTATE_CONTEXT XStateContext
;
976 #elif defined(_IA64_) || defined(_ARM_)
979 _ANONYMOUS_UNION
union {
980 _ANONYMOUS_STRUCT
struct {
983 struct _XSTATE_SAVE
* Prev
;
984 PXSAVE_AREA Reserved3
;
985 struct _KTHREAD
* Thread
;
989 XSTATE_CONTEXT XStateContext
;
992 } XSTATE_SAVE
, *PXSTATE_SAVE
;
996 #define MAXIMUM_SUPPORTED_EXTENSION 512
998 #if !defined(__midl) && !defined(MIDL_PASS)
999 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
1004 #define XSAVE_ALIGN 64
1005 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
1007 #if !defined(__midl) && !defined(MIDL_PASS)
1008 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
1009 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
1010 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
1013 typedef struct _CONTEXT_CHUNK
{
1016 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
1018 typedef struct _CONTEXT_EX
{
1020 CONTEXT_CHUNK Legacy
;
1021 CONTEXT_CHUNK XState
;
1022 } CONTEXT_EX
, *PCONTEXT_EX
;
1024 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1026 #if (NTDDI_VERSION >= NTDDI_VISTA)
1027 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1028 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1029 extern NTSYSAPI CCHAR KeNumberProcessors
;
1031 __CREATE_NTOS_DATA_IMPORT_ALIAS(KeNumberProcessors
)
1032 extern PCCHAR KeNumberProcessors
;
1038 typedef struct _EXCEPTION_REGISTRATION_RECORD
1040 struct _EXCEPTION_REGISTRATION_RECORD
*Next
;
1041 PEXCEPTION_ROUTINE Handler
;
1042 } EXCEPTION_REGISTRATION_RECORD
, *PEXCEPTION_REGISTRATION_RECORD
;
1044 typedef struct _NT_TIB
{
1045 struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;
1049 _ANONYMOUS_UNION
union {
1053 PVOID ArbitraryUserPointer
;
1054 struct _NT_TIB
*Self
;
1057 typedef struct _NT_TIB32
{
1058 ULONG ExceptionList
;
1062 _ANONYMOUS_UNION
union {
1066 ULONG ArbitraryUserPointer
;
1068 } NT_TIB32
,*PNT_TIB32
;
1070 typedef struct _NT_TIB64
{
1071 ULONG64 ExceptionList
;
1074 ULONG64 SubSystemTib
;
1075 _ANONYMOUS_UNION
union {
1079 ULONG64 ArbitraryUserPointer
;
1081 } NT_TIB64
,*PNT_TIB64
;
1083 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
1084 #define NX_SUPPORT_POLICY_ALWAYSON 1
1085 #define NX_SUPPORT_POLICY_OPTIN 2
1086 #define NX_SUPPORT_POLICY_OPTOUT 3
1088 _IRQL_requires_same_
1089 _Function_class_(EXPAND_STACK_CALLOUT
)
1091 (NTAPI EXPAND_STACK_CALLOUT
)(
1092 _In_opt_ PVOID Parameter
);
1093 typedef EXPAND_STACK_CALLOUT
*PEXPAND_STACK_CALLOUT
;
1096 (NTAPI
*PTIMER_APC_ROUTINE
)(
1097 _In_ PVOID TimerContext
,
1098 _In_ ULONG TimerLowValue
,
1099 _In_ LONG TimerHighValue
);
1101 typedef enum _TIMER_SET_INFORMATION_CLASS
{
1102 TimerSetCoalescableTimer
,
1104 } TIMER_SET_INFORMATION_CLASS
;
1106 #if (NTDDI_VERSION >= NTDDI_WIN7)
1107 typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO
{
1108 _In_ LARGE_INTEGER DueTime
;
1109 _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine
;
1110 _In_opt_ PVOID TimerContext
;
1111 _In_opt_
struct _COUNTED_REASON_CONTEXT
*WakeContext
;
1112 _In_opt_ ULONG Period
;
1113 _In_ ULONG TolerableDelay
;
1114 _Out_opt_ PBOOLEAN PreviousState
;
1115 } TIMER_SET_COALESCABLE_TIMER_INFO
, *PTIMER_SET_COALESCABLE_TIMER_INFO
;
1116 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1118 #define XSTATE_LEGACY_FLOATING_POINT 0
1119 #define XSTATE_LEGACY_SSE 1
1120 #define XSTATE_GSSE 2
1122 #define XSTATE_MASK_LEGACY_FLOATING_POINT (1LL << (XSTATE_LEGACY_FLOATING_POINT))
1123 #define XSTATE_MASK_LEGACY_SSE (1LL << (XSTATE_LEGACY_SSE))
1124 #define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
1125 #define XSTATE_MASK_GSSE (1LL << (XSTATE_GSSE))
1127 #define MAXIMUM_XSTATE_FEATURES 64
1129 typedef struct _XSTATE_FEATURE
{
1132 } XSTATE_FEATURE
, *PXSTATE_FEATURE
;
1134 typedef struct _XSTATE_CONFIGURATION
{
1135 ULONG64 EnabledFeatures
;
1137 ULONG OptimizedSave
:1;
1138 XSTATE_FEATURE Features
[MAXIMUM_XSTATE_FEATURES
];
1139 } XSTATE_CONFIGURATION
, *PXSTATE_CONFIGURATION
;
1141 #define MAX_WOW64_SHARED_ENTRIES 16
1143 typedef struct _KUSER_SHARED_DATA
{
1144 ULONG TickCountLowDeprecated
;
1145 ULONG TickCountMultiplier
;
1146 volatile KSYSTEM_TIME InterruptTime
;
1147 volatile KSYSTEM_TIME SystemTime
;
1148 volatile KSYSTEM_TIME TimeZoneBias
;
1149 USHORT ImageNumberLow
;
1150 USHORT ImageNumberHigh
;
1151 WCHAR NtSystemRoot
[260];
1152 ULONG MaxStackTraceDepth
;
1153 ULONG CryptoExponent
;
1155 ULONG LargePageMinimum
;
1157 NT_PRODUCT_TYPE NtProductType
;
1158 BOOLEAN ProductTypeIsValid
;
1159 ULONG NtMajorVersion
;
1160 ULONG NtMinorVersion
;
1161 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
1164 volatile ULONG TimeSlip
;
1165 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
1166 ULONG AltArchitecturePad
[1];
1167 LARGE_INTEGER SystemExpirationDate
;
1169 BOOLEAN KdDebuggerEnabled
;
1170 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1171 UCHAR NXSupportPolicy
;
1173 volatile ULONG ActiveConsoleId
;
1174 volatile ULONG DismountCount
;
1175 ULONG ComPlusPackage
;
1176 ULONG LastSystemRITEventTickCount
;
1177 ULONG NumberOfPhysicalPages
;
1178 BOOLEAN SafeBootMode
;
1179 #if (NTDDI_VERSION >= NTDDI_WIN7)
1180 _ANONYMOUS_UNION
union {
1182 _ANONYMOUS_STRUCT
struct {
1183 UCHAR TscQpcEnabled
:1;
1184 UCHAR TscQpcSpareFlag
:1;
1185 UCHAR TscQpcShift
:6;
1190 #if (NTDDI_VERSION >= NTDDI_VISTA)
1191 _ANONYMOUS_UNION
union {
1192 ULONG SharedDataFlags
;
1193 _ANONYMOUS_STRUCT
struct {
1194 ULONG DbgErrorPortPresent
:1;
1195 ULONG DbgElevationEnabled
:1;
1196 ULONG DbgVirtEnabled
:1;
1197 ULONG DbgInstallerDetectEnabled
:1;
1198 ULONG DbgSystemDllRelocated
:1;
1199 ULONG DbgDynProcessorEnabled
:1;
1200 ULONG DbgSEHValidationEnabled
:1;
1207 ULONG DataFlagsPad
[1];
1208 ULONGLONG TestRetInstruction
;
1210 ULONG SystemCallReturn
;
1211 ULONGLONG SystemCallPad
[3];
1212 _ANONYMOUS_UNION
union {
1213 volatile KSYSTEM_TIME TickCount
;
1214 volatile ULONG64 TickCountQuad
;
1215 _ANONYMOUS_STRUCT
struct {
1216 ULONG ReservedTickCountOverlay
[3];
1217 ULONG TickCountPad
[1];
1222 #if (NTDDI_VERSION >= NTDDI_WS03)
1223 LONGLONG ConsoleSessionForegroundProcessId
;
1224 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
1226 #if (NTDDI_VERSION >= NTDDI_VISTA)
1227 #if (NTDDI_VERSION >= NTDDI_WIN7)
1228 USHORT UserModeGlobalLogger
[16];
1230 USHORT UserModeGlobalLogger
[8];
1231 ULONG HeapTracingPid
[2];
1232 ULONG CritSecTracingPid
[2];
1234 ULONG ImageFileExecutionOptions
;
1235 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
1236 ULONG LangGenerationCount
;
1238 /* 4 bytes padding */
1240 ULONGLONG Reserved5
;
1241 volatile ULONG64 InterruptTimeBias
;
1243 #if (NTDDI_VERSION >= NTDDI_WIN7)
1244 volatile ULONG64 TscQpcBias
;
1245 volatile ULONG ActiveProcessorCount
;
1246 volatile USHORT ActiveGroupCount
;
1248 volatile ULONG AitSamplingValue
;
1249 volatile ULONG AppCompatFlag
;
1250 ULONGLONG SystemDllNativeRelocation
;
1251 ULONG SystemDllWowRelocation
;
1253 XSTATE_CONFIGURATION XState
;
1255 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
1257 #if (NTDDI_VERSION >= NTDDI_VISTA)
1258 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1259 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1260 extern NTSYSAPI CCHAR KeNumberProcessors
;
1262 extern PCCHAR KeNumberProcessors
;
1267 typedef struct _KAPC_STATE
{
1268 LIST_ENTRY ApcListHead
[MaximumMode
];
1270 BOOLEAN KernelApcInProgress
;
1271 BOOLEAN KernelApcPending
;
1272 BOOLEAN UserApcPending
;
1273 } KAPC_STATE
, *PKAPC_STATE
, *RESTRICTED_POINTER PRKAPC_STATE
;
1275 #define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN))
1277 #define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject);
1279 typedef struct _KQUEUE
{
1280 DISPATCHER_HEADER Header
;
1281 LIST_ENTRY EntryListHead
;
1282 volatile ULONG CurrentCount
;
1284 LIST_ENTRY ThreadListHead
;
1285 } KQUEUE
, *PKQUEUE
, *RESTRICTED_POINTER PRKQUEUE
;