无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 26172|回复: 72

[求助] 请问下有没有命令行工具添加UEFI引导序列?

    [复制链接]
发表于 2020-2-1 09:00:31 | 显示全部楼层 |阅读模式
本帖最后由 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


uefi引导序列.png
发表于 2020-2-1 09:12:52 来自手机 | 显示全部楼层
bootice只能添加有存储的主板,有的主板没有存储,就只能修改,做不了添加,easyuefi可以。
回复

使用道具 举报

发表于 2020-2-1 09:14:46 来自手机 | 显示全部楼层
win的efi引导是bios自动添加的,所以他的命令行对别的第三方efi添加即便有,估计也很差。
回复

使用道具 举报

发表于 2020-2-2 00:06:21 | 显示全部楼层
win一般就是直接bcdboot了

点评

可是bcdboot只能写入windows引导到UEFI-ROM中,其他的efi启动项不行啊,比如写入grub2x64.efi就不行,但bootice就可以。  详情 回复 发表于 2020-2-2 07:09
回复

使用道具 举报

 楼主| 发表于 2020-2-2 07:09:12 来自手机 | 显示全部楼层
fjzjk 发表于 2020-2-2 00:06
win一般就是直接bcdboot了


     可是bcdboot只能写入windows引导到UEFI-ROM中,其他的efi启动项不行啊,比如写入grub2x64.efi就不行,但bootice就可以,只是不支持命令行。   
回复

使用道具 举报

发表于 2020-2-2 08:24:56 来自手机 | 显示全部楼层
看看cywin有没有相关的工具。
回复

使用道具 举报

发表于 2020-2-4 17:26:35 | 显示全部楼层
efi shell
  1. bcdf boot dump # 列出当前启动项
  2. bcfg boot rm 1 # 删掉编号为 1 的启动项
  3. bcfg boot mv 2 0 # 将编号为 2 的启动项移动到第一项
  4. bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd" # 在 fs0 分区,添加如下路径启动项
复制代码

win下bcdedit
  1. 对存储执行的命令
  2. ================================
  3. /createstore    新建空的启动配置数据存储。
  4. /export         将系统存储的内容导出到文件。以后可以使用该文件还原系统
  5.                 存储的状态。
  6. /import         使用 /export 命令创建的备份文件来还原系统存储的状态。               
  7. /sysstore       设置系统存储设备(仅影响 EFI 系统,在重新启动后不再有效,
  8.                 且仅用于系统存储设备不确定的情况下)。

  9. 对存储中的项执行的命令
  10. ===========================================
  11. /copy           复制存储中的项。
  12. /create         在存储中新建项。
  13. /delete         删除存储中的项。
  14. /mirror         创建存储中项的镜像。

  15. 运行 bcdedit /? ID 可获得有关这些命令使用的标识符的信息。

  16. 对项选项执行的命令
  17. ======================================
  18. /deletevalue    删除存储中的项选项。
  19. /set            设置存储中的项选项值。

  20. 运行 bcdedit /? TYPES 可获得这些命令使用的数据类型的列表。
  21. 运行 bcdedit /? FORMATS 可获得有效数据格式的列表。

  22. 控制输出的命令
  23. ============================
  24. /enum           列出存储中的项。
  25. /v              命令行选项,完整显示项标识符,而不是使用已知标识符的名称。               
  26.                 单独使用命令 /v 可完整显示活动类型的项标识符。               

  27. 单独运行 "bcdedit" 等同于运行 "bcdedit /enum ACTIVE"。

  28. 控制启动管理器的命令
  29. ======================================
  30. /bootsequence   为启动管理器设置一次性启动序列。
  31. /default        设置启动管理器将使用的默认项。
  32. /displayorder   设置启动管理器显示多重引导菜单的顺序。               
  33. /timeout        设置启动管理器的超时值。
  34. /toolsdisplayorder  设置启动管理器显示工具菜单的顺序。                    

  35. 控制启动应用程序紧急管理服务的命令
  36. ==========================================================================
  37. /bootems        启用或禁用启动应用程序的紧急管理服务。               
  38. /ems            启用或禁用操作系统项的紧急管理服务。               
  39. /emssettings    设置全局紧急管理服务参数。

  40. 控制调试的命令
  41. ==============================
  42. /bootdebug      启用或禁用启动应用程序的启动调试。
  43. /dbgsettings    设置全局调试程序参数。
  44. /debug          启用或禁用操作系统项的内核调试。               
  45. /hypervisorsettings  设置虚拟机监控程序的参数。
复制代码

linux下
  1. 移除
  2. sudo efibootmgr -b B
  3. 增加(sda7 -> sda -p 7)
  4. efibootmgr -c -d /dev/sda -p 7 -L -l \EFI<lable>\grubx64.efi
  5. 设置激活
  6. sudo efibootmgr -b -a
  7. 设置禁用
  8. sudo efibootmgr -b -A
  9. 调整顺序
  10. sudo efibootmgr -o
复制代码


回复

使用道具 举报

 楼主| 发表于 2020-2-4 17:56:10 来自手机 | 显示全部楼层
本帖最后由 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:31:55 来自手机 | 显示全部楼层
本帖最后由 窄口牛 于 2020-2-4 19:33 编辑

可以呀,你把grub2的名字改成win的,放到微软的默认路径,这样bios就会自动添加了,命令执行这些很简单吧,改改文件夹名字,再改改文件名字就完成了。win10可以任意路径被grub2来chainload的,win7不可以,必须默认路径,可以给win7专门弄一个esp分区,这样就可以了。
回复

使用道具 举报

 楼主| 发表于 2020-2-5 07:51:06 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2020-2-5 07:53 编辑
窄口牛 发表于 2020-2-4 19:31
可以呀,你把grub2的名字改成win的,放到微软的默认路径,这样bios就会自动添加了,命令执行这些很简单吧, ...


  把grub2x64.efi改名成为bootx64.efi放在efi\boot\不是我想要的结果,我想要的是新增一个UEFI引导序列与之并列,不要覆盖系统的,绕路解决的思路不是我想要的。
EasyUEFI命令行介绍太少,我没有深入研究,他太大了,似乎还要破解。
希望有大神能够写个基于windows API的小程序实现,或者有已经实现的小程序推荐下也好。   
回复

使用道具 举报

发表于 2020-2-5 08:29:36 来自手机 | 显示全部楼层
既然匿名者回答了,那估计确实是没有。我见csdn有efibootmgr的源码,不知道有没有用,高手们可以下来看看。
回复

使用道具 举报

发表于 2020-2-5 08:56:32 | 显示全部楼层
我来看看一
回复

使用道具 举报

 楼主| 发表于 2020-2-5 11:44:33 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2020-2-5 11:50 编辑
匿名者 发表于 2020-2-5 08:51
https://github.com/ju-funk/efibootwin

这个应该大概能满足你的要求。会c++的话自己再改一改应该就可以 ...


  谢谢分享,晚点我研究下。(手机回复)      
回复

使用道具 举报

 楼主| 发表于 2020-2-5 16:14:50 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2020-2-5 16:33 编辑
匿名者 发表于 2020-2-5 08:51
https://github.com/ju-funk/efibootwin

这个应该大概能满足你的要求。会c++的话自己再改一改应该就可以 ...

水平不够啊。参数里面我没看到怎么添加个启动项的readme啊。你能帮忙该写下吗?请帮忙做个静态编译。



回复

使用道具 举报

 楼主| 发表于 2020-3-11 16:50:32 | 显示全部楼层
       再次顶下帖子,希望有大神们能够出手啊!
@匿名
@wintoflash
@pauly
@chenall
@yaya2007777
@......

回复

使用道具 举报

发表于 2020-3-11 17:04:01 | 显示全部楼层
艾特我没用。我不会。
求人不如求己。
回复

使用道具 举报

 楼主| 发表于 2020-3-11 19:56:51 来自手机 | 显示全部楼层
wintoflash 发表于 2020-3-11 17:04
艾特我没用。我不会。
求人不如求己。

      我只能用VC写个Hello world。。。  
回复

使用道具 举报

 楼主| 发表于 2020-3-14 13:11:53 | 显示全部楼层
本帖最后由 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 [command command]:
The commands can be begin with '-' or '/'
The commands are:


   ?            Help
   n            Get the BootNext Value
   N  idx       Set the BootNext Value with idx (hex)
   e  Name      Set the BootNext Value over the Name
   E            Remove the BootNext Value
   c            Get the BootCurrent Value
   o            Get the BootOrder
   O  x,y,zzzz  Set the BootOrder (hex)
   r            Get the BootOrder (Name)
   R            Remove the BootOrder
   v            Get the DriverOrder
   V  x,y,zzzz  Set the DriverOrder (hex)
   a            Get the DriverOrder (Name)
   A            Remove the DriverOrder
   t            Get the Timeout Value
   T  idx       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...)
   f  idx       Toggle the Active-Flag of Boot idx (hex)
   F  Name      Toggle the Active-Flag with Boot decription
   d  idx  Des  Change the description of Boot idx (hex)
   D  Name Des  Change the description (Des) with Boot decription (Name)


Without commands you get all the available Uefi-variables

请高手研究改进下。

https://www.lanzous.com/b00nekg8h
密码:9qa4

      



efibootwin.rar

75.41 KB, 下载次数: 52, 下载积分: 无忧币 -2

回复

使用道具 举报

 楼主| 发表于 2020-3-14 20:09:06 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2020-3-17 11:18 编辑

        看你的回帖,懂得c语言啊,触类旁通,差不多吧。
你分享的第三个帖子520行,似乎就是添加UEFI启动序列的,我看不懂,shell下的bcfg命令源码
https://github.com/tianocore/edk2/blob/master/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c
回复

使用道具 举报

发表于 2020-3-26 10:29:44 | 显示全部楼层
最近在研究引导,进来学习一下
回复

使用道具 举报

发表于 2020-3-26 11:05:12 | 显示全部楼层
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。
顺便说一下,我就是楼上的匿名。
回复

使用道具 举报

 楼主| 发表于 2020-3-26 11:11:44 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2020-3-26 11:15 编辑
wintoflash 发表于 2020-3-26 11:05
试了一下,这个程序目前能执行以下操作:
1. 设置 BootCurrent
2. 设置 BootNext

       你说的对,目前就是缺少add的功能,增加这部分功能代码我看不懂,也是缺乏耐心。

我联系了pauly,他最近工作很忙,他说抽空在bootice已有的代码上修改个命令行测试版本,发给我,已有的代码,从GUI改成CUI,对于pauly来说,难度应该不大,这些主要的函数他之前写好了的,他是需要时间精力和兴趣。

回复

使用道具 举报

 楼主| 发表于 2020-4-6 07:13:26 | 显示全部楼层
本帖最后由 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大神有空的时候再完善吧。


bootice增加删除uefi引导序列命令行.rar

773.71 KB, 下载次数: 292, 下载积分: 无忧币 -2

回复

使用道具 举报

发表于 2020-4-20 20:24:34 | 显示全部楼层
路过。
回复

使用道具 举报

发表于 2020-4-20 21:02:14 | 显示全部楼层
同问。
回复

使用道具 举报

发表于 2020-6-4 11:16:10 | 显示全部楼层
各位大侠,请教一个问题
我用U盘做了WTG+PE,在PE的菜单上有“title [7] 启动 硬盘上的操作系统”这一项,可总是找不到硬盘启动系统,请看看是不是MENU.LST 下面的语句需要修改?谢谢

title [7] 启动 硬盘上的操作系统
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
回复

使用道具 举报

发表于 2020-7-3 16:16:15 | 显示全部楼层
liuzhaoyzz 发表于 2020-4-6 07:13
bootice添加uefi引导序列命令行
BOOTICEx64.exe /uefi /add /inspos=1 /file="I:\EFI\boot\grub2x64.efi"  ...

不知道bootice能不能添加“下一次启动该项”的功能。。
回复

使用道具 举报

 楼主| 发表于 2020-7-3 17:20:55 | 显示全部楼层
悠然安然 发表于 2020-6-4 11:16
各位大侠,请教一个问题
我用U盘做了WTG+PE,在PE的菜单上有“title [7] 启动 硬盘上的操作系统”这一项, ...

菜单没问题,但是只是用于BIOS启动,不能适用于UEFI。
回复

使用道具 举报

 楼主| 发表于 2020-7-3 17:21:33 | 显示全部楼层
江南一根葱 发表于 2020-7-3 16:16
不知道bootice能不能添加“下一次启动该项”的功能。。

        当时我找pauly的时候,没有增加这个功能。如果他出手的话,是很简单的。问题是他很忙。
回复

使用道具 举报

发表于 2020-7-3 17:46:19 | 显示全部楼层
liuzhaoyzz 发表于 2020-7-3 17:21
当时我找pauly的时候,没有增加这个功能。如果他出手的话,是很简单的。问题是他很忙。

一根葱不是发现bcdedit可以编辑uefi启动项吗。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-18 12:26

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表