C30033

警告 C30033:使用 POOL_NX_OPTIN 编译的驱动程序中检测到可执行文件分配。 此驱动程序已确定由另一个驱动程序在运行时加载。 请验证加载驱动程序在其 DriverEntry 中调用 ExInitializeDriverRuntime (DrvRtPoolNxOptIn)

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