Fórum Verificador do Serial do HD, será que ta certo??? #284786

15/06/2005

0

Pessoal, peguei um exemplo aqui no forum de como recuperar o serial do HD , segue abaixo a unit inteira:


unit Unit1;

interface


uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{$IFDEF VER150}
{$DEFINE VER140}
{$ENDIF}

{$IFNDEF VER140}
procedure RaiseLastOSError;
begin
  RaiseLastWin32Error;
end;
{$ENDIF}

function GetIdeDiskSerialNumber( ControllerNumber, DriveNumber : Integer ) : 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; // Used for specifying SMART "commands".
    bSectorCountReg  : Byte; // IDE sector count register
    bSectorNumberReg : Byte; // IDE sector number register
    bCylLowReg       : Byte; // IDE low order cylinder value
    bCylHighReg      : Byte; // IDE high order cylinder value
    bDriveHeadReg    : Byte; // IDE drive/head register
    bCommandReg      : Byte; // Actual IDE command.
    bReserved        : Byte; // reserved for future use.  Must be zero.
  end;
  IDEREGS   = TIDERegs;
  PIDERegs  = ^TIDERegs;

  TSendCmdInParams = packed record
    cBufferSize  : DWORD;                // Buffer size in bytes
    irDriveRegs  : TIDERegs;             // Structure with drive register values.
    bDriveNumber : Byte;                 // Physical drive number to send command to (0,1,2,3).
    bReserved    : Array[0..2] of Byte;  // Reserved for future expansion.
    dwReserved   : Array[0..3] of DWORD; // For future use.
    bBuffer      : Array[0..0] of Byte;  // Input buffer.
  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;
  s : String;
  pInData : PSendCmdInParams;
  pOutData : Pointer; // PSendCmdInParams;
  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 // Windows NT, Windows 2000
      Str(ControllerNumber,s);
      // Get SCSI port handle
      hDevice := CreateFile(
        PChar(´\\.\Scsi´+s+´:´),
        GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
      if hDevice=INVALID_HANDLE_VALUE then RaiseLastOSError;
      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 := DriveNumber;
          with irDriveRegs do
          begin
            bFeaturesReg     := 0;
            bSectorCountReg  := 1;
            bSectorNumberReg := 1;
            bCylLowReg       := 0;
            bCylHighReg      := 0;
            bDriveHeadReg    := $A0 or ((DriveNumber and 1) shl 4);
            bCommandReg      := IDE_ID_FUNCTION;
          end;
        end;
        if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then RaiseLastOSError;
      finally
        CloseHandle(hDevice);
      end;
    end
  else
    begin // Windows 95 OSR2, Windows 98
      hDevice := CreateFile( ´\\.\SMARTVSD´, 0, 0, nil, CREATE_NEW, 0, 0 );
      if hDevice=INVALID_HANDLE_VALUE then RaiseLastOSError;
      try
        pInData := PSendCmdInParams(@Buffer);
        pOutData := PChar(@pInData^.bBuffer);
        with pInData^ do
        begin
          cBufferSize  := IDENTIFY_BUFFER_SIZE;
          bDriveNumber := DriveNumber;
          with irDriveRegs do
          begin
            bFeaturesReg     := 0;
            bSectorCountReg  := 1;
            bSectorNumberReg := 1;
            bCylLowReg       := 0;
            bCylHighReg      := 0;
            bDriveHeadReg    := $A0 or ((DriveNumber and 1) shl 4);
            bCommandReg      := IDE_ID_FUNCTION;
          end;
        end;
        if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData, SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize, cbBytesReturned, nil ) then RaiseLastOSError;
      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;

function GetIdeSN : String;
var
  iController, iDrive, maxController : Integer;
begin
  Result := ´´;
  maxController := 15;
  if Win32Platform<>VER_PLATFORM_WIN32_NT then maxController := 0;
  for iController := 0 to maxController do
  begin
    for iDrive := 0 to 4 do
    begin
      try
        Result := GetIdeDiskSerialNumber(iController,iDrive);
        if Result<>´´ then Exit;
      except
        // ignore exceptions
      end;
    end;
  end;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
var S: String;
begin
  S:= GetIdeSN;
  if S <> ´´ then edit1.Text:= S;
end;

end.


ela ta retornando este valor na minha máquina: [b:f9723fb099]5LA1QX32[/b:f9723fb099]

ta certo este numero?? não deveria ser maior??


Armando.boza

Armando.boza

Responder

Posts

15/06/2005

Rodrigo Coutinho

entra na parte de dica do propio site q tem a resposta. ou em www.scriptbrasil.com.br

[]s, Rodrigo Coutinho


Responder

Gostei + 0

06/09/2005

Paullsoftware

pra dar esse resultado deve ser por que vc ta usando um windows diferente do xp, pois, já fiz teste em windows 98 e assim mesmo que ele retorna, essa função não é 100¬ correta, acho que falta algo, mais pra segurança do seu sistema use algo a mais além do serial do hd, pegue informações da bios, da placa mãe e outros periféricos... dizem que nõa é bom fazer isso mais é ótimo, pois, só assim o cliente nõa vai esquecer de vc nunca :wink:


Responder

Gostei + 0

06/09/2005

Vinicius2k

Colegas,

O tamanho do serial não quer dizer, necessariamente, esteja errado...
Por, exemplo, o do meu disco : [b:2fd2849d90]4MR0VL0W[/b:2fd2849d90]. Este disco é um Seagate Barracuda [b:2fd2849d90]SATA[/b:2fd2849d90], modelo ST380817AS

A função acima foi retirada deste tópico? http://forum.clubedelphi.net/viewtopic.php?t=43652

No final do ano passado, desenvolvi um pacote de classes, cuja a finalidade é extrair serial de disco, MAC de placa de rede e informações de versão de arquivo. O pacote se chama VDOUtils, mas ainda [color=red:2fd2849d90][b:2fd2849d90]não tem documentação e nem demo.[/b:2fd2849d90][/color:2fd2849d90]

Quem estiver interessado em testar, pode baixá-lo deste endereço. É OpenSource e para Dephi 4 a 7:
http://200.251.137.3/~insigne/pessoais/vinicius/VDOUtils.zip
124.348 bytes / md5: 78b181dac05e7db18a0de942eb37cbe3

Um exemplo (simples) de uso seria :
1. Coloque um componente TVDOHddSerial no form.
2. No OnClick de um TButton escreva:
ShowMessage(VDOHddSerial1.SerialNumber);


Observações:

1. Dúvidas, sugestões e afins sobre os componentes, email-me no endereço especificado nas units dos componentes. Mas, infelizmente, não posso garantir suporte rápido pois estou com problemas de tempo...

2. Testei diversos discos IDE, com suporte a S.M.A.R.T, nos Windows 95/98/98SE/ME/2000/XP. Não testei com NT 4 e 2003 Server.
Não testei com discos SCSI ´alone´ e nem em arrays de discos SCSI formando RAID (comuns em servidores). Não testei em arrays de discos SATA com ou sem RAID.

3. Se funciona 100¬ em discos SATA ainda é duvidoso, mas, no meu caso e alguns poucos SATA que testei, funciona corretamente.
Algumas (ou todas) as placas mãe com chipset Intel, interpretam as interfaces SATA como se fossem IDE e não sei exatamente qual é o resultado disso.
O meu disco está utilizando ´Silicon Image SiI 3112 SATARaid Controller´

4. Para comprovar que o serial foi extraído corretamente, deve utilizar outros softwares de analise de hardware, como o Everest, por exemplo -- http://www.lavalys.hu/products/download.php?pid=1&lang=en --.

T+


Responder

Gostei + 0

07/09/2005

Marco Salles

.
Para comprovar que o serial foi extraído corretamente, deve utilizar outros softwares de analise de hardware, como o Everest, por exemplo -- http://www.lavalys.hu/products/download.php?pid=1&lang=en --.


Beleza , mas não estou conseguindo localizar no Everest nada que informe o numero do seira para que eu possa fazer esta comparação :cry: :cry: :cry:


Responder

Gostei + 0

07/09/2005

Ipc$

Alguém já tentou extrair a serial do hd utilizando WMI ?


Responder

Gostei + 0

08/09/2005

Armando.boza

Colegas, O tamanho do serial não quer dizer, necessariamente, esteja errado... Por, exemplo, o do meu disco : [b:1cafd60c14]4MR0VL0W[/b:1cafd60c14]. Este disco é um Seagate Barracuda [b:1cafd60c14]SATA[/b:1cafd60c14], modelo ST380817AS A função acima foi retirada deste tópico? http://forum.clubedelphi.net/viewtopic.php?t=43652 No final do ano passado, desenvolvi um pacote de classes, cuja a finalidade é extrair serial de disco, MAC de placa de rede e informações de versão de arquivo. O pacote se chama VDOUtils, mas ainda [color=red:1cafd60c14][b:1cafd60c14]não tem documentação e nem demo.[/b:1cafd60c14][/color:1cafd60c14] Quem estiver interessado em testar, pode baixá-lo deste endereço. É OpenSource e para Dephi 4 a 7: http://200.251.137.3/~insigne/pessoais/vinicius/VDOUtils.zip 124.348 bytes / md5: 78b181dac05e7db18a0de942eb37cbe3 Um exemplo (simples) de uso seria : 1. Coloque um componente TVDOHddSerial no form. 2. No OnClick de um TButton escreva:
ShowMessage(VDOHddSerial1.SerialNumber);
Observações: 1. Dúvidas, sugestões e afins sobre os componentes, email-me no endereço especificado nas units dos componentes. Mas, infelizmente, não posso garantir suporte rápido pois estou com problemas de tempo... 2. Testei diversos discos IDE, com suporte a S.M.A.R.T, nos Windows 95/98/98SE/ME/2000/XP. Não testei com NT 4 e 2003 Server. Não testei com discos SCSI ´alone´ e nem em arrays de discos SCSI formando RAID (comuns em servidores). Não testei em arrays de discos SATA com ou sem RAID. 3. Se funciona 100¬ em discos SATA ainda é duvidoso, mas, no meu caso e alguns poucos SATA que testei, funciona corretamente. Algumas (ou todas) as placas mãe com chipset Intel, interpretam as interfaces SATA como se fossem IDE e não sei exatamente qual é o resultado disso. O meu disco está utilizando ´Silicon Image SiI 3112 SATARaid Controller´ 4. Para comprovar que o serial foi extraído corretamente, deve utilizar outros softwares de analise de hardware, como o Everest, por exemplo -- http://www.lavalys.hu/products/download.php?pid=1&lang=en --. T+


Amigo, testei o componente VDOUtils e ta funcionando legal ... testei tb o software do link e ele achou o mesmo serial.

valew


Responder

Gostei + 0

08/09/2005

Xanatos

Usando o WMI para pegar o serial... vc vai usar a classe Win32_PhysicalMedia, e o campo éo SerialNumber ... mas acho que só funciona no Windows XP e 2003.


Responder

Gostei + 0

08/09/2005

Ipc$

Usando o WMI para pegar o serial... vc vai usar a classe Win32_PhysicalMedia, e o campo éo SerialNumber ... mas acho que só funciona no Windows XP e 2003.
Isso mesmo, depois foi que eu ví, mas com a Win32_DiskDrive dá para pegar o modelo do HD que já é alguma coisa juntando com a capacidade, setores e trilhas. No caso do XP, acredito que a Win32_PhysicalMedia deve funcionar sem problemas.


Responder

Gostei + 0

08/09/2005

Marco Salles

[b:1673f06249]Sera que ninguem esta me vendo aqui..l[/b:1673f06249].. :cry: :cry: :cry:
[quote:1673f06249]Citação: Para comprovar que o serial foi extraído corretamente, deve utilizar outros softwares de analise de hardware, como o Everest, por exemplo -- http://www.lavalys.hu/products/download.php?pid=1&lang=en --. Beleza , mas não estou conseguindo localizar no Everest nada que informe o numero do serial para que eu possa fazer esta comparação :cry: :cry: :cry:
[/quote:1673f06249]


Responder

Gostei + 0

08/09/2005

Armando.boza

[quote:5892f9f833=´Marco Salles´][b:5892f9f833]Sera que ninguem esta me vendo aqui..l[/b:5892f9f833].. :cry: :cry: :cry:
[quote:5892f9f833]Citação: Para comprovar que o serial foi extraído corretamente, deve utilizar outros softwares de analise de hardware, como o Everest, por exemplo -- http://www.lavalys.hu/products/download.php?pid=1&lang=en --. Beleza , mas não estou conseguindo localizar no Everest nada que informe o numero do serial para que eu possa fazer esta comparação :cry: :cry: :cry:
[/quote:5892f9f833][/quote:5892f9f833]

Vai em ARMAZENAMENTO > ATA > NÚMERO DE SÉRIE ....

resolvido seu problema?


Responder

Gostei + 0

08/09/2005

Vinicius2k

Marco,

Ao menos a versão que eu tenho do Everest exibe o número de série do disco, um exemplo da minha máquina aqui na empresa (Armazenamento -> ATA):
--------[ ATA ]--------------------------------------------------------------

  [ SAMSUNG SP0411N (S01JJ60X735104) ]

    Propriedades do dispositivo ATA:
      ID do modelo                                      SAMSUNG SP0411N
      Número de série                                   S01JJ60X735104


[color=red:48aa027156][b:48aa027156]Atenção:[/b:48aa027156][/color:48aa027156]
Se vcs observarem a classe VDOHddSerial irão observar que ele SEMPRE retorna um serial. A classe tenta extrair de duas formas diferentes o serial físico e se não conseguir extrai o serial do vulume C:
Para saber qual o tipo de serial ele conseguiu extrair, vcs devem ler a propriedade SerialType, que pode ser stNone, stFisical ou stLogical.

