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');