KennthD
驱动牛犊
驱动牛犊
  • 注册日期2009-07-13
  • 最后登录2009-08-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2329回复:3

diskperf中IRP_MJ_WRITE写的数据长度问题

楼主#
更多 发布于:2009-07-22 19:24
我想在DiskPerfReadWrite这个函数里取到要写的数据和长度,于是加了下面的代码
if(currentIrpStack->MajorFunction == IRP_MJ_WRITE)
 {
...................
      Length = currentIrpStack->Parameters.Write.Length;   //  PIO_STACK_LOCATION currentIrpStack   = IoGetCurrentIrpStackLocation(Irp);
                                                                                                       //currentIrpStack是这样来的
  
   Lengthoff = currentIrpStack->Parameters.Write.ByteOffset.QuadPart;
      system_buffer = (PUCHAR)MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
.................
}

可是这个Length和Lengthoff 都不像是要写的长度,特别大,

我想请问这个长度要怎么取,有什么资料可以看看吗
shar123
驱动牛犊
驱动牛犊
  • 注册日期2009-05-12
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望461点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-07-29 09:44
我猜想你可能只写了几行字,但是读出来的就是32768 4096 。。。。
这是文件系统固定的写入和读取数据,它不可能就是你写了几个字节就读几个字节,而且每个文件在磁盘中的存储也不可能之后你写的几个字节,否则各个文件怎么标记和区别,OFFICE文件的特殊效果怎么实现,没有文件除了文件内容还有固定的信息头的
你尝试让文件的内容放大,到几十M,你就会发现一个文件并不是一次全部读取的,而是多个批次分块读取的
文件系统在读取的时候是按照磁盘中磁道的存储对齐格式动态设定读取大小的
你如果写的少的话  即使你写10个字节 20个字节 它都读取的是4096  32768等等固定大小的块
KennthD
驱动牛犊
驱动牛犊
  • 注册日期2009-07-13
  • 最后登录2009-08-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-07-29 10:38
谢谢shar123了 !!!
squirrells
驱动牛犊
驱动牛犊
  • 注册日期2011-06-02
  • 最后登录2011-06-05
  • 粉丝0
  • 关注2
  • 积分25分
  • 威望150点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2011-06-03 14:45
这些东西都学过,可有时候就是没想过来,呵呵,谢谢啦
游客

返回顶部