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