Em 27/1/2010 18:29, Iran Lima escreveu:
> Se alguém tiver uma função que retorne o serial físico do HD ou da 
> BIOS , que funcione no D2010 e puder me passar ficarei grato.[
>
> Iran

Essa [1] eu testei até o Delphi 2007 e funciona apenas com HDs IDE. Mas 
abandonei esta idéia a partir do momento em q a maioria dos clientes 
começou a usar HDs SATA. Passei a usar a CPUID, que não varia, mesmo que 
o cliente troque o HD. Pra isso uso essa função [2].

[1]--------------------------------------------------------------------------------------------------
Function GetIdeSerialNumber:String;
const
   IDENTIFY_BUFFER_SIZE = 512;
type
   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;
   TSendCmdInParams = packed record
     // Buffer size in bytes
     cBufferSize  : DWORD;
     // Structure with drive register values.
     irDriveRegs  : TIDERegs;
     // Physical drive number to send command to (0,1,2,3).
     bDriveNumber : BYTE;
     bReserved    : Array[0..2] of Byte;
     dwReserved   : Array[0..3] of DWORD;
     bBuffer      : Array[0..0] of Byte;  // Input buffer.
   end;
   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    : DWORD;
     wMultSectorStuff           : Word;
     ulTotalAddressableSectors  : DWORD;
     wSingleWordDMA             : Word;
     wMultiWordDMA              : Word;
     bReserved                  : Array[0..127] of BYTE;
   end;
   PIdSector = ^TIdSector;
   TDriverStatus = packed record
     // Error code from driver, or 0 if no error.
     bDriverError : Byte;
     // Contents of IDE Error register. Only valid when bDriverError is 
SMART_IDE_ERROR.
     bIDEStatus   : Byte;
     bReserved    : Array[0..1] of Byte;
     dwReserved   : Array[0..1] of DWORD;
   end;
   TSendCmdOutParams = packed record
     // Size of bBuffer in bytes
     cBufferSize  : DWORD;
     // Driver status structure.
     DriverStatus : TDriverStatus;
     // Buffer of arbitrary length in which to store the data read from 
the drive.
     bBuffer      : Array[0..0] of BYTE;
   end;

   var
     hDevice : THandle;
     cbBytesReturned : DWORD;
     ptr : PChar;
     SCIP : TSendCmdInParams;
     aIdOutCmd : Array 
[0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte;
     IdOutCmd  : TSendCmdOutParams absolute aIdOutCmd;

   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 := ''; // return empty String on error
   If SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then // Windows NT, 
Windows 2000
   begin
     // warning! change name for other drives: ex.: second drive 
'\\.\PhysicalDrive1\'
     hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or 
GENERIC_WRITE,
       FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
   end
   Else // Version Windows 95 OSR2, Windows 98
     hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
   If hDevice=INVALID_HANDLE_VALUE Then Exit;
   Try
     FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0);
     FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0);
     cbBytesReturned := 0;
     // Set up data structures for IDENTIFY command.
     With SCIP Do
     Begin
       cBufferSize  := IDENTIFY_BUFFER_SIZE;
//      bDriveNumber := 0;
       With irDriveRegs Do
       Begin
         bSectorCountReg  := 1;
         bSectorNumberReg := 1;
//      if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
//      else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
         bDriveHeadReg    := $A0;
         bCommandReg      := $EC;
       end;
     end;
     If not DeviceIoControl( hDevice, $0007c088, @SCIP, 
SizeOf(TSendCmdInParams) - 1,
       @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) Then Exit;
   Finally
     CloseHandle(hDevice);
   end;
   With PIdSector(@IdOutCmd.bBuffer)^ Do
   Begin
     ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) );
     (PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0;
     Result := PChar(@sSerialNumber);
   end;
end;
[/1]--------------------------------------------------------------------------------------------------

[2]--------------------------------------------------------------------------------------------------
function GetCPUID: String;
var
   A, B, C, D: LongWord;
begin
    try
     asm
       mov eax,1 // eax registeri cpuid komutunun parametresidir
       db $0F, $A2 // cpuid komutu
       mov a,EAX
       mov b,EBX
       mov c,ECX
       mov d,EDX
     end;
     Result := IntToHex(A, 8) + '-' + IntToHex(B, 8) + '-' + IntToHex(C, 
8) + '-' + IntToHex(D, 8);
    Except
     Result := 'ERRO!'; //'0000-D342-F921-M068';
    end;
end;
[/2]--------------------------------------------------------------------------------------------------

[]'s

------------

---------------------------------------
Att.:
Willian Jhonnes L. dos Santos
Analista/Desenvolvedor Object/Free Pascal
willianjhon...@yahoo.com.br <mailto:willianjhonnes%40yahoo.com.br>
---------------------------------------------------
Seja livre. Use Linux.
Grupo de Usuários GNU/Linux de São José dos Pinhais
Linux user number 449753
---------------------------------------------------
Powered by Slackware Linux 12.2
Kernel 2.6.27.8-i686-core2
---------------------------------------------------




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

Responder a