Compartilhar via


Função MmSecureVirtualMemory (ntddk.h)

A rotina MmSecureVirtualMemory protege um intervalo de endereços de memória de espaço do usuário para que ele não possa ser liberado e sua proteção de página não possa ser mais restritiva.

Sintaxe

HANDLE MmSecureVirtualMemory(
  [in] PVOID  Address,
  [in] SIZE_T Size,
  [in] ULONG  ProbeMode
);

Parâmetros

[in] Address

O início do intervalo de endereços virtuais do usuário a ser seguro.

[in] Size

O tamanho, em bytes, do intervalo de endereços virtuais a ser seguro.

[in] ProbeMode

Especifica a proteção de página mais restritiva permitida. Use PAGE_READWRITE para especificar que o intervalo de endereços deve permanecer legível e gravável ou usar PAGE_READONLY para especificar que o intervalo de endereços só deve permanecer legível.

ProbeMode Significado
PAGE_READWRITE A proteção não pode ser alterada para PAGE_NOACCESS ou PAGE_READONLY. Todas as outras alterações de proteção são permitidas.
PAGE_READONLY A proteção não pode ser alterada para PAGE_NOACCESS. Todas as outras alterações de proteção são permitidas.

Valor de retorno

Com o êxito, MmSecureVirtualMemory retorna um valor de ponteiro opaco que o driver passa para a rotina MmUnsecureVirtualMemory para desacasar o intervalo de endereços de memória. Se a rotina não puder proteger o intervalo de endereços de memória, ela retornará NULL.

Observações

MmSecureVirtualMemory podem ser usados para evitar determinadas condições de corrida em buffers de modo de usuário. Por exemplo, se um driver verificar se o buffer é gravável, mas o processo de modo de usuário de origem altera o buffer para ser somente leitura antes que o driver possa gravar no buffer, uma condição de corrida poderá resultar. O driver pode usar MmSecureVirtualMemory com PAGE_READWRITE modo de investigação para garantir que o buffer permanecerá gravável até que o driver chame MmUnsecureVirtualMemory. A rotina também protege contra o processo de modo de usuário de origem liberando o buffer. Aqui estão algumas diretrizes sobre como chamar essas rotinas:

  • Chamar MmSecureVirtualMemory com PAGE_READONLY não garante que o buffer permanecerá somente leitura. O modo de investigação somente leitura impede que o usuário altere a proteção do buffer para PAGE_NOACCESS. Ele não impedir a alteração da proteção para PAGE_READWRITE (ou PAGE_WRITECOPY, para exibições mapeadas).

  • Se um driver chamar MmSecureVirtualMemory e não chamar MmUnsecureVirtualMemory, a memória será automaticamente não seguras quando o processo for encerrado.

  • Se o driver chamar MmUnsecureVirtualMemory, ele deverá chamá-lo no contexto do processo no qual a memória foi originalmente protegida e antes que esse processo seja encerrado.

  • Normalmente, os drivers precisam referenciar o processo quando protegem a memória e, posteriormente, chamar KeStackAttachProcess para alternar para o contexto desse processo antes de chamar MmUnsecureVirtualMemory.

  • Para detectar drivers de terminação de processo pode usar PsSetCreateProcessNotifyRoutine. Como alternativa, o processo pode enviar um IRP com uma rotina de cancelamento que é invocada pelo gerente de E/S quando o processo está sendo encerrado. Na rotina de cancelamento, o driver pode anexar ao processo e chamar MmUnsecureVirtualMemory.

Embora MmSecureVirtualMemory possa ser usado para garantir que a leitura ou gravação de memória do usuário não gerará uma exceção devido a permissões de página insuficientes, ela não protege contra outros tipos de exceções. Por exemplo, ele não protege contra exceções geradas quando o sistema encontra um bloco de disco inválido no arquivo de página. Portanto, os drivers ainda devem encapsular todos os acessos de memória do usuário em um bloco de try/except. Por isso, recomendamos que os drivers não usem essa função. Para obter mais informações, consulte de exceções de tratamento de.

Requisitos

Requisito Valor
da Plataforma de Destino Universal
cabeçalho ntddk.h (inclua Ntddk.h)
biblioteca NtosKrnl.lib
de DLL NtosKrnl.exe
IRQL <=APC_LEVEL
regras de conformidade de DDI HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm)

Consulte também

MmUnsecureVirtualMemory