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 |
---|---|
|
A rotina avançou com êxito no início do MDL. |
|
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.
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 |