Partilhar via


Função IoAllocateMdl (wdm.h)

A rotina IoAllocateMdl aloca uma MDL (lista de descritores de memória) grande o suficiente para mapear um buffer, considerando o endereço e o comprimento iniciais 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

O 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 deve 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 para FALSE.

[in, out, optional] Irp

Ponteiro para um IRP a ser associado ao MDL. Se o ponteiro irp não forNULL, o MDL alocado será associado à lista de MDL do IRP especificado, de acordo com o valor de SecondaryBuffer.

Valor de retorno

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

Observações

IoAllocateMdl pode ser usado por um driver que precisa dividir um buffer em partes, cada um mapeado por um MDL separado ou mapear um buffer alocado pelo driver. O driver deve chamar MmBuildMdlForNonPagedPool com o MDL alocado por essa chamada para configurar um MDL descrevendo 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, as atualizações de rotina irp>MdlAddress para apontar para o novo MDL. Se secondaryBuffer for VERDADEIRO, a rotina adicionará o MDL ao final da cadeia de MDL à qual Irp –>aponta o MdlAddress.

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

Requisitos

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

Consulte também

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool