您應該使用哪種類型的 DPC?
視驅動程式的設計而定,它可以有下列任一項:
驅動程式是否有單一 DpcForIsr 常式、一組 CustomDpc 常式,或兩者都取決於其基礎裝置的本質及其必須支援的 I/O 要求集。
大部分最低層級設備磁碟機都有單一 DpcForIsr 常式,可針對每個需要個別裝置上一或多個作業的 IRP 完成 I/O 處理。 使用單一 DpcForIsr 在一次執行一項作業的裝置上完成個別要求、中斷驅動 I/O 作業相當簡單。 這類驅動程式的 ISR 只需要針對每個插斷驅動 I/O 作業呼叫 IoRequestDpc 。
除非其裝置需要一個以上的 DPC 來完成一組不同的中斷驅動 I/O 作業,否則少數最低層級驅動程式具有 CustomDpc 常式。
使用單一 DpcForIsr 來完成裝置上可以執行並行作業的重迭中斷驅動 I/O 作業,但可能相當困難。 除了或而不是佇列DpcForIsr之外,ISR 還可以呼叫KeInsertQueueDpc,將一組作業特定的驅動程式提供的 CustomDpc常式排入佇列。
例如,請考慮撰寫序列驅動程式所涉及的一些設計挑戰。 作為全雙工裝置的驅動程式,序列驅動程式無法依賴一對一的 IRP 排入 佇列到 StartIo 常式的順序,以及從其裝置在多工多處理器系統中中斷序列之間的一對一對應。 此外,序列驅動程式必須處理逾時要求和非同步使用者產生的要求,以取消先前要求的作業、清除緩衝的資料等等。
因此,序列驅動程式可能會維護使用者模式 COM 埠應用程式可以要求的讀取、寫入、清除和等候作業的內部佇列。 它也可以維護參考計數,或使用一些其他追蹤機制,例如一組旗標,供其內部佇列中的 IRP 使用。 其 ISR 會呼叫 KeInsertQueueDpc ,其中包含許多驅動程式配置和初始化的 DPC 物件,每個物件都與驅動程式提供的 CustomDpc 常式相關聯。