Función MmAllocatePagesForMdl (wdm.h)

La rutina MmAllocatePagesForMdl asigna páginas de memoria física no paginadas y llenas de cero a una MDL.

Sintaxis

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

Parámetros

[in] LowAddress

Especifica la dirección física del inicio del primer intervalo de direcciones desde el que pueden venir las páginas asignadas. Si MmAllocatePagesForMdl no puede asignar el número solicitado de bytes en el primer intervalo de direcciones, recorre en iteración intervalos de direcciones adicionales para obtener más páginas. En cada iteración, MmAllocatePagesForMdl agrega el valor de SkipBytes a la dirección inicial anterior para obtener el inicio del siguiente intervalo de direcciones.

[in] HighAddress

Especifica la dirección física del final del primer intervalo de direcciones desde el que pueden venir las páginas asignadas.

[in] SkipBytes

Especifica el número de bytes que se van a omitir desde el principio del intervalo de direcciones anterior desde el que pueden venir las páginas asignadas. SkipBytes debe ser un entero múltiplo del tamaño de página de memoria virtual, en bytes.

[in] TotalBytes

Especifica el número total de bytes que se van a asignar para MDL.

Valor devuelto

MmAllocatePagesForMdl devuelve una de las siguientes opciones:

Código devuelto Descripción
Puntero MDL El puntero MDL describe un conjunto de páginas físicas en el intervalo de direcciones especificado. Si el número solicitado de bytes no está disponible, MDL describe tanta memoria física como está disponible.
NULL No hay páginas de memoria física en los intervalos de direcciones especificados o no hay suficiente grupo de memoria para el propio MDL.

Comentarios

Los controladores que se ejecutan en Windows Server 2003 Service Pack 1 (SP1) y versiones posteriores de Windows deben usar la rutina MmAllocatePagesForMdlEx en lugar de MmAllocatePagesForMdl. MmAllocatePagesForMdlEx proporciona un mejor rendimiento que MmAllocatePagesForMdl evitando vaciados innecesarios del búfer de búsqueda de traducción (TLB) y memoria caché.

Las páginas de memoria física devueltas por MmAllocatePagesForMdl normalmente no son páginas contiguas. MmAllocatePagesForMdl siempre rellena las páginas asignadas en el MDL devuelto con ceros.

MmAllocatePagesForMdl está diseñado para ser utilizado por controladores en modo kernel que no necesitan direcciones virtuales correspondientes (es decir, necesitan páginas físicas y no necesitan que las páginas sean físicamente contiguas) o mediante controladores de modo kernel que pueden lograr mejoras de rendimiento considerables si se asigna memoria física para un dispositivo en un intervalo de direcciones físicos específico. Un controlador para una tarjeta gráfica AGP es un ejemplo de este controlador.

Dependiendo de la cantidad de memoria física disponible actualmente en los intervalos solicitados, MmAllocatePagesForMdl podría devolver una MDL que describa menos memoria de la solicitada. La rutina devuelve NULL si no se asignó ninguna memoria. El autor de la llamada debe comprobar la cantidad de memoria que se asigna realmente al MDL.

El llamador debe usar MmFreePagesFromMdl para liberar las páginas de memoria descritas por una MDL creada por MmAllocatePagesForMdl. Después de llamar a MmFreePagesFromMdl, el autor de la llamada también debe llamar a ExFreePool para liberar la memoria asignada para la propia estructura MDL.

En Windows 2000 y versiones posteriores de Windows, la cantidad máxima de memoria que MmAllocatePagesForMdl puede asignar en una sola llamada es (4 gigabytes - PAGE_SIZE). La rutina puede satisfacer una solicitud de asignación para esta cantidad solo si hay suficientes páginas disponibles.

MmAllocatePagesForMdl se ejecuta en IRQL <= APC_LEVEL. Windows Server 2008 y versiones posteriores del sistema operativo Windows permiten a los llamadores MmAllocatePagesForMdl llamar a en DISPATCH_LEVEL. Sin embargo, puede mejorar el rendimiento del controlador llamando a APC_LEVEL o a continuación.

Llamar a MmAllocatePagesForMdl desde una llamada de procedimiento asincrónico de kernel especial (APC) puede provocar una adquisición recursiva de un bloqueo exclusivo, que solo se encuentra en una región crítica (apCs de kernel normal o de usuario deshabilitadas), pero no en una región protegida (todas las API deshabilitadas).

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL vea la sección Comentarios.
Reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

Consulte también

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages