Condividi tramite


Determinazione del motivo per cui il driver UMDF non riesce a caricare o l'avvio del dispositivo UMDF

In questo argomento vengono descritti i passaggi per la risoluzione dei problemi che è possibile usare quando un driver UMDF non viene caricato o quando un dispositivo associato non viene avviato.

È possibile usare la tecnica seguente con i driver UMDF versione 1 e 2.

  1. Controllare la configurazione assicurandosi che i file seguenti siano corretti:

    • File INF del driver.

      Usare lo strumento InfVerif per convalidare il file INF del driver.

    • %windir%\inf\setupapi.dev.log (setupapi.log in Windows XP), %windir%\setupact.log e %windir%\temp\wudf_update.log.

  2. Se non sono stati rilevati problemi di installazione, abilitare la voce del Registro di sistema HostProcessDbgBreakOnStart usando l'applicazione di controllo verifica WDF (WdfVerifier.exe). Abilitando HostProcessDbgBreakOnStart, il processo host del driver per il dispositivo (WUDFHost.exe) verrà suddiviso nel debugger poco dopo l'avvio di WUDFHost.exe ma prima del caricamento della DLL del driver.

    È necessario abilitare HostProcessDbgBreakOnStart con un debugger in modalità utente e non un debugger in modalità kernel. Per impostazione predefinita, un debugger in modalità kernel non riceve notifiche di caricamento e scaricamento dei moduli in modalità utente. Pertanto, non sarà possibile impostare punti di interruzione posticipati.

  3. Se non viene visualizzato un avvio host, seguire questa procedura per configurare correttamente il dispositivo:

    1. Assicurarsi che tutti i driver installati tramite INF esistano e vengano copiati nel sistema operativo.
    2. Se il riflettore (noto anche come WUDFRd.sys) non è il servizio nel dispositivo, assicurarsi che il driver, che sarebbe il servizio, abbia una voce di servizio (ad esempio, 'sc qc foo') e sia impostata per l'avvio automatico.
  4. Assicurarsi che i simboli del driver si trovino nel percorso del simbolo , ovvero .sympath.

  5. Verificare gli elementi seguenti uno alla volta. Nei passaggi seguenti si supponga che il driver sia foo.dll:

    1. Verificare che la routine DllMain del driver venga chiamata (ad esempio, bu Foo! DllMain).

    2. Se la DLL del driver viene caricata, per i passaggi successivi, è anche possibile usare la voce del Registro di sistema HostProcessDbgBreakOnDriverLoad . Se il set HostProcessDbgBreakOnDriverLoad causa WUDFHost.exe'interruzione nel debugger dopo il caricamento della DLL del driver. HostProcessDbgBreakOnDriverLoad può essere usato anche con il debugger in modalità kernel, perché a questo punto nel processo di caricamento del driver e di avvio del dispositivo è possibile impostare punti di interruzione nel codice del driver.

    3. Questo passaggio si applica solo ai driver UMDF versione 1. Verificare che venga chiamata la routine DllGetClassObject del driver. Verificare che l'identificatore di classe (ID) per il driver sia corretto. Verificare che DllGetClassObject venga eseguito correttamente e restituisca un oggetto driver ,ad esempio bu Foo! DllGetClassObject).

    4. Per UMDF versione 1, verificare che venga chiamato il metodo IDriverEntry::OnDeviceAdd del driver. Verificare che il metodo crei un dispositivo e restituisca correttamente (ad esempio, bu Foo! CMyDriver::OnDeviceAdd).

      Per UMDF versione 2, verificare che venga chiamata la funzione EvtDriverDeviceAdd del driver. Verificare che la funzione crei un dispositivo e restituisca correttamente (ad esempio, bu Foo! MyDriverDeviceAdd).

    5. Per UMDF versione 1, verificare che venga chiamato il metodo IPnpCallbackHardware::OnPrepareHardware o IPnpCallback::OnD0Entry del driver. Verificare che il metodo restituisca correttamente (ad esempio, bu Foo! CMyDevice::OnPrepareHardware o Foo! CMyDevice::OnD0Entry).

      Per UMDF versione 2, verificare che venga chiamata la funzione EvtDevicePrepareHardware o EvtDeviceD0Entry del driver. Verificare che la funzione restituisca correttamente (ad esempio, bu Foo! MyDevicePrepareHardware o Foo! MyDeviceD0Entry).

    6. Se ognuna delle operazioni precedenti viene eseguita correttamente, ma l'operazione seguente non viene eseguita, è necessario controllare gli elementi seguenti:

      1. Verificare che ogni driver sopra e sotto il driver nello stack in modalità utente esegua correttamente queste operazioni.
      2. Verificare che lo stack del kernel sottostante il driver completi correttamente i IRP_MJ_PNP e IRP_MN_START_DEVICE IRP.