Freigeben über


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
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 Statuswert zurückgibt, setzt der Filter-Manager die Abschlussverarbeitung des E/A-Vorgangs fort.

FLT_POSTOP_MORE_PROCESSING_REQUIRED
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 Rückruf nach dem Vorgang hat den E/A-Vorgang in eine Arbeitswarteschlange gepostet.
  • 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 Statuswert kann nur für IRP-basierte E/A-Vorgänge zurückgegeben werden. Um festzustellen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten E/A-Vorgang darstellt, verwenden Sie das FLT_IS_IRP_OPERATION Makro.
FLT_POSTOP_DISALLOW_FSFILTER_IO
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

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