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 auszufü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 enthält, die mit der aktuellen E/A-Anforderung zusammenhängen.
[in, optional] CompletionContext
Ein Kontextzeiger, der vom Vorabrückruf 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.
Flagge | Bedeutung |
---|---|
FLTFL_POST_OPERATION_DRAINING | Der Filter-Manager legt dieses Kennzeichen fest, um anzugeben, dass die Minifiltertreiberinstanz getrennt wird und dass diese Rückrufroutine nach dem Vorgang aufgerufen wird, um den Abschlusskontext des Minifiltertreibers zu bereinigen. 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 bei IRQL <= APC_LEVEL aufgerufen. |
Rückgabewert
Diese Rückrufroutine gibt einen der folgenden Statuswerte 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 Statuswert zurückgibt, setzt der Filter-Manager die Abschlussverarbeitung des E/A-Vorgangs fort. |
|
Der Minifiltertreiber hat die Verarbeitung des Abschlusses für den E/A-Vorgang angehalten, gibt jedoch keine Kontrolle über den Vorgang an den Filter-Manager zurück.
Ein Minifiltertreiberrückruf kann diesen Statuswert nur zurückgeben, wenn der Post-Operation-Rückruf des Minifiltertreibers den E/A-Vorgang in eine Arbeitswarteschlange gepostet 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ückgegeben hat, führt der Filter-Manager keine weitere Abschlussverarbeitung des E/A-Vorgangs durch, es sei denn, beide der folgenden Bedingungen sind erfüllt:
|
|
Der Minifiltertreiber weist einen schnellen QueryOpen-Vorgang auf und erzwingt den Vorgang auf dem langsamen Pfad. Dies bewirkt, dass der E/A-Manager die Anforderung bedient, indem eine Open/Query/Close der Datei ausgeführt wird. Minifiltertreiber sollten diesen Status nur für QueryOpen zurückgeben. |
Bemerkungen
Die Rückrufroutine eines Minifiltertreibers führt die Abschlussverarbeitung für einen oder mehrere Arten von E/A-Vorgängen durch.
Rückrufroutinen nach dem Betrieb ähneln den Abschlussroutinen, die von älteren Dateisystemfiltertreibern verwendet werden.
Rückrufroutinen nach dem Vorgang werden in einem beliebigen Threadkontext bei IRQL <= DISPATCH_LEVEL aufgerufen. Da diese Rückrufroutine bei IRQL-DISPATCH_LEVEL aufgerufen werden kann, unterliegt sie den folgenden Einschränkungen:
- Es kann keine Kernelmodusroutine aufrufen, die bei einer niedrigeren IRQL ausgeführt werden muss.
- Alle in dieser Routine verwendeten Datenstrukturen müssen aus nicht seitengebundenen Pools zugeordnet werden.
- Es kann nicht seitenfähig gemacht werden.
- Ressourcen, Mutexes oder schnelle Mutexes können nicht abgerufen werden. Es kann jedoch Drehsperren erwerben.
- Kontexte können nicht abgerufen, festgelegt oder gelöscht werden, sie können jedoch Kontexte freigeben.
Jede E/A-Vervollständigungsverarbeitung, die bei IRQL ausgeführt werden muss< DISPATCH_LEVEL kann nicht direkt in der Postoperation-Rückrufroutine ausgeführt werden. Stattdessen muss sie in eine Arbeitswarteschlange gepostet werden, indem eine Routine wie FltDoCompletionProcessingWhenSafe oder FltQueueDeferredIoWorkItem-aufgerufen wird.
Beachten Sie, dass FltDoCompletionProcessingWhenSafe- nie aufgerufen werden sollte, wenn der Flags Parameter des Rückrufs nach dem Vorgang den FLTFL_POST_OPERATION_DRAINING Bitsatz aufweist. Es folgen Ausnahmen von dieser Regel:
- Wenn die Voroperationsrückrufroutine eines Minifiltertreibers FLT_PREOP_SYNCHRONIZE für einen I/O-basierten I/O-Vorgang zurückgibt, wird die entsprechende Rückrufroutine nach dem Vorgang garantiert bei IRQL <= APC_LEVEL, im gleichen Threadkontext wie der Rückruf vor dem Vorgang aufgerufen.
- Nach dem Erstellen von Rückrufroutinen wird garantiert bei IRQL-PASSIVE_LEVEL aufgerufen, im Kontext des Threads, der den IRP_MJ_CREATE-Vorgang ausgelöst hat.
Ein Minifiltertreiber registriert eine Rückrufroutine für einen bestimmten Typ von E/A-Vorgängen, indem der Einstiegspunkt der Rückrufroutine im OperationRegistration Array der FLT_REGISTRATION Struktur gespeichert wird. Der Minifiltertreiber übergibt diese Struktur als Parameter an FltRegisterFilter- in der DriverEntry Routine.
Ein Minifiltertreiber kann eine Rückrufroutine nach dem Vorgang für einen bestimmten Typ von E/A-Vorgängen registrieren, ohne eine Voroperationsrückrufroutine (PFLT_PRE_OPERATION_CALLBACK) zu registrieren und umgekehrt.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte 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 |
Header- | fltkernel.h (include FltKernel.h) |
IRQL- | Siehe Abschnitt "Hinweise" |
Siehe auch
FltCompletePendedPostOperation