规范的哪一部分详细说明了如何获取命令行参数?
2 回答
你需要小心这个。
您可能知道,有一个 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 规范,它决定了 shell 使用的协议。你实际上可以直接与它交谈,但我还没有尝试过。
您可以在 UEFI_SHELL 2.0 规范的第 55 页找到 EFI_SHELL_PARAMETERS_PROTOCOL 的详细信息。使用 handleprotocol() 获取协议接口的地址。您可以传递您在输入时在 rcx 中获得的图像的句柄。协议结构给出参数的数量和指向参数指针列表的指针。参数是零终止的 ucs2 字符串。第一个参数是加载图像的路径。参数周围的空格分隔符和双引号被去除。(注意:不匹配的双引号不会被剥离!)我不知道参数的数量或大小是否有限制。我对 20 个长参数的测试运行良好。