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?