Condividi tramite


C30033

avviso C30033: l'allocazione eseguibile è stata rilevata in un driver compilato con POOL_NX_OPTIN. Questo driver è stato determinato a essere caricato in fase di esecuzione da un altro driver. Verificare che il driver di caricamento chiami ExInitializeDriverRuntime(DrvRtPoolNxOptIn) nel driverEntry.

BANNED_MEM_ALLOCATION_MAYBE_UNSAFE_DRIVER_LOADED

È stato determinato che questa è una DLL caricata da un altro driver e, come tale, non dispone di una funzione di inizializzazione completa. Verificare che il driver di caricamento sia:

  • Compilato usando POOL_NX_OPTIN=1
  • Chiama ExInitializeDriverRuntime(DrvRtPoolNxOptIn) nella sua funzione di inizializzazione

Se il driver di caricamento specifica correttamente questi elementi, l'avviso può essere ignorato.

Esempio

Il codice seguente in ogni caricatore della DLL significa che è necessario apportare la modifica (come nell'esempio sicuro seguente)

Nel file di origini

C_DEFINES=$(C_DEFINES)

In DriverEntry prima che si verifichi un'allocazione di memoria:

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

Il codice seguente in ogni caricatore della DLL significa che è possibile ignorare l'avviso.

Nel file di origini aggiungere

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

In DriverEntry prima che si verifichi un'allocazione di memoria:

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

    ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
…

Esempio #2

Un secondo modo per risolvere questo problema consiste nell'eseguire ogni chiamata a fare riferimento in modo esplicito alla memoria non eseguibile.

Il codice seguente genera questo avviso.

ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');

Il codice seguente evita questo avviso:

ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');