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