C30035

警告 C30035:调用的函数必须从初始化函数内部进行, (例如 DriverEntry () DllInitialize () ) 。 PREfast 无法确定调用是否来自初始化函数。

BANNED_MEM_ALLOCATION_MAYBE_BAD_CALL_SITE

代码是使用 POOL_NX_OPTIN 宏编译的,但初始化未在 DriverEntry () DllInitialize () 中发生。 若要解决此问题,请将调用移到初始化函数内部。

示例

下面的代码将生成此警告。

在源文件中:

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1
NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status;

    MakeSafeInitialization ();
…
}

void MakeSafeInitialization()
{
    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
}

以下代码可避免此警告:

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

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
…
}