単一バイナリ オプトイン: 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);