PFLT_PRE_OPERATION_CALLBACK Rückruffunktion (fltkernel.h)
Die PFLT_PRE_OPERATION_CALLBACK-Routine eines Minifiltertreibers führt die Verarbeitung vor dem Vorgang für E/A-Vorgänge durch.
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 E/A-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 E/A-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 Minifilter schließt den E/A-Vorgang ab. Einzelheiten finden Sie in den Hinweisen. |
FLT_PREOP_DISALLOW_FASTIO | Der Vorgang ist ein schneller E/A-Vorgang, und der Minifilter lässt die Verwendung des schnellen E/A-Pfads für diesen Vorgang nicht zu. Einzelheiten finden Sie in den Hinweisen. |
FLT_PREOP_PENDING | Der Minifilter hat den E/A-Vorgang mit einem Stift versehen, und der Vorgang ist noch ausstehend. Einzelheiten finden Sie in den Hinweisen. |
FLT_PREOP_SUCCESS_NO_CALLBACK | Der Minifilter gibt den E/A-Vorgang zur weiteren Verarbeitung an FltMgr zurück. In diesem Fall ruft FltMgr den Rückruf nach dem Vorgang des Minifiltertreibers während des E/A-Abschlusses nicht auf, sofern vorhanden. |
FLT_PREOP_SUCCESS_WITH_CALLBACK | Der Minifilter gibt den E/A-Vorgang zur weiteren Verarbeitung an FltMgr zurück. In diesem Fall ruft FltMgr den Rückruf nach dem Vorgang des Minifilters während des E/A-Abschlusses auf. |
FLT_PREOP_SYNCHRONIZE | Der Minifilter gibt den E/A-Vorgang zur weiteren Verarbeitung an FltMgr zurück, schließt den Vorgang jedoch nicht ab. Einzelheiten finden Sie in den Hinweisen. |
FLT_PREOP_DISALLOW_FSFILTER_IO | Der Minifilter lässt einen schnellen QueryOpen-Vorgang nicht zu und erzwingt den Vorgang auf dem 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
Weitere Informationen finden Sie unter Schreiben von Rückrufroutinen vor dem Vorgang .
Die Rückrufroutine eines Minifilters vor dem Vorgang verarbeitet mindestens einen Typ von E/A-Vorgängen. (Diese Rückrufroutine ähnelt einer Dispatchroutine im Legacyfiltermodell.)
Ein Minifilter registriert eine Rückrufroutine vor dem Vorgang für einen bestimmten E/A-Vorgangstyp, indem der Einstiegspunkt der Rückrufroutine im OperationRegistration-Array der FLT_REGISTRATION-Struktur gespeichert wird. Der Minifilter übergibt diese Struktur als Parameter an FltRegisterFilter in seiner DriverEntry-Routine . Ein Minifilter kann eine Rückrufroutine vor dem Vorgang für einen bestimmten E/A-Vorgangstyp registrieren, ohne eine Rückrufroutine nach dem Vorgang (PFLT_POST_OPERATION_CALLBACK) zu registrieren und umgekehrt.
Die Rückrufroutine eines Minifiltertreibers vor oder nach dem Vorgang kann den Inhalt der Rückrufdatenstruktur für den Vorgang ändern. Wenn dies der Fall ist, muss fltSetCallbackDataDirty aufgerufen werden, es sei denn, der Inhalt des IoStatus-Felds der Rückrufdatenstruktur wurde geändert.
Die IRQL für diese generische Rückrufroutine hängt von ihren spezifischen E/A-Pfaden ab. Sie können KeGetCurrentIRQL schnell und kostengünstig aufrufen, wenn Sie die aktuelle IRQL kennen müssen. Weitere Informationen zu IRQL finden Sie unter Schreiben von Rückrufroutinen vor dem Vorgang .
Dateisysteme runden Schreib- und Lesevorgänge am Ende der Datei auf ein Vielfaches der Sektorgröße des zugrunde liegenden Dateispeichergeräts auf. Bei der Verarbeitung von Vorlese- oder Vorschreibvorgängen müssen Filter, die Puffer zuordnen und austauschen, die Größe eines zugeordneten Puffers auf ein Vielfaches der Sektorgröße des zugeordneten Geräts runden. Andernfalls überschreitet die Länge der vom zugrunde liegenden Dateisystem übertragenen Daten die zugeordnete Länge des Puffers. Weitere Informationen zum Austauschen von Puffern finden Sie im SwapBuffers-Minifilterbeispiel.
Ab Windows 8 verwendet CompletionContext die anmerkung Flt_CompletionContext_Outptr, die gültige Kontextwerte basierend auf dem Vorgangsergebnis definiert. Im Folgenden finden 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
);
Zurückgeben von FLT_PREOP_COMPLETE
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 E/A-Vorgang festgelegt werden. Dieser NTSTATUS-Wert kann nicht STATUS_PENDING werden. Für einen Bereinigungs- oder Schließvorgang muss es sich um einen anderen NTSTATUS-Erfolgswert als STATUS_PENDING, da Bereinigungs- und Schließenvorgänge nicht fehlschlagen können.
Wenn diese Routine FLT_PREOP_COMPLETE zurückgibt, sendet FltMgr den E/A-Vorgang nicht an Minifiltertreiber unterhalb des Aufrufers im Treiberstapel oder an das Dateisystem. In diesem Fall ruft FltMgr nur die Rückrufroutinen nach dem Vorgang der Minifiltertreiber über dem Aufrufer im Treiberstapel auf.
Zurückgeben von FLT_PREOP_DISALLOW_FASTIO
Wenn diese Routine FLT_PREOP_DISALLOW_FASTIO zurückgibt, sollte das IoStatus.Status-Feld der Rückrufdatenstruktur nicht festgelegt werden, da FltMgr 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. Verwenden Sie das Makro FLT_IS_FASTIO_OPERATION , um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen schnellen E/A-Vorgang darstellt.
Wenn diese Routine FLT_PREOP_DISALLOW_FASTIO zurückgibt, sendet FltMgr den schnellen E/A-Vorgang nicht an Minifiltertreiber unterhalb des Aufrufers im Treiberstapel oder an das Dateisystem. In diesem Fall ruft FltMgr nur die Rückrufroutinen nach dem Vorgang der Minifiltertreiber über dem Aufrufer im Treiberstapel auf.
Zurückgeben von FLT_PREOP_PENDING
FLT_PREOP_PENDING kann nur für IRP-basierte E/A-Vorgänge zurückgegeben werden, da nur IRP-basierte E/A-Vorgänge geschrieben werden können. Verwenden Sie das Makro FLT_IS_IRP_OPERATION , um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten E/A-Vorgang darstellt.
Wenn diese Routine FLT_PREOP_PENDING zurückgibt, verarbeitet FltMgr den E/A-Vorgang erst weiter, wenn der Minifiltertreiber FltCompletePendedPreOperation aufruft.
Zurückgeben von FLT_PREOP_SYNCHRONIZE
Wenn die Rückrufroutine eines Minifilters vor dem Vorgang FLT_PREOP_SYNCHRONIZE zurückgibt, muss der Minifilter einen entsprechenden Rückruf nach dem Vorgang registriert haben. Wenn diese Routine FLT_PREOP_SYNCHRONIZE zurückgibt, ruft FltMgr den Rückruf nach dem Vorgang des Minifilters im Kontext des aktuellen Threads unter IRQL <= APC_LEVEL auf.
FLT_PREOP_SYNCHRONIZE sollte nur für IRP-basierte E/A-Vorgänge zurückgegeben werden. Wenn er für einen E/A-Vorgang zurückgegeben wird, bei dem es sich nicht um einen IRP-basierten Vorgang handelt, behandelt FltMgr diesen Rückgabewert so, als wäre er FLT_PREOP_SUCCESS_WITH_CALLBACK.
Minifiltertreiber sollten keine FLT_PREOP_SYNCHRONIZE für Erstellungsvorgänge zurückgeben, da diese Vorgänge bereits von FltMgr synchronisiert werden.
Minifilter dürfen niemals FLT_PREOP_SYNCHRONIZE für asynchrone Lese- und Schreibvorgänge zurückgeben. Dies kann sowohl die Leistung des Minifiltertreibers als auch des Systems erheblich beeinträchtigen.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | 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" |