VE ESTA OUTRA UNIT


unit IdeSN; 

interface 

function GetIdeSN : String; 

  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} 

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; 
    bSectorCountReg  : Byte; 
    bSectorNumberReg : Byte; 
    bCylLowReg       : Byte; 
    bCylHighReg      : Byte; 
    bDriveHeadReg    : Byte; 
    bCommandReg      : Byte; 
    bReserved        : Byte; 
  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; 
  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 
      Str(ControllerNumber,s); 
        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 
      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 
        // Sem tratamento de Exceções.
      end; 
    end; 
  end; 
end; 

end.




ADRIANO

MICRO CENTER
  ----- Original Message ----- 
  From: Vinicius Ribeiro 
  To: delphi-br@yahoogrupos.com.br 
  Sent: Saturday, July 02, 2005 10:32 AM
  Subject: Re: RES: RES: [delphi-br] serial do hd


  Adriano,

  Seria o numero de série FISICO do HD. Essa funcao pega o numer de serie 
  LOGICO, correto?

  [ ]'s

  Vinicius Ribeiro

  Adriano (Micro Center) escreveu:

  > Detectando o Numero Serial do HD
  > 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;
  >
  > Adriano
  > Micro Center..........
  >   ----- Original Message -----
  >   From: Vinicius Ribeiro
  >   To: delphi-br@yahoogrupos.com.br
  >   Sent: Saturday, July 02, 2005 9:35 AM
  >   Subject: Re: RES: RES: [delphi-br] serial do hd
  >
  >
  >   Wilson,
  >
  >   Eu tenho essa funcao mas la onde trabalho. To em casa agora e soh
  >   trabalho na segunda. Porem, fiz testes com essa funcao em 20 
  > maquinas la
  >   da empresa. Essa funcao funciona bem porem teve alguns HDs que retornou
  >   VAZIO. Ai vi la no HD se tinha numero de serie impresso no rotulo e
  >   tinha. Ou seja a funcao nao retorna de todos, nao me pergunte o porque.
  >
  >   Se alguem aqui quiser posso disponibiliza-la pra lista, mas soh na
  >   segunda. Inclusive eu peguei de alguem q mandou pra lista aqui mesmo.
  >
  >   Stock, vc testou essa funcao em varios micros com marcas de HD
  >   diferente? Retornou em todas? Se sim poderia disponibiliza-la para a 
  > lista?
  >
  >   Abraco!
  >
  >   Vinicius Ribeiro
  >
  >   Wilson Valdevite escreveu:
  >
  >   > Desculpe a minha curiosidade pois isso tbem me interessa, mas por 
  > que não
  >   > mandar para a lista?
  >   >
  >   > Wilson
  >   > ----- Original Message -----
  >   > From: "Stock" <[EMAIL PROTECTED]>
  >   > To: <delphi-br@yahoogrupos.com.br>
  >   > Sent: Friday, July 01, 2005 5:15 PM
  >   > Subject: Res: Re: RES: RES: [delphi-br] serial do hd
  >   >
  >   >
  >   > Esta função pega o serial do volume, se o volume for clonado, sua
  >   > aplicação vai rodar em outro normalmente...
  >   >
  >   > use a que pega o serial fisico do disco...
  >   >
  >   > me contate em pvt, eu te mando a função com exemplo
  >   >
  >   >
  >   > [EMAIL PROTECTED]
  >   > 600 modelos de sites profissionais - Imperdivel
  >   > http://www.kitsites.com/index.php?ref=50
  >   >
  >   > -------Mensagem original-------
  >   >
  >   > De: Leandro
  >   > Data: 07/01/05 16:55:18
  >   > Para: delphi-br@yahoogrupos.com.br
  >   > Assunto: Re: RES: RES: [delphi-br] serial do hd
  >   >
  >   > uso essa danada:
  >   >
  >   > function TCritica.PegaSerieHD: String;
  >   > var
  >   >   SerialNum : Dword;
  >   >   a, b      : dword;
  >   >   Buffer    : array [0..255] of char;
  >   > begin
  >   >   if
  >   > GetVolumeInformation('c:\',buffer,sizeof(buffer),@serialnum,a,b,nil,0)
  >   > then
  >   >      Result := inttohex(serialnum,8)
  >   >   else
  >   >      Result := '';
  >   > end;
  >   >
  >   > Att,
  >   >
  >   > Leandro
  >   >
  >   > ----- Original Message -----
  >   > From: "aderson rezende" <[EMAIL PROTECTED]>
  >   > To: <delphi-br@yahoogrupos.com.br>
  >   > Sent: Friday, July 01, 2005 4:30 PM
  >   > Subject: Re: RES: RES: [delphi-br] serial do hd
  >   >
  >   >
  >   > obrigado
  >   >
  >   > continuo precisando da dica de como fazer isso como pegar tal numero
  >   >
  >   >
  >   >
  >   > Walter Alves Chagas Junior <[EMAIL PROTECTED]> escreveu:
  >   > Então não pegue o serial do voluma do HD, pegue o serial da 
  > controladora
  >   >
  >   >
  >   >
  >   >
  >   > []s
  >   >
  >   > Walter Alves Chagas Junior
  >   > Projeto e desenvolvimento
  >   > Telemont Engenharia de telecomunicações
  >   > Belo Horizonte - MG - Brazil
  >   > [EMAIL PROTECTED]
  >   > Fone: (31) 3389-8215 Fax: (31) 3389-8200
  >   >
  >   >
  >   > > -----Mensagem original-----
  >   > > De: aderson rezende [mailto:[EMAIL PROTECTED]
  >   > > Enviada em: sexta-feira, 1 de julho de 2005 15:01
  >   > > Para: delphi-br@yahoogrupos.com.br
  >   > > Assunto: Re: RES: [delphi-br] serial do hd
  >   > >
  >   > >
  >   > > quase isso Walter   a ideia  é colocar um tempo de validade
  >   > > para locação da aplicação e um dos parametros pensei no serial do HD
  >   > >
  >   > >
  >   > >
  >   > >
  >   > >
  >   > > Walter Alves Chagas Junior <[EMAIL PROTECTED]> escreveu:
  >   > > Desculpe intrometer no assunto amigo, mas você tá querendo fazer 
  > algum
  >   > > mecanismo de proteção contra cópia não autorizada?
  >   > >
  >   > >
  >   > >
  >   > > []s
  >   > >
  >   > > Walter Alves Chagas Junior
  >   > > Projeto e desenvolvimento
  >   > > Telemont Engenharia de telecomunicações
  >   > > Belo Horizonte - MG - Brazil
  >   > > [EMAIL PROTECTED]
  >   > > Fone: (31) 3389-8215 Fax: (31) 3389-8200
  >   > >
  >   > >
  >   > > > -----Mensagem original-----
  >   > > > De: aderson rezende [mailto:[EMAIL PROTECTED]
  >   > > > Enviada em: sexta-feira, 1 de julho de 2005 10:23
  >   > > > Para: delphi-br@yahoogrupos.com.br
  >   > > > Assunto: [delphi-br] serial do hd
  >   > > >
  >   > > >
  >   > > > preciso pegar o serial do HD
  >   > > > usei essa função e cada hora vem um valor diferente  ou
  >   > > > melhor  sempre da dois valores 1 por vez
  >   > > >
  >   > > >
  >   > > > Function SerialNum(FDrive:String)
  >   > > > :String;VarSerial:DWord;DirLen,Flags: DWord;DLabel :
  >   > > > Array[0..11] of Char;beginTry
  >   > > > GetVolumeInformation(PChar(FDrive+':\'),dLabel,12,@Serial,DirL
  >   > > > en,Flags,nil,0);Result := IntToHex(Serial,8); Except Result
  >   > > > :='';end;end;  como faço para retornar o resultado dessa
  >   > > > função???pode ser esse o erro
  >   > > >
  >   > > >
  >   > > >
  >   > > >
  >   > > >
  >
  >
  >
  >        
  >        
  >              
  >   _______________________________________________________
  >   Yahoo! Acesso Grátis - Internet rápida e grátis.
  >   Instale o discador agora! http://br.acesso.yahoo.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] ou [EMAIL PROTECTED]
  >
  >
  >
  >
  > 
------------------------------------------------------------------------------
  >   Links do Yahoo! Grupos
  >
  >     a.. Para visitar o site do seu grupo na web, acesse:
  >     http://br.groups.yahoo.com/group/delphi-br/
  >      
  >     b.. Para sair deste grupo, envie um e-mail para:
  >     [EMAIL PROTECTED]
  >      
  >     c.. O uso que você faz do Yahoo! Grupos está sujeito aos Termos do 
  > Serviço do Yahoo!.
  >
  >
  >
  > [As partes desta mensagem que não continham texto foram removidas]
  >
  >
  >
  > -- 
  > <<<<< 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] ou [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]
  >       <mailto:[EMAIL PROTECTED]>
  >        
  >     * O uso que você faz do Yahoo! Grupos está sujeito aos Termos do
  >       Serviço do Yahoo! <http://br.yahoo.com/info/utos.html>.
  >
  >


        
        
              
  _______________________________________________________ 
  Yahoo! Acesso Grátis - Internet rápida e grátis. 
  Instale o discador agora! http://br.acesso.yahoo.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] ou [EMAIL PROTECTED]




------------------------------------------------------------------------------
  Links do Yahoo! Grupos

    a.. Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/
      
    b.. Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]
      
    c.. O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço 
do Yahoo!. 



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



-- 
<<<<< 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] ou [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