英語で読む

次の方法で共有


ExAllocatePool2 関数 (wdm.h)

ExAllocatePool2 ルーチンは、指定した型のプール メモリを割り当て、割り当てられたブロックへのポインターを返します。

構文

C++
DECLSPEC_RESTRICT PVOID ExAllocatePool2(
  POOL_FLAGS Flags,
  SIZE_T     NumberOfBytes,
  ULONG      Tag
);

パラメーター

Flags

必要な属性と省略可能な属性と共にプール メモリの種類を指定するULONG64型指定された値。 ビットごとの OR を使用して、複数のフラグ値を組み合わせることができます。 使用可能な値については、POOL_FLAGS を参照してください。

NumberOfBytes

割り当てる 0 以外のバイト数を指定します。

Tag

割り当てられたメモリに使用するプール タグ。 単一引用符で区切られた 1 ~ 4 文字の 0 以外の文字リテラルとしてプール タグを指定します (例: Tag1)。 通常、文字列は逆の順序で指定されます (たとえば、1gaT)。 タグ内の各 ASCII 文字は、0x7E (チルダ) 0x20 (スペース) の範囲内の値である必要があります。 各割り当てコード パスでは、デバッガーと検証ツールがコード パスを識別するのに役立つ一意のプール タグを使用する必要があります。

戻り値

ExAllocatePool2 、割り当てられたメモリへのポインターを返します。

次の条件により、関数は既定で NULL を返します。 POOL_FLAG_RAISE_ON_FAILURE が指定されている場合、関数は例外を発生させます。

  • メモリ不足
  • タグ が 0 に設定されているか、無効なPOOL_FLAGSが指定されている

備考

Windows 10 バージョン 2004 より前のバージョンの Windows を対象とするドライバーをビルドする場合は、ExAllocatePoolZero 、exAllocatePoolUninitializedExAllocatePoolQuotaZero、または ExAllocatePoolQuotaUninitializedを使用します。

このルーチンには、以前の割り当てルーチン (ExAllocatePoolWithTag、ExAllocatePoolWithQuotaTag ExAllocatePoolWithTagPriority) と次の違いがあります。

  1. POOL_FLAG_UNINITIALIZED が指定されていない限り、メモリは 0 で初期化されます。

  2. 割り当てが失敗した場合の動作を返します。 ExAllocatePoolWithQuotaTag 既定で例外が発生します。

  3. 値が 0 のタグは無効です。

ExAllocatePoolWithQuotaTagExAllocatePool2 置き換える場合は、POOL_FLAG_USE_QUOTA フラグを指定する必要があります。 プール フラグの詳細については、POOL_FLAGSを参照してください。

NumberOfBytes PAGE_SIZE 以上の場合は、ページアライン バッファーが割り当てられます。 PAGE_SIZE 以下のメモリ割り当てはページ内に割り当てられ、ページ境界を越えるものではありません。 PAGE_SIZE 未満のメモリ割り当ては必ずしもページアラインされるわけではありませんが、32 ビット システムでは 8 バイト境界、64 ビット システムでは 16 バイト境界にアラインされます。

ドライバーは、明示的に割り当てられている NumberOfBytes までしか使用できません。 この範囲外のメモリにアクセスすると、プールが破損し、システムがクラッシュする可能性があります。

システムは、プール タグを割り当てられたメモリに関連付けます。 WinDbg などのプログラミング ツールでは、割り当てられた各バッファーに関連付けられているプール タグを表示できます。 Gflags は、Windows 用のデバッグ ツールに含まれるツールで、特定のプール タグの特別なプールからの割り当てを要求するシステム機能を有効にします。 WDK に含まれる Poolmon は、プール タグによってメモリを追跡します。

タグの値は、逆 (リトル エンディアン) 順に格納され、場合によっては表示されます。 たとえば、呼び出し元が Fred をタグとして渡すと、プール ダンプとデバッガーのプール使用状況の追跡に derF として表示され、レジストリとツールの 0x64657246 として表示されます。

割り当てられたバッファーは、ExFreePool または ExFreePoolWithTag を使用して解放できます。

ExAllocatePool2 の呼び出し元は、IRQL <= DISPATCH_LEVEL で実行されている必要があります。 DISPATCH_LEVELで実行する呼び出し元は、FlagsPOOL_FLAG_NON_PAGED または POOL_FLAG_NON_PAGED_EXECUTABLE を指定する必要があります。 IRQL <= APC_LEVEL で実行する呼び出し元は POOL_FLAG_PAGEDを指定できますが、DISPATCH_LEVELで実行されているコードからメモリにアクセスする場合は、ページングされていないメモリを割り当てる必要があります。

非一様メモリ アクセス (NUMA) マルチプロセッサ アーキテクチャでは、ExAllocatePool2 は、ExAllocatePool2 を呼び出しているプロセッサにローカルなメモリ割り当てようとします。 使用可能なローカル メモリがない場合は、ExAllocatePool2 、使用可能な最も近いメモリを割り当てます。

ExAllocatePool2 が割り当てる メモリは、0 初期化されます。 カーネル モード ドライバーは、機密情報の開示を回避するために、信頼されていない場所 (ユーザー モード、ネットワーク経由など) にコピーされる割り当てのゼロ化をオプトアウトしないでください。

必要条件

要件 価値
サポートされる最小クライアント Windows 10 バージョン 2004
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL (「解説」セクションを参照)
DDI コンプライアンス規則 する HwStorPortProhibitedDIs、SpNoWait、StorPortStartIo

関連項目

ExAllocatePool3