OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
ImageRunner.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16#include <Library/BaseLib.h>
17#include <Library/DebugLib.h>
18#include <Library/DevicePathLib.h>
19#include <Library/MemoryAllocationLib.h>
20#include <Library/UefiBootServicesTableLib.h>
21#include <Protocol/LoadedImage.h>
22#include <Protocol/SimpleFileSystem.h>
23
24EFI_STATUS
26 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL,
27 IN VOID *Buffer OPTIONAL,
28 IN UINTN BufferSize,
29 OUT EFI_HANDLE *ImageHandle OPTIONAL,
30 IN CHAR16 *OptionalData OPTIONAL
31 )
32{
33 EFI_STATUS Status;
34 EFI_HANDLE NewHandle;
35 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
36
37 //
38 // Run OpenCore image
39 //
40 NewHandle = NULL;
41 Status = gBS->LoadImage (
42 FALSE,
44 DevicePath,
45 Buffer,
46 BufferSize,
47 &NewHandle
48 );
49 if (EFI_ERROR (Status)) {
50 DEBUG ((DEBUG_ERROR, "OCM: Failed to load image - %r\n", Status));
51 return Status;
52 }
53
54 DEBUG ((DEBUG_INFO, "OCM: Loaded image at %p handle\n", NewHandle));
55
56 Status = gBS->HandleProtocol (
57 NewHandle,
59 (VOID **)&LoadedImage
60 );
61 if (!EFI_ERROR (Status)) {
62 DEBUG ((
63 DEBUG_INFO,
64 "OCM: Loaded image has DeviceHandle %p FilePath %p ours DevicePath %p\n",
65 LoadedImage->DeviceHandle,
66 LoadedImage->FilePath,
67 DevicePath
68 ));
69 //
70 // Some fragile firmware fail to properly set LoadedImage when buffer is provided.
71 // REF: https://github.com/acidanthera/bugtracker/issues/712
72 // REF: https://github.com/acidanthera/bugtracker/issues/1502
73 //
74 if ((DevicePath != NULL) && (LoadedImage->DeviceHandle == NULL)) {
75 Status = gBS->LocateDevicePath (
77 &DevicePath,
78 &LoadedImage->DeviceHandle
79 );
80
81 DEBUG ((
82 DEBUG_INFO,
83 "OCM: LocateDevicePath on loaded handle %p - %r\n",
84 LoadedImage->DeviceHandle,
85 Status
86 ));
87
88 if (!EFI_ERROR (Status)) {
89 if (LoadedImage->FilePath != NULL) {
90 FreePool (LoadedImage->FilePath);
91 }
92
93 LoadedImage->FilePath = DuplicateDevicePath (DevicePath);
94 }
95 }
96
97 if (OptionalData != NULL) {
98 LoadedImage->LoadOptionsSize = (UINT32)StrSize (OptionalData);
99 LoadedImage->LoadOptions = AllocateCopyPool (LoadedImage->LoadOptionsSize, OptionalData);
100 }
101 }
102
103 Status = gBS->StartImage (
104 NewHandle,
105 NULL,
106 NULL
107 );
108
109 if (EFI_ERROR (Status)) {
110 DEBUG ((DEBUG_WARN, "OCM: Failed to start image - %r\n", Status));
111 gBS->UnloadImage (NewHandle);
112 } else if (ImageHandle != NULL) {
113 *ImageHandle = NewHandle;
114 }
115
116 return Status;
117}
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)
Definition ImageRunner.c:25
EFI_HANDLE gImageHandle
EFI_BOOT_SERVICES * gBS
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiLoadedImageProtocolGuid