次の方法で共有


NX プールの互換性に関する問題

Windows 8 のドライバー バイナリで NX 非ページ プールを使用すると、以前のバージョンの Windows でこれらのバイナリを実行すると、互換性の問題が発生します。

Windows 8 は、NX 非ページング プールをサポートする Windows の最初のバージョンです。 ただし、x86、x64、および IA64 プロセッサ アーキテクチャで実行される Windows 7 以前のバージョンの Windows では、多数の既存のカーネル モード ドライバー バイナリを使用できます。 これらのドライバーは非ページ メモリを割り当てるために、NX 非ページ プールではなく、実行可能な非ページ プールを使用します。 下位互換性のために、Windows 7 および以前のバージョンの Windows で実行され、非ページ プールからメモリを割り当てるカーネル モード ドライバー バイナリは、Windows 8 で変更なしで実行されます。 ただし、これらのドライバーは、Windows 8 での NX 非ページ プールの可用性を利用しません。

Windows 8 での既存のドライバー バイナリの実行

Windows 7 (または以前のバージョンの Windows 用) 用にビルドされ、 NonPagedPool プールの種類を使用するドライバー バイナリは、Windows 8 では実行できません。 下位互換性を有効にするために、NonPagedPoolExecute 定数は、POOL_TYPE列挙体の NonPagedPool 定数と同じ値を持つように定義されています。 したがって、このドライバーを実行する任意のバージョンの Windows では、ドライバーが非ページ プールから割り当てるメモリは常に実行可能です。

Windows 8 は、Arm アーキテクチャをサポートする Windows の最初のバージョンです。 したがって、以前のバージョンの Windows 用にビルドされ、下位互換性を必要とする Arm 用のドライバー バイナリはありません。 代わりに、Arm 上の Windows 用に記述されたすべてのドライバーは、明示的に実行可能メモリを必要としない限り、非ページ プール割り当てで NonPagedPoolExecute の代わりに NonPagedPoolNx を指定する必要があります。

ドライバーが x86、x64、または IA64 から Arm に移植されている場合、ドライバーのビルド プロセス中に POOL_NX_OPTIN_AUTO オプトイン メカニズムが自動的に適用されます。 このオプトイン メカニズムでは、プリプロセッサを使用して、 NonPagedPool 定数名のすべてのインスタンスが既定で NonPagedPoolNx に置き換えられます。 必要に応じて、 POOL_NX_OPTOUT オプトアウト メカニズムを使用して、ファイルごとにこのオプトイン メカニズムをオーバーライドできます。

その他の互換性の問題

NonPagedPoolNx プールの種類は、Windows 8 以降でサポートされています。 以前のバージョンの Windows のドライバーでは、このプールの種類を使用しないでください。 これらの以前のバージョンの Windows のプール アロケーターは、ドライバーが NonPagedPoolNx プールの種類で割り当てを要求すると、正しく動作しません。

Windows 8 より前のバージョンの Windows では、 NonPagedPoolExecute プールの種類を NonPagedPool プールの種類の代わりに自由に使用できます。 POOL_TYPE列挙では、NonPagedPoolNonPagedPoolExecute が同じ値を持つよう定義されます。

NX プールタイプの移植ガイドライン

以前のバージョンの Windows から Windows 8 以降にドライバー コードを移植する場合、 NonPagedPoolNx および NonPagedPoolExecute プールの種類のサポートを追加する方法はいくつかあります。 次の一覧から、要件に最も適したアプローチを選択します。

  • ドライバーが Windows 8 より前のバージョンの Windows で実行することを意図していない場合は、 NonPagedPool のほとんどのインスタンスまたはすべてのインスタンスを NonPagedPoolNx に置き換えます。 開発者が NonPagedPool のインスタンスを NonPagedPoolExecute に置き換える必要があるのはまれです

  • ドライバーのソース コードが Windows 8 以前のバージョンの Windows の両方を対象とし、バージョンごとに異なるドライバー バイナリを配布する場合は、POOL_NX_OPTIN_AUTOオプトイン メカニズムを使用します。 この方法では、ドライバー ソースの NonPagedPool のインスタンスを置き換える必要はありません。 詳細については、「NX プール Opt-In メカニズム する」を参照してください。

  • ドライバーのソース コードが Windows 8 以前のバージョンの Windows の両方を対象とし、サポートされているすべてのバージョンで実行する 1 つのドライバー バイナリを配布する場合は、POOL_NX_OPTINオプトイン メカニズムを使用します。 この方法では、ドライバー ソースの NonPagedPool のインスタンスを置き換える必要はありません。 詳細については、「NX プール Opt-In メカニズム する」を参照してください。

これらの 3 つの方法のいずれかを使用することで、ほとんどのドライバーを迅速かつほとんど手間をかからずに移植できます。

ドライバー コード内の NonPagedPool のすべてのインスタンスを NonPagedPoolExecute に置き換えないでください。 NonPagedPoolExecute プールの種類は、実行可能である必要があるプール割り当てにのみ使用します (たとえば、Just-In-Time コンパイラまたは JIT コンパイラによって生成されたコードを実行する場合)。