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