Règle RemoveLockMnRemove2 (wdm)

La règle RemoveLockMnRemove2 vérifie que les appels à IoAcquireRemoveLock et IoReleaseRemoveLockAndWait sont utilisés correctement lors du traitement de IRP_MN_REMOVE_DEVICE demande avant que l’IRP ne soit transféré aux pilotes inférieurs.

Cette règle s’applique uniquement aux pilotes FDO et FIDO.

Par exemple, considérez une pile de pilotes PnP qui se compose d’un pilote de filtre, d’un FDO et d’un PDO.

Le gestionnaire PnP envoie une suppression de requête par le biais de la pile. Le FDO est activé pour être inactif pendant que le système est en cours d’exécution. Le FDO décide de mettre hors tension dans l’état supprimé de la requête, il demande donc un IRP d0. Avant l’arrivée de l’IRP d0, le gestionnaire PnP envoie un IRP de suppression PnP et cette IRP est traitée par le pilote de filtre. Le pilote de filtre se détache de la pile et nettoie son état. Le d0 arrive en haut de la pile, mais le pilote de filtre ne l’envoie pas dans la pile, car il n’a plus de contexte ni de données pour savoir où l’envoyer. Le FDO est suspendu en attendant que le D0 IRP arrive mais que IRP ne le fera jamais.

Pour éviter cette erreur

  1. Avant qu’un appareil ne soit détaché de la pile d’appareils, IoAcquireRemoveLock doit réussir avant que l’IRP soit transféré vers le bas de la pile pour les types d’IRP suivants :

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. IoReleaseRemoveLockAndWait doit être appelé avant d’appeler IoDetachDevice ou IoDeleteDevice. (Cela permet de s’assurer que tous les verrous de suppression sont libérés dans les pilotes de périphérique).

Modèle de pilote : WDM

Comment tester

Au moment de la compilation

Exécutez Static Driver Verifier et spécifiez la règle RemoveLockMnRemove2 .

Utilisez les étapes suivantes pour exécuter l’analyse de votre code :
  1. Préparez votre code (utilisez les déclarations de type).
  2. Exécutez le vérificateur de pilote statique.
  3. Affichez et analysez les résultats.

Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes.

S’applique à

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver