Leer en inglés

Compartir a través de


C30033

advertencia C30033: se detectó la asignación ejecutable en un controlador compilado con POOL_NX_OPTIN. Otro controlador ha determinado que otro controlador cargará en tiempo de ejecución. Compruebe que el controlador de carga llama a ExInitializeDriverRuntime(DrvRtPoolNxOptIn) en su driverEntry.

BANNED_MEM_ALLOCATION_MAYBE_UNSAFE_DRIVER_LOADED

Se ha determinado que se trata de un archivo DLL cargado por otro controlador y, como tal, no tiene una función de inicialización completa. Compruebe que el controlador de carga es:

  • Compilado con POOL_NX_OPTIN=1
  • Llama a ExInitializeDriverRuntime(DrvRtPoolNxOptIn) en su función de inicialización.

Si el controlador de carga especifica esto correctamente, se puede omitir la advertencia.

Ejemplo

El código siguiente en cada cargador del archivo DLL significa que debe realizar el cambio (según el ejemplo seguro siguiente)

En el archivo de orígenes

C_DEFINES=$(C_DEFINES)

En DriverEntry, antes de que tenga lugar cualquier asignación de memoria:

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

El código siguiente de cada cargador del archivo DLL significa que puede omitir la advertencia.

En el archivo de orígenes, agregue

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

En DriverEntry, antes de que tenga lugar cualquier asignación de memoria:

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

    ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
…

Ejemplo 2

Una segunda forma de corregir esto es hacer que cada llamada haga referencia explícitamente a la memoria no ejecutable.

El código siguiente genera esta advertencia.

ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');

El código siguiente evita esta advertencia:

ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');