|
本帖最后由 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分区也方便多了。 |
-
|