Я пытаюсь обнаружить, что USB-накопитель вставлен в Службу Windows, я сделал это как обычное приложение Windows. Проблема заключается в следующем коде не работает для томов.
Регистрация уведомления устройства:
DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
HDEVNOTIFY hDeviceNotify = NULL;
::ZeroMemory(¬ificationFilter, sizeof(notificationFilter));
notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
notificationFilter.dbcc_classguid = ::GUID_DEVINTERFACE_VOLUME;
hDeviceNotify = ::RegisterDeviceNotification(g_serviceStatusHandle, ¬ificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE);
Код из функции ServiceControlHandlerEx:
case SERVICE_CONTROL_DEVICEEVENT:
PDEV_BROADCAST_HDR pBroadcastHdr = (PDEV_BROADCAST_HDR)lpEventData;
switch (dwEventType)
{
case DBT_DEVICEARRIVAL:
::MessageBox(NULL, "A Device has been plugged in.", "Pounce", MB_OK | MB_ICONINFORMATION);
switch (pBroadcastHdr->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
PDEV_BROADCAST_DEVICEINTERFACE pDevInt = (PDEV_BROADCAST_DEVICEINTERFACE)pBroadcastHdr;
if (::IsEqualGUID(pDevInt->dbcc_classguid, GUID_DEVINTERFACE_VOLUME))
{
PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME)pDevInt;
char szMsg[80];
char cDriveLetter = ::GetDriveLetter(pVol->dbcv_unitmask);
::wsprintfA(szMsg, "USB disk drive with the drive letter '%c:' has been inserted.", cDriveLetter);
::MessageBoxA(NULL, szMsg, "Pounce", MB_OK | MB_ICONINFORMATION);
}
}
return NO_ERROR;
}
В приложении Windows я могу получить DBT_DEVTYP_VOLUME в dbch_devicetype, однако этого нет в реализации службы Windows. Кто-нибудь видел или слышал о решении этой проблемы, без очевидного, переписать как приложение Windows?