delphi 获取硬盘序列号、cpu号、bios号、网卡号
生活随笔
收集整理的這篇文章主要介紹了
delphi 获取硬盘序列号、cpu号、bios号、网卡号
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
delphi 獲取硬盤序列號、cpu號、bios號、網卡號2009-06-15 9:45delphi 獲取硬盤 序列號function GetIdeNum: String;
typeTSrbIoControl = packed recordHeaderLength : ULONG;Signature : Array[0..7] of Char;Timeout : ULONG;ControlCode : ULONG;ReturnCode : ULONG;Length : ULONG;
end;
SRB_IO_CONTROL = TSrbIoControl;
PSrbIoControl = ^TSrbIoControl;TIDERegs = packed recordbFeaturesReg : Byte;bSectorCountReg : Byte;bSectorNumberReg : Byte;bCylLowReg : Byte;bCylHighReg : Byte;bDriveHeadReg : Byte;bCommandReg : Byte;bReserved : Byte;
end;
IDEREGS = TIDERegs;
PIDERegs = ^TIDERegs;TSendCmdInParams = packed recordcBufferSize : 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 recordwGenConfig : 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 );
varptr : PChar;i : Integer;c : Char;
beginptr := @Data;for i := 0 to (Size shr 1)-1 dobeginc := 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
beginhDevice := CreateFile( '\\.\Scsi0:',GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,nil, OPEN_EXISTING, 0, 0 );if hDevice=INVALID_HANDLE_VALUE thenExit;trysrbControl.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^ dobegincBufferSize := IDENTIFY_BUFFER_SIZE;bDriveNumber := 0;with irDriveRegs dobeginbFeaturesReg := 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 ) thenExit;finallyCloseHandle(hDevice);end;
end else beginhDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil,CREATE_NEW, 0, 0 );if hDevice=INVALID_HANDLE_VALUE thenExit;trypInData := PSendCmdInParams(@Buffer);pOutData := @pInData^.bBuffer;with pInData^ dobegincBufferSize := IDENTIFY_BUFFER_SIZE;bDriveNumber := 0;with irDriveRegs dobeginbFeaturesReg := 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 ) thenExit;finallyCloseHandle(hDevice);end;
end;
with PIdSector(PChar(pOutData)+16)^ do
beginChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
end;
Result:=Trim(Result);
end;下面三個函數配合實現獲取cpu 的idfunction 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';
Tryfor I := Low(CPUID) to High(CPUID) doCPUID[I] := -1;if IsCPUID_Available thenbeginCPUID:= GetCPUID;Result:=IntToStr(CPUID[1])+'-'+IntToStr(CPUID[2])+'-'+IntToStr(CPUID[3])+'-'+IntToStr(CPUID[4]);End;
ExceptResult:='0';
End;
end;下面函數獲取bios編號{***************************************
author/date:
description:獲取bios編號
***************************************}
function GetBiosNum: String;
Var
BiosDate,BiosName,BiosVersion,BiosNum,BiosCopyright:String;
begin
TryBiosDate:=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;
ExceptResult:='';
End;
end;
總結
以上是生活随笔為你收集整理的delphi 获取硬盘序列号、cpu号、bios号、网卡号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FPGA 之 SOPC 系列(六)Nio
- 下一篇: SAP BAdI 深度解读