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

急。有关返回值的问题?

楼主#
更多 发布于:2005-07-10 17:05
  各位大侠:
  本人在改编磁盘过滤驱动,想在读写例程中用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;
}
游客

返回顶部