- 收藏
- 点赞
- 分享
- 举报
wince驱动程序与应用程序之间的通信
驱动程序与应用程序之间的通信 驱动程序必须与应用程序进行通信,才能最终达到应用程序控制设备的目的,不然驱动有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后立即返回,执行下一步操作(驱动程序完成相应的操作后,会采取某种策略通知应用程序-属于驱动程序与应用程序通信问题,后面讨论)。这里面要注意几点:
- 需要设置一个OVERLAPPED结构的变量地址,在这个结构中设置一事件句柄,该事件于通知OK拉
- 对于DeviceIoControl调用有3种结果:
- TRUE--代表驱动程序的派遣例程能立即OK。 2.FALSE并通过GetLastError得到一个ERROR_IO_PENDING--代表驱动程序的派遣例程返回了STATUS_PENDING并且推迟完成这个控制操作。 3.FASLE并通过GetLastError得到1个不是ERROR_IO_PENDING--代表一个真正的错误。
- 调用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时候同上
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片
-
2008-08-23 16:14:41
-
2008-08-23 16:07:24
-
2008-09-28 14:21:28
-
2016-06-15 00:27:43
-
2012-12-04 13:21:40
-
2012-12-05 10:57:05
-
2012-12-04 13:40:14
-
2013-03-11 15:15:55
-
2020-10-09 16:52:48
-
2012-12-04 11:52:00
-
2017-04-28 17:43:39
-
2008-08-23 16:12:03
-
2018-07-06 16:47:54
-
02008-11-24 10:13:32
-
2016-06-09 09:30:49
-
2018-11-15 22:00:41
-
2014-12-03 17:17:06
-
2017-01-22 17:21:17
-
2012-12-05 11:25:41
-
100hi3516cv610 通过易百纳官方SDK中编译出的uboot env kernel,移植到自己的工程中,MPP初始化时出现内核拷贝数据到用户端时出现错误导致内核进入pain模式进而时内核重启
-
5hisi3519 gs2972 bt1120 转sdi 无法正常显示问题
-
5hisi3516cv610 + gc4336p 夜晚很模糊
-
5AIISP(功能演示,SC4336P为BGGR,强制转RGGB,会导致颜色异常)
-
5rv1106使用luckfox的SDK,设备树和驱动都写好了,结果设备文件没有生成
-
5海思3516cv610中如何进行SD卡升级,根据官方文档操作,烧录进板子时,走的默认uboot,没有执行uboot升级。
-
5G610Q-IPC-38E 夜晚很暗 有什么办法解决吗 已经补光了
-
10转换模型时,SoC版本里没显示hi3516cv610芯片
-
5hisi3516cv610 使用 yolov8n 模型训练 要如何提高 这里识别的是人
-
10有人在海思平台接过SC035HGS吗
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明

微信扫码分享
QQ好友