无忧启动论坛

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

menu.wee 的一点微调,chenall 留意一下

  [复制链接]
跳转到指定楼层
#
发表于 2015-7-22 21:58:19 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 不点 于 2015-7-22 21:59 编辑

背景:我用 diskgen 调整 C 盘分区大小之后,C 盘 PBR 代码(是微软的代码)失效。如果是 GRLDR 的代码,则不会失效。但微软的代码就可能失效了。用失效的代码启动,则必定是死机。我已经遇到好几次死机了。修复的办法是用 BootICE 重新建立 PBR(修复后可以正常启动)。

目前的 menu.wee 的默认启动项目如下:
  1. title 1. Windows
  2. find --set-root --active
  3. +1
  4. find --set-root /bootmgr
  5. /bootmgr
  6. find --set-root /ntldr
  7. /ntldr
复制代码


它首先查找活动分区,只要发现了活动分区,就加载并启动活动分区的 PBR。

另外,上述代码在 find 活动分区失败时,也要执行一个扇区,这个扇区就是 MBR。这样就成无限循环了:反复执行 MBR,反复找不到活动分区。这应该也是一个 bug。

确实有可能存在没有活动分区的情况。在纯粹 Linux 环境下(当用户没有安装微软的操作系统时),这就有可能不存在活动分区了。




言归正传。当存在活动分区,并且活动分区的 PBR 导致死机时,执行 +1 就是执行这个 PBR,此时必然死机。

可以改进一下,仅当活动分区中存在 bootmgr 或 ntldr 时,才启动它。

改进后的代码如下(未经测试),供 chenall 研究。改进的要点是,避免执行“+1”这个容易引起失败的引导扇区代码。

  1. title 1. Windows
  2. find --set-root --active /bootmgr
  3. /bootmgr
  4. find --set-root --active /ntldr
  5. /ntldr
  6. find --set-root /bootmgr
  7. /bootmgr
  8. find --set-root /ntldr
  9. /ntldr
复制代码


下面这个是不是更好?请 chenall 确认一下:

  1. title 1. DOS/Windows
  2. find --set-root --active /bootmgr /bootmgr
  3. find --set-root --active /ntldr /ntldr
  4. find --set-root --active /io.sys /io.sys
  5. find --set-root /bootmgr /bootmgr
  6. find --set-root /ntldr /ntldr
  7. find --set-root /io.sys /io.sys
复制代码


另外,再增加一个进入 command line 的菜单项:

  1. title 6. Command Line
  2. exit
复制代码


其好处是,可以提醒那些不太了解 Wee 的用户,此时可以进入命令行,来对付那些启动失败的情况。

这是“用户友好”的。其实也是个善意的广告,让用户知道此时有命令行可以进入。

评分

参与人数 1无忧币 +5 收起 理由
天使的魔翼 + 5 解决了大问题,

查看全部评分

54#
发表于 2019-10-24 06:21:48 | 只看该作者
本帖最后由 hilsonma 于 2019-10-30 06:01 编辑

wee63.mbr 建议使用 求道者 编译的版本 http://bbs.wuyou.net/forum.php?m ... page%3D1&page=3 (在28楼)
回复

使用道具 举报

53#
发表于 2019-10-24 06:20:50 | 只看该作者
https://github.com/chenall/grubu ... ee/preset_menu_used

find --set-root /boot/grub/grldr
/boot/grub/grldr
timeout 1
default 0

title 1. DOS/Windows
    find --set-root --active /boot/BCD /bootmgr
    find --set-root --active /boot.ini /ntldr
    find --set-root --active /command.com /io.sys
    find --set-root --active /command.com /kernel.sys
    find --set-root /boot/BCD /bootmgr
    find --set-root /boot.ini /ntldr
    find --set-root /command.com /io.sys
    find --set-root /command.com /kernel.sys

title 2. GRUB4DOS
    find --set-root /boot/grub/grldr /boot/grub/grldr
    find --set-root /boot/grub.exe /boot/grub.exe
    find --set-root /boot/grldr /boot/grldr
    find --set-root /grldr /grldr

title 3. Plop Boot Manager
    find --set-root /boot/grub/plpbt.bin /boot/grub/plpbt.bin

title 4. Vboot
    find --set-root /vbootldr /vbootldr

title 5. Burg
    find --set-root /buldr /buldr

title 6. Previous MBR
    (hd0)1+1

title 7. Command Line
    exit
回复

使用道具 举报

52#
发表于 2016-3-18 11:57:49 | 只看该作者
不点真仔细啊。。。敬佩。。。
回复

使用道具 举报

51#
 楼主| 发表于 2016-2-2 19:01:02 | 只看该作者
freesoft00 发表于 2016-2-2 15:21
好的,谢谢!
主要是用wee少,有时候用一下grub,看到不点说在硬盘上用wee更好,所以想以后如果在硬盘上 ...

最难支持的是 vmlinuz ,所花费的代码最多。其它格式的支持都很简单,与 vmlinuz 相比可以忽略不计。

并未特别去支持 vbootldr。它很可能就是 ntldr 格式,既然 wee 支持 ntldr,也就支持了 vbootldr。

回复

使用道具 举报

50#
发表于 2016-2-2 15:21:20 | 只看该作者
不点 发表于 2016-2-2 11:04
启动一个标准的 55 AA 引导扇区,是基本功能,当然不能没有。

grldr、ntldr、bootmgr、io.sys、vmlinu ...

好的,谢谢!
主要是用wee少,有时候用一下grub,看到不点说在硬盘上用wee更好,所以想以后如果在硬盘上用转到wee算了,想尝试一下。
另外,
title 4. Vboot
find --set-root /vbootldr /vbootldr
这个是支持那个vhd版区的vboot功能吗?是否占用wee代码多,如果多,个人感觉去掉支持它也可以,启动vhd系统,win7以后支持,只是想xp用的时候使用这个vboot,但是xp已经淘汰了,而且vboot也收费的。不如去掉支持,减少些wee代码大小,如果不占用什么留着也可以。不知道其他人用不用vboot,我是没有使用过。

点评

最难支持的是 vmlinuz ,所花费的代码最多。其它格式的支持都很简单,与 vmlinuz 相比可以忽略不计。 并未特别去支持 vbootldr。它很可能就是 ntldr 格式,既然 wee 支持 ntldr,也就支持了 vbootldr。  详情 回复 发表于 2016-2-2 19:01
回复

使用道具 举报

49#
 楼主| 发表于 2016-2-2 11:04:19 | 只看该作者
freesoft00 发表于 2016-2-2 10:12
wee有启动扇区备份文件的功能没有。比如磁盘的1扇区备份出来,wee启动它。

启动一个标准的 55 AA 引导扇区,是基本功能,当然不能没有。

grldr、ntldr、bootmgr、io.sys、vmlinuz 等等很多复杂格式都能在 wee 下识别,更不用说单扇区的简单格式了。

看看里面的 readme,就了解大致用法了。

点评

好的,谢谢! 主要是用wee少,有时候用一下grub,看到不点说在硬盘上用wee更好,所以想以后如果在硬盘上用转到wee算了,想尝试一下。 另外, title 4. Vboot find --set-root /vbootldr /vbootldr 这个是支持那  详情 回复 发表于 2016-2-2 15:21
回复

使用道具 举报

48#
发表于 2016-2-2 10:12:15 | 只看该作者
wee有启动扇区备份文件的功能没有。比如磁盘的1扇区备份出来,wee启动它。

点评

启动一个标准的 55 AA 引导扇区,是基本功能,当然不能没有。 grldr、ntldr、bootmgr、io.sys、vmlinuz 等等很多复杂格式都能在 wee 下识别,更不用说单扇区的简单格式了。 看看里面的 readme,就了解大致用法  详情 回复 发表于 2016-2-2 11:04
回复

使用道具 举报

47#
发表于 2016-1-31 20:15:29 | 只看该作者

gpt+mbr双硬盘启动该wee的情况,测试正常。
回复

使用道具 举报

