Determinar por qué el controlador UMDF no se puede cargar o el dispositivo UMDF no se puede iniciar
En este tema se describen los pasos de solución de problemas que puede usar cuando un controlador UMDF no puede cargarse o un dispositivo asociado no se puede iniciar.
Puede usar la técnica siguiente con los controladores UMDF versión 1 y 2.
Compruebe la configuración asegurándose de que los archivos siguientes son correctos:
Archivo INF del controlador.
Use la herramienta InfVerif para validar el archivo INF del controlador.
%windir%\inf\setupapi.dev.log (setupapi.log en Windows XP), %windir%\setupact.log y %windir%\temp\wudf_update.log.
Si no encontró ningún problema de configuración, habilite la entrada del Registro HostProcessDbgBreakOnStart mediante la aplicación de control de comprobador de WDF (WdfVerifier.exe). Al habilitar HostProcessDbgBreakOnStart, hará que el proceso de host del controlador para el dispositivo (WUDFHost.exe) se interrumpa en el depurador poco después de que se inicie WUDFHost.exe pero antes de que se cargue el archivo DLL del controlador.
Debe habilitar HostProcessDbgBreakOnStart con un depurador en modo de usuario y no con un depurador en modo kernel. Un depurador en modo kernel, de forma predeterminada, no recibe notificaciones de carga y descarga de módulos en modo de usuario. Por lo tanto, no podrá establecer puntos de interrupción diferidos.
Si no ve un inicio de host, realice los pasos siguientes para configurar correctamente el dispositivo:
- Asegúrese de que todos los controladores que instale a través de INF existen y se copian en el sistema operativo.
- Si el reflector (también conocido como WUDFRd.sys) no es el servicio en el dispositivo, asegúrese de que el controlador, que sería el servicio, tiene una entrada de servicio (por ejemplo, "sc qc foo") y se establece para iniciarse automáticamente.
Asegúrese de que los símbolos del controlador están en la ruta de acceso del símbolo (es decir, .simpatía).
Compruebe los siguientes elementos de uno en uno. En los pasos siguientes, suponga que el controlador está foo.dll:
Compruebe que se llama a la rutina DllMain del controlador (por ejemplo, bu Foo! DllMain).
Si el archivo DLL del controlador se carga, para los pasos posteriores, también puede usar la entrada del Registro HostProcessDbgBreakOnDriverLoad . Tener establecido HostProcessDbgBreakOnDriverLoad hace que WUDFHost.exe se interrumpa en el depurador después de cargar el archivo DLL del controlador. HostProcessDbgBreakOnDriverLoad también se puede usar con el depurador en modo kernel, ya que en este punto del proceso de carga de controladores e inicio de dispositivo puede establecer puntos de interrupción en el código del controlador.
Este paso solo se aplica a los controladores de la versión 1 de UMDF. Compruebe que se llama a la rutina DllGetClassObject del controlador. Compruebe que el identificador de clase (ID) del controlador es correcto. Compruebe que DllGetClassObject se ejecuta correctamente y devuelve un objeto de controlador (por ejemplo, bu Foo! DllGetClassObject).
Para la versión 1 de UMDF, compruebe que se llama al método IDriverEntry::OnDeviceAdd del controlador. Compruebe que el método crea un dispositivo y devuelve correctamente (por ejemplo, bu Foo! CMyDriver::OnDeviceAdd).
Para la versión 2 de UMDF, compruebe que se llama a la función EvtDriverDeviceAdd del controlador. Compruebe que la función crea un dispositivo y devuelve correctamente (por ejemplo, bu Foo! MyDriverDeviceAdd).
Para la versión 1 de UMDF, compruebe que se llama al método IPnpCallbackHardware::OnPrepareHardware o IPnpCallback::OnD0Entry del controlador. Compruebe que el método devuelve correctamente (por ejemplo, bu Foo! CMyDevice::OnPrepareHardware o Foo! CMyDevice::OnD0Entry).
Para la versión 2 de UMDF, compruebe que se llama a la función EvtDevicePrepareHardware o EvtDeviceD0Entry del controlador. Compruebe que la función se devuelve correctamente (por ejemplo, bu Foo! MyDevicePrepareHardware o Foo! MyDeviceD0Entry).
Si cada una de las operaciones anteriores se ejecuta correctamente, pero la operación que sigue no se ejecuta, debe comprobar los siguientes elementos:
- Compruebe que cada controlador anterior y debajo del controlador en la pila del modo de usuario también realiza correctamente estas operaciones.
- Compruebe que la pila del kernel debajo del controlador complete correctamente el IRP_MJ_PNP y IRP_MN_START_DEVICE IRP.