次の方法で共有


単一バイナリ オプトイン: POOL_NX_OPTIN

Windows 8 と以前のバージョンの Windows の両方で実行される単一のドライバー バイナリを構築するには、POOL_NX_OPTINオプトイン メカニズムを使用します。 これは、複数の Windows バージョンをサポートするために 1 つのドライバー バイナリを提供するサード パーティのハードウェア ベンダー向けの移植支援です。

このオプトイン メカニズムを使用するには、次の操作を行います。

  • オプトインするすべてのソース ファイルに対して、POOL_NX_OPTIN = 1 を定義します。 これを行うには、ドライバー プロジェクトの適切なプロパティ ページに次のプリプロセッサ定義を含めます。

    C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

  • DriverEntry (または同等の) ルーチンに、次の関数呼び出しを含めます。

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    この呼び出しは、ドライバーが NonPagedPool プールの種類を使用する割り当てを行うか、ExInitializeNPagedLookasideList ルーチンを呼び出す前に発生する必要があります。 ExInitializeDriverRuntime は強制インライン関数であり、Windows 8 以降のバージョンの Windows で呼び出すことができます。

ほとんどのドライバーでは、これら 2 つのタスクで 1 つのドライバー バイナリのオプトイン メカニズムを有効にするだけで十分です。

実装の詳細

POOL_NX_OPTINは、NonPagedPool をグローバル POOL_TYPE 変数 (ExDefaultNonPagedPoolType) に置き換えることで機能します。これは、NonPagedPoolNx (Windows 8 以降のバージョンの Windows の場合) または NonPagedPoolExecute (以前のバージョンの Windows の場合) を するために初期化されます。 このオプトイン メカニズムにより、カーネル モード ドライバーは、NX プールの保護が強化された Windows 8 と、NX プールをサポートしていない以前のバージョンの Windows の両方で実行できます。 NonPagedPool 定数名のインスタンスを NonPagedPoolNx に変換するマクロは、nonPagedPoolCacheAligned のインスタンスを nonPagedPoolNxCacheAligned に変換します。

静的ライブラリ (.lib プロジェクト) のサポート

.lib プロジェクトにはPOOL_NX_OPTINオプトイン メカニズムを使用できますが、.lib にリンクするプロジェクトでは通常、POOL_NX_OPTINも使用する必要があります。 少なくとも、DriverEntry ルーチンを実装するプロジェクトには、次の関数呼び出しが含まれている必要があります。

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);