bestlong 怕失憶論壇's Archiver

bestlong 發表於 2012-3-21 14:35

Delphi 讀取硬體資訊

取得 CPU 序號,不過在多核心環境會有多組序號[code]unit HardwareInfo;

interface

uses
  SysUtils;

{取得CPU序號(多核心會有多個序號)}
function GetCPUInfo: String;

implementation

function GetCPUInfo: String;
type
  TCPUID  = array[1..4] of Longint;
  TVendor = array[0..11] of Char;

var
  CPUID: TCPUID;
  I: Integer;
  S: TVendor;

  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;
  
  function IsCPUID_Available : Boolean; register;
  asm
    PUSHFD
    POP     EAX
    MOV     EDX,EAX
    XOR     EAX,$200000
    PUSH    EAX
    POPFD
    PUSHFD
    POP     EAX
    XOR     EAX,EDX
    JZ      @exit
    MOV     AL,True
    @exit:
  end;

begin
  for I := Low(CPUID) to High(CPUID) do
    CPUID[I] := -1;

  CPUID := GetCPUID;
  if IsCPUID_Available then
  begin
    S := GetCPUVendor;

    Result := S +
        IntToHex(CPUID[1], 8) +
        IntToHex(CPUID[2], 8) +
        IntToHex(CPUID[3], 8) +
        IntToHex(CPUID[4], 8);
  end else begin
    Result := '0';
  end;
end;

end.
[/code]

bestlong 發表於 2012-3-21 14:36

取得網路卡的 MAC Address 資訊[code]unit HardwareInfo;

interface

uses
  SysUtils, nb30;

function GetAdapterInfo(Lana: Char): String;
function GetMACAddress: string;

implementation

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;

end.
[/code]
頁: [1]

Powered by Discuz! X1.5 Archiver   © 2001-2010 Comsenz Inc.