运行 来自 UEFI 应用程序内部的 UEFI shell 命令

Run a UEFI shell command from inside UEFI application

我是 UEFI 应用程序开发的新手。

我的要求是,

我需要从我的 UEFI 应用程序 (app.efi) 源代码中 运行 一个 UEFI shell 命令。 需要有关如何执行此操作的指导。

示例,

cp command in UEFI shell is used to copy a file from one path to another. I want to do this programmatically inside my application (app.efi) source code.

编辑:我正在寻找类似于 system("command"); function in Linux 的内容。

如何实现?

从 UEFI 应用程序调用 UEFI shell 命令可以使用 EFI_SHELL_PROTOCOLEFI_SHELL_EXECUTE 函数完成,在 MdePkg/Include/Protocol/Shell.h.

下定义

您需要在 UEFI 应用程序的 inf 文件中包含协议 GUID:

[Protocols]
  gEfiShellProtocolGuid                  ## CONSUMES

然后您可以调用 shell 命令,如下例所示:

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE                            ImageHandle,
  IN EFI_SYSTEM_TABLE                      *SystemTable
  )
{
  EFI_SHELL_PROTOCOL    *EfiShellProtocol;
  EFI_STATUS            Status;

  Status = gBS->LocateProtocol (&gEfiShellProtocolGuid,
                                NULL,
                                (VOID **) &EfiShellProtocol);

  if (EFI_ERROR (Status)) {
    return Status; 
  }

  EfiShellProtocol->Execute (&ImageHandle,
                             L"echo Hello World!",
                             NULL,
                             &Status);

  return Status;
}

编辑:使用 ShellLib 库有一种更简单(并且可能更正确)的方法 Class:

#include <Library/ShellLib.h>

EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE                            ImageHandle,
  IN EFI_SYSTEM_TABLE                      *SystemTable
  )
{
  EFI_STATUS            Status;

  ShellExecute (&ImageHandle,
                L"echo Hello World!",
                FALSE,
                NULL,
                &Status);

  return Status;
}