阅读:2285回复:8
请问tdi filter中如何在ClientEventHandler中pending当前操作
请问tdi filter中如何在ClientEventHandler中pending当前操作,
等待KeWaitXXX返回再处理???会不会影响系统性能??? |
|
最新喜欢:hbnhbn... |
沙发#
发布于:2004-08-18 10:30
最好的办法是维护一个IRP队列,然后处理。如果自己实现较麻烦,比如对Cancel的处理,不过你可以采用cancel-safe-queue,XP以后支持,ddk有一个例子。
[编辑 - 8/20/04 by lixiangying] |
|
板凳#
发布于:2004-08-20 18:33
您是说在ClientEventHandler中返回status_pending,然后怎么做???
"维护一个irp队列"是什么意思,这个irp是自己创建的还是系统创建的,如果是系统创建的,但是ClientEventChainedReceive中没有参数是irp啊,另外,如果我以后想继续这个ClientEventHandler,我该怎么做??? 小弟新手,太多问题不懂,还请大家海涵。谢谢! :) |
|
地板#
发布于:2004-08-20 22:16
对于队列,你参照xpddk中的src\\general\\cancel例子,具体实现看了你就知道了。你也可以看看这篇文章:
[url] http://www.osr.com/ddk/kmarch/irps_4sdj.htm[/url] 对于connect_event_handler, 当然不能返回pending,参看以前的文章: [url] http://www.driverdevelop.com/forum/viewthread.php?tid=59907#pid479904[/url]有实现方法。我就是参照此方法做的。 如果是控制外部连入,可以不考虑**chain_receive**吧?! [编辑 - 8/20/04 by lixiangying] [编辑 - 8/20/04 by lixiangying] |
|
地下室#
发布于:2004-08-23 18:06
非常感谢lixiangying的回答!
我还有几点疑问: 1、为什么控制外部连接不需要考虑**chain_receive**呢?? 2、**chain_receive**在什么情况下会被调用?? 比如在ClientEventReceive中如何pending当前操作呢?? 如果直接返回STATUS_MORE_PROCESSING_REQUIRED,那是否需要自己构造一个irp赋给IoRequestPacket, 如果调用上层的ClientEventReceive,那上层不返回STATUS_MORE_PROCESSING_REQUIRED该怎么办? 问题太菜了,望大虾见谅。 :) 能有一些代码片断那就更好了。 [编辑 - 8/23/04 by tooflat] |
|
5楼#
发布于:2004-08-24 15:59
刚写了一大段文字,竟然非法操作,郁闷,重新来,:)
《http://www.driverdevelop.com/forum/viewthread.php?tid=59907#pid479904有实现方法。我就是参照此方法做的。》 不知道你是怎么实现的,对于connect和receive还是有很大不同的 这种方法对connect可行,对receive???不知道怎么处理。因为 receive不是总是返回IoRequestPacket的。 目前我有个想法,就是不管如何,都构建一个自己的receive irp去读取余下的数据(如果没有怎么办??发一个irp去读取0字节数据????),然后在完成例程中返回more_processing_required,然后和win32交互,再决定是否调用client注册的handler,不知道是否可行。 另外好像看这个帖子的人挺多的,大家有什么意见,尽管说啊,//bow :) :) :) |
|
6楼#
发布于:2004-08-24 20:49
严重关注,我也想知道在receive里是否能pending,如何做??!!
|
|
|
7楼#
发布于:2004-08-26 17:18
经过无数次的蓝屏,终于搞定了, :D :D :D :D
就用我上面提到的方法。 期间为了一个低级错误耗费了过多的时间,不过还算有所值。 不知道天网是不是也是有的这种方法??看了他的sys文件,好像 可能大概也许或者应该是的吧。 :D :D :D |
|
8楼#
发布于:2004-08-27 13:47
非常感谢!
[编辑 - 9/3/04 by zxcasd] |
|
|