Número de série físico do HD... :: Solução :: !

Delphi

10/05/2004

Amigos,

Acredito, ter conseguido um código definitivo para leitura do número de série físico do HD... apenas, não tenho certeza se funcionará em todos os discos, pois pelo que pude perceber ele opera com comandos S.M.A.R.T e os discos mais antigos não suportam esta funcionalidade... é necessário verificar ainda se mesmo o disco suportando, se o desligamento dessa ´feature´ no setup da placa-mãe não afeta a leitura...
Quem se interessar em testar...
// Extracting IDE(ATA) disk serial number.

// (c) 2000-2003 Alex Konshin    
//               mailto:akonshin@earthlink.net
//               http://home.earthlink.net/~akonshin/index.htm
//
// 30 Jul 2000 created
// 22 Oct 2003 refactoring

unit IdeSN;

interface

//-------------------------------------------------------------
// Tries to extract the serial number from the first IDE disk that is found in the system.
// Returns an empty string if IDE disk is not found.
  function GetIdeSN : String;

//-------------------------------------------------------------
// Tries to extract the serial number from specified IDE disk.
//
// Parameters:
//   ControllerNumber - SCSI port number of the controller.
//   DriveNumber - Device index (0..4).
//
// Raises OSError exception in case of any error during this operation.
//
// Notes:
//  1. The parameter ControllerNumber is ignored on Windows 9x/ME platforms and should be 0.
//  2. This function CAN NOT extract SCSI disk serial number.
//
  function GetIdeDiskSerialNumber( ControllerNumber, DriveNumber : Integer ) : String;

//=============================================================
implementation

uses
  Windows,
  SysUtils; // only for Win32Platform, SysErrorMessage and class Exception

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

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

//-------------------------------------------------------------
// Tries to extract the serial number from specified IDE disk.
//
// Parameters:
//   ControllerNumber - SCSI port number of the controller.
//   DriveNumber - SCSI port number of the controller.
// Notes:
//  1. The parameter ControllerNumber is ignored on Windows 9x/ME platforms and should be 0.
//  2. This function CAN NOT extract SCSI disk serial number.
//
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;

end.


Exemplo de utilização :
procedure GetIDESerial;
var S: String;
begin
  S:= GetIdeSN;
  if S <> ´´ then edtSN.Text:= S;
end;


Peço que postem os resultados dos testes e em qual equipamento (HD e Sistema Operacional)... eu já testei com Windows 95R2 / 98 / 98SE / 2000 e só consegui extrair o serial de HDs >= 4GB...

Espero ter ajudado.
T+
Vinicius


Vinicius2k

Vinicius2k

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

10/05/2004

Só uma observação : desliguem o Debug ou rodem a aplicação de teste ´por fora´ do Delphi. Ele sempre e levanta uma exceção antes de extrair o serial e ainda não consegui identificar a razão...
T+


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Este topico js vem rodando ha tempos aqui no forum.....Surge uma esperança inovadora..Torcemos para que seje a palavra final no assunto]
Rodei e Beleza...Agradecemos a solidariedade de nosso amigo Vinicius.2K
por esta relevante contribuição...
Uso delphi 5.0 e Sistema Operacional :WINDOWS-XP

Só uma observação : desliguem o Debug ou rodem a aplicação de teste ´por fora´ do Delphi. Ele sempre e levanta uma exceção antes de extrair o serial e ainda não consegui identificar a razão...


[b:5ecbba1c2a]So uma observação[/b:5ecbba1c2a]: Isto não ocorreu...Não sei se é porque , eu criei um a aplicação e Depois criei uma unit onde eu [b:5ecbba1c2a]colei[/b:5ecbba1c2a] os métodos sugeridos, e depois no form Principal eu Chamei os Métodos da Unit [b:5ecbba1c2a]UIdeSN[/b:5ecbba1c2a]......O resultado é que [b:5ecbba1c2a]Não houve exceção [/b:5ecbba1c2a] :?: :?: :?:


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

Obrigado Marco, mas o mérito é todo de quem desenvolveu o código... eu só o encontrei... :D

Sobre a exceção, acredito que tenha alguma relação com as diretivas de compilação existentes no código e talvez com o conjunto Delphi + OS... o meu Delphi é o 7... mas ele só levanta a exceção com o debug ligado, no meu caso...

T+
Vinicius


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

:P :P Ao Longo desse tempo , eu sempre indico , este tópico, quando o assunto é leitura do número de série físico do HD.

[URL=http://www.imageshack.us][img:4217f5bf1c]http://img35.echo.cx/img35/808/imagemaplicativohd3pm.jpg[/img:4217f5bf1c][/URL]

Porém , gerei um executavel , e o Gravei no Disquete... Ao rodar o Aplicativo Via Disquete No Computador Do Cliente (Windows 98 Com HD >4.0G) eu não obtenho Numero Nenhum.. O Que sera que estou fazendo de errado :cry: :cry: :cry:


GOSTEI 0
Gandalf.nho

Gandalf.nho

10/05/2004

Talvez ele precise ser rodado a partir do HD para funcionar.


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Talvez ele precise ser rodado a partir do HD para funcionar.


:wink: É o que eu Tb pensei a principio.. Vou voltar la e depois eu Post


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

Existem adendos que precisam ser feitos a este tópico, que não foram mencionados originalmente, mas encontrei estas informações durante este tempo :

- O disco precisa ter suporte a S.M.A.R.T, mas ele não precisa estar habilitado no BIOS... basta que o suporte exista.

- Este código não é suportado Windows 95 (primeira versão). Só funciona em Windows 95 OSR2/98/98SE/Me/NT4/2000/XP.

- Windows 9x: SMARTVSD.VXD precisa estar instalado. É necessário copiá-lo da pasta C:\Windows\System para a pasta C:\Windows\System\IoSubsys e reiniciar a máquina.

:wink:

T+


GOSTEI 0
Cabelo

Cabelo

10/05/2004

E aí Vinicius..

blz?

Cara testei aqui e blz.. rodou legal..

Rodei num micro com HD de 40 GB e um com 8 GB e nos dois ele leu perfeitamente..


GOSTEI 0
Cabelo

Cabelo

10/05/2004

Cara.. deu um pequeno erro..

No meu micro tenho dois HD´s..

Quando tento ler o serial, trava o micro..

Estou no SO win98..

tem idéia do pq?


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

E ae Junior !

Nunca testei este código em máquinas com mais de um disco físico (apenas com mais de uma partição), por isso não sei o que pode ser.

Vou tentar testar isto também, mas como vc disse que é Win 9X, vc observou a necessidade do SMARTVSD.VXD na \system\iosubsys ?

T+


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

O disco precisa ter suporte a S.M.A.R.T, mas ele não precisa estar habilitado no BIOS... basta que o suporte exista.


Como saber isto :?: :?: :?: :?: :cry: :cry: :cry:

Cabelo:
Estou no SO win98..


Viniciu:
mas como vc disse que é Win 9X


Esta nun entendi :?: :?: :?:


GOSTEI 0
Christian_adriano

Christian_adriano

10/05/2004

Olá Vinicius,

Também tinha colocado algo parecido nesse tópico : [url]http://forum.devmedia.com.br/viewtopic.php?t=58960&highlight=scsisn&sid=5cd283bbe592f0cf221b136382f13541[/url]

Nesse post coloquei tb algo para pegar seriais de HD ´Scsi´ tb.


t+


Christian.


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Se alguem conseguir usar :

Do tópico
http://forum.devmedia.com.br/viewtopic.php?t=58960&highlight=scsisn&sid=5cd283bbe592f0cf221b136382f13541
[b:48160374a0]Ultima dica do Cristian....[/b:48160374a0]

Forma de Usar: function PegarSerialSCSI : String; begin Result := Trim(Resultado); end; Abraços, Christian.


Favor me comunicar...
[b:48160374a0]Não da para entender qual a função , que modifica o valor da variável Resultado [/b:48160374a0]:cry: :cry: :cry:

Desse modo , [b:48160374a0]PegarserialASCSI [/b:48160374a0]a gente so ta lendo o Valor Da VAriavel Resultado, que a principio e LIXO :?: :?: :?: :?:

:arrow: :arrow: Note que[b:48160374a0] Resultado [/b:48160374a0]não é um método , mas sim uma variável

Agora quanto a função [b:48160374a0]GetIdeSN[/b:48160374a0] Retornou o [b:48160374a0]mesmo valor [/b:48160374a0]que a função originau [b:48160374a0]GetIDESerial[/b:48160374a0] do [b:48160374a0]Vinicius[/b:48160374a0] :P :P :P :P :P Como era de se esperar :wink:


GOSTEI 0
Christian_adriano

Christian_adriano

10/05/2004

Olá Colega ´Marco Salles´, é o seguinte vc pode usar em vez do código :

procedure RetornarSerial; 
begin 
sDeviceName := ParamStr(1); 
if Trim(sDeviceName) = ´´ then 
begin 
Resultado := ´´; 
Exit; 
end; 
hDevice := GetDeviceHandle(sDeviceName); 
if hDevice=INVALID_HANDLE_VALUE then 
Resultado := ´´ //(´Error on GetDeviceHandle: ´ + SysErrorMessage(GetLastError)) 
else 
try 
sSerNum := ScsiHddSerialNumber(hDevice); 
if Trim(sSerNum) = ´´ then 
Resultado := ´´ //(´Error on DeviceIoControl: ´ + SysErrorMessage(GetLastError)) 
else 
Resultado := Trim(sSerNum); 
finally 
CloseHandle(hDevice); 
end; 
end; 


Usar esse para pegar seriais de HD ´Scsi´ :

function RetornarSerial : String; 
begin 
sDeviceName := ParamStr(1); 
if Trim(sDeviceName) = ´´ then 
begin 
result := ´´; 
Exit; 
end; 
hDevice := GetDeviceHandle(sDeviceName); 
if hDevice=INVALID_HANDLE_VALUE then 
Result := ´´ //(´Error on GetDeviceHandle: ´ + SysErrorMessage(GetLastError)) 
else 
try 
sSerNum := ScsiHddSerialNumber(hDevice); 
if Trim(sSerNum) = ´´ then 
Result := ´´ //(´Error on DeviceIoControl: ´ + SysErrorMessage(GetLastError)) 
else 
Result := Trim(sSerNum); 
finally 
CloseHandle(hDevice); 
end; 
end; 

´
É só vc alterar a forma de pegar o serial:
De:
[color=red:5f0c460cc4]procedure RetornarSerial;[/color:5f0c460cc4]
Para:
[color=red:5f0c460cc4]function RetornarSerial : String;[/color:5f0c460cc4]

implementei daquela forma conforme a minha necessidade.

t+

Christian.


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Obrigado amigo [b:b4c06b6808]christian_adriano[/b:b4c06b6808] , eu ja tentei esta forma anteriormente ....
I Mais , declarei a Função
type
TScsiPassThrough = record
Length : Word;
...........
.......... 
end;

Function RetornarSerial : String;

var
hDevice : THandle = 0;
sSerNum, sDeviceName, Resultado : String;


:arrow: Para ela ser visto em outro formulário

Mas ao chamar a Função em outra Unit

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=RetornarSerial;
end;

Não obtenho nada no edit1.text :cry: :cry: :cry: :cry:


GOSTEI 0
Dr. Interbase

Dr. Interbase

10/05/2004

Galera é super simples

procedure TFrmDesbloqueador.BitBtn1Click(Sender: TObject);
begin
IF (SERIALNUM(´C´)=´84809C5B´) or (SERIALNUM(´D´)=´84809C5B´) Then
Showmessage(´numero ok´);
Else
showmessage(´Numero do hd não confere´);
End;

Function SerialNum(FDrive:String) :String;
Var
Serial:DWord;
DirLen,Flags: DWord;
DLabel : Array[0..11] of Char;
begin
Try
GetVolumeInformation(PChar(FDrive+´:\´),dLabel,12,@Serial,DirLen,Flags,nil,0);
Result := IntToHex(Serial,8);
Except
Result :=´´;
end;
end;


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

[quote:1f8beb9819=´Marco Salles´]Não obtenho nada no edit1.text [/quote:1f8beb9819]
Mas seu disco é SCSI ?


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

Dr. Interbase,

Realmente utilizar a API GetVolumeInformation é muito mais simples, porém, é retornado o número de série do volume e não do disco.

O número de série de volume é alterado a cada formatação e também pode ser facilmente modificado por programas que realizam operações no disco.
Além disso é ´clonado´ juntamente com o clone de discos utilizados por muitas empresas como forma de backup.

T+


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Duas dúvidas amigo Vinicius:

O disco precisa ter suporte a S.M.A.R.T, mas ele não precisa estar habilitado no BIOS... basta que o suporte exista.


Como saber isto :cry: :cry: :cry: :cry:

Mas seu disco é SCSI ?


Como vou saber isto tb :oops: :oops: :oops:


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

Marco,

1. Geralmente, discos com tamanho superior a 2.1 GB já tem suporte à S.M.A.R.T, mas não dá para garantir isso até 4.3 GB. Sendo discos maiores (6.4 GB em diante) ou mais novos, com certeza terão o suporte. Esta tecnologia existe em todos os discos há cerca de 9 anos.

2. Discos SCSI são discos de alta performance utilizados mais comumente em servidores. A única forma de saber se um disco é SCSI é analisando a própria máquina, seja visualmente ou através de algum software.

Quando utilizar funções de extração de serial, faça de várias formas diferentes como contingência.
Por exemplo: caso a primeira função não retorne, passe para a segunda, se a segunda não retornar, passe para a terceira e assim por diante, até que chegue ao ponto em que vc precisa utilizar o serial do volume através da API GetVolumeInformation (que nunca falha), já que as demais tentativas de extração do serial não foram bem sucedidas.

T+


GOSTEI 0
Cabelo

Cabelo

10/05/2004

Vinicius..

Tem suporte sim.. S.M.A.R.T.

o problema está quando uso em um micro com dois HD´s, parece que a função se perde.. outro problema..

Não consigo debugar.. vc conseguiu?


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

Junior,

Eu ainda não consegui testar em máquinas com mais de um disco...
Sobre o debug, não consegui... até mencionei isto no post original e ainda não sei a causa do problema.

T+


GOSTEI 0
Cabelo

Cabelo

10/05/2004

Blz cara..

Vou tentar aqui e se conseguir dou um toque..

Valeu pela dica desta rotina.. é exatamente como deve funcionar..

Um abraço.


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Citação :Vinicius2k
Quando utilizar funções de extração de serial, faça de várias formas diferentes como contingência. Por exemplo: caso a primeira função não retorne, passe para a segunda, se a segunda não retornar, passe para a terceira e assim por diante, até que chegue ao ponto em que vc precisa utilizar o serial do volume através da API GetVolumeInformation (que nunca falha), já que as demais tentativas de extração do serial não foram bem sucedidas.


Aqui voce mencionou [color=darkred:73caa7b8a5][b:73caa7b8a5]quatro formas [/b:73caa7b8a5][/color:73caa7b8a5], sendo tres de extração do numero Serial Fisico e Uma Forma de Extração de Volume.

Mas quais seriam estas tres formas de extração de Serial :?: :?:
:wink: , se para conseguir [b:73caa7b8a5]uma função [/b:73caa7b8a5], foi uma luta :lol: (Ate voce aparecer com esta dica)
Mesmo que eu considere [b:73caa7b8a5]e Devo Considerar a Função [/b:73caa7b8a5]do Cristian so Tem Duas Formas :arrow: :arrow: Voce por acaso conhece uma terceira :?: :?:


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

:D

Foi só uma ilustração...
Não precisa necessariamente existir 3 formas... só quis dizer que vc não deve ficar preso à apenas uma.

T+


GOSTEI 0
Edilcimar

Edilcimar

10/05/2004

você já viu este exemplo?
http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=214&mode=thread&order=0&thold=0


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Sera que esta Função que o[b:570a6d987c] edicilmar [/b:570a6d987c]apontou
:?: :?: [b:570a6d987c]GetIdeDiskSerialNumber[/b:570a6d987c] não é a[b:570a6d987c][color=darkred:570a6d987c] mesma coisa [/color:570a6d987c][/b:570a6d987c]que o Vinicius Indicou em sua promeira apresentação , Neste Tópico...


GOSTEI 0
Edilcimar

Edilcimar

10/05/2004

não sei, não li a do active delphi, só vi que o artigo estava lá, logo de cara e indiquei


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

[quote:2419127151=´Marco Salles´]Sera que esta Função que o[b:2419127151] edicilmar [/b:2419127151]apontou
[b:2419127151]GetIdeDiskSerialNumber[/b:2419127151] não é a[b:2419127151][color=darkred:2419127151] mesma coisa [/color:2419127151][/b:2419127151]que o Vinicius Indicou em sua promeira apresentação , Neste Tópico...[/quote:2419127151]
Sim. Com algumas modificações, que por sinal fizeram o código apresentado lá não funcionar muito bem, segundo o próprio colega que postou.
Não sei porque mas a função retorna a string com 12 espaços antes do serial, então usei a função Trim(), para eliminar os espaços


Algum dos colegas já testou o código que propus em discos SATA ? Eu ainda não, mas tenho a impressão que não irá funcionar...

T+


GOSTEI 0
Edilcimar

Edilcimar

10/05/2004

o meu é sata, vou copiar e rodar para testar


GOSTEI 0
Edilcimar

Edilcimar

10/05/2004

não funcionou


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

Suspeitei desde o princípio... :?

Bem que eu já venho buscando uma outra solução baseada em WMI, mas estou ´apanhando´...

Obrigado pelo teste Edilcimar ! :wink:


GOSTEI 0
Alves

Alves

10/05/2004

Olá Pessoal do forum...

Tava testanto essa função e percebi que ela nao funcionaou no Windows ME 4.90.300 Full. Simplesmente me retorna em branco. Ja no Windows ME atualizado em cima do 98se funciona legal... é isso ai

abraço a todos


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Citação do Alves:
Tava testanto essa função e percebi que ela nao funcionaou no Windows ME 4.90.300 Full.


Mas qual função .. Foram Várias aqui apresentadas

Vinicius2k, cristian, Edicilmar ...

Voce testou todas :?: :?: :?:


GOSTEI 0
Alves

Alves

10/05/2004

Quanto as Outras não testei, apenas a q foi apresentado pelo Vinicios2K, a q pega o serial de fabrica. OK.


[quote:4115f94f97=´Marco Salles´]Citação do Alves:
Tava testanto essa função e percebi que ela nao funcionaou no Windows ME 4.90.300 Full.


Mas qual função .. Foram Várias aqui apresentadas

Vinicius2k, cristian, Edicilmar ...

Voce testou todas :?: :?: :?:[/quote:4115f94f97]


GOSTEI 0
Marco Salles

Marco Salles

10/05/2004

Citação de Alves:
Quanto as Outras não testei, apenas a q foi apresentado pelo Vinicios2K, a q pega o serial de fabrica. OK.


Citacção de Vinicius2.k
Quando utilizar funções de extração de serial, faça de várias formas diferentes como contingência. Por exemplo: caso a primeira função não retorne, passe para a segunda, se a segunda não retornar, passe para a terceira e assim por diante, até que chegue.....


Então alves , tente com as outras Funções , para ver se a gente consegue chega nun entedimento , pois afinal esta questão é antiga e de dificil solução...Precisamos de um maior número de OPiniões e testes

Citação de Vinicius:
Peço que postem os resultados dos testes e em qual equipamento (HD e Sistema Operacional)... eu já testei com Windows 95R2 / 98 / 98SE / 2000 e só consegui extrair o serial de HDs >= 4GB...



GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

- A função que postei eu uso sem problemas.
- Das duas do Christian, a destinada a discos IDE é igual a que postei, mas a destinada a SCSI eu não testei (não é fácil encontrar discos SCSI ´de bobeira´ para testar).
- A indicada pelo Edilcimar é igual à que postei, porém um pouco modificada e *acho* que devido à essa modificação, tem um bug no retorno.

Até hoje, o único código ´puro´ capaz de extrair o serial do disco IDE que encontrei foi o que postei inicialmente.

Existe um código com o auxílio de uma DLL que testei e funciona 100¬ (não testei com SCSI). A DLL e alguns exemplos de código para utilizá-la em várias linguagens podem ser baixados em: http://www.caishen168.com/DiskSerial/DiskSerial/DiskSerial.zip

Esta DLL utiliza um mecanismo de leitura do disco que *deve* ser igual ao que postei inicialmente, porém ela embute em seus resources o SMARTVSD.VXD dispensando o procedimento de cópia necessário no Win9X.

Tava testanto essa função e percebi que ela nao funcionaou no Windows ME 4.90.300 Full

Eu não testei o código em Windows ME, mas *talvez* ele necessite do mesmo procedimento de cópia do SMARTVSD.VXD requerido pelo Win9X.

T+


GOSTEI 0
Alves

Alves

10/05/2004

Vou Testar essa tambem. A outra função funcionou em todas as maquinas menos a tem o ´Wim_Me Full´


- A função que postei eu uso sem problemas. - Das duas do Christian, a destinada a discos IDE é igual a que postei, mas a destinada a SCSI eu não testei (não é fácil encontrar discos SCSI ´de bobeira´ para testar). - A indicada pelo Edilcimar é igual à que postei, porém um pouco modificada e *acho* que devido à essa modificação, tem um bug no retorno. Até hoje, o único código ´puro´ capaz de extrair o serial do disco IDE que encontrei foi o que postei inicialmente. Existe um código com o auxílio de uma DLL que testei e funciona 100¬ (não testei com SCSI). A DLL e alguns exemplos de código para utilizá-la em várias linguagens podem ser baixados em: http://www.caishen168.com/DiskSerial/DiskSerial/DiskSerial.zip Esta DLL utiliza um mecanismo de leitura do disco que *deve* ser igual ao que postei inicialmente, porém ela embute em seus resources o SMARTVSD.VXD dispensando o procedimento de cópia necessário no Win9X. [quote:f6da75f244=´Alves´]Tava testanto essa função e percebi que ela nao funcionaou no Windows ME 4.90.300 Full

Eu não testei o código em Windows ME, mas *talvez* ele necessite do mesmo procedimento de cópia do SMARTVSD.VXD requerido pelo Win9X.

T+[/quote:f6da75f244]


GOSTEI 0
Vinicius2k

Vinicius2k

10/05/2004

Aos colegas que participaram deste tópico, postei novas informações/recursos neste tópico:
http://forum.clubedelphi.net/viewtopic.php?p=220519#220519

Quanto mais testes, melhor para todos. ;)


GOSTEI 0
N_informatica

N_informatica

10/05/2004

Eu utilizei estas funções por muito tempo e sempre funcionou e se mostrou muito segura porém agora estou com problemas para pegar o serial de HD´s SATA.

Se alguem tiver alguma coisa ai agradeço.


GOSTEI 0
N_informatica

N_informatica

10/05/2004

Meus caros utilizei esta função por muito tempo só que hoje não funciona mais não sei se em virtude das atualizações do WinXP ou qual o Motivo.

Perguto então tem algem utilizando esse código com sucesso?

O que preciso alterar para funcionar com WinXP sp3 e em HD SATA?

Obrigado.


GOSTEI 0
Paullsoftware

Paullsoftware

10/05/2004

Meus caros utilizei esta função por muito tempo só que hoje não funciona mais não sei se em virtude das atualizações do WinXP ou qual o Motivo. Perguto então tem algem utilizando esse código com sucesso? O que preciso alterar para funcionar com WinXP sp3 e em HD SATA? Obrigado.
não tem nada haver com windows, é seu hd sata... quando eu usava esse unit, ela dava pau quando tentava pegar o serial dos hd´s satas...

eu passei a usar o componente mxPortect


GOSTEI 0
Missterpe

Missterpe

10/05/2004

:lol: GANHE DINHEIRO FÁCIL, RÁPIDO E HONESTAMENTE!!! VOCÊ JÁ IMAGINOU GANHAR R$ 25.000,00 EM MENOS DE 4 SEMANAS?? ACHA IMPOSSÍVEL?? ENTÃO LEIA ESTE ARTIGO E COMEMORE!!!

Oi! Eu tenho ótimas notícias que devem demorar uns três minutos para ler. Você alguma vez pensou ´Como eu posso faturar alto em pouco tempo???´, ou esteve devendo muita grana, pronto a realizar qualquer coisa para conseguir pagar suas contas? Então, leia este texto realmente interessante, um verdadeiro achado . Eu estava lendo umas mensagens na rede quando eu vi um artigo que começava dizendo CONSIGA GRANA FÁCIL!! Eu pensei... ´Aqui na Internet?? Que tipo de esquema de grana fácil poderia haver na Internet? Eu tenho que ver´. O artigo descrevia um modo que dizia MANDE DOIS REAIS PARA APENAS SEIS PESSOAS E FAÇA R$ 25.000 EM DINHEIRO VIVO EM APENAS 4 SEMANAS! Bem, quanto mais eu pensava nisso, mais eu ficava curiosa. Por quê? Por causa do modo de funcionamento desse sistema e porque SÓ IRIA ME CUSTAR DOZE REAIS E ISSO SERIA TUDO A PAGAR... PRA SEMPRE!!! Tudo bem, os R$ 25.000 em grana poderiam ser uma grana dificílima de alcançar, mas eram possíveis. Pode parecer mais uma daquelas falsas notícias que você vê por aí, mas, por favor, LEIA ESTE TEXTO COM ATENÇÃO para entender é muito fácil, simples e o melhor... Funciona!!! REALMENTE VALE A PENA!!! COMPROVADO PELA REVISTA EXAME... ISTO PODE MUDAR SUA VIDA!!! Você deve seguir as instruções e mandar este artigo para todos os lugares que você puder e imaginar! O quanto você mandar vai determinar a quantidade de dinheiro que VOCÊ irá GANHAR!! É simplesmente m
Depoimento: ´Ora, é só uma brincadeira: eu dou 2 reais para 6 pessoas e mando uns 100 E-mails só para ver no que vai dar´ pensei comigo quando resolvi entrar. Foi a brincadeira mais lucrativa que eu participei (tomei um banho de Shopping com o dinheiro que ganhei). Ana Paula Resende - Volta Redonda - Rio de Janeiro ´Bem eu já conhecia este programa por cartas, o investimento era maior (torno de 200,00 R$, cartas envelopes e xerox), mesmo assim mandei, tive um retorno modesto, torno de 2000,00 R$, esse de E-mail, lógico que vou tentar.´ Anderson - Anápolis - Goiás

**************LISTA DOS NOMES*****************


01- J.M.R.C. BANCO BRASIL AGÊNCIA 2360-4 CONT. POUPANÇA OURO 9693-8 VAR. 01 DEMAISJ@hotmail.com
02- Marcus V. S. Correa BANCO BRASIL AGÊNCIA 4592-6 CC: 7636-8 mvscorrea83@hotmail.com
03- Marcelo D. Brandão BANCO SANTANDER AGÊNCIA 2175 CC: 01-021985-3 olecramxp@hotmail.com´
04- CIBELI CASTRO DE FREITAS - Banco do Brasil, Ag. 0045-0, Poupança 31.830-2, Variação 01,cibelifreitas@hotmail.com
05- Mirian F. Draghi Lobo - Banco do Brasil - ag. 0427-8 conta poupança 141517-4 - variação 1
mdraghi40@hotmail.com
06-C.M.M.BANCO DO BRASIL AGÊNCIA 0363-8 CONTA POUPANÇA
13933-5 missterpe@gmail.com


´MUITO OBRIGADO POR LER ESTE TEXTO E ESPERO QUE PARTICIPE´
OBS: Ver Parecer Jurídico
Art. 2º, IX da Lei nº 1.521/51.
1) CRIME CONTRA A ECONOMIA POPULAR -´Pirâmide da fortuna´ - Necessidade da ciência da fraude do jogo - Inconfiguração - Inteligência: art. 2º, IX da Lei nº 1.521/51 109 - O simples envolvimento dos acusados com a chamada ´pirâmide da fortuna´ não se mostra apto à caracterização do crime contra a economia popular capitulado no art. 2º, IX da Lei nº 1.521/51, sendo necessário que os agentes tenham ciência da fraude do jogo, pois, para que alguém seja apenado por crimes contra a economia popular é preciso que o ato lhe possa ser imputado por dolo ou culpa e não somente por conexão física entre a ação ou omissão e o resultado.
(Recurso de Ofício nº 627.241/1, Julgado em 17/10/1. 990, 6ª Câmara, Relator: - Rubens Gonçalves, RJDTACRIM 9/215 no site: http://www.tacrim.sp.gov.br/jurisprudencia...l/volume9.html) Aconselho que todos visitem esse site e confiram. É necessário, como diz acima, que haja ´fraude no jogo´, para haver crime. Se todo o esclarecimento de probabilidades está claro, como em seu e-mail, não há fraude, portanto, não há crime.
2) Vejamos se poderia ser estelionato.
Diz o Código Penal, Art. 171:
´Obter, para si ou para outrem, vantagem ilícita, em prejuízo alheio, induzindo ou mantendo alguém em erro, mediante artifício, ardil, ou qualquer outro meio fraudulento´ - Não há muito que se dizer aqui. Onde está o ´meio fraudulento´ de seu e-mail? Não o vejo, pois tudo está explicado claramente. Onde está a ilicitude da vantagem? (visto que é uma cooperação acumulativa) Não a vejo. Onde está o prejuízo alheio? Não há, pois foi explicado que quem enviar poucos e-mails não terá retorno, e só poderá culpar a seu próprio desleixo. Nenhum dos elementos normativos, objetivos ou subjetivos do estelionato se enquadra em seu e-mail. Logo, não é estelionato.
3) Vejamos se seria ´enriquecimento sem causa´.
- Todo ganho tem de ter uma causa, se não, a lei veda. No entanto, existe o instituto da ´doação´, que permite que cada um doe os R$ 12,00 de sua livre vontade, sem ser coagido a nada. Seria uma ´taxa´ para participar do programa de cooperação. Eis a causa. Também, para que uma pessoa ganhe muito dinheiro, os demais também estarão ganhando, já que os depósitos de 12 reais são feitos


GOSTEI 0
Missterpe

Missterpe

10/05/2004

[removido pelo editor]
GOSTEI 0
Carlosrm

Carlosrm

10/05/2004

Prezados colegas:

Aproveitando a idéia genial (simples e eficaz) da colega missterpe (pirâmide), gastei os últimos 15 minutos para desenvolver um programa que envia e-mails para todo e qualquer computador do mundo, estando logado na rede ou não, funcionando ou quebrado, em qualquer país e sistema de governo, com qualquer tipo de sistema de segurança.

No conteúdo do e-mail é reproduzido o conteúdo do citado e-mail. Por questões de segurança, a conta bancária aonde serão depositados os milionários valores deverá ser preenchida manualmente por você. A tela do sistema é super simples e muito fácil de usar: se você é capaz de entender esse texto, também é capaz de dominar todos os segredos deste programa que vai fazer você a pessoa mais rica e feliz do mundo!

Tem apenas um campo para informar em qual conta bancária quer receber a fortuna e apenas dois botões ([COMECE A GANHAR DINHEIRO] e [CHEGA DE GANHAR DINHEIRO}). Dica: escolha um banco que tenha cofres grandes.

E mais, enviando um e-mail agora, eu te envio a conta aonde você deve fazer o depósito (nas Ilhas Caiman, pois é lá que mora minha querida avozinha) e o programa que vai fazer sua independência financeira de uma vez por todas!!! Por apenas R$10,00 (DEZ REAIS) você pode ser a pessoa mais rica do mundo!!! Não espere mais: envie agora mesmo o seu pedido e você ainda recebe inteiramente grátis um folheto com as melhores opções para gastar dinheiro no mundo todo!!!

Enviando seu e-mail agora eu te explico (mas não ensino) como o meu infalível sistema acessa, traduz e envia e-mail para todas as contas telefônicas do mundo, todos os endereços cadastrados nas prefeituras e órgãos equivalentes e outros cadastros que contenham endereços não contemplados anteriormente. Importante, até quem não tem computador recebe e-mail, pois este inédito sistema transforma os e-mails em correspondência comum, quando o e-mail não é entregue.

LEIA COM ATENÇÃO: Nos casos em que a entrega é feita por corresponência, pode haver demora de até 2 dias, dependendo do local.

Invista seus últimos R$10,00 e daí para a frente seja apenas um feliz gastador! Trabalhe pela última vez na sua vida!!!

DICA FINAL: ESPERE RECEBER O CD (ou disquete, se preferir, ou a autorização e endereço para fazer o download) ANTES DE SE DESPEDIR DO SEU CHEFE...! Dependendo da sua localidade (se não tiver um computador próprio, pode atrasar um ou dois dias...). NÃO CONTE PARA NINGUÉM. SE APENAS VOCÊ USAR O SISTEMA, TODAS AS PESSOAS DO MUNDO VÃO RETORNAR PARA VOCÊ!!!!!!!!!!!!

carlosrm (vinde a mim os inocentes...)
(Peço desculpas a todos, por desrespeitar as regras deste Fórum. Se os Moderadores me penalizarem, compreenderei perfeitamente).


GOSTEI 0
POSTAR