Обнаружение устройства тома Windows не удалось до перезагрузки. Никогда не подводил раньше - PullRequest
0 голосов
/ 12 мая 2009

У меня есть код для определения подключения 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 HandleVolumeArrival (сообщение MSG *) { if (message-> lParam == 0) { qDebug () << "lParam равен 0 при получении устройства"; вернуть; } // конец, если </p>

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

} // end HandleVolumeArrival

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

pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME

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

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

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

1 Ответ

1 голос
/ 13 мая 2009

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

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

...