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