Geoff Chappell, Software Analyst
The name KPRCB stands for (Kernel) Processor Control Block. The kernel keeps one KPRCB (formally a _KPRCB) for each logical processor as the Prcb member of the same processor’s KPCR. The KPRCB holds most of what the kernel needs ready access to while managing a processor and while managing resources that are themselves managed more simply (and quickly) per processor. Neither of these structures is formally documented. Both are highly specific to the processor architecture. This page concerns itself only with the KPRCB in 64-bit Windows for the processor architecture that’s variously named amd64 or x64. The x86 KPRCB is presented separately.
Kernel-mode code can easily find the KPRCB for whichever processor it’s executing on, by finding the current KPCR first. The latter is well-known to be accessible through the gs register. Its CurrentPrcb member points to the KPRCB without depending on it to be embedded in the KPCR. Given a C-language definition of the KPCR, getting the current processor’s KPRCB can be conveniently wrapped into one inline function:
FORCEINLINE KPRCB *KeGetCurrentPrcb (VOID) { return (KPRCB *) __readgsqword (FIELD_OFFSET (KPCR, CurrentPrcb)); }
which, less some dressing, is mostly how Microsoft’s own programmers have been doing it, apparently all along, as confirmed by the NTOSP.H that Microsoft published (possibly by oversight) in early editions of the Windows Driver Kit (WDK) for Windows 10.
The part of the KPCR that’s ahead of the embedded KPRCB is highly stable. Of particular importance is that the offset of the CurrentPrcb member is reliable over all Windows versions. The KPRCB that it points to is the Prcb member, and its offset too is stable over all versions. Members of the KPRCB are sometimes accessed through offsets from the KPCR. For some members, this is even the most usual access. Notably, the KeGetCurrentThread function is implemented very like
KTHREAD *KeGetCurrentThread (VOID) { return (KTHREAD *) __readgsqword (FIELD_OFFSET (KPCR, Prcb.CurrentThread)); }
both as exported and when inlined throughout the kernel. Of course, the computation shown here would require definition of the whole KPCR and at least some of KPRCB. As explained later, Microsoft has so far avoided both. Microsoft’s definition of KeGetCurrentThread in WDM.H doesn’t compute the offset symbolically, as above, but hard-codes it (to 0x0188). For all practical effect, this means that this offset with the KPRCB and the offset of the KPRCB within the KPCR are fixed in stone, if not forever, then for as long as old code that may have used the WDM.H definition is to run on new Windows versions. For other KPRCB members, offsets may be less stable, but accessing them relative to the containing KPCR is formalised in Microsoft’s assembly-language header KSAMD64.INC through such definitions as PcCurrentThread for this same offset that’s computed above.
In many cases, including KeGetCurrentThread, kernel-mode code that must access a KPRCB member does better to use the gs register and an offset from the KPCR. This is because the address that some such routine as KeGetCurrentPrcb obtains is merely the address of the KPRCB for the processor that the current thread was being run on at the time. It remains the address of the current KPRCB only while the thread can ensure it is not switched to another processor. Often the circumstances are such that it can’t be switched. But often is not always, even for the kernel’s own use. How much trouble has been caused by unsynchronised access to a KPRCB for some processor that the thread is no longer running on may be impossible to assess even roughly but I doubt it’s negligible.
Finding the KPRCB for an arbitrary processor is easy too in 64-bit Windows. Its kernel exports a function, named KeQueryPrcbAddress, that returns the address of the KPRCB for the processor that is represented by a given processor index.
The KPRCB is not documented. Microsoft’s first known disclosure of a C-language definition of the KPRCB for the x64 is in the NTOSP.H from early editions of the WDK for Windows 10. Publication of this header was possibly an oversight—Microsoft did not repeat it for the 1607 edition—and, anyway, its definition is incomplete. Comments at the start and end explain that what’s defined is just an “architecturally defined section” that “may be directly addressed by vendor/platform specific HAL code and will not change from version to version of NT.”
The practical equivalent of a C-language definition of the whole structure is available as type information in public symbol files for the kernel. Starting with Windows 8, these also tell that the type information came from compiling AMD64_X.H. Some symbol files, e.g., those for the HAL in Windows 7 and higher, have type information for only the architecturally defined section at the structure’s start. From these it is known that the incomplete definition is not only in NTOSP.H but also in NTHAL.H.
The KPRCB is highly variable. The layout changes not just from one version to another but even between builds. To save space and tedium, this article’s presentation of the variations refers to early and late builds of some versions, as defined in the following table of the structure’s varying size:
Version | Whole Structure | Architecturally Defined Section | NTHAL.H and NTOSP.H Definition |
---|---|---|---|
5.2 (starts from SP1) | 0x2480 | 0x0670 | |
early 6.0 (before SP1) | 0x3A20 | ||
late 6.0 | 0x3B20 | ||
6.1 | 0x4D00 | ||
6.2 | 0x5B80 | ||
6.3 | 0x5BC0 | ||
10.0 to 1607 | 0x6900 | ||
1703 | 0x6A40 | 0x06F0 | 0x06F0 |
1709 | 0x6980 | 0x0700 | |
1803 to 1809 | 0x7EC0 | ||
1903 | 0x8F00 | ||
2004 | 0xAF00 |
These sizes, and the names, types and offsets below, are mostly from Microsoft’s public symbols for the kernel. A few come instead from public symbols for other modules. These are needed for the incomplete definitions that some modules pick up from NTHAL.H or NTOSP.H. Before the 1709 release of Windows 10, these truly are just of the architecturally defined section. Later releases present two complications. First, although they have no members that reach beyond the architecturally defined section, they have unnamed alignment padding that does. Second, they do not have all the same members even within the architecturally defined section.
Please bear in mind that the KPRCB is among the largest of kernel-mode structures, not just in terms of size but of member count. There have been frequent rearrangements such that finding a good presentation can only ever be a work in progress.
The very start of the 64-bit KPRCB is relatively stable. It has long been subject to compatibility constraints because offsets for members have been published in the NTDDK.H file. When the processor Number was widened in place for Windows Vista, the NestingLevel moved further on. When Number was widened even further for Windows 7, it too moved further on, and the space it occupied was renamed, presumably so that it is never reassigned.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x00 |
ULONG MxCsr; |
all | |
0x04 |
UCHAR Number; |
5.2 only | |
USHORT Number; |
6.0 only | next at offset 0x24 | |
UCHAR LegacyNumber; |
6.1 and higher | ||
0x05 |
UCHAR NestingLevel; |
5.2 only | next at offset 0x20 |
UCHAR ReservedMustBeZero; |
6.1 and higher | ||
0x06 |
BOOLEAN InterruptRequest; |
all | |
0x07 |
BOOLEAN IdleHalt; |
all | |
0x08 |
KTHREAD *CurrentThread; |
all | |
0x10 |
KTHREAD *NextThread; |
all | |
0x18 |
KTHREAD *IdleThread; |
all |
Shifting the processor Number from offset 0x04 to widen it to 32 bits had special implications for compatibility because of the vast amounts of kernel-mode code, written not only by Microsoft, that accesses the 8-bit Number through the inline function KeGetCurrentProcessorNumber as defined for seemingly general use in the NTDDK.H from driver kits for versions before Windows 7 (and still defined if targetting those versions). This routine gets Number via the gs register, relying not only on its offset within the KPRCB but the offset of the KPRCB within the KPCR, the sum (0x0184) being hard-coded in the definition. Its replacement, KeGetCurrentProcessorIndex, is similarly hard-coded but to access the 32-bit Number at its new location. The kernel must maintain the LegacyNumber for as long as the old routine remains in use by drivers that might ever get loaded.
The other inline function that is declared in NTDDK.H for general use and which has a hard-coded offset from gs to a KPRCB member is KeGetCurrentThread. It, of course, reads CurrentThread.
There the hard constraints on moving members seem to end. The very next member even got moved out of the KPRCB. Of the space that was left by moving the 8-byte UserRsp to the KPCR in Windows Vista, only two bytes were immediately reused. The rest was left as padding that got reassigned little by little. The byte at offset 0x21 even got reused, unused and re-reused. The last byte of padding went away in Windows 10.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x20 (5.2) |
ULONG64 UserRsp; |
5.2 only | next at 0x10 in KPCR |
0x20 |
UCHAR NestingLevel; |
6.0 and higher | previously at 0x05 |
0x21 (6.0) |
UCHAR Group; |
6.0 only | next as USHORT at 0x0658 |
0x21 |
BOOLEAN ClockOwner; |
6.2 and higher | |
0x22 |
UCHAR PendingTick; |
6.2 only | |
union { UCHAR PendingTickFlags; struct { UCHAR PendingTick : 1; // 0x01 UCHAR PendingBackupTick : 1; // 0x02 }; }; |
6.3 and higher | ||
0x22 (6.0); 0x21 (6.1); 0x23 |
UCHAR PrcbPad00 [6]; |
6.0 only | |
UCHAR PrcbPad00 [3]; |
6.1 only | ||
UCHAR PrcbPad00 [1]; |
6.2 to 6.3 | ||
UCHAR IdleState; |
10.0 and higher | ||
0x24 |
ULONG Number; |
6.1 and higher | previously USHORT at 0x04 |
Much of the rest of the architecturally defined section is very nearly stable until Version 1703 moves the ProcessorState to the end of the architecturally defined section. This relocation of course shifts all members that followed, but they would have shifted anyway because the KPROCESSOR_STATE grew in this version—not from any internal change but just from rounding its size up to the next whole multiple of 0x40, presumably for cache alignment.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x28 |
ULONG64 RspBase; |
all | |
0x30 |
KSPIN_LOCK PrcbLock; |
all | |
0x38 |
KAFFINITY SetMember; |
5.2 to 6.0 | next as GroupSetMember at 0x0660 |
ULONG64 PrcbPad01; |
6.1 to 6.2 | ||
CHAR *PriorityState; |
6.3 and higher | ||
0x40 (5.2 to 1607) |
KPROCESSOR_STATE ProcessorState; |
5.2 to 1607 | next at 0x0100 |
0x05F0 (5.2 to 1607); 0x40 |
CHAR CpuType; |
all | |
0x05F1 (5.2 to 1607); 0x41 |
CHAR CpuID; |
all | |
0x05F2 (5.2 to 1607); 0x42 |
USHORT CpuStep; |
5.2 only | |
union { USHORT CpuStep; struct { UCHAR CpuStepping; UCHAR CpuModel; }; }; |
6.0 and higher | ||
0x05F4 (5.2 to 1607); 0x44 |
ULONG MHz; |
all | |
0x05F8 (5.2 to 1607); 0x48 |
ULONG64 HalReserved [8]; |
all | |
0x0638 (5.2 to 1607); 0x88 |
USHORT MinorVersion; |
all | |
0x063A (5.2 to 1607); 0x8A |
USHORT MajorVersion; |
all | |
0x063C (5.2 to 1607); 0x8C |
UCHAR BuildType; |
all | |
0x063D (5.2 to 1607); 0x8D |
UCHAR CpuVendor; |
all | |
0x063E (5.2 to 1607); 0x8E |
UCHAR InitialApicId; |
5.2 only | next as ULONG at 0x0650 |
UCHAR CoresPerPhysicalProcessor; |
6.0 and higher | ||
0x063F (5.2 to 1607); 0x8F |
UCHAR LogicalProcessorsPerPhysicalProcessor; |
5.2 only | |
UCHAR LogicalProcessorsPerCore; |
6.0 and higher |
The CpuType is what the processor manuals refer to as the family. In eax from cpuid leaf 1, bits 8 to 11 inclusive make a 4-bit family. If all four bits are set, then an 8-bit family is formed by adding the 4-bit family, i.e., 15, to the 8-bit extended family from bits 20 to 27. Though this complexity is defined by Intel, it is of course inherited from the early history of Windows on the x86 processor.
The CpuID is a boolean for whether the cpuid instruction is available. It is necessarily TRUE for x64 processors.
The CpuStepping and CpuModel are named straightforwardly from Intel’s manuals. The CpuStepping is bits 0 to 3 inclusive of eax from cpuid leaf 1. The CpuModel is bits 4 to 7 inclusive, except for two cases in which four high bits of the 8-bit CpuModel come from an extended model in bits 16 to 19. This use of the extended model is indicated if: the 4-bit family is 15; or it is 6 and the vendor is either GenuineIntel or, in version 6.2 and higher, CentaurHauls.
Vendor identification is from the vendor string that is produced by what the cpuid instruction’s leaf 0 returns in ebx, edx and ecx. This string is retained as the VendorString much further into the KPRCB. The CpuVendor is a convenient interpretation. It takes its values from the CPU_VENDORS enumeration.
Insertion of explicit padding (PrcbPad04, below) when Version 1703 moved the ProcessorState suggests that what had been the last 0x30 bytes of the architecturally defined section had been intended to be cache-aligned, for their own purpose, not just for positioning the LockQueue that starts the non-architectural section.
Offset | Definition | Versions |
---|---|---|
0x90 |
ULONG64 TscFrequency; |
1903 and higher |
0x90 (1703 to 1809); 0x98 |
ULONG64 PrcbPad04 [6]; |
1703 to 1809 |
ULONG64 PrcbPad04 [5]; |
1903 and higher |
Until moving the ProcessorState required the architecturally defined section to grow, some trouble seems to have been taken to keep the remainder to 0x30 bytes even when reworking it heavily for Windows 8.1. An initially 8-bit CFlushSize was followed by padding (PrcbPad0x) that accounts explicitly for the next member’s alignment. This padding went away when CFlushSize was widened in-place. An initial 32 bytes of padding (as PrcbPad00) completed the architecturally defined section in a way that satisfies the peculiar cache-alignment requirement of the LockQueue. As some of this padding was brought into use, it shifted and shrank (as PrcbPad01), until by version 6.1 it was no longer needed—given 8-byte alignment of whatever follows. Therein lay a problem. Placement of the small Group and GroupIndex on 8-byte boundaries left 13 bytes of unused alignment space. This had to be reorganised for Windows 8.1 to squeeze in ParentNode from (much) further into the structure. Bringing in ScbOffset from further into the structure for Windows 10 then seems to have prompted a reordering of ApicMask, CFlushSize, AcpiReserved and InitialApicId. The four bytes of alignment space that this left unused was labelled explicitly as padding (PrcbPad10) until Version 1709 found a use for it.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x0640 (6.3 to 1607); 0xC0 |
KNODE *ParentNode; |
6.3 and higher | cache-aligned; previously at 0x5338 |
0x0648 (6.3 to 1607); 0xC8 |
KAFFINITY GroupSetMember; |
6.3 and higher | previously at 0x0660 |
0x0650 (6.3 to 1607); 0xD0 |
UCHAR Group; |
6.3 and higher | previously USHORT at 0x0658 |
0x0651 (6.3 to 1607); 0xD1 |
UCHAR GroupIndex; |
6.3 and higher | previously at 0x0668 |
0x0652 (6.3 to 1607); 0xD2 |
UCHAR PrcbPad05 [2]; |
6.3 and higher | |
0x0654 (10.0 to 1607); 0xD4 |
ULONG InitialApicId; |
10.0 and higher | previously at 0x0668 |
0x0658 (10.0 to 1607); 0xD8 |
ULONG ScbOffset; |
10.0 and higher | previously at 0x0531C |
0x0640 (5.2 to 6.2); 0x0654 (6.3); 0x065C (10.0 to 1607); 0xDC |
ULONG ApicMask; |
all | |
0x0644 (5.2 to 6.2); 0x0658 (6.3) |
UCHAR CFlushSize; |
5.2 only | |
ULONG CFlushSize; |
6.0 to 6.3 | next at 0x0668 | |
0x0645 (5.2) |
UCHAR PrcbPad0x [3]; |
5.2 only | |
0x0648 (5.2 to 6.2); 0x0660 (6.3 to 1607); 0xE0 |
PVOID AcpiReserved; |
all | |
0x0650 (6.0 to 6.2); 0x0668 (6.3) |
ULONG InitialApicId; |
6.0 to 6.3 | previously UCHAR at 0x063E; next at 0x0654 |
0x0654 (6.0 to 6.2) |
ULONG Stride; |
6.0 to 6.2 | |
0x0650 (5.2); 0x0658 (6.0) |
ULONG64 PrcbPad00 [4]; |
5.2 only | |
ULONG64 PrcbPad01 [3]; |
6.0 only | ||
0x0658 (6.1 to 6.2) |
USHORT Group; |
6.1 to 6.2 | previously UCHAR at 0x21; next as UCHAR at 0x0650 |
0x0660 (6.1 to 6.2) |
KAFFINITY GroupSetMember; |
6.1 to 6.2 | previously as SetMember at 0x38; next at 0x0648 |
0x0668 (6.1 to 6.2) |
UCHAR GroupIndex; |
6.1 to 6.2 | next at 0x0651 |
0x0668 (10.0 to 1607); 0xE8 |
ULONG CFlushSize; |
10.0 and higher | previously at 0x0658 |
0x066C (10.0 to 1607); 0xEC |
ULONG PrcbPad10; |
10.0 to 1703 | |
union { LONG volatile BamFlags; struct { ULONG BamQosLevel : 2; // 0x00000003 ULONG PendingQosUpdate : 2; // 0x0000000C ULONG BamFlagsReserved : 28; }; }; |
1709 only | ||
KPRCBFLAG PrcbFlags; |
1803 and higher (full) |
The reordering for Windows 10 seems to have troubled someone at Microsoft. The mostly unpublished NTOSP.H has a C_ASSERT to enforce at compile-time that AcpiReserved is at offset 0x0660, specifically, and then the comment “Do not move field”. That’s for Windows 10. Was the offset changed for Windows 8.1 despite some earlier comment (for the old offset) or was the comment added after? Now that the offset has changed yet again, have the assertion and comment changed too?
The BamFlags in the last four bytes only appear to be short-lived. They survive in the PrcbFlags. The Background Activity Moderator (BAM) is new to both 32-bit and 64-bit Windows in the 1709 release, but only the 64-bit implementation has these flags at first. Formalising the bit fields into their own type also moved their definition in a separate header (ntosdef.h) that is independent of the processor architecture, but there may be more to this than mere tidiness. Notably, the new PrcbFlags are excluded from the NTHAL.H and NTOSP.H definitions. In these, the PrcbFlags are just unnamed alignment space.
Moving the ProcessorState for explicit cache-line alignment in Version 1703 created another 0x10 bytes of alignment space immediately before the new position. This is defined explicitly as PrcbPad11, below, even after Version 1803 starts using it. The reduced KPRCB definition in NTHAL.H and NTOSP.H sees nothing of this new use, just the padding.
Offset | Definition | Versions |
---|---|---|
0xF0 |
ULONG64 PrcbPad11 [2]; |
1703 to 1709; 1803 and higher (reduced) |
union { struct { /* changing members, follow link */ }; ULONG64 PrcbPad11 [2]; }; |
1803 and higher (full) |
Relocating the ProcessorState to what was then the end of the architecturally defined section also created 0x30 bytes of padding to satisfy the peculiar alignment requirement for the LockQueue at the start of the non-architectural section. This too is defined explicitly (as PrcbPad12, below). As parts of it have been brought into use, there is again a difference between the two KPRCB definitions.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x0100 |
KPROCESSOR_STATE ProcessorState; |
1703 and higher | cache-aligned; previously at 0x40 |
0x06C0 |
XSAVE_AREA_HEADER *ExtendedSupervisorState; |
1803 and higher | |
0x06C8 |
ULONG ProcessorSignature; |
1803 only (reduced); 1809 and higher |
|
0x06CC |
ULONG PrcbPad11a; |
1803 only (reduced) | |
ULONG ProcessorFlags; |
1809 and higher | ||
0x06D0 |
ULONG64 PrcbPad12a; |
1809 and higher (reduced) | |
union { struct { /* changing members, follow link */ }; ULONG64 PrcbPad12a; }; |
1809 and higher (full) | ||
0x06C0 (1703 to 1709); 0x06C8 (1803, full); 0x06D0 (1803, reduced); 0x06D8 |
ULONG64 PrcbPad12 [6]; |
1703 to 1709 | |
ULONG64 PrcbPad12 [5]; |
1803 only (full) | ||
ULONG64 PrcbPad12 [4]; |
1803 only (reduced) | ||
ULONG64 PrcbPad12 [3]; |
1809 and higher |
For reasons not yet understood, the reduced definition has ProcessorSignature before it was yet in the full definition. No use is yet known of it in the 1803 release: evidently, more study is required!
From here onwards, the KPRCB does indeed seem to be private to the kernel. In contrast to 32-bit Windows, not even the HAL is known to use anything beyond the architecturally defined section.
Functions such as KeAcquireQueuedSpinLock that operate on the per-processor spin lock queues are exported from the HAL (originally) in 32-bit Windows but have always been kernel exports in 64-bit Windows. Another difference from 32-bit Windows is that the LockQueue is outside the architecturally defined section: the kernel itself accesses the LockQueue via the LockArray pointer in the KPCR.
Offset | Definition | Versions |
---|---|---|
0x0670 (5.2 to 1607); 0x06F0 |
KSPIN_LOCK_QUEUE LockQueue [0x21]; |
5.2 to early 6.0 |
KSPIN_LOCK_QUEUE LockQueue [0x31]; |
late 6.0 | |
KSPIN_LOCK_QUEUE LockQueue [0x11]; |
6.1 and higher |
The LockQueue array is indexed by members of the enumeration KSPIN_LOCK_QUEUE_NUMBER, which is defined first in NTDDK.H and then in WDM.H (starting with the WDK for Windows Vista). As with 32-bit Windows, the array is positioned such that its second element is cache-aligned. This is plainly by design. Caching is important to the 64-bit implementation, whose KeReleaseQueuedSpinLock has always prefetched its selected element. Why the first element should be in a separate cache line from the second is not known.
Broadly speaking, there are two separate types of per-processor lookaside lists. First come the system lookaside lists. Each caches a different fixed-size structure that has a very specific purpose represented by the list’s index, which takes it values from the undocumented PP_NPAGED_LOOKASIDE_NUMBER enumeration.
Offset | Definition | Versions |
---|---|---|
0x0880 (5.2 to early 6.0); 0x0980 (late 6.0); 0x0780 (6.1 to 1607); 0x0800 |
PP_LOOKASIDE_LIST PPLookasideList [0x10]; |
all |
The undocumented PP_LOOKASIDE_LIST structure is a pair of pointers, P and L, to the actual lookaside lists. Ideally, they point to separate lists: the first just for the processor; the second shared. Allocations are sought first from the per-processor list, for speed, else from the shared. Allocations are freed to the per-processor list for easy re-allocation, except that if that list has reached its capacity the allocation is instead freed to the shared list.
The remaining arrays help with the efficiency of small allocations from various types of pool (NonPagedPool, PagedPool and, in version 6.2 and higher, NonPagedPoolNx). The purpose of the allocation is arbitrary. What matters is just the size: successive lists in the array are for successively larger sizes of allocation, from 0x10 to 0x0200, in increments of 0x10.
Offset | Definition | Versions |
---|---|---|
0x0880 (6.2 to 1607); 0x0900 |
GENERAL_LOOKASIDE_POOL PPNxPagedLookasideList [0x20]; |
6.2 and higher |
0x0980 (5.2 to early 6.0); 0x0A80 (late 6.0); 0x0880 (6.1); 0x1480 (6.2 to 1607); 0x1500 |
PP_LOOKASIDE_LIST PPNPagedLookasideList [0x20]; |
5.2 only |
GENERAL_LOOKASIDE_POOL PPNPagedLookasideList [0x20]; |
6.0 and higher | |
0x0B80 (5.2); 0x1580 (early 6.0); 0x1680 (late 6.0); 0x1480 (6.1); 0x2080 (6.2 to 1607); 0x2100 |
PP_LOOKASIDE_LIST PPPagedLookasideList [0x20]; |
5.2 only |
GENERAL_LOOKASIDE_POOL PPPagedLookasideList [0x20]; |
6.0 and higher |
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x0D80 (5.2); 0x2180 (early 6.0); 0x2280 (late 6.0); 0x2080 (6.1); 0x2C80 (6.2 to 1607); 0x2D00 |
ULONG64 volatile PacketBarrier; |
5.2 to 6.1 | next as LONG volatile at 0x2D00 |
ULONG64 PrcbPad20; |
6.2 to 1903 | ||
ULONG64 MsrIa32TsxCtrl; |
2004 and higher | ||
0x0D88 (5.2); 0x2188 (early 6.0); 0x2288 (late 6.0); 0x2088 (6.1); 0x2C88 (6.2 to 1607); 0x2D08 |
SINGLE_LIST_ENTRY DeferredReadyListHead; |
all | |
0x0D90 (5.2); 0x2190 (early 6.0); 0x2290 (late 6.0); 0x2090 (6.1); 0x2C90 (6.2 to 1607); 0x2D10 |
LONG volatile MmPageFaultCount; |
all | |
0x0D94 (5.2); 0x2194 (early 6.0); 0x2294 (late 6.0); 0x2094 (6.1); 0x2C94 (6.2 to 1607); 0x2D14 |
LONG volatile MmCopyOnWriteCount; |
all | |
0x0D98 (5.2); 0x2198 (early 6.0); 0x2298 (late 6.0); 0x2098 (6.1); 0x2C98 (6.2 to 1607); 0x2D18 |
LONG volatile MmTransitionCount; |
all | |
0x0D9C (5.2) |
LONG volatile MmCacheTransitionCount; |
5.2 only | next as ULONG at 0x3768 |
0x0DA0 (5.2); 0x219C (early 6.0); 0x229C (late 6.0); 0x209C (6.1); 0x2C9C (6.2 to 1607); 0x2D1C |
LONG volatile MmDemandZeroCount; |
all | |
0x0DA4 (5.2); 0x21A0 (early 6.0); 0x22A0 (late 6.0); 0x20A0 (6.1); 0x2CA0 (6.2 to 1607); 0x02D20 |
LONG volatile MmPageReadCount; |
all | |
0x0DA8 (5.2); 0x21A4 (early 6.0); 0x22A4 (late 6.0); 0x20A4 (6.1); 0x2CA4 (6.2 to 1607); 0x2D24 |
LONG volatile MmPageReadIoCount; |
all | |
0x0DAC (5.2) |
LONG volatile MmCacheReadCount; |
5.2 only | next as ULONG at 0x376C |
0x0DB0 (5.2) |
LONG volatile MmCacheIoCount; |
5.2 only | next as ULONG at 0x3770 |
0x0DB4 (5.2); 0x21A8 (early 6.0); 0x22A8 (late 6.0); 0x20A8(6.1); 0x2CA8 (6.2 to 1607); 0x2D28 |
LONG volatile MmDirtyPagesWriteCount; |
all | |
0x0DB8 (5.2); 0x21AC (early 6.0); 0x22AC (late 6.0); 0x20AC (6.1); 0x2CAC (6.2 to 1607); 0x2D2C |
LONG volatile MmDirtyWriteIoCount; |
all | |
0x0DBC (5.2); 0x21B0 (early 6.0); 0x22B0 (late 6.0); 0x20B0 (6.1); 0x2CB0 (6.2 to 1607); 0x2D30 |
LONG volatile MmMappedPagesWriteCount; |
all | |
0x0DC0 (5.2); 0x21B4 (early 6.0); 0x22B4 (late 6.0); 0x20B4 (6.1); 0x2CB4 (6.2 to 1607); 0x2D34 |
LONG volatile MmMappedWriteIoCount; |
all | |
0x0DC4 (5.2) |
LONG LookasideIrpFloat; |
5.2 only | next at 0x21D8 |
0x0DC8 (5.2); 0x21B8 (early 6.0); 0x22B8 (late 6.0); 0x20B8 (6.1); 0x2CB8 (6.2 to 1607); 0x2D38 |
ULONG KeSystemCalls; |
all | |
0x21BC (early 6.0); 0x22BC (late 6.0); 0x20BC (6.1); 0x2CBC (6.2 to 1607); 0x2D3C |
ULONG KeContextSwitches; |
6.0 and higher | previously at 0x0DF0 |
0x2CC0 (6.3 to 1607) |
USHORT LdtSelector; |
6.3 to 1607 | |
0x2CC2 (6.3 to 1607); 0x2D40 |
USHORT PrcbPad40; |
6.3 to 1607 | |
ULONG PrcbPad40; |
1703 and higher | ||
0x21C0 (early 6.0); 0x22C0 (late 6.0); 0x20C0 (6.1); 0x2CC0 (6.2); 0x2CC4 (6.3 to 1607); 0x2D44 |
ULONG CcFastReadNoWait; |
6.0 and higher | previously at 0x2280 |
0x21C4 (early 6.0); 0x22C4 (late 6.0); 0x20C4 (6.1); 0x2CC4 (6.2); 0x2CC8 (6.3 to 1607); 0x2D48 |
ULONG CcFastReadWait; |
6.0 and higher | previously at 0x2284 |
0x21C8 (early 6.0); 0x22C8 (late 6.0); 0x20C8 (6.1); 0x2CC8 (6.2); 0x2CCC (6.3 to 1607); 0x2D4C |
ULONG CcFastReadNotPossible; |
6.0 and higher | previously at 0x2288 |
0x21CC (early 6.0); 0x22CC (late 6.0); 0x20CC (6.1); 0x2CCC (6.2); 0x2CD0 (6.3 to 1607); 0x2D50 |
ULONG CcCopyReadNoWait; |
6.0 and higher | previously at 0x228C |
0x21D0 (early 6.0); 0x22D0 (late 6.0); 0x20D0 (6.1); 0x2CD0 (6.2); 0x2CD4 (6.3 to 1607); 0x2D54 |
ULONG CcCopyReadWait; |
6.0 and higher | previously at 0x2290 |
0x21D4 (early 6.0); 0x22D4 (late 6.0); 0x20D4 (6.1); 0x2CD4 (6.2); 0x2CD8 (6.3 to 1607); 0x2D58 |
ULONG CcCopyReadNoWaitMiss; |
6.0 and higher | previously at 0x2294 |
0x21D8 (early 6.0); 0x22D8 (late 6.0); 0x20D8 (6.1); 0x2CD8 (6.2) |
LONG LookasideIrpFloat; |
6.0 to 6.2 | previously at 0x0DC4; next at 0x2D1C |
0x0DCC (5.2); 0x21DC (early 6.0); 0x22DC (late 6.0); 0x20DC (6.1); 0x2CDC (6.2 to 1607); 0x2D5C |
LONG volatile IoReadOperationCount; |
all | |
0x0DD0 (5.2); 0x21E0 (early 6.0); 0x22E0 (late 6.0); 0x20E0 (6.1); 0x2CE0 (6.2 to 1607); 0x2D60 |
LONG volatile IoWriteOperationCount; |
all | |
0x0DD4 (5.2); 0x21E4 (early 6.0); 0x22E4 (late 6.0); 0x20E4 (6.1); 0x2CE4 (6.2 to 1607); 0x2D64 |
LONG volatile IoOtherOperationCount; |
all | |
0x0DD8 (5.2); 0x21E8 (early 6.0); 0x22E8 (late 6.0); 0x20E8 (6.1); 0x2CE8 (6.2 to 1607); 0x2D68 |
LARGE_INTEGER IoReadTransferCount; |
all | |
0x0DE0 (5.2); 0x21F0 (early 6.0); 0x22F0 (late 6.0); 0x20F0 (6.1); 0x2CF0 (6.2 to 1607); 0x2D70 |
LARGE_INTEGER IoWriteTransferCount; |
all | |
0x0DE8 (5.2); 0x21F8 (early 6.0); 0x22F8 (late 6.0); 0x20F8 (6.1); 0x2CF8 (6.2 to 1607); 0x2D78 |
LARGE_INTEGER IoOtherTransferCount; |
all | |
0x0DF0 (5.2) |
ULONG KeContextSwitches; |
5.2 only | next at 0x21BC |
0x0DF4 (5.2) |
UCHAR PrcbPad2 [0x0C]; |
5.2 only |
Cache-alignment again seeems deliberate, at least in version 5.2.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x2D00 (6.2 to 1607); 0x2D80 |
LONG volatile PacketBarrier; |
6.2 and higher | cache-aligned; previously ULONG64 volatile at 0x2080 |
0x0E00 (5.2); 0x2200 (early 6.0); 0x2300 (late 6.0); 0x2100 (6.1); 0x2D04 (6.2 to 1607); 0x2D84 |
ULONG64 volatile TargetSet; |
5.2 to 6.0 | cache-aligned |
LONG volatile TargetCount; |
6.1 and higher | ||
0x0E08 (5.2); 0x2208 (early 6.0); 0x2308 (late 6.0); 0x2104 (6.1); 0x2D08 (6.2 to 1607); 0x2D88 |
ULONG volatile IpiFrozen; |
all | |
0x0E0C (5.2); 0x220C (early 6.0); 0x230C (late 6.0) |
UCHAR PrcbPad3 [0x74]; |
5.2 to 6.0 |
Note the substantial padding in the early versions, not just to the next cache line but to the one after (perhaps anticipating 128-byte cache lines). These versions have a REQUEST_MAILBOX for each of the 64 possible processors. For Windows 7 to support more, the array was moved to the very end of the KPRCB.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x0E80 (5.2); 0x2280 (early 6.0); 0x2380 (late 6.0) |
REQUEST_MAILBOX RequestMailbox [0x40]; |
5.2 to 6.0 | cache-aligned; next at 0x4C80 |
0x1E80 (5.2); 0x3280 (early 6.0); 0x3380 (late 6.0) |
ULONG64 volatile SenderSummary; |
5.2 to 6.0 | cache-aligned |
0x1E88 (5.2); 0x3288 (early 6.0); 0x3388 (late 6.0) |
UCHAR PrcbPad4 [0x78]; |
5.2 to 6.0 |
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x2D0C (6.2) |
ULONG PrcbPad40 [0x1D]; |
6.2 only | |
0x2D8C |
ULONG PrcbPad30; |
1709 and higher | |
0x2D10 (6.3 to 1607); 0x2D90 |
PVOID IsrDpcStats; |
6.3 and higher | |
0x2D18 (6.3 to 1607); 0x2D98 |
ULONG DeviceInterrupts; |
6.3 and higher | |
0x2D1C (6.3 to 1607); 0x2D9C |
LONG LookasideIrpFloat; |
6.3 and higher | previously at 0x2CD8 |
0x2D20 (6.3 to 1607); 0x2DA0 |
ULONG InterruptLastCount; |
6.3 and higher | previously at 0x2DF8 |
0x2D24 (6.3 to 1607); 0x2DA4 |
ULONG InterruptRate; |
6.3 and higher | previously at 0x2DFC |
0x2D28 (1607); 0x2DA8 |
ULONG64 LastNonHrTimerExpiration; |
1607 to 1903 | |
ULONG64 PrcbPad31; |
2004 and higher | ||
0x2DB0 |
KPRCB *PairPrcb; |
1809 and higher | |
0x2DB8 |
KSTATIC_AFFINITY_BLOCK StaticAffinity; |
2004 and higher | |
0x2DB0 (1709 to 1803); 0x2DB8 (1809 to 1903); 0x3058 |
ULONG64 PrcbPad35 [2]; |
1709 to 1803 | |
ULONG64 PrcbPad35 [1]; |
1809 to 1903 | ||
ULONG64 PrcbPad35 [5]; |
2004 and higher | ||
0x2DC0 (1709 to 1903); 0x3080 |
SLIST_HEADER InterruptObjectPool; |
1709 and higher | cache-aligned; previously at 0x60E0 |
0x3090 |
RTL_HASH_TABLE *DpcRuntimeHistoryHashTable; |
2004 and higher | |
0x3098 |
KPDC *DpcRuntimeHistoryHashTableCleanupDpc; |
2004 and higher | |
0x30A0 |
KDEFERRED_ROUTINE *CurrentDpcRoutine; |
2004 and higher | |
0x30A8 |
ULONG64 CurrentDpcRuntimeHistoryCached; |
2004 and higher | |
0x30B0 |
ULONG64 CurrentDpcStartTime; |
2004 and higher | |
0x2D28 (6.3 to 1511); 0x2D30 (1607); 0x2DB0 (1703); 0x2DD0 (1709 to 1903); 0x30B8 |
ULONG PrcbPad41 [0x16]; |
6.3 to 1511 | |
ULONG PrcbPad41 [0x14]; |
1607 to 1703 | ||
ULONG64 PrcbPad41 [6]; |
1709 to 1903 | ||
ULONG64 PrcbPad41 [1]; |
2004 and higher | ||
0x1F00 (5.2); 0x3300 (early 6.0); 0x3400 (late 6.0); 0x2180 (6.1); 0x2D80 (6.2 to 1607); 0x2E00 (1703 to 1903); 0x30C0 |
KDPC_DATA DpcData [2]; |
all | cache-aligned |
0x1F40 (5.2); 0x3340 (early 6.0); 0x3440 (late 6.0); 0x21C0 (6.1); 0x2DC0 (6.2); 0x2DD0 (6.3 to 1607); 0x2E50 (1703 to 1903); 0x3110 |
PVOID DpcStack; |
all | |
0x1F48 (5.2); 0x3348 (early 6.0); 0x3448 (late 6.0) |
PVOID SavedRsp; |
5.2 to early 6.0 | |
PVOID SparePtr0; |
late 6.0 only | ||
0x1F50 (5.2); 0x3350 (early 6.0); 0x3450 (late 6.0); 0x21C8 (6.1); 0x2DC8 (6.2); 0x2DD8 (6.3 to 1607); 0x2E58 (1703 to 1903); 0x3118 |
LONG MaximumDpcQueueDepth; |
all | |
0x1F54 (5.2); 0x3354 (early 6.0); 0x3454 (late 6.0); 0x21CC (6.1); 0x2DCC (6.2); 0x2DDC (6.3 to 1607); 0x2E5C (1703 to 1903); 0x311C |
ULONG DpcRequestRate; |
all | |
0x1F58 (5.2); 0x3358 (early 6.0); 0x3458 (late 6.0); 0x21D0 (6.1); 0x2DD0 (6.2); 0x2DE0 (6.3 to 1607); 0x2E60 (1703 to 1903); 0x3120 |
ULONG MinimumDpcRate; |
all | |
0x1F5C (5.2); 0x335C (early 6.0); 0x345C (late 6.0) |
BOOLEAN volatile DpcInterruptRequested; |
5.2 to 6.0 | |
0x1F5D (5.2); 0x335D (early 6.0); 0x345D (late 6.0) |
BOOLEAN volatile DpcThreadRequested; |
5.2 to 6.0 | |
0x1F5E (5.2); 0x335E (early 6.0); 0x345E (late 6.0) |
BOOLEAN volatile DpcRoutineActive; |
5.2 to 6.0 | next at 0x21DA |
0x1F5F (5.2); 0x335F (early 6.0); 0x345F (late 6.0) |
BOOLEAN volatile DpcThreadActive; |
5.2 to 6.0 | next as bit at 0x21DC |
0x1F60 (5.2); 0x3360 (early 6.0); 0x3460 (late 6.0) |
union { ULONG64 volatile TimerHand; ULONG64 volatile TimerRequest; }; |
5.2 to 6.0 | next as ULONG volatile at 0x21E0 |
0x1F68 (5.2); 0x3368 (early 6.0); 0x3468 (late 6.0) |
LONG TickOffset; |
5.2 to 6.0 | next as ULONG64 at 0x4470 |
0x1F6C (5.2); 0x336C (early 6.0); 0x346C (late 6.0) |
LONG MasterOffset; |
5.2 to 6.0 | next at 0x21E4 |
0x1F70 (5.2); 0x3370 (early 6.0); 0x3470 (late 6.0); 0x21D4 (6.1); 0x2DD4 (6.2); 0x2DE4 (6.3 to 1607); 0x2E64 (1703 to 1903); 0x3124 |
ULONG DpcLastCount; |
all | |
0x1F74 (5.2); 0x3374 (early 6.0); 0x3474 (late 6.0); 0x21D8 (6.1); 0x2DD8 (6.2); 0x2DE8 (6.3 to 1607); 0x2E68 (1703 to 1903); 0x3128 |
BOOLEAN ThreadDpcEnable; |
all | |
0x1F75 (5.2); 0x3375 (early 6.0); 0x3475 (late 6.0); 0x21D9 (6.1); 0x2DD9 (6.2); 0x2DE9 (6.3 to 1607); 0x2E69 (1703 to 1903); 0x3129 |
BOOLEAN volatile QuantumEnd; |
all | |
0x1F76 (5.2); 0x3376 (early 6.0); 0x3476 (late 6.0); 0x21DA (6.1); 0x2DDA (6.2); 0x2DEA (6.3 to 1607); 0x2E6A (1703 to 1903); 0x312A |
UCHAR PrcbPad50; |
5.2 to 6.0 | |
BOOLEAN volatile DpcRoutineActive; |
6.1 and higher | previously at 0x345E | |
0x1F77 (5.2); 0x3377 (early 6.0); 0x3477 (late 6.0); 0x21DB (6.1); 0x2DDB (6.2); 0x2DEB (6.3 to 1607); 0x2E6B (1703 to 1903); 0x312B |
BOOLEAN volatile IdleSchedule; |
all | |
0x1F78 (5.2); 0x3378 (early 6.0); 0x3478 (late 6.0); 0x21DC (6.1); 0x2DDC (6.2); 0x2DEC (6.3 to 1607); 0x2E6C (1703 to 1903); 0x312C |
LONG DpcSetEventRequest; |
5.2 to 6.0 | |
union { LONG volatile DpcRequestSummary; SHORT DpcRequestSlot [2]; /* changing members, follow link */ }; |
6.1 and higher |
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x1F7C (5.2); 0x337C (early 6.0); 0x347C (late 6.0); 0x21E0 (6.1); 0x2DE0 (6.2); 0x2DF0 (6.3 to 1607); 0x2E70 (1703 to 1903); 0x3130 |
LONG PrcbPad40; |
5.2 only | |
ULONG KeExceptionDispatchCount; |
6.0 only | previously at 0x22A0; next at 0x4734 |
|
ULONG volatile TimerHand; |
6.1 only | previously ULONG64 volatile in union at 0x3460 | |
ULONG LastTimerHand; |
6.2 to 1903 | ||
ULONG PrcbPad93; |
2004 and higher | ||
0x1F80 (5.2) |
PVOID DpcThread; |
5.2 only | |
0x1F88 (5.2); 0x3380 (early 6.0); 0x3480 (late 6.0); 0x21E4 (6.1) |
KEVENT DpcEvent; |
5.2 to 6.0 | |
LONG MasterOffset; |
6.1 only | previously at 0x346C | |
0x21E8 (6.1); 0x2DE4 (6.2); 0x2DF4 (6.3 to 1607); 0x2E74 (1703 to 1903); 0x3134 |
ULONG LastTick; |
6.1 and higher | |
0x21EC (6.1) |
ULONG UnusedPad; |
6.1 only | |
0x2DE8 (6.2); 0x2DF8 (6.3 to 1607); 0x2E78 (1703 to 1903); 0x3138 |
ULONG ClockInterrupts; |
6.2 and higher | |
0x2DEC (6.2); 0x2DFC (6.3 to 1607); 0x2E7C (1703 to 1903); 0x313C |
ULONG ReadyScanTick; |
6.2 and higher | |
0x2DF0 (6.2) |
UCHAR BalanceState; |
6.2 only | |
0x21F0 (6.1); 0x2DF1 (6.2) |
ULONG64 PrcbPad50 [2]; |
6.1 only | |
UCHAR PrcbPad50 [7]; |
6.2 only | ||
0x2DF8 (6.2) |
ULONG InterruptLastCount; |
6.2 only | next at 0x2D20 |
0x2DFC (6.2) |
ULONG InterruptRate; |
6.2 only | next at 0x2D24 |
0x2E00 (10.0 to 1607); 0x2E80 (1703 to 1903); 0x3140 |
PVOID InterruptObject [0x0100]; |
10.0 and higher | cache-aligned |
0x2200 (6.1); 0x2E00 (6.2 to 6.3); 0x3600 (10.0 to 1607); 0x3680 (1703 to 1903); 0x3940 |
KTIMER_TABLE TimerTable; |
6.1 and higher | cache-aligned |
0x7B58 |
ULONG PrcbPad92 [10]; |
2004 and higher | |
0x4400 (6.1); 0x5000 (6.2 to 6.3); 0x5800 (10.0 to 1607); 0x5880 (1703 to 1903); 0x7B80 |
KGATE DpcGate; |
6.1 and higher | cache-aligned |
0x3398 (early 6.0); 0x3498 (late 6.0); 0x4418 (6.1); 0x5018 (6.2 to 6.3); 0x5818 (10.0 to 1607); 0x5898 (1703 to 1903); 0x7B98 |
PVOID PrcbPad51; |
6.0 only | |
PVOID PrcbPad52; |
6.1 and higher | ||
0x1FA0 (5.2); 0x33A0 (early 6.0); 0x34A0 (late 6.0); 0x4420 (6.1); 0x5020 (6.2 to 6.3); 0x5820 (10.0 to 1607); 0x58A0 (1703 to 1903); 0x7BA0 |
KDPC CallDpc; |
all | |
0x33E0 (early 6.0); 0x34E0 (late 6.0); 0x4460 (6.1); 0x5060 (6.2 to 6.3); 0x5860 (10.0 to 1607); 0x58E0 (1703 to 1903); 0x7BE0 |
LONG ClockKeepAlive; |
6.0 and higher | |
0x33E4 (early 6.0); 0x34E4 (late 6.0); 0x4464 (6.1) |
UCHAR ClockCheckSlot; |
6.0 to 6.1 | |
0x33E5 (early 6.0); 0x34E5 (late 6.0); 0x4465 (6.0 to 6.1) |
UCHAR ClockPollCycle; |
6.0 to 6.1 | |
0x33E6 (early 6.0); 0x34E6 (late 6.0) |
UCHAR PrcbPad6 [2]; |
6.0 only | |
0x5064 (6.2 to 6.3); 0x5864 (10.0 to 1607); 0x58E4 (1703 to 1903); 0x7BE4 |
UCHAR PrcbPad60 [2]; |
6.2 and higher | |
0x4466 (6.1); 0x5066 (6.2 to 6.3); 0x5866 (10.0 to 1607); 0x58E6 (1703 to 1903); 0x7BE6 |
USHORT NmiActive; |
6.1 to 1903 | |
union { struct { UCHAR NmiActive; UCHAR MceActive; }; USHORT CombinedNmiMceActive; }; |
2004 and higher | ||
0x33E8 (early 6.0); 0x34E8 (late 6.0); 0x4468 (6.1); 0x5068 (6.2 to 6.3); 0x5868 (10.0 to 1607); 0x58E8 (1703 to 1903); 0x7BE8 |
LONG DpcWatchdogPeriod; |
6.0 and higher | |
0x33EC (early 6.0); 0x34EC (late 6.0); 0x446C (6.1); 0x506C (6.2 to 6.3); 0x586C (10.0 to 1607); 0x58EC (1703 to 1903); 0x7BEC |
LONG DpcWatchdogCount; |
6.0 and higher | |
0x4470 (6.0) |
ULONG64 TickOffset; |
6.1 only | previously LONG at 0x3468 |
0x4478 (6.1); 0x5070 (6.2 to 6.3); 0x5870 (10.0 to 1607); 0x58F0 (1703 to 1903); 0x7BF0 |
LONG volatile KeSpinLockOrdering; |
6.1 and higher | |
0x58F4 (1703 to 1903); 0x7BF4 |
ULONG DpcWatchdogProfileCumulativeDpcThreshold; |
1703 and higher | |
0x5078 (6.2 to 6.3); 0x5878 (10.0 to 1607); 0x58F8 (1703 to 1903); 0x7BF8 |
PVOID CachedPtes; |
6.2 and higher | |
0x1FE0 (5.2); 0x33F0 (early 6.0); 0x34F0 (late 6.0); 0x447C (6.1); 0x5074 (6.2 to 6.3); 0x5874 (10.0 to 1607) |
ULONG64 PrcbPad7 [4]; |
5.2 only | |
ULONG64 PrcbPad70 [2]; |
6.0 only | ||
ULONG PrcbPad70; |
6.1 only | ||
ULONG PrcbPad70 [1]; |
6.2 to 1607 |
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x2000 (5.2); 0x3400 (early 6.0); 0x3500 (late 6.0); 0x4480 (6.1); 0x5080 (6.2 to 6.3); 0x5880 (10.0 to 1607); 0x5900 (1703 to 1903); 0x7C00 |
LIST_ENTRY WaitListHead; |
all | cache-aligned |
0x3410 (early 6.0); 0x3510 (late 6.0); 0x4490 (6.1); 0x5090 (6.2 to 6.3); 0x5890 (10.0 to 1607); 0x5910 (1703 to 1903); 0x7C10 |
KSPIN_LOCK WaitLock; |
6.0 and higher | |
0x2010 (5.2); 0x3418 (early 6.0); 0x3518 (late 6.0); 0x4498 (6.1); 0x5098 (6.2 to 6.3); 0x5898 (10.0 to 1607); 0x5918 (1703 to 1903); 0x7C18 |
ULONG ReadySummary; |
all | |
0x509C (6.3); 0x589C (10.0 to 1607); 0x591C (1703 to 1903); 0x7C1C |
LONG AffinitizedSelectionMask; |
6.3 and higher | |
0x2014 (5.2); 0x341C (early 6.0); 0x351C (late 6.0); 0x449C (6.1); 0x509C (6.2); 0x50A0 (6.3); 0x58A0 (10.0 to 1607); 0x5920 (1703 to 1903); 0x7C20 |
ULONG QueueIndex; |
all | |
0x50A0 (6.2) |
ULONG ReadyQueueWeight; |
6.2 only | |
0x50A4 (6.3); 0x58A4 (10.0 to 1607); 0x5924 (1703 to 1903); 0x7C24 |
ULONG PrcbPad75; |
6.2 only | |
ULONG PrcbPad75 [3]; |
6.3 to 1903 | ||
ULONG PrcbPad75 [2]; |
2004 and higher | ||
0x7C2C |
ULONG DpcWatchdogSequenceNumber; |
2004 and higher | |
0x44A0 (6.1); 0x50A8 (6.2); 0x50B0 (6.3); 0x58B0 (10.0 to 1607); 0x5930 (1703 to 1903); 0x7C30 |
KDPC TimerExpirationDpc; |
6.1 and higher | |
0x50E8 (6.2) |
KPRCB *BuddyPrcb; |
6.2 only | |
0x50F0 (6.2 to 6.3); 0x58F0 (10.0 to 1607); 0x5970 (1703 to 1903); 0x7C70 |
RTL_RB_TREE ScbQueue; |
6.2 and higher | |
0x3420 (early 6.0); 0x3520 (late 6.0); 0x44E0 (6.1) |
ULONG64 PrcbPad71 [0x0C]; |
6.0 only | |
ULONG64 PrcbPad72 [4]; |
6.1 only | ||
0x2018 (5.2); 0x3480 (early 6.0); 0x3580 (late 6.0); 0x4500 (6.1); 0x5100 (6.2 to 6.3); 0x5900 (10.0 to 1607); 0x5980 (1703 to 1903); 0x7C80 |
LIST_ENTRY DispatcherReadyListHead [0x20]; |
all | cache-aligned in 6.0 and higher |
0x2218 (5.2); 0x3680 (early 6.0); 0x3780 (late 6.0); 0x4700 (6.1); 0x5300 (6.2 to 6.3); 0x5B00 (10.0 to 1607); 0x5B80 (1703 to 1903); 0x7E80 |
ULONG InterruptCount; |
all | cache-aligned in 6.0 and higher |
0x221C (5.2); 0x3684 (early 6.0); 0x3784 (late 6.0); 0x4704 (6.1); 0x5304 (6.2 to 6.3); 0x5B04 (10.0 to 1607); 0x5B84 (1703 to 1903); 0x7E84 |
ULONG KernelTime; |
all | |
0x2220 (5.2); 0x3688 (early 6.0); 0x3788 (late 6.0); 0x4708 (6.1); 0x5308 (6.2 to 6.3); 0x5B08 (10.0 to 1607); 0x5B88 (1703 to 1903); 0x7E88 |
ULONG UserTime; |
all | |
0x2224 (5.2); 0x368C (early 6.0); 0x378C (late 6.0); 0x470C (6.1); 0x530C (6.2 to 6.3); 0x5B0C (10.0 to 1607); 0x5B8C (1703 to 1903); 0x7E8C |
ULONG DpcTime; |
all | |
0x2228 (5.2); 0x3690 (early 6.0); 0x3790 (late 6.0); 0x4710 (6.1); 0x5310 (6.2 to 6.3); 0x5B10 (10.0 to 1607); 0x5B90 (1703 to 1903); 0x7E90 |
ULONG InterruptTime; |
all | |
0x222C (5.2); 0x3694 (early 6.0); 0x3794 (late 6.0); 0x4714 (6.1); 0x5314 (6.2 to 6.3); 0x5B14 (10.0 to 1607); 0x5B94 (1703 to 1903); 0x7E94 |
ULONG AdjustDpcThreshold; |
all | |
0x2230 (5.2); 0x3698 (early 6.0); 0x3798 (late 6.0) |
UCHAR SkipTick; |
5.2 to 6.0 | |
0x2231 (5.2); 0x3699 (early 6.0); 0x3799 (late 6.0); 0x4718 (6.1); 0x5318 (6.2 to 6.3); 0x5B18 (10.0 to 1607); 0x5B98 (1703 to 1903); 0x7E98 |
UCHAR DebuggerSavedIRQL; |
all | |
0x2232 (5.2); 0x369A (early 6.0); 0x379A (late 6.0) |
UCHAR PollSlot; |
5.2 to 6.0 | |
0x5319 (6.2 to 6.3); 0x5B19 (10.0 to 1607); 0x5B99 (1703 to 1903); 0x7E99 |
BOOLEAN GroupSchedulingOverQuota; |
6.2 and higher | |
0x531A (6.2 to 6.3); 0x5B1A (10.0 to 1607); 0x5B9A (1703 to 1903); 0x7E9A |
BOOLEAN volatile DeepSleep; |
6.2 and higher | |
0x2233 (5.2); 0x369B (early 6.0); 0x379B (late 6.0); 0x4719 (6.1); 0x531B (6.2 to 6.3); 0x5B1B (10.0 to 1607); 0x5B9B (1703 to 1903); 0x7E9B |
UCHAR PrcbPad8 [0x0D]; |
5.2 only | |
UCHAR PrcbPad80 [5]; |
6.0 only | ||
UCHAR PrcbPad80 [7]; |
6.1 only | ||
UCHAR PrcbPad80 [1]; |
6.2 to 6.3 | ||
UCHAR PrcbPad80 [5]; |
10.0 to 1703 | ||
UCHAR PrcbPad80; |
1709 and higher | ||
0x531C (6.2 to 6.3) |
ULONG ScbOffset; |
6.2 to 6.3 | next at 0x0658 |
0x36A0 (early 6.0); 0x37A0 (late 6.0); 0x4720 (6.1); 0x5320 (6.2 to 6.3); 0x5B20 (10.0 to 1607); 0x5BA0 (1703); 0x5B9C (1709 to 1903); 0x7E9C |
ULONG DpcTimeCount; |
6.0 and higher | |
0x36A4 (early 6.0); 0x37A4 (late 6.0); 0x4724 (6.1); 0x5324 (6.2 to 6.3); 0x5B24 (10.0 to 1607); 0x5BA4 (1703); 0x5BA0 (1709 to 1903); 0x7EA0 |
ULONG DpcTimeLimit; |
6.0 and higher | |
0x36A8 (early 6.0); 0x37A8 (late 6.0); 0x4728 (6.1); 0x5328 (6.2 to 6.3); 0x5B28 (10.0 to 1607); 0x5BA8 (1703); 0x5BA4 (1709 to 1903); 0x7EA4 |
ULONG PeriodicCount; |
6.0 and higher | |
0x36AC (early 6.0); 0x37AC (late 6.0); 0x472C (6.1); 0x532C (6.2 to 6.3); 0x5B2C (10.0 to 1607); 0x5BAC (1703); 0x5BA8 (1709 to 1903); 0x7EA8 |
ULONG PeriodicBias; |
6.0 and higher | |
0x4730 (6.1); 0x5330 (6.2 to 6.3); 0x5B30 (10.0 to 1607); 0x5BB0 (1703); 0x5BAC (1709 to 1903); 0x7EAC |
ULONG AvailableTime; |
6.1 and higher | |
0x4734 (6.1); 0x5334 (6.2 to 6.3); 0x5B34 (10.0 to 1607); 0x5BB4 (1703); 0x5BB0 (1709 to 1903); 0x7EB0 |
ULONG KeExceptionDispatchCount; |
6.1 and higher | previously at 0x347C |
0x5BB8 (1703); 0x5BB4 (1709 to 1903); 0x7EB4 |
ULONG ReadyThreadCount; |
1703 and higher | |
0x5BB8 (1709 to 1903); 0x7EB8 |
ULONG64 ReadyQueueExpectedRunTime; |
1709 and higher | previously at 0x5C00 |
0x36B0 (early 6.0); 0x37B0 (late 6.0) |
ULONG64 PrcbPad81 [2]; |
6.0 only | |
0x2240 (5.2); 0x36C0 (early 6.0); 0x37C0 (late 6.0); 0x4738 (6.1); 0x5338 (6.2) |
KNODE *ParentNode; |
5.2 to 6.2 | cache-aligned; next at 0x0640 |
0x2248 (5.2); 0x36C8 (early 6.0); 0x37C8 (late 6.0) |
KAFFINITY MultiThreadProcesserSet; |
5.2 to 6.0 | |
0x2250 (5.2); 0x36D0 (early 6.0); 0x37D0 (late 6.0) |
KPRCB *MultiThreadSetMaster; |
5.2 to 6.0 | |
0x2258 (5.2) |
LONG Sleeping; |
5.2 only | next at 0x36F4 |
0x36D8 (early 6.0); 0x37D8 (late 6.0); 0x4740 (6.1); 0x5340 (6.2); 0x5338 (6.3); 0x5B38 (10.0 to 1607); 0x5BC0 (1703 to 1903); 0x7EC0 |
ULONG64 StartCycles; |
6.0 and higher | |
0x5B40 (10.0 to 1607); 0x5BC8 (1703 to 1903); 0x7EC8 |
ULONG64 TaggedCyclesStart; |
10.0 and higher | |
0x5B48 (10.0 to 1607); 0x5BD0 (1703 to 1903); 0x7ED0 |
ULONG64 TaggedCycles [2]; |
10.0 to 1903 | |
ULONG64 TaggedCycles [3]; |
2004 and higher | ||
0x5348 (6.2); 0x5340 (6.3); 0x5B58 (10.0 to 1607); 0x5BE0 (1703 to 1903) |
ULONG64 GenerationTarget; |
6.2 to 1903 | next at 0x8358 |
0x5350 (6.2); 0x5348 (6.3); 0x5B60 (10.0 to 1607); 0x5BE8 (1703 to 1903); 0x7EE8 |
ULONG64 AffinitizedCycles; |
6.2 and higher | |
0x5BF0 (1703 to 1903); 0x7EF0 |
ULONG64 ImportantCycles; |
1703 and higher | |
0x5BF8 (1703 to 1903); 0x7EF8 |
ULONG64 UnimportantCycles; |
1703 and higher | |
0x5C00 (1703) |
ULONG64 ReadyQueueExpectedRunTime; |
1703 only | next at 0x5BB8 |
0x4748 (6.1); 0x5358 (6.2); 0x5350 (6.3); 0x5B68 (10.0 to 1607); 0x5C08 (1703) |
ULONG64 PrcbPad82 [3]; |
6.1 only | |
ULONG64 PrcbPad81; |
6.2 only | ||
ULONG64 PrcbPad81 [2]; |
6.3 only | ||
ULONG PrcbPad81 [0x1D]; |
10.0 to 1607 | ||
ULONG PrcbPad81 [0x15]; |
1703 only | ||
0x5C5C (1703); 0x5C00 (1709 to 1903); 0x7F00 |
ULONG DpcWatchdogProfileSingleDpcThreshold; |
1703 and higher | |
0x36E0 (early 6.0); 0x37E0 (late 6.0); 0x4760 (6.1); 0x5360 (6.2 to 6.3); 0x5BDC (10.0 to 1607); 0x5C60 (1703); 0x5C04 (1703 to 1903); 0x7F04 |
LONG volatile MmSpinLockOrdering; |
6.0 and higher | |
0x5C08 (1703 to 1903); 0x7F08 |
PVOID volatile CachedStack; |
1709 and higher | |
0x225C (5.2) |
ULONG PrcbPad90 [1]; |
5.2 only | |
0x2260 (5.2) |
ULONG DebugDpcTime; |
5.2 only | |
0x2264 (5.2); 0x36E4 (early 6.0); 0x37E4 (late 6.0); 0x4764 (6.1); 0x5364 (6.2 to 6.3); 0x5BE0 (10.0 to 1607); 0x5C64 (1703); 0x5C10 (1703 to 1903); 0x7F10 |
ULONG PageColor; |
all | |
0x2268 (5.2); 0x36E8 (early 6.0); 0x37E8 (late 6.0); 0x4768 (6.1); 0x5368 (6.2 to 6.3); 0x5BE4 (10.0 to 1607); 0x5C68 (1703); 0x5C14 (1703 to 1903); 0x7F14 |
ULONG NodeColor; |
all | |
0x226C (5.2); 0x36EC (early 6.0); 0x37EC (late 6.0); 0x476C (6.1); 0x536C (6.2 to 6.3); 0x5BE8 (10.0 to 1607); 0x5C6C (1703); 0x5C18 (1703 to 1903); 0x7F18 |
ULONG NodeShiftedColor; |
all | |
0x2270 (5.2); 0x36F0 (early 6.0); 0x37F0 (late 6.0); 0x4770 (6.1); 0x5370 (6.2 to 6.3); 0x5BEC (10.0 to 1607); 0x5C70 (1703); 0x5C1C (1703 to 1903); 0x7F1C |
ULONG SecondaryColorMask; |
all | |
0x36F4 (early 6.0); 0x37F4 (late 6.0) |
LONG Sleeping; |
6.0 only | previously at 0x2258 |
0x4774 (6.1); 0x5374 (6.2 to 6.3); 0x5BF0 (10.0 to 1607); 0x5C74 (1703); 0x5C20 (1703 to 1903); 0x7F20 |
ULONG PrcbPad83; |
6.1 to 1703 | |
ULONG64 PrcbPad81 [3]; |
1709 only | ||
UCHAR PrcbPad81 [7]; |
1803 to 1809 | ||
UCHAR PrcbPad81 [6]; |
1903 and higher | ||
0x5C26 (1903); 0x7F26 |
BOOLEAN ExceptionStackActive; |
1903 and higher | |
0x5C27 (1803 to 1903); 0x7F27 |
UCHAR TbFlushListActive; |
1803 and higher | |
0x5C28 (1903); 0x7F28 |
PVOID ExceptionStack; |
1903 and higher | |
0x5C28 (1803 to 1809); 0x5C30 (1903); 0x7F30 |
ULONG64 PrcbPad82 [2]; |
1803 to 1809 | |
ULONG64 PrcbPad82 [1]; |
1903 and higher | ||
0x36F8 (early 6.0); 0x37F8 (late 6.0); 0x4778 (6.1); 0x5378 (6.2 to 6.3); 0x5BF8 (10.0 to 1607); 0x5C78 (1703); 0x5C38 (1709 to 1903); 0x7F38 |
ULONG64 CycleTime; |
6.0 and higher | |
0x5C80 (1703); 0x5C40 (1709 to 1903); 0x7F40 |
ULONG64 Cycles [4][2]; |
1703 and higher | |
0x5C40 (10.0 to 1607); 0x5CC0 (1703) |
ULONG PrcbPad84 [0x10]; |
10.0 to 1703 | |
0x2274 (5.2) |
UCHAR PrcbPad9 [0x0C]; |
5.2 only |
Windows Vista added numerous counters, mostly to do with caching by the file system, to an original handful. For some reason, the originals were moved to another area of counters nearer the start.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x2280 (5.2) |
ULONG CcFastReadNoWait; |
5.2 only | cache-aligned; next at 0x21C0 |
0x2284 (5.2) |
ULONG CcFastReadWait; |
5.2 only | next at 0x21C4 |
0x2288 (5.2) |
ULONG CcFastReadNotPossible; |
5.2 only | next at 0x21C8 |
0x228C (5.2) |
ULONG CcCopyReadNoWait; |
5.2 only | next at 0x21CC |
0x2290 (5.2) |
ULONG CcCopyReadWait; |
5.2 only | next at 0x21D0 |
0x2294 (5.2) |
ULONG CcCopyReadNoWaitMiss; |
5.2 only | next at 0x21D4 |
0x3700 (early 6.0); 0x3800 (late 6.0); 0x4780 (6.1); 0x5380 (6.2 to 6.3); 0x5C80 (10.0 to 1607); 0x5D00 (1703); 0x5C80 (1709 to 1903); 0x7F80 |
ULONG CcFastMdlReadNoWait; |
6.0 and higher | cache-aligned |
0x3704 (early 6.0); 0x3804 (late 6.0); 0x4784 (6.1); 0x5384 (6.2 to 6.3); 0x5C84 (10.0 to 1607); 0x5D04 (1703); 0x5C84 (1709 to 1903); 0x7F84 |
ULONG CcFastMdlReadWait; |
6.0 and higher | |
0x3708 (early 6.0); 0x3808 (late 6.0); 0x4788 (6.1); 0x5388 (6.2 to 6.3); 0x5C88 (10.0 to 1607); 0x5D08 (1703); 0x5C88 (1709 to 1903); 0x7F88 |
ULONG CcFastMdlReadNotPossible; |
6.0 and higher | |
0x370C (early 6.0); 0x380C (late 6.0); 0x478C (6.1); 0x538C (6.2 to 6.3); 0x5C8C (10.0 to 1607); 0x5D0C (1703); 0x5C8C (1709 to 1903); 0x7F8C |
ULONG CcMapDataNoWait; |
6.0 and higher | |
0x3710 (early 6.0); 0x3810 (late 6.0); 0x4790 (6.1); 0x5390 (6.2 to 6.3); 0x5C90 (10.0 to 1607); 0x5D10 (1703); 0x5C90 (1709 to 1903); 0x7F90 |
ULONG CcMapDataWait; |
6.0 and higher | |
0x3714 (early 6.0); 0x3814 (late 6.0); 0x4794 (6.1); 0x5394 (6.2 to 6.3); 0x5C94 (10.0 to 1607); 0x5D14 (1703); 0x5C94 (1709 to 1903); 0x7F94 |
ULONG CcPinMappedDataCount; |
6.0 and higher | |
0x3718 (early 6.0); 0x3818 (late 6.0); 0x4798 (6.1); 0x5398 (6.2 to 6.3); 0x5C98 (10.0 to 1607); 0x5D18 (1703); 0x5C98 (1709 to 1903); 0x7F98 |
ULONG CcPinReadNoWait; |
6.0 and higher | |
0x371C (early 6.0); 0x381C (late 6.0); 0x479C (6.1); 0x539C (6.2 to 6.3); 0x5C9C (10.0 to 1607); 0x5D1C (1703); 0x5C9C (1709 to 1903); 0x7F9C |
ULONG CcPinReadWait; |
6.0 and higher | |
0x3720 (early 6.0); 0x3820 (late 6.0); 0x47A0 (6.1); 0x53A0 (6.2 to 6.3); 0x5CA0 (10.0 to 1607); 0x5D20 (1703); 0x5CA0 (1709 to 1903); 0x7FA0 |
ULONG CcMdlReadNoWait; |
6.0 and higher | |
0x3724 (early 6.0); 0x3824 (late 6.0); 0x47A4 (6.1); 0x53A4 (6.2 to 6.3); 0x5CA4 (10.0 to 1607); 0x5D24 (1703); 0x5CA4 (1709 to 1903); 0x7FA4 |
ULONG CcMdlReadWait; |
6.0 and higher | |
0x3728 (early 6.0); 0x3828 (late 6.0); 0x47A8 (6.1); 0x53A8 (6.2 to 6.3); 0x5CA8 (10.0 to 1607); 0x5D28 (1703); 0x5CA8 (1709 to 1903); 0x7FA8 |
ULONG CcLazyWriteHotSpots; |
6.0 and higher | |
0x372C (early 6.0); 0x382C (late 6.0); 0x47AC (6.1); 0x53AC (6.2 to 6.3); 0x5CAC (10.0 to 1607); 0x5D2C (1703); 0x5CAC (1709 to 1903); 0x7FAC |
ULONG CcLazyWriteIos; |
6.0 and higher | |
0x3730 (early 6.0); 0x3830 (late 6.0); 0x47B0 (6.1); 0x53B0 (6.2 to 6.3); 0x5CB0 (10.0 to 1607); 0x5D30 (1703); 0x5CB0 (1709 to 1903); 0x7FB0 |
ULONG CcLazyWritePages; |
6.0 and higher | |
0x3734 (early 6.0); 0x3834 (late 6.0); 0x47B4 (6.1); 0x53B4 (6.2 to 6.3); 0x5CB4 (10.0 to 1607); 0x5D34 (1703); 0x5CB4 (1709 to 1903); 0x7FB4 |
ULONG CcDataFlushes; |
6.0 and higher | |
0x3738 (early 6.0); 0x3838 (late 6.0); 0x47B8 (6.1); 0x53B8 (6.2 to 6.3); 0x5CB8 (10.0 to 1607); 0x5D38 (1703); 0x5CB8 (1709 to 1903); 0x7FB8 |
ULONG CcDataPages; |
6.0 and higher | |
0x373C (early 6.0); 0x383C (late 6.0); 0x47BC (6.1); 0x53BC (6.2 to 6.3); 0x5CBC (10.0 to 1607); 0x5D3C (1703); 0x5CBC (1709 to 1903); 0x7FBC |
ULONG CcLostDelayedWrites; |
6.0 and higher | |
0x3740 (early 6.0); 0x3840 (late 6.0); 0x47C0 (6.1); 0x53C0 (6.2 to 6.3); 0x5CC0 (10.0 to 1607); 0x5D40 (1703); 0x5CC0 (1709 to 1903); 0x7FC0 |
ULONG CcFastReadResourceMiss; |
6.0 and higher | |
0x3744 (early 6.0); 0x3844 (late 6.0); 0x47C4 (6.1); 0x53C4 (6.2 to 6.3); 0x5CC4 (10.0 to 1607); 0x5D44 (1703); 0x5CC4 (1709 to 1903); 0x7FC4 |
ULONG CcCopyReadWaitMiss; |
6.0 and higher | |
0x3748 (early 6.0); 0x3848 (late 6.0); 0x47C8 (6.1); 0x53C8 (6.2 to 6.3); 0x5CC8 (10.0 to 1607); 0x5D48 (1703); 0x5CC8 (1709 to 1903); 0x7FC8 |
ULONG CcFastMdlReadResourceMiss; |
6.0 and higher | |
0x374C (early 6.0); 0x384C (late 6.0); 0x47CC (6.1); 0x53CC (6.2 to 6.3); 0x5CCC (10.0 to 1607); 0x5D4C (1703); 0x5CCC (1709 to 1903); 0x7FCC |
ULONG CcMapDataNoWaitMiss; |
6.0 and higher | |
0x3750 (early 6.0); 0x3850 (late 6.0); 0x47D0 (6.1); 0x53D0 (6.2 to 6.3); 0x5CD0 (10.0 to 1607); 0x5D50 (1703); 0x5CD0 (1709 to 1903); 0x7FD0 |
ULONG CcMapDataWaitMiss; |
6.0 and higher | |
0x3754 (early 6.0); 0x3854 (late 6.0); 0x47D4 (6.1); 0x53D4 (6.2 to 6.3); 0x5CD4 (10.0 to 1607); 0x5D54 (1703); 0x5CD4 (1709 to 1903); 0x7FD4 |
ULONG CcPinReadNoWaitMiss; |
6.0 and higher | |
0x3758 (early 6.0); 0x3858 (late 6.0); 0x47D8 (6.1); 0x53D8 (6.2 to 6.3); 0x5CD8 (10.0 to 1607); 0x5D58 (1703); 0x5CD8 (1709 to 1903); 0x7FD8 |
ULONG CcPinReadWaitMiss; |
6.0 and higher | |
0x375C (early 6.0); 0x385C (late 6.0); 0x47DC (6.1); 0x53DC (6.2 to 6.3); 0x5CDC (10.0 to 1607); 0x5D5C (1703); 0x5CDC (1709 to 1903); 0x7FDC |
ULONG CcMdlReadNoWaitMiss; |
6.0 and higher | |
0x3760 (early 6.0); 0x3860 (late 6.0); 0x47E0 (6.1); 0x53E0 (6.2 to 6.3); 0x5CE0 (10.0 to 1607); 0x5D60 (1703); 0x5CE0 (1709 to 1903); 0x7FE0 |
ULONG CcMdlReadWaitMiss; |
6.0 and higher | |
0x3764 (early 6.0); 0x3864 (late 6.0); 0x47E4 (6.1); 0x53E4 (6.2 to 6.3); 0x5CE4 (10.0 to 1607); 0x5D64 (1703); 0x5CE4 (1709 to 1903); 0x7FE4 |
ULONG CcReadAheadIos; |
6.0 and higher | |
0x3768 (early 6.0); 0x3868 (late 6.0); 0x47E8 (6.1); 0x53E8 (6.2 to 6.3); 0x5CE8 (10.0 to 1607); 0x5D68 (1703); 0x5CE8 (1709 to 1903); 0x7FE8 |
ULONG MmCacheTransitionCount; |
6.0 and higher | previously LONG volatile at 0x0D9C |
0x376C (early 6.0); 0x386C (late 6.0); 0x47EC (6.1); 0x53EC (6.2 to 6.3); 0x5CEC (10.0 to 1607); 0x5D6C (1703); 0x5CEC (1709 to 1903); 0x7FEC |
ULONG MmCacheReadCount; |
6.0 and higher | previously LONG volatile at 0x0DAC |
0x3770 (early 6.0); 0x3870 (late 6.0); 0x47F0 (6.1); 0x53F0 (6.2 to 6.3); 0x5CF0 (10.0 to 1607); 0x5D70 (1703); 0x5CF0 (1709 to 1903); 0x7FF0 |
ULONG MmCacheIoCount; |
6.0 and higher | previously LONG volatile at 0x0DB0 |
0x3774 (early 6.0); 0x3874 (late 6.0); 0x47F4 (6.1); 0x53F4 (6.2 to 6.3); 0x5CF4 (10.0 to 1607); 0x5D74 (1703); 0x5CF4 (1709 to 1903); 0x7FF4 |
ULONG PrcbPad91 [3]; |
6.0 only | |
ULONG PrcbPad91 [1]; |
6.1 only | ||
ULONG PrcbPad91 [3]; |
6.2 to 1709 | ||
ULONG PrcbPad91; |
1803 and higher | ||
0x47F8 (6.1) |
ULONG64 RuntimeAccumulation; |
6.1 only | |
0x5CF8 (1803 to 1903); 0x7FF8 |
PVOID MmFlushList; |
1803 to 1809 | |
PVOID MmInternal; |
1903 and higher |
Windows Vista brought forward the PowerState to a cache boundary.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x3780 (early 6.0); 0x3880 (late 6.0); 0x4800 (6.1); 0x5400 (6.2 to 6.3); 0x5D00 (10.0 to 1607); 0x5D80 (1703); 0x5D00 (1709 to 1903); 0x8000 |
PROCESSOR_POWER_STATE PowerState; |
6.0 and higher | cache-aligned; previously at 0x22D0 |
0x5F00 (1709 to 1903); 0x8200 |
PVOID HyperPte; |
1709 and higher | cache-aligned; previously at 0x60C0 |
0x55C8 (6.2); 0x55E0 (6.3); 0x5ED0 (10.0 to 1607); 0x5F58 (1703); 0x5F08 (1709 to 1903); 0x8208 |
PVOID ScbList [2]; |
6.2 and higher | |
0x5F68 (1703); 0x5F18 (1709 to 1903); 0x8218 |
KDPC ForceIdleDpc; |
1703 and higher | |
0x4900 (6.1); 0x55D8 (6.2); 0x55F0 (6.3); 0x5EE0 (10.0 to 1607); 0x5FA8 (1703) |
UCHAR PrcbPad92 [0x10]; |
6.1 only | |
ULONG PrcbPad92 [0x16]; |
6.2 only | ||
ULONG PrcbPad92 [0x13]; |
6.3 only | ||
ULONG PrcbPad92 [7]; |
10.0 to1607 | ||
ULONG PrcbPad92 [0x12]; |
1703 only | ||
0x2298 (5.2); 0x38B8 (early 6.0); 0x3998 (late 6.0); 0x4910 (6.1); 0x5630 (6.2); 0x563C (6.3); 0x5EFC (10.0 to 1607); 0x5FF0 (1703) |
ULONG KeAlignmentFixupCount; |
5.2 to 1703 | next at 0x6038 |
0x229C (5.2) |
ULONG KeDcacheFlushCount; |
5.2 only | |
0x22A0 (5.2) |
ULONG KeExceptionDispatchCount; |
5.2 only | next at 0x337C |
0x22A4 (5.2) |
ULONG KeFirstLevelTbFills; |
5.2 only | |
0x22A8 (5.2) |
ULONG KeFloatingEmulationCount; |
5.2 only | |
0x22AC (5.2) |
ULONG KeIcacheFlushCount; |
5.2 only | |
0x22B0 (5.2) |
ULONG KeSecondLevelTbFills; |
5.2 only | |
0x22B4 (5.2); 0x38BC (early 6.0); 0x399C (late 6.0) |
UCHAR VendorString [0x0D]; |
5.2 to 6.0 | next at 0x4BB8 |
0x22C1 (5.2); 0x38C9 (early 6.0); 0x39A9 (late 6.0) |
UCHAR PrcbPad10 [2]; |
5.2 only | |
UCHAR PrcbPad10 [3]; |
6.0 only | ||
0x22C4 (5.2); 0x38CC (early 6.0); 0x39AC (late 6.0) |
ULONG FeatureBits; |
5.2 to 6.0 | next at 0x4BC8 |
0x22C8 (5.2); 0x38D0 (early 6.0); 0x39B0 (late 6.0) |
LARGE_INTEGER UpdateSignature; |
5.2 to 6.0 | next at 0x4BD0 |
0x22D0 (5.2) |
PROCESSOR_POWER_STATE PowerState; |
5.2 only | next at 0x3780 |
0x38D8 (early 6.0); 0x39B8 (late 6.0); 0x4918 (6.1); 0x5638 (6.2); 0x5640 (6.3); 0x5F00 (10.0 to 1607); 0x5FF8 (1703); 0x5F58 (1709 to 1903); 0x8258 |
KDPC DpcWatchdogDpc; |
6.0 and higher | |
0x3918 (early 6.0); 0x39F8 (late 6.0); 0x4958 (6.1); 0x5678 (6.2); 0x5680 (6.3); 0x5F40 (10.0 to 1607); 0x6038 (1703); 0x5F98 (1709 to 1903); 0x8298 |
KTIMER DpcWatchdogTimer; |
6.0 and higher | |
0x2440 (5.2); 0x3958 (early 6.0); 0x3A38 (late 6.0); 0x4998 (6.1); 0x56B8 (6.2); 0x56C0 (6.3); 0x5F80 (10.0 to 1607); 0x6078 (1703); 0x5FD8 (1709 to 1903); 0x82D8 |
CACHE_DESCRIPTOR Cache [5]; |
all | |
0x247C (5.2); 0x3994 (early 6.0); 0x3A74 (late 6.0); 0x49D4 (6.1); 0x56F4 (6.2); 0x56FC (6.3); 0x5FBC (10.0 to 1607); 0x60B4 (1703); 0x6014 (1709 to 1903); 0x8314 |
ULONG CacheCount; |
all | last member in 5.2 |
Given a GenuineIntel processor whose CpuType, i.e., family, is at least 6, the UpdateSignature is all 64 bits that are read from the Model Specific Register 0x8B (IA32_BIOS_SIGN_ID), having first written zero to that register and then executed the cpuid instruction’s leaf 1. Starting with version 6.2, Windows also gets the UpdateSignature—by a straightforward read of the MSR—if the vendor is AuthenticAMD and the family is at least 15.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x3998 (early 6.0); 0x3A78 (late 6.0); 0x49D8 (6.1); 0x56F8 (6.2); 0x5700 (6.3); 0x5FC0 (10.0 to 1607); 0x60B8 (1703); 0x6018 (1709 to 1903); 0x8318 |
ULONG volatile CachedCommit; |
6.0 and higher | |
0x399C (early 6.0); 0x3A7C (late 6.0); 0x49DC (6.1); 0x56FC (6.2); 0x5704 (6.3); 0x5FC4 (10.0 to 1607); 0x60BC (1703); 0x601C (1709 to 1903); 0x831C |
ULONG volatile CachedResidentAvailable; |
6.0 and higher | |
0x39A0 (early 6.0); 0x3A80 (late 6.0); 0x49E0 (6.1); 0x5700 (6.2); 0x5708 (6.3); 0x5FC8 (10.0 to 1607); 0x60C0 |
PVOID HyperPte; |
6.0 to 1703 | next at 0x5F00 |
0x39A8 (early 6.0); 0x3A88 (late 6.0); 0x49E8 (6.1); 0x5708 (6.2); 0x5710 (6.3); 0x5FD0 (10.0 to 1607); 0x60C8 (1703); 0x6020 (1709 to 1903); 0x8320 |
PVOID WheaInfo; |
6.0 and higher | |
0x39B0 (early 6.0); 0x3A90 (late 6.0); 0x49F0 (6.1); 0x5710 (6.2); 0x5718 (6.3); 0x5FD8 (10.0 to 1607); 0x60D0 (1703); 0x6028 (1709 to 1903); 0x8328 |
PVOID EtwSupport; |
6.0 and higher | |
0x39C0 (early 6.0); 0x3AA0 (late 6.0); 0x4A00 (6.1); 0x5720 (6.2 to 6.3); 0x5FE0 (10.0 to 1607); 0x60E0 (1703) |
SLIST_HEADER InterruptObjectPool; |
6.0 to 1703 | next at 0x2DC0 |
0x6030 (1709 to 1903); 0x8330 |
PVOID ExSaPageArray; |
1709 and higher | previously at 0x6978 |
0x6038 (1709 to 1903); 0x8338 |
ULONG KeAlignmentFixupCount; |
1709 and higher | previously at 0x5FF0 |
0x603C (1709 to 1903); 0x833C |
ULONG PrcbPad95; |
1709 and higher | |
0x39D0 (early 6.0); 0x3AB0 (late 6.0); 0x4A10 (6.1); 0x5730 (6.2 to 6.3); 0x5FF0 (10.0 to 1607); 0x60F0 (1703); 0x6040 (1709 to 1903); 0x8340 |
LARGE_INTEGER HypercallPagePhysical; |
early 6.0 only | |
SLIST_HEADER HypercallPageList; |
late 6.0 and higher | ||
0x6050 (1709 to 1903); 0x8350 |
ULONGLONG *StatisticsPage; |
1709 and higher | previously at 0x6110 |
0x8358 |
ULONG64 GenerationTarget; |
2004 and higher | previously at 0x5BE0 |
0x6058 (1709 to 1903); 0x8360 |
ULONG64 PrcbPad85 [5]; |
1709 to 1903 | |
ULONG64 PrcbPad85 [4]; |
2004 and higher | ||
0x39D8 (early 6.0); 0x3AC0 (late 6.0); 0x4A20 (6.1); 0x5740 (6.2 to 6.3); 0x6000 (10.0 to 1607); 0x6100 (1703); 0x6080 (1709 to 1903); 0x8380 |
PVOID HypercallPageVirtual; |
6.0 to 6.3 | |
PVOID HypercallCachedPages; |
10.0 and higher | ||
0x3AC8 (late 6.0); 0x4A28 (6.1); 0x5748 (6.2 to 6.3); 0x6008 (10.0 to 1607); 0x6108 (1703); 0x6088 (1709 to 1903); 0x8388 |
PVOID VirtualApicAssist; |
late 6.0 and higher | |
0x3AD0 (late 6.0); 0x4A30 (6.1); 0x5750 (6.2 to 6.3); 0x6010 (10.0 to 1607); 0x6110 (1703) |
ULONGLONG *StatisticsPage; |
late 6.0 to 1703 | next at 0x6050 |
0x39E0 (early 6.0); 0x3AD8 (late 6.0); 0x4A38 (6.1) |
PVOID RateControl; |
6.0 to 6.1 | |
0x39E8 (early 6.0); 0x3AE0 (late 6.0); 0x4A40 (6.1) |
ULONG64 CacheProcessorMask [5]; |
6.0 to 6.1 | next as ULONG array at 0x5800 |
0x3A10 (early 6.0); 0x3B08 (late 6.0); 0x4A68 (6.1); 0x5758 (6.2 to 6.3); 0x6018 (10.0 to 1607); 0x6118 (1703); 0x6090 (1709 to 1903); 0x8390 |
KAFFINITY PackageProcessorSet; |
6.0 only | |
KAFFINITY_EX PackageProcessorSet; |
6.1 and higher | ||
0x6138 (1903); 0x8438 |
ULONG PackageId; |
1903 and higher | |
0x6138 (1709 to 1809); 0x613C (1903); 0x843C |
ULONG64 PrcbPad86; |
1709 to 1809 | |
ULONG PrcbPad86; |
1903 and higher | ||
0x5800 (6.2) |
ULONG CacheProcessorMask [5]; |
6.2 only | previously as ULONG64 array at 0x4A40; next at 0x5828 |
0x5800 (6.3); 0x60C0 (10.0 to 1607); 0x61C0 (1703); 0x6140 (1709 to 1903); 0x8440 |
ULONG64 SharedReadyQueueMask; |
6.3 and higher | |
0x5808 (6.3); 0x60C8 (10.0 to 1607); 0x61C8 (1703); 0x6148 (1709 to 1903); 0x8448 |
KSHARED_READY_QUEUE *SharedReadyQueue; |
6.3 and higher | |
0x60D0 (10.0 to 1607); 0x61D0 (1703); 0x6150 (1709 to 1903); 0x8450 |
ULONG SharedQueueScanOwner; |
10.0 and higher | |
0x60D4 (10.0 to 1607); 0x61D4 (1703); 0x6154 (1709 to 1903); 0x8454 |
ULONG ScanSiblingIndex; |
10.0 and higher | previously at 0x5850 |
0x5810 (6.3); 0x60D8 (10.0 to 1607); 0x61D8 (1703); 0x6158 (1709 to 1903); 0x8458 |
ULONG64 CoreProcessorSet; |
6.3 and higher | previously at 0x5838 |
0x5828 (6.2); 0x5818 (6.3); 0x60E0 (10.0 to 1607); 0x61E0 (1703); 0x6160 (1709 to 1903); 0x8460 |
ULONG64 ScanSiblingMask; |
6.2 and higher | |
0x5820 (6.3); 0x60E8 (10.0 to 1607); 0x61E8 (1703); 0x6168 (1709 to 1903); 0x8468 |
ULONG64 LLCMask; |
6.3 and higher | |
0x5828 (6.3); 0x60F0 (10.0 to 1607); 0x61F0 (1703); 0x6170 (1709 to 1903); 0x8470 |
ULONG64 CacheProcessorMask [5]; |
6.3 and higher | previously at 0x5800 |
0x5830 (6.2); 0x5850 (6.3) |
ULONG ScanSiblingIndex; |
6.2 to 6.3 | next at 0x60D4 |
0x5854 (6.3) |
ULONG SharedReadyQueueOffset; |
6.3 only | |
0x5834 (6.2) |
ULONG LLCLevel; |
6.2 only | |
0x3A18 (early 6.0); 0x3B10 (late 6.0); 0x4A90 (6.1); 0x5838 (6.2) |
KAFFINITY CoreProcessorSet; |
6.0 to 6.2 | last member in 6.0; next at 0x5810 |
0x5840 (6.2); 0x5858 (6.3); 0x6118 (10.0 to 1607); 0x6218 (1703); 0x6198 (1709 to 1903); 0x8498 |
PROCESSOR_PROFILE_CONTROL_AREA *ProcessorProfileControlArea; |
6.2 and higher | |
0x4A98 (6.1); 0x5848 (6.2); 0x5860 (6.3); 0x6120 (10.0 to 1607); 0x6220 (1703); 0x61A0 (1709 to 1903); 0x84A0 |
PVOID PebsIndexAddress; |
6.1 only | |
PVOID ProfileEventIndexAddress; |
6.2 and higher | ||
0x6228 (1703); 0x61A8 (1709 to 1903); 0x84A8 |
PVOID *DpcWatchdogProfile; |
1703 and higher | |
0x6230 (1703); 0x61B0 (1709 to 1903); 0x84B0 |
PVOID *DpcWatchdogProfileCurrentEmptyCapture; |
1703 and higher | |
0x61B8 (1709 to 1903); 0x84B8 |
PVOID SchedulerAssist; |
1709 and higher | |
0x4AA0 (6.1) |
ULONG64 PrcbPad93 [0x0C]; |
6.1 only |
Windows 7 defines numerous performance counters for synchronisation.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x4B00 (6.1) |
ULONG SpinLockAcquireCount; |
6.1 only | cache-aligned |
0x4B04 (6.1) |
ULONG SpinLockContentionCount; |
6.1 only | |
0x4B08 (6.1) |
ULONG SpinLockSpinCount; |
6.1 only | |
0x4B0C (6.1) |
ULONG IpiSendRequestBroadcastCount; |
6.1 only | |
0x4B10 (6.1) |
ULONG IpiSendRequestRoutineCount; |
6.1 only | |
0x4B14 (6.1) |
ULONG IpiSendSoftwareInterruptCount; |
6.1 only | |
0x4B18 (6.1) |
ULONG ExInitializeResourceCount; |
6.1 only | |
0x4B1C (6.1) |
ULONG ExReInitializeResourceCount; |
6.1 only | |
0x4B20 (6.1) |
ULONG ExDeleteResourceCount; |
6.1 only | |
0x4B24 (6.1) |
ULONG ExecutiveResourceAcquiresCount; |
6.1 only | |
0x4B28 (6.1) |
ULONG ExecutiveResourceContentionsCount; |
6.1 only | |
0x4B2C (6.1) |
ULONG ExecutiveResourceReleaseExclusiveCount; |
6.1 only | |
0x4B30 (6.1) |
ULONG ExecutiveResourceReleaseSharedCount; |
6.1 only | |
0x4B34 (6.1) |
ULONG ExecutiveResourceConvertsCount; |
6.1 only | |
0x4B38 (6.1) |
ULONG ExAcqResExclusiveAttempts; |
6.1 only | |
0x4B3C (6.1) |
ULONG ExAcqResExclusiveAcquiresExclusive; |
6.1 only | |
0x4B40 (6.1) |
ULONG ExAcqResExclusiveAcquiresExclusiveRecursive; |
6.1 only | |
0x4B44 (6.1) |
ULONG ExAcqResExclusiveWaits; |
6.1 only | |
0x4B48 (6.1) |
ULONG ExAcqResExclusiveNotAcquires; |
6.1 only | |
0x4B4C (6.1) |
ULONG ExAcqResSharedAttempts; |
6.1 only | |
0x4B50 (6.1) |
ULONG ExAcqResSharedAcquiresExclusive; |
6.1 only | |
0x4B54 (6.1) |
ULONG ExAcqResSharedAcquiresShared; |
6.1 only | |
0x4B58 (6.1) |
ULONG ExAcqResSharedAcquiresSharedRecursive; |
6.1 only | |
0x4B5C (6.1) |
ULONG ExAcqResSharedWaits; |
6.1 only | |
0x4B60 (6.1) |
ULONG ExAcqResSharedNotAcquires; |
6.1 only | |
0x4B64 (6.1) |
ULONG ExAcqResSharedStarveExclusiveAttempts; |
6.1 only | |
0x4B68 (6.1) |
ULONG ExAcqResSharedStarveExclusiveAcquiresExclusive; |
6.1 only | |
0x4B6C (6.1) |
ULONG ExAcqResSharedStarveExclusiveAcquiresShared; |
6.1 only | |
0x4B70 (6.1) |
ULONG ExAcqResSharedStarveExclusiveAcquiresSharedRecursive; |
6.1 only | |
0x4B74 (6.1) |
ULONG ExAcqResSharedStarveExclusiveWaits; |
6.1 only | |
0x4B78 (6.1) |
ULONG ExAcqResSharedStarveExclusiveNotAcquires; |
6.1 only | |
0x4B7C (6.1) |
ULONG ExAcqResSharedWaitForExclusiveAttempts; |
6.1 only | |
0x4B80 (6.1) |
ULONG ExAcqResSharedWaitForExclusiveAcquiresExclusive; |
6.1 only | |
0x4B84 (6.1) |
ULONG ExAcqResSharedWaitForExclusiveAcquiresShared; |
6.1 only | |
0x4B88 (6.1) |
ULONG ExAcqResSharedWaitForExclusiveAcquiresSharedRecursive; |
6.1 only | |
0x4B8C (6.1) |
ULONG ExAcqResSharedWaitForExclusiveWaits; |
6.1 only | |
0x4B90 (6.1) |
ULONG ExAceResSharedWaitForExclusiveNotAcquires; |
6.1 only | |
0x4B94 (6.1) |
ULONG ExSetResOwnerPointerExclusive; |
6.1 only | |
0x4B98 (6.1) |
ULONG ExSetResOwnerPointerSharedNew; |
6.1 only | |
0x4B9C (6.1) |
ULONG ExSetResOwnerPointerSharedOld; |
6.1 only | |
0x4BA0 (6.1) |
ULONG ExTryToAcqExclusiveAttempts; |
6.1 only | |
0x4BA4 (6.1) |
ULONG ExTryToAcqExclusiveAcquires; |
6.1 only | |
0x4BA8 (6.1) |
ULONG ExBoostExclusiveOwner; |
6.1 only | |
0x4BAC (6.1) |
ULONG ExBoostSharedOwners; |
6.1 only | |
0x4BB0 (6.1) |
ULONG ExEtwSynchTrackingNotificationsCount; |
6.1 only | |
0x4BB4 (6.1) |
ULONG ExEtwSynchTrackingNotificationsAccountedCount; |
6.1 only |
Windows 8 tidies all the preceding counters into one cache-aligned SYNCH_COUNTERS structure.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x5850 (6.2); 0x5858 (6.3); 0x6128 (10.0 to 1607); 0x6238 (1703) |
ULONG PrcbPad94 [6]; |
6.2 only | |
ULONG PrcbPad94 [3]; |
6.3 only | ||
ULONG64 PrcbPad94 [11]; |
10.0 to 1607 | ||
ULONG64 PrcbPad94 [10]; |
1703 only | ||
0x5880 (6.2 to 6.3); 0x6180 (10.0 to 1607); 0x6280 (1703); 0x61C0 (1709 to 1903); 0x84C0 |
SYNCH_COUNTERS SynchCounters; |
6.2 and higher | cache-aligned |
0x6278 (1709 to 1903); 0x8578 |
ULONG64 PrcbPad94; |
1709 and higher | |
0x5938 (6.3); 0x6238 (10.0 to 1607); 0x6338 (1703) |
ULONG64 PteBitCache; |
6.3 to 1703 | next at 0x62B0 |
0x5940 (6.3); 0x6240 (10.0 to 1607); 0x6340 (1703) |
ULONG PteBitOffset; |
6.3 to 1703 | next at 0x62B8 |
0x5938 (6.2); 0x5948 (6.3); 0x6248 (10.0 to 1607); 0x6348 (1703); 0x6280 (1709 to 1903); 0x8580 |
FILESYSTEM_DISK_COUNTERS FsCounters; |
6.2 and higher | |
0x4BB8 (6.1); 0x5948 (6.2); 0x5958 (6.3); 0x6258 (10.0 to 1607); 0x6358 (1703); 0x6290 (1709 to 1903); 0x8590 |
UCHAR VendorString [0x0D]; |
6.1 and higher | previously at 0x399C |
0x4BC5 (6.1); 0x5955 (6.2); 0x5965 (6.3); 0x6265 (10.0 to 1607); 0x6365 (1703); 0x629D (1709 to 1903); 0x859D |
UCHAR PrcbPad10 [3]; |
6.1 to 1607 | |
UCHAR PrcbPad10 [2]; |
1703 only | ||
UCHAR PrcbPad10 [3]; |
1709 and higher | ||
0x6367 (1703) |
UCHAR PendingVirtualLittle; |
1703 only | |
0x4BC8 (6.1); 0x5958 (6.2); 0x5968 (6.3); 0x6268 (10.0 to 1607); 0x6368 (1703); 0x62A0 (1709 to 1903); 0x85A0 |
ULONG FeatureBits; |
6.1 to 6.2 | previously at 0x39AC |
ULONG64 FeatureBits; |
6.3 and higher | ||
0x5970 (6.3); 0x6270 (10.0 to 1607); 0x6370 (1703) |
ULONG PrcbPad11; |
6.3 only | |
ULONG PrcbPad110; |
10.0 to 1703 | ||
0x4BD0 (6.1); 0x5960 (6.2); 0x5978 (6.3); 0x6278 (10.0 to 1607); 0x6378 (1703); 0x62A8 (1709 to 1903); 0x85A8 |
LARGE_INTEGER UpdateSignature; |
6.1 and higher | previously at 0x39B0 |
0x62B0 (1709 to 1903); 0x85B0 |
ULONG64 PteBitCache; |
1709 and higher | previously at 0x6338 |
0x62B8 (1709 to 1903); 0x85B8 |
ULONG PteBitOffset; |
1709 and higher | previously at 0x6340 |
0x62BC (1709 to 1903); 0x85BC |
ULONG PrcbPad105; |
1709 and higher | |
0x4BD8 (6.1); 0x5968 (6.2); 0x5980 (6.3); 0x6280 (10.0 to 1607); 0x6380 (1703); 0x62C0 (1709 to 1903); 0x85C0 |
CONTEXT *Context; |
6.1 and higher | |
0x4BE0 (6.1); 0x5970 (6.2); 0x5988 (6.3); 0x6288 (10.0 to 1607); 0x6388 (1703); 0x62C8 (1709 to 1903); 0x85C8 |
ULONG ContextFlags; |
6.1 only | |
ULONG ContextFlagsInit; |
6.2 and higher | ||
0x62CC (1709 to 1903); 0x85CC |
ULONG PrcbPad115; |
1709 and higher | |
0x4BE8 (6.1); 0x5978 (6.2); 0x5990 (6.3); 0x6290 (10.0 to 1607); 0x6390 (1703); 0x62D0 (1709 to 1903); 0x85D0 |
XSAVE_AREA *ExtendedState; |
6.1 and higher |
Offset | Definition | Versions |
---|---|---|
0x5998 (6.3); 0x6298 (10.0 to 1607); 0x6398 (1703); 0x62D8 (1709 to 1903); 0x85D8 |
PVOID IsrStack; |
6.3 and higher |
0x5980 (6.2); 0x59A0 (6.3); 0x62A0 (10.0 to 1607); 0x63A0 (1703); 0x62E0 (1709 to 1903); 0x85E0 |
KENTROPY_TIMING_STATE EntropyTimingState; |
6.2 and higher |
0x6430 (1803 to 1903); 0x8730 |
ULONG64 PrcbPad110; |
1803 and higher |
0x6438 (1803 to 1903); 0x8738 |
ULONG64 PrcbPad111 [7]; |
1803 only |
struct { ULONG UpdateCycle; union { SHORT PairLocal; struct { UCHAR PairLocalLow; UCHAR PairLocalForceStibp : 1; UCHAR Reserved : 4; UCHAR Frozen : 1; UCHAR ForceUntrusted : 1; UCHAR SynchIpi : 1; }; }; union { SHORT PairRemote; struct { UCHAR PairRemoteLow; UCHAR Reserved2; }; }; UCHAR Trace [0x18]; ULONG64 LocalDomain; ULONG64 RemoteDomain; KTHREAD *Thread; } StibpPairingTrace; |
1809 and higher | |
0x5AF0 (6.3); 0x63F0 (10.0 to 1607); 0x64F0 (1703); 0x6430 (1709); 0x6470 (1803 to 1903); 0x8770 |
SINGLE_LIST_ENTRY AbSelfIoBoostsList; |
6.3 and higher |
0x5AF8 (6.3); 0x63F8 (10.0 to 1607); 0x64F8 (1703); 0x6438 (1709); 0x6478 (1803 to 1903); 0x8778 |
SINGLE_LIST_ENTRY AbPropagateBoostsList; |
6.3 and higher |
0x5B00 (6.3); 0x6400 (10.0 to 1607); 0x6500 (1703); 0x6440 (1709); 0x6480 (1803 to 1903); 0x8780 |
KDPC AbDpc; |
6.3 and higher |
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x6440 (10.0 to 1607); 0x6540 (1703); 0x6480 (1709); 0x64C0 (1803 to 1903); 0x87C0 |
IOP_IRP_STACK_PROFILER IoIrpStackProfilerCurrent; |
10.0 and higher | |
0x6494 (10.0 to 1607); 0x6594 (1703); 0x64D4 (1709); 0x6514 (1803 to 1903); 0x8814 |
IOP_IRP_STACK_PROFILER IoIrpStackProfilerPrevious; |
10.0 and higher | |
0x6528 (1709); 0x6568 (1803 to 1903); 0x8868 |
KSECURE_FAULT_INFORMATION SecureFault; |
1709 and higher | previously at 0x6980 |
0x6538 (1709); 0x6578 (1803 to 1903); 0x8878 |
ULONG64 PrcbPad120; |
1709 and higher | |
0x6500 (10.0 to 1607); 0x6600 (1703); 0x6540 (1709); 0x6580 (1803 to 1903); 0x8880 |
KSHARED_READY_QUEUE LocalSharedReadyQueue; |
10.0 and higher | cache-aligned |
0x67B0 (1709); 0x67F0 (1803 to 1903); 0x8AF0 |
ULONG64 PrcbPad125 [2]; |
1709 and higher | |
0x67C0 (1709); 0x6800 (1803 to 1903); 0x8B00 |
ULONG TimerExpirationTraceCount; |
1709 and higher | cache-aligned; previously at 0x6970 |
0x67C4 (1709); 0x6804 (1803 to 1903); 0x8B04 |
ULONG PrcbPad127; |
1709 and higher | |
0x6760 (10.0 to 1607); 0x6870 (1703); 0x67C8 (1709); 0x6808 (1803 to 1903); 0x8B08 |
KTIMER_EXPIRATION_TRACE TimerExpirationTrace [0x10]; |
10.0 and higher | |
0x6860 (10.0 to 1607); 0x6970 (1703) |
ULONG TimerExpirationTraceCount; |
10.0 to 1703 | next at 0x67C0 |
0x6868 (10.0 to 1607); 0x6978 |
PVOID ExSaPageArray; |
10.0 to 1703 | next at 0x6030 |
0x6980 (1703) |
KSECURE_FAULT_INFORMATION SecureFault; |
1703 only | next at 0x6528 |
0x68C8 (1709); 0x6908 (1803 to 1903); 0x8C08 |
ULONG64 PrcbPad128 [7]; |
1709 and higher |
The mailboxes for inter-processor communications were moved to the end of the KPRCB in Windows 7 so that the array can accommodate arbitrarily many processors but still be in the KPRCB. Both the pointer and the array are cache-aligned without explicit padding in most versions.
Offset | Definition | Versions | Remarks |
---|---|---|---|
0x4C00 (6.1); 0x5B00 (6.2); 0x5B40 (6.3); 0x6880 (10.0 to 1607); 0x69C0 (1703); 0x6900 (1709); 0x6940 (1803 to 1903); 0x8C40 |
REQUEST_MAILBOX *Mailbox; |
6.1 and higher | cache-aligned |
0x6908 (1709); 0x6948 (1803 to 1903); 0x8C48 |
ULONG64 PrcbPad130 [7]; |
1709 and higher | |
0x6980 (1809 to 1903); 0x8C80 |
MACHINE_CHECK_CONTEXT McheckContext [2]; |
1809 and higher | cache-aligned |
0x6A20 (1809 to 1903); 0x8D20 |
ULONG64 PrcbPad134 [4]; |
1809 and higher | |
0x6980 (1803); 0x6A40 (1809 to 1903); 0x8D40 |
KLOCK_QUEUE_HANDLE SelfmapLockHandle [4]; |
1803 and higher | cache-aligned |
0x6AA0 (1809 to 1903); 0x8DA0 |
ULONG64 PrcbPad134a [4]; |
1809 to 1903 | |
0x69E0 (1803); 0x6AC0 (1809 to 1903); 0x8DC0 |
UCHAR PrcbPad135 [0x04A0]; |
1803 only | |
UCHAR PrcbPad138 [0x03C0]; |
1809 to 1903 | ||
0x8E40 |
PrcbPad138a; |
2004 and higher | |
0x6E80 (1803 to 1903); 0x8E80 |
ULONG64 KernelDirectoryTableBase; |
1803 and higher | page-aligned |
0x6E88 (1803 to 1903); 0x8E88 |
ULONG64 RspBaseShadow; |
1803 and higher | |
0x6E90 (1803 to 1903); 0x8E90 |
ULONG64 UserRspShadow; |
1803 and higher | |
0x6E98 (1803 to 1903); 0x8E98 |
ULONG ShadowFlags; |
1803 and higher | |
0x6E9C (1903); 0x8E9C |
ULONG PrcbPad138b; |
1903 and higher | |
0x6EA0 (1903); 0x8EA0 |
ULONG64 PrcbPad138c; |
1903 and higher | |
0x6EA8 (1903); 0x8EA8 |
USHORT PrcbPad138d; |
1903 and higher | |
0x6EAA (1903); 0x8EAA |
USHORT PrcbPad138e; |
1903 only | |
USHORT VerwSelector; |
2004 and higher | ||
0x6E9C (1809); 0x6EAC (1903); 0x8EAC |
ULONG DbgMceNestingLevel; |
1809 and higher | |
0x6EA0 (1809); 0x6EB0 (1903); 0x8EB0 |
ULONG DbgMceFlags; |
1809 and higher | |
0x6E9C (1803); 0x6EA4 (1809); 0x6EB4 (1903); 0x8EB4 |
ULONG PrcbPad139; |
1803 to 1809 | |
ULONG PrcbPad139b; |
1903 and higher | ||
0x6EA0 (1803); 0x6EA8 (1809); 0x6EB8 (1903); 0x8EB8 |
ULONG64 PrcbPad140 [0x01FC]; |
1803 only | |
ULONG64 PrcbPad140 [0x01FB]; |
1809 only | ||
ULONG64 PrcbPad140 [0x01F9]; |
1903 and higher | ||
0x7E80 (1903); 0x9E80 |
ULONG64 PrcbPad140a [8]; |
1903 and higher | page-aligned |
0x7EC0 (1903); 0x9EC0 |
ULONG64 PrcbPad141 [0x01F8]; |
1903 and higher | |
0x8E80 (1903); 0xAE80 |
UCHAR PrcbPad141a [0x40]; |
1903 and higher | page-aligned |
0x4C80 (6.1); 0x5B40 (6.2); 0x5B80 (6.3); 0x68C0 (10.0 to 1607); 0x6A00 (1703); 0x6940 (1709); 0x7E80 (1803 to 1809); 0x8EC0 (1903); 0xAEC0 |
REQUEST_MAILBOX RequestMailbox [ANYSIZE_ARRAY]; |
6.1 and higher | page-aligned in 1803 to 1809; previously at 0x2380; last member in 6.1 and higher |