Partager via


C30033

avertissement C30033 : L’allocation d’exécutables a été détectée dans un pilote compilé avec POOL_NX_OPTIN. Ce pilote a été déterminé comme étant chargé au moment de l’exécution par un autre pilote. Vérifiez que le pilote de chargement appelle ExInitializeDriverRuntime(DrvRtPoolNxOptIn) dans son DriverEntry.

BANNED_MEM_ALLOCATION_MAYBE_UNSAFE_DRIVER_LOADED

Il a été déterminé qu’il s’agit d’une DLL chargée par un autre pilote et, en tant que telle, n’a pas de fonction d’initialisation complète. Vérifiez que le pilote de chargement est :

  • Compilé à l’aide de POOL_NX_OPTIN=1
  • Appelle ExInitializeDriverRuntime(DrvRtPoolNxOptIn) dans sa fonction d’initialisation

Si le pilote de chargement les spécifie correctement, l’avertissement peut être ignoré.

Exemple

Le code suivant dans chaque chargeur de la DLL signifie que vous devez apporter la modification (conformément à l’exemple sécurisé ci-dessous)

Dans le fichier sources

C_DEFINES=$(C_DEFINES)

Dans DriverEntry, avant toute allocation de mémoire :

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

Le code suivant dans chaque chargeur de la DLL signifie que vous pouvez ignorer l’avertissement.

Dans le fichier sources, ajoutez

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

Dans DriverEntry, avant toute allocation de mémoire :

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

    ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
…

Exemple n°2

Une deuxième façon de résoudre ce problème consiste à faire en sorte que chaque appel référence explicitement la mémoire non exécutable.

Le code suivant génère cet avertissement.

ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');

Le code suivant évite cet avertissement :

ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');