共用方式為


取消常式簡介

任何可以無限期間隔的 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 輸入通常處理到完成速度太快而無法取消。