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 String;
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;