共用方式為


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