取消常式簡介
任何可以無限期間隔的 IRP 處於擱置狀態的驅動程式,都必須有一或多個 Cancel 常式。 例如,鍵盤驅動程式可能會無限期等候使用者按下按鍵。 相反地,如果驅動程式永遠不會排入超過五分鐘內完成的 IRP 佇列,則可能不需要 Cancel 常式。
假設使用者模式執行緒發出 I/O 要求,該要求會由最高層級設備磁碟機的分派常式排入佇列,而要求執行緒會在 IRP 排入佇列時終止。 應取消代表終止執行緒排入佇列的 IRP。 因此,驅動程式必須在佇列的每個 IRP 中設定驅動程式提供的 Cancel 常式。
建立相關聯 IRP 的驅動程式必須在取消主要 IRP 時取消它們。 由於相關聯的 IRP 未與要求執行緒相關聯,因此主要 IRP 的 Cancel 常式會負責取消主要 IRP 取消時的任何相關聯 IRP。
任何驅動程式擁有的 Cancel 常式數目取決於驅動程式的設計。 一般而言,驅動程式在其 I/O 處理中的每個階段都應該有 Cancel 常式,IRP 可能會在無限間隔內處於擱置狀態。 這類擱置的 IRP 會處於 可取消的狀態。
請考慮下列設計指導方針:
如果階層式驅動程式鏈結中的最高層級驅動程式排入 IRP 佇列,或保留可取消狀態的 IRP,則至少必須有一個 Cancel 常式。 如有必要,它可以有多個 Cancel 常式。
低階驅動程式,其中 IRP 可以保留相當長間隔的可取消狀態,也應該有一或多個 Cancel 常式。
如果驅動程式管理自己的內部 IRP 佇列,則每個佇列都應該有個別的 Cancel 常式。
某些適用于互動式裝置的高階驅動程式,例如鍵盤、滑鼠、音效、平行類別和序列驅動程式,都必須有 Cancel 常式。 某些較低層級的驅動程式,例如將 IRP 排入佇列的某些較高層級類別驅動程式的平行埠驅動程式,以相對較長的間隔,也應該有 Cancel 常式。
大量儲存設備磁碟機,以及分層在它們上的中繼驅動程式,不太可能有 Cancel 常式。 檔案系統驅動程式負責處理檔案 I/O 要求的取消,而較低層級大量儲存體驅動程式的 IRP 輸入通常處理到完成速度太快而無法取消。