Função MmProtectDriverSection (wdm.h)

O MmProtectDriverSection somente leitura protege uma seção de um driver carregado usando os serviços fornecidos pelo VSM (Modo de Segurança Virtual).

Sintaxe

NTSTATUS MmProtectDriverSection(
  [in] PVOID  AddressWithinSection,
  [in] SIZE_T Size,
  [in] ULONG  Flags
);

Parâmetros

[in] AddressWithinSection

Um ponteiro para uma seção de dados válida que pertence a uma imagem de driver. A seção de dados ainda não deve ser executável, caso contrário, a API falhará com STATUS_INVALID_PAGE_PROTECTION.

[in] Size

No momento, esse parâmetro está reservado para uso futuro e deve ser definido como 0.

[in] Flags

Especifique os sinalizadores que controlam a operação: MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD – usado para especificar que o driver ainda pode ser descarregado após a proteção da seção.

Retornar valor

MmProtectDriverSection retorna um valor NTSTATUS que indica o resultado da operação:

Valor retornado Descrição
STATUS_SUCCESS
A operação foi concluída com êxito e a seção do driver foi protegida com êxito
STATUS_INVALID_DEVICE_STATE
No momento, o VSM (Modo de Segurança Virtual) está desabilitado para que a função não possa proteger a seção do driver.
STATUS_INVALID_PARAMETER
Uma máscara de bits de sinalizadores inválida (ou um tamanho diferente de zero) foi especificada.
STATUS_INVALID_PAGE_PROTECTION
A seção do driver especificada por um endereço contido nele é mapeada por meio de uma proteção inválida (não há suporte para seções executáveis)
STATUS_NOT_SUPPORTED
A seção especificada pertence a um driver que não é compatível com essa API (consulte Comentários).
STATUS_ACCESS_VIOLATION
A seção especificada é descartada ou contém lacunas, que não são apoiadas por nenhuma memória física. Isso geralmente acontece quando um alinhamento de seção é maior que um tamanho de página.
STATUS_ALREADY_COMMITTED
A seção especificada já foi protegida.

Comentários

A rotina protege a memória física que faz backup da seção do driver usando a tabela SLAT (tradução de endereço de segundo nível) gerenciada pelo VSM. A memória protegida será feita somente leitura para todo o Sistema Operacional. 

Observe que, depois que a seção tiver sido protegida, não há como remover a proteção. Isso é por design: a única exceção dessa regra é quando o chamador especifica o sinalizador MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD. Nesse caso, quando o driver de destino é descarregado, a seção protegida é liberada e liberada.

Drivers mapeados com páginas grandes e drivers de sessão não são compatíveis com a API MmProtectDriverSection . Além disso, os chamadores dessa API não podem solicitar para proteger uma seção descartado ou uma seção que contenha o IAT (Tabela de Endereços de Importação).

Observe que, se o chamador especificar um endereço que não pertence a nenhuma imagem de driver carregada, o sistema falhará com a verificação de bugs MEMORY_MANAGEMENT (tipo 0x1100).

Os chamadores da API MmProtectDriverSection devem ser executados em IRQL <= APC_LEVEL.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows Insider 19548.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL