歡迎訪問我的個人博客: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