Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Utilizar DeviceIoControl (https://www.clubdelphi.com/foros/showthread.php?t=36362)

Boris 09-10-2006 20:37:33

Utilizar DeviceIoControl
 
Buenas, Alguien podría ayudarme a utilizar ésta rutina para obtener el número de serie (físico) de un dispositivo usb??, no soy un experto y me es difícil poder utilizarlo.

seoane 10-10-2006 12:51:09

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?

Boris 11-10-2006 15:20:41

Utilizar DeviceIoControl
 
Muchas gracias por responder Seoane, el problema que tengo es que necesito obtener el número de serie a partir de la letra de la unidad (o viceversa).

Windows registra las series de las usbs conectadas en el orden en que se insertan, y bueno he sacado las series del registro para manejarlas paralelamente a las letras pero el problema que tengo es que las letras de las unidades no cambian y las series pueden estar en cualquier orden dependiendo como se insertan así que no coinciden (no hacen match).

Si se pudiera obtener las series a partir de la letra o al revés, por medio del registro de windows sería muy muy bueno jeje. Agradezco mucho tu ayuda Seoane. Gracias.


La franja horaria es GMT +2. Ahora son las 18:26:32.

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