Поделиться через


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