次の方法で共有


IoMarkIrpPending 関数 (wdm.h)

IoMarkIrpPending ルーチンは、指定された IRP をマークします。これは、他のドライバー ルーチンによってさらに処理が必要になるため、その後、ドライバーのディスパッチ ルーチンがSTATUS_PENDINGを返したことを示します。

構文

void IoMarkIrpPending(
  [in, out] PIRP Irp
);

パラメーター

[in, out] Irp

保留中としてマークされる IRP へのポインター。

戻り値

なし

解説

ドライバーのディスパッチ ルーチンが ( IoCompleteRequest を呼び出して) IRP を完了するか、下位のドライバーに IRP を渡す場合を除き、IRP で IoMarkIrpPending を呼び出す必要があります。 それ以外の場合、I/O マネージャーはディスパッチ ルーチンが制御を返すとすぐに IRP を完了しようとします。

IoMarkIrpPending を呼び出した後、ディスパッチ ルーチンは、IoMarkIrpPending を呼び出すディスパッチ ルーチンが戻る前に (IoCompleteRequest を呼び出して) IRP を完了した場合でも、STATUS_PENDINGを返す必要があります。

ドライバーが受信 IRP をキューに入れた場合は、各 IRP をキューに入る前に IoMarkIrpPending を呼び出す必要があります。 それ以外の場合は、IRP がデキューされ、別のドライバー ルーチンによって完了され、 IoMarkIrpPending の呼び出しが発生する前にシステムによって解放され、クラッシュが発生する可能性があります。

ドライバーが IRP の IoCompletion ルーチンを設定し、下位のドライバーに IRP を渡す場合、IoCompletion ルーチンは IRP-PendingReturned> フラグをチェックする必要があります。 フラグが設定されている場合、 IoCompletion ルーチンは IRP で IoMarkIrpPending を呼び出す必要があります。 IoCompletion ルーチンは、STATUS_PENDINGを返しません。 詳細については、「 IoCompletion ルーチンの実装」を参照してください。

IRP を作成し、別のスタックに送信するドライバーは、完了ルーチンで IoMarkIrpPending を呼び出す必要があります。 この呼び出しでは、これらのドライバーのスタックの場所がないため、次の割り当てのプール ヘッダーが破損します。

IRP を渡し、イベントを待機するドライバーは、保留中の IRP をマークする必要があります。 代わりに、 その IoCompletion ルーチンはイベントを通知し、STATUS_MORE_PROCESSING_REQUIREDを返す必要があります。

ドライバーで IoSkipCurrentIrpStackLocation を呼び出す場合は、そのドライバーに関連して下位のドライバーやシステムの動作が意図せず影響を受けるような方法で IO_STACK_LOCATION 構造体を変更しないように注意してください。 特に、ドライバーは 、IO_STACK_LOCATION 構造体の Parameters 共用体を変更しないでください。 また、IoMarkIrpPending を呼び出さないでください。

要件

要件
対象プラットフォーム デスクトップ
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
IRQL 任意のレベル
DDI コンプライアンス規則 CompleteRequestStatusCheck(wdm)CompletionEventChecking(wdm)IrpCancelField(wdm)LowerDriverReturn(wdm)MarkDevicePower(wdm)MarkingInterlockedQueuedIrps(wdm)MarkingQueuedIrps(wdm)MarkIrpPending(wdm)MarkIrpPending2(wdm)MarkPower(wdm)MarkPowerDown(wdm)MarkQueryRelations(wdm)MarkStartDevice(wdm)、、 PendedCompletedRequest3(wdm)

こちらもご覧ください

IO_STACK_LOCATION

Irp

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket