欢迎访问我的个人博客:xie-kang.com

原文地址

目前windows有两种方式获取系统硬件信息:

1)通过GetSystemFirmwareTable API获取SMBIOS信息,一段含丰富信息的raw数据,需要配合其手册说明根据不同的数据偏移才能解析里面内容。例如:

通过GetSystemFirmwareTable 获取到信息的指针p后,可以通过以下方式获取到CPU序列号;

  1. 指针p正偏移一字节(char)为当前数据块的类型,指针p正偏移二字节为当前数据块的长度。指针p正偏移当前数据块的长度加一即将指针p移动到下一个数据块。由此遍历数据块找到数据块类型为4的即为处理器信息(可参见SMBIOS的文档);
  2. 在处理器信息数据块中,查阅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获取硬件信息有两种方式:

  1. 一种是通过COM连接本地的WMI服务器,然后使用SQL指令查询;
  2. 另一种是通过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代码获取系统硬件信息的两种方式的更多相关文章

  1. android 获取系统硬件信息

    一,首先设置权限访问: <uses-permission android:name="android.permission.READ_PHONE_STATE" />  ...

  2. 26.OpenIdConnect获取用户信息的两种方式

    openId在OAuth基础之上,在下面这红框内拿到Authorization Code之后还可以返回IdToken. IdToken和AccessToken一起返回.IdToken就会包括了用户的信 ...

  3. 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制

    通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...

  4. 程序中使用log4J打印信息的两种方式

    (1)通过org.apache.commons.logging.Log 接口实例化: public static Log log = LogFactory.getLog(String name); p ...

  5. 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

    前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...

  6. 将Eclipse代码导入到Android Studio的两种方式

    转: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0104/2259.html 说到使用Android Studio,除了新建 ...

  7. C++ WMI获取系统硬件信息(CPU/DISK/NetWork etc)

    官网找到一个例子,根据例子修改下可以获取很多信息 #define _WIN32_DCOM #include <iostream> using namespace std; #include ...

  8. django--通过jwt获取用户信息的两种方式

    HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决sess ...

  9. 得到当前堆栈信息的两种方式(Thread和Throwable)的纠结

    今天进行slf4j中logger的同步封装.主要目的是为了以后方便更换日志实现系统. 遇到的问题:使用Thread.currentThread().getStackTrace()[1].getClas ...

  10. Java代码获取spring 容器的bean几种方式

    一.目的 写了一个项目,多个module,然后想在A模块中实现固定的config注入,当B模块引用A时候,能够直接填写相对应的配置信息就行了.但是遇到一个问题,B引用A时候,A的配置信息总是填充不了, ...

随机推荐

  1. IDEA常用的快捷键(win版)

    IDEA常用的快捷键ctrl+shift+alt:多行操作psvm:生成main()方法:fori:生成for循环:Ctrl+Alt+v:自动补齐返回值类型ctrl+o:覆写方法ctrl+i:实现接口 ...

  2. robots.txt详解[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君. 怎样查看robots文件? 浏览器输入 主域名/robots.txt robots.txt的作用 robots.txt 文件规定了搜索引擎抓取工具可以访问网站 ...

  3. php基础教程(三)

    PHP语法概述 A. 基本语法 即使初次接触PHP的用户也会发现自己对PHP的语法风格并不陌生. 例如:<?php echo "Hello!": ?> 显示结果为&qu ...

  4. iis 无法在Web服务器上启动调试。打开的URL的IIS辅助进程当前没有运行

    今天开发又遇到老问题了,记录一下. 最近换了电脑 win10+vs 2010+oracle11g 客户端. IIS 发布的项目,开始是 把localhost 换成ip地址 总是报 iis 无法在Web ...

  5. javaweb自学书籍推荐

    第一部分:Java语言篇 1.<Java编程规范> 适合对象:初级.中级 介绍:这本书的作者是被誉为Java之父的James Gosling,入门者推荐阅读,对基础的讲解很不错. 2.&l ...

  6. 转载--文章(感谢陈晨博主分享) 关于 Json.net

    本文出自地址: http://www.cnblogs.com/freshman0216/p/4161800.html#undefined Newtonsoft.Json,一款.NET中开源的Json序 ...

  7. [530] C3 Rise Of Darkness Opcodez

    [530] C3 Rise Of Darkness Client 00 SendProtocolVersion 01 MoveBackwardToLocation 02 Say 03 RequestE ...

  8. Jmeter添加JSR223对Python的支持

    通过下载:org.python : jython-standalone : 2.7.2 - Maven Central Repository Search jython-standalone-2.7. ...

  9. 使用cpu-z简单看处理器,显卡等

    心血来潮想了解一下自己的电脑.在网上搜索cpu-z,大小只有几百kb.下面以我自己电脑为例,上图: 某些地方我也不是很了解,不太了解的我就直接跳过了.在网上查阅相关资料后,有下面的认识: (1)处理器 ...

  10. loadrunner 11

    1  环境windows server 2012  2019 的.net 时, 服务器管理器--仪表板--勾选.net后报错? 其中一个办法就是将服务器临时联网,就能安装成功. 2   联机时 提示如 ...