阅读:1477回复:8
磁盘过滤驱动的一个奇怪问题
我做了一个磁盘过滤驱动,按簇进行的读写跳转,达到还原的目的.
一切正常...还算比较可以.. 但是因为速度太慢了,我就想,如把分块定为几个簇,就容易了.所以,我定为8个簇读写一次. 因为,BITMAP文件中一个字节表示8个簇,这样方便..其它代码基本不变. 同样处理不满8个簇的情况和记录情况. 这时只要大量复制文件,就会出现"目录或文件损坏,无法读取的提示",但是重启后,写入的文件还是被还原了,而且也不会有磁盘错误. 所以,我开始怀疑是处理不满一个块时,复制时的错误,一个一个的功能测试后,发现没有错,最后,定位在找这个空闲块的地方有问题.因为,我每次把这个函数.直接返回系统当前读的块,就是不重定位..不还原..除了找空块这个函数,其它一切功能都在运行中,....结果系统可以正常运行,而且是也不出现错误.. 所以我怀疑是这个函数出错..函数如下: 我看来没有什么错误呀. ULONG MyGetNextProtectedCluster(PPARTINFO partinfo) { ULONG temp = 0xffffffff; ULONG i = 0; for(i =partinfo->m_pro_len/*上次查询的位置*/ ;i >0; i--)//从最后查找到最前面。。 { if(partinfo->Bitmap==0&&partinfo->m_protect_Bitmap==0)//找到一个了partinfo->m_pro_len =(partinfo->BitmapLength-2) { ///设置为这个地方被用 partinfo->Bitmap=255;///系统已用的BITMAP记录 //设置分区信息使用 partinfo->m_protect_Bitmap=255;///垃圾簇中的BITMAP记录 partinfo->m_pro_len = i; return i; //返回当前的块位置 } } return 0xffffffff;//没有找到情况 } 在我分析了上面函数后,我后来又测试了一次,把分区的簇格式化成了1k 结果,同样的代码,加上了查找空块的功能....不管怎么写入读取都是正常的.. 格式化为2k,测试也正常.. 4K就不行了.....出现目录或文件损坏.. 那位高手帮我想一下.为什么..这么奇怪的问题...谢谢 |
|
最新喜欢:Leopar... |
沙发#
发布于:2007-12-21 19:04
我猜测你可能是在NTFS上做的测试
NTFS的目录条目的最小单位是2k,也就是说如果创建一个文件,目录条目部分至少有2K的内容被改动。是不是NTFS的目录的条目的读写没有处理好啊。 |
|
|
板凳#
发布于:2007-12-21 19:06
可以使用DiskExplorer直接分析磁盘上的文件系统的数据结构,看损坏是损坏成了什么样子。反过来推出自己出问题的地方。
|
|
|
地板#
发布于:2007-12-21 19:29
谢谢二位的支持,回2楼的,我是在NTFS上做的测试,没有特别处理目录区,因为我想目录区写出来,也是在磁盘上的.而且是在分区内,所以,还是当做的一般处理.如果说读写不足一个簇(块),先复制这个块到垃圾数据区,然后再让他写到垃圾数据区,这样就不会存在少写时的错误了..把一个簇当作一个块测试时,不管簇分成多大,或多小,都没有问题..
回3楼,我试一下看..一会不行,再来请教..谢谢 |
|
地下室#
发布于:2007-12-22 11:33
还是不行.用DiskExplorer找不到损坏目录,可能是我不会用吧...
再请问一下,利用自建IRP读写数据时,是不是读写时,有最大限制呀.. 我现在,如果是分成4k一个簇,每次读写,就达到了32K,是不是达到上限了,所以不行... 谢谢.请各位指点一下. |
|
5楼#
发布于:2007-12-22 14:48
应该不是上限的问题,应该是数据没有正确的读取和存储的问题。
一个可能,若文件系统了在目录条目区修改了2k的数据,而你按照4K分块,则会读取4K的数据,存储4K的数据,如果没有正确从硬盘上直接读出来,就会出问题。 另一个可能,NTFS是一个支持日志的文件系统,对硬盘的数据的修改是有顺序的,比如先写日志2K,然后写目录区2K,然后写日志区2K,如果把顺序调换了,则可能出现日志内容不正确的问题。 建议你自己写一个文件拷贝程序,拷贝大批量文件,然后逐步减少拷贝文件的数据,然后确定引发问题的原因。 |
|
|
6楼#
发布于:2007-12-23 18:12
我找到原因了.好像是MFT文件损坏了..
楼上的说的,第一种可能不太存在,我详细测试了,读取簇和存取簇的代码.没有问题. 可能是你的说的日志文件的问题.可以帮我解释一下吗/. 还有,你说的写一个复制程序,这个容易,不过,减少复制数据无法测试出原因呀... 现在我把程序改成通用性的了.只要改变一个变量值,就可以在几个分块大小中变化.当分块为1个簇一块的时候,一点问题都没有.] 只要改成2个,马上就出问题了... |
|
7楼#
发布于:2007-12-23 18:14
目录和文件损坏,只是在保护模式下,重启后,并不会出现保护数据被破坏了.所以,我认为只是垃圾数据被破坏了..现在就难了.
不知道有没有工具,可以分析MFT文件正确与否的东西...请各位帮我一下.谢谢.. |
|
8楼#
发布于:2007-12-23 18:20
是不是处理这个MFT文件,要有什么特别的方法...谢谢..请各位帮我一下..
|
|