3 Copyright (c) Alex Ionescu. All rights reserved.
11 Type definitions for the Kernel services.
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
26 #ifndef NTOS_MODE_USER
33 // A system call ID is formatted as such:
34 // .________________________________________________________________.
35 // | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
36 // |--------------|-------------------------------------------------|
37 // | TABLE NUMBER | TABLE OFFSET |
38 // \----------------------------------------------------------------/
40 // The table number is then used as an index into the service descriptor table.
41 #define TABLE_NUMBER_BITS 1
42 #define TABLE_OFFSET_BITS 12
45 // There are 2 tables (kernel and shadow, used by Win32K)
47 #define NUMBER_SERVICE_TABLES 2
48 #define NTOS_SERVICE_INDEX 0
49 #define WIN32K_SERVICE_INDEX 1
52 // NB. From assembly code, the table number must be computed as an offset into
53 // the service descriptor table.
55 // Each entry into the table is 16 bytes long on 32-bit architectures, and
56 // 32 bytes long on 64-bit architectures.
58 // Thus, Table Number 1 is offset 16 (0x10) on x86, and offset 32 (0x20) on
62 #define BITS_PER_ENTRY 5 // (1 << 5) = 32 bytes
64 #define BITS_PER_ENTRY 4 // (1 << 4) = 16 bytes
68 // We want the table number, but leave some extra bits to we can have the offset
69 // into the descriptor table.
71 #define SERVICE_TABLE_SHIFT (12 - BITS_PER_ENTRY)
74 // Now the table number (as an offset) is corrupted with part of the table offset
75 // This mask will remove the extra unwanted bits, and give us the offset into the
76 // descriptor table proper.
78 #define SERVICE_TABLE_MASK (((1 << TABLE_NUMBER_BITS) - 1) << BITS_PER_ENTRY)
81 // To get the table offset (ie: the service call number), just keep the 12 bits
83 #define SERVICE_NUMBER_MASK ((1 << TABLE_OFFSET_BITS) - 1)
86 // We'll often need to check if this is a graphics call. This is done by comparing
87 // the table number offset with the known Win32K table number offset.
88 // This is usually index 1, so table number offset 0x10 (x86) or 0x20 (x64)
90 #define SERVICE_TABLE_TEST (WIN32K_SERVICE_INDEX << BITS_PER_ENTRY)
93 // Context Record Flags
95 #define CONTEXT_DEBUGGER (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
98 // Maximum System Descriptor Table Entries
100 #define SSDT_MAX_ENTRIES 2
103 // Processor Architectures
105 #define PROCESSOR_ARCHITECTURE_INTEL 0
106 #define PROCESSOR_ARCHITECTURE_MIPS 1
107 #define PROCESSOR_ARCHITECTURE_ALPHA 2
108 #define PROCESSOR_ARCHITECTURE_PPC 3
109 #define PROCESSOR_ARCHITECTURE_SHX 4
110 #define PROCESSOR_ARCHITECTURE_ARM 5
111 #define PROCESSOR_ARCHITECTURE_IA64 6
112 #define PROCESSOR_ARCHITECTURE_ALPHA64 7
113 #define PROCESSOR_ARCHITECTURE_MSIL 8
114 #define PROCESSOR_ARCHITECTURE_AMD64 9
115 #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
118 // Object Type Mask for Kernel Dispatcher Objects
120 #define KOBJECT_TYPE_MASK 0x7F
121 #define KOBJECT_LOCK_BIT 0x80
124 // Dispatcher Priority increments
126 #define THREAD_ALERT_INCREMENT 2
129 // Physical memory offset of KUSER_SHARED_DATA
131 #define KI_USER_SHARED_DATA_PHYSICAL 0x41000
134 // Quantum values and decrements
136 #define MAX_QUANTUM 0x7F
137 #define WAIT_QUANTUM_DECREMENT 1
138 #define CLOCK_QUANTUM_DECREMENT 3
141 // Kernel Feature Bits
143 #define KF_V86_VIS 0x00000001
144 #define KF_RDTSC 0x00000002
145 #define KF_CR4 0x00000004
146 #define KF_CMOV 0x00000008
147 #define KF_GLOBAL_PAGE 0x00000010
148 #define KF_LARGE_PAGE 0x00000020
149 #define KF_MTRR 0x00000040
150 #define KF_CMPXCHG8B 0x00000080
151 #define KF_MMX 0x00000100
152 #define KF_WORKING_PTE 0x00000200
153 #define KF_PAT 0x00000400
154 #define KF_FXSR 0x00000800
155 #define KF_FAST_SYSCALL 0x00001000
156 #define KF_XMMI 0x00002000
157 #define KF_3DNOW 0x00004000
158 #define KF_AMDK6MTRR 0x00008000
159 #define KF_XMMI64 0x00010000
160 #define KF_DTS 0x00020000
161 #define KF_BRANCH 0x00020000 // from ksamd64.inc
162 #define KF_SSE3 0x00080000
163 #define KF_CMPXCHG16B 0x00100000
164 #define KF_XSTATE 0x00800000 // from ks386.inc, ksamd64.inc
165 #define KF_NX_BIT 0x20000000
166 #define KF_NX_DISABLED 0x40000000
167 #define KF_NX_ENABLED 0x80000000
169 #define KF_XSAVEOPT_BIT 15
170 #define KF_XSTATE_BIT 23
171 #define KF_RDWRFSGSBASE_BIT 28
174 // Internal Exception Codes
176 #define KI_EXCEPTION_INTERNAL 0x10000000
177 #define KI_EXCEPTION_ACCESS_VIOLATION (KI_EXCEPTION_INTERNAL | 0x04)
179 typedef struct _FIBER
/* Field offsets: */
181 PVOID FiberData
; /* 0x000 0x000 0x000 */
182 struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;/* 0x004 0x004 0x008 */
183 PVOID StackBase
; /* 0x008 0x008 0x010 */
184 PVOID StackLimit
; /* 0x00C 0x00C 0x018 */
185 PVOID DeallocationStack
; /* 0x010 0x010 0x020 */
186 CONTEXT FiberContext
; /* 0x014 0x018 0x030 */
187 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
188 PVOID Wx86Tib
; /* 0x2E0 0x1b8 0x500 */
189 struct _ACTIVATION_CONTEXT_STACK
*ActivationContextStackPointer
; /* 0x2E4 0x1bc 0x508 */
190 PVOID FlsData
; /* 0x2E8 0x1c0 0x510 */
191 ULONG GuaranteedStackBytes
; /* 0x2EC 0x1c4 0x518 */
192 ULONG TebFlags
; /* 0x2F0 0x1c8 0x51C */
194 ULONG GuaranteedStackBytes
; /* 0x2E0 */
195 PVOID FlsData
; /* 0x2E4 */
196 struct _ACTIVATION_CONTEXT_STACK
*ActivationContextStackPointer
;
200 #ifndef NTOS_MODE_USER
202 // Number of dispatch codes supported by KINTERRUPT
205 #define DISPATCH_LENGTH 4
206 #elif (NTDDI_VERSION >= NTDDI_LONGHORN)
207 #define DISPATCH_LENGTH 135
209 #define DISPATCH_LENGTH 106
215 // KPROCESSOR_MODE Type
217 typedef CCHAR KPROCESSOR_MODE
;
220 // Dereferencable pointer to KUSER_SHARED_DATA in User-Mode
222 #define SharedUserData ((KUSER_SHARED_DATA *)USER_SHARED_DATA)
225 // Maximum WOW64 Entries in KUSER_SHARED_DATA
227 #define MAX_WOW64_SHARED_ENTRIES 16
230 // Maximum Processor Features supported in KUSER_SHARED_DATA
232 #define PROCESSOR_FEATURE_MAX 64
237 typedef enum _EVENT_TYPE
246 typedef enum _TIMER_TYPE
255 typedef enum _WAIT_TYPE
262 // Processor Execution Modes
274 typedef enum _KWAIT_REASON
316 typedef enum _KPROFILE_SOURCE
319 ProfileAlignmentFixup
,
322 ProfileLoadInstructions
,
323 ProfilePipelineFrozen
,
324 ProfileBranchInstructions
,
325 ProfileTotalNonissues
,
329 ProfileBranchMispredictions
,
330 ProfileStoreInstructions
,
331 ProfileFpInstructions
,
332 ProfileIntegerInstructions
,
336 ProfileSpecialInstructions
,
339 ProfileDcacheAccesses
,
340 ProfileMemoryBarrierCycles
,
341 ProfileLoadLinkedIssues
,
346 // NT Product and Architecture Types
348 typedef enum _NT_PRODUCT_TYPE
353 } NT_PRODUCT_TYPE
, *PNT_PRODUCT_TYPE
;
355 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
360 } ALTERNATIVE_ARCHITECTURE_TYPE
;
367 typedef enum _KTHREAD_STATE
377 #if (NTDDI_VERSION >= NTDDI_WS03)
380 } KTHREAD_STATE
, *PKTHREAD_STATE
;
383 // Kernel Object Types
385 typedef enum _KOBJECTS
387 EventNotificationObject
= 0,
388 EventSynchronizationObject
= 1,
395 TimerNotificationObject
= 8,
396 TimerSynchronizationObject
= 9,
407 DeviceQueueObject
= 20,
408 EventPairObject
= 21,
409 InterruptObject
= 22,
411 ThreadedDpcObject
= 24,
412 MaximumKernelObject
= 25
418 typedef enum _ADJUST_REASON
428 typedef enum _KCONTINUE_STATUS
432 ContinueProcessorReselected
,
433 ContinueNextProcessor
439 typedef enum _KPROCESS_STATE
446 } KPROCESS_STATE
, *PKPROCESS_STATE
;
449 // NtVdmControl Classes
451 typedef enum _VDMSERVICECLASS
453 VdmStartExecution
= 0,
454 VdmQueueInterrupt
= 1,
455 VdmDelayInterrupt
= 2,
458 VdmSetInt21Handler
= 5,
460 VdmPrinterDirectIoOpen
= 7,
461 VdmPrinterDirectIoClose
= 8,
462 VdmPrinterInitialize
= 9,
463 VdmSetLdtEntries
= 10,
464 VdmSetProcessLdtInfo
= 11,
465 VdmAdlibEmulation
= 12,
466 VdmPMCliControl
= 13,
467 VdmQueryVdmProcess
= 14,
470 #ifdef NTOS_MODE_USER
473 // APC Normal Routine
476 (NTAPI
*PKNORMAL_ROUTINE
)(
477 _In_ PVOID NormalContext
,
478 _In_ PVOID SystemArgument1
,
479 _In_ PVOID SystemArgument2
486 (NTAPI
*PTIMER_APC_ROUTINE
)(
487 _In_ PVOID TimerContext
,
488 _In_ ULONG TimerLowValue
,
489 _In_ LONG TimerHighValue
493 // System Time Structure
495 typedef struct _KSYSTEM_TIME
500 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
503 // Shared Kernel User Data
505 typedef struct _KUSER_SHARED_DATA
507 ULONG TickCountLowDeprecated
;
508 ULONG TickCountMultiplier
;
509 volatile KSYSTEM_TIME InterruptTime
;
510 volatile KSYSTEM_TIME SystemTime
;
511 volatile KSYSTEM_TIME TimeZoneBias
;
512 USHORT ImageNumberLow
;
513 USHORT ImageNumberHigh
;
514 WCHAR NtSystemRoot
[260];
515 ULONG MaxStackTraceDepth
;
516 ULONG CryptoExponent
;
518 ULONG LargePageMinimum
;
520 NT_PRODUCT_TYPE NtProductType
;
521 BOOLEAN ProductTypeIsValid
;
522 ULONG NtMajorVersion
;
523 ULONG NtMinorVersion
;
524 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
527 volatile ULONG TimeSlip
;
528 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
529 LARGE_INTEGER SystemExpirationDate
;
531 BOOLEAN KdDebuggerEnabled
;
532 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
533 UCHAR NXSupportPolicy
;
535 volatile ULONG ActiveConsoleId
;
536 volatile ULONG DismountCount
;
537 ULONG ComPlusPackage
;
538 ULONG LastSystemRITEventTickCount
;
539 ULONG NumberOfPhysicalPages
;
540 BOOLEAN SafeBootMode
;
543 ULONGLONG TestRetInstruction
;
545 ULONG SystemCallReturn
;
546 ULONGLONG SystemCallPad
[3];
548 volatile KSYSTEM_TIME TickCount
;
549 volatile ULONG64 TickCountQuad
;
552 #if (NTDDI_VERSION >= NTDDI_WS03)
553 LONGLONG ConsoleSessionForegroundProcessId
;
554 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
556 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
557 USHORT UserModeGlobalLogger
[8];
558 ULONG HeapTracingPid
[2];
559 ULONG CritSecTracingPid
[2];
562 ULONG SharedDataFlags
;
565 ULONG DbgErrorPortPresent
:1;
566 ULONG DbgElevationEnabled
:1;
567 ULONG DbgVirtEnabled
:1;
568 ULONG DbgInstallerDetectEnabled
:1;
572 ULONG ImageFileExecutionOptions
;
573 KAFFINITY ActiveProcessorAffinity
;
575 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
580 #include "pshpack1.h"
581 typedef struct _VdmVirtualIca
594 } VDMVIRTUALICA
, *PVDMVIRTUALICA
;
597 typedef struct _VdmIcaUserData
600 PVDMVIRTUALICA pIcaMaster
;
601 PVDMVIRTUALICA pIcaSlave
;
606 PULONG pAddrIretBopTable
;
607 PHANDLE phWowIdleEvent
;
608 PLARGE_INTEGER pIcaTimeout
;
609 PHANDLE phMainThreadSuspended
;
610 } VDMICAUSERDATA
, *PVDMICAUSERDATA
;
612 typedef struct _VDM_INITIALIZE_DATA
615 PVDMICAUSERDATA IcaUserData
;
616 } VDM_INITIALIZE_DATA
, *PVDM_INITIALIZE_DATA
;
621 // System Thread Start Routine
625 (NTAPI
*PKSYSTEM_ROUTINE
)(
626 PKSTART_ROUTINE StartRoutine
,
632 (NTAPI
*PKNORMAL_ROUTINE
)(
633 IN PVOID NormalContext OPTIONAL
,
634 IN PVOID SystemArgument1 OPTIONAL
,
635 IN PVOID SystemArgument2 OPTIONAL
);
638 (NTAPI
*PKRUNDOWN_ROUTINE
)(
639 IN
struct _KAPC
*Apc
);
642 (NTAPI
*PKKERNEL_ROUTINE
)(
643 IN
struct _KAPC
*Apc
,
644 IN OUT PKNORMAL_ROUTINE
*NormalRoutine OPTIONAL
,
645 IN OUT PVOID
*NormalContext OPTIONAL
,
646 IN OUT PVOID
*SystemArgument1 OPTIONAL
,
647 IN OUT PVOID
*SystemArgument2 OPTIONAL
);
651 // APC Environment Types
653 typedef enum _KAPC_ENVIRONMENT
655 OriginalApcEnvironment
,
656 AttachedApcEnvironment
,
657 CurrentApcEnvironment
,
661 typedef struct _KTIMER_TABLE_ENTRY
663 #if (NTDDI_VERSION >= NTDDI_LONGHORN) || defined(_M_ARM) || defined(_M_AMD64)
668 } KTIMER_TABLE_ENTRY
, *PKTIMER_TABLE_ENTRY
;
670 typedef struct _KTIMER_TABLE
672 PKTIMER TimerExpiry
[64];
673 KTIMER_TABLE_ENTRY TimerEntries
[256];
674 } KTIMER_TABLE
, *PKTIMER_TABLE
;
676 typedef struct _KDPC_LIST
678 SINGLE_LIST_ENTRY ListHead
;
679 SINGLE_LIST_ENTRY
* LastEntry
;
680 } KDPC_LIST
, *PKDPC_LIST
;
682 typedef struct _SYNCH_COUNTERS
684 ULONG SpinLockAcquireCount
;
685 ULONG SpinLockContentionCount
;
686 ULONG SpinLockSpinCount
;
687 ULONG IpiSendRequestBroadcastCount
;
688 ULONG IpiSendRequestRoutineCount
;
689 ULONG IpiSendSoftwareInterruptCount
;
690 ULONG ExInitializeResourceCount
;
691 ULONG ExReInitializeResourceCount
;
692 ULONG ExDeleteResourceCount
;
693 ULONG ExecutiveResourceAcquiresCount
;
694 ULONG ExecutiveResourceContentionsCount
;
695 ULONG ExecutiveResourceReleaseExclusiveCount
;
696 ULONG ExecutiveResourceReleaseSharedCount
;
697 ULONG ExecutiveResourceConvertsCount
;
698 ULONG ExAcqResExclusiveAttempts
;
699 ULONG ExAcqResExclusiveAcquiresExclusive
;
700 ULONG ExAcqResExclusiveAcquiresExclusiveRecursive
;
701 ULONG ExAcqResExclusiveWaits
;
702 ULONG ExAcqResExclusiveNotAcquires
;
703 ULONG ExAcqResSharedAttempts
;
704 ULONG ExAcqResSharedAcquiresExclusive
;
705 ULONG ExAcqResSharedAcquiresShared
;
706 ULONG ExAcqResSharedAcquiresSharedRecursive
;
707 ULONG ExAcqResSharedWaits
;
708 ULONG ExAcqResSharedNotAcquires
;
709 ULONG ExAcqResSharedStarveExclusiveAttempts
;
710 ULONG ExAcqResSharedStarveExclusiveAcquiresExclusive
;
711 ULONG ExAcqResSharedStarveExclusiveAcquiresShared
;
712 ULONG ExAcqResSharedStarveExclusiveAcquiresSharedRecursive
;
713 ULONG ExAcqResSharedStarveExclusiveWaits
;
714 ULONG ExAcqResSharedStarveExclusiveNotAcquires
;
715 ULONG ExAcqResSharedWaitForExclusiveAttempts
;
716 ULONG ExAcqResSharedWaitForExclusiveAcquiresExclusive
;
717 ULONG ExAcqResSharedWaitForExclusiveAcquiresShared
;
718 ULONG ExAcqResSharedWaitForExclusiveAcquiresSharedRecursive
;
719 ULONG ExAcqResSharedWaitForExclusiveWaits
;
720 ULONG ExAcqResSharedWaitForExclusiveNotAcquires
;
721 ULONG ExSetResOwnerPointerExclusive
;
722 ULONG ExSetResOwnerPointerSharedNew
;
723 ULONG ExSetResOwnerPointerSharedOld
;
724 ULONG ExTryToAcqExclusiveAttempts
;
725 ULONG ExTryToAcqExclusiveAcquires
;
726 ULONG ExBoostExclusiveOwner
;
727 ULONG ExBoostSharedOwners
;
728 ULONG ExEtwSynchTrackingNotificationsCount
;
729 ULONG ExEtwSynchTrackingNotificationsAccountedCount
;
730 } SYNCH_COUNTERS
, *PSYNCH_COUNTERS
;
735 typedef struct _KDPC_DATA
737 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
740 LIST_ENTRY DpcListHead
;
743 #if defined(_M_AMD64) || defined(_M_ARM)
744 volatile LONG DpcQueueDepth
;
746 volatile ULONG DpcQueueDepth
;
749 #if (NTDDI_VERSION >= NTDDI_LONGHORN) || defined(_M_ARM)
752 } KDPC_DATA
, *PKDPC_DATA
;
755 // Per-Processor Lookaside List
757 typedef struct _PP_LOOKASIDE_LIST
759 struct _GENERAL_LOOKASIDE
*P
;
760 struct _GENERAL_LOOKASIDE
*L
;
761 } PP_LOOKASIDE_LIST
, *PPP_LOOKASIDE_LIST
;
764 // Architectural Types
766 #include <arch/ketypes.h>
769 // Kernel Memory Node
771 #include <pshpack1.h>
772 typedef struct _KNODE
774 SLIST_HEADER DeadStackList
;
775 SLIST_HEADER PfnDereferenceSListHead
;
776 KAFFINITY ProcessorMask
;
784 ULONG MmShiftedColor
;
786 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
791 // Structure for Get/SetContext APC
793 typedef struct _GETSETCONTEXT
797 KPROCESSOR_MODE Mode
;
799 } GETSETCONTEXT
, *PGETSETCONTEXT
;
802 // Kernel Profile Object
804 typedef struct _KPROFILE
808 LIST_ENTRY ProfileListEntry
;
809 struct _KPROCESS
*Process
;
816 KPROFILE_SOURCE Source
;
818 } KPROFILE
, *PKPROFILE
;
821 // Kernel Interrupt Object
823 typedef struct _KINTERRUPT
827 LIST_ENTRY InterruptListEntry
;
828 PKSERVICE_ROUTINE ServiceRoutine
;
829 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
830 PKSERVICE_ROUTINE MessageServiceRoutine
;
833 PVOID ServiceContext
;
836 PKSPIN_LOCK ActualLock
;
837 PKINTERRUPT_ROUTINE DispatchAddress
;
840 KIRQL SynchronizeIrql
;
841 BOOLEAN FloatingSave
;
845 KINTERRUPT_MODE Mode
;
846 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
847 KINTERRUPT_POLARITY Polarity
;
851 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
855 PKTRAP_FRAME TrapFrame
;
858 ULONG DispatchCode
[DISPATCH_LENGTH
];
862 // Kernel Event Pair Object
864 typedef struct _KEVENT_PAIR
870 } KEVENT_PAIR
, *PKEVENT_PAIR
;
873 // Kernel No Execute Options
875 typedef struct _KEXECUTE_OPTIONS
877 UCHAR ExecuteDisable
:1;
878 UCHAR ExecuteEnable
:1;
879 UCHAR DisableThunkEmulation
:1;
881 UCHAR ExecuteDispatchEnable
:1;
882 UCHAR ImageDispatchEnable
:1;
884 } KEXECUTE_OPTIONS
, *PKEXECUTE_OPTIONS
;
886 #if (NTDDI_VERSION >= NTDDI_WIN7)
887 typedef union _KWAIT_STATUS_REGISTER
900 } KWAIT_STATUS_REGISTER
, *PKWAIT_STATUS_REGISTER
;
902 typedef struct _COUNTER_READING
904 enum _HARDWARE_COUNTER_TYPE Type
;
908 }COUNTER_READING
, *PCOUNTER_READING
;
910 typedef struct _KTHREAD_COUNTERS
912 ULONG64 WaitReasonBitMap
;
913 struct _THREAD_PERFORMANCE_DATA
* UserData
;
915 ULONG ContextSwitches
;
916 ULONG64 CycleTimeBias
;
917 ULONG64 HardwareCounters
;
918 COUNTER_READING HwCounter
[16];
919 }KTHREAD_COUNTERS
, *PKTHREAD_COUNTERS
;
922 /// FIXME: should move to rtltypes.h, but we can't include it here.
923 #if (NTDDI_VERSION >= NTDDI_WIN8)
924 typedef struct _RTL_RB_TREE
926 PRTL_BALANCED_NODE Root
;
927 PRTL_BALANCED_NODE Min
;
928 } RTL_RB_TREE
, *PRTL_RB_TREE
;
931 #if (NTDDI_VERSION >= NTDDI_WINBLUE)
932 typedef struct _KLOCK_ENTRY_LOCK_STATE
938 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 6.4.9841.0
939 ULONG_PTR CrossThreadReleasable
: 1;
941 ULONG_PTR Waiting
: 1;
944 ULONG_PTR Reserved
: (8 * sizeof(PVOID
)) - 3; // previously Spare
945 ULONG_PTR InTree
: 1;
960 } KLOCK_ENTRY_LOCK_STATE
, *PKLOCK_ENTRY_LOCK_STATE
;
962 typedef struct _KLOCK_ENTRY
966 RTL_BALANCED_NODE TreeNode
;
967 SINGLE_LIST_ENTRY FreeListEntry
;
969 #if (NTDDI_VERSION >= NTDDI_WIN10)
978 UCHAR ThreadLocalFlags
;
981 UCHAR WaitingBit
: 1;
988 UCHAR AcquiredBit
: 1;
992 UCHAR CrossThreadFlags
;
995 UCHAR HeadNodeBit
: 1;
996 UCHAR IoPriorityBit
: 1;
997 UCHAR IoQoSWaiter
: 1; // since TH2
1004 ULONG StaticState
: 8;
1005 ULONG AllFlags
: 24;
1017 volatile UCHAR HeadNodeByte
;
1019 volatile UCHAR AcquiredByte
;
1026 KLOCK_ENTRY_LOCK_STATE LockState
;
1030 #if (NTDDI_VERSION >= NTDDI_WIN10)
1031 volatile UCHAR CrossThreadReleasableAndBusyByte
;
1033 volatile UCHAR WaitingAndBusyByte
;
1035 UCHAR Reserved
[sizeof(PVOID
) - 2];
1054 RTL_RB_TREE OwnerTree
;
1055 RTL_RB_TREE WaiterTree
;
1057 CHAR CpuPriorityKey
;
1059 ULONG_PTR EntryLock
;
1063 ULONG AllBoosts
: 17;
1071 USHORT CpuBoostsBitmap
: 15;
1076 USHORT IoQoSBoost
: 1;
1077 USHORT IoNormalPriorityWaiterCount
: 8;
1078 USHORT IoQoSWaiterCount
: 7;
1085 } KLOCK_ENTRY
, *PKLOCK_ENTRY
;
1090 // Kernel Thread (KTHREAD)
1092 #if (NTDDI_VERSION < NTDDI_WIN8)
1094 typedef struct _KTHREAD
1096 DISPATCHER_HEADER Header
;
1097 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1098 ULONGLONG CycleTime
;
1100 ULONG HighCycleTime
;
1102 ULONGLONG QuantumTarget
;
1104 LIST_ENTRY MutantListHead
;
1107 ULONG_PTR StackLimit
; // FIXME: PVOID
1109 KSPIN_LOCK ThreadLock
;
1110 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1111 KWAIT_STATUS_REGISTER WaitRegister
;
1118 ULONG KernelStackResident
:1;
1119 ULONG ReadyTransition
:1;
1120 ULONG ProcessReadyQueue
:1;
1122 ULONG SystemAffinityActive
:1;
1124 ULONG GdiFlushActive
:1;
1125 ULONG UserStackWalkActive
:1;
1126 ULONG ApcInterruptRequest
:1;
1127 ULONG ForceDeferSchedule
:1;
1128 ULONG QuantumEndMigrate
:1;
1129 ULONG UmsDirectedSwitchEnable
:1;
1130 ULONG TimerActive
:1;
1138 KAPC_STATE ApcState
;
1141 UCHAR ApcStateFill
[FIELD_OFFSET(KAPC_STATE
, UserApcPending
) + 1];
1142 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1144 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1145 /* On x86, the following members "fall out" of the union */
1146 volatile ULONG NextProcessor
;
1147 volatile ULONG DeferredProcessor
;
1149 /* On x86, the following members "fall out" of the union */
1150 volatile USHORT NextProcessor
;
1151 volatile USHORT DeferredProcessor
;
1155 /* On x86, the following members "fall out" of the union */
1156 volatile UCHAR NextProcessor
;
1157 volatile UCHAR DeferredProcessor
;
1159 SCHAR AdjustIncrement
;
1163 KSPIN_LOCK ApcQueueLock
;
1164 #ifndef _M_AMD64 // [
1165 ULONG ContextSwitches
;
1166 volatile UCHAR State
;
1169 KPROCESSOR_MODE WaitMode
;
1171 LONG_PTR WaitStatus
;
1172 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1173 PKWAIT_BLOCK WaitBlockList
;
1177 PKWAIT_BLOCK WaitBlockList
;
1180 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1185 ULONG KernelStackResident
:1;
1186 ULONG ReadyTransition
:1;
1187 ULONG ProcessReadyQueue
:1;
1189 ULONG SystemAffinityActive
:1;
1191 ULONG GdiFlushActive
:1;
1201 #if (NTDDI_VERSION < NTDDI_LONGHORN)
1203 BOOLEAN EnableStackSwap
;
1205 volatile UCHAR SwapBusy
;
1206 BOOLEAN Alerted
[MaximumMode
];
1210 LIST_ENTRY WaitListEntry
;
1211 SINGLE_LIST_ENTRY SwapListEntry
;
1214 #ifndef _M_AMD64 // [
1220 SHORT KernelApcDisable
;
1221 SHORT SpecialApcDisable
;
1223 ULONG CombinedApcDisable
;
1228 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1236 UCHAR TimerFill
[FIELD_OFFSET(KTIMER
, Period
) + sizeof(LONG
)];
1237 #if !defined(_WIN64) // [
1246 ULONG AutoAlignment
:1;
1247 ULONG DisableBoost
:1;
1248 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1249 ULONG EtwStackTraceApc1Inserted
:1;
1250 ULONG EtwStackTraceApc2Inserted
:1;
1251 ULONG CycleChargePending
:1;
1252 ULONG CalloutActive
:1;
1253 ULONG ApcQueueable
:1;
1254 ULONG EnableStackSwap
:1;
1256 ULONG ReservedFlags
:23;
1258 LONG ReservedFlags
:30;
1263 #if defined(_WIN64) && (NTDDI_VERSION < NTDDI_WIN7) // [
1267 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1268 #if defined(_WIN64) // [
1276 DECLSPEC_ALIGN(8) KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
1277 #if (NTDDI_VERSION < NTDDI_WIN7) // [
1280 UCHAR WaitBlockFill0
[FIELD_OFFSET(KWAIT_BLOCK
, SpareByte
)]; // 32bit = 23, 64bit = 43
1281 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1282 UCHAR IdealProcessor
;
1284 BOOLEAN SystemAffinityActive
;
1289 UCHAR WaitBlockFill1
[1 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareByte
)]; // 47 / 91
1294 UCHAR WaitBlockFill2
[2 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareByte
)]; // 71 / 139
1295 UCHAR ResourceIndex
;
1299 UCHAR WaitBlockFill3
[3 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareByte
)]; // 95 / 187
1306 UCHAR WaitBlockFill4
[FIELD_OFFSET(KWAIT_BLOCK
, SpareLong
)];
1307 ULONG ContextSwitches
;
1311 UCHAR WaitBlockFill5
[1 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareLong
)];
1319 UCHAR WaitBlockFill6
[2 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareLong
)];
1322 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1325 UCHAR WaitBlockFill7
[168];
1326 PVOID TebMappedLowVa
;
1327 struct _UMS_CONTROL_BLOCK
* Ucb
;
1332 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1333 UCHAR WaitBlockFill8
[188];
1335 UCHAR WaitBlockFill7
[3 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareLong
)];
1341 SHORT KernelApcDisable
;
1342 SHORT SpecialApcDisable
;
1344 ULONG CombinedApcDisable
;
1349 LIST_ENTRY QueueListEntry
;
1350 PKTRAP_FRAME TrapFrame
;
1351 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1352 PVOID FirstArgument
;
1355 PVOID CallbackStack
;
1356 ULONG_PTR CallbackDepth
;
1359 PVOID CallbackStack
;
1361 #if (NTDDI_VERSION < NTDDI_LONGHORN) || ((NTDDI_VERSION < NTDDI_WIN7) && !defined(_WIN64)) // [
1364 #if (NTDDI_VERSION < NTDDI_LONGHORN) && defined(_WIN64) // [
1367 UCHAR ApcStateIndex
;
1368 #if (NTDDI_VERSION < NTDDI_LONGHORN) // [
1369 UCHAR IdealProcessor
;
1371 BOOLEAN ProcessReadyQueue
;
1376 BOOLEAN KernelStackResident
;
1379 SCHAR PriorityDecrement
;
1380 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1383 CHAR AdjustIncrement
;
1384 #if (NTDDI_VERSION >= NTDDI_WIN7)
1391 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1392 ULONG SystemCallNumber
;
1393 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1399 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1400 GROUP_AFFINITY UserAffinity
;
1401 struct _KPROCESS
*Process
;
1402 GROUP_AFFINITY Affinity
;
1403 ULONG IdealProcessor
;
1404 ULONG UserIdealProcessor
;
1406 KAFFINITY UserAffinity
;
1407 struct _KPROCESS
*Process
;
1410 PKAPC_STATE ApcStatePointer
[2];
1413 KAPC_STATE SavedApcState
;
1416 UCHAR SavedApcStateFill
[FIELD_OFFSET(KAPC_STATE
, UserApcPending
) + 1];
1417 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1427 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1430 UCHAR UserIdealProcessor
;
1432 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1433 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1436 UCHAR CalloutActive
;
1439 UCHAR CodePatchInProgress
;
1443 #if defined(_M_IX86) // [
1444 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1445 UCHAR OtherPlatformFill
;
1457 UCHAR SuspendApcFill0
[1];
1458 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1459 UCHAR ResourceIndex
;
1460 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1468 UCHAR SuspendApcFill1
[3];
1473 UCHAR SuspendApcFill2
[4];
1478 UCHAR SuspendApcFill3
[FIELD_OFFSET(KAPC
, SystemArgument1
)];
1479 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1487 UCHAR SuspendApcFill4
[FIELD_OFFSET(KAPC
, SystemArgument2
)]; // 40 / 72
1492 UCHAR SuspendApcFill5
[FIELD_OFFSET(KAPC
, Inserted
) + 1]; // 47 / 83
1493 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1508 KSEMAPHORE SuspendSemaphore
;
1511 UCHAR SuspendSemaphorefill
[FIELD_OFFSET(KSEMAPHORE
, Limit
) + 4]; // 20 / 28
1513 ULONG SListFaultCount
;
1518 ULONG SListFaultCount
;
1520 LIST_ENTRY ThreadListEntry
;
1521 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
1522 LIST_ENTRY MutantListHead
;
1524 PVOID SListFaultAddress
;
1525 #ifdef _M_AMD64 // [
1526 LONG64 ReadOperationCount
;
1527 LONG64 WriteOperationCount
;
1528 LONG64 OtherOperationCount
;
1529 LONG64 ReadTransferCount
;
1530 LONG64 WriteTransferCount
;
1531 LONG64 OtherTransferCount
;
1533 #if (NTDDI_VERSION >= NTDDI_WIN7) // [
1534 PKTHREAD_COUNTERS ThreadCounters
;
1535 PXSTATE_SAVE XStateSave
;
1536 #elif (NTDDI_VERSION >= NTDDI_LONGHORN) // ][
1537 PVOID MdlForLockedTeb
;
1541 #else // not (NTDDI_VERSION < NTDDI_WIN8)
1543 #if defined(_WIN64) && (NTDDI_VERSION < 0x06032580) // since WIN 8.1 Update1 6.3.9600.16384
1544 #define NUMBER_OF_LOCK_ENTRIES 5
1546 #define NUMBER_OF_LOCK_ENTRIES 6
1549 typedef struct _KTHREAD
1551 DISPATCHER_HEADER Header
;
1552 PVOID SListFaultAddress
;
1553 ULONG64 QuantumTarget
;
1555 volatile VOID
*StackLimit
;
1557 KSPIN_LOCK ThreadLock
;
1558 volatile ULONG64 CycleTime
;
1560 volatile ULONG HighCycleTime
;
1563 ULONG CurrentRunTime
;
1564 ULONG ExpectedRunTime
;
1566 XSAVE_FORMAT
* StateSaveArea
;
1567 struct _KSCHEDULING_GROUP
* SchedulingGroup
;
1568 KWAIT_STATUS_REGISTER WaitRegister
;
1570 BOOLEAN Alerted
[MaximumMode
];
1576 #if (NTDDI_VERSION < NTDDI_WIN10)
1577 ULONG KernelStackResident
: 1;
1579 ULONG AutoBoostActive
: 1;
1581 ULONG ReadyTransition
: 1;
1582 #if (NTDDI_VERSION < NTDDI_WIN10TH2)
1583 ULONG ProcessReadyQueue
: 1;
1585 ULONG ProcessReadyQueue
: 1;
1587 ULONG SystemAffinityActive
: 1;
1588 ULONG Alertable
: 1;
1589 #if (NTDDI_VERSION < NTDDI_WIN81)
1590 ULONG CodePatchInProgress
: 1;
1592 ULONG UserStackWalkActive
: 1;
1593 ULONG ApcInterruptRequest
: 1;
1594 ULONG QuantumEndMigrate
: 1;
1595 ULONG UmsDirectedSwitchEnable
: 1;
1596 ULONG TimerActive
: 1;
1597 ULONG SystemThread
: 1;
1598 ULONG ProcessDetachActive
: 1;
1599 ULONG CalloutActive
: 1;
1600 ULONG ScbReadyQueue
: 1;
1601 ULONG ApcQueueable
: 1;
1602 ULONG ReservedStackInUse
: 1;
1603 ULONG UmsPerformingSyscall
: 1;
1604 ULONG DisableStackCheck
: 1;
1605 ULONG Reserved
: 12;
1614 ULONG AutoAlignment
: 1;
1615 ULONG DisableBoost
: 1;
1616 ULONG UserAffinitySet
: 1;
1617 ULONG AlertedByThreadId
: 1;
1618 ULONG QuantumDonation
: 1;
1619 ULONG EnableStackSwap
: 1;
1620 ULONG GuiThread
: 1;
1621 ULONG DisableQuantum
: 1;
1622 ULONG ChargeOnlyGroup
: 1;
1623 ULONG DeferPreemption
: 1;
1624 ULONG QueueDeferPreemption
: 1;
1625 ULONG ForceDeferSchedule
: 1;
1626 ULONG ExplicitIdealProcessor
: 1;
1627 ULONG FreezeCount
: 1;
1628 #if (NTDDI_VERSION >= 0x060324D7) // since 6.3.9431.0
1629 ULONG TerminationApcRequest
: 1;
1631 #if (NTDDI_VERSION >= 0x06032580) // since 6.3.9600.16384
1632 ULONG AutoBoostEntriesExhausted
: 1;
1634 #if (NTDDI_VERSION >= 0x06032580) // since 6.3.9600.17031
1635 ULONG KernelStackResident
: 1;
1637 #if (NTDDI_VERSION >= NTDDI_WIN10)
1638 ULONG CommitFailTerminateRequest
: 1;
1639 ULONG ProcessStackCountDecremented
: 1;
1640 ULONG ThreadFlagsSpare
: 5;
1642 ULONG EtwStackTraceApcInserted
: 8;
1643 #if (NTDDI_VERSION < NTDDI_WIN10)
1644 ULONG ReservedFlags
: 10;
1650 #if (NTDDI_VERSION >= NTDDI_WIN10)
1652 UCHAR SystemHeteroCpuPolicy
;
1653 UCHAR UserHeteroCpuPolicy
: 7;
1654 UCHAR ExplicitSystemHeteroCpuPolicy
: 1;
1659 ULONG SystemCallNumber
;
1661 ULONG Spare1
; // Win 10: Spare10
1663 PVOID FirstArgument
;
1664 PKTRAP_FRAME TrapFrame
;
1668 KAPC_STATE ApcState
;
1671 UCHAR ApcStateFill
[RTL_SIZEOF_THROUGH_FIELD(KAPC_STATE
, UserApcPending
)]; // 32bit: 23/0x17, 64bit: 43/0x2B
1673 ULONG UserIdealProcessor
;
1678 ULONG ContextSwitches
;
1679 volatile UCHAR State
;
1680 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10074.0
1686 KPROCESSOR_MODE WaitMode
;
1689 volatile INT_PTR WaitStatus
;
1690 PKWAIT_BLOCK WaitBlockList
;
1693 LIST_ENTRY WaitListEntry
;
1694 SINGLE_LIST_ENTRY SwapListEntry
;
1698 #if (NTDDI_VERSION >= NTDDI_WIN8 /* 0x060223F0 */) // since 6.2.9200.16384
1699 ULONG64 RelativeTimerBias
;
1705 DECLSPEC_ALIGN(8) KWAIT_BLOCK WaitBlock
[THREAD_WAIT_OBJECTS
+ 1];
1709 UCHAR WaitBlockFill4
[FIELD_OFFSET(KWAIT_BLOCK
, SpareLong
)]; // 32bit: -, 64bit: 20/0x14
1710 ULONG ContextSwitches
;
1714 UCHAR WaitBlockFill5
[1 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareLong
)]; // 32bit: -, 64bit: 68/0x44
1716 #if (NTDDI_VERSION >= NTDDI_WIN10)
1726 UCHAR WaitBlockFill6
[2 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareLong
)]; // 32bit: -, 64bit: 116/0x74
1731 UCHAR WaitBlockFill7
[3 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SpareLong
)]; // 32bit: -, 64bit: 164/0xA4
1736 SHORT KernelApcDisable
;
1737 SHORT SpecialApcDisable
;
1739 ULONG CombinedApcDisable
;
1745 UCHAR WaitBlockFill8
[FIELD_OFFSET(KWAIT_BLOCK
, SparePtr
)]; // 32bit: 20/0x14, 64bit: 40/0x28
1746 struct _KTHREAD_COUNTERS
*ThreadCounters
;
1750 UCHAR WaitBlockFill9
[1 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SparePtr
)]; // 32bit: 44/0x2C, 64bit: 88/0x58
1751 PXSTATE_SAVE XStateSave
;
1755 UCHAR WaitBlockFill10
[2 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, SparePtr
)]; // 32bit: 68/0x44, 64bit: 136/0x88
1760 UCHAR WaitBlockFill11
[3 * sizeof(KWAIT_BLOCK
) + FIELD_OFFSET(KWAIT_BLOCK
, Object
)]; // 32bit: 88/0x58, 64bit: 176/0xB0
1762 struct _UMS_CONTROL_BLOCK
* Ucb
;
1763 struct _KUMS_CONTEXT_HEADER
* Uch
;
1770 SHORT KernelApcDisable
;
1771 SHORT SpecialApcDisable
;
1773 ULONG CombinedApcDisable
;
1780 PVOID TebMappedLowVa
;
1782 LIST_ENTRY QueueListEntry
;
1783 #if (NTDDI_VERSION >= 0x060223F0) // since 6.2.9200.16384
1786 ULONG NextProcessor
;
1789 ULONG NextProcessorNumber
: 31;
1790 ULONG SharedReadyQueue
: 1;
1795 ULONG NextProcessor
;
1796 ULONG DeferredProcessor
;
1802 GROUP_AFFINITY UserAffinity
;
1805 UCHAR UserAffinityFill
[FIELD_OFFSET(GROUP_AFFINITY
, Reserved
)]; // 32bit: 6/0x6, 64bit: 10/0x0A
1810 CHAR PriorityDecrement
;
1813 UCHAR ForegroundBoost
: 4;
1814 UCHAR UnusualBoost
: 4;
1819 CHAR AdjustIncrement
;
1823 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384
1824 ULONG_PTR AffinityVersion
;
1828 GROUP_AFFINITY Affinity
;
1831 UCHAR AffinityFill
[FIELD_OFFSET(GROUP_AFFINITY
, Reserved
)]; // 32bit: 6/0x6, 64bit: 10/0x0A
1832 UCHAR ApcStateIndex
;
1833 UCHAR WaitBlockCount
;
1834 ULONG IdealProcessor
;
1838 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384
1845 PKAPC_STATE ApcStatePointer
[2];
1850 KAPC_STATE SavedApcState
;
1853 UCHAR SavedApcStateFill
[FIELD_OFFSET(KAPC_STATE
, UserApcPending
) + 1]; // 32bit: 23/0x17, 64bit: 43/0x2B
1857 SHORT SListFaultCount
;
1866 UCHAR SchedulerApcFill0
[FIELD_OFFSET(KAPC
, SpareByte0
)]; // 32bit: 1/0x01, 64bit: 1/0x01
1867 UCHAR ResourceIndex
;
1871 UCHAR SchedulerApcFill1
[FIELD_OFFSET(KAPC
, SpareByte1
)]; // 32bit: 3/0x03, 64bit: 3/0x03
1876 UCHAR SchedulerApcFill2
[FIELD_OFFSET(KAPC
, SpareLong0
)]; // 32bit: 4/0x04, 64bit: 4/0x04
1881 UCHAR SuspendApcFill3
[FIELD_OFFSET(KAPC
, SystemArgument1
)]; // 32 bit:, 64 bit: 64/0x40
1886 UCHAR SchedulerApcFill4
[FIELD_OFFSET(KAPC
, SystemArgument2
)]; // 32 bit:, 64 bit: 72/0x48
1891 UCHAR SchedulerApcFill5
[FIELD_OFFSET(KAPC
, Inserted
) + 1]; // 32 bit:, 64 bit: 83/0x53
1892 UCHAR CallbackNestingLevel
;
1897 KEVENT SuspendEvent
;
1898 LIST_ENTRY ThreadListEntry
;
1899 LIST_ENTRY MutantListHead
;
1901 #if (NTDDI_VERSION >= NTDDI_WIN10)
1902 UCHAR AbEntrySummary
;
1903 UCHAR AbWaitEntryCount
;
1906 ULONG SecureThreadCookie
;
1908 #elif (NTDDI_VERSION >= NTDDI_WINBLUE) // 6.3.9431.0
1909 SINGLE_LIST_ENTRY LockEntriesFreeList
;
1912 #if (NTDDI_VERSION >= NTDDI_WINBLUE /* 0x06032580 */) // since 6.3.9600.16384
1913 KLOCK_ENTRY LockEntries
[NUMBER_OF_LOCK_ENTRIES
];
1914 SINGLE_LIST_ENTRY PropagateBoostsEntry
;
1915 SINGLE_LIST_ENTRY IoSelfBoostsEntry
;
1916 UCHAR PriorityFloorCounts
[16];
1917 ULONG PriorityFloorSummary
;
1918 volatile LONG AbCompletedIoBoostCount
;
1919 #if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
1920 LONG AbCompletedIoQoSBoostCount
;
1923 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10240.16384
1924 volatile SHORT KeReferenceCount
;
1926 volatile SHORT AbReferenceCount
;
1928 #if (NTDDI_VERSION >= 0x06040000) // since 6.4.9841.0
1929 UCHAR AbOrphanedEntrySummary
;
1930 UCHAR AbOwnedEntryCount
;
1932 UCHAR AbFreeEntryCount
;
1933 UCHAR AbWaitEntryCount
;
1935 ULONG ForegroundLossTime
;
1938 LIST_ENTRY GlobalForegroundListEntry
;
1941 SINGLE_LIST_ENTRY ForegroundDpcStackListEntry
;
1942 ULONG_PTR InGlobalForegroundList
;
1948 LONG64 ReadOperationCount
;
1949 LONG64 WriteOperationCount
;
1950 LONG64 OtherOperationCount
;
1951 LONG64 ReadTransferCount
;
1952 LONG64 WriteTransferCount
;
1953 LONG64 OtherTransferCount
;
1955 #if (NTDDI_VERSION >= NTDDI_WIN10) // since 10.0.10041.0
1956 struct _KSCB
*QueuedScb
;
1966 #define ASSERT_THREAD(object) \
1967 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ThreadObject))
1970 // Kernel Process (KPROCESS)
1972 typedef struct _KPROCESS
1974 DISPATCHER_HEADER Header
;
1975 LIST_ENTRY ProfileListHead
;
1976 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1977 ULONG_PTR DirectoryTableBase
;
1980 ULONG_PTR DirectoryTableBase
[2];
1982 #if defined(_M_IX86)
1983 KGDTENTRY LdtDescriptor
;
1984 KIDTENTRY Int21Descriptor
;
1987 #if defined(_M_IX86)
1991 volatile ULONG ActiveProcessors
;
1994 LIST_ENTRY ReadyListHead
;
1995 SINGLE_LIST_ENTRY SwapListEntry
;
1996 PVOID VdmTrapcHandler
;
1997 LIST_ENTRY ThreadListHead
;
1998 KSPIN_LOCK ProcessLock
;
2004 LONG AutoAlignment
:1;
2005 LONG DisableBoost
:1;
2006 LONG DisableQuantum
:1;
2007 LONG ReservedFlags
:29;
2020 KEXECUTE_OPTIONS Flags
;
2021 UCHAR ExecuteOptions
;
2024 LIST_ENTRY ProcessListEntry
;
2025 #if (NTDDI_VERSION >= NTDDI_LONGHORN) // [
2026 ULONGLONG CycleTime
;
2030 #define ASSERT_PROCESS(object) \
2031 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == ProcessObject))
2034 // System Service Table Descriptor
2036 typedef struct _KSERVICE_TABLE_DESCRIPTOR
2042 LONG TableBaseGpOffset
;
2045 } KSERVICE_TABLE_DESCRIPTOR
, *PKSERVICE_TABLE_DESCRIPTOR
;
2047 #if (NTDDI_VERSION >= NTDDI_WIN8)
2049 // Entropy Timing State
2051 typedef struct _KENTROPY_TIMING_STATE
2056 ULONG LastDeliveredBuffer
;
2057 PULONG RawDataBuffer
;
2058 } KENTROPY_TIMING_STATE
, *PKENTROPY_TIMING_STATE
;
2061 // Constants from ks386.inc, ksamd64.inc and ksarm.h
2063 #define KENTROPY_TIMING_INTERRUPTS_PER_BUFFER 0x400
2064 #define KENTROPY_TIMING_BUFFER_MASK 0x7ff
2065 #define KENTROPY_TIMING_ANALYSIS 0x0
2067 #endif /* (NTDDI_VERSION >= NTDDI_WIN8) */
2070 // Exported Loader Parameter Block
2072 extern struct _LOADER_PARAMETER_BLOCK NTSYSAPI
*KeLoaderBlock
;
2075 // Exported Hardware Data
2077 extern ULONG NTSYSAPI KiDmaIoCoherency
;
2078 extern ULONG NTSYSAPI KeMaximumIncrement
;
2079 extern ULONG NTSYSAPI KeMinimumIncrement
;
2080 extern ULONG NTSYSAPI KeDcacheFlushCount
;
2081 extern ULONG NTSYSAPI KeIcacheFlushCount
;
2082 extern ULONG_PTR NTSYSAPI KiBugCheckData
[];
2083 extern BOOLEAN NTSYSAPI KiEnableTimerWatchdog
;
2086 // Exported System Service Descriptor Tables
2088 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTable
[SSDT_MAX_ENTRIES
];
2089 extern KSERVICE_TABLE_DESCRIPTOR NTSYSAPI KeServiceDescriptorTableShadow
[SSDT_MAX_ENTRIES
];
2091 #endif // !NTOS_MODE_USER
2093 #endif // _KETYPES_H