Freigeben über


FltReadFileEx-Funktion (fltkernel.h)

FltReadFileEx Daten aus einer geöffneten Datei, einem Datenstrom oder einem Gerät liest. Diese Funktion erweitert FltReadFile-, um die optionale Verwendung einer MDL zum Lesen von Daten anstelle einer zugeordneten Pufferadresse zu ermöglichen.

Syntax

NTSTATUS FLTAPI FltReadFileEx(
  [in]            PFLT_INSTANCE                    InitiatingInstance,
  [in]            PFILE_OBJECT                     FileObject,
  [in, optional]  PLARGE_INTEGER                   ByteOffset,
  [in]            ULONG                            Length,
  [out]           PVOID                            Buffer,
  [in]            FLT_IO_OPERATION_FLAGS           Flags,
  [out, optional] PULONG                           BytesRead,
  [in, optional]  PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine,
  [in, optional]  PVOID                            CallbackContext,
  [in, optional]  PULONG                           Key,
  [in, optional]  PMDL                             Mdl
);

Parameter

[in] InitiatingInstance

Ein undurchsichtiger Instanzzeiger für die Minifiltertreiberinstanz, an die der Vorgang gesendet werden soll. Die Instanz muss an das Volume angefügt werden, auf dem sich die Datei befindet. Dieser Parameter ist erforderlich und darf nicht NULL sein.

[in] FileObject

Ein Zeiger auf eine FILE_OBJECT für die Datei, aus der die Daten gelesen werden sollen. Dieses Dateiobjekt muss zurzeit geöffnet sein. Das Aufrufen FltReadFileEx-, wenn das Dateiobjekt noch nicht geöffnet ist oder nicht mehr geöffnet ist (z. B. in einer Vorerstellungs- oder Nachbereinigungsrückrufroutine), bewirkt, dass das System auf einem überprüften Build ASSERT erhält. Dieser Parameter ist erforderlich und darf nicht NULL sein.

[in, optional] ByteOffset

Zeigen Sie auf eine vom Aufrufer zugewiesene Variable, die den Anfangsbyte-Offset innerhalb der Datei angibt, in der der Lesevorgang beginnen soll.

Wenn ByteOffset- angegeben wird, wird die E/A an diesem Offset ausgeführt, unabhängig vom aktuellen Wert des CurrentByteOffset Felds des Dateiobjekts.

  • Wenn die Datei für synchrone E/A geöffnet wurde (FO_SYNCHRONOUS_IO im feld Flags des Dateiobjekts festgelegt ist), kann der Aufrufer ByteOffset->LowPart- FILE_USE_FILE_POINTER_POSITION und ByteOffset->HighPart, um die E/A--1 für das CurrentByteOffset Feld des Dateiobjekts auszuführen.
  • Wenn die Datei nicht für synchrone E/A geöffnet wurde, ist die Verwendung von FILE_USE_FILE_POINTER_POSITION ein Fehler.

Wenn ByteOffset- nicht angegeben ist:

  • Wenn die Datei nicht für synchrone E/A geöffnet wurde, ist dies ein Fehler.
  • Andernfalls wird die E/A im CurrentByteOffset-des Dateiobjekts ausgeführt.

Wenn das Dateiobjekt für synchrone E/A geöffnet wurde, wird das CurrentByteOffset Feld aktualisiert, es sei denn, der Aufrufer übergibt das FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET Flag.

  • Hinweis: Das Dateisystem aktualisiert weiterhin CurrentByteOffset- in diesem Fall. Der Filter-Manager speichert den CurrentByteOffset Wert, bevor der E/A-Wert nach unten gesendet und wiederhergestellt wird, wenn der E/A-Wert zurückgegeben wird. Aus Sicht des Aufrufers von FltReadFileEx (und Filter in höheren Höhen) wird die CurrrentByteOffset nicht aktualisiert. Filter unter dem Aufrufer sehen jedoch den aktualisierten CurrentByteOffset Wert in ihren Rückrufen nach Lese-/Schreibzugriff.

Wenn das Dateiobjekt nicht für synchrone E/A geöffnet wurde, wird das feld CurrentByteOffset nicht aktualisiert, unabhängig vom Status des ByteOffset-Parameters.

[in] Length

Die Größe des Puffers, auf den der Buffer Parameter verweist, in Byte.

[out] Buffer

Ein Zeiger auf einen vom Aufrufer zugewiesenen Puffer, der die Daten empfängt, die aus der Datei gelesen werden. Wenn eine MDL in Mdlbereitgestellt wird, muss Buffer NULL sein.

[in] Flags

Eine Bitmaske von Flags, die den Typ des auszuführenden Lesevorgangs angeben.

Flagge Bedeutung
FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET Minifiltertreiber können dieses Flag festlegen, um anzugeben, dass FltReadFile- das CurrentByteOffset Feld des Dateiobjekts nicht aktualisieren soll.
FLTFL_IO_OPERATION_NON_CACHED Minifiltertreiber können dieses Flag festlegen, um einen nicht zwischengespeicherten Lesevorgang anzugeben, auch wenn das Dateiobjekt nicht mit FILE_NO_INTERMEDIATE_BUFFERING geöffnet wurde.
FLTFL_IO_OPERATION_PAGING Minifiltertreiber können dieses Kennzeichen so festlegen, dass ein Auslagerungslesevorgang angegeben wird.
FLTFL_IO_OPERATION_SYNCHRONOUS_PAGING Minifiltertreiber können dieses Kennzeichen festlegen, um ein synchrones Auslagerungs-E/A-Lesen anzugeben. Minifiltertreiber, die dieses Kennzeichen festlegen, müssen auch das FLTFL_IO_OPERATION_PAGING Flag festlegen. Verfügbar ab Windows Vista.

