Função MmAdvanceMdl (wdm.h)

A rotina MmAdvanceMdl avança o início do intervalo de memória virtual de um MDL pelo número especificado de bytes.

Sintaxe

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

Parâmetros

[in, out] Mdl

Especifica o MDL a ser adiantado.

[in] NumberOfBytes

Especifica o número de bytes para avançar o início do MDL.

Retornar valor

MmAdvanceMdl retorna um código NTSTATUS. Os possíveis valores retornados incluem:

Código de retorno Descrição
STATUS_SUCCESS
A rotina avançou com êxito no início do MDL.
STATUS_INVALID_PARAMETER_2
O chamador tentou avançar o início do MDL após o final.

Comentários

MmAdvanceMdl avança apenas o início do intervalo de endereços de memória virtual. O endereço final permanece o mesmo e o comprimento do intervalo é reduzido adequadamente.

Um driver de nível superior pode usar MmAdvanceMdl em condições de memória baixa quando um driver de nível inferior só pode concluir parcialmente uma solicitação de leitura/gravação. O driver de nível superior pode usar MmAdvanceMdl para passar da parte do buffer que já foi lida ou gravada e, em seguida, reemissar o IRP para concluir a solicitação. (O driver pode, naturalmente, repetir esse processo quantas vezes forem necessárias.)

Se MmAdvanceMdl passar da página inicial, todas as páginas que MmAdvanceMdl passaram serão desbloqueadas imediatamente e o endereço virtual do sistema que mapeia o MDL e o endereço do usuário também serão ajustados.

O uso de MmAdvanceMdl pode diminuir o desempenho do sistema. Ele deve ser usado somente quando todas as seguintes condições forem retensivas:

  • O driver de nível superior, em sua própria manipulação de E/S, só pode concluir determinadas solicitações de E/S depois de transferir uma quantidade fixa de dados, mas o driver de nível inferior transfere apenas dados em quantidades menores. (Um exemplo é um driver de transporte de rede para os protocolos SPX ou NBT. Cada protocolo dá suporte à passagem de mensagens confiáveis para mensagens maiores que um quadro Ethernet. O driver de transporte só pode concluir uma solicitação de leitura para essa mensagem depois de remontar a mensagem de vários quadros Ethernet.)
  • O driver de nível superior já tentou e não conseguiu alocar um novo MDL para transferir um fragmento de dados de uma solicitação de E/S incompleta. (Se o driver conseguir alocar um novo MDL, ele deverá usar esse MDL e IoBuildPartialMdl para executar a solicitação de E/S em vez de MmAdvanceMdl.)
  • O driver de nível superior deve continuar a progredir, mesmo em condições de memória insuficiente.
Os drivers que não atendem a essas condições devem usar a rotina IoBuildPartialMdl para concluir operações de E/S parcialmente bem-sucedidas.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível no Windows XP e versões posteriores do Windows.
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