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