共用方式為


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