次の方法で共有


C30033

警告 C30033: Executable allocation was detected in a driver compiled with 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');