Не удалось обнаружить устройство тома Windows до перезагрузки.Никогда раньше не подводил

StackOverflow https://stackoverflow.com/questions/853304

Вопрос

У меня есть код для обнаружения подключения USB-накопителей в качестве томов.Некоторое время код работал очень хорошо, но недавно машина моего коллеги-инженера начала давать сбой и снова не работала, пока ее не перезапустили.

В проекте используется Qt 4.5.0, но это не должно иметь большого значения для данного вопроса.

Я регистрируюсь для получения уведомлений следующим образом

// Register for device connect notification
DEV_BROADCAST_DEVICEINTERFACE devInt;
ZeroMemory( &devInt, sizeof(devInt) );
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;

m_hDeviceNotify =
    RegisterDeviceNotification( winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE );   

Затем обработчик фильтрует сообщения WM_DEVICECHANGE.

if (message->message == WM_DEVICECHANGE)
{
    switch (message->wParam)
    {
    case DBT_DEVICEARRIVAL:
        HandleVolumeArrival( message );
        break;

    case DBT_DEVICEREMOVECOMPLETE:
        HandleVolumeRemoval( message );
        break;

    default:
        break;
    }

    *result = TRUE;
} // end if

Обработчик сообщения о прибытии затем обрабатывает сообщение следующим образом:

void hardervolumearrivival (msg *message) {if (message-> lparam == 0) {qdebug () << "lparam равен 0 при приезде к устройству»;возвращаться;} // конец, если

PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR) message->lParam;
if(pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
    PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME) pHdr;

    // Handling of the volume is performed here
} // end if

} // конец HandleVolumeArrival

Проблема возникла при проверке типа устройства для типа тома:

pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME

При сбое тип устройства сообщался как DBT_DEVTYP_DEVICEINTERFACE.

Было опробовано несколько USB-накопителей, и у всех была одна и та же проблема.

Кто-нибудь видел что-нибудь подобное раньше?Знаете ли вы, что может быть причиной этого или почему проблема исчезнет при перезагрузке системы?

Это было полезно?

Решение

Я предполагаю, что вы увидите DBT_DEVTYP_DEVICEINTERFACE в любом случае обычно.USB-устройства описывают сами себя.USB-устройство может иметь любые «интерфейсы», где каждый интерфейс является функцией устройства.Я предполагаю, что при подключении USB вы получаете сообщение "DBT_DEVTYP_DEVICEINTERFACE" для каждого интерфейса USB-устройства, чтобы драйвер USB-устройства мог сказать, что он может обрабатывать этот USB-интерфейс.Я предполагаю, что драйвер USB-устройства для драйвера USB-накопителя обработает эти сообщения, подключив том, и тогда вы получите DBT_DEVTYP_VOLUME сообщение.

Я предполагаю, что драйвер интерфейса запоминающего устройства работает неправильно (или произошел сбой) и не обрабатывает DBT_DEVTYP_DEVICEINTERFACE.Если только вы не начнете видеть это часто, я не думаю, что вам стоит с этим справляться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top