如何获取主板序列号?(100分)

  • 主题发起人 主题发起人 qiyuanwj
  • 开始时间 开始时间
Q

qiyuanwj

Unregistered / Unconfirmed
GUEST, unregistred user!
//取得主板的序列号
FSerial := String(Pchar(Ptr($FEC71)));
这句在win2000下不能运行,哪位大虾有解决的办法?送100大元[?][?]
 
主板ID:
TCPUIDARRAY=array[1..4] of Longint;
function GetCPUID : TCPUIDARRAY; assembler;register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {CPUID Command}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
end;

或者用此法:
edit1.text:=string(pchar(ptr($ffff5))); // bios date
edit2.text:=string(pchar(ptr($ffa68))); // bios name
edit3.text:=string(pchar(ptr($fe061))); // bios version
edit4.text:=string(pchar(ptr($fec71))); // bios serial number
edit5.text:=string(pchar(ptr($fe091))); // bios copyringht

 
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 = 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;
}


 
两位大虾提供的代码可以在Win2000和XP正常运行吗?
 
好像是CPU的序列号
 
edit1.text:=string(pchar(ptr($ffff5))); // bios date
edit2.text:=string(pchar(ptr($ffa68))); // bios name
edit3.text:=string(pchar(ptr($fe061))); // bios version
edit4.text:=string(pchar(ptr($fec71))); // bios serial number
edit5.text:=string(pchar(ptr($fe091))); // bios copyringht
这几句可以在2000和Xp下通过吗?
 
edit4.text:=string(pchar(ptr($fec71))); // bios serial number
这句和我测试过的语句一样,不能在2000下运行,其他又太繁琐了,有没有什么简单点的
 
解决问题者我也给分!
 
我也想知道。
 
谁能提供完整的单元文件或者控件,并给出详细的调用方法,100分全给他!!楼上的几位兄弟同意吗?
 
edit1.text:=string(pchar(ptr($ffff5))); // bios date
edit2.text:=string(pchar(ptr($ffa68))); // bios name
edit3.text:=string(pchar(ptr($fe061))); // bios version
edit4.text:=string(pchar(ptr($fec71))); // bios serial number
edit5.text:=string(pchar(ptr($fe091))); // bios copyringht

这种方法在XP下调试不成功![:(]
 
to del520
在2000下都不行,XP下别谈了
 
100分没人要啊[:(]
 
你的mail?我给你一个单元吧,通用。
 
shenloqi,谢谢。qiyuanwj@163.com
 
已发,自己看函数,很简单,就不提供Demo了。
别人不要在下面留Email了。
 
接受答案了.
 
qiyuanwj:能不能把shenloqi给你发的单元也给我一份,我查了好久了,一直没有答案
 
qiyuanwj:
从帖子上知道shenloqi大侠给你一个取得主板序列号的单元,能不能email一份给我啊,
我找这个好久了,急切等待中。
我的mail:ebeggar@163.com
多谢!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
844
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部