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