写一个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
...