+/*
+ * The below definitions and SetAppleOSInfo() function are based on a GRUB patch
+ * by Andreas Heider:
+ * https://lists.gnu.org/archive/html/grub-devel/2013-12/msg00442.html
+ */
+
+#define EFI_APPLE_SET_OS_PROTOCOL_GUID \
+ { 0xc5c5da95, 0x7d5c, 0x45e6, \
+ { 0xb2, 0xf1, 0x3f, 0xd5, 0x2b, 0xb1, 0x00, 0x77 } \
+ }
+
+typedef struct EfiAppleSetOsInterface {
+ UINT64 Version;
+ EFI_STATUS EFIAPI (*SetOsVersion) (IN CHAR8 *Version);
+ EFI_STATUS EFIAPI (*SetOsVendor) (IN CHAR8 *Vendor);
+} EfiAppleSetOsInterface;
+
+// Function to tell the firmware that OS X is being launched. This is
+// required to work around problems on some Macs that don't fully
+// initialize some hardware (especially video displays) when third-party
+// OSes are launched in EFI mode.
+static EFI_STATUS SetAppleOSInfo() {
+ CHAR16 *AppleOSVersion = NULL;
+ CHAR8 *AppleOSVersion8 = NULL;
+ EFI_STATUS Status;
+ EFI_GUID apple_set_os_guid = EFI_APPLE_SET_OS_PROTOCOL_GUID;
+ EfiAppleSetOsInterface *SetOs = NULL;
+
+ Status = refit_call3_wrapper(BS->LocateProtocol, &apple_set_os_guid, NULL, (VOID**) &SetOs);
+
+ // Not a Mac, so ignore the call....
+ if ((Status != EFI_SUCCESS) || (!SetOs))
+ return EFI_SUCCESS;
+
+ if ((SetOs->Version != 0) && GlobalConfig.SpoofOSXVersion) {
+ AppleOSVersion = StrDuplicate(L"Mac OS X");
+ MergeStrings(&AppleOSVersion, GlobalConfig.SpoofOSXVersion, ' ');
+ if (AppleOSVersion) {
+ AppleOSVersion8 = AllocateZeroPool((StrLen(AppleOSVersion) + 1) * sizeof(CHAR8));
+ UnicodeStrToAsciiStr(AppleOSVersion, AppleOSVersion8);
+ if (AppleOSVersion8) {
+ Status = refit_call1_wrapper (SetOs->SetOsVersion, AppleOSVersion8);
+ if (!EFI_ERROR(Status))
+ Status = EFI_SUCCESS;
+ MyFreePool(AppleOSVersion8);
+ } else {
+ Status = EFI_OUT_OF_RESOURCES;
+ Print(L"Out of resources in SetAppleOSInfo!\n");
+ }
+ if ((Status == EFI_SUCCESS) && (SetOs->Version == 2))
+ Status = refit_call1_wrapper (SetOs->SetOsVendor, "Apple Inc.");
+ MyFreePool(AppleOSVersion);
+ } // if (AppleOSVersion)
+ } // if
+ if (Status != EFI_SUCCESS)
+ Print(L"Unable to set firmware boot type!\n");
+
+ return (Status);
+} // EFI_STATUS SetAppleOSInfo()
+