同步處理 IRP 取消
從驅動程式的觀點來看,您可以隨時取消 IRP。 IRP 取消會以非同步方式發生;因此,驅動程式必須能夠處理一些潛在的競爭條件,如果 IRP 在下列任一點取消,就會建立:
呼叫驅動程式常式之後,但在將 IRP 排入佇列之前。
呼叫驅動程式常式之後,但在嘗試處理 IRP 之前。 例如,在呼叫驅動程式 的 StartIo 常式之後,可能會取消 IRP,但在 StartIo 常式從裝置佇列中移除 IRP 之前。
在驅動程式常式取消佇列 IRP 之後,但在啟動要求的 I/O 之前。
請注意,在驅動程式排入 IRP 佇列並釋放任何保護佇列的微調鎖定之後,另一個執行緒可以存取並變更 IRP。 當原始執行緒繼續時,即使下一行程式碼一樣,IRP 可能已經取消或變更。
驅動程式可以使用取消安全的 IRP 佇列架構來實作 IRP 佇列。 系統接著會為驅動程式註冊 Cancel 常式,以自動處理同步處理,以安全地取消 IRP。 如需詳細資訊 ,請參閱取消安全 IRP 佇列 。 否則,驅動程式必須實作自己的同步處理。
下列 IRP 成員包含取消的相關資訊:
Irp- >取消 表示 IRP 正在取消或應該取消。
Irp- >CancelRoutine 指出 IRP 是否可取消。 如果這個成員包含取消常式的指標,則 IRP 是可取消的。 如果此成員為 Null,則 IRP 無法取消。 如果這個成員是 Null,但已設定 Irp-Cancel > ,表示取消常式正在執行,而且 IRP 正在取消。
如果驅動程式處理可取消的 IRP,它會負責在每個 IRP 中設定處於可取消狀態的適當 Cancel 常式。
本節包含下列有關同步處理 IRP 取消的主題。