如何取得CPU的唯一碼 |
尚未結案
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
|
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
都有呀... 把 SOURCE CODE 部份幫你節錄出來好了!!
///////////////////////////////////////////////////////////////////////////// // (c) NPS, 1997 - Idea, realisation, adoptation IsCPUID_Available) // // kvk@estpak.ee // // (c) Alex Abreu, 1997 - IsCPUID_Available source and idea // // simonet@bhnet.com.br // ///////////////////////////////////////////////////////////////////////////// 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. ================================= MAC Address example (works on Win2000 and XP for sure): uses NB30; function GetAdapterInfo(Lana: Char): String; var Adapter: TAdapterStatus; NCB: TNCB; begin FillChar(NCB, SizeOf(NCB), 0); NCB.ncb_command := Char(NCBRESET); NCB.ncb_lana_num := Lana; if Netbios(@NCB) <> Char(NRC_GOODRET) then begin Result := 'mac not found'; Exit; end; FillChar(NCB, SizeOf(NCB), 0); NCB.ncb_command := Char(NCBASTAT); NCB.ncb_lana_num := Lana; NCB.ncb_callname := '*'; FillChar(Adapter, SizeOf(Adapter), 0); NCB.ncb_buffer := @Adapter; NCB.ncb_length := SizeOf(Adapter); if Netbios(@NCB) <> Char(NRC_GOODRET) then begin Result := 'mac not found'; Exit; end; Result := IntToHex(Byte(Adapter.adapter_address[0]), 2) '-' IntToHex(Byte(Adapter.adapter_address[1]), 2) '-' IntToHex(Byte(Adapter.adapter_address[2]), 2) '-' IntToHex(Byte(Adapter.adapter_address[3]), 2) '-' IntToHex(Byte(Adapter.adapter_address[4]), 2) '-' IntToHex(Byte(Adapter.adapter_address[5]), 2); end; function GetMACAddress: string; var AdapterList: TLanaEnum; NCB: TNCB; begin FillChar(NCB, SizeOf(NCB), 0); NCB.ncb_command := Char(NCBENUM); NCB.ncb_buffer := @AdapterList; NCB.ncb_length := SizeOf(AdapterList); Netbios(@NCB); if Byte(AdapterList.length) > 0 then Result := GetAdapterInfo(AdapterList.lana[0]) else Result := 'mac not found'; end; // usage procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(GetMACAddress); end;還有就是按那一篇的建議到 http://www.torry.net/cpu.htm 去看看, 有不少 Freeware 的元件, 含 SOURCE CODE 的!! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
mcho
初階會員 發表:57 回覆:106 積分:42 註冊:2002-11-11 發送簡訊給我 |
|
vagrant
一般會員 發表:29 回覆:72 積分:20 註冊:2003-07-04 發送簡訊給我 |
|
t27
中階會員 發表:34 回覆:95 積分:90 註冊:2002-06-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |