ControllerControl 常式需求

如其名稱所示, ControllerControl 常式與控制器物件相關聯。 當 ControllerControl 常式執行時,控制器物件所代表的硬體是免費的,而且控制器延伸模組通常不會由另一個驅動程式常式存取,除非控制器延伸模組包含與驅動程式 ISR 共用的內容。

ControllerControl常式通常至少會執行下列動作:

  1. 更新或初始化驅動程式在目標裝置物件的裝置延伸模組和控制器擴充功能中維護的任何內容

    如果驅動程式使用 DMA,其 ControllerControl 常式通常負責判斷指定的傳輸要求是否必須分割成部分傳輸,因為每個 DMA 傳輸的大小有任何系統加總或裝置加總的限制。 在這些情況下,如果驅動程式具有AdapterControl常式,ControllerControl常式也會負責呼叫AllocateAdapterChannel

    如果驅動程式使用 PIO,其ControllerControl常式也會負責將傳輸要求分割成部分傳輸範圍,以及呼叫 MDL at Irp-MdlAddressForMdlSafe 與 MDL at Irp-MdlAddress >

  2. 針對要求的 I/O 作業設定其硬體

    如果可以從 ISR 存取裝置或控制器擴充功能,ControllerControl常式必須使用呼叫KeSynchronizeExecution所叫用的SynchCritSection常式。 如需詳細資訊,請參閱 使用重要章節

如果驅動程式有 Cancel 常式,其 ControllerControl 常式也必須檢查 Irp-Cancel > 欄位,以判斷是否應該取消目前的 IRP,並執行下列其中一項:

如果 Irp-Cancel > 設定為 TRUEControllerControl 常式必須執行下列動作:

  1. 在 IRP 的 I/O 狀態欄塊中,針對 [ 狀態 ] 設定STATUS_CANCELLED ,並為 [ 資訊 ] 設定為零。

  2. 呼叫 IoFreeController 以釋放控制器物件,以便立即啟動下一個裝置作業。

  3. 如果驅動程式管理自己的佇列,請呼叫 IoStartNextPacket 或取消佇列下一個 IRP。

  4. 使用 IoCompleteRequest 完成取消的 IRP 並傳回控制項。

如果 Irp-Cancel > 未設定為 TRUEControllerControl 常式必須改為執行下列動作:

  1. 呼叫 IoSetCancelRoutine ,將 IRP 的 取消 常式進入點重設為 Null。 如果驅動程式在裝置物件中使用 I/O 管理員提供的裝置佇列,請取得此呼叫的取消微調鎖定。

  2. 使用呼叫KeSynchronizeExecution所叫用的SynchCritSection常式,為要求的 I/O 作業設計硬體。 如需詳細資訊,請參閱 使用重要章節

如需處理可 取消 IRP 的詳細資訊,請參閱取消 IRP

對於大部分中斷驅動 I/O 作業,除了連結至實體控制器/配接器的不同裝置上的重迭作業以外, ControllerControl 常式應該會傳回 KeepObject ,因為 DpcForIsrCustomDpc 常式會完成作業和 IRP。

一旦完成 I/O 作業 () 以滿足目前要求,完成 IRP 的常式應該呼叫 IoFreeControllerIoStartNextPacket ,以便儘快處理下一個要求。

如果 ControllerControl 常式本身完成 IRP,或如果它可以設定作業,例如磁片搜尋,則一個目標裝置物件 (磁片) 可能會與另一個裝置物件的作業重迭, ControllerControl 常式應該會傳回 DeallocateObject