Função MmProbeAndLockPages (wdm.h)
A rotina 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, IoWriteAccess ou 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.
Retornar valor
Nenhum
Comentários
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 paginadas. Use a rotina MmUnlockPages para desbloquear as páginas.
- Por fim, a rotina atualiza a matriz PFN ( número de quadro de página ) 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 publicadas 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á o STATUS_ACCESS_VIOLATION ou outras exceções. Para obter mais informações, consulte Tratamento de exceções.
Os chamadores de MmProbeAndLockPages devem estar em execução em IRQL <= APC_LEVEL para endereços pagináveis ou em IRQL <= DISPATCH_LEVEL para endereços não pagináveis.
Essa rotina não fornece nenhuma garantia 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 o 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.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Disponível a partir do Windows 2000. |
Plataforma de Destino | Universal |
Cabeçalho | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Biblioteca | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | Consulte a seção Observações. |
Regras de conformidade de DDI | HwStorPortProhibitedDDIs(storport) |