Ausstehen eines E/A-Vorgangs in einer Postoperation-Rückrufroutine

Die Rückrufroutine eines Minifiltertreibers nach der Operation kann einen E/A-Vorgang durch Ausführen der folgenden Schritte ausführen:

  1. Aufrufen von FltAllocateDeferredIoWorkItem , um ein Arbeitselement für den E/A-Vorgang zuzuweisen.

  2. Aufrufen von FltQueueDeferredIoWorkItem , um den E/A-Vorgang in einer Systemarbeitswarteschlange zu posten.

  3. Gibt FLT_POSTOP_MORE_PROCESSING_REQUIRED zurück.

Beachten Sie, dass beim Aufruf von FltQueueDeferredIoWorkItem ein Fehler auftritt, wenn eine der folgenden Bedingungen zutrifft:

  • Der Vorgang ist kein IRP-basierter E/A-Vorgang.

  • Der Vorgang ist ein Paging-E/A-Vorgang.

  • Das TopLevelIrp-Feld des aktuellen Threads ist nicht NULL. (Weitere Informationen zum Ermitteln des Werts dieses Felds finden Sie unter IoGetTopLevelIrp.)

  • Das Ziel instance für den E/A-Vorgang wird abgerissen. (Der Filter-Manager gibt diese Situation an, indem er das flag FLTFL_POST_OPERATION_DRAINING im Eingabeparameter Flags auf die Rückrufroutine nach der Operation festlegt.)

Minifiltertreiber müssen darauf vorbereitet sein, diesen Fehler zu behandeln. Wenn Ihr Minifiltertreiber solche Fehler nicht verarbeiten kann, sollten Sie die unter Zurückgeben von FLT_PREOP_SYNCHRONIZE beschriebene Technik verwenden, anstatt den E/A-Vorgang auszusetzen.

Nachdem die Rückrufroutine des Minifiltertreibers nach der Operation FLT_POSTOP_MORE_PROCESSING_REQUIRED zurückgegeben hat, führt der Filter-Manager keine weitere Vervollständigungsverarbeitung für den E/A-Vorgang durch, bis die Arbeitsroutine des Minifiltertreibers FltCompletePendedPostOperation aufruft , um die Steuerung des Vorgangs an den Filter-Manager zurückzugeben. Der Filter-Manager führt in dieser Situation keine weitere Verarbeitung aus, selbst wenn die Arbeitsroutine im Feld IoStatus.Status der Rückrufdatenstruktur für den Vorgang einen NTSTATUS-Fehlerwert festlegt.

Die Arbeitsroutine, die die Vervollständigungsverarbeitung für den E/A-Vorgang entfernt und ausführt, muss FltCompletePendedPostOperation aufrufen, um die Steuerung des Vorgangs an den Filter-Manager zurückzugeben.