次の方法で共有


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

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

戻り値

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

注釈

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

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

要件

要件
サポートされている最小のクライアント Windows 10 (バージョン 1507) 以降で使用可能
対象プラットフォーム ユニバーサル
Header wdm.h (include wdm.h, ntddk.h, ntifs.h)
Library ntoskrnl.lib
[DLL] ntoskrnl.exe
IRQL <= DISPATCH_LEVEL

こちらもご覧ください

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompletion

IoBuildSynchronousFsdRequest

IoFreeIrp

IoMakeAssociatedIrp

IoReuseIrp

IoSetCompletionRoutine