请问下有没有命令行工具添加UEFI引导序列?
本帖最后由 liuzhaoyzz 于 2020-4-6 07:15 编辑请问下有没有命令行工具添加UEFI引导序列?
就是想要实现bootice里面的添加UEFI引导序列的功能。如图所示。bootice添加UEFI引导序列似乎不支持命令行吧?
linux下面似乎有个efibootmgr命令,这个命令有没有人移植到windows下面?GitHub - rhboot/efibootmgr: efibootmgr development tree https://github.com/rhboot/efibootmgr
2020.4.5日pauly大神编译了一个booticex64_1.4版本已经支持了。
详见27楼http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=418717&pid=4026764&fromuid=298214
bootice只能添加有存储的主板,有的主板没有存储,就只能修改,做不了添加,easyuefi可以。 win的efi引导是bios自动添加的,所以他的命令行对别的第三方efi添加即便有,估计也很差。 win一般就是直接bcdboot了 fjzjk 发表于 2020-2-2 00:06
win一般就是直接bcdboot了
可是bcdboot只能写入windows引导到UEFI-ROM中,其他的efi启动项不行啊,比如写入grub2x64.efi就不行,但bootice就可以,只是不支持命令行。 看看cywin有没有相关的工具。 efi shell
bcdf boot dump # 列出当前启动项
bcfg boot rm 1 # 删掉编号为 1 的启动项
bcfg boot mv 2 0 # 将编号为 2 的启动项移动到第一项
bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd" # 在 fs0 分区,添加如下路径启动项
win下bcdedit
对存储执行的命令
================================
/createstore 新建空的启动配置数据存储。
/export 将系统存储的内容导出到文件。以后可以使用该文件还原系统
存储的状态。
/import 使用 /export 命令创建的备份文件来还原系统存储的状态。
/sysstore 设置系统存储设备(仅影响 EFI 系统,在重新启动后不再有效,
且仅用于系统存储设备不确定的情况下)。
对存储中的项执行的命令
===========================================
/copy 复制存储中的项。
/create 在存储中新建项。
/delete 删除存储中的项。
/mirror 创建存储中项的镜像。
运行 bcdedit /? ID 可获得有关这些命令使用的标识符的信息。
对项选项执行的命令
======================================
/deletevalue 删除存储中的项选项。
/set 设置存储中的项选项值。
运行 bcdedit /? TYPES 可获得这些命令使用的数据类型的列表。
运行 bcdedit /? FORMATS 可获得有效数据格式的列表。
控制输出的命令
============================
/enum 列出存储中的项。
/v 命令行选项,完整显示项标识符,而不是使用已知标识符的名称。
单独使用命令 /v 可完整显示活动类型的项标识符。
单独运行 "bcdedit" 等同于运行 "bcdedit /enum ACTIVE"。
控制启动管理器的命令
======================================
/bootsequence 为启动管理器设置一次性启动序列。
/default 设置启动管理器将使用的默认项。
/displayorder 设置启动管理器显示多重引导菜单的顺序。
/timeout 设置启动管理器的超时值。
/toolsdisplayorder设置启动管理器显示工具菜单的顺序。
控制启动应用程序紧急管理服务的命令
==========================================================================
/bootems 启用或禁用启动应用程序的紧急管理服务。
/ems 启用或禁用操作系统项的紧急管理服务。
/emssettings 设置全局紧急管理服务参数。
控制调试的命令
==============================
/bootdebug 启用或禁用启动应用程序的启动调试。
/dbgsettings 设置全局调试程序参数。
/debug 启用或禁用操作系统项的内核调试。
/hypervisorsettings设置虚拟机监控程序的参数。
linux下
移除
sudo efibootmgr -b B
增加(sda7 -> sda -p 7)
efibootmgr -c -d /dev/sda -p 7 -L -l \EFI<lable>\grubx64.efi
设置激活
sudo efibootmgr -b -a
设置禁用
sudo efibootmgr -b -A
调整顺序
sudo efibootmgr -o
本帖最后由 liuzhaoyzz 于 2020-2-5 06:51 编辑
窄口牛 发表于 2020-2-4 17:26
efi shell
win下bcdedit
我想要的是windows(或PE)平台下添加修改UEFI引导序列的命令行工具,不是efi shell下的,也不是linux下的啊。 bcdboot或者bcdedit只能添加windows的引导,不能添加其他UEFI引导,比如grub2x64.efi。 本帖最后由 窄口牛 于 2020-2-4 19:33 编辑
可以呀,你把grub2的名字改成win的,放到微软的默认路径,这样bios就会自动添加了,命令执行这些很简单吧,改改文件夹名字,再改改文件名字就完成了。win10可以任意路径被grub2来chainload的,win7不可以,必须默认路径,可以给win7专门弄一个esp分区,这样就可以了。 本帖最后由 liuzhaoyzz 于 2020-2-5 07:53 编辑
窄口牛 发表于 2020-2-4 19:31
可以呀,你把grub2的名字改成win的,放到微软的默认路径,这样bios就会自动添加了,命令执行这些很简单吧, ...
把grub2x64.efi改名成为bootx64.efi放在efi\boot\不是我想要的结果,我想要的是新增一个UEFI引导序列与之并列,不要覆盖系统的,绕路解决的思路不是我想要的。
EasyUEFI命令行介绍太少,我没有深入研究,他太大了,似乎还要破解。
希望有大神能够写个基于windows API的小程序实现,或者有已经实现的小程序推荐下也好。 既然匿名者回答了,那估计确实是没有。我见csdn有efibootmgr的源码,不知道有没有用,高手们可以下来看看。 我来看看一 本帖最后由 liuzhaoyzz 于 2020-2-5 11:50 编辑
匿名者 发表于 2020-2-5 08:51
https://github.com/ju-funk/efibootwin
这个应该大概能满足你的要求。会c++的话自己再改一改应该就可以 ...
谢谢分享,晚点我研究下。(手机回复) 本帖最后由 liuzhaoyzz 于 2020-2-5 16:33 编辑
匿名者 发表于 2020-2-5 08:51
https://github.com/ju-funk/efibootwin
这个应该大概能满足你的要求。会c++的话自己再改一改应该就可以 ...
水平不够啊。参数里面我没看到怎么添加个启动项的readme啊。你能帮忙该写下吗?请帮忙做个静态编译。
再次顶下帖子,希望有大神们能够出手啊!
@匿名
@wintoflash
@pauly
@chenall
@yaya2007777
@......
艾特我没用。我不会。
求人不如求己。 wintoflash 发表于 2020-3-11 17:04
艾特我没用。我不会。
求人不如求己。
我只能用VC写个Hello world。。。 本帖最后由 liuzhaoyzz 于 2020-3-14 13:37 编辑
匿名者 发表于 2020-2-5 08:51
https://github.com/ju-funk/efibootwin
这个应该大概能满足你的要求。会c++的话自己再改一改应该就可以 ...
他这个工程是VC2015的项目,我电脑现有的只有VC2010绿色便携版,尝试用VC2010打开并编译,提示VisualStudioVersion什么的错误,按照网上的办法改了下VisualStudioVersion也不行。
网上搜索了下VC2015精简版https://pan.baidu.com/s/1eStFQ8M#rwzw 密码:rwzw,999MB,下载之后又提示没有windows SDK,又下载适用于当前系统的windows SDK,我的操作系统是WIN10LTSC.17763,814MB,Windows SDK 存档 - Windows 应用开发 https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive/
下载这个之后,又按照网上的办法,修改文件编码为Unicode-1200,添加了库文件,
#include <memory>
#pragma comment (lib,"Advapi32.lib")
项目属性→常规→目标平台工具集改成VS2015
预编译头不使用。改了下变量unsigned int为int,消除warning。
折腾了好久,终于编译通过了他的项目。
但是添加UEFI序列的功能还是没搞懂怎么改。
我把改过的源代码传上来,静态编译后的efibootwin.exe,169KB,也传上来。
E:\efibootwin-master-liuzhaoyzz\Release>E:\efibootwin-master-liuzhaoyzz\Release\efibootwin.exe /?
efibootwin create by J. Funk, Ver 0.8.5
The syntax of efibootwin :
The commands can be begin with '-' or '/'
The commands are:
? Help
n Get the BootNext Value
Nidx Set the BootNext Value with idx (hex)
eName Set the BootNext Value over the Name
E Remove the BootNext Value
c Get the BootCurrent Value
o Get the BootOrder
Ox,y,zzzzSet the BootOrder (hex)
r Get the BootOrder (Name)
R Remove the BootOrder
v Get the DriverOrder
Vx,y,zzzzSet the DriverOrder (hex)
a Get the DriverOrder (Name)
A Remove the DriverOrder
t Get the Timeout Value
Tidx Set the Timeout Value with idx (hex)
I Remove the Timeout Value
b List the BootXXXX
B List all the BootXXXX (have wait...)
d List the DriverXXXX
D List all the DriverXXXX (have wait...)
fidx Toggle the Active-Flag of Boot idx (hex)
FName Toggle the Active-Flag with Boot decription
didxDesChange the description of Boot idx (hex)
DName DesChange the description (Des) with Boot decription (Name)
Without commands you get all the available Uefi-variables
请高手研究改进下。
https://www.lanzous.com/b00nekg8h
密码:9qa4
本帖最后由 liuzhaoyzz 于 2020-3-17 11:18 编辑
看你的回帖,懂得c语言啊,触类旁通,差不多吧。
你分享的第三个帖子520行,似乎就是添加UEFI启动序列的,我看不懂,shell下的bcfg命令源码
https://github.com/tianocore/edk2/blob/master/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c 最近在研究引导,进来学习一下 liuzhaoyzz 发表于 2020-3-14 13:11
他这个工程是VC2015的项目,我电脑现有的只有VC2010绿色便携版,尝试用VC2010打开并编译,提示VisualSt ...
试了一下,这个程序目前能执行以下操作:
1. 设置 BootCurrent
2. 设置 BootNext
3. 设置 BootOrder
4. 设置 Timeout
5. 设置 BootXXXX 的属性
6. 设置 BootXXXX 的名称
你还需要自己实现以下功能:
1. 新建 BootXXXX
2. 编辑 BootXXXX 的内容。
BootXXXX 就是形如 Boot0000, Boot0001, Boot0002 这样的 UEFI 环境变量,内容可以在 UEFI Spec 里面找到,
typedef struct _EFI_LOAD_OPTION {
UINT32 Attributes;
UINT16 FilePathListLength;
// CHAR16 Description[];
// EFI_DEVICE_PATH_PROTOCOL FilePathList[];
// UINT8 OptionalData[];
} EFI_LOAD_OPTION;
其中关键的就是那个 FilePathList 。
你需要把 efi 文件在 windows 下的路径 (E:\EFI\BOOT\grubx64.efi) 转化为 UEFI 的 DevicePath 格式。
DevicePath 具体长啥样请查阅 UEFI Spec。
顺便说一下,我就是楼上的匿名。
本帖最后由 liuzhaoyzz 于 2020-3-26 11:15 编辑
wintoflash 发表于 2020-3-26 11:05
试了一下,这个程序目前能执行以下操作:
1. 设置 BootCurrent
2. 设置 BootNext
你说的对,目前就是缺少add的功能,增加这部分功能代码我看不懂,也是缺乏耐心。
我联系了pauly,他最近工作很忙,他说抽空在bootice已有的代码上修改个命令行测试版本,发给我,已有的代码,从GUI改成CUI,对于pauly来说,难度应该不大,这些主要的函数他之前写好了的,他是需要时间精力和兴趣。
本帖最后由 liuzhaoyzz 于 2020-4-6 21:35 编辑
bootice添加uefi引导序列命令行
BOOTICEx64.exe /uefi /add /inspos=1 /file="I:\EFI\boot\grub2x64.efi" /title="\EFI\boot\grub2x64.efi"
inspos, insert position,插入位置,0-最大项;非法时放最后。Bootice引导序列里面的顺序可能和实际启动的时候有差别,因为有些引导项目是UEFI固件提供的,这些引导项windows是不能读取的。
/file=参数里面,盘符需要先挂载。
该命令多次运行会多次添加,如果不想重复添加,可以先删除原有的引导序列。
bootice删除uefi引导序列命令行
BOOTICEx64.exe /uefi /delete /file="I:\EFI\boot\grub2x64.efi"
/file=参数里面,盘符需要先挂载。
需要说明的是,BOOTICEx86版本,只要能够正常运行,可以用来在64位和32位windows中添加UEFI序列,BOOTICEx64只能用于64位windows中。
32位的UEFI固件很少,似乎只有早期的WIN8平板电脑才有32位的UEFI固件。
注意由于bootice在2016年的时候丢失了一部分源代码,BOOTICEx64_1.4版本部分功能是不完整的,比如主引导记录、分区管理等,暂时无法完全取代1.3.4版本!等pauly大神有空的时候再完善吧。
路过。 同问。 各位大侠,请教一个问题
我用U盘做了WTG+PE,在PE的菜单上有“title 启动 硬盘上的操作系统”这一项,可总是找不到硬盘启动系统,请看看是不是MENU.LST 下面的语句需要修改?谢谢
title 启动 硬盘上的操作系统
find --set-root --ignore-floppies --ignore-cd /ntldr ||find --set-root --ignore-floppies --ignore-cd /bootmgr
map () (hd0)
map (hd0) ()
map --rehook
find --set-root --ignore-floppies --ignore-cd /ntldr ||find --set-root --ignore-floppies --ignore-cd /bootmgr
chainloader /ntldr || chainloader /bootmgr
liuzhaoyzz 发表于 2020-4-6 07:13
bootice添加uefi引导序列命令行
BOOTICEx64.exe /uefi /add /inspos=1 /file="I:\EFI\boot\grub2x64.efi"...
不知道bootice能不能添加“下一次启动该项”的功能。。 悠然安然 发表于 2020-6-4 11:16
各位大侠,请教一个问题
我用U盘做了WTG+PE,在PE的菜单上有“title 启动 硬盘上的操作系统”这一项, ...
菜单没问题,但是只是用于BIOS启动,不能适用于UEFI。 江南一根葱 发表于 2020-7-3 16:16
不知道bootice能不能添加“下一次启动该项”的功能。。
当时我找pauly的时候,没有增加这个功能。如果他出手的话,是很简单的。问题是他很忙。 liuzhaoyzz 发表于 2020-7-3 17:21
当时我找pauly的时候,没有增加这个功能。如果他出手的话,是很简单的。问题是他很忙。
一根葱不是发现bcdedit可以编辑uefi启动项吗。