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 erforderlich sind, nachdem alle Handles für ein Dateiobjekt geschlossen wurden. Beachten Sie, dass DispatchCleanup im Prozesskontext des Prozesses aufgerufen wird, der das endgültige Handle geschlossen hat. Dieser Prozess kann sich von dem Prozess unterscheiden, der das Handle ursprünglich geöffnet hat. (Dieser Unterschied tritt in der Regel auf, weil ein anderer Prozess die Duplikathandle-Benutzermodusroutine verwendet, um die Prozesse zu duplizieren.) Treiber, die eine Bereinigung im ursprünglichen Prozesskontext durchführen müssen, können die PsSetCreateProcessNotifyRoutine-Routine verwenden, um eine Rückrufroutine für diesen Zweck zu registrieren. Beachten Sie jedoch, dass solche Rückrufe eine begrenzte Systemressource sind.

Im Allgemeinen muss eine DispatchCleanup-Routine für jedes IRP, das sich derzeit in der Gerätewarteschlange (oder in der internen IRPs-Warteschlange des Treibers) befindet, eine IRP_MJ_CLEANUP Anforderung verarbeiten und dem Dateiobjekt zugeordnet ist:

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

  • Brechen Sie jedes IRP ab, das sich derzeit in der Warteschlange für das Zielgerätobjekt befindet, wenn das Dateiobjekt, das im E/A-Stapelspeicherort des Treibers des IRP in der Warteschlange angegeben ist, mit dem Dateiobjekt übereinstimmt, das am E/A-Stapelspeicherort der IRP_MJ_CLEANUP Anforderung empfangen wurde.

  • Rufen Sie IoCompleteRequest auf, um die 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 empfangen, z. B. IRP_MJ_READ oder IRP_MJ_WRITE. Daher muss ein Treiber, der die Zuordnung von Ressourcen aufheben muss, auch die Ausführung seiner DispatchCleanup-Routine mit anderen Dispatchroutinen wie DispatchRead und DispatchWrite synchronisieren.