驱动程序与应用程序之间的通信
来源:互联网 发布:平安证券java面试 编辑:程序博客网 时间:2024/06/04 18:22
驱动程序必须与应用程序进行通信,才能最终达到应用程序控制设备的目的,不然驱动有QIU用。
要通信就涉及到3个方面:
1.应用程序与驱动程序通信
2.驱动程序与应用程序通信
3.数据传输
下面分别讨论
1。应用程序与驱动程序通信
1-1 应用程序实现与驱动通信的过程:
---用CreateFile打开设备,然后用DeviceIoControl和驱动通信,包括从驱动读数据和写数据2种情况
也可以使用ReadFile从驱动读数据或用WriteFile写数据给驱动
---退出使用使用CloseHandle关闭设备
Win32函数对应的IRP主功能代码
CreatFile IRP_MJ_CREATE
ReadFile IRP_MJ_READ
WriteFile IRP_MJ_WRITE
DeviceIoControl IRP_MJ_DEVICE_CONTROL
CloseHandle IRP_MJ_CLOSE
1-2 打开设备
打开设备一般有2种方式:
---GUID
---符号连接符(符号连接符可以理解为一个快捷方式)
1-3 DeviceIoControl函数
DeviceIoControl有2种调用方式
---同步方式:应用程序调用DeviceIoControl函数将被堵塞,直到驱动程序完成相应的数据传输操作后,才继续执行下一步。
---异步方式:应用程序调用DeviceIoControl后立即返回,执行下一步操作(驱动程序完成相应的操作后,会采取某种策略通知应用程序-属于驱动程序与应用程序通信问题,后面讨论)。这里面要注意几点:
1. 需要设置一个OVERLAPPED结构的变量地址,在这个结构中设置一事件句柄,该事件于通知OK拉
2. 对于DeviceIoControl调用有3种结果:
1. TRUE--代表驱动程序的派遣例程能立即OK。
2.FALSE并通过GetLastError得到一个ERROR_IO_PENDING--代表驱动程序的派遣例程返回了STATUS_PENDING并且推迟完成这个控制操作。
3.FASLE并通过GetLastError得到1个不是ERROR_IO_PENDING--代表一个真正的错误。
3. 调用WaitForSingleObject等待驱动程序完成数据传输。这个过程中,必须考虑一个问题--应用程序的可能退出,解决方法,通过CancelIo取消相应IRP,最后调用GetOverlappedResult。
2。驱动程序与应用程序通信
2-1 驱动程序在什么时候与应用程序通信
驱动程序在捕获特点事件(如中断)后,就应当和应用程序通信
2-2 驱动程序通信的方法
---DeviceIoControl异步完成
---Win32事件
2-3 DeviceIoControl异步完成
当应用程序调用DeviceIoControl函数时,驱动程序首先把此IRP保存,然后设法返回STATUS_PENDING。在一个事件发生后,驱动程序完成该IRP。注意地方:由于IRP是未决的,所以必须将此IRP保存,当应用程序退出时候,若IRP仍未发生,必须取消该IRP。(IRQL<=DISPATCH_LEVEL)
2-4 Win32事件
应用程序创建一个事件,直接将该事件句柄传递给驱动程序,然后等待驱动程序发送事件消息。驱动程序在获得该事件指针后,在IRQL<=DISPATCH_LEVEL级别下的例程中设置事件信号状态来触发应用程序。
3。驱动程序获取应用程序数据缓冲区的方法
---DeviceIoControl时候,通过I/O控制命令中的数据访问方式来决定。实际也就是共享BUFFER和建立一个MDL。
---ReadFile/WriteFile时候同上
要通信就涉及到3个方面:
1.应用程序与驱动程序通信
2.驱动程序与应用程序通信
3.数据传输
下面分别讨论
1。应用程序与驱动程序通信
1-1 应用程序实现与驱动通信的过程:
---用CreateFile打开设备,然后用DeviceIoControl和驱动通信,包括从驱动读数据和写数据2种情况
也可以使用ReadFile从驱动读数据或用WriteFile写数据给驱动
---退出使用使用CloseHandle关闭设备
Win32函数对应的IRP主功能代码
CreatFile IRP_MJ_CREATE
ReadFile IRP_MJ_READ
WriteFile IRP_MJ_WRITE
DeviceIoControl IRP_MJ_DEVICE_CONTROL
CloseHandle IRP_MJ_CLOSE
1-2 打开设备
打开设备一般有2种方式:
---GUID
---符号连接符(符号连接符可以理解为一个快捷方式)
1-3 DeviceIoControl函数
DeviceIoControl有2种调用方式
---同步方式:应用程序调用DeviceIoControl函数将被堵塞,直到驱动程序完成相应的数据传输操作后,才继续执行下一步。
---异步方式:应用程序调用DeviceIoControl后立即返回,执行下一步操作(驱动程序完成相应的操作后,会采取某种策略通知应用程序-属于驱动程序与应用程序通信问题,后面讨论)。这里面要注意几点:
1. 需要设置一个OVERLAPPED结构的变量地址,在这个结构中设置一事件句柄,该事件于通知OK拉
2. 对于DeviceIoControl调用有3种结果:
1. TRUE--代表驱动程序的派遣例程能立即OK。
2.FALSE并通过GetLastError得到一个ERROR_IO_PENDING--代表驱动程序的派遣例程返回了STATUS_PENDING并且推迟完成这个控制操作。
3.FASLE并通过GetLastError得到1个不是ERROR_IO_PENDING--代表一个真正的错误。
3. 调用WaitForSingleObject等待驱动程序完成数据传输。这个过程中,必须考虑一个问题--应用程序的可能退出,解决方法,通过CancelIo取消相应IRP,最后调用GetOverlappedResult。
2。驱动程序与应用程序通信
2-1 驱动程序在什么时候与应用程序通信
驱动程序在捕获特点事件(如中断)后,就应当和应用程序通信
2-2 驱动程序通信的方法
---DeviceIoControl异步完成
---Win32事件
2-3 DeviceIoControl异步完成
当应用程序调用DeviceIoControl函数时,驱动程序首先把此IRP保存,然后设法返回STATUS_PENDING。在一个事件发生后,驱动程序完成该IRP。注意地方:由于IRP是未决的,所以必须将此IRP保存,当应用程序退出时候,若IRP仍未发生,必须取消该IRP。(IRQL<=DISPATCH_LEVEL)
2-4 Win32事件
应用程序创建一个事件,直接将该事件句柄传递给驱动程序,然后等待驱动程序发送事件消息。驱动程序在获得该事件指针后,在IRQL<=DISPATCH_LEVEL级别下的例程中设置事件信号状态来触发应用程序。
3。驱动程序获取应用程序数据缓冲区的方法
---DeviceIoControl时候,通过I/O控制命令中的数据访问方式来决定。实际也就是共享BUFFER和建立一个MDL。
---ReadFile/WriteFile时候同上
0 0
- 【转帖】驱动程序与应用程序之间的通信
- 驱动程序与应用程序之间的通信
- 驱动程序与应用程序之间的通信
- 驱动程序与应用程序之间的通信
- 驱动程序与应用程序之间的通信
- 驱动程序与应用程序之间的通信
- 驱动程序与应用程序之间的通信
- 驱动程序与应用程序之间的通信
- 驱动程序与应用程序之间的通信
- 应用程序与驱动程序的通信
- 应用程序与驱动程序的通信
- 驱动程序和应用程序之间通信
- 应用程序与Service之间通信
- 驱动程序与应用程序之间共享内存
- 驱动程序与应用程序之间共享内存
- 驱动程序与应用程序之间共享内存
- 应用程序与驱动程序6种通信方式
- 驱动程序学习(三)示例:设备驱动程序与用户应用程序之间的数据传递
- JQuery Easy Ui 可装载组合框 - ComboBox
- 黑马程序员-有关银行调度系统的笔记和总结
- cocos2d-x-2.1.4如何创建新工程
- 打开MySQL远程登陆的功能
- Oracle数据库中的varchar,varchar2,nvarchar,nvarchar2区别及用法
- 驱动程序与应用程序之间的通信
- js传递给NPAPI插件的字符串参数在Firefox下正常,在chrome下面会有乱码现象的问题解决
- 《基于ORACLE的SQL优化读书》笔记 得到绑定变量值
- C与C++的区别
- 提高数据库处理查询速度
- rsh命令
- Android KEYCODE对应表
- Java虚拟机原理、内存分配和回收机制
- DIV居中特别注意的地方