Ver Mensaje Individual
  #2  
Antiguo 10-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 26
seoane Va por buen camino
Estuve probando con la función DeviceIOControl para obtener el numero de serie de una memoria USB y tengo problemas para conseguirlo.

Por ejemplo, usando IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER
Código Delphi [-]
const
  METHOD_BUFFERED = 0;
  FILE_ANY_ACCESS = 0;
  FILE_DEVICE_MASS_STORAGE = $2D;
  IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;

  IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER =
    (IOCTL_STORAGE_BASE shl 16) or
    ($304 shl 2) or
    METHOD_BUFFERED or
    (FILE_ANY_ACCESS shl 14);

type
  TMEDIA_SERIAL_NUMBER_DATA = packed record
    SerialNumberLength: ULONG;
    Result: ULONG;
    Reserved: array[1..2] of ULONG;
    SerialNumberData: array[0..0] of Char;
  end;
  PMEDIA_SERIAL_NUMBER_DATA = ^TMEDIA_SERIAL_NUMBER_DATA;

function SerialNumber(Letra: Char): string;
var
  Disk: THandle;
  SerialNumberData: TMEDIA_SERIAL_NUMBER_DATA;
  BytesReturned: Cardinal;
begin
  Result:= EmptyStr;
  if GetDriveType(PChar(Letra + ':\')) = DRIVE_REMOVABLE then
  begin
    Disk:= CreateFile(PChar('\\.\' + Letra + ':'),GENERIC_READ,FILE_SHARE_READ,nil,
      OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if Disk <> INVALID_HANDLE_VALUE then
    begin
      FillChar(SerialNumberData,Sizeof(SerialNumberData),0);
      if DeviceIOControl(Disk,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,nil,0,
        @SerialNumberData,Sizeof(SerialNumberData),BytesReturned, nil) then
      begin
        ShowMessage('Correcto');
      end else ShowMessage(SysErrorMessage(GetLastError));
      CloseHandle(Disk);
    end else ShowMessage(SysErrorMessage(GetLastError));
  end;
end;

Siempre obtengo el error, de que esta operación no es aplicable a este dispositivo. Y usando IOCTL_STORAGE_QUERY_PROPERTY, que también se usa en el caso de los discos duros, solo consigo obtener un breve descripción del dispositivo ningún numero de serie o identificador único. He leído un poco por ahí y parece que algunas memorias dan problemas con estas funciones, yo probé con las 2 que tengo y el problema continua.

De todas formas, ¿para que necesitas el numero de serie? ¿podría servirte leerlo del registro de windows?

Última edición por seoane fecha: 10-10-2006 a las 12:57:24.
Responder Con Cita