longpanda
发表于 2020-11-5 12:21:08
本帖最后由 longpanda 于 2020-11-5 13:48 编辑
关于 UEFI 下 map ISO 之后 和 系统中的光驱冲突的问题。Ventoy 使用了下面的方法,放在这里仅供楼主参考。
在启动之前 hook 系统BootService中的 LocateHandle 接口,在这个接口中,对于获取 BlockIO Handle的情况,把前面 map ISO时生成的那个 handle 排到第一位貌似就可以骗过 bootmgr.efi。
代码在https://github.com/ventoy/Ventoy ... toyProtocol.c#L1218
在虚拟机环境下测试没问题。 实际机器的话,收到过1个网友的反馈,U盘有量产CDROM的情况下测试OK了。但没有更多的测试反馈。
江南一根葱
发表于 2020-11-5 13:03:26
wuwuzz 发表于 2020-11-5 11:24
呃,量产那是固件范畴,是另外一个庞大的话题,就是因为它,我的知识结构、对事情的看法
才脱胎换骨,不 ...
我指的是量产出的cdrom并不能营造真实USB光驱环境
还是有区别的
wuwuzz
发表于 2020-11-5 13:14:08
江南一根葱 发表于 2020-11-5 13:03
我指的是量产出的cdrom并不能营造真实USB光驱环境
还是有区别的
对USB光驱启动而言,没区别,或者说,足够了。BIOS/UEFI并无特别的方法去区分两者物理上的不同,就是按规范发固件命令,命令结果一样,BIOS/UEFI就认为两者一样。
wintoflash
发表于 2020-11-5 13:23:00
wuwuzz 发表于 2020-11-5 10:47
哈,原因很简单,巧合。要不是L版你,事情还进展不到测试map -x呢,
我之前压根就不知道新增了这个选项。
...
又试了下,ventoy 的 hook LocateHandle 的方法可行。
我昨天可能是喝多了。
yizhen
发表于 2020-11-5 13:23:28
我刚初学,请教各位大佬前辈,怎么启动启动 bootmgfw.efi 文件,然后启动装好的系统,谢谢呀
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
没反应呢
liuzhaoyzz
发表于 2020-11-5 14:38:27
wuwuzz 发表于 2020-11-5 10:47
哈,原因很简单,巧合。要不是L版你,事情还进展不到测试map -x呢,
我之前压根就不知道新增了这个选项。
...
哦,原来是这样子的。但是改造iso解决的办法,不是根本解决问题之道。还是从引导器层面解决更好,不然还要规避这样子的问题,比如就有人有真实光驱。
2011yaya2007777
发表于 2020-11-5 15:02:58
本帖最后由 2011yaya2007777 于 2020-11-5 15:04 编辑
CD+DISK,光驱在前时,DISK上的g4d不能顺利启动到menu,直接进入g4d shell状态,原因不明。
菜单在光盘上,还是在引导软盘镜像上?应当在光盘上。
一、当机器本身就有PE光盘(SATA或USB光驱,均使用MS的boot*.efi),此时,g4d再map U盘上
的其他PE ISO, map可以成功,但chainloader是失败的
麻烦你再试一试这个。
先在命令行执行:
debug 3
root
find
然后再 map ......
不用改造PE ISO,使用mkisofs重做。
liuzhaoyzz
发表于 2020-11-5 15:46:09
2011yaya2007777 发表于 2020-11-5 15:02
菜单在光盘上,还是在引导软盘镜像上?应当在光盘上。
麻烦你再试一试这个。
怎么这个版本,连普通的pe.iso都启动不了了?
hilsonma
发表于 2020-11-5 16:03:45
我也是遇到同样的问题
2011yaya2007777
发表于 2020-11-5 16:33:06
我实机测试正常。请增加 debug 3测试后截图。
liuzhaoyzz
发表于 2020-11-5 16:47:49
本帖最后由 liuzhaoyzz 于 2020-11-5 16:51 编辑
2011yaya2007777 发表于 2020-11-5 16:33
我实机测试正常。请增加 debug 3测试后截图。
忘了上图了。虚拟机只有一个GPT分区的虚拟硬盘,(hd0,0)是ESP分区,(hd0,1)是第二个NTFS主分区。(0xa0)应该是挂载了WEPE.ISO的光驱。
2011yaya2007777
发表于 2020-11-5 17:04:32
本帖最后由 2011yaya2007777 于 2020-11-5 17:05 编辑
你的光盘启动镜像是硬盘模式?怎么那么大,一个是 0x18d2d, 一个是 0x36b0b 扇区?
按光盘规范,视乎尺寸只有 2 字节。
wuwuzz
发表于 2020-11-5 19:07:44
本帖最后由 wuwuzz 于 2020-11-5 19:31 编辑
抱歉,下午单位组织学习,未及时看到帖子回复。
@2011yaya2007777
1、菜单在磁盘上。U盘量产后,相当于是变成2个物理设备,第1设备是光驱,放win10PE;
第2设备是磁驱,放g4d(含菜单),也放了其他供测试用的ISO。G4D for UEFI如何做光盘启动,
我还不会,所以菜单是放在磁盘上的。
2、新版G4D测试结果如下:
图1是真实的外置USB光驱、SATA光驱均存在的环境中,U盘MAP的情况。(此U盘未量产,是单独的磁驱)
图2是构造了更复杂的环境,除了上面的光驱环境,又增加了量产USBCD,然后U盘DISK部分MAP的情景。
wuwuzz
发表于 2020-11-5 19:13:41
@wintoflash
新增的map -f选项有效,能够成功将U盘上的ISO与其他光驱ISO区分开。
示例图是有意构造的复杂干扰环境:
USB光驱+SATA光驱+量产光驱都存在的条件下,U盘DISK部分MAP时的情况。
liuzhaoyzz
发表于 2020-11-5 19:52:02
2011yaya2007777 发表于 2020-11-5 17:04
你的光盘启动镜像是硬盘模式?怎么那么大,一个是 0x18d2d, 一个是 0x36b0b 扇区?
按光盘规范,视乎尺寸 ...
虚拟机里面挂载的光驱是微PE2.0X64,196MB。还有个仿真出来的光盘是438MB。
其他的我不懂
2011yaya2007777
发表于 2020-11-5 20:02:37
这个PE2.0X64比较小,如果不能启动这个盘,可否压缩发上来?
wuwuzz
发表于 2020-11-5 20:10:59
2011yaya2007777 发表于 2020-11-5 20:02
这个PE2.0X64比较小,如果不能启动这个盘,可否压缩发上来?
似乎不同的ISO,都不能启动,出错信息也都一样:boot_image_handle not found
参考图见#226
2011yaya2007777
发表于 2020-11-5 20:17:25
那发一个不能启动的光盘镜像,把里面与启动无关的文件删除,以便缩小体积。
wuwuzz
发表于 2020-11-5 20:34:17
上传1个测试ISO
liuzhaoyzz
发表于 2020-11-5 20:54:37
2011yaya2007777 发表于 2020-11-5 20:02
这个PE2.0X64比较小,如果不能启动这个盘,可否压缩发上来?
https://cloud.189.cn/t/6VvmQvV3EFvy
微PE2.0
在虚拟机里面随便挂载一个PE都可以测试啊。
本地硬盘设置优先引导PE1.ISO,虚拟机里面挂载另一个wepe2.0.iso,就能重现问题。
2011yaya2007777
发表于 2020-11-5 21:15:46
问题找到了。是启动光盘制作不规范。请问,是所以什么软件制作的?
2011yaya2007777
发表于 2020-11-5 21:50:13
想当年,不点耗费大量的时间和精力排除bug,而这些bug好大一部分是由于不符合规范引起的。当年主要是对付U盘,int13/8返回的chs值不正确。而是一些小软件制作的光盘,软盘镜像不规范。MBR有个活动分区标志,就是不设置。文件系统表示不为0,偏要设置为0。等等数不胜数。
wintoflash
发表于 2020-11-5 21:52:41
2011yaya2007777 发表于 2020-11-5 21:50
想当年,不点耗费大量的时间和精力排除bug,而这些bug好大一部分是由于不符合规范引起的。当年主要是对付U ...
uefi启动的光盘就没几个是规范的。特别操蛋。
wuwuzz
发表于 2020-11-5 22:13:09
原始ISO是从网上找的,制作软件未知。
删除不必要文件缩小体积、再保存时,用的ultraISO。
austere
发表于 2020-11-5 22:50:18
看到很多大神出来冒泡,兴奋啊~ 期待继续完善了~
liuzhaoyzz
发表于 2020-11-6 11:59:21
2011yaya2007777 发表于 2020-11-5 21:15
问题找到了。是启动光盘制作不规范。请问,是所以什么软件制作的?
不知道微PE打包ISO用的是什么软件。
liuzhaoyzz
发表于 2020-11-6 13:29:54
yizhen 发表于 2020-11-5 13:23
我刚初学,请教各位大佬前辈,怎么启动启动 bootmgfw.efi 文件,然后启动装好的系统,谢谢呀
chainloader...
title /EFI/Microsoft/Boot/bootmgfw.efi
find --set-root /EFI/Microsoft/Boot/bootmgfw.efi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
sunsea
发表于 2020-11-6 15:48:58
本帖最后由 sunsea 于 2020-11-6 15:51 编辑
做个了个小测试,在2016 LTSB的内核环境里成功读到了UEFI变量。
读了一下PlatformLangCodes这个UEFI Spec中规定的Globally Defined Variables。
只要命名空间的GUID明确而且有EFI_VARIABLE_RUNTIME_ACCESS 这个属性应该都可以读到,我是觉得可能map的时候设置一下EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,这两个属性都要比较好。
下一步就是看看SVBus处理磁盘映射的时候读了什么信息然后做针对性修改了。
parsons
发表于 2020-11-6 15:59:39
前来围观 前景看好
2011yaya2007777
发表于 2020-11-6 16:04:36
本帖最后由 2011yaya2007777 于 2020-11-6 16:08 编辑
上传1个测试ISO
麻烦你在简单的,复杂的环境测试一下,我这里可以从众多 cdrom 中选择任意一个引导。
现在除了可以启动 map 的虚拟盘,也可以启动实体盘了。
比如已经有了 cd0:
map /a.iso (cd1)
chainloader (cd0)或者 chainloader (cd1)
boot
另外,增加了一个函数 exit_image,退回引导管理器,或者父 uefi image。