Función IoAllocateMdl (wdm.h)

La rutina IoAllocateMdl asigna una lista de descriptores de memoria (MDL) lo suficientemente grande como para asignar un búfer, dada la dirección inicial y la longitud del búfer. Opcionalmente, esta rutina asocia la MDL con un IRP.

Sintaxis

PMDL IoAllocateMdl(
  [in, optional]      __drv_aliasesMem PVOID VirtualAddress,
  [in]                ULONG                  Length,
  [in]                BOOLEAN                SecondaryBuffer,
  [in]                BOOLEAN                ChargeQuota,
  [in, out, optional] PIRP                   Irp
);

Parámetros

[in, optional] VirtualAddress

Puntero a la dirección virtual base del búfer que se va a describir.

[in] Length

Especifica la longitud, en bytes, del búfer que se va a describir en MDL. Para obtener más información, vea la sección Comentarios que se muestra más adelante.

[in] SecondaryBuffer

Indica si el búfer es un búfer principal o secundario. Este parámetro determina cómo se va a vincular MDL al IRP. Todos los búferes excepto el primer búfer descrito por un MDL en un IRP se consideran búferes secundarios. Este campo debe ser FALSE si no hay ningún IRP asociado a MDL. Para obtener más información, vea la sección Comentarios que se muestra más adelante.

[in] ChargeQuota

Reservado para uso del sistema. Los controladores deben establecer este parámetro en FALSE.

[in, out, optional] Irp

Puntero a un IRP que se va a asociar a MDL. Si el puntero irp no es NULL, el MDL asignado está asociado a la lista MDL de IRP especificada, según el valor de SecondaryBuffer.

Valor devuelto

IoAllocateMdl devuelve un puntero a un MDL o, si no se puede asignar MDL, devuelve NULL.

Comentarios

IoAllocateMdl puede ser utilizado por un controlador que necesita dividir un búfer en partes, cada uno asignado por un MDL independiente o asignar un búfer asignado por el controlador. El controlador debe llamar a MmBuildMdlForNonPagedPool con la MDL asignada por esta llamada para configurar una MDL que describa un búfer asignado por el controlador en un grupo no paginado.

El parámetro Length especifica el tamaño del búfer que se va a describir mediante MDL. En Windows Server 2003, Windows XP y Windows 2000, el tamaño máximo del búfer, en bytes, que esta rutina puede asignar es PAGE_SIZE * (65535 - sizeof(MDL)) / sizeof(ULONG_PTR). En Windows Vista y Windows Server 2008, el tamaño máximo del búfer es (2 gigabytes - PAGE_SIZE). A partir de Windows 7 y Windows Server 2008 R2, el tamaño máximo del búfer es (4 gigabytes- PAGE_SIZE).

Si el parámetro SecondaryBuffer es FALSE, la rutina actualiza Irp-MdlAddress> para que apunte al nuevo MDL. Si SecondaryBuffer es TRUE, la rutina agrega el MDL al final de la cadena MDL a la que apunta Irp-MdlAddress>.

Para obtener más información sobre las MDL, consulte Uso de MDL.

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

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool