当前位置: 首页 > wzjs >正文

seo网站关键词优化app大全软件下载

seo网站关键词优化,app大全软件下载,设计网站推荐素材网站,没有网站怎么做链接视频播放器在前面的文章中,介绍过WMI的使用 Windows编程系列:WMI - zhaotianff - 博客园 在Win32 Provider下面提供了一个Win32_BIOS类,可以获取BIOS信息 我们还可以通过SMBIOS标准规范来获取BIOS信息 SMBIOS介绍 SMBIOS (System Management BIOS &am…

在前面的文章中,介绍过WMI的使用

Windows编程系列:WMI - zhaotianff - 博客园

Win32 Provider下面提供了一个Win32_BIOS类,可以获取BIOS信息

我们还可以通过SMBIOS标准规范来获取BIOS信息

SMBIOS介绍

SMBIOS (System Management BIOS ,系统管理BIOS)是通过系统固件传递管理信息的标准,定义了主板或系统制造商以标准格式显示产品管理信息所需遵循的规范。

现在支持IA-32(x86)、x64(Intel 64和AMD64)、IA-64、Aarch32/64(ARM)。

获取SMBIOS原理

在非UEFI系统上,32位和64位SMBIOS入口点可以通过物理内存地址范围0x000F0000~0x000FFFFF的16字节边界上搜索锚字符串来定位,入口点封装了一些现有的DMI浏览器使用的中间锚字符串。

在UEFI系统上,32位SMBIOS入口结构可以通过在EFI配置表中查找SMBIOS GUID(SMBIOS_TABLE_GUID,{EB9D2D31-2D88-11D3-9A16-0090273FC14D})并使用相关指针来定位SMBIOS入口点结构;

64位SMBIOS入口点结构可以通过在EFI配置表中查找SMBIOS 3.x GUID(SMBIOS3_TABLE_GUID、{F2FD1544-9794-4A2C-992E-E5BBCF20E394})并使用相关指针来定位SMBIOS入口点结构。

Windows提供了一些SMBIOS相关API,我们可以直接去调用并获取SMBIOS,而不用直接操作物理内存。

GetSystemFirmwareTable

从固件表提供程序检索指定的固件表。

函数声明如下:

1 UINT GetSystemFirmwareTable(
2   [in]  DWORD FirmwareTableProviderSignature,
3   [in]  DWORD FirmwareTableID,
4   [out] PVOID pFirmwareTableBuffer,
5   [in]  DWORD BufferSize
6 );

参数说明:

[in] FirmwareTableProviderSignature

固件表提供程序的Id,该参数可选以下值

ID值描述
'ACPI'ACPI固件表提供程序
'FIRM'原始固件表提供程序
'RMSB'原始SMBIOS固件表提供程序

这里我们使用的是'RMSB'

[in] FirmwareTableID

固件表Id,对于使用GetSystemFirmwareTable来获取原始SMBIOS固件表时,可以指定为0。

其它情况时,可以访问文末的参考资料进行了解

[out] pFirmwareTableBuffer

请求的固件表缓冲区指针,如果该参数设置为NULL,则返回缓冲区所需要的大小

[in] BufferSize

pFirmwareTableBuffer缓冲区的大小,以字节为单位

返回值

如果函数执行成功,返回写入缓冲区的字节数。

说明:可以两次调用GetSystemFirmwareTable函数,第一次将pFirmwareTableBuffer设置为NULL,获取所需缓冲区大再,再根据大小分配缓冲区后再次调用。

RawSMBIOSData

通过GetSystemFirmwareTable获取原始SMBIOS固件表,pFirmwareTableBuffer缓冲区是一个原始SMBIOS固件表RawSMBIOSData结构

定义如下:

1 struct RawSMBIOSData
2 {
3     BYTE    Used20CallingMethod;
4     BYTE    SMBIOSMajorVersion;
5     BYTE    SMBIOSMinorVersion;
6     BYTE    DmiRevision;
7     DWORD   Length;
8     BYTE    SMBIOSTableData[];
9 };

字段说明:

Used20CallingMethod‌:一个字节,具体用途未详细说明。

‌SMBIOSMajorVersion‌:SMBIOS的主要版本号。

‌SMBIOSMinorVersion‌:SMBIOS的次要版本号。

‌DmiRevision‌:DMI(Desktop Management Interface)的修订版本号。

‌Length‌:数据长度,表示SMBIOSTableData数组的长度。

‌SMBIOSTableData[]‌:一个字节数组,存储实际的SMBIOS数据‌。

它是一个SMBIOS结构数据,每一个SMBIOS结构代表一个固件的信息,需要注意的是,所有数据均为ASCII编码,每一个SMBIOS结构以2字节(WORD)的0结尾。

每个SMBIOS结构都包括一个格式化区域和一个可选的未格式化区域(字符串数组)。

格式化区域以一个4字节的SMBIOS结构头SMBIOSHeader开始,紧接在后面的数据则由固件类型决定。因此格式化区域的总长度由结构类型决定。

未格式化区域的数据内容也是由结构类型、主板或系统支持的具体版本决定。

因为每一个SMBIO结构都是以2字节的0结尾,所以我们可以通过遍历的形式获取所需类型的SMBIOS结构。


说明:前面4个字段在实际使用中没有用到。


说明:格式化区域中获取的字符串数据需要从未格式化区域去取,可以通过下面的函数

 1 LPTSTR FindStrFromSMBIOSDataStruct(PSMBIOSHeader pStructHeader, BYTE bNum)2 {3     // 指向SMBIOS结构的未格式化区域(字符串数组)4     LPBYTE lpByte = (LPBYTE)pStructHeader + pStructHeader->Length;5 6     // 字符串编号从1开始7     for (BYTE i = 1; i < bNum; i++)8         lpByte += strlen((LPSTR)lpByte) + 1;9 
10     return (LPSTR)lpByte;
11 }


SMBIOSHeader

SMBIOS固件信息头

定义如下:

1 typedef struct SMBIOSHeader {    
2      BYTE    Type;         // 结构类型    
3      BYTE    Length;       // 该类型结构的格式化区域长度(请注意,长度取决于主板或系统支持的具体版本)    
4      WORD    Handle;       // 结构句柄(0~0xFEFF范围内的数字)
}

字段说明:

Type

结构类型

类型0~127(7Fh)的固件数据的定义由DMTF(制定SMBIOS规范的组织)规定,

类型128~256可以由操作系统和OEM原始设备制造商自行定义,

例如

BIOS信息(Type 0)

系统信息(Type 1)

基板(或模块)信息(Type 2)

系统外壳或外围设备(Type 3)

处理器信息(Type 4)

缓存信息(Type 7)

完整的类型可以访问SMBIOS | DMTF

找到最新的SMBIOS文档里的第6.2章, Required structures and data进行了解

Length

该类型结构的格式化区域长度

Handle

指向本结构的句柄

在介绍RawSMBIOSData结构时,提到过格式化区域以一个4字节的SMBIOS结构头SMBIOSHeader开始,紧接在后面的数据则由固件类型决定。

根据上面的Type类型,我们需要定义对应的结构类型。

例如

我们要获取 Type1,也就是系统信息,找到SMBIOS文档里相关的定义,数据结构所示

 定义如下:

 1 #pragma pack(1)2 // 系统信息(Type 1)SMBIOS结构的格式化区域的完整定义3 typedef struct _Type1SystemInformation4 {5    SMBIOSStructHeader m_sHeader; // SMBIOS结构头SMBIOSStructHeader6    BYTE    m_bManufacturer;      // Manufacturer字符串的编号7    BYTE    m_bProductName;       // Product Name字符串的编号8    BYTE    m_bVersion;           // Version字符串的编号9    BYTE    m_bSerialNumber;      // BIOS Serial Number字符串的编号
10    UUID    m_uuid;               // UUID
11    BYTE    m_bWakeupType;        // 标识导致系统启动的事件(原因)
12    BYTE    m_bSKUNumber;         // SKU Number字符串的编号
13    BYTE    m_bFamily;            // Family字符串的编号
14 }Type1SystemInformation, * PType1SystemInformation;

说明:结构定义需要使用1字节对齐,否则可能会导致其中的字段引用错误。

获取SMBIOS示例

1、调用GetSystemFirmwareTable获取原始SMBIOS固件表

 1     UINT nSize = GetSystemFirmwareTable('RSMB', 0, NULL, 0);2 3     if (nSize == 0)4         return 0;5 6     PRawSMBIOSData pRawBiosData = NULL;7 8     BYTE* buf = new BYTE[nSize];9 
10 
11     if (GetSystemFirmwareTable('RSMB', 0, buf, nSize) != nSize)
12         return 0;

2、定义RawSMBIOSData

1 typedef struct tagRawSMBIOSData
2 {
3     BYTE    Used20CallingMethod;
4     BYTE    SMBIOSMajorVersion;
5     BYTE    SMBIOSMinorVersion;
6     BYTE    DmiRevision;
7     DWORD   Length;
8     BYTE    SMBIOSTableData[];
9 }RawSMBIOSData,*PRawSMBIOSData;

3、将GetSystemFirmwareTable获取的buf转换为RawSMBIOSData

1  PRawSMBIOSData pRawBiosData = (PRawSMBIOSData)buf;

4、定义PSMBIOSHeader

1 typedef struct SMBIOSHeader {
2     BYTE    Type;         // 结构类型    
3     BYTE    Length;       // 该类型结构的格式化区域长度(请注意,长度取决于主板或系统支持的具体版本)    
4     WORD    Handle;       // 结构句柄(0~0xFEFF范围内的数字)
5 }*PSMBIOSHeader;

5、遍历SMBIOS固件表数据

 1 //当前指针位置2 auto lpData = pRawBiosData->SMBIOSTableData;3 4 while ((lpData - pRawBiosData->SMBIOSTableData) < pRawBiosData->Length)5 {6     // 根据SMBIOS结构的格式化区域中的结构头的Type字段确定结构类型7     // 确定结构类型以后再把pStructHeader转换为指向对应的格式化区域完整定义的指针8     pStructHeader = (PSMBIOSHeader)lpData;9    
10     // 遍历完格式化区域
11     lpData += pStructHeader->Length;
12 
13     // 跳过未格式化区域
14     while ((*(LPWORD)lpData) != 0)
15     {
16         lpData++;
17     }
18 
19     // 末尾 加2字节
20     lpData += 2;
21 }

6、根据固件信息头里的类型字段,定义对应的固件表数据结构

这里以Type 1 BIOS 系统信息为例

 1 #pragma pack(1)2 // 系统信息(Type 1)SMBIOS结构的格式化区域的完整定义3 typedef struct _Type1SystemInformation4 {5     SMBIOSHeader m_sHeader;       // SMBIOS结构头SMBIOSHeader6     BYTE    m_bManufacturer;      // Manufacturer字符串的编号7     BYTE    m_bProductName;       // Product Name字符串的编号8     BYTE    m_bVersion;           // Version字符串的编号9     BYTE    m_bSerialNumber;      // BIOS Serial Number字符串的编号
10     UUID    m_uuid;               // UUID
11     BYTE    m_bWakeupType;        // 标识导致系统启动的事件(原因)
12     BYTE    m_bSKUNumber;         // SKU Number字符串的编号
13     BYTE    m_bFamily;            // Family字符串的编号
14 }Type1SystemInformation, * PType1SystemInformation;

7、根据固件信息头里的类型字段,获取具体的数据

 1 //从未格式化区域去取字符串数据2 LPSTR FindStrFromSMBIOSDataStruct(PSMBIOSHeader pStructHeader, BYTE bNum)3 {4     // 指向SMBIOS结构的未格式化区域(字符串数组)5     LPBYTE lpByte = (LPBYTE)pStructHeader + pStructHeader->Length;6 7     // 字符串编号从1开始8     for (BYTE i = 1; i < bNum; i++)9         lpByte += strlen((LPSTR)lpByte) + 1;
10 
11     return (LPSTR)lpByte;
12 }

 1 pStructHeader = (PSMBIOSHeader)lpData;2 3 switch (pStructHeader->Type)4 {5 case 1: //Type 16 {7     PType1SystemInformation pType1 = (PType1SystemInformation)pStructHeader;8     //输出9 }
10     break;
11 default:
12     break;
13 }

运行效果:

示例代码

WindowsProgramming/BIOS/GetBIOSInfo at master · zhaotianff/WindowsProgramming · GitHub

参考资料

GetSystemFirmwareTable function (sysinfoapi.h) - Win32 apps | Microsoft Learn

EnumSystemFirmwareTables function (sysinfoapi.h) - Win32 apps | Microsoft Learn


文章转载自:

http://WsbBqQQ9.krfpj.cn
http://uQBhYkvE.krfpj.cn
http://8rVgPNu5.krfpj.cn
http://45iLs3Mv.krfpj.cn
http://u632jazh.krfpj.cn
http://MNgZTbaE.krfpj.cn
http://8eCGgIDd.krfpj.cn
http://UUPLTONS.krfpj.cn
http://kGwG55GE.krfpj.cn
http://Zlh4CUdu.krfpj.cn
http://tbB3oECZ.krfpj.cn
http://uTkPaXMP.krfpj.cn
http://ZLjUwLZU.krfpj.cn
http://N37bdXsV.krfpj.cn
http://251sWL5i.krfpj.cn
http://Me8bb1mB.krfpj.cn
http://C08YUH9C.krfpj.cn
http://1zYv2nYB.krfpj.cn
http://L7P1WhGF.krfpj.cn
http://jMIFZT0Z.krfpj.cn
http://ucBtJwgT.krfpj.cn
http://gLj2xhq2.krfpj.cn
http://8cS0Yk4w.krfpj.cn
http://PL7qRENM.krfpj.cn
http://Fm8qC1f6.krfpj.cn
http://kTJQogW4.krfpj.cn
http://6P9a5jEY.krfpj.cn
http://UZtD8lcj.krfpj.cn
http://XpC4lYRA.krfpj.cn
http://D44i1VjV.krfpj.cn
http://www.dtcms.com/wzjs/719381.html

相关文章:

  • word怎么做网站导航栏自己使用原生php做网站性能
  • 企业做网页还是网站网站建设公司招商
  • 鹰潭网站设计抖音代运营商家谈判话术
  • 做网站涉及到哪些手机端的网站首页该怎么做
  • .net怎么做网站html5网站制作培训
  • 有没有专门做根雕的网站个人主页模板下载
  • 外贸手机网站做php网站开发能赚钱吗
  • 网站维护一般多少钱无敌神马在线观看免费完整
  • 山西网站建设排名网站上传图片不成功
  • 中山建网站推荐个人网站意义
  • 中文网站建设解决方案专门做家居的网站
  • 单页式网站asp网站乱码
  • 网站底部备案号悬挂如何下免费的wordpress
  • 虚拟主机购买网站朔州网站建设收费
  • 网易云音乐网站建设项目规划书产品宣传册模板免费
  • 做网站用什么软件ps字体自己怎么弄网站
  • 院校网站建设扬州做网站的科技公司
  • 宝安附近公司做网站建设多少钱网站代码建设+实例
  • 江西省城乡建设网站广州市建设局网站
  • 网站备案个人可以做吗浪味仙儿 wordpress
  • 一个网站备案号是冒用其它公司的wordpress模板的幻灯片
  • 佛山专业做淘宝网站推广jsp项目个人网站开发
  • 网站如何屏蔽ip上海做网站公司排名
  • 女装电子商务网站建设手机网站内容管理
  • 资兴市建设局网站哪里有做空包网站的
  • 淄博网站制作高端形象招标网站有哪些
  • 建设网站模板燕郊医院网站建设
  • 菠菜彩票网站怎么建设龙华o2o网站建设
  • 邯郸装修网站建设烟台网站公众号制作
  • 金华做网站报价公司法全文