Share via


DispatchCleanup Routines

La routine DispatchCleanup d’un pilote gère les IRP pour le code de la fonction d’E /S IRP_MJ_CLEANUP.

Les pilotes peuvent utiliser une routine DispatchCleanup pour effectuer toutes les opérations de nettoyage nécessaires une fois que tous les handles d’un objet fichier ont été fermés. Notez que DispatchCleanup est appelé dans le contexte de processus du processus qui a fermé le handle final ; ce processus peut être différent du processus qui a initialement ouvert le handle. (En règle générale, cette différence se produit parce qu’un autre processus utilise la routine du mode utilisateur DuplicateHandle pour dupliquer les handles de processus.) Les pilotes qui doivent effectuer le nettoyage dans le contexte de processus d’origine peuvent utiliser la routine PsSetCreateProcessNotifyRoutine pour inscrire une routine de rappel à cet effet, mais gardez à l’esprit que ces rappels sont une ressource système limitée.

En général, une routine DispatchCleanup doit traiter une requête IRP_MJ_CLEANUP en procédant comme suit pour chaque IRP qui se trouve actuellement dans la file d’attente d’appareils (ou dans la file d’attente interne des IRP du pilote), pour l’objet d’appareil cible et est associé à l’objet fichier :

  • Appelez IoSetCancelRoutine pour définir le pointeur de routine Cancel sur NULL.

  • Annulez chaque IRP actuellement dans la file d’attente pour l’objet d’appareil cible, si l’objet file spécifié dans l’emplacement de la pile d’E/S du pilote de l’IRP en file d’attente correspond à l’objet fichier qui a été reçu dans l’emplacement de pile d’E /S de la demande IRP_MJ_CLEANUP.

  • Appelez IoCompleteRequest pour terminer l’IRP et retourner STATUS_SUCCESS.

Lors du traitement d’une demande de IRP_MJ_CLEANUP , un pilote peut recevoir des requêtes supplémentaires, telles que IRP_MJ_READ ou IRP_MJ_WRITE. Par conséquent, un pilote qui doit libérer des ressources doit également synchroniser l’exécution de sa routine DispatchCleanup avec d’autres routines de dispatch, telles que DispatchRead et DispatchWrite.