如何在UEFI中访问命令行参数?

时间:2013-07-17 14:36:51

标签: efi uefi

规范的哪一部分详细说明了如何获取命令行参数?

2 个答案:

答案 0 :(得分:4)

你需要小心这个。

您可能知道,有一个UEFI LoadedImage协议 - 此协议返回一个名为EFI_LOADED_IMAGE的结构,该结构又有一个LoadOptions成员。

UEFI shell将此LoadOptions变量设置为您在命令行上键入的任何内容。或者,我相信您可以通过BootOptions EFI变量设置它,这是需要关注的地方 - 在这种情况下,第一个“参数”不是过程路径。

所以你需要做的是处理一个长字符串,你可以根据需要推导出“参数”。

要使用LoadedImage协议,请执行以下操作:

EFI_STATUS status = EFI_SUCCESS;
EFI_LOADED_IMAGE* loaded_image;
EFI_GUID loaded_image_protocol = LOADED_IMAGE_PROTOCOL;
status = gBS->HandleProtocol(ImageHandle, 
                             &loaded_image_protocol, 
                             (void**) &loaded_image);

然后,您可以获取传递的(0终止的)字符串的长度:

loaded_image->LoadOptionsSize;

请注意这是以字节为单位的大小,而不是长度。为此,您可以使用库函数:

LoadOptionsLength = StrLen((CHAR16 *)li->LoadOptions);

最后,实际字符串本身可从以下网址获得:

CHAR16* CommandLineArgs = (CHAR16 *)li->LoadOptions;

免费提供UEFI Shell Specification可确定shell所说的协议。你实际上可以直接与它对话,但我还没有尝试过。

答案 1 :(得分:2)

您可以在UEFI_SHELL 2.0规范的第55页上找到EFI_SHELL_PARAMETERS_PROTOCOL的详细信息。 使用handleprotocol()获取协议接口的地址。 您可以在输入时传递您在rcx中获得的图像句柄。 协议结构给出了参数的数量和指向参数指针列表的指针。参数是零终止的ucs2字符串。 第一个参数是加载图像的路径。 剥离参数周围的空格分隔符和双引号。 (注意:不会剥离无匹配的双引号!) 我不知道params的数量或大小是否有限制。 我使用20个长参数进行的测试工作正常。