阅读:992回复:0
急。有关返回值的问题?
各位大侠:
本人在改编磁盘过滤驱动,想在读写例程中用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; } |
|