无忧启动论坛

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

[发布] 基于GRUB4DOS的BOOTSECT

[复制链接]
1#
发表于 2011-5-7 19:53:17 | 显示全部楼层
回复

使用道具 举报

2#
发表于 2011-5-9 20:53:40 | 显示全部楼层
可以debug一下,看看就知道了,出现这个提示是因为文件路径错误。
回复

使用道具 举报

3#
发表于 2011-5-9 23:01:37 | 显示全部楼层
汗啊,我都没有注意到。
if /i "%~0"=="%nx0"
这个语句是错误的,应该是
if /i "%~0"=="%~nx0"

正在抽空看看批处理代码。。。
回复

使用道具 举报

4#
发表于 2011-5-10 00:03:00 | 显示全部楼层
看了一下,发现太多的goto我被转晕了。。

我先看看能不能优化一下。
回复

使用道具 举报

5#
发表于 2011-5-10 01:02:28 | 显示全部楼层
小改了一下,新的批处理在附件,未测试。

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

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

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

BOOTSECT.rar

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

回复

使用道具 举报

6#
发表于 2011-5-10 12:27:45 | 显示全部楼层
原帖由 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
回复

使用道具 举报

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

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

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


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

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

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

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

所以一般用call调用的标签尾部都会有exit命令或goto :eof(或类似的命令让它返回).
回复

使用道具 举报

8#
发表于 2011-5-11 23:25:36 | 显示全部楼层
用exit n
就可以中止批处理的执行,并返回1000+n的errnum
回复

使用道具 举报

9#
发表于 2011-5-18 13:59:33 | 显示全部楼层
我有时间的话再抽空看一下。以后就可以方便使用了,省得进系统更新麻烦。
回复

使用道具 举报

10#
发表于 2011-5-18 15:07:58 | 显示全部楼层
小改了一下。

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

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

BOOTSECT.rar

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

回复

使用道具 举报

11#
发表于 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 编辑 ]
回复

使用道具 举报

12#
发表于 2011-5-19 15:41:30 | 显示全部楼层
嗯,这样就是多加了判断,安全性高一点。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-18 07:31

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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