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


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