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

求救!到底错在哪儿?

楼主#
更多 发布于:2005-07-12 10:15
  各位:
我在改编磁盘驱动程序diskperf,想在diskperfread中用IoBuildSynchronousFsdRequest产生的IRP对磁盘同步读写,源代码如下:


NTSTATUS
DiskPerfRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )

{
    PDEVICE_EXTENSION  deviceExtension = DeviceObject->DeviceExtension;
    PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp);
    PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp);


   ULONG                     FirstSector;
   ULONG                     len;
   PCHAR                     BaseBuffer;

   LARGE_INTEGER                       NewSector;
   LONG                     retlen = 0;
   NTSTATUS              status;


   FirstSector = (ULONG)(currentIrpStack-Parameters.Read.ByteOffset.QuadPart >> 9);
   len = currentIrpStack->Parameters.Read.Length;

   DbgPrint("\norginal read: sector =%X,len = %X\n", FirstSector,len);

  // get address of buffer
  if (!FlagOn( Irp->Flags, IRP_ASSOCIATED_IRP ) &&
        (Irp->AssociatedIrp.SystemBuffer != NULL))

        BaseBuffer = Irp->AssociatedIrp.SystemBuffer;

  else if (Irp->MdlAddress != NULL)
        BaseBuffer = MmGetSystemAddressForMdlSafe( Irp->MdlAddress,        
            NormalPagePriority );

  NewSector.QuadPart = ((LONGLONG)FirstSector) << 9;
  NewLen = len;
  buffer = BaseBuffer;
 
  status = ReadWrite(IRP_MJ_READ,DeviceObject,buffer,&NewSector,&NewLen);

  if (NT_SUCCESS(status))
       retlen += NewLen;
 
  //
  // Complete the Irp
  //
  Irp->IoStatus.Status = status;
  Irp->IoStatus.Information = retlen;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);
  DbgPrint("number of bytes transferred = %X\n",retlen);
  return status;
}


NTSTATUS
ReadWrite(
       IN ULONG                            MajorFunction,
       IN PDEVICE_OBJECT              DeviceObject,
       IN OUT PVOID                     buffer,
       IN PLARGE_INTEGER              sector,
       IN ULONG                            *len)
{
    NTSTATUS                       status;
    IO_STATUS_BLOCK         ioStatus;
    KEVENT                           event;
    PDEVICE_EXTENSION     deviceExtension;
    PIRP                               irp;

    deviceExtension = DeviceObject->DeviceExtension;

    KeInitializeEvent(&event, NotificationEvent, FALSE);    //SynchronizationEvent,

    //
    // Request for the read/write disk
    //
    irp = IoBuildSynchronousFsdRequest(MajorFunction,
                    deviceExtension->TargetDeviceObject,
           buffer,
           *len,
           sector,
                    &event,
                    &ioStatus);

    if (!irp) {
        DiskPerfLogError(
            DeviceObject,
            256,
            STATUS_SUCCESS,
            IO_ERR_INSUFFICIENT_RESOURCES);

        DbgPrint("ReadWrite: Fail to build irp\n");
        return STATUS_INSUFFICIENT_RESOURCES;
   }

    IoSetCompletionRoutine(irp,
       (PIO_COMPLETION_ROUTINE) OnRequestComplete,
       (PVOID) &event,
       TRUE,
       TRUE,
       TRUE);


    status = IoCallDriver(deviceExtension->TargetDeviceObject, irp);
    if (status == STATUS_PENDING) {
        KeWaitForSingleObject(&event,Executive , KernelMode, FALSE, NULL);
        status = irp->IoStatus.Status;
    }

   *len = ioStatus.Information;

    return status;
}

NTSTATUS
OnRequestComplete(IN PDEVICE_OBJECT fdo,
                              IN PIRP Irp,
                              IN PKEVENT pev)
{
    if (Irp->PendingReturned)
       KeSetEvent(pev, IO_NO_INCREMENT, FALSE);

    return STATUS_MORE_PROCESSING_REQUIRED;
}

reboot后,输出:
。。。。。

orginal read: sector =4109655,len = 200
number of bytes transferred = 200

orginal read: sector =0,len = 200
number of bytes transferred = 1

orginal read: sector =0,len = 200
number of bytes transferred = 200

orginal read: sector =0,len = 1000

orginal read: sector =2730CBD,len = 1000
不能返回。

我已郁闷了好几天了。请各位帮忙检查一下到底出现什么问题。
游客

返回顶部