PFLT_PRE_OPERATION_CALLBACK Rückruffunktion (fltkernel.h)

Die PFLT_PRE_OPERATION_CALLBACK Routine eines Minifiltertreibers führt die Vorbetriebsverarbeitung für I/O-Vorgänge aus.

Syntax

PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;

FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
  [in, out] PFLT_CALLBACK_DATA Data,
  [in]      PCFLT_RELATED_OBJECTS FltObjects,
  [out]     PVOID *CompletionContext
)
{...}

Parameter

[in, out] Data

Ein Zeiger auf die Rückrufdatenstruktur (FLT_CALLBACK_DATA) für den I/O-Vorgang.

[in] FltObjects

Ein Zeiger auf eine FLT_RELATED_OBJECTS Struktur, die undurchsichtige Zeiger für die Objekte enthält, die sich auf die aktuelle I/O-Anforderung beziehen.

[out] CompletionContext

Wenn diese Rückrufroutine FLT_PREOP_SUCCESS_WITH_CALLBACK oder FLT_PREOP_SYNCHRONIZE zurückgibt, ist dieser Parameter ein optionaler Kontextzeiger, der an die entsprechende Rückrufroutine nach dem Vorgang übergeben werden soll. Andernfalls muss es NULL sein.

Rückgabewert

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

Rückgabecode Beschreibung
FLT_PREOP_COMPLETE Der Minifiltertreiber schließt den E/A-Vorgang ab. Der Filter-Manager sendet den I/O-Vorgang nicht an Minifiltertreiber unterhalb des Aufrufers im Treiberstapel oder an das Dateisystem. In diesem Fall ruft der Filter-Manager nur die Rückrufroutine nach dem Vorgang der Minifiltertreiber über dem Anrufer im Treiberstapel auf.
FLT_PREOP_DISALLOW_FASTIO Der Vorgang ist ein schneller I/O-Vorgang, und der Minifiltertreiber erlaubt nicht, dass der schnelle I/O-Pfad für diesen Vorgang verwendet werden kann. Der Filter-Manager sendet den schnellen E/A-Vorgang nicht an Minifiltertreiber unterhalb des Aufrufers im Treiberstapel oder an das Dateisystem. In diesem Fall ruft der Filter-Manager nur die Rückrufroutine nach dem Vorgang der Minifiltertreiber über dem Anrufer im Treiberstapel auf.
FLT_PREOP_PENDING Der Minifiltertreiber hat den E/A-Vorgang eingestiftet, und der Vorgang ist noch ausstehend. Der Filter-Manager verarbeitet den I/O-Vorgang erst weiter, wenn der Minifiltertreiber FltCompletePendedPreOperation aufruft.
FLT_PREOP_SUCCESS_NO_CALLBACK Der Minifiltertreiber gibt den I/O-Vorgang zur weiteren Verarbeitung an den Filter-Manager zurück. In diesem Fall ruft der Filter-Manager den Postoperationsrückruf des Minifiltertreibers nicht auf, falls vorhanden, während der Fertigstellung von E/A.
FLT_PREOP_SUCCESS_WITH_CALLBACK Der Minifiltertreiber gibt den I/O-Vorgang zur weiteren Verarbeitung an den Filter-Manager zurück. In diesem Fall ruft der Filter-Manager den Post-Operation-Rückruf des Minifiltertreibers während des Abschlusses von E/A auf.
FLT_PREOP_SYNCHRONIZE Der Minifiltertreiber gibt den E/A-Vorgang zur weiteren Verarbeitung an den Filter-Manager zurück, der Vorgang wird jedoch nicht abgeschlossen. In diesem Fall ruft der Filter-Manager den Postoperationsrückruf des Minifilters im Kontext des aktuellen Threads bei IRQL <= APC_LEVEL auf.
FLT_PREOP_DISALLOW_FSFILTER_IO Der Minifiltertreiber weist einen schnellen QueryOpen-Vorgang auf und erzwingt den Vorgang den langsamen Pfad. Dies bewirkt, dass der I/O-Manager die Anforderung dienstt, 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 verarbeitet mindestens einen Typ von I/O-Vorgängen. Diese Rückrufroutine ähnelt einer Verteilerroutine im Legacyfiltermodell.

Ein Minifiltertreiber registriert eine Voroperationsrückrufroutine für einen bestimmten Typ von I/O-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 seiner DriverEntry-Routine . Ein Minifiltertreiber kann eine Voroperationsrückrufroutine für einen bestimmten Typ von I/O-Vorgängen registrieren, ohne eine Rückrufroutine (PFLT_POST_OPERATION_CALLBACK) zu registrieren und umgekehrt.

