阅读:962回复:0
求救!到底错在哪儿?
各位:
我在改编磁盘驱动程序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 不能返回。 我已郁闷了好几天了。请各位帮忙检查一下到底出现什么问题。 |
|