无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 34672|回复: 99

[发布] 基于GRUB4DOS的BOOTSECT

[复制链接]
发表于 2011-5-7 16:41:45 | 显示全部楼层 |阅读模式
Bootsect for grub4dos v1.0 by sgw888 20110507
首先感谢chenall sratlf zhaohj 的帮助

BOOTSECT 初步设计测试完成.
请chenall sratlf zhaohj 帮忙检查测试BUG以及修正存在的语法错误。
我已初步测试,未发现问题。但一个人力量毕竟有限。

2011-6-14 更新日志: 菜单版BUG修正. 上一版本中在选择硬盘界面,如果取消当前的选择,会直接返回主菜单,而不是返回硬盘选择界面,现已修正,在核心执行部分,提示是否继续执行操作时,选择否仍会继续执行,现已修正。 上传两个附件。 附件一为 菜单版修正。 附件二为演示ISO。方便菜鸟测试。其中有UNIFONT 跟中文字库,分别有中英文显示的BOOTSECT,另外还有磁头数检查与修正程序。对于喜欢中文显示的可以选择切换到中文菜单,提示为中文显示。

2011-6-3 更新日志: 在zhaohj的帮助下,BOOTSECT 菜单版已完工,请大家帮忙测试反馈。菜单版如果没有BUG,那对于菜鸟来说应该有帮助,可以不用进入PE而进行引导代码的刷新操作了。

2011-5-26 更新日志:  在CHENALL 上次的优化之后,根据C大的建议,增加了清除1-62扇区的判断代码,防止破坏用户数据.增加安全性.如果此版没有BUG,会停止命令行版的更新. 包括代码优化.
如果不出意外,此次更新为 命令行版的终结版了.   此次上传两个附件.  一个附件是 BOOTSECT 单文件封装版.  另一个附件是ISO映像,其中包含了 BOOTSECT 单文件版,另外,其中还有一个 HEADCHK 活动分区磁头数检查与修正的程序.


2011-5-22 更新使用帮助:

bootsect 因为是基于GRUB4DOS的,所以必须在GRUB4DOS的环境下才可以使用。它就是一个批处理,跟DOS下的批处理类似。因为GRUB4DOS 本身的内部命令就很强大,所以可以直接利用GRUB4DOS的内部命令来进行扇区读写的操作,更新引导代码无非就是写扇区的操作。有人提到写DOS下的,以我的水平显然做不到,我个人认为根本没有必要。启动GRUB4DOS容易,还是启动DOS更容易??首先GRUB4DOS它是一个引导器 menu.lst 是它的菜单,在普通的情形下,按 c 键可以进入GRUB4DOS的控制台。 bootsect 就是在它的控制台模式下运行的一个批处理。你可以理解为XP的CMD。 bootsect 是命令行模式的。它不是菜单模式的。所以,一定要进入GRUB4DOS的命令行才可以运行。

如果BOOTSECT 存放于当前根目录,运行方法是:    /bootsect 如果是光盘启动  运行方法是  /BOOTSECT
默认的GRUB4DOS运行外部命令的存放位置是 (bd)/boot/grub/   如果你把BOOTSECT 存放于该目录,那么无需指定路径,可以直接 bootsect

更新主引导示例:
bootsect /nt52 /mbr
bootsect /nt60 /mbr
bootsect /nt52 /mbr (hd0)
bootsect /nt52 /mbr (hd1)
bootsect /nt52 /mbr (hd2)
更新DBR示例:
bootsect /nt52 sys           sys 指的是活动分区
bootsect /nt60 sys
bootsect /nt52 sys /mbr    同时更新MBR
bootsect /nt52 (hd0,0)    更新 (hd0,0) 的DBR为 NT52
清除扇区示例:
bootsect clear            清除 (hd0)  1-62
bootsect clear (hd1)    清除 (hd1) 1-62

注意: 如果是从U盘引导的GRUB4DOS , U盘可能被认为是 (hd0)  ,如果想对硬盘进行操作,一种方法是 手动指定 分区或者磁盘,比如
bootsect /nt52 (hd1,0)
bootsect /nt60 (hd2,0)
bootsect clear (hd1)
bootsect /nt52 /mbr (hd1)  不能省略参数,并且不能使用 sys 参数
另一种方法是 先进行磁盘交换。
map (hd1) (hd0)
map (hd0) (hd1)
map --hook
然后再进行操作。



2011-5-14 更新日志: 几处BUG修正。 代码优化微调。如果测试没有问题,不再更新。不打算做成菜单版的了。会用GRUB4DOS 就会用这个程序。 毕竟这个是救急用的,也是为了方便一部分人。菜鸟完全可以在PE下用BOOTICE。 或者用微软的BOOTSECT。如果对GRUB4DOS都不熟悉,还是不建议用了,怕出问题。
上传一个ISO映像。ISO映像中BOOT/GRUB中的BOOTSECT 就是封装过的了。可以直接提取。

2011-5-9 更新日志:  增加刷新FAT32 分区 MSDOS引导代码的功能,可以启动IO.SYS 。主要是为了自己方便。
修正: 当活动分区为扩展分区或者是其它未知分区时出现的GRUB4DOS 命令出错提示。
上传 封装版。  使用 jianliulin 大侠的FB工具制作。


2011-05-08 严重BUG修正!
发现NTFS刷新代码部分 有BUG,DD命令使用有误!!! 另外,更新成NT52代码时,如果原来是NT60代码,没有将原来的清除掉。已修正。
FAT32 刷新代码部分问题更大!! 原来以为只是更新DBR扇区就完事了,结果发现,DBR开始的12扇区还有代码。不懂程序代码的悲哀啊,只能是一个扇区一个扇区的去比较。

对于程序出现的BUG,非常报歉。没有认真测试就发布了。还好,我估计大部分人都没有真正去使用跟测试。

请下载的朋友,立刻删除原来的,重新下载新上传的!!!!



程序使用帮助:
以实例说明:
bootsect clear
bootsect clear (hd0)
bootsect clear (hd1)
以上清除指定磁盘 1-62扇区。功能很简单 echo -n > (hd0)1+62
bootsect /nt52 sys /mbr 刷新活动分区的DBR以及磁盘的MBR 引导代码为NT52
bootsect /nt60 sys /mbr 同上,引导代码为 NT60
/mbr 参数为可选
bootsect /nt52 (hd0,0) 更新 (hd0,0) 的DBR代码 NT52
bootsect /nt60 (hd0,0) /mbr 更新 (hd0,0)的DBR代码为NT60 同时更新MBR
bootsect /nt52 /mbr 仅执行MBR更新操作
bootsect /nt52 /mbr (hd1)

以下是牵涉到程序执行的内容:

更新MBR很简单 只要把相应的代码直接写到 硬盘开始的扇区0 只改写从0开始的440个字节就可以了。
更新DBR 需要先判断出是NTFS格式还是FAT32格式。

NTFS分区的标志是DBR扇区 从第四个字节有一个明文的NTFS的标志,如果NTFS被修改,磁盘会无法访问.
FAT32没有跟NTFS一样的标志。但第一个字节必须是0XEB 如果改写,磁盘也无法访问。
从0X52 有一个FAT32 的标志,但改成其它的,并不影响系统(xp) 的正常访问 ,用DISKGEN发现如果该标志被修改,会认为磁盘没有格式化。 这儿采取跟DISKGEN一样的判断标准,如果该处不是FAT32则认为是无法识别的分区格式,程序不执行更新引导代码的操作。

更新FAT32的引导代码,程序改写开始的三个字节 这三个字节为跳转代码 0XEB 0x58 0x90
然后从0x5A 到 0x1FF 全部为程序代码,其实最后两个字节为55AA,一块刷新也不会有问题
NT52 跟NT60的代码占用两个扇区,占用DBR第一个扇区0X5A 至结尾的部分。 还有一部分代码在DBR开始的12扇区。

MSDOS 的FAT32 代码存放于DBR开始的第一个扇区以及DBR 开始的第3个扇区。

FAT32 代码位置是固定的,只是代码的不同。

NTFS 代码除了代码本身的不同,占用的空间也不相同。跟FAT32 一样,开始三个字节为跳转代码。
从0x54 开始为代码部分。  NT52 的NTFS代码占用了3362字节 (0xD22)  也就是从 0x54 一直到代码结束
NT60 也是从 0x54 开始,但代码长度占用 4052 字节.

NTFS跟FAT32的区别是FAT32由于文件系统布局问题,程序代码是不连续的。 而NTFS分区DBR程序代码是连续的。


附件说明: 附件1为 bootsect 跟 bootldr.img 的压缩包.
          附件2为 bootsect 的 启动光盘 .

[ 本帖最后由 sgw888 于 2011-6-14 16:35 编辑 ]

bootsect.rar

18.4 KB, 下载次数: 250, 下载积分: 无忧币 -2

0508 修正BUG

bootsect.iso.rar

147.77 KB, 下载次数: 196, 下载积分: 无忧币 -2

0508 修正BUG

BOOTSECT.rar

18.73 KB, 下载次数: 215, 下载积分: 无忧币 -2

2011-05-09 更新单文件封装版

bootsect.rar

148.44 KB, 下载次数: 146, 下载积分: 无忧币 -2

2011-5-14 更新

bootsect.rar

148.4 KB, 下载次数: 206, 下载积分: 无忧币 -2

修正显示BUG

BOOTSECT单文件封装.rar

19.3 KB, 下载次数: 216, 下载积分: 无忧币 -2

单文件封装版2011-5-26命令行终结

bootsect.rar

156.7 KB, 下载次数: 192, 下载积分: 无忧币 -2

ISO 启动映像,包含了BOOTSECT 命令行终结

BOOTSECT.rar

14.91 KB, 下载次数: 134, 下载积分: 无忧币 -2

菜单版初步测试

BOOTSECT.rar

14.77 KB, 下载次数: 284, 下载积分: 无忧币 -2

菜单版BUG修正

bootsect.part1.rar

400 KB, 下载次数: 358, 下载积分: 无忧币 -2

ISO演示 附带UTF-8中文显示

bootsect.part2.rar

94.7 KB, 下载次数: 306, 下载积分: 无忧币 -2

ISO演示,附带磁头数检查与修正程序

 楼主| 发表于 2011-5-7 16:51:01 | 显示全部楼层
#2 提个问题,有没有方法确定是从U盘启动的? 就是USB-HDD 被认为是HD0 有没有方法可以检测出来呢??? 如果有方法可以判定USB-HDD 被识别为HD0,或许我们可以用批处理自动执行交换磁盘的操作。

如果上面问题无解,只能是让用户自己去交换磁盘了。
回复

使用道具 举报

发表于 2011-5-7 17:32:40 | 显示全部楼层
目前无解,没发区分是硬盘启动还是usb-hdd启动,(bd)都一样是0x80
回复

使用道具 举报

发表于 2011-5-7 17:38:10 | 显示全部楼层
如果是ud启动可以判断  (fd0,0)/fb.cfg 是否存在
回复

使用道具 举报

发表于 2011-5-7 19:53:17 | 显示全部楼层
先支持一下,要改天才能测试了。
回复

使用道具 举报

发表于 2011-5-7 20:31:00 | 显示全部楼层
为什么搞一个BOOTLDR.IMG?,体积变大了,能否直接把里面的mbr文件放到外面来?
bootsect /nt52 /mbr (hd1)
就是把nt52文件直接放到根目录,然后这样就刷进去了
回复

使用道具 举报

 楼主| 发表于 2011-5-7 20:53:56 | 显示全部楼层
回楼上, bootldr.img 是可以压缩成 GZ格式的。压缩后,并不大。 就算是把 mbr文件放到外面也不会减少它的大小。 另外 bootldr.img 中有多个引导代码文件。放到外面就更乱了。 如果你觉得很有必要全部放到外面,也不是不可以。 你可以自己调整 批处理。 把IMG包中的所有文件放到一个固定的目录。 然后用记事本打开批处理。 替换所有的 (fd0) 为你存放引导代码的位置,并且把刚开始的加载映像到内存的语句删除就行了。
回复

使用道具 举报

发表于 2011-5-7 21:47:05 | 显示全部楼层
很好 啊  dos下  mbr引导 修复工具 又来了个 支持!!!!!!!
回复

使用道具 举报

发表于 2011-5-7 21:57:05 | 显示全部楼层
如果没问题了,就不要扩展其它功能了,稳定第一

希望正式版就是终结版
回复

使用道具 举报

 楼主| 发表于 2011-5-8 09:02:00 | 显示全部楼层
目前主要是测试BUG。功能不会再增加了。因为微软的BOOTSECT也就是上面那些功能。我个人觉得,功能已经够用了。 会用微软的BOOTSECT,这个应该也不成问题。只要懂得GRUB4DOS的磁盘跟分区表示法就行了。
另外需要注意,如果是从U盘启动,被识别为HD0的情况,需要用户自己去确定硬盘的磁盘号是HD0还是HD1。#2已经说过了,目前这个问题无解。

另外,有帮忙测试的,请使用虚拟机测试。万一使用真实机导致启动不了机器,那我可成罪人了。

下面是一些使用常识: 如果你的主引导使用了 1JF9 GRLDR.MBR 阿文的F10等第三方主引导,请不要随意使用 清除1-62扇区的功能,建议在使用清除1-62 扇区之前先执行重写主引导的操作。因为上述第三方主引导管理软件占用了1扇区跟后面的扇区,只清除1-62,不重写主引导可能会造成一些预料不到的错误。
另外,WIN7使用软激活的,如果你的软激活代码存放于主引导或者是DBR,请不要执行代码更新操作,那样,你的软激活会失效。。。。。
回复

使用道具 举报

发表于 2011-5-8 09:47:23 | 显示全部楼层
附件用批处理尾续方式把bootsect封装为单文件 ,下载改为14楼

[ 本帖最后由 jianliulin 于 2011-5-8 18:15 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2011-5-8 17:26:04 | 显示全部楼层
原帖由 jianliulin 于 2011-5-8 09:47 发表
附件用批处理尾续方式把bootsect封装为单文件

封装版不能用!! 执行刷新引导操作时,发现不能刷新!!退到控制台发现,没有将文件成功加载到软驱。
回复

使用道具 举报

 楼主| 发表于 2011-5-8 17:37:04 | 显示全部楼层
有点失望,只有人去下载,没有人去测试。 这真是一个悲哀啊。

还好我自己发现了BUG。要不然,可要真的害人了。 会造致系统无法启动
NTLDR IS MISSING。。。。
有一处跳转跳错了。真晕。。。
另外,代码微调。
回复

使用道具 举报

 楼主| 发表于 2011-5-8 18:17:03 | 显示全部楼层
回复#14 。刷新步骤:  MBR 部分,利用DD命令 把FD0 的 MBR52 或者MBR60 刷到HD0 或者HD1 。。。
DBR 部分,先判断出 格式来 然后也是用DD 命令 把FD0 的NT52 NT60 FAT52 FAT60 刷到(HD0,0)+1 打个比方。
但我发现程序部分有BUG了。我要进行修正,你先不要做封装版了。 免得浪费时间啊。你等我修正BUG再做封装版吧。 真是抱歉了。
CHENALL 可能比较忙,还有版主跟ZHAOHJ 都没时间帮我看批处理,结果,最重要的 核心程序执行部分出了大BUG。。。
回复

使用道具 举报

发表于 2011-5-8 18:20:39 | 显示全部楼层
原帖由 sgw888 于 2011-5-8 18:17 发表
回复#14 。刷新步骤:  MBR 部分,利用DD命令 把FD0 的 MBR52 或者MBR60 刷到HD0 或者HD1 。。。
DBR 部分,先判断出 格式来 然后也是用DD 命令 把FD0 的NT52 NT60 FAT52 FAT60 刷到(HD0,0)+1 打个比方。
但我 ...


没关系,未发布的fbinstTool添加了封装功能,我封装很简单的,动两下鼠标就封装完成了,你才是最辛苦的
回复

使用道具 举报

 楼主| 发表于 2011-5-8 21:12:27 | 显示全部楼层
回楼上,有条件给测试下啊。 我已重新上传了批处理。另外,把你的封装程序传上来共享下吧。

我试着自己手动封装,但一直不成功。 另外,把你上面的封装版删了吧。原来的批处理,BUG太多了。居然没人来报告。
回复

使用道具 举报

发表于 2011-5-8 21:41:16 | 显示全部楼层
1.约定以!BATEX 开头的文件为尾续批处理(不违法grub4dos 以!BAT开头),此功能还在测试阶段

用fbinstTool 右键“新建文件”创建尾续批处理文件
1.png



右键此文件点击“管理尾续文件”,
2.png


4.png







双击可打开批处理,编辑后可直接保存,黑框内是我添加的,目的是把尾续的BOOTLDR.IMG 映射为软盘,其他没有改动

map --mem (rd)15+35,17845 (fd0)

15: 是BOOTLDR.IMG 的开始扇区
35: 是BOOTLDR.IMG的占用山区数
17845 :是BOOTLDR.IMG的实际大小,以字节为单位

这些可以从上面图查看到。

3.png

[ 本帖最后由 jianliulin 于 2011-5-8 21:52 编辑 ]

FbinstTool.part1.rar

400 KB, 下载次数: 135, 下载积分: 无忧币 -2

FbinstTool.part2.rar

400 KB, 下载次数: 141, 下载积分: 无忧币 -2

FbinstTool.part3.rar

284.56 KB, 下载次数: 132, 下载积分: 无忧币 -2

回复

使用道具 举报

 楼主| 发表于 2011-5-8 22:29:15 | 显示全部楼层
新建一个FBA文件,才能创建尾续文件。 因为我的U盘没有UD区。
创建尾续文件之后,通过管理,可以导入IMG。 然后,要关闭当前的框,才能双击那个文件进行编辑、
可是编辑之后,没有找到保存的按钮,退出之后,没有保存。
回复

使用道具 举报

发表于 2011-5-8 23:15:37 | 显示全部楼层
原帖由 sgw888 于 2011-5-8 22:29 发表
新建一个FBA文件,才能创建尾续文件。 因为我的U盘没有UD区。
创建尾续文件之后,通过管理,可以导入IMG。 然后,要关闭当前的框,才能双击那个文件进行编辑、
可是编辑之后,没有找到保存的按钮,退出之后, ...


不好意思,我没有说清楚,另外尾续的文件不需要gz压缩,因为导入的时候fbinstTool 会自动压缩。


5.png

[ 本帖最后由 jianliulin 于 2011-5-8 23:36 编辑 ]
回复

使用道具 举报

发表于 2011-5-9 08:11:35 | 显示全部楼层
fbinstTool 什么时候正式发布?
回复

使用道具 举报

 楼主| 发表于 2011-5-9 09:10:00 | 显示全部楼层
把程序加载到 0X10000 这个好像不太妥当吧??? 看GRUB4DOS的置顶帮助。
在grub4dos环境中,以下两块内存可以放心使用:

1、0x60000开始处1KB(即内存384KB开始的长度为1KB的区域),经常用于菜单或批处理临时使用。

2、0x40000-0x44FFF(即内存256KB至275KB之间,长度为20KB)也是可以使用的(这一段是最常使用的,且空间较大)。

其它16MB以内的内存最好不要随意使用,很多有特殊的用途。
保守一些的话,尽量使用32M以上的内存空间做临时文件用。

32M绝对地址:0x2000000 ;
回复

使用道具 举报

发表于 2011-5-9 09:26:28 | 显示全部楼层
在命令行环境下对硬盘进行读写操作,具有很大的风险。
既然有风险,我们就要做到把风险降到最低。所以,我建议:
1:对操作对象,先进行分区信息显示,活动分区文件及目录显示,确认后再操作
2:现在的操作命令,虽然按照ms的风格,但GRUB4DOS下可以进行适当的改良,如:
   bootsect (hd0) clear
    bootsect (hd0,0) /nt52
    第一参数总是对象
3:强制第一参数是(hd开头,因为这个参数太关键,没有或默认风险太大
4:sys参数我认为可以省略
================
     
我认为,bootsect的主要功能是重新注入mb及dbr,我们能否更加简单呢?
如bootsect (hd0) /nt52,就重新注入了mbr (440字节),相应的清除1-62扇区的,并自动注入活动分区的DBR,除非没有活动分区。

另外bootsect是否可以加入新功能,如分区表检查?
回复

使用道具 举报

发表于 2011-5-9 09:36:41 | 显示全部楼层
map --mem=0x10000 %run% (rd)

这句话的就是把%run%加载到基地址0x10000扇区开始的内存中,即内存地址=0x10000*0x200字节=0x2000000字节=0x20 *0x100000(32M)
回复

使用道具 举报

发表于 2011-5-9 09:45:46 | 显示全部楼层
@ sgw888

同意zhaohj的意见  多硬盘情况下并不确定磁盘编号是否正确  可以默认先输出所有磁盘对应的分区信息  供用户参考

或者在帮助下输出  不过这样子可能就需要加个手动输入命令的功能了

最近生活比较乱  批处理也还没完全看懂  就一直没回复
回复

使用道具 举报

 楼主| 发表于 2011-5-9 11:02:43 | 显示全部楼层
操作硬盘虽然存在风险,但是我已经加入了很多的判断,防止出错。
既使用户发现操作失误,仍旧会有挽回的机会。只要能保证重新可以运行本批处理,可以重新执行刷新操作。

至于参数调整,这将会重写所有相关代码。
参数的运用,实际上只是一个习惯问题。 我个人觉得,跟微软保持一致没什么不好。
另外,刷新主引导不一定非要清除1-62扇区。
回复

使用道具 举报

发表于 2011-5-9 11:03:09 | 显示全部楼层
命令行的东西,需要花时间学习其用法。
如果事先学,怕浪费时间,等遇到问题时可能忘了。
如果不事先学,到时当场学,手头没这个帖子,也不好掌握,毕竟这是危险操作。

建议楼主把主要功能部分做成菜单项。类似ntboot。
回复

使用道具 举报

 楼主| 发表于 2011-5-9 11:12:18 | 显示全部楼层
提个问题,通过什么命令可以列出当前所有的硬盘分区情况?

另外,看了一下,上面 ZHAOHJ 提到的问题。 因为程序加了很多的判断,所以,错误应该是降到最低了。关键的地方是执行刷新代码的操作。

默认情况下的处理都是以HD0为准的。应该问题不大。针对列分区文件,这个可以做到。
回复

使用道具 举报

 楼主| 发表于 2011-5-9 11:16:51 | 显示全部楼层
原帖由 pseudo 于 2011-5-9 11:03 发表
命令行的东西,需要花时间学习其用法。
如果事先学,怕浪费时间,等遇到问题时可能忘了。
如果不事先学,到时当场学,手头没这个帖子,也不好掌握,毕竟这是危险操作。

建议楼主把主要功能部分做成菜单项。 ...


建议可以接受。不过,我临时没有打算做成菜单的打算。

第一步,是要排除BUG。这是目前的主要工作!!!先把BUG排除掉,然后,再完善菜单部分。

先把基本功能做好,别的再扩展就容易了。

请教个问题,通过什么方法,可以列出当前的所有分区? 最好是通过内置的命令,不要再写批处理的。。。。
如果不能,我就自己写批处理了。这样又麻烦了。

目前,仍在代码微调,修复BUG中。。。
回复

使用道具 举报

发表于 2011-5-9 11:28:58 | 显示全部楼层
我也同意P大的意见。
回复#27:
首先通过0x475判断有几个硬盘(包括USB-HDD):
set /a hdn=*0x475&0xff  (等于1表示存在hd0,等于2表示存在hd0、hd1...)
我们可以给个菜单:title select hdddisk
这样我们可以动态获得硬盘号

geometry (hd?)可以列出当前硬盘分区情况
回复

使用道具 举报

 楼主| 发表于 2011-5-9 11:46:28 | 显示全部楼层
感谢楼上回复。我先把基本功能做好,没有BUG。就着手做菜单的代码,这几天可能有些忙,大家稍等等了。 我会先把基本功能做好。传上来。 自动化菜单要等一段时间了。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 13:29

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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