共用方式為


撰寫 DPC 例程的指導方針

撰寫 DpcForIsrCustomDpc 例程時,請記住下列幾點:

  • DpcForIsrCustomDpc 例程必須同步處理其對實體裝置的存取權,以及驅動程式維護的任何共享狀態資訊或資源,並與驅動程式中存取相同裝置或記憶體位置的其他例程同步化。

    如果 DpcForIsrCustomDpc 例程與 ISR 共用裝置或狀態,則必須呼叫 KeSynchronizeExecution,並提供驅動程式提供的 SynchCritSection 例程,以程式設計裝置或存取共享狀態。 如需詳細資訊,請參閱使用重要區段

    如果 DpcForIsrCustomDpc 例程需要與其他例程(如 ISR 以外的例程)共享狀態或資源,例如一個互鎖佇列或一個計時器物件,那麼必須使用由驅動程式初始化的執行級自旋鎖來保護這些共享的狀態或資源。 如需詳細資訊,請參閱 自旋鎖

  • DpcForIsrCustomDpc 例程在 IRQL = DISPATCH_LEVEL執行,這會限制他們可以呼叫的支援例程集。

    例如,DpcForIsrCustomDpc 例程都無法存取或配置可分頁記憶體,而且無法等候 核心發送器物件 設定為訊號狀態。 另一方面,他們可以使用 KeAcquireSpinLockAtDpcLevelKeReleaseSpinLockFromDpcLevel來獲取並釋放驅動程式的執行緒自旋鎖,其運行速度比 KeAcquireSpinLockKeReleaseSpinLock更快。

    雖然 DPC 例程無法進行封鎖呼叫,但它可以將工作項排入佇列,以在等於 PASSIVE_LEVEL 的 IRQL 級別上執行的 系統工作執行緒中執行,。 工作專案可以進行封鎖呼叫,以等候發送器物件。 若要將工作專案排入佇列,DpcForIsr 例程通常會呼叫例程,例如 IoQueueWorkItem,而 CustomDpc 例程通常會呼叫 ExQueueWorkItem 例程。

  • DpcForIsrCustomDpc 例程通常負責在裝置上啟動下一個 I/O 作業。

    對於使用直接 I/O 的最低層級實體設備驅動器,此責任可能包括使用 SynchCritSection 例程來設計裝置以傳輸更多數據,以便在驅動程式呼叫 IoStartNextPacket之前滿足目前的 IRP。

  • DpcForIsrCustomDpc 例程應該只執行短暫的期間,而且應該盡可能將處理委派給背景工作線程。

    當 DPC 例程在處理器上執行時,所有線程都無法在同一個處理器上執行。 已排入佇列並準備好執行的其他 DPC 例程可以封鎖執行,直到目前的 DPC 例程完成為止。 為了避免系統回應性降低,每次呼叫系統時,一般 DPC 例程應該執行不超過 100 毫秒。 如果一個任務需要超過 100 微秒,且必須在 IRQL 等於 DISPATCH_LEVEL 的情況下執行,DPC 例程應在 100 微秒後結束,並排程一或多個 CustomTimerDpc 例程,以便稍後完成任務。 如需 CustomTimerDpc 例程的詳細資訊,請參閱 Timer Objects 和 DPC

    DPC 例程應該只執行必須在 DISPATCH_LEVEL 執行的工作,然後將任何剩餘的中斷相關工作委派給在 IRQL = PASSIVE_LEVEL 執行的執行緒。 例如,DPC 例程可以將工作專案排入佇列,以在 系統背景工作線程中執行。

    呼叫 KeStallExecutionProcessor 例程以延遲執行的 DPC 例程不可指定超過 100 微秒的延遲。

    使用 WDK 中的效能分析工具來評估 DPC 例程的運行時間。 如需使用 Tracelog 工具來監視 DPC 執行時間的範例,請參閱 範例 15:測量 DPC/ISR 時間

  • 如果驅動程式使用 DMA 以及它的 AdapterControl 例程返回 KeepObjectDeallocateObjectKeepRegisters(藉此保留系統 DMA 控制器通道或總線主控適配器以進行其他傳輸作業),那麼 DpcForIsrCustomDpc 例程負責釋放適配器物件或映射寄存器,通過 FreeAdapterChannelFreeMapRegisters,然後才完成目前的 IRP 並傳回控制。

  • 如果最低層級的實體設備驅動器設定 控制器物件, 透過控制器同步處理 I/O 作業至連結的裝置,則其 DpcForIsrCustomDpc 例程負責在完成目前的 IRP 並傳回控制之前,使用 IoFreeController 釋放控制器物件。

  • DpcForIsrCustomDpc 例程通常負責記錄在處理指定要求期間發生的任何裝置錯誤、視需要重試目前的要求,以及設定 I/O 狀態區塊,以及呼叫 目前 IRP 的 IoCompleteRequest

  • 如果驅動程式與裝置支援重疊的 I/O 作業,驅動程式必須遵循 處理重疊 I/O 作業的規則,

  • 任何驅動程式的 DpcForIsrCustomDpc 例程通常只會針對驅動程式必須支援的公用 I/O 控制程式代碼子集完成 I/O 處理。 特別是,DPC 例程會完成具有下列特性的裝置控制要求作業:

    • 變更實體裝置狀態的要求

    • 需要傳回實體裝置的固有易變性資訊的要求