Freigeben über


MmAllocatePagesForMdl-Funktion (wdm.h)

Die MmAllocatePagesForMdl Routine weist einer MDL nullgefü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 kommen können. Wenn MmAllocatePagesForMdl die angeforderte Anzahl von Bytes im ersten Adressbereich nicht zuordnen kann, durchläuft es zusätzliche Adressbereiche, um weitere Seiten abzurufen. Bei jeder Iteration addiert MmAllocatePagesForMdl den Wert SkipBytes zur vorherigen Startadresse hinzu, um den Anfang des nächsten Adressbereichs abzurufen.

[in] HighAddress

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

[in] SkipBytes

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

[in] TotalBytes

Gibt die Gesamtanzahl der Bytes an, die für die MDL zugewiesen werden sollen.

Rückgabewert

MmAllocatePagesForMdl gibt eine der folgenden Werte zurück:

Rückgabecode Beschreibung
MDL-Zeiger- Der MDL-Zeiger beschreibt einen Satz 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.
NULL- Es gibt keine physischen Speicherseiten in den angegebenen Adressbereichen, oder es ist nicht genügend Arbeitsspeicherpool für die MDL selbst vorhanden.

Bemerkungen

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 MmAllocatePagesForMdlverwenden. MmAllocatePagesForMdlEx bietet eine bessere Leistung als MmAllocatePagesForMdl-, indem unnötige Leerungen des Übersetzungs-Lookaside-Puffers (TLB) und Cachespeicher vermieden werden.

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

MmAllocatePagesForMdl wurde entwickelt, um von Kernelmodustreibern verwendet zu werden, die keine entsprechenden virtuellen Adressen benötigen (d. h. sie benötigen physische Seiten und benötigen nicht die Seiten physisch zusammenhängend) oder von Kernelmodustreibern, die erhebliche Leistungsvorteile erzielen können, wenn physischer Speicher für ein Gerät in einem bestimmten physischen Adressbereich zugewiesen wird. Ein Treiber für eine AGP-Grafikkarte ist ein Beispiel für einen solchen Treiber.

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

Der Aufrufer muss MmFreePagesFromMdl- verwenden, um die Speicherseiten freizugeben, die von einer MDL beschrieben werden, die von MmAllocatePagesForMdlerstellt wurde. Nach dem Aufrufen MmFreePagesFromMdlmuss der Aufrufer auch ExFreePool- aufrufen, um den Speicher freizugeben, der für die MDL-Struktur selbst zugewiesen ist.

In Windows 2000 und höheren Versionen von Windows beträgt die maximale Speichermenge, die MmAllocatePagesForMdl in einem einzelnen Anruf zuordnen 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 bei IRQL <= APC_LEVEL ausgeführt. Windows Server 2008 und höhere Versionen des Windows-Betriebssystems aktivieren MmAllocatePagesForMdl Anrufer, die bei DISPATCH_LEVEL anrufen können. Sie können jedoch die Treiberleistung verbessern, indem Sie APC_LEVEL oder unten aufrufen.

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

Anforderungen

Anforderung Wert
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- Siehe Abschnitt "Hinweise".
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

Siehe auch

ExFreePool-

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages-