Partager via


Détermination de la raison pour laquelle le chargement du pilote UMDF échoue ou le démarrage du périphérique UMDF

Cette rubrique décrit les étapes de résolution des problèmes que vous pouvez utiliser lorsqu’un pilote UMDF ne parvient pas à se charger ou qu’un appareil associé ne démarre pas.

Vous pouvez utiliser la technique suivante avec les pilotes UMDF version 1 et 2.

  1. Vérifiez l’installation en vous assurant que les fichiers suivants sont corrects :

    • Fichier INF du pilote.

      Utilisez l’outil InfVerif pour valider le fichier INF du pilote.

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

  2. Si vous n’avez trouvé aucun problème d’installation, activez l’entrée de Registre HostProcessDbgBreakOnStart à l’aide de l’application de contrôle WDF Verifier (WdfVerifier.exe). En activant HostProcessDbgBreakOnStart, vous allez faire en sorte que le processus hôte du pilote pour l’appareil (WUDFHost.exe) s’insère dans le débogueur peu après le démarrage de WUDFHost.exe, mais avant le chargement de la DLL de votre pilote.

    Vous devez activer HostProcessDbgBreakOnStart avec un débogueur en mode utilisateur et non un débogueur en mode noyau. Par défaut, un débogueur en mode noyau ne reçoit pas de notifications de chargement et de déchargement de module en mode utilisateur. Par conséquent, vous ne pourrez pas définir de points d’arrêt différés.

  3. Si vous ne voyez pas de démarrage d’hôte, effectuez les étapes suivantes pour configurer correctement l’appareil :

    1. Assurez-vous que tous les pilotes que vous installez via votre INF existent et sont copiés sur le système d’exploitation.
    2. Si le réflecteur (également appelé WUDFRd.sys) n’est pas le service sur l’appareil, assurez-vous que le pilote, qui serait alors le service, dispose d’une entrée de service (par exemple, « sc qc foo ») et qu’il est configuré pour démarrer automatiquement.
  4. Assurez-vous que les symboles de votre pilote se trouvent dans le chemin des symboles (autrement dit, .sympath).

  5. Vérifiez les éléments suivants un par un. Dans les étapes suivantes, supposons que votre pilote est foo.dll :

    1. Vérifiez que la routine DllMain de votre pilote est appelée (par exemple, bu Foo! DllMain).

    2. Si votre DLL de pilote ne se charge pas, pour les étapes suivantes, vous pouvez également utiliser l’entrée de Registre HostProcessDbgBreakOnDriverLoad . L’ensemble HostProcessDbgBreakOnDriverLoad entraîne l’entrée de WUDFHost.exe dans le débogueur après le chargement de votre DLL de pilote. HostProcessDbgBreakOnDriverLoad peut également être utilisé avec le débogueur en mode noyau, car à ce stade du processus de chargement et de démarrage de l’appareil, vous pouvez définir des points d’arrêt dans votre code de pilote.

    3. Cette étape s’applique uniquement aux pilotes UMDF version 1. Vérifiez que la routine DllGetClassObject de votre pilote est appelée. Vérifiez que l’identificateur de classe (ID) de votre pilote est correct. Vérifiez que DllGetClassObject s’exécute correctement et retourne un objet de pilote (par exemple, bu Foo! DllGetClassObject).

    4. Pour UMDF version 1, vérifiez que la méthode IDriverEntry::OnDeviceAdd de votre pilote est appelée. Vérifiez que la méthode crée un appareil et retourne correctement (par exemple, bu Foo! CMyDriver::OnDeviceAdd).

      Pour UMDF version 2, vérifiez que la fonction EvtDriverDeviceAdd de votre pilote est appelée. Vérifiez que la fonction crée un appareil et retourne correctement (par exemple, bu Foo! MyDriverDeviceAdd).

    5. Pour UMDF version 1, vérifiez que la méthode IPnpCallbackHardware::OnPrepareHardware ou IPnpCallback::OnD0Entry de votre pilote est appelée. Vérifiez que la méthode retourne correctement (par exemple, bu Foo! CMyDevice::OnPrepareHardware ou Foo! CMyDevice::OnD0Entry).

      Pour UMDF version 2, vérifiez que la fonction EvtDevicePrepareHardware ou EvtDeviceD0Entry de votre pilote est appelée. Vérifiez que la fonction retourne correctement (par exemple, bu Foo! MyDevicePrepareHardware ou Foo! MyDeviceD0Entry).

    6. Si chacune des opérations précédentes s’exécute correctement, mais que l’opération qui suit ne s’exécute pas, vous devez case activée les éléments suivants :

      1. Vérifiez que chaque pilote au-dessus et en dessous de votre pilote dans la pile en mode utilisateur effectue également ces opérations.
      2. Vérifiez que la pile de noyau sous votre pilote termine correctement les IRP_MJ_PNP et IRP_MN_START_DEVICE IRPs.