766游戏网官网WINDOWS硬件通知应用程序的经常方法

摘要:在手上风靡的Windows操作系统被,设备驱动程序是控制硬件的极其底部软件接口。为了共享于装置驱动程序设计过程中之阅历,给有设备驱动程序通知应用程序的5种植办法,详细说明每种艺术的法则与促成过程,并为起实现之组成部分基本代码。希望能够让设备驱动程序的设计者提供有扶助。 

最主要词:设备驱动程序   异步I/O   Virtual   Device   Driver(VxD)  
Windows   Driver   Model(WDM) 

引   言 
  于DOS操作系统中,应用程序可以一直跟硬件打交道,包括I/O端口读写、中断请求与响应和DMA操作等[1]。这种对硬件过于直白的操作方法吃软件设计提供了定的便利,但也有她本身之一部分通病。首先,一些非法操作有或改写某些硬件寄存器的始末,导致操作系统崩溃,从而使操作系统变得不安全,性能不安静;其次,应用程序的可移植性变差。为了确保操作系统的安全性以及稳定以及应用程序的可移植性,Windows操作系统不允许应用程序直接访问系统的硬件资源,而是要靠相应的装置驱动程序。设备驱动程序可以直接操作硬件,如果应用程序和装备驱动程序之间实现了双向通信,也即高达了应用程序控制底层硬件设备的目的。它们中的通信包括个别独面:一方面是应用程序传送给配备驱动程序的数额;另一方面是设备驱动程序发送给应用程序的信息。前者的兑现比容易,通过CreateFile()函数获取装备驱动程序的词柄后,就得使用Win32函数,如DeviceIoControl()、ReadFile()或WriteFile()等落实应用程序与装备驱动程序之间的通信[2]。DDK和MSDN对它来详实的叙说,读者可参见相关资料。后者的贯彻多较前者复杂,同时介绍这点情况的文章于少。这不对等说她不紧要,相反,它当小应用场合表达着至关重要之打算。例如,在数额收集系统面临,应用程序向设备驱动程序发送采集数据的命令后,建立一个声援线程等待数收集完成,而应用程序本身则可承干别的行事。设备驱动程序完成多少的采访工作晚,需要就通知应用程序,以便应用程序能够及时用数据获得走并拓展处理。诸如此类情况,不一而足。 

  鉴于设备驱动程序通知应用程序的重点,作者结合一些历及已部分资料[3~5],对她进行了总结,归纳出5种方式:异步过程调用(APC)、事件方(VxD)、消息方式、异步I/O方式和波措施(WDM)。下面分别证实及时几乎种艺术的法则,并为有实现之片源代码。 

1   异步过程调用(APC) 

  Win32应用程序使用CreateFile()函数动态加载设备驱动程序,然后定义一个回调函数backFunc(),并且将回调函数的地点&backFunc()作为参数,通过DeviceIoControl()传送给配备驱动程序。设备驱动程序获得回调函数的地方后,将她保存于一个全局变量(如callback)中,同时调用Get_Cur_Thread_Handle()函数获取她的应用程序线程的句柄,并且用该词柄保存在一个全局变量(如appthread)中。当条件成熟时,设备驱动程序调用_VWIN32_QueueUserApc()函数,向Win32应用程序发送信息。这个函数带有三单参数:第一单参数为回调函数的地点(已经注册);第二独参数为传送给回调函数的音;第三单参数为调用者的线程句柄(已经注册)。Win32应用程序收到信息继,自动调用回调函数(实际是由于装备驱动程序调用)。回调函数的输入参数是由装备驱动程序填入的,回调函数在此主要是针对信息进行拍卖。 

2   事件方(VxD) 

  首先,Win32应用程序创建一个风波之句柄,称其为Ring3句柄。由于虚拟设备驱动程序使用事件的Ring0词柄,因此,需要创造Ring0句柄。用LoadLibrary()函数加载未公开的动态链接库Kernel32.dll,获得动态链接库的句柄。然后,调用GetProcAddress(),
 
找到函数OpenVxDHandle()在动态链接库中的职位。接着,用OpenVxDHandle()函数将Ring3事变句柄转化为Ring0事变句柄。Win32应用程序用CreateFile()函数加载设备驱动程序。如果加载成功,则调用DeviceIoControl()函数将Ring0事件句柄传被VxD;同时,创建一个扶线程等待信号变成有信号状态,本身则只是去干别的事情。当条件成熟时,VxD置Ring0事件也产生信号状态(调用_VWIN32_SetWin32Event()函数),这即触发对应之Ring3风波也发生信号状态。一旦Ring3波句柄为产生信号状态,Win32应用程序的扶线程就对这个消息进行对应的处理。 

3   消息方式 

  Win32应用程序调用CreateFile()函数动态加载虚拟设备驱动程序。加载成功后,通过调用DeviceIoControl()函数将窗体句柄传送给VxD,VxD利用这句子柄向窗体发信息。当条件满足时,VxD调用SHELL_PostMessage()函数向Win32应用程序发送信息。要给该函数使用成功,必须用#define来自定义一个音讯,并且也要是一如既往在应用程序中定义它;还要在消息循环中以ON_MESSAGE()来定义消息对应之信息处理函数,以便消息发出时,能够调用消息处理函数。SHELL_PostMessage()函数的率先只参数为Win32窗体词柄,第二个参数为信ID号,第三、四单参数为发送给消息处理函数的参数,第五、六只参数为回调函数和招于其的参数。Win32应用程序收到信后,对信息进行拍卖。
  

4   异步I/O方式 

  Win32应用程序首先调用CreateFile()函数加载设备驱动程序。在调用该函数时,将倒数第2单参数设置为FILE_ATTRIBUTE_NORMAL|FILE_FLAG_
 
OVERLAPPED,表示今后可本着文本进行重叠I/O操作。当设备驱动程序文件创建成功后,创建一个初始态为无信号、需要手动复位的波,并且以是波传给品种也OVERLAPPED的数据结构(如Overlapped)。然后,将Overlapped作为一个参数,传为DeviceIoControl()函数。设备驱动程序把这个I/O请求包(IRP)设置也挂于状态,并且安装一个撤回例程。如果手上IRP队列为空,则用是IRP传送给StartIo()例程;否则,将其放到IRP队列中。设备驱动程序做得了这些干活儿晚,结束之DeviceIoControl()的拍卖,于是Win32应用程序可能无等待IRP处理终结,就于DeviceIoControl()的调用中回到。通过判断返回值,得到IRP的拍卖情况。如果手上IRP处于挂于状态,则主程序先做有别的工作,然后调用WaitForSingleObject()或WaitForMultipleObject()函数等待Overlapped中的事件成为来信号状态。设备驱动程序在适龄的下处理排队的IRP,处理完后,调用IoCompleteRequest()函数。该函数以Overlapped中的风波设置也产生信号状态。Win32应用程序对斯事件就展开响应,退出等状态,并且以事件复位为无信号状态,然后调用GetOverlappedResult()函数获取IRP的处理结果。 

5   事件方(WDM) 

  Win32应用程序首先创建一个风波,然后用该事件句柄传于装备驱动程序,接着创建一个帮扶线程,等待事件之发生信号状态,自己虽随着干别事情。设备驱动程序获得该事件的句子柄后,将其换成会用的轩然大波指针,并且把它寄存起来,以便后面使用。当极具备后,设备驱动程序将事件设置为出信号状态,这样应用程序的帮扶线程马上知道这个消息,于是展开对应的处理。当设备驱动程序不再采用此事件频仍,应该破除该事件之指针。 

  本刊网络补充版(http://www.dpj.com.cn)中,介绍了各部分实现的部分代码。 

结   语 

  于脚下兴的Windows操作系统中,设备驱动程序是控制硬件的无限底部软件接口。它发展提供与硬件无关的用户接口,向下直开展I/O、硬件中断、DMA和内存访问等操作。它用应用程序与硬件细节屏蔽开来,使软件不因让硬件并且可每当差不多个不等的阳台内移植。本文介绍了5种植装备驱动程序通知应用程序的方法,其中前3种艺术要用来VxD中,后2栽方式要用以WDM。这5种植方法还通过实际测试。测试结果表明,它们都能够达到设备驱动程序通知应用程序的目的。 

                 参考文献 
  1   欧青立,徐建波,李方敏,等.  
虚拟设备驱动程序VxD的钻以及出[J].   计算机工程,2003,28(3):  
45~46 
  2   (美)Chris   Cant.   Windows   WDM设备驱动程序开发指南[M].  
孙义,   马莉波,   国雪飞等译.   北京:   机械工业出版社,   2000.  
20~50 
  3   Karen   Hazzan.   Windows   VxD与设施驱动权威指南[M].  
孙喜明译.   北京:   中国电力出版社,   1999.   28~100 
  4   Walter   Oney.   Programming   the   Microsoft   Windows  
Driver   Model[M].   (美)Microsoft   Press,   1999.   35~180 
  5   李和平.   基于DSP的ICT图像重建系统研究[D].   北京:  
北京航空航天大学机械工程及自动化学院,   2002 
周正干:博士、教授,主要研究方向也电脑测控技术同数字图像处理技术。李和平:硕士,研究方向呢数量收集与图像处理。安振刚:博士后,研究方向也机电控制及自动化。

http://blog.csdn.net/kl222/article/details/5866769

发表评论

电子邮件地址不会被公开。 必填项已用*标注