windows代码获取系统硬件信息的两种方式


欢迎访问我的个人博客:xie-kang.com

原文地址

目前windows有两种方式获取系统硬件信息:

1)通过GetSystemFirmwareTable API获取SMBIOS信息,一段含丰富信息的raw数据,需要配合其手册说明根据不同的数据偏移才能解析里面内容。例如:

通过GetSystemFirmwareTable 获取到信息的指针p后,可以通过以下方式获取到CPU序列号;

  1. 指针p正偏移一字节(char)为当前数据块的类型,指针p正偏移二字节为当前数据块的长度。指针p正偏移当前数据块的长度加一即将指针p移动到下一个数据块。由此遍历数据块找到数据块类型为4的即为处理器信息(可参见SMBIOS的文档);
  2. 在处理器信息数据块中,查阅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获取硬件信息有两种方式:

  1. 一种是通过COM连接本地的WMI服务器,然后使用SQL指令查询;
  2. 另一种是通过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 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM