无忧启动论坛

 找回密码
 注册
搜索
WEPE笔记本电脑手机维修小包 IT发烧友的必备工具最纯净的「微PE装机优盘」UEPON大师作品系统gho:最纯净好用系统下载站
查看: 5029|回复: 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, 下载次数: 120, 下载积分: 无忧币 -2

HEADCHK.rar

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

HEADCHK.rar

1.83 KB, 下载次数: 81, 下载积分: 无忧币 -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
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2019-12-12 17:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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