Определение серийного номера съемного носителя

Определить серийный номер флешки с помощью Delphi довольно просто. Основная функция для определения SerialNumber является GetVolumeInformation, которая включает себя несколько параметров.

GetVolumeInformation – это API функция принимающая ряд параметров, один из которых является указатель на переменную, которая будет хранить серийный номер VolumeSerialNumber. Ознакомиться со всеми тонкостями работы и параметрами функции GetVolumeInformation можно в MSDN.

function GetHardDiskSerial(const DriveLetter: Char): string;
var
  NotUsed:     DWORD;
  VolumeFlags: DWORD;
  VolumeInfo:  array[0..MAX_PATH] of Char;
  VolumeSerialNumber: DWORD;
begin
  GetVolumeInformation(PChar(DriveLetter + ':\'),
    nil, SizeOf(VolumeInfo), @VolumeSerialNumber, NotUsed,
    VolumeFlags, nil, 0);
  Result := Format('%8.8X', [VolumeSerialNumber])
end;

Для того чтобы узнать, является ли устройство съемным носителем используется следующий алгоритм:

1. Узнаем все логические устройства с помощью функции GetLogicalDrives, которая возвращает ряд битов, каждый из них является последовательным номером диска. К примеру (0 – диск А, 1- диск B, 2 – диск C и т.д).

2. Узнаем, является логический диск съемным (флешка или дискета), для этого используется цикл, и операция сравнения типа устройства. Узнать тип устройства можно благодаря API-функции GetDriveType() -в качестве параметра указывается указатель на том устройства. После чего функция возвращает тип устройства, возвращаемый результат необходимо сравнивать с DRIVE_removable. Таким образом, можно определить являются ли устройств со съемными носителями или нет.

В MSDN можно встретить другой вариант для распознавания usb-flash устройства – это использование функции SetupDiGetDeviceRegistryProperty и указать SPDRP_REMOVAL_POLICY.

В качестве примера можно использовать функцию, которая выводит список съемных

function issetRemovableDrive():TStringList;
var
Root:String;
i:Integer;
w:Cardinal;
RemovableDriveList:TStringList;
begin
RemovableDriveList := TStringList.Create;
w := GetLogicalDrives;
Root := '#:\';
for i := 0 to 25 do
begin
Root[1] := Char(Ord('A') + i);
if (W and (1 shl i)) > 0 then
begin
if GetDriveType(Pchar(Root)) = DRIVE_removable then
begin
RemovableDriveList.Add(Root);
end;
end;
end;
Result := RemovableDriveList;
end; 

Перечень съемных носителей будет внесен в объект TStringList.