Freigeben über


MmBuildMdlForNonPagedPool-Funktion (wdm.h)

Die MmBuildMdlForNonPagedPool-Routine empfängt eine MDL, die einen nicht auslagerten virtuellen Speicherpuffer angibt, und aktualisiert ihn, um die zugrunde liegenden physischen Seiten zu beschreiben.

Syntax

void MmBuildMdlForNonPagedPool(
  [in, out] PMDL MemoryDescriptorList
);

Parameter

[in, out] MemoryDescriptorList

Ein Zeiger auf eine MDL, der einen virtuellen Speicherpuffer im nicht auslagerten Arbeitsspeicher angibt. Der Aufrufer hat die IoAllocateMdl-Routine verwendet, um die MDL für diesen Puffer zu erstellen.

Rückgabewert

Keine

Bemerkungen

Bei der Eingabe muss die angegebene MDL einen Puffer im nicht ausgestellten Systemspeicher oder im gesperrten Arbeitsspeicher beschreiben (die physischen Seiten können nicht gehandelt werden), z. B. Speicher, der von der ExAllocatePoolWithTag-Routine mit PoolType = NonPagedPool oder von der MmAllocateContiguousMemorySpecifyCache-Routine zugewiesen wird. MmBuildMdlForNonPagedPool aktualisiert die MDL, um die zugrunde liegenden physischen Seiten zu beschreiben.

MmBuildMdlForNonPagedPool kann nicht mit MDLs verwendet werden, die Puffer beschreiben, die auf einem Kernelstapel zugeordnet sind. Um eine MDL zu erstellen, die einen Kernelstapelpuffer beschreibt, müssen Treiber MmProbeAndLockPages aufrufen. Dies liegt daran, dass Kernelstapelseiten gehandelt werden können, es sei denn, sie sind probe-and-locked. Diese Regel gilt auch dann, wenn der Treiber garantiert, dass der Kernelstapel nicht ausgelagert werden kann.

Da die von der MDL beschriebenen Seiten bereits nicht ausstellbar sind und bereits dem Systemadressraum zugeordnet sind, dürfen Treiber nicht versuchen, sie mithilfe der MmProbeAndLockPages-Routine zu sperren oder mithilfe der MmMapLockedPagesSpecifyCache-Routine zusätzliche Systemadressraumzuordnungen zu erstellen. Ebenso dürfen Treiber nicht versuchen, die Seiten mithilfe der MmUnlockPages-Routine zu entsperren oder die vorhandene Systemadressraumzuordnung mithilfe der MmUnmapLockedPages-Routine freizugeben. Wenn ein Treiber einen dieser illegalen Vorgänge für eine MDL ausführt, die von MmBuildMdlForNonPagedPool erstellt wird, ist das resultierende Verhalten nicht definiert.

Das Übergeben einer von MmBuildMdlForNonPagedPool erstellten MDL an die MmGetSystemAddressForMdlSafe-Routine ist zulässig. Der Aufruf "MmGetSystemAddressForMdlSafe " gibt in diesem Fall einfach die virtuelle Startadresse des Puffers zurück, der von der MDL beschrieben wird.

Ein Treiber kann die MmMapLockedPagesSpecifyCache-Routine verwenden, um eine von MmBuildMdlForNonPagedPool erstellte MDL dem virtuellen Adressraum des Benutzers zuzuordnen. Der Treiber muss diesen Vorgang jedoch so ausführen, dass bestimmte Sicherheitsprobleme vermieden werden. Weitere Informationen finden Sie unter MmMapLockedPagesSpecifyCache.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows 2000.
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

Weitere Informationen

ExAllocatePoolWithTag

MmAllocateContiguousMemorySpecifyCache

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages