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 se tornar 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.

Retornar valor

Em caso de êxito, MmSecureVirtualMemory retorna um valor de ponteiro opaco que o driver passa para a rotina MmUnsecureVirtualMemory para cancelar a integridade do 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.

Comentários

MmSecureVirtualMemory pode ser usado 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 alterar 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 permaneça 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 impede 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 assegurada 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 encerramento de processo, use PsSetCreateProcessNotifyRoutine. Como alternativa, o processo pode enviar um IRP com uma rotina de cancelamento que é invocada pelo gerenciador 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 da memória do usuário não gere 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 try/except . Por isso, recomendamos que os drivers não usem essa função. Para obter mais informações, consulte Tratamento de exceções.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho ntddk.h (inclua Ntddk.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=APC_LEVEL
Regras de conformidade da DDI HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm)

Confira também

MmUnsecureVirtualMemory