|
|
问题提出:
在帖子《SISO-Legacy BIOS-Grub4dos-grldr使用心得与分享》中,2010XwX提到有的G4D版本无法加载启动金狐的 win2003PE.iso。
问题重现:
通过G4D启动U盘,然后在菜单中启动WIN2003PE.ISO。
ISO使用另一个版本的G4D作为启动文件(它内置菜单及小中文字库,并且压缩),启动uqi2003pe.gz软盘镜象。
问题分析:
G4D代码好久没有关注了,生疏了,尤其是汇编代码,理解费事,调试也费事。
折腾好久,终于搞清楚问题的起因。
第一个G4D启动后,如果有磁盘仿真,会在BIOS挂载G4D的int13驱动。
第二个G4D启动后,会在BIOS探测是否挂载了G4D的int13驱动。
如果挂载了G4D的int13驱动,则从BIOS复制其头部信息到第二个G4D的int13驱动头部,覆盖原来的内容。
这些信息包含int13中断及int15中断原始入口,第一个G4D的磁盘仿真数据。
问题的产生就在于此。这些被覆盖的内容,包含int13中的的3字节跳转指令。
不同版本的G4D,这个跳转长度可能不同,也就是跳转指令可能不同。
如果第二个G4D的int13中的跳转指令被覆盖,则会跳转到错误地址,产生莫名其妙的问题。
问题修正:
grub4dos-0.4.6a-2026-01-13版本已经修正。
新版兼容性:
1. 新版G4D作为第二个G4D启动,兼容任意版本的第一个G4D启动。
2. 新版G4D作为第一个G4D启动,兼容第二个G4D启动范围:grub4dos-0.4.6a-2021-11-19及以前版本。
3. 如果将grub4dos-0.4.6a-2025-11-25版本作为第一个G4D启动,则兼容第二个G4D启动范围:grub4dos-0.4.6a-2023-06-23及以后版本。
4. 如果第一与第二个G4D版本相同,则无兼容问题。
5. 可以通过G4D->grub2(或者Ventoy.VHD)->G4D的方式启动,是比较麻烦一点。
其原理是grub2启动第二个G4D时,破坏了第一个G4D在BIOS挂载G4D的int13驱动,因此第二个G4D探测不到BIOS挂载的G4D驱动。
查看G4D版本:
1. 通过文件管理器查看grldr(或者grub.exe)日期。
2. 有些grldr存放在隐藏分区,或者是作为ISO的启动文件,通过文件管理器看不到。
当出现菜单时按'c'键进入命令行,查看屏幕顶部信息,然后按'ESC'键返回菜单。
修改G4D方法:
如果第二个G4D含有特殊菜单,则不能简单替换。
使用WinHex或者其他工具打开新旧G4D,从尾部找到 "B0 02 1A CE",再跳过12字节的00,就是菜单位置。
然后复制旧G4D的尾部菜单到新G4D的尾部菜单位置。
|
|