Função MmProbeAndLockPages (wdm.h)
O MmProbeAndLockPages investiga as páginas de memória virtual especificadas, as torna residentes e as bloqueia na memória (por exemplo, uma transferência de DMA). Isso garante que as páginas não possam ser liberadas e realocadas enquanto um driver de dispositivo (ou hardware) ainda as estiver usando.
Sintaxe
void MmProbeAndLockPages(
[in, out] PMDL MemoryDescriptorList,
[in] KPROCESSOR_MODE AccessMode,
[in] LOCK_OPERATION Operation
);
Parâmetros
[in, out] MemoryDescriptorList
Um ponteiro para um MDL que especifica um buffer de memória virtual. Se a rotina bloquear com êxito as páginas na memória, o MDL será atualizado para descrever as páginas físicas subjacentes.
[in] AccessMode
O modo de acesso no qual investigar os argumentos, KernelMode ou UserMode.
[in] Operation
O tipo de operação para o qual o chamador deseja que os direitos de acesso são investigados e as páginas bloqueadas. Defina esse parâmetro como IoReadAccess, IoWriteAccessou IoModifyAccess. IoReadAccess indica que o driver pode examinar o conteúdo do buffer, mas não pode alterar o conteúdo. IoWriteAccess e IoModifyAccess, que são equivalentes, indicam que o driver tem acesso de leitura e gravação ao buffer.
Valor de retorno
Nenhum
Observações
O driver de nível mais alto em uma cadeia de drivers em camadas que usam E/S direta chama essa rotina. Os drivers que usam E/S em buffer nunca chamam MmProbeAndLockPages.
MmProbeAndLockPages executa as seguintes operações:
- Se o intervalo de memória especificado for paginado em um repositório de backup (disco, rede e assim por diante), MmProbeAndLockPages o tornará residente.
- Em seguida, a rotina confirma que as páginas permitem a operação especificada pelo parâmetro Operation.
- Se o intervalo de memória permitir a operação especificada, a rotina bloqueará as páginas na memória para que elas não possam ser excluídas. Use a rotina de MmUnlockPages para desbloquear as páginas.
- Por fim, a rotina atualiza a matriz de número de quadro de página (PFN) no MDL para descrever as páginas físicas bloqueadas.
Se dois ou mais MDLs descreverem a mesma página física, a página poderá ser bloqueada várias vezes, uma vez para cada MDL. A página é desbloqueada quando o último MDL é definido como o estado desbloqueado.
Uma rotina como MmBuildMdlForNonPagedPool ou IoBuildPartialMdl atualiza um MDL para descrever páginas que não podem ser pagináveis ou já bloqueadas. Uma chamada para MmProbeAndLockPages ou MmUnlockPages para bloquear ou desbloquear tal MDL não é permitida.
As chamadas para MmProbeAndLockPages devem ser colocadas em um bloco try/except. Se as páginas não derem suporte à operação especificada, a rotina gerará a STATUS_ACCESS_VIOLATION ou outras exceções. Para obter mais informações, consulte de exceções de tratamento de.
Os chamadores de MmProbeAndLockPages devem estar em execução no IRQL <= APC_LEVEL para endereços pagináveis ou em irql <= DISPATCH_LEVEL para endereços não pageable.
Essa rotina não fornece garantias sobre o endereço virtual que descreve essas páginas (ou seja, o endereço virtual pode ser não mapeado, reutilizado e assim por diante). No entanto, as páginas físicas têm a garantia de serem bloqueadas no retorno bem-sucedido.
Para evitar falhas de página, use virtualLock para bloquear o endereço virtual para que ele não seja cortado, a menos que o aplicativo o desbloqueie ou o libere explicitamente chamando VirtualFree ou UnmapViewOfFile.