RemoveLockMnSurpriseRemove, règle (wdm)
La règle RemoveLockMnSurpriseRemove vérifie que les appels à IoAcquireRemoveLock et IoReleaseRemoveLockAndWait sont utilisés correctement lors du traitement des IRP_MJ_PNP avec les IRP_MN_SUPRISE_REMOVAL MinorFunction. Le pilote doit acquérir le verrou de suppression avant de transférer l’IRP vers le bas de la pile.
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 ni contexte ni données pour savoir où l’envoyer. Le FDO est suspendu en attendant l’arrivée de l’IRP d0, mais que l’IRP ne le fera jamais.
Pour éviter cette erreur
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 IRP suivants :
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
IoReleaseRemoveLockAndWait doit être appelé avant d’appeler IoDetachDevice ou IoDeleteDevice. (Cela garantit 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 RemoveLockMnSurpriseRemove . Utilisez les étapes suivantes pour exécuter l’analyse de votre code :
Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes. |
S’applique à
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriverRemoveHeadList