这次的实验是将 RU 内置在Shell 中,当你输入 zru 之后就可以执行 RU(特别命令为 zru 是为了和 ru 避免冲突)。代码是基于之前的 MyCmd 实现的。特别需要注意的地方是 RuCommand.c 文件中的 MyShellCommand() 函数中,我们调用 LoadImage 需要传递 ParentImageHandle, 但是MyShellCommand(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) 传递进来的ImageHandle一直是0。这样会导致LoadImage调用失败。因此,这里使用了gImageHandle,给出的是 UEFI Shell 的 Handle。
//
// Load the image with:
//
Status = gBS->LoadImage(
FALSE,
gImageHandle,
DP,
(VOID*)&ru_efi[0],
ru_efi_size,
&NewHandle);
if (EFI_ERROR(Status)) {
Print(L"Load image Error! %r\n",Status);
return 0;
}
最终生成的完整 UEFI Shell:
完整的代码(基于 EDK2 202411 ):
这样做的好处是方便用户使用,只用一个文件就可以实现很多功能,缺点是:更新内容不太容易。
参考: