Geoff Chappell, Software Analyst
The SYSTEM_PROCESSOR_FEATURES_INFORMATION structure is what a successful call to ZwQuerySystemInformation or NtQuerySystemInformation produces in its output buffer when given the information class SystemProcessorFeaturesInformation (0x9A).
The SYSTEM_PROCESSOR_FEATURES_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.
The SYSTEM_PROCESSOR_FEATURES_INFORMATION is 0x20 bytes in both 32-bit and 64-bit Windows.
Offset | Definition | Versions |
---|---|---|
0x00 |
ULONGLONG ProcessorFeatureBits; |
6.3 and higher |
0x08 |
ULONGLONG Reserved [3]; |
6.3 and higher |
The ProcessorFeatureBits are retrieved directly from the kernel’s internal variable KeFeatureBits. So too is the same-named member of the much older SYSTEM_PROCESSOR_INFORMATION but it is there only a ULONG. The SYSTEM_PROCESSOR_FEATURES_INFORMATION structure with its 64-bit ProcessorFeatureBits is not known to have any other motivation than the widening of KeFeatureBits for 64-bit Windows 8.1 and 32-bit Windows 10.
The internal variable KeFeatureBits that is the source of the ProcessorFeatureBits is itself the intersection of feature bits for all the processors. Put another way, each set ProcessorFeatureBits tells of a feature that the kernel has identified for use on all processors. Note the phrase “identified for use”. A processor feature can have been identified as present yet be rejected for use.
The feature bits for any one processor are kept in the FeatureBits member of that processor’s KPRCB.