MmAdvanceMdl-Funktion (wdm.h)

Die MmAdvanceMdl-Routine erweitert den Anfang des virtuellen Arbeitsspeicherbereichs einer MDL um die angegebene Anzahl von Bytes.

Syntax

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

Parameter

[in, out] Mdl

Gibt die MDL an, die erweitert werden soll.

[in] NumberOfBytes

Gibt die Anzahl der Bytes an, die am Anfang der MDL voranschreiten sollen.

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 vorangetrieben.
STATUS_INVALID_PARAMETER_2
Der Aufrufer hat versucht, den Anfang der MDL über das Ende zu führen.

Hinweise

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

Ein Treiber auf höherer Ebene kann MmAdvanceMdl unter Bedingungen mit geringem Arbeitsspeicher verwenden, wenn ein Treiber auf niedrigerer Ebene eine Lese-/Schreibanforderung nur teilweise abschließen kann. Der Treiber der höheren Ebene kann MmAdvanceMdl verwenden, um den Teil des Puffers zu übersteigen, der bereits gelesen oder geschrieben wurde, und dann den IRP erneut ausstellen, um die Anforderung abzuschließen. (Der Treiber kann diesen Vorgang natürlich so oft wie nötig wiederholen.)

Wenn MmAdvanceMdl die erste Seite überschreitet, werden alle Seiten, die MmAdvanceMdl übergeben hat, sofort entsperrt, und die virtuelle Systemadresse, die die MDL und die Benutzeradresse ordnet, wird ebenfalls angepasst.

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

  • Der Treiber auf höherer Ebene kann in seiner eigenen E/A-Behandlung bestimmte E/A-Anforderungen nur nach der Übertragung einer festen Datenmenge abschließen, aber der Treiber auf niedrigerer Ebene überträgt Daten nur in kleineren Mengen. (Ein Beispiel ist ein Netzwerktransporttreiber für das SPX- oder NBT-Protokoll. Jedes Protokoll unterstützt die zuverlässige Nachrichtenübergabe für Nachrichten, die größer als einen Ethernet-Frame sind. Der Transporttreiber kann eine Leseanforderung für eine solche Nachricht erst abschließen, nachdem er die Nachricht aus mehreren Ethernet-Frames neu zusammengesetzt hat.)
  • Der Treiber auf höherer Ebene hat bereits versucht, eine neue MDL zuzuweisen, um ein Datenfragment aus einer unvollständigen E/A-Anforderung zu übertragen. (Wenn es dem Treiber gelingt, eine neue MDL zuzuweisen, muss er diese MDL und IoBuildPartialMdl verwenden, um die E/A-Anforderung anstelle von MmAdvanceMdl auszuführen.)
  • Der Treiber auf höherer Ebene muss auch bei geringem Arbeitsspeicher weiterhin Fortschritte machen.
Treiber, die diese Bedingungen nicht erfüllen, müssen stattdessen die IoBuildPartialMdl-Routine verwenden, um alle teilweise erfolgreichen E/A-Vorgänge abzuschließen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar in Windows XP und höheren Versionen von Windows.
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

Weitere Informationen

IoBuildPartialMdl