delphi 取CPU序列号的方法

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, StdCtrls, Buttons;

type
TDemoForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
GetButton: TBitBtn;
CloseButton: TBitBtn;
Bevel1: TBevel;
Label5: TLabel;
FLabel: TLabel;
MLabel: TLabel;
PLabel: TLabel;
SLabel: TLabel;
PValue: TLabel;
FValue: TLabel;
MValue: TLabel;
SValue: TLabel;
procedure GetButtonClick(Sender: TObject);
end;

var
DemoForm: TDemoForm;

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 TDemoForm.GetButtonClick(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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值