IoSkipCurrentIrpStackLocation 函式 (wdm.h)
IoSkipCurrentIrpStackLocation 巨集會修改系統的 IO_STACK_LOCATION 陣列指標,因此當目前的驅動程式呼叫下一個較低的驅動程式時,該驅動程式會收到與目前驅動程式收到的相同 IO_STACK_LOCATION 結構。
語法
void IoSkipCurrentIrpStackLocation(
[in, out] PIRP Irp
);
參數
[in, out] Irp
IRP 的指標。
傳回值
沒有
言論
當您的驅動程式將 IRP 傳送至下一個較低的驅動程式時,如果不想提供 IoCompletion 例程,您的驅動程式可以呼叫 IoSkipCurrentIrpStackLocation (其位址儲存在驅動程式的 IO_STACK_LOCATION 結構中)。 如果您在呼叫 IoCallDriver之前呼叫 IoSkipCurrentIrpStackLocation,則下一個較低的驅動程式會收到與驅動程式收到的相同 IO_STACK_LOCATION。
如果您想要為 IRP 提供 IoCompletion 例程,您的驅動程式應該呼叫 IoCopyCurrentIrpStackLocationToNext,而不是 IoSkipCurrentIrpStackLocation。 如果撰寫錯誤的驅動程式犯了呼叫 IoSkipCurrentIrpStackLocation,然後設定完成例程的錯誤,此驅動程式可能會覆寫其上方驅動程式所設定的完成例程。
如果驅動程式已經畫上 IRP,則驅動程式不應該呼叫 IoSkipCurrentIrpStackLocation,再將 IRP 傳遞給下一個較低的驅動程式。 如果驅動程式呼叫 IoSkipCurrentIrpStackLocation,然後再將它傳遞給下一個較低的驅動程式,則SL_PENDING_RETURNED旗標仍會在下一個驅動程式的 Control 成員中設定。 由於下一個驅動程式擁有該堆疊位置並可能加以修改,因此可能會清除擱置的旗標。 這種情況可能會導致作系統發出錯誤檢查,或永遠不會完成 IRP 的處理。
相反地,已掛接 IRP 的驅動程式應該呼叫 IoCopyCurrentIrpStackLocationToNext,以在呼叫 ioCallDriver 之前,先設定下一個較低驅動程式的新堆疊位置。
如果您的驅動程式呼叫 IoSkipCurrentIrpStackLocation,請小心不要以無意中影響較低驅動程式或系統在該驅動程式上的行為的方式來修改 IO_STACK_LOCATION 結構。 範例包括修改 IO_STACK_LOCATION 結構的 Parameters 等位,或呼叫 IoMarkIrpPending。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 2000 |
標頭 | wdm.h |
IRQL | 任何層級 |