驅動程序與應用程序的通訊

應用程序除了要調用ReadFile0,WriteFile0函數與驅動程序進行數據交換,我們
還需要隨時瞭解設備的工作狀態,設定設備的工作狀態。其主要手段是在應用程序中調
用DeviceIoControl()函數,對DeviceloControl()的調用將使YO管理器創建一
個帶有IRP W DEVICE CONTROL主功能碼的IRP,該IRP會被髮送到驅動程序的
IRP mJ DEVICE CONTROL派遣例程,最終驅動程序會獲得應用程序發送過來的控制代碼、
PCI總線接口板及je WDM驅動程序開發
輸入緩衝區地址及長度、輸出緩衝區地址及長度。通過對控制代碼的解釋,驅動程序可
以知道應用程序的需求,並執行相應的硬件訪問,通過輸出緩衝區將結果返回給應用程
序。
對於沒有CPU的接口板,有時需要由主處理器不斷查詢硬件設備來獲得硬件信息,
最簡單的方式是在應用程序中創建一個線程,通過在線程中不斷調用DeviceloControl
函數來獲得設備的狀態信息。採用這種方法簡單、直觀,但是它佔用了大量的系統時間,
使應用程序與驅動程序將大量時間用於數據交換,降低了系統效率。
上述問題可以歸結爲驅動程序與應用程序之間的同步問題,爲了解決這個問題可以
採取驅動程序與應用程序共享事件對象的方法。
具體方法是在應用程序中創建一個事件
對象,而後通過一個DeviceloContro]()調用將事件對象句柄傳遞給驅動程序,這樣
兩者都擁有同一事件對象的旬柄或引用指針,可以讓任何一個程序處於等待狀態,另一
個程序在需要的時候如硬件狀態變化時激活事件,軟件流程如圖3.19。
應用程序首先要調用CreateFile函數創建到驅動程序的連接,然後要調用
CreateEvent函數創建一個事件對象,然後調用DeviceIocontrol函數將事件對象的地
址傳遞給驅動程序,驅動程序在相應的派遣函數中會收到這個指針,調用
obReferenceObjectByHandle將用戶模式旬柄轉換到驅動程序可用的事件旬柄,並要將
新的句柄存儲於設備擴展中。爲此,我們要在驅動程序頭文件的DeviceExtension結構
中定義一個對象旬柄用於存儲這個句柄,在成功完成上述工作以後,該事件就可以用於
驅動程序與應用程序之間的同步。應用程序需要創建一個線程,並將這個事件對象復位,
然後調用WaitForSingleObject函數等待這個事件被置位。在硬件設備發生中斷後,驅
動程序的ISR例程調用DPC例程,在DPC例程中將事件對象置位,這時應用程序的
WaitForSing]eObjeet結束等待。通過這樣機制應用程序就可以知道設備的狀態變化。
在響應了這個事件後,應用程序要將事件對象復位,然後重新調用WaitForSingleObject
函數等待這個事件被置位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章