无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 47057|回复: 99
打印 上一主题 下一主题

[发布] 基于GRUB4DOS的BOOTSECT

[复制链接]
跳转到指定楼层
1#
发表于 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, 下载次数: 252, 下载积分: 无忧币 -2

0508 修正BUG

bootsect.iso.rar

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

0508 修正BUG

BOOTSECT.rar

18.73 KB, 下载次数: 217, 下载积分: 无忧币 -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, 下载次数: 226, 下载积分: 无忧币 -2

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

bootsect.rar

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

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

BOOTSECT.rar

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

菜单版初步测试

BOOTSECT.rar

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

菜单版BUG修正

bootsect.part1.rar

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

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

bootsect.part2.rar

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

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

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

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

使用道具 举报

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

使用道具 举报

4#
 楼主| 发表于 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,请不要执行代码更新操作,那样,你的软激活会失效。。。。。
回复

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

7#
 楼主| 发表于 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。。。
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

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

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

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

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

使用道具 举报

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

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

使用道具 举报

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

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

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

使用道具 举报

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

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


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

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

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

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

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

使用道具 举报

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

使用道具 举报

15#
 楼主| 发表于 2011-5-9 17:13:34 | 显示全部楼层
命令行版,今天又更新了。单文件封装版。封装采用的 FBINSTTOOL。
增加了更新FAT32 分区DOS代码的功能,主要是为了引导IO。SYS,这在某些情况下会用到。
一个小BUG修正。
回复

使用道具 举报

16#
 楼主| 发表于 2011-5-9 17:40:36 | 显示全部楼层
没试过PXE ,另我,我是加/ 的,难道是因为  /  的问题???
回复

使用道具 举报

17#
 楼主| 发表于 2011-5-9 22:10:46 | 显示全部楼层
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 的,可能问题在这。
回复

使用道具 举报

18#
 楼主| 发表于 2011-5-9 22:12:58 | 显示全部楼层
(bd) 应该没有改变。 但是为了封装单文件。用了以上几句:


我是照抄的 jianliulin 大侠的。
我不是完全明白那个意思。
回复

使用道具 举报

19#
 楼主| 发表于 2011-5-9 22:26:55 | 显示全部楼层
修改了下。
我光盘虚拟机测试 没问题,不知道 PXE行不行。

BOOTSECT.rar

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

回复

使用道具 举报

20#
 楼主| 发表于 2011-5-10 08:35:49 | 显示全部楼层
:_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 太大意了。
回复

使用道具 举报

21#
 楼主| 发表于 2011-5-10 08:53:07 | 显示全部楼层
根据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

回复

使用道具 举报

22#
 楼主| 发表于 2011-5-10 14:24:31 | 显示全部楼层
不错,我明白了。你一解释我就明白了。抽个时间看能不能优化一下。还有 zhaohj 说的那些也有道理。  我得抽时间,把代码优化一下。 看起来条理一些就好了。
回复

使用道具 举报

23#
 楼主| 发表于 2011-5-10 17:24:00 | 显示全部楼层
以下代码请帮助看一下:

# 想把磁盘跟分区的参数输入检查代码合到一块,做一个公共代码
# 设置了一个变量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 编辑 ]
回复

使用道具 举报

24#
 楼主| 发表于 2011-5-10 20:02:29 | 显示全部楼层
可能我上面没有表达明白。 第一部分为调用部分,第二部分为公共代码。
我想把磁盘跟分区参数的输入合并为一个公共部分。

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

调用公共部分的时候,可以用 call 吧。可是 程序执行到哪儿才会 返来原来的地方呢?? 是遇到下一个标签 吗???
回复

使用道具 举报

25#
 楼主| 发表于 2011-5-11 22:13:05 | 显示全部楼层
如果在CALL 调用的过程中,想直接退出整个批处理,该怎么做?? 有时候,在CALL 调用的时候。希望可以直接退出整个批处理。不再希望返回到原处,可以做到吗?
回复

使用道具 举报

26#
 楼主| 发表于 2011-5-12 11:13:30 | 显示全部楼层
set disk=%~2 && call :srjc %disk%
........
......

:srjc
set csqz=%~1

以上语句有问题吗???
上面的SET 语句,把整个批处理的第二个参数给DISK 然后调用SRJC 并且把DISK的值给它。
SRJC标签,把 第一个参数赋值给 CSQZ 这样行得通吗??
回复

使用道具 举报

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

使用道具 举报

28#
 楼主| 发表于 2011-5-19 10:59:59 | 显示全部楼层
感谢CHENALL 的代码优化。 的确是非常高明的批处理。判断可用空间是否有63扇区可能有些困难。

我的想法是: 判断是否有63个扇区,只能是从分区表首手,这样的判断才有意义。然而,分区表并没有严格规定,第一个分区的起始扇区就一定要在第二个分区的起始扇区的前面。这样,就得读四个分区表项,其中还要判断是不是空分区。然后去读开始LBA。再去判断是否有空间。 这样可能会有大量的代码。我有空,会尝试写一下,你帮忙修改一下。
回复

使用道具 举报

29#
 楼主| 发表于 2011-5-19 13:08:53 | 显示全部楼层
分区表判断:
代码初步构想
# :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 帮忙加进去,我就感激不尽了。
回复

使用道具 举报

30#
 楼主| 发表于 2011-5-19 14:28:09 | 显示全部楼层
想了下,好像还不是太完善。因为,即使通过上面的检查,也不能保证MBR空间是否有63个扇区。
如果简单判断的话是可以的。但如果是U盘启动,很有可能会破坏U盘数据。这个还是要用户自己使用的时候小心。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-12-26 06:13

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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