PDA

Ver la Versión Completa : Utilizar DeviceIoControl


Boris
09-10-2006, 20:37:33
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

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
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.