Auf Englisch lesen

Teilen über


MmAdvanceMdl-Funktion (wdm.h)

Die MmAdvanceMdl Routine führt den Anfang des virtuellen Speicherbereichs einer MDL um die angegebene Anzahl von Bytes weiter.

Syntax

C++
NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

Parameter

[in, out] Mdl

Gibt die MDL an, die voranschreiten soll.

[in] NumberOfBytes

Gibt die Anzahl der Bytes an, um den Anfang der MDL vorauszuschreiten.

Rückgabewert

MmAdvanceMdl gibt einen NTSTATUS-Code zurück. Zu den möglichen Rückgabewerten gehören:

Rückgabecode Beschreibung
STATUS_SUCCESS
Die Routine hat den Anfang der MDL erfolgreich erweitert.
STATUS_INVALID_PARAMETER_2
Der Aufrufer hat versucht, den Anfang der MDL über das Ende zu wechseln.

Bemerkungen

MmAdvanceMdl nur den Anfang des Adressbereichs des virtuellen Speichers voranschreitet. Die Endadresse bleibt gleich, und die Länge des Bereichs wird entsprechend verkrumpft.

Ein Treiber auf höherer Ebene kann MmAdvanceMdl unter Bedingungen mit geringem Arbeitsspeicher verwenden, wenn ein Treiber auf niedriger Ebene nur teilweise eine Lese-/Schreibanforderung abschließen kann. Der Treiber auf höherer Ebene kann MmAdvanceMdl- verwenden, um den Bereits gelesenen oder geschriebenen Teil des Puffers zu übersteigen und dann das IRP erneut aufzufordern, um die Anforderung abzuschließen. (Der Fahrer kann diesen Vorgang natürlich so oft wie nötig wiederholen.)

Wenn MmAdvanceMdl voranschreitet, werden alle Seiten, die mmAdvanceMdl übergeben, sofort entsperrt, und die virtuelle Systemadresse, die die MDL und die Benutzeradresse zuordnet, werden ebenfalls angepasst.

Die Verwendung von MmAdvanceMdl kann die Systemleistung verlangsamen. Sie darf nur verwendet werden, wenn alle folgenden Bedingungen enthalten sind:

  • Der höhere Treiber kann in seiner eigenen E/A-Verarbeitung nur bestimmte E/A-Anforderungen nach der Übertragung einer festen Datenmenge ausführen, aber der Treiber auf niedrigerer Ebene überträgt nur Daten in kleineren Mengen. (Ein Beispiel ist ein Netzwerktransporttreiber für die SPX- oder NBT-Protokolle. Jedes Protokoll unterstützt zuverlässige Nachrichtenübergabe für Nachrichten, die größer als ein Ethernet-Frame sind. Der Transporttreiber kann nur eine Leseanforderung für eine solche Nachricht abschließen, sobald sie die Nachricht aus mehreren Ethernet-Frames neu zusammengesetzt hat.)
  • Der Treiber auf höherer Ebene hat bereits versucht und konnte keine neue MDL zuordnen, um ein Datenfragment aus einer unvollständigen E/A-Anforderung zu übertragen. (Wenn der Treiber erfolgreich eine neue MDL zuweisen kann, muss er diese MDL und IoBuildPartialMdl verwenden, um die E/A-Anforderung anstelle von MmAdvanceMdlauszuführen.)
  • Der Treiber auf höherer Ebene muss auch unter geringen Arbeitsspeicherbedingungen weiterhin fortschritten.
Treiber, die diese Bedingungen nicht erfüllen, müssen stattdessen die IoBuildPartialMdl Routine verwenden, um teilweise erfolgreiche E/A-Vorgänge auszuführen.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Verfügbar in Windows XP und höheren Versionen von Windows.
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <=DISPATCH_LEVEL

Siehe auch

IoBuildPartialMdl-