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 を変更するには、カーネルにヒントとして POOL_COLD_ALLOCATION フラグを付けてビットごとの OR を使用して、ページアウトされる可能性が高いページからメモリを割り当てることができます。 常駐プール メモリの量をできるだけ減らすには、これらの割り当てを頻繁に参照しないでください。 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 を使用してください。 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Classpnp.h、Smcnt.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL (「解説」セクションを参照) |
DDI コンプライアンス規則 を する | CheckDeviceObjectFlags(wdm), HwStorPortProhibitedDDDIs(storport), IrqlExAllocatePool(wdm), PowerDownAllocate(wdm), UpFail(wdm)、SpNoWait(storport)、StorPortStartIo(storport)、UnsafeAllocatePool(kmdf)、UnsafeAllocatePool(wdm) |
関連項目
ExAllocatePoolWithTag の