實作 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。