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 |
---|---|
|
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. |
|
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 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
FltCompletePendedPostOperation