PFLT_POST_OPERATION_CALLBACK Rückruffunktion (fltkernel.h)

Ein Minifiltertreiber kann eine oder mehrere Routinen vom Typ PFLT_POST_OPERATION_CALLBACK registrieren, um die Abschlussverarbeitung für E/A-Vorgänge durchzuführen.

Syntax

PFLT_POST_OPERATION_CALLBACK PfltPostOperationCallback;

FLT_POSTOP_CALLBACK_STATUS PfltPostOperationCallback(
  [in, out]      PFLT_CALLBACK_DATA Data,
  [in]           PCFLT_RELATED_OBJECTS FltObjects,
  [in, optional] PVOID CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS Flags
)
{...}

Parameter

[in, out] Data

Ein Zeiger auf die Rückrufdaten FLT_CALLBACK_DATA Struktur für den E/A-Vorgang.

[in] FltObjects

Ein Zeiger auf einen Filter-Manager , der FLT_RELATED_OBJECTS Struktur verwaltet wird, die undurchsichtige Zeiger für die Objekte im Zusammenhang mit der aktuellen E/A-Anforderung enthält.

[in, optional] CompletionContext

Ein Kontextzeiger, der vom Rückruf vor dem Vorgang des Minifiltertreibers PFLT_PRE_OPERATION_CALLBACK-Routine zurückgegeben wurde. Der CompletionContext-Zeiger bietet eine Möglichkeit, Informationen aus der Rückrufroutine vor dem Vorgang an die Rückrufroutine nach dem Vorgang zu übermitteln.

[in] Flags

Eine Bitmaske von Flags, die angibt, wie der Rückruf nach dem Vorgang ausgeführt werden soll.

Flag Bedeutung
FLTFL_POST_OPERATION_DRAINING Der Filter-Manager legt dieses Flag fest, um anzugeben, dass der Minifiltertreiber instance getrennt wird und dass diese Rückrufroutine nach dem Vorgang aufgerufen wird, um den Abschlusskontext des Minifiltertreibers zu sauber. Der Rückruf nach dem Vorgang sollte FLT_POSTOP_FINISHED_PROCESSING zurückgeben. Wenn dieses Flag festgelegt ist, verweist der Data-Parameter auf eine Kopie der ursprünglichen Rückrufdatenstruktur für den Vorgang, nicht auf die ursprüngliche Rückrufdatenstruktur. Wenn dieses Flag festgelegt ist, wird die Rückrufroutine nach dem Vorgang unter IRQL <= APC_LEVEL aufgerufen.

Rückgabewert

Diese Rückrufroutine gibt einen der folgenden status Werte zurück:

Rückgabecode Beschreibung
FLT_POSTOP_FINISHED_PROCESSING
Der Minifiltertreiber hat die Abschlussverarbeitung für den E/A-Vorgang abgeschlossen und gibt die Steuerung des Vorgangs an den Filter-Manager zurück.

Nachdem der Rückruf nach dem Vorgang diesen status Wert zurückgibt, setzt der Filter-Manager die Abschlussverarbeitung des E/A-Vorgangs fort.

FLT_POSTOP_MORE_PROCESSING_REQUIRED
Der Minifiltertreiber hat die Abschlussverarbeitung für den E/A-Vorgang angehalten, gibt jedoch keine Steuerung des Vorgangs an den Filter-Manager zurück.

Der Rückruf eines Minifiltertreibers nach dem Vorgang kann diesen status Wert nur zurückgeben, wenn der Rückruf des Minifiltertreibers nach dem Vorgang den E/A-Vorgang an eine Arbeitswarteschlange gesendet hat. Der Minifiltertreiber muss schließlich die Abschlussverarbeitung des E/A-Vorgangs fortsetzen.

Nachdem der Rückruf nach dem Vorgang FLT_POSTOP_MORE_PROCESSING_REQUIRED zurückgibt, führt der Filter-Manager keine weitere Abschlussverarbeitung des E/A-Vorgangs durch, es sei denn, die beiden folgenden Bedingungen sind erfüllt:

  • Der Rückruf nach dem Vorgang hat den E/A-Vorgang an eine Arbeitswarteschlange gesendet.
  • Nachdem die Arbeitsroutine die Abschlussverarbeitung für den Vorgang ausgeführt hat, ruft sie FltCompletePendedPostOperation auf, um die Steuerung des Vorgangs an den Filter-Manager zurückzugeben.
Dieser status Wert kann nur für IRP-basierte E/A-Vorgänge zurückgegeben werden. Verwenden Sie das Makro FLT_IS_IRP_OPERATION , um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten E/A-Vorgang darstellt.
FLT_POSTOP_DISALLOW_FSFILTER_IO
Der Minifiltertreiber lässt keinen schnellen QueryOpen-Vorgang zu und erzwingt den Vorgang auf den langsamen Pfad. Dies bewirkt, dass der E/A-Manager die Anforderung verarbeitet, indem er ein Öffnen/Abfragen/Schließen der Datei ausführt. Minifiltertreiber sollten nur diese status für QueryOpen zurückgeben.

Hinweise

Die Rückrufroutine eines Minifiltertreibers nach dem Vorgang führt die Abschlussverarbeitung für einen oder mehrere E/A-Vorgänge aus.

Rückrufroutinen nach dem Betrieb ähneln den Vervollständigungsroutinen, die von Legacy-Dateisystemfiltertreibern verwendet werden.

Rückrufroutinen nach dem Vorgang werden in einem beliebigen Threadkontext unter IRQL <= DISPATCH_LEVEL aufgerufen. Da diese Rückrufroutine unter IRQL DISPATCH_LEVEL aufgerufen werden kann, unterliegt sie den folgenden Einschränkungen:

  • Es kann keine Kernelmodusroutine, die unter einem niedrigeren IRQL ausgeführt werden muss, sicher aufrufen.
  • Alle datenstrukturen, die in dieser Routine verwendet werden, müssen aus einem nicht auslagerten Pool zugeordnet werden.
  • Es kann nicht als ausgelagert werden.
  • Es kann keine Ressourcen, Mutexe oder schnelle Mutexe abrufen. Es kann jedoch Drehsperren erwerben.
  • Kontexte können nicht abgerufen, festgelegt oder gelöscht werden, aber Kontexte können freigegeben werden.

Alle E/A-Vervollständigungsverarbeitungen, die am IRQL-DISPATCH_LEVEL < ausgeführt werden müssen, können nicht direkt in der Rückrufroutine nach der Operation ausgeführt werden. Stattdessen muss es in einer Arbeitswarteschlange bereitgestellt werden, indem eine Routine wie FltDoCompletionProcessingWhenSafe oder FltQueueDeferredIoWorkItem aufgerufen wird.

Beachten Sie, dass FltDoCompletionProcessingWhenSafe niemals aufgerufen werden sollte, wenn für den Flags-Parameter des Rückrufs nach dem Vorgang das FLTFL_POST_OPERATION_DRAINING Bit festgelegt ist. Die folgenden Ausnahmen gelten für diese Regel:

  • Wenn die Rückrufroutine eines Minifiltertreibers vor dem Vorgang FLT_PREOP_SYNCHRONIZE für einen IRP-basierten E/A-Vorgang zurückgibt, wird die entsprechende Rückrufroutine nach dem Vorgang garantiert unter IRQL <= APC_LEVEL im gleichen Threadkontext wie der Rückruf vor dem Vorgang aufgerufen.
  • Rückrufroutinen nach der Erstellung werden garantiert am IRQL-PASSIVE_LEVEL im Kontext des Threads aufgerufen, der den IRP_MJ_CREATE-Vorgangs ausgelöst hat.

Ein Minifiltertreiber registriert eine Rückrufroutine nach dem Vorgang für einen bestimmten E/A-Vorgangstyp, indem er den Einstiegspunkt der Rückrufroutine im OperationRegistration-Array der FLT_REGISTRATION-Struktur speichert. Der Minifiltertreiber übergibt diese Struktur als Parameter an FltRegisterFilter in seiner DriverEntry-Routine .

Ein Minifiltertreiber kann eine Rückrufroutine nach dem Vorgang für einen bestimmten E/A-Vorgang registrieren, ohne eine PFLT_PRE_OPERATION_CALLBACK-Routine (Pre-Operation Callback) zu registrieren und umgekehrt.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar in Microsoft Windows 2000 Update Rollup 1 für SP4, Windows XP SP2, Windows Server 2003 SP1 und höher Windows-Betriebssysteme.
Zielplattform Desktop
Kopfzeile fltkernel.h (fltKernel.h einschließen)
IRQL Siehe Abschnitt "Hinweise"

Weitere Informationen

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCancelFileOpen

FltCompletePendedPostOperation

FltDoCompletionProcessingWhenSafe

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_PRE_OPERATION_CALLBACK