C30033
предупреждение C30033: в драйвере, скомпилированном с POOL_NX_OPTIN, обнаружено выделение исполняемого файла. Этот драйвер был определен для загрузки во время выполнения другим драйвером. Убедитесь, что драйвер загрузки вызывает ExInitializeDriverRuntime(DrvRtPoolNxOptIn) в своем DriverEntry.
BANNED_MEM_ALLOCATION_MAYBE_UNSAFE_DRIVER_LOADED
Было установлено, что это библиотека DLL, загруженная другим драйвером, и поэтому не имеет функции полной инициализации. Убедитесь, что драйвер загрузки:
- Скомпилировано с использованием POOL_NX_OPTIN=1
- Вызывает ExInitializeDriverRuntime(DrvRtPoolNxOptIn) в своей функции инициализации
Если драйвер загрузки правильно указывает их, предупреждение можно игнорировать.
Примере
Следующий код в каждом загрузчике библиотеки DLL означает, что необходимо внести изменения (в соответствии с безопасным примером ниже).
В файле источников
C_DEFINES=$(C_DEFINES)
В DriverEntry перед выделением памяти:
NTSTATUS
DriverEntry (
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
…
// No call to ExInitializeDriverRuntime
return(status)
}
Следующий код в каждом загрузчике библиотеки DLL означает, что предупреждение можно игнорировать.
В файле источников добавьте
C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1
В DriverEntry перед выделением памяти:
NTSTATUS
DriverEntry (
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
…
Пример 2
Второй способ исправить это — сделать каждый вызов явно ссылаться на неисполняемую память.
Следующий код создает это предупреждение.
ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');
Следующий код позволяет избежать этого предупреждения:
ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');