阅读:1705回复:7
IMD不能主动和应用程序通讯么?(100分请教)
看了很多应用程序和IMD驱动交互的文章,但全都是应用程序通过CreateFile()主动和驱动交互,难道驱动就不能主动和应用程序交互么?例如我们在驱动中过滤了一个IP包,这个事件怎么通知上层的应用程序呢,希望各位大侠赐教.
|
|
沙发#
发布于:2004-01-05 18:37
Event可以。 :D
|
|
板凳#
发布于:2004-01-05 19:23
刚刚看了原胡老大的一篇帖子,发现是可以通过事件来实现的,呵呵
附上帖子的地址: http://www.driverdevelop.com/read.php?t=A&id=107 希望对和我一样有疑惑的哥们有帮助; 另问:派分怎么操作,呵呵,反正积分也不多,派完了心安。算是给各位前辈的见面礼了,呵呵 :D |
|
地板#
发布于:2004-01-06 12:48
1、从应用层创建事件句柄,然后通过DeviceIoControl将该局柄传给驱动层,驱动层调用ObReferenceObjectByHandle进行驱动对象控制
2、应用层调用WaitForSingleObject对驱动事件的相应动作进行等待处理操作,驱动层对事件对象有所动作时就会触发 给分之后给你点源代码;) |
|
|
地下室#
发布于:2004-03-01 14:27
楼上的大侠,你说的这种办法试过拉,当需要驱动层向应用层递包时,会造成丢包现象,而且丢包率比较高.
|
|
5楼#
发布于:2004-03-02 09:37
丢包可能是存在性能瓶颈?用共享内存+事件通知试一试如何?不用Irp往应用层传递数据,应用层接到事件通知后就马上去直接读取共享内存(可以存储自定义数据队列),驱动层把分析结果数据直接写到共享内存队列,这样的话应该就不用通过内核IO管理器来传送数据了,应该可以提高性能的;)
补充:使用Irp建议应该用在非频繁访问配置内核数据时使用;0 |
|
|
6楼#
发布于:2004-03-02 09:55
楼上大侠:
使用事件方式时,应用层和驱动层共享一个事件,当有大量的包来到时发现应用层在将事件置成非信号态时会失败,造成丢包。 现在在试irp的方式,遇到一个问题:在irp取消时会出现篮平现象, multiple_irp_complete_requests,看以前的帖子好像因为一个irp被重复完成造成的,我检查过代码了,应该不是这个问题。 |
|
7楼#
发布于:2004-03-02 11:15
1、内核事件设置为非信号必须调用:KeClearEvent();
2、通过Irp发送一个自定义的IoControlCode给内核,告诉内核如何设置事件对象的信号状态 3、取消Irp时一定先要通知内核,并调用ObDereferenceObject()对事件对象进行解放处理 祝顺利:) |
|
|