簡體   English   中英

如何以編程方式使用參數啟動 UEFI shell?

[英]How do I start UEFI shell with parameters programmatically?

我正在使用 EDKII 編寫 UEFI 模塊。 我希望此模塊使用參數加載和啟動 UEFI shell(以使用其命令行功能)。 到目前為止,我有以下代碼,它成功加載並啟動了 UEFI shell,但我似乎無法弄清楚如何使用參數啟動它。

EFI_STATUS
LoadAndStartShell (
  IN EFI_HANDLE        ImageHandle
  )
{
  UINTN NumHandles;
  UINTN Index;
  EFI_HANDLE *SFS_Handles;
  EFI_HANDLE AppImageHandle = NULL;
  EFI_STATUS Status = EFI_SUCCESS;
  EFI_BLOCK_IO_PROTOCOL *BlkIo;
  CONST CHAR16 *FileName = L"Shell.efi";
  EFI_DEVICE_PATH_PROTOCOL *FilePath;
  EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
  UINTN ExitDataSize;

  Status = gBS->LocateHandleBuffer(
          ByProtocol,
          &gEfiSimpleFileSystemProtocolGuid,
          NULL,
          &NumHandles,
          &SFS_Handles);

  if (Status != EFI_SUCCESS) {
      Print(L"Could not find handles - %r\n", Status);
      return Status;
  }

  for (Index = 0; Index < NumHandles; Index++) {
      Status = gBS->OpenProtocol(
              SFS_Handles[Index],
              &gEfiSimpleFileSystemProtocolGuid,
              (VOID**) &BlkIo,
              ImageHandle,
              NULL,
              EFI_OPEN_PROTOCOL_GET_PROTOCOL
              );
  
      if (Status != EFI_SUCCESS) {
          Print(L"Protocol is not supported - %r\n", Status);
          return Status;
      }
  
      FilePath = FileDevicePath(SFS_Handles[Index], FileName);
      Status = gBS->LoadImage(
              FALSE, 
              ImageHandle, 
              FilePath, 
              (VOID*) NULL, 
              0, 
              &AppImageHandle);

      if (Status != EFI_SUCCESS) {
          Print(L"Could not load the image - %r\n", Status);
          continue;
      }

      Print(L"Loaded the image with success\n");
      Status = gBS->OpenProtocol(
              AppImageHandle,
              &gEfiLoadedImageProtocolGuid,
              (VOID**) &ImageInfo,
              ImageHandle,
              (VOID*) NULL,
              EFI_OPEN_PROTOCOL_GET_PROTOCOL
              );

      Print(L"ImageInfo opened\n");


      if (!EFI_ERROR(Status)) {
          Print(L"ImageSize = %d\n", ImageInfo->ImageSize);
      }

      Print(L"Image start:\n");
      Status = gBS->StartImage(AppImageHandle, &ExitDataSize, (CHAR16**) NULL);
      if (Status != EFI_SUCCESS) {
          Print(L"Could not start the image - %r %x\n", Status, Status);
          Print(L"Exit data size: %d\n", ExitDataSize);
          continue;
      }
  return Status;
  }
  return Status;
}

我在加載圖像后嘗試訪問 EFI_SHELL_PARAMETERS_PROTOCOL 但在啟動它之前,我認為我可以從那里手動更改參數,但似乎當時尚未安裝協議(即使它在 UEFI Shell 規范中說在調用 StartImage 之前安裝協議)。

LoadedImage 協議包含兩個成員變量,可以直接訪問它們以設置指向命令行的指針和以字節為單位的命令行大小。

UINT32 LoadOptionsSize;
VOID *LoadOptions;

獲取代碼中已有的 LoadedImage 協議后,只需使用 ImageInfo 指針設置這些字段。

ImageInfo->LoadOptions = cmdline;
ImageInfo->LoadOptionsSize = cmdline_size;

加載選項的解釋取決於應用程序。 我相信 Shell 將其視為 Unicode 字符串(UCS-2)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM