ExAllocatePool 関数 (wdm.h)
警告
ExAllocatePool は廃止され、Windows 10 バージョン 2004 では非推奨となりました。 ExAllocatePool2 に置き換えられました。 詳細については、「 ExAllocatePool2 および ExAllocatePool3 への非推奨の ExAllocatePool 呼び出しの更新」を参照してください。
Windows 10 バージョン 2004 より前のバージョンの Windows 用ドライバーを開発する場合は、ExAllocatePoolZero を使用します。
ExAllocatePool は 、指定した型のプール メモリを割り当て、割り当てられたブロックへのポインターを返します。
構文
PVOID ExAllocatePool(
[in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
[in] SIZE_T NumberOfBytes
);
パラメーター
[in] PoolType
割り当てるプール メモリの種類を指定します。 使用可能なプール メモリの種類の詳細については、「 POOL_TYPE」を参照してください。
PoolType を変更するには、ビットごとの OR を使用し、POOL_COLD_ALLOCATION フラグをカーネルにヒントとして使用して、ページ アウトが迅速に行われる可能性が高いページからメモリを割り当てることができます。 常駐プール メモリの量をできるだけ減らすには、これらの割り当てを頻繁に参照しないでください。 POOL_COLD_ALLOCATION フラグはアドバイザリのみで、Windows XP 以降のバージョンの Windows オペレーティング システムで使用できます。
[in] NumberOfBytes
割り当てるバイト数を指定します。
戻り値
要求を満たすために空きプールにメモリが不足している場合、ExAllocatePool は NULL を返します。 それ以外の場合、ルーチンは割り当てられたメモリへのポインターを返します。
注釈
このルーチンは、メモリの一般的なプール割り当てに使用されます。
NumberOfBytes がPAGE_SIZE以上の場合は、ページアラインバッファーが割り当てられます。 PAGE_SIZE以下のメモリ割り当ては、ページ境界を越えるものではありません。 PAGE_SIZE未満のメモリ割り当ては、必ずしもページアラインされるとは限りませんが、32 ビット システムでは 8 バイト境界、64 ビット システムでは 16 バイト境界にアラインされます。
非ページ プールの NumberOfBytes< PAGE_SIZEを要求する割り当てが成功すると、呼び出し元に要求されたメモリバイト数が正確に与わります。 NumberOfBytes> PAGE_SIZEの割り当て要求が成功し、NumberOfBytes がPAGE_SIZEの正確な倍数ではない場合、割り当ての最後のページには、呼び出し元の割り当ての一部ではないバイトが含まれます。 可能であれば、プール アロケーターはこれらのバイトを使用します。 他のカーネル モード コンポーネントに属するデータが破損しないようにするには、ドライバーが明示的に割り当てたストレージ アドレスにのみアクセスする必要があります。
ExAllocatePool が NULL を返す場合、呼び出し元は NTSTATUS 値STATUS_INSUFFICIENT_RESOURCESを返すか、処理を別の時点に遅延させる必要があります。
ExAllocatePool の呼び出し元は、IRQL <= DISPATCH_LEVELで実行されている必要があります。 DISPATCH_LEVELで実行する呼び出し元は、PoolType に NonPagedXxx 値を指定する必要があります。 IRQL <= APC_LEVEL で実行する呼び出し元は、任意 のPOOL_TYPE 値を指定できますが、IRQL と環境もページの種類を決定するために考慮する必要があります。
NumberOfBytes = 0 を設定しないでください。 長さ 0 の割り当てを避けます。プール ヘッダー領域が無駄になり、多くの場合、呼び出し元のコードで検証の問題が発生する可能性があることを示しています。 このため、 ドライバー検証ツールは 、このような割り当てを可能なエラーとしてフラグを設定します。
プールの量 (ページまたは非ページ) が高いか低い場合、システムは特定の標準イベント オブジェクトを自動的に設定します。 ドライバーは、これらのイベントがプールの使用状況を調整するのを待つことができます。 詳細については、「 標準イベント オブジェクト」を参照してください。
ExAllocatePool によって割り当てられるメモリは初期化されていません。 カーネル モード ドライバーは、このメモリをユーザー モード ソフトウェアに表示する場合は、まずこのメモリをゼロにする必要があります (特権のある可能性のあるコンテンツがリークされないようにするため)。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | 互換性のために残されています。 このルーチンは、既存のバイナリに対してのみエクスポートされます。 代わりに ExAllocatePoolWithTag を使用してください。 |
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Classpnp.h、Smcnt.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL (「解説」セクションを参照) |
DDI コンプライアンス規則 | CheckDeviceObjectFlags(wdm)、 HwStorPortProhibitedDDIs(storport)、 IrqlExAllocatePool(wdm)、 PowerDownAllocate(wdm)、 PowerUpFail(wdm)、 SpNoWait(storport)、 StorPortStartIo(storport)、 UnsafeAllocatePool(kmdf)、 UnsafeAllocatePool(wdm) |