阅读:1585回复:9
irp超时问题
我先设置完成例程,然后IoCallDriver调用下层驱动,然后等待
一般KeWaitForSingleObject都是死等,如果我设置一个超时值,让它等待一段时间就不等了,比如等3秒,假如第4秒的时候完成了,这是完成例程中要SetEvent,但是因为超时,这个Event在内存中已经释放,这时就会蓝屏。如果我要等待一段时间就不等了,一般怎么处理?谢谢先!!! IoSetCompletionRoutine; IoCallDriver; KeWaitForSingleObject; 还有一个问题,假如我在驱动中调用一个函数,这个函数很长时间都没有返回,我怎么检查是否超时?谢谢,驱动中真的不会玩超时 [编辑 - 6/9/05 by zealsoft_zhu] |
|
最新喜欢:![]() |
沙发#
发布于:2005-06-10 09:09
我先设置完成例程,然后IoCallDriver调用下层驱动,然后等待 这时一般采用两个事件,一个供KeWaitForSingleObject带超时等待用,如果4秒完成,则使用另一个事件,回头需要时检索这个事件状态即可 |
|
|
板凳#
发布于:2005-06-10 09:37
没有明白,bmyyyud老大可以稍微解释一下吗?或者用伪代码写一段示范一下,谢谢!
|
|
地板#
发布于:2005-06-10 11:30
bmyyyud老大,那么你那个等待irp完成的event什么时候释放呢?
|
|
|
地下室#
发布于:2005-06-10 15:46
我先设置完成例程,然后IoCallDriver调用下层驱动,然后等待 喔,没有仔细想,“这是完成例程中要SetEvent,但是因为超时,这个Event在内存中已经释放。” “Event在内存中已经释放”,为什么立即就要在内存中释放它呢? |
|
|
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。 |
|
6楼#
发布于:2005-06-10 18:00
等待的时候若超时,则调用IoCancelIrp把等待的Irp取消。然后再等待你的completion routine里边设置的event.
|
|
7楼#
发布于:2005-06-11 09:41
等待的时候若超时,则调用IoCancelIrp把等待的Irp取消。然后再等待你的completion routine里边设置的event. 对,在你的设备扩展中定义 KEVENT event |
|
|
8楼#
发布于:2005-06-13 09:42
唉,我没有把问题说清楚,我详细描述一下,我拦截到一个IO请求,我需要把这个IO请求分成若干个IO请求同时转发到下层(假设是5个吧)。当我转发了3个的时候(这是已经调用了IoCallDriver函数,只是完成例程还没有得到控制),我在转发第4个的时候,转发失败(因为在转发过程中需要分配新的irp包,分配失败),这时我只能等待前面3个结束,最后在结束整个io请求。对于这种情况,大家一般怎么处理。这个写程序真的不好写。
|
|
9楼#
发布于:2005-06-13 15:19
唉,我没有把问题说清楚,我详细描述一下,我拦截到一个IO请求,我需要把这个IO请求分成若干个IO请求同时转发到下层(假设是5个吧)。当我转发了3个的时候(这是已经调用了IoCallDriver函数,只是完成例程还没有得到控制),我在转发第4个的时候,转发失败(因为在转发过程中需要分配新的irp包,分配失败),这时我只能等待前面3个结束,最后在结束整个io请求。对于这种情况,大家一般怎么处理。这个写程序真的不好写。 如果你要分割成的irp不确定的话,要用ExAllocatePoolWithTag分配KEVENT,然后用个队列管理起来 |
|
|