如何读取电脑CPU序列号、主板BIOS、硬盘的序列号

如何读取电脑CPU序列号、主板BIOS、硬盘的序列号

(2010-09-11 09:01:41)

原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=2740166

关注
---------------------------------------------------------------

如何读取硬盘的序列号 


---- 硬盘的序列号只能采用对硬盘控制器直接操作的方式进行读取,也就是说只能采用
CPU的I/O指令操作硬盘控制器,读取的方法如下面的C语言程序所示: 
static int WaitIde()
{
   int   al;
   while ((al=inp(0x1F7)) >=0x80) ;
   return al;
}
static void ReadIDE()
{
   int   al;
   int   i;
   WORD  pw[256];
   WaitIde();
   outp(0x1F6,0xA0);
   al WaitIde();
   if ((al&0x50)!=0x50) return;
   outp(0x1F6,0xA0);
   outp(0x1F7,0xEC);
   al WaitIde();
   if ((al&0x58)!=0x58) return;
   for (i=0;i< 256;i++) 
      pw[i] inpw(0x1F0);
}
---------------------------------------------------------------

怎样用程序取得CPU信息

主 要 可 利 用 利 用CPUID 汇 编 指 令( 机 器 码:0FH A2H, 如 果 你 的 编 译 器 不 支 持CPUID 指 令, 只 有emit 机 器 码 了) 该 指 令 可 以 被 如 下CPU 识 别 

Intel 486 以 上 的CPU,
Cyrix M1 以 上 的CPU,
AMD Am486 以 上 的CPU

---- (1) 取CPU OEM 字 符 串, 判 断CPU 厂 商 

---- 先 让EAX=0, 再 调 用CPUID 

---- Inel 的CPU 将 返 回: 

EBX:756E6547H 'Genu'
EDX:49656E69H 'ineI'
ECX:6C65746EH 'ntel'
EBX,EDX,ECX 将 连 成"GenuineIntel", 真 正 的Intel。
Cyrix 的CPU 将 返 回:
EBX:43797269H
EDX:78496E73H
ECX:74656164H
"CyrixInstead","Cyrix 来 代 替"。
AMD 的CPU 将 返 回:
EBX:41757468H
EDX:656E7469H
ECX:63414D44H
"AuthenticAMD", 可 信 的AMD。

---- 在Windows98 中, 用 右 键 单 击" 我 的 电 脑", 选 择" 属 性- 常 规" 在 计 算 机 描 述 处 就 可 看 见CPU OEM 字 符 串。 

---- (2)CPU 到 底 是 几86, 是 否 支 持MMX 

---- 先 让EAX=1, 再 调 用CPUID 

---- EAX 的 到11 位 就 表 明 是 几86 

386
i486
Pentium
Pentium Pro Pentium II
Dual Processors
EDX 的 第0 位: 有 无FPU

---- EDX 的 第23 位:CPU 是 否 支 持IA MMX, 很 重 要 啊 ! 如 果 你 想 用 那57 条 新 增 的 指 令, 先 检 查 这 一 位 吧, 否 则 就 等 着 看Windows 的" 该 程 序 执 行 了 非 法 指 令, 将 被 关 闭" 吧。 

---- (3) 专 门 检 测 是 否P6 架 构 

---- 先 让EAX=1, 再 调 用CPUID 

---- 如 果AL=1, 就 是Pentium Pro 或Pentium II 

---- (4) 专 门 检 测AMD 的CPU 信 息 

---- 先 让EAX=80000001H, 再 调 用CPUID 

---- 如 果EAX=51H, 是AMD K5 

---- 如 果EAX=66H, 是K6 

---- K7 是 什 么 标 志, 只 有 等 大 家 拿 到K7 的 芯 再 说 了。 

---- EDX 第0 位: 是 否 有FPU( 多 余 的 ! 谁 用 过 没FPU 的K5,K6?) 

---- EDX 第23 位,CPU 是 否 支 持MMX, 

---- 程 序 如 下: 是C++Builder 的 控 制 台 程 序, 可 以 给 出 你 的" 心" 的 信 息。 如 果 把 这 个 技 术 用 于DLL 中, 便 可 以 使VB 程 序 也 知 道" 心" 的 信 息。 

//------CPUID Instruction Demo Program------------
#include conio.h >
#include iostream.h >
#pragma hdrstop
//------------------------------------------------
#pragma inline
#pragma argsused
int main(int argc, char **argv)
{
char OEMString[13];

int iEAXValue,iEBXValue,iECXValue,iEDXValue;
_asm {
    mov eax,0
    cpuid
    mov DWORD PTR OEMString,ebx
    mov DWORD PTR OEMString+4,edx
    mov DWORD PTR OEMString+8,ecx
    mov BYTE PTR OEMString+12,0
    }

cout< "This CPU 's OEM String is:"< OEMString< endl;

_asm {
    mov eax,1
    cpuid
    mov iEAXValue,eax
    mov iEBXValue,ebx
    mov iECXValue,ecx
    mov iEDXValue,edx
    }

if(iEDXValue&0x800000)
cout "This is MMX CPU"< endl;
else
cout "None MMX Support."< endl;

int iCPUFamily=(0xf00 iEAXValue) >8;
cout "CPU Family is:"< iCPUFamily< endl;

_asm{
    mov eax,2
    CPUID
}
if(_AL==1)
cout "Pentium Pro or Pentium II Found";

getch();
        return 0;

---------------------------------------------------------------

char szCPUID[129] {NULL};
char szTmp[33] {NULL};
unsigned longs1 0,
s2 0;
_asm
{
 mov eax,01h
xor edx,edx
cpuid
mov s1,edx
mov s2,eax
}
sprintf(szTmp, "%08X%08X", s1, s2);
strcpy(szCPUID, szTmp);
_asm
{
 mov eax,03h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
sprintf(szTmp, "%08X%08X", s1, s2);
strcat(szCPUID, szTmp);
strcpy(CpuId,szCPUID);

return CpuId;


///
//AMI的序列号地址在0x000FF478
//Award的序列号地址在0x000FEC71
//而Phoenix的序列号不太明确,可能是0x000f6577、0x000f7196、0x000f7550中的一个,

PCHAR bname, bcopy, bdat



来自http://blog.sina.com.cn/s/blog_638ea1960100knt9.html


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一般获主板UID都是cmd命令 执行"wmic path Win32_ComputerSystemProduct get uuid" 这里说的是使用API获,找了半天没找到,最后发现只能通过 GetSystemFirmwareTable 获 SMBIOS信息 ,在这个结构体里存储的相当复杂,看的有点头晕 首先调用 GetSystemFirmwareTable  先让他返回结构体大小,然后我们申请一块内存,再调用一次,就会把  SMBIOS信息 存储到 我们申请的内存里了. SMBIOS信息 前8个字节就不看了,可以百度慢慢看,从第9个字节开始是TYPE结构,第一个字节是type类型,第二个字节就是这个type类型的大小,从type起始地址计算,后面的就是格式化区域,不同type类型格式化区域代表的信息也不同,格式化区域完后,就会跟一段u字符串,我们知道ascii字符串是0结尾,u字符串是00 结尾,字符串结尾后就是下一个type结构的开始了. 这里就只看下type1类型结构  从资料里看,在第8个字节后的16位就是uid了.   其他类型大家就自己查一下了. 里面的模块命令 就用了下 精益的十六进制转换命令,这个大家应该都有. 代码有点丑,见笑了. 系统信息 (Type 1) : SMBIOS 实现只关联一个单一的系统实例,并且包含且只包含一个系统信息结构。 位置 名称 长度 描述 00h TYPE 号 1BYTE 结构的TYPE 号,此处是1 01h 长度 1BYTE 格式区域总长度,2.0 版为08h ,2.1-2.3.4 版为19h,从2.4 版开始为1Bh 02h 句柄 2BYTE 指向本结构的句柄 04h 电脑制造商 1BYTE 一般为01h ,表示在字符串区域中的编号 05h 产品名称 1BYTE [url=]在字符串区域中的编号[/url] 06h 版本号 1BYTE 在字符串区域中的编号 07h 序列号 1BYTE 在字符串区域中的编号 09h UUID 16BYTE 通用唯一标识符 18h 唤醒类型 BYTE 用来标识导致系统开电启动的事件 19h SKU 号 BYTE 在字符串区域中的编号,SKU 号通常为产品ID 或采购订单号 1Ah 产品家族 1BYTE 在字符串区域中的编号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值