Partilhar via


Função IoBuildPartialMdl (wdm.h)

A rotina IoBuildPartialMdl cria uma nova lista de descritores de memória (MDL) que representa parte de um buffer descrito por um MDL existente.

Sintaxe

void IoBuildPartialMdl(
  [in]      PMDL  SourceMdl,
  [in, out] PMDL  TargetMdl,
  [in]      PVOID VirtualAddress,
  [in]      ULONG Length
);

Parâmetros

[in] SourceMdl

Um ponteiro para um MDL que descreve o buffer original, do qual um subconjunto deve ser mapeado.

[in, out] TargetMdl

Um ponteiro para um MDL alocado por chamador. Esse MDL deve ser grande o suficiente para descrever as páginas no subrange especificado por VirtualAddress e Length.

[in] VirtualAddress

Um ponteiro para o endereço virtual base do subconjunto a ser descrito pelo TargetMdl.

[in] Length

Especifica o comprimento, em bytes, a ser mapeado pelo TargetMdl. Esse valor, em combinação com VirtualAddress, deve especificar um buffer que seja um subconjunto adequado do buffer descrito por sourceMdl. Se Length for zero, o subrange a ser mapeado começará em VirtualAddress e inclui o intervalo restante descrito pelo sourceMdl.

Valor de retorno

Nenhum

Observações

Essa rotina cria um MDL de destino que descreve um subconjunto do buffer descrito pelo MDL de origem. Esse subconjunto é especificado pelos parâmetros virtualAddress e Length. Os parâmetros SourceMdl e TargetMdl apontam para o MDL de origem e o MDL de destino.

Um driver pode usar IoBuildPartialMdl para dividir uma solicitação de transferência grande em solicitações de transferência menores. As páginas físicas que o MDL de origem descreve devem ser bloqueadas antes que o driver chame IoBuildPartialMdl. Normalmente, o MDL de origem descreve um buffer no espaço de endereço do usuário e o driver chama o MmProbeAndLockPages rotina para bloquear as páginas nesse buffer. No entanto, o driver pode criar o MDL de origem a partir de memória nãopagada chamando o MmBuildMdlForNonPagedPool, MmAllocatePagesForMdlExou rotina de MmAllocatePagesForMdl.

Ao criar um MDL parcial:

  • Se o MDL original já estava mapeado no espaço do sistema, o MDL parcial compartilha esse mapeamento e não há necessidade de mapeá-lo novamente.
  • Se o MDL original não tiver sido mapeado no espaço do sistema, o MDL parcial também não será. Se você precisar de um endereço de modo do sistema, chame MmGetSystemAddressForMdlSafe no MDL parcial.
  • Se você não souber qual das opções acima se aplica, é seguro chamar MmGetSystemAddressForMdlSafe independentemente. Se um MDL parcial for criado a partir de um MDL de origem que já esteja mapeado para o espaço de endereço do sistema, MmGetSystemAddressForMdlSafe usará o mapeamento de origem existente. Caso contrário, MmGetSystemAddressForMdlSafe criará um novo mapeamento.

Para evitar que esse novo mapeamento seja vazado, os drivers devem chamar MmPrepareMdlForReuse antes de reutilizar um MDL parcial. Além disso, a rotina IoFreeMdl libera o mapeamento de espaço de endereço do sistema para um MDL parcial, se esse mapeamento existir.

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
regras de conformidade de DDI MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf)

Consulte também

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages