阅读:1576回复:1
改变 IrpSp->Parameters.Write.ByteOffset 为什么没有作用, 附代码.高人帮忙看看NTSTATUS SfWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { IrpSp->Parameters.Write.ByteOffset.QuadPart = newByteOffset; Irp->MdlAddress = newMdl; Irp->UserBuffer = newUserBuffer; IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, SfWriteCompletion, CompletionCtx, TRUE, TRUE, TRUE); return IoCallDriver(DevExt->AttachedToDeviceObject, Irp); } NTSTATUS SfWriteCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { IrpSp->Parameters.Write.ByteOffset.QuadPart = CompletionCtx->OldByteOffset; Irp->MdlAddress = CompletionCtx->OldMdl; Irp->UserBuffer = CompletionCtx->OldUserBuffer; return STATUS_SUCCESS; } 设置IrpSp->Parameters.Write.ByteOffset值没有用, 写入文件的数据还是从文件0偏移开始? 为什么? 高人帮忙看看. 如果是读, 这样操作是可以成功的, 为什么写不行? |
|
驱动小牛
![]() |
沙发#
发布于:2008-07-29 18:10
IrpSp->Parameters.Write.ByteOffset.QuadPart = CompletionCtx->OldByteOffset;
这句你可能需要跟踪一下,如果一开始OFFSET为0,那么你的就一直为0了.另外,你应该注意FILEOBJECT里面的一个CurrentFileOffset,这个表示当前位置,通常情况下Write后会自动更新这个值,但如果你做了特殊处理就需要自己去维护.你可以在每次IRP结束的时候这个通常指的就是: if (SynchronousIo && !PagingIo) { pIrpStack->FileObject->CurrentByteOffset.QuadPart = StartOffset + IoStatus.Information; } |
|