T+


Responder

Gostei + 0

08/09/2005

Marco Salles

Marco Salles escreveu:
Sera que ninguem esta me vendo aqui..l..



Vai em ARMAZENAMENTO > ATA > NÚMERO DE SÉRIE .... resolvido seu problema?


[b:54668a8a0d]Resolvidissimo[/b:54668a8a0d]

Marco, Ao menos a versão que eu tenho do Everest exibe o número de série do disco, um exemplo da minha máquina aqui na empresa (Armazenamento -> ATA):


Muito agradecido....


Responder

Gostei + 0

07/02/2006

Wagnermarrane

[quote:0dfa628bd2=´Marco Salles´]Marco Salles escreveu:
Sera que ninguem esta me vendo aqui..l..



Vai em ARMAZENAMENTO > ATA > NÚMERO DE SÉRIE .... resolvido seu problema?


[b:0dfa628bd2]Resolvidissimo[/b:0dfa628bd2]

Marco, Ao menos a versão que eu tenho do Everest exibe o número de série do disco, um exemplo da minha máquina aqui na empresa (Armazenamento -> ATA):


Muito agradecido....[/quote:0dfa628bd2]


Bom dia pessoal!!!!!

Estive testando esse fonte para retirar o serial do HD, em uma maquina windows XP rodou muito bem, porém em uma maquina 2003 tive problemas ele acusa seguinte erro

[b:0dfa628bd2]First chance exception at $77E649D3. Exception class EOSError with message ´System Error. Code: 2.
O sistema não pode encontrar o arquivo especificado´. Process Project1.exe (3692)[/b:0dfa628bd2]

na linha marcada abaixo

function GetIdeSN : String;
var
  iController, iDrive, maxController : Integer;
begin
  Result := ´´;
  maxController := 15;
  if Win32Platform<>VER_PLATFORM_WIN32_NT then maxController := 0;
  for iController := 0 to maxController do
  begin
    for iDrive := 0 to 4 do
    begin
      try
    ****** Result := GetIdeDiskSerialNumber(iController,iDrive);*****
        if Result<>´´ then Exit;
      except
        // ignore exceptions
      end;
    end;
  end;
end;



Responder

Gostei + 0

07/02/2006

Armando.boza

[quote:5bada4639f=´Marco Salles´]Marco Salles escreveu: [quote:5bada4639f]Sera que ninguem esta me vendo aqui..l..



Vai em ARMAZENAMENTO > ATA > NÚMERO DE SÉRIE .... resolvido seu problema?


[b:5bada4639f]Resolvidissimo[/b:5bada4639f]

Marco, Ao menos a versão que eu tenho do Everest exibe o número de série do disco, um exemplo da minha máquina aqui na empresa (Armazenamento -> ATA):


Muito agradecido....[/quote:5bada4639f]


Bom dia pessoal!!!!!

Estive testando esse fonte para retirar o serial do HD, em uma maquina windows XP rodou muito bem, porém em uma maquina 2003 tive problemas ele acusa seguinte erro

[b:5bada4639f]First chance exception at $77E649D3. Exception class EOSError with message ´System Error. Code: 2.
O sistema não pode encontrar o arquivo especificado´. Process Project1.exe (3692)[/b:5bada4639f]

na linha marcada abaixo

function GetIdeSN : String;
var
  iController, iDrive, maxController : Integer;
begin
  Result := ´´;
  maxController := 15;
  if Win32Platform<>VER_PLATFORM_WIN32_NT then maxController := 0;
  for iController := 0 to maxController do
  begin
    for iDrive := 0 to 4 do
    begin
      try
    ****** Result := GetIdeDiskSerialNumber(iController,iDrive);*****
        if Result<>´´ then Exit;
      except
        // ignore exceptions
      end;
    end;
  end;
end;
[/quote:5bada4639f]

Tenta os componetes VDO (VDOUtils e VDOPrint) do nosso amigo Vinicius, no VDOUtils tem um só pra retirar o serial do hd.


Responder

Gostei + 0

07/02/2006

Wagnermarrane

Tenta os componetes VDO (VDOUtils e VDOPrint) do nosso amigo Vinicius, no VDOUtils tem um só pra retirar o serial do hd.


Estou usando Delphi 2005 e ainda não fiz nenhuma instalação de componentes se puder me acompanha eu agradeceria e outra coisa esses componentes retiram o serial de fabrica do hd correto?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar