1 /******************************************************************************
3 ******************************************************************************/
5 typedef UCHAR KIRQL
, *PKIRQL
;
6 typedef CCHAR KPROCESSOR_MODE
;
7 typedef LONG KPRIORITY
;
9 typedef ULONG EXECUTION_STATE
;
17 /* Processor features */
18 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
19 #define PF_FLOATING_POINT_EMULATED 1
20 #define PF_COMPARE_EXCHANGE_DOUBLE 2
21 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
22 #define PF_PPC_MOVEMEM_64BIT_OK 4
23 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
24 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
25 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
26 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
27 #define PF_PAE_ENABLED 9
28 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
29 #define PF_SSE_DAZ_MODE_AVAILABLE 11
30 #define PF_NX_ENABLED 12
31 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
32 #define PF_COMPARE_EXCHANGE128 14
33 #define PF_COMPARE64_EXCHANGE128 15
34 #define PF_CHANNELS_ENABLED 16
35 #define PF_XSAVE_ENABLED 17
37 #define MAXIMUM_WAIT_OBJECTS 64
39 #define ASSERT_APC(Object) \
40 ASSERT((Object)->Type == ApcObject)
42 #define ASSERT_DPC(Object) \
43 ASSERT(((Object)->Type == 0) || \
44 ((Object)->Type == DpcObject) || \
45 ((Object)->Type == ThreadedDpcObject))
47 #define ASSERT_GATE(object) \
48 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
49 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
51 #define ASSERT_DEVICE_QUEUE(Object) \
52 ASSERT((Object)->Type == DeviceQueueObject)
54 #define ASSERT_TIMER(E) \
55 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
56 ((E)->Header.Type == TimerSynchronizationObject))
58 #define ASSERT_MUTANT(E) \
59 ASSERT((E)->Header.Type == MutantObject)
61 #define ASSERT_SEMAPHORE(E) \
62 ASSERT((E)->Header.Type == SemaphoreObject)
64 #define ASSERT_EVENT(E) \
65 ASSERT(((E)->Header.Type == NotificationEvent) || \
66 ((E)->Header.Type == SynchronizationEvent))
69 #define DPC_THREADED 1
71 #define GM_LOCK_BIT 0x1
72 #define GM_LOCK_BIT_V 0x0
73 #define GM_LOCK_WAITER_WOKEN 0x2
74 #define GM_LOCK_WAITER_INC 0x4
76 #define LOCK_QUEUE_WAIT_BIT 0
77 #define LOCK_QUEUE_OWNER_BIT 1
79 #define LOCK_QUEUE_WAIT 1
80 #define LOCK_QUEUE_OWNER 2
81 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
82 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
84 #define PROCESSOR_FEATURE_MAX 64
86 #define DBG_STATUS_CONTROL_C 1
87 #define DBG_STATUS_SYSRQ 2
88 #define DBG_STATUS_BUGCHECK_FIRST 3
89 #define DBG_STATUS_BUGCHECK_SECOND 4
90 #define DBG_STATUS_FATAL 5
91 #define DBG_STATUS_DEBUG_CONTROL 6
92 #define DBG_STATUS_WORKER 7
95 #define MAXIMUM_PROC_PER_GROUP 64
97 #define MAXIMUM_PROC_PER_GROUP 32
99 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
101 /* Exception Records */
102 #define EXCEPTION_NONCONTINUABLE 1
103 #define EXCEPTION_MAXIMUM_PARAMETERS 15
105 typedef struct _EXCEPTION_RECORD
{
106 NTSTATUS ExceptionCode
;
107 ULONG ExceptionFlags
;
108 struct _EXCEPTION_RECORD
*ExceptionRecord
;
109 PVOID ExceptionAddress
;
110 ULONG NumberParameters
;
111 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
112 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
114 typedef struct _EXCEPTION_RECORD32
{
115 NTSTATUS ExceptionCode
;
116 ULONG ExceptionFlags
;
117 ULONG ExceptionRecord
;
118 ULONG ExceptionAddress
;
119 ULONG NumberParameters
;
120 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
121 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
123 typedef struct _EXCEPTION_RECORD64
{
124 NTSTATUS ExceptionCode
;
125 ULONG ExceptionFlags
;
126 ULONG64 ExceptionRecord
;
127 ULONG64 ExceptionAddress
;
128 ULONG NumberParameters
;
129 ULONG __unusedAlignment
;
130 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
131 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
133 typedef struct _EXCEPTION_POINTERS
{
134 PEXCEPTION_RECORD ExceptionRecord
;
135 PCONTEXT ContextRecord
;
136 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
139 typedef enum _KBUGCHECK_CALLBACK_REASON
{
142 KbCallbackSecondaryDumpData
,
145 } KBUGCHECK_CALLBACK_REASON
;
147 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
150 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
151 IN KBUGCHECK_CALLBACK_REASON Reason
,
152 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
153 IN OUT PVOID ReasonSpecificData
,
154 IN ULONG ReasonSpecificDataLength
);
156 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
158 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
161 KBUGCHECK_CALLBACK_REASON Reason
;
163 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
165 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
171 } KBUGCHECK_BUFFER_DUMP_STATE
;
174 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
178 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
180 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
186 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
189 (DDKAPI
*PNMI_CALLBACK
)(
193 typedef enum _TRACE_INFORMATION_CLASS
{
196 TraceEnableFlagsClass
,
197 TraceEnableLevelClass
,
198 GlobalLoggerHandleClass
,
199 EventLoggerHandleClass
,
200 AllLoggerHandlesClass
,
201 TraceHandleByNameClass
,
202 LoggerEventsLostClass
,
203 TraceSessionSettingsClass
,
204 LoggerEventsLoggedClass
,
205 MaxTraceInformationClass
206 } TRACE_INFORMATION_CLASS
;
208 typedef enum _KINTERRUPT_POLARITY
{
209 InterruptPolarityUnknown
,
212 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
214 typedef enum _KPROFILE_SOURCE
{
216 ProfileAlignmentFixup
,
219 ProfileLoadInstructions
,
220 ProfilePipelineFrozen
,
221 ProfileBranchInstructions
,
222 ProfileTotalNonissues
,
226 ProfileBranchMispredictions
,
227 ProfileStoreInstructions
,
228 ProfileFpInstructions
,
229 ProfileIntegerInstructions
,
233 ProfileSpecialInstructions
,
236 ProfileDcacheAccesses
,
237 ProfileMemoryBarrierCycles
,
238 ProfileLoadLinkedIssues
,
242 typedef enum _KWAIT_REASON
{
283 typedef struct _KWAIT_BLOCK
{
284 LIST_ENTRY WaitListEntry
;
285 struct _KTHREAD
*Thread
;
287 struct _KWAIT_BLOCK
*NextWaitBlock
;
290 volatile UCHAR BlockState
;
294 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
296 typedef enum _KINTERRUPT_MODE
{
301 #define THREAD_WAIT_OBJECTS 3
304 (NTAPI
*PKINTERRUPT_ROUTINE
)(
307 typedef enum _KD_OPTION
{
308 KD_OPTION_SET_BLOCK_ENABLE
,
311 typedef enum _INTERFACE_TYPE
{
312 InterfaceTypeUndefined
= -1,
331 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
334 (DDKAPI
*PKNORMAL_ROUTINE
)(
335 IN PVOID NormalContext
,
336 IN PVOID SystemArgument1
,
337 IN PVOID SystemArgument2
);
340 (DDKAPI
*PKRUNDOWN_ROUTINE
)(
341 IN
struct _KAPC
*Apc
);
344 (DDKAPI
*PKKERNEL_ROUTINE
)(
345 IN
struct _KAPC
*Apc
,
346 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
347 IN OUT PVOID
*NormalContext
,
348 IN OUT PVOID
*SystemArgument1
,
349 IN OUT PVOID
*SystemArgument2
);
358 struct _KTHREAD
*Thread
;
359 LIST_ENTRY ApcListEntry
;
360 PKKERNEL_ROUTINE KernelRoutine
;
361 PKRUNDOWN_ROUTINE RundownRoutine
;
362 PKNORMAL_ROUTINE NormalRoutine
;
364 PVOID SystemArgument1
;
365 PVOID SystemArgument2
;
367 KPROCESSOR_MODE ApcMode
;
369 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
371 typedef struct _KDEVICE_QUEUE_ENTRY
{
372 LIST_ENTRY DeviceListEntry
;
375 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
376 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
378 typedef PVOID PKIPI_CONTEXT
;
382 (NTAPI
*PKIPI_WORKER
)(
383 IN PKIPI_CONTEXT PacketContext
,
386 IN PVOID Parameter3
);
390 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
391 IN ULONG_PTR Argument
);
393 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
395 typedef struct _KSPIN_LOCK_QUEUE
{
396 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
397 PKSPIN_LOCK
volatile Lock
;
398 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
400 typedef struct _KLOCK_QUEUE_HANDLE
{
401 KSPIN_LOCK_QUEUE LockQueue
;
403 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
407 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
409 #define LockQueueDispatcherLock 0
410 #define LockQueueExpansionLock 1
411 #define LockQueuePfnLock 2
412 #define LockQueueSystemSpaceLock 3
413 #define LockQueueVacbLock 4
414 #define LockQueueMasterLock 5
415 #define LockQueueNonPagedPoolLock 6
416 #define LockQueueIoCancelLock 7
417 #define LockQueueWorkQueueLock 8
418 #define LockQueueIoVpbLock 9
419 #define LockQueueIoDatabaseLock 10
420 #define LockQueueIoCompletionLock 11
421 #define LockQueueNtfsStructLock 12
422 #define LockQueueAfdWorkQueueLock 13
423 #define LockQueueBcbLock 14
424 #define LockQueueMmNonPagedPoolLock 15
425 #define LockQueueUnusedSpare16 16
426 #define LockQueueTimerTableLock 17
427 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
431 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
432 LockQueueDispatcherLock
,
433 LockQueueExpansionLock
,
435 LockQueueSystemSpaceLock
,
438 LockQueueNonPagedPoolLock
,
439 LockQueueIoCancelLock
,
440 LockQueueWorkQueueLock
,
442 LockQueueIoDatabaseLock
,
443 LockQueueIoCompletionLock
,
444 LockQueueNtfsStructLock
,
445 LockQueueAfdWorkQueueLock
,
447 LockQueueMmNonPagedPoolLock
,
448 LockQueueUnusedSpare16
,
449 LockQueueTimerTableLock
,
450 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
451 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
456 (DDKAPI
*PKDEFERRED_ROUTINE
)(
457 IN
struct _KDPC
*Dpc
,
458 IN PVOID DeferredContext
,
459 IN PVOID SystemArgument1
,
460 IN PVOID SystemArgument2
);
462 typedef enum _KDPC_IMPORTANCE
{
473 volatile USHORT Number
;
474 LIST_ENTRY DpcListEntry
;
475 PKDEFERRED_ROUTINE DeferredRoutine
;
476 PVOID DeferredContext
;
477 PVOID SystemArgument1
;
478 PVOID SystemArgument2
;
479 volatile PVOID DpcData
;
480 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
482 typedef struct _KDPC_WATCHDOG_INFORMATION
{
485 ULONG DpcWatchdogLimit
;
486 ULONG DpcWatchdogCount
;
488 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
490 typedef struct _KDEVICE_QUEUE
{
493 LIST_ENTRY DeviceListHead
;
507 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
509 #define TIMER_EXPIRED_INDEX_BITS 6
510 #define TIMER_PROCESSOR_INDEX_BITS 5
511 typedef struct _DISPATCHER_HEADER
{
512 _ANONYMOUS_UNION
union {
513 _ANONYMOUS_STRUCT
struct {
515 _ANONYMOUS_UNION
union {
516 _ANONYMOUS_UNION
union {
517 UCHAR TimerControlFlags
;
518 _ANONYMOUS_STRUCT
struct {
521 UCHAR KeepShifting
:1;
522 UCHAR EncodedTolerableDelay
:5;
526 #if (NTDDI_VERSION < NTDDI_WIN7)
531 _ANONYMOUS_UNION
union {
532 _ANONYMOUS_UNION
union {
533 UCHAR ThreadControlFlags
;
534 _ANONYMOUS_STRUCT
struct {
535 UCHAR CpuThrottled
:1;
536 UCHAR CycleProfiling
:1;
537 UCHAR CounterProfiling
:1;
544 _ANONYMOUS_UNION
union {
545 #if (NTDDI_VERSION >= NTDDI_WIN7)
546 _ANONYMOUS_UNION
union {
547 UCHAR TimerMiscFlags
;
548 _ANONYMOUS_STRUCT
struct {
550 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
553 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
556 volatile UCHAR Expired
:1;
560 /* Pre Win7 compatibility fix to latest WDK */
563 _ANONYMOUS_UNION
union {
565 _ANONYMOUS_STRUCT
struct {
567 BOOLEAN Instrumented
:1;
569 BOOLEAN UmsScheduled
:1;
570 BOOLEAN UmsPrimary
:1;
572 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
579 LIST_ENTRY WaitListHead
;
580 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
582 typedef struct _KEVENT
{
583 DISPATCHER_HEADER Header
;
584 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
586 typedef struct _KSEMAPHORE
{
587 DISPATCHER_HEADER Header
;
589 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
591 typedef struct _KGATE
593 DISPATCHER_HEADER Header
;
594 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
596 typedef struct _KGUARDED_MUTEX
602 __GNU_EXTENSION
union
604 __GNU_EXTENSION
struct
606 SHORT KernelApcDisable
;
607 SHORT SpecialApcDisable
;
609 ULONG CombinedApcDisable
;
611 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
613 typedef struct _KMUTANT
{
614 DISPATCHER_HEADER Header
;
615 LIST_ENTRY MutantListEntry
;
616 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
619 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
621 #define TIMER_TABLE_SIZE 512
622 #define TIMER_TABLE_SHIFT 9
624 typedef struct _KTIMER
{
625 DISPATCHER_HEADER Header
;
626 ULARGE_INTEGER DueTime
;
627 LIST_ENTRY TimerListEntry
;
633 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
636 (DDKAPI
*PKSYNCHRONIZE_ROUTINE
)(
637 IN PVOID SynchronizeContext
);
639 typedef enum _POOL_TYPE
{
642 NonPagedPoolMustSucceed
,
644 NonPagedPoolCacheAligned
,
645 PagedPoolCacheAligned
,
646 NonPagedPoolCacheAlignedMustS
,
648 NonPagedPoolSession
= 32,
650 NonPagedPoolMustSucceedSession
,
651 DontUseThisTypeSession
,
652 NonPagedPoolCacheAlignedSession
,
653 PagedPoolCacheAlignedSession
,
654 NonPagedPoolCacheAlignedMustSSession
657 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
662 } ALTERNATIVE_ARCHITECTURE_TYPE
;
664 typedef struct _KSYSTEM_TIME
{
668 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
670 typedef struct _PNP_BUS_INFORMATION
{
672 INTERFACE_TYPE LegacyBusType
;
674 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
676 typedef struct DECLSPEC_ALIGN(16) _M128A
{
681 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
688 USHORT ErrorSelector
;
695 M128A FloatRegisters
[8];
697 M128A XmmRegisters
[16];
700 M128A XmmRegisters
[8];
701 UCHAR Reserved4
[192];
702 ULONG StackControl
[7];
705 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
707 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
710 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
712 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
713 XSAVE_FORMAT LegacyState
;
714 XSAVE_AREA_HEADER Header
;
715 } XSAVE_AREA
, *PXSAVE_AREA
;
717 typedef struct _XSTATE_CONTEXT
{
729 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
733 #define MAXIMUM_SUPPORTED_EXTENSION 512
735 #if !defined(__midl) && !defined(MIDL_PASS)
736 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
741 #define XSAVE_ALIGN 64
742 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
744 #if !defined(__midl) && !defined(MIDL_PASS)
745 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
746 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
747 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
750 typedef struct _CONTEXT_CHUNK
{
753 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
755 typedef struct _CONTEXT_EX
{
757 CONTEXT_CHUNK Legacy
;
758 CONTEXT_CHUNK XState
;
759 } CONTEXT_EX
, *PCONTEXT_EX
;
761 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
763 #if (NTDDI_VERSION >= NTDDI_VISTA)
764 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
765 #elif (NTDDI_VERSION >= NTDDI_WINXP)
766 extern NTSYSAPI CCHAR KeNumberProcessors
;
768 extern PCCHAR KeNumberProcessors
;