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

急。有关返回值的问题?

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

返回顶部