ExAllocatePool2 関数 (wdm.h)
ExAllocatePool2 ルーチンは、指定した型のプール メモリを割り当て、割り当てられたブロックへのポインターを返します。
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 、exAllocatePoolUninitialized、ExAllocatePoolQuotaZero、または ExAllocatePoolQuotaUninitializedを使用します。
このルーチンには、以前の割り当てルーチン (ExAllocatePoolWithTag、ExAllocatePoolWithQuotaTag 、ExAllocatePoolWithTagPriority) と次の違いがあります。
POOL_FLAG_UNINITIALIZED が指定されていない限り、メモリは 0 で初期化されます。
割り当てが失敗した場合の動作を返します。 ExAllocatePoolWithQuotaTag 既定で例外が発生します。
値が 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で実行する呼び出し元は、Flagsの POOL_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 の