22 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00,
23 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00,
24 0xFF, 0xFF, 0xF9, 0xFF, 0x00, 0x00, 0x00, 0x00,
25 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B,
26 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B,
27 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00
37 return AllocateCopyPool (
L_STR_SIZE (
"Windows (legacy)"),
"Windows (legacy)");
53 IN EFI_HANDLE DiskHandle
58 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
62 Status =
gBS->HandleProtocol (
67 if (EFI_ERROR (Status)) {
77 DEBUG ((DEBUG_INFO,
"OLB: %s %s not present\n", L
".contentDetails", L
".disk_label.contentDetails"));
79 DEBUG ((DEBUG_INFO,
"OLB: Found disk label '%a'\n",
DiskLabel));
98 if (Entry->Id != NULL) {
99 FreePool ((CHAR8 *)Entry->Id);
102 if (Entry->Name != NULL) {
103 FreePool ((CHAR8 *)Entry->Name);
106 if (Entry->Flavour != NULL) {
107 FreePool ((CHAR8 *)Entry->Flavour);
115 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
119 EFI_HANDLE DiskHandle;
120 EFI_HANDLE LoadedImageHandle;
121 EFI_DEVICE_PATH_PROTOCOL *LoadedImageDevicePath;
122 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
124 CONST CHAR8 *AppleBootArg;
131 if (EFI_ERROR (Status)) {
132 DEBUG ((DEBUG_INFO,
"OLB: Failure while setting BootCampHD variable - %r\n", Status));
146 if (DiskHandle == NULL) {
147 return EFI_INVALID_PARAMETER;
152 &LoadedImageDevicePath,
155 if (EFI_ERROR (Status)) {
156 DEBUG ((DEBUG_INFO,
"OLB: Failure while loading Apple legacy interface - %r\n", Status));
163 Status =
gBS->HandleProtocol (
166 (VOID **)&LoadedImage
168 if (EFI_ERROR (Status)) {
169 DEBUG ((DEBUG_INFO,
"OLB: Failure while loading Apple legacy interface - %r\n", Status));
170 gBS->UnloadImage (LoadedImageHandle);
174 LoadedImage->LoadOptionsSize = 0;
175 LoadedImage->LoadOptions = NULL;
181 }
else if (IsExternal) {
182 AppleBootArg =
"USB";
193 DEBUG ((DEBUG_INFO,
"OLB: Apple legacy interface args <%s>\n", LoadedImage->LoadOptions));
195 Status =
gBS->StartImage (LoadedImageHandle, NULL, NULL);
196 if (EFI_ERROR (Status)) {
197 DEBUG ((DEBUG_INFO,
"OLB: Failure while starting Apple legacy interface - %r\n", Status));
198 gBS->UnloadImage (LoadedImageHandle);
203 if (EFI_ERROR (Status)) {
204 DEBUG ((DEBUG_INFO,
"OLB: Failure while starting legacy PBR interface - %r\n", Status));
216 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
220 EFI_HANDLE LoadedImageHandle;
221 EFI_DEVICE_PATH_PROTOCOL *LoadedImageDevicePath;
222 EFI_DEVICE_PATH_PROTOCOL *AppleLoaderDevicePath;
229 if (EFI_ERROR (Status)) {
230 DEBUG ((DEBUG_INFO,
"OLB: Failure while setting BootCampHD variable - %r\n", Status));
245 &LoadedImageDevicePath,
248 if (EFI_ERROR (Status)) {
249 DEBUG ((DEBUG_INFO,
"OLB: Failure while loading Apple legacy interface - %r\n", Status));
253 gBS->UnloadImage (LoadedImageHandle);
255 AppleLoaderDevicePath = DuplicateDevicePath (LoadedImageDevicePath);
260 if (AppleLoaderDevicePath == NULL) {
261 return EFI_OUT_OF_RESOURCES;
264 *DevicePath = AppleLoaderDevicePath;
273 IN CONST EFI_HANDLE Device OPTIONAL,
275 OUT UINTN *NumEntries
282 UINTN DevicePathIndex;
283 BOOLEAN SkipHiddenDevice;
287 CHAR16 *UnicodeDevicePath;
288 CHAR8 *AsciiDevicePath;
289 UINTN AsciiDevicePathSize;
290 CHAR16 **HiddenUnicodeDevicePath;
292 EFI_HANDLE BlockDeviceHandle;
293 EFI_DEVICE_PATH_PROTOCOL *BlockDevicePath;
298 ASSERT (PickerContext != NULL);
300 ASSERT (NumEntries != NULL);
305 if (Device != NULL) {
306 return EFI_NOT_FOUND;
310 if (FlexPickerEntries == NULL) {
311 return EFI_OUT_OF_RESOURCES;
317 Status =
gBS->LocateHandleBuffer (
324 if (EFI_ERROR (Status)) {
325 DEBUG ((DEBUG_INFO,
"OLB: Failed to get Block I/O handles - %r\n", Status));
330 for (HandleIndex = 0; HandleIndex < NoHandles; HandleIndex++) {
331 BlockDeviceHandle = Handles[HandleIndex];
338 if (((PickerContext->ScanPolicy &
OC_SCAN_DEVICE_LOCK) != 0) && ((ScanPolicy & PickerContext->ScanPolicy) == 0)) {
343 if (BlockDevicePath == NULL) {
344 DEBUG ((DEBUG_INFO,
"OLB: Could not find Device Path for block device\n"));
351 UnicodeDevicePath = ConvertDevicePathToText (BlockDevicePath, FALSE, FALSE);
352 if (UnicodeDevicePath == NULL) {
354 return EFI_OUT_OF_RESOURCES;
361 SkipHiddenDevice = FALSE;
364 ASSERT (HiddenUnicodeDevicePath != NULL);
366 if (StrCmp (UnicodeDevicePath, *HiddenUnicodeDevicePath) == 0) {
367 DEBUG ((DEBUG_INFO,
"OLB: Skipping hidden device %s\n", *HiddenUnicodeDevicePath));
368 SkipHiddenDevice = TRUE;
373 if (SkipHiddenDevice) {
374 FreePool (UnicodeDevicePath);
384 FreePool (UnicodeDevicePath);
392 if (PickerEntry == NULL) {
393 FreePool (UnicodeDevicePath);
395 return EFI_OUT_OF_RESOURCES;
398 AsciiDevicePathSize = (StrLen (UnicodeDevicePath) + 1) *
sizeof (CHAR8);
399 AsciiDevicePath = AllocatePool (AsciiDevicePathSize);
400 if (AsciiDevicePath == NULL) {
401 FreePool (UnicodeDevicePath);
403 return EFI_OUT_OF_RESOURCES;
406 Status = UnicodeStrToAsciiStrS (UnicodeDevicePath, AsciiDevicePath, AsciiDevicePathSize);
407 FreePool (UnicodeDevicePath);
408 if (EFI_ERROR (Status)) {
409 FreePool (AsciiDevicePath);
415 if (PickerEntry->
Name == NULL) {
419 PickerEntry->
Id = AsciiDevicePath;
420 PickerEntry->
Path = NULL;
423 PickerEntry->
Tool = FALSE;
431 if ((PickerEntry->
Name == NULL) || (PickerEntry->
Flavour == NULL)) {
433 return EFI_OUT_OF_RESOURCES;
453 ASSERT (*Entries != NULL);
454 if ((Entries == NULL) || (*Entries == NULL)) {
458 for (Index = 0; Index < NumEntries; Index++) {
478 IN EFI_HANDLE ImageHandle,
479 IN EFI_SYSTEM_TABLE *SystemTable
483 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
484 CHAR16 *DevicePathNames;
487 Status =
gBS->HandleProtocol (
490 (VOID **)&LoadedImage
492 if (EFI_ERROR (Status)) {
500 if (!EFI_ERROR (Status)) {
502 if (DevicePathNames != NULL) {
505 return EFI_OUT_OF_RESOURCES;
509 if (Status != EFI_NOT_FOUND) {
515 if (EFI_ERROR (Status)) {
516 DEBUG ((DEBUG_WARN,
"OLB: Legacy boot interface is supported on this system\n"));
522 Status =
gBS->InstallMultipleProtocolInterfaces (
529 ASSERT_EFI_ERROR (Status);
530 if (EFI_ERROR (Status)) {
EFI_STATUS InternalLoadAppleLegacyInterface(IN EFI_HANDLE ParentImageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **ImageDevicePath, OUT EFI_HANDLE *ImageHandle)
OC_LEGACY_OS_TYPE InternalGetPartitionLegacyOsType(IN EFI_HANDLE PartitionHandle, IN BOOLEAN IsCdRomSupported)
EFI_STATUS InternalSetBootCampHDPath(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_STATUS InternalLoadLegacyPbr(IN EFI_DEVICE_PATH_PROTOCOL *PartitionPath)
EFI_STATUS InternalIsLegacyInterfaceSupported(OUT BOOLEAN *IsAppleInterfaceSupported)
enum OC_LEGACY_OS_TYPE_ OC_LEGACY_OS_TYPE
EFI_GUID gOcBootEntryProtocolGuid
#define OC_BOOT_ENTRY_PROTOCOL_REVISION
#define OC_FLAVOUR_WINDOWS
#define OC_ATTR_USE_DISK_LABEL_FILE
#define OC_SCAN_DEVICE_LOCK
EFI_STATUS OcParseLoadOptions(IN CONST EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT OC_FLEX_ARRAY **ParsedVars)
UINT32 OcGetDevicePolicyType(IN EFI_HANDLE Handle, OUT BOOLEAN *External OPTIONAL)
BOOLEAN OcParsedVarsGetUnicodeStr(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST CHAR16 *Name, OUT CHAR16 **StrValue)
BOOLEAN OcAppendArgumentsToLoadedImage(IN OUT EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, IN CONST CHAR8 **Arguments, IN UINT32 ArgumentCount, IN BOOLEAN Replace)
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
EFI_HANDLE OcPartitionGetPartitionHandle(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
BOOLEAN OcIsDiskCdRom(IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath)
VOID * OcReadFile(IN CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN CONST UINT32 MaxFileSize OPTIONAL)
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
OC_FLEX_ARRAY * OcFlexArrayInit(IN CONST UINTN ItemSize, IN CONST OC_FLEX_ARRAY_FREE_ITEM FreeItem OPTIONAL)
VOID(* OC_FLEX_ARRAY_FREE_ITEM)(IN VOID *Item)
VOID OcFlexArrayFreeContainer(IN OUT OC_FLEX_ARRAY **FlexArray, IN OUT VOID **Items, IN OUT UINTN *Count)
VOID * OcFlexArrayAddItem(IN OUT OC_FLEX_ARRAY *FlexArray)
VOID * OcFlexArrayItemAt(IN CONST OC_FLEX_ARRAY *FlexArray, IN CONST UINTN Index)
OC_FLEX_ARRAY * OcStringSplit(IN CONST VOID *String, IN CONST CHAR16 Delim, IN CONST OC_STRING_FORMAT StringFormat)
#define L_STR_SIZE(String)
STATIC VOID FreePickerEntry(IN OC_PICKER_ENTRY *Entry)
STATIC CONST UINT8 AppleLegacyInterfaceFallbackDevicePathData[]
STATIC BOOLEAN mIsAppleInterfaceSupported
STATIC EFI_HANDLE mImageHandle
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC EFI_STATUS EFIAPI OcGetLegacyBootEntries(IN OUT OC_PICKER_CONTEXT *PickerContext, IN CONST EFI_HANDLE Device OPTIONAL, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
STATIC OC_FLEX_ARRAY * mHiddenDevicePaths
STATIC VOID EFIAPI OcFreeLegacyBootEntries(IN OC_PICKER_ENTRY **Entries, IN UINTN NumEntries)
STATIC EFI_STATUS UnmanagedBootGetFinalDevicePath(IN OUT OC_PICKER_CONTEXT *PickerContext, IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath)
STATIC CONST EFI_DEVICE_PATH_PROTOCOL * AppleLegacyInterfaceFallbackDevicePathPath
STATIC CHAR8 * GetLegacyEntryName(OC_LEGACY_OS_TYPE LegacyOsType)
STATIC CHAR8 * GetLegacyEntryFlavour(OC_LEGACY_OS_TYPE LegacyOsType)
STATIC EFI_STATUS UnmanagedBootActionDoLegacyBoot(IN OUT OC_PICKER_CONTEXT *PickerContext, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
STATIC OC_BOOT_ENTRY_PROTOCOL mLegacyBootEntryProtocol
STATIC CHAR8 * LoadAppleDiskLabel(IN OUT OC_PICKER_CONTEXT *PickerContext, IN EFI_HANDLE DiskHandle)
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiBlockIoProtocolGuid
EFI_GUID gEfiLoadedImageProtocolGuid
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)
struct DiskLabel_ DiskLabel
OC_BOOT_UNMANAGED_ACTION UnmanagedBootAction
OC_BOOT_UNMANAGED_GET_FINAL_DP UnmanagedBootGetFinalDevicePath
EFI_DEVICE_PATH_PROTOCOL * UnmanagedDevicePath