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) |