阅读:2329回复:3
diskperf中IRP_MJ_WRITE写的数据长度问题
我想在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 都不像是要写的长度,特别大, 我想请问这个长度要怎么取,有什么资料可以看看吗 |
|
沙发#
发布于:2009-07-29 09:44
我猜想你可能只写了几行字,但是读出来的就是32768 4096 。。。。
这是文件系统固定的写入和读取数据,它不可能就是你写了几个字节就读几个字节,而且每个文件在磁盘中的存储也不可能之后你写的几个字节,否则各个文件怎么标记和区别,OFFICE文件的特殊效果怎么实现,没有文件除了文件内容还有固定的信息头的 你尝试让文件的内容放大,到几十M,你就会发现一个文件并不是一次全部读取的,而是多个批次分块读取的 文件系统在读取的时候是按照磁盘中磁道的存储对齐格式动态设定读取大小的 你如果写的少的话 即使你写10个字节 20个字节 它都读取的是4096 32768等等固定大小的块 |
|
板凳#
发布于:2009-07-29 10:38
谢谢shar123了 !!!
|
|
地板#
发布于:2011-06-03 14:45
这些东西都学过,可有时候就是没想过来,呵呵,谢谢啦
|
|