规范的哪一部分详细说明了如何获取命令行参数?
答案 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个长参数进行的测试工作正常。