slobby
驱动牛犊
驱动牛犊
  • 注册日期2003-12-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1705回复:7

IMD不能主动和应用程序通讯么?(100分请教)

楼主#
更多 发布于:2004-01-05 18:08
看了很多应用程序和IMD驱动交互的文章,但全都是应用程序通过CreateFile()主动和驱动交互,难道驱动就不能主动和应用程序交互么?例如我们在驱动中过滤了一个IP包,这个事件怎么通知上层的应用程序呢,希望各位大侠赐教.
cloudycro
驱动牛犊
驱动牛犊
  • 注册日期2003-12-02
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-01-05 18:37
Event可以。 :D
slobby
驱动牛犊
驱动牛犊
  • 注册日期2003-12-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-01-05 19:23
刚刚看了原胡老大的一篇帖子,发现是可以通过事件来实现的,呵呵
附上帖子的地址:
http://www.driverdevelop.com/read.php?t=A&id=107
希望对和我一样有疑惑的哥们有帮助;
另问:派分怎么操作,呵呵,反正积分也不多,派完了心安。算是给各位前辈的见面礼了,呵呵 :D
yongliliu
驱动小牛
驱动小牛
  • 注册日期2003-10-20
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-01-06 12:48
1、从应用层创建事件句柄,然后通过DeviceIoControl将该局柄传给驱动层,驱动层调用ObReferenceObjectByHandle进行驱动对象控制
2、应用层调用WaitForSingleObject对驱动事件的相应动作进行等待处理操作,驱动层对事件对象有所动作时就会触发

给分之后给你点源代码;)
成功不是天上掉下来的免费的丰盛的晚餐!
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-01 14:27
楼上的大侠,你说的这种办法试过拉,当需要驱动层向应用层递包时,会造成丢包现象,而且丢包率比较高.
yongliliu
驱动小牛
驱动小牛
  • 注册日期2003-10-20
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-02 09:37
丢包可能是存在性能瓶颈?用共享内存+事件通知试一试如何?不用Irp往应用层传递数据,应用层接到事件通知后就马上去直接读取共享内存(可以存储自定义数据队列),驱动层把分析结果数据直接写到共享内存队列,这样的话应该就不用通过内核IO管理器来传送数据了,应该可以提高性能的;)

补充:使用Irp建议应该用在非频繁访问配置内核数据时使用;0
成功不是天上掉下来的免费的丰盛的晚餐!
lucy_huiminz
驱动小牛
驱动小牛
  • 注册日期2002-06-18
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-02 09:55
楼上大侠:

使用事件方式时,应用层和驱动层共享一个事件,当有大量的包来到时发现应用层在将事件置成非信号态时会失败,造成丢包。

现在在试irp的方式,遇到一个问题:在irp取消时会出现篮平现象,
multiple_irp_complete_requests,看以前的帖子好像因为一个irp被重复完成造成的,我检查过代码了,应该不是这个问题。
yongliliu
驱动小牛
驱动小牛
  • 注册日期2003-10-20
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-03-02 11:15
1、内核事件设置为非信号必须调用:KeClearEvent();
2、通过Irp发送一个自定义的IoControlCode给内核,告诉内核如何设置事件对象的信号状态
3、取消Irp时一定先要通知内核,并调用ObDereferenceObject()对事件对象进行解放处理

祝顺利:)
成功不是天上掉下来的免费的丰盛的晚餐!
游客

返回顶部