次の方法で共有


_RxAllocatePoolWithTag 関数

_RxAllocatePoolWithTag は、ブロックの先頭で 4 バイトのタグを使用してプールからメモリを割り当てます。これは、メモリが捨てられるインスタンスをキャッチするのに役立ちます。

構文

VOID* _RxAllocatePoolWithTag(
   ULONG Type,
   ULONG Size,
   ULONG Tag,
   PSZ   FileName,
   ULONG LineNumber
);

パラメーター

Type
割り当てるプールの種類。 このパラメーターには、次の POOL_TYPE 列挙型値のいずれかを指定できます。

NonPagedPool
任意の IRQL からアクセスできるページング不可能なシステム メモリ。 NonPagedPool メモリは希少なリソースなので、ドライバーは必要なときにだけこれを割り当てるようにする必要があります。 システムは、PAGE_SIZE より大きいバッファーのみを、NonPagedPool から、PAGE_SIZE の倍数で割り当てることができます。 PAGE_SIZE より大きくても PAGE_SIZE の倍数ではないバッファーを要求すると、ページング不可能なメモリが無駄になります。

PagedPool
IRQL < DISPATCH_LEVEL でのみ割り当ておよびアクセスできる、ページング可能なシステム メモリ。

[サイズ]
割り当てるメモリ ブロックのサイズ (バイト単位)。

Tag
割り当てられるバッファーのマークに使用する 4 バイトのタグ。 タグの使用方法については、ExAllocatePoolWithTag に関する記事を参照してください。 タグの各文字の ASCII 値は、0 から 127 の間である必要があります。

ファイル名
メモリ割り当てが行われたソース ファイル名を指すポインター。 このパラメーターは現在使用されていません。

LineNumber
メモリ割り当てが行われたソース ファイル内の行番号です。 このパラメーターは現在使用されていません。

戻り値

空きプールに要求を満たすためのメモリが不足している場合、RxAllocatePoolWithTagNULL を返します。 それ以外の場合、ルーチンは割り当てられたメモリを指すポインターを返します。

解説

このルーチンを直接使う代わりに、RxAllocatePoolWithTag マクロを呼び出すことをお勧めします。 リテール ビルドでは、このマクロは ExAllocatePoolWithTag を呼び出すように定義されています。 チェック ビルドでは、このマクロは _RxAllocatePoolWithTag を呼び出すように定義されています。

_RxAllocatePoolWithTag ルーチンは、優先度 (要求の重要度) を LowPoolPriority に設定して ExAllocatePoolWithTagPriority を呼び出します。 リソースが不足している場合、システムは LowPoolPriority の要求に失敗する可能性があります。 ドライバーでこのルーチンを使う場合は、割り当てエラーから回復できるように準備しておく必要があります。

システムは、プール メモリから PAGE_SIZE 以上のバッファーを割り当てる場合、ページ境界にバッファーを揃えます。 PAGE_SIZE よりも小さいメモリ要求は、必ずしもページ境界に揃えられるわけではありませんが、常に 1 つのページ内に収まり、8 バイトの境界に揃えられます。 PAGE_SIZE より大きく、PAGE_SIZE の倍数ではないブロックを要求する割り当てが成功すると、最後に割り当てられたページの未使用のバイトはすべて無駄になります。

システムは、割り当てられたメモリにプール タグを関連付けます。 WinDbg などのプログラミング ツールを使うと、割り当てられた各バッファーに関連付けられているプール タグを表示できます。 通常、Tag の値は逆順で表示されます。 たとえば、呼び出し元が Tag として 'Fred' を渡した場合、メモリがダンプされたときやデバッガーでメモリの使用状況を追跡するときには 'derF' として表示されます。

_RxAllocatePoolWithTag を使って割り当てたメモリは、_RxFreePool を呼び出して解放する必要があります。

_RxAllocatePoolWithTag の呼び出し元は、IRQL <= DISPATCH_LEVEL で実行されている必要があります。 DISPATCH_LEVEL で実行されている呼び出し元は、Type パラメーターに NonPagedPool 値を指定する必要があります。 IRQL <= APC_LEVEL で実行されている呼び出し元は、Type パラメーターに任意の POOL_TYPE 値を指定できます。

要件

対象プラットフォーム

デスクトップ

ヘッダー

Ntrxdef.h (Ntrxdef.h をインクルード)

IRQL

「解説」セクションをご覧ください。

関連項目

ExAllocatePoolWithTag

_RxCheckMemoryBlock

_RxFreePool