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