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