hook418
驱动牛犊
驱动牛犊
  • 注册日期2003-12-28
  • 最后登录2009-12-24
  • 粉丝0
  • 关注0
  • 积分191分
  • 威望28点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1167回复:1

急。有关返回值的问题?

楼主#
更多 发布于:2005-07-10 17:06
  各位大侠:
  本人在改编磁盘过滤驱动,想在读写例程中用IoBuildSynchronousFsdRequest产生的IRP对磁盘同步读写,如下。运行正常,但再读磁盘时返回的长度有是为0。请问这是何原因?
另:
1、在complete例程中返回STATUS_Success和STATUS_MORE_PROCESSING_REQUIRED对Dispatch例程有何区别?
  2、Dispatch例程中返回的是status = Irp->IoStatus.Status还是IoStatus.Status?
  3、返回的读写长度是否应该是Irp->IoStatus->Information还是IoStatus->Information?

谢谢!

NTSTATUS
DispatchReadRoutine(
  IN PDEVICE_OBJECT DeviceObject,
  IN PIRP Irp
  )
{
  KEVENT   event;
  NTSTATUS status;
  IO_STATUS_BLOCK ioStatus;
  ......

  KeInitializeEvent(&event, NotificationEvent, FALSE);
  irp = IoBuildSynchronousFsdRequest(
          IRP_MJ_READ,
          TopOfDeviceStack,
          ReadBuffer,
          NumBytes,
          &startingOffset,
          &event,
          &ioStatus
          );

  if (NULL == irp) {
    return STATUS_INSUFFICIENT_RESOURCES;
  }

  IoSetCompletionRoutine(irp,
          CompletionReadRoutine,
          (PVOID)&event,
          TRUE,
          TRUE,
          TRUE);


  status = IoCallDriver(TopOfDeviceStack, Irp);

  if (status == STATUS_PENDING) {

    KeWaitForSingleObject(&event,
                  Executive, // WaitReason
                  KernelMode, // must be Kernelmode to prevent the stack getting paged out
                  FALSE,
                  NULL // indefinite wait
                  );
    status = Irp->IoStatus.Status; //****** status = IoStatus.Status;
  }

//返回的读写长度
  len = IoStatus->Information;   //****** status = Irp->IoStatus.Information;

  IoCompleteRequest (Irp, IO_NO_INCREMENT);
  return status;

}
NTSTATUS
CompletionReadRoutine(
  IN PDEVICE_OBJECT   DeviceObject,
  IN PIRP         Irp,
  IN PVOID         Context
  )
{
if (Irp->PendingReturned == TRUE) {
    KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
}

return STATUS_MORE_PROCESSING_REQUIRED;
}
linweiwww
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-11 14:54
1、在complete例程中返回STATUS_Success和STATUS_MORE_PROCESSING_REQUIRED对Dispatch例程有何区别?
   当你返回STATUS_MORE_PROCESSING_REQUIRED, IoCompleteReuqest将停在该IRP上, 而你的处理代码才能继续执行!具体请参看programming the microsoft windows driver model
    呵呵,重点看一下请求完成的流程

2、Dispatch例程中返回的是status = Irp->IoStatus.Status还是IoStatus.Status?
   用IoStatus.Status肯定没错,具体也不清楚,但是可以看到DDk中所有的例子都是用这个,没有作过试验,你可以加载二层过滤驱动来试试。

3、返回的读写长度是否应该是Irp->IoStatus->Information还是IoStatus->Information?
     Iostatus的Information我觉得没有什么用,在DDk文档上说的是如果底层返回的成功,就是数据的大小,如果是错误就设为0,其实如果成功了,底层驱动想设啥就设啥!
    应该先检查Status域,就知道是否成功了!
游客

返回顶部