sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
阅读:1477回复:8

磁盘过滤驱动的一个奇怪问题

楼主#
更多 发布于:2007-12-21 17:21
我做了一个磁盘过滤驱动,按簇进行的读写跳转,达到还原的目的.
一切正常...还算比较可以..

但是因为速度太慢了,我就想,如把分块定为几个簇,就容易了.所以,我定为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就不行了.....出现目录或文件损坏..

那位高手帮我想一下.为什么..这么奇怪的问题...谢谢

最新喜欢:

LeopardLeopar...
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-12-21 19:04
我猜测你可能是在NTFS上做的测试
NTFS的目录条目的最小单位是2k,也就是说如果创建一个文件,目录条目部分至少有2K的内容被改动。是不是NTFS的目录的条目的读写没有处理好啊。
一切都是时间问题!
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-12-21 19:06
可以使用DiskExplorer直接分析磁盘上的文件系统的数据结构,看损坏是损坏成了什么样子。反过来推出自己出问题的地方。
一切都是时间问题!
sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-21 19:29
谢谢二位的支持,回2楼的,我是在NTFS上做的测试,没有特别处理目录区,因为我想目录区写出来,也是在磁盘上的.而且是在分区内,所以,还是当做的一般处理.如果说读写不足一个簇(块),先复制这个块到垃圾数据区,然后再让他写到垃圾数据区,这样就不会存在少写时的错误了..把一个簇当作一个块测试时,不管簇分成多大,或多小,都没有问题..

回3楼,我试一下看..一会不行,再来请教..谢谢
sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-12-22 11:33
还是不行.用DiskExplorer找不到损坏目录,可能是我不会用吧...

再请问一下,利用自建IRP读写数据时,是不是读写时,有最大限制呀..

我现在,如果是分成4k一个簇,每次读写,就达到了32K,是不是达到上限了,所以不行...

谢谢.请各位指点一下.
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-12-22 14:48
应该不是上限的问题,应该是数据没有正确的读取和存储的问题。
一个可能,若文件系统了在目录条目区修改了2k的数据,而你按照4K分块,则会读取4K的数据,存储4K的数据,如果没有正确从硬盘上直接读出来,就会出问题。
另一个可能,NTFS是一个支持日志的文件系统,对硬盘的数据的修改是有顺序的,比如先写日志2K,然后写目录区2K,然后写日志区2K,如果把顺序调换了,则可能出现日志内容不正确的问题。
建议你自己写一个文件拷贝程序,拷贝大批量文件,然后逐步减少拷贝文件的数据,然后确定引发问题的原因。
一切都是时间问题!
sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-12-23 18:12
我找到原因了.好像是MFT文件损坏了..

楼上的说的,第一种可能不太存在,我详细测试了,读取簇和存取簇的代码.没有问题.
可能是你的说的日志文件的问题.可以帮我解释一下吗/.

还有,你说的写一个复制程序,这个容易,不过,减少复制数据无法测试出原因呀...

现在我把程序改成通用性的了.只要改变一个变量值,就可以在几个分块大小中变化.当分块为1个簇一块的时候,一点问题都没有.]

只要改成2个,马上就出问题了...
sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-12-23 18:14
目录和文件损坏,只是在保护模式下,重启后,并不会出现保护数据被破坏了.所以,我认为只是垃圾数据被破坏了..现在就难了.
不知道有没有工具,可以分析MFT文件正确与否的东西...请各位帮我一下.谢谢..
sc_wolf
驱动小牛
驱动小牛
  • 注册日期2006-09-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望278点
  • 贡献值1点
  • 好评度150点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-12-23 18:20
是不是处理这个MFT文件,要有什么特别的方法...谢谢..请各位帮我一下..
游客

返回顶部