1 /******************************************************************************
3 ******************************************************************************/
5 typedef UCHAR KIRQL
, *PKIRQL
;
6 typedef CCHAR KPROCESSOR_MODE
;
7 typedef LONG KPRIORITY
;
15 #define CACHE_FULLY_ASSOCIATIVE 0xFF
17 #define EVENT_QUERY_STATE (0x0001)
18 #define EVENT_MODIFY_STATE (0x0002)
19 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
21 #define LTP_PC_SMT 0x1
23 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
24 #define SINGLE_GROUP_LEGACY_API 1
27 #define SEMAPHORE_QUERY_STATE (0x0001)
28 #define SEMAPHORE_MODIFY_STATE (0x0002)
29 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
31 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP
{
32 RelationProcessorCore
,
35 RelationProcessorPackage
,
38 } LOGICAL_PROCESSOR_RELATIONSHIP
;
40 typedef enum _PROCESSOR_CACHE_TYPE
{
45 } PROCESSOR_CACHE_TYPE
;
47 typedef struct _CACHE_DESCRIPTOR
{
52 PROCESSOR_CACHE_TYPE Type
;
53 } CACHE_DESCRIPTOR
, *PCACHE_DESCRIPTOR
;
55 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION
{
56 ULONG_PTR ProcessorMask
;
57 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
65 CACHE_DESCRIPTOR Cache
;
66 ULONGLONG Reserved
[2];
68 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION
;
70 typedef struct _PROCESSOR_RELATIONSHIP
{
74 GROUP_AFFINITY GroupMask
[ANYSIZE_ARRAY
];
75 } PROCESSOR_RELATIONSHIP
, *PPROCESSOR_RELATIONSHIP
;
77 typedef struct _NUMA_NODE_RELATIONSHIP
{
80 GROUP_AFFINITY GroupMask
;
81 } NUMA_NODE_RELATIONSHIP
, *PNUMA_NODE_RELATIONSHIP
;
83 typedef struct _CACHE_RELATIONSHIP
{
88 PROCESSOR_CACHE_TYPE Type
;
90 GROUP_AFFINITY GroupMask
;
91 } CACHE_RELATIONSHIP
, *PCACHE_RELATIONSHIP
;
93 typedef struct _PROCESSOR_GROUP_INFO
{
94 UCHAR MaximumProcessorCount
;
95 UCHAR ActiveProcessorCount
;
97 KAFFINITY ActiveProcessorMask
;
98 } PROCESSOR_GROUP_INFO
, *PPROCESSOR_GROUP_INFO
;
100 typedef struct _GROUP_RELATIONSHIP
{
101 USHORT MaximumGroupCount
;
102 USHORT ActiveGroupCount
;
104 PROCESSOR_GROUP_INFO GroupInfo
[ANYSIZE_ARRAY
];
105 } GROUP_RELATIONSHIP
, *PGROUP_RELATIONSHIP
;
107 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
{
108 LOGICAL_PROCESSOR_RELATIONSHIP Relationship
;
111 PROCESSOR_RELATIONSHIP Processor
;
112 NUMA_NODE_RELATIONSHIP NumaNode
;
113 CACHE_RELATIONSHIP Cache
;
114 GROUP_RELATIONSHIP Group
;
116 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
;;
118 /* Processor features */
119 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
120 #define PF_FLOATING_POINT_EMULATED 1
121 #define PF_COMPARE_EXCHANGE_DOUBLE 2
122 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
123 #define PF_PPC_MOVEMEM_64BIT_OK 4
124 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
125 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
126 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
127 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
128 #define PF_PAE_ENABLED 9
129 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
130 #define PF_SSE_DAZ_MODE_AVAILABLE 11
131 #define PF_NX_ENABLED 12
132 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
133 #define PF_COMPARE_EXCHANGE128 14
134 #define PF_COMPARE64_EXCHANGE128 15
135 #define PF_CHANNELS_ENABLED 16
136 #define PF_XSAVE_ENABLED 17
138 #define MAXIMUM_WAIT_OBJECTS 64
140 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
142 #define ASSERT_DPC(Object) \
143 ASSERT(((Object)->Type == 0) || \
144 ((Object)->Type == DpcObject) || \
145 ((Object)->Type == ThreadedDpcObject))
147 #define ASSERT_GATE(object) \
148 NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
149 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
151 #define ASSERT_DEVICE_QUEUE(Object) \
152 NT_ASSERT((Object)->Type == DeviceQueueObject)
154 #define ASSERT_TIMER(E) \
155 NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
156 ((E)->Header.Type == TimerSynchronizationObject))
158 #define ASSERT_MUTANT(E) \
159 NT_ASSERT((E)->Header.Type == MutantObject)
161 #define ASSERT_SEMAPHORE(E) \
162 NT_ASSERT((E)->Header.Type == SemaphoreObject)
164 #define ASSERT_EVENT(E) \
165 NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
166 ((E)->Header.Type == SynchronizationEvent))
169 #define DPC_THREADED 1
171 #define GM_LOCK_BIT 0x1
172 #define GM_LOCK_BIT_V 0x0
173 #define GM_LOCK_WAITER_WOKEN 0x2
174 #define GM_LOCK_WAITER_INC 0x4
176 #define LOCK_QUEUE_WAIT_BIT 0
177 #define LOCK_QUEUE_OWNER_BIT 1
179 #define LOCK_QUEUE_WAIT 1
180 #define LOCK_QUEUE_OWNER 2
181 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
182 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
184 #define PROCESSOR_FEATURE_MAX 64
186 #define DBG_STATUS_CONTROL_C 1
187 #define DBG_STATUS_SYSRQ 2
188 #define DBG_STATUS_BUGCHECK_FIRST 3
189 #define DBG_STATUS_BUGCHECK_SECOND 4
190 #define DBG_STATUS_FATAL 5
191 #define DBG_STATUS_DEBUG_CONTROL 6
192 #define DBG_STATUS_WORKER 7
195 #define MAXIMUM_PROC_PER_GROUP 64
197 #define MAXIMUM_PROC_PER_GROUP 32
199 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
201 /* Exception Records */
202 #define EXCEPTION_NONCONTINUABLE 1
203 #define EXCEPTION_MAXIMUM_PARAMETERS 15
205 #define EXCEPTION_DIVIDED_BY_ZERO 0
206 #define EXCEPTION_DEBUG 1
207 #define EXCEPTION_NMI 2
208 #define EXCEPTION_INT3 3
209 #define EXCEPTION_BOUND_CHECK 5
210 #define EXCEPTION_INVALID_OPCODE 6
211 #define EXCEPTION_NPX_NOT_AVAILABLE 7
212 #define EXCEPTION_DOUBLE_FAULT 8
213 #define EXCEPTION_NPX_OVERRUN 9
214 #define EXCEPTION_INVALID_TSS 0x0A
215 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
216 #define EXCEPTION_STACK_FAULT 0x0C
217 #define EXCEPTION_GP_FAULT 0x0D
218 #define EXCEPTION_RESERVED_TRAP 0x0F
219 #define EXCEPTION_NPX_ERROR 0x010
220 #define EXCEPTION_ALIGNMENT_CHECK 0x011
222 typedef struct _EXCEPTION_RECORD
{
223 NTSTATUS ExceptionCode
;
224 ULONG ExceptionFlags
;
225 struct _EXCEPTION_RECORD
*ExceptionRecord
;
226 PVOID ExceptionAddress
;
227 ULONG NumberParameters
;
228 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
229 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
231 typedef struct _EXCEPTION_RECORD32
{
232 NTSTATUS ExceptionCode
;
233 ULONG ExceptionFlags
;
234 ULONG ExceptionRecord
;
235 ULONG ExceptionAddress
;
236 ULONG NumberParameters
;
237 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
238 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
240 typedef struct _EXCEPTION_RECORD64
{
241 NTSTATUS ExceptionCode
;
242 ULONG ExceptionFlags
;
243 ULONG64 ExceptionRecord
;
244 ULONG64 ExceptionAddress
;
245 ULONG NumberParameters
;
246 ULONG __unusedAlignment
;
247 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
248 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
250 typedef struct _EXCEPTION_POINTERS
{
251 PEXCEPTION_RECORD ExceptionRecord
;
252 PCONTEXT ContextRecord
;
253 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
255 typedef enum _KBUGCHECK_CALLBACK_REASON
{
258 KbCallbackSecondaryDumpData
,
261 } KBUGCHECK_CALLBACK_REASON
;
263 struct _KBUGCHECK_REASON_CALLBACK_RECORD
;
266 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE
)(
267 IN KBUGCHECK_CALLBACK_REASON Reason
,
268 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
269 IN OUT PVOID ReasonSpecificData
,
270 IN ULONG ReasonSpecificDataLength
);
271 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
;
273 typedef struct _KBUGCHECK_ADD_PAGES
{
274 IN OUT PVOID Context
;
276 IN ULONG BugCheckCode
;
277 OUT ULONG_PTR Address
;
279 } KBUGCHECK_ADD_PAGES
, *PKBUGCHECK_ADD_PAGES
;
281 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA
{
283 IN ULONG InBufferLength
;
284 IN ULONG MaximumAllowed
;
287 OUT ULONG OutBufferLength
;
288 } KBUGCHECK_SECONDARY_DUMP_DATA
, *PKBUGCHECK_SECONDARY_DUMP_DATA
;
290 typedef enum _KBUGCHECK_DUMP_IO_TYPE
{
294 KbDumpIoSecondaryData
,
296 } KBUGCHECK_DUMP_IO_TYPE
;
298 typedef struct _KBUGCHECK_DUMP_IO
{
301 IN ULONG BufferLength
;
302 IN KBUGCHECK_DUMP_IO_TYPE Type
;
303 } KBUGCHECK_DUMP_IO
, *PKBUGCHECK_DUMP_IO
;
305 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
306 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
307 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
309 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
311 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
314 KBUGCHECK_CALLBACK_REASON Reason
;
316 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
318 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
324 } KBUGCHECK_BUFFER_DUMP_STATE
;
327 (NTAPI KBUGCHECK_CALLBACK_ROUTINE
)(
330 typedef KBUGCHECK_CALLBACK_ROUTINE
*PKBUGCHECK_CALLBACK_ROUTINE
;
332 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
334 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
340 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
343 (NTAPI NMI_CALLBACK
)(
346 typedef NMI_CALLBACK
*PNMI_CALLBACK
;
348 typedef enum _TRACE_INFORMATION_CLASS
{
351 TraceEnableFlagsClass
,
352 TraceEnableLevelClass
,
353 GlobalLoggerHandleClass
,
354 EventLoggerHandleClass
,
355 AllLoggerHandlesClass
,
356 TraceHandleByNameClass
,
357 LoggerEventsLostClass
,
358 TraceSessionSettingsClass
,
359 LoggerEventsLoggedClass
,
360 MaxTraceInformationClass
361 } TRACE_INFORMATION_CLASS
;
363 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE
{
364 KeProcessorAddStartNotify
= 0,
365 KeProcessorAddCompleteNotify
,
366 KeProcessorAddFailureNotify
367 } KE_PROCESSOR_CHANGE_NOTIFY_STATE
;
369 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
{
370 KE_PROCESSOR_CHANGE_NOTIFY_STATE State
;
373 #if (NTDDI_VERSION >= NTDDI_WIN7)
374 PROCESSOR_NUMBER ProcNumber
;
376 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT
;
379 (NTAPI PROCESSOR_CALLBACK_FUNCTION
)(
380 IN PVOID CallbackContext
,
381 IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext
,
382 IN OUT PNTSTATUS OperationStatus
);
383 typedef PROCESSOR_CALLBACK_FUNCTION
*PPROCESSOR_CALLBACK_FUNCTION
;
385 #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
387 #define INVALID_PROCESSOR_INDEX 0xffffffff
389 typedef enum _KINTERRUPT_POLARITY
{
390 InterruptPolarityUnknown
,
393 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
395 typedef enum _KPROFILE_SOURCE
{
397 ProfileAlignmentFixup
,
400 ProfileLoadInstructions
,
401 ProfilePipelineFrozen
,
402 ProfileBranchInstructions
,
403 ProfileTotalNonissues
,
407 ProfileBranchMispredictions
,
408 ProfileStoreInstructions
,
409 ProfileFpInstructions
,
410 ProfileIntegerInstructions
,
414 ProfileSpecialInstructions
,
417 ProfileDcacheAccesses
,
418 ProfileMemoryBarrierCycles
,
419 ProfileLoadLinkedIssues
,
423 typedef enum _KWAIT_REASON
{
464 typedef struct _KWAIT_BLOCK
{
465 LIST_ENTRY WaitListEntry
;
466 struct _KTHREAD
*Thread
;
468 struct _KWAIT_BLOCK
*NextWaitBlock
;
471 volatile UCHAR BlockState
;
475 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *PRKWAIT_BLOCK
;
477 typedef enum _KINTERRUPT_MODE
{
482 #define THREAD_WAIT_OBJECTS 3
485 (NTAPI KSTART_ROUTINE
)(
486 IN PVOID StartContext
);
487 typedef KSTART_ROUTINE
*PKSTART_ROUTINE
;
490 (NTAPI
*PKINTERRUPT_ROUTINE
)(
494 (NTAPI KSERVICE_ROUTINE
)(
495 IN
struct _KINTERRUPT
*Interrupt
,
496 IN PVOID ServiceContext
);
497 typedef KSERVICE_ROUTINE
*PKSERVICE_ROUTINE
;
500 (NTAPI KMESSAGE_SERVICE_ROUTINE
)(
501 IN
struct _KINTERRUPT
*Interrupt
,
502 IN PVOID ServiceContext
,
504 typedef KMESSAGE_SERVICE_ROUTINE
*PKMESSAGE_SERVICE_ROUTINE
;
506 typedef enum _KD_OPTION
{
507 KD_OPTION_SET_BLOCK_ENABLE
,
511 (NTAPI
*PKNORMAL_ROUTINE
)(
512 IN PVOID NormalContext OPTIONAL
,
513 IN PVOID SystemArgument1 OPTIONAL
,
514 IN PVOID SystemArgument2 OPTIONAL
);
517 (NTAPI
*PKRUNDOWN_ROUTINE
)(
518 IN
struct _KAPC
*Apc
);
521 (NTAPI
*PKKERNEL_ROUTINE
)(
522 IN
struct _KAPC
*Apc
,
523 IN OUT PKNORMAL_ROUTINE
*NormalRoutine OPTIONAL
,
524 IN OUT PVOID
*NormalContext OPTIONAL
,
525 IN OUT PVOID
*SystemArgument1 OPTIONAL
,
526 IN OUT PVOID
*SystemArgument2 OPTIONAL
);
528 typedef struct _KAPC
{
534 struct _KTHREAD
*Thread
;
535 LIST_ENTRY ApcListEntry
;
536 PKKERNEL_ROUTINE KernelRoutine
;
537 PKRUNDOWN_ROUTINE RundownRoutine
;
538 PKNORMAL_ROUTINE NormalRoutine
;
540 PVOID SystemArgument1
;
541 PVOID SystemArgument2
;
543 KPROCESSOR_MODE ApcMode
;
545 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
547 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
548 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
549 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
550 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
551 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
552 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
553 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
555 typedef struct _KDEVICE_QUEUE_ENTRY
{
556 LIST_ENTRY DeviceListEntry
;
559 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
560 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
562 typedef PVOID PKIPI_CONTEXT
;
565 (NTAPI
*PKIPI_WORKER
)(
566 IN OUT PKIPI_CONTEXT PacketContext
,
567 IN PVOID Parameter1 OPTIONAL
,
568 IN PVOID Parameter2 OPTIONAL
,
569 IN PVOID Parameter3 OPTIONAL
);
571 typedef struct _KIPI_COUNTS
{
577 ULONG FlushMultipleTb
;
583 ULONG SweepIcacheRange
;
584 ULONG FlushIoBuffers
;
586 } KIPI_COUNTS
, *PKIPI_COUNTS
;
589 (NTAPI KIPI_BROADCAST_WORKER
)(
590 IN ULONG_PTR Argument
);
591 typedef KIPI_BROADCAST_WORKER
*PKIPI_BROADCAST_WORKER
;
593 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
595 typedef struct _KSPIN_LOCK_QUEUE
{
596 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
597 PKSPIN_LOCK
volatile Lock
;
598 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
600 typedef struct _KLOCK_QUEUE_HANDLE
{
601 KSPIN_LOCK_QUEUE LockQueue
;
603 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
607 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
609 #define LockQueueDispatcherLock 0
610 #define LockQueueExpansionLock 1
611 #define LockQueuePfnLock 2
612 #define LockQueueSystemSpaceLock 3
613 #define LockQueueVacbLock 4
614 #define LockQueueMasterLock 5
615 #define LockQueueNonPagedPoolLock 6
616 #define LockQueueIoCancelLock 7
617 #define LockQueueWorkQueueLock 8
618 #define LockQueueIoVpbLock 9
619 #define LockQueueIoDatabaseLock 10
620 #define LockQueueIoCompletionLock 11
621 #define LockQueueNtfsStructLock 12
622 #define LockQueueAfdWorkQueueLock 13
623 #define LockQueueBcbLock 14
624 #define LockQueueMmNonPagedPoolLock 15
625 #define LockQueueUnusedSpare16 16
626 #define LockQueueTimerTableLock 17
627 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
631 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
632 LockQueueDispatcherLock
,
633 LockQueueExpansionLock
,
635 LockQueueSystemSpaceLock
,
638 LockQueueNonPagedPoolLock
,
639 LockQueueIoCancelLock
,
640 LockQueueWorkQueueLock
,
642 LockQueueIoDatabaseLock
,
643 LockQueueIoCompletionLock
,
644 LockQueueNtfsStructLock
,
645 LockQueueAfdWorkQueueLock
,
647 LockQueueMmNonPagedPoolLock
,
648 LockQueueUnusedSpare16
,
649 LockQueueTimerTableLock
,
650 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
651 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
653 #endif /* defined(_AMD64_) */
656 (NTAPI
*PKDEFERRED_ROUTINE
)(
657 IN
struct _KDPC
*Dpc
,
658 IN PVOID DeferredContext OPTIONAL
,
659 IN PVOID SystemArgument1 OPTIONAL
,
660 IN PVOID SystemArgument2 OPTIONAL
);
662 typedef enum _KDPC_IMPORTANCE
{
669 typedef struct _KDPC
{
672 volatile USHORT Number
;
673 LIST_ENTRY DpcListEntry
;
674 PKDEFERRED_ROUTINE DeferredRoutine
;
675 PVOID DeferredContext
;
676 PVOID SystemArgument1
;
677 PVOID SystemArgument2
;
678 volatile PVOID DpcData
;
679 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
681 typedef struct _KDPC_WATCHDOG_INFORMATION
{
684 ULONG DpcWatchdogLimit
;
685 ULONG DpcWatchdogCount
;
687 } KDPC_WATCHDOG_INFORMATION
, *PKDPC_WATCHDOG_INFORMATION
;
689 typedef struct _KDEVICE_QUEUE
{
692 LIST_ENTRY DeviceListHead
;
705 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
707 #define TIMER_EXPIRED_INDEX_BITS 6
708 #define TIMER_PROCESSOR_INDEX_BITS 5
710 typedef struct _DISPATCHER_HEADER
{
711 _ANONYMOUS_UNION
union {
712 _ANONYMOUS_STRUCT
struct {
714 _ANONYMOUS_UNION
union {
715 _ANONYMOUS_UNION
union {
716 UCHAR TimerControlFlags
;
717 _ANONYMOUS_STRUCT
struct {
720 UCHAR KeepShifting
:1;
721 UCHAR EncodedTolerableDelay
:5;
725 #if (NTDDI_VERSION < NTDDI_WIN7)
730 _ANONYMOUS_UNION
union {
731 _ANONYMOUS_UNION
union {
732 UCHAR ThreadControlFlags
;
733 _ANONYMOUS_STRUCT
struct {
734 UCHAR CpuThrottled
:1;
735 UCHAR CycleProfiling
:1;
736 UCHAR CounterProfiling
:1;
743 _ANONYMOUS_UNION
union {
744 #if (NTDDI_VERSION >= NTDDI_WIN7)
745 _ANONYMOUS_UNION
union {
746 UCHAR TimerMiscFlags
;
747 _ANONYMOUS_STRUCT
struct {
749 UCHAR Index
:TIMER_EXPIRED_INDEX_BITS
;
752 UCHAR Processor
:TIMER_PROCESSOR_INDEX_BITS
;
755 volatile UCHAR Expired
:1;
759 /* Pre Win7 compatibility fix to latest WDK */
762 _ANONYMOUS_UNION
union {
764 _ANONYMOUS_STRUCT
struct {
766 BOOLEAN Instrumented
:1;
768 BOOLEAN UmsScheduled
:1;
769 BOOLEAN UmsPrimary
:1;
771 } DUMMYUNIONNAME
; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
778 LIST_ENTRY WaitListHead
;
779 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
781 typedef struct _KEVENT
{
782 DISPATCHER_HEADER Header
;
783 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
785 typedef struct _KSEMAPHORE
{
786 DISPATCHER_HEADER Header
;
788 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
790 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
792 typedef struct _KGATE
{
793 DISPATCHER_HEADER Header
;
794 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
796 typedef struct _KGUARDED_MUTEX
{
801 __GNU_EXTENSION
union {
802 __GNU_EXTENSION
struct {
803 SHORT KernelApcDisable
;
804 SHORT SpecialApcDisable
;
806 ULONG CombinedApcDisable
;
808 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
810 typedef struct _KMUTANT
{
811 DISPATCHER_HEADER Header
;
812 LIST_ENTRY MutantListEntry
;
813 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
816 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
818 #define TIMER_TABLE_SIZE 512
819 #define TIMER_TABLE_SHIFT 9
821 typedef struct _KTIMER
{
822 DISPATCHER_HEADER Header
;
823 ULARGE_INTEGER DueTime
;
824 LIST_ENTRY TimerListEntry
;
830 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
832 typedef enum _LOCK_OPERATION
{
838 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
841 (NTAPI
*PKSYNCHRONIZE_ROUTINE
)(
842 IN PVOID SynchronizeContext
);
844 typedef enum _POOL_TYPE
{
847 NonPagedPoolMustSucceed
,
849 NonPagedPoolCacheAligned
,
850 PagedPoolCacheAligned
,
851 NonPagedPoolCacheAlignedMustS
,
853 NonPagedPoolSession
= 32,
855 NonPagedPoolMustSucceedSession
,
856 DontUseThisTypeSession
,
857 NonPagedPoolCacheAlignedSession
,
858 PagedPoolCacheAlignedSession
,
859 NonPagedPoolCacheAlignedMustSSession
862 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
{
866 } ALTERNATIVE_ARCHITECTURE_TYPE
;
871 #define IsNEC_98 (FALSE)
875 #define IsNotNEC_98 (TRUE)
888 typedef struct _KSYSTEM_TIME
{
892 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
894 typedef struct DECLSPEC_ALIGN(16) _M128A
{
899 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT
{
906 USHORT ErrorSelector
;
913 M128A FloatRegisters
[8];
915 M128A XmmRegisters
[16];
918 M128A XmmRegisters
[8];
919 UCHAR Reserved4
[192];
920 ULONG StackControl
[7];
923 } XSAVE_FORMAT
, *PXSAVE_FORMAT
;
925 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER
{
928 } XSAVE_AREA_HEADER
, *PXSAVE_AREA_HEADER
;
930 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA
{
931 XSAVE_FORMAT LegacyState
;
932 XSAVE_AREA_HEADER Header
;
933 } XSAVE_AREA
, *PXSAVE_AREA
;
935 typedef struct _XSTATE_CONTEXT
{
947 } XSTATE_CONTEXT
, *PXSTATE_CONTEXT
;
949 typedef struct _XSTATE_SAVE
{
951 struct _XSTATE_SAVE
* Prev
;
952 struct _KTHREAD
* Thread
;
954 XSTATE_CONTEXT XStateContext
;
955 #elif defined(_IA64_)
962 struct _XSTATE_SAVE
* Prev
;
963 PXSAVE_AREA Reserved3
;
964 struct _KTHREAD
* Thread
;
968 XSTATE_CONTEXT XStateContext
;
971 } XSTATE_SAVE
, *PXSTATE_SAVE
;
975 #define MAXIMUM_SUPPORTED_EXTENSION 512
977 #if !defined(__midl) && !defined(MIDL_PASS)
978 C_ASSERT(sizeof(XSAVE_FORMAT
) == MAXIMUM_SUPPORTED_EXTENSION
);
983 #define XSAVE_ALIGN 64
984 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
986 #if !defined(__midl) && !defined(MIDL_PASS)
987 C_ASSERT((sizeof(XSAVE_FORMAT
) & (XSAVE_ALIGN
- 1)) == 0);
988 C_ASSERT((FIELD_OFFSET(XSAVE_AREA
, Header
) & (XSAVE_ALIGN
- 1)) == 0);
989 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH
== 512 + 64);
992 typedef struct _CONTEXT_CHUNK
{
995 } CONTEXT_CHUNK
, *PCONTEXT_CHUNK
;
997 typedef struct _CONTEXT_EX
{
999 CONTEXT_CHUNK Legacy
;
1000 CONTEXT_CHUNK XState
;
1001 } CONTEXT_EX
, *PCONTEXT_EX
;
1003 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
1005 #if (NTDDI_VERSION >= NTDDI_VISTA)
1006 extern NTSYSAPI
volatile CCHAR KeNumberProcessors
;
1007 #elif (NTDDI_VERSION >= NTDDI_WINXP)
1008 extern NTSYSAPI CCHAR KeNumberProcessors
;
1010 extern PCCHAR KeNumberProcessors
;