SYSTEM_INFORMATION_CLASS 在哪里定义的?

Where is SYSTEM_INFORMATION_CLASS defined?

我遇到了 short C++ code designed to prevent applications from stealing focus using DLL injection。与 C++ 一样,我遇到未定义和缺少库的问题。

具体来说,这个常量是未定义的:SYSTEM_INFORMATION_CLASS。在这段代码中:

typedef NTSTATUS( WINAPI* PNT_QUERY_SYSTEM_INFORMATION ) ( 
  __in       SYSTEM_INFORMATION_CLASS SystemInformationClass,     
  __inout    PVOID SystemInformation, 
  __in       ULONG SystemInformationLength, 
  __out_opt  PULONG ReturnLength    
);

windows.h 已包含在内,因此它一定是缺少其他内容。谷歌搜索时,我得到了很多关于获取 CPU 温度的结果,但我看不到我应该在其中包含什么...

终于找到了some SYSTEM_INFORMATION_CLASS definition using search terms "typedef SYSTEM_INFORMATION_CLASS"。尽管在发布此消息时,我自己的问题是第三个结果...

这是我得到的:

typedef enum _SYSTEM_INFORMATION_CLASS {
    SystemBasicInformation,
    SystemProcessorInformation,
    SystemPerformanceInformation,
    SystemTimeOfDayInformation,
    SystemPathInformation,
    SystemProcessInformation,
    SystemCallCountInformation,
    SystemDeviceInformation,
    SystemProcessorPerformanceInformation,
    SystemFlagsInformation,
    SystemCallTimeInformation,
    SystemModuleInformation,
    SystemLocksInformation,
    SystemStackTraceInformation,
    SystemPagedPoolInformation,
    SystemNonPagedPoolInformation,
    SystemHandleInformation,
    SystemObjectInformation,
    SystemPageFileInformation,
    SystemVdmInstemulInformation,
    SystemVdmBopInformation,
    SystemFileCacheInformation,
    SystemPoolTagInformation,
    SystemInterruptInformation,
    SystemDpcBehaviorInformation,
    SystemFullMemoryInformation,
    SystemLoadGdiDriverInformation,
    SystemUnloadGdiDriverInformation,
    SystemTimeAdjustmentInformation,
    SystemSummaryMemoryInformation,
    SystemNextEventIdInformation,
    SystemEventIdsInformation,
    SystemCrashDumpInformation,
    SystemExceptionInformation,
    SystemCrashDumpStateInformation,
    SystemKernelDebuggerInformation,
    SystemContextSwitchInformation,
    SystemRegistryQuotaInformation,
    SystemExtendServiceTableInformation,
    SystemPrioritySeperation,
    SystemPlugPlayBusInformation,
    SystemDockInformation,
    SystemPowerInformation,
    SystemProcessorSpeedInformation,
    SystemCurrentTimeZoneInformation,
    SystemLookasideInformation


} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;

无法编译任何东西,我不能确定它是否正确。我刚刚创建了新的 .hpp 文件并添加了上面的代码。

documentation 中所述,此枚举在 Winternl.h 头文件中定义。 7.1版本SDK的头文件中的定义是:

typedef enum _SYSTEM_INFORMATION_CLASS {
    SystemBasicInformation = 0,
    SystemPerformanceInformation = 2,
    SystemTimeOfDayInformation = 3,
    SystemProcessInformation = 5,
    SystemProcessorPerformanceInformation = 8,
    SystemInterruptInformation = 23,
    SystemExceptionInformation = 33,
    SystemRegistryQuotaInformation = 37,
    SystemLookasideInformation = 45
} SYSTEM_INFORMATION_CLASS;

这个 NT API 函数的文档有点少。您可以通过在线搜索找到其他值。至于如何使用这些其他值,您可能需要再次相信并依赖可以从网络搜索中找到的逆向工程信息。

使用未记录的功能是有风险的。如果 Microsoft 在未来的版本中更改或删除功能,从而破坏您的程序,请不要感到惊讶。在使用未记录的功能或记录为将来可能更改的功能之前,您可能需要三思。同样,我链接到的文档确实以这种方式警告您:

NtQuerySystemInformation may be altered or unavailable in future versions of Windows. Applications should use the alternate functions listed in this topic.

看看这个:http://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/sysinfo/query.htm

[Nt]|[Zw]QuerySystemInformation 和输入参数有很好的描述。