MmAdvanceMdl-Funktion (wdm.h)
Die MmAdvanceMdl Routine führt den Anfang des virtuellen Speicherbereichs einer MDL um die angegebene Anzahl von Bytes weiter.
NTSTATUS MmAdvanceMdl(
[in, out] PMDL Mdl,
[in] ULONG NumberOfBytes
);
[in, out] Mdl
Gibt die MDL an, die voranschreiten soll.
[in] NumberOfBytes
Gibt die Anzahl der Bytes an, um den Anfang der MDL vorauszuschreiten.
MmAdvanceMdl gibt einen NTSTATUS-Code zurück. Zu den möglichen Rückgabewerten gehören:
Rückgabecode | Beschreibung |
---|---|
|
Die Routine hat den Anfang der MDL erfolgreich erweitert. |
|
Der Aufrufer hat versucht, den Anfang der MDL über das Ende zu wechseln. |
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.
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 |