Geoff Chappell, Software Analyst
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.
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.
The SYSTEM_PROCESSOR_INFORMATION structure is not documented.
The SYSTEM_PROCESSOR_INFORMATION is 0x0C bytes in both 32-bit and 64-bit Windows in versions 3.51 and higher.
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”.