我已经使用 tianocore 的 EDK2 编写了自己的 UEFI 驱动程序。我希望每次加载操作系统时都运行它。我需要修改吗bootmgfw.efi
?如何BootCheck.efi
仅在执行加载 Windows 后才将控制权传递给我的并?
还有一个问题,我如何添加可以在驱动程序中使用的标志?我需要0
在第一次启动时将其设置为,然后1
在后续启动时设置为。
我将非常感激您提供分步指南或任何有用的信息,谢谢。
@Edit:如果可能的话,我希望使用 pendrive 或磁盘进行安装。
答案1
UEFI 驱动程序编写指南指出以下内容3 种方法安装 UEFI 驱动程序:
1.集成到平台固件FLASH镜像中。
您必须与平台制造商合作才能做到这一点。平台制造商通常是您的硬件 OEM(例如 HP、Gigabyte 等)。在制造过程中,OEM 会将他们想要安装的所有 UEFI 驱动程序打包到固件映像中并刷新它(即,将其保存到主板上的闪存芯片中)。他们最终会关闭芯片组的制造模式,从而防止任何第三方对其进行修改。要更新固件,您需要创建一个更新胶囊并使用 OEM 的私钥对其进行签名。一些原始设备制造商犯了没有关闭制造模式的错误,因此人们(包括 bootkit/rootkit)可以利用这一点将自己的 UEFI 驱动程序安装到固件中。然而,这是一项非常复杂的任务,大多数 OEM 已经纠正了这个问题,所以不值得走这条路。
不过,在 VMware 映像上执行此操作要容易得多,因此您可以按照以下步骤操作指导如果您有兴趣尝试一下。
2. PCI 附加卡上的 PCI Option ROM。
我猜你不是在开发 PCI 硬件设备,所以这个选项也不适用于你。老实说,我也不知道它的具体工作原理。
3. EFI 系统分区中的文件。
正如驱动程序编写指南中提到的,需要将驱动程序 bin 保存在 EFI 系统分区上,然后更新Driver####
和DriverOrder
UEFI 变量。
要在 Windows 中访问 EFI 系统分区,请cmd
以管理员身份运行并输入mountvol X: /S
,将 替换X
为您计算机上未使用的驱动器号。请注意,访问仍需要管理员权限,并且您将无法在资源管理器中看到已安装的驱动器。请参阅编辑历史记录以了解使用 的更详细方法diskpart
。
现在要更新Driver####
和DriverOrder
UEFI 变量,您可以编写 UEFI 应用程序或 Win32 应用程序。UEFI 规范版本 2.8提供了有关如何处理这些变量的一些背景信息,并且“3.1.3 加载选项”部分详细介绍了所涉及的数据结构和常量。对于 UEFI 应用程序,请使用SetVariable()
(规范的“8.2 变量服务”部分)。对于 Win32,请使用SetFirmwareEnvironmentVariableA
或者SetFirmwareEnvironmentVariableExA
。
对于 Win32 示例,您可以查看转储EfiVars项目。它只读取变量而不写入变量,但代码可以轻松适应执行写入操作。您还可以使用该工具转储测试计算机的Boot####
和BootOrder
变量,以了解Driver####
和DriverOrder
应该是什么样子。大多数计算机不会在 EFI 系统分区上安装任何第三方 UEFI 驱动程序,因此它们的Driver####
和DriverOrder
变量将为空。
PS 这个问题在 stackoverflow 上比在超级用户上更合适。另外,你关于驱动程序标记的问题值得单独发帖。
答案2
旧线程,但我安装 EFI 分区的经验是使用 Minitool 分区向导https://www.partitionwizard.com/,这将允许您为分区分配一个字母,然后启动 explorer++https://explorerplusplus.com/以管理员身份(右键单击可执行文件以获取上下文菜单)将允许您修改,即在分区上添加或删除项目,然后使用分区向导再次删除该字母。
有人会觉得这很有用。干杯