【问题标题】:How to access command line arguments in UEFI?如何在 UEFI 中访问命令行参数?
【发布时间】:2013-07-16 04:18:25
【问题描述】:

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

【问题讨论】:

    标签: efi uefi


    【解决方案1】:

    你需要小心这个。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2022-01-19
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 2011-03-21
        • 1970-01-01
        相关资源
        最近更新 更多