Compartir a través de


Función MmBuildMdlForNonPagedPool (wdm.h)

La rutina MmBuildMdlForNonPagedPool recibe un MDL que especifica un búfer de memoria virtual no paginado y lo actualiza para describir las páginas físicas subyacentes.

Sintaxis

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

Parámetros

[in, out] MemoryDescriptorList

Puntero a un MDL que especifica un búfer de memoria virtual en memoria no paginada. El autor de la llamada usó la rutina IoAllocateMdl para crear el MDL para este búfer.

Valor devuelto

None

Observaciones

En la entrada, el MDL especificado debe describir un búfer en memoria no paginada o en memoria bloqueada (las páginas físicas no se pueden intercambiar), como la memoria asignada por la rutina ExAllocatePoolWithTag con PoolType = NonPagedPool o por la rutina MmAllocateContiguousMemorySpecifyCache . MmBuildMdlForNonPagedPool actualiza mdL para describir las páginas físicas subyacentes.

Es posible que MmBuildMdlForNonPagedPool no se use con mdL que describen los búferes asignados en una pila de kernel. Para compilar una MDL que describa un búfer de pila del kernel, los controladores deben llamar a MmProbeAndLockPages. Esto se debe a que las páginas de pila del kernel se pueden intercambiar a menos que estén bloqueadas y sondas. Esta regla se aplica incluso si el controlador garantiza que no se puede paginar la pila del kernel.

Dado que las páginas descritas por MDL ya no se pueden paginar y ya están asignadas al espacio de direcciones del sistema, los controladores no deben intentar bloquearlas mediante la rutina MmProbeAndLockPages o para crear asignaciones adicionales del espacio de direcciones del sistema mediante la rutina MmMapLockedPagesSpecifyCache . Del mismo modo, los controladores no deben intentar desbloquear las páginas mediante la rutina MmUnlockPages o para liberar la asignación existente de espacio de direcciones del sistema mediante la rutina MmUnmapLockedPages . Si un controlador realiza cualquiera de estas operaciones ilegales en una MDL compilada por MmBuildMdlForNonPagedPool, el comportamiento resultante no está definido.

Se permite pasar una MDL compilada por MmBuildMdlForNonPagedPool a la rutina MmGetSystemAddressForMdlSafe . La llamada MmGetSystemAddressForMdlSafe , en este caso, simplemente devuelve la dirección virtual inicial del búfer que describe la MDL.

Un controlador puede usar la rutina MmMapLockedPagesSpecifyCache para asignar una MDL compilada por MmBuildMdlForNonPagedPool en el espacio de direcciones virtuales del usuario. Sin embargo, el controlador debe realizar esta operación de forma que evite ciertos problemas de seguridad. Para obtener más información, vea MmMapLockedPagesSpecifyCache.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

Consulte también

ExAllocatePoolWithTag

MmAllocateContiguousMemorySpecifyCache

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages