Partager via


Utilisation des verrous de retrait

Les routines de suppression de verrou permettent de suivre le nombre d’opérations d’E/S en attente sur un appareil et de déterminer quand il est sûr de détacher et de supprimer l’objet de périphérique d’un pilote. Le système fournit ces routines aux enregistreurs de pilotes comme alternative à l’implémentation de leur propre mécanisme de suivi.

Un pilote peut utiliser ce mécanisme à deux fins :

  1. Pour vous assurer que la routine DispatchPnP du pilote ne termine pas une demande de IRP_MN_REMOVE_DEVICE pendant que le verrou est conservé (par exemple, tandis qu’une autre routine de pilote accède à l’appareil).

  2. Pour compter le nombre de raisons pour lesquelles le pilote ne doit pas supprimer son objet d’appareil et définir un événement lorsque ce nombre passe à zéro.

Pour initialiser un verrou de suppression, un pilote doit allouer une structure IO_REMOVE_LOCK dans son extension d’appareil, puis appeler IoInitializeRemoveLock. Un pilote appelle généralement IoInitializeRemoveLock dans sa routine AddDevice, lorsque le pilote initialise le reste de l’extension d’appareil pour un objet d’appareil.

Votre pilote doit appeler IoAcquireRemoveLock chaque fois qu’il démarre une opération d’E/S. Le pilote doit appeler IoReleaseRemoveLock chaque fois qu’il termine une opération d’E/S. Un pilote peut acquérir le verrou plusieurs fois. Les routines de suppression des verrous conservent le nombre d’acquisitions en attente du verrou. Chaque appel à IoAcquireRemoveLock incrémente le nombre et IoReleaseRemoveLock décrémente le nombre.

Votre pilote doit également appeler IoAcquireRemoveLock lorsqu’il transmet une référence à son code (pour les minuteurs, les dpcs, les rappels, etc.). Le pilote doit ensuite appeler IoReleaseRemoveLock lorsque l’événement est retourné.

Dans son code de répartition pour IRP_MN_REMOVE_DEVICE, le pilote doit acquérir le verrou une fois de plus, puis appeler IoReleaseRemoveLockAndWait. Cette routine ne retourne pas tant que toutes les acquisitions en suspens du verrou n’ont pas été libérées. Pour permettre l’exécution des opérations d’E/S en file d’attente, chaque pilote doit appeler IoReleaseRemoveLockAndWait après avoir transmis la demande IRP_MN_REMOVE_DEVICE au pilote inférieur suivant, et avant de libérer de la mémoire, appelle IoDetachDevice ou appelle IoDeleteDevice. Une fois que IoReleaseRemoveLockAndWait a été appelé pour un verrou de suppression particulier, tous les appels suivants à IoAcquireRemoveLock pour le même verrou de suppression échoueront.

Une fois que IoReleaseRemoveLockAndWait retourne, le pilote doit considérer que l’appareil est dans un état dans lequel il est prêt à être supprimé et ne peut pas effectuer d’opérations d’E/S. Par conséquent, le pilote ne doit pas appeler IoInitializeRemoveLock pour initialiser à nouveau le verrou de suppression. La violation de cette règle pendant que le pilote est vérifié par le vérificateur de pilotes entraîne une vérification de bogue.

Étant donné qu’un pilote stocke une structure IO_REMOVE_LOCK dans l’extension de périphérique d’un objet d’appareil, le verrou de suppression est supprimé lorsque le pilote supprime l’extension de l’appareil lors du traitement d’une demande de IRP_MN_REMOVE_DEVICE .