IRP_MJ_CLEANUP (FS- und FS-Filter)

Sendebedingungen

Der Empfang der IRP_MJ_CLEANUP Anforderung gibt an, dass die Handleverweisanzahl für ein Dateiobjekt 00 erreicht hat. (Mit anderen Worten, alle Handles für das Dateiobjekt wurden geschlossen.) Häufig wird es gesendet, wenn eine Benutzermodusanwendung die Win32 CloseHandle-Funktion (oder wenn ein Kernelmodustreiber ZwClose aufgerufen hat) für das letzte ausstehende Handle an ein Dateiobjekt aufgerufen hat.

Es ist wichtig zu beachten, dass das Dateiobjekt möglicherweise weiterhin verwendet wird, wenn alle Handles für ein Dateiobjekt geschlossen wurden. Systemkomponenten, wie der Cache-Manager und der Speicher-Manager, enthalten möglicherweise ausstehende Verweise auf das Dateiobjekt. Diese Komponenten können auch nach Dem Empfang einer IRP_MJ_CLEANUP Anforderung weiterhin in eine Datei lesen oder aus dieser schreiben.

Vorgang: Dateisystemtreiber

Wenn das Zielgerätobjekt das Steuerungsgerätobjekt des Dateisystems ist, muss der Dateisystemtreiber die IRP abschließen.

Andernfalls sollte der Dateisystemtreiber die Bereinigungsanforderung verarbeiten.

Vorgang: Legacy-Dateisystemfiltertreiber

Wenn das Zielgerätobjekt das Steuergerätobjekt des Filtertreibers ist, muss der Filtertreiber die IRP abschließen.

Andernfalls sollte der Filtertreiber den IRP an den nächstniedrigen Treiber auf dem Stapel übergeben, nachdem er die erforderliche Verarbeitung ausgeführt hat.

Dateisystemfiltertreiber-Autoren sollten beachten, dass IoCreateStreamFileObject bewirkt, dass eine IRP_MJ_CLEANUP Anforderung an den Dateisystemtreiberstapel für das Volume gesendet wird. Da Dateisysteme häufig Streamdateiobjekte als Nebeneffekt anderer Vorgänge als IRP_MJ_CREATE erstellen, ist es für Filtertreiber schwierig, die Erstellung von Streamdateiobjekten zuverlässig zu erkennen. Daher sollte ein Filtertreiber erwarten, dass er IRP_MJ_CLEANUP und IRP_MJ_CLOSE Anforderungen für zuvor nicht angezeigte Dateiobjekte empfängt.

Filtertreiberautoren sollten auch beachten, dass IoCreateStreamFileObjectLite im Gegensatz zu IoCreateStreamFileObjectLite nicht dazu führt, dass eine IRP_MJ_CLEANUP Anforderung an den Dateisystemtreiberstapel gesendet wird. Aus diesem Grund und da Dateisysteme häufig Streamdateiobjekte als Nebeneffekt anderer Vorgänge als IRP_MJ_CREATE erstellen, ist es für Filtertreiber schwierig, die Erstellung von Streamdateiobjekten zuverlässig zu erkennen. Daher sollten Filtertreiber davon ausgehen, IRP_MJ_CLOSE Anforderungen für zuvor nicht angezeigte Dateiobjekte zu empfangen.

Parameter

Ein Dateisystem- oder Legacy-Filtertreiber ruft IoGetCurrentIrpStackLocation mit dem angegebenen IRP auf, um einen Zeiger auf den eigenen Stapelspeicherort im IRP zu erhalten, der in der folgenden Liste als IrpSp angezeigt wird. (Die IRP wird als Irp angezeigt.) Der Treiber kann die Informationen, die in den folgenden Elementen des IRP und des IRP-Stapelspeicherorts festgelegt sind, bei der Verarbeitung einer Bereinigungsanforderung verwenden.

  • DeviceObject

    Zeiger auf das Zielgerätobjekt.

  • Irp-Flags>

    Für diese Anforderung werden die folgenden Flags festgelegt:

    • IRP_CLOSE_OPERATION
    • IRP_SYNCHRONOUS_API
  • Irp-IoStatus>

    Zeiger auf eine IO_STATUS_BLOCK-Struktur, die die endgültige Vervollständigung status und Informationen zum angeforderten Vorgang empfängt.

  • Irp-FileObject>

    Zeiger auf das Dateiobjekt, das DeviceObject zugeordnet ist.

    Der Parameter Irp-FileObject> enthält einen Zeiger auf das Feld RelatedFileObject, das ebenfalls eine FILE_OBJECT-Struktur ist. Das Feld RelatedFileObject der FILE_OBJECT-Struktur ist während der Verarbeitung von IRP_MJ_CLEANUP ungültig und sollte nicht verwendet werden.

  • Irp-MajorFunction>

    Gibt IRP_MJ_CLEANUP an.

Weitere Informationen

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP (WDK-Kernelreferenz)

IRP_MJ_CLOSE

IRP_MJ_CREATE

ZwClose