Geoff Chappell - Software Analyst
The MI_SYSTEM_INFORMATION structure (formally _MI_SYSTEM_INFORMATION) is not just one of the largest that the kernel works with. It’s also arguably the most important of all structures to know for any kernel-mode debugging of Windows 10 that touches on memory management. The reason is that where earlier Windows versions have numerous internal variables for memory management, all (or most) of them showing plainly when debugging with public symbols, Windows 10 turns very many of them into members of the one internal variable, named MiState, with the side-effect that they show much less plainly. The MI_SYSTEM_INFORMATION is this variable’s type.
As a collection of what had been internal variables, the MI_SYSTEM_INFORMATION is highly susceptible to changing between builds. Almost all of the change from one build to the next is within substructures. Seen just at the immediate level of the structure’s own members, there have only been one addition, two removals and one relocation (this last to recover ten bytes of alignment space in the 64-bit builds). Still, very few of the members, let alone of members of members, keep their offsets from one build to the next. The following changes of size give a rough indication of the structure’s variability:
Version | Size (x86) | Size (x64) |
---|---|---|
10.0 to 1511 | 0x3CC0 | 0x1BC0 |
1607 | 0x3D80 | 0x1EC0 |
1703 | 0x3B00 | 0x1B40 |
1709 | 0x3BC0 | 0x1B00 |
1803 | 0x4FC0 | 0x2080 |
1809 | 0x50C0 | 0x3180 |
1903 | 0x4E40 | 0x3100 |
2004 | 0x4E80 | 0x3280 |
It is no accident that the size is always a multiple of 0x40: cache alignment is plainly a consideration for many of the members and substructures.
The sizes in the preceding table and the names and types in the next are from type information in the public symbol files for the kernel.
Offset (x86) | Offset (x64) | Definition | Versions | Remarks |
---|---|---|---|---|
0x00 | 0x00 |
MI_POOL_STATE Pools; |
10.0 and higher | |
0x0500 (10.0 to 1809); 0x0080 |
0x0100 (1511 to 1709); 0x0180 (1803 to 1809); 0x00C0 |
MI_SECTION_STATE Sections; |
10.0 and higher | |
0x0640 (10.0 to 1803); 0x0680 (1809); 0x0200 |
0x0380 (10.0 to 1607); 0x0340 (1703); 0x0380 (1709); 0x0400 (1803); 0x04C0 (1809); 0x0400 |
MI_SYSTEM_IMAGE_STATE SystemImages; |
10.0 and higher | |
0x06A4 (10.0); 0x06AC (1511 to 1709); 0x06B0 (1803); 0x06F0 (1809); 0x025C (1903); 0x0264 |
0x0430 (10.0); 0x0440 (1511 to 1607); 0x03F8 (1703); 0x0438 (1709); 0x04C0 (1803); 0x0580 (1809); 0x04A0 (1903); 0x04A8 |
MI_SESSION_STATE Sessions; |
10.0 and higher | |
0x16E0 (10.0); 0x16E8 (1511); 0x16F0 (1607); 0x16E8 (1703 to 1709); 0x16F0 (1803); 0x1730 (1809); 0x1290 (1903); 0x12B0 |
0x04C0 (10.0); 0x04D0 (1511); 0x04E0 (1607); 0x0480 (1703); 0x04C0 (1709); 0x0548 (1803); 0x1608 (1809); 0x1520 (1903); 0x1550 |
MI_PROCESS_STATE Processes; |
10.0 and higher | |
0x1750 (10.0); 0x1758 (1511); 0x1760 (1607); 0x1740 (1703); 0x1748 (1709); 0x1758 (1803); 0x17C0 (1809); 0x1300 (1903); 0x1340 |
0x0520 (10.0); 0x0530 (1511); 0x0540 (1607); 0x04B0 (1703); 0x04F8 (1709); 0x0590 (1803); 0x1680 (1809); 0x1580 (1903); 0x15C0 |
MI_HARDWARE_STATE Hardware; |
10.0 and higher | |
0x1800 (10.0 to 1511); 0x1840 (1607); 0x1800 (1703); 0x1840 (1709 to 1803); 0x1940 (1809); 0x1480 |
0x0600 (10.0 to 1511); 0x0640 (1607); 0x05C0 (1703); 0x0600 (1709); 0x0700 (1803); 0x1800 (1809); 0x1740 (1903); 0x1780 |
MI_SYSTEM_VA_STATE SystemVa; |
10.0 and higher | |
0x2CC0 (10.0 to 1511); 0x2D00 (1703); 0x2D40 (1709); 0x3F80 (1803); 0x4080 (1809); 0x3BC0 |
0x08C0 (10.0 to 1511); 0x0940 (1703); 0x09C0 (1709); 0x0C00 (1803); 0x1D00 (1809); 0x1BC0 (1903); 0x1C40 |
MI_COMBINE_STATE PageCombines; |
10.0 and higher | |
0x2D18 (1607 to 1703); 0x2D58 (1709); 0x3F98 (1803); 0x4098 (1809); 0x3BE0 |
0x0AE0 (1607 to 1703); 0x09D8 (1709); 0x0C18 (1803); 0x1D18 (1809); 0x1BE0 (1903); 0x1C60 |
MI_PAGELIST_STATE PageLists; |
1607 and higher | |
0x2CD8 (10.0 to 1511); 0x2D20 (1607 to 1703); 0x2D60 (1709); 0x3FB0 (1803); 0x40B0 (1809); 0x3BF8 |
0x0A60 (10.0 to 1511); 0x0AF0 (1607 to 1703); 0x09E8 (1709); 0x0C40 (1803); 0x1D40 (1809); 0x1C40 (1903); 0x1CC0 |
MI_PARTITION_STATE Partitions; |
10.0 and higher | |
0x2D08 (10.0); 0x2D10 (1511); 0x2D58 (1607 to 1703); 0x2D98 (1709); 0x3FE8 (1803); 0x40E8 (1809); 0x3C30 |
0x0AB8 (10.0); 0x0AC0 (1511); 0x0B50 (1607 to 1703); 0x0A48 (1709); 0x0CA0 (1803); 0x1DA0 (1809); 0x1D00 (1903); 0x1D80 |
MI_SHUTDOWN_STATE Shutdowns; |
10.0 and higher | |
0x2D58 (10.0 to 1511); 0x2DA0 (1607 to 1703); 0x2DE0 (1709); 0x4030 (1803); 0x4130 (1809); 0x3C78 |
0x0B38 (10.0); 0x0B40 (1511); 0x0BD0 (1607); 0x0BC8 (1703); 0x0AC0 (1709); 0x0D18 (1803); 0x1E18 (1809); 0x1D78 (1903); 0x1DF8 |
MI_ERROR_STATE Errors; |
10.0 and higher | |
0x2E00 (10.0 to 1511); 0x2E80 (1607 to 1703); 0x2EC0 (1709); 0x4100 (1803); 0x4200 (1809); 0x3D40 |
0x0C00 (10.0 to 1511); 0x0CC0 (1607); 0x0C80 (1703); 0x0B80 (1709); 0x0E00 (1803); 0x1F00 (1809); 0x1E40 (1903); 0x1EC0 |
MI_ACCESS_LOG_STATE AccessLog; |
10.0 and higher | |
0x2E80 (10.0 to 1511); 0x2F00 (1607 to 1703); 0x2F40 (1709); 0x4180 (1803); 0x4280 (1809); 0x3DC0 |
0x0C80 (10.0 to 1511); 0x0D40 (1607); 0x0D00 (1703); 0x0C00 (1709); 0x0E80 (1803); 0x1F80 (1809); 0x1EC0 (1903); 0x1F40 |
MI_DEBUGGER_STATE Debugger; |
10.0 and higher | |
0x2F40 (10.0 to 1511); 0x2FC0 (1607); 0x2F90 (1703); 0x2FD0 (1709); 0x4210 (1803); 0x4310 (1809); 0x3E50 |
0x0DC0 (10.0 to 1511); 0x0E80 (1607); 0x0E20 (1703); 0x0D20 (1709); 0x0FA0 (1803); 0x20A0 (1809); 0x1FE0 (1903); 0x2060 |
MI_STANDBY_STATE Standby; |
10.0 and higher | |
0x2FC0 (10.0 to 1511); 0x3040 (1607); 0x3000 (1703); 0x3040 (1709); 0x4280 (1803); 0x4380 (1809); 0x3EC0 |
0x0E80 (10.0 to 1511); 0x0F40 (1607); 0x0EC0 (1703); 0x0DC0 (1709); 0x1040 (1803); 0x2140 (1809); 0x2080 (1903); 0x2100 |
MI_SYSTEM_PTE_STATE SystemPtes; |
10.0 and higher | |
0x3140 (10.0 to 1511); 0x31C0 (1607); 0x3140 (1703); 0x31C0 (1709); 0x4400 (1803); 0x4500 (1809); 0x4040 |
0x1000 (10.0 to 1511); 0x1100 (1607); 0x1040 (1703); 0x1000 (1709); 0x1240 (1803); 0x2340 (1809); 0x2280 (1903); 0x2300 |
MI_IO_PAGE_STATE IoPages; |
10.0 and higher | |
0x3178 (10.0 to 1511); 0x3200 (1607); 0x3180 (1703); 0x3200 (1709); 0x4440 (1803); 0x4540 (1809); 0x4080 |
0x1060 (10.0 to 1511); 0x1170 (1607); 0x10B0 (1703); 0x1070 (1709); 0x12B0 (1803); 0x23B0 (1809); 0x22F0 (1903); 0x2370 |
MI_PAGING_IO_STATE PagingIo; |
10.0 and higher | |
0x31B0 (10.0 to 1511); 0x3238 (1607); 0x31B8 (1703); 0x3238 (1709); 0x4478 (1803); 0x4578 (1809); 0x40B8 (1903); 0x40E0 |
0x10B0 (10.0 to 1511); 0x11C0 (1607); 0x1100 (1703); 0x10C0 (1709); 0x1300 (1803); 0x2400 (1809); 0x2340 (1903); 0x2420 |
MI_COMMON_PAGE_STATE CommonPages; |
10.0 and higher | |
0x3200 (10.0 to 1511); 0x3280 (1607); 0x3200 (1703); 0x3280 (1709); 0x44C0 (1803); 0x45C0 (1809); 0x4100 (1903); 0x4140 |
0x1140 (10.0); 0x1180 (1511); 0x1280 (1607); 0x11C0 (1703); 0x1180 (1709); 0x13C0 (1803); 0x24C0 (1809); 0x2400 (1903); 0x2500 |
MI_SYSTEM_TRIM_STATE Trims; |
10.0 and higher | |
0x3240 (10.0 to 1511); 0x32C0 (1607) |
0x1180 (10.0); 0x11C0 (1511); 0x12C0 (1607) |
MI_RESAVAIL_TRACKER ResTrack; |
10.0 to 1607 | |
0x4180 | 0x2540 |
MI_ENCLAVE_STATE Enclaves; |
2004 and higher | |
0x3440 (10.0 to 1511); 0x34C0 (1607); 0x3240 (1703); 0x32C0 (1709); 0x4500 (1803); 0x4600 (1809); 0x4140 (1903); 0x41A4 |
0x1540 (10.0 to 1511); 0x1640 (1607); 0x1200 (1703); 0x11C0 (1709); 0x1400 (1803); 0x2500 (1809); 0x2440 (1903); 0x2588 |
ULONG_PTR Cookie; |
10.0 and higher | |
0x3444 (10.0 to 1511); 0x34C4 (1607) |
0x1548 (10.0 to 1511); 0x1648 (1607) |
LONG volatile ZeroingDisabled; |
10.0 to 1607 | next at 0x3248 and 0x1210 |
0x3448 (10.0 to 1511); 0x34C8 (1607); 0x3244 (1703); 0x32C4 (1709); 0x4504 (1803); 0x4604 (1809); 0x4144 (1903); 0x41A8 |
0x1550 (10.0 to 1511); 0x1650 (1607); 0x1208 (1703); 0x11C8 (1709); 0x1408 (1803); 0x2508 (1809); 0x2448 (1903); 0x2590 |
PVOID volatile *BootRegistryRuns; |
10.0 and higher | |
0x3248 (1703); 0x32C8 (1709); 0x4508 (1803); 0x4608 (1809); 0x4148 (1903); 0x41AC |
0x1210 (1703); 0x11D0 (1709); 0x1410 (1803); 0x2510 (1809); 0x2450 (1903); 0x2598 |
LONG volatile ZeroingDisabled; |
1703 and higher | previously at 0x34C4 and 0x1648 |
0x344C (10.0 to 1511); 0x34CC (1607); 0x324C (1703); 0x32CC (1709); 0x450C (1803); 0x460C (1809); 0x414C (1903); 0x41B0 |
0x1558 (10.0 to 1511); 0x1658 (1607); 0x1214 (1703); 0x11D4 (1709); 0x1414 (1803); 0x2514 (1809); 0x2454 (1903); 0x259C |
BOOLEAN FullyInitialized; |
10.0 and higher | |
0x344D (10.0 to 1511); 0x34CD (1607); 0x324D (1703); 0x32CD (1709); 0x450D (1803); 0x460D (1809); 0x414D (1903); 0x41B1 |
0x1559 (10.0 to 1511); 0x1659 (1607); 0x1215 (1703); 0x11D5 (1709); 0x1415 (1803); 0x2515 (1809); 0x2455 (1903); 0x259D |
BOOLEAN SafeBooted; |
10.0 and higher | |
0x3450 (10.0 to 1511) | 0x1560 (10.0 to 1511) |
RTL_BITMAP LargePfnBitMap; |
10.0 to 1511 | |
0x3458 (10.0 to 1511); 0x34D0 (1607); 0x3250 (1703); 0x32D0 (1709); 0x4510 (1803); 0x4610 (1809); 0x4150 (1903); 0x41B4 |
RTL_BITMAP PfnBitMap; |
10.0 and higher | ||
0x3460 (10.0 to 1511); 0x34D8 (1607); 0x3258 (1703); 0x32D8 (1709); 0x4518 (1803); 0x4618 (1809); 0x4158 (1903); 0x41BC |
0x1570 (10.0 to 1511); 0x1660 (1607); 0x1218 (1703); 0x11D8 (1709); 0x1418 (1803); 0x2518 (1809); 0x2458 (1903); 0x25A0 |
struct _TlgProvider_t const *TraceLogging; |
10.0 and higher | |
0x3480 (10.0 to 1511); 0x3500 (1607); 0x3280 (1703); 0x3300 (1709); 0x4540 (1803); 0x4640 (1809); 0x4180 (1903); 0x41C0 |
0x1580 (10.0 to 1511); 0x1680 (1607); 0x1240 (1703); 0x1200 (1709); 0x1440 (1803); 0x2540 (1809); 0x2480 (1903); 0x25C0 |
MI_VISIBLE_STATE Vs; |
10.0 and higher |