Ausstehend eines E/A-Vorgangs in einer Rückrufroutine vor der Operation

Die Rückrufroutine eines Minifiltertreibers vor der Operation kann einen E/A-Vorgang schreiben, indem der Vorgang in eine Systemarbeitswarteschlange geschrieben und FLT_PREOP_PENDING zurückgegeben wird. Das Zurückgeben dieses status Werts gibt an, dass der Minifiltertreiber die Kontrolle über den E/A-Vorgang behält, bis er FltCompletePendedPreOperation aufruft, um die Verarbeitung für den E/A-Vorgang fortzusetzen.

Die Voroperationsrückrufroutine eines Minifiltertreibers führt einen E/A-Vorgang aus, indem die folgenden Schritte ausgeführt werden:

  1. Posten des E/A-Vorgangs in einer Systemarbeitswarteschlange durch Aufrufen einer Routine wie FltQueueDeferredIoWorkItem.

  2. Gibt FLT_PREOP_PENDING zurück.

Ein Minifiltertreiber, der alle (oder die meisten) eingehenden E/A-Vorgänge auflisten muss, sollte keine Routinen wie FltQueueDeferredIoWorkItem für Pend-Vorgänge verwenden, da das Aufrufen dieser Routine dazu führen kann, dass die Arbeitswarteschlangen des Systems überflutet werden. Stattdessen sollte ein solcher Minifiltertreiber eine abbruchsichere Warteschlange verwenden. Weitere Informationen zur Verwendung von abbruchsicheren Warteschlangen finden Sie unter FltCbdqInitialize.

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.

Wenn die Rückrufroutine des Minifiltertreibers vor der Operation FLT_PREOP_PENDING zurückgibt, muss sie NULL im CompletionContext-Ausgabeparameter zurückgeben.

Ein Minifiltertreiber kann FLT_PREOP_PENDING nur für IRP-basierte E/A-Vorgänge zurückgeben. Verwenden Sie das Makro FLT_IS_IRP_OPERATION , um zu bestimmen, ob es sich bei einem Vorgang um einen IRP-basierten E/A-Vorgang handelt.

Die Arbeitsroutine, die den E/A-Vorgang entfernt und verarbeitet, muss FltCompletePendedPreOperation aufrufen, um die Verarbeitung für den Vorgang fortzusetzen.