代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
PValue: TLabel;
FValue: TLabel;
MValue: TLabel;
SValue: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;function IsCPUID_Available : Boolean; register;
asm
PUSHFD {direct access to flags no possible, only via stack}
POP EAX {flags to EAX}
MOV EDX,EAX {save current flags}
XOR EAX,ID_BIT {not ID bit}
PUSH EAX {onto stack}
POPFD {from stack to flags, with not ID bit}
PUSHFD {back to stack}
POP EAX {get back to EAX}
XOR EAX,EDX {check if ID bit affected}
JZ @exit {no, CPUID not availavle}
MOV AL,True {Result=True}
@exit:
end;function GetCPUID : TCPUID; 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;function GetCPUVendor : TVendor; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI {Restore registers}
POP EBX
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CPUID : TCPUID;
I : Integer;
S : TVendor;
begin
for I := Low(CPUID) to High(CPUID) do CPUID[I] := -1;
if IsCPUID_Available then begin
CPUID := GetCPUID;
Label1.Caption := 'CPUID[1] = ' + IntToHex(CPUID[1],8);
Label2.Caption := 'CPUID[2] = ' + IntToHex(CPUID[2],8);
Label3.Caption := 'CPUID[3] = ' + IntToHex(CPUID[3],8);
Label4.Caption := 'CPUID[4] = ' + IntToHex(CPUID[4],8);
//PValue.Caption := IntToStr(CPUID[1] shr 12 and 3);
//FValue.Caption := IntToStr(CPUID[1] shr 8 and $f);
//MValue.Caption := IntToStr(CPUID[1] shr 4 and $f);
// SValue.Caption := IntToStr(CPUID[1] and $f);
S := GetCPUVendor;
Label5.Caption := 'Vendor: ' + S; end
else begin
Label5.Caption := 'CPUID not available';
end;
end;
end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
PValue: TLabel;
FValue: TLabel;
MValue: TLabel;
SValue: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;function IsCPUID_Available : Boolean; register;
asm
PUSHFD {direct access to flags no possible, only via stack}
POP EAX {flags to EAX}
MOV EDX,EAX {save current flags}
XOR EAX,ID_BIT {not ID bit}
PUSH EAX {onto stack}
POPFD {from stack to flags, with not ID bit}
PUSHFD {back to stack}
POP EAX {get back to EAX}
XOR EAX,EDX {check if ID bit affected}
JZ @exit {no, CPUID not availavle}
MOV AL,True {Result=True}
@exit:
end;function GetCPUID : TCPUID; 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;function GetCPUVendor : TVendor; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI {Restore registers}
POP EBX
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CPUID : TCPUID;
I : Integer;
S : TVendor;
begin
for I := Low(CPUID) to High(CPUID) do CPUID[I] := -1;
if IsCPUID_Available then begin
CPUID := GetCPUID;
Label1.Caption := 'CPUID[1] = ' + IntToHex(CPUID[1],8);
Label2.Caption := 'CPUID[2] = ' + IntToHex(CPUID[2],8);
Label3.Caption := 'CPUID[3] = ' + IntToHex(CPUID[3],8);
Label4.Caption := 'CPUID[4] = ' + IntToHex(CPUID[4],8);
//PValue.Caption := IntToStr(CPUID[1] shr 12 and 3);
//FValue.Caption := IntToStr(CPUID[1] shr 8 and $f);
//MValue.Caption := IntToStr(CPUID[1] shr 4 and $f);
// SValue.Caption := IntToStr(CPUID[1] and $f);
S := GetCPUVendor;
Label5.Caption := 'Vendor: ' + S; end
else begin
Label5.Caption := 'CPUID not available';
end;
end;
end.
解决方案 »
- 程序关闭时,无效的窗口句柄!
- 我如何连接数据库ACCESS,并将用户字段的全部信息读到窗体中的EDIT1.TXT中
- 为何Sql Server2000表中的image字段不能正常显示在image控件上
- 高难度的DLL问题
- 請教如何判斷 UPCASE(ECTE1.TEXT) = 'CANDY' ?
- shellexecute打印问题
- 形如以下的SQL语句,在Delphi用ado怎么连接且执行啊?
- 在listview中,如何根据鼠标的位置point(x,y),得知鼠标指在那条纪录?
- ============================高智商朋友请帮忙,一首难题。================================
- ACCESS中的外联接:FROM jibeng left join diaochu on jibeng.档案编号=diaochu.档案编号 left join diaoru on jibeng.档案编号=diaoru.档案编号 为什么不行?//准程序员
- 一高兴,把以前的帖子都结了,很多没有答案的也结了!再问个问题:memo组件的背景图的问题。
- 怎么样使dbgrid有flat的效果?
机器1:
GenuineIntel
0000 0F27
0001 080F
0000 0400
BFEB FBFF机器2:
GenuineIntel
0000 0686
0000 0001
0000 0000
0383 F9FF
机器2是WinXPpro+SP1
而且第三个号码不稳定,在同一台机子上会有两个不同的号码
0000 0F12
0001 0808
0000 0000
3FEB FBFF友情测试~~
说错了,是第二个号码
我原来的测试结果如下:2003-10-2 11:31:14
计算机:11-KABM0OXE0586 用户:Administrator
系统信息:5.1.2600.2.Service Pack 1
CPU频率:2410MH CPU型号:GenuineIntel Level 15 Rev. 2.9
CPUID1:00000F29
CPUID2:00020809
CPUID3:00004400
CPUID4:BFEBFBFF
硬盘序列号:
C盘卷标:157000322
BiosDate:04/30/03
BiosName:Award
BiosVersion:Award Modular BIOS v6.00PG
BiosSerial:04/30/2003-i875P-6A79BG02C-00
BisoCopyright:Copyright (C) 1984-2003, Award Software, Inc.
2003-10-2 11:31:17
计算机:11-KABM0OXE0586 用户:Administrator
系统信息:5.1.2600.2.Service Pack 1
CPU频率:2410MH CPU型号:GenuineIntel Level 15 Rev. 2.9
CPUID1:00000F29
CPUID2:01020809
CPUID3:00004400
CPUID4:BFEBFBFF
硬盘序列号:
C盘卷标:157000322
BiosDate:04/30/03
BiosName:Award
BiosVersion:Award Modular BIOS v6.00PG
BiosSerial:04/30/2003-i875P-6A79BG02C-00
BisoCopyright:Copyright (C) 1984-2003, Award Software, Inc.
http://www.0mai.com/bbs上有说明
如果是这样子的话,我根本不能拿这个来做用户认证。
请问:有没有其他的一些办法,得到计算机的唯一ID?比如主板的ID?
个人觉得象网卡、硬盘的一些ID不太好用,还是有不少机器都可能更换网卡和硬盘的。谢谢!!!
但在Win98和Win2000上实现不一样(要进入Ring0层)
正尝试进入Ring0
UP!
我是用的CPUID+硬盘序列号,但CPUID我是用的第一个和第四个号码。
硬盘的ID是唯一的通过CallGate在NT下进入Ring0读CMOS的BIOS不是问题,但是BIOS可以修改的,也不可靠的 fj218(洞庭风) 说得好:每台电脑都有一个唯一的号码不太现实所以有一定的可靠性就可以了