这次的实验是将 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // // 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 ):
这样做的好处是方便用户使用,只用一个文件就可以实现很多功能,缺点是:更新内容不太容易。
参考: