5532|12

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何通过驱动程序实现两个用户态的应用程序数据交互? [复制链接]

串口应用程序(用户态)调用虚拟串口,向虚拟串口发送数据,服务程序(用户态)将虚拟串口要发送的数据包装通过网络发送出去,请问串口应用程序和服务程序如何通过驱动实现数据相互之间的传递?急..希望指点~!!!!

最新回复

现有的虚拟串口调试成功,接下来将进行修改工作 谢谢各位的帮助~  详情 回复 发表于 2008-6-3 14:11
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
很多种方式啊,比如socket,命名管道,共享内存
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 jiangsheng 的回复:
很多种方式啊,比如socket,命名管道,共享内存
能否对共享内存做个解释~
对于共享内存存在既读又写的情况
并且还有先后顺序的,比如
服务程序只能在串口应用程序写入数据后再读,再发送~
反过来也是一样,能具体说下过程不?
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

5
 
在访问共享内存时可以使用同步对象避免冲突。
对于虚拟串口,数据量应该很小,每次传输数据时用ExAllocatePoolWithTag单独分配一个缓冲区,这样不需要考虑线程同步。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
帮顶。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果使用共享内存的话,我是不是要建立两个共享内存
一个用来存储虚拟串口驱动向服务程序传递的数据
另一个用来存储服务程序向虚拟串口驱动传递的数据啊?
能否给个共享内存操作的源码来研究研究啊~
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

8
 
内核地址空间都是共享的,驱动程序中没有共享内存的概念。在驱动程序中通常用队列储存要处理的数据,每次请求的数据单独分配一个缓冲区添加到队列末尾,处理时从队列的头部移出数据。你可以参考InitializeListHead、 ExInterlockedInsertTailList、ExInterlockedRemoveHeadList。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
这个很麻烦吗?

驱动里面其实就是实现,开一个buffer,大小按照应用程序可能的最大情况来设,比如256KB。

1. 虚拟串口配置,使得应用程序能调用该虚拟串口,将从该串口获得的数据放到buffer中。
2. 服务程序怎么从驱动获取数据就得看服务程序的设计了。不管用哪种方式,驱动程序都必须实现,从buffer中读取数据,并传给服务程序。

这个buffer没有需要共享的说法,因为串口数据量小,而网络传输数据量大,如果直接让两者间共享这个buffer,那么两个应用程序都必须考虑无数据、数据溢出的处理等等,而且还必须有读写互斥的考虑。

与其考虑那么多,不如直接让驱动来管理这个buffer呢。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
串口应用程序通过IRP_MJ_READ和IRP_MJ_WRITE实现对虚拟串口的读写操作
  1. = SampleWrite;
  2. DriverObject->MajorFunction[IRP_MJ_READ] = SampleRead;
复制代码

在SampleWrite和SampleRead中实现串口应用程序的数据读写操作
现在就是要实现将串口应用程序写的数据通过虚拟串口(串口应用程序调用虚拟串口)传递给另一个服务程序
(该服务程序使用JAVA编写),服务程序再将数据包装处理,通过网络发送出去
在驱动程序里面实现的话,就是要获得服务程序使用的数据地址,然后将串口应用程序写的数据
复制到服务程序使用的内存空间里面吗?
并且Java是不是还要通过JNI使用C获得这个要写的数据呢

 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 
服务程序不是你自己能改写的?
那就得用进程注入吧,不然无法获得服务程序的数据空间地址。想做木马还是黑客程序?
如果服务程序已经固定,那其所用的数据空间必然也已确定,你就只能从驱动操作这片空间了。那还得处理好互斥操作。如果服务程序在操作,你的驱动就不能去操作。
不过,既然服务程序不是你写的,你怎么判断其在操作数据空间呢?

矛盾了。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

12
 
因为我也是刚接触驱动程序设计,要实现下面的情况:
设备网络管理,每个智能设备,如电锁,有一套厂家对应的控制软件
而控制软件一般是通过串口直接进行连接控制
现在我要通过网络控制远端设备,将电锁连入网络
而在网络通讯中要遵守一个已有的网络传输协议
因此就要对控制软件发出的数据进行包装然后再转发出去
同时要虚拟出虚拟串口供控制软件调用

直接数据共享对我比较难实现了,
现在考虑驱动程序将数据发送到本地指定端口
服务程序监听该端口,并且接收数据包装并转发出去
这样就不会涉及很多低层通讯,在JAVA中也不需要实现本地调用了
因此就要实现驱动程序如何将数据发送到指定端口的功能!~~
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

13
 
现有的虚拟串口调试成功,接下来将进行修改工作
谢谢各位的帮助~
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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