2. Регистрируем уведомление для каждого из этих физических дисков.
Регистрируем уведомление типа DBT_DEVTYP_HANDLE.
Функция возвращает хэндл зарегистрированного уведомления. Сравнив потом с этими хэндлами для каждого диска, хэндл полученный в сообщении можно определить, какой диск их прислал.
function RegNotif( Wnd: HWND; DriveChar: Char;
var Fltr: TDevBroadcastHandle): HDEVNOTIFY;
var
PhysDrvH: THandle;
PhysDrvName: String;
PhysDrvNum: Integer;
begin
Result := nil;
FillChar(Fltr, SizeOf(Fltr), 0);
//*** находим номер физического диска
PhysDrvNum := GetFirstPhysicalDriveNumber(DriveChar);
if PhysDrvNum = -1 then Exit;
//*** имя физического диска
PhysDrvName := \'\\\\.\\PhysicalDrive\'+IntToStr(PhysDrvNum);
//*** открываем диск (неважно, вставлена ли карточка)
PhysDrvH := CreateFile(PChar(PhysDrvName), 0, FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
//*** заполняем структуру TDevBroadcastHandle
Fltr.dbch_size := SizeOf(Fltr);
Fltr.dbch_devicetype := DBT_DEVTYP_HANDLE; // тип
Fltr.dbch_handle := PhysDrvH; // хэндл диска
//*** регистрируем для окна Wnd
Result := RegisterDeviceNotification( Wnd, @Fltr,
DEVICE_NOTIFY_WINDOW_HANDLE );
//*** освобождаем хэндл диска
CloseHandle(PhysDrvH);
end;