Freigeben über


DispatchCleanup-Routinen

Die DispatchCleanup-Routine eines Treibers verarbeitet IRPs für den IRP_MJ_CLEANUP E/A-Funktionscode.

Treiber können eine DispatchCleanup-Routine verwenden, um alle Bereinigungsvorgänge auszuführen, die nach dem Schließen aller Handles für ein Dateiobjekt erforderlich sind. Beachten Sie, dass DispatchCleanup im Prozesskontext des Prozesses aufgerufen wird, der den letzten Handle geschlossen hat; dieser Prozess könnte sich von dem Prozess unterscheiden, der den Handle ursprünglich geöffnet hat. (Typischerweise tritt dieser Unterschied auf, weil ein anderer Prozess die Benutzermodusroutine DuplicateHandle verwendet, um die Prozesshandles zu duplizieren.) Treiber, die im ursprünglichen Prozesskontext eine Bereinigung vornehmen müssen, können die PsSetCreateProcessNotifyRoutine verwenden, um eine Rückrufroutine für diesen Zweck zu registrieren, aber beachten Sie, dass solche Rückrufmechanismen begrenzte Systemressourcen darstellen.

Im Allgemeinen muss eine DispatchCleanup-Routine eine IRP_MJ_CLEANUP Anforderung verarbeiten, indem sie folgendes für alle IRP ausführen, die sich derzeit in der Gerätewarteschlange (oder in der internen Warteschlange des Treibers von IRPs) befinden, für das Zielgerätobjekt und dem Dateiobjekt zugeordnet ist:

  • Rufen Sie IoSetCancelRoutine auf, um den Cancel-Routinezeiger auf NULL festzulegen.

  • Brechen Sie alle IRP ab, die sich derzeit in der Warteschlange für das Zielgerätobjekt befinden, wenn das Dateiobjekt, das im E/A-Stapel des in die Warteschlange eingereihten IRP angegeben ist, dem Dateiobjekt entspricht, das am E/A-Stapel des IRP_MJ_CLEANUP Anforderung empfangen wurde.

  • Rufen Sie IoCompleteRequest auf, um das IRP abzuschließen, und geben Sie STATUS_SUCCESS zurück.

Während der Verarbeitung einer IRP_MJ_CLEANUP Anforderung kann ein Treiber zusätzliche Anforderungen erhalten, z. B. IRP_MJ_READ oder IRP_MJ_WRITE. Daher muss ein Treiber, der Ressourcen verarbeiten muss, auch die Ausführung seiner DispatchCleanup-Routine mit anderen Dispatch-Routinen synchronisieren, z. B. DispatchRead und DispatchWrite.