tem tambem o detalhe do sistema operacional, se for 64 bits tambem não funciona


________________________________
De: Rubem Rocha <rubem.ro...@dtmanaus.com.br>
Para: delphi-br@yahoogrupos.com.br
Enviadas: Terça-feira, 26 de Janeiro de 2010 19:50:24
Assunto: RES: [delphi-br] Pegar Serial Fisico de HD no Delphi 2010

  
Outras coisas:

1)      Vc quer pegar o serial de um HD SCSI ou IDE? Essa daí só funciona
pra SCSI. Do mesmo jeito q vc conseguiu essa pra SCSI, vc tb vai conseguir a
função pra IDE.

2)      Cadê o código dessa rotina ChangeByteOrder?

Sds.

De: delphi...@yahoogrup os.com.br [mailto:delphi...@yahoogrup os.com.br] Em
nome de Iran Lima
Enviada em: terça-feira, 26 de janeiro de 2010 16:55
Para: delphi...@yahoogrup os.com.br
Assunto: [delphi-br] Pegar Serial Fisico de HD no Delphi 2010

Gente o que muda na função migrando para o Delphi 2010 ??? Existe AnsiWord e
AnsiByte ?? hehe, to botando tudo “ANSI”

function GetIdeDiskSerialNum ber : 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; // 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;

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;

wNumCurrentSectorsP erTrack : Word;

ulCurrentSectorCapa city : ULONG;

wMultSectorStuff : Word;

ulTotalAddressableS ectors : 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(TSendCmdInPa rams)-1+IDENTIFY _BUFFER_SIZE;

BufferSize = SizeOf(SRB_IO_ CONTROL)+ DataSize;

W9xBufferSize = IDENTIFY_BUFFER_ SIZE+16;

var

hDevice : THandle;

cbBytesReturned : DWORD;

pInData : PSendCmdInParams;

pOutData : Pointer; // PSendCmdOutParams

Buffer : Array[0..BufferSize -1] of Byte;

srbControl : TSrbIoControl absolute Buffer;

begin

Result := '';

FillChar(Buffer, BufferSize, #0);

if Win32Platform= VER_PLATFORM_ WIN32_NT then

// Windows NT, Windows 2000, Windows XP

begin

// recuperar handle da porta SCSI

hDevice := CreateFile(PChar( '\\.\' + GetSysDrive) , 

// Nota: '\\.\C:' precisa de privilégios administrativos

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.HeaderLe ngth := SizeOf(SRB_IO_ CONTROL);

System.Move( 'SCSIDISK' ,srbControl. Signature, 8);

srbControl.Timeout := 2;

srbControl.Length := DataSize;

srbControl.ControlC ode := 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

// Windows 95 OSR2, Windows 98, Windows ME

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(TSendCmdInPa rams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil )
then Exit;

finally

CloseHandle( hDevice);

end;

end;

with PIdSector(PChar( pOutData) +16)^ do

begin

ChangeByteOrder( sSerialNumber, SizeOf(sSerialNu mber));

SetString(Result, sSerialNumber, SizeOf(sSerialNu mber));

end;

end;

[As partes desta mensagem que não continham texto foram removidas]


 


      
____________________________________________________________________________________
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com

[As partes desta mensagem que não continham texto foram removidas]

Responder a