単一バイナリ オプトイン: POOL_NX_OPTIN
Windows 8とそれ以前のバージョンのWindowsの両方で動作する単一のドライバーバイナリを構築するには、POOL_NX_OPTINオプトインメカニズムを使用します。 これは、複数のWindowsバージョンをサポートする単一のドライバー バイナリを提供するサードパーティのハードウェアベンダー向けの移植支援です。
このオプトイン メカニズムを使用するには、以下を実行します:
オプトインしたいすべてのソースファイルに対して POOL_NX_OPTIN = 1 を定義します。 これを行うには、ドライバープロジェクトの適切なプロパティページに以下のプリプロセッサ定義を含めます:
C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1
DriverEntry (または同等の)ルーチンに、以下の関数呼び出しを含めます:
ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
この呼び出しは、ドライバー が NonPagedPool プールタイプを使用する割り当てを行ったり、 ExInitializeNPagedLookasideList ルーチンを呼び出したりする前に発生する必要があります。 ExInitializeDriverRuntime は強制インライン関数であり、Windows 8 またはそれ以降のバージョンの Windows で呼び出すことができます。
ほとんどのドライバーでは、単一ドライバーバイナリのオプトインメカニズムを有効にするには、これら 2 つのタスクで十分です。
実装詳細
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);