dispositivo de volume do Windows detectar falhou até reiniciar. Nunca falhou antes
Pergunta
Eu tenho o código para detectar a conexão de USB Flash Drives como volumes. O código tem trabalhado muito bem por algum tempo, mas recentemente máquina de um colega do engenheiro começou a falhar e não funcionou novamente à direita até que ele foi reiniciado.
O projeto usa Qt 4.5.0, mas que não deve ser muito relevante para esta questão.
me inscrever para a notificação da seguinte maneira
// 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 );
O manipulador seguida, filtra as mensagens 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
O manipulador de mensagem de chegada, em seguida, manipula a mensagem como tal:
vazio HandleVolumeArrival (MSG * mensagem) { if (Mensagem-> lParam == 0) { qDebug () << "lParam é 0 na chegada Device"; Retorna; } // fim do if
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
} // fim HandleVolumeArrival
O problema veio quando verificar o tipo de dispositivo para um tipo de volume:
pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME
Quando foi falhando, o tipo de dispositivo estava sendo relatado como DBT_DEVTYP_DEVICEINTERFACE
.
Várias unidades USB foram julgados e todos tiveram o mesmo problema.
Alguém viu nada como isso antes? Você sabe o que poderia causar-lhe ou porque o problema seria ir longe em uma reinicialização do sistema?
Solução
Meu palpite seria que você veria o DBT_DEVTYP_DEVICEINTERFACE
normalmente de qualquer maneira. Os dispositivos USB são auto-descrição. Um dispositivo USB pode ter qualquer "interfaces", onde cada interface é uma característica do dispositivo. Meu palpite é que quando um USB é conectado você recebe um "DBT_DEVTYP_DEVICEINTERFAC
E" per interface do dispositivo USB para que um driver de dispositivo USB pode dizer que eles podem lidar com essa interface USB. Eu diria que o driver de dispositivo USB para controlador de armazenamento em massa USB que iria lidar com estas mensagens, montando o volume e, em seguida, você iria receber a mensagem DBT_DEVTYP_VOLUME
.
Eu acho que o driver de interface de armazenamento em massa não está funcionando corretamente (ou deixou de funcionar) e não está a tratar do DBT_DEVTYP_DEVICEINTERFACE
. A menos que você começar vendo um monte Eu não acho que é uma situação que você deve se preocupar em punho.