码迷,mamicode.com
首页 > 其他好文 > 详细

获取CPU系列号,硬盘系

时间:2014-10-18 15:14:36      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   io   os   ar   for   sp   

unit Secrity;  
  
interface  
  
uses  
  
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  
Dialogs, StdCtrls,nb30;{重要引用}  
  
type  
  
PASTAT = ^TASTAT;  
  
TASTAT = record  
  
    adapter : TAdapterStatus;  
  
    name_buf : TNameBuffer;  
  
end;  
  
TForm1 = class(TForm)  
  
    Button1: TButton;  
  
    Edit1: TEdit;  
  
    procedure Button1Click(Sender: TObject);  
  
private  
  
    { Private declarations }  
  
public  
  
    { Public declarations }  
  
end;  
  
var  
  
Form1: TForm1;  
  
implementation  
  
{$R *.dfm}  
  
type  
  
TCPUID = array[1..4] of Longint;  
  
//取硬盘系列号:  
  
function GetIdeSerialNumber: pchar; //获取硬盘的出厂系列号;  
  
const IDENTIFY_BUFFER_SIZE = 512;  
  
type  
  
   TIDERegs = packed record  
  
     bFeaturesReg: BYTE;  
  
     bSectorCountReg: BYTE;  
  
     bSectorNumberReg: BYTE;  
  
     bCylLowReg: BYTE;  
  
     bCylHighReg: BYTE;  
  
     bDriveHeadReg: BYTE;  
  
     bCommandReg: BYTE;  
  
     bReserved: BYTE;  
  
end;  
  
TSendCmdInParams = packed record  
  
    cBufferSize: DWORD;  
  
    irDriveRegs: TIDERegs;  
  
    bDriveNumber: BYTE;  
  
    bReserved: array[0..2] of Byte;  
  
    dwReserved: array[0..3] of DWORD;  
  
    bBuffer: array[0..0] of Byte;  
  
end;  
  
TIdSector = packed record  
  
    wGenConfig: Word;  
  
    wNumCyls: Word;  
  
    wReserved: Word;  
  
    wNumHeads: Word;  
  
    wBytesPerTrack: Word;  
  
    wBytesPerSector: Word;  
  
    wSectorsPerTrack: Word;  
  
    wVendorUnique: array[0..2] of Word;  
  
    sSerialNumber: array[0..19] of CHAR;  
  
    wBufferType: Word;  
  
    wBufferSize: Word;  
  
    wECCSize: Word;  
  
    sFirmwareRev: array[0..7] of Char;  
  
    sModelNumber: array[0..39] of Char;  
  
    wMoreVendorUnique: Word;  
  
    wDoubleWordIO: Word;  
  
    wCapabilities: Word;  
  
    wReserved1: Word;  
  
    wPIOTiming: Word;  
  
    wDMATiming: Word;  
  
    wBS: Word;  
  
    wNumCurrentCyls: Word;  
  
    wNumCurrentHeads: Word;  
  
    wNumCurrentSectorsPerTrack: Word;  
  
    ulCurrentSectorCapacity: DWORD;  
  
    wMultSectorStuff: Word;  
  
    ulTotalAddressableSectors: DWORD;  
  
    wSingleWordDMA: Word;  
  
    wMultiWordDMA: Word;  
  
    bReserved: array[0..127] of BYTE;  
  
end;  
  
PIdSector = ^TIdSector;  
  
TDriverStatus = packed record  
  
    bDriverError: Byte;  
  
    bIDEStatus: Byte;  
  
    bReserved: array[0..1] of Byte;  
  
    dwReserved: array[0..1] of DWORD;  
  
end;  
  
TSendCmdOutParams = packed record  
  
    cBufferSize: DWORD;  
  
    DriverStatus: TDriverStatus;  
  
    bBuffer: array[0..0] of BYTE;  
  
end;  
  
var  
  
hDevice: Thandle;  
  
cbBytesReturned: DWORD;  
  
SCIP: TSendCmdInParams;  
  
aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE-1)-1] of Byte;  
  
IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;  
  
procedure ChangeByteOrder(var Data; Size: Integer);  
  
var  
  
ptr: Pchar;  
  
i: Integer;  
  
c: Char;  
  
begin  
  
ptr := @Data;  
  
for I := 0 to (Size shr 1) - 1 do begin  
  
    c := ptr^;  
  
    ptr^ := (ptr + 1)^;  
  
    (ptr + 1)^ := c;  
  
    Inc(ptr, 2);  
  
end;  
  
end;  
  
begin  
  
    Result := ‘‘;  
  
    if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then  
  
       begin // Windows NT, Windows 2000  
  
         hDevice := CreateFile(//./PhysicalDrive0, GENERIC_READ or GENERIC_WRITE,  
  
         FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);  
  
       end  
  
    else // Version Windows 95 OSR2, Windows 98  
  
       hDevice := CreateFile(//./SMARTVSD, 0, 0, nil, CREATE_NEW, 0, 0);  
  
    if hDevice = INVALID_HANDLE_VALUE then Exit;  
  
    try  
  
      FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);  
  
      FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);  
  
      cbBytesReturned := 0;  
  
      with SCIP do  
  
      begin  
  
        cBufferSize := IDENTIFY_BUFFER_SIZE;  
  
        with irDriveRegs do  
  
        begin  
  
          bSectorCountReg := 1;  
  
          bSectorNumberReg := 1;  
  
          bDriveHeadReg := $A0;  
  
          bCommandReg := $EC;  
  
        end;  
  
      end;  
  
      if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;  
  
    finally  
  
      CloseHandle(hDevice);  
  
    end;  
  
    with PIdSector(@IdOutCmd.bBuffer)^ do  
  
    begin  
  
      ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));  
  
      (Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^:= #0;  
  
      Result := Pchar(@sSerialNumber);  
  
    end;  
  
end;  
  
//=================================================================  
  
//CPU系列号:  
  
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 GetCPUIDStr:String;  
  
var  
  
CPUID:TCPUID;  
  
begin  
  
CPUID:=GetCPUID;  
  
Result:=IntToHex(CPUID[1],8)+IntToHex(CPUID[2],8)+IntToHex(CPUID[3],8)+IntToHex(CPUID[4],8);  
  
end;  
  
///==================================================================================  
  
///取MAC(非集成网卡):  
  
function NBGetAdapterAddress(a: Integer): string;  
  
var  
  
NCB: TNCB; // Netbios control block //NetBios控制块  
  
ADAPTER: TADAPTERSTATUS; // Netbios adapter status//取网卡状态  
  
LANAENUM: TLANAENUM; // Netbios lana  
  
intIdx: Integer; // Temporary work value//临时变量  
  
cRC: Char; // Netbios return code//NetBios返回值  
  
strTemp: string; // Temporary string//临时变量  
  
begin  
  
// Initialize  
  
Result := ‘‘;  
  
try  
  
    // Zero control blocl  
  
    ZeroMemory(@NCB, SizeOf(NCB));  
  
    // Issue enum command  
  
    NCB.ncb_command := Chr(NCBENUM);  
  
    cRC := NetBios(@NCB);  
  
    // Reissue enum command  
  
    NCB.ncb_buffer := @LANAENUM;  
  
    NCB.ncb_length := SizeOf(LANAENUM);  
  
    cRC := NetBios(@NCB);  
  
    if Ord(cRC) <> 0 then  
  
      exit;  
  
    // Reset adapter  
  
    ZeroMemory(@NCB, SizeOf(NCB));  
  
    NCB.ncb_command := Chr(NCBRESET);  
  
    NCB.ncb_lana_num := LANAENUM.lana[a];  
  
    cRC := NetBios(@NCB);  
  
    if Ord(cRC) <> 0 then  
  
      exit;  
  
    // Get adapter address  
  
    ZeroMemory(@NCB, SizeOf(NCB));  
  
    NCB.ncb_command := Chr(NCBASTAT);  
  
    NCB.ncb_lana_num := LANAENUM.lana[a];  
  
    StrPCopy(NCB.ncb_callname, *);  
  
    NCB.ncb_buffer := @ADAPTER;  
  
    NCB.ncb_length := SizeOf(ADAPTER);  
  
    cRC := NetBios(@NCB);  
  
    // Convert it to string  
  
    strTemp := ‘‘;  
  
    for intIdx := 0 to 5 do  
  
      strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]), 2);  
  
    Result := strTemp;  
  
