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 |
---|---|
|
Die Routine hat den Anfang der MDL erfolgreich vorangetrieben. |
|
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.
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 |