解析SMBIOS信息详解.docx

上传人:b****6 文档编号:16807230 上传时间:2023-07-17 格式:DOCX 页数:12 大小:23.42KB
下载 相关 举报
解析SMBIOS信息详解.docx_第1页
第1页 / 共12页
解析SMBIOS信息详解.docx_第2页
第2页 / 共12页
解析SMBIOS信息详解.docx_第3页
第3页 / 共12页
解析SMBIOS信息详解.docx_第4页
第4页 / 共12页
解析SMBIOS信息详解.docx_第5页
第5页 / 共12页
解析SMBIOS信息详解.docx_第6页
第6页 / 共12页
解析SMBIOS信息详解.docx_第7页
第7页 / 共12页
解析SMBIOS信息详解.docx_第8页
第8页 / 共12页
解析SMBIOS信息详解.docx_第9页
第9页 / 共12页
解析SMBIOS信息详解.docx_第10页
第10页 / 共12页
解析SMBIOS信息详解.docx_第11页
第11页 / 共12页
解析SMBIOS信息详解.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

解析SMBIOS信息详解.docx

《解析SMBIOS信息详解.docx》由会员分享,可在线阅读,更多相关《解析SMBIOS信息详解.docx(12页珍藏版)》请在冰点文库上搜索。

解析SMBIOS信息详解.docx

解析SMBIOS信息详解

解析SMBIOS信息详解

1.SMBIOS简介

SMBIOS是SystemManagementBIOS的概念,SMBIOS是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范,显示有关系统管理BIOS主板的信息。

SMBIOS使您能够找出有关的计算机制造商的详细信息、模型类型、序列号和BIOS版本、处理器数量、物理内存,等等。

对一些特殊制定需求,如只能针对某一厂商机器使用,往往需要通过获取SMBIOS内容解析得到该信息,添加到代码中,实现该自定义定制需求。

本章主要介绍windowsAPI获取SMBIOS信息的方法

2.SMBIOS结构信息

从SMBIOS2.3版本开始,兼容SMBIOS的实现必须包含以下10个数据表结构:

BIOS信息(Type0)、系统信息(Type1)、系统外围或底架(Type3)、处理器信息(Type4)、高速缓存信息(Type7)、系统插槽(Type9)、物理存储阵列(Type16)、存储设备(Type17)、存储阵列映射地址(Type19)、系统引导信息(Type32)。

其他的结构表则可根据实际来决定是否需要实现。

最新的SMBIOS2.7.0版中定义的所有结构表包括Type0-Type42,其中Type5、Type6和Type10已经废弃。

另外还有Type126和Type127两个特殊结构表。

BIOS信息(Type0)、系统信息(Type1)、基板(或模块)信息(Type2)、系统外围或底架(Type3)、处理器信息(Type4)、存储控制器信息(Type5,已废弃)、存储模块信息(Type6,已废弃)、调整缓存信息(Type7)、端口连接器信息(Type8)、系统插槽(Type9)。

板载设备信息(Type10)、OEM字符串(Type11)、系统配置选项(Type12)、BIOS语言信息(Type13)、组相联(Type14)、系统事件日志(Type15)、物理存储阵列(Type16)、存储设备(Type17)、32-bit内存错误信息(Type18)、存储阵列映射地址(Type19)。

存储设备映射地址(Type20)、内建指针设备(Type21)、便携式电池(Type22)、系统重置(Type23)、硬件安全(Type24)、系统电源控制(Type25)、电压探针(Type26)、冷却设备(Type27)、温度传感器(Type28)、电流探头(Type29)。

越界远程访问(Type30)、引导完整性服务(BIS)入口点(Type31)、系统引导信息(Type32)、64-bit内存错误信息(Type33)、管理设备(Type34)、管理设备组件(Type35)、管理设备门槛数据(Type36)、存储信道(Type37)、IPMI设备信息(Type38)、系统供电电源(Type39)。

附加信息(Type40)、板载设备扩展信息(Type41)、管理控制器主机接口(Type42)。

