Geoff Chappell - Software Analyst
The LOADER_PARAMETER_EXTENSION structure is part of the mechanism through which the kernel and HAL learn the initialisation data that was gathered by the loader. It exists only as data that is pointed to from the LOADER_PARAMETER_BLOCK whose address the loader passes to the kernel for the latter’s initialisation.
The architectural point to having two structures is that the LOADER_PARAMETER_BLOCK should be relatively stable across Windows versions, which indeed it was before Windows 7, but the LOADER_PARAMETER_EXTENSION can vary significantly and often has.
This is not just theoretical. Before version 6.0, the LOADER_PARAMETER_BLOCK really did need to be stable enough that the one NTLDR in the root directory of the bootable partition might load a kernel from a different Windows version, certainly any earlier version if not also any later one. Variability between versions was more for things that the LOADER_PARAMETER_BLOCK points to from its stable offsets. The LOADER_PARAMETER_EXTENSION is one such thing. It may have been a far-sighted allowance or a way to overcome having allowed too little. The version 4.0 LOADER_PARAMETER_BLOCK is known to have defined a Spare1, and earlier versions perhaps had a Spare or Spare0. An expansion of the LOADER_PARAMETER_BLOCK for Windows NT 4.0 SP3 caused compatibility problems with new kernels assuming new information that an old NTLDR did not know to provide. The goal that one NTLDR could load a kernel from a future Windows version was broken. If problems of this sort were not to recur, it may have seemed better that all future variability in what’s pointed to from the LOADER_PARAMETER_BLOCK be wrapped into one LOADER_PARAMETER_EXTENSION. Or so goes my current best attempt at inferring a history. The first loader that is known to create a LOADER_PARAMETER_EXTENSION is from Windows 2000.
Compatibility considerations changed with Windows Vista. It split NTLDR in two. A boot manager, e.g., BOOTMGR, enumerates the installed Windows versions and chooses which to boot. The remaining work is done by a boot loader, e.g., WINLOAD, within the chosen Windows installation. The boot loader should always match the kernel of whatever Windows is being booted. Since it is the boot loader that prepares the LOADER_PARAMETER_BLOCK, considerations for backwards compatibility (in Windows Vista and higher) have essentially disappeared. Subsequent changes are not just from growth at the end: members are removed, changed and inserted without regard for continuity. Especially notable among the changes is that Windows 7 does away with the MajorVersion and MinorVersion—or, if you prefer, moves them to the LOADER_PARAMETER_BLOCK. Within the LOADER_PARAMETER_EXTENSION, all that remains for identifying which version did the preparation is the Size at the start.
It cannot be stressed enough that the LOADER_PARAMETER_EXTENSION, however vital as shared data between the loader, kernel and HAL, is highly variable. Though early versions (before 6.1) change organically, i.e., by adding only to the end so that the Size at the start differentiates the layouts, they change even between builds. The structure is greatly expanded in later versions and successive releases of Windows 10 vary the structure more than ever before, including to insert and delete:
Version | Size (x86) | Size (x64) |
---|---|---|
5.0 | 0x28 | |
original 5.1 (before SP1) | 0x3C | |
late 5.1 | 0x40 | |
early 5.2 (before SP1) | 0x50 | |
late 5.2 | 0x58 | 0x88 |
6.0 | 0x7C | 0xB8 |
6.1 | 0xE8 | 0x0148 |
6.2 | 0x0870 | 0x0920 |
6.3 | 0x08E0 | 0x0988 |
10.0 | 0x0920 | 0x09E0 |
1511 | 0x0930 | 0x09F0 |
1607 | 0x0950 | 0x0A28 |
1703 to 1709 | 0x0B60 | 0x0C38 |
1803 | 0x0B68 | 0x0C40 |
1809 | 0x0C88 | 0x0D60 |
1903 | 0x0CE8 | 0x0DD0 |
2004 | 0x0D00 | 0x0DF0 |
Beware that changes within version 5.1 date to Windows XP Service Pack 1. On numerous other pages at this website, the abbreviation “late 5.1” means version 5.1 starting with Windows XP SP2. This is because many advances and fixes that came with the introduction of the amd64 architecture for the version 5.2 from Windows Server 2003 SP1 found their way into the roughly contemporaneous Windows XP SP2. But none of this affected the LOADER_PARAMETER_EXTENSION: its changes for version 5.1 had already happened.
Microsoft is not known ever to have documented the LOADER_PARAMETER_EXTENSION.
For many years, Microsoft’s names for the LOADER_PARAMETER_EXTENSION and the definitions of its members were known from type information in public symbol files for the kernel (and sometimes also the HAL), though only for occasional Windows versions: first for Windows 2000 SP3 and SP4, and then for all releases of Windows Vista and Windows 7. How the type information gets into the public symbols for some versions but not others is not known.
Windows 10 brought something new. For the original Windows 10 and its 1511 revision, the Windows Driver Kit (WDK) supplies a header file named arc.h which contains a C-language definition of the LOADER_PARAMETER_EXTENSION. This appears to be Microsoft’s first formal disclosure of the structure’s layout. It comes with no conditional compilation blocks for accommodating earlier versions. As supplied, it is immediately useful only for programming that targets a specific release of Windows 10, yet doesn’t say so. Add that the header is beneath a subdirectory named “um”, presumably to mean user-mode, but that the LOADER_PARAMETER_EXTENSION is long gone by the time any user-mode software gets to execute, and one might wonder if this structure’s definition was published by mistake.
Still, published it is. Then, just as that seemed to be the end of disclosure, perhaps forever, Microsoft’s names and types returned to the public symbol files for the kernel in the 1803 release of Windows 10.
Though this apparently continuing provision of type information in symbol files is welcome, it still leaves the historian with some difficulty for versions 5.1 and 5.2, and then for 6.2 and 6.3, and then again for the 1607 to 1709 releases of version 10.0. It turns out that type information is published for these too—well, for most of them—but a little obscurely, being in a statically linked library instead of in symbol files. The library is named CLFSMGMT.LIB. Microsoft distributes it with the Software Development Kit (SDK) for user-mode programming. It has type information for the LOADER_PARAMETER_EXTENSION in 32-bit versions starting with Windows Vista and 64-bit starting with Windows 8. For no reason yet known, this type information is gone from this library in the SDK for Version 2004.
The following table of offsets, names, types for the LOADER_PARAMETER_EXTENSION is from the published C-language definition in ARC.H for the original and 1511 releases of Windows 10. For other versions, the layout is from type information in public symbols and libraries, if available, as described above. Names, types and offsets for all other versions are something of a guess from assuming continuity except where inspection of the loader or kernel shows that members have come or gone.
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x00 | 0x00 |
ULONG Size; |
5.0 and higher |
0x04 | 0x04 |
PROFILE_PARAMETER_BLOCK Profile; |
5.0 and higher |
0x14 (5.0 to 6.0) | 0x14 (5.2 to 6.0) |
ULONG MajorVersion; |
5.0 to 6.0 |
0x18 (5.0 to 6.0) | 0x18 (5.2 to 6.0) |
ULONG MinorVersion; |
5.0 to 6.0 |
0x1C (5.0 to 6.0); 0x14 |
0x20 (5.2 to 6.0); 0x18 |
PVOID EmInfFileImage; |
5.0 and higher |
0x20 (5.0 to 6.0); 0x18 |
0x28 (5.2 to 6.0); 0x20 |
ULONG EmInfFileSize; |
5.0 and higher |
0x24 (5.0 to 6.0); 0x1C |
0x30 (5.2 to 6.0); 0x28 |
PVOID TriageDumpBlock; |
5.0 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x28 (5.1 to 6.0); 0x20 (6.1) |
0x38 (5.2 to 6.0); 0x30 (6.1) |
ULONG_PTR LoaderPagesSpanned; |
5.1 to 6.1 |
0x2C (5.1 to 6.0); 0x24 (6.1); 0x20 |
0x40 (5.2 to 6.0); 0x38 (6.1); 0x30 |
HEADLESS_LOADER_BLOCK *HeadlessLoaderBlock; |
5.1 and higher |
0x30 (5.1 to 6.0); 0x28 (6.1); 0x24 |
0x48 (5.2 to 6.0); 0x40 (6.1); 0x38 |
SMBIOS_TABLE_HEADER *SMBiosEPSHeader; |
5.1 to 6.3 |
SMBIOS3_TABLE_HEADER *SMBiosEPSHeader; |
10.0 and higher | ||
0x34 (5.1 to 6.0); 0x2C (6.1); 0x28 |
0x50 (5.2 to 6.0); 0x48 (6.1); 0x40 |
PVOID DrvDBImage; |
5.1 and higher |
0x38 (5.1 to 6.0); 0x30 (6.1); 0x2C |
0x58 (5.2 to 6.0); 0x50 (6.1); 0x48 |
ULONG DrvDBSize; |
5.1 and higher |
0x30 | 0x50 |
PVOID DrvDBPatchImage; |
2004 and higher |
0x34 | 0x58 |
ULONG DrvDBPatchSize; |
2004 and higher |
0x3C (late 5.1 to 6.0); 0x34 (6.1); 0x30 (6.2 to 1903); 0x38 |
0x60 (5.2 to 6.0); 0x58 (6.1); 0x50 (6.2 to 1903); 0x60 |
NETWORK_LOADER_BLOCK *NetworkLoaderBlock; |
late 5.1 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x40 (5.2 to 6.0); 0x38 (6.1); 0x34 (6.2 to 1903); 0x3C |
PUCHAR HalpIRQLToTPR; |
5.2 and higher | |
0x44 (5.2 to 6.0); 0x3C (6.1); 0x38 (6.2 to 1903); 0x40 |
PUCHAR HalpVectorToIRQL; |
5.2 and higher | |
0x48 (5.2 to 6.0); 0x40 (6.1); 0x3C (6.2 to 1903); 0x44 |
0x68 (5.2 to 6.0); 0x60 (6.1); 0x58 (6.2 to 1903); 0x68 |
LIST_ENTRY FirmwareDescriptorListHead; |
5.2 and higher |
0x50 (late 5.2 to 6.0); 0x48 (6.1); 0x44 (6.2 to 1903); 0x4C |
0x78 (5.2 to 6.0); 0x70 (6.1); 0x68 (6.2 to 1903); 0x78 |
PVOID AcpiTable; |
late 5.2 and higher |
0x54 (late 5.2 to 6.0); 0x4C (6.1); 0x48 (6.2 to 1903); 0x50 |
0x80 (5.2 to 6.0); 0x78 (6.1); 0x70 (6.2 to 1903); 0x80 |
ULONG AcpiTableSize; |
late 5.2 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x58 (6.0); 0x50 (6.1); 0x4C (6.2 to 1903); 0x54 |
0x84 (6.0); 0x7C (6.1); 0x74 (6.2 to 1903); 0x84 |
struct { /* changing bit fields, see below */ }; |
6.0 and higher |
0x5C (6.0); 0x54 (6.1); 0x50 (6.2 to 1903); 0x58 |
0x88 (6.0); 0x80 (6.1); 0x78 (6.2 to 1903); 0x88 |
LOADER_PERFORMANCE_DATA *LoaderPerformanceData; |
6.0 to 1803 |
LOADER_PERFORMANCE_DATA LoaderPerformanceData; |
1809 and higher | ||
0x60 (6.0); 0x58 (6.1); 0x54 (6.2 to 1803); 0x98 (1809); 0xB0 (1903); 0xB8 |
0x90 (6.0); 0x88 (6.1); 0x80 (6.2 to 1803); 0xC0 (1809); 0xD8 (1903); 0xE8 |
LIST_ENTRY BootApplicationPersistentData; |
6.0 and higher |
0x68 (6.0); 0x60 (6.1); 0x5C (6.2 to 1803); 0xA0 (1809); 0xB8 (1903); 0xC0 |
0xA0 (6.0); 0x98 (6.1); 0x90 (6.2 to 1803); 0xD0 (1809); 0xE8 (1903); 0xF8 |
PVOID WmdTestResult; |
6.0 and higher |
0x6C (6.0); 0x64 (6.1); 0x60 (6.2 to 1803); 0xA4 (1809); 0xBC (1903); 0xC4 |
0xA8 (6.0); 0xA0 (6.1); 0x98 (6.2 to 1803); 0xD8 (1809); 0xF0 (1903); 0x0100 |
GUID BootIdentifier; |
6.0 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x74 (6.1); 0x70 (6.2 to 1803); 0xB4 (1809); 0xCC (1903); 0xD4 |
0xB0 (6.1); 0xA8 (6.2 to 1803); 0xE8 (1809); 0x0100 (1903); 0x0110 |
ULONG ResumePages; |
6.1 and higher |
0x78 (6.1); 0x74 (6.2 to 1803); 0xB8 (1809); 0xD0 (1903); 0xD8 |
0xB8 (6.1); 0xB0 (6.2 to 1803); 0xF0 (1809); 0x0108 (1903); 0x0118 |
PVOID DumpHeader; |
6.1 and higher |
0x7C (6.1); 0x78 (6.2 to 1803); 0xBC (1809); 0xD4 (1903); 0xDC |
0xC0 (6.1); 0xB8 (6.2 to 1803); 0xF8 (1809); 0x0110 (1903); 0x0120 |
PVOID BgContext; |
6.1 and higher |
0x80 (6.1); 0x7C (6.2 to 1803); 0xC0 (1809); 0xD8 (1903); 0xE0 |
0xC8 (6.1); 0xC0 (6.2 to 1803); 0x0100 (1809); 0x0118 (1903); 0x0128 |
PVOID NumaLocalityInfo; |
6.1 and higher |
0x84 (6.1); 0x80 (6.2 to 1803); 0xC4 (1809); 0xDC (1903); 0xE4 |
0xD0 (6.1); 0xC8 (6.2 to 1803); 0x0108 (1809); 0x0120 (1903); 0x0130 |
PVOID NumaGroupAssignment; |
6.1 and higher |
0x88 (6.1); 0x84 (6.2 to 1803); 0xC8 (1809); 0xE0 (1903); 0xE8 |
0xD8 (6.1); 0xD0 (6.2 to 1803); 0x0110 (1809); 0x0128 (1903); 0x0138 |
LIST_ENTRY AttachedHives; |
6.1 and higher |
0x90 (6.1); 0x8C (6.2 to 1803); 0xD0 (1809); 0xE8 (1903); 0xF0 |
0xE8 (6.1); 0xE0 (6.2 to 1803); 0x0120 (1809); 0x0138 (1903); 0x0148 |
ULONG MemoryCachingRequirementsCount; |
6.1 and higher |
0x94 (6.1); 0x90 (6.2 to 1803); 0xD4 (1809); 0xEC (1903); 0xF4 |
0xF0 (6.1); 0xE8 (6.2 to 1803); 0x0128 (1809); 0x0140 (1903); 0x0150 |
PVOID MemoryCachingRequirements; |
6.1 and higher |
0x98 (6.1 to 1803); 0xD8 (1809); 0xF0 (1903); 0xF8 |
0xF8 (6.1); 0xF0 (6.2 to 1803); 0x0130 (1809); 0x0148 (1903); 0x0158 |
TPM_BOOT_ENTROPY_LDR_RESULT TpmBootEntropyResult; |
6.1 only |
BOOT_ENTROPY_LDR_RESULT BootEntropyResult; |
6.2 and higher | ||
0xE0 (6.1); 0x07A8 (6.2); 0x0810 (6.3 to 1607); 0x0830 (1703 to 1803); 0x0940 (1809); 0x0958 (1903); 0x0960 |
0x0140 (6.1); 0x0800 (6.2); 0x0868 (6.3 to 1607); 0x0888 (1703 to 1803); 0x0998 (1809); 0x09B0 (1903); 0x09C0 |
ULONGLONG ProcessorCounterFrequency; |
6.1 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x07B0 (6.2); 0x0818 (6.3 to 1607); 0x0838 (1703 to 1803); 0x0948 (1809); 0x0960 (1903); 0x0968 |
0x0808 (6.2); 0x0870 (6.3 to 1607); 0x0890 (1703 to 1803); 0x09A0 (1809); 0x09B8 (1903); 0x09C8 |
LOADER_PARAMETER_HYPERVISOR_EXTENSION HypervisorExtension; |
6.2 and higher |
0x07E8 (6.2); 0x0850 (6.3 to 1607); 0x0870 (1703 to 1803); 0x0988 (1809); 0x09A0 (1903); 0x09A8 |
0x0840 (6.2); 0x08A8 (6.3 to 1607); 0x08C8 (1703 to 1803); 0x09E0 (1809); 0x09F8 (1903); 0x0A08 |
GUID HardwareConfigurationId; |
6.2 and higher |
0x07F8 (6.2); 0x0860 (6.3 to 1607); 0x0880 (1703 to 1803); 0x0998 (1809); 0x09B0 (1903); 0x09B8 |
0x0850 (6.2); 0x08B8 (6.3 to 1607); 0x08D8 (1703 to 1803); 0x09F0 (1809); 0x0A08 (1903); 0x0A18 |
LIST_ENTRY HalExtensionModuleList; |
6.2 and higher |
0x0800 (6.2); 0x0868 (6.3 to 1607); 0x0888 (1703 to 1803); 0x09A0 (1809); 0x09B8 (1903); 0x09C0 |
0x0860 (6.2); 0x08C8 (6.3 to 1607); 0x08E8 (1703 to 1803); 0x0A00 (1809); 0x0A18 (1903); 0x0A28 |
LARGE_INTEGER SystemTime; |
6.2 and higher |
0x0808 (6.2); 0x0870 (6.3 to 1607); 0x0890 (1703 to 1803); 0x09A8 (1809); 0x09C0 (1903); 0x09C8 |
0x0868 (6.2); 0x08D0 (6.3 to 1607); 0x08F0 (1703 to 1803); 0x0A08 (1809); 0x0A20 (1903); 0x0A30 |
ULONGLONG TimeStampAtSystemTimeRead; |
6.2 and higher |
0x0810 (6.2); 0x0878 (6.3 to 1607); 0x0898 (1703 to 1803); 0x09B0 (1809); 0x09C8 (1903); 0x09D0 |
0x0870 (6.2); 0x08D8 (6.3 to 1607); 0x08F8 (1703 to 1803); 0x0A10 (1809); 0x0A28 (1903); 0x0A38 |
ULONGLONG BootFlags; |
6.2 to 1511 |
union { ULONGLONG BootFlags; struct { /* changing bit fields, follow link */ }; }; |
1607 and higher | ||
0x0818 (6.2); 0x0880 (6.3 to 1607); 0x08A0 (1703 to 1803); 0x09B8 (1809); 0x09D0 (1903); 0x09D8 |
0x0878 (6.2); 0x08E0 (6.3 to 1607); 0x0900 (1703 to 1803); 0x0A18 (1809); 0x0A30 (1903); 0x0A40 |
ULONGLONG InternalBootFlags; |
6.2 to 1607 |
union { ULONGLONG InternalBootFlags; struct { /* bit fields, follow link */ }; }; |
1703 and higher | ||
0x0820 (6.2); 0x0888 (6.3 to 1607); 0x08A8 (1703 to 1803); 0x09C0 (1809); 0x09D8 (1903); 0x09E0 |
0x0880 (6.2); 0x08E8 (6.3 to 1607); 0x0908 (1703 to 1803); 0x0A20 (1809); 0x0A38 (1903); |
PVOID WfsFPData; |
6.2 and higher |
0x0824 (6.2); 0x088C (6.3 to 1607); 0x08AC (1703 to 1803); 0x09C4 (1809); 0x09DC (1903); 0x09E4 |
0x0888 (6.2); 0x08F0 (6.3 to 1607); 0x0910 (1703 to 1803); 0x0A28 (1809); 0x0A40 (1903); 0x0A50 |
ULONG WfsFPDataSize; |
6.2 and higher |
0x0828 (6.2); 0x0890 (6.3 to 1607); 0x08B0 (1703 to 1803); 0x09C8 (1809); 0x09E0 (1903); 0x09E8 |
0x0890 (6.2); 0x08F8 (6.3 to 1607); 0x0918 (1703 to 1803); 0x0A30 (1809); 0x0A48 (1903); 0x0A58 |
LOADER_PARAMETER_KD_EXTENSION KdExtension; |
6.2 only |
LOADER_BUGCHECK_PARAMETERS BugcheckParameters; |
6.3 and higher | ||
0x08A4 (6.3 to 1607); 0x08C4 (1703 to 1803); 0x09DC (1809); 0x09F4 (1903); 0x09FC |
0x0920 (6.3 to 1607); 0x0940 (1703 to 1803); 0x0A58 (1809); 0x0A70 (1903); 0x0A80 |
PVOID ApiSetSchema; |
6.3 and higher |
0x08A8 (6.3 to 1607); 0x08C8 (1703 to 1803); 0x09E0 (1809); 0x09F8 (1903); 0x0A00 |
0x0928 (6.3 to 1607); 0x0948 (1703 to 1803); 0x0A60 (1809); 0x0A78 (1903); 0x0A88 |
ULONG ApiSetSchemaSize; |
6.3 and higher |
0x08AC (6.3 to 1607); 0x08CC (1703 to 1803); 0x09E4 (1809); 0x09FC (1903); 0x0A04 |
0x0930 (6.3 to 1607); 0x0950 (1703 to 1803); 0x0A68 (1809); 0x0A80 (1903); 0x0A90 |
LIST_ENTRY ApiSetSchemaExtensions; |
6.3 and higher |
0x0858 (6.2); 0x08B4 (6.3 to 1607); 0x08D4 (1703 to 1803); 0x09EC (1809); 0x0A04 (1903); 0x0A0C |
0x08F0 (6.2); 0x0940 (6.3 to 1607); 0x0960 (1703 to 1803); 0x0A78 (1809); 0x0A90 (1903); 0x0AA0 |
UNICODE_STRING AcpiBiosVersion; |
6.2 and higher |
0x0860 (6.2); 0x08BC (6.3 to 1607); 0x08DC (1703 to 1803); 0x09F4 (1809); 0x0A0C (1903); 0x0A14 |
0x0900 (6.2); 0x0950 (6.3 to 1607); 0x0970 (1703 to 1803); 0x0A88 (1809); 0x0AA0 (1903); 0x0AB0 |
UNICODE_STRING SmbiosVersion; |
6.2 and higher |
0x0868 (6.2); 0x08C4 (6.3 to 1607); 0x08E4 (1703 to 1803); 0x09FC (1809); 0x0A14 (1903); 0x0A1C |
0x0910 (6.2); 0x0960 (6.3 to 1607); 0x0980 (1703 to 1803); 0x0A98 (1809); 0x0AB0 (1903); 0x0AC0 |
UNICODE_STRING EfiVersion; |
6.2 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x08CC (6.3 to 1607); 0x08EC (1703 to 1803); 0x0A04 (1809); 0x0A1C (1903); 0x0A24 |
0x0970 (6.3 to 1607); 0x0990 (1703 to 1803); 0x0AA8 (1809); 0x0AC0 (1903); 0x0AD0 |
DEBUG_DEVICE_DESCRIPTOR *KdDebugDevice; |
6.3 and higher |
0x08D0 (6.3 to 1607); 0x08F0 (1703 to 1803); 0x0A08 (1809); 0x0A20 (1903); 0x0A28 |
0x0978 (6.3 to 1607); 0x0998 (1703 to 1803); 0x0AB0 (1809); 0x0AC8 (1903); 0x0AD8 |
OFFLINE_CRASHDUMP_CONFIGURATION_TABLE OfflineCrashdumpConfigurationTable; |
6.3 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x08F0 (10.0 to 1607); 0x0910 (1703 to 1803); 0x0A28 (1809); 0x0A40 (1903); 0x0A48 |
0x0998 (10.0 to 1607); 0x09B8 (1703 to 1803); 0x0AD0 (1809); 0x0AE8 (1903); 0x0AF8 |
UNICODE_STRING ManufacturingProfile; |
10.0 and higher |
0x08F8 (10.0 to 1607); 0x0918 (1703 to 1803); 0x0A30 (1809); 0x0A48 (1903); 0x0A50 |
0x09A8 (10.0 to 1607); 0x09C8 (1703 to 1803); 0x0AE0 (1809); 0x0AF8 (1903); 0x0B08 |
PVOID BbtBuffer; |
10.0 and higher |
0x0900 (10.0 to 1607); 0x0920 (1703 to 1803); 0x0A38 (1809); 0x0A50 (1903); 0x0A58 |
0x09B0 (10.0 to 1607); 0x09D0 (1703 to 1803); 0x0AE8 (1809); 0x0B00 (1903); 0x0B10 |
ULONG64 XsaveAllowedFeatures; |
10.0 and higher |
0x0908 (10.0 to 1607); 0x0928 (1703 to 1803); 0x0A40 (1809); 0x0A58 (1903); 0x0A60 |
0x09B8 (10.0 to 1607); 0x09D8 (1703 to 1803); 0x0AF0 (1809); 0x0B08 (1903); 0x0B18 |
ULONG XsaveFlags; |
10.0 and higher |
0x090C (10.0 to 1607); 0x092C (1703 to 1803); 0x0A44 (1809); 0x0A5C (1903); 0x0A64 |
0x09C0 (10.0 to 1607); 0x09E0 (1703 to 1803); 0x0AF8 (1809); 0x0B10 (1903); 0x0B20 |
PVOID BootOptions; |
10.0 and higher |
0x0910 (1607); 0x0930 (1703 to 1803); 0x0A48 (1809); 0x0A60 (1903); 0x0A68 |
0x09C8 (1607); 0x09E8 (1703 to 1803); 0x0B00 (1809); 0x0B18 (1903); 0x0B28 |
ULONG IumEnablement; |
1607 and higher |
0x914 (1607); 0x0934 (1703 to 1803); 0x0A4C (1809); 0x0A64 (1903); 0x0A6C |
0x09CC (1607); 0x09EC (1703 to 1803); 0x0B04 (1809); 0x0B1C (1903); 0x0B2C |
ULONG IumPolicy; |
1607 and higher |
0x918 (1607); 0x0938 (1703 to 1803); 0x0A50 (1809); 0x0A68 (1903); 0x0A70 |
0x09D0 (1607); 0x09F0 (1703 to 1803); 0x0B08 (1809); 0x0B20 (1903); 0x0B30 |
NTSTATUS IumStatus; |
1607 and higher |
0x0910 (10.0 to 1511); 0x091C (1607); 0x093C (1703 to 1803); 0x0A54 (1809); 0x0A6C (1903); 0x0A74 |
0x09C8 (10.0 to 1511); 0x09D4 (1607); 0x09F4 (1703 to 1803); 0x0B0C (1809); 0x0B24 (1903); 0x0B34 |
ULONG BootId; |
10.0 and higher |
0x0914 (10.0 to 1511); 0x0920 (1607); 0x0940 (1703 to 1803); 0x0A58 (1809); 0x0A70 (1903); 0x0A78 |
0x09D0 (10.0 to 1511); 0x09D8 (1607); 0x09F8 (1703 to 1803); 0x0B10 (1809); 0x0B28 (1903); 0x0B38 |
LOADER_PARAMETER_CI_EXTENSION *CodeIntegrityData; |
10.0 and higher |
0x0918 (10.0 to 1511); 0x0924 (1607); 0x0944 (1703 to 1803); 0x0A5C (1809); 0x0A74 (1903); 0x0A7C |
0x09D8 (10.0 to 1511); 0x09E0 (1607); 0x0A00 (1703 to 1803); 0x0B18 (1809); 0x0B30 (1903); 0x0B40 |
ULONG CodeIntegrityDataSize; |
10.0 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x091C (1511); 0x0928 (1607); 0x0948 (1703 to 1803); 0x0A60 (1809); 0x0A78 (1903); 0x0A80 |
0x09E0 (1511); 0x09E4 (1607); 0x0A04 (1703 to 1803); 0x0B1C (1809); 0x0B34 (1903); 0x0B44 |
LOADER_HIVE_RECOVER_INFO SystemHiveRecoveryInfo; |
1511 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x093C (1607); 0x095C (1703 to 1803); 0x0A74 (1809); 0x0A8C (1903); 0x0A94 |
0x09F8 (1607); 0x0A18 (1703 to 1803); 0x0B30 (1809); 0x0B48 (1903); 0x0B58 |
ULONG SoftRestartCount; |
1607 and higher |
0x0940 (1607); 0x0960 (1703 to 1803); 0x0A78 (1809); 0x0A90 (1903); 0x0A98 |
0x0A00 (1607); 0x0A20 (1703 to 1803); 0x0B38 (1809); 0x0B50 (1903); 0x0B60 |
LONGLONG SoftRestartTime; |
1607 and higher |
0x0A08 (1607); 0x0A28 (1703 to 1803); 0x0B40 (1809); 0x0B58 (1903); 0x0B68 |
PVOID HypercallCodeVa; |
1607 and higher | |
0x0A10 (1607); 0x0A30 (1703 to 1803); 0x0B48 (1809); 0x0B60 (1903); 0x0B70 |
PVOID HalVirtualAddress; |
1607 and higher | |
0x0A18 (1607); 0x0A38 (1703 to 1803); 0x0B50 (1809); 0x0B68 (1903); 0x0B78 |
ULONGLONG HalNumberOfBytes; |
1607 and higher | |
0x0A80 (1809); 0x0A98 (1903); 0x0AA0 |
0x0B58 (1809); 0x0B70 (1903); 0x0B80 |
LEAP_SECOND_DATA *LeapSecondData; |
1809 and higher |
0x0948 (1607); 0x0968 (1703 to 1803); 0x0A84 (1809); 0x0A9C (1903); 0x0AA4 |
0x0A20 (1607); 0x0A40 (1703 to 1803); 0x0B60 (1809); 0x0B78 (1903); 0x0B88 |
ULONG MajorRelease; |
1607 and higher |
0x094C (1607); 0x096C (1703 to 1803); 0x0A88 (1809); 0x0AA0 (1903); 0x0AA8 |
0x0A24 (1607); 0x0A44 (1703 to 1803); 0x0B64 (1809); 0x0B7C (1903); 0x0B8C |
ULONG Reserved1; |
1607 and higher |
The MajorRelease is an NTDDI version number as defined in the SDKDDKVER.H header. It adds to the kernel’s validation of the LOADER_PARAMETER_EXTENSION for the LOADER_BLOCK_MISMATCH bugcheck. Do not miss the irony that the version numbering that was removed for Windows 7 is brought back, with elaboration, now that Windows 10 makes the extension more variable than ever before.
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x0970 (1703 to 1803); 0x0A8C (1809); 0x0AA4 (1903); 0x0AAC |
0x0A48 (1703 to 1803); 0xB68 (1809); 0x0B80 (1903); 0x0B90 |
CHAR NtBuildLab [0xE0]; |
1703 and higher |
0x0A50 (1703 to 1803); 0x0B6C (1809); 0x0B84 (1903); 0x0B8C |
0x0B28 (1703 to 1803); 0x0C48 (1809); 0x0C60 (1903); 0x0C70 |
CHAR NtBuildLabEx [0xE0]; |
1703 and higher |
0x0B30 (1703 to 1803); 0x0C50 (1809); 0x0C68 (1903); 0x0C70 |
0x0C08 (1703 to 1803); 0x0D28 (1809); 0x0D40 (1903); 0x0D50 |
LOADER_RESET_REASON ResetReason; |
1703 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x0B60 (1803); 0x0C80 (1809); 0x0C98 (1903); 0x0CA0 |
0x0C38 (1703 to 1803); 0x0D58 (1809); 0x0D70 (1903); 0x0D80 |
ULONG MaxPciBusNumber; |
1803 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x0C84 (1809); 0x0C9C (1903); 0x0CA4 |
0x0D5C (1809); 0x0D74 (1903); 0x0D84 |
ULONG FeatureSettings; |
1809 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x0CA0 (1903); 0x0CA8 |
0x0D78 (1903); 0x0D88 |
ULONG HotPatchReserveSize; |
1903 and higher |
0x0CA4 (1903); 0x0CAC |
0x0D7C (1903); 0x0D8C |
ULONG RetpolineReserveSize; |
1903 and higher |
0x0D80 (1903); 0x0D90 |
struct { PVOID CodeBase; ULONGLONG CodeSize; } MiniExecutive; |
1903 and higher | |
0x0CA8 (1903); 0x0CB0 |
0x0D90 (1903); 0x0DA0 |
VSM_PERFORMANCE_DATA VsmPerformanceData; |
1903 and higher |
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x0CF0 | 0x0DE0 |
NUMA_MEMORY_RANGE *NumaMemoryRanges; |
2004 and higher |
0x0CF4 | 0x0DE8 |
ULONG NumaMemoryRangeCount; |
2004 and higher |
0x0CF8 | 0x0DEC |
ULONG IommuFaultPolicy; |
2004 and higher |
Version 6.0 introduced a single bit-wide flag, then at offsets 0x58 and 0x84, apparently within an anonymous structure. A likely anticipation is that there would soon be more, which indeed there were:
Mask | Definition | Versions |
---|---|---|
0x00000001 |
ULONG BootViaWinload : 1; |
6.0 only |
ULONG LastBootSucceeded : 1; |
6.1 and higher | |
0x00000002 |
ULONG LastBootShutdown : 1; |
6.1 and higher |
0x00000004 |
ULONG IoPortAccessSupported : 1; |
6.1 and higher |
0x00000008 |
ULONG BootDebuggerActive : 1; |
6.2 and higher |
0x00000010 |
ULONG StrongCodeGuarantees : 1; |
6.3 and higher |
0x00000020 |
ULONG HardStrongCodeGuarantees : 1; |
6.3 and higher |
0x00000040 |
ULONG SidSharingDisabled : 1; |
6.3 and higher |
0x00000080 |
ULONG TpmInitialized : 1; |
10.0 and higher |
0x00000100 |
ULONG VsmConfigured : 1; |
10.0 and higher |
0x00000200 |
ULONG IumEnabled : 1; |
10.0 and higher |
0x00000400 |
ULONG IsSmbboot : 1; |
1511 and higher |
0x00000800 |
ULONG BootLogEnabled : 1; |
1607 and higher |
0x00001000 |
ULONG DriverVerifierEnabled : 1; |
1809 and higher |
0x00002000 |
ULONG SuppressMonitorX : 1; |
1903 and higher |
0x00004000 |
ULONG KernelCetEnabled : 1; |
2004 and higher |
0x00008000 |
ULONG SuppressSmap : 1; |
2004 and higher |
0x0007F000 (1803); 0x001FE000 (1809); 0x001FC000 (1903); 0x001F0000 |
ULONG FeatureSettings : 7; |
1803 only |
ULONG Unused : 8; |
1809 only | |
ULONG Unused : 7; |
1903 only | |
ULONG Unused : 5; |
2004 and higher | |
0x01F80000 (1803); 0x07E00000 |
ULONG FeatureSimulations : 6; |
1803 and higher |
0x02000000 (1803); 0x08000000 |
ULONG MicrocodeOptedOut : 1; |
1803 only |
ULONG MicrocodeSelfHosting : 1; |
1809 and higher | |
0x04000000 (1803); 0x10000000 |
ULONG XhciLegacyHandoffSkip : 1; |
1803 and higher |
0x20000000 |
ULONG DisableInsiderOptInHVCI : 1; |
1809 and higher |
0x40000000 |
ULONG MicrocodeMinVerSupported : 1; |
1809 and higher |
0x80000000 |
ULONG GpuIommuEnabled : 1; |
1809 and higher |
ULONG Reserved : 31; |
6.0 only | |
ULONG Reserved : 29; |
6.1 only | |
ULONG Reserved : 28; |
6.2 only | |
ULONG Reserved : 25; |
6.3 only | |
ULONG Reserved : 22; |
10.0 only | |
ULONG Reserved : 21; |
1511 only | |
ULONG Reserved : 20; |
1607 to 1709 | |
ULONG Reserved : 5; |
1803 only |