Да, сначала идет уведомление о подключении устройства, а потом монтирование ОС. Моя ошибка заключалась в том, что про вызове функции RegisterDeviceNotification я передавал ей неправильный GUID {a5dcbf10-6530-11d2-901f-00c04fb951ed}. Вот этот материал натолкнул меня на использование верного {53f56307-b6bf-11d0-94f2-00a0c91efb8b}. При использовании верного GUID можно обрабатывать оба сообщения. Выкладываю код непосредственно того, что мне было нужно:
HDEVNOTIFY USBRegister(HWND hWnd) // Передать дескриптор нужного окна
{
DEV_BROADCAST_DEVICEINTERFACE dbi = { sizeof(dbi), DBT_DEVTYP_DEVICEINTERFACE };
CLSIDFromString(L"{53f56307-b6bf-11d0-94f2-00a0c91efb8b}", &dbi.dbcc_classguid);
return RegisterDeviceNotification((HANDLE)hWnd, &dbi, DEVICE_NOTIFY_WINDOW_HANDLE);
}
LRESULT CALLBACK _WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DEVICECHANGE:
if (DBT_DEVICEARRIVAL == wParam)
{
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
char i;
switch( pHdr->dbch_devicetype )
{
case DBT_DEVTYP_DEVICEINTERFACE: // Подключение устройства
break;
case DBT_DEVTYP_VOLUME: // Монтирование ФС
for (i = 0; i < 26; ++i)
{
if (pDevVolume->dbcv_unitmask & 0x1)
break;
pDevVolume->dbcv_unitmask = pDevVolume->dbcv_unitmask >> 1;
}
i += 'A'; // Получение буквы
break;
}
}
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Внесу некоторые поправки, данный пример для только для дисков. Используется другая структура для перехвата информации (DEV_BROADCAST_VOLUME). Так что пример подходит только для дисководов.
Все отзывы как правильно совпадают с мнением установленного на ПК антивируса и/или фаервола. А они не всегда верны. Не думаю что «продвинутый народ» начнет копать инсталлятор. Максимум — сканирование или отправка на вирустотал.
Но, в случае с маком, ситуация конечно менее опасна но не исключена.