基本概念

GetSystemInfoWindows API函数,用于获取当前运行环境的核心系统信息,包括处理器架构、CPU核心数、内存分页大小、系统地址空间范围等关键硬件与操作系统配置数据。它是开发Windows系统工具、硬件检测软件或需要适配不同系统环境的应用程序时的常用接口。

基本语法

1
2
3
void GetSystemInfo(
[out] LPSYSTEM_INFO lpSystemInfo //指向接受信息结构体的指针
);

LPSYSTEM_INFO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
typedef struct _SYSTEM_INFO {
// 联合体(Union):兼容历史版本与现代架构标识
union {
DWORD dwOemId; // 历史字段:早期用于标识OEM厂商(已过时)
struct {
WORD wProcessorArchitecture; // 现代字段:处理器架构(核心标识)
WORD wReserved; // 保留字段:暂未使用,通常为0
} DUMMYSTRUCTNAME; // 结构体别名(仅为语法占位,实际使用时可省略)
} DUMMYUNIONNAME; // 联合体别名(实际使用时可省略)

// 内存相关属性
DWORD dwPageSize; // 系统内存分页大小(字节)
LPVOID lpMinimumApplicationAddress; // 应用程序可访问的最低内存地址
LPVOID lpMaximumApplicationAddress; // 应用程序可访问的最高内存地址
DWORD_PTR dwActiveProcessorMask; // 活动处理器掩码(标识哪些逻辑处理器可用)

// 处理器相关属性
DWORD dwNumberOfProcessors; // 逻辑处理器(CPU)数量(含超线程)
DWORD dwProcessorType; // 已过时:早期处理器类型标识
DWORD dwAllocationGranularity; // 内存分配粒度(虚拟内存分配的最小单位)
WORD wProcessorLevel; // 处理器级别(如Intel酷睿系列为6)
WORD wProcessorRevision; // 处理器修订版本(区分具体型号)
} SYSTEM_INFO, *LPSYSTEM_INFO;

DWORD_PTR: 本质是一个 “动态宽度” 的无符号整数,其位数随系统架构自动调整:
32 位系统 中,它等价于 DWORD(32 位无符号整数);
64 位系统 中,它等价于 QWORD(64 位无符号整数)。

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <windows.h>
#include <stdio.h>

int main() {
// 1. 定义SYSTEM_INFO结构体变量
SYSTEM_INFO sysInfo;

// 2. 调用GetSystemInfo获取系统信息(自动填充结构体)
GetSystemInfo(&sysInfo);

// 3. 解析并打印关键信息
printf("=== 系统信息(通过GetSystemInfo获取) ===\n");

// 处理器架构
const char* archStr = nullptr;
switch (sysInfo.wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_INTEL: archStr = "x86 (32位)"; break;
case PROCESSOR_ARCHITECTURE_AMD64: archStr = "x64 (64位)"; break;
case PROCESSOR_ARCHITECTURE_ARM64: archStr = "ARM64 (64位)"; break;
default: archStr = "未知架构"; break;
}
printf("处理器架构:%s\n", archStr);

// 逻辑处理器数量
printf("逻辑处理器数:%lu\n", sysInfo.dwNumberOfProcessors);

// 内存分页大小与分配粒度
printf("内存分页大小:%lu 字节(%lu KB)\n", sysInfo.dwPageSize, sysInfo.dwPageSize / 1024);
printf("内存分配粒度:%lu 字节(%lu KB)\n", sysInfo.dwAllocationGranularity, sysInfo.dwAllocationGranularity / 1024);

// 应用程序地址空间范围
printf("应用程序最低地址:0x%p\n", sysInfo.lpMinimumApplicationAddress);
printf("应用程序最高地址:0x%p\n", sysInfo.lpMaximumApplicationAddress);

return 0;
}