(wdm.h) IoMarkIrpPending 函式
IoMarkIrpPending 例程會標示指定的 IRP,指出驅動程式的分派例程後續會傳回STATUS_PENDING,因為其他驅動程式例程需要進一步處理。
語法
void IoMarkIrpPending(
[in, out] PIRP Irp
);
參數
[in, out] Irp
要標示為擱置之 IRP 的指標。
傳回值
無
備註
除非驅動程式的分派例程藉由呼叫 IoCompleteRequest) 來完成 IRP (,或將 IRP 傳遞給較低的驅動程式,否則它必須使用 IRP 呼叫 IoMarkIrpPending 。 否則,I/O 管理員會在分派例程傳回控件時立即嘗試完成 IRP。
呼叫 IoMarkIrpPending 之後,分派例程必須傳回STATUS_PENDING,即使某些例程在呼叫 IoMarkIrpPending 的分派例程傳回之前呼叫 IoCompleteRequest) 完成 IRP (也一樣。
如果驅動程式將傳入的 IRP 排入佇列,它應該先呼叫 IoMarkIrpPending ,再將每個 IRP 排入佇列。 否則,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 (wdm) 、 MarkDevicePower (wdm) 、 MarkInterlockedQueuedIrps (wdm) 、 MarkQueuedIrps (wdm) 、 MarkIrpPending (wdm ) 、 MarkIrpPending2 (wdm) 、 MarkPower (wdm) 、 MarkPowerDown (wdm) 、 MarkQueryRelations (wdm) 、 MarkStartDevice (wdm) 、 PendedCompletedRequest3 (wdm) |