阅读:1633回复:3
coolice先生,还有个问题
我准备采用你说的最后一个办法,在完成例程里如果Irp->PendingReturned为真的话,该怎么处理?也是返回STATUS_MORE_PROCESSING_REQUIRED吗?
|
|
|
沙发#
发布于:2003-02-14 09:55
对,IoMarkIrpPending,然后返回STATUS_MORE_PROCESSING_REQUIRED
|
|
板凳#
发布于:2003-02-14 13:53
谢谢!
在Dispatch里面,我做的方法大致如下: IoCopyCurrentIrpStackLocationToNext(Irp); KeInitializeEvent(&event, SynchronizationEvent, FALSE); IoSetCompletionRoutine(Irp, Done, 0, TRUE, TRUE, TRUE); Irp->UserEvent = &event; for(;;) { IoCallDriver(); KeWaitForSingleObject(); { Filter Entry; if(ALL_OK) { IoCompleteRequest(); return status; } } KeResetEvent( &event ); IoSetCompletionRoutine(Irp, Done, 0, TRUE, TRUE, TRUE); } 上面这个流程是否正确? 有些疑问: 1、是否每次都需要IoCopyCurrentIrpStackLocationToNext(Irp);? 我只是做了一次 2、事件发生之后,再次IoCallDriver()的时候,是否还要设置 IoSetCompletionRoutine? 3、Irp是否需要设置和改动?比如参数 |
|
|
地板#
发布于:2003-02-14 15:23
这种方法我也没来得及试。
1和2理论上好象无关紧要,不过保险起见可以再设一次 3不需要 |
|