次の方法で共有


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

これを修正する 2 つ目の方法は、すべての呼び出しで非実行可能メモリを明示的に参照することです。

次のコードでは、この警告が生成されます。

ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');

次のコードは、この警告を回避します。

ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');