Função IoAllocateMdl (wdm.h)

A rotina IoAllocateMdl aloca uma MDL (lista de descritores de memória) grande o suficiente para mapear um buffer, dado o endereço inicial e o comprimento do buffer. Opcionalmente, essa rotina associa o MDL a um IRP.

Sintaxe

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

Ponteiro para o endereço virtual base do buffer que o MDL deve descrever.

[in] Length

Especifica o comprimento, em bytes, do buffer que o MDL deve descrever. Para obter mais informações, consulte a seção Comentários a seguir.

[in] SecondaryBuffer

Indica se o buffer é um buffer primário ou secundário. Esse parâmetro determina como o MDL deve ser vinculado ao IRP. Todos os buffers, exceto o primeiro buffer descrito por um MDL em um IRP, são considerados buffers secundários. Esse campo deverá ser FALSE se nenhum IRP estiver associado ao MDL. Para obter mais informações, consulte a seção Comentários a seguir.

[in] ChargeQuota

Reservado para uso do sistema. Os drivers devem definir esse parâmetro como FALSE.

[in, out, optional] Irp

Ponteiro para um IRP a ser associado ao MDL. Se o ponteiro Irp não for NULL, o MDL alocado será associado à lista MDL do IRP especificada, de acordo com o valor de SecondaryBuffer.

Retornar valor

IoAllocateMdl retorna um ponteiro para um MDL ou, se o MDL não puder ser alocado, retornará NULL.

Comentários

IoAllocateMdl pode ser usado por um driver que precisa dividir um buffer em partes, cada um mapeado por um MDL separado ou para mapear um buffer alocado pelo driver. O driver deve chamar MmBuildMdlForNonPagedPool com o MDL alocado por essa chamada para configurar um MDL que descreve um buffer alocado pelo driver no pool nãopagado.

O parâmetro Length especifica o tamanho do buffer que deve ser descrito pelo MDL. No Windows Server 2003, Windows XP e Windows 2000, o tamanho máximo do buffer, em bytes, que essa rotina pode alocar é PAGE_SIZE * (65535 - sizeof(MDL)) / sizeof(ULONG_PTR). No Windows Vista e no Windows Server 2008, o tamanho máximo do buffer é (2 gigabytes – PAGE_SIZE). A partir do Windows 7 e do Windows Server 2008 R2, o tamanho máximo do buffer é (4 gigabytes – PAGE_SIZE).

Se o parâmetro SecondaryBuffer for FALSE, a rotina atualizará Irp-MdlAddress > para apontar para o novo MDL. Se SecondaryBuffer for TRUE, a rotina adicionará o MDL ao final da cadeia de MDL para a qual Irp-MdlAddress > aponta.

Para obter mais informações sobre MDLs, consulte Usando MDLs.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows 2000.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

Confira também

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool