Compartilhar via


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 avançado.

[in] NumberOfBytes

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

Valor de retorno

MmAdvanceMdl retorna um código NTSTATUS. Os valores retornados possíveis 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.

Observações

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 pela parte do buffer que já foi lida ou gravada e, em seguida, reemissar o IRP para concluir a solicitação. (O driver pode, é claro, repetir esse processo quantas vezes for necessário.)

Se MmAdvanceMdl avançar após a página inicial, todas as páginas que MmAdvanceMdl aprovadas 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 se mantiverem:

  • 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 essa 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 baixa.
Os drivers que não atendem a essas condições devem, em vez disso, usar a rotina de IoBuildPartialMdl para concluir quaisquer operações de E/S parcialmente bem-sucedidas.

Requisitos

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