18#include <Protocol/DevicePath.h> 
   19#include <Protocol/LoadedImage.h> 
   21#include <Library/UefiLib.h> 
   22#include <Library/BaseMemoryLib.h> 
   24#include <Library/DevicePathLib.h> 
   25#include <Library/MemoryAllocationLib.h> 
   29#include <Library/UefiBootServicesTableLib.h> 
   30#include <Library/UefiRuntimeServicesTableLib.h> 
   31#include <Library/UefiApplicationEntryPoint.h> 
   36  IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *FileSystem,
 
   37  IN  EFI_HANDLE                       DeviceHandle,
 
   38  IN  EFI_DEVICE_PATH_PROTOCOL         *LoaderDevicePath
 
   48  EFI_DEVICE_PATH_PROTOCOL  *ImagePath;
 
   50  ASSERT (FileSystem != NULL);
 
   62  if (LoaderPath != NULL) {
 
   63    LoaderPathSize = StrSize (LoaderPath);
 
   67      DEBUG ((DEBUG_INFO, 
"BS: Relative path - %s\n", LoaderPath));
 
   68      PrefixPathSize = StrSize (LoaderPath);
 
   70        RootPathLength             = PrefixPathSize / 
sizeof (CHAR16) - 1;
 
   71        LoaderPath[RootPathLength] = 
'\\';
 
   74        DEBUG ((DEBUG_INFO, 
"BS: Startup path - %s (%p)\n", LoaderPath, 
Buffer));
 
   77          ImagePath = FileDevicePath (DeviceHandle, LoaderPath);
 
   78          if (ImagePath == NULL) {
 
   79            DEBUG ((DEBUG_INFO, 
"BS: File DP allocation failure, aborting\n"));
 
   87    FreePool (LoaderPath);
 
   96      "BS: Fallback to absolute path - %s\n",
 
  116    ASSERT (ImagePath == NULL);
 
  117    DEBUG ((DEBUG_ERROR, 
"BS: Failed to locate valid OpenCore image - %p!\n", 
Buffer));
 
  118    return EFI_NOT_FOUND;
 
  121  DEBUG ((DEBUG_INFO, 
"BS: Read OpenCore image of %Lu bytes\n", (UINT64)BufferSize));
 
  134  DEBUG ((DEBUG_ERROR, 
"BS: Failed to start OpenCore image - %r\n", Status));
 
  136  FreePool (ImagePath);
 
 
  144  IN EFI_HANDLE        ImageHandle,
 
  145  IN EFI_SYSTEM_TABLE  *SystemTable
 
  149  EFI_LOADED_IMAGE_PROTOCOL        *LoadedImage;
 
  150  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *FileSystem;
 
  152  DEBUG ((DEBUG_INFO, 
"BS: Starting OpenCore application...\n"));
 
  161  Status      = 
gBS->HandleProtocol (
 
  164                       (VOID **)&LoadedImage
 
  167  if (EFI_ERROR (Status)) {
 
  168    DEBUG ((DEBUG_ERROR, 
"BS: Failed to locate loaded image - %r\n", Status));
 
  169    return EFI_NOT_FOUND;
 
  178                 LoadedImage->DeviceHandle,
 
  179                 LoadedImage->FilePath
 
  182  if (FileSystem == NULL) {
 
  183    DEBUG ((DEBUG_ERROR, 
"BS: Failed to obtain own file system\n"));
 
  184    return EFI_NOT_FOUND;
 
  187  DEBUG ((DEBUG_INFO, 
"BS: Trying to load OpenCore image...\n"));
 
  188  Status = 
LoadOpenCore (FileSystem, LoadedImage->DeviceHandle, LoadedImage->FilePath);
 
  189  DEBUG ((DEBUG_WARN, 
"BS: Failed to load OpenCore from disk - %r\n", Status));
 
 
STATIC EFI_STATUS LoadOpenCore(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN EFI_HANDLE DeviceHandle, IN EFI_DEVICE_PATH_PROTOCOL *LoaderDevicePath)
 
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
 
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
 
CHAR16 * OcCopyDevicePathFullName(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, OUT EFI_DEVICE_PATH_PROTOCOL **FileDevicePath OPTIONAL)
 
VOID * OcReadFile(IN CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN CONST UINT32 MaxFileSize OPTIONAL)
 
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * OcLocateFileSystem(IN EFI_HANDLE DeviceHandle OPTIONAL, IN EFI_DEVICE_PATH_PROTOCOL *FilePath OPTIONAL)
 
#define OPEN_CORE_APP_PATH
 
#define OPEN_CORE_ROOT_PATH
 
EFI_STATUS OcLoadAndRunImage(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL, IN VOID *Buffer OPTIONAL, IN UINTN BufferSize, OUT EFI_HANDLE *ImageHandle OPTIONAL, IN CHAR16 *OptionalData OPTIONAL)
 
#define L_STR_SIZE(String)
 
BOOLEAN UnicodeGetParentDirectory(IN OUT CHAR16 *String)
 
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
 
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
 
EFI_GUID gEfiLoadedImageProtocolGuid