1.集成到平台固件FLASH镜像中。

1.集成到平台固件FLASH镜像中。

我已经使用 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####DriverOrderUEFI 变量。

要在 Windows 中访问 EFI 系统分区,请cmd以管理员身份运行并输入mountvol X: /S,将 替换X为您计算机上未使用的驱动器号。请注意,访问仍需要管理员权限,并且您将无法在资源管理器中看到已安装的驱动器。请参阅编辑历史记录以了解使用 的更详细方法diskpart

现在要更新Driver####DriverOrderUEFI 变量,您可以编写 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/以管理员身份(右键单击可执行文件以获取上下文菜单)将允许您修改,即在分区上添加或删除项目,然后使用分区向导再次删除该字母。

有人会觉得这很有用。干杯

相关内容