[out, optional] BytesRead

Ein Zeiger auf eine vom Aufrufer zugewiesene Variable, die die Anzahl der aus der Datei gelesenen Bytes empfängt. Wenn CallbackRoutine- nicht NULL ist, wird dieser Parameter ignoriert. Andernfalls ist dieser Parameter optional und kann NULL sein.

[in, optional] CallbackRoutine

Zeiger auf eine PFLT_COMPLETED_ASYNC_IO_CALLBACK-typed callback routine to call when the read operation is complete. Dieser Parameter ist optional und kann NULL sein.

[in, optional] CallbackContext

Ein Kontextzeiger, der an die CallbackRoutine übergeben werden soll, wenn vorhanden. Dieser Parameter ist optional und kann NULL sein. Wenn CallbackRoutine NULL ist, wird dieser Parameter ignoriert.

[in, optional] Key

Ein optionaler Schlüssel, der einer Bytebereichssperre zugeordnet ist.

[in, optional] Mdl

Eine optionale MDL, die den Speicher beschreibt, in dem die Daten gelesen werden. Wenn in Buffer ein Puffer bereitgestellt wird, muss Mdl NULL sein.

Rückgabewert

FltReadFileEx gibt den NTSTATUS-Wert zurück, der vom Dateisystem zurückgegeben wurde.

Bemerkungen

Ein Minifiltertreiber ruft FltReadFileEx- auf, um Daten aus einer geöffneten Datei zu lesen.

FltReadFileEx erstellt eine Leseanforderung und sendet sie an die Minifiltertreiberinstanzen, die unterhalb der initiierenden Instanz und an das Dateisystem angefügt sind. Die angegebene Instanz und die oben angefügten Instanzen erhalten nicht die Leseanforderung.

FltReadFileEx führt nicht zwischengespeicherte E/A-Vorgänge aus, wenn einer der folgenden Werte zutrifft:

  • Der Aufrufer legt das FLTFL_IO_OPERATION_NON_CACHED Flag im Flags Parameter fest.

  • Das Dateiobjekt wurde für nicht zwischengespeicherte E/A geöffnet. In der Regel erfolgt dies durch Angeben des FILE_NO_INTERMEDIATE_BUFFERING CreateOptions- Flags im vorherigen Aufruf von FltCreateFile, FltCreateFileExoder ZwCreateFile.

Bei nicht zwischengespeicherten E/A-Werten gelten die folgenden Einschränkungen für die Parameterwerte, die an FltReadFileEx-übergeben werden:

  • Der Puffer, auf den der Buffer Parameter verweist, muss entsprechend der Ausrichtungsanforderung des zugrunde liegenden Speichergeräts ausgerichtet werden. Um einen solchen ausgerichteten Puffer zuzuweisen, rufen Sie FltAllocatePoolAlignedWithTagauf.

  • Der Byte-Offset, auf den der ByteOffset Parameter verweist, muss ein nicht-negatives Vielfaches der Größe des Volumensektors sein.

  • Die im Parameter Length Parameter angegebene Länge muss ein nicht negatives Vielfaches der Größe des Volumensektors sein.

Wenn versucht wird, über das Ende der Datei hinaus zu lesen, gibt FltReadFileEx einen Fehler zurück.

Wenn der Wert des CallbackRoutine--Parameters nicht NULL ist, wird der Lesevorgang asynchron ausgeführt.

Wenn der Wert der CallbackRoutine Parameter NULL ist, wird der Lesevorgang synchron ausgeführt. Das heißt, FltReadFileEx wartet, bis der Lesevorgang abgeschlossen ist, bevor er zurückgegeben wird. Dies gilt auch, wenn das Dateiobjekt, das fileObject verweist, für asynchrone E/A geöffnet wurde.

Wenn mehrere Threads FltReadFileEx- für dasselbe Dateiobjekt aufrufen und das Dateiobjekt für synchrone E/A geöffnet wurde, versucht der Filter-Manager nicht, E/A in der Datei zu serialisieren. In dieser Hinsicht unterscheidet sich FltReadFileEx von ZwReadFile.

Der Mdl Parameter wird als Komfort bereitgestellt, wenn ein Minifilter bereits über eine MDL verfügt. Die MDL wird direkt verwendet, und der zusätzliche Schritt der Zuordnung einer Adresse für Buffer kann vermieden werden.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 8
Zielplattform- Universal
Header- fltkernel.h (include Fltkernel.h)
Library FltMgr.lib
DLL- Fltmgr.sys
IRQL- PASSIVE_LEVEL

Siehe auch

FILE_OBJECT

FltAllocatePoolAlignedWithTag-

FltCreateFile-

FltCreateFileEx

FltWriteFile-

ObReferenceObjectByHandle-

PFLT_COMPLETED_ASYNC_IO_CALLBACK

ZwCreateFile-

ZwReadFile-

ZwWriteFile-