Determinando por que o driver UMDF falha ao carregar ou o dispositivo UMDF falha ao iniciar
Este tópico descreve as etapas de solução de problemas que você pode usar quando um driver UMDF falha ao carregar ou um dispositivo associado falha ao iniciar.
Você pode usar a técnica a seguir com drivers UMDF versão 1 e 2.
Verifique a configuração garantindo que os seguintes arquivos estejam corretos:
Arquivo INF do driver.
Use a ferramenta InfVerif para validar o arquivo INF do driver.
%windir%\inf\setupapi.dev.log (setupapi.log no Windows XP), %windir%\setupact.log e %windir%\temp\wudf_update.log.
Se você não encontrou problemas de instalação, habilite a entrada do Registro HostProcessDbgBreakOnStart usando o aplicativo de controle Verificador do WDF (WdfVerifier.exe). Ao habilitar HostProcessDbgBreakOnStart, você fará com que o processo de host do driver para o dispositivo (WUDFHost.exe) interrompa o depurador logo após o início do WUDFHost.exe, mas antes do carregamento da DLL do driver.
Você deve habilitar HostProcessDbgBreakOnStart com um depurador de modo de usuário e não um depurador de modo kernel. Um depurador no modo kernel, por padrão, não recebe notificações de carregamento e descarregamento do módulo no modo de usuário. Portanto, você não poderá definir pontos de interrupção adiados.
Se você não vir um host iniciar, execute as seguintes etapas para configurar corretamente o dispositivo:
- Verifique se todos os drivers que você instala por meio do INF existem e são copiados para o sistema operacional.
- Se o refletor (também conhecido como WUDFRd.sys) não for o serviço no dispositivo, verifique se o driver, que seria então o serviço, tem uma entrada de serviço (por exemplo, 'sc qc foo') e está definido para ser iniciado automaticamente.
Verifique se os símbolos do driver estão no caminho do símbolo (ou seja, .sympath).
Verifique os itens a seguir, um de cada vez. Nas etapas a seguir, suponha que o driver esteja foo.dll:
Verifique se a rotina DllMain do driver é chamada (por exemplo, bu Foo! DllMain).
Se a DLL do driver for carregada, para as etapas subsequentes, você também poderá usar a entrada do Registro HostProcessDbgBreakOnDriverLoad . Ter HostProcessDbgBreakOnDriverLoad definido faz com que WUDFHost.exe interrompa o depurador depois que a DLL do driver é carregada. HostProcessDbgBreakOnDriverLoad também pode ser usado com o depurador do modo kernel porque, neste ponto, no processo de carregamento de driver e inicialização do dispositivo, você pode definir pontos de interrupção no código do driver.
Esta etapa se aplica somente a drivers UMDF versão 1. Verifique se a rotina DllGetClassObject do driver é chamada. Verifique se o identificador de classe (ID) do driver está correto. Verifique se DllGetClassObject é executado com êxito e retorna um objeto de driver (por exemplo, bu Foo! DllGetClassObject).
Para UMDF versão 1, verifique se o método IDriverEntry::OnDeviceAdd do driver é chamado. Verifique se o método cria um dispositivo e retorna com êxito (por exemplo, bu Foo! CMyDriver::OnDeviceAdd).
Para UMDF versão 2, verifique se a função EvtDriverDeviceAdd do driver é chamada. Verifique se a função cria um dispositivo e retorna com êxito (por exemplo, bu Foo! MyDriverDeviceAdd).
Para UMDF versão 1, verifique se o método IPnpCallbackHardware::OnPrepareHardware ou IPnpCallback::OnD0Entry do driver é chamado. Verifique se o método retorna com êxito (por exemplo, bu Foo! CMyDevice::OnPrepareHardware ou Foo! CMyDevice::OnD0Entry).
Para UMDF versão 2, verifique se a função EvtDevicePrepareHardware ou EvtDeviceD0Entry do driver é chamada. Verifique se a função retorna com êxito (por exemplo, bu Foo! MyDevicePrepareHardware ou Foo! MyDeviceD0Entry).
Se cada uma das operações anteriores for executada com êxito, mas a operação a seguir não for executada, você deverá marcar os seguintes itens:
- Verifique se cada driver acima e abaixo do driver na pilha de modo de usuário também executa essas operações com êxito.
- Verifique se a pilha de kernel abaixo do driver conclui com êxito o IRP_MJ_PNP e IRP_MN_START_DEVICE IRPs.