c-如何以编程方式使用参数启动UEFI shell



我正在使用EDKII编写UEFI模块。我希望此模块加载并启动带有参数的UEFI shell(以使用其命令行功能(。到目前为止,我有以下代码,它成功地加载并启动了UEFI shell,但我似乎不知道如何使用参数启动它。

EFI_STATUS
LoadAndStartShell (
IN EFI_HANDLE        ImageHandle
)
{
UINTN NumHandles;
UINTN Index;
EFI_HANDLE *SFS_Handles;
EFI_HANDLE AppImageHandle = NULL;
EFI_STATUS Status = EFI_SUCCESS;
EFI_BLOCK_IO_PROTOCOL *BlkIo;
CONST CHAR16 *FileName = L"Shell.efi";
EFI_DEVICE_PATH_PROTOCOL *FilePath;
EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
UINTN ExitDataSize;
Status = gBS->LocateHandleBuffer(
ByProtocol,
&gEfiSimpleFileSystemProtocolGuid,
NULL,
&NumHandles,
&SFS_Handles);
if (Status != EFI_SUCCESS) {
Print(L"Could not find handles - %rn", Status);
return Status;
}
for (Index = 0; Index < NumHandles; Index++) {
Status = gBS->OpenProtocol(
SFS_Handles[Index],
&gEfiSimpleFileSystemProtocolGuid,
(VOID**) &BlkIo,
ImageHandle,
NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);

if (Status != EFI_SUCCESS) {
Print(L"Protocol is not supported - %rn", Status);
return Status;
}

FilePath = FileDevicePath(SFS_Handles[Index], FileName);
Status = gBS->LoadImage(
FALSE, 
ImageHandle, 
FilePath, 
(VOID*) NULL, 
0, 
&AppImageHandle);
if (Status != EFI_SUCCESS) {
Print(L"Could not load the image - %rn", Status);
continue;
}
Print(L"Loaded the image with successn");
Status = gBS->OpenProtocol(
AppImageHandle,
&gEfiLoadedImageProtocolGuid,
(VOID**) &ImageInfo,
ImageHandle,
(VOID*) NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
Print(L"ImageInfo openedn");

if (!EFI_ERROR(Status)) {
Print(L"ImageSize = %dn", ImageInfo->ImageSize);
}
Print(L"Image start:n");
Status = gBS->StartImage(AppImageHandle, &ExitDataSize, (CHAR16**) NULL);
if (Status != EFI_SUCCESS) {
Print(L"Could not start the image - %r %xn", Status, Status);
Print(L"Exit data size: %dn", ExitDataSize);
continue;
}
return Status;
}
return Status;
}

在加载映像后但在启动映像之前,我尝试访问EFI_SHELL_PARAMETERS_PROTOCOL,认为可以从那里手动更改参数,但此时似乎尚未安装该协议(尽管UEFI SHELL规范中规定在调用StartImage之前安装了该协议(。

LoadedImage协议包含两个成员变量,可以直接访问它们来设置指向命令行的指针和命令行的字节大小。
UINT32 LoadOptionsSize;
VOID *LoadOptions;

在获得代码中已有的LoadedImage协议后,只需使用ImageInfo指针来设置这些字段。

ImageInfo->LoadOptions = cmdline;
ImageInfo->LoadOptionsSize = cmdline_size;

加载选项的解释取决于应用程序。我相信Shell将其视为Unicode字符串(UCS-2(。

最新更新