Как получить доступ к аргументам командной строки в UEFI?

Какая часть спецификации описывает, как можно получить аргументы командной строки?


person user773099    schedule 17.07.2013    source источник


Ответы (2)


Вы должны быть осторожны с этим.

Как вы, вероятно, знаете, существует протокол UEFI LoadedImage — этот протокол возвращает структуру с именем EFI_LOADED_IMAGE, которая, в свою очередь, имеет член LoadOptions.

Оболочка UEFI установит для этой переменной LoadOptions значение, которое вы введете в командной строке. В качестве альтернативы, я считаю, вы можете установить это через переменную EFI BootOptions, где требуется осторожность - первый «аргумент» в этом случае не является путем процесса.

Итак, что вам нужно сделать, это обработать одну длинную строку, которую вы получите, чтобы вывести «аргументы» так, как вы хотите.

Чтобы использовать протокол 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, которая определяет протоколы, с которыми работает оболочка. На самом деле вы можете поговорить с ним напрямую, но я еще не экспериментировал с этим.

person Community    schedule 19.07.2013

Подробную информацию о протоколе EFI_SHELL_PARAMETERS_PROTOCOL можно найти на странице 55 спецификаций UEFI_SHELL 2.0. Используйте handleprotocol() для получения адреса интерфейса протокола. Вы можете передать дескриптор вашего изображения, которое вы получаете в rcx при входе. Структура протокола дает количество параметров и указатель на список указателей параметров. Параметры представляют собой строки ucs2 с нулевым завершением. Первый параметр — это путь, откуда было загружено ваше изображение. Разделители пробелов и двойные кавычки вокруг параметров удаляются. (Примечание: несоответствующая двойная кавычка не удаляется!) Я не знаю, есть ли ограничения на количество или размер параметров. Мой тест с 20 длинными параметрами работал нормально.

person user2707695    schedule 15.03.2015