finally  
  
end;  
  
end;  
  
//==========================================================================  
  
//取MAC地址(集成网卡和非集成网卡):  
  
function Getmac:string;  
  
var  
  
ncb : TNCB;  
  
s:string;  
  
adapt : TASTAT;  
  
lanaEnum : TLanaEnum;  
  
i, j, m : integer;  
  
strPart, strMac : string;  
  
begin  
  
FillChar(ncb, SizeOf(TNCB), 0);  
  
ncb.ncb_command := Char(NCBEnum);  
  
ncb.ncb_buffer := PChar(@lanaEnum);  
  
ncb.ncb_length := SizeOf(TLanaEnum);  
  
s:=Netbios(@ncb);  
  
for i := 0 to integer(lanaEnum.length)-1 do  
  
begin  
  
    FillChar(ncb, SizeOf(TNCB), 0);  
  
    ncb.ncb_command := Char(NCBReset);  
  
    ncb.ncb_lana_num := lanaEnum.lana[i];  
  
    Netbios(@ncb);  
  
    Netbios(@ncb);  
  
    FillChar(ncb, SizeOf(TNCB), 0);  
  
    ncb.ncb_command := Chr(NCBAstat);  
  
    ncb.ncb_lana_num := lanaEnum.lana[i];  
  
    ncb.ncb_callname := *               ;  
  
    ncb.ncb_buffer := PChar(@adapt);  
  
    ncb.ncb_length := SizeOf(TASTAT);  
  
    m:=0;  
  
    if (Win32Platform = VER_PLATFORM_WIN32_NT) then  
  
    m:=1;  
  
    if m=1 then  
  
    begin  
  
    if Netbios(@ncb) = Chr(0) then  
  
      strMac := ‘‘;  
  
      for j := 0 to 5 do  
  
      begin  
  
        strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);  
  
        strMac := strMac + strPart + -;  
  
      end;  
  
      SetLength(strMac, Length(strMac)-1);  
  
    end;  
  
if m=0 then  
  
    if Netbios(@ncb) <> Chr(0) then  
  
    begin  
  
      strMac := ‘‘;  
  
      for j := 0 to 5 do  
  
      begin  
  
        strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);  
  
        strMac := strMac + strPart + -;  
  
      end;  
  
      SetLength(strMac, Length(strMac)-1);  
  
    end;  
  
end;  
  
result:=strmac;  
  
end;  
  
function PartitionString(StrV,PrtSymbol: string): TStringList;  
  
var  
  
iTemp: integer;  
  
begin  
  
result := TStringList.Create;  
  
iTemp := pos(PrtSymbol,StrV);  
  
while iTemp>0 do begin  
  
    if iTemp>1 then result.Append(copy(StrV,1,iTemp-1));  
  
    delete(StrV,1,iTemp+length(PrtSymbol)-1);  
  
    iTemp := pos(PrtSymbol,StrV);  
  
end;  
  
if Strv<>‘‘ then result.Append(StrV);  
  
end;  
  
function MacStr():String;  
  
var  
  
Str:TStrings;  
  
i:Integer;  
  
MacStr:String;  
  
begin  
  
MacStr:=‘‘;  
  
Str:=TStringList.Create;  
  
Str:=PartitionString(Getmac,-);  
  
for i:=0 to Str.Count-1 do  
  
    MacStr:=MacStr+Str[i];  
  
Result:=MacStr;  
  
end;  
  
//==============================================  
  
//调用例子  
  
procedure TForm1.Button1Click(Sender: TObject);  
  
begin  
  
//Edit1.Text:=strpas(GetIdeSerialNumber)//取硬盘号  
  
//Edit1.text:=GetCPUIDStr;//CPU系列号  
  
//edit1.Text:=NBGetAdapterAddress(12);//非集成网卡  
  
Edit1.text:=MacStr;//集成和非集成网卡  
  
end;  

 

获取CPU系列号,硬盘系

标签:des   style   blog   color   io   os   ar   for   sp   

原文地址:http://www.cnblogs.com/qingsong/p/4033000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!