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。

页: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17
查看完整版本: GRUB4DOS for UEFI