É um pouco grande, mas foi a unica que encontrei.
Já testei, funcionou de primeira!!!
{ procedure utilizada pela função que pega o serial do hd } 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;
{ função que pega o serial number FÍSICO do HD e retorna string } function GetIdeDiskSerialNumber : String; type
TSrbIoControl =packedrecord
HeaderLength: ULONG;
Signature: Array[0..7] of Char;
Timeout: ULONG;
ControlCode: ULONG;
ReturnCode: ULONG;
Length: ULONG; end;
SRB_IO_CONTROL = TSrbIoControl;
PSrbIoControl = ^TSrbIoControl;
TIDERegs =packedrecord
bFeaturesReg : Byte; // especificar "comandos" SMART
bSectorCountReg : Byte; // registro de contador de setor
bSectorNumberReg : Byte; // registro de número de setores
bCylLowReg : Byte; // valor de cilindro (byte mais baixo)
bCylHighReg : Byte; // valor de cilindro (byte mais alto)
bDriveHeadReg : Byte; // registro de drive/cabeça
bCommandReg : Byte; // comando IDE
bReserved : Byte; // reservado- tem que ser zero end;
IDEREGS = TIDERegs;
PIDERegs = ^TIDERegs;