无忧启动论坛

标题: 基于GRUB4DOS的BOOTSECT [打印本页]

作者: sgw888    时间: 2011-5-7 16:41
标题: 基于GRUB4DOS的BOOTSECT
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演示,附带磁头数检查与修正程序


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

如果上面问题无解,只能是让用户自己去交换磁盘了。
作者: zhaohj    时间: 2011-5-7 17:32
目前无解,没发区分是硬盘启动还是usb-hdd启动,(bd)都一样是0x80
作者: jianliulin    时间: 2011-5-7 17:38
如果是ud启动可以判断  (fd0,0)/fb.cfg 是否存在
作者: chenall    时间: 2011-5-7 19:53
先支持一下,要改天才能测试了。
作者: ones    时间: 2011-5-7 20:31
为什么搞一个BOOTLDR.IMG?,体积变大了,能否直接把里面的mbr文件放到外面来?
bootsect /nt52 /mbr (hd1)
就是把nt52文件直接放到根目录,然后这样就刷进去了
作者: sgw888    时间: 2011-5-7 20:53
回楼上, bootldr.img 是可以压缩成 GZ格式的。压缩后,并不大。 就算是把 mbr文件放到外面也不会减少它的大小。 另外 bootldr.img 中有多个引导代码文件。放到外面就更乱了。 如果你觉得很有必要全部放到外面,也不是不可以。 你可以自己调整 批处理。 把IMG包中的所有文件放到一个固定的目录。 然后用记事本打开批处理。 替换所有的 (fd0) 为你存放引导代码的位置,并且把刚开始的加载映像到内存的语句删除就行了。
作者: yanglin    时间: 2011-5-7 21:47
很好 啊  dos下  mbr引导 修复工具 又来了个 支持!!!!!!!
作者: dvd008    时间: 2011-5-7 21:57
如果没问题了,就不要扩展其它功能了,稳定第一

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

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

下面是一些使用常识: 如果你的主引导使用了 1JF9 GRLDR.MBR 阿文的F10等第三方主引导,请不要随意使用 清除1-62扇区的功能,建议在使用清除1-62 扇区之前先执行重写主引导的操作。因为上述第三方主引导管理软件占用了1扇区跟后面的扇区,只清除1-62,不重写主引导可能会造成一些预料不到的错误。
另外,WIN7使用软激活的,如果你的软激活代码存放于主引导或者是DBR,请不要执行代码更新操作,那样,你的软激活会失效。。。。。
作者: jianliulin    时间: 2011-5-8 09:47
附件用批处理尾续方式把bootsect封装为单文件 ,下载改为14楼

[ 本帖最后由 jianliulin 于 2011-5-8 18:15 编辑 ]
作者: sgw888    时间: 2011-5-8 17:26
原帖由 jianliulin 于 2011-5-8 09:47 发表
附件用批处理尾续方式把bootsect封装为单文件

封装版不能用!! 执行刷新引导操作时,发现不能刷新!!退到控制台发现,没有将文件成功加载到软驱。
作者: sgw888    时间: 2011-5-8 17:37
有点失望,只有人去下载,没有人去测试。 这真是一个悲哀啊。

还好我自己发现了BUG。要不然,可要真的害人了。 会造致系统无法启动
NTLDR IS MISSING。。。。
有一处跳转跳错了。真晕。。。
另外,代码微调。
作者: sgw888    时间: 2011-5-8 18:17
回复#14 。刷新步骤:  MBR 部分,利用DD命令 把FD0 的 MBR52 或者MBR60 刷到HD0 或者HD1 。。。
DBR 部分,先判断出 格式来 然后也是用DD 命令 把FD0 的NT52 NT60 FAT52 FAT60 刷到(HD0,0)+1 打个比方。
但我发现程序部分有BUG了。我要进行修正,你先不要做封装版了。 免得浪费时间啊。你等我修正BUG再做封装版吧。 真是抱歉了。
CHENALL 可能比较忙,还有版主跟ZHAOHJ 都没时间帮我看批处理,结果,最重要的 核心程序执行部分出了大BUG。。。
作者: jianliulin    时间: 2011-5-8 18:20
原帖由 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添加了封装功能,我封装很简单的,动两下鼠标就封装完成了,你才是最辛苦的
作者: sgw888    时间: 2011-5-8 21:12
回楼上,有条件给测试下啊。 我已重新上传了批处理。另外,把你的封装程序传上来共享下吧。

我试着自己手动封装,但一直不成功。 另外,把你上面的封装版删了吧。原来的批处理,BUG太多了。居然没人来报告。
作者: jianliulin    时间: 2011-5-8 21:41
1.约定以!BATEX 开头的文件为尾续批处理(不违法grub4dos 以!BAT开头),此功能还在测试阶段

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




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











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

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

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

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



[ 本帖最后由 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


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


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




[ 本帖最后由 jianliulin 于 2011-5-8 23:36 编辑 ]
作者: 135956    时间: 2011-5-9 08:11
fbinstTool 什么时候正式发布?
作者: sgw888    时间: 2011-5-9 09:10
把程序加载到 0X10000 这个好像不太妥当吧??? 看GRUB4DOS的置顶帮助。
在grub4dos环境中,以下两块内存可以放心使用:

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

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

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

32M绝对地址:0x2000000 ;
作者: zhaohj    时间: 2011-5-9 09:26
在命令行环境下对硬盘进行读写操作,具有很大的风险。
既然有风险,我们就要做到把风险降到最低。所以,我建议:
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是否可以加入新功能,如分区表检查?
作者: zhaohj    时间: 2011-5-9 09:36
map --mem=0x10000 %run% (rd)

这句话的就是把%run%加载到基地址0x10000扇区开始的内存中,即内存地址=0x10000*0x200字节=0x2000000字节=0x20 *0x100000(32M)
作者: sratlf    时间: 2011-5-9 09:45
@ sgw888

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

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

最近生活比较乱  批处理也还没完全看懂  就一直没回复
作者: sgw888    时间: 2011-5-9 11:02
操作硬盘虽然存在风险,但是我已经加入了很多的判断,防止出错。
既使用户发现操作失误,仍旧会有挽回的机会。只要能保证重新可以运行本批处理,可以重新执行刷新操作。

至于参数调整,这将会重写所有相关代码。
参数的运用,实际上只是一个习惯问题。 我个人觉得,跟微软保持一致没什么不好。
另外,刷新主引导不一定非要清除1-62扇区。
作者: pseudo    时间: 2011-5-9 11:03
命令行的东西,需要花时间学习其用法。
如果事先学,怕浪费时间,等遇到问题时可能忘了。
如果不事先学,到时当场学,手头没这个帖子,也不好掌握,毕竟这是危险操作。

建议楼主把主要功能部分做成菜单项。类似ntboot。
作者: sgw888    时间: 2011-5-9 11:12
提个问题,通过什么命令可以列出当前所有的硬盘分区情况?

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

默认情况下的处理都是以HD0为准的。应该问题不大。针对列分区文件,这个可以做到。
作者: sgw888    时间: 2011-5-9 11:16
原帖由 pseudo 于 2011-5-9 11:03 发表
命令行的东西,需要花时间学习其用法。
如果事先学,怕浪费时间,等遇到问题时可能忘了。
如果不事先学,到时当场学,手头没这个帖子,也不好掌握,毕竟这是危险操作。

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


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

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

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

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

目前,仍在代码微调,修复BUG中。。。
作者: zhaohj    时间: 2011-5-9 11:28
我也同意P大的意见。
回复#27:
首先通过0x475判断有几个硬盘(包括USB-HDD):
set /a hdn=*0x475&0xff  (等于1表示存在hd0,等于2表示存在hd0、hd1...)
我们可以给个菜单:title select hdddisk
这样我们可以动态获得硬盘号

geometry (hd?)可以列出当前硬盘分区情况
作者: sgw888    时间: 2011-5-9 11:46
感谢楼上回复。我先把基本功能做好,没有BUG。就着手做菜单的代码,这几天可能有些忙,大家稍等等了。 我会先把基本功能做好。传上来。 自动化菜单要等一段时间了。
作者: sgw888    时间: 2011-5-9 17:13
命令行版,今天又更新了。单文件封装版。封装采用的 FBINSTTOOL。
增加了更新FAT32 分区DOS代码的功能,主要是为了引导IO。SYS,这在某些情况下会用到。
一个小BUG修正。
作者: zhaohj    时间: 2011-5-9 17:34
是否有问题,无参数时,变成这样了。
(pxe启动,bootsect放在/boot/grub下)

Snap1.jpg (31.48 KB, 下载次数: 97)

Snap1.jpg

作者: sgw888    时间: 2011-5-9 17:40
没试过PXE ,另我,我是加/ 的,难道是因为  /  的问题???
作者: jianliulin    时间: 2011-5-9 17:42
原帖由 sgw888 于 2011-5-9 17:40 发表
没试过PXE ,另我,我是加/ 的,难道是因为  /  的问题???


是的,如果不加/ 就出现那样,

这句能存在问题:
if /i "%~0"=="%nx0" set run=%@path%%%~0 || set run=%~0
作者: zhaohj    时间: 2011-5-9 17:46
因为批处理直接放在/boot/grub/下,pxe启动可以直接运行批处理的。
经测试
/boot/grub/bootsect 运行正常

难道批处理改变(bd)了?

/bootsect肯定不行。

[ 本帖最后由 zhaohj 于 2011-5-9 17:48 编辑 ]
作者: chenall    时间: 2011-5-9 20:53
可以debug一下,看看就知道了,出现这个提示是因为文件路径错误。
作者: sgw888    时间: 2011-5-9 22:10
if /i "%~0"=="%nx0" set run=%@path%%%~0 || set run=%~0
map --mem=0x10000 %run% (rd)
map --mem (rd)17+35,17780 (fd0)
map --hook

用了这个语句,把文件加载到内存。第一个,我看不太懂。我是照抄的 jianliulin 的,可能问题在这。
作者: sgw888    时间: 2011-5-9 22:12
(bd) 应该没有改变。 但是为了封装单文件。用了以上几句:


我是照抄的 jianliulin 大侠的。
我不是完全明白那个意思。
作者: zxw    时间: 2011-5-9 22:25
if /i "%~0"=="%nx0" set run=%@path%%%~0 || set run=%~0
改为:
if /i "%~0"=="%~nx0" set run=%@path%%%~0 || set run=%~0

if /i "%~0"=="%~nx0" 是判断有无路径,如无,则加上%@path%即command指定的路径。

============================================

想了一下,无路径还有insmod加载进内存时的情形,改为如下应该比较完善了:
set run=%~0 && if /i "%~0"=="%~nx0" && delmod -l %~0 || set run=%@path%%%~0

[ 本帖最后由 zxw 于 2011-5-9 22:34 编辑 ]
作者: sgw888    时间: 2011-5-9 22:26
修改了下。
我光盘虚拟机测试 没问题,不知道 PXE行不行。

BOOTSECT.rar

18.74 KB, 下载次数: 34, 下载积分: 无忧币 -2


作者: chenall    时间: 2011-5-9 23:01
汗啊,我都没有注意到。
if /i "%~0"=="%nx0"
这个语句是错误的,应该是
if /i "%~0"=="%~nx0"

正在抽空看看批处理代码。。。
作者: zhaohj    时间: 2011-5-9 23:57
要问下jianliulin:
批处理打包后,怎么还原?
作者: zxw    时间: 2011-5-9 23:59
标题: 回复 #42 zhaohj 的帖子
如果是尾续批处理,右键点击管理尾续文件……
作者: chenall    时间: 2011-5-10 00:03
看了一下,发现太多的goto我被转晕了。。

我先看看能不能优化一下。
作者: chenall    时间: 2011-5-10 01:02
小改了一下,新的批处理在附件,未测试。

因为时间关系,只跟踪修改了一小部份。你们可以再继续改进。

注:附件只有批处理。不可直接使用。

直接查找####就可以看到我修改的内容。

BOOTSECT.rar

3.85 KB, 下载次数: 50, 下载积分: 无忧币 -2


作者: dvd008    时间: 2011-5-10 08:02
这个吧,
DOS下的FDISK,DSPT,可以写MBR,备份恢复

BOOTPART,可以写DOS,WIN98,NT5,NT6的分区代码
作者: zhaohj    时间: 2011-5-10 08:20
确实转向太多,待测试无误后需要优化处理。
重复处理的代码 call 变量
作者: sgw888    时间: 2011-5-10 08:35
:_mbrsx

#先检查引导代码是不是msdos
if /i not %yddm%==msdos goto :_2mbrsx
echo
echo The msdos boot code : Update FAT32 partition DBR only.
####这个我没有看明白,难道是只能/dos mbr?不可以/nt52 mbr?
####这里应该需要有一个goto :end的吧??


说明一下,因为 刷新 dos 代码是后来加的功能。主要是我在测试中发现,这个功能对我个人有点用处。比如说有些按F11或者F10 F9启动隐藏分区的,基于MSDOS的还原类软件,比如 一键还原精灵等,它们的代码是启动IO。SYS的。 使用DOS 的SYS命令 也可以做到 ,但它要传输启动文件,而一键还原精灵的IO。SYS是经过修改的,不能替换。

上面应该是 只能 /nt52 或者是 /nt60 /mbr  DOS的MBR实在是没必要的。因为MBR就是一个通用的程序,不管它是什么代码,它都决定不了DBR的引导。

我就是只想实现 FAT32 分区更新成DOS代码的功能。 为了避免别人误用,我就加了判断。
另外,好像是少了一个 goto :end 太大意了。
作者: jianliulin    时间: 2011-5-10 08:48
原帖由 zhaohj 于 2011-5-9 23:57 发表
要问下jianliulin:
批处理打包后,怎么还原?


批出理打包实际就是把一个或者多个文件尾续在批处理后面(暂且称之为尾续文件),尾续的时候把前一个文件用0x00补全为512字节的倍数,以便后面一个文件刚好以整数扇区开始,


还原方法: 先把整个文件(包含批处理及尾续文件)读到内存里

map --mem=0x10000 %run% (rd)    ## run 为整体文件的绝对路径

然后利用grub4dos map命令将尾续文件 map 为一个盘 ,尾续文件一般都是img、iso等可以映射为磁盘的文件。

map --mem (rd)2+875,447623 (fd0)  , ## 这样的map方发是未正式公开的方法,在时空有介绍。


2: 是尾续文件的开始扇区
875: 是尾续文件的占用山区数
447623 :是尾续文件的实际大小,以字节为单位

以上参数可以从fbinstTool 中查找到,当比处理内容改变后这些参数有可能会变化,若改变了map 的参数务必要跟着修改。




[ 本帖最后由 jianliulin 于 2011-5-10 08:50 编辑 ]
作者: sgw888    时间: 2011-5-10 08:53
根据CHENALL 提示,只修复一处BUG。

另外,CHENALL 有些地方,改的地方,我看不懂。 从内存中取变量值的方法。实在搞不懂。
CHENALL 优化了一部分。 希望有时间,其它网友也帮助优化检查一下错误。

另外,CHENALL 提到 关于磁盘跟分区取值可以弄一个函数。 我印象中这个好像只调用了一次。  磁盘跟分区表示法检查,有些地方语句是一样的。 但磁盘是 (hd0) 这种形式, 分区是 (hd0,0) 这种形式,我多加了判断,除了形式上的判断,还有字符数的检查。 磁盘就是5个,分区就是7个。

大家帮忙看一下,还有没有继续优化的空间。

另外,我对CALL 不熟悉。 习惯了GOTO。 CALL 执行完,总是要返回到原来的地方继续执行。有时候想不明白,容易出错。

[ 本帖最后由 sgw888 于 2011-5-10 08:56 编辑 ]

20110510 暂时修改.rar

3.92 KB, 下载次数: 42, 下载积分: 无忧币 -2


作者: zhaohj    时间: 2011-5-10 10:02
怎样优化,我举例一下:
checkrange 0x80 calc *0x401be&0xff && set cpfq=(hd0,0) && goto :_fqdqjc
checkrange 0x80 calc *0x401ce&0xff && set cpfq=(hd0,1) && goto :_fqdqjc
checkrange 0x80 calc *0x401de&0xff && set cpfq=(hd0,2) && goto :_fqdqjc
checkrange 0x80 calc *0x401ee&0xff && set cpfq=(hd0,3) && goto :_fqdqjc
goto :noap

:_fqdqjc
#检查分区是否可以访问
echo
echo The Activate Partition : %cpfq%
cat --length=0 --hex %cpfq%+1 || goto :fqdqcw
goto :_fqgs
==========改成========
set cpfq=
checkrange 0x80 calc *0x401be&0xff && set cpfq=(hd0,0)
checkrange 0x80 calc *0x401ce&0xff && set cpfq=(hd0,1)
checkrange 0x80 calc *0x401de&0xff && set cpfq=(hd0,2)
checkrange 0x80 calc *0x401ee&0xff && set cpfq=(hd0,3)
set cpfq || set err=1 && goto :err
:检查分区是否可以访问
echo
cat --length=0  %cpfq%+1 || set err=2 && goto :err
echo The Activate Partition : %cpfq% may be access!
goto :_fqgs
.....
错误处理用变量代替,统一用err
:err
if %err%==1 ....
if %err%==2 ....
作者: chenall    时间: 2011-5-10 12:27
原帖由 sgw888 于 2011-5-10 08:53 发表
根据CHENALL 提示,只修复一处BUG。

另外,CHENALL 有些地方,改的地方,我看不懂。 从内存中取变量值的方法。实在搞不懂。


####pause 会返回按键的ASCII码。
pause Do you want to continue? (y/n)
#获取按键字母并转为大写。Y=89,N=78
set /a JX=*0x4CB00 & 0xdf
if %JX%==89 && exit
if %JX%==78 && goto :end
goto :_SFJX
####上面也可以用以下方法,直接从内存中取出该字符####
cat --length=1 --skip=0x100 (md)0x265+1 | set JX=
if /i "%JX%"=="y" && exit
if /i "%JX%"=="n" && goto :end

我解释一下,这个应该很容易明白的。

1.首先pause可以返回按键的ASCII码。比如按建Y的ASCII码为 89(大写)或121(小写)
  在内存中是十六进制数0x59或0x79用字符显示的字符是Y或y
2.内存中0x4cb00存放的是上一个命令的返回值。
3.第一种方法直接取这个按键的值和0xdf进行与操作(也是小写转大写的方法)
  比如: 大小写状态下按了Y键,而内存中的值是0x79
0x79   01111001

0xdf    11011111
-------------------------
0x59    01011001

4.第二种方法是直接取按键的字符
其中(md)0x265+1就是0x265*512开始的1个扇区=0x4CA00
--skip=0x100就是从上面的偏移0x100处开始显示字符即0x4cb00
--length=1 只显示一个字符。
| set JX=   把这个字符设为一个变量JX
作者: sgw888    时间: 2011-5-10 14:24
不错,我明白了。你一解释我就明白了。抽个时间看能不能优化一下。还有 zhaohj 说的那些也有道理。  我得抽时间,把代码优化一下。 看起来条理一些就好了。
作者: 2011cnmw    时间: 2011-5-10 17:12
太好了 正需要这个东西 感谢lz
作者: sgw888    时间: 2011-5-10 17:24
以下代码请帮助看一下:

# 想把磁盘跟分区的参数输入检查代码合到一块,做一个公共代码
# 设置了一个变量csqzbz,用于调用时判断是检查 磁盘参数还是分区参数
# 输入检查,调用 :_cssrjc
# 说明,此处把整个批处理的第二个参数赋值给变量 cpfq
set cpfq=%2 && set csqzbz=partition && call  :_cssrjc %cpfq%
if %jccg%==no goto :_2help
# 下面是继续执行的代码....
#以下为公共代码
:_cssrjc
set jcjg=
set csqz=%1 && set /a leng=*0x4cb00
#检查参数输入是磁盘还是分区
if /i %csqzbz%==partition && if not #%leng%==#7 set jccg=no
if /i %csqzbz%==disk && if not #%leng%==#5 set jccg=no
if /i not %csqz:~,3%==(hd set jccg=no
if /i not %cpfq:~-1%==) set jccg=no
if not exist jccg set jccg=yes


请帮忙给点意见,优化一下。

[ 本帖最后由 sgw888 于 2011-5-10 17:27 编辑 ]
作者: zhaohj    时间: 2011-5-10 17:49
查找是否包含“,”来区分是是磁盘还是分区
set cpfq=%2
echo %cpfq% > (md)0x300+1
cat --locate=, (md)0x300+1 | set a=
set a && echo %cpfq% is partition ! echo %cpfq% is disk

当然严格点需要再检查前面是否是(hd开头及最后是否是)结尾

[ 本帖最后由 zhaohj 于 2011-5-10 17:52 编辑 ]
作者: sgw888    时间: 2011-5-10 20:02
可能我上面没有表达明白。 第一部分为调用部分,第二部分为公共代码。
我想把磁盘跟分区参数的输入合并为一个公共部分。

然后,其它地方需要检查参数的 都 去调用这个 公共部分。

调用公共部分的时候,可以用 call 吧。可是 程序执行到哪儿才会 返来原来的地方呢?? 是遇到下一个标签 吗???
作者: chenall    时间: 2011-5-10 20:58
原帖由 sgw888 于 2011-5-10 20:02 发表
可能我上面没有表达明白。 第一部分为调用部分,第二部分为公共代码。
我想把磁盘跟分区参数的输入合并为一个公共部分。

然后,其它地方需要检查参数的 都 去调用这个 公共部分。

调用公共部分的时候,可 ...


CALL调用和GOTO调用执行的流程是一样的。

只不过CALL会返回,而GOTO不会返回。

另外CALL可以附加参数,GOTO不行。

至于返回
1.到文件尾自然会返回。
2.碰到exit 也会返回。

所以一般用call调用的标签尾部都会有exit命令或goto :eof(或类似的命令让它返回).
作者: zhuchl    时间: 2011-5-11 11:09
支持支持,有这个就好了,微软的好像不支持GrUB,我的PE在win7系统上打不开
作者: sgw888    时间: 2011-5-11 22:13
如果在CALL 调用的过程中,想直接退出整个批处理,该怎么做?? 有时候,在CALL 调用的时候。希望可以直接退出整个批处理。不再希望返回到原处,可以做到吗?
作者: sratlf    时间: 2011-5-11 22:25
标题: 回复 #60 sgw888 的帖子
exit 1 应该可以  不确定
作者: dihuo0    时间: 2011-5-11 22:51
exit
用法: exit
描述:


批处理专用命令。

退出批处理的执行,语法和MS-DOS的批处理几乎一模一样,类似的还有 goto :eof 命令。

如果需要中途停止批处理脚本的运行也可以用 exit 1 命令。
引自grub4dos-help-2011-05-04
作者: chenall    时间: 2011-5-11 23:25
用exit n
就可以中止批处理的执行,并返回1000+n的errnum
作者: sgw888    时间: 2011-5-12 11:13
set disk=%~2 && call :srjc %disk%
........
......

:srjc
set csqz=%~1

以上语句有问题吗???
上面的SET 语句,把整个批处理的第二个参数给DISK 然后调用SRJC 并且把DISK的值给它。
SRJC标签,把 第一个参数赋值给 CSQZ 这样行得通吗??
作者: sratlf    时间: 2011-5-12 11:20
标题: 回复 #64 sgw888 的帖子
set disk=%~2 && call :srjc %disk%

可能有问题  测试下吧  保险的话还是换成下面形式的吧

set disk=%~2
call :srjc %disk%

或者你可以直接

call :srjc %~2
作者: zxw    时间: 2011-5-12 11:22
标题: 回复 #64 sgw888 的帖子
可以这样用。....

保险一点的话,最好这样。
if not #%~2==# call :srjc %~2

[ 本帖最后由 zxw 于 2011-5-12 11:25 编辑 ]
作者: 快雪时晴    时间: 2011-5-13 19:34
标题: 回复 #17 jianliulin 的帖子
怎么这个版本体积大了好几倍?
更新了什么
作者: sgw888    时间: 2011-5-14 17:16
2011-5-14 更新日志: 几处BUG修正。 代码优化微调。如果测试没有问题,不再更新。不打算做成菜单版的了。会用GRUB4DOS 就会用这个程序。 毕竟这个是救急用的,也是为了方便一部分人。菜鸟完全可以在PE下用BOOTICE。 或者用微软的BOOTSECT。如果对GRUB4DOS都不熟悉,还是不建议用了,怕出问题。
上传一个ISO映像。ISO映像中BOOT/GRUB中的BOOTSECT 就是封装过的了。可以直接提取。
作者: chenall    时间: 2011-5-18 13:59
我有时间的话再抽空看一下。以后就可以方便使用了,省得进系统更新麻烦。
作者: chenall    时间: 2011-5-18 15:07
小改了一下。

另外有一点需要注意,清除MBR 1-62扇区时,最好再判断一下这个MBR的可用空间是否有63个扇区,否则。。。。

建议简单判断一下一个磁头的扇区数是否63.

BOOTSECT.rar

3.1 KB, 下载次数: 34, 下载积分: 无忧币 -2


作者: sgw888    时间: 2011-5-19 10:59
感谢CHENALL 的代码优化。 的确是非常高明的批处理。判断可用空间是否有63扇区可能有些困难。

我的想法是: 判断是否有63个扇区,只能是从分区表首手,这样的判断才有意义。然而,分区表并没有严格规定,第一个分区的起始扇区就一定要在第二个分区的起始扇区的前面。这样,就得读四个分区表项,其中还要判断是不是空分区。然后去读开始LBA。再去判断是否有空间。 这样可能会有大量的代码。我有空,会尝试写一下,你帮忙修改一下。
作者: sgw888    时间: 2011-5-19 13:08
分区表判断:
代码初步构想
# :cpdqcw 磁盘读取错误
# :wxfq 无效分区表

dd if=(hd0)+1 of=(md)0x200+1 || goto :cpdqcw
checkrange 0x55 calc *0x401FE&0xff || goto :wxfq
checkrange 0xAA calc *0x401FF&0xff || goto :wxfq
checkrange 0x00 calc *0x401c2&0xff && goto :fq2jc
checkrange 0:62 read 0x401c6 && goto :err
set fqgs=1
:fq2jc
checkrange 0x00 calc *0x401d2&0xff && goto :fq3jc
checkrange 0:62 read 0x401d6 && goto :err
set fqgs=1
:fq3jc
checkrange 0x00 calc *0x401e2&0xff && goto :fq4jc
checkrange 0:62 read 0x401e6 && goto :err
set fqgs=1
:fq4jc
checkrange 0x00 calc *0x401f2&0xff && if not exist fqgs && goto :wxfq
checkrange 0:62 read 0x401f6 && goto :err
goto :ok
:err
echo
echo The (hd0) 1-62 sectors may be present data.
echo Clear Stop.
goto :end
:ok echo will clear....
:end
exit 1

初步的代码。这样应该可以。
需要优化。请CHENALL 有空看一下,帮忙改一下。改好后,我把它加到批处理中。
或者,CHENALL 帮忙加进去,我就感激不尽了。
作者: chenall    时间: 2011-5-19 13:54
看了一下,判断MBR空间是否有63个扇区的代码如下
只需要判断这个值是否在1-62之间就行了。大于或等于63都是合法的,0:该分区表无效,不理会。

这些只需在clear的时候判断一下就行了。

checkrange 1:62 calc 0x401C6 && goto :err
checkrange 1:62 calc 0x401D6 && goto :err
checkrange 1:62 calc 0x401E6 && goto :err
checkrange 1:62 calc 0x401F6 && goto :err

[ 本帖最后由 chenall 于 2011-5-25 22:38 编辑 ]
作者: sgw888    时间: 2011-5-19 14:28
想了下,好像还不是太完善。因为,即使通过上面的检查,也不能保证MBR空间是否有63个扇区。
如果简单判断的话是可以的。但如果是U盘启动,很有可能会破坏U盘数据。这个还是要用户自己使用的时候小心。
作者: sgw888    时间: 2011-5-19 15:20
分区表判断:
代码初步构想

# :cpdqcw 磁盘读取错误
# :wxfq 无效分区表错误

dd if=(hd0)+1 of=(md)0x200+1 || goto :cpdqcw
checkrange 0x55 calc *0x401FE&0xff || goto :wxfq
checkrange 0xAA calc *0x401FF&0xff || goto :wxfq
checkrange 0,0x80 calc *0x401be&0xff || goto :wxfq
checkrange 1:62 read 0x401c6 && goto :err
checkrange 0,0x80 calc *0x401ce&0xff || goto :wxfq
checkrange 1:62 read 0x401d6 && goto :err
checkrange 0,0x80 calc *0x401de&0xff || goto :wxfq
checkrange 0:62 read 0x401e6 && goto :err
checkrange 0,0x80 calc *0x401ee&0xff || goto :wxfq
checkrange 1:62 read 0x401f6 && goto :err
goto :ok
:err
echo
echo The (hd0) 1-62 sectors may be present data.
echo Clear Stop.
goto :end
:ok echo will clear....
:end
exit 1


# 情形判断 假如整个hd0 第一扇区是空的。 会提示无效分区表,终止清除操作,虽然限制加多,但还是防止了误操作
# 既然整个硬盘都是空的,清除62可能没必要。如果真的要清除,建立分区之后再清除也可以。另外,因为是G4D下面的,直接 echo -n > 手

动清除也不麻烦。
# 55 AA 标志正常,但是可能不是分区表,可能是DBR。针对80,00 的判断会起作用。
# 如果第一个字节不是80或者0那肯定不是分区表直接跳到无效分区表
# 80,0的判断通过检查后,再检查分区开始是不是在1到62 ,如果在提示错误。
作者: chenall    时间: 2011-5-19 15:41
嗯,这样就是多加了判断,安全性高一点。
作者: sgw888    时间: 2011-5-19 17:24
在 chenall 的基础上小改了一下关于清除扇区 判断是否安全清除1-62 扇区的问题。
加了点判断。但并不是说,一定不会出问题。 如果是从U盘启动的GRUB4OS,并且U盘没有分区表,一开始就是一个DBR扇区,并且恰巧偏移0x1BE 开始的地方到0x1FE 结束的地方全是0 可能还会通过检查,并且仍旧会执行  清除1-62 扇区的清除操作。

所以在执行清除1-62 扇区操作时,一定要小心,不要把U盘给清了。
U盘在很多情况下可能会被认为是 (hd0)

BOOTSECT 20110519sgw.rar

3.29 KB, 下载次数: 22, 下载积分: 无忧币 -2


作者: 木头人    时间: 2011-5-22 11:07
如果写成DOS下运行多好。方便多了
另外帮助档写的太不明白了,测试半天,不知道怎么使用。
GRUB4DOS似乎连 CD 命令都没有,怎么切换到 boot/grub 目录下呢
作者: 2011七月流火    时间: 2011-5-22 12:53
标题: 回复 #1 sgw888 的帖子
谢谢楼主,学习一下,如何dos。
作者: sgw888    时间: 2011-5-22 15:53
回#78
因为GRUB4DOS 接管优先权,所以根本没必要在DOS下运行。GRUB4DOS比DOS强大。
如果你一定想用DOS。DOS有可以刷新引导的工具。
作者: sgw888    时间: 2011-5-22 16:15
原帖由 木头人 于 2011-5-22 11:07 发表
如果写成DOS下运行多好。方便多了
另外帮助档写的太不明白了,测试半天,不知道怎么使用。
GRUB4DOS似乎连 CD 命令都没有,怎么切换到 boot/grub 目录下呢


无需切换 目录

/boot/grub/bootsect

或者
command --set-path=/boot/grub/
bootsect
作者: 2010fengyun    时间: 2011-5-26 11:03
如果我的U盘启动进的G4D,那么我用bootsect /nt52 /mbr这样的操作。会不会误把U盘当硬盘或者多硬盘搞错的可能。
作者: sgw888    时间: 2011-5-26 11:20
回楼上,如果你U盘进的G4D,那么 bootsect /nt52 /mbr 这样的操作可能会把U盘当成 (hd0) 而进行刷新主引导的操作。 所以,在操作之前,请使用  geometry (hd0)   
geometry (hd1) 的方式来查看一下硬盘分区表。 以确认要进行更新操作的硬盘。 如果U盘做为USB-HDD 启动,那么上述命令操作的肯定是U盘。  需要 bootsect /nt52 /mbr (hd1) 来操作,这样就可以了。

另外,ZHAOHJ正在帮我写一部分 菜单,如果写成,改进之后,就会发布菜单版了。那时候,可能会比使用命令行版要简单易懂。期待ZHAOHJ有空的时候,帮我完成一部分重要的菜单,然后,我开始改进,把命令行版变成菜单版的。
作者: zhaohj    时间: 2011-5-26 14:11
@sgw888:
还是传到这里吧,你自己先测试一下。接口部分留着你自己P处理处理。

MENU.rar

1005 Bytes, 下载次数: 25, 下载积分: 无忧币 -2


作者: sgw888    时间: 2011-5-26 20:31
#以下代码用于判断1-62扇区是否有数据
#可能代码段比较长,但是增加了安全性
set fqbkx=
cat --length=0 --hex %disk%+1 || goto :cpdqcw
dd if=%disk%+1 of=(md)0x200+1 || goto :cpdqcw
#以下用于检查分区表55AA标志
checkrange 0x55 calc *0x401fe&0xff || goto :wxfqb
checkrange 0xAA calc *0x401ff&0xff || goto :wxfqb
#0,80检查用于检查分区表是否有效
checkrange 0,0x80 calc *0x401be&0xff || goto :wxfqb
#分区起始LBA检查用于确定分区表项是否为空
checkrange 0 read 0x401c6 || set fqbkx=ok
checkrange 1:62 read 0x401c6 && goto :myzgkj
checkrange 0,0x80 calc *0x401ce&0xff || goto :wxfqb
checkrange 0 read 0x401d6 || set fqbkx=ok
checkrange 1:62 read 0x401d6 && goto :myzgkj
checkrange 0,0x80 calc *0x401de&0xff || goto :wxfqb
checkrange 0 read 0x401e6 || set fqbkx=ok
checkrange 1:62 read 0x401e6 && goto :myzgkj
checkrange 0,0x80 calc *0x401ee&0xff || goto :wxfqb
checkrange 0 read 0x401f6 || set fqbkx=ok
checkrange 1:62 read 0x401f6 && goto :myzgkj
if not exist fqbkx && goto :wxfqb


以上是修改的 清除1-62 扇区的判断代码.虽然比原来复杂很多,但是增强了安全性. 如果找不到分区,就是空分区表的情况下会拒绝刷新,起始扇区小于63扇区也拒绝刷新. 判断不是分区表,通过检查四个表项开始字节是不是80或者是00 来决定,如果出现了无效的取值,会拒绝刷新.
在CHENALL最后一次修改后,一直没有上传最新版,今天上传最后一个命令行版.如果没有BUG,不再修改,也不再优化或者是更新代码.算是命令行版的终结版吧.
我已在虚拟机测试过,更新主引导,分区引导,NT52 NT60 DOS  清除扇区. 有时间,会继续编写菜单版的批处理.感谢ZHAOHJ大侠的帮忙. 可能要过一段时间才能写出来,大家要等等了.
作者: zhaohj    时间: 2011-5-27 08:29
根据tuxw的建议,为了防止活动分区在逻辑分区后面(逻辑分区很多的情况)有可能找不到活动分区,修改菜单如下:

MENU.rar

976 Bytes, 下载次数: 16, 下载积分: 无忧币 -2


作者: 2010fengyun    时间: 2011-5-27 12:25
这个bootsect和bootice工具有何区别呢?

如果说和系统自带的bootsect区别的话,我觉得就是系统自带的只能局限于系统自身。xp系统的只能nt52.
作者: sgw888    时间: 2011-5-27 12:48
回楼上,这个工具有些功能跟BOOTICE是一样的,当然,BOOTICE功能更加强大。
只是这个工具是基于GRUB4DOS的,可以在启动系统之前进行操作。只是为了方便。  有些用户对GRUB4DOS是很陌生的,那就没有办法了。
作者: blithewind    时间: 2011-5-27 14:49
这个工具很好,在命令行下操作方便呀.收入合盘了,感谢LZ等人的努力.

来点建议,可将各种常用的MBR数据用尾续法封装下,现在只有nt5、nt6的,类型太少了。

另外,应增加对MBR、DBR的备份与恢复功能.
作者: andos    时间: 2011-5-27 15:54
原帖由 blithewind 于 2011-5-27 14:49 发表
这个工具很好,在命令行下操作方便呀.收入合盘了,感谢LZ等人的努力.

来点建议,可将各种常用的MBR数据用尾续法封装下,现在只有nt5、nt6的,类型太少了。

另外,应增加对MBR、DBR的备份与恢复功能.

MBR不用备份,重建一个就行,可以用DG或者BOOTICE

MBR、DBR的备份与恢复功能,BOOTICE就有这种功能吧....
作者: sgw888    时间: 2011-5-27 17:40
回 blithewind :

目前的功能够用了吧? 可以更新NT52 NT60 DOS的,你还想要什么的呢?
目前也就是XP,WIN7 DOS了吧?
作者: blithewind    时间: 2011-5-28 13:21
原帖由 sgw888 于 2011-5-27 17:40 发表 回 blithewind :目前的功能够用了吧? 可以更新NT52 NT60 DOS的,你还想要什么的呢? 目前也就是XP,WIN7 DOS了吧?
只是需要对mbr/dbr的备份与恢复.支持.mbr及.bin文件就可以了。存放位置可置可bootsect同级目录中.比如我要恢复wee.bmr到mbr或将我的xorldr的MBR备份到默认目录,或者进行相反的操作,在进行某些启动测试时,只要启动到grub命令行就可方便地操作,而不必进PE或其它工具进行,还是很有意义的.
作者: zhaohj    时间: 2011-5-28 13:51
菜单简单写了一下,你自己要补充。
menu.bat任务完成后,你要做什么事情,需要自己完善。如menu.bat任务完成,想返回主菜单,需要在合适的地方加上configfile (fd9)/MAIN.LST

sw888.rar

749 Bytes, 下载次数: 34, 下载积分: 无忧币 -2


作者: sgw888    时间: 2011-6-3 17:16
感谢 zhaohj 的帮助。zhaohj 的动态菜单真的很棒。
现在 BOOTSECT 菜单版已完工,请大家帮忙测试。

BOOTSECT 是一个经过封装的单文件。在批处理执行开始,会把所有的文件载入到内存,并虚拟软驱 (fd9)  
主要文件介绍:

main.lst  主菜单
choose.lst 引导代码选择菜单
MENU.BAT 硬盘选择  动态菜单  生成批处理
maincall  调用批处理
bootsec 程序执行主体,核心操作批处理  由原来的命令行版修改而来。 简单修改。

main.lst 内容:
#主菜单框架
debug off
color white/blue blue/yellow light-red/blue 10
default 5
timeout 50
#0
title       GRUB4DOS BOOTSECT
clear
#1
title
clear
#2
title   Update MBR [Master Boot Record]
set czlx=mbr
configfile (fd9)/CHOOSE.LST

#3
title   Update DBR [Partition Boot Record]
set czlx=dbr
configfile (fd9)/CHOOSE.LST

#4
title   Clear Hard Disk 1-62 sectors
set czlx=clear
(fd9)/MENU.BAT
boot

#5
title   Return BOOTSECT Main Menu
configfile (fd9)/MAIN.LST

#6
title   Return GRUB4DOS Boot Menu
set *
map --unmap=9
map --rehook
configfile (md)4+8

#7
title   GRUB4DOS Commandline
commandline

#8
title   Reboot
reboot

#9
title   Halt
halt


choose.lst 内容:
debug off
color white/blue blue/yellow light-red/blue 10
default 5
timeout 50
#0
title       Choose Boot Code Type
clear
#1
title
clear
#2
title          nt5x
set yddm=/nt52
(fd9)/MENU.BAT
boot
#3
title          nt60
set yddm=/nt60
(fd9)/MENU.BAT
boot
#4
title          dos
set yddm=/dos
(fd9)/MENU.BAT
boot
#5
title   Return BOOTSECT Main Menu
configfile (fd9)/MAIN.LST



maincall 内容:
!BAT by sgw888
#主调用菜单
goto %czlx%

:clear
(fd9)/BOOTSEC clear %hddisk%
goto :end

:mbr
(fd9)/BOOTSEC %yddm% /mbr %hddisk%
goto :end

:dbr
(fd9)/BOOTSEC %yddm% %acpart%

:end
set nn=
set ac=
set gt=
set hdn=
set hdp=
set hddisk=
set acpart=
set czlx=
set yddm=
configfile (fd9)/main.lst


MENU.BAT 内容:
这个文件才是关键!!! 在 zhaohj 的基础上做了少许改动。
!BAT
# changelog 2011.05.25
# 考虑到U盘usb-hdd模式启动,(hd0)会被U盘占用,这在处理时要特别小心。
debug off
set ac=
set hdp=
set /a hdn=*0x475&0xff
calc %hdn% || clear && pause --wait=10 NO Harddisk && configfile (fd9)/main.lst
set /a nn=0
set /a gt=%hdn%+2
map --rd-base=0x40000 && map --rd-size=0x1000
echo debug off > (rd)+1
echo color white/blue blue/yellow light-red/blue 10 >> (rd)+1
echo default 2 >> (rd)+1
#0
echo title ==== please select Harddisk   %@date% ==== >> (rd)+1
echo clear >> (rd)+1
#1
echo title >> (rd)+1
echo clear >> (rd)+1
#2
:hdd
echo title          select hd%nn% >> (rd)+1
echo clear >> (rd)+1
echo echo hd%nn% harddisk Partition information: >> (rd)+1
echo echo >> (rd)+1
echo -e checkrange 0x80 read 0x82a0 \&\& echo If be USB-HDD Boot,your first harddisk may be U-Pan \&\& >> (rd)+1
echo geometry (hd%nn%) >> (rd)+1
echo echo >> (rd)+1
echo -e geometry (hd%nn%) \x3e (md)0x300+1 >> (rd)+1
echo -e set hddisk=(hd%nn%) >> (rd)+1
echo -e cat --locate=active (md)0x300+1 \| set ac= >> (rd)+1
echo -e if not exist ac \&\& if /i \x25czlx\x25==dbr \&\& pause --wait=10 NO Active Partition,DBR can not be updated! \&\& goto %gt% >> (rd)+1
echo -e if not exist ac \&\& echo NO Active Partition! >> (rd)+1
echo -e if not exist ac \&\& set /p sfzx=Do you want to continue?(y/n) >> (rd)+1
echo -e if not exist ac \&\& if /i #\x25sfzx\x25==#y \&\& (fd9)/MAINCALL >> (rd)+1
echo -e if not exist ac \&\& if /i not #\x25sfzx\x25==#y \&\& goto %gt% >> (rd)+1
echo -e set ac=0x\x25ac\x25 >> (rd)+1
echo -e set /a ac=\x25ac\x25-3 >> (rd)+1
echo -e cat --skip=\x25ac\x25 --length=1 (md)0x300+1 \| set hdp= >> (rd)+1
echo -e echo List Active Partition (hd%nn%,\x25hdp\x25) files: >> (rd)+1
echo echo >> (rd)+1
echo -e ls (hd%nn%,\x25hdp\x25)/ \|\| echo (hd\x25nn\x25,\x25hdp\x25) partition read error, unable to list files. >> (rd)+1
echo echo >> (rd)+1
echo -e set hddisk=(hd%nn%) >> (rd)+1
echo -e set acpart=(hd%nn%,\x25hdp\x25) >> (rd)+1
echo set /p ac=Whether correct for selected harddisk or Partition (y/n)? >> (rd)+1
echo -e if /i not \x25ac\x25==y goto %gt% >> (rd)+1
echo (fd9)/MAINCALL >> (rd)+1
echo kernel  >> (rd)+1
set /a nn=%nn%+1
if not %nn%==%hdn% && goto :hdd

#变量gt 指向本菜单
#返回bootsect 主菜单
echo title    Return BOOTSECT Main Menu >> (rd)+1
echo clear >> (rd)+1
echo configfile (fd9)/main.lst >> (rd)+1
configfile (rd)+1
exit



以上是菜单版主要文件的源码。
作者: zhaohj    时间: 2011-6-3 17:29
支持一下,请大家先虚拟机测试!

大概看了一下没问题!
作者: sgw888    时间: 2011-6-3 19:34
echo -e checkrange 0x80 read 0x82a0 \&\& echo If be USB-HDD Boot,your first harddisk may be U-Pan \&\& >> (rd)+1

上面这一句似乎有问题.

应该把最后面的  \&\& 去掉吧?? 好像没什么作用啊. 实际上不去掉也不会有什么问题.
作者: zhaohj    时间: 2011-6-4 12:04
原来考虑想在这里停留一下,没有写完,应该是
\&\& pause --wait=10 这样的语句。
作者: sgw888    时间: 2011-6-14 16:36
2011-6-14 更新日志: 菜单版BUG修正. 上一版本中在选择硬盘界面,如果取消当前的选择,会直接返回主菜单,而不是返回硬盘选择界面,现已修正,在核心执行部分,提示是否继续执行操作时,选择否仍会继续执行,现已修正。 上传两个附件。 附件一为 菜单版修正。 附件二为演示ISO。方便菜鸟测试。其中有UNIFONT 跟中文字库,分别有中英文显示的BOOTSECT,另外还有磁头数检查与修正程序。对于喜欢中文显示的可以选择切换到中文菜单,提示为中文显示。
作者: zhaohj    时间: 2011-6-14 16:58
收下了,下次清理mbr方便了。
作者: 快雪时晴    时间: 2011-10-20 14:13
标题: 回复 #1 sgw888 的帖子
能不能增加激活某分区为活动分区?




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3