1 /******************************************************************************
3 ******************************************************************************/
5 typedef UCHAR KIRQL
, *PKIRQL
;
6 typedef CCHAR KPROCESSOR_MODE
;
7 typedef LONG KPRIORITY
;
15 /* Processor features */
16 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
17 #define PF_FLOATING_POINT_EMULATED 1
18 #define PF_COMPARE_EXCHANGE_DOUBLE 2
19 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
20 #define PF_PPC_MOVEMEM_64BIT_OK 4
21 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
22 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
23 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
24 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
25 #define PF_PAE_ENABLED 9
26 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
27 #define PF_SSE_DAZ_MODE_AVAILABLE 11
28 #define PF_NX_ENABLED 12
29 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
30 #define PF_COMPARE_EXCHANGE128 14
31 #define PF_COMPARE64_EXCHANGE128 15
32 #define PF_CHANNELS_ENABLED 16
33 #define PF_XSAVE_ENABLED 17
35 #define MAXIMUM_WAIT_OBJECTS 64
37 #define ASSERT_APC(Object) \
38 ASSERT((Object)->Type == ApcObject)
40 #define ASSERT_DPC(Object) \
41 ASSERT(((Object)->Type == 0) || \
42 ((Object)->Type == DpcObject) || \
43 ((Object)->Type == ThreadedDpcObject))
45 #define ASSERT_GATE(object) \
46 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
47 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
49 #define ASSERT_DEVICE_QUEUE(Object) \
50 ASSERT((Object)->Type == DeviceQueueObject)
52 #define ASSERT_TIMER(E) \
53 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
54 ((E)->Header.Type == TimerSynchronizationObject))
56 #define ASSERT_MUTANT(E) \
57 ASSERT((E)->Header.Type == MutantObject)
59 #define ASSERT_SEMAPHORE(E) \
60 ASSERT((E)->Header.Type == SemaphoreObject)
62 #define ASSERT_EVENT(E) \
63 ASSERT(((E)->Header.Type == NotificationEvent) || \
64 ((E)->Header.Type == SynchronizationEvent))
67 #define DPC_THREADED 1
69 #define GM_LOCK_BIT 0x1
70 #define GM_LOCK_BIT_V 0x0
71 #define GM_LOCK_WAITER_WOKEN 0x2
72 #define GM_LOCK_WAITER_INC 0x4
74 #define LOCK_QUEUE_WAIT_BIT 0
75 #define LOCK_QUEUE_OWNER_BIT 1
77 #define LOCK_QUEUE_WAIT 1
78 #define LOCK_QUEUE_OWNER 2
79 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
80 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
82 #define PROCESSOR_FEATURE_MAX 64
84 #define DBG_STATUS_CONTROL_C 1
85 #define DBG_STATUS_SYSRQ 2
86 #define DBG_STATUS_BUGCHECK_FIRST 3
87 #define DBG_STATUS_BUGCHECK_SECOND 4
88 #define DBG_STATUS_FATAL 5
89 #define DBG_STATUS_DEBUG_CONTROL 6
90 #define DBG_STATUS_WORKER 7
93 #define MAXIMUM_PROC_PER_GROUP 64
95 #define MAXIMUM_PROC_PER_GROUP 32
97 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
99 /* Exception Records */
100 #define EXCEPTION_NONCONTINUABLE 1
101 #define EXCEPTION_MAXIMUM_PARAMETERS 15
103 typedef struct _EXCEPTION_RECORD
{
104 NTSTATUS ExceptionCode
;
105 ULONG ExceptionFlags
;
106 struct _EXCEPTION_RECORD
*ExceptionRecord
;
107 PVOID ExceptionAddress
;
108 ULONG NumberParameters
;
109 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
110 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
112 typedef struct _EXCEPTION_RECORD32
{
113 NTSTATUS ExceptionCode
;
114 ULONG ExceptionFlags
;
115 ULONG ExceptionRecord
;
116 ULONG ExceptionAddress
;
117 ULONG NumberParameters
;
118 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
119 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
121 typedef struct _EXCEPTION_RECORD64
{
122 NTSTATUS ExceptionCode
;
123 ULONG ExceptionFlags
;
124 ULONG64 ExceptionRecord
;
125 ULONG64 ExceptionAddress
;
126 ULONG NumberParameters
;
127 ULONG __unusedAlignment
;
128 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
129 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
131 typedef struct _EXCEPTION_POINTERS
{
132 PEXCEPTION_RECORD ExceptionRecord
;
133 PCONTEXT ContextRecord
;
134 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
136 typedef enum _KBUGCHECK_CALLBACK_REASON
{
139 KbCallbackSecondaryDumpData
,
142 } KBUGCHECK_CALLBACK_REASON
;
144 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
147 (NTAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
148 IN KBUGCHECK_CALLBACK_REASON Reason
,
149 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
150 IN OUT PVOID ReasonSpecificData
,
151 IN ULONG ReasonSpecificDataLength
);
153 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
155 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
158 KBUGCHECK_CALLBACK_REASON Reason
;
160 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
162 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
168 } KBUGCHECK_BUFFER_DUMP_STATE
;
171 (NTAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
175 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
177 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
183 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
186 (NTAPI
*PNMI_CALLBACK
)(
190 typedef enum _TRACE_INFORMATION_CLASS
{
193 TraceEnableFlagsClass
,
194 TraceEnableLevelClass
,
195 GlobalLoggerHandleClass
,
196 EventLoggerHandleClass
,
197 AllLoggerHandlesClass
,
198 TraceHandleByNameClass
,
199 LoggerEventsLostClass
,
200 TraceSessionSettingsClass
,
201 LoggerEventsLoggedClass
,
202 MaxTraceInformationClass
203 } TRACE_INFORMATION_CLASS
;
205 typedef enum _KINTERRUPT_POLARITY
{
206 InterruptPolarityUnknown
,
209 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
211 typedef enum _KPROFILE_SOURCE
{
213 ProfileAlignmentFixup
,
216 ProfileLoadInstructions
,
217 ProfilePipelineFrozen
,
218 ProfileBranchInstructions
,
219 ProfileTotalNonissues
,
223 ProfileBranchMispredictions
,
224 ProfileStoreInstructions
,
225 ProfileFpInstructions
,
226 ProfileIntegerInstructions
,
230 ProfileSpecialInstructions
,
233 ProfileDcacheAccesses
,
234 ProfileMemoryBarrierCycles
,
235 ProfileLoadLinkedIssues
,
239 typedef enum _KWAIT_REASON
{
280 typedef struct _KWAIT_BLOCK
{
281 LIST_ENTRY WaitListEntry
;
282 struct _KTHREAD
*Thread
;
284 struct _KWAIT_BLOCK
*NextWaitBlock
;
287 volatile UCHAR BlockState
;
291 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
293 typedef enum _KINTERRUPT_MODE
{
298 #define THREAD_WAIT_OBJECTS 3
301 (NTAPI
*PKINTERRUPT_ROUTINE
)(
304 typedef enum _KD_OPTION
{
305 KD_OPTION_SET_BLOCK_ENABLE
,
309 (NTAPI
*PKNORMAL_ROUTINE
)(
310 IN PVOID NormalContext
,
311 IN PVOID SystemArgument1
,
312 IN PVOID SystemArgument2
);
315 (NTAPI
*PKRUNDOWN_ROUTINE
)(
316 IN
struct _KAPC
*Apc
);
319 (NTAPI
*PKKERNEL_ROUTINE
)(
320 IN
struct _KAPC
*Apc
,
321 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
322 IN OUT PVOID
*NormalContext
,
323 IN OUT PVOID
*SystemArgument1
,
324 IN OUT PVOID
*SystemArgument2
);
326 typedef struct _KAPC
{
332 struct _KTHREAD
*Thread
;
333 LIST_ENTRY ApcListEntry
;
334 PKKERNEL_ROUTINE KernelRoutine
;
335 PKRUNDOWN_ROUTINE RundownRoutine
;
336 PKNORMAL_ROUTINE NormalRoutine
;
338 PVOID SystemArgument1
;
339 PVOID SystemArgument2
;
341 KPROCESSOR_MODE ApcMode
;
343 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
345 typedef struct _KDEVICE_QUEUE_ENTRY
{
346 LIST_ENTRY DeviceListEntry
;
349 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
350 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
352 typedef PVOID PKIPI_CONTEXT
;
355 (NTAPI
*PKIPI_WORKER
)(
356 IN PKIPI_CONTEXT PacketContext
,
359 IN PVOID Parameter3
);
362 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
363 IN ULONG_PTR Argument
);
365 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
367 typedef struct _KSPIN_LOCK_QUEUE
{
368 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
369 PKSPIN_LOCK
volatile Lock
;
370 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
372 typedef struct _KLOCK_QUEUE_HANDLE
{
373 KSPIN_LOCK_QUEUE LockQueue
;
375 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
379 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
381 #define LockQueueDispatcherLock 0
382 #define LockQueueExpansionLock 1
383 #define LockQueuePfnLock 2
384 #define LockQueueSystemSpaceLock 3
385 #define LockQueueVacbLock 4
386 #define LockQueueMasterLock 5
387 #define LockQueueNonPagedPoolLock 6
388 #define LockQueueIoCancelLock 7
389 #define LockQueueWorkQueueLock 8
390 #define LockQueueIoVpbLock 9
391 #define LockQueueIoDatabaseLock 10
392 #define LockQueueIoCompletionLock 11
393 #define LockQueueNtfsStructLock 12
394 #define LockQueueAfdWorkQueueLock 13
395 #define LockQueueBcbLock 14
396 #define LockQueueMmNonPagedPoolLock 15
397 #define LockQueueUnusedSpare16 16
398 #define LockQueueTimerTableLock 17
399 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
403 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
404 LockQueueDispatcherLock
,
405 LockQueueExpansionLock
,
407 LockQueueSystemSpaceLock
,
410 LockQueueNonPagedPoolLock
,
411 LockQueueIoCancelLock
,
412 LockQueueWorkQueueLock
,
414 LockQueueIoDatabaseLock
,
415 LockQueueIoCompletionLock
,
416 LockQueueNtfsStructLock
,
417 LockQueueAfdWorkQueueLock
,
419 LockQueueMmNonPagedPoolLock
,
420 LockQueueUnusedSpare16
,
421 LockQueueTimerTableLock
,
422 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
423 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
425 #endif /* defined(_AMD64_) */
428 (NTAPI
*PKDEFERRED_ROUTINE
)(
429 IN
struct _KDPC
*Dpc
,
430 IN PVOID DeferredContext
,
431 IN PVOID SystemArgument1
,
432 IN PVOID SystemArgument2
);
434 typedef enum _KDPC_IMPORTANCE
{
441 typedef struct _KDPC
{
444 volatile USHORT Number
;
445 LIST_ENTRY DpcListEntry
;
446 PKDEFERRED_ROUTINE DeferredRoutine
;
447 PVOID DeferredContext
;
448 PVOID SystemArgument1
;
449 PVOID SystemArgument2
;
450 volatile PVOID DpcData
;
451 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
453 typedef struct _KDPC_WATCHDOG_INFORMATION
{
456 ULONG DpcWatchdogLimit
;
457 ULONG DpcWatchdogCount
;
459 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
461 typedef struct _KDEVICE_QUEUE
{
464 LIST_ENTRY DeviceListHead
;
477 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
479 #define TIMER_EXPIRED_INDEX_BITS 6
480 #define TIMER_PROCESSOR_INDEX_BITS 5
482 typedef struct _DISPATCHER_HEADER
{
483 _ANONYMOUS_UNION
union {
484 _ANONYMOUS_STRUCT
struct {
486 _ANONYMOUS_UNION
union {
487 _ANONYMOUS_UNION
union {
488 UCHAR TimerControlFlags
;
489 _ANONYMOUS_STRUCT
struct {
492 UCHAR KeepShifting
:1;
493 UCHAR EncodedTolerableDelay
:5;
497 #if (NTDDI_VERSION < NTDDI_WIN7)
502 _ANONYMOUS_UNION
union {
503 _ANONYMOUS_UNION
union {
504 UCHAR ThreadControlFlags
;
505 _ANONYMOUS_STRUCT
struct {
506 UCHAR CpuThrottled
:1;
507 UCHAR CycleProfiling
:1;
508 UCHAR CounterProfiling
:1;
515 _ANONYMOUS_UNION
union {
516 #if (NTDDI_VERSION >= NTDDI_WIN7)
517 _ANONYMOUS_UNION
union {
518 UCHAR TimerMiscFlags
;
519 _ANONYMOUS_STRUCT
struct {
521 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
524 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
527 volatile UCHAR Expired
:1;
531 /* Pre Win7 compatibility fix to latest WDK */
534 _ANONYMOUS_UNION
union {
536 _ANONYMOUS_STRUCT
struct {
538 BOOLEAN Instrumented
:1;
540 BOOLEAN UmsScheduled
:1;
541 BOOLEAN UmsPrimary
:1;
543 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
550 LIST_ENTRY WaitListHead
;
551 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
553 typedef struct _KEVENT
{
554 DISPATCHER_HEADER Header
;
555 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
557 typedef struct _KSEMAPHORE
{
558 DISPATCHER_HEADER Header
;
560 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
562 typedef struct _KGATE
{
563 DISPATCHER_HEADER Header
;
564 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
566 typedef struct _KGUARDED_MUTEX
{
571 __GNU_EXTENSION
union {
572 __GNU_EXTENSION
struct {
573 SHORT KernelApcDisable
;
574 SHORT SpecialApcDisable
;
576 ULONG CombinedApcDisable
;
578 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
580 typedef struct _KMUTANT
{
581 DISPATCHER_HEADER Header
;
582 LIST_ENTRY MutantListEntry
;
583 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
586 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
588 #define TIMER_TABLE_SIZE 512
589 #define TIMER_TABLE_SHIFT 9
591 typedef struct _KTIMER
{
592 DISPATCHER_HEADER Header
;
593 ULARGE_INTEGER DueTime
;
594 LIST_ENTRY TimerListEntry
;
600 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
603 (NTAPI
*PKSYNCHRONIZE_ROUTINE
)(
604 IN PVOID SynchronizeContext
);
606 typedef enum _POOL_TYPE
{
609 NonPagedPoolMustSucceed
,
611 NonPagedPoolCacheAligned
,
612 PagedPoolCacheAligned
,
613 NonPagedPoolCacheAlignedMustS
,
615 NonPagedPoolSession
= 32,
617 NonPagedPoolMustSucceedSession
,
618 DontUseThisTypeSession
,
619 NonPagedPoolCacheAlignedSession
,
620 PagedPoolCacheAlignedSession
,
621 NonPagedPoolCacheAlignedMustSSession
624 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
628 } ALTERNATIVE_ARCHITECTURE_TYPE
;
630 typedef struct _KSYSTEM_TIME
{
634 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
636 typedef struct _PNP_BUS_INFORMATION
{
638 INTERFACE_TYPE LegacyBusType
;
640 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
642 typedef struct DECLSPEC_ALIGN(16) _M128A
{
647 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
654 USHORT ErrorSelector
;
661 M128A FloatRegisters
[8];
663 M128A XmmRegisters
[16];
666 M128A XmmRegisters
[8];
667 UCHAR Reserved4
[192];
668 ULONG StackControl
[7];
671 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
673 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
676 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
678 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
679 XSAVE_FORMAT LegacyState
;
680 XSAVE_AREA_HEADER Header
;
681 } XSAVE_AREA
, *PXSAVE_AREA
;
683 typedef struct _XSTATE_CONTEXT
{
695 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
699 #define MAXIMUM_SUPPORTED_EXTENSION 512
701 #if !defined(__midl) && !defined(MIDL_PASS)
702 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
707 #define XSAVE_ALIGN 64
708 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
710 #if !defined(__midl) && !defined(MIDL_PASS)
711 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
712 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
713 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
716 typedef struct _CONTEXT_CHUNK
{
719 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
721 typedef struct _CONTEXT_EX
{
723 CONTEXT_CHUNK Legacy
;
724 CONTEXT_CHUNK XState
;
725 } CONTEXT_EX
, *PCONTEXT_EX
;
727 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
729 #if (NTDDI_VERSION >= NTDDI_VISTA)
730 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
731 #elif (NTDDI_VERSION >= NTDDI_WINXP)
732 extern NTSYSAPI CCHAR KeNumberProcessors
;
734 extern PCCHAR KeNumberProcessors
;