从SMBIOS中获取硬件信息

来源:互联网 发布:ibm人工智能最新广告 编辑:程序博客网 时间:2024/06/09 19:37

      回家过国庆,闲来无事。今天就写点之前做的一些东西吧。我们需要获取什么硬件信息,这个主要和你要获取的设备信息的详细程度有关。对于像系统的设备管理器,如果只是想得到想设备管理器的信息,你完全可以参考ddk,或者从网上早点过于SetDi×××这里函数。使用这类函数,可以让你做出来的东西和设备管理器一样。代码部分,在这后的下载中提供。对于硬件相关信息,有很多方法。就说说cpu名称的获取吧。这个至少有5中方法,最简单的就是通过查询注册表了,其他的方法有使用CPUID指令,WMI(这种方法也很简单),还有通过smbios,还有你可以通过dxdiag接口(这个需要在安装了dx9之上的系统上),当然除了这几种方法外肯定还有其他的方式来获取。今天就说说smbios吧。

     smbios,这个是一个规范。如果用过everest的人一定有看到过dmi信息。这个就是通过smbios获取到的。我最感兴趣的是,通过这个可以知道你的内存型号,是ddr,ddr3等类型。通过这个可以获取到cpu,bios,board,slot等信息,获取的种类很多,具体的要看smbios规范了。机器在启动之初,设备会将相关写入dmi数据库中。那些个oem操作系统貌似就是通过修改这个进行的。

    其实ms的wmi中获取相关信息很大一部分是通过获取这部分数据了。就说传感器信息吧,原本以为是可以通过这种方式获取的到的,smbiso协议中是有提到的,ms,也原来以为硬件厂家会往其中写入数据,但是协议总归是协议,很多都没有按规定将传感器信息写到dmi中。所以你如果想通wmi方式获取cpu温度等信息,那你就白搭了。这个需要通过驱动进行获取cpu温度等信息。

   有 点扯远了,smbios,会在0xf000到0xffff中写入smbios头,这个头里面有具体的dmi信息位置,表的大小,个数。当然这些说的地址都是物理地址。在2k系统和一部分xp中,我们是可以通过ZwOpenSection将物理内存进行映射读取信息的。但是遗憾的是在2k3中已经不行了,返回给是access_denied。ms主要是出于安全上考虑进行的。不过ms将这部分信息写进了注册表中(controlset/services/mssmbios/data),但是我们最好还是不要直接读这部分信息,因为很简单,不知道ms之后的系统会将这部分信息写道那个注册表项中。ms在屏蔽了直接读取物理内存之后,给我们提供了使用wmi方式获取dmi表信息,在xp之后系统还可以进行。在2k3上,提供了相关api进行获取,这个api还真是忘记了。

    我们得到了dmi表信息块之后,后面的事情就简单了。只要按照协议进行解析就行了在每个类开始是一个tpye,这个使用来表示是bios信息,还cpu信息等。这里简单的说了说smbios。这篇文章完全是靠仅存的记忆,所以写的不完全,也难免有错误。具体的还是看smbios规范,还是这边标准吗。可以在这里下载smbios规范。写的不足的地方,敬请指出。

 

原创粉丝点击