Partilhar via


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:

  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 Operation.
  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 de MmUnlockPages para desbloquear as páginas.
  4. 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.
Uma chamada bem-sucedida para MmProbeAndLockPages bloqueia as páginas em um MDL e define a estrutura MDL como o estado bloqueado. Cada chamada deve ser correspondida por uma chamada correspondente para 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 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 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.

Requisitos

Requisito Valor
de cliente com suporte mínimo Disponível a partir do Windows 2000.
da Plataforma de Destino Universal
cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca NtosKrnl.lib
de DLL NtosKrnl.exe
IRQL Consulte a seção Comentários.
regras de conformidade de DDI HwStorPortProhibitedDIs(storport)

Consulte também

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages