1 /******************************************************************************
3 ******************************************************************************/
7 (NTAPI
*PEXPAND_STACK_CALLOUT
)(
8 IN PVOID Parameter OPTIONAL
);
11 (NTAPI
*PTIMER_APC_ROUTINE
)(
12 IN PVOID TimerContext
,
13 IN ULONG TimerLowValue
,
14 IN LONG TimerHighValue
);
16 typedef enum _TIMER_SET_INFORMATION_CLASS
{
17 TimerSetCoalescableTimer
,
19 } TIMER_SET_INFORMATION_CLASS
;
21 #if (NTDDI_VERSION >= NTDDI_WIN7)
22 typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO
{
23 IN LARGE_INTEGER DueTime
;
24 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL
;
25 IN PVOID TimerContext OPTIONAL
;
26 IN
struct _COUNTED_REASON_CONTEXT
*WakeContext OPTIONAL
;
27 IN ULONG Period OPTIONAL
;
28 IN ULONG TolerableDelay
;
29 OUT PBOOLEAN PreviousState OPTIONAL
;
30 } TIMER_SET_COALESCABLE_TIMER_INFO
, *PTIMER_SET_COALESCABLE_TIMER_INFO
;
31 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
33 #define XSTATE_LEGACY_FLOATING_POINT 0
34 #define XSTATE_LEGACY_SSE 1
37 #define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT))
38 #define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE))
39 #define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
40 #define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE))
42 #define MAXIMUM_XSTATE_FEATURES 64
44 typedef struct _XSTATE_FEATURE
{
47 } XSTATE_FEATURE
, *PXSTATE_FEATURE
;
49 typedef struct _XSTATE_CONFIGURATION
{
50 ULONG64 EnabledFeatures
;
52 ULONG OptimizedSave
:1;
53 XSTATE_FEATURE Features
[MAXIMUM_XSTATE_FEATURES
];
54 } XSTATE_CONFIGURATION
, *PXSTATE_CONFIGURATION
;
58 typedef UCHAR KIRQL
, *PKIRQL
;
59 typedef CCHAR KPROCESSOR_MODE
;
60 typedef LONG KPRIORITY
;
68 #define CACHE_FULLY_ASSOCIATIVE 0xFF
70 #define EVENT_QUERY_STATE (0x0001)
71 #define EVENT_MODIFY_STATE (0x0002)
72 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
74 #define LTP_PC_SMT 0x1
76 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
77 #define SINGLE_GROUP_LEGACY_API 1
80 #define SEMAPHORE_QUERY_STATE (0x0001)
81 #define SEMAPHORE_MODIFY_STATE (0x0002)
82 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
84 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP
{
85 RelationProcessorCore
,
88 RelationProcessorPackage
,
91 } LOGICAL_PROCESSOR_RELATIONSHIP
;
93 typedef enum _PROCESSOR_CACHE_TYPE
{
98 } PROCESSOR_CACHE_TYPE
;
100 typedef struct _CACHE_DESCRIPTOR
{
105 PROCESSOR_CACHE_TYPE Type
;
106 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
108 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION
{
109 ULONG_PTR ProcessorMask
;
110 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
118 CACHE_DESCRIPTOR Cache
;
119 ULONGLONG Reserved
[2];
121 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION
;
123 typedef struct _PROCESSOR_RELATIONSHIP
{
127 GROUP_AFFINITY GroupMask
[ANYSIZE_ARRAY
];
128 } PROCESSOR_RELATIONSHIP
, *PPROCESSOR_RELATIONSHIP
;
130 typedef struct _NUMA_NODE_RELATIONSHIP
{
133 GROUP_AFFINITY GroupMask
;
134 } NUMA_NODE_RELATIONSHIP
, *PNUMA_NODE_RELATIONSHIP
;
136 typedef struct _CACHE_RELATIONSHIP
{
141 PROCESSOR_CACHE_TYPE Type
;
143 GROUP_AFFINITY GroupMask
;
144 } CACHE_RELATIONSHIP
, *PCACHE_RELATIONSHIP
;
146 typedef struct _PROCESSOR_GROUP_INFO
{
147 UCHAR MaximumProcessorCount
;
148 UCHAR ActiveProcessorCount
;
150 KAFFINITY ActiveProcessorMask
;
151 } PROCESSOR_GROUP_INFO
, *PPROCESSOR_GROUP_INFO
;
153 typedef struct _GROUP_RELATIONSHIP
{
154 USHORT MaximumGroupCount
;
155 USHORT ActiveGroupCount
;
157 PROCESSOR_GROUP_INFO GroupInfo
[ANYSIZE_ARRAY
];
158 } GROUP_RELATIONSHIP
, *PGROUP_RELATIONSHIP
;
160 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
{
161 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
164 PROCESSOR_RELATIONSHIP Processor
;
165 NUMA_NODE_RELATIONSHIP NumaNode
;
166 CACHE_RELATIONSHIP Cache
;
167 GROUP_RELATIONSHIP Group
;
169 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
;;
171 /* Processor features */
172 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
173 #define PF_FLOATING_POINT_EMULATED 1
174 #define PF_COMPARE_EXCHANGE_DOUBLE 2
175 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
176 #define PF_PPC_MOVEMEM_64BIT_OK 4
177 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
178 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
179 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
180 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
181 #define PF_PAE_ENABLED 9
182 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
183 #define PF_SSE_DAZ_MODE_AVAILABLE 11
184 #define PF_NX_ENABLED 12
185 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
186 #define PF_COMPARE_EXCHANGE128 14
187 #define PF_COMPARE64_EXCHANGE128 15
188 #define PF_CHANNELS_ENABLED 16
189 #define PF_XSAVE_ENABLED 17
191 #define MAXIMUM_WAIT_OBJECTS 64
193 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
195 #define ASSERT_DPC(Object) \
196 ASSERT(((Object)->Type == 0) || \
197 ((Object)->Type == DpcObject) || \
198 ((Object)->Type == ThreadedDpcObject))
200 #define ASSERT_GATE(object) \
201 NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
202 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
204 #define ASSERT_DEVICE_QUEUE(Object) \
205 NT_ASSERT((Object)->Type == DeviceQueueObject)
207 #define ASSERT_TIMER(E) \
208 NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
209 ((E)->Header.Type == TimerSynchronizationObject))
211 #define ASSERT_MUTANT(E) \
212 NT_ASSERT((E)->Header.Type == MutantObject)
214 #define ASSERT_SEMAPHORE(E) \
215 NT_ASSERT((E)->Header.Type == SemaphoreObject)
217 #define ASSERT_EVENT(E) \
218 NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
219 ((E)->Header.Type == SynchronizationEvent))
222 #define DPC_THREADED 1
224 #define GM_LOCK_BIT 0x1
225 #define GM_LOCK_BIT_V 0x0
226 #define GM_LOCK_WAITER_WOKEN 0x2
227 #define GM_LOCK_WAITER_INC 0x4
229 #define LOCK_QUEUE_WAIT_BIT 0
230 #define LOCK_QUEUE_OWNER_BIT 1
232 #define LOCK_QUEUE_WAIT 1
233 #define LOCK_QUEUE_OWNER 2
234 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
235 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
237 #define PROCESSOR_FEATURE_MAX 64
239 #define DBG_STATUS_CONTROL_C 1
240 #define DBG_STATUS_SYSRQ 2
241 #define DBG_STATUS_BUGCHECK_FIRST 3
242 #define DBG_STATUS_BUGCHECK_SECOND 4
243 #define DBG_STATUS_FATAL 5
244 #define DBG_STATUS_DEBUG_CONTROL 6
245 #define DBG_STATUS_WORKER 7
248 #define MAXIMUM_PROC_PER_GROUP 64
250 #define MAXIMUM_PROC_PER_GROUP 32
252 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
254 /* Exception Records */
255 #define EXCEPTION_NONCONTINUABLE 1
256 #define EXCEPTION_MAXIMUM_PARAMETERS 15
258 #define EXCEPTION_DIVIDED_BY_ZERO 0
259 #define EXCEPTION_DEBUG 1
260 #define EXCEPTION_NMI 2
261 #define EXCEPTION_INT3 3
262 #define EXCEPTION_BOUND_CHECK 5
263 #define EXCEPTION_INVALID_OPCODE 6
264 #define EXCEPTION_NPX_NOT_AVAILABLE 7
265 #define EXCEPTION_DOUBLE_FAULT 8
266 #define EXCEPTION_NPX_OVERRUN 9
267 #define EXCEPTION_INVALID_TSS 0x0A
268 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
269 #define EXCEPTION_STACK_FAULT 0x0C
270 #define EXCEPTION_GP_FAULT 0x0D
271 #define EXCEPTION_RESERVED_TRAP 0x0F
272 #define EXCEPTION_NPX_ERROR 0x010
273 #define EXCEPTION_ALIGNMENT_CHECK 0x011
275 typedef struct _EXCEPTION_RECORD
{
276 NTSTATUS ExceptionCode
;
277 ULONG ExceptionFlags
;
278 struct _EXCEPTION_RECORD
*ExceptionRecord
;
279 PVOID ExceptionAddress
;
280 ULONG NumberParameters
;
281 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
282 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
284 typedef struct _EXCEPTION_RECORD32
{
285 NTSTATUS ExceptionCode
;
286 ULONG ExceptionFlags
;
287 ULONG ExceptionRecord
;
288 ULONG ExceptionAddress
;
289 ULONG NumberParameters
;
290 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
291 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
293 typedef struct _EXCEPTION_RECORD64
{
294 NTSTATUS ExceptionCode
;
295 ULONG ExceptionFlags
;
296 ULONG64 ExceptionRecord
;
297 ULONG64 ExceptionAddress
;
298 ULONG NumberParameters
;
299 ULONG __unusedAlignment
;
300 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
301 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
303 typedef struct _EXCEPTION_POINTERS
{
304 PEXCEPTION_RECORD ExceptionRecord
;
305 PCONTEXT ContextRecord
;
306 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
308 typedef enum _KBUGCHECK_CALLBACK_REASON
{
311 KbCallbackSecondaryDumpData
,
314 } KBUGCHECK_CALLBACK_REASON
;
316 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
319 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE
)(
320 IN KBUGCHECK_CALLBACK_REASON Reason
,
321 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
322 IN OUT PVOID ReasonSpecificData
,
323 IN ULONG ReasonSpecificDataLength
);
324 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
;
326 typedef struct _KBUGCHECK_ADD_PAGES
{
327 IN OUT PVOID Context
;
329 IN ULONG BugCheckCode
;
330 OUT ULONG_PTR Address
;
332 } KBUGCHECK_ADD_PAGES
, *PKBUGCHECK_ADD_PAGES
;
334 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA
{
336 IN ULONG InBufferLength
;
337 IN ULONG MaximumAllowed
;
340 OUT ULONG OutBufferLength
;
341 } KBUGCHECK_SECONDARY_DUMP_DATA
, *PKBUGCHECK_SECONDARY_DUMP_DATA
;
343 typedef enum _KBUGCHECK_DUMP_IO_TYPE
{
347 KbDumpIoSecondaryData
,
349 } KBUGCHECK_DUMP_IO_TYPE
;
351 typedef struct _KBUGCHECK_DUMP_IO
{
354 IN ULONG BufferLength
;
355 IN KBUGCHECK_DUMP_IO_TYPE Type
;
356 } KBUGCHECK_DUMP_IO
, *PKBUGCHECK_DUMP_IO
;
358 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
359 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
360 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
362 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
364 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
367 KBUGCHECK_CALLBACK_REASON Reason
;
369 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
371 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
377 } KBUGCHECK_BUFFER_DUMP_STATE
;
380 (NTAPI KBUGCHECK_CALLBACK_ROUTINE
)(
383 typedef KBUGCHECK_CALLBACK_ROUTINE
*PKBUGCHECK_CALLBACK_ROUTINE
;
385 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
387 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
393 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
396 (NTAPI NMI_CALLBACK
)(
399 typedef NMI_CALLBACK
*PNMI_CALLBACK
;
401 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE
{
402 KeProcessorAddStartNotify
= 0,
403 KeProcessorAddCompleteNotify
,
404 KeProcessorAddFailureNotify
405 } KE_PROCESSOR_CHANGE_NOTIFY_STATE
;
407 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
{
408 KE_PROCESSOR_CHANGE_NOTIFY_STATE State
;
411 #if (NTDDI_VERSION >= NTDDI_WIN7)
412 PROCESSOR_NUMBER ProcNumber
;
414 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
;
417 (NTAPI PROCESSOR_CALLBACK_FUNCTION
)(
418 IN PVOID CallbackContext
,
419 IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext
,
420 IN OUT PNTSTATUS OperationStatus
);
421 typedef PROCESSOR_CALLBACK_FUNCTION
*PPROCESSOR_CALLBACK_FUNCTION
;
423 #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
425 #define INVALID_PROCESSOR_INDEX 0xffffffff
427 typedef enum _KINTERRUPT_POLARITY
{
428 InterruptPolarityUnknown
,
431 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
433 typedef enum _KPROFILE_SOURCE
{
435 ProfileAlignmentFixup
,
438 ProfileLoadInstructions
,
439 ProfilePipelineFrozen
,
440 ProfileBranchInstructions
,
441 ProfileTotalNonissues
,
445 ProfileBranchMispredictions
,
446 ProfileStoreInstructions
,
447 ProfileFpInstructions
,
448 ProfileIntegerInstructions
,
452 ProfileSpecialInstructions
,
455 ProfileDcacheAccesses
,
456 ProfileMemoryBarrierCycles
,
457 ProfileLoadLinkedIssues
,
461 typedef enum _KWAIT_REASON
{
502 typedef struct _KWAIT_BLOCK
{
503 LIST_ENTRY WaitListEntry
;
504 struct _KTHREAD
*Thread
;
506 struct _KWAIT_BLOCK
*NextWaitBlock
;
509 volatile UCHAR BlockState
;
513 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
515 typedef enum _KINTERRUPT_MODE
{
520 #define THREAD_WAIT_OBJECTS 3
523 (NTAPI KSTART_ROUTINE
)(
524 IN PVOID StartContext
);
525 typedef KSTART_ROUTINE
*PKSTART_ROUTINE
;
528 (NTAPI
*PKINTERRUPT_ROUTINE
)(
532 (NTAPI KSERVICE_ROUTINE
)(
533 IN
struct _KINTERRUPT
*Interrupt
,
534 IN PVOID ServiceContext
);
535 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
538 (NTAPI KMESSAGE_SERVICE_ROUTINE
)(
539 IN
struct _KINTERRUPT
*Interrupt
,
540 IN PVOID ServiceContext
,
542 typedef KMESSAGE_SERVICE_ROUTINE
*PKMESSAGE_SERVICE_ROUTINE
;
544 typedef enum _KD_OPTION
{
545 KD_OPTION_SET_BLOCK_ENABLE
,
549 (NTAPI
*PKNORMAL_ROUTINE
)(
550 IN PVOID NormalContext OPTIONAL
,
551 IN PVOID SystemArgument1 OPTIONAL
,
552 IN PVOID SystemArgument2 OPTIONAL
);
555 (NTAPI
*PKRUNDOWN_ROUTINE
)(
556 IN
struct _KAPC
*Apc
);
559 (NTAPI
*PKKERNEL_ROUTINE
)(
560 IN
struct _KAPC
*Apc
,
561 IN OUT PKNORMAL_ROUTINE
*NormalRoutine OPTIONAL
,
562 IN OUT PVOID
*NormalContext OPTIONAL
,
563 IN OUT PVOID
*SystemArgument1 OPTIONAL
,
564 IN OUT PVOID
*SystemArgument2 OPTIONAL
);
566 typedef struct _KAPC
{
572 struct _KTHREAD
*Thread
;
573 LIST_ENTRY ApcListEntry
;
574 PKKERNEL_ROUTINE KernelRoutine
;
575 PKRUNDOWN_ROUTINE RundownRoutine
;
576 PKNORMAL_ROUTINE NormalRoutine
;
578 PVOID SystemArgument1
;
579 PVOID SystemArgument2
;
581 KPROCESSOR_MODE ApcMode
;
583 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
585 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
586 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
587 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
588 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
589 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
590 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
591 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
593 typedef struct _KDEVICE_QUEUE_ENTRY
{
594 LIST_ENTRY DeviceListEntry
;
597 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
598 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
600 typedef PVOID PKIPI_CONTEXT
;
603 (NTAPI
*PKIPI_WORKER
)(
604 IN OUT PKIPI_CONTEXT PacketContext
,
605 IN PVOID Parameter1 OPTIONAL
,
606 IN PVOID Parameter2 OPTIONAL
,
607 IN PVOID Parameter3 OPTIONAL
);
609 typedef struct _KIPI_COUNTS
{
615 ULONG FlushMultipleTb
;
621 ULONG SweepIcacheRange
;
622 ULONG FlushIoBuffers
;
624 } KIPI_COUNTS
, *PKIPI_COUNTS
;
627 (NTAPI KIPI_BROADCAST_WORKER
)(
628 IN ULONG_PTR Argument
);
629 typedef KIPI_BROADCAST_WORKER
*PKIPI_BROADCAST_WORKER
;
631 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
633 typedef struct _KSPIN_LOCK_QUEUE
{
634 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
635 PKSPIN_LOCK
volatile Lock
;
636 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
638 typedef struct _KLOCK_QUEUE_HANDLE
{
639 KSPIN_LOCK_QUEUE LockQueue
;
641 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
645 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
647 #define LockQueueDispatcherLock 0
648 #define LockQueueExpansionLock 1
649 #define LockQueuePfnLock 2
650 #define LockQueueSystemSpaceLock 3
651 #define LockQueueVacbLock 4
652 #define LockQueueMasterLock 5
653 #define LockQueueNonPagedPoolLock 6
654 #define LockQueueIoCancelLock 7
655 #define LockQueueWorkQueueLock 8
656 #define LockQueueIoVpbLock 9
657 #define LockQueueIoDatabaseLock 10
658 #define LockQueueIoCompletionLock 11
659 #define LockQueueNtfsStructLock 12
660 #define LockQueueAfdWorkQueueLock 13
661 #define LockQueueBcbLock 14
662 #define LockQueueMmNonPagedPoolLock 15
663 #define LockQueueUnusedSpare16 16
664 #define LockQueueTimerTableLock 17
665 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
669 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
670 LockQueueDispatcherLock
,
671 LockQueueExpansionLock
,
673 LockQueueSystemSpaceLock
,
676 LockQueueNonPagedPoolLock
,
677 LockQueueIoCancelLock
,
678 LockQueueWorkQueueLock
,
680 LockQueueIoDatabaseLock
,
681 LockQueueIoCompletionLock
,
682 LockQueueNtfsStructLock
,
683 LockQueueAfdWorkQueueLock
,
685 LockQueueMmNonPagedPoolLock
,
686 LockQueueUnusedSpare16
,
687 LockQueueTimerTableLock
,
688 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
689 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
691 #endif /* defined(_AMD64_) */
694 (NTAPI
*PKDEFERRED_ROUTINE
)(
695 IN
struct _KDPC
*Dpc
,
696 IN PVOID DeferredContext OPTIONAL
,
697 IN PVOID SystemArgument1 OPTIONAL
,
698 IN PVOID SystemArgument2 OPTIONAL
);
700 typedef enum _KDPC_IMPORTANCE
{
707 typedef struct _KDPC
{
710 volatile USHORT Number
;
711 LIST_ENTRY DpcListEntry
;
712 PKDEFERRED_ROUTINE DeferredRoutine
;
713 PVOID DeferredContext
;
714 PVOID SystemArgument1
;
715 PVOID SystemArgument2
;
716 volatile PVOID DpcData
;
717 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
719 typedef struct _KDPC_WATCHDOG_INFORMATION
{
722 ULONG DpcWatchdogLimit
;
723 ULONG DpcWatchdogCount
;
725 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
727 typedef struct _KDEVICE_QUEUE
{
730 LIST_ENTRY DeviceListHead
;
743 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
745 #define TIMER_EXPIRED_INDEX_BITS 6
746 #define TIMER_PROCESSOR_INDEX_BITS 5
748 typedef struct _DISPATCHER_HEADER
{
749 _ANONYMOUS_UNION
union {
750 _ANONYMOUS_STRUCT
struct {
752 _ANONYMOUS_UNION
union {
753 _ANONYMOUS_UNION
union {
754 UCHAR TimerControlFlags
;
755 _ANONYMOUS_STRUCT
struct {
758 UCHAR KeepShifting
:1;
759 UCHAR EncodedTolerableDelay
:5;
763 #if (NTDDI_VERSION < NTDDI_WIN7)
768 _ANONYMOUS_UNION
union {
769 _ANONYMOUS_UNION
union {
770 UCHAR ThreadControlFlags
;
771 _ANONYMOUS_STRUCT
struct {
772 UCHAR CpuThrottled
:1;
773 UCHAR CycleProfiling
:1;
774 UCHAR CounterProfiling
:1;
781 _ANONYMOUS_UNION
union {
782 #if (NTDDI_VERSION >= NTDDI_WIN7)
783 _ANONYMOUS_UNION
union {
784 UCHAR TimerMiscFlags
;
785 _ANONYMOUS_STRUCT
struct {
787 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
790 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
793 volatile UCHAR Expired
:1;
797 /* Pre Win7 compatibility fix to latest WDK */
800 _ANONYMOUS_UNION
union {
802 _ANONYMOUS_STRUCT
struct {
804 BOOLEAN Instrumented
:1;
806 BOOLEAN UmsScheduled
:1;
807 BOOLEAN UmsPrimary
:1;
809 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
816 LIST_ENTRY WaitListHead
;
817 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
819 typedef struct _KEVENT
{
820 DISPATCHER_HEADER Header
;
821 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
823 typedef struct _KSEMAPHORE
{
824 DISPATCHER_HEADER Header
;
826 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
828 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
830 typedef struct _KGATE
{
831 DISPATCHER_HEADER Header
;
832 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
834 typedef struct _KGUARDED_MUTEX
{
839 __GNU_EXTENSION
union {
840 __GNU_EXTENSION
struct {
841 SHORT KernelApcDisable
;
842 SHORT SpecialApcDisable
;
844 ULONG CombinedApcDisable
;
846 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
848 typedef struct _KMUTANT
{
849 DISPATCHER_HEADER Header
;
850 LIST_ENTRY MutantListEntry
;
851 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
854 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
856 #define TIMER_TABLE_SIZE 512
857 #define TIMER_TABLE_SHIFT 9
859 typedef struct _KTIMER
{
860 DISPATCHER_HEADER Header
;
861 ULARGE_INTEGER DueTime
;
862 LIST_ENTRY TimerListEntry
;
868 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
870 typedef enum _LOCK_OPERATION
{
876 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
879 (NTAPI
*PKSYNCHRONIZE_ROUTINE
)(
880 IN PVOID SynchronizeContext
);
882 typedef enum _POOL_TYPE
{
885 NonPagedPoolMustSucceed
,
887 NonPagedPoolCacheAligned
,
888 PagedPoolCacheAligned
,
889 NonPagedPoolCacheAlignedMustS
,
891 NonPagedPoolSession
= 32,
893 NonPagedPoolMustSucceedSession
,
894 DontUseThisTypeSession
,
895 NonPagedPoolCacheAlignedSession
,
896 PagedPoolCacheAlignedSession
,
897 NonPagedPoolCacheAlignedMustSSession
900 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
904 } ALTERNATIVE_ARCHITECTURE_TYPE
;
909 #define IsNEC_98 (FALSE)
913 #define IsNotNEC_98 (TRUE)
926 typedef struct _KSYSTEM_TIME
{
930 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
932 typedef struct DECLSPEC_ALIGN(16) _M128A
{
937 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
944 USHORT ErrorSelector
;
951 M128A FloatRegisters
[8];
953 M128A XmmRegisters
[16];
956 M128A XmmRegisters
[8];
957 UCHAR Reserved4
[192];
958 ULONG StackControl
[7];
961 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
963 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
966 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
968 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
969 XSAVE_FORMAT LegacyState
;
970 XSAVE_AREA_HEADER Header
;
971 } XSAVE_AREA
, *PXSAVE_AREA
;
973 typedef struct _XSTATE_CONTEXT
{
985 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
987 typedef struct _XSTATE_SAVE
{
989 struct _XSTATE_SAVE
* Prev
;
990 struct _KTHREAD
* Thread
;
992 XSTATE_CONTEXT XStateContext
;
993 #elif defined(_IA64_)
1000 struct _XSTATE_SAVE
* Prev
;
1001 PXSAVE_AREA Reserved3
;
1002 struct _KTHREAD
* Thread
;
1006 XSTATE_CONTEXT XStateContext
;
1009 } XSTATE_SAVE
, *PXSTATE_SAVE
;
1013 #define MAXIMUM_SUPPORTED_EXTENSION 512
1015 #if !defined(__midl) && !defined(MIDL_PASS)
1016 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
1021 #define XSAVE_ALIGN 64
1022 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
1024 #if !defined(__midl) && !defined(MIDL_PASS)
1025 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
1026 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
1027 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
1030 typedef struct _CONTEXT_CHUNK
{
1033 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
1035 typedef struct _CONTEXT_EX
{
1037 CONTEXT_CHUNK Legacy
;
1038 CONTEXT_CHUNK XState
;
1039 } CONTEXT_EX
, *PCONTEXT_EX
;
1041 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1043 #if (NTDDI_VERSION >= NTDDI_VISTA)
1044 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1045 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1046 extern NTSYSAPI CCHAR KeNumberProcessors
;
1048 extern PCCHAR KeNumberProcessors
;