Ventoy 运行时参数如何传递给操作系统
- Legacy BIOS 模式
在Legacy BIOS模式下,Ventoy把参数保存在最开始的1M物理内存内,具体物理地址范围是 0x80000~0xA0000
对于 Linux 系统, 我们可以利用 /dev/mem, dump出范围内的内存数据,然后以GUID去搜索从而找到参数的位置
对于 Windows 系统,我们可以利用 GetSystemFirmwareTable 接口获取数据然后再搜索具体位置。
- UEFI 模式
在UEFI模式下, Ventoy把参数保存在一个EFI Variable中,其名称和GUID如下:
VentoyOsParam { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }}
对于 Linux 系统, 我们可以从 /sys/firmware/efi/vars 或者 /sys/firmware/efi/efivars 中获取数据
对于 Windows 系统,我们可以使用 GetFirmwareEnvironmentVariable 接口。
- 具体细节
关于Window/WinPE/Linux系统启动之后具体如何获取相关信息,详细的技术细节通过文字描述不太方便,
我已经把详细的代码都放在了下面的链接位置。对于系统集成者,有两种方式:
1、直接集成我编译好的vtoydump文件,在系统下调用一下就可以打印出相关信息。
2、如果你不想直接拿编译好的文件,你可以把相关代码集成到自己的工程中调用。
说明:
1、相关代码和预编译好的文件位置:https://github.com/ventoy/vtoydump
2、这个工具是纯用户态程序,不需要配套内核驱动支持,但是Windows UEFI模式下需要提权限。
3、这个工具里面除了获取启动信息之外还集成了挂载ISO文件的功能,如果你不需要这部分功能,可以只提取里面获取信息的几个函数即可。
Windows Legacy BIOS 模式下获取的函数是:vtoy_os_param_from_ibft
Windows UEFI 模式下获取的函数是:vtoy_os_param_from_efivar
4、注意要在确保硬件都初始化完成以后再获取信息,并增加多次retry,否则可能会出现硬件还没有初始化好,找不到对应磁盘的情况。
5、注意调试的时候,一定要先把ISO文件标记为 Ventoy Compatible 的,这样启动后才能获取到信息,否则获取不到。
标记的方法请参考:ISO文件如何标记自己是 Ventoy Compatible 的
- 关于Windows UEFI模式提权
UEFI模式下为了能通过 GetFirmwareEnvironmentVariable 接口获取相关信息,需要:
1、提权,使用管理员权限;
2、使用 WinAPI 函数 RtlAdjustPrivilege 再度提权,获得可读取 EFI Variable 信息的权限;