-
-#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, ' ');
- 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;
- } else {
- Status = EFI_OUT_OF_RESOURCES;
- Print(L"Out of resources!\n");
- }
- if ((Status == EFI_SUCCESS) && (SetOs->Version == 2))
- Status = refit_call1_wrapper (SetOs->SetOsVendor, "Apple Inc.");
- } // if
-
- if (Status != EFI_SUCCESS)
- Print(L"Unable to set firmware boot type!\n");
-
- MyFreePool(AppleOSVersion);
- MyFreePool(AppleOSVersion8);
- return (Status);
-} // EFI_STATUS SetAppleOSInfo()
-