Wenn diese Routine FLT_PREOP_COMPLETE zurückgibt, muss das IoStatus.Status-Feld der Rückrufdatenstruktur auf den endgültigen NTSTATUS-Wert für den I/O-Vorgang festgelegt werden. Dieser NTSTATUS-Wert kann nicht STATUS_PENDING werden. Bei einem Bereinigungs- oder Schließenvorgang muss es sich um einen anderen NTSTATUS-Wert als STATUS_PENDING sein, da Bereinigungs- und Schließenvorgänge nicht fehlschlagen können.

Wenn diese Routine FLT_PREOP_DISALLOW_FASTIO zurückgibt, sollte das IoStatus.Status-Feld der Rückrufdatenstruktur nicht festgelegt werden, da der Filter-Manager dieses Feld automatisch auf STATUS_FLT_DISALLOW_FAST_IO festlegt.

FLT_PREOP_DISALLOW_FASTIO kann nur für einen schnellen E/A-Vorgang zurückgegeben werden. Um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen schnellen I/O-Vorgang darstellt, verwenden Sie das FLT_IS_FASTIO_OPERATION Makro.

FLT_PREOP_PENDING können nur für IRP-basierte I/O-Vorgänge zurückgegeben werden, da nur IRP-basierte I/O-Vorgänge pendiert werden können. Um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten I/O-Vorgang darstellt, verwenden Sie das FLT_IS_IRP_OPERATION-Makro .

Wenn die Rückrufroutine eines Minifiltertreibers FLT_PREOP_SYNCHRONIZE zurückgibt, muss der Minifiltertreiber einen entsprechenden Rückruf nach dem Vorgang registriert haben.

FLT_PREOP_SYNCHRONIZE sollten nur für IRP-basierte I/O-Vorgänge zurückgegeben werden. Wenn sie für einen I/O-Vorgang zurückgegeben wird, der kein IRP-basierter Vorgang ist, behandelt der Filter-Manager diesen Rückgabewert wie FLT_PREOP_SUCCESS_WITH_CALLBACK.

Minifiltertreiber sollten nicht FLT_PREOP_SYNCHRONIZE für Erstellungsvorgänge zurückgeben, da diese Vorgänge bereits vom Filter-Manager synchronisiert werden.

Minifiltertreiber dürfen niemals FLT_PREOP_SYNCHRONIZE für asynchrone Lese- und Schreibvorgänge zurückgeben. Dies kann sowohl den Minifiltertreiber als auch die Systemleistung erheblich beeinträchtigen.

Die Rückrufroutine eines Minifiltertreibers oder eine Rückrufroutine nach dem Vorgang kann den Inhalt der Rückrufdatenstruktur für den Vorgang ändern. Wenn dies der Fall ist, muss es fltSetCallbackDataDirty aufrufen, es sei denn, er hat den Inhalt des IoStatus-Felds der Rückrufdatenstruktur geändert.

Die IRQL für diese generische Rückrufroutine hängt von den spezifischen IO-Pfaden ab.

Dateisysteme runden Schreib- und Lesevorgänge am Ende der Datei bis zu einem Vielfachen der Sektorgröße des zugrunde liegenden Dateispeichergeräts ab. Beim Verarbeiten von Vor- oder Vorschreibvorgängen müssen Filter, die Puffer zuweisen und austauschen, die Größe eines zugewiesenen Puffers auf ein Vielfaches der Sektorgröße des zugehörigen Geräts runden. Wenn dies nicht der Grund ist, überschreitet die Länge der vom zugrunde liegenden Dateisystem übertragenen Daten die zugewiesene Länge des Puffers. Weitere Informationen zum Swappingpuffer finden Sie im SwapBuffers Minifilter-Beispiel.

Ab Windows 8 verwendet CompletionContext die Flt_CompletionContext_Outptr Anmerkung, die gültige Kontextwerte basierend auf dem Vorgangsergebnis definiert. Nachfolgend sehen Sie ein Verwendungsbeispiel für den Rückruf mit der Anmerkung für "CompletionContext".

FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    );


Anforderungen

   
Unterstützte Mindestversion (Client) Microsoft Windows 2000 Updaterollup 1 für SP4, Windows XP SP2, Windows Server 2003 SP1 und höher Windows-Betriebssysteme.
Zielplattform Power BI Desktop
Header fltkernel.h (include FltKernel.h)
IRQL 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

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_POST_OPERATION_CALLBACK

Flt_CompletionContext_Outptr