zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
阅读:1585回复:9

irp超时问题

楼主#
更多 发布于:2005-06-09 18:53
我先设置完成例程,然后IoCallDriver调用下层驱动,然后等待
一般KeWaitForSingleObject都是死等,如果我设置一个超时值,让它等待一段时间就不等了,比如等3秒,假如第4秒的时候完成了,这是完成例程中要SetEvent,但是因为超时,这个Event在内存中已经释放,这时就会蓝屏。如果我要等待一段时间就不等了,一般怎么处理?谢谢先!!!
IoSetCompletionRoutine;
IoCallDriver;
KeWaitForSingleObject;
还有一个问题,假如我在驱动中调用一个函数,这个函数很长时间都没有返回,我怎么检查是否超时?谢谢,驱动中真的不会玩超时

[编辑 -  6/9/05 by  zealsoft_zhu]

最新喜欢:

yjx2003yjx200...
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-10 09:09
我先设置完成例程,然后IoCallDriver调用下层驱动,然后等待
一般KeWaitForSingleObject都是死等,如果我设置一个超时值,让它等待一段时间就不等了,比如等3秒,假如第4秒的时候完成了,这是完成例程中要SetEvent,但是因为超时,这个Event在内存中已经释放,这时就会蓝屏。如果我要等待一段时间就不等了,一般怎么处理?谢谢先!!!
IoSetCompletionRoutine;
IoCallDriver;
KeWaitForSingleObject;
还有一个问题,假如我在驱动中调用一个函数,这个函数很长时间都没有返回,我怎么检查是否超时?谢谢,驱动中真的不会玩超时

[编辑 -  6/9/05 by  zealsoft_zhu]

这时一般采用两个事件,一个供KeWaitForSingleObject带超时等待用,如果4秒完成,则使用另一个事件,回头需要时检索这个事件状态即可
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-10 09:37
没有明白,bmyyyud老大可以稍微解释一下吗?或者用伪代码写一段示范一下,谢谢!
baiyuanfan
驱动小牛
驱动小牛
  • 注册日期2004-11-23
  • 最后登录2007-06-21
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望38点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-10 11:30
bmyyyud老大,那么你那个等待irp完成的event什么时候释放呢?
各类后门,木马,Exp,0day
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-10 15:46
我先设置完成例程,然后IoCallDriver调用下层驱动,然后等待
一般KeWaitForSingleObject都是死等,如果我设置一个超时值,让它等待一段时间就不等了,比如等3秒,假如第4秒的时候完成了,这是完成例程中要SetEvent,但是因为超时,这个Event在内存中已经释放,这时就会蓝屏。如果我要等待一段时间就不等了,一般怎么处理?谢谢先!!!
IoSetCompletionRoutine;
IoCallDriver;
KeWaitForSingleObject;
还有一个问题,假如我在驱动中调用一个函数,这个函数很长时间都没有返回,我怎么检查是否超时?谢谢,驱动中真的不会玩超时

[编辑 -  6/9/05 by  zealsoft_zhu]

喔,没有仔细想,“这是完成例程中要SetEvent,但是因为超时,这个Event在内存中已经释放。”
“Event在内存中已经释放”,为什么立即就要在内存中释放它呢?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-10 17:01
我用伪代码表示吧:
A()
{
  KEVENT event;
  。。。。
  IoSetCompletionRoutine(irp,B,&event,TRUE,TRUE,TRUE);
  status=IoCallDriver();
  if(status=STATUS_PENDING)
  {
     status=KeWaitForSingleObject(event,.....,time);
     if(超时)
     {
      }
  }
}
B(event)
{
    kesetevent(event);
}
显然,在A函数中如果等待超时,A函数肯定会退出,这样event也就释放了。当然我只是举一个例子,还有其他东西,我想知道怎么判断超时,或者在驱动中我要判断一个其他的东西超时怎么办?假设不是irp。
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-10 18:00
等待的时候若超时,则调用IoCancelIrp把等待的Irp取消。然后再等待你的completion routine里边设置的event.
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-11 09:41
等待的时候若超时,则调用IoCancelIrp把等待的Irp取消。然后再等待你的completion routine里边设置的event.

对,在你的设备扩展中定义 KEVENT event
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-13 09:42
唉,我没有把问题说清楚,我详细描述一下,我拦截到一个IO请求,我需要把这个IO请求分成若干个IO请求同时转发到下层(假设是5个吧)。当我转发了3个的时候(这是已经调用了IoCallDriver函数,只是完成例程还没有得到控制),我在转发第4个的时候,转发失败(因为在转发过程中需要分配新的irp包,分配失败),这时我只能等待前面3个结束,最后在结束整个io请求。对于这种情况,大家一般怎么处理。这个写程序真的不好写。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-13 15:19
唉,我没有把问题说清楚,我详细描述一下,我拦截到一个IO请求,我需要把这个IO请求分成若干个IO请求同时转发到下层(假设是5个吧)。当我转发了3个的时候(这是已经调用了IoCallDriver函数,只是完成例程还没有得到控制),我在转发第4个的时候,转发失败(因为在转发过程中需要分配新的irp包,分配失败),这时我只能等待前面3个结束,最后在结束整个io请求。对于这种情况,大家一般怎么处理。这个写程序真的不好写。

如果你要分割成的irp不确定的话,要用ExAllocatePoolWithTag分配KEVENT,然后用个队列管理起来
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部