无忧启动论坛

 找回密码
 注册
搜索
最纯净的「微PE装机优盘」UEPON大师作品系统gho:最纯净好用系统下载站数据恢复、数据保护、视频编辑
Win To Go 极致利器(IXUNCIS固态U盘)无忧启动网成立20周年!广告联系 QQ:184822951 微信:wuyouceo
查看: 5271|回复: 22

[发布] 基于GRUB4DOS的分区DBR扇区磁头数检查与修正程序

[复制链接]
发表于 2011-5-3 20:37:07 | 显示全部楼层 |阅读模式
使用ABR还原分区备份时,偶尔出现了几次还原后不能启动的问题。 下功夫分析之后,得出结论,DBR扇区磁头数不正确导致不能正常启动系统。

这几天,抽时间,写了一个基于GRUB4DOS的 活动分区DBR扇区磁头数检查与修正的小程序。

现在,发布出来,给大家试用一下。反馈一下BUG。我已经测试过,应该不会有大问题。
支持分区类型: NTFS / FAT32 支持自动模式与手动模式。 可以自由修改磁头数。
注意,不支持从U盘启动来检查与修正磁头数,因为从U盘启动GRUB4DOS,U盘可能会被识别为HD0。
如果你要从U盘启动来运行该批处理,需要自己交换磁盘。 比如 map (hd1) (hd0)    map (hd0) (hd1) map --hook
目前,只支持修正 hd0 的活动分区的DBR 磁头数。 通过修改,应该可以很容易实现多硬盘的检查与修正。

晚上,打开无忧实在是太慢了。

只上传批处理文件吧。 请自行解压使用。

20110523更新: 手动指定参数改进,可以指定磁盘参数或者是分区参数都可以,不指定情况下,只检查 (hd0) 注意GRUB4DOS的磁盘表示法是区分大小写的。 (HD0) 的表示法是错误的!
使用示例:   headchk    检查(hd0) 的活动分区的磁头数   
headchk (hd0) 检查 (hd0) 的活动分区磁头数
headchk (hd0,1) 检查 磁盘0的第二分区磁头数

2011-5-15 更新日志: 代码优化微调,增加手动指定 分区参数功能。 例:  headchk (hd0,2)
不指定分区参数,默认为 自动检查(hd0)然后确定活动分区。


[ 本帖最后由 sgw888 于 2011-5-23 12:33 编辑 ]
无标题.png

HEADCHK.rar

1.71 KB, 下载次数: 122, 下载积分: 无忧币 -2

HEADCHK.rar

1.77 KB, 下载次数: 46, 下载积分: 无忧币 -2

HEADCHK.rar

1.83 KB, 下载次数: 84, 下载积分: 无忧币 -2

20110523 增强版

 楼主| 发表于 2011-5-4 09:24:21 | 显示全部楼层
看来很少有人对这个关心啊。
为了宣传一下,还是说一下这个工具的用途吧。

先讲解一下什么是DBR。
DBR是磁盘文件系统的第一个扇区,也就是分区开始的第一个扇区。DBR中除了引导代码,另一部分就是称为BPB参数块的描述部分。  BPB中描述了分区大小,磁头数,每扇区字节数,每簇扇区数等跟文件系统紧密相关的一些数据。 其中的大部分数值取值在文件系统创建时,也就是格式化时就固定产生了,不可更改。

DBR是一个引导代码跟文件系统描述部分相结合的一个扇区。引导代码的损坏,并不影响磁盘的正常访问,但BPB的错误肯定会影响系统的启动。 大部分情况下,我们关注的是引导代码,而忽略了BPB的正确性。  BPB的某些错误往往是隐性的。 大部分情况下,BPB的错误会直接表现为 磁盘分区无法访问。   但也有例外。 比如 磁头数的描述,实验中发现,并不影响磁盘分区的数据访问,但会影响系统的启动。

在ABR备份还原软件使用中,还原分区时,发现了某些情况下,磁头数取值问题导致的启动问题。

还有就是关于IBM 某些型号笔记本的 克隆分区,出现的 NTLDR IS MISSING 错误。
记得几年之前,在别的论坛,还看见长篇大论的讨论这个事情。一直在心中有个疑团。
事情是这样的,把IBM笔记本的硬盘拆下来,挂到台式机,分区,格式化,克隆系统,装回笔记本的时候,开机会提示NTLDR IS MISSING。。。   曾有个大侠得出结论是因为BPB的描述问题。
并且通过使用DOS引导盘,在IBM本机引导DOS,然后使用SYS C: 的方式,重写DBR,这样,会修正BPB的参数,然后问题就可以解决。

通过对ABR还原不能启动的分析研究,得出是磁头数的问题。继而猜测,IBM 出现的NTLDR 错误,很有可能也是 磁头数的问题。因为在普通的机器上面,磁头数是255。 在IBM的机器上面,磁头数是240的。 我也用WINHEX查看过,现在被联想收购的IBM的THINKPAD的机器,磁头数确实是240

问题渐渐变得清晰。记得在我看过的那篇古老的帖中,曾经就有人回复,就是磁头数的问题,因为当时知识面还达不到,不敢轻易否定或者认同。现在,已经比较确定这种说法是正确的。只是因为磁头数的问题。

对于DBR的认识,来源于数据恢复方面知识的学习。 所以说,知识总是融会贯通的。单学一方面,往往会找不到出路。

有了上面的认识,所以就想写一个基于GRUB4DOS的批处理,来检查与修改磁头数,让磁头数修改变得容易。

在PE下,用WINHEX直接修改磁头数也是相当容易的。但是需要使用者有一定的使用基础。
现在GRUB4DOS这么火,基于它开发是有道理的。GRUB4DOS引导变得相当容易,不用启动PE,在GRUB4DOS下操作磁盘也是相当方便的。从U盘启动GRUB4DOS,只需要做一下磁盘交换,就可以直接对硬盘进行检查与修改了。

本来想在WIN下开发一个,但自己对WIN下编程实在是一窍不通。从头学习,代价太大。GRUB4DOS给喜欢它的人有了一个充分发挥的空间,这一点是很强大的。

GRUB4DOS 可以做到 重写主引导,清除62扇区,重写DBR代码等。这些都是可以实现的。
重写主引导,我已经做到了。 重写DBR,有时间,会写一个批处理,加一些判断。
回复

使用道具 举报

发表于 2011-5-4 09:35:48 | 显示全部楼层
支持啊..
其实我一直很想整一个在GRUB4DOS下使用的类似BOOTSECT的程序,重写主引导,DBR等.

不过精力,能力有限.
回复

使用道具 举报

发表于 2011-5-4 10:26:04 | 显示全部楼层
支持一下

不过目前的的启动硬盘,看了一下是16头的,不过能启动,看看有没有机会16头不能启动再试试看,呵呵~~~
回复

使用道具 举报

发表于 2011-5-4 10:33:24 | 显示全部楼层
批处理可以再优化一下
如:
dd if=(hd0)+1 of=(md)0x200+1
checkrange 0x80 calc *0x401be&0xff &&  goto FQ1OK

另:这里的goto换用call更加好
回复

使用道具 举报

 楼主| 发表于 2011-5-4 11:20:58 | 显示全部楼层
谢谢楼上指教,CALL没用过,不知道咋用。
另外,上面的有些看不懂,帮忙解释一下。

calc *0x401be&0xff 是什么意思啊。
我知道 calc 是用于计算数值的。  *0x401be 应该是内存地址。
&0xff 是什么意思啊。
回复

使用道具 举报

发表于 2011-5-4 11:35:39 | 显示全部楼层
calc *0x401be&0xff 就是取出内存0x401be值的低位1字节
回复

使用道具 举报

 楼主| 发表于 2011-5-4 11:42:00 | 显示全部楼层
哦,受教了。 为了取这个值,我还想了个折中的方法呢。早知道可以直接取这个值了。
那取多位应该也可以吧?? 可否说一下方法啊。
回复

使用道具 举报

发表于 2011-5-4 11:50:24 | 显示全部楼层

回复 #9 sgw888 的帖子

置顶贴 帮助文档  5、命令索引clac命令部分  以及 10.1、内存使用部分有简单的说明  可以看下

call命令也可以看下命令索引
回复

使用道具 举报

发表于 2011-5-4 11:58:40 | 显示全部楼层
呵呵,你看一下置顶贴新版的grub4dos的帮助文档(5、命令索引)calc及set
set /a 就是调用calc
回复

使用道具 举报

 楼主| 发表于 2011-5-4 14:19:19 | 显示全部楼层
call 命令可以使批处理执行时跳转到指定的 LABLE 标签执行, LABLE 标签执行后返回原处继续向下执行,
与call命令的差别是,在批处理中使用 goto 命令直接转换 LABLE 标签处执行不会返回原处。
注意: GRUB4DOS的CALL和GOTO是和批处理一样的机制.
此外 call 支持附加参数, goto不支持。

找到帮助了。 calc 的计算方法有点复杂。相对来说。目前这个批处理不打算去修改了。
如果有人愿意帮我修改,加以改进的话,我会很荣幸。

我下一个目标是写一个简易的BOOTSECT 。 能够重写主引导,清除1-62扇区。重写DBR引导代码。同样,只支持FAT32跟NTFS。
回复

使用道具 举报

发表于 2011-5-4 14:41:50 | 显示全部楼层
支持...
我就等着你的BOOTSECT了,有了框架以后要修改或增加功能就相对比较简单了.
回复

使用道具 举报

发表于 2011-5-4 15:03:53 | 显示全部楼层
等你简易的BOOTSECT做好后,我们帮你完善批处理。目前的代码可以减少50%以上。
回复

使用道具 举报

发表于 2011-5-4 18:21:24 | 显示全部楼层
终于等到grub4dos版的bootsect了!!!
回复

使用道具 举报

发表于 2011-5-14 16:57:14 | 显示全部楼层
感谢楼主~~~~~~好东西啊~~
回复

使用道具 举报

 楼主| 发表于 2011-5-15 15:56:16 | 显示全部楼层
2011-5-15 更新日志: 代码优化微调,增加手动指定 分区参数功能。 例:  headchk (hd0,2)
不指定分区参数,默认为 自动检查(hd0)然后确定活动分区。

[ 本帖最后由 sgw888 于 2011-5-15 15:55 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2011-5-23 12:33:45 | 显示全部楼层
20110523更新: 手动指定参数改进,可以指定磁盘参数或者是分区参数都可以,不指定情况下,只检查 (hd0) 注意GRUB4DOS的磁盘表示法是区分大小写的。 (HD0) 的表示法是错误的!
使用示例:   headchk    检查(hd0) 的活动分区的磁头数   
headchk (hd0) 检查 (hd0) 的活动分区磁头数
headchk (hd0,1) 检查 磁盘0的第二分区磁头数
回复

使用道具 举报

发表于 2011-5-23 20:09:22 | 显示全部楼层

回复 #1 sgw888 的帖子

怎么认定磁头数错误?
你也说了,一个硬盘在A机器上格式化是255个磁头,装到IBM机器上就是要求240才行。

我前几天发了个帖子,不点估计是BPB 的原因,与主板不兼容所致,
http://bbs.wuyou.net/forum.php?m ... p;extra=&page=1
是否也可用你这个来修复启动U盘呢?
如果能做成WIN32程序就好了,可以马上实验不用重启
回复

使用道具 举报

 楼主| 发表于 2011-5-24 10:28:15 | 显示全部楼层
回 快雪时晴: 大部分情况下,你认为磁头数为 255 就对了。我这几天又看了几台THINKPAD的机子,磁头数全部描述为255。
我这个程序只能检查与修改 FAT32 NTFS 分区的磁头数,其它的分区格式不支持修改。因为程序在修改之前就加了判断,只要不是标准的FAT32或者是NTFS分区,就不会进行任何操作。

如果你的U盘分区格式是FAT32或者NTFS就可以修复。但是你的分区表要正确。
就算做成WIN32程序,你也得重启才可以试验能不能启动啊????
回复

使用道具 举报

发表于 2011-5-24 18:07:58 | 显示全部楼层

回复 #20 sgw888 的帖子

你看看我这启动U盘BPB参数正常吗,该U盘在大多数电脑上都可以启动,就是在一台神舟笔记本F206S上好像有问题
该机似乎跳过了MBR直接引导分区引导块DBR

Snap7.png
我把分区用BOOTICE改引导为DOS,复制DOS文件到根目录下,会提示未插入启动盘;
如果改成WIN95/98的DOS,复制相应DOS,,,会没有任何提示,黑屏死机;
改引导为G4D,会提示NO GRLDR,然后死机
回复

使用道具 举报

 楼主| 发表于 2011-5-25 08:41:01 | 显示全部楼层
我觉得你的问题不是DBR的问题。
也不是磁头数的问题。
应该是BIOS对U启兼容性的问题。
你应该用FBINST来测试U启是否成功。从你的描述看,应该是BIOS试图访问U盘上面的GRLDR文件时,因为找不到它所以出错。为什么找不到它呢?可能的原因是BIOS探测U盘的CHS参数时,U盘主控反馈了不正确的CHS数值,导致BIOS无法找到正确的扇区。最后就是无法找到文件,或者直接就是死机。
回复

使用道具 举报

发表于 2011-5-25 09:59:12 | 显示全部楼层

回复 #22 sgw888 的帖子

问题:U盘主控反馈的CHS参数不是来自DBR中的BPB?


FBINST也试过了,结果一样,用的是4G的朗科U208,
似乎只有早期的那个已经磨得看不出牌子的128M的U盘,HP工具制作,可以启动,但同样方法不适合前面2个U盘
回复

使用道具 举报

 楼主| 发表于 2011-5-25 11:15:44 | 显示全部楼层
很显然,U盘主控反馈的CHS参数自然不是来自DBR的。
你可以想像一下。在主板BIOS读取U盘的扇区时,都是跟U盘的主控先要打招呼的,对不对,无论读哪个扇区,或者无论进行什么样的操作,都是由主控完成的,U盘根本就没有所谓的CHS,因为它根本没有什么磁头,柱面之类的,全是U盘主控虚拟的,这样就牵涉到一个问题,CHS的虚拟算法问题,如果这个算法有漏洞,那么BIOS在访问U盘的扇区时就会出错,或者BIOS试图跟 主控交换信息时,因为主控反馈的信息不正确,那么BIOS可能就傻掉了,高级一点的主板BIOS可能会试图自己去修正这些问题。

建议你去USB区看看,有一个帖子就是提到BIOS跟U盘主控的问题。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2020-10-27 13:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表