Função MmProbeAndLockPages (wdm.h)

A rotina MmProbeAndLockPages investiga as páginas de memória virtual especificadas, torna-as residentes e as bloqueia na memória (digamos, 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.

Valor retornado

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:

  1. 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.
  2. Em seguida, a rotina confirma que as páginas permitem a operação especificada pelo parâmetro Operação .
  3. 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 MmUnlockPages para desbloquear as páginas.
  4. 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.
Uma chamada bem-sucedida para MmProbeAndLockPages bloqueia as páginas em um MDL e define a estrutura MDL como o estado bloqueado. Cada chamada desse tipo deve ser correspondida por uma chamada correspondente ao MmUnlockPages que desbloqueia as páginas e define o MDL como o estado desbloqueado. Depois que uma chamada mmProbeAndLockPages define um MDL para o estado bloqueado, uma segunda chamada para MmProbeAndLockPages para bloquear o mesmo MDL não é permitida até que o MmUnlockPages seja chamado pela primeira vez para desbloquear o MDL.

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á estão 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 Como lidar com exceções.

Os chamadores de MmProbeAndLockPages devem estar em execução no IRQL <= APC_LEVEL para endereços pageable ou em IRQL <= DISPATCH_LEVEL para endereços não pageáveis.

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 desbloqueie ou o libere explicitamente chamando VirtualFree ou UnmapViewOfFile.

Requisitos

   
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 HwStorPortProhibitedDIs(storport)

Confira também

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages