Freigeben über


FsRtlMdlReadEx-Funktion (ntifs.h)

Die FsRtlMdlReadEx-Routine führt einen schnellen zwischengespeicherten MDL-Lesevorgang aus. Wenn die angeforderten Daten nicht zwischengespeichert werden, wird die Routine zu einem IRP-basierten MDL-Lesevorgang zurückgesetzt.

Syntax

NTSTATUS FsRtlMdlReadEx(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  ULONG            LockKey,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

Parameter

[in] FileObject

Ein Zeiger auf das Dateiobjekt.

[in] FileOffset

Ein Zeiger auf eine Variable, der den Anfangsbyteoffset in der zwischengespeicherten Datei angibt, die die Daten enthält.

[in] Length

Die Länge der Daten in Bytes, die aus dem Cache gelesen werden sollen.

[in] LockKey

Ein Wert, der dem zu sperrenden Bytebereich zugeordnet ist. Wenn der zu sperrende Bereich einen anderen Bereich überschneidet, der bereits mit einer nicht exklusiven Sperre gesperrt ist, oder wenn der zu lesende Bereich ein Unterbereich eines anderen Bereichs ist, der bereits nicht endgültig gesperrt ist, muss der Wert in diesem Parameter der Schlüssel für diese nicht exklusive Sperre sein. Die Sperre muss vom übergeordneten Prozess des aufrufenden Threads gehalten werden. Andernfalls hat dieser Parameter keine Auswirkung.

[out] MdlChain

Eine Adresse einer Variablen, die einen Zeiger auf eine verknüpfte Liste von Speicherdeskriptorlisten (MdLs) empfängt. MdlChain muss vor dem Aufruf von FsRtlMdlReadEx in NULL initialisiert werden.

[out] IoStatus

Ein Zeiger auf eine IO_STATUS_BLOCK-Struktur, die bei der Ausgabe die status der Übertragung enthält. Wenn der Vorgang erfolgreich ist, wird IoStatus.Status auf STATUS_SUCCESS festgelegt. Andernfalls wird ein entsprechender NTSTATUS-Fehlercode festgelegt. IoStatus.Information ist auf die tatsächliche Anzahl von Bytes festgelegt, die die Routine erfolgreich gesperrt hat.

Rückgabewert

FsRtlMdlReadEx gibt STATUS_SUCCESS oder einen entsprechenden NTSTATUS-Wert zurück, z. B. einen der folgenden:

Rückgabecode Beschreibung
STATUS_INSUFFICIENT_RESOURCES Die IRP für einen IRP-basierten Lesevorgang konnte nicht zugeordnet werden.

Hinweise

Wenn schnelle E/A über das Dateisystem verfügbar ist, umgeht die FsRtlMdlReadEx-Routine den üblichen IRP-Lesemechanismus und gibt eine verknüpfte Liste von Speicherdeskriptorlisten (MDL) zurück, die der Aufrufer verwenden kann, um direkt auf die zwischengespeicherten Dateidaten zuzugreifen. Dieser Vorgang kopiert oder puffert keine Daten und ist daher viel schneller als ein normaler Lesevorgang. Wenn die schnelle E/A nicht aktiviert ist, generiert FsRtlMdlReadEx einen synchronen IRP-basierten MDL-Lesevorgang und gibt die MDLs aus der Anforderung zurück.

Die von den MDLs beschriebenen Seiten sind im Arbeitsspeicher gesperrt, aber nicht im Systembereich zugeordnet. Der Aufrufer kann diese Zuordnung durch Aufrufen von MmGetSystemAddressForMdlSafe ausführen.

Ähnlich wie CcMdlRead sperrt die FsRtlMdlReadEx-Routine die Seiten, die die zwischengespeicherten Dateidaten enthalten, um zu verhindern, dass das System diese Seiten in die Seitendatei austauscht. Die Seiten bleiben im Arbeitsspeicher gesperrt, bis der Aufrufer die CcMdlReadComplete-Routine aufruft .

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 8
Zielplattform Universell
Header ntifs.h (include Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

Weitere Informationen

CcMdlRead

CcMdlReadComplete

IO_STATUS_BLOCK

MmGetSystemAddressForMdlSafe