StartIo 常式的考慮點
實作 StartIo 常式時,請記住下列幾點:
StartIo常式必須同步處理其實體裝置的存取權,以及驅動程式在裝置擴充功能中維護的任何共用狀態資訊或資源,以及存取相同裝置、記憶體位置或資源的驅動程式其他常式。
如果 StartIo 常式與 ISR 共用裝置或狀態,它必須使用 KeSynchronizeExecution 來呼叫驅動程式提供的 SynchCritSection 常式來程式設計裝置或存取共用狀態。 如需詳細資訊,請參閱 使用重要區段。
如果 StartIo 常式與 ISR 以外的常式共用狀態或資源,則必須使用驅動程式提供儲存體的驅動程式初始化執行微調鎖定來保護共用狀態或資源。 如需詳細資訊,請參閱 微調鎖定。
如果整合型非 WDM 設備磁碟機設定控制器物件,則其 StartIo 常式可以使用控制器物件,透過共用實體裝置與附加 (類似的) 裝置同步處理作業。
如需詳細資訊 ,請參閱控制器物件 。
除非緊密結合的較高層級驅動程式為其基礎設備磁碟機準備大型 DMA 傳輸要求,否則基礎設備磁碟機的 StartIo 常式必須將大型傳輸要求分割成部分傳輸範圍,而且驅動程式必須執行一連串的部分傳輸裝置作業。 每個部分傳輸都必須調整大小,以符合硬體的功能:驅動程式裝置的功能,或針對次級 DMA 裝置,系統 DMA 控制器的功能,無論哪一個都有更嚴格的限制。
如需使用系統或匯流排主機 DMA 的詳細資訊,請參閱 配接器物件和 DMA。
使用 DMA 之驅動程式的 StartIo 常式必須使用配接器 物件同步傳輸。
StartIo常式是在 IRQL = DISPATCH_LEVEL執行,這會限制它可以呼叫的支援常式集。
例如, StartIo 常式無法存取或配置可分頁記憶體,而且無法等候發送器物件設定為已發出訊號的狀態。 另一方面, StartIo 常式可以使用 KeAcquireSpinLockAtDpcLevel 和 KeReleaseSpinLockFromDpcLevel取得並釋放驅動程式配置的執行微調鎖定,其執行速度比 KeAcquireSpinLock 和 KeReleaseSpinLock快。
如果驅動程式處於可取消狀態的 IRP,其 StartIo 常式必須檢查輸入 IRP 是否已取消,然後才開始對其裝置上該要求進行任何處理。 如需詳細資訊,請參閱 取消 IRP。