Partager via


Routines DispatchCleanup

La routine DispatchCleanup d’un conducteur gère les IRPs pour le code de fonction d'entrée/sortie 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 de 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 ouvert initialement le handle. (En règle générale, cette différence se produit parce qu’un autre processus utilise la routine en mode utilisateur DuplicateHandle pour dupliquer les handles des 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 règle générale, une routine DispatchCleanup doit traiter une requête IRP_MJ_CLEANUP en effectuant les opérations suivantes pour chaque IRP actuellement dans la file d’attente de l’appareil (ou dans la file d’attente interne du pilote des IRPs), pour l’objet périphérique cible et est associé à l’objet de fichier :

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

  • Annulez chaque IRP actuellement dans la file d’attente de l’objet d’appareil cible, si l’objet de fichier spécifié dans l’emplacement de la pile d’E/S du pilote de l’IRP mis en file d’attente correspond à l’objet de fichier reçu à l’emplacement de la 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 demandes 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 répartition, telles que DispatchRead et DispatchWrite.