次の方法で共有


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

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

戻り値

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

注釈

このルーチンは、メモリの一般的なプール割り当てに使用されます。

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

非ページ プールの NumberOfBytes< PAGE_SIZEを要求する割り当てが成功すると、呼び出し元に要求されたメモリバイト数が正確に与わります。 NumberOfBytes> PAGE_SIZEの割り当て要求が成功し、NumberOfBytes がPAGE_SIZEの正確な倍数ではない場合、割り当ての最後のページには、呼び出し元の割り当ての一部ではないバイトが含まれます。 可能であれば、プール アロケーターはこれらのバイトを使用します。 他のカーネル モード コンポーネントに属するデータが破損しないようにするには、ドライバーが明示的に割り当てたストレージ アドレスにのみアクセスする必要があります。

ExAllocatePoolNULL を返す場合、呼び出し元は NTSTATUS 値STATUS_INSUFFICIENT_RESOURCESを返すか、処理を別の時点に遅延させる必要があります。

ExAllocatePool の呼び出し元は、IRQL <= DISPATCH_LEVELで実行されている必要があります。 DISPATCH_LEVELで実行する呼び出し元は、PoolTypeNonPagedXxx 値を指定する必要があります。 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)

こちらもご覧ください

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE