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
;
138 typedef enum _KBUGCHECK_CALLBACK_REASON
{
141 KbCallbackSecondaryDumpData
,
144 } KBUGCHECK_CALLBACK_REASON
;
146 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
149 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
150 IN KBUGCHECK_CALLBACK_REASON Reason
,
151 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
152 IN OUT PVOID ReasonSpecificData
,
153 IN ULONG ReasonSpecificDataLength
);
155 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
157 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
160 KBUGCHECK_CALLBACK_REASON Reason
;
162 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
164 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
170 } KBUGCHECK_BUFFER_DUMP_STATE
;
173 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
177 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
179 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
185 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
188 (DDKAPI
*PNMI_CALLBACK
)(
192 typedef enum _TRACE_INFORMATION_CLASS
{
195 TraceEnableFlagsClass
,
196 TraceEnableLevelClass
,
197 GlobalLoggerHandleClass
,
198 EventLoggerHandleClass
,
199 AllLoggerHandlesClass
,
200 TraceHandleByNameClass
,
201 LoggerEventsLostClass
,
202 TraceSessionSettingsClass
,
203 LoggerEventsLoggedClass
,
204 MaxTraceInformationClass
205 } TRACE_INFORMATION_CLASS
;
207 typedef enum _KINTERRUPT_POLARITY
{
208 InterruptPolarityUnknown
,
211 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
213 typedef enum _KPROFILE_SOURCE
{
215 ProfileAlignmentFixup
,
218 ProfileLoadInstructions
,
219 ProfilePipelineFrozen
,
220 ProfileBranchInstructions
,
221 ProfileTotalNonissues
,
225 ProfileBranchMispredictions
,
226 ProfileStoreInstructions
,
227 ProfileFpInstructions
,
228 ProfileIntegerInstructions
,
232 ProfileSpecialInstructions
,
235 ProfileDcacheAccesses
,
236 ProfileMemoryBarrierCycles
,
237 ProfileLoadLinkedIssues
,
241 typedef enum _KWAIT_REASON
{
282 typedef struct _KWAIT_BLOCK
{
283 LIST_ENTRY WaitListEntry
;
284 struct _KTHREAD
*Thread
;
286 struct _KWAIT_BLOCK
*NextWaitBlock
;
289 volatile UCHAR BlockState
;
293 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
295 typedef enum _KINTERRUPT_MODE
{
300 #define THREAD_WAIT_OBJECTS 3
303 (NTAPI
*PKINTERRUPT_ROUTINE
)(
306 typedef enum _KD_OPTION
{
307 KD_OPTION_SET_BLOCK_ENABLE
,
310 typedef enum _INTERFACE_TYPE
{
311 InterfaceTypeUndefined
= -1,
330 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
333 (DDKAPI
*PKNORMAL_ROUTINE
)(
334 IN PVOID NormalContext
,
335 IN PVOID SystemArgument1
,
336 IN PVOID SystemArgument2
);
339 (DDKAPI
*PKRUNDOWN_ROUTINE
)(
340 IN
struct _KAPC
*Apc
);
343 (DDKAPI
*PKKERNEL_ROUTINE
)(
344 IN
struct _KAPC
*Apc
,
345 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
346 IN OUT PVOID
*NormalContext
,
347 IN OUT PVOID
*SystemArgument1
,
348 IN OUT PVOID
*SystemArgument2
);
350 typedef struct _KAPC
{
356 struct _KTHREAD
*Thread
;
357 LIST_ENTRY ApcListEntry
;
358 PKKERNEL_ROUTINE KernelRoutine
;
359 PKRUNDOWN_ROUTINE RundownRoutine
;
360 PKNORMAL_ROUTINE NormalRoutine
;
362 PVOID SystemArgument1
;
363 PVOID SystemArgument2
;
365 KPROCESSOR_MODE ApcMode
;
367 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
369 typedef struct _KDEVICE_QUEUE_ENTRY
{
370 LIST_ENTRY DeviceListEntry
;
373 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
374 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
376 typedef PVOID PKIPI_CONTEXT
;
379 (NTAPI
*PKIPI_WORKER
)(
380 IN PKIPI_CONTEXT PacketContext
,
383 IN PVOID Parameter3
);
386 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
387 IN ULONG_PTR Argument
);
389 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
391 typedef struct _KSPIN_LOCK_QUEUE
{
392 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
393 PKSPIN_LOCK
volatile Lock
;
394 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
396 typedef struct _KLOCK_QUEUE_HANDLE
{
397 KSPIN_LOCK_QUEUE LockQueue
;
399 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
403 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
405 #define LockQueueDispatcherLock 0
406 #define LockQueueExpansionLock 1
407 #define LockQueuePfnLock 2
408 #define LockQueueSystemSpaceLock 3
409 #define LockQueueVacbLock 4
410 #define LockQueueMasterLock 5
411 #define LockQueueNonPagedPoolLock 6
412 #define LockQueueIoCancelLock 7
413 #define LockQueueWorkQueueLock 8
414 #define LockQueueIoVpbLock 9
415 #define LockQueueIoDatabaseLock 10
416 #define LockQueueIoCompletionLock 11
417 #define LockQueueNtfsStructLock 12
418 #define LockQueueAfdWorkQueueLock 13
419 #define LockQueueBcbLock 14
420 #define LockQueueMmNonPagedPoolLock 15
421 #define LockQueueUnusedSpare16 16
422 #define LockQueueTimerTableLock 17
423 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
427 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
428 LockQueueDispatcherLock
,
429 LockQueueExpansionLock
,
431 LockQueueSystemSpaceLock
,
434 LockQueueNonPagedPoolLock
,
435 LockQueueIoCancelLock
,
436 LockQueueWorkQueueLock
,
438 LockQueueIoDatabaseLock
,
439 LockQueueIoCompletionLock
,
440 LockQueueNtfsStructLock
,
441 LockQueueAfdWorkQueueLock
,
443 LockQueueMmNonPagedPoolLock
,
444 LockQueueUnusedSpare16
,
445 LockQueueTimerTableLock
,
446 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
447 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
449 #endif /* defined(_AMD64_) */
452 (DDKAPI
*PKDEFERRED_ROUTINE
)(
453 IN
struct _KDPC
*Dpc
,
454 IN PVOID DeferredContext
,
455 IN PVOID SystemArgument1
,
456 IN PVOID SystemArgument2
);
458 typedef enum _KDPC_IMPORTANCE
{
465 typedef struct _KDPC
{
468 volatile USHORT Number
;
469 LIST_ENTRY DpcListEntry
;
470 PKDEFERRED_ROUTINE DeferredRoutine
;
471 PVOID DeferredContext
;
472 PVOID SystemArgument1
;
473 PVOID SystemArgument2
;
474 volatile PVOID DpcData
;
475 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
477 typedef struct _KDPC_WATCHDOG_INFORMATION
{
480 ULONG DpcWatchdogLimit
;
481 ULONG DpcWatchdogCount
;
483 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
485 typedef struct _KDEVICE_QUEUE
{
488 LIST_ENTRY DeviceListHead
;
501 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
503 #define TIMER_EXPIRED_INDEX_BITS 6
504 #define TIMER_PROCESSOR_INDEX_BITS 5
506 typedef struct _DISPATCHER_HEADER
{
507 _ANONYMOUS_UNION
union {
508 _ANONYMOUS_STRUCT
struct {
510 _ANONYMOUS_UNION
union {
511 _ANONYMOUS_UNION
union {
512 UCHAR TimerControlFlags
;
513 _ANONYMOUS_STRUCT
struct {
516 UCHAR KeepShifting
:1;
517 UCHAR EncodedTolerableDelay
:5;
521 #if (NTDDI_VERSION < NTDDI_WIN7)
526 _ANONYMOUS_UNION
union {
527 _ANONYMOUS_UNION
union {
528 UCHAR ThreadControlFlags
;
529 _ANONYMOUS_STRUCT
struct {
530 UCHAR CpuThrottled
:1;
531 UCHAR CycleProfiling
:1;
532 UCHAR CounterProfiling
:1;
539 _ANONYMOUS_UNION
union {
540 #if (NTDDI_VERSION >= NTDDI_WIN7)
541 _ANONYMOUS_UNION
union {
542 UCHAR TimerMiscFlags
;
543 _ANONYMOUS_STRUCT
struct {
545 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
548 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
551 volatile UCHAR Expired
:1;
555 /* Pre Win7 compatibility fix to latest WDK */
558 _ANONYMOUS_UNION
union {
560 _ANONYMOUS_STRUCT
struct {
562 BOOLEAN Instrumented
:1;
564 BOOLEAN UmsScheduled
:1;
565 BOOLEAN UmsPrimary
:1;
567 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
574 LIST_ENTRY WaitListHead
;
575 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
577 typedef struct _KEVENT
{
578 DISPATCHER_HEADER Header
;
579 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
581 typedef struct _KSEMAPHORE
{
582 DISPATCHER_HEADER Header
;
584 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
586 typedef struct _KGATE
{
587 DISPATCHER_HEADER Header
;
588 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
590 typedef struct _KGUARDED_MUTEX
{
595 __GNU_EXTENSION
union {
596 __GNU_EXTENSION
struct {
597 SHORT KernelApcDisable
;
598 SHORT SpecialApcDisable
;
600 ULONG CombinedApcDisable
;
602 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
604 typedef struct _KMUTANT
{
605 DISPATCHER_HEADER Header
;
606 LIST_ENTRY MutantListEntry
;
607 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
610 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
612 #define TIMER_TABLE_SIZE 512
613 #define TIMER_TABLE_SHIFT 9
615 typedef struct _KTIMER
{
616 DISPATCHER_HEADER Header
;
617 ULARGE_INTEGER DueTime
;
618 LIST_ENTRY TimerListEntry
;
624 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
627 (DDKAPI
*PKSYNCHRONIZE_ROUTINE
)(
628 IN PVOID SynchronizeContext
);
630 typedef enum _POOL_TYPE
{
633 NonPagedPoolMustSucceed
,
635 NonPagedPoolCacheAligned
,
636 PagedPoolCacheAligned
,
637 NonPagedPoolCacheAlignedMustS
,
639 NonPagedPoolSession
= 32,
641 NonPagedPoolMustSucceedSession
,
642 DontUseThisTypeSession
,
643 NonPagedPoolCacheAlignedSession
,
644 PagedPoolCacheAlignedSession
,
645 NonPagedPoolCacheAlignedMustSSession
648 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
652 } ALTERNATIVE_ARCHITECTURE_TYPE
;
654 typedef struct _KSYSTEM_TIME
{
658 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
660 typedef struct _PNP_BUS_INFORMATION
{
662 INTERFACE_TYPE LegacyBusType
;
664 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
666 typedef struct DECLSPEC_ALIGN(16) _M128A
{
671 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
678 USHORT ErrorSelector
;
685 M128A FloatRegisters
[8];
687 M128A XmmRegisters
[16];
690 M128A XmmRegisters
[8];
691 UCHAR Reserved4
[192];
692 ULONG StackControl
[7];
695 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
697 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
700 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
702 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
703 XSAVE_FORMAT LegacyState
;
704 XSAVE_AREA_HEADER Header
;
705 } XSAVE_AREA
, *PXSAVE_AREA
;
707 typedef struct _XSTATE_CONTEXT
{
719 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
723 #define MAXIMUM_SUPPORTED_EXTENSION 512
725 #if !defined(__midl) && !defined(MIDL_PASS)
726 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
731 #define XSAVE_ALIGN 64
732 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
734 #if !defined(__midl) && !defined(MIDL_PASS)
735 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
736 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
737 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
740 typedef struct _CONTEXT_CHUNK
{
743 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
745 typedef struct _CONTEXT_EX
{
747 CONTEXT_CHUNK Legacy
;
748 CONTEXT_CHUNK XState
;
749 } CONTEXT_EX
, *PCONTEXT_EX
;
751 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
753 #if (NTDDI_VERSION >= NTDDI_VISTA)
754 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
755 #elif (NTDDI_VERSION >= NTDDI_WINXP)
756 extern NTSYSAPI CCHAR KeNumberProcessors
;
758 extern PCCHAR KeNumberProcessors
;