Signalement des défaillances d’appareils
Il existe trois façons de signaler les défaillances d’appareils :
Lors du retour à partir de fonctions de rappel d’objet d’appareil, le pilote peut fournir une valeur de retour pour laquelle NT_SUCCESS(status) est égal à FALSE.
Le pilote peut appeler WdfDeviceSetFailed.
Lors du retour à partir de sa routine de rappel EvtDriverDeviceAdd, un pilote de fonction peut fournir une valeur de retour pour laquelle NT_SUCCESS(status) est false. Si un pilote installé en tant que filtre échoue EvtDriverDeviceAdd, le système d’exploitation ignore l’objet de périphérique de filtre et n’indique pas d’erreur PnP.
Chacune des méthodes ci-dessus entraîne la suppression effective de l’appareil par l’infrastructure. Si les pilotes du périphérique ne prennent pas en charge d’autres périphériques sur le système, le gestionnaire d’E/S décharge les pilotes.
Si la fonction de rappel d’objet de périphérique d’un pilote retourne une valeur pour laquelle NT_SUCCESS(status) est false, l’infrastructure avertit le gestionnaire PnP, qui tente ensuite de redémarrer l’appareil en demandant au pilote de bus de réinumer ses appareils. Votre pilote sera rechargé, s’il a été déchargé.
Si votre pilote appelle WdfDeviceSetFailed, il fournit un argument d’entrée qui détermine si l’appareil sera redémarré. Les valeurs d’argument sont WdfDeviceFailedAttemptRestart et WdfDeviceFailedNoRestart.
UMDF Avant UMDF 2.15, un pilote UMDF doit définir cette valeur sur WdfDeviceFailedNoRestart. À compter d’UMDF version 2.15, un pilote UMDF peut demander que le pilote de bus sous-jacent l’énumère à nouveau en appelant WdfDeviceSetFailed avec FailedAction défini sur WdfDeviceFailedAttemptRestart. Pour plus d’informations, consultez WdfDeviceSetFailed.
Pour plus d’informations sur ces valeurs d’argument, consultez WDF_DEVICE_FAILED_ACTION. Avant que la fonction de rappel d’objet de périphérique d’un pilote ne retourne avec une valeur pour laquelle NT_SUCCESS(status) est false, la fonction de rappel peut empêcher les redémarrages en appelant WdfDeviceSetFailed avec un argument d’entrée WdfDeviceFailedNoRestart. Sinon, ces fonctions de rappel n’ont pas besoin d’appeler WdfDeviceSetFailed.
Si, dans un court laps de temps, plusieurs tentatives de redémarrage consécutives échouent (car le pilote redémarré signale à nouveau une erreur), l’infrastructure cesse de tenter de redémarrer l’appareil.
Si la fonction EvtDeviceD0Entry d’un pilote de bus retourne une valeur pour laquelle NT_SUCCESS(status) est false, l’infrastructure peut toujours appeler les fonctions EvtDeviceD0Entry des pilotes associés aux périphériques enfants du pilote de bus.