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_SUPPORTED_EXTENSION 512
38 #define MAXIMUM_WAIT_OBJECTS 64
40 #define ASSERT_APC(Object) \
41 ASSERT((Object)->Type == ApcObject)
43 #define ASSERT_DPC(Object) \
44 ASSERT(((Object)->Type == 0) || \
45 ((Object)->Type == DpcObject) || \
46 ((Object)->Type == ThreadedDpcObject))
48 #define ASSERT_GATE(object) \
49 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
50 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
52 #define ASSERT_DEVICE_QUEUE(Object) \
53 ASSERT((Object)->Type == DeviceQueueObject)
55 #define ASSERT_TIMER(E) \
56 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
57 ((E)->Header.Type == TimerSynchronizationObject))
59 #define ASSERT_MUTANT(E) \
60 ASSERT((E)->Header.Type == MutantObject)
62 #define ASSERT_SEMAPHORE(E) \
63 ASSERT((E)->Header.Type == SemaphoreObject)
65 #define ASSERT_EVENT(E) \
66 ASSERT(((E)->Header.Type == NotificationEvent) || \
67 ((E)->Header.Type == SynchronizationEvent))
70 #define DPC_THREADED 1
72 #define GM_LOCK_BIT 0x1
73 #define GM_LOCK_BIT_V 0x0
74 #define GM_LOCK_WAITER_WOKEN 0x2
75 #define GM_LOCK_WAITER_INC 0x4
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
;
137 typedef enum _KBUGCHECK_CALLBACK_REASON
{
140 KbCallbackSecondaryDumpData
,
143 } KBUGCHECK_CALLBACK_REASON
;
145 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
148 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
149 IN KBUGCHECK_CALLBACK_REASON Reason
,
150 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
151 IN OUT PVOID ReasonSpecificData
,
152 IN ULONG ReasonSpecificDataLength
);
154 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
156 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
159 KBUGCHECK_CALLBACK_REASON Reason
;
161 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
163 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
169 } KBUGCHECK_BUFFER_DUMP_STATE
;
172 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
176 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
178 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
184 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
187 (DDKAPI
*PNMI_CALLBACK
)(
191 typedef enum _TRACE_INFORMATION_CLASS
{
194 TraceEnableFlagsClass
,
195 TraceEnableLevelClass
,
196 GlobalLoggerHandleClass
,
197 EventLoggerHandleClass
,
198 AllLoggerHandlesClass
,
199 TraceHandleByNameClass
,
200 LoggerEventsLostClass
,
201 TraceSessionSettingsClass
,
202 LoggerEventsLoggedClass
,
203 MaxTraceInformationClass
204 } TRACE_INFORMATION_CLASS
;
206 typedef enum _KINTERRUPT_POLARITY
{
207 InterruptPolarityUnknown
,
210 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
212 typedef enum _KPROFILE_SOURCE
{
214 ProfileAlignmentFixup
,
217 ProfileLoadInstructions
,
218 ProfilePipelineFrozen
,
219 ProfileBranchInstructions
,
220 ProfileTotalNonissues
,
224 ProfileBranchMispredictions
,
225 ProfileStoreInstructions
,
226 ProfileFpInstructions
,
227 ProfileIntegerInstructions
,
231 ProfileSpecialInstructions
,
234 ProfileDcacheAccesses
,
235 ProfileMemoryBarrierCycles
,
236 ProfileLoadLinkedIssues
,
240 typedef enum _KWAIT_REASON
{
281 typedef struct _KWAIT_BLOCK
{
282 LIST_ENTRY WaitListEntry
;
283 struct _KTHREAD
*Thread
;
285 struct _KWAIT_BLOCK
*NextWaitBlock
;
288 volatile UCHAR BlockState
;
292 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
294 typedef enum _KINTERRUPT_MODE
{
299 #define THREAD_WAIT_OBJECTS 3
302 (DDKAPI
*PKINTERRUPT_ROUTINE
)(
305 typedef enum _KD_OPTION
{
306 KD_OPTION_SET_BLOCK_ENABLE
,
309 typedef enum _INTERFACE_TYPE
{
310 InterfaceTypeUndefined
= -1,
329 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
332 (DDKAPI
*PKNORMAL_ROUTINE
)(
333 IN PVOID NormalContext
,
334 IN PVOID SystemArgument1
,
335 IN PVOID SystemArgument2
);
338 (DDKAPI
*PKRUNDOWN_ROUTINE
)(
339 IN
struct _KAPC
*Apc
);
342 (DDKAPI
*PKKERNEL_ROUTINE
)(
343 IN
struct _KAPC
*Apc
,
344 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
345 IN OUT PVOID
*NormalContext
,
346 IN OUT PVOID
*SystemArgument1
,
347 IN OUT PVOID
*SystemArgument2
);
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
;
380 (NTAPI
*PKIPI_WORKER
)(
381 IN PKIPI_CONTEXT PacketContext
,
384 IN PVOID Parameter3
);
388 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
389 IN ULONG_PTR Argument
);
391 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
393 typedef struct _KSPIN_LOCK_QUEUE
{
394 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
395 PKSPIN_LOCK
volatile Lock
;
396 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
398 typedef struct _KLOCK_QUEUE_HANDLE
{
399 KSPIN_LOCK_QUEUE LockQueue
;
401 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
405 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
407 #define LockQueueDispatcherLock 0
408 #define LockQueueExpansionLock 1
409 #define LockQueuePfnLock 2
410 #define LockQueueSystemSpaceLock 3
411 #define LockQueueVacbLock 4
412 #define LockQueueMasterLock 5
413 #define LockQueueNonPagedPoolLock 6
414 #define LockQueueIoCancelLock 7
415 #define LockQueueWorkQueueLock 8
416 #define LockQueueIoVpbLock 9
417 #define LockQueueIoDatabaseLock 10
418 #define LockQueueIoCompletionLock 11
419 #define LockQueueNtfsStructLock 12
420 #define LockQueueAfdWorkQueueLock 13
421 #define LockQueueBcbLock 14
422 #define LockQueueMmNonPagedPoolLock 15
423 #define LockQueueUnusedSpare16 16
424 #define LockQueueTimerTableLock 17
425 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
429 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
430 LockQueueDispatcherLock
,
431 LockQueueExpansionLock
,
433 LockQueueSystemSpaceLock
,
436 LockQueueNonPagedPoolLock
,
437 LockQueueIoCancelLock
,
438 LockQueueWorkQueueLock
,
440 LockQueueIoDatabaseLock
,
441 LockQueueIoCompletionLock
,
442 LockQueueNtfsStructLock
,
443 LockQueueAfdWorkQueueLock
,
445 LockQueueMmNonPagedPoolLock
,
446 LockQueueUnusedSpare16
,
447 LockQueueTimerTableLock
,
448 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
449 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
454 (DDKAPI
*PKDEFERRED_ROUTINE
)(
455 IN
struct _KDPC
*Dpc
,
456 IN PVOID DeferredContext
,
457 IN PVOID SystemArgument1
,
458 IN PVOID SystemArgument2
);
460 typedef enum _KDPC_IMPORTANCE
{
471 volatile USHORT Number
;
472 LIST_ENTRY DpcListEntry
;
473 PKDEFERRED_ROUTINE DeferredRoutine
;
474 PVOID DeferredContext
;
475 PVOID SystemArgument1
;
476 PVOID SystemArgument2
;
477 volatile PVOID DpcData
;
478 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
480 typedef struct _KDPC_WATCHDOG_INFORMATION
{
483 ULONG DpcWatchdogLimit
;
484 ULONG DpcWatchdogCount
;
486 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
488 typedef struct _KDEVICE_QUEUE
{
491 LIST_ENTRY DeviceListHead
;
505 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
507 #define TIMER_EXPIRED_INDEX_BITS 6
508 #define TIMER_PROCESSOR_INDEX_BITS 5
509 typedef struct _DISPATCHER_HEADER
{
510 _ANONYMOUS_UNION
union {
511 _ANONYMOUS_STRUCT
struct {
513 _ANONYMOUS_UNION
union {
514 _ANONYMOUS_UNION
union {
515 UCHAR TimerControlFlags
;
516 _ANONYMOUS_STRUCT
struct {
519 UCHAR KeepShifting
:1;
520 UCHAR EncodedTolerableDelay
:5;
524 #if (NTDDI_VERSION < NTDDI_WIN7)
529 _ANONYMOUS_UNION
union {
530 _ANONYMOUS_UNION
union {
531 UCHAR ThreadControlFlags
;
532 _ANONYMOUS_STRUCT
struct {
533 UCHAR CpuThrottled
:1;
534 UCHAR CycleProfiling
:1;
535 UCHAR CounterProfiling
:1;
542 _ANONYMOUS_UNION
union {
543 #if (NTDDI_VERSION >= NTDDI_WIN7)
544 _ANONYMOUS_UNION
union {
545 UCHAR TimerMiscFlags
;
546 _ANONYMOUS_STRUCT
struct {
548 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
551 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
554 volatile UCHAR Expired
:1;
558 /* Pre Win7 compatibility fix to latest WDK */
561 _ANONYMOUS_UNION
union {
563 _ANONYMOUS_STRUCT
struct {
565 BOOLEAN Instrumented
:1;
567 BOOLEAN UmsScheduled
:1;
568 BOOLEAN UmsPrimary
:1;
570 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
577 LIST_ENTRY WaitListHead
;
578 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
580 typedef struct _KEVENT
{
581 DISPATCHER_HEADER Header
;
582 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
584 typedef struct _KSEMAPHORE
{
585 DISPATCHER_HEADER Header
;
587 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
589 typedef struct _KGATE
591 DISPATCHER_HEADER Header
;
592 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
594 typedef struct _KGUARDED_MUTEX
600 __GNU_EXTENSION
union
602 __GNU_EXTENSION
struct
604 SHORT KernelApcDisable
;
605 SHORT SpecialApcDisable
;
607 ULONG CombinedApcDisable
;
609 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
611 typedef struct _KMUTANT
{
612 DISPATCHER_HEADER Header
;
613 LIST_ENTRY MutantListEntry
;
614 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
617 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
619 #define TIMER_TABLE_SIZE 512
620 #define TIMER_TABLE_SHIFT 9
622 typedef struct _KTIMER
{
623 DISPATCHER_HEADER Header
;
624 ULARGE_INTEGER DueTime
;
625 LIST_ENTRY TimerListEntry
;
631 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
634 (DDKAPI
*PKSYNCHRONIZE_ROUTINE
)(
635 IN PVOID SynchronizeContext
);
637 typedef enum _POOL_TYPE
{
640 NonPagedPoolMustSucceed
,
642 NonPagedPoolCacheAligned
,
643 PagedPoolCacheAligned
,
644 NonPagedPoolCacheAlignedMustS
,
646 NonPagedPoolSession
= 32,
648 NonPagedPoolMustSucceedSession
,
649 DontUseThisTypeSession
,
650 NonPagedPoolCacheAlignedSession
,
651 PagedPoolCacheAlignedSession
,
652 NonPagedPoolCacheAlignedMustSSession
655 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
660 } ALTERNATIVE_ARCHITECTURE_TYPE
;
662 typedef struct _KSYSTEM_TIME
667 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
669 typedef struct _PNP_BUS_INFORMATION
{
671 INTERFACE_TYPE LegacyBusType
;
673 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
675 typedef struct DECLSPEC_ALIGN(16) _M128A
{
680 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
687 USHORT ErrorSelector
;
694 M128A FloatRegisters
[8];
696 M128A XmmRegisters
[16];
699 M128A XmmRegisters
[8];
700 UCHAR Reserved4
[192];
701 ULONG StackControl
[7];
704 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;