阅读:1166回复:1
急。有关返回值的问题?
各位大侠:
本人在改编磁盘过滤驱动,想在读写例程中用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; } |
|
沙发#
发布于:2005-07-11 14:54
1、在complete例程中返回STATUS_Success和STATUS_MORE_PROCESSING_REQUIRED对Dispatch例程有何区别?
当你返回STATUS_MORE_PROCESSING_REQUIRED, IoCompleteReuqest将停在该IRP上, 而你的处理代码才能继续执行!具体请参看programming the microsoft windows driver model 呵呵,重点看一下请求完成的流程 2、Dispatch例程中返回的是status = Irp->IoStatus.Status还是IoStatus.Status? 用IoStatus.Status肯定没错,具体也不清楚,但是可以看到DDk中所有的例子都是用这个,没有作过试验,你可以加载二层过滤驱动来试试。 3、返回的读写长度是否应该是Irp->IoStatus->Information还是IoStatus->Information? Iostatus的Information我觉得没有什么用,在DDk文档上说的是如果底层返回的成功,就是数据的大小,如果是错误就设为0,其实如果成功了,底层驱动想设啥就设啥! 应该先检查Status域,就知道是否成功了! |
|