次の方法で共有


IoAllocateIrpEx 関数 (wdm.h)

IoAllocateIrpEx 、システムの非ページ プールから IRP を割り当てます。場合によっては、IRP 拡張機能を使用します。

構文

PIRP IoAllocateIrpEx(
  PDEVICE_OBJECT DeviceObject,
  CCHAR          StackSize,
  BOOLEAN        ChargeQuota
);

パラメーター

DeviceObject

IRP 拡張機能の領域を追加するかどうかを確認するデバイス オブジェクトへのポインター。 DeviceObject が DEVICE_WITH_IRP_EXTENSION に設定されている場合、IRP 拡張機能の領域も割り当てられます。

StackSize

IRP に割り当てられるスタックの場所の最大数。 StackSize は、次の下位ドライバーのデバイス オブジェクトの StackSize と少なくとも等しい必要がありますが、この値より 1 大きい値を指定できます。 呼び出し元のドライバーは、それ自体の IRP にスタックの場所を割り当てる必要はありません。

ChargeQuota

ChargeQuota TRUE に設定すると、IRP に割り当てられたメモリが現在のプロセスのクォータに対して課金されます。 このパラメーターは、ドライバーが別の IRP を割り当てる I/O 要求を開始するスレッドのコンテキストで呼び出される最上位レベルのドライバーによってのみ TRUE 設定できます。 中間ドライバーは、このパラメーターを FALSE 設定する必要があります。

戻り値

IoAllocateIrpEx は、割り当てられた初期化された IRP へのポインターを返すか、IRP を割り当てられなかった場合は NULL します。

備考

IoAllocateIrpEx は、スタックの場所 StackSize 割り当て、IRP を初期化します。 IRP はスレッドに関連付けされません。 割り当てるドライバーは、I/O マネージャーに戻す代わりに IRP を解放する必要があります。

中間または最上位レベルのドライバーは、IoAllocateIrpEx を呼び出して、下位レベルのドライバーに送信する要求の IRP を作成できます。 このようなドライバーは、IRP を初期化する必要がありますし、下位レベルのドライバーが要求の処理を完了したときに、呼び出し元が IRP を破棄できるように、作成する IRP の IoCompletion コールバック ルーチンを設定する必要があります。 IoAllocateIrp は、IRP のメンバーを自動的に初期化します。 最初に使用する前に、IoInitializeIrp を使用して IRP を初期化しないでください。 (IoInitializeIrp を使用して、特定の特殊な状況で既に使用している IRP を再利用できます。詳細については、IRP の再利用に関するページを参照してください)。中間または最上位レベルのドライバーは、IoBuildDeviceIoControlRequest IoBuildAsynchronousFsdRequest、または IoBuildSynchronousFsdRequest を呼び出して、下位レベルのドライバーに送信する要求を設定することもできます。 IoMakeAssociatedIrp呼び出すことができるのは最上位ドライバーだけです。

必要条件

要件 価値
サポートされる最小クライアント Windows 10 (バージョン 1507) 以降で使用可能
ターゲット プラットフォーム 万国
ヘッダー wdm.h (wdm.h、ntddk.h、ntifs.h を含む)
ライブラリ ntoskrnl.lib
DLL ntoskrnl.exe
IRQL <= DISPATCH_LEVEL

関連項目

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompletion

IoBuildSynchronousFsdRequest

IoFreeIrp

IoMakeAssociatedIrp

IoReuseIrp

IoSetCompletionRoutine