这次的实验是将 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 ):
这样做的好处是方便用户使用,只用一个文件就可以实现很多功能,缺点是:更新内容不太容易。
参考: