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,則驅動程式不應該在將 IRP 傳遞至下一個較低的驅動程式之前,先呼叫 IoSkipCurrentIrpStackLocation 。 如果驅動程式在手寫筆 IRP 上呼叫 IoSkipCurrentIrpStackLocation ,再將它傳遞給下一個下一個下一個驅動程式,則SL_PENDING_RETURNED旗標仍會在下一個驅動程式的 I/O 堆棧位置 控制 成員中設定。 因為下一個驅動程式擁有該堆疊位置,而且可能會修改它,所以可能會清除擱置的旗標。 這種情況可能會導致操作系統發出錯誤檢查,或 IRP 的處理永遠不會完成。
相反地,已寫入 IRP 的驅動程式應該呼叫 IoCopyCurrentIrpStackLocationToNext ,以在呼叫 IoCallDriver 之前,為下一個較低的驅動程式設定新的堆疊位置。
如果您的驅動程式呼叫 IoSkipCurrentIrpStackLocation,請小心不要以不小心影響較低驅動程式或系統相對於該驅動程序的行為的方式來修改 IO_STACK_LOCATION 結構。 範例包括修改 IO_STACK_LOCATION 結構的 Parameters 聯集或呼叫 IoMarkIrpPending。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 |
標頭 | wdm.h |
IRQL | 任何層級 |