共用方式為


取消例程(Cancel Routines)簡介

在無限間隔內,IRP 可以處於擱置狀態的任何驅動程式都必須有一或多個 Cancel 例程。 例如,鍵盤驅動程式可能會無限期地等候使用者按下按鍵。 相反地,如果驅動程式永遠不會排入比五分鐘內能完成的更多的 IRP 佇列,那麼它可能不需要 Cancel 例程。

假設使用者模式執行緒發出一個 I/O 要求,這個要求被最高層級的裝置驅動程式的分派例程排入隊列,而在 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 輸入通常會處理到完成太快而無法取消。