无忧启动论坛

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

[发布] 基于GRUB4DOS的BOOTSECT

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

使用道具 举报

32#
发表于 2011-5-9 17:34:38 | 只看该作者
是否有问题,无参数时,变成这样了。
(pxe启动,bootsect放在/boot/grub下)

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

Snap1.jpg
回复

使用道具 举报

33#
 楼主| 发表于 2011-5-9 17:40:36 | 只看该作者
没试过PXE ,另我,我是加/ 的,难道是因为  /  的问题???
回复

使用道具 举报

34#
发表于 2011-5-9 17:42:15 | 只看该作者
原帖由 sgw888 于 2011-5-9 17:40 发表
没试过PXE ,另我,我是加/ 的,难道是因为  /  的问题???


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

这句能存在问题:
if /i "%~0"=="%nx0" set run=%@path%%%~0 || set run=%~0
回复

使用道具 举报

35#
发表于 2011-5-9 17:46:18 | 只看该作者
因为批处理直接放在/boot/grub/下,pxe启动可以直接运行批处理的。
经测试
/boot/grub/bootsect 运行正常

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

/bootsect肯定不行。

[ 本帖最后由 zhaohj 于 2011-5-9 17:48 编辑 ]
回复

使用道具 举报

36#
发表于 2011-5-9 20:53:40 | 只看该作者
可以debug一下,看看就知道了,出现这个提示是因为文件路径错误。
回复

使用道具 举报

37#
 楼主| 发表于 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 的,可能问题在这。
回复

使用道具 举报

38#
 楼主| 发表于 2011-5-9 22:12:58 | 只看该作者
(bd) 应该没有改变。 但是为了封装单文件。用了以上几句:


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

使用道具 举报

39#
发表于 2011-5-9 22:25:45 | 只看该作者
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 编辑 ]
回复

使用道具 举报

40#
 楼主| 发表于 2011-5-9 22:26:55 | 只看该作者
修改了下。
我光盘虚拟机测试 没问题,不知道 PXE行不行。

BOOTSECT.rar

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

回复

使用道具 举报

41#
发表于 2011-5-9 23:01:37 | 只看该作者
汗啊,我都没有注意到。
if /i "%~0"=="%nx0"
这个语句是错误的,应该是
if /i "%~0"=="%~nx0"

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

使用道具 举报

42#
发表于 2011-5-9 23:57:32 | 只看该作者
要问下jianliulin:
批处理打包后,怎么还原?
回复

使用道具 举报

43#
发表于 2011-5-9 23:59:45 | 只看该作者

回复 #42 zhaohj 的帖子

如果是尾续批处理,右键点击管理尾续文件……
回复

使用道具 举报

44#
发表于 2011-5-10 00:03:00 | 只看该作者
看了一下,发现太多的goto我被转晕了。。

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

使用道具 举报

45#
发表于 2011-5-10 01:02:28 | 只看该作者
小改了一下,新的批处理在附件,未测试。

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

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

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

BOOTSECT.rar

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

回复

使用道具 举报

46#
发表于 2011-5-10 08:02:06 | 只看该作者
这个吧,
DOS下的FDISK,DSPT,可以写MBR,备份恢复

BOOTPART,可以写DOS,WIN98,NT5,NT6的分区代码
回复

使用道具 举报

47#
发表于 2011-5-10 08:20:16 | 只看该作者
确实转向太多,待测试无误后需要优化处理。
重复处理的代码 call 变量
回复

使用道具 举报

48#
 楼主| 发表于 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 太大意了。
回复

使用道具 举报

49#
发表于 2011-5-10 08:48:45 | 只看该作者
原帖由 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 编辑 ]
回复

使用道具 举报

50#
 楼主| 发表于 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

回复

使用道具 举报

51#
发表于 2011-5-10 10:02: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 ....
回复

使用道具 举报

52#
发表于 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
回复

使用道具 举报

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

使用道具 举报

54#
发表于 2011-5-10 17:12:40 | 只看该作者
太好了 正需要这个东西 感谢lz
回复

使用道具 举报

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

使用道具 举报

56#
发表于 2011-5-10 17:49:26 | 只看该作者
查找是否包含“,”来区分是是磁盘还是分区
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 编辑 ]
回复

使用道具 举报

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

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

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

使用道具 举报

58#
发表于 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(或类似的命令让它返回).
回复

使用道具 举报

59#
发表于 2011-5-11 11:09:35 | 只看该作者
支持支持,有这个就好了,微软的好像不支持GrUB,我的PE在win7系统上打不开
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-17 04:36

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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