欢迎访问我的个人博客:xie-kang.com
目前windows有两种方式获取系统硬件信息:
1)通过GetSystemFirmwareTable API获取SMBIOS信息,一段含丰富信息的raw数据,需要配合其手册说明根据不同的数据偏移才能解析里面内容。例如:
通过GetSystemFirmwareTable 获取到信息的指针p后,可以通过以下方式获取到CPU序列号;
- 指针p正偏移一字节(char)为当前数据块的类型,指针p正偏移二字节为当前数据块的长度。指针p正偏移当前数据块的长度加一即将指针p移动到下一个数据块。由此遍历数据块找到数据块类型为4的即为处理器信息(可参见SMBIOS的文档);
- 在处理器信息数据块中,查阅SMBIOS文档可知偏移32(0x20)个字节即为序列号字符串的索引。得到文本索引i后即可计算字符串的真实位置,设处理器信息数据块的起始地址为p2、块大小为length,char* str = p2+length即为处理器信息存放字符串的位置。由于存放的目标字符串的内存是连续的,所以可以使用while (--i) str += strlen((char*)str) + 1定位到索引指示的字符串,即跳到第i个字符串的意思。
三言两语说得可能不是很清楚,可以观察参考代码源码以及SMBIOS说明文档进行理解。
2)通过WMI(Windows Management Instrumentation,Windows 管理规范)获取。WMI获取硬件信息有两种方式:
- 一种是通过COM连接本地的WMI服务器,然后使用SQL指令查询;
- 另一种是通过WMIC(WMI的扩展,方便使用命令行进行操作)从命令行接口获取。比如获取CPU序列号,可以cmd运行 "wmic CPU get ProcessorID" 进行查询。(引号需要删除)
MSDN GetSystemFirmwareTable 文档:
https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemfirmwaretable
SMBIOS说明文档链接:
https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.5.0.pdf
GetSystemFirmwareTable参考代码:
https://github.com/KunYi/DumpSMBIOS