delphi 获取硬盘序列号、cpu号、bios号、网卡号
delphi 获取硬盘序列号、cpu号、bios号、网卡号2009-06-15 0945delphi 获取硬盘 序列号
function GetIdeNum String;
type
TSrbIoControl = packed record
HeaderLength  ULONG;
Signature  Array[0..7] of Char;
Timeout  ULONG;
ControlCode  ULONG;
ReturnCode  ULONG;
Length  ULONG;
end;
SRB_IO_CONTROL = TSrbIoControl;
PSrbIoControl = ^TSrbIoControl;
TIDERegs = packed record
bFeaturesReg  Byte;
bSectorCountReg  Byte;
bSectorNumberReg  Byte;
bCylLowReg  Byte;
bCylHighReg  Byte;
bDriveHeadReg  Byte;
bCommandReg  Byte;
bReserved  Byte;
end;
IDEREGS = TIDERegs;
PIDERegs = ^TIDERegs;
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;
SENDCMDINPARAMS = TSendCmdInParams;
PSendCmdInParams = ^TSendCmdInParams;
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  ULONG;
wMultSectorStuff  Word;
ulTotalAddressableSectors  ULONG;
wSingleWordDMA  Word;
wMultiWordDMA  Word;
bReserved  Array[0..127] of Byte;
end;
PIdSector = ^TIdSector;
const
IDE_ID_FUNCTION = $EC;
IDENTIFY_BUFFER_SIZE = 512;
DFP_RECEIVE_DRIVE_DATA = $0007c088;
IOCTL_SCSI_MINIPORT = $0004d008;
IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
var
hDevice  THandle;
cbBytesReturned  DWORD;
pInData  PSendCmdInParams;
pOutData  Pointer;
Buffer  Array[0..BufferSize-1] of Byte;
srbControl  TSrbIoControl absolute Buffer;
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 = '';
FillChar(Buffer,BufferSize,#0);
if Win32Platform=VER_PLATFORM_WIN32_NT then
begin
hDevice = CreateFile( '.Scsi0',GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,nil, OPEN_EXISTING, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then
Exit;
try
srbControl.HeaderLength = SizeOf(SRB_IO_CONTROL);
System.Move('SCSIDISK',srbControl.Signature,8);
srbControl.Timeout = 2;
srbControl.Length = DataSize;
srbControl.ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
pInData = PSendCmdInParams(PChar(@Buffer)+SizeOf(SRB_IO_CONTROL));
pOutData = pInData;
with pInData^ do
begin
cBufferSize = IDENTIFY_BUFFER_SIZE;
bDriveNumber = 0;
with irDriveRegs do
begin
bFeaturesReg = 0;
bSectorCountReg = 1;
bSectorNumberReg = 1;
bCylLowReg = 0;
bCylHighReg = 0;
bDriveHeadReg = $A0;
bCommandReg = IDE_ID_FUNCTION;
end;
end;
if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,@Buffer, BufferSize, @Buffer, BufferSize,cbBytesReturned, nil ) then
Exit;
finally
CloseHandle(hDevice);
end;
end else begin
hDevice = CreateFile( '.SMARTVSD', 0, 0, nil,CREATE_NEW, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then
Exit;
try
pInData = PSendCmdInParams(@Buffer);
pOutData = @pInData^.bBuffer;
with pInData^ do
begin
cBufferSize = IDENTIFY_BUFFER_SIZE;
bDriveNumber = 0;
with irDriveRegs do
begin
bFeaturesReg = 0;
bSectorCountReg = 1;
bSectorNumberReg = 1;
bCylLowReg = 0;
bCylHighReg = 0;
bDriveHeadReg = $A0;
bCommandReg = IDE_ID_FUNCTION;
end;
end;
if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,pInData, SizeOf(TSendCmdInParams)-1, pOutData,W9xBufferSize, cbBytesReturned, nil ) then
Exit;
finally
CloseHandle(hDevice);
end;
end;
with PIdSector(PChar(pOutData)+16)^ do
begin
ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
end;
Result=Trim(Result);
end;
下面三个函数配合实现获取cpu 的id
function GetCPUID  TCPUID; assembler; register;
asm
PUSH    EBX
PUSH    EDI
MOV    EDI,EAX
MOV    EAX,1
DW      $A20F
STOSD
MOV    EAX,EBX
STOSD
MOV    EAX,ECX
STOSD
MOV    EAX,EDX
STOSD
POP    EDI
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;
function Cpu_GetCpuNum String;
var
CPUID  TCPUID;
I      Integer;
begin
Result='0';
Try
for I = Low(CPUID) to High(CPUID) do
CPUID[I] = -1;
if IsCPUID_Available then
begin
CPUID= GetCPUID;
Result=IntToStr(CPUID[1])+'-'+IntToStr(CPUID[2])+'-'+IntToStr(CPUID[3])+'-'+IntToStr(CPUID[4]);
End;
Except
Result='0';
End;
end;
下面函数获取bios编号
{
authordate
description获取bios编号
}
function GetBiosNum S
tring;
Var
BiosDate,BiosName,BiosVersion,BiosNum,BiosCopyrightString;
begin
Try
BiosDate=string(pchar(ptr($ffff5)));
BiosName=string(pchar(ptr($ffa68)));
BiosVersion=string(pchar(ptr($fe061)));
BiosNum=string(pchar(ptr($fec71)));
BiosCopyright=string(pchar(ptr($fe091)));
Result=BiosNum;
Except
Result='';
End;
end;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。