不活动指示(Type126)、表格结束指示(Type127)。

SMBIOS的大部分结构表数据在CIM模型中都有对应的实现,比如底架信息对应CIM_Chassis,处理器信息对应CIM_Processor,内存信息对应CIM_Memory等。

下面介绍主要的结构表。

1、BIOS信息(Type0):

位置

名称

长度

描述

00h

TYPE号

1BYTE

结构的TYPE号,此处是0

01h

长度

1BYTE

TYPE0格式区域的长度,一般为14h,也有13h

02h

句柄

2BYTE

指向本结构的句柄

04h

Bios厂商信息

1BYTE

此处是bios卖方的信息,可能是OEM厂商名,一般为01h,代表紧随格式区域后的字符串区域的第一个字符串

05h

BIOS版本

1BYTE

BIOS版本号,一般为02h,代表字符串区域的第二个字符串

06h

Bios开始地址段

2BYTE

用于计算常驻BIOS镜像大小的计算,方法为

(10000h-BIOS开始地址段)×16

08h

BIOS发布日期

1BYTE

一般为03h,表示字符区第三个字符串

09h

BIOSROMsize

1BYTE

计算方法为(n+1)×64K,n为此处读出数值

0Ah

BIOS特征

8BYTE

Bios的功能支持特征,如PCI,PCMCIA,FLASH等

12h

BIOS特征扩展

不定

从2.4版开始包含两个扩展字节(12h-13h),以及字节14h-17h

14h

BIOS版本主号

1BYTE

若系统不支持此域,则值设为ffh

15h

BIOS版本从号

1BYTE

若系统不支持此域,则值设为ffh

16h

内置控制器固件的版主号

1BYTE

若系统不支持此域,则值设为ffh

17h

内置控制器固件的版从号

1BYTE

若系统不支持此域,则值设为ffh

BIOS特征域表示BIOS对一些特性的支持情况,Bit1和Bit1保留,Bit2未知,Bit3表示本BIOS特征域是否被支持。

Bit4-Bit19分别表示是否支持ISA、MCA、EISA、PCI、PCMCIA、PnP、APM、BIOS刷新、BIOS影像(把BIOS的只读内容拷贝到快一些的内存中)、VL-VESA、ESCD、从CD引导、可选择的引导、BIOSROM是否被插装、从PCMCIA引导、EDD规范。

Bit20-Bit25表示对各种型号的软盘支持情况(均为中断Int13h),包括NEC98001.2MB软盘、Toshiba1.2MB软盘、5.25”/360KB软盘、5.25”/1.2MB软盘、3.5”/720KB软盘、3.5”/2.88MB软盘。

Bit26-Bit29表示是否支持中断Int5h(PrintScreen屏幕截取服务)、Int9h(8042键盘服务)、Int14h(串口服务)、Int17h(打印机服务)、Int10h(CGA/Mono视频服务)、NECPC-98。

Bit32:

47保留给BIOS厂商使用。

Bit48:

63保留给计算机系统厂商使用。

BIOS特征扩展字节1(偏移12h处)表示对另外一些设备的支持情况,Bit0-Bit1分别表示是否支持ACPI、USB遗留、AGP、I2O引导、LS-120SuperDisk引导、ATAPIZIP驱动器引导、1394引导、智能电池。

BIOS特征扩展字节2(偏移13h处)表示对一些高级特性的支持情况。

Bit1-Bit3表示是否支持功能键初始化网络服务引导、激活目标内容分发、UEFI规范。

Bit4表示SMBIOS表描述的是一台虚拟机,Bit5:

7保留。

2、系统信息(Type1):

SMBIOS实现只关联一个单一的系统实例,并且包含且只包含一个系统信息结构。

位置

名称

长度

描述

00h

TYPE号

1BYTE

结构的TYPE号,此处是1

01h

长度

1BYTE

格式区域总长度,2.0版为08h,2.1-2.3.4版为19h,从2.4版开始为1Bh

02h

句柄

2BYTE

指向本结构的句柄

04h

电脑制造商

1BYTE

一般为01h,表示在字符串区域中的编号

05h

产品名称

1BYTE

在字符串区域中的编号

06h

版本号

1BYTE

在字符串区域中的编号

07h

序列号

1BYTE

在字符串区域中的编号

09h

UUID

16BYTE

通用唯一标识符

18h

唤醒类型

BYTE

用来标识导致系统开电启动的事件

19h

SKU号

BYTE

在字符串区域中的编号,SKU号通常为产品ID或采购订单号

1Ah

产品家族

1BYTE

在字符串区域中的编号

UUID为128bit长,是一个穿越时间和空间的唯一标识符,不需要集中的注册过程。

它的格式在RFC4122有详细的描述,内容比较繁锁,但SMBIOS并不关注这个,它只关注字节序。

UUID的字节顺序以及在RFC4122中对应域的名字如下:

time_low:

偏移00h处,4BYTEs,为时间戳的低位域部分。

time_mid:

04h处,2BYTEs,为时间戳的中间域部分。

time_hi_and_version:

06h处,2BYTEs,为时间戳的高位域,同时还包含版本号。

clock_seq_hi_and_reserved:

08h处,1BYTE,时钟序列的高位域部分,同时还包含保留部分。

clock_seq_low:

09h处,1BYTE,时钟序列的低位域部分。

Node:

0Ah处,6BYTEs,唯一结点标识符。

虽然RFC4122建议对所有域都使用网络字节序(为大端字节序),但PC工业界(包括ACPI,UEFI和微软的规范)都对前面的三个域time_low,time_mid,time_hi_and_version使用小端字节序。

同样地,电报格式的编码也被用来描述SMBIOS规范中的UUID。

因此,UUID{00112233-4455-6677-8899-AABBCCDDEEFF}被表示为33221100554477668899AABBCCDDEEFF。

如果ID的所有字节都为FFh,表示当前ID在系统中不存在但可以被设置。

如果所有字节都为00h,表示ID在系统中不存在。

对于唤醒类型域,00h保留,01h为其他,02h未知,03h为APM定时器,04h调制解调器拨响,05h为LAN远程,06h电源开关,07h为PCIPME#,08h为AC电源恢复。

基板或模块单元信息(Type2):

制造商、产品名、版本、序列号、资产标签、特征标志、基板在底架上的位置、底架句柄、基板类型、包含的对象句柄个数、包含的个各对象句柄。

系统外围或底架(Type3):

制造商、类型、版本、序列号、资产标签号、启动状态、供电电源状态、热量状态、安全状态、OEM定义信息、高度、电源线个数、包含的单元个数、包含的单元记录长度、包含的各个单元、SKU号。

处理器信息(Type4):

插座指示、处理器类型、处理器家族、制造商、ID、版本、电压伏特数、外部时钟频率(MHz)、最大速率(MHz)、当前速率、状态、处理器升级、L1级缓存信息结构的句柄、L2级缓存信息结构的句柄、L3级缓存信息结构的句柄、序列号、资产标签、部件号码、内核个数、激活的内核个数、线程个数、处理器特征、处理器家族2。

高速缓存信息(Type7):

插座指示、缓存配置、最大缓存容量、已安装的容量、支持的SRAM类型、当前SRAM类型、缓存速率、纠错类型、系统缓存类型、关联性。

端口连接器信息(Type8):

例如并口、串口、键盘、鼠标器端口等都属于端口连接器。

包含的信息有内部引用指示符、内部连接器类型、外部引用指示符、外部引用类型、端口类型。

系统插槽(Type9):

插槽指示符、插槽类型、插槽数据总线宽度、当前是否在使用、插槽长度、插槽ID、插槽特征1、插槽牲2、段组编号、总线编号、设备/函数编号。

OEM字符串(Type11):

由OEM指定的描述字符串。

系统配置选项(Type12):

用来配置基板跳线和开关的信息字符串。

BIOS语言信息(Type13):

可安装的语言、标志位字节、保留的15字节、当前语言。

这里的语言是指英语、法语、汉语等国家语言,而不是计算机编程语言。

组相联(Type14):

组名、本项的类型、本结构的句柄。

级相联用于指明某些部件的布局或层次,例如指明两个CPU共享一个外部缓存系统。

系统事件日志(Type15):

事件日志存放在非易失性的存储单元中,占据固定长度的区域,以一个固定长度(和特定于厂商)的头部开始,后跟一个或多个可变长度的日志记录。

应用程序可以通过周期性地读取系统事件日志结构(通过它的句柄)并在日志改变标记中搜索日志的更新,以实现事件日志改变通知。

这里日志改变标记唯一地标识事件日志最后一次更新的时间。

本结构包含的信息有日志区域长度、日志头部起始偏移、日志数据起始偏移、存取方法(如索引I/O,内存映射物理地址,通知目的非易失性数据函数等)、日志状态、日志改变标记、存取方法地址、日志头部格式、支持的日志类型描述符、每个日志类型描述符的长度、日志类型描述符列表。

这里存取方法地址可用以下联合类型来表示:

每个日志记录的格式都包含8字节的记录头部(事件类型、长度、日期时间域),后跟不定长的日志数据。

物理存储器阵列(Type16):

位置(系统板卡或附加板卡上)、存储功能、内存纠错、最大容量、存储错误信息句柄、存储设备数目、已扩展的最大容量。

存储设备(Type17):

用于描述物理存储器阵列中的单个存储设备。

在物理存储器阵列中的句柄、存储错误信息句柄、存储总宽度、数据宽度、存储容量、形体尺寸、设备集、设备定位器、记忆槽定位器、存储器类型、类型额外细节、速率、制造商、序列号、资产标签、部件号码、属性标志、已扩展的容量、已配置的存储时钟速率。

32-bit错误信息(Type18):

错误类型、错误粒度、错误操作、特定于制造商的错误表现、存储阵列错误地址、设备错误地址、错误解析。

存储阵列映射地址(Type19):

起始地址、结束地址、存储阵列句柄、分区宽度、已扩展的起始地址、已扩展的结束地址。

存储设备映射地址(Type20):

起始地址、结束地址、存储设备句柄、存储阵列映射地址句柄、分区行位置、交叉位置、交叉的数据深度、已扩展的起始地址、已扩展的结束地址。

内置指针设备(Type21):

指针设备类型、接口类型、按钮个数。

智能电池(Type22):

位置、制造商、制造日期、序列号、设备名、设备化学属性、设计容量、设计电压伏特数、SBDS版本号、电池数据的最大错误百分比、SBDS序列号、SBDS制造日期、SBDS设备化学属性、设计容量倍增因子、特定于OEM的信息。

系统引导信息(Type32):

保留域(00h)、引导状态描述(10字节)。

引导状态描述主要有“没有检测到错误”、“没有可引导的媒介”、“操作系统载入失败”、“BIOS硬件检测失败”、“操作系统硬件检测失败”、“用户请求引导(通过一个按键)”、“违反系统安全”、“预先请求映像(通过PXE引导)”、“系统监控记时器激活,导致系统重启”,特定于厂商引导状态描述等。

IPMI设备信息(Type38):

BMC接口类型、IPMI规范修改版本、I2C从地址、NV存储设备地址、基地址、基地址修饰符/中断信息、中断号。

不活动指示(Type126):

用来表明某个SMBIOS结构当前不活动,因此不应用被上层的软件使用。

它没有字符串区域,只有结构头部(即三个头部域类型、长度、句柄)。

表格结束指示(Type127):

表示整个SMBIOS结构表的结束。

它也只有结构头部,没有字符串区域。

可以看出,很多设备都包含一些类似的信息域,比如制造商、产品ID(SKU号)、产品名称、版本、出厂日期、序列号、资产标签号、设备类型等。

应用软件可以使用下面的方法来解析基于表格的SMBIOS结构。

FindStructure函数用于查找指定类型的第一个结构(注意同一个类型的结构可能会多个),返回这个结构的句柄,如果没找到,则返回0xFFFF。

TableAddress和StructureCount的值可以通过在内存中定位EPS表来获得,EPS中偏移18h处即为TableAddress的值,偏移1Ch处即为StructureCount的值。

3.WindowsAPI获取SMBIOS流程

Windows提供了直接APIGetSystemFirmwareTable来获取SMBIOS信息。

该函数从firmwaretableprovider中检索特定的firmwaretable信息。

3.1调用GetSystemFirmwareTable获取信息buffer大小

DWORDiSignature='R';

iSignature=iSignature<<8|'S';

iSignature=iSignature<<8|'M';

iSignature=iSignature<<8|'B';

intiBufferSizeNeeded=GetSystemFirmwareTable(iSignature,0,0,0);

参数只有FirmwareTableProviderSignature,其余都是NULL即可。

iSignature=RSMB,代表是SMBIOSfirmwaretableprovider,将是获取该部分内容。

其中,FirmwareTableProviderSignature参数列表:

Value

Meaning

'ACPI'

TheACPIfirmwaretableprovider.

'FIRM'

Therawfirmwaretableprovider.

'RSMB'

TherawSMBIOSfirmwaretableprovider.

3.2再次调用GetSystemFirmwareTable获取RawSMBIOSData内容

charbuff[1024*2]={0};

GetSystemFirmwareTable(iSignature,0,buff,iBufferSizeNeeded);

这里的buff内容就是RawSMBIOSData内容

3.3解析RawSMBIOSData内容

首先我们要先了解该结构体才能去解析内容,在windows.h定义如下:

structRawSMBIOSData

{

BYTEUsed20CallingMethod;

BYTESMBIOSMajorVersion;

BYTESMBIOSMinorVersion;

BYTEDmiRevision;

DWORDLength;

BYTESMBIOSTableData[];

};

从结构体中,我们可以获取SMBIOS的版本信息和长度以及SMBIOSTableData的信息,

RawSMBIOSData*p;

p=(RawSMBIOSData*)buff;

获取SMBIOSTableDatabuffer的首地址:

p->SMBIOSTableData=(BYTE*)(buff+8);//跳过前面8个字节

SMBIOSTableData可以理解为格式区+数据内容两部分,而格式区有一个头,类似:

structSMBios_Thunk

{

BYTEflag;

BYTEdata_offset;

};

flag是硬件类型,data_offset是表示该格式区长度。

所有typeSMBIOS结构表都有这个头存在。

后面我们就可以通过移动p->SMBIOSTableData指针以及SMBIOS某type的结构表来获取具体的硬件信息了。

详细参考下面SMBIOS数据解析示例。

4.SMBIOS数据解析示例

如上面所讲,SMBIOSTableData可以理解为格式区+数据内容两部分组成,可以直接获取前两个字节分析出type类型(本例type=0)和格式区长度(本例length=18)。

另外可以通过下面通俗解释确认信息段,该段数据以0000结尾(因为字符串以00结尾,类型块结尾也是00,所以可以理解为遇到0000为一个类型段结束),

根据上述信息,获取type0字段,分析结构区以找出需要读取内容,注意标记部分的查找方式,结构区字符如下

根据SMBIOS结构表分析(举例字节见红色线,格式区长度数据见黄色线标注):

第1个字节offset0,为0x00,代表结构的TYPE号为0;

第2个字节offset1,0x18,代表格式区长度为18,即图中蓝色段;

第3-4(2bytes)字节offset2,3,0x010x00,本结构的句柄,

第5字节offset4,0x01,为厂商信息,位置在格式区后紧跟的第1个字符串

......

格式区后面紧跟的为字符串内容:

根据格式区指定index查找。

每个字符串以00结尾,

第01个字符串:

..A...DellInc.

第02个字符串:

A11

.......

依次获取SMBIOS中信息

同样,以对应SMBIOS方式分析其他类型段的内容。

 

Welcome!

!

!

欢迎您的下载,

资料仅供参考!

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2