5657|16

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教驱动与MFC程序的信息交互方法 [复制链接]

我知道MFC程序与驱动交流是通过DeviceIoControl函数进行的,但如果驱动要返回一些信息给MFC程序要怎样实现呢?请大家帮帮忙!!!

最新回复

在调用DeviceIoControl的时候,输入缓冲设置为空,分配好输出缓冲的内存。 驱动中,检查OutputBufferLength,足够的话填写SystemBuffer,即可由驱动返回信息给应用层。  详情 回复 发表于 2010-4-26 09:28
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
利用DeviceIoControl的OutBuffer返回数据。
此外,也可以利用ReadFile/IRP_MJ_READ来返回信息。
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
还有一个不太好的办法走注册表。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
驱动设备一般通过3种方法通信,一个I/OBuffer,一种是DirectIO,另一个就是2种都不是,你可以选择一种,你可以选择I/OBuffer方式,I/OBuffer就是OS起到桥梁作用,在应用模式和内核模式之间拷贝内存,ReadBuffer和WriteBuffer的首地址都是对应的IRP的AssociatedIrp.SystemBuffer,长度分别是对应的IRP所对应的IO_STACK_LOCATION的Parameters.Read.Length、Parameters.Write.Length。

在应用层先用CreateFile,通过驱动的SymbolicName来打开驱动,然后用DeviceIoControl来通信即可

我也是小菜,不对的地方望见谅
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
如果我要做到的是驱动主动发信息给MFC程序呢?可以在驱动中直接向MFC程序发信息吗?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
一般是应用程序主动查询信息或者等待事件,可以单独用一个线程来查询。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 e6610293847 的回复:
如果我要做到的是驱动主动发信息给MFC程序呢?可以在驱动中直接向MFC程序发信息吗?


如果是驱动发数据给AP,可以发WM_COPYDATA消息,然后AP将这个消息的参数lParam转换为COPYDATASTRUCT, 这个结构体里可以传输大量数据!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 1 楼 cnzdgs 的回复:
利用DeviceIoControl的OutBuffer返回数据。
此外,也可以利用ReadFile/IRP_MJ_READ来返回信息。

或者如果是SDK有提供的函数
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
据说可以直接试用ipc 呵呵
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
和MFC没任何关系。就是那个API的返回。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 5 楼 cnzdgs 的回复:
一般是应用程序主动查询信息或者等待事件,可以单独用一个线程来查询。


正解

应用程序加载驱动后,创建相应事件,通过DeviceIoControl将事件句柄传给驱动,在线程里WaitForSingleObject。当驱动要给应用程序传数据时,KeSetEvent。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

12
 
回调....
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 3 楼 sunrl1985 的回复:
驱动设备一般通过3种方法通信,一个I/OBuffer,一种是DirectIO,另一个就是2种都不是,你可以选择一种,你可以选择I/OBuffer方式,I/OBuffer就是OS起到桥梁作用,在应用模式和内核模式之间拷贝内存,ReadBuffer和WriteBuffer的首地址都是对应的IRP的AssociatedIrp.SystemBuffer,长度分别是对应的IRP所对应的IO_STACK_LO……


此位楼主,还是真正了解了,驱动设备与application的通讯就是读写。通过I/OBuffer

驱动层与应用层API我都做过,确实如此.
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

14
 
其实是这样的,看你需要哪一方主动开始通信:

如果你需要驱动程序主动跟Ring3的MFC Application通信(也就是“驱动实时通知应用程序”):
那么你需要在MFC App中生成一个Event的Reference,将它通过楼上所说的DeviceIoControl的“3种方法通信”的方法传递到Ring0的驱动中。然后在MFC中单独开始一个等待线程。最后,当出现事件的时候,通过KeSetEvent触发MFC App中的等待线程。

如果你需要MFC Application主动跟Ring0的驱动程序通信:
那么你就用楼上说的DeviceIoControl的“3种方法通信”的方法主动跟Ring0的驱动交换数据。当然,在驱动中要写dispatch处理函数。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

15
 
下面是个例子  我参考过
http://www.codeproject.com/KB/system/driveguicomm.aspx
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

16
 
在调用DeviceIoControl的时候,输入缓冲设置为空,分配好输出缓冲的内存。
驱动中,检查OutputBufferLength,足够的话填写SystemBuffer,即可由驱动返回信息给应用层。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
在调用DeviceIoControl的时候,输入缓冲设置为空,分配好输出缓冲的内存。
驱动中,检查OutputBufferLength,足够的话填写SystemBuffer,即可由驱动返回信息给应用层。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表