次の方法で共有


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 呼び出すべきではありません。

必要条件

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

関連項目

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket