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 |