0

我使用 GNU-EFI 开发 UEFI 应用程序。我在获取在 GNU-EFI 下工作的协议 (EFI_SHELL_PROTOCOL) 时遇到了一些麻烦。我的编译器说它是未定义的。我应该包括一些东西吗?我已经包含了efi.hefilib.h。我需要更多吗?

我试过的代码:

EFI_SHELL_PROTOCOL shell;

我得到的错误:

error: unknown type name ‘EFI_SHELL_PROTOCOL’; did you mean ‘EFI_OPEN_PROTOCOL’?
  161 |  EFI_SHELL_PROTOCOL shell;
4

3 回答 3

1

EFI_SHELL_PROTOCOL 不是主要 UEFI 接口的一部分,因此不包含在主要头文件(例如efi.h)中,也不包含在主要 UEFI 标准中。

相反, EFI_SHELL_PROTOCOL 只是一个可选扩展(可能不存在,我假设只有在使用并提供外壳时才可能存在),具有自己的单独标准和自己的单独头文件。

假设您正在使用 GNU 的工具;要包含的正确文件可能是efishellintf.hefishellparm.h.

于 2020-11-09T21:22:11.970 回答
1

目前,GNU-EFI 不支持 EFI_SHELL_PROTOCOL。它不包含任何相关的定义。

如果你想将它与 GNU-EFI 一起使用,你可以使用edk2 中的这个头文件(将它放在inc文件夹中,例如,inc/efishell.h)。然后包含这个头文件inc/efi.h并添加这些行:

lib/data.c

EFI_GUID ShellProtocol = EFI_SHELL_PROTOCOL_GUID;

inc/efilib.h

extern EFI_GUID ShellProtocol;

重建你的 GNU-EFI,现在你可以通过首先找到它来使用 EFI_SHELL_PROTOCOL。

EFI_SHELL_PROTOCOL *SP;

uefi_call_wrapper(BS->LocateProtocol, 3, &ShellProtocol, NULL, &SP);
于 2020-11-10T05:31:00.083 回答
0

EFI_SHELL_PROTOCOL 完整记录在 UEFI Shell 规范(当前为 v2.2)中,可从https://uefi.org/specifications下载

GNU EFI 当前没有实现 EFI_SHELL_PROTOCOL 或者,事实上,所有当前的 UEFI 规范。有关 UEFI Shell 规范的参考实现,请查看 EDK11 ShellPkg 源代码。

于 2020-12-05T04:52:31.527 回答