Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-05-2012
Avatar de darkbits
darkbits darkbits is offline
Miembro
 
Registrado: may 2006
Posts: 280
Poder: 18
darkbits Va por buen camino
en win7 no funciona esta funcion pa sacar ID unico del disco duro

un saludo al Club
tengo eta dificulta
esta es una de las mejores funciones que encontre para sacar el ID unico del disco duro y funciona perfectamente en winXP pero cuando lo ejecuto en win7 no me sale nada.. no probe en win vista

les facilito el codigo por ahi a que hacer una modificacion para que funcione en todos los windows

o si tiene alguna otra funcion mucho mas completo y que funcione en todos los win les agradesco.

Código Delphi [-]
/////////////////////////////////////////////////
// Get first IDE harddisk serial number 
function GetIdeSerialNumber : SerialNumber; 
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;



aqui llamo de cualquier edit o label

Código Delphi [-]
///////////////////
llamar a 
label1.Caption := GetIdeSerialNumber;
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mi programa no funciona en Win7 64 Paulao Varios 7 13-03-2012 13:34:21
¿Función para determinar la capacidad del disco duro? Roilo API de Windows 8 30-12-2008 19:07:30
Disco Duro Externo Fenareth Varios 8 25-07-2008 16:45:30
Imagen de disco duro de sistema a un disco externo usb Wonni Windows 20 05-06-2007 13:11:55
Funcion para saber si un registro .dbf esta bloqueado ( en red no me funciona ) Wonni Conexión con bases de datos 7 06-10-2006 18:49:32


La franja horaria es GMT +2. Ahora son las 20:42:31.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi