无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: sgw888
打印 上一主题 下一主题

[发布] 基于GRUB4DOS的BOOTSECT

[复制链接]
61#
发表于 2011-5-11 22:25:11 | 只看该作者

回复 #60 sgw888 的帖子

exit 1 应该可以  不确定
回复

使用道具 举报

62#
发表于 2011-5-11 22:51:01 | 只看该作者
exit
用法: exit
描述:


批处理专用命令。

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

如果需要中途停止批处理脚本的运行也可以用 exit 1 命令。
引自grub4dos-help-2011-05-04
回复

使用道具 举报

63#
发表于 2011-5-11 23:25:36 | 只看该作者
用exit n
就可以中止批处理的执行,并返回1000+n的errnum
回复

使用道具 举报

64#
 楼主| 发表于 2011-5-12 11:13:30 | 只看该作者
set disk=%~2 && call :srjc %disk%
........
......

:srjc
set csqz=%~1

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

使用道具 举报

65#
发表于 2011-5-12 11:20:06 | 只看该作者

回复 #64 sgw888 的帖子

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

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

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

或者你可以直接

call :srjc %~2
回复

使用道具 举报

66#
发表于 2011-5-12 11:22:42 | 只看该作者

回复 #64 sgw888 的帖子

可以这样用。....

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

[ 本帖最后由 zxw 于 2011-5-12 11:25 编辑 ]
回复

使用道具 举报

67#
发表于 2011-5-13 19:34:39 | 只看该作者

回复 #17 jianliulin 的帖子

怎么这个版本体积大了好几倍?
更新了什么
回复

使用道具 举报

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

使用道具 举报

69#
发表于 2011-5-18 13:59:33 | 只看该作者
我有时间的话再抽空看一下。以后就可以方便使用了,省得进系统更新麻烦。
回复

使用道具 举报

70#
发表于 2011-5-18 15:07:58 | 只看该作者
小改了一下。

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

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

BOOTSECT.rar

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

回复

使用道具 举报

71#
 楼主| 发表于 2011-5-19 10:59:59 | 只看该作者
感谢CHENALL 的代码优化。 的确是非常高明的批处理。判断可用空间是否有63扇区可能有些困难。

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

使用道具 举报

72#
 楼主| 发表于 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 帮忙加进去,我就感激不尽了。
回复

使用道具 举报

73#
发表于 2011-5-19 13:54:04 | 只看该作者
看了一下,判断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 编辑 ]
回复

使用道具 举报

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

使用道具 举报

75#
 楼主| 发表于 2011-5-19 15:20:33 | 只看该作者
分区表判断:
代码初步构想

# :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 ,如果在提示错误。
回复

使用道具 举报

76#
发表于 2011-5-19 15:41:30 | 只看该作者
嗯,这样就是多加了判断,安全性高一点。
回复

使用道具 举报

77#
 楼主| 发表于 2011-5-19 17:24:02 | 只看该作者
在 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

回复

使用道具 举报

78#
发表于 2011-5-22 11:07:08 | 只看该作者
如果写成DOS下运行多好。方便多了
另外帮助档写的太不明白了,测试半天,不知道怎么使用。
GRUB4DOS似乎连 CD 命令都没有,怎么切换到 boot/grub 目录下呢
回复

使用道具 举报

79#
发表于 2011-5-22 12:53:50 | 只看该作者

回复 #1 sgw888 的帖子

谢谢楼主,学习一下,如何dos。
回复

使用道具 举报

80#
 楼主| 发表于 2011-5-22 15:53:35 | 只看该作者
回#78
因为GRUB4DOS 接管优先权,所以根本没必要在DOS下运行。GRUB4DOS比DOS强大。
如果你一定想用DOS。DOS有可以刷新引导的工具。
回复

使用道具 举报

81#
 楼主| 发表于 2011-5-22 16:15:03 | 只看该作者
原帖由 木头人 于 2011-5-22 11:07 发表
如果写成DOS下运行多好。方便多了
另外帮助档写的太不明白了,测试半天,不知道怎么使用。
GRUB4DOS似乎连 CD 命令都没有,怎么切换到 boot/grub 目录下呢


无需切换 目录

/boot/grub/bootsect

或者
command --set-path=/boot/grub/
bootsect
回复

使用道具 举报

82#
发表于 2011-5-26 11:03:06 | 只看该作者
如果我的U盘启动进的G4D,那么我用bootsect /nt52 /mbr这样的操作。会不会误把U盘当硬盘或者多硬盘搞错的可能。
回复

使用道具 举报

83#
 楼主| 发表于 2011-5-26 11:20:22 | 只看该作者
回楼上,如果你U盘进的G4D,那么 bootsect /nt52 /mbr 这样的操作可能会把U盘当成 (hd0) 而进行刷新主引导的操作。 所以,在操作之前,请使用  geometry (hd0)   
geometry (hd1) 的方式来查看一下硬盘分区表。 以确认要进行更新操作的硬盘。 如果U盘做为USB-HDD 启动,那么上述命令操作的肯定是U盘。  需要 bootsect /nt52 /mbr (hd1) 来操作,这样就可以了。

另外,ZHAOHJ正在帮我写一部分 菜单,如果写成,改进之后,就会发布菜单版了。那时候,可能会比使用命令行版要简单易懂。期待ZHAOHJ有空的时候,帮我完成一部分重要的菜单,然后,我开始改进,把命令行版变成菜单版的。
回复

使用道具 举报

84#
发表于 2011-5-26 14:11:35 | 只看该作者
@sgw888:
还是传到这里吧,你自己先测试一下。接口部分留着你自己P处理处理。

MENU.rar

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

回复

使用道具 举报

85#
 楼主| 发表于 2011-5-26 20:31:55 | 只看该作者
#以下代码用于判断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大侠的帮忙. 可能要过一段时间才能写出来,大家要等等了.
回复

使用道具 举报

86#
发表于 2011-5-27 08:29:32 | 只看该作者
根据tuxw的建议,为了防止活动分区在逻辑分区后面(逻辑分区很多的情况)有可能找不到活动分区,修改菜单如下:

MENU.rar

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

回复

使用道具 举报

87#
发表于 2011-5-27 12:25:00 | 只看该作者
这个bootsect和bootice工具有何区别呢?

如果说和系统自带的bootsect区别的话,我觉得就是系统自带的只能局限于系统自身。xp系统的只能nt52.
回复

使用道具 举报

88#
 楼主| 发表于 2011-5-27 12:48:23 | 只看该作者
回楼上,这个工具有些功能跟BOOTICE是一样的,当然,BOOTICE功能更加强大。
只是这个工具是基于GRUB4DOS的,可以在启动系统之前进行操作。只是为了方便。  有些用户对GRUB4DOS是很陌生的,那就没有办法了。
回复

使用道具 举报

89#
发表于 2011-5-27 14:49:31 | 只看该作者
这个工具很好,在命令行下操作方便呀.收入合盘了,感谢LZ等人的努力.

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

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

使用道具 举报

90#
发表于 2011-5-27 15:54:46 | 只看该作者
原帖由 blithewind 于 2011-5-27 14:49 发表
这个工具很好,在命令行下操作方便呀.收入合盘了,感谢LZ等人的努力.

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

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

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

MBR、DBR的备份与恢复功能,BOOTICE就有这种功能吧....
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-19 20:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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