Compartilhar via


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.

Valor de retorno

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

Valor de retorno Descrição
STATUS_SUCCESS
A operação foi concluída com êxito e a seção de driver foi protegida com êxito
STATUS_INVALID_DEVICE_STATE
O VSM (Modo de Segurança Virtual) está desabilitado no momento para que a função não possa proteger a seção de 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 nela é 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 tem suporte nessa API (consulte Comentários).
STATUS_ACCESS_VIOLATION
A seção especificada é descartável 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.

Observações

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, após a proteção da seção, não há como remover a proteção. Isso é por design: a única exceção dessa regra é quando o chamador especifica o sinalizador de 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 a proteção de uma seção de descarte ou uma seção que contenha a 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 no <DO IRQL = APC_LEVEL.

Requisitos

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