内容纲要

GNU 提供了一个 dmidecode,可以用于 Linux 系统的上 SMBIOS 信息检测。同样 gnu32 提供了一个 dmidecode 的 windows 实现。经测试可在 winxp 以上系统枚举出信息。

windows 在 vista 以上系统不提供直接读取物理内存,提供了一个 GetSystemFirmwareTable API 用于获取 SMBIOS 信息,这个 API 获取的缓冲区包含了 RawSMBIOSData 的头部数据,

typedef struct _RawSMBIOSData
{
    BYTE    Used20CallingMethod;
    BYTE    SMBIOSMajorVersion;
    BYTE    SMBIOSMinorVersion;
    BYTE    DmiRevision;
    DWORD   Length;
    PBYTE   SMBIOSTableData;
} RawSMBIOSData, *PRawSMBIOSData;

而通过 WMI 查询 MSSMBios_RawSMBiosTables 获取的 SMBIOS 数据只包含数据区,也就是以上结构体的 SMBIOSTableData 区。

这样写一个跨多个 windows 系统的 SMBIOS 信息枚举方式是,先动态加载 GetSystemFirmwareTable,记载失败,说明是 vista 以下系统,用读取物理内存的方式或者 WMI 的方式来获取 SMBIOS 缓冲区,然后统一分析这一块的缓冲区。GetSystemFirmwareTable 获取的缓冲区指针要跨过头部,也就是 8 字节,也可以用 RawSMBIOSData 结构体映射,然后分析 PRawSMBIOSData->SMBIOSTableData

这是不需要驱动 (sys) 的实现,如果写一个 sys,那么就通过一个种方式获取 SMBIOS 信息,当然得编译两个 sys, 一个 32 位的,一个 64 位的。winring0 干这个最合适不过,还可以枚举 PCI 信息。

发表评论

电子邮件地址不会被公开。 必填项已用*标注