ExAllocatePoolWithQuotaTag 関数 (wdm.h)

ExAllocatePoolWithQuotaTag ルーチンはプール メモリを割り当て、現在のプロセスに対してクォータを課金します。

警告

ExAllocatePoolWithQuotaTag は、バージョン 2004 Windows 10で非推奨となり、ExAllocatePool2 に置き換えられました。 詳細については、「 ExAllocatePool2 と ExAllocatePool3 に対する非推奨の ExAllocatePool 呼び出しの更新」を参照してください。

構文

PVOID ExAllocatePoolWithQuotaTag(
  [in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
  [in] SIZE_T                                         NumberOfBytes,
  [in] ULONG                                          Tag
);

パラメーター

[in] PoolType

割り当てるプール メモリの種類を指定します。 使用可能なプール メモリの種類の説明については、「 POOL_TYPE」を参照してください。

PoolType 値は、POOL_QUOTA_FAIL_INSTEAD_OF_RAISE フラグを使用してこの値をビット単位で ORing することで変更できます。 このフラグにより、要求を満たすことができない場合、ルーチンは NULL 値を返します。

同様に、この値を POOL_COLD_ALLOCATION フラグでカーネルにヒントとしてビット単位で ORing することで 、PoolType 値を変更して、ページアウトされる可能性が高いページからメモリを割り当てることができます。 常駐プールのメモリ量をできるだけ減らすには、これらの割り当てを頻繁に参照しないでください。 POOL_COLD_ALLOCATION フラグは単にアドバイザリであり、Windows XP 以降のバージョンの Windows オペレーティング システムでサポートされています。

[in] NumberOfBytes

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

[in] Tag

割り当てられたメモリのプール タグを指定します。 詳細については、「ExAllocatePoolWithTagTag パラメーター」を参照してください。

戻り値

ExAllocatePoolWithQuotaTag は、割り当てられたプールへのポインターを返します。

要求を満たすことができない場合、 ExAllocatePoolWithQuotaTag は、POOL_QUOTA_FAIL_INSTEAD_OF_RAISEが指定されていない限り例外を発生させます。 パフォーマンス上の理由から、POOL_QUOTA_FAIL_INSTEAD_OF_RAISEを使用することをお勧めします。

注釈

このルーチンは、最初に I/O 要求を行ったプロセスのコンテキストで要求を満たすためにメモリを割り当てる最上位レベルのドライバーによって呼び出されます。 下位レベルのドライバーでは、代わりに ExAllocatePoolWithTag が呼び出されます。

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

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

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

NumberOfBytes = 0 を設定しないでください。 長さ 0 の割り当ては避けてください。プール ヘッダー領域が無駄になり、多くの場合、呼び出し元のコードで検証の問題が発生する可能性があることを示しています。 このため、 ドライバー検証ツール は、このような割り当てを可能なエラーとしてフラグを設定します。

プールの量 (ページまたは非ページ) が高いか低い場合、システムは特定の標準イベント オブジェクトを自動的に設定します。 ドライバーは、これらのイベントがプールの使用状況を調整するのを待つことができます。 詳細については、「 標準イベント オブジェクト」を参照してください。

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

ExAllocatePoolWithQuotaTag が割り当てるメモリは初期化されていません。 カーネル モード ドライバーは、このメモリをユーザー モード ソフトウェアに表示する場合 (特権のある可能性のあるコンテンツのリークを回避するため) 最初にゼロにする必要があります。

ExAllocatePoolWithQuotaTag の呼び出し元は、IRQL <= DISPATCH_LEVELで実行されている必要があります。 DISPATCH_LEVELで実行する呼び出し元は、PoolTypeNonPagedXxx 値を指定する必要があります。 IRQL <= APC_LEVEL で実行される呼び出し元は、任意 のPOOL_TYPE 値を指定できますが、IRQL と環境もプールの種類を決定するために考慮する必要があります。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (「解説」セクションを参照)
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport)SpNoWait(storport)StorPortStartIo(storport)UnsafeAllocatePool(kmdf)

こちらもご覧ください

ExAllocatePoolWithTag

ExFreePool

ExFreePoolWithTag

POOL_TYPE