4

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

4

2 回答 2

6

你需要小心这个。

您可能知道,有一个 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 使用的协议。你实际上可以直接与它交谈,但我还没有尝试过。

于 2013-07-19T13:57:06.127 回答
2

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

于 2015-03-15T21:45:02.593 回答