26 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL,
29 OUT EFI_HANDLE *ImageHandle OPTIONAL,
30 IN CHAR16 *OptionalData OPTIONAL
35 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
41 Status =
gBS->LoadImage (
49 if (EFI_ERROR (Status)) {
50 DEBUG ((DEBUG_ERROR,
"OCM: Failed to load image - %r\n", Status));
54 DEBUG ((DEBUG_INFO,
"OCM: Loaded image at %p handle\n", NewHandle));
56 Status =
gBS->HandleProtocol (
61 if (!EFI_ERROR (Status)) {
64 "OCM: Loaded image has DeviceHandle %p FilePath %p ours DevicePath %p\n",
65 LoadedImage->DeviceHandle,
66 LoadedImage->FilePath,
74 if ((DevicePath != NULL) && (LoadedImage->DeviceHandle == NULL)) {
75 Status =
gBS->LocateDevicePath (
78 &LoadedImage->DeviceHandle
83 "OCM: LocateDevicePath on loaded handle %p - %r\n",
84 LoadedImage->DeviceHandle,
88 if (!EFI_ERROR (Status)) {
89 if (LoadedImage->FilePath != NULL) {
90 FreePool (LoadedImage->FilePath);
93 LoadedImage->FilePath = DuplicateDevicePath (DevicePath);
97 if (OptionalData != NULL) {
98 LoadedImage->LoadOptionsSize = (UINT32)StrSize (OptionalData);
99 LoadedImage->LoadOptions = AllocateCopyPool (LoadedImage->LoadOptionsSize, OptionalData);
103 Status =
gBS->StartImage (
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;
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)