dispositivo de volumen de Windows no pudo detectar hasta que los reinicio. Nunca fallado antes

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

Pregunta

Tengo código para detectar la conexión de memorias USB como volúmenes. El código ha estado trabajando muy bien por un tiempo, pero recientemente la máquina de un compañero ingeniero comenzó a fallar y no funcionaba bien otra vez hasta que se reinicia.

El proyecto utiliza Qt 4.5.0, pero que no debe ser muy relevante para esta pregunta.

me registro para la notificación de la siguiente manera

// 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 );   

El manejador luego filtra los mensajes 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

El controlador de mensaje de llegada a continuación controla el mensaje como tal:

vacío HandleVolumeArrival (MSG * mensaje) {     si (mensaje-> lParam == 0)     {         qDebug () << "lParam es 0 a la llegada de dispositivos";         regreso;     } // fin si

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

} // fin HandleVolumeArrival

El problema vino cuando se comprueba el tipo de dispositivo para un tipo de volumen:

pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME

Cuando se estaba fallando, se está informando el tipo de dispositivo como DBT_DEVTYP_DEVICEINTERFACE.

unidades USB Múltiples fueron juzgados y todos tenían el mismo problema.

Alguien ha visto algo como esto antes? ¿Sabe lo que podría provocar que el problema o por qué se iría en un reinicio del sistema?

¿Fue útil?

Solución

Mi conjetura sería que se podría ver la DBT_DEVTYP_DEVICEINTERFACE normalmente de todos modos. Los dispositivos USB son auto-descripción. Un dispositivo USB puede tener cualquier "interfaces", donde cada interfaz es una característica del dispositivo. Mi conjetura es que cuando se conecta un dispositivo USB se obtiene una "DBT_DEVTYP_DEVICEINTERFAC E" por interfaz USB dispositivo de modo que un controlador de dispositivo USB puede decir que ellos pueden manejar esa interfaz USB. Supongo que el controlador de dispositivo USB para controlador de almacenamiento masivo USB sería manejaría estos mensajes montando el volumen y entonces se obtendría el mensaje DBT_DEVTYP_VOLUME.

Me imagino que el controlador de interfaz de almacenamiento masivo no está funcionando correctamente (o deja de funcionar) y no está manejando la <=>. A menos que a partir de ver que muchos no creo que es una situación que debe preocuparse de manejar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top