SYSTEM_PROCESSOR_INFORMATION

The SYSTEM_PROCESSOR_INFORMATION structure is what a successful call to ZwQuerySystemInformation or NtQuerySystemInformation produces in its output buffer when given the information classes SystemProcessorInformation (0x01) or SystemEmulationProcessorInformation (0x3F).

Not that anyone is remotely likely to be troubled by this nowadays, but beware that before version 3.51 this information class produces an array of these structures—well, of some structure that’s the same size—one per processor.

Usage

The primary use of the SystemProcessorInformation case of NtQuerySystemInformation is to support the KERNEL32 function GetSystemInfo, specifically to obtain values for the following members of that function’s SYSTEM_INFO structure:

If these are all that is wanted, then use GetSystemInfo instead.

Documentation Status

The SYSTEM_PROCESSOR_INFORMATION structure is not documented.

Layout

The SYSTEM_PROCESSOR_INFORMATION is 0x0C bytes in both 32-bit and 64-bit Windows in versions 3.51 and higher.

Offset Definition
0x00
USHORT ProcessorArchitecture;
0x02
USHORT ProcessorLevel;
0x04
USHORT ProcessorRevision;
0x06
USHORT MaximumProcessors;
0x08
ULONG ProcessorFeatureBits;

In 32-bit Windows, the structure is filled exactly the same for both information classes. The x64 builds treat SystemEmulationBasicInformation differently, specifically to force ProcessorArchitecture to PROCESSOR_ARCHITECTURE_INTEL (0). This allows WOW64.DLL, executing 64-bit code in a 32-bit process, to get processor information that’s suited to the 32-bit caller.

The interpretation is known to be different before version 3.51. The only member that is filled in is the first and it is then a dword. It is set to 386, 486, 586, etc, according to whether the CpuType in the corresponding KPRCB is 3, 4, 5, etc. It was perhaps named ProcessorType for it is the immediate origin of the dwProcessorType that is documented for the user-mode SYSTEM_INFO structure as an “obsolete member that is retained for compatibility”.