46#
发表于 2016-1-31 12:48:04 | 只看该作者
下载测试gpt分区单硬盘,启动正常。谢谢!

晚上回家再测试一下gpt+mbr双硬盘启动情况。
回复

使用道具 举报

45#
发表于 2016-1-31 12:23:45 | 只看该作者
附件传到这里

wee63.zip

19.52 KB, 下载次数: 37

点评

gpt+mbr双硬盘启动该wee的情况,测试正常。  详情 回复 发表于 2016-1-31 20:15
回复

使用道具 举报

44#
发表于 2016-1-31 11:43:42 | 只看该作者
chenall 发表于 2016-1-31 10:09
看了相关的代码发现这些是没有用处的,直接注释掉了

新的版本上传在这里

下载不了,能否上传一份到其他地方,谢谢!
回复

使用道具 举报

43#
 楼主| 发表于 2016-1-31 10:43:09 | 只看该作者
chenall 发表于 2016-1-31 10:09
看了相关的代码发现这些是没有用处的,直接注释掉了

新的版本上传在这里

preset_menu_used 中的一些文件名和路径,是大写字母,是我的疏忽,应该统一采用小写字母。

这个菜单本来只考虑了 mbr 的情况,不知道是否适用于 gpt 的情况,你可以仔细研究,加以改进完善。


weesetup 里面的 menu.wee 依旧是几年前的版本,需要更新。

回复

使用道具 举报

42#
发表于 2016-1-31 10:09:25 | 只看该作者
看了相关的代码发现这些是没有用处的,直接注释掉了

新的版本上传在这里
https://github.com/chenall/grubutils/releases/tag/2016-01-31

点评

下载不了,能否上传一份到其他地方,谢谢!  详情 回复 发表于 2016-1-31 11:43
preset_menu_used 中的一些文件名和路径,是大写字母,是我的疏忽,应该统一采用小写字母。 这个菜单本来只考虑了 mbr 的情况,不知道是否适用于 gpt 的情况,你可以仔细研究,加以改进完善。 weesetup 里面  详情 回复 发表于 2016-1-31 10:43
回复

使用道具 举报

41#
 楼主| 发表于 2016-1-30 17:17:53 | 只看该作者
chenall 发表于 2016-1-30 16:52
把这一行注释掉目前看起来正常..

这些代码是我加的吗?太久了没什么印像了,没有注释现在也想不起来为什么 ...

关键是得把原来的代码找回来,才能比较。否则的话,那就只有摸着石头过河了。

我反正好长时间没有接触了,对此已经没有印象。

一切都得靠你自己调试了。

回复

使用道具 举报

40#
发表于 2016-1-30 16:52:46 | 只看该作者
本帖最后由 chenall 于 2016-1-31 12:24 编辑

把这一行注释掉目前看起来正常..

这些代码是我加的吗?太久了没什么印像了,没有注释现在也想不起来为什么当时要这一行了.

EDIT: 另外看了前后的代码,感觉以下好像是多余的??


  1.         cmpl        $0xff, ABS(EXT_C(current_slice))
  2.         je        100f
  3.         movl        $0xFF, ABS(EXT_C(current_slice))
复制代码

点评

关键是得把原来的代码找回来,才能比较。否则的话,那就只有摸着石头过河了。 我反正好长时间没有接触了,对此已经没有印象。 一切都得靠你自己调试了。  详情 回复 发表于 2016-1-30 17:17
回复

使用道具 举报

39#
 楼主| 发表于 2016-1-30 16:31:25 | 只看该作者
chenall 发表于 2016-1-30 14:33
就是只要root hd1 再root hd0切换一下就不行了.
  1.         cmpl        $0xff, ABS(EXT_C(current_slice))
  2.         je        100f
  3.         movl        $0xFF, ABS(EXT_C(current_slice))
  4.         cmpb        $0xee, 4(%esi)
  5.         jne        100f
复制代码

看了 list partitions 函数的代码,但无法准确地确定哪些是你改动的。

仅凭直觉,以及纯代码方面的逻辑关系,感觉上述代码可能有问题。

当 current slice 被设定为 0xff 即 -1 后,第一个 cmp 的结果将总是: 相等,

于是总是跳转到 100 标号的 mbr 老代码去执行,不再执行 gpt 代码。

我不确定我是否看准了。只是模模糊糊的,仅供参考。

回复

使用道具 举报

38#
发表于 2016-1-30 14:33:38 | 只看该作者
不点 发表于 2016-1-30 14:13
有没有试试,不执行 find 命令,是否一切正常?

试试手动执行 root 命令切换到 hd1,然后再用 root 命 ...


就是只要root hd1 再root hd0切换一下就不行了.

点评

看了 list partitions 函数的代码,但无法准确地确定哪些是你改动的。 仅凭直觉,以及纯代码方面的逻辑关系,感觉上述代码可能有问题。 当 current slice 被设定为 0xff 即 -1 后,第一个 cmp 的结果将总是  详情 回复 发表于 2016-1-30 16:31
回复

使用道具 举报

37#
 楼主| 发表于 2016-1-30 14:13:40 | 只看该作者
chenall 发表于 2016-1-30 13:37
我试了一下,测试是双硬盘其中一个是GPT分区,一个是MBR的

启动WEE63直接进入按C键进入命令行

有没有试试,不执行 find 命令,是否一切正常?

试试手动执行 root 命令切换到 hd1,然后再用 root 命令切换回到 hd0,这样 gpt 是否也会乱掉了?

测试的目的,暴露问题,缩小范围。

点评

就是只要root (hd1) 再root (hd0)切换一下就不行了.  详情 回复 发表于 2016-1-30 14:33
回复

使用道具 举报

36#
发表于 2016-1-30 13:37:29 | 只看该作者
不点 发表于 2016-1-29 22:58
帮不上你。等着 chenall 处理吧。

我试了一下,测试是双硬盘其中一个是GPT分区,一个是MBR的

启动WEE63直接进入按C键进入命令行

测试访问GPT分区正常,再执行find命令

再次访问GPT磁盘出现异常了,被识别为MBR分区了.

我看了代码没有找到原因,通过HEXDUMP查看0x3e8000可以看到分区表不对.
看0x3e9000是0扇区的内容(正常情况下应该是GPT的分区表内容).

也不知是哪里错了,

如果是单单一个GPT硬盘没发现问题..


点评

有没有试试,不执行 find 命令,是否一切正常? 试试手动执行 root 命令切换到 hd1,然后再用 root 命令切换回到 hd0,这样 gpt 是否也会乱掉了? 测试的目的,暴露问题,缩小范围。  详情 回复 发表于 2016-1-30 14:13
回复

使用道具 举报

35#
发表于 2016-1-29 23:08:28 | 只看该作者
本帖最后由 qj_tzy 于 2016-1-29 23:10 编辑
不点 发表于 2016-1-29 22:58
帮不上你。等着 chenall 处理吧。


您的回复,让我明白了一些东西,非常感谢!

同时,也非常希望 chenall 能出手解决这一问题。
回复

使用道具 举报

34#
 楼主| 发表于 2016-1-29 22:58:46 | 只看该作者
