UEFI shell - shell下实现加载标准应用程序

写一个shell app实现加载标准应用应用程序(HelloWrold.efi)
代码实现:

1. c文件
edk2/ShellPkg/Application/TestLoadImage/TestLoadImage.c
/** @file
  This is a test for Test  Load  Image

**/

#include "TestLoadImage.h"

/**
  UEFI application entry point which has an interface similar to a
  standard C main function.

  The ShellCEntryLib library instance wrappers the actual UEFI application
  entry point and calls this ShellAppMain function.

  @param  Argc             Argument count
  @param  Argv             The parsed arguments

  @retval  0               The application exited normally.
  @retval  Other           An error occurred.

**/
INTN
EFIAPI
ShellAppMain (
  IN UINTN Argc,
  IN CHAR16 **Argv
  )
{
  EFI_STATUS                     Status;
  EFI_DEVICE_PATH_PROTOCOL       *DevicePath = NULL;
  EFI_SHELL_PROTOCOL             *ShellProtocolInterface = NULL;
  EFI_SHELL_ENVIRONMENT2         *ShellEnvironment2Interface = NULL;
  EFI_HANDLE	                   NewHandle;

  if (Argc != 2) {
    Print (L"please input argc 2!\n");
    return EFI_SUCCESS;
  }

  Status = gBS->LocateProtocol (
                  &gEfiShellProtocolGuid,
                  NULL,
                  (VOID **)&ShellProtocolInterface
                  );
  if (EFI_ERROR (Status)) {
    Print (L"locate gEfiShellProtocolGuid is error!\n");
    return Status;
  }

  if (ShellProtocolInterface != NULL) {
    DevicePath = ShellProtocolInterface->GetDevicePathFromFilePath(Argv[1]);
  } else {
      Status = gBS->LocateProtocol (
                  &gEfiShellEnvironment2Guid,
                  NULL,
                  (VOID **)&ShellEnvironment2Interface
                  );
      if (EFI_ERROR (Status)) {
      Print (L"locate gEfiShellEnvironment2Guid is error!\n");
      return Status;
      } else {
        DevicePath = ShellEnvironment2Interface->NameToPath (Argv[1]);
      }
  }
  
  Status = gBS->LoadImage (
                  FALSE,
                  gImageHandle,
                  DevicePath,
                  NULL,
                  0,
                  &NewHandle
                  ); 
  if (EFI_ERROR (Status)) {
    Print (L"Load image is error!\n");
    if (NewHandle != NULL) {
      gBS->UnloadImage (NewHandle);
    }
    return Status;
  }

  Status = gBS->StartImage (
                  NewHandle,
                  0,
                  NULL
                  );
  if (EFI_ERROR (Status)) {
    Print (L"Start image is error!\n");
    if (NewHandle != NULL) {
      gBS->UnloadImage (NewHandle);
    }
    return Status;
  }

  return EFI_SUCCESS;
}

2. inf文件
edk2/ShellPkg/Application/TestLoadImage/TestLoadImage.inf
## @file
#  
#  TestLoadImage
#
#
##

[Defines]
  INF_VERSION                    = 0x00010006
  BASE_NAME                      = TestLoadImage
  FILE_GUID                      = 079E8E98-AE93-1111-8A71-12C845F23E09
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = ShellCEntryLib



[Sources]
  TestLoadImage.c
  TestLoadImage.h

[Packages]
  MdePkg/MdePkg.dec
  ShellPkg/ShellPkg.dec
  MdeModulePkg/MdeModulePkg.dec

[LibraryClasses]
  ShellCEntryLib
  UefiLib
  UefiBootServicesTableLib
  BaseMemoryLib
  MemoryAllocationLib
  ShellLib

[Protocols]
  gEfiShellProtocolGuid
	gEfiShellEnvironment2Guid 

3. h文件
edk2/ShellPkg/Application/TestLoadImage/TestLoadImage.h
/** @file

  a head for Test  Load  Image

  Copyright (c) 2019 GreatWall All rigths reserved.<BR>

**/
#ifndef    TEST_SHOW_BMP_
#define    TEST_SHOW_BMP_

#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/DebugLib.h>
#include <Library/ShellCEntryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/ShellLib.h>


#endif

4. dsc文件
edk2/OvmfPkg/OvmfPkgX64.dsc
  #
  # DXE Phase modules
  #

...

ShellPkg/Application/TestLoadImage/TestLoadImage.inf

...
5. 结果

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值