Step to UEFI (297)编写一个 UEFI Shell Command 的框架

本文根据 https://github.com/apop2/GopRotate 的代码编写,这个在之前的【参考1】和【参考2】中有介绍过。

本文介绍了如何编写一个 UEFI Shell Command 的方法,然后给出了一个基本的框架,有需要的朋友可以方便的扩展定制自己所需的 UEFI Shell。代码在 edk2 202411 下实验成功。

以WinHost 模拟器为例,介绍例子的测试方法:

1.解压到 \ShellPkg\Library 下面

2.修改 \EmulatorPkg\EmulatorPkg.dsc文件

BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf
      IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
##LABZDEBUG_Start
	  NULL|ShellPkg/Library/MyShellCommandLib/MyShellCommandLib.inf
##LABZDEBUG_End	

    <PcdsFixedAtBuild>
      gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xFF
      gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
      gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000

3.重新编译,使用 build -a X64 即可

运行 WinHost测试如下:

这里定了一个 mycmd 命令,然后可以接受一个参数。MyCommand.c 中的MyShellCommand() 函数负责实际执行 ShellPkg\Library\MyShellCommandLib\MyShellCommandLib.c 中的MyShellCommandLibConstructor() 函数负责向 Shell 注册 mycmd 命令,同时注册一个帮助文本,通过 STR_GET_MYCMD_HELP 定义。

EFI_STATUS EFIAPI MyShellCommandLibConstructor(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
    gMyShellCommandHiiHandle = HiiAddPackages (&gMyShellCommandGuid, ImageHandle, MyShellCommandLibStrings, NULL);
    if(gMyShellCommandHiiHandle != NULL)
    {
        ShellCommandRegisterCommandName(L"mycmd", MyShellCommand, MyShellCommandGetFileName, 0, L"", FALSE, gMyShellCommandHiiHandle, STRING_TOKEN(STR_GET_MYCMD_HELP));
    }
    return EFI_SUCCESS;
}

有兴趣的朋友可以使用这个框架自行扩展 UEFI Shell。

参考:

  1. https://www.lab-z.com/stu90shc/
  2. http://www.lab-z.com/stu88/

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注