MmAllocatePagesForMdl-Funktion (wdm.h)

Die MmAllocatePagesForMdl-Routine ordnet einer MDL 0-gefüllte, nicht ausgelagerte physische Speicherseiten zu.

Syntax

PMDL MmAllocatePagesForMdl(
  [in] PHYSICAL_ADDRESS LowAddress,
  [in] PHYSICAL_ADDRESS HighAddress,
  [in] PHYSICAL_ADDRESS SkipBytes,
  [in] SIZE_T           TotalBytes
);

Parameter

[in] LowAddress

Gibt die physische Adresse des Anfangs des ersten Adressbereichs an, aus dem die zugeordneten Seiten stammen können. Wenn MmAllocatePagesForMdl die angeforderte Anzahl von Bytes im ersten Adressbereich nicht zuordnen kann, durchlaufen sie zusätzliche Adressbereiche, um weitere Seiten abzurufen. Bei jeder Iteration fügt MmAllocatePagesForMdl den Wert von SkipBytes zur vorherigen Startadresse hinzu, um den Anfang des nächsten Adressbereichs zu erhalten.

[in] HighAddress

Gibt die physische Adresse des Endes des ersten Adressbereichs an, aus dem die zugeordneten Seiten stammen können.

[in] SkipBytes

Gibt die Anzahl der Bytes an, die am Anfang des vorherigen Adressbereichs übersprungen werden sollen, aus dem die zugeordneten Seiten stammen können. SkipBytes muss ein ganzzahliges Vielfaches der Seitengröße des virtuellen Arbeitsspeichers in Bytes sein.

[in] TotalBytes

Gibt die Gesamtzahl der Bytes an, die für die MDL zugeordnet werden sollen.

Rückgabewert

MmAllocatePagesForMdl gibt eine der folgenden Rückgaben zurück:

Rückgabecode Beschreibung
MDL-Zeiger Der MDL-Zeiger beschreibt eine Reihe physischer Seiten im angegebenen Adressbereich. Wenn die angeforderte Anzahl von Bytes nicht verfügbar ist, beschreibt die MDL so viel physischen Arbeitsspeicher, wie verfügbar ist.
NULL In den angegebenen Adressbereichen gibt es keine Seiten des physischen Arbeitsspeichers, oder es ist nicht genügend Arbeitsspeicherpool für die MDL selbst vorhanden.

Hinweise

Treiber, die in Windows Server 2003 Service Pack 1 (SP1) und höheren Versionen von Windows ausgeführt werden, sollten die MmAllocatePagesForMdlEx-Routine anstelle von MmAllocatePagesForMdl verwenden. MmAllocatePagesForMdlEx bietet eine bessere Leistung als MmAllocatePagesForMdl , da unnötige Leerungen des Übersetzungs-Lookaside-Puffers (TLB) und des Cachespeichers vermieden werden.

Die physischen Speicherseiten, die von MmAllocatePagesForMdl zurückgegeben werden, sind in der Regel keine zusammenhängenden Seiten. MmAllocatePagesForMdl füllt die zugeordneten Seiten in der zurückgegebenen MDL immer mit Nullen aus.

MmAllocatePagesForMdl ist für die Verwendung von Kernelmodustreibern konzipiert, die keine entsprechenden virtuellen Adressen benötigen (d. h. sie benötigen physische Seiten und müssen die Seiten nicht physisch zusammenhängend sein) oder von Kernelmodustreibern verwendet werden, die erhebliche Leistungssteigerungen erzielen können, wenn physischer Arbeitsspeicher für ein Gerät in einem bestimmten physischen Adressbereich zugeordnet ist. Ein Treiber für eine AGP-Grafik Karte ist ein Beispiel für einen solchen Treiber.

Abhängig davon, wie viel physischer Arbeitsspeicher derzeit in den angeforderten Bereichen verfügbar ist, gibt MmAllocatePagesForMdl möglicherweise eine MDL zurück, die weniger Arbeitsspeicher als angefordert beschreibt. Die Routine gibt NULL zurück, wenn kein Arbeitsspeicher zugewiesen wurde. Der Aufrufer sollte überprüfen, wie viel Arbeitsspeicher tatsächlich der MDL zugeordnet ist.

Der Aufrufer muss MmFreePagesFromMdl verwenden, um die Speicherseiten freizugeben, die von einer MDL beschrieben werden, die von MmAllocatePagesForMdl erstellt wurde. Nach dem Aufruf von MmFreePagesFromMdl muss der Aufrufer auch ExFreePool aufrufen, um den Arbeitsspeicher freizugeben, der für die MDL-Struktur selbst zugeordnet ist.

In Windows 2000 und höheren Versionen von Windows beträgt die maximale Arbeitsspeichermenge, die MmAllocatePagesForMdl in einem einzigen Aufruf zuweisen kann (4 Gigabyte – PAGE_SIZE). Die Routine kann eine Zuordnungsanforderung für diesen Betrag nur erfüllen, wenn genügend Seiten verfügbar sind.

MmAllocatePagesForMdl wird unter IRQL <= APC_LEVEL ausgeführt. Mit Windows Server 2008 und höheren Versionen des Windows-Betriebssystems können MmAllocatePagesForMdl-Aufrufer unter DISPATCH_LEVEL aufrufen. Sie können jedoch die Treiberleistung verbessern, indem Sie unter APC_LEVEL oder darunter aufrufen.

Der Aufruf von MmAllocatePagesForMdl aus einem speziellen asynchronen Kernelprozeduraufruf (APC) kann zu einem rekursiven Erwerb einer exklusiven Sperre führen, die sich nur in einer kritischen Region befindet (Benutzer- oder normale Kernel-APCs deaktiviert), aber nicht in einer geschützten Region (alle APCs deaktiviert).

Anforderungen

Anforderung Wert
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Weitere Informationen finden Sie im Abschnitt mit den Hinweisen.
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

Weitere Informationen

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages