dispositivo de volumen de Windows no pudo detectar hasta que los reinicio. Nunca fallado antes
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?
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.