Partilhar via


C30033

aviso C30033: a alocação executável foi detectada em um driver compilado com POOL_NX_OPTIN. Esse driver foi determinado a ser carregado em tempo de execução por outro driver. Verifique se o driver de carregamento chama ExInitializeDriverRuntime(DrvRtPoolNxOptIn) em seu DriverEntry.

BANNED_MEM_ALLOCATION_MAYBE_UNSAFE_DRIVER_LOADED

Foi determinado que essa é uma DLL carregada por outro driver e, como tal, não tem uma função de inicialização completa. Verifique se o driver de carregamento é:

  • Compilado usando POOL_NX_OPTIN=1
  • Chama ExInitializeDriverRuntime(DrvRtPoolNxOptIn) em sua função de inicialização

Se o driver de carregamento especificar isso corretamente, o aviso poderá ser ignorado.

Exemplo

O código a seguir em cada carregador da DLL significa que você deve fazer a alteração (de acordo com o exemplo seguro abaixo)

No arquivo de fontes

C_DEFINES=$(C_DEFINES)

Em DriverEntry, antes que qualquer alocação de memória ocorra:

NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status;
…
    // No call to ExInitializeDriverRuntime
    return(status)
}

O código a seguir em cada carregador da DLL significa que você pode ignorar o aviso.

No arquivo de fontes, adicione

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

Em DriverEntry, antes que qualquer alocação de memória ocorra:

NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status;

    ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
…

Exemplo nº 2

Uma segunda maneira de corrigir isso é fazer com que cada chamada faça referência explícita à memória não executável.

O código a seguir gera esse aviso.

ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');

O código a seguir evita este aviso:

ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');