怎样获得主板序列号??? 要求在win2000和winXP下获得... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在WIN98下是可以的,但在WIN2000下就会出错。 找到一个c语言的自己试试获取主板的工业序列号完全可以实现,注意是硬盘外壳上的序列号,不是格式化后的序列号,C语言源程序如下(注:该程序由顶尖高手丁凯所写):#include <windows.h>#include <stdio.h>WORD pw[256];static DWORD idt, int_idt;static DWORD Base;static WORD Entry;#pragma warning (disable:4035) static int inp(WORD rdx){ _asm xor eax, eax _asm mov dx, rdx _asm in al, dx}static WORD inpw(WORD rdx){ _asm xor eax, eax _asm mov dx, rdx _asm in ax, dx}static void outp(WORD rdx, int ral){ _asm mov dx, rdx _asm mov eax, ral _asm out dx, al}static int WaitIde(){ int al; while ((al=inp(0x1F7))>=0x80) ; return al;}static void ReadIDE(){ int al; int i; 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); }}static void __declspec( naked ) NowInRing0(){ _asm { push ebp mov ebp,esp call ReadIDE cli mov ebx, int_idt mov ax, Entrymov word ptr [ebx-4], ax mov eax, Baseshr eax, 16 mov [ebx+2], ax sti leave iretd }}void GetIDEInfo(){ DWORD dwExcept; dwExcept = (DWORD)NowInRing0; _asm { mov eax, fs:[0] push eax sidt [esp-02h] pop ebx mov idt, ebx add ebx, 0x1C mov int_idt, ebx mov eax, [ebx] mov [Base], eax mov ax, [ebx-4] mov [Entry], ax cli mov esi, dwExceptpush esimov [ebx-4], si shr esi, 16 mov [ebx+2], si pop esi sti int 3 }}main(){ char s[80]; register i,j; GetIDEInfo(); for (i=0,j=0;i<10;i++) { s[j++]=pw[10+i]>>8; s[j++]=pw[10+i]&0xFF; } s[j] = 0; printf("Serial=%s\n", s); return 0;} 获取主板Bios信息 CoDelphi.com 摘 要:用Delphi调用Bios的信息 关键字:BIOS 类 别:系统控制 --------------------------------------------------------------------------------添加一个Tbutton和一个Tmemo组件到窗体并写如下代码到按钮的OnClick事件:with Memo1.Lines do begin Add('MainBoardBiosName:'+^I+string(Pchar(Ptr($FE061)))); Add('MainBoardBiosCopyRight:'+^I+string(Pchar(Ptr($FE091)))); Add('MainBoardBiosDate:'+^I+string(Pchar(Ptr($FFFF5)))); Add('MainBoardBiosSerialNo:'+^I+string(Pchar(Ptr($FEC71)))); end; 以上代码在Win9X上运行通过。 那个I是什么?能编译通过,但运行出错Win2000Server 呵呵,^I等价于#9,也就是一个制表符。俺用Win98SE验证了,果然简单好用。 那是当然,以上代码就从固定内存地址读取相关数据String(Pchar(Ptr($FE061)))的意思是将内存地址$FE061中的内容转化为字符串因为计算机在开机后,会将BIOS信息复制到内存中但上面地址是对Award BIOS而言,AMI等其它BIOS相关信息的内存地址不相同如果是AMI的,地址为:BIOS 序列号:$FF478BIOS 日期:$FFFF5BIOS copyright:$FE0CBNT下需要打开内核对象,把文件视图映射到进程地址空间!http://expert.csdn.net/Expert/topic/1279/1279303.xml 我对BIOS Wizard很好奇阿,他是怎么实现的呢? 一个用DBImage1读取图片出Stream read error错的问题 我想在Richedit中加入GIF图片。 闲置书籍占地方,无用处理掉,有需要的来看看! [求助]大家常站了一楼就说沙发,沙发是什么? 关于计算字段的问题,急 高分:关于ADO连接的问题,为什么我给数据库加了密码在连接时就报错呢? 如何获取当前日期? 兄弟姐妹们来看看,一个字段显示的问题! 谁拿个韩版秒杀挂用下哈 推荐个稳定成熟的 浏览 pdf 文档的 ocx 或者组件 谁可以教我Delphi 啊? 关于设置文件共享的问题
自己试试
获取主板的工业序列号完全可以实现,注意是硬盘外壳上的序列号,不是格式化后的序列
号,C语言源程序如下(注:该程序由顶尖高手丁凯所写):
#include <windows.h>
#include <stdio.h>WORD pw[256];static DWORD idt, int_idt;
static DWORD Base;
static WORD Entry;#pragma warning (disable:4035)
static int inp(WORD rdx)
{
_asm xor eax, eax
_asm mov dx, rdx
_asm in al, dx
}static WORD inpw(WORD rdx)
{
_asm xor eax, eax
_asm mov dx, rdx
_asm in ax, dx
}static void outp(WORD rdx, int ral)
{
_asm mov dx, rdx
_asm mov eax, ral
_asm out dx, al
}static int WaitIde()
{
int al; while ((al=inp(0x1F7))>=0x80) ;
return al;
}static void ReadIDE()
{
int al;
int i; 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);
}
}static void __declspec( naked ) NowInRing0()
{
_asm {
push ebp
mov ebp,esp call ReadIDE cli
mov ebx, int_idt
mov ax, Entry
mov word ptr [ebx-4], ax
mov eax, Base
shr eax, 16
mov [ebx+2], ax
sti
leave
iretd
}
}void GetIDEInfo()
{
DWORD dwExcept; dwExcept = (DWORD)NowInRing0; _asm {
mov eax, fs:[0]
push eax
sidt [esp-02h]
pop ebx
mov idt, ebx
add ebx, 0x1C
mov int_idt, ebx mov eax, [ebx]
mov [Base], eax
mov ax, [ebx-4]
mov [Entry], ax cli
mov esi, dwExcept
push esi
mov [ebx-4], si
shr esi, 16
mov [ebx+2], si
pop esi
sti int 3
}
}main()
{
char s[80];
register i,j; GetIDEInfo(); for (i=0,j=0;i<10;i++) {
s[j++]=pw[10+i]>>8;
s[j++]=pw[10+i]&0xFF;
}
s[j] = 0; printf("Serial=%s\n", s); return 0;
}
CoDelphi.com 摘 要:用Delphi调用Bios的信息
关键字:BIOS
类 别:系统控制
--------------------------------------------------------------------------------
添加一个Tbutton和一个Tmemo组件到窗体并写如下代码到按钮的OnClick事件:with Memo1.Lines do
begin
Add('MainBoardBiosName:'+^I+string(Pchar(Ptr($FE061))));
Add('MainBoardBiosCopyRight:'+^I+string(Pchar(Ptr($FE091))));
Add('MainBoardBiosDate:'+^I+string(Pchar(Ptr($FFFF5))));
Add('MainBoardBiosSerialNo:'+^I+string(Pchar(Ptr($FEC71))));
end; 以上代码在Win9X上运行通过。
String(Pchar(Ptr($FE061)))的意思是将内存地址$FE061中的内容转化为字符串因为计算机在开机后,会将BIOS信息复制到内存中但上面地址是对Award BIOS而言,AMI等其它BIOS相关信息的内存地址不相同如果是AMI的,地址为:BIOS 序列号:$FF478
BIOS 日期:$FFFF5
BIOS copyright:$FE0CBNT下需要打开内核对象,把文件视图映射到进程地址空间!http://expert.csdn.net/Expert/topic/1279/1279303.xml