Geoff Chappell, Software Analyst
The SYSTEM_POOL_INFORMATION structure may be what a successful call to ZwQuerySystemInformation or NtQuerySystemInformation would produce in its output buffer when given the information classes SystemPagedPoolInformation (0x0E) and SystemNonPagedPoolInformation (0x0F). Instead, these information classes are not implemented in any known Windows version, at least not in retail builds.
The SYSTEM_POOL_INFORMATION structure is not documented.
Microsoft does publish the practical equivalent of a C-language definition as type information in public symbol files, though not for the kernel, where the structure is prepared, nor even for low-level user-mode DLLs that interpret the structure, but for various higher-level user-mode DLLs such as URLMON.DLL and only then starting with version 6.2.
Two earlier disclosures of type information are known, though not in symbol files but in statically linked libraries: GDISRVL.LIB from the Device Driver Kit (DDK) for Windows NT 3.51; and SHELL32.LIB from the DDK for Windows NT 4.0.
The SYSTEM_POOL_INFORMATION is 0x1C or 0x28 bytes in 32-bit and 64-bit Windows, respectively, starting with version 3.51, but is 0x48 bytes in earlier versions.
Offset (x86) | Offset (x64) | Definition | Versions |
---|---|---|---|
0x00 | 0x00 |
ULONG_PTR TotalSize; |
3.51 and higher |
0x04 | 0x08 |
PVOID FirstEntry; |
3.51 and higher |
0x08 | 0x10 |
USHORT EntryOverhead; |
3.51 and higher |
0x0A | 0x12 |
BOOLEAN PoolTagPresent; |
3.51 and higher |
0x0B | 0x13 |
UCHAR Spare0; |
3.51 and higher |
0x0C | 0x14 |
ULONG NumberOfEntries; |
3.51 and higher |
0x38 (3.10 to 3.50); 0x10 |
0x18 |
SYSTEM_POOL_ENTRY Entries [ANYSIZE_ARRAY]; |
all |
The SYSTEM_POOL_ENTRY structure is 0x0C or 0x10 bytes in 32-bit and 64-bit Windows, respectively, starting with version 3.51. In earlier versions, it is 0x10 bytes. While it seems to be used nowhere else, it may as well be presented here:
Offset | Definition | Versions |
---|---|---|
0x00 |
BOOLEAN Allocated; |
3.51 and higher |
0x01 |
UCHAR Spare0; |
3.51 and higher |
0x02 |
USHORT AllocatorBackTraceIndex; |
3.51 and higher |
0x04 |
ULONG Size; |
3.51 and higher |
0x08 |
union { UCHAR Tag [4]; ULONG TagUlong; PVOID ProcessChargedQuota }; |
3.51 and higher |