SYSTEM_INFORMATION_CLASS

The SYSTEM_INFORMATION_CLASS (formally _SYSTEM_INFORMATION_CLASS) is an enumeration whose values are intended as input to the ZwQuerySystemInformation, ZwQuerySystemInformationEx and ZwSetSystemInformation functions (and to the corresponding forms whose names begin with Nt instead of Zw). Different values from the enumeration select different types of information to query or set.

Documentation Status

Microsoft has kept SYSTEM_INFORMATION_CLASS remarkably private. Analogues for information about files, processes, threads, and much else, have all their supported values defined in header files from as far back as the Device Driver Kit (DDK) for Windows NT 3.51. Even as late as the Windows Driver Kit (WDK) for Windows 10, however, SYSTEM_INFORMATION_CLASS has no C-language definition in any WDK header.

The closest that Microsoft has come to formal disclosure of the SYSTEM_INFORMATION_CLASS enumeration is some plainly reluctant documentation of NtQuerySystemInformation and a C-language definition of the enumeration in a header named WINTERNL.H file from the Software Development Kit (SDK) for user-mode programming. This header was added to the SDK in 2002, apparently for Microsoft’s compliance with a settlement concerning unfair use of internal Windows APIs by “middleware” products such as Internet Explorer. Better late than never, it might be argued, except that neither the documentation’s listing nor the header’s definition of SYSTEM_INFORMATION_CLASS is anywhere near complete. Perhaps Microsoft felt compelled to disclose only the cases that Microsoft found its middleware using, but whatever the reason, the disclosure was not so much partial as greatly reduced—from approximately two hundred to just nine, increased to 10 in the SDK for Windows 8.1, and to 12 for the documentation online as found today, 28th October 2016, but dating from who knows when.

Symbol Files

Microsoft’s names for all the SYSTEM_INFORMATION_CLASS values have slipped out, of course. As usual when it comes to Microsoft’s names for otherwise undocumented material, they’re knowable from type information in symbol files that Microsoft publishes for debugging support. Not at all usual is which symbol files: not for the kernel, where the enumeration is interpreted and the relevant functions are implemented; nor even for NTDLL or other such low-level user-mode modules that call the functions as their system-level support of the documented Win32 API; but for various higher-level user-mode DLLs that are far enough away from the system that they ought, if only in principle, not need any functionality that isn’t documented for everyone.

The most conspicuous is URLMON.DLL, for it is a component of Internet Explorer, i.e., of the most prominent “middleware” that compelled even the grudgingly partial disclosure in 2002. The symbol files that have been publicly available for URLMON since 2012 for Windows 8 through to Windows 10 before the 1803 release show that it is built not with the reduced SYSTEM_INFORMATION_CLASS from WINTERNL.H but with the whole thing. Indeed, the symbol files record that the whole definition was available to URLMON.DLL through its source code’s inclusion of a header named ntexapi.h which Microsoft is not known ever to have published for non-Microsoft programmers.

However URLMON was built in the years when Microsoft’s compliance with the settlement was reviewed by—it might be hoped—competent regulators, URLMON evidently is built now with more system-level knowledge of Windows than Microsoft publishes even for kernel-mode device driver programmers. Do not tell me that there was not at Microsoft somewhere some time someone who enjoyed mocking the government and courts over what Microsoft got away with on this. (I say this as criticism of the government and courts very much more than of Microsoft.)

For no known reason, the public symbol files for URLMON in the 1803 release have no type information at all, but SYSTEM_INFORMATION_CLASS continues to be disclosed in other symbol files, e.g., for OLE32.DLL.

Libraries

Much further back, it turns out that type information for the SYSTEM_INFORMATION_CLASS was disclosed in statically linked libraries that Microsoft distributed with early DDKs: a GDISRVL.LIB in the DDK for Windows NT 3.51; and SHELL32.LIB in the DDK for Windows NT 4.0. That the latter is otherwise just an import library for SHELL32.DLL suggests strongly that these disclosures were one-off oversights. Still, published they were.

Another statically linked library that helps fill some gaps is CLFSMGMT.LIB which Microsoft distributes with the Software Development Kit (SDK) for user-mode programming, starting with Windows Vista. This too was surely an oversight, but it’s as openly published as any other programming resource.

Enumeration

Of the very many defined cases, some can be used successfully only to query or only to set. Some can’t usefully be called either way—at least, not in all versions. The present purpose however is not to show which values are implemented non-trivially in which versions, but which values are defined in which versions, as much as can be known from material that Microsoft has published (whether intending a disclosure or not). For version 6.2 and higher, the type information in symbol files is surely definitive. The early form of type information that can be found in a few import libraries for versions 3.51 and 4.0 is here taken as definitive also, as is type information from CLFSMGMT.LIB for 32-bit versions 6.0 and 6.1, though all with some caution since libraries need not be built with exactly the same headers as were the operating systems that they target. What names are defined for other versions is something of a guess from trying to match the implementations in the binary code with the names as known from type information for other versions. Some of the resulting editorial decisions, mostly about the versions in between, i.e., 5.0 to 5.2, are explained after the table.

Some information classes were introduced or changed in service-pack releases. The following shorthands are used below:

As usual for this website, names that look to be undocumented are highlighted yellow. For information classes that are documented, I do not trouble over any finer shading of whether the documentation was available immediately. After all, for very few of these is the documentation anywhere near to looking even vaguely substantial enough to be worth having, whether contemporaneously or years late.

Value Name Versions Remarks
0x00 SystemBasicInformation all  
0x01 SystemProcessorInformation all  
0x02 SystemPerformanceInformation all  
0x03 SystemTimeOfDayInformation all  
0x04 SystemPathInformation all  
0x05 SystemProcessInformation all  
0x06 SystemCallCountInformation all  
0x07 SystemDeviceInformation all  
0x08 SystemProcessorPerformanceInformation all  
0x09 SystemFlagsInformation all  
0x0A SystemCallTimeInformation all  
0x0B SystemModuleInformation all  
0x0C SystemLocksInformation all  
0x0D SystemStackTraceInformation all  
0x0E SystemPagedPoolInformation all  
0x0F SystemNonPagedPoolInformation all  
0x10 SystemHandleInformation all  
0x11 SystemObjectInformation all  
0x12 SystemPageFileInformation all  
0x13 SystemVdmInstemulInformation all  
0x14 SystemVdmBopInformation all  
0x15 SystemFileCacheInformation all  
0x16 SystemPoolTagInformation 3.50 and higher  
0x17 SystemSpare1Information 3.50 only supposed name
SystemInterruptInformation 3.51 and higher  
0x18 SystemSpare2Information 3.50 only supposed name
SystemDpcBehaviorInformation 3.51 and higher  
0x19 SystemSpare3Information 3.50 to 3.51  
SystemFullMemoryInformation 4.0 and higher  
0x1A SystemSpare4Information 3.50 only supposed name
SystemLoadGdiDriverInformation 3.51 and higher  
0x1B SystemSpare5Information 3.50 only supposed name
SystemUnloadGdiDriverInformation 3.51 and higher  
0x1C SystemTimeAdjustmentInformation 3.50 and higher  
0x1D SystemSpare6Information 3.50 to 3.51  
SystemSummaryMemoryInformation 4.0 and higher  
0x1E SystemNextEventIdInformation 3.50 to 4.0  
unknown 5.0 only  
SystemMirrorMemoryInformation 5.1 and higher  
0x1F SystemEventIdsInformation 3.50 to 4.0  
unknown 5.0 to 5.2  
SystemPerformanceTraceInformation 6.0 and higher  
0x20 SystemCrashDumpInformation 3.50 to 5.0  
SystemObsolete0 5.1 and higher  
0x21 SystemExceptionInformation 3.50 and higher  
0x22 SystemCrashDumpStateInformation 3.50 and higher  
0x23 SystemKernelDebuggerInformation 3.50 and higher  
0x24 SystemContextSwitchInformation 3.50 and higher  
0x25 SystemRegistryQuotaInformation 3.51 and higher  
0x26 SystemExtendServiceTableInformation 3.51 and higher  
0x27 SystemPrioritySeperation 3.51 and higher  
0x28 SystemPlugPlayBusInformation 3.51 to 4.0  
unknown 5.0 only  
SystemVerifierAddDriverInformation 5.1 and higher  
0x29 SystemDockInformation 3.51 to 4.0  
unknown 5.0 only  
SystemVerifierRemoveDriverInformation 5.1 and higher  
0x2A SystemPowerInformation 3.51 to 5.0  
SystemProcessorIdleInformation 5.1 and higher  
0x2B SystemProcessorSpeedInformation 3.51 to 4.0  
SystemLegacyDriverInformation 5.0 and higher  
0x2C SystemCurrentTimeZoneInformation 4.0 and higher  
0x2D SystemLookasideInformation 4.0 and higher  
0x2E SystemTimeSlipNotification 5.0 and higher  
0x2F SystemSessionCreate 5.0 and higher  
0x30 SystemSessionDetach 5.0 and higher  
0x31 SystemSessionInformation 5.0 and higher  
0x32 SystemRangeStartInformation 5.0 and higher  
0x33 SystemVerifierInformation 5.0 and higher  
0x34 SystemVerifierThunkExtend 5.0 and higher  
0x35 SystemSessionProcessInformation 5.0 and higher  
0x36 SystemObjectSecurityMode late 5.0 only later as 0x46
SystemLoadGdiDriverInSystemSpace 5.1 and higher  
0x37 unknown late 5.0 only later as 0x47
SystemNumaProcessorMap 5.1 and higher  
0x38 SystemPrefetcherInformation 5.1 and higher  
0x39 SystemExtendedProcessInformation 5.1 and higher  
0x3A SystemRecommendedSharedDataAlignment 5.1 and higher  
0x3B SystemComPlusPackage 5.1 and higher  
0x3C SystemNumaAvailableMemory 5.1 and higher  
0x3D SystemProcessorPowerInformation 5.1 and higher  
0x3E SystemEmulationBasicInformation 5.1 and higher  
0x3F SystemEmulationProcessorInformation 5.1 and higher  
0x40 SystemExtendedHandleInformation 5.1 and higher  
0x41 SystemLostDelayedWriteInformation 5.1 and higher  
0x42 unknown late 5.1 only  
SystemBigPoolInformation 5.2 and higher  
0x43 SystemSessionPoolTagInformation 5.2 and higher  
0x44 SystemSessionMappedViewInformation 5.2 and higher  
0x45 SystemHotpatchInformation late 5.1 and higher  
0x46 SystemObjectSecurityMode late 5.1 and higher earlier as 0x36
0x47 unknown late 5.1 only earlier as 0x37
SystemWatchdogTimerHandler 5.2 and higher  
0x48 SystemWatchdogTimerInformation 5.2 and higher  
0x49 SystemLogicalProcessorInformation very late 5.1 and higher  
0x4A SystemWow64SharedInformationObsolete late 5.2 and higher  
0x4B SystemRegisterFirmwareTableInformationHandler late 5.2 and higher  
0x4C SystemFirmwareTableInformation late 5.2 and higher  
0x4D SystemModuleInformationEx 6.0 and higher  
0x4E SystemVerifierTriageInformation 6.0 and higher  
0x4F SystemSuperfetchInformation 6.0 and higher  
0x50 SystemMemoryListInformation 6.0 and higher  
0x51 SystemFileCacheInformationEx late 5.2 and higher  
0x52 SystemThreadPriorityClientIdInformation 6.0 and higher  
0x53 SystemProcessorIdleCycleTimeInformation 6.0 and higher  
0x54 SystemVerifierCancellationInformation 6.0 and higher  
0x55 SystemProcessorPowerInformationEx 6.0 and higher  
0x56 SystemRefTraceInformation 6.0 and higher  
0x57 SystemSpecialPoolInformation 6.0 and higher  
0x58 SystemProcessIdInformation 6.0 and higher  
0x59 SystemErrorPortInformation 6.0 and higher  
0x5A SystemBootEnvironmentInformation 6.0 and higher  
0x5B SystemHypervisorInformation 6.0 and higher  
0x5C SystemVerifierInformationEx 6.0 and higher  
0x5D SystemTimeZoneInformation 6.0 and higher  
0x5E SystemImageFileExecutionOptionsInformation 6.0 and higher  
0x5F SystemCoverageInformation 6.0 and higher  
0x60 SystemPrefetchPatchInformation 6.0 and higher  
0x61 SystemVerifierFaultsInformation 6.0 and higher  
0x62 SystemSystemPartitionInformation 6.0 and higher  
0x63 SystemSystemDiskInformation 6.0 and higher  
0x64 SystemProcessorPerformanceDistribution 6.0 and higher  
0x65 SystemNumaProximityNodeInformation 6.0 and higher  
0x66 SystemDynamicTimeZoneInformation 6.0 and higher  
0x67 SystemCodeIntegrityInformation 6.0 and higher  
0x68 SystemProcessorMicrocodeUpdateInformation 6.0 and higher  
0x69 SystemProcessorBrandString late 6.0 and higher  
0x6A SystemVirtualAddressInformation late 6.0 and higher  
0x6B SystemLogicalProcessorAndGroupInformation 6.1 and higher  
0x6C SystemProcessorCycleTimeInformation 6.1 and higher  
0x6D SystemStoreInformation 6.1 and higher  
0x6E SystemRegistryAppendString 6.1 and higher  
0x6F SystemAitSamplingValue 6.1 and higher  
0x70 SystemVhdBootInformation 6.1 and higher  
0x71 SystemCpuQuotaInformation 6.1 and higher  
0x72 SystemNativeBasicInformation 6.1 and higher  
0x73 SystemErrorPortTimeouts 6.1 and higher  
0x74 SystemLowPriorityIoInformation 6.1 and higher  
0x75 SystemBootEntropyInformation 6.1 and higher  
0x76 SystemVerifierCountersInformation 6.1 and higher  
0x77 SystemPagedPoolInformationEx 6.1 and higher  
0x78 SystemSystemPtesInformationEx 6.1 and higher  
0x79 SystemNodeDistanceInformation 6.1 and higher  
0x7A SystemAcpiAuditInformation 6.1 and higher  
0x7B SystemBasicPerformanceInformation 6.1 and higher  
0x7C SystemQueryPerformanceCounterInformation late 6.1 and higher  
0x7D SystemSessionBigPoolInformation 6.2 and higher  
0x7E SystemBootGraphicsInformation 6.2 and higher  
0x7F SystemScrubPhysicalMemoryInformation 6.2 and higher  
0x80 SystemBadPageInformation 6.2 and higher  
0x81 SystemProcessorProfileControlArea 6.2 and higher  
0x82 SystemCombinePhysicalMemoryInformation 6.2 and higher  
0x83 SystemEntropyInterruptTimingInformation 6.2 and higher  
0x84 SystemConsoleInformation 6.2 and higher  
0x85 SystemPlatformBinaryInformation 6.2 and higher  
0x86 SystemThrottleNotificationInformation 6.2 only  
SystemPolicyInformation 6.3 and higher  
0x87 SystemHypervisorProcessorCountInformation 6.2 and higher  
0x88 SystemDeviceDataInformation 6.2 and higher  
0x89 SystemDeviceDataEnumerationInformation 6.2 and higher  
0x8A SystemMemoryTopologyInformation 6.2 and higher  
0x8B SystemMemoryChannelInformation 6.2 and higher  
0x8C SystemBootLogoInformation 6.2 and higher  
0x8D SystemProcessorPerformanceInformationEx 6.2 and higher  
0x8E SystemSpare0 6.2 to 1511  
SystemCriticalProcessErrorLogInformation 1607 and higher  
0x8F SystemSecureBootPolicyInformation 6.2 and higher  
0x90 SystemPageFileInformationEx 6.2 and higher  
0x91 SystemSecureBootInformation 6.2 and higher  
0x92 SystemEntropyInterruptTimingRawInformation 6.2 and higher  
0x93 SystemPortableWorkspaceEfiLauncherInformation 6.2 and higher  
0x94 SystemFullProcessInformation 6.2 and higher  
0x95 SystemKernelDebuggerInformationEx 6.3 and higher  
0x96 SystemBootMetadataInformation 6.3 and higher  
0x97 SystemSoftRebootInformation 6.3 and higher  
0x98 SystemElamCertificateInformation 6.3 and higher  
0x99 SystemOfflineDumpConfigInformation 6.3 and higher  
0x9A SystemProcessorFeaturesInformation 6.3 and higher  
0x9B SystemRegistryReconciliationInformation 6.3 and higher  
0x9C SystemEdidInformation 6.3 and higher  
0x9D SystemManufacturingInformation 10.0 and higher  
0x9E SystemEnergyEstimationConfigInformation 10.0 and higher  
0x9F SystemHypervisorDetailInformation 10.0 and higher  
0xA0 SystemProcessorCycleStatsInformation 10.0 and higher  
0xA1 SystemVmGenerationCountInformation 10.0 and higher  
0xA2 SystemTrustedPlatformModuleInformation 10.0 and higher  
0xA3 SystemKernelDebuggerFlags 10.0 and higher  
0xA4 SystemCodeIntegrityPolicyInformation 10.0 and higher  
0xA5 SystemIsolatedUserModeInformation 10.0 and higher  
0xA6 SystemHardwareSecurityTestInterfaceResultsInformation 10.0 and higher  
0xA7 SystemSingleModuleInformation 10.0 and higher  
0xA8 SystemAllowedCpuSetsInformation 10.0 and higher  
0xA9 SystemDmaProtectionInformation 10.0 and higher  
0xAA SystemInterruptCpuSetsInformation 10.0 and higher  
0xAB SystemSecureBootPolicyFullInformation 10.0 and higher  
0xAC SystemCodeIntegrityPolicyFullInformation 10.0 and higher  
0xAD SystemAffinitizedInterruptProcessorInformation 10.0 and higher  
0xAE SystemRootSiloInformation 10.0 and higher  
0xAF SystemCpuSetInformation 10.0 and higher  
0xB0 SystemCpuSetTagInformation 10.0 and higher  
0xB1 SystemWin32WerStartCallout 1511 and higher  
0xB2 SystemSecureKernelProfileInformation 1511 and higher  
0xB3 SystemCodeIntegrityPlatformManifestInformation 1607 and higher  
0xB4 SystemInterruptSteeringInformation 1607 and higher  
0xB5 SystemSuppportedProcessorArchitectures 1607 and higher  
0xB6 SystemMemoryUsageInformation 1607 and higher  
0xB7 SystemCodeIntegrityCertificateInformation 1607 and higher  
0xB8 SystemPhysicalMemoryInformation 1703 and higher  
0xB9 SystemControlFlowTransition 1703 and higher  
0xBA SystemKernelDebuggingAllowed 1703 and higher  
0xBB SystemActivityModerationExeState 1703 and higher  
0xBC SystemActivityModerationUserSettings 1703 and higher  
0xBD SystemCodeIntegrityPoliciesFullInformation 1703 and higher  
0xBE SystemCodeIntegrityUnlockInformation 1703 and higher  
0xBF SystemIntegrityQuotaInformation 1703 and higher  
0xC0 SystemFlushInformation 1703 and higher  
0xC1 SystemProcessorIdleMaskInformation 1709 and higher  
0xC2 SystemSecureDumpEncryptionInformation 1709 and higher  
0xC3 SystemWriteConstraintInformation 1709 and higher  
0xC4 SystemKernelVaShadowInformation 1803 and higher  
0xC5 SystemHypervisorSharedPageInformation 1803 and higher  
0xC6 SystemFirmwareBootPerformanceInformation 1803 and higher  
0xC7 SystemCodeIntegrityVerificationInformation 1803 and higher  
0xC8 SystemFirmwarePartitionInformation 1803 and higher  
0xC9 SystemSpeculationControlInformation 1803 and higher  
0xCA SystemDmaGuardPolicyInformation 1803 and higher  
0xCB SystemEnclaveLaunchControlInformation 1803 and higher  
0xCC SystemWorkloadAllowedCpuSetsInformation 1809 and higher  
0xCD SystemCodeIntegrityUnlockModeInformation 1809 and higher  
0xCE SystemLeapSecondInformation 1809 and higher  
0xCF SystemFlags2Information 1809 and higher  
0xD0 SystemSecurityModelInformation 1903 and higher  
0xD1 SystemCodeIntegritySyntheticCacheInformation 1903 and higher  
0xD2 SystemFeatureConfigurationInformation 2004 and higher  
0xD3 SystemFeatureConfigurationSectionInformation 2004 and higher  
0xD4 SystemFeatureUsageSubscriptionInformation 2004 and higher  
0xD5 SystemSecureSpeculationControlInformation 2004 and higher  
0x69 (6.0);
0x6B (late 6.0);
0x7C (6.1);
0x7D (late 6.1);
0x95 (6.2);
0x9D (6.3);
0xB1 (10.0);
0xB3 (1511);
0xB8 (1607);
0xC1 (1703);
0xC4 (1709);
0xCC (1803);
0xD0 (1809);
0xD2 (1903);
0xD6
MaxSystemInfoClass    

Though SystemCallTimeInformation (0x0A) is shown above as original, it is invalid in version 3.10. It plausibly was not yet named or had some other name to mark it explicitly as spare or perhaps was implemented only in debug builds or even in private builds that Microsoft kept for its own testing during development. Version 3.50 changes it from invalid to not implemented, i.e., so that it returns STATUS_NOT_IMPLEMENTED instead of STATUS_INVALID_INFO_CLASS, which is how it remains even now. This is here taken to mean that if it was not yet defined for version 3.10 then it was for 3.50. That information classes can be defined even when invalid is established by SystemVdmBopInformation (0x14), which appears in type information both old and new even though the information class is invalid in all known versions.

On the other hand, type information for version 3.51 establishes that Microsoft did have a naming scheme to indicate explicitly that an invalid information class is spare. The numbering in the known names SystemSpare3Information (0x19) and SystemSpare6Information (0x1D) of information classes that were still invalid in version 3.51 is naturally explained by hypothesising SystemSpare1Information (0x17), SystemSpare2Information (0x18), SystemSpare4Information (0x1A) and SystemSpare5Information (0x1B) for nearby information classes that have non-trivial implementations (and meaningful names) in version 3.51 but which the version 3.50 rejects as invald.

Exactly when SystemNextEventIdInformation (0x1E) and SystemEventIdsInformation (0x1F) got new names is unclear. That they had these names for versions 3.51 and 4.0 is certain from type information, but both are explicitly not implemented in versions 3.50 to 4.0. Version 5.0 changed both to invalid. Non-trivial implementations came with version 6.0 and are consistent with names that are known from type information. But while invalid did they retain their old names, or get spare names, or no names at all, or get the new names ahead of a released implementation?

Contrast with SystemCrashDumpInformation (0x20) which never has been reassigned since it was made invalid in version 5.1. It is known to have been renamed to SystemObsolete0 in time for version 6.0, but exactly when is not known.

The spelling of SystemPrioritySeperation (0x27) is Microsoft’s.

Though both SystemPlugPlayBusInformation (0x28) and SystemDockInformation (0x29) are explicitly not implemented in versions 3.51 and 4.0, these names have the certainty of type information. Version 5.0 re-implemented them as invalid until new use was found in version 5.1. What they were named meanwhile is not known. Similar considerations apply to SystemPowerInformation (0x2A) except that this information class is invalid even in the versions 3.51 and 4.0 for which the name is known. It is still invalid in version 5.0, and so the name is thought to have persisted.

The information class SystemSessionInformation (0x31) is another that is invalid in all known versions. Its known name for version 6.0 and higher is here thought to be contemporaneous with the nearby information classes that also deal with sessions.

Information classes 0x36 and 0x37 are valid in the version 5.0 from Windows 2000 SP4 but their implementations do not match the names that are known from later type information. They do instead match the later SystemObjectSecurityMode (0x46) and the trivially successful information class 0x47 as implemented in the version 5.1 from Windows XP SP2. It is here thought that the additions for Windows XP SP2 were appended to the Windows 2000 enumeration when back-fitting to the roughly contemporaneous Windows 2000 SP4. Whether the diferent numbering for different versions was intended or is just a side-effect of carelessly writing a conditional compilation block is not known.

Information class 0x42 cannot be SystemBigPoolInformation before version 5.2. It becomes valid in the version 5.1 from Windows XP SP2 but as an alias for SystemObjectSecurityMode (0x46).

The change of name for case 0x86 is what’s shown in the symbol files. The implementation in version 6.2 is consistent with SystemPolicyInformation in subsequent versions. The original name, SystemThrottleNotificationInformation, at best remains from some other use that was dropped during development.

It is not known when Microsoft started ending the enumeration with MaxSystemInfoClass. The name is established in the type information for version 6.0 and higher but is absent from type information for versions 3.51 and 4.0.