766游戏网官网WINDOWS硬件通知应用程序的时方法(五种植方式:异步过程调用APC,事件措施VxD,消息方式,异步I/O方式,事件方WDM)

摘要:在当前盛行的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  766游戏网官网 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

发表评论

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