注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

从SMBIOS读取信息  

2014-08-31 19:51:28|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <stdio.h>

#include <conio.h>

#include <ctype.h>

#include <dos.h>

unsigned long eps(unsigned char far *p);

unsigned long smbios(unsigned char far *p);

unsigned long type(unsigned char far *p);

int main(void){

  unsigned char far *p;

  for(p=(unsigned char far *)0xf0000000L;p<=(unsigned char far *)0xf000ffffL;p++)

  {

    if(*p=='_'&&*(p+1)=='S'&&*(p+2)=='M'&&*(p+3)=='_')

      break;

      p++;

  }

  printf("EPS:%p\n",p);

  eps(p);

  printf("below is type entry:\n");

  printf("%X   ",*(p+24));

  p=(unsigned char far *)0xe0000000L +(*(p+25)*16*16) + *(p+24);

  printf("%p\n",p);

  smbios(p);

  printf("\nnow the bios version in type(0) is :\n");

  type(p);

  return 0;

}

unsigned long eps(unsigned char far *p){

  unsigned char far *q;

  unsigned char far *r;

  int i,j,k,count=0;

  q= p;

  r= p;

  for(i=0;i<8;i++){

    if(p>0xf0000000L)

    printf("F000:%p  ",p);

    for(j=0;j<16;j++){

      printf(" %.2X",*q);

      count++;

      q++;

      if(j %7 == 0 && j!=14 && j!=0)

        printf(" -");

      if(j%15==0&& j!=0)

        printf(" ");

    }

    for(k=0;k<16;k++){

      if(isprint(*r))

        printf("%c",*r);

      else 

        printf(".");

      r++;

    }

    printf("\n");

    p=p+0x0010;

  }

}

unsigned long smbios(unsigned char far *p){

  unsigned char far *q;

  unsigned char far *r;

  int i,j,k,count=0;

  q= p;

  r= p;

  for(i=0;i<8;i++){

    printf("E000:%p  ",p);

    for(j=0;j<16;j++){

      printf("%3.2X",*q);

      count++;

      q++;

      if(j%7 == 0 && j!=14 && j!=0)

        printf(" -");

      if(j%15==0 && j!=0)

        printf(" ");

    }

    for(k=0;k<16;k++){

      if(isprint(*r))

        printf("%c",*r);

      else 

        printf(".");

      r++;

    }

    printf("\n");

    p=p+0x0010;

  }

}

unsigned long type(unsigned char far *p){

  int i,j,k,count=0;

  p=p+16;

  while(1){

    if(*p==00 && *(p+1)==00){

      break;

    }

    printf("%c",*p);

    p++;

  }

}

这段程序用到了far关键字,所以必须用旧版本的编译器去编译,而且这是直接访问地址的,也应考虑编译器是否支持编译汇编代码的功能,我用的是BC编译器。

运行结果如下:

从SMBIOS读取信息 - mihooke - mihooke的博客

可以读到序列号、电脑厂商、串口信息以及其它系统配件信息。我们也可以从debug界面读取到,具体操作是:从DOS下打开debug界面,从物理内存0xF0000-0xFFFFF间寻找关键字“_SM_”,那么这时EPSEntry Point Structure)表即找到,上面我们的eps函数就是查找EPS表的;

通过EPS表结构中的18H处,可得到SMBIOS数据表地址,通过这个地址就能够访问到结构表,程序里的smibios函数就是把十六进制数据打印成字符类型的;

在SMBIOS结构表中存储的就是所有结构(TYPE)的信息。

整个过程需要键入3个命令,第一条是“-s f000:0 ffff '_SM_'”----------这是找出EPS入口地址。第二条是“-d f000:e120”,这是找出EPS表结构的18H处的地址。第三条是“-d e000:6c50”,这个时候打印出来的就是type区域,可以找出需要的信息了。如上图字符串1处就是当前电脑BIOS的版本信息。

  评论这张
 
阅读(60)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017