qj_tzy 发表于 2016-1-29 22:39
1.确定显示的分区是ESP分区,用bootice显示的起始扇区号和分区总扇区数(用winhex显示的两分区的起始位 ...

帮不上你。等着 chenall 处理吧。

点评

我试了一下,测试是双硬盘其中一个是GPT分区,一个是MBR的 启动WEE63直接进入按C键进入命令行 测试访问GPT分区正常,再执行find命令 再次访问GPT磁盘出现异常了,被识别为MBR分区了. 我看了代码没有找到原因  详情 回复 发表于 2016-1-30 13:37
您的回复,让我明白了一些东西,非常感谢!  详情 回复 发表于 2016-1-29 23:08
回复

使用道具 举报

33#
发表于 2016-1-29 22:39:07 | 只看该作者
本帖最后由 qj_tzy 于 2016-1-29 23:07 编辑
不点 发表于 2016-1-29 21:20
你调试得很好。你确定 root 命令显示的分区是 esp 分区吗?它的起始扇区号和分区总扇区数都显示得正确吗 ...


1.确定显示的分区是ESP分区,用bootice显示的起始扇区号和分区总扇区数(用winhex显示的两分区的起始位置相减与此扇数总数相等 )应该是正确的,因总扇区数*512/1024/1024/1024,与显示的分区容量相同。

2.我把g4d移动到(hd0,1)分区测试:root (hd0,1)无错误提示,但运行/g4d/grldr,出现wee 17 >

点评

帮不上你。等着 chenall 处理吧。  详情 回复 发表于 2016-1-29 22:58
回复

使用道具 举报

32#
 楼主| 发表于 2016-1-29 21:20:34 | 只看该作者
qj_tzy 发表于 2016-1-29 20:11
刚才,进入wee命令行进行了测试:
用root (hd0,0)命令,出现unknown的提示,该分区是esp分区,看来要对w ...

你调试得很好。你确定 root 命令显示的分区是 esp 分区吗?它的起始扇区号和分区总扇区数都显示得正确吗?

如果都正确,那就说明是 wee 的 bug,即,wee 无法识别这个分区的文件系统。那就只好让 chenall 来修复 bug 了。

如果显示的分区起始扇区号和分区长度不正确,那说明 (hd0,0) 不一定是 ESP 分区,你可以再试试 (hd0,1) 、(hd0,2) 等等。

点评

1.确定显示的分区是ESP分区,用bootice显示的起始扇区号和分区总扇区数(用winhex显示的两分区的起始位置相减与此扇数总数相等 )应该是正确的,因总扇区数*512/1024/1024/1024,与显示的容量相同。 2.我把g4d移  详情 回复 发表于 2016-1-29 22:39
回复

使用道具 举报

31#
发表于 2016-1-29 20:11:05 | 只看该作者
不点 发表于 2016-1-29 18:04
我再解释一下如下菜单的执行细节:

find --set-root /g4d/pwins

刚才,进入wee命令行进行了测试:
用root (hd0,0)命令,出现unknown的提示,该分区是esp分区,看来要对wee修正后才能较好地支持gpt分区硬盘。

点评

你调试得很好。你确定 root 命令显示的分区是 esp 分区吗?它的起始扇区号和分区总扇区数都显示得正确吗? 如果都正确,那就说明是 wee 的 bug,即,wee 无法识别这个分区的文件系统。那就只好让 chenall 来修复  详情 回复 发表于 2016-1-29 21:20
回复

使用道具 举报

30#
发表于 2016-1-29 19:02:36 | 只看该作者
不点 发表于 2016-1-29 18:04
我再解释一下如下菜单的执行细节:

find --set-root /g4d/pwins


非常谢谢您的祥细指点!

我的硬盘为500G,为GPT分区结构,分为ESP分区、NTFS(win7)分区、NTFS(winxp)、NTFS(数据分区1)、NTFS(数据分区2)。g4d的文件全部存放在esp分区中。

等会空了,再按您说的方法看看,到时再报告。
回复

使用道具 举报

29#
 楼主| 发表于 2016-1-29 18:04:50 | 只看该作者
本帖最后由 不点 于 2016-1-29 18:09 编辑

我再解释一下如下菜单的执行细节:

find --set-root /g4d/pwins

如果由于某种原因,find 命令失败,则此时 root 分区仍旧是 (hd0) 或 等价的 (hd0,-1),也等价于 (hd0,255),它们都代表 “全盘”,而不是某个分区的 Volume 卷。

wee 上的 find 命令也有可能在 GPT 上出现 bug。

wee 的用户毕竟没有 grub4dos 用户多,因此,其 find 命令出现 bug 的几率要比 grub4dos 的大。

timeout 10
default 0
title
title                   ** Wee Menu **
title -----------------------------------------------
title 0.Search Boot Partition Windows nt6/nt5 System
command /g4d/pwins

这条命令是执行当前 root 分区下的文件 pwins。但如果当前分区是 “全盘” (hd0),则显然无法找到文件,因为文件可能是在 (hd0,0) 里面。

出错后,会继续显示菜单。下同。

title 1.Boot windows 8 PE
command /g4d/gw8pe
title 3.grub4dos menu
command /g4d/grldr

点评

刚才,进入wee命令行进行了测试: 用root (hd0,0)命令,出现unknown的提示,该分区是esp分区,看来要对wee修正后才能较好地支持gpt分区硬盘。  详情 回复 发表于 2016-1-29 20:11
非常谢谢您的祥细指点! 我的硬盘为500G,为GPT分区结构,分为ESP分区、NTFS(win7)分区、NTFS(winxp)、NTFS(数据分区1)、NTFS(数据分区2)。 等会空了,再按您说的方法看看,到时再报告。  详情 回复 发表于 2016-1-29 19:02
回复

使用道具 举报

28#
 楼主| 发表于 2016-1-29 17:18:06 | 只看该作者
本帖最后由 不点 于 2016-1-29 17:42 编辑
qj_tzy 发表于 2016-1-29 16:28
按C进入命令行后
执行find --set-root /g4d/grldr,出现wee 15 >
执行/g4d/grldr,出现wee 17 >

15 号错误是 ERR_FILE_NOT_FOUND,即找不到文件
17 号错误是 ERR_FSYS_MOUNT,即 文件系统挂载出错,无法挂载文件系统。

这需要你自己确定是什么原因了。

你可以在 wee 命令行下用 tab 键来自动补全,看看究竟是什么情况。

你也可以执行 root 命令,看看当前设备是什么。比如,究竟是 (hd0),还是 (hd0,0)?

如果 root 是 (hd0) 或 (hd0,-1),那么,这就代表整个磁盘(含分区表的整个磁盘),而不是代表某个分区(例如 (hd0,0)),因此,你无法挂上文件系统。

你可以试着执行 root (hd0,0) 之类的命令,然后再尝试挂载文件系统。



总之,出错之后,要在命令行调试和观察,了解更多信息,这样才容易判断其根源。


补充:

能否报告一下你的分区布局?各个分区的大小?有可能你要访问的分区已经超出 BIOS 的访问能力了。

回复

使用道具 举报

27#
 楼主| 发表于 2016-1-29 16:29:32 | 只看该作者
chenall 发表于 2016-1-29 16:24
所有我让它报告一下错误代码是什么.

是的,进入命令行测试很重要。

用户应该明白 128G 之后的扇区都有可能无法访问。这应该是个基本知识了,印在脑子里。即使不碰到失败,也应该牢记这一点。更不用说,碰到了失败之后,还不能意识到这一点,那就该打 PP 了。(开个玩笑)。
回复

使用道具 举报

26#
发表于 2016-1-29 16:28:45 | 只看该作者
chenall 发表于 2016-1-29 14:56
bootice里面的WEE63.mbr就最版的.

最新版本只是修改了内置菜单内容,需要的自己改一下菜单就行了.

按C进入命令行后
执行find --set-root /g4d/grldr,出现wee 15 >
执行/g4d/grldr,出现wee 17 >

点评

15 号错误是 ERR_FILE_NOT_FOUND,即找不到文件 17 号错误是 ERR_FSYS_MOUNT,即 文件系统挂载出错,无法挂载文件系统。 这需要你自己确定是什么原因了。 你可以在 wee 命令行下用 tab 键来自动补全,看看究  详情 回复 发表于 2016-1-29 17:18
回复

使用道具 举报

25#
发表于 2016-1-29 16:24:59 | 只看该作者
不点 发表于 2016-1-29 16:06
看来是你增强了 wee,让它支持 GPT,我确实不曾注意到。

我原来的 asm 代码里面,从来没有支持 GPT  ...

所有我让它报告一下错误代码是什么.

点评

是的,进入命令行测试很重要。 用户应该明白 128G 之后的扇区都有可能无法访问。这应该是个基本知识了,印在脑子里。即使不碰到失败,也应该牢记这一点。更不用说,碰到了失败之后,还不能意识到这一点,那就该打  详情 回复 发表于 2016-1-29 16:29
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-26 19:32

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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