驱动程序与应用程序的通讯

应用程序除了要调用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
函数等待这个事件被置位。

你可能感兴趣的:(驱动程序与应用程序的通讯)