2013-07-17 68 views

回答

3

你需要小心這個。

正如您可能知道的那樣,有一個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。你實際上可以直接談論它,但我還沒有嘗試過。

0

您可以在UEFI_SHELL 2.0規格的第55頁找到EFI_SHELL_PARAMETERS_PROTOCOL的詳細信息。 使用handleprotocol()獲取協議接口的地址。 您可以傳入您在rcx中獲取的圖像句柄。 協議結構給出了參數的數量和一個指向參數指針列表的指針。參數是零終止的ucs2字符串。 第一個參數是加載圖像的路徑。 除去參數周圍的空格分隔符和雙引號。 (注意:沒有匹配的雙引號沒有剝離!) 我不知道是否有限制的數量或大小的參數。 我用20個長參數的測試工作正常。