tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
阅读:2285回复:8

请问tdi filter中如何在ClientEventHandler中pending当前操作

楼主#
更多 发布于:2004-08-16 13:51
请问tdi filter中如何在ClientEventHandler中pending当前操作,
等待KeWaitXXX返回再处理???会不会影响系统性能???

最新喜欢:

hbnhbnhbnhbnhbn...
lixiangying
驱动牛犊
驱动牛犊
  • 注册日期2002-05-03
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-18 10:30
最好的办法是维护一个IRP队列,然后处理。如果自己实现较麻烦,比如对Cancel的处理,不过你可以采用cancel-safe-queue,XP以后支持,ddk有一个例子。

[编辑 -  8/20/04 by  lixiangying]
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-20 18:33
您是说在ClientEventHandler中返回status_pending,然后怎么做???

"维护一个irp队列"是什么意思,这个irp是自己创建的还是系统创建的,如果是系统创建的,但是ClientEventChainedReceive中没有参数是irp啊,另外,如果我以后想继续这个ClientEventHandler,我该怎么做???

小弟新手,太多问题不懂,还请大家海涵。谢谢! :)
lixiangying
驱动牛犊
驱动牛犊
  • 注册日期2002-05-03
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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]
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
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
 :) :) :)
zxcasd
驱动牛犊
驱动牛犊
  • 注册日期2001-06-14
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-24 20:49
严重关注,我也想知道在receive里是否能pending,如何做??!!
死了都要爱......
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-26 17:18
经过无数次的蓝屏,终于搞定了, :D :D :D :D
就用我上面提到的方法。

期间为了一个低级错误耗费了过多的时间,不过还算有所值。

不知道天网是不是也是有的这种方法??看了他的sys文件,好像
可能大概也许或者应该是的吧。 :D :D :D
zxcasd
驱动牛犊
驱动牛犊
  • 注册日期2001-06-14
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-27 13:47
非常感谢!

[编辑 -  9/3/04 by  zxcasd]
死了都要爱......
游客

返回顶部