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


C30031

предупреждение C30031: вызов функции выделения памяти и передача параметра, указывающего исполняемую память

Анализ кода обнаружил использование POOL_NX_OPTIN и метод ExInitializeDriverRuntime(DrvRtPoolNxOptIn) был вызван до вызова функции входа (например, DriverEntry() или DllInitialize()). Возможно, функция входа косвенно вызывает ExInitializeDriverRuntime(DrvRtPoolNxOptIn), в этом случае ошибку можно подавить (см. раздел Pragma Prefast to Suppress Warning Messages).

BANNED_MEM_ALLOCATION_MAYBE_SAFE

Примере

Следующий код в файле sources создает это предупреждение:

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

В файле кода

void MakeSafeInitialization()
{
    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
}

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

    MakeSafeInitialization ();
…
}

Следующий код позволяет избежать этого предупреждения:

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

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
…
}