System Management BIOS(SMBIOS)
  • 一種定出主機板及系統廠商如何以標準的格式顯示產品管理資訊的規格。
  • SMBIOS 及 Desktop Management Interface(DMI) 規格兩者皆是由 Desktop Management Task Force(DMTF) 所草擬的,DMTF 是一個由業界所領導,實行技術規格以確認開放性標準的組織。
  • SMBIOS 用途
    • 通過簡易的指令,使用這些資訊來管理 Application。
    • 需要系統資訊時,不用每次都要去 Querying 硬體
  • 訪問 SMBIOSEPS 表的操作方式
    • 從物理記憶體 F0000h ~ FFFFF h間尋找關鍵字 "_SM_",找到後再向後16個字節,看後面5個 Byte是否是關鍵字 "_DMI_" ,如果是,EPS表即找到。
  • Implement
    • 使用 Windows API
    UINT WINAPI GetSystemFirmwareTable(
       _In_ DWORD FirmwareTableProviderSignature,
       _In_ DWORD FirmwareTableID,
       _Out_writes_bytes_to_opt_(BufferSize, return) PVOID pFirmwareTableBuffer,
       _In_ DWORD BufferSize
    );
    typedef struct _sSMBIOSData {
       BYTE Used20CallingMethod;
       BYTE SMBIOSMajorVersion;
       BYTE SMBIOSMinorVersion;
       BYTE DmiRevision;
       DWORD Length;
       BYTE SMBIOSTableData[];
    } sSMBIOSData;
    • 讀取SMBIO Tables

// 第一取得SMBIOS Tables Buffer Size
PBYTE buffer;
DWORD buffer_size;
buffer_size = GetSystemFirmwareTable('RSMB', 0, 0, 0);
if (buffer_size == 0)
  return false;

// 產生一塊Buffer 去取的SMBIOS Tables
buffer = new BYTE[buffer_size];
if (!GetSystemFirmwareTable('RSMB', 0, buffer, buffer_size))
{
   free(buffer);
   return false;
}

sSMBIOSData *smbios = (sSMBIOSData *)buffer;
while (...)
{
   // 解析 Table Buffer
   // 每張 Table 結尾必定為 0x00, 0x00
   typedef struct _sDMIHeader
   {
       BYTE Type;
       BYTE Length;
       WORD Handle;
   } sDMIHeader;

   //...
}

free(buffer);

參考資料:SMBIOS Spec 2.8.0

文章標籤
全站熱搜
創作者介紹
創作者 語 的頭像

語的紀錄本

發表在 痞客邦 留言(1) 人氣(2,711)