DPC延遲過程調用

每個設備對象中都含有一個KDPC對象,DEVICE_OBJECT中有一個內置的DPC對象
Dpc。當在驅動程序的AddDevice例程創建了設備對象後,如果需要用DPC例程就要在
AddDevice例程中調用IolnitimizeDpcRequest初始化這個內置DPC對象,同時註冊
一個DPC例程。IolnitializeDpcRequest的~個參數爲FDO設備對象,一個爲指向DPC
例程的指針。
PCI總線接口板及其WDM驅動程序開發
在初始化一個DPC對象後,你就可以在ISR中調用IoRequestDpc請求一個DPC調
用,調用IoInitializeDpcRequest函數將DPC對象與DPC例程、驅動程序創建的設備
對象聯繫起來。當在ISR中調用IoRequestDpc時,I/0管理器調用KeInsertQueueDpc
函數將DPC對象排隊。當IRQL低於DISPATCH_LEVEL時內核將DPC對象出隊,然後在
DISPATCH—LEVEL運行驅動程序的DPC例程。
爲了進行下一次的設備IO操作,DPC例程一般情況下要設置相應的硬件設備,然後
調用IoStartNextPacket將下一個IRP出隊,調用IocoIIlpleteRequest完成當前的iRP
請求,
VOID DpcForIsr(⋯)
{
PIRP Irp=fdo一>CurrentIrp:
IoStartNextPacket(fdo,TRUE):
IoCompleteRequest(Irp,<boost value>):
)

IoStartNextPacket的TRUE參數指出下一個IRP可以被取消,即loStartPacket
的原始調用中指定了取消例程,這將使IoStartNextPacket函數在訪問設備對象和
CurrentIrp時需申請全局取消自旋鎖的保護。
通常我們在調用loCompleteRequest前先調用loStartNextPacket函數,這樣在開
始完成有可能是長耗時的IRP處理前,可以使設備忙於處理新請求。
由於ISR阻斷了低於其中斷級的所有操作,當有大量的數據傳輸時,要衡量傳輸時
間與系統效率的平衡,一般情況下要在DPC例程中完成數據傳輸。如果數據很少,可以
在ISR中直接完成傳輸,而DPC例程只用來在最後完成IRP請求,並使下一個IRP出隊,
進行處理。
IoRequestDpc函數把它的DPC對象放到隊列中。如果在DPC例程運行前,設備又生
成一箇中斷,並且ISR爲此又請求了一個DPC,那麼內核將忽略第二個DPC請求。不管
ISR連續請求了多少個DPC,DPC對象僅在隊列上排隊一次,而且內核也僅調用DPC例
程一次。在這個調用中,DPC例程需要完成所有發生在第一個DPC之後的所有中斷的相
關工作,這樣在ISR中要記錄相應的設備狀態及中斷的次數。
除了可以使用設備對象內置的DPC對象外,還可以在設備擴展中創建自己的DPC對
象,然後在AddDevice例程中調用KeInitializeDpc初始化該對象,並且將~個白定義
DPC例程的地址與該DPC對象聯繫起來。爲了運行自定義DPC例程,要在中斷處理程序
中調用KeInsertQueueDpc函數將DPC對象排隊,如果排隊成功則返回TRUE,如果該
DPC已經在隊列中則返回FALSE。傳遞給DPC例程的參數一個在調用KelnitializeDpc
時提供,另外兩個在調用KeInsertQueueDpc函數時提供,爲了與基本DPC處理程序兼
容,可以將參數設置爲FDO、IRP、和設備擴展。
驅動程序的StartIo例程、Dispatch例程、DpcForlsr例程或CustomDpc例程會與
中斷例程頻繁的訪問相同的硬件資源,ISR的執行屏蔽了驅動程序中其他例程對硬件訪
PCI總線接口扳及其WDM驅動程序開發
問的操作,這樣就有可能破壞數據的完整性,爲了解決這個問題,可以使用臨界段的方
法。ISR例程與synchcritsection例程中的代碼爲臨界段代碼,系統在調用這兩個例
程前,先提升處理器的IRQL到設備的DIRQL的值,並取得一個自旋鎖,在例程返回後,
系統釋放自旋鎖,降低處理器的IROL,這樣就可以阻止處理器被其他的中斷例程所打
斷。爲了調用非中斷例程的臨界段代碼,驅動程序必須調用KeSynchronizeExecution
例程。這個例程的一個參數爲臨界段例程的地址,一個驅動程序定義的上下文信息和一
箇中斷對象指針。同ISR例程一樣,臨界段例程也應該儘快完成,完成必須的設備寄存
器設置和上下文信息的更新。
一個設備驅動程序應將主要的10處理過程放在
PASSIVE LEVEL級的分發例程,DISPATCH_LEVEL級的StartIo例程和DPC例程。”””。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章