共用方式為


ControllerControl 例程需求

顧名思義, ControllerControl 常式與控制器物件相關聯。 當 ControllerControl 常式執行時,控制器物件所代表的硬體是空閒的,而且除非控制器延伸模組包含與驅動程式 ISR 共用的內容,否則另一個驅動程式常式通常不會存取控制器延伸模組。

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

  1. 更新或初始化驅動程式在目標裝置物件的裝置擴展和控制器擴展中所維護的任何上下文

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

    如果驅動程式使用 PIO,並且其硬體需要這樣做,則其 ControllerControl 常式還負責將 傳輸要求 分割成部分傳輸範圍,並在Irp->MdlAddress 處使用 MDL 呼叫 MmGetSystemAddressForMdlSafe

  2. 針對所要求的 I/O 作業對其硬體進行程式設計

    如果可以從 ISR 存取裝置或控制器延伸模組,則 ControllerControl 常式必須使用呼叫 KeSynchronizeExecution 所叫用的 SynchCritSection 常式。 如需詳細資訊,請參閱「使用重要區段」

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

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

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

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

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

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

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

  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