Freigeben über


Fehler bei einem E/A-Vorgang in einer Postoperation-Rückrufroutine

Die Rückrufroutine eines Minifiltertreibers nach der Operation kann bei einem erfolgreichen E/A-Vorgang fehlschlagen, aber ein einfaches Fehlschlagen eines E/A-Vorgangs macht die Auswirkungen des Vorgangs nicht rückgängig. Der Minifiltertreiber ist für die Ausführung der Verarbeitung verantwortlich, die zum Rückgängigmachen des Vorgangs erforderlich ist.

Die Rückrufroutine eines Minifiltertreibers nach der Erstellung kann beispielsweise bei einem erfolgreichen IRP_MJ_CREATE-Vorgang fehlschlagen, indem sie die folgenden Schritte ausführen:

  1. Aufrufen von FltCancelFileOpen , um die Datei zu schließen, die durch den Erstellungsvorgang erstellt oder geöffnet wurde. Beachten Sie, dass FltCancelFileOpen keine Änderungen an der Datei rückgängig macht. Beispielsweise löscht FltCancelFileOpen keine neu erstellte Datei oder stellt keine abgeschnittene Datei auf die vorherige Größe zurück.

  2. Festlegen des IoStatus.Status-Felds der Rückrufdatenstruktur auf den endgültigen NTSTATUS-Wert für den Vorgang. Dieser Wert muss ein gültiger NTSTATUS-Fehlerwert sein, z. B. STATUS_ACCESS_DENIED.

  3. Festlegen des Felds IoStatus.Information der Rückrufdatenstruktur auf 0.

  4. Gibt FLT_POSTOP_FINISHED_PROCESSING zurück.

Beim Festlegen des IoStatus.Status-Felds der Rückrufdatenstruktur auf den endgültigen NTSTATUS-Wert für den Vorgang muss der Minifiltertreiber einen gültigen NTSTATUS-Fehlerwert angeben. Beachten Sie, dass Minifiltertreiber keine STATUS_FLT_DISALLOW_FAST_IO angeben können. nur der Filter-Manager kann diesen NTSTATUS-Wert verwenden.

Aufrufer von FltCancelFileOpen müssen unter IRQL <= APC_LEVEL ausgeführt werden. Ein Minifiltertreiber kann diese Routine jedoch sicher aus einer Rückrufroutine nach der Erstellung aufrufen, da für IRP_MJ_CREATE Vorgänge die Postoperation-Rückrufroutine unter IRQL = PASSIVE_LEVEL im Kontext des Threads aufgerufen wird, der den Erstellungsvorgang ausgelöst hat.