j965829
驱动牛犊
驱动牛犊
  • 注册日期2003-12-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望29点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:1575回复:1

改变 IrpSp->Parameters.Write.ByteOffset 为什么没有作用, 附代码.高人帮忙看看

楼主#
更多 发布于:2008-07-15 17:40
  
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偏移开始? 为什么? 高人帮忙看看.
如果是读, 这样操作是可以成功的, 为什么写不行?
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
沙发#
发布于: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;
                        }
商务MSN:YanDong_8212@163.com
游客

返回顶部