windows代码获取系统硬件信息的两种方式
欢迎访问我的个人博客: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
windows代码获取系统硬件信息的两种方式的更多相关文章
- android 获取系统硬件信息
		一,首先设置权限访问: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ... 
- 26.OpenIdConnect获取用户信息的两种方式
		openId在OAuth基础之上,在下面这红框内拿到Authorization Code之后还可以返回IdToken. IdToken和AccessToken一起返回.IdToken就会包括了用户的信 ... 
- 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制
		通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ... 
- 程序中使用log4J打印信息的两种方式
		(1)通过org.apache.commons.logging.Log 接口实例化: public static Log log = LogFactory.getLog(String name); p ... 
- 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)
		前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ... 
- 将Eclipse代码导入到Android Studio的两种方式
		转: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0104/2259.html 说到使用Android Studio,除了新建 ... 
- C++ WMI获取系统硬件信息(CPU/DISK/NetWork etc)
		官网找到一个例子,根据例子修改下可以获取很多信息 #define _WIN32_DCOM #include <iostream> using namespace std; #include ... 
- django--通过jwt获取用户信息的两种方式
		HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决sess ... 
- 得到当前堆栈信息的两种方式(Thread和Throwable)的纠结
		今天进行slf4j中logger的同步封装.主要目的是为了以后方便更换日志实现系统. 遇到的问题:使用Thread.currentThread().getStackTrace()[1].getClas ... 
- Java代码获取spring 容器的bean几种方式
		一.目的 写了一个项目,多个module,然后想在A模块中实现固定的config注入,当B模块引用A时候,能够直接填写相对应的配置信息就行了.但是遇到一个问题,B引用A时候,A的配置信息总是填充不了, ... 
随机推荐
- 32.自定义Java异常捕获处理类及其使用
			自定义异常捕获处理类 /** * <h1>异常捕捉</h1> * */ public class ExceptionHandler implements Thread.Unca ... 
- 虚拟机重置root用户密码
			虚拟机root用户重置密码 在打开虚拟机 在出现下图界面的时候按 e 进入管理界面 e要快速按 不然就会直接进入虚拟机 然后找到 UTF-8 在后面添加 rd.break 输入完后按 Ctrl+x 跳 ... 
- SAP 自建事务码
			自建事务码的 事务码 se93 一般来说开发人员会遇到,开发了报表已经一些功能,不会让业务人员通过se38来进行使用,一般会新建一个事务码让业务人员在t-code中的使用 配置对应的程序即可 
- (jmeter笔记)jmeter导出excel,中文显示乱码
			导出excel显示乱码 解决方法:http请求--Content encoding写utf-8 导出如下: 
- TypeScript - 安装,类型
			// 要使用typescript需要全局安装 通过tsc -v 来验证是否安装成功 npm i -g typescript// ts 文件中完全可以写js语法, 完全兼容js // ts 本身在运行时 ... 
- 解决appium-doctor报各种 cannot be found问题
			解决appium-doctor报各种 cannot be found问题 1.opencv4nodejs cannot be found.cmake --version 查看cmake是否安装已安装执 ... 
- 如何在超星下载非资料页面的ppt
			首先打开迅雷(没有就复制到网页下载) 点击f12 点击网络,筛查出输入flag,在响应模块中找到ppt,复制网址并下载 
- Application.HandleMessage与Application.ProcessMessage
			HandleMessage: HandleMessage中断应用程序的执行,以便Windows可以在将控制权返回给应用程序之前处理来自Windows消息队列的单个消息. 如果消息队列为空,则Handl ... 
- mongodb地理位置坐标加了索引,操作时报错  Location object expected, location array not in correct format
			别犹豫了,将坐标中的数据改为数字类型即可,如: location:[113.45,34,191] 
- 再见IE
