Essa funções só funciona se o recuso de S.M.A.R.T. da placa mãe estiver 
ativo. Podem testar essa função desabilitando o recurso de S.M.A.R.T. e ver 
se ela retorna ainda assim o serial físico do HD.
Sds.

>From: "fabio_giro" <[EMAIL PROTECTED]>
>Reply-To: delphi-br@yahoogrupos.com.br
>To: delphi-br@yahoogrupos.com.br
>Subject: [delphi-br] Re: Numero fisico do HD
>Date: Fri, 06 Oct 2006 17:12:16 -0000
>
>//serial físico, aquele que vem de fábrica e não muda depois da
>formatação
>
>function GetIdeDiskSerialNumber : 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;
>       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; // PSendCmdOutParams
>     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
>        // Windows NT, Windows 2000, Windows XP
>        begin
>          // recuperar handle da porta SCSI
>          hDevice := CreateFile('\\.\Scsi0:',
>           // 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.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
>         // 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(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;
>   end;
>
>procedure TForm1.Button1Click(Sender: TObject);
>var s : String;
>       rc : DWORD;
>   begin
>     s := GetIdeDiskSerialNumber;
>     if s='' then
>     begin
>       rc := GetLastError;
>       if rc=0 then showmessage('Drive IDE não suporta SMART')
>        else showmessage(SysErrorMessage(rc));
>     end
>     else showmessage('Número serial do disco: '''+ s+'''');
>//    ReadLn;
>end;
>
>Espero ter ajudado.
>
>--- Em delphi-br@yahoogrupos.com.br, "Luiz Henrique Santos"
><[EMAIL PROTECTED]> escreveu
> >
> > Pessoal,
> >
> > Eu sei que posso obter o numero do volume com a API
> > GetVolumeInformation mas esse não me serve. Preciso do numero
>fisico do
> > HD. Alguem sabe como fazer isso?
> >
> > Luiz Henrique
> >
>
>
>
>
>
>
>

_________________________________________________________________
MSN Hotmail, o maior webmail do Brasil. http://www.hotmail.com



-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 


Responder a