187 IN CONST UINT16 *BootOrder,
188 IN EFI_GUID *BootGuid,
189 IN UINTN BootOrderCount
193 EFI_DEVICE_PATH_PROTOCOL *UefiDevicePath;
194 UINTN UefiDevicePathSize;
195 CHAR16 *DevicePathText;
198 EFI_LOAD_OPTION *LoadOption;
199 UINTN LoadOptionSize;
201 STATIC CONST CHAR16 *AppleDebugVariables[] = {
202 L
"efi-boot-device-data",
203 L
"efi-boot-next-data",
204 L
"efi-backup-boot-device-data",
205 L
"efi-apple-recovery-data"
208 STATIC CONST UINT16 ApplePredefinedVariables[] = {
212 for (Index = 0; Index <
ARRAY_SIZE (AppleDebugVariables); ++Index) {
213 Status = GetVariable2 (
214 AppleDebugVariables[Index],
216 (VOID **)&UefiDevicePath,
219 if (!EFI_ERROR (Status) && IsDevicePathValid (UefiDevicePath, UefiDevicePathSize)) {
220 DevicePathText = ConvertDevicePathToText (UefiDevicePath, FALSE, FALSE);
221 if (DevicePathText != NULL) {
222 DEBUG ((DEBUG_INFO,
"OCB: %s = %s\n", AppleDebugVariables[Index], DevicePathText));
223 FreePool (DevicePathText);
224 FreePool (UefiDevicePath);
228 FreePool (UefiDevicePath);
231 DEBUG ((DEBUG_INFO,
"OCB: %s - %r\n", AppleDebugVariables[Index], Status));
234 DEBUG ((DEBUG_INFO,
"OCB: Dumping BootOrder\n"));
236 for (Predefined = 0; Predefined < 2; ++Predefined) {
237 for (Index = 0; Index < BootOrderCount; ++Index) {
243 if (LoadOption == NULL) {
248 if (UefiDevicePath == NULL) {
251 "OCB: %u -> Boot%04x - failed to read\n",
255 FreePool (LoadOption);
259 DevicePathText = ConvertDevicePathToText (UefiDevicePath, FALSE, FALSE);
262 "OCB: %u -> Boot%04x = %s\n",
267 if (DevicePathText != NULL) {
268 FreePool (DevicePathText);
271 FreePool (LoadOption);
277 if (Predefined == 0) {
278 BootOrder = &ApplePredefinedVariables[0];
279 BootOrderCount =
ARRAY_SIZE (ApplePredefinedVariables);
280 DEBUG ((DEBUG_INFO,
"OCB: Parsing predefined list...\n"));
289 IN EFI_DEVICE_PATH_PROTOCOL *UefiDevicePath,
290 IN EFI_DEVICE_PATH_PROTOCOL *UefiRemainingDevicePath,
291 IN UINTN UefiDevicePathSize,
292 IN BOOLEAN IsBootNext
297 UINTN RootDevicePathSize;
299 EFI_DEVICE_PATH_PROTOCOL *OcDevicePath;
300 EFI_DEVICE_PATH_PROTOCOL *OcRemainingDevicePath;
302 RootDevicePathSize = ((UINT8 *)UefiRemainingDevicePath - (UINT8 *)UefiDevicePath);
304 if ((BootEntry->DevicePath == NULL) || ((BootEntry->Type &
OC_BOOT_SYSTEM) != 0)) {
308 OcDevicePath = BootEntry->DevicePath;
310 if ((GetDevicePathSize (OcDevicePath) - END_DEVICE_PATH_LENGTH) < RootDevicePathSize) {
314 CmpResult =
CompareMem (OcDevicePath, UefiDevicePath, RootDevicePathSize);
315 if (CmpResult != 0) {
325 OcRemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL *)(
326 (UINT8 *)OcDevicePath + RootDevicePathSize
334 if ( !IsDevicePathEnd (UefiRemainingDevicePath)
344 if (!IsDevicePathEnd (UefiRemainingDevicePath)) {
349 FreePool (BootEntry->DevicePath);
350 BootEntry->DevicePath = AllocateCopyPool (
579 IN EFI_GUID *BootVariableGuid,
580 IN BOOLEAN WithBootNext,
581 OUT UINTN *BootOrderCount,
582 OUT BOOLEAN *Deduplicated OPTIONAL,
583 OUT BOOLEAN *HasBootNext OPTIONAL,
584 IN BOOLEAN UseBootNextOnly
588 UINT32 VariableAttributes;
590 CHAR16 *BootOrderName;
591 CHAR16 *BootNextName;
596 BOOLEAN BootOrderChanged;
600 if (Deduplicated != NULL) {
601 *Deduplicated = FALSE;
604 if (HasBootNext != NULL) {
605 *HasBootNext = FALSE;
612 BootOrderName = EFI_BOOT_ORDER_VARIABLE_NAME;
613 BootNextName = EFI_BOOT_NEXT_VARIABLE_NAME;
620 VariableSize =
sizeof (BootNext);
621 Status =
gRT->GetVariable (
628 if (!EFI_ERROR (Status) && (VariableSize ==
sizeof (BootNext))) {
629 if (HasBootNext != NULL) {
633 WithBootNext = FALSE;
637 if (UseBootNextOnly) {
638 Status = EFI_ABORTED;
641 Status =
gRT->GetVariable (
649 if (Status == EFI_BUFFER_TOO_SMALL) {
650 BootOrder = AllocatePool ((UINTN)WithBootNext *
sizeof (BootNext) + VariableSize);
651 if (BootOrder == NULL) {
655 Status =
gRT->GetVariable (
660 BootOrder + (UINTN)WithBootNext
662 if ( EFI_ERROR (Status)
663 || (VariableSize <
sizeof (*BootOrder))
664 || (VariableSize %
sizeof (*BootOrder) != 0))
666 FreePool (BootOrder);
667 Status = EFI_UNSUPPORTED;
669 }
else if (!EFI_ERROR (Status)) {
670 Status = EFI_NOT_FOUND;
674 if (EFI_ERROR (Status)) {
676 BootOrder = AllocateCopyPool (
sizeof (BootNext), &BootNext);
677 if (BootOrder != NULL) {
687 BootOrder[0] = BootNext;
688 VariableSize +=
sizeof (*BootOrder);
691 BootOrderChanged = FALSE;
693 for (Index = 1; Index < VariableSize /
sizeof (BootOrder[0]); ++Index) {
694 for (Index2 = 0; Index2 < Index; ++Index2) {
695 if (BootOrder[Index] == BootOrder[Index2]) {
699 BootOrderChanged = TRUE;
702 &BootOrder[Index + 1],
703 VariableSize -
sizeof (BootOrder[0]) * (Index + 1)
705 VariableSize -=
sizeof (BootOrder[0]);
712 *BootOrderCount = VariableSize /
sizeof (*BootOrder);
713 if (Deduplicated != NULL) {
714 *Deduplicated = BootOrderChanged;
778 EFI_DEVICE_PATH *BootOptionDevicePath;
779 EFI_DEVICE_PATH *BootOptionRemainingDevicePath;
780 EFI_HANDLE DeviceHandle;
781 BOOLEAN MatchedEntry;
783 BOOLEAN IsAsciiOptionName;
784 EFI_GUID *BootVariableGuid;
785 CHAR16 *BootOrderName;
786 CHAR16 *BootVariableName;
787 CHAR16 *LoadOptionId;
788 VOID *LoadOptionName;
789 CHAR8 *FirstFlavourEnd;
791 UINT16 *NewBootOrder;
793 UINT16 EntryIdLength;
794 UINTN BootOrderCount;
795 UINTN BootChosenIndex;
797 UINTN DevicePathSize;
798 UINTN UnmanagedBootDevPathSize;
799 UINTN LoadOptionSize;
800 UINTN LoadOptionIdSize;
801 UINTN LoadOptionNameSize;
802 UINTN LoadOptionNameLen;
804 EFI_LOAD_OPTION *LoadOption;
808 EFI_DEVICE_PATH_PROTOCOL *UnmanagedBootDevPath;
809 VENDOR_DEVICE_PATH *DestCustomDevPath;
810 FILEPATH_DEVICE_PATH *DestCustomEntryName;
811 EFI_DEVICE_PATH_PROTOCOL *DestCustomEndNode;
816 if (!Context->AllowSetDefault) {
817 return EFI_SECURITY_VIOLATION;
823 if (Entry->DevicePath == NULL) {
824 return EFI_INVALID_PARAMETER;
830 UnmanagedBootDevPath = NULL;
831 if ((Entry->Type ==
OC_BOOT_UNMANAGED) && (Entry->UnmanagedBootGetFinalDevicePath != NULL)) {
832 UnmanagedBootDevPath = Entry->DevicePath;
833 Status = Entry->UnmanagedBootGetFinalDevicePath (Context, &UnmanagedBootDevPath);
834 if (EFI_ERROR (Status)) {
835 UnmanagedBootDevPath = NULL;
837 UnmanagedBootDevPathSize = GetDevicePathSize (UnmanagedBootDevPath);
841 if (Context->CustomBootGuid) {
847 BootOrderName = EFI_BOOT_ORDER_VARIABLE_NAME;
848 BootVariableName = L
"Boot0080";
860 MatchedEntry = FALSE;
861 BootChosenIndex = BootOrderCount;
862 for (Index = 0; Index < BootOrderCount; ++Index) {
863 if (BootOrder[Index] == 0x80) {
864 BootChosenIndex = Index;
868 if (BootChosenIndex != BootOrderCount) {
880 if (LoadOption == NULL) {
888 if (BootOptionDevicePath == NULL) {
889 FreePool (LoadOption);
893 if (UnmanagedBootDevPath != NULL) {
894 DevicePathSize = GetDevicePathSize (BootOptionDevicePath);
895 if (DevicePathSize >= UnmanagedBootDevPathSize) {
896 MatchedEntry =
CompareMem (BootOptionDevicePath, UnmanagedBootDevPath, UnmanagedBootDevPathSize) == 0;
899 BootOptionRemainingDevicePath = BootOptionDevicePath;
900 Status =
gBS->LocateDevicePath (
902 &BootOptionRemainingDevicePath,
906 if (!EFI_ERROR (Status)) {
909 BootOptionDevicePath,
910 BootOptionRemainingDevicePath,
911 LoadOption->FilePathListLength,
916 if (CustomDevPath != NULL) {
923 if (EntryProtocolDevPath != NULL) {
933 FreePool (LoadOption);
940 ASSERT (Entry->Name != NULL);
941 IsAsciiOptionName = FALSE;
942 if (Entry->Id == NULL) {
946 LoadOptionName = Entry->Name;
947 LoadOptionNameSize = StrSize (Entry->Name);
949 LoadOptionId = LoadOptionName;
950 LoadOptionIdSize = LoadOptionNameSize;
956 LoadOptionId = Entry->Id;
957 LoadOptionIdSize = StrSize (Entry->Id);
959 if ((Entry->Flavour != NULL) && (Entry->Flavour[0] !=
'\0') && (Entry->Flavour[0] !=
':')) {
961 if (FirstFlavourEnd != NULL) {
962 LoadOptionNameLen = FirstFlavourEnd - Entry->Flavour;
964 LoadOptionNameLen = AsciiStrLen (Entry->Flavour);
967 IsAsciiOptionName = TRUE;
968 LoadOptionNameSize = (LoadOptionNameLen + 1) *
sizeof (CHAR16) /
sizeof (CHAR8);
969 LoadOptionName = Entry->Flavour;
971 LoadOptionName = LoadOptionId;
972 LoadOptionNameSize = LoadOptionIdSize;
976 if (UnmanagedBootDevPath != NULL) {
977 DevicePathSize = UnmanagedBootDevPathSize;
978 }
else if (!Entry->IsCustom) {
979 DevicePathSize = GetDevicePathSize (Entry->DevicePath);
982 + (Entry->IsBootEntryProtocol ?
sizeof (EFI_GUID) : 0)
984 +
sizeof (EFI_DEVICE_PATH_PROTOCOL);
986 if (LoadOptionIdSize > MAX_UINT16) {
989 IsOverflow = BaseOverflowAddU16 (SIZE_OF_FILEPATH_DEVICE_PATH, (UINT16)LoadOptionIdSize, &EntryIdLength);
993 DEBUG ((DEBUG_ERROR,
"OCB: Overflowing option id size (%u)\n", LoadOptionIdSize));
994 if (BootOrder != NULL) {
995 FreePool (BootOrder);
998 return EFI_INVALID_PARAMETER;
1002 LoadOptionSize =
sizeof (EFI_LOAD_OPTION) + LoadOptionNameSize + DevicePathSize;
1004 LoadOption = AllocatePool (LoadOptionSize);
1005 if (LoadOption == NULL) {
1006 DEBUG ((DEBUG_INFO,
"OCB: Failed to allocate default option (%u)\n", (UINT32)LoadOptionSize));
1007 if (BootOrder != NULL) {
1008 FreePool (BootOrder);
1011 return EFI_OUT_OF_RESOURCES;
1014 LoadOption->Attributes = LOAD_OPTION_ACTIVE | LOAD_OPTION_CATEGORY_BOOT;
1015 LoadOption->FilePathListLength = (UINT16)DevicePathSize;
1016 if (IsAsciiOptionName) {
1017 Status = AsciiStrnToUnicodeStrS (LoadOptionName, LoadOptionNameLen, (CHAR16 *)(LoadOption + 1), LoadOptionNameSize /
sizeof (CHAR16), &CopiedLength);
1018 ASSERT_EFI_ERROR (Status);
1019 ASSERT (CopiedLength == LoadOptionNameLen);
1021 CopyMem (LoadOption + 1, LoadOptionName, LoadOptionNameSize);
1024 if (UnmanagedBootDevPath != NULL) {
1025 CopyMem ((UINT8 *)(LoadOption + 1) + LoadOptionNameSize, UnmanagedBootDevPath, DevicePathSize);
1026 }
else if (!Entry->IsCustom) {
1027 CopyMem ((UINT8 *)(LoadOption + 1) + LoadOptionNameSize, Entry->DevicePath, DevicePathSize);
1029 DestCustomDevPath = (VENDOR_DEVICE_PATH *)(
1030 (UINT8 *)(LoadOption + 1) + LoadOptionNameSize
1032 if (Entry->IsBootEntryProtocol) {
1039 DestCustomDevPath + 1,
1040 &Entry->UniquePartitionGUID,
1043 DestCustomEntryName = (FILEPATH_DEVICE_PATH *)(
1044 (UINT8 *)(DestCustomDevPath + 1) +
1053 DestCustomEntryName = (FILEPATH_DEVICE_PATH *)(
1054 (UINT8 *)(DestCustomDevPath + 1)
1059 DestCustomEntryName->PathName,
1064 DestCustomEntryName->Header.Length[0] = (UINT8)EntryIdLength;
1065 DestCustomEntryName->Header.Length[1] = (UINT8)(EntryIdLength >> 8);
1067 DestCustomEndNode = (EFI_DEVICE_PATH_PROTOCOL *)(
1068 (UINT8 *)DestCustomEntryName + EntryIdLength
1070 SetDevicePathEndNode (DestCustomEndNode);
1072 ASSERT (GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *)DestCustomDevPath) == DevicePathSize);
1075 Status =
gRT->SetVariable (
1078 EFI_VARIABLE_BOOTSERVICE_ACCESS
1079 | EFI_VARIABLE_RUNTIME_ACCESS
1080 | EFI_VARIABLE_NON_VOLATILE,
1085 FreePool (LoadOption);
1087 if (UnmanagedBootDevPath != NULL) {
1088 FreePool (UnmanagedBootDevPath);
1089 UnmanagedBootDevPath = NULL;
1092 if (EFI_ERROR (Status)) {
1095 "OCB: Failed to set default entry Boot0080 - %r\n",
1098 if (BootOrder != NULL) {
1099 FreePool (BootOrder);
1105 DEBUG ((DEBUG_INFO,
"OCB: Matched default entry in BootOrder\n"));
1106 BootChosenIndex = Index;
1112 if (BootChosenIndex != BootOrderCount) {
1113 BootTmp = BootOrder[0];
1114 BootOrder[0] = BootOrder[BootChosenIndex];
1115 BootOrder[BootChosenIndex] = BootTmp;
1116 NewBootOrder = BootOrder;
1120 "OCB: Found default entry in BootOrder, reordering %X <-> %X\n",
1122 NewBootOrder[BootChosenIndex]
1127 "OCB: Adding default entry Boot0080 to BootOrder\n"
1130 NewBootOrder = AllocatePool ((BootOrderCount + 1) *
sizeof (*BootOrder));
1131 if (NewBootOrder == NULL) {
1132 if (BootOrder != NULL) {
1133 FreePool (BootOrder);
1136 return EFI_OUT_OF_RESOURCES;
1139 NewBootOrder[0] = 0x80;
1140 CopyMem (&NewBootOrder[1], &BootOrder[0], BootOrderCount *
sizeof (*BootOrder));
1142 if (BootOrder != NULL) {
1143 FreePool (BootOrder);
1149 Status =
gRT->SetVariable (
1152 EFI_VARIABLE_BOOTSERVICE_ACCESS
1153 | EFI_VARIABLE_RUNTIME_ACCESS
1154 | EFI_VARIABLE_NON_VOLATILE,
1155 BootOrderCount *
sizeof (*BootOrder),
1159 FreePool (NewBootOrder);
1161 if (EFI_ERROR (Status)) {
1164 "OCB: Failed to set default BootOrder - %r\n",
1249 IN CONST CHAR16 *OptionName,
1250 IN EFI_HANDLE DeviceHandle,
1252 IN BOOLEAN ShortForm,
1253 IN CONST CHAR16 *MatchSuffix,
1254 IN UINTN MatchSuffixLen
1258 EFI_LOAD_OPTION *Option;
1259 UINTN OptionNameSize;
1260 UINTN ReferencePathSize;
1262 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
1263 EFI_DEVICE_PATH_PROTOCOL *CurrDevicePath;
1266 UINTN BootOrderSize;
1267 UINT32 BootOrderAttributes;
1268 BOOLEAN CurrOptionExists;
1269 BOOLEAN CurrOptionValid;
1270 EFI_DEVICE_PATH_PROTOCOL *ShortFormPath;
1271 EFI_DEVICE_PATH_PROTOCOL *ReferencePath;
1272 CHAR16 BootOptionVariable[
L_STR_LEN (L
"Boot####") + 1];
1273 UINT16 BootOptionIndex;
1276 Status =
gBS->HandleProtocol (
1279 (VOID **)&DevicePath
1281 if (EFI_ERROR (Status)) {
1282 DEBUG ((DEBUG_INFO,
"OCB: Failed to obtain device path for boot option - %r\n", Status));
1287 if (DevicePath == NULL) {
1288 DEBUG ((DEBUG_INFO,
"OCB: Failed to append %s loader path for boot option - %r\n",
FilePath));
1289 return EFI_OUT_OF_RESOURCES;
1292 ReferencePath = DevicePath;
1300 if (ShortFormPath != NULL) {
1301 ReferencePath = ShortFormPath;
1305 CurrOptionValid = FALSE;
1306 CurrOptionExists = FALSE;
1309 Status =
gRT->GetVariable (
1310 EFI_BOOT_ORDER_VARIABLE_NAME,
1312 &BootOrderAttributes,
1319 "OCB: Have existing order of size %u - %r\n",
1320 (UINT32)BootOrderSize,
1326 if ((Status == EFI_BUFFER_TOO_SMALL) && (BootOrderSize > 0) && (BootOrderSize %
sizeof (UINT16) == 0)) {
1327 BootOrder = AllocateZeroPool (BootOrderSize +
sizeof (UINT16));
1328 if (BootOrder == NULL) {
1329 DEBUG ((DEBUG_INFO,
"OCB: Failed to allocate boot order\n"));
1330 return EFI_OUT_OF_RESOURCES;
1333 Status =
gRT->GetVariable (
1334 EFI_BOOT_ORDER_VARIABLE_NAME,
1336 &BootOrderAttributes,
1338 (VOID *)(BootOrder + 1)
1341 if (EFI_ERROR (Status) || (BootOrderSize == 0) || (BootOrderSize %
sizeof (UINT16) != 0)) {
1342 DEBUG ((DEBUG_INFO,
"OCB: Failed to obtain boot order %u - %r\n", (UINT32)BootOrderSize, Status));
1343 FreePool (BootOrder);
1344 return EFI_OUT_OF_RESOURCES;
1352 BootOrderSize /
sizeof (*BootOrder),
1356 CurrOptionExists = Option != NULL;
1357 if (CurrOptionExists) {
1367 "OCB: %a existing option at Boot%04x, %a\n",
1368 CurrOptionExists ?
"Have" :
"No",
1369 BootOrder != NULL ? BootOrder[1] : 0,
1370 CurrOptionValid ?
"valid" :
"invalid"
1373 if (!CurrOptionValid) {
1377 if (!CurrOptionExists) {
1389 for (BootOptionIndex = 1; BootOptionIndex < 0xFFFF; ++BootOptionIndex) {
1390 for (OrderIndex = 0; OrderIndex < BootOrderSize /
sizeof (*BootOrder); ++OrderIndex) {
1391 if (BootOrder[OrderIndex + 1] == BootOptionIndex) {
1396 if (OrderIndex == BootOrderSize /
sizeof (*BootOrder)) {
1404 sizeof (BootOptionVariable),
1409 OptionNameSize = StrSize (OptionName);
1410 ReferencePathSize = GetDevicePathSize (ReferencePath);
1411 OptionSize =
sizeof (EFI_LOAD_OPTION) + OptionNameSize + ReferencePathSize;
1413 DEBUG ((DEBUG_INFO,
"OCB: Creating boot option %s of %u bytes\n", OptionName, (UINT32)OptionSize));
1415 Option = AllocatePool (OptionSize);
1416 if (Option == NULL) {
1417 DEBUG ((DEBUG_INFO,
"OCB: Failed to allocate boot option (%u)\n", (UINT32)OptionSize));
1418 FreePool (DevicePath);
1419 return EFI_OUT_OF_RESOURCES;
1422 Option->Attributes = LOAD_OPTION_ACTIVE | LOAD_OPTION_CATEGORY_BOOT;
1423 Option->FilePathListLength = (UINT16)ReferencePathSize;
1424 CopyMem (Option + 1, OptionName, OptionNameSize);
1425 CopyMem ((UINT8 *)(Option + 1) + OptionNameSize, ReferencePath, ReferencePathSize);
1427 Status =
gRT->SetVariable (
1430 EFI_VARIABLE_BOOTSERVICE_ACCESS
1431 | EFI_VARIABLE_RUNTIME_ACCESS
1432 | EFI_VARIABLE_NON_VOLATILE,
1438 FreePool (DevicePath);
1440 if (EFI_ERROR (Status)) {
1441 DEBUG ((DEBUG_INFO,
"OCB: Failed to store boot option - %r\n", Status));
1446 if (BootOrderSize != 0) {
1447 if (BootOrder[1] == BootOptionIndex) {
1448 DEBUG ((DEBUG_INFO,
"OCB: Boot order has first option as the default option\n"));
1449 FreePool (BootOrder);
1453 BootOrder[0] = BootOptionIndex;
1456 while (Index <= BootOrderSize /
sizeof (UINT16)) {
1457 if (BootOrder[Index] == BootOptionIndex) {
1458 DEBUG ((DEBUG_INFO,
"OCB: Moving boot option to the front from %u position\n", (UINT32)Index));
1461 &BootOrder[Index + 1],
1462 BootOrderSize - Index *
sizeof (UINT16)
1464 BootOrderSize -=
sizeof (UINT16);
1470 Status =
gRT->SetVariable (
1471 EFI_BOOT_ORDER_VARIABLE_NAME,
1473 EFI_VARIABLE_BOOTSERVICE_ACCESS
1474 | EFI_VARIABLE_RUNTIME_ACCESS
1475 | EFI_VARIABLE_NON_VOLATILE,
1476 BootOrderSize +
sizeof (UINT16),
1480 FreePool (BootOrder);
1482 Status =
gRT->SetVariable (
1483 EFI_BOOT_ORDER_VARIABLE_NAME,
1485 EFI_VARIABLE_BOOTSERVICE_ACCESS
1486 | EFI_VARIABLE_RUNTIME_ACCESS
1487 | EFI_VARIABLE_NON_VOLATILE,
1493 DEBUG ((DEBUG_INFO,
"OCB: Wrote new boot order with boot option - %r\n", Status));
1530 IN EFI_HANDLE ParentHandle,
1531 OUT EFI_HANDLE *EntryHandle,
1533 OUT VOID **CustomFreeContext
1537 EFI_STATUS OptionalStatus;
1538 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
1539 EFI_HANDLE StorageHandle;
1540 EFI_DEVICE_PATH_PROTOCOL *StoragePath;
1541 CHAR16 *UnicodeDevicePath;
1542 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
1544 UINT32 EntryDataSize;
1548 ASSERT (BootEntry != NULL);
1554 ASSERT (Context != NULL);
1555 ASSERT (DmgLoadContext != NULL);
1561 ZeroMem (DmgLoadContext,
sizeof (*DmgLoadContext));
1565 StorageHandle = NULL;
1567 *CustomFreeContext = NULL;
1568 ZeroMem (&DmgPreloadContext,
sizeof (DmgPreloadContext));
1576 if (BootEntry->CustomRead != NULL) {
1577 Status = BootEntry->CustomRead (
1578 Context->StorageContext,
1585 Context->DmgLoading,
1590 if (EFI_ERROR (Status)) {
1591 DEBUG ((DEBUG_WARN,
"OCB: Custom read failed - %r\n", Status));
1596 if ( (DmgPreloadContext.
DmgFile != NULL)
1598 || BootEntry->IsFolder)
1601 return EFI_SECURITY_VIOLATION;
1604 DmgLoadContext->DevicePath = BootEntry->DevicePath;
1607 Context->DmgLoading,
1610 if (DevicePath == NULL) {
1611 return EFI_UNSUPPORTED;
1613 }
else if (BootEntry->CustomRead == NULL) {
1614 DevicePath = BootEntry->DevicePath;
1617 DEBUG_CODE_BEGIN ();
1618 ASSERT (DevicePath != NULL);
1619 UnicodeDevicePath = ConvertDevicePathToText (DevicePath, FALSE, FALSE);
1622 "OCB: Perform boot %s to dp %s (%p/%u)\n",
1624 UnicodeDevicePath != NULL ? UnicodeDevicePath : L
"<null>",
1628 if (UnicodeDevicePath != NULL) {
1629 FreePool (UnicodeDevicePath);
1634 Status =
gBS->LoadImage (
1643 if (EntryData != NULL) {
1644 FreePool (EntryData);
1647 if (!EFI_ERROR (Status)) {
1648 OptionalStatus =
gBS->HandleProtocol (
1651 (VOID **)&LoadedImage
1653 if (!EFI_ERROR (OptionalStatus)) {
1656 "OCB: Matching <%a>/%p[%u] args on type %u\n",
1657 Context->AppleBootArgs,
1658 BootEntry->LoadOptions,
1659 BootEntry->LoadOptionsSize,
1663 LoadedImage->LoadOptionsSize = 0;
1664 LoadedImage->LoadOptions = NULL;
1666 if ((BootEntry->LoadOptions == NULL) && ((BootEntry->Type &
OC_BOOT_APPLE_ANY) != 0)) {
1667 Args = Context->AppleBootArgs;
1669 Args = BootEntry->LoadOptions;
1675 if ((Args != NULL) && (Args[0] !=
'\0')) {
1685 LoadedImage->LoadOptions
1692 "OCB: Custom (%u) DeviceHandle %p FilePath %p\n",
1694 LoadedImage->DeviceHandle,
1695 LoadedImage->FilePath
1703 if ((LoadedImage->DeviceHandle == NULL) && (StorageHandle != NULL)) {
1704 if (LoadedImage->FilePath != NULL) {
1705 FreePool (LoadedImage->FilePath);
1708 LoadedImage->DeviceHandle = StorageHandle;
1709 LoadedImage->FilePath = StoragePath;
1715 if (BootEntry->CustomFree != NULL) {
1716 BootEntry->CustomFree (*CustomFreeContext);
EFI_STATUS OcRegisterBootstrapBootOption(IN CONST CHAR16 *OptionName, IN EFI_HANDLE DeviceHandle, IN CONST CHAR16 *FilePath, IN BOOLEAN ShortForm, IN CONST CHAR16 *MatchSuffix, IN UINTN MatchSuffixLen)
EFI_STATUS InternalLoadBootEntry(IN OC_PICKER_CONTEXT *Context, IN OC_BOOT_ENTRY *BootEntry, IN EFI_HANDLE ParentHandle, OUT EFI_HANDLE *EntryHandle, OUT INTERNAL_DMG_LOAD_CONTEXT *DmgLoadContext, OUT VOID **CustomFreeContext)
STATIC EFI_STATUS InternalRegisterBootstrapBootOption(IN CONST CHAR16 *OptionName, IN EFI_HANDLE DeviceHandle, IN CONST CHAR16 *FilePath, IN BOOLEAN ShortForm, IN CONST CHAR16 *MatchSuffix, IN UINTN MatchSuffixLen)
UINT16 * InternalGetBootOrderForBooting(IN EFI_GUID *BootVariableGuid, IN BOOLEAN BlacklistAppleUpdate, OUT UINTN *BootOrderCount, IN BOOLEAN UseBootNextOnly)
UINT16 * OcGetBootOrder(IN EFI_GUID *BootVariableGuid, IN BOOLEAN WithBootNext, OUT UINTN *BootOrderCount, OUT BOOLEAN *Deduplicated OPTIONAL, OUT BOOLEAN *HasBootNext OPTIONAL, IN BOOLEAN UseBootNextOnly)
EFI_LOAD_OPTION * InternalGetBoostrapOptionData(OUT UINTN *LoadOptionSize, OUT UINT16 *BootOption, OUT EFI_DEVICE_PATH_PROTOCOL **LoadPath, IN UINT16 *BootOptions, IN UINTN NumBootOptions, IN CONST CHAR16 *MatchSuffix, IN UINTN MatchSuffixLen)
STATIC BOOLEAN InternalMatchBootEntryByDevicePath(IN OUT OC_BOOT_ENTRY *BootEntry, IN EFI_DEVICE_PATH_PROTOCOL *UefiDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *UefiRemainingDevicePath, IN UINTN UefiDevicePathSize, IN BOOLEAN IsBootNext)