通知应用程序在设备驱动程序中的方法应用

时间:2022-08-27 02:30:05

通知应用程序在设备驱动程序中的方法应用

摘 要:当前的电脑操作系统中Windows的应用最为广泛,作为操作硬件最基础的软件接口,设备驱动程序具有重要的作用。文章主要针对当前所使用的设备驱动程序的设计经验进行了讨论,给出了五种通知应用程序方案,并针对其原理进行了分析,希望能够同广大设计者进行交流共同促进程序的完善和进步。

关键词:设备驱动程序;应用程序;方法C

在操作系统的应用中,稳定性是系统的基础性要求,另外要求系统应用程序具有可移植特性,但是在Windows系统中,应用程序无法直接进行硬件资源的访问,而是需要通过设备驱动程序。而硬件设备由驱动程序进行直接操作,应用程序想要控制硬件设备便需要同驱动程序之间形成双向通讯。该双向通讯主要包含两方面内容。首先是应用程序需要向驱动程序进行数据的传输;其次,则是驱动程序向应用程序进行消息的传递。二者相比较,应用程序向驱动程序进行数据传输的较容易实现,只需要CreateFile函数将驱动程序句柄获得后,就可以使用。而后期,驱动程序在完成对设备的控制后,需要进行数据的采集,继而通知应用程序,将数据传递走。

驱动程序在完成数据的收集后,对应用程序的通知具有重要的作用,因而结合实际系统运行情况以及应用状况,文章对该环节进行了总结,提出了五种方法,在以下内容中予以说明。主要针对APC、VxD、消息方式以及异步I/O和WDM五种方式的原理展开了探讨。

1 APC

APC即通常缩成的异步过程调用方式,在应用过程中通过CreateFile函数,Win32系统对驱动程序进行动态加载,继而采用backFunc函数进行定义,同时将该函数地址通过DeviceIoControl作为参数传递至驱动程序。获取地址后,驱动程序会将该参数保存在全局变量中,并对应用程序线程句柄进行获取,通过对Get_Cur_Thread_

Handle函数的调用,得到句柄后,将其保存在全局变量中,当满足应用个条件后,调用VWIN32_QueueUserApc函数,进行消息的发送,完成同应用程序的通讯。需要注意的是该函数所具有的参数摘要数量为三,其中两个为已经注册的参数。当消息为应用程序锁接收后,应用程序会自动对回调函数进行调用。回调函数的主要作用为处理消息,由驱动程序对其参数进行输入。

2 VxD

所谓的VxD方式即事件方式,该种方式的应用需要应用程序首先进行时间句柄的创建,通过Win32程序创建的句柄被称作Ring3句柄。虚拟驱动往往会使用Ring0句柄,因此需要该句柄的创建。其中,动态链接库Kernel32.dll为非公开动态链接库,由LoadLibrary函数进行加载,从而得到其句柄。并在动态链接库中确定OpenVxDHandle函数,通过调用GetProcAddress予以实现。继而进行Ring3句柄和Ring0句柄之间的转换,由OpenVxDHandle函数实现。通过CreateFile函数应用程序即可完成对驱动程序的加载。完成上述步骤后,将RING0时间句柄通过相关函数向事件方式进行传递;并进行辅助线程的创建,待信号接通。一旦满足条件,那么VxD中Ring0事件会触发Ring3事件信号。那么该种情况下,应用程序就可以对该消息进行接受处理,从而完成应用程序同驱动程序之间的数据、信息交流,达到对基层硬件的控制目的。

3 消息方式

通过CreateFile函数的调用,应用程序可以对驱动程序予以动态加载。完成加载后,通过相关函数调用将句柄传至VxD,继而通过该句柄对窗体进行消息发送。完成上述内容后,通过对SHELL_Pos

tMessage函数的调用,VxD可以完成同应用程序之间的消息传送。并通过对消息的自定义保证函数的成功应用,并且其定义同样需要在应用程序中进行;另外对于定义的消息处理函数需要在循环中予以定义,从而快速对其进行处理。应用程序窗体句柄为SHELL_PostMessage函数的第一个参数,而第二个参数则作为Win32的消息ID号,剩余参数用作处理发送消息的函数参数以及回调函数参数。应用程序完成消息的接收后对其进行处理。

4 异步I/O方式

Win32应用程序首先调用CreateFile函数加载设备驱动程序。在调用该函数时,将倒数第2个参数设置为FILE_ATTRIBUTE_NO

RMAL|FILE_FLAG_OVERLAPPED,表示以后可以对文件进行重叠I/O操作。当设备驱动程序文件创建成功后,创建一个初始态为无信号、需要手动复位的事件,并且将这个事件传给类型为OVERLAPPED的数据结构。然后,将Overlapped作为一个参数,传给DeviceIoControl函数。设备驱动程序把这个I/O请求包(IRP)设置为挂起状态,并且设置一个取消例程。假如当前IRP队列为空,则将这个IRP传送给StartIo例程;否则,将它放到IRP队列中。设备驱动程序做完这些工作后,结束这个DeviceIoControl的处理,于是Win32应用程序可能不等待IRP处理完,就从DeviceIoControl的调用中返回。通过判定返回值,得到IRP的处理情况。假如当前IRP处于挂起状态,则主程序先做一些其他的工作,然后调用WaitForSingleObject或WaitForMultipleObject函数等待Overlapped中的事件成为有信号状态。设备驱动程序在适当的时候处理排队的IRP,处理完成后,调用IoCompleteRequest函数。完成上述步骤后,该函数会对Overlapped信号状态进行调整,使得其时间信号转变为有信号状态。而应用程序根据信号状态的转变会立刻进行相应,不再进行等待,同时将事件信号状态进行复位,使之恢复为无信号,继而对GetOverlappedResult进行调用。

5 WDM

该方式即事件方式,由应用程序首先进行事件的创建,继而将句柄传至驱动程序,完成事件句柄的传送后,创建辅助线程。待事件信号状态转变。驱动程序获得由应用程序传输的句柄后,将其转换为事件指针并寄存,方便其对硬件设备的控制使用。当具有操作条件后,驱动程序会改变事件信号状态,则应用程序会接受到该消息,并进行处理,由辅助线程进行传输。此外需要注意,若该程序事件不能再被使用,那么应当将指针解除。

6 结束语

当前的操作系统中,作为硬件的操作接口,驱动程序起到了关键作用。通过驱动程序能够进行I/Ohuozhe DMA、甚至是终端硬件以及内存访问,而向上则可以提供用户接口。通过驱动程序将硬件同应用程序分开,从而使得软件具有可移植性,而不依赖于硬件。文章通过对五种驱动程序同应用程序支架的通知方法进行了分析。前三种方式应用基础主要为VxD,而后两种则是WDM。通过实际的应用可以表明,这五种通知方式都能够保证驱动程序对应用程序进行信息的通知传递。

参考文献

[1]孙磊.Windows系列操作系统下的底层驱动技术在实时控制系统中的应用[D].中国科学院研究生院(西安光学精密机械研究所),2007.

[2]刘仁峰.基于PCI总线的嵌入式设备驱动程序设计与研究[D].华中科技大学,2004.

上一篇:浅析电力系统规划设计在电力工程中的应用 下一篇:宜川县农用地整治潜力研究