zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1633回复:3

coolice先生,还有个问题

楼主#
更多 发布于:2003-02-13 19:25
我准备采用你说的最后一个办法,在完成例程里如果Irp->PendingReturned为真的话,该怎么处理?也是返回STATUS_MORE_PROCESSING_REQUIRED吗?
签名是什么?
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-14 09:55
对,IoMarkIrpPending,然后返回STATUS_MORE_PROCESSING_REQUIRED
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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是否需要设置和改动?比如参数
签名是什么?
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-14 15:23
这种方法我也没来得及试。

1和2理论上好象无关紧要,不过保险起见可以再设一次
3不需要
游客

返回顶部