• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    硬盘基地手机版
  • 关注官方公众号
    微信扫一扫关注
    硬盘基地公众号
  • 用Winhex脚本计算并写入exFAT的DBR校验

    [复制链接]
    zck699 发表于 2017-4-14 15:57:57 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
    本帖最后由 zck699 于 2017-4-20 01:20 编辑

      现在很多人的U盘甚至移动硬盘都在使用exFAT文件系统,exFAT文件系统一个烦人的问题就是DBR中若因意外损坏,会导致提示未格式化无法使用。
     
      以前的一些帖子甚至某些数据恢复类的书籍中讲的方法都是找一个好的DBR先覆盖坏掉的DBR,再修改PBP参数就恢复了。其实,由于exFAT分区的第12个扇区中有前11个扇区(DBR及保留扇区)校验值的存在,即使这些参数修正确,仍会因校验出错提示格式化,使得Windows无法访问数据,只能用winhex或其他数据恢复软件中提取数据。要在恢复数据后能让Windows直接打开,必须得正确计算并写入校验值才行。想写个程序解决,但不是科班出生,虽能看懂一些程序代码但自己不会编程,以前从论坛上下载过一个校验程序,遗憾的是这个程序只能用于DBR在63扇区的情况,每次修复DBR扇区后,还得弄个虚拟硬盘,将DBR的前12个扇区数据从虚拟硬盘的63扇区写入,再用该程序检验。

      这样做实在是太麻烦,就想写一个Winhex脚本应该解决该问题。先查到校验算法:

    UNIT32 BootChecksum(const unsigned char data[], int bytes)  
        {  
        UINT32 checksum   =   0;  
        for (int i = 0; i < bytes; i++)  
        {  
        if (i == 106 || i == 107 || i == 112)  
        continue;  
        checksum = (checksum<< 31) | (checksum>> 1) + data;  
        }  
        returnchecksum;  
        }  

      无非就是设置一个校验值变量,初始化值为0,然后逐一读取前11个扇区的每个字节,跳过106、107、112这三个字节,循环计算直到第11扇区结束:校验值为左移31位与右移1位进行按位或运算,再加上每次读取到的相应字节值。

      Winhex脚本貌似不支持移位运算,用乘除法代之,按照上述检验算法,写出了校验脚本,测试完全正确。从此,好久没再忍受计算校验之苦了。

      如法炮制,后来又写了GPT分区的校验脚本,解决GPT分区也方便多了。
    1

    查看全部评分

    精彩评论4

    bakawa 发表于 2017-5-9 17:24:33 | 显示全部楼层
    gpt exfat的三校验曾经用bat脚本写过一个
    不过winhex还能用脚本?  是winhex的模板文件?
    回复 支持 反对

    使用道具 举报

    feifanll 发表于 2017-10-19 12:42:02 | 显示全部楼层
    checksum = (checksum<< 31) | (checksum>> 1) + data
    这个运算checksum值会溢出,怎么处理?
    麻烦大神回复一下,谢谢!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关注0

    粉丝3

    帖子14

    发布主题
    阅读排行 更多
    广告位

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    .

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    .
    Email:9443120@qq.com
    移动电话:13011628855

    Powered by Intohard X1.0© 2001-2013 Inhdd Inc.( 鲁ICP备09029790号 )