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