zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:1653回复:10

应用程序与驱动程序通信的问题

楼主#
更多 发布于:2003-01-20 16:28
应用程序中要从driver中读数据,但是driver中这个数据不能马上得到,必须等待一定的时间(可能很长)才能到此数据。我用的driverstudio写的驱动。应用程序中使用DeviceIoControl发送命令给driver,并设置了一个event,然后应用程序等待此event。在driver的DeviceControl函数中,收到此命令,然后就要等待数据产生,再设置event为有效来通知应用程序。问题是我是不是不能一直在driver的DeviceControl函数中等待数据产生?也就是说我必须把当前的IRP设置为PENDING?如果设置为PENDING,那么数据产生时我如何再来来处理这个IRP?具体如何处理,请各位指点。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-01-20 16:35
可以完成这个IRp,app再开个线程等event。
h13
h13
驱动老牛
驱动老牛
  • 注册日期2002-07-10
  • 最后登录2008-10-24
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-20 17:22
这样的话除非数据到达会引发中断,否则driver怎么知道什么时候设置event
如果没有中断的话就用内核态线程等待,等到了再通知app
<table> [color=#8040FF]神,常虚以凝而灵明湛定 气,常静以养而充盈流通[/color] </table>
zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-20 19:17
那么这个IRP是不是应该是一直是PENDING,直到数据到达为止?这样我才能在IRP中设置到达的数据指针和数量给应用程序。
h13
h13
驱动老牛
驱动老牛
  • 注册日期2002-07-10
  • 最后登录2008-10-24
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-20 20:34
好像如果driver一直pending的话,app端就会像死机一样一直等待,重绘之类的都无法相应,个人认为还是应该完成irp,另开一个内核线程等待完成后通知app。

如果在此期间driver不需要响应其他动作的话,在app端开一个用户态线程,用此线程调用driver并等待完成也可以
<table> [color=#8040FF]神,常虚以凝而灵明湛定 气,常静以养而充盈流通[/color] </table>
zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-21 09:13
我的做法是:在app开一个线程,用DeviceIoControl发送命令给driver,然后等待事件;driver中先PENDING这个IRP,然后在另开的内核线程中等待数据,当数据来到时设置事件通知app,完成这个IRP,返回数据给app。
现象是一运行app就好像死了一样(当然这期间driver没有接收到数据)。

如果我先完成IRP,并在driver中另开一个内核线程,那么当收到数据时可以设置事件通知app,但是怎么把数据传给app呢?原来的那个IRP已经完成了,也就是说app中的DeviceIoControl已经返回了,它又怎么接收driver发来的数据呢?

新手,请多多指教。
h13
h13
驱动老牛
驱动老牛
  • 注册日期2002-07-10
  • 最后登录2008-10-24
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-21 09:44
数据可以用driver和app之间建立共享内存来实现,网站的专栏文章里有介绍
<table> [color=#8040FF]神,常虚以凝而灵明湛定 气,常静以养而充盈流通[/color] </table>
Buddha
驱动老牛
驱动老牛
  • 注册日期2001-04-29
  • 最后登录2013-05-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望17点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-01-22 11:08
我的做法是:在app开一个线程,用DeviceIoControl发送命令给driver,然后等待事件;driver中先PENDING这个IRP,然后在另开的内核线程中等待数据,当数据来到时设置事件通知app,完成这个IRP,返回数据给app。
现象是一运行app就好像死了一样(当然这期间driver没有接收到数据)。


不应该死记,应位你的app是单开的线程,这是ioctl的这个线程挂起不会影响到真个程序的。


如果我先完成IRP,并在driver中另开一个内核线程,那么当收到数据时可以设置事件通知app,但是怎么把数据传给app呢?原来的那个IRP已经完成了,也就是说app中的DeviceIoControl已经返回了,它又怎么接收driver发来的数据呢?

app收到event以后再发送ioctl来获取数据

新手,请多多指教。
 
<table style="filter: glow(color=sky blue, strength=10)"> <font color=white> 猫生病了, 老鼠大声朗诵诗集, 并修剪盆花. 猫生病了, 老鼠慢慢刷牙洗脸, 并打扫房间. 猫生病了, 老鼠倚在窗边欣赏夜色, 并对流星许愿. 猫生病了, 老鼠也病了, 它说:"我还是习惯那种时时紧张, 处处小心, 夜夜逃亡的生活." 午夜, 我听到老鼠在叹息, 且不再读诗了. </font></table>
taoxinmin
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2006-03-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-01-28 16:30

在用户线程中,再次调用
WaitEvent()
DeviceControl().
即可
Buddha
驱动老牛
驱动老牛
  • 注册日期2001-04-29
  • 最后登录2013-05-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望17点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-01-30 02:49

在用户线程中,再次调用
WaitEvent()
DeviceControl().
即可


重复了
<table style="filter: glow(color=sky blue, strength=10)"> <font color=white> 猫生病了, 老鼠大声朗诵诗集, 并修剪盆花. 猫生病了, 老鼠慢慢刷牙洗脸, 并打扫房间. 猫生病了, 老鼠倚在窗边欣赏夜色, 并对流星许愿. 猫生病了, 老鼠也病了, 它说:"我还是习惯那种时时紧张, 处处小心, 夜夜逃亡的生活." 午夜, 我听到老鼠在叹息, 且不再读诗了. </font></table>
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-02-04 14:40
在APP主线程中建立采集线程,主线程记时及检测是否有新数据,有就刷新屏幕;采集线程就是你现在的APP的功能,只是不刷新屏幕,有数据就通知主线程。别忘了在采集线程中加上判别主线程结束的程序以便退出。
游客

返回顶部