From d0ff3b535509b17168bf0af7657596e14f8afa48 Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 17 Sep 2024 19:03:03 +0300 Subject: [PATCH 1/6] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e236e43de..42dba21f3 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ Bootloader for macOS, Windows and Linux in UEFI and in legacy mode - Press **F4** to save original (OEM) ACPI tables into `/EFI/CLOVER/ACPI/origin` - Press **F5** to test DSDT patching - Press **F6** to save graphics firmware into `/EFI/CLOVER/misc` +- Press **F7** to test HDA output +- Press **F9** to switch screen resolution - Press **F10** to save screenshots from GUI - Press **F11** to reset NVRAM - Press **F12** to eject CD/DVD @@ -29,7 +31,7 @@ Bootloader for macOS, Windows and Linux in UEFI and in legacy mode - Create custom boot entries for personalizing boot entries and add support for other operating systems - Create Clover boot entry in NVRAM with tool from GUI - Launch EFI command shell from GUI -- Startup sound controlled by **F8** and checked by **F7** +- Startup sound checked by **F7** ### Developers: @@ -42,7 +44,7 @@ Bootloader for macOS, Windows and Linux in UEFI and in legacy mode Chameleon team, crazybirdy, JrCs, chris1111. ### Clover is open source based on different projects : -* Clover, rEFIt, XNU, VirtualBox. [The main is EDK2 latest revision](https://github.com/CloverHackyColor/CloverBootloader) +* Chameleon, rEFIt, XNU, VirtualBox. [The main is EDK2 latest revision](https://github.com/CloverHackyColor/CloverBootloader) * Recent developments and changes in details at [Clover Change Explanations](https://www.insanelymac.com/forum/topic/304530-clover-change-explanations/) * Support forum discussion [AppleLife](https://applelife.ru/threads/clover.42089/) (Russian) [Insanelymac](https://www.insanelymac.com/forum/topic/284656-clover-general-discussion/) (English) [macos86.it](https://www.macos86.it/forum/46-clover/) (Italian) --------------------------------------------------------- From 653b4140e83f72f6efde83fd472c70f5c7be9441 Mon Sep 17 00:00:00 2001 From: chris1111 Date: Thu, 19 Sep 2024 22:19:32 -0400 Subject: [PATCH 2/6] Update Credits on source --- rEFIt_UEFI/refit/main.cpp | 5795 +++++++++++++++---------------------- 1 file changed, 2344 insertions(+), 3451 deletions(-) diff --git a/rEFIt_UEFI/refit/main.cpp b/rEFIt_UEFI/refit/main.cpp index 02bd0028e..5f26aa81e 100644 --- a/rEFIt_UEFI/refit/main.cpp +++ b/rEFIt_UEFI/refit/main.cpp @@ -1,8 +1,8 @@ /* - * refit/main.c - * Main code for the boot menu + * refit/menu.c + * Menu functions * - * Copyright (c) 2006-2010 Christoph Pfisterer + * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,3680 +34,2573 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "menu.h" #include // Only use angled for Platform, else, xcode project won't compile -#include -#include +#include "../libeg/libegint.h" -#include "../cpp_foundation/XString.h" -#include "../cpp_lib/MemoryTracker.h" -#include "../cpp_unit_test/all_tests.h" +#include "../Platform/Settings.h" -#include "../entry_scan/entry_scan.h" #include "../libeg/nanosvg.h" -#include "../gui/menu_items/menu_globals.h" +#include "../libeg/FloatLib.h" +#include "../Platform/HdaCodecDump.h" #include "menu.h" -#include "../Platform/Utils.h" -#include "../Platform/Settings.h" -#include "../Platform/DataHubCpu.h" -#include "../Platform/Events.h" #include "screen.h" -#include "../entry_scan/bootscreen.h" -#include "../Platform/Nvram.h" -#include "../entry_scan/common.h" +#include "../cpp_foundation/XString.h" +#include "../libeg/XTheme.h" +#include "../libeg/VectorGraphics.h" // for testSVG #include "../gui/shared_with_menu.h" #include "../Platform/platformdata.h" -#include "../Platform/guid.h" -#include "../Platform/APFS.h" #include "../Platform/cpu.h" -#include "../Platform/smbios.h" -#include "../Platform/AcpiPatcher.h" -#include "../Platform/Hibernate.h" -#include "../Platform/LegacyBoot.h" -#include "../Platform/PlatformDriverOverride.h" -#include "../Platform/Edid.h" -#include "../Platform/Console.h" -#include "../Platform/spd.h" -#include "../Platform/Injectors.h" -#include "../Platform/StartupSound.h" -#include "../Platform/BootOptions.h" +#include "../Platform/Nvram.h" +#include "../include/DsdtFixList.h" +#include "../include/Devices.h" +#include "../include/QuirksCodes.h" #include "../Platform/boot.h" -#include "../Platform/kext_inject.h" -#include "../Platform/device_inject.h" +#include "../Platform/Injectors.h" #include "../Platform/KextList.h" #include "../gui/REFIT_MENU_SCREEN.h" #include "../gui/REFIT_MAINMENU_SCREEN.h" #include "../Settings/Self.h" -#include "../Settings/SelfOem.h" -#include "../Platform/BasicIO.h" -#include "../include/OSTypes.h" -#include "../include/OSFlags.h" -#include "../libeg/XTheme.h" +#include "../Platform/VersionString.h" #include "../Settings/ConfigManager.h" #include "../Platform/CloverVersion.h" -#include "../Platform/SmbiosFillPatchingValues.h" - -#include "../include/OC.h" - #ifndef DEBUG_ALL -# ifdef DEBUG_ERALY_CRASH -# define DEBUG_MAIN 2 -# else -# define DEBUG_MAIN 1 -# endif +#define DEBUG_MENU 1 #else -# define DEBUG_MAIN DEBUG_ALL +#define DEBUG_MENU DEBUG_ALL #endif -#if DEBUG_MAIN == 0 +#if DEBUG_MENU == 0 #define DBG(...) #else -#define DBG(...) DebugLog(DEBUG_MAIN, __VA_ARGS__) +#define DBG(...) DebugLog(DEBUG_MENU, __VA_ARGS__) #endif -#ifndef HIBERNATE -#define HIBERNATE 0 -#endif +INTN LayoutMainMenuHeight = 376; +INTN LayoutAnimMoveForMenuX = 0; -#ifndef CHECK_SMC -#define CHECK_SMC 0 -#endif +#define TEXT_CORNER_REVISION (1) +#define TEXT_CORNER_HELP (2) +#define TEXT_CORNER_OPTIMUS (3) +REFIT_MENU_ITEM_OPTIONS MenuEntryOptions (L"Options"_XSW, 1, 0, 'O', ActionEnter); +REFIT_MENU_ITEM_ABOUT MenuEntryAbout (L"About Clover"_XSW, 1, 0, 'A', ActionEnter); +REFIT_MENU_ITEM_RESET MenuEntryReset (L"Restart Computer"_XSW, 1, 0, 'R', ActionSelect); +REFIT_MENU_ITEM_SHUTDOWN MenuEntryShutdown(L"Exit Clover"_XSW, 1, 0, 'U', ActionSelect); +REFIT_MENU_ITEM_RETURN MenuEntryReturn (L"Return"_XSW, 0, 0, 0, ActionEnter); -#define PCAT_RTC_ADDRESS_REGISTER 0x70 -#define PCAT_RTC_DATA_REGISTER 0x71 +REFIT_MAINMENU_SCREEN MainMenu(1, L"Main Menu"_XSW, L"Automatic boot"_XSW); +REFIT_MENU_SCREEN AboutMenu(2, L"About"_XSW, L""_XSW); +REFIT_MENU_SCREEN HelpMenu(3, L"Help"_XSW, L""_XSW); +REFIT_MENU_SCREEN OptionMenu(4, L"Options"_XSW, L""_XSW); +XBool gResetSMC = false; +extern APPLE_SMC_IO_PROTOCOL *gAppleSmc; +extern ConfigManager gConf; -// variables - EFI_PHYSICAL_ADDRESS SomePages = EFI_SYSTEM_TABLE_MAX_ADDRESS; //0xFE000000;? +void FillInputs(XBool New) +{ + UINTN i,j; //for loops + CHAR8 tmp[41]; + + tmp[40] = 0; //make it null-terminated + + UINTN InputItemsCount = 0; + + InputItems[InputItemsCount].ItemType = ASString; //0 + //even though Ascii we will keep value as Unicode to convert later + // no need for extra space here, it is added by ApplyInputs() + InputItems[InputItemsCount++].SValue.takeValueFrom(gSettings.Boot.BootArgs); + InputItems[InputItemsCount].ItemType = UNIString; //1 + InputItems[InputItemsCount++].SValue.takeValueFrom(gSettings.ACPI.DSDT.DsdtName); // 1-> 2 + InputItems[InputItemsCount].ItemType = UNIString; //2 + InputItems[InputItemsCount++].SValue = GlobalConfig.BlockKexts; + + InputItems[InputItemsCount].ItemType = RadioSwitch; //3 - Themes chooser + InputItems[InputItemsCount++].IValue = 3; + + InputItems[InputItemsCount].ItemType = BoolValue; //4 + InputItems[InputItemsCount++].BValue = GlobalConfig.DropSSDT; + InputItems[InputItemsCount].ItemType = BoolValue; //5 + InputItems[InputItemsCount++].BValue = gSettings.ACPI.SSDT.Generate.GeneratePStates; + InputItems[InputItemsCount].ItemType = BoolValue; //6 + InputItems[InputItemsCount++].BValue = gSettings.ACPI.SlpSmiEnable; + InputItems[InputItemsCount].ItemType = Decimal; //7 + InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gSettings.ACPI.SSDT.PLimitDict); + InputItems[InputItemsCount].ItemType = Decimal; //8 + InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gSettings.ACPI.SSDT.UnderVoltStep); + InputItems[InputItemsCount].ItemType = BoolValue; //9 + InputItems[InputItemsCount++].BValue = gSettings.ACPI.SSDT.Generate.GenerateCStates; + InputItems[InputItemsCount].ItemType = BoolValue; //10 + InputItems[InputItemsCount++].BValue = GlobalConfig.EnableC2; + InputItems[InputItemsCount].ItemType = BoolValue; //11 + InputItems[InputItemsCount++].BValue = GlobalConfig.EnableC4; + InputItems[InputItemsCount].ItemType = BoolValue; //12 + InputItems[InputItemsCount++].BValue = GlobalConfig.EnableC6; + InputItems[InputItemsCount].ItemType = BoolValue; //13 + InputItems[InputItemsCount++].BValue = gSettings.ACPI.SSDT.EnableISS; + InputItems[InputItemsCount].ItemType = Decimal; //14 + InputItems[InputItemsCount++].SValue.SWPrintf("%06d", gSettings.CPU.QPI); + InputItems[InputItemsCount].ItemType = BoolValue; //15 + InputItems[InputItemsCount++].BValue = gSettings.ACPI.PatchNMI; + InputItems[InputItemsCount].ItemType = BoolValue; //16 + InputItems[InputItemsCount++].BValue = gSettings.Graphics.PatchVBios; + InputItems[InputItemsCount].ItemType = Decimal; //17 + InputItems[InputItemsCount++].SValue.SWPrintf("0x%llX", gSettings.Smbios.gPlatformFeature); + InputItems[InputItemsCount].ItemType = Hex; //18 + InputItems[InputItemsCount++].SValue.SWPrintf("0x%hX", gSettings.SystemParameters.BacklightLevel); + InputItems[InputItemsCount].ItemType = Decimal; //19 + if (gSettings.CPU.BusSpeed > 20000) { + InputItems[InputItemsCount++].SValue.SWPrintf("%06d", gSettings.CPU.BusSpeed); + } else { + InputItems[InputItemsCount++].SValue.SWPrintf("%06llu", gCPUStructure.ExternalClock); + } + InputItemsCount = 20; + for (i=0; i 2 ) { //fool proof: cfg_name is 3 character or more. + InputItems[InputItemsCount++].SValue.SWPrintf("%ls", gSettings.Graphics.FBName.wc_str()); + } else { + InputItems[InputItemsCount++].SValue.SWPrintf("%s", gConf.GfxPropertiesArray[i].Config.c_str()); + } + } else if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { + InputItems[InputItemsCount].ItemType = BoolValue; //21+i*6 + InputItems[InputItemsCount++].BValue = gSettings.Graphics.InjectAsDict.InjectNVidia; + InputItems[InputItemsCount].ItemType = ASString; //22+6i + for (j=0; j<8; j++) { + snprintf((CHAR8*)&tmp[2*j], 3, "%02hhX", gSettings.Graphics.Dcfg[j]); + } + InputItems[InputItemsCount++].SValue.SWPrintf("%s", tmp); + } else /*if (gGraphics[i].Vendor == Intel) */ { + InputItems[InputItemsCount].ItemType = BoolValue; //21+i*6 + InputItems[InputItemsCount++].BValue = gSettings.Graphics.InjectAsDict.InjectIntel; + InputItems[InputItemsCount].ItemType = Hex; //22+6i + InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", GlobalConfig.IgPlatform); + } + + InputItems[InputItemsCount].ItemType = Decimal; //23+6i + if (gSettings.Graphics.VideoPorts > 0) { + InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gSettings.Graphics.VideoPorts); + } else { + InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gConf.GfxPropertiesArray[i].Ports); + } + + if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { + InputItems[InputItemsCount].ItemType = ASString; //24+6i + for (j=0; j MemMap; - UINTN MemMapSize; - UINTN MapKey, DescriptorSize; - UINT32 DescriptorVersion; - EFI_STATUS Status; - - MemMapSize = 0; - DescriptorSize = 0; - Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion); - if (Status != EFI_BUFFER_TOO_SMALL) { - DBG("PrintMemoryMap: GetMemStatus=%s not EFI_BUFFER_TOO_SMALL\n", efiStrError(Status)); - return; - } - MemMapSize += EFI_PAGE_SIZE; - MemMap = (EFI_MEMORY_DESCRIPTOR*)AllocatePool(MemMapSize); - - Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion); - if ( EFI_ERROR(Status) ) { - DBG("PrintMemoryMap: GetMemoryMap failed=%s\n", efiStrError(Status)); - return; - } - -#ifndef JIEF_DEBUG - EFI_MEMORY_DESCRIPTOR* MemMapPtr = MemMap; - - for (UINTN Index = 0; Index < MemMapSize / DescriptorSize; Index ++) { - UINT64 Bytes = LShiftU64 (MemMapPtr->NumberOfPages, 12); - DEBUG ((EFI_D_ERROR, "%llX-%llX %llX %llX %X\n", - MemMapPtr->PhysicalStart, - MemMapPtr->PhysicalStart + Bytes - 1, - MemMapPtr->NumberOfPages, - MemMapPtr->Attribute, - MemMapPtr->Type)); - MemMapPtr = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemMapPtr + DescriptorSize); + for ( size_t idx = 0 ; idx < ACPIPatchedAML.size() ; ++idx) { + ACPI_PATCHED_AML& ACPIPatchedAMLTmp = ACPIPatchedAML[idx]; + ACPIPatchedAMLTmp.MenuItem.ItemType = BoolValue; } -#else - OcPrintMemoryMap(MemMapSize, MemMap, DescriptorSize); -#endif } -void AllocSmallBlocks(UINTN NumberOfPagesMax) + +void ApplyInputs(void) { - EFI_MEMORY_DESCRIPTOR *MemMap; - UINTN MemMapSize; - UINTN MapKey, DescriptorSize; - UINT32 DescriptorVersion; - EFI_STATUS Status; - - - MemMapSize = 0; - MemMap = NULL; - DescriptorSize = 0; - Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion); - if (Status != EFI_BUFFER_TOO_SMALL) { - DBG("PrintMemoryMap: GetMemStatus=%s not EFI_BUFFER_TOO_SMALL\n", efiStrError(Status)); - return; - } - MemMapSize += EFI_PAGE_SIZE; - MemMap = (EFI_MEMORY_DESCRIPTOR*)AllocatePool(MemMapSize); - - Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion); - if ( EFI_ERROR(Status) ) { - DBG("PrintMemoryMap: GetMemoryMap failed=%s\n", efiStrError(Status)); - return; - } - - for ( - EFI_MEMORY_DESCRIPTOR* EntryWalker = MemMap; - (UINT8 *)EntryWalker < ((UINT8 *)MemMap + MemMapSize); - EntryWalker = NEXT_MEMORY_DESCRIPTOR (EntryWalker, DescriptorSize)) - { - if (EntryWalker->Type != EfiConventionalMemory) { - continue; +// EFI_STATUS Status = EFI_NOT_FOUND; + MacModel Model; + XBool NeedSave = true; + INTN i = 0; + UINTN j; + +// DBG("ApplyInputs\n"); + if (InputItems[i].Valid) { + gSettings.Boot.BootArgs = InputItems[i].SValue; + gSettings.Boot.BootArgs.replaceAll('\\', '_'); + GlobalConfig.gBootChanged = true; + } + i++; //1 + if (InputItems[i].Valid) { + gSettings.ACPI.DSDT.DsdtName = InputItems[i].SValue; + } + i++; //2 + if (InputItems[i].Valid) { + GlobalConfig.BlockKexts = InputItems[i].SValue; + } + i++; //3 + if (InputItems[i].Valid) { + if (OldChosenTheme == 0xFFFF) { + gSettings.GUI.Theme = L"embedded"_XSW; + } else { + gSettings.GUI.Theme.takeValueFrom(ThemeNameArray[OldChosenTheme]); } - if ( (UINTN)EntryWalker->NumberOfPages < NumberOfPagesMax ) - { - gBS->AllocatePages(AllocateAddress, EfiBootServicesData, EntryWalker->NumberOfPages, &EntryWalker->PhysicalStart); - } + //will change theme after ESC + GlobalConfig.gThemeChanged = true; + } + i++; //4 + if (InputItems[i].Valid) { + GlobalConfig.DropSSDT = InputItems[i].BValue != 0; } + i++; //5 + if (InputItems[i].Valid) { + gSettings.ACPI.SSDT.Generate.GeneratePStates = InputItems[i].BValue != 0; + } + i++; //6 + if (InputItems[i].Valid) { + gSettings.ACPI.SlpSmiEnable = InputItems[i].BValue != 0; + } + i++; //7 + if (InputItems[i].Valid) { +// DBG("InputItems[i]: %ls\n", InputItems[i].SValue); + gSettings.ACPI.SSDT.PLimitDict = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x7F); +// DBG("Item 7=PLimitDict %d\n", gSettings.ACPI.SSDT.PLimitDict); + } + i++; //8 + if (InputItems[i].Valid) { + gSettings.ACPI.SSDT.UnderVoltStep = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x3F); +// DBG("Item 8=UnderVoltStep %d\n", gSettings.ACPI.SSDT.UnderVoltStep); + } + i++; //9 + if (InputItems[i].Valid) { + gSettings.ACPI.SSDT.Generate.GenerateCStates = InputItems[i].BValue != 0; + } + i++; //10 + if (InputItems[i].Valid) { + GlobalConfig.EnableC2 = InputItems[i].BValue != 0; + } + i++; //11 + if (InputItems[i].Valid) { + GlobalConfig.EnableC4 = InputItems[i].BValue != 0; + } + i++; //12 + if (InputItems[i].Valid) { + GlobalConfig.EnableC6 = InputItems[i].BValue != 0; + } + i++; //13 + if (InputItems[i].Valid) { + gSettings.ACPI.SSDT.EnableISS = InputItems[i].BValue != 0; + } + i++; //14 + if (InputItems[i].Valid) { + gSettings.CPU.QPI = (UINT16)StrDecimalToUintn(InputItems[i].SValue.wc_str()); + DBG("applied QPI=%d\n", gSettings.CPU.QPI); + } + i++; //15 + if (InputItems[i].Valid) { + gSettings.ACPI.PatchNMI = InputItems[i].BValue != 0; + } + i++; //16 + if (InputItems[i].Valid) { + gSettings.Graphics.PatchVBios = InputItems[i].BValue != 0; + } + i++; //17 + if (InputItems[i].Valid) { + gSettings.Smbios.gPlatformFeature = (UINT64)StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied PlatformFeature=0x%llX\n", gSettings.Smbios.gPlatformFeature); + } + i++; //18 | Download-Fritz: There is no GUI element for BacklightLevel; please revise + if (InputItems[i].Valid) { + gSettings.SystemParameters.BacklightLevel = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); + gSettings.SystemParameters.BacklightLevelConfig = true; + } + i++; //19 + if (InputItems[i].Valid) { + gSettings.CPU.BusSpeed = (UINT32)StrDecimalToUintn(InputItems[i].SValue.wc_str()); + DBG("applied BusSpeed=%d\n", gSettings.CPU.BusSpeed); + } + + i = 19; + for (j = 0; j < gConf.GfxPropertiesArrayNonConst.size(); j++) { + i++; //20 + if (InputItems[i].Valid) { + gConf.GfxPropertiesArrayNonConst[j].Model = InputItems[i].SValue; + } + i++; //21 + if (InputItems[i].Valid) { + if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Ati) { + gSettings.Graphics.InjectAsDict.InjectATI = InputItems[i].BValue != 0; + } else if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Nvidia) { + gSettings.Graphics.InjectAsDict.InjectNVidia = InputItems[i].BValue != 0; + } else if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Intel) { + gSettings.Graphics.InjectAsDict.InjectIntel = InputItems[i].BValue != 0; + } + } + i++; //22 + if (InputItems[i].Valid) { + if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Ati) { + gSettings.Graphics.FBName = InputItems[i].SValue; + } else if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Nvidia) { + hex2bin(InputItems[i].SValue, (UINT8*)&gSettings.Graphics.Dcfg[0], sizeof(gSettings.Graphics.Dcfg)); + } else if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Intel) { + //ig-platform-id for Ivy+ and snb-platform-id for Sandy + GlobalConfig.IgPlatform = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied *-platform-id=0x%X\n", GlobalConfig.IgPlatform); + } + } + + if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Intel) { + i += 3; + continue; + } - FreePool(MemMap); -} + i++; //23 + if (InputItems[i].Valid) { + gConf.GfxPropertiesArrayNonConst[j].Ports = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x0F); + } + i++; //24 + if (InputItems[i].Valid) { + if (gConf.GfxPropertiesArray[j].Vendor == Nvidia) { + if ( InputItems[i].SValue.notEmpty() ) { + hex2bin(InputItems[i].SValue, gSettings.Graphics.NVCAP.data(), gSettings.Graphics.NVCAP.size()); + } + } else { + gConf.GfxPropertiesArrayNonConst[j].Connectors = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + gConf.GfxPropertiesArrayNonConst[j].ConnChanged = true; + } + } + i++; //25 + if (InputItems[i].Valid) { + gConf.GfxPropertiesArrayNonConst[j].LoadVBios = InputItems[i].BValue != 0; + } + } //end of Graphics Cards + // next number == 42 -void AllocSmallBlocks() -{ - CONST EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable; + i = 44; + if (InputItems[i].Valid) { + GlobalConfig.KextPatchesAllowed = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } + i++; //45 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.EightApple = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } + i++; //46 + if (InputItems[i].Valid) { + GlobalConfig.KPAppleIntelCPUPM = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } + i++; //47 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.KPAppleRTC = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } + i++; //48 + if (InputItems[i].Valid) { + GlobalConfig.KPKernelPm = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } + i++; //49 + if (InputItems[i].Valid) { + gSettings.ACPI.FixMCFG = InputItems[i].BValue != 0; + } -//PrintMemoryMap(); + i++; //50 + if (InputItems[i].Valid) { + gSettings.Graphics.RefCLK = (UINT32)StrDecimalToUintn(InputItems[i].SValue.wc_str()); + } - UINTN size = 64; - UINTN nb = 0; + i++; //51 + if (InputItems[i].Valid) { + NonDetected = InputItems[i].SValue; + } - AllocSmallBlocks(size); // 252KB + i++; //52 + if (InputItems[i].Valid) { + gSettings.Graphics.EDID.InjectEDID = InputItems[i].BValue != 0; + } + i++; //53 + if (InputItems[i].Valid) { + gSettings.Graphics.EDID.VendorEDID = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); + } + i++; //54 + if (InputItems[i].Valid) { + gSettings.Graphics.EDID.ProductEDID = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); + } + i++; //55 + // ErmaC: NvidiaGeneric XBool(Y/N) + if (InputItems[i].Valid) { + gSettings.Graphics.NvidiaGeneric = InputItems[i].BValue != 0; + } + i++; //56 + if (InputItems[i].Valid) { + gSettings.SystemParameters.NvidiaWeb = InputItems[i].BValue != 0; + } + i++; //57 + if (InputItems[i].Valid) { + gSettings.Devices.Audio.ResetHDA = InputItems[i].BValue != 0; + } + i++; //58 + if (InputItems[i].Valid) { + gSettings.Devices.Audio.AFGLowPowerState = InputItems[i].BValue != 0; + } + i++; //59 + if (InputItems[i].Valid) { + gSettings.Devices.Audio.HDAInjection = InputItems[i].BValue != 0; + } + i++; //60 + if (InputItems[i].Valid) { + gSettings.Devices.Audio.HDALayoutId = (UINT32)(StrDecimalToUintn(InputItems[i].SValue.wc_str())); + } + i++; //61 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.KPDELLSMBIOS = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } + i++; //62 + if (InputItems[i].Valid) { + gSettings.Smbios.FirmwareFeatures = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied FirmwareFeatures=0x%X\n", gSettings.Smbios.FirmwareFeatures); + } + i++; //63 + if (InputItems[i].Valid) { + gSettings.Smbios.FirmwareFeaturesMask = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied FirmwareFeaturesMask=0x%X\n", gSettings.Smbios.FirmwareFeaturesMask); + } + i++; //64 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.KPDebug = InputItems[i].BValue != 0; + // GlobalConfig.gBootChanged = true; + } - MemoryAttributesTable = OcGetMemoryAttributes (NULL); - nb = MemoryAttributesTable->NumberOfEntries; + i++; //65 + if (InputItems[i].Valid) { + XStringW& tmpStr = SmbiosList[OldChosenSmbios]; + gConf.ReloadSmbios(tmpStr); +// gConf.FillSmbiosWithDefaultValue(GlobalConfig.CurrentModel, configPlist.getSMBIOS()); -//PrintMemoryMap(); - while ( size <= 2048 && nb > 100 ) { // XNU seems to handle max 128 entries. So let's shrink a little bit under 128 - size *= 2; - AllocSmallBlocks(size); - MemoryAttributesTable = OcGetMemoryAttributes (NULL); - nb = MemoryAttributesTable->NumberOfEntries; -//PrintMemoryMap(); + DBG("chosen SMBIOS of %ls\n", tmpStr.wc_str()); + GlobalConfig.gBootChanged = true; + FillInputs(false); + NeedSave = false; } - if ( size > 2048 ) { - DBG("Cannot shrink memory map enough. Nb entries = %lld\n", nb); + // CSR + i++; //66 + if (InputItems[i].Valid) { + gSettings.RtVariables.CsrActiveConfig = InputItems[i].IValue; } -} -OC_GLOBAL_CONFIG - mOpenCoreConfiguration; + i++; //67 + if (InputItems[i].Valid) { + gSettings.ACPI.DSDT.FixDsdt = InputItems[i].IValue; + } + i++; //68 + if (InputItems[i].Valid) { + GlobalConfig.OptionsBits = InputItems[i].IValue; + } + i++; //69 + if (InputItems[i].Valid) { + GlobalConfig.FlagsBits = InputItems[i].IValue; + } -OC_STORAGE_CONTEXT - mOpenCoreStorage; -OC_CPU_INFO - mOpenCoreCpuInfo; + i++; //70 + if (InputItems[i].Valid) { + INTN Minus = 0; + if (InputItems[i].SValue[0] == '-') { + Minus = 1; + } + gSettings.GUI.Mouse.PointerSpeed = StrDecimalToUintn(InputItems[i].SValue.data(Minus)); + if (Minus) { + gSettings.GUI.Mouse.PointerSpeed = -gSettings.GUI.Mouse.PointerSpeed; + } +// DBG("Pointer Speed=%d\n", gSettings.PointerSpeed); + } + i++; //71 + if (InputItems[i].Valid) { + gSettings.GUI.Mouse.DoubleClickTime = StrDecimalToUintn(InputItems[i].SValue.wc_str()); +// DBG("DoubleClickTime=%d ms\n", gSettings.DoubleClickTime); + } + i++; //72 + if (InputItems[i].Valid) { + gSettings.GUI.Mouse.PointerMirror = InputItems[i].BValue != 0; + } -UINT8 - mOpenCoreBooterHash[SHA1_DIGEST_SIZE]; -OC_RSA_PUBLIC_KEY * - mOpenCoreVaultKey; + i = 74; + if (InputItems[i].Valid) { + gSettings.Devices.USB.USBFixOwnership = InputItems[i].BValue != 0; + } + i++; //75 + if (InputItems[i].Valid) { + GlobalConfig.C3Latency = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); + } -OC_PRIVILEGE_CONTEXT - mOpenCorePrivilege; + i++; //76 + if (InputItems[i].Valid) { + GlobalConfig.EnabledCores = (UINT8)StrDecimalToUintn(InputItems[i].SValue.wc_str()); + } + i++; //77 + if (InputItems[i].Valid) { + gSettings.CPU.SavingMode = (UINT8)StrDecimalToUintn(InputItems[i].SValue.wc_str()); + } -EFI_HANDLE - mStorageHandle; + i++; //78 + if (InputItems[i].Valid) { + gSettings.Smbios.ProductName = InputItems[i].SValue; + // let's fill all other fields based on this ProductName + // to serve as default + Model = GetModelFromString(gSettings.Smbios.ProductName); + if (Model != MaxMacModel) { + GlobalConfig.CurrentModel = Model; + SetDMISettingsForModel(Model, &gSettings); + FillInputs(false); + } + } -EFI_DEVICE_PATH_PROTOCOL * - mStoragePath; + i++; //79 + if (InputItems[i].Valid) { + gSettings.Smbios.SystemVersion = InputItems[i].SValue; + } + i++; //80 + if (InputItems[i].Valid) { + gSettings.Smbios.SerialNr = InputItems[i].SValue; + } + i++; //81 + if (InputItems[i].Valid) { + gSettings.Smbios.BoardNumber = InputItems[i].SValue; + } + i++; //82 + if (InputItems[i].Valid) { + gSettings.Smbios.BoardSerialNumber = InputItems[i].SValue; + } + i++; //83 + if (InputItems[i].Valid) { + gSettings.Smbios.BoardType = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x0F); + } + i++; //84 + if (InputItems[i].Valid) { + gSettings.Smbios.BoardVersion = InputItems[i].SValue; + } + i++; //85 + if (InputItems[i].Valid) { + gSettings.Smbios.ChassisType = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x0F); + } + i++; //86 + if (InputItems[i].Valid) { + gSettings.Smbios.BiosVersion = InputItems[i].SValue; + } + i++; //87 + if (InputItems[i].Valid) { + gSettings.Smbios.BiosReleaseDate = InputItems[i].SValue; + } -CHAR16 * - mStorageRoot; + i++; //88 + if (InputItems[i].Valid) { + gSettings.ACPI.SSDT.DoubleFirstState = InputItems[i].BValue != 0; + } + i++; //89 + if (InputItems[i].Valid) { + gSettings.ACPI.SSDT.EnableC7 = InputItems[i].BValue != 0; + } -VOID -OcMain ( - IN OC_STORAGE_CONTEXT *Storage, - IN EFI_DEVICE_PATH_PROTOCOL *LoadPath - ) -{ - EFI_STATUS Status; -// OC_PRIVILEGE_CONTEXT *Privilege; - - DEBUG ((DEBUG_INFO, "OC: OcMiscEarlyInit...\n")); - Status = OcMiscEarlyInit ( - Storage, - &mOpenCoreConfiguration, - mOpenCoreVaultKey - ); - - if (EFI_ERROR (Status)) { - return; - } - -// OcCpuScanProcessor (&mOpenCoreCpuInfo); - -// DEBUG ((DEBUG_INFO, "OC: OcLoadNvramSupport...\n")); -// OcLoadNvramSupport (Storage, &mOpenCoreConfiguration); - DEBUG ((DEBUG_INFO, "OC: OcMiscMiddleInit...\n")); - OcMiscMiddleInit ( - Storage, - &mOpenCoreConfiguration, - mStorageRoot, - LoadPath, - mStorageHandle, - mOpenCoreConfiguration.Booter.Quirks.ForceBooterSignature ? mOpenCoreBooterHash : NULL - ); - DEBUG ((DEBUG_INFO, "OC: OcLoadUefiSupport...\n")); - OcLoadUefiSupport (Storage, &mOpenCoreConfiguration, &mOpenCoreCpuInfo, mOpenCoreBooterHash); -// DEBUG_CODE_BEGIN (); -// DEBUG ((DEBUG_INFO, "OC: OcMiscLoadSystemReport...\n")); -// OcMiscLoadSystemReport (&mOpenCoreConfiguration, mStorageHandle); -// DEBUG_CODE_END (); -// DEBUG ((DEBUG_INFO, "OC: OcLoadAcpiSupport...\n")); -// OcLoadAcpiSupport (&mOpenCoreStorage, &mOpenCoreConfiguration); -// DEBUG ((DEBUG_INFO, "OC: OcLoadPlatformSupport...\n")); -// OcLoadPlatformSupport (&mOpenCoreConfiguration, &mOpenCoreCpuInfo); -// DEBUG ((DEBUG_INFO, "OC: OcLoadDevPropsSupport...\n")); -// OcLoadDevPropsSupport (&mOpenCoreConfiguration); - DEBUG ((DEBUG_INFO, "OC: OcMiscLateInit...\n")); - OcMiscLateInit (Storage, &mOpenCoreConfiguration); - DEBUG ((DEBUG_INFO, "OC: OcLoadKernelSupport...\n")); - OcLoadKernelSupport (&mOpenCoreStorage, &mOpenCoreConfiguration, &mOpenCoreCpuInfo); - - if (mOpenCoreConfiguration.Misc.Security.EnablePassword) { - mOpenCorePrivilege.CurrentLevel = OcPrivilegeUnauthorized; - mOpenCorePrivilege.Hash = mOpenCoreConfiguration.Misc.Security.PasswordHash; - mOpenCorePrivilege.Salt = OC_BLOB_GET (&mOpenCoreConfiguration.Misc.Security.PasswordSalt); - mOpenCorePrivilege.SaltSize = mOpenCoreConfiguration.Misc.Security.PasswordSalt.Size; - -// Privilege = &mOpenCorePrivilege; - } else { -// Privilege = NULL; + i++; //90 + if (InputItems[i].Valid) { + gConf.ReLoadConfig(XStringW(ConfigsList[OldChosenConfig])); + // TODO: make a ReloadConfig, because in case of a reload, there are probably slightly different things to do. + GlobalConfig.gBootChanged = true; + GlobalConfig.gThemeChanged = true; + FillInputs(false); + NeedSave = false; + } + i++; //91 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.KPKernelLapic = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } + i++; //92 + if (InputItems[i].Valid) { + gSettings.Devices.USB.USBInjection = InputItems[i].BValue != 0; + } + i++; //93 + if (InputItems[i].Valid) { + gSettings.Devices.USB.InjectClockID = InputItems[i].BValue != 0; + } + i++; //94 + if (InputItems[i].Valid) { + gSettings.Devices.FakeID.FakeATI = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + } + i++; //95 + if (InputItems[i].Valid) { + gSettings.Devices.FakeID.FakeNVidia = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + } + i++; //96 + if (InputItems[i].Valid) { + gSettings.Devices.FakeID.FakeIntel = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied FakeIntel=0x%X\n", gSettings.Devices.FakeID.FakeIntel); + } + i++; //97 + if (InputItems[i].Valid) { + gSettings.Devices.FakeID.FakeLAN = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + } + i++; //98 + if (InputItems[i].Valid) { + gSettings.Devices.FakeID.FakeWIFI = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + } + i++; //99 + if (InputItems[i].Valid) { + gSettings.Devices.FakeID.FakeSATA = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + } + i++; //100 + if (InputItems[i].Valid) { + gSettings.Devices.FakeID.FakeXHCI = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); } - DEBUG ((DEBUG_INFO, "OC: All green, starting boot management...\n")); + i++; //101 - Quirks + if (InputItems[i].Valid) { + gSettings.Quirks.QuirksMask = InputItems[i].IValue; + gSettings.Quirks.OcBooterQuirks.AvoidRuntimeDefrag = ((gSettings.Quirks.QuirksMask & QUIRK_DEFRAG) != 0); //1 + gSettings.Quirks.OcBooterQuirks.DevirtualiseMmio = ((gSettings.Quirks.QuirksMask & QUIRK_MMIO) != 0); //0 + gSettings.Quirks.OcBooterQuirks.DisableSingleUser = ((gSettings.Quirks.QuirksMask & QUIRK_SU) != 0); //0 + gSettings.Quirks.OcBooterQuirks.DisableVariableWrite = ((gSettings.Quirks.QuirksMask & QUIRK_VAR) != 0); //0 + gSettings.Quirks.OcBooterQuirks.DiscardHibernateMap = ((gSettings.Quirks.QuirksMask & QUIRK_HIBER) != 0); //0 + gSettings.Quirks.OcBooterQuirks.EnableSafeModeSlide = ((gSettings.Quirks.QuirksMask & QUIRK_SAFE) != 0); //0 + gSettings.Quirks.OcBooterQuirks.EnableWriteUnprotector = ((gSettings.Quirks.QuirksMask & QUIRK_UNPROT) != 0); //1 + gSettings.Quirks.OcBooterQuirks.ForceExitBootServices = ((gSettings.Quirks.QuirksMask & QUIRK_EXIT) != 0); //0 + gSettings.Quirks.OcBooterQuirks.ProtectMemoryRegions = ((gSettings.Quirks.QuirksMask & QUIRK_REGION) != 0); //0 + gSettings.Quirks.OcBooterQuirks.ProtectSecureBoot = ((gSettings.Quirks.QuirksMask & QUIRK_SECURE) != 0); //0 + gSettings.Quirks.OcBooterQuirks.ProtectUefiServices = ((gSettings.Quirks.QuirksMask & QUIRK_UEFI) != 0); //0 + gSettings.Quirks.OcBooterQuirks.ProvideCustomSlide = ((gSettings.Quirks.QuirksMask & QUIRK_CUSTOM) != 0); //1 + gSettings.Quirks.OcBooterQuirks.RebuildAppleMemoryMap = ((gSettings.Quirks.QuirksMask & QUIRK_MAP) != 0); //0 + gSettings.Quirks.OcBooterQuirks.SetupVirtualMap = ((gSettings.Quirks.QuirksMask & QUIRK_VIRT) != 0); //1 + gSettings.Quirks.OcBooterQuirks.SignalAppleOS = ((gSettings.Quirks.QuirksMask & QUIRK_OS) != 0); //0 + gSettings.Quirks.OcBooterQuirks.SyncRuntimePermissions = ((gSettings.Quirks.QuirksMask & QUIRK_PERM) != 0); //1 + DBG("applied Quirks mask:%x\n", gSettings.Quirks.QuirksMask); //default is 0xA861 + } + i++; //102 + if (InputItems[i].Valid) { + gSettings.ACPI.DSDT.DebugDSDT = InputItems[i].BValue != 0; + } + i++; //103 + if (InputItems[i].Valid) { + gSettings.Devices.FakeID.FakeIMEI = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + } -// OcMiscBoot ( -// &mOpenCoreStorage, -// &mOpenCoreConfiguration, -// Privilege, -// OcStartImage, -// mOpenCoreConfiguration.Uefi.Quirks.RequestBootVarRouting, -// mStorageHandle -// ); -} + i++; //104 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.FakeCPUID = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied FakeCPUID=%06X\n", gSettings.KernelAndKextPatches.FakeCPUID); + GlobalConfig.gBootChanged = true; + } + i++; //105 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.KPKernelXCPM = InputItems[i].BValue != 0; + DBG("applied KernelXCPM\n"); + GlobalConfig.gBootChanged = true; + } + + i++; //106 + if (InputItems[i].Valid) { + gSettings.Devices.StringInjector = InputItems[i].BValue != 0; + } + + i++; //107 + if (InputItems[i].Valid) { + gSettings.Devices.NoDefaultProperties = InputItems[i].BValue != 0; + } -static EFI_STATUS LoadEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, - IN CONST XStringW& ImageTitle, - OUT UINTN *ErrorInStep, - OUT EFI_HANDLE *NewImageHandle) -{ - EFI_STATUS Status, ReturnStatus; - EFI_HANDLE ChildImageHandle = 0; - UINTN DevicePathIndex; + i++; //108 + if (InputItems[i].Valid) { + GlobalConfig.KernelPatchesAllowed = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } - DBG("Loading %ls", ImageTitle.wc_str()); - if (ErrorInStep != NULL) { - *ErrorInStep = 0; + i++; //109 + if (InputItems[i].Valid) { + gSettings.Graphics.DualLink = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied DualLink=%X\n", gSettings.Graphics.DualLink); } - if (NewImageHandle != NULL) { - *NewImageHandle = NULL; + + i++; //110 + if (InputItems[i].Valid) { + gSettings.Graphics.NvidiaNoEFI = InputItems[i].BValue != 0; } - // load the image into memory - ReturnStatus = Status = EFI_NOT_FOUND; // in case the list is empty - for (DevicePathIndex = 0; DevicePaths[DevicePathIndex] != NULL; DevicePathIndex++) { - ReturnStatus = Status = gBS->LoadImage(false, self.getSelfImageHandle(), DevicePaths[DevicePathIndex], NULL, 0, &ChildImageHandle); - DBG(" status=%s", efiStrError(Status)); - if (ReturnStatus != EFI_NOT_FOUND) - break; + i++; //111 + if (InputItems[i].Valid) { + gSettings.Graphics.NvidiaSingle = InputItems[i].BValue != 0; } - XStringW ErrorInfo = SWPrintf(" while loading %ls", ImageTitle.wc_str()); - if (CheckError(Status, ErrorInfo.wc_str())) { - if (ErrorInStep != NULL) - *ErrorInStep = 1; - PauseForKey(NullXString8); - goto bailout; - }else{ - DBG("\n"); -#ifdef JIEF_DEBUG - DBG("ChildImaheHandle=%llx\n", uintptr_t(ChildImageHandle)); -#endif + i++; //112 + if (InputItems[i].Valid) { + gSettings.Devices.IntelMaxValue = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); } - - if (!EFI_ERROR(ReturnStatus)) { //why unload driver?! - if (NewImageHandle != NULL) { - *NewImageHandle = ChildImageHandle; - } -#ifdef JIEF_DEBUG - EFI_LOADED_IMAGE_PROTOCOL* loadedBootImage = NULL; - if (!EFI_ERROR(Status = gBS->HandleProtocol(ChildImageHandle, &gEfiLoadedImageProtocolGuid, (void**)(&loadedBootImage)))) { - DBG("%ls : Image base = 0x%llx\n", ImageTitle.wc_str(), (uintptr_t)loadedBootImage->ImageBase); // Jief : Do not change this, it's used by grep to feed the debugger - }else{ - DBG("Can't get loaded image protocol\n"); + i++; //113 + if (InputItems[i].Valid) { + gSettings.ACPI.AutoMerge = InputItems[i].BValue != 0; + } + i++; //114 + if (InputItems[i].Valid) { + gSettings.Graphics.RadeonDeInit = InputItems[i].BValue != 0; + } + i++; //115 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.BlockSkywalk = InputItems[i].BValue != 0; + } + i++; //116 + if (InputItems[i].Valid) { + if (OldChosenDsdt == 0xFFFF) { + gSettings.ACPI.DSDT.DsdtName = L"BIOS.aml"_XSW; + } else { + gSettings.ACPI.DSDT.DsdtName = DsdtsList[OldChosenDsdt]; + } + } + i++; //117 + if (InputItems[i].Valid) { + gSettings.Smbios.EfiVersion = InputItems[i].SValue; + } + i++; //118 + if (InputItems[i].Valid) { + gSettings.RtVariables.BooterCfgStr = InputItems[i].SValue; + } + i++; //119 + if (InputItems[i].Valid) { + EFI_DEVICE_PATH_PROTOCOL* DevicePath = NULL; + int TmpIndex; + if (OldChosenAudio >= AudioList.size()) { +// DBG("crasy OldChosenAudio = %lld\n", OldChosenAudio); + OldChosenAudio = 0; + } + TmpIndex = OldChosenAudio & 0x2F; +// DBG("Chosen output %u:%ls_%s\n", TmpIndex, AudioList[TmpIndex].Name, +// AudioOutputNames[AudioList[TmpIndex].Device]); + + DevicePath = DevicePathFromHandle(AudioList[TmpIndex].Handle); +// DBG("choosen sound devicepath=%ls\n", DevicePathToStr(DevicePath)); + if (DevicePath != NULL) { + SetNvramVariable(L"Clover.SoundDevice", gEfiAppleBootGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + GetDevicePathSize(DevicePath), (UINT8 *)DevicePath); + SetNvramVariable(L"Clover.SoundIndex", gEfiAppleBootGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + 1, (UINT8 *)&TmpIndex); +// DBG(" sound written to nvram variables\n"); + } + } + i++; //120 + if (InputItems[i].Valid) { + DefaultAudioVolume = (UINT8)StrDecimalToUintn(InputItems[i].SValue.wc_str()); +// DBG(" set output volume to %d\n", DefaultAudioVolume); + if (DefaultAudioVolume > 100) { + // correct wrong input + DefaultAudioVolume = 90; + InputItems[i].SValue.SWPrintf("%04d", DefaultAudioVolume); + } + SetNvramVariable(L"Clover.SoundVolume", gEfiAppleBootGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + 1, &DefaultAudioVolume); + } + i++; //121 + if (InputItems[i].Valid) { + gSettings.KernelAndKextPatches.KPPanicNoKextDump = InputItems[i].BValue != 0; + GlobalConfig.gBootChanged = true; + } + i++; //122 + if (InputItems[i].Valid) { + gSettings.Quirks.OcBooterQuirks.ProvideMaxSlide = (uint8_t)StrDecimalToUintn(InputItems[i].SValue.wc_str()); + DBG(" set MaxSlide = %hhu\n", gSettings.Quirks.OcBooterQuirks.ProvideMaxSlide); + } + i++; //123 + if (InputItems[i].Valid) { + gSettings.GUI.ProvideConsoleGop = InputItems[i].BValue != 0; + DBG("applied ConsoleGopEnable=%s\n", gSettings.GUI.ProvideConsoleGop ? "Y" : "N" ); + } + i++; //124 + if (InputItems[i].Valid) { + gSettings.ACPI.FixHeaders = InputItems[i].BValue != 0; + DBG("applied gSettings.ACPI.FixHeaders=%s\n", gSettings.ACPI.FixHeaders ? "Y" : "N" ); + } + i++; //125 + if (InputItems[i].Valid) { + gSettings.Smbios.ExtendedFirmwareFeatures = StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied ExtendedFirmwareFeatures=0x%llX\n", gSettings.Smbios.ExtendedFirmwareFeatures); + } + i++; //126 + if (InputItems[i].Valid) { + gSettings.Smbios.ExtendedFirmwareFeaturesMask = StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("applied ExtendedFirmwareFeaturesMask=0x%llX\n", gSettings.Smbios.ExtendedFirmwareFeaturesMask); + } + i++; //127 + if (InputItems[i].Valid) { + INTN Minus = 0; + if (InputItems[i].SValue[0] == '-') { + Minus = 1; + } + gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars = StrDecimalToUintn(InputItems[i].SValue.data(Minus)); + if (Minus) { + gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars = -gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars; + } + DBG(" set GpuBar = %d\n", gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars); + } + i++; //128 + if (InputItems[i].Valid) { + gSettings.Quirks.OcKernelQuirks.ProvideCurrentCpuInfo = InputItems[i].BValue != 0; + DBG("applied ProvideCurrentCpuInfo=%s\n", gSettings.Quirks.OcKernelQuirks.ProvideCurrentCpuInfo ? "Y" : "N" ); + } + i++; //129 + if (InputItems[i].Valid) { + gResetSMC = InputItems[i].BValue != 0; + if (gResetSMC) { + // reset controller + if (gAppleSmc && (gAppleSmc->Signature == NON_APPLE_SMC_SIGNATURE)) { + gAppleSmc->SmcReset(gAppleSmc, 1); + DBG("SMC store is resetted\n"); + } else { + DBG("SMC protocol not found\n"); + } + gResetSMC = false; } -#endif - goto bailout; + } + i++; //130 + if (InputItems[i].Valid) { + INTN Minus = 0; + gSettings.Quirks.OcBooterQuirks.TscSyncTimeout = (decltype(gSettings.Quirks.OcBooterQuirks.TscSyncTimeout))StrDecimalToUintn(InputItems[i].SValue.data(Minus)); + DBG("set TscSyncTimeout=%d\n", gSettings.Quirks.OcBooterQuirks.TscSyncTimeout); + } + //gSettings.Smbios.SFakeCPU + i++; //131 + if (InputItems[i].Valid) { + gSettings.Smbios.SFakeCPU = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); + DBG("set FakeCPUID=%X\n", gSettings.Smbios.SFakeCPU); } - // unload the image, we don't care if it works or not... - Status = gBS->UnloadImage(ChildImageHandle); -bailout: - return ReturnStatus; + if (NeedSave) { + ApplySettings(); + } } -static EFI_STATUS StartEFILoadedImage(IN EFI_HANDLE ChildImageHandle, - IN CONST XString8Array& LoadOptions, IN CONST XStringW& LoadOptionsPrefix, - IN CONST XStringW& ImageTitle, - OUT UINTN *ErrorInStep) +void AboutRefit(void) { - EFI_STATUS Status, ReturnStatus; - EFI_LOADED_IMAGE_PROTOCOL *ChildLoadedImage; - CHAR16 ErrorInfo[256]; - - XStringW loadOptionsW; // This has to be declared here, so it's not be freed before calling StartImage - -// DBG("Starting %ls\n", ImageTitle); - if (ErrorInStep != NULL) { - *ErrorInStep = 0; - } - ReturnStatus = Status = EFI_NOT_FOUND; // in case no image handle was specified - if (ChildImageHandle == NULL) { - if (ErrorInStep != NULL) *ErrorInStep = 1; - goto bailout; + if (AboutMenu.Entries.size() == 0) { + AboutMenu.Daylight = ThemeX->Daylight; + if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_MENU_TITLE_IMAGE)) { + AboutMenu.TitleImage = ThemeX->GetIcon(BUILTIN_ICON_FUNC_ABOUT); + } + + if ( "unknown"_XS8 != LString8(gRevisionStr) ) AboutMenu.AddMenuInfo_f("%s", gRevisionStr); + if ( "unknown"_XS8 != LString8(gFirmwareBuildDate) ) AboutMenu.AddMenuInfo_f(" Build: %s", gFirmwareBuildDate); + if ( "unknown"_XS8 != gBuildId ) AboutMenu.AddMenuInfo_f(" Build id: %s", gBuildId.c_str()); + AboutMenu.AddMenuInfo_f("%s", path_independant.c_str()); // trick to let the compiler think path_independant is used and must be kept in binary. + AboutMenu.Entries[AboutMenu.Entries.size()-1].Title.SWPrintf("%s", gBuildIdGrepTag.c_str()); + AboutMenu.Entries[AboutMenu.Entries.size()-1].Title.SWPrintf(" "); + AboutMenu.AddMenuInfo_f("Based on rEFIt (c) 2006-2010 Christoph Pfisterer"); + AboutMenu.AddMenuInfo_f("Portions Copyright (c) Intel Corporation"); + AboutMenu.AddMenuInfo_f("Developers:"); + AboutMenu.AddMenuInfo_f(" Slice, dmazar, apianti, JrCs, pene, usrsse2"); + AboutMenu.AddMenuInfo_f(" Kabyl, pcj, jadran, Blackosx, STLVNUB, ycr.ru"); + AboutMenu.AddMenuInfo_f(" FrodoKenny, skoczi, crazybirdy, Oscar09, xsmile"); + AboutMenu.AddMenuInfo_f(" cparm, rehabman, nms42, Sherlocks, Zenith432"); + AboutMenu.AddMenuInfo_f(" stinga11, TheRacerMaster, solstice, SoThOr, DF"); + AboutMenu.AddMenuInfo_f(" cecekpawon, Micky1979, Needy, joevt, ErmaC, vit9696"); + AboutMenu.AddMenuInfo_f(" ath, savvas, syscl, goodwin_c, clovy, jief_machak"); + AboutMenu.AddMenuInfo_f(" chris1111, vector_sigma, LAbyOne, Florin9doi"); + AboutMenu.AddMenuInfo_f("Package credits:"); + AboutMenu.AddMenuInfo_f(" Chameleon team, crazybirdy, JrCs, chris1111"); + AboutMenu.AddMenuInfo_f("Credits also:"); + AboutMenu.AddMenuInfo_f(" projectosx.com, applelife.ru, insanelymac.com"); + AboutMenu.AddMenuInfo_f(" "); + AboutMenu.AddMenuInfo_f("Running on:"); + AboutMenu.AddMenuInfo_f(" EFI Revision %d.%02d", + gST->Hdr.Revision >> 16, gST->Hdr.Revision & ((1 << 16) - 1)); +#if defined(MDE_CPU_IA32) + AboutMenu.AddMenuInfo_f(" Platform: i386 (32 bit)"); +#elif defined(MDE_CPU_X64) + AboutMenu.AddMenuInfo_f(" Platform: x86_64 (64 bit)"); +#elif defined(_MSC_VER) + AboutMenu.AddMenuInfo_f(" Platform: x86_64 (64 bit) VS"); +#else + AboutMenu.AddMenuInfo_f(" Platform: unknown"); +#endif + AboutMenu.AddMenuInfo_f(" Firmware: %ls rev %d.%04d", gST->FirmwareVendor, gST->FirmwareRevision >> 16, gST->FirmwareRevision & ((1 << 16) - 1)); + AboutMenu.AddMenuInfo_f(" Screen Output: %s", egScreenDescription().c_str()); + AboutMenu.GetAnime(); + AboutMenu.AddMenuEntry(&MenuEntryReturn, false); + } else if (AboutMenu.Entries.size() >= 2) { + AboutMenu.Entries[AboutMenu.Entries.size()-2].Title.SWPrintf(" Screen Output: %s", egScreenDescription().c_str()); } - // set load options - if (!LoadOptions.isEmpty()) { - ReturnStatus = Status = gBS->HandleProtocol(ChildImageHandle, &gEfiLoadedImageProtocolGuid, (void **) &ChildLoadedImage); - if (CheckError(Status, L"while getting a LoadedImageProtocol handle")) { - if (ErrorInStep != NULL) - *ErrorInStep = 2; - goto bailout_unload; - } + AboutMenu.RunMenu(NULL); +} - if ( LoadOptionsPrefix.notEmpty() ) { - // NOTE: That last space is also added by the EFI shell and seems to be significant - // when passing options to Apple's boot.efi... - loadOptionsW = SWPrintf("%ls %s ", LoadOptionsPrefix.wc_str(), LoadOptions.ConcatAll(" "_XS8).c_str()); - }else{ - loadOptionsW = SWPrintf("%s ", LoadOptions.ConcatAll(" "_XS8).c_str()); // Jief : should we add a space ? Wasn't the case before big refactoring. Yes, a space required. +void HelpRefit(void) +{ + if (HelpMenu.Entries.size() == 0) { + HelpMenu.Daylight = ThemeX->Daylight; + if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_MENU_TITLE_IMAGE)) { + HelpMenu.TitleImage = ThemeX->GetIcon(BUILTIN_ICON_FUNC_HELP); } - // NOTE: We also include the terminating null in the length for safety. - ChildLoadedImage->LoadOptionsSize = (UINT32)loadOptionsW.sizeInBytes() + sizeof(wchar_t); - ChildLoadedImage->LoadOptions = loadOptionsW.wc_str(); //will it be deleted after the procedure exit? Yes, if we don't copy loadOptionsW, so it'll be freed at the end of method - - DBG("start image '%ls'\n", ImageTitle.s()); - DBG("Using load options '%ls'\n", (CHAR16*)ChildLoadedImage->LoadOptions); - + switch (gSettings.GUI.languageCode) + { + case russian: + HelpMenu.AddMenuInfo_f("ESC - Выход из подменю, обновление главного меню"); + HelpMenu.AddMenuInfo_f("F1 - Помощь по горячим клавишам"); + HelpMenu.AddMenuInfo_f("F2 - Сохранить отчет в preboot.log (только если FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Показать скрытые значки в меню"); + HelpMenu.AddMenuInfo_f("F4 - Родной DSDT сохранить в %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Патченный DSDT сохранить в %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Сохранить ВидеоБиос в %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Проверить звук на выбранном выходе"); + HelpMenu.AddMenuInfo_f("F8 - Сделать дамп звуковых устройств в %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Изменить разрешение экрана на одно из возможных"); + HelpMenu.AddMenuInfo_f("F10 - Снимок экрана в папку %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Извлечь указанный DVD"); + HelpMenu.AddMenuInfo_f("Пробел - Дополнительное меню запуска выбранного тома"); + HelpMenu.AddMenuInfo_f("Цифры 1-9 - Быстрый запуск тома по порядку в меню"); + HelpMenu.AddMenuInfo_f("A (About) - О загрузчике"); + HelpMenu.AddMenuInfo_f("O (Options) - Дополнительные настройки"); + HelpMenu.AddMenuInfo_f("R (Reset) - Теплый перезапуск"); + HelpMenu.AddMenuInfo_f("U (go oUt) - Завершить работу в Кловере"); + HelpMenu.AddMenuInfo_f("S (Shell) - Переход в режим командной строки"); + break; + case ukrainian: + HelpMenu.AddMenuInfo_f("ESC - Вийти з меню, оновити головне меню"); + HelpMenu.AddMenuInfo_f("F1 - Ця довідка"); + HelpMenu.AddMenuInfo_f("F2 - Зберегти preboot.log (тiльки FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Відображати приховані розділи"); + HelpMenu.AddMenuInfo_f("F4 - Зберегти OEM DSDT в %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Зберегти патчений DSDT в %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F6 - Зберегти VideoBios в %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F10 - Зберегти знімок екрану в %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Відкрити обраний диск (DVD)"); + HelpMenu.AddMenuInfo_f("Пробіл - докладніше про обраний пункт меню"); + HelpMenu.AddMenuInfo_f("Клавіші 1-9 -  клавіші пунктів меню"); + HelpMenu.AddMenuInfo_f("A - Про систему"); + HelpMenu.AddMenuInfo_f("O - Опції меню"); + HelpMenu.AddMenuInfo_f("R - Перезавантаження"); + HelpMenu.AddMenuInfo_f("U - Відключити ПК"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case spanish: + HelpMenu.AddMenuInfo_f("ESC - Salir de submenu o actualizar el menu principal"); + HelpMenu.AddMenuInfo_f("F1 - Esta Ayuda"); + HelpMenu.AddMenuInfo_f("F2 - Guardar preboot.log (Solo FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Guardar DSDT oem en %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Guardar DSDT parcheado en %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Guardar VideoBios en %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Guardar Captura de pantalla en %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Expulsar volumen seleccionado (DVD)"); + HelpMenu.AddMenuInfo_f("Espacio - Detalles acerca selected menu entry"); + HelpMenu.AddMenuInfo_f("Digitos 1-9 - Atajo a la entrada del menu"); + HelpMenu.AddMenuInfo_f("A - Menu Acerca de"); + HelpMenu.AddMenuInfo_f("O - Menu Optiones"); + HelpMenu.AddMenuInfo_f("R - Reiniciar Equipo"); + HelpMenu.AddMenuInfo_f("U - Apagar"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case portuguese: + case brasil: + HelpMenu.AddMenuInfo_f("ESC - Sai do submenu, atualiza o menu principal"); + HelpMenu.AddMenuInfo_f("F1 - Esta ajuda"); + HelpMenu.AddMenuInfo_f("F2 - Salva preboot.log (somente FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Salva oem DSDT em %ls/ACPI/origin/ (somente FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Salva DSDT corrigido em %ls/ACPI/origin/ (somente FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Salva VideoBios em %ls/misc/ (somente FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Salva screenshot em %ls/misc/ (somente FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Ejeta o volume selecionado (DVD)"); + HelpMenu.AddMenuInfo_f("Espaco - Detalhes sobre a opcao do menu selecionada"); + HelpMenu.AddMenuInfo_f("Tecle 1-9 - Atalho para as entradas do menu"); + HelpMenu.AddMenuInfo_f("A - Sobre o Menu"); + HelpMenu.AddMenuInfo_f("O - Opcoes do Menu"); + HelpMenu.AddMenuInfo_f("R - Reiniciar"); + HelpMenu.AddMenuInfo_f("U - Desligar"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case italian: + HelpMenu.AddMenuInfo_f("ESC - Esci dal submenu, Aggiorna menu principale"); + HelpMenu.AddMenuInfo_f("F1 - Aiuto"); + HelpMenu.AddMenuInfo_f("F2 - Salva il preboot.log (solo su FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Mostra volumi nascosti"); + HelpMenu.AddMenuInfo_f("F4 - Salva il DSDT oem in %ls/ACPI/origin/ (solo suFAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Salva il patched DSDT in %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Salva il VideoBios in %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Controlla il suono sull'uscita selezionata"); + HelpMenu.AddMenuInfo_f("F8 - Scarica le uscite audio in %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Cambia la risoluzione dello schermo alla prossima disponibile"); + HelpMenu.AddMenuInfo_f("F10 - Salva screenshot in %ls/misc/ (solo su FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Resetta NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Espelli il volume selezionato (DVD)"); + HelpMenu.AddMenuInfo_f("Spazio - Dettagli sul menu selezionato"); + HelpMenu.AddMenuInfo_f("Digita 1-9 - Abbreviazioni per il menu"); + HelpMenu.AddMenuInfo_f("A - Informazioni"); + HelpMenu.AddMenuInfo_f("O - Menu Opzioni"); + HelpMenu.AddMenuInfo_f("R - Riavvio"); + HelpMenu.AddMenuInfo_f("U - Spegnimento"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case german: + HelpMenu.AddMenuInfo_f("ESC - Zurueck aus Untermenue, Hauptmenue erneuern"); + HelpMenu.AddMenuInfo_f("F1 - Diese Hilfe"); + HelpMenu.AddMenuInfo_f("F2 - Sichere preboot.log (nur mit FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Sichere OEM DSDT in %ls/ACPI/origin/ (nur mit FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Sichere gepatchtes DSDT in %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Sichere VideoBios in %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Sichere Bildschirmfoto in %ls/misc/ (nur mit FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Volume auswerfen (DVD)"); + HelpMenu.AddMenuInfo_f("Leertaste - Details über den gewählten Menue Eintrag"); + HelpMenu.AddMenuInfo_f("Zahlen 1-9 - Kurzwahl zum Menue Eintrag"); + HelpMenu.AddMenuInfo_f("A - Menue Informationen"); + HelpMenu.AddMenuInfo_f("O - Menue Optionen"); + HelpMenu.AddMenuInfo_f("R - Neustart"); + HelpMenu.AddMenuInfo_f("U - Ausschalten"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case dutch: + HelpMenu.AddMenuInfo_f("ESC - Verlaat submenu, Vernieuw hoofdmenu"); + HelpMenu.AddMenuInfo_f("F1 - Onderdeel hulp"); + HelpMenu.AddMenuInfo_f("F2 - preboot.log opslaan (Alleen FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Verborgen opties weergeven"); + HelpMenu.AddMenuInfo_f("F4 - Opslaan oem DSDT in %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Opslaan gepatchte DSDT in %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Opslaan VideoBios in %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Controleer geluid op geselecteerde uitgang"); + HelpMenu.AddMenuInfo_f("F8 - Opslaan audio uitgangen in %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Wijzig schermresolutie naar eerstvolgende mogelijke modus"); + HelpMenu.AddMenuInfo_f("F10 - Opslaan schermafdruk in %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Uitwerpen geselecteerd volume (DVD)"); + HelpMenu.AddMenuInfo_f("Spatie - Details over geselecteerd menuoptie"); + HelpMenu.AddMenuInfo_f("Cijfers 1-9 - Snelkoppeling naar menuoptie"); + HelpMenu.AddMenuInfo_f("A - Menu Over"); + HelpMenu.AddMenuInfo_f("O - Menu Opties"); + HelpMenu.AddMenuInfo_f("R - Soft Reset"); + HelpMenu.AddMenuInfo_f("U - Verlaten"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case french: + HelpMenu.AddMenuInfo_f("ESC - Quitter sous-menu, Retour menu principal"); + HelpMenu.AddMenuInfo_f("F1 - Aide"); + HelpMenu.AddMenuInfo_f("F2 - Enregistrer preboot.log (FAT32 only)"); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Enregistrer oem DSDT dans %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Enregistrer DSDT modifié dans %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Enregistrer VideoBios dans %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Enregistrer la capture d'écran dans %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Ejecter le volume (DVD)"); + HelpMenu.AddMenuInfo_f("Space - Détails a propos du menu selectionné"); + HelpMenu.AddMenuInfo_f("Digits 1-9 - Raccourci vers entrée menu"); + HelpMenu.AddMenuInfo_f("A - A propos"); + HelpMenu.AddMenuInfo_f("O - Options Menu"); + HelpMenu.AddMenuInfo_f("R - Redémarrer"); + HelpMenu.AddMenuInfo_f("U - Eteindre"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case indonesian: + HelpMenu.AddMenuInfo_f("ESC - Keluar submenu, Refresh main menu"); + HelpMenu.AddMenuInfo_f("F1 - Help"); + HelpMenu.AddMenuInfo_f("F2 - Simpan preboot.log ke %ls/ACPI/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Simpan oem DSDT ke %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Simpan patched DSDT ke %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Simpan VideoBios ke %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Simpan screenshot ke %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Eject volume (DVD)"); + HelpMenu.AddMenuInfo_f("Spasi - Detail dari menu yang dipilih"); + HelpMenu.AddMenuInfo_f("Tombol 1-9 - Shortcut pilihan menu"); + HelpMenu.AddMenuInfo_f("A - About"); + HelpMenu.AddMenuInfo_f("O - Opsi"); + HelpMenu.AddMenuInfo_f("R - Soft Reset"); + HelpMenu.AddMenuInfo_f("U - Shutdown"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case polish: + HelpMenu.AddMenuInfo_f("ESC - Wyjscie z podmenu, Odswiezenie glownego menu"); + HelpMenu.AddMenuInfo_f("F1 - Pomoc"); + HelpMenu.AddMenuInfo_f("F2 - Zapis preboot.log (tylko FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Zapis DSDT do %ls/ACPI/origin/ (tylko FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Zapis poprawionego DSDT do %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Zapis BIOSu k. graficznej do %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Zapis zrzutu ekranu do %ls/misc/ (tylko FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Wysuniecie zaznaczonego dysku (tylko dla DVD)"); + HelpMenu.AddMenuInfo_f("Spacja - Informacje nt. dostepnych opcji dla zaznaczonego dysku"); + HelpMenu.AddMenuInfo_f("Znaki 1-9 - Skroty opcji dla wybranego dysku"); + HelpMenu.AddMenuInfo_f("A - Menu Informacyjne"); + HelpMenu.AddMenuInfo_f("O - Menu Opcje"); + HelpMenu.AddMenuInfo_f("R - Restart komputera"); + HelpMenu.AddMenuInfo_f("U - Wylaczenie komputera"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case croatian: + HelpMenu.AddMenuInfo_f("ESC - izlaz iz podizbornika, Osvježi glavni izbornik"); + HelpMenu.AddMenuInfo_f("F1 - Ovaj izbornik"); + HelpMenu.AddMenuInfo_f("F2 - Spremi preboot.log (samo na FAT32)"); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Spremi oem DSDT u %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Spremi patched DSDT into %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Spremi VideoBios into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Spremi screenshot into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Izbaci izabrai (DVD)"); + HelpMenu.AddMenuInfo_f("Space - Detalji o odabranom sistemu"); + HelpMenu.AddMenuInfo_f("Brojevi 1 do 9 su prečac do izbora"); + HelpMenu.AddMenuInfo_f("A - Izbornik o meni"); + HelpMenu.AddMenuInfo_f("O - Izbornik opcije"); + HelpMenu.AddMenuInfo_f("R - Restart računala"); + HelpMenu.AddMenuInfo_f("U - Isključivanje računala"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case czech: + HelpMenu.AddMenuInfo_f("ESC - Vrátit se do hlavní nabídky"); + HelpMenu.AddMenuInfo_f("F1 - Tato Nápověda"); + HelpMenu.AddMenuInfo_f("F2 - Uložit preboot.log (FAT32 only)"); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Uložit oem DSDT do %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Uložit patchnuté DSDT do %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Uložit VideoBios do %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Uložit snímek obrazovky do %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Vysunout vybranou mechaniku (DVD)"); + HelpMenu.AddMenuInfo_f("Mezerník - Podrobnosti o vybraném disku"); + HelpMenu.AddMenuInfo_f("čísla 1-9 - Klávesové zkratky pro disky"); + HelpMenu.AddMenuInfo_f("A - Menu O Programu"); + HelpMenu.AddMenuInfo_f("O - Menu Možnosti"); + HelpMenu.AddMenuInfo_f("R - Částečný restart"); + HelpMenu.AddMenuInfo_f("U - Odejít"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case korean: + HelpMenu.AddMenuInfo_f("ESC - 하위메뉴에서 나감, 메인메뉴 새로 고침"); + HelpMenu.AddMenuInfo_f("F1 - 이 도움말"); + HelpMenu.AddMenuInfo_f("F2 - preboot.log를 저장합니다. (FAT32방식에만 해당됨)"); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - oem DSDT를 %ls/ACPI/origin/에 저장합니다. (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - 패치된 DSDT를 %ls/ACPI/origin/에 저장합니다. (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - VideoBios를 %ls/misc/에 저장합니다. (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - 선택한 출력에서 사운드 확인"); + HelpMenu.AddMenuInfo_f("F8 - 오디오 코덱덤프를 %ls/misc/에 저장합니다.", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - 스크린샷을 %ls/misc/에 저장합니다. (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - NVRAM 초기화"); + HelpMenu.AddMenuInfo_f("F12 - 선택한 볼륨을 제거합니다. (DVD)"); + HelpMenu.AddMenuInfo_f("Space - 선택한 메뉴의 상세 설명"); + HelpMenu.AddMenuInfo_f("Digits 1-9 - 메뉴 단축 번호"); + HelpMenu.AddMenuInfo_f("A - 단축키 - 이 부트로더에 관하여"); + HelpMenu.AddMenuInfo_f("O - 단축키 - 부트 옵션"); + HelpMenu.AddMenuInfo_f("R - 단축키 - 리셋"); + HelpMenu.AddMenuInfo_f("U - 단축키 - 시스템 종료"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case romanian: + HelpMenu.AddMenuInfo_f("ESC - Iesire din sub-meniu, Refresh meniul principal"); + HelpMenu.AddMenuInfo_f("F1 - Ajutor"); + HelpMenu.AddMenuInfo_f("F2 - Salvare preboot.log (doar pentru FAT32)"); + HelpMenu.AddMenuInfo_f("F4 - Salvare oem DSDT in EFI/ACPI/origin/ (FAT32)"); + HelpMenu.AddMenuInfo_f("F5 - Salvare DSDT modificat in EFI/ACPI/origin/ (FAT32)"); + HelpMenu.AddMenuInfo_f("F6 - Salvare VideoBios in EFI/misc/ (FAT32)"); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Salvare screenshot in EFI/misc/ (FAT32)"); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Scoatere volum selectat (DVD)"); + HelpMenu.AddMenuInfo_f("Space - Detalii despre item-ul selectat"); + HelpMenu.AddMenuInfo_f("Cifre 1-9 - Scurtaturi pentru itemele meniului"); + HelpMenu.AddMenuInfo_f("A - Despre"); + HelpMenu.AddMenuInfo_f("O - Optiuni"); + HelpMenu.AddMenuInfo_f("R - Soft Reset"); + HelpMenu.AddMenuInfo_f("U - Inchidere"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case chinese: + HelpMenu.AddMenuInfo_f("ESC - 离开子菜单, 刷新主菜单"); + HelpMenu.AddMenuInfo_f("F1 - 帮助"); + HelpMenu.AddMenuInfo_f("F2 - 保存 preboot.log 到 %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F3 - 显示隐藏的启动项"); + HelpMenu.AddMenuInfo_f("F4 - 保存原始的 DSDT 到 EFI/ACPI/origin/ (FAT32)"); + HelpMenu.AddMenuInfo_f("F5 - 保存修正后的 DSDT 到 EFI/ACPI/origin/ (FAT32)"); + HelpMenu.AddMenuInfo_f("F6 - 保存 VideoBios 到 EFI/misc/ (FAT32)"); + HelpMenu.AddMenuInfo_f("F7 - 检查选中输出设备的声音"); + HelpMenu.AddMenuInfo_f("F8 - 生成声卡输出转储到 %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - 调整屏幕分辨率为下一个可用的模式"); + HelpMenu.AddMenuInfo_f("F10 - 保存截图到 EFI/misc/ (FAT32)"); + HelpMenu.AddMenuInfo_f("F11 - 重置 NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - 推出选中的卷 (DVD)"); + HelpMenu.AddMenuInfo_f("空格 - 关于选中项的详情"); + HelpMenu.AddMenuInfo_f("数字 1-9 - 菜单快捷键"); + HelpMenu.AddMenuInfo_f("A - 关于"); + HelpMenu.AddMenuInfo_f("O - 选项"); + HelpMenu.AddMenuInfo_f("R - 软复位"); + HelpMenu.AddMenuInfo_f("U - 退出"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + case english: + default: + HelpMenu.AddMenuInfo_f("ESC - Escape from submenu, Refresh main menu"); + HelpMenu.AddMenuInfo_f("F1 - This help"); + HelpMenu.AddMenuInfo_f("F2 - Save preboot.log into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); + HelpMenu.AddMenuInfo_f("F4 - Save oem DSDT into %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F5 - Save patched DSDT into %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F6 - Save VideoBios into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); + HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F9 - Switch screen resolution to next possible mode"); + HelpMenu.AddMenuInfo_f("F10 - Save screenshot into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); + HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); + HelpMenu.AddMenuInfo_f("F12 - Eject selected volume (DVD)"); + HelpMenu.AddMenuInfo_f("Space - Details about selected menu entry"); + HelpMenu.AddMenuInfo_f("Digits 1-9 - Shortcut to menu entry"); + HelpMenu.AddMenuInfo_f("A - Menu About"); + HelpMenu.AddMenuInfo_f("O - Menu Options"); + HelpMenu.AddMenuInfo_f("R - Soft Reset"); + HelpMenu.AddMenuInfo_f("U - Exit from Clover"); + HelpMenu.AddMenuInfo_f("S - Shell"); + break; + } + HelpMenu.GetAnime(); + HelpMenu.AddMenuEntry(&MenuEntryReturn, false); } - - // close open file handles - UninitRefitLib(); - // turn control over to the image - // - // Before calling the image, enable the Watchdog Timer for - // the 5 Minute period - Slice - NO! For slow driver and slow disk we need more - // - gBS->SetWatchdogTimer (600, 0x0000, 0x00, NULL); + HelpMenu.RunMenu(NULL); +} - ReturnStatus = Status = gBS->StartImage(ChildImageHandle, NULL, NULL); - // - // Clear the Watchdog Timer after the image returns - // - gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL); +// +// Graphics helper functions +// +/* + SelectionImages: + [0] SelectionBig + [2] SelectionSmall + [4] SelectionIndicator + Buttons: + [0] radio_button + [1] radio_button_selected + [2] checkbox + [3] checkbox_checked +*/ - ReinitRefitLib(); - // control returns here when the child image calls Exit() - if (ImageTitle.notEmpty()) { - snwprintf(ErrorInfo, 512, "returned from %ls", ImageTitle.s()); - } - if (CheckError(Status, ErrorInfo)) { - if (ErrorInStep != NULL) - *ErrorInStep = 3; - } - if (!EFI_ERROR(ReturnStatus)) { //why unload driver?! - goto bailout; - } +// +// user-callable dispatcher functions +// -bailout_unload: - // unload the image, we don't care if it works or not... - Status = gBS->UnloadImage(ChildImageHandle); -bailout: - return ReturnStatus; +REFIT_ABSTRACT_MENU_ENTRY* NewEntry_(REFIT_ABSTRACT_MENU_ENTRY *Entry, REFIT_MENU_SCREEN **SubScreen, ACTION AtClick, UINTN ID, const XString8& Title) +{ + Entry->Title = Title; + Entry->Image = OptionMenu.TitleImage; + Entry->AtClick = AtClick; + // create the submenu + *SubScreen = new REFIT_MENU_SCREEN; + (*SubScreen)->Title = Entry->Title; + (*SubScreen)->TitleImage = Entry->Image; + (*SubScreen)->ID = ID; + (*SubScreen)->GetAnime(); + Entry->SubScreen = *SubScreen; + return Entry; } +REFIT_MENU_ITEM_OPTIONS* newREFIT_MENU_ITEM_OPTIONS(REFIT_MENU_SCREEN **SubScreen, ACTION AtClick, UINTN ID, const XString8& Title) +{ + REFIT_MENU_ITEM_OPTIONS* Entry = new REFIT_MENU_ITEM_OPTIONS; + return NewEntry_(Entry, SubScreen, AtClick, ID, Title)->getREFIT_MENU_ITEM_OPTIONS(); +} -static EFI_STATUS LoadEFIImage(IN EFI_DEVICE_PATH *DevicePath, - IN CONST XStringW& ImageTitle, - OUT UINTN *ErrorInStep, - OUT EFI_HANDLE *NewImageHandle) +void ModifyTitles(REFIT_ABSTRACT_MENU_ENTRY *ChosenEntry) { - EFI_DEVICE_PATH *DevicePaths[2]; - -#ifdef ENABLE_SECURE_BOOT - // Verify secure boot policy - if (GlobalConfig.SecureBoot && GlobalConfig.SecureBootSetupMode) { - // Only verify if in forced secure boot mode - EFI_STATUS Status = VerifySecureBootImage(DevicePath); - if (EFI_ERROR(Status)) { - return Status; - } + if (ChosenEntry->SubScreen->ID == SCREEN_DSDT) { + ChosenEntry->Title.SWPrintf("DSDT fix mask [0x%08x]->", gSettings.ACPI.DSDT.FixDsdt); + //MsgLog("@ESC: %ls\n", (*ChosenEntry)->Title); + } else if (ChosenEntry->SubScreen->ID == SCREEN_CSR) { + // CSR + ChosenEntry->Title.SWPrintf("System Integrity Protection [0x%04x]->", gSettings.RtVariables.CsrActiveConfig); + // check for the right booter flag to allow the application + // of the new System Integrity Protection configuration. + if (gSettings.RtVariables.CsrActiveConfig != 0 && gSettings.RtVariables.BooterConfig == 0) { + gSettings.RtVariables.BooterConfig = 0x28; + } +// } else if (ChosenEntry->SubScreen->ID == SCREEN_BLC) { +// ChosenEntry->Title.SWPrintf("boot_args->flags [0x%04hx]->", gSettings.RtVariables.BooterConfig); } -#endif // ENABLE_SECURE_BOOT - - // Load the image now - DevicePaths[0] = DevicePath; - DevicePaths[1] = NULL; - return LoadEFIImageList(DevicePaths, ImageTitle, ErrorInStep, NewImageHandle); } - -static EFI_STATUS StartEFIImage(IN EFI_DEVICE_PATH *DevicePath, - IN CONST XString8Array& LoadOptions, IN CONST XStringW& LoadOptionsPrefix, - IN CONST XStringW& ImageTitle, - OUT UINTN *ErrorInStep, - OUT EFI_HANDLE *NewImageHandle) +REFIT_ABSTRACT_MENU_ENTRY *SubMenuGraphics() { - EFI_STATUS Status; - EFI_HANDLE ChildImageHandle = NULL; + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_GRAPHICS, "Graphics Injector->"_XS8); + SubScreen->AddMenuInfoLine_f("Number of VideoCard%s=%zu",((gConf.GfxPropertiesArray.size()!=1)?"s":""), gConf.GfxPropertiesArray.size()); + SubScreen->AddMenuItemInput(52, "InjectEDID", false); + SubScreen->AddMenuItemInput(53, "Fake Vendor EDID:", true); + SubScreen->AddMenuItemInput(54, "Fake Product EDID:", true); + SubScreen->AddMenuItemInput(18, "Backlight Level:", true); + SubScreen->AddMenuItemInput(112, "Intel Max Backlight:", true); //gSettings.Devices.IntelMaxValue + + + for (UINTN i = 0; i < gConf.GfxPropertiesArray.size(); i++) { + SubScreen->AddMenuInfo_f("----------------------"); + SubScreen->AddMenuInfo_f("Card DeviceID=%04hx", gConf.GfxPropertiesArray[i].DeviceID); + UINTN N = 20 + i * 6; + SubScreen->AddMenuItemInput(N, "Model:", true); + + if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { + SubScreen->AddMenuItemInput(N+1, "InjectNVidia", false); + } else if (gConf.GfxPropertiesArray[i].Vendor == Ati) { + SubScreen->AddMenuItemInput(N+1, "InjectATI", false); + } else if (gConf.GfxPropertiesArray[i].Vendor == Intel) { + SubScreen->AddMenuItemInput(N+1, "InjectIntel", false); + } else { + SubScreen->AddMenuItemInput(N+1, "InjectX3", false); + } - Status = LoadEFIImage(DevicePath, ImageTitle, ErrorInStep, &ChildImageHandle); - if (!EFI_ERROR(Status)) { - Status = StartEFILoadedImage(ChildImageHandle, LoadOptions, LoadOptionsPrefix, ImageTitle, ErrorInStep); - } + UINTN Ven = 97; //it can be used for non Ati, Nvidia, Intel in QEMU for example + if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { + Ven = 95; + } else if (gConf.GfxPropertiesArray[i].Vendor == Ati) { + Ven = 94; + } else if (gConf.GfxPropertiesArray[i].Vendor == Intel) { + Ven = 96; + } - if (NewImageHandle != NULL) { - *NewImageHandle = ChildImageHandle; - } - return Status; -} + if ((gConf.GfxPropertiesArray[i].Vendor == Ati) || (gConf.GfxPropertiesArray[i].Vendor == Intel)) { + SubScreen->AddMenuItemInput(109, "DualLink:", true); + } + if (gConf.GfxPropertiesArray[i].Vendor == Ati) { + SubScreen->AddMenuItemInput(114, "DeInit:", true); + } + SubScreen->AddMenuItemInput(Ven, "FakeID:", true); -#ifdef DUMP_KERNEL_KEXT_PATCHES -void DumpKernelAndKextPatches(KERNEL_AND_KEXT_PATCHES *Patches) -{ - if (!Patches) { - DBG("Kernel and Kext Patches null pointer\n"); - return; - } - DBG("Kernel and Kext Patches at %llx:\n", (uintptr_t)Patches); - DBG("\tAllowed: %c\n", GlobalConfig.KextPatchesAllowed ? 'y' : 'n'); - DBG("\tDebug: %c\n", Patches->KPDebug ? 'y' : 'n'); -// DBG("\tKernelCpu: %c\n", Patches->KPKernelCpu ? 'y' : 'n'); - DBG("\tKernelLapic: %c\n", Patches->KPKernelLapic ? 'y' : 'n'); - DBG("\tKernelXCPM: %c\n", Patches->KPKernelXCPM ? 'y' : 'n'); - DBG("\tKernelPm: %c\n", Patches->KPKernelPm ? 'y' : 'n'); - DBG("\tAppleIntelCPUPM: %c\n", Patches->KPAppleIntelCPUPM ? 'y' : 'n'); - DBG("\tAppleRTC: %c\n", Patches->KPAppleRTC ? 'y' : 'n'); - // Dell smbios truncate fix - DBG("\tDellSMBIOSPatch: %c\n", Patches->KPDELLSMBIOS ? 'y' : 'n'); - DBG("\tFakeCPUID: 0x%X\n", Patches->FakeCPUID); - DBG("\tATIController: %s\n", Patches->KPATIConnectorsController.isEmpty() ? "(null)": Patches->KPATIConnectorsController.c_str()); - DBG("\tATIDataLength: %zu\n", Patches->KPATIConnectorsData.size()); - DBG("\t%zu Kexts to load\n", Patches->ForceKextsToLoad.size()); - if (Patches->ForceKextsToLoad.size()) { - size_t i = 0; - for (; i < Patches->ForceKextsToLoad.size(); ++i) { - DBG("\t KextToLoad[%zu]: %ls\n", i, Patches->ForceKextsToLoad[i].wc_str()); + if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { + SubScreen->AddMenuItemInput(N+2, "DisplayCFG:", true); + } else if (gConf.GfxPropertiesArray[i].Vendor == Ati) { + SubScreen->AddMenuItemInput(N+2, "FBConfig:", true); + } else /*if (gGraphics[i].Vendor == Intel)*/{ + SubScreen->AddMenuItemInput(N+2, "*-platform-id:", true); } - } - DBG("\t%zu Kexts to patch\n", Patches->KextPatches.size()); - if (Patches->KextPatches.size()) { - size_t i = 0; - for (; i < Patches->KextPatches.size(); ++i) { - if (Patches->KextPatches[i].IsPlistPatch) { - DBG("\t KextPatchPlist[%zu]: %zu bytes, %s\n", i, Patches->KextPatches[i].Data.size(), Patches->KextPatches[i].Name.c_str()); - } else { - DBG("\t KextPatch[%zu]: %zu bytes, %s\n", i, Patches->KextPatches[i].Data.size(), Patches->KextPatches[i].Name.c_str()); - } + + // ErmaC: NvidiaGeneric entry + if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { + SubScreen->AddMenuItemInput(55, "Generic NVIDIA name", false); + SubScreen->AddMenuItemInput(110, "NVIDIA No EFI", false); + SubScreen->AddMenuItemInput(111, "NVIDIA Single", false); + SubScreen->AddMenuItemInput(56, "Use NVIDIA WEB drivers", false); } - } -} -#endif -void LOADER_ENTRY::FilterKextPatches() -{ - if ( GlobalConfig.KextPatchesAllowed && KernelAndKextPatches.KextPatches.size() > 0 ) { - DBG("Filtering KextPatches:\n"); - for (size_t i = 0; i < KernelAndKextPatches.KextPatches.size(); i++) { - DBG(" - [%02zu]: %s :: %s :: [OS: %s | MatchOS: %s | MatchBuild: %s]", - i, - KernelAndKextPatches.KextPatches[i].Label.c_str(), - KernelAndKextPatches.KextPatches[i].IsPlistPatch ? "PlistPatch" : "BinPatch", - macOSVersion.asString().c_str(), - KernelAndKextPatches.KextPatches[i].MatchOS.notEmpty() ? KernelAndKextPatches.KextPatches[i].MatchOS.c_str() : "All", - KernelAndKextPatches.KextPatches[i].MatchBuild.notEmpty() ? KernelAndKextPatches.KextPatches[i].MatchBuild.c_str() : "All" - ); - if (!gSettings.KernelAndKextPatches.KextPatches[i].MenuItem.BValue) { - KernelAndKextPatches.KextPatches[i].MenuItem.BValue = false; - DBG(" ==> disabled by user\n"); - continue; - } - KernelAndKextPatches.KextPatches[i].MenuItem.BValue = true; - if ((BuildVersion.notEmpty()) && (KernelAndKextPatches.KextPatches[i].MatchBuild.notEmpty())) { - KernelAndKextPatches.KextPatches[i].MenuItem.BValue = KernelAndKextPatches.KextPatches[i].IsPatchEnabledByBuildNumber(BuildVersion); - DBG(" ==> %s\n", KernelAndKextPatches.KextPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); - continue; - } - KernelAndKextPatches.KextPatches[i].MenuItem.BValue = KernelAndKextPatches.KextPatches[i].IsPatchEnabled(macOSVersion); - DBG(" ==> %s\n", KernelAndKextPatches.KextPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); + if (gConf.GfxPropertiesArray[i].Vendor == Intel) { + continue; + } + SubScreen->AddMenuItemInput(N+3, "Ports:", true); + + if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { + SubScreen->AddMenuItemInput(N+4, "NVCAP:", true); + } else { + SubScreen->AddMenuItemInput(N+4, "Connectors:", true); + SubScreen->AddMenuItemInput(50, "RefCLK:", true); } + SubScreen->AddMenuItemInput(N+5, "Load Video Bios", false); } + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -void LOADER_ENTRY::FilterKernelPatches() +// ErmaC: Audio submenu +REFIT_ABSTRACT_MENU_ENTRY *SubMenuAudio() { - if ( GlobalConfig.KernelPatchesAllowed && KernelAndKextPatches.KernelPatches.notEmpty() ) { - DBG("Filtering KernelPatches:\n"); - for (size_t i = 0; i < KernelAndKextPatches.KernelPatches.size(); ++i) { - DBG(" - [%02zu]: %s :: [OS: %s | MatchOS: %s | MatchBuild: %s]", - i, - KernelAndKextPatches.KernelPatches[i].Label.c_str(), - macOSVersion.asString().c_str(), - KernelAndKextPatches.KernelPatches[i].MatchOS.notEmpty() ? KernelAndKextPatches.KernelPatches[i].MatchOS.c_str() : "All", - KernelAndKextPatches.KernelPatches[i].MatchBuild.notEmpty() ? KernelAndKextPatches.KernelPatches[i].MatchBuild.c_str() : "All" - ); - if (!gSettings.KernelAndKextPatches.KernelPatches[i].MenuItem.BValue) { - KernelAndKextPatches.KernelPatches[i].MenuItem.BValue = false; - DBG(" ==> disabled by user\n"); - continue; - } - KernelAndKextPatches.KernelPatches[i].MenuItem.BValue = true; - if ((BuildVersion.notEmpty()) && (KernelAndKextPatches.KernelPatches[i].MatchBuild.notEmpty())) { - KernelAndKextPatches.KernelPatches[i].MenuItem.BValue = KernelAndKextPatches.KernelPatches[i].IsPatchEnabledByBuildNumber(BuildVersion); - DBG(" ==> %s by build\n", KernelAndKextPatches.KernelPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); - continue; - } + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; - KernelAndKextPatches.KernelPatches[i].MenuItem.BValue = KernelAndKextPatches.KernelPatches[i].IsPatchEnabled(macOSVersion); - DBG(" ==> %s by OS\n", KernelAndKextPatches.KernelPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); - } + // create the entry in the main menu + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_AUDIO, "Audio tuning->"_XS8); + + // submenu description + SubScreen->AddMenuInfoLine_f("Choose options to tune the HDA devices"); + SubScreen->AddMenuInfoLine_f("Number of Audio Controller%s=%zu", ((gConf.HdaPropertiesArray.size()!=1)?"s":""), gConf.HdaPropertiesArray.size()); + for (UINTN i = 0 ; i < gConf.HdaPropertiesArray.size() ; i++) { + SubScreen->AddMenuInfoLine_f("%llu) %ls [%04hX][%04hX]", + (i+1), + gConf.HdaPropertiesArray[i].controller_name.wc_str(), + gConf.HdaPropertiesArray[i].controller_vendor_id, + gConf.HdaPropertiesArray[i].controller_device_id + ); } -} -void LOADER_ENTRY::FilterBootPatches() -{ - if ( KernelAndKextPatches.BootPatches.notEmpty() ) { - DBG("Filtering BootPatches:\n"); - for (size_t i = 0; i < KernelAndKextPatches.BootPatches.size(); ++i) { - DBG(" - [%02zu]: %s :: [OS: %s | MatchOS: %s | MatchBuild: %s]", - i, - KernelAndKextPatches.BootPatches[i].Label.c_str(), - macOSVersion.asString().c_str(), - KernelAndKextPatches.BootPatches[i].MatchOS.notEmpty() ? KernelAndKextPatches.BootPatches[i].MatchOS.c_str() : "All", - KernelAndKextPatches.BootPatches[i].MatchBuild.notEmpty() ? KernelAndKextPatches.BootPatches[i].MatchBuild.c_str() : "All" - ); - if (!gSettings.KernelAndKextPatches.BootPatches[i].MenuItem.BValue) { - DBG(" ==> disabled by user\n"); - continue; - } - KernelAndKextPatches.BootPatches[i].MenuItem.BValue = true; - if ((BuildVersion.notEmpty()) && (KernelAndKextPatches.BootPatches[i].MatchBuild.notEmpty())) { - KernelAndKextPatches.BootPatches[i].MenuItem.BValue = KernelAndKextPatches.BootPatches[i].IsPatchEnabledByBuildNumber(BuildVersion); - DBG(" ==> %s by build\n", KernelAndKextPatches.BootPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); - continue; - } - - KernelAndKextPatches.BootPatches[i].MenuItem.BValue = KernelAndKextPatches.BootPatches[i].IsPatchEnabled(macOSVersion); - DBG(" ==> %s by OS\n", KernelAndKextPatches.BootPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); - - } + //SubScreen->AddMenuItemInput(59, "HDAInjection", false); + if (gSettings.Devices.Audio.HDAInjection) { + SubScreen->AddMenuItemInput(60, "HDALayoutId:", true); } -} -// -// Null ConOut OutputString() implementation - for blocking -// text output from boot.efi when booting in graphics mode -// -EFI_STATUS EFIAPI -NullConOutOutputString(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *, IN CONST CHAR16 *) { - return EFI_SUCCESS; + // avaiable configuration + SubScreen->AddMenuItemInput(57, "ResetHDA", false); + SubScreen->AddMenuItemInput(58, "AFGLowPowerState", false); + + // return + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } +#define nya(x) x/10,x%10 -void CheckEmptyFB() +REFIT_ABSTRACT_MENU_ENTRY* SubMenuSpeedStep() { - XBool EmptyFB = (GlobalConfig.IgPlatform == 0x00050000) || - (GlobalConfig.IgPlatform == 0x01620007) || - (GlobalConfig.IgPlatform == 0x04120004) || - (GlobalConfig.IgPlatform == 0x19120001) || - (GlobalConfig.IgPlatform == 0x59120003) || - (GlobalConfig.IgPlatform == 0x9BC80003) || - (GlobalConfig.IgPlatform == 0x3E910003); - if (EmptyFB) { - gSettings.Smbios.gPlatformFeature |= PT_FEATURE_HAS_HEADLESS_GPU; - } else { - gSettings.Smbios.gPlatformFeature &= ~PT_FEATURE_HAS_HEADLESS_GPU; - } + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_CPU, "CPU tuning->"_XS8); + SubScreen->AddMenuInfoLine_f("%s", gCPUStructure.BrandString.c_str()); + SubScreen->AddMenuInfoLine_f("Model: %2X/%2X/%2X", + gCPUStructure.Family, gCPUStructure.Model, gCPUStructure.Stepping); + SubScreen->AddMenuInfoLine_f("Cores: %d Threads: %d", + gCPUStructure.Cores, gCPUStructure.Threads); + SubScreen->AddMenuInfoLine_f("FSB speed MHz: %llu", + DivU64x32(gCPUStructure.FSBFrequency, Mega)); + SubScreen->AddMenuInfoLine_f("CPU speed MHz: %llu", + DivU64x32(gCPUStructure.CPUFrequency, Mega)); + SubScreen->AddMenuInfoLine_f("Ratio: Min=%d.%d Max=%d.%d Turbo=%d.%d/%d.%d/%d.%d/%d.%d", + nya(gCPUStructure.MinRatio), nya(gCPUStructure.MaxRatio), + nya(gCPUStructure.Turbo4), nya(gCPUStructure.Turbo3), nya(gCPUStructure.Turbo2), nya(gCPUStructure.Turbo1)); + + + SubScreen->AddMenuItemInput(76, "Cores enabled:", true); + SubScreen->AddMenuItemInput(6, "Halt Enabler", false); + SubScreen->AddMenuItemInput(7, "PLimitDict:", true); + SubScreen->AddMenuItemInput(8, "UnderVoltStep:", true); + SubScreen->AddMenuItemInput(88, "DoubleFirstState", false); + SubScreen->AddMenuItemInput(5, "GeneratePStates", false); + SubScreen->AddMenuItemInput(9, "GenerateCStates", false); + SubScreen->AddMenuItemInput(10, "EnableC2", false); + SubScreen->AddMenuItemInput(11, "EnableC4", false); + SubScreen->AddMenuItemInput(12, "EnableC6", false); + SubScreen->AddMenuItemInput(89, "EnableC7", false); + SubScreen->AddMenuItemInput(13, "Use SystemIO", false); + SubScreen->AddMenuItemInput(75, "C3Latency:", true); + SubScreen->AddMenuItemInput(19, "BusSpeed [kHz]:", true); + SubScreen->AddMenuItemInput(14, "QPI [MHz]:", true); + SubScreen->AddMenuItemInput(77, "Saving Mode:", true); + SubScreen->AddMenuItemInput(15, "PatchAPIC", false); //-> move to ACPI? + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -size_t setKextAtPos(XObjArray* kextArrayPtr, const XString8& kextName, size_t pos) +REFIT_ABSTRACT_MENU_ENTRY* SubMenuKextPatches() { - XObjArray& kextArray = *kextArrayPtr; + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_INPUT_DIALOG *InputBootArgs; - for (size_t kextIdx = 0 ; kextIdx < kextArray.size() ; kextIdx++ ) { - if ( kextArray[kextIdx].FileName.contains(kextName) ) { - if ( pos >= kextArray.size() ) { - log_technical_bug("pos >= kextArray.size()"); - return kextArray.size() - 1 ; // If we're here, kextArray.size() is at least 1 - } - if ( pos == kextIdx ) return pos+1; - if ( pos > kextIdx ) pos -= 1; - SIDELOAD_KEXT* kextToMove = &kextArray[kextIdx]; - kextArray.RemoveWithoutFreeingAtIndex(kextIdx); - kextArray.InsertRef(kextToMove, pos, false); - return pos+1; - } + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_KEXTS, "Custom kexts patches->"_XS8); + + for ( size_t Index = 0; Index < gSettings.KernelAndKextPatches.KextPatches.size(); Index++) { + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf("%90s", gSettings.KernelAndKextPatches.KextPatches[Index].Label.c_str()); +// InputBootArgs->Tag = TAG_INPUT; + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &(gSettings.KernelAndKextPatches.KextPatches[Index].MenuItem); + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); } - return pos; + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -static XStringW getDriversPath() +REFIT_ABSTRACT_MENU_ENTRY* SubMenuKextBlockInjection(const XString8& UniSysVer) { -#if defined(MDE_CPU_X64) - if (gFirmwareClover) { - if (FileExists(&self.getCloverDir(), L"drivers\\BIOS")) { - return L"drivers\\BIOS"_XSW; - } else { - return L"drivers64"_XSW; //backward compatibility - } - } else if (FileExists(&self.getCloverDir(), L"drivers\\5142")) { // can be excluded as obsolete - return L"drivers\\5142"_XSW; - } else if (FileExists(&self.getCloverDir(), L"drivers\\UEFI")) { - return L"drivers\\UEFI"_XSW; - } else { - return L"drivers64UEFI"_XSW; - } -#else - return L"drivers32"_XSW; -#endif + REFIT_MENU_ITEM_OPTIONS *Entry = NULL; + REFIT_MENU_SCREEN *SubScreen = NULL; + REFIT_INPUT_DIALOG *InputBootArgs; + + for ( size_t idx = 0 ; idx < InjectKextList.size() ; idx ++ ) { + SIDELOAD_KEXT& Kext = InjectKextList[idx]; + if ( Kext.KextDirNameUnderOEMPath == UniSysVer ) { + if ( SubScreen == NULL ) { + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_KEXT_INJECT, S8Printf("%s->", UniSysVer.c_str())); + SubScreen->AddMenuInfoLine_f("Choose/check kext to disable:"); + } + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf("%ls, v.%ls", Kext.FileName.wc_str(), Kext.Version.wc_str()); +// InputBootArgs->Tag = TAG_INPUT; + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &(Kext.MenuItem); + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + + for ( size_t idxPlugin = 0 ; idxPlugin < Kext.PlugInList.size() ; idxPlugin ++ ) { + SIDELOAD_KEXT& plugInKext = Kext.PlugInList[idxPlugin]; + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf(" |-- %ls, v.%ls", plugInKext.FileName.wc_str(), plugInKext.Version.wc_str()); + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &(plugInKext.MenuItem); + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + } + } + } + + if ( SubScreen != NULL ) SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -#ifdef JIEF_DEBUG -void debugStartImageWithOC() +LOADER_ENTRY* LOADER_ENTRY::SubMenuKextInjectMgmt() { - MsgLog("debugStartImageWithOC\n"); - UINT64 CPUFrequencyFromART; - InternalCalculateARTFrequencyIntel(&CPUFrequencyFromART, NULL, 1); - - EFI_LOADED_IMAGE* OcLoadedImage; - EFI_STATUS Status = gBS->HandleProtocol(gImageHandle, &gEfiLoadedImageProtocolGuid, (void **) &OcLoadedImage); - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* FileSystem = OcLocateFileSystem(OcLoadedImage->DeviceHandle, OcLoadedImage->FilePath); - Status = OcStorageInitFromFs(&mOpenCoreStorage, FileSystem, NULL, NULL, self.getCloverDirFullPath().wc_str(), NULL); - - Status = ClOcReadConfigurationFile(&mOpenCoreStorage, L"config-oc.plist", &mOpenCoreConfiguration); - if ( EFI_ERROR(Status) ) panic("ClOcReadConfigurationFile"); - - mOpenCoreConfiguration.Misc.Debug.Target = 0; - OC_STRING_ASSIGN(mOpenCoreConfiguration.Misc.Boot.PickerMode, "Builtin"); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Misc.Security.DmgLoading, "Any"); - mOpenCoreConfiguration.Uefi.Quirks.IgnoreInvalidFlexRatio = 0; - - mOpenCoreConfiguration.Uefi.Quirks.TscSyncTimeout = 0; - - OcMain(&mOpenCoreStorage, NULL); - - XStringW devicePathToLookFor; -// devicePathToLookFor.takeValueFrom("PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x0,0x0,0x0)/HD(4,GPT,CA224585-830E-4274-5826-1ACB6DA08A4E,0x299F000,0x4AE6310)/VenMedia(BE74FCF7-0B7C-49F3-9147-01F4042E6842,1ABE434C8D0357398516CFDF0A9DD7EF)"); // Jief High Sierra DevicePath - devicePathToLookFor.takeValueFrom("PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x0,0x0,0x0)/HD(2,GPT,D8C7DA82-1E4C-4579-BA7C-6737A5D43464,0x64028,0x1BF08E8)"); // Jief Big Sur Install device path - UINTN HandleCount = 0; - EFI_HANDLE *Handles = NULL; - Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &HandleCount, &Handles); - UINTN HandleIndex = 0; - for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) { - EFI_DEVICE_PATH_PROTOCOL* DevicePath = DevicePathFromHandle(Handles[HandleIndex]); - CHAR16* UnicodeDevicePath = ConvertDevicePathToText(DevicePath, false, false); - MsgLog("debugStartImageWithOC : path %ls\n", UnicodeDevicePath); - if ( StrCmp(devicePathToLookFor.wc_str(), UnicodeDevicePath) == 0 ) break; - } - if ( HandleIndex < HandleCount ) - { - EFI_DEVICE_PATH_PROTOCOL* jfkImagePath = FileDevicePath(Handles[HandleIndex], L"\\System\\Library\\CoreServices\\boot.efi"); - CHAR16* UnicodeDevicePath = ConvertDevicePathToText (jfkImagePath, false, false); (void)UnicodeDevicePath; - - EFI_HANDLE EntryHandle = NULL; - - // point to InternalEfiLoadImage from OC - Status = gBS->LoadImage ( - false, - gImageHandle, - jfkImagePath, - NULL, - 0, - &EntryHandle - ); - if ( EFI_ERROR(Status) ) return; // TODO message ? - - EFI_LOADED_IMAGE *LoadedImage = NULL; - EFI_STATUS OptionalStatus = gBS->HandleProtocol ( - EntryHandle, - &gEfiLoadedImageProtocolGuid, - (void **) &LoadedImage - ); - if ( EFI_ERROR(OptionalStatus) ) return; // TODO message ? - - // XStringW LoadOptionsAsXStringW = SWPrintf("%s ", LoadOptions.ConcatAll(" "_XS8).c_str()); - XStringW LoadOptionsAsXStringW = SWPrintf("boot.efi -v -no_compat_check slide=0 kext-dev-mode=1 keepsyms=1 -wegdbg igfxgl=1 bpr_probedelay=200 bpr_initialdelay=400 bpr_postresetdelay=400 "); - LoadedImage->LoadOptions = (void*)LoadOptionsAsXStringW.wc_str(); - LoadedImage->LoadOptionsSize = (UINT32)LoadOptionsAsXStringW.sizeInBytesIncludingTerminator(); - - // point to OcStartImage from OC - Status = gBS->StartImage (EntryHandle, 0, NULL); - if ( EFI_ERROR(Status) ) return; // TODO message ? - }else{ - MsgLog("debugStartImageWithOC : not found\n"); - } + LOADER_ENTRY *SubEntry; + REFIT_MENU_SCREEN *SubSubScreen; + + SubEntry = new LOADER_ENTRY; + NewEntry_(SubEntry, &SubSubScreen, ActionEnter, SCREEN_SYSTEM, "Block injected kexts->"_XS8); + SubEntry->Flags = Flags; + if (macOSVersion.notEmpty()) { + + XString8 OSVersionKextsDirName; // declare here to avoid multiple allocation + + { + XString8 ShortOSVersion = macOSVersion.nbElement() == 1 ? macOSVersion.asString(1) : macOSVersion.asString(macOSVersion.nbElement()-1); + SubSubScreen->AddMenuInfoLine_f("Block injected kexts for target version of macOS: %s", ShortOSVersion.c_str()); + } + + // Add kext from 10 or 11 + { + OSVersionKextsDirName = macOSVersion.asString(1); + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); + OSVersionKextsDirName.S8Catf("_%s", getSuffixForMacOsVersion(LoaderType).c_str()); + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); + } + + // Add kext from 10(or 11).{version} + { + OSVersionKextsDirName = macOSVersion.asString(2); + if ( macOSVersion.elementAt(1) == -1 ) OSVersionKextsDirName.S8Catf(".0"); + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); + OSVersionKextsDirName.S8Catf("_%s", getSuffixForMacOsVersion(LoaderType).c_str()); + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); + } + + // Add kext from : + // 10(or 1*).{version}.0 if NO minor version + // 10(or 1*).{version}.{minor version} if minor version is > 0 + if ( macOSVersion.nbElement() >= 2 ) + { + OSVersionKextsDirName = macOSVersion.asString(3); + if ( macOSVersion.elementAt(1) == -1 ) OSVersionKextsDirName.S8Catf(".0"); + if ( macOSVersion.elementAt(2) == -1 ) OSVersionKextsDirName.S8Catf(".0"); + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); + OSVersionKextsDirName.S8Catf("_%s", getSuffixForMacOsVersion(LoaderType).c_str()); + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); + } + } + else { + SubSubScreen->AddMenuInfoLine_f("Block injected kexts for unknown macOS version"); + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection("Unknown"_XS8), true); + } + + XStringW kextDir; + kextDir = GetOtherKextsDir(true); + if ( kextDir.notEmpty() ) { + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection("Other"_XS8), true); + } + kextDir = GetOtherKextsDir(false); + if ( kextDir.notEmpty() ) { + SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection("Off"_XS8), true); + } + + SubSubScreen->AddMenuEntry(&MenuEntryReturn, false); + return SubEntry; } -#endif -void LOADER_ENTRY::DelegateKernelPatches() + +REFIT_ABSTRACT_MENU_ENTRY* SubMenuKernelPatches() { - XObjArray selectedPathArray; - for (size_t kernelPatchIdx = 0 ; kernelPatchIdx < KernelAndKextPatches.KernelPatches.size() ; kernelPatchIdx++ ) - { - if ( KernelAndKextPatches.KernelPatches[kernelPatchIdx].MenuItem.BValue ) - selectedPathArray.AddReference(&KernelAndKextPatches.KernelPatches[kernelPatchIdx], false); - } - for (size_t kextPatchIdx = 0 ; kextPatchIdx < KernelAndKextPatches.KextPatches.size() ; kextPatchIdx++ ) - { - if ( KernelAndKextPatches.KextPatches[kextPatchIdx].MenuItem.BValue ) - selectedPathArray.AddReference(&KernelAndKextPatches.KextPatches[kextPatchIdx], false); - } - mOpenCoreConfiguration.Kernel.Patch.Count = (UINT32)selectedPathArray.size(); - mOpenCoreConfiguration.Kernel.Patch.AllocCount = mOpenCoreConfiguration.Kernel.Patch.Count; - mOpenCoreConfiguration.Kernel.Patch.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Kernel.Patch.Values)); - mOpenCoreConfiguration.Kernel.Patch.Values = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Patch.Values)*)malloc(mOpenCoreConfiguration.Kernel.Patch.AllocCount*sizeof(__typeof_am__(*mOpenCoreConfiguration.Kernel.Patch.Values))); - memset(mOpenCoreConfiguration.Kernel.Patch.Values, 0, mOpenCoreConfiguration.Kernel.Patch.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Patch.Values)); - - UINT32 FakeCPUID = gSettings.Smbios.SFakeCPU; - if (FakeCPUID != 0) gFakeCPUID = FakeCPUID; - DBG("Set FakeCPUID: 0x%X\n", gFakeCPUID); + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_INPUT_DIALOG *InputBootArgs; - memset(mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Data, 0, sizeof(mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Data)); - memset(mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Mask, 0, sizeof(mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Mask)); - mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Data[0] = gFakeCPUID; - mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Mask[0] = 0xFFFFFFFF; + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_KERNELS, "Custom kernel patches->"_XS8); - for (size_t kextPatchIdx = 0 ; kextPatchIdx < selectedPathArray.size() ; kextPatchIdx++ ) - { - const ABSTRACT_KEXT_OR_KERNEL_PATCH& kextPatch = selectedPathArray[kextPatchIdx]; //as well as kernel patches - DBG("Bridge %s patch to OC : %s\n", kextPatch.getName().c_str(), kextPatch.Label.c_str()); - mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Patch.Values))AllocateZeroPool(mOpenCoreConfiguration.Kernel.Patch.ValueSize); // sizeof(OC_KERNEL_ADD_ENTRY) == 680 - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Base, kextPatch.ProcedureName.c_str()); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Comment, kextPatch.Label.c_str()); - mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Count = (UINT32)kextPatch.Count; - mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Enabled = 1; - - OC_DATA_ASSIGN_N(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Find, kextPatch.Find.data(), kextPatch.Find.size()); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Identifier, kextPatch.getName().c_str()); - mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Limit = (UINT32)kextPatch.SearchLen; - OC_DATA_ASSIGN_N(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Mask, kextPatch.MaskFind.data(), kextPatch.MaskFind.size()); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->MaxKernel, ""); // it has been filtered, so we don't need to set Min and MaxKernel - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->MinKernel, ""); - OC_DATA_ASSIGN_N(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Replace, kextPatch.Replace.data(), kextPatch.Replace.size()); - OC_DATA_ASSIGN_N(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->ReplaceMask, kextPatch.MaskReplace.data(), kextPatch.MaskReplace.size()); - mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Skip = (UINT32)kextPatch.Skip; + for (size_t Index = 0; Index < gSettings.KernelAndKextPatches.KernelPatches.size(); Index++) { + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf("%90s", gSettings.KernelAndKextPatches.KernelPatches[Index].Label.c_str()); + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &(gSettings.KernelAndKextPatches.KernelPatches[Index].MenuItem); + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); } + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -void LOADER_ENTRY::StartLoader() +REFIT_ABSTRACT_MENU_ENTRY* SubMenuBootPatches() { - EFI_STATUS Status; - EFI_TEXT_STRING ConOutOutputString = 0; - EFI_HANDLE ImageHandle = NULL; - EFI_LOADED_IMAGE *LoadedImage = NULL; - CONST CHAR8 *InstallerVersion; + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_INPUT_DIALOG *InputBootArgs; - DbgHeader("StartLoader"); + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_BOOTER, "Custom booter patches->"_XS8); - DBG("Starting %ls\n", FileDevicePathToXStringW(DevicePath).wc_str()); -#ifdef JIEF_DEBUG - displayFreeMemory("LOADER_ENTRY::StartLoader()"_XS8); -#endif -// while ( OcCountFreePages(NULL) > 300000 && AllocatePages(100) ) /*DBG("Free memory : %lld\n", OcCountFreePages(NULL))*/; -// displayFreeMemory(); - - if (Settings.notEmpty()) { - DBG(" Settings: %ls\n", Settings.wc_str()); - Status = gConf.ReLoadConfig(Settings); - if (!EFI_ERROR(Status)) { - DBG(" - found custom settings for this entry: %ls\n", Settings.wc_str()); - } else { - DBG(" - [!] LoadUserSettings failed: %s\n", efiStrError(Status)); - /* we are not sure of the state of gSettings here... try to boot anyway */ - } - } - - DBG("Finally: ExternalClock=%lluMHz BusSpeed=%llukHz CPUFreq=%uMHz", - DivU64x32(gCPUStructure.ExternalClock + Kilo - 1, Kilo), - DivU64x32(gCPUStructure.FSBFrequency + Kilo - 1, Kilo), - gCPUStructure.MaxSpeed); - if (gSettings.CPU.QPI) { - DBG(" QPI: hw.busfrequency=%lluHz\n", MultU64x32(gSettings.CPU.QPI, Mega)); - } else { - // to match the value of hw.busfrequency in the terminal - DBG(" PIS: hw.busfrequency=%lluHz\n", MultU64x32(LShiftU64(DivU64x32(gCPUStructure.ExternalClock + Kilo - 1, Kilo), 2), Mega)); + for (size_t Index = 0; Index < gSettings.KernelAndKextPatches.BootPatches.size(); Index++) { + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf("%90s", gSettings.KernelAndKextPatches.BootPatches[Index].Label.c_str()); + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &(gSettings.KernelAndKextPatches.BootPatches[Index].MenuItem); + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); } - - //Free memory - ConfigsList.setEmpty(); - DsdtsList.setEmpty(); - - OptionMenu.FreeMenu(); - //there is a place to free memory - // GuiAnime - // mainParser - // BuiltinIcons - // OSIcons - delete ThemeX; - ThemeX = NULL; + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; +} - devprop_free_string(); +REFIT_ABSTRACT_MENU_ENTRY* SubMenuBinaries() +{ + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_BINARIES, "Binaries patching->"_XS8); + + SubScreen->AddMenuInfoLine_f("%s", gCPUStructure.BrandString.c_str()); + SubScreen->AddMenuInfoLine_f("Real CPUID: 0x%06X", gCPUStructure.Signature); + + SubScreen->AddMenuItemInput(64, "Debug", false); + SubScreen->AddMenuInfo_f("----------------------"); + SubScreen->AddMenuItemInput(104, "Fake CPUID:", true); + SubScreen->AddMenuItemInput(91, "Kernel Lapic", false); + SubScreen->AddMenuItemInput(105, "Kernel XCPM", false); + SubScreen->AddMenuItemInput(48, "Kernel PM", false); + SubScreen->AddMenuItemInput(121, "Panic No Kext Dump", false); + SubScreen->AddMenuItemInput(128, "Provide CPU Info", false); + SubScreen->AddMenuEntry(SubMenuKernelPatches(), true); + SubScreen->AddMenuInfo_f("----------------------"); + SubScreen->AddMenuItemInput(46, "AppleIntelCPUPM Patch", false); + SubScreen->AddMenuItemInput(47, "AppleRTC Patch", false); +// SubScreen->AddMenuItemInput(45, "No 8 Apples Patch", false); + SubScreen->AddMenuItemInput(61, "Dell SMBIOS Patch", false); + SubScreen->AddMenuItemInput(115, "Block SkywalkFamily", false); +// SubScreen->AddMenuItemInput(115, "No Caches", false); +// SubScreen->AddMenuItemInput(44, "Kext patching allowed", false); + SubScreen->AddMenuEntry(SubMenuKextPatches(), true); + SubScreen->AddMenuInfo_f("----------------------"); + SubScreen->AddMenuEntry(SubMenuBootPatches(), true); + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; +} +REFIT_ABSTRACT_MENU_ENTRY* SubMenuDropTables() +{ + CHAR8 sign[5]; + CHAR8 OTID[9]; + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_INPUT_DIALOG *InputBootArgs; -#ifdef NANOSVG_MEMORY_ALLOCATION_TRACE - if ( nsvg__nbDanglingPtr() > 0 ) { - DBG("There is %zu dangling ptr from SVG subsytem\n", nsvg__nbDanglingPtr()); - nsvg__outputDanglingPtr(); - } -#endif -#ifdef JIEF_DEBUG - displayFreeMemory("LOADER_ENTRY::StartLoader() atfer ThemeX deleted"_XS8); -#endif + sign[4] = 0; + OTID[8] = 0; + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_TABLES, "Tables dropping->"_XS8); - if ( OSTYPE_IS_OSX(LoaderType) || OSTYPE_IS_OSX_RECOVERY(LoaderType) || OSTYPE_IS_OSX_INSTALLER(LoaderType) ) { - - // if OC is NOT initialized with OcMain, we need the following - // OcConfigureLogProtocol ( - // 9, - // 0, - // 2151678018, - // 2147483648, - // OPEN_CORE_LOG_PREFIX_PATH, - // mOpenCoreStorage.FileSystem - // ); - // DEBUG ((DEBUG_INFO, "OC: Log initialized...\n")); - // OcAppleDebugLogInstallProtocol(0); - - DBG("Beginning OC\n"); - - EFI_LOADED_IMAGE* OcLoadedImage; - Status = gBS->HandleProtocol(gImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &OcLoadedImage); - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* FileSystem = OcLocateFileSystem(OcLoadedImage->DeviceHandle, OcLoadedImage->FilePath); - Status = OcStorageInitFromFs(&mOpenCoreStorage, FileSystem, NULL, NULL, self.getCloverDirFullPath().wc_str(), NULL); - - /* - * Define READ_FROM_OC to have mOpenCoreConfiguration initialized from config-oc.plist - * The boot should work. - * Next, comment out the next lines one by one. Once the boot failed, we got the section that - * holds the setting that makes a difference. - */ - //#define USE_OC_SECTION_Acpi - //#define USE_OC_SECTION_Booter - //#define USE_OC_SECTION_DeviceProperties - //#define USE_OC_SECTION_Kernel - //#define USE_OC_SECTION_Misc - //#define USE_OC_SECTION_Nvram - //#define USE_OC_SECTION_PlatformInfo - //#define USE_OC_SECTION_Uefi - - #if !defined(USE_OC_SECTION_Acpi) && !defined(USE_OC_SECTION_Booter) && !defined(USE_OC_SECTION_DeviceProperties) && !defined(USE_OC_SECTION_Kernel) && !defined(USE_OC_SECTION_Misc) && \ - !defined(USE_OC_SECTION_Nvram) && !defined(USE_OC_SECTION_PlatformInfo) && !defined(USE_OC_SECTION_Uefi) - - memset(&mOpenCoreConfiguration, 0, sizeof(mOpenCoreConfiguration)); -// DBG("config-oc.plist isn't used at all\n"); - - #else - Status = ClOcReadConfigurationFile(&mOpenCoreStorage, L"config-oc.plist", &mOpenCoreConfiguration); - if ( EFI_ERROR(Status) ) panic("ClOcReadConfigurationFile"); - - #ifndef USE_OC_SECTION_Acpi - memset(&mOpenCoreConfiguration.Acpi, 0, sizeof(mOpenCoreConfiguration.Acpi)); - DBG("Erase mOpenCoreConfiguration.Acpi\n"); - #else - DBG("Keep mOpenCoreConfiguration.Acpi\n"); - #endif - #ifndef USE_OC_SECTION_Booter - memset(&mOpenCoreConfiguration.Booter, 0, sizeof(mOpenCoreConfiguration.Booter)); - DBG("Erase mOpenCoreConfiguration.Booter\n"); - #else - DBG("Keep mOpenCoreConfiguration.Booter\n"); - #endif - #ifndef USE_OC_SECTION_DeviceProperties - memset(&mOpenCoreConfiguration.DeviceProperties, 0, sizeof(mOpenCoreConfiguration.DeviceProperties)); - DBG("Erase mOpenCoreConfiguration.DeviceProperties\n"); - #else - DBG("Keep mOpenCoreConfiguration.DeviceProperties\n"); - #endif - #ifndef USE_OC_SECTION_Kernel - memset(&mOpenCoreConfiguration.Kernel, 0, sizeof(mOpenCoreConfiguration.Kernel)); - DBG("Erase mOpenCoreConfiguration.Kernel\n"); - #else - DBG("Keep mOpenCoreConfiguration.Kernel\n"); - for ( size_t i = 0 ; i < mOpenCoreConfiguration.Kernel.Add.Count ; i ++ ) { - OC_KERNEL_ADD_ENTRY* entry = mOpenCoreConfiguration.Kernel.Add.Values[i]; - OC_STRING_ASSIGN(entry->BundlePath, S8Printf("Kexts\\%s", OC_BLOB_GET(&entry->BundlePath)).c_str()); - } + if (GlobalConfig.ACPIDropTables.notEmpty()) { + for ( size_t idx = 0 ; idx < GlobalConfig.ACPIDropTables.length() ; ++idx ) + { + ACPI_DROP_TABLE& DropTable = GlobalConfig.ACPIDropTables[idx]; + + CopyMem((CHAR8*)&sign, (CHAR8*)&(DropTable.Signature), 4); + CopyMem((CHAR8*)&OTID, (CHAR8*)&(DropTable.TableId), 8); -// DBG("mOpenCoreConfiguration.Kernel.Add.Count=%d\n", mOpenCoreConfiguration.Kernel.Add.Count); -// for ( size_t i = 0 ; i < mOpenCoreConfiguration.Kernel.Add.Count ; i++ ) -// { -// DBG("mOpenCoreConfiguration.Kernel.Add.Values[%zd]->Identifier=%s\n", i, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[i]->Identifier)); -// DBG("mOpenCoreConfiguration.Kernel.Add.Values[%zd]->BundlePath=%s\n", i, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[i]->BundlePath)); -// DBG("mOpenCoreConfiguration.Kernel.Add.Values[%zd]->PlistPath=%s\n", i, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[i]->PlistPath)); -// } - #endif - #ifndef USE_OC_SECTION_Misc - memset(&mOpenCoreConfiguration.Misc, 0, sizeof(mOpenCoreConfiguration.Misc)); - DBG("Erase mOpenCoreConfiguration.Misc\n"); - #else - DBG("Keep mOpenCoreConfiguration.Misc\n"); - #endif - #ifndef USE_OC_SECTION_Nvram - memset(&mOpenCoreConfiguration.Nvram, 0, sizeof(mOpenCoreConfiguration.Nvram)); - DBG("Erase mOpenCoreConfiguration.Nvram\n"); - #else - DBG("Keep mOpenCoreConfiguration.Nvram\n"); - #endif - #ifndef USE_OC_SECTION_PlatformInfo - memset(&mOpenCoreConfiguration.PlatformInfo, 0, sizeof(mOpenCoreConfiguration.PlatformInfo)); - DBG("Erase mOpenCoreConfiguration.PlatformInfo\n"); - #else - DBG("Keep mOpenCoreConfiguration.PlatformInfo\n"); - #endif - #ifndef USE_OC_SECTION_Uefi - memset(&mOpenCoreConfiguration.Uefi, 0, sizeof(mOpenCoreConfiguration.Uefi)); - DBG("Erase mOpenCoreConfiguration.Uefi\n"); - #else - DBG("Keep mOpenCoreConfiguration.Uefi\n"); - // memset(&mOpenCoreConfiguration.Uefi.Apfs, 0, sizeof(mOpenCoreConfiguration.Uefi.Apfs)); - // memset(&mOpenCoreConfiguration.Uefi.Audio, 0, sizeof(mOpenCoreConfiguration.Uefi.Audio)); - // memset(&mOpenCoreConfiguration.Uefi.ConnectDrivers, 0, sizeof(mOpenCoreConfiguration.Uefi.ConnectDrivers)); - // memset(&mOpenCoreConfiguration.Uefi.Drivers, 0, sizeof(mOpenCoreConfiguration.Uefi.Drivers)); - // memset(&mOpenCoreConfiguration.Uefi.Input, 0, sizeof(mOpenCoreConfiguration.Uefi.Input)); - // memset(&mOpenCoreConfiguration.Uefi.Output, 0, sizeof(mOpenCoreConfiguration.Uefi.Output)); - // memset(&mOpenCoreConfiguration.Uefi.ProtocolOverrides, 0, sizeof(mOpenCoreConfiguration.Uefi.ProtocolOverrides)); - // memset(&mOpenCoreConfiguration.Uefi.Quirks, 0, sizeof(mOpenCoreConfiguration.Uefi.Quirks)); - // memset(&mOpenCoreConfiguration.Uefi.ReservedMemory, 0, sizeof(mOpenCoreConfiguration.Uefi.ReservedMemory)); // doesn't matter - #endif - - #endif - - - - if ( gSettings.Boot.DebugLog ) { - mOpenCoreConfiguration.Misc.Debug.AppleDebug = true; - mOpenCoreConfiguration.Misc.Debug.ApplePanic = true; - - #ifndef LESS_DEBUG - mOpenCoreConfiguration.Misc.Debug.DisplayLevel = 0x80400042; - #else - mOpenCoreConfiguration.Misc.Debug.DisplayLevel = 0x80000042; - #endif - mOpenCoreConfiguration.Misc.Debug.Target = 0x41; - } else { - #ifdef JIEF_DEBUG - egSetGraphicsModeEnabled(false); - mOpenCoreConfiguration.Misc.Debug.ApplePanic = true; - mOpenCoreConfiguration.Misc.Debug.DisplayLevel = 0x80000042; - mOpenCoreConfiguration.Misc.Debug.Target = 0x3; - #endif + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf("Drop \"%4.4s\" \"%8.8s\" %d", sign, OTID, DropTable.Length); + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &(DropTable.MenuItem); + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); } + } - #ifndef USE_OC_SECTION_Misc - OC_STRING_ASSIGN(mOpenCoreConfiguration.Misc.Security.SecureBootModel, "Disabled"); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Misc.Security.Vault, "Optional"); - #endif - #ifdef USE_OC_SECTION_Nvram - mOpenCoreConfiguration.Nvram.WriteFlash = true; - #endif -#ifndef USE_OC_SECTION_Uefi - mOpenCoreConfiguration.Uefi.Quirks.ForceOcWriteFlash = gSettings.Quirks.OcBooterQuirks.ForceOcWriteFlash; -#endif + SubScreen->AddMenuItemInput(4, "Drop all OEM SSDT", false); + SubScreen->AddMenuItemInput(113, "Automatic smart merge", false); - #ifndef USE_OC_SECTION_Booter + for ( size_t idx = 0 ; idx < ACPIPatchedAML.size() ; ++idx) { + ACPI_PATCHED_AML& ACPIPatchedAMLTmp = ACPIPatchedAML[idx]; + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf("Drop \"%s\"", ACPIPatchedAMLTmp.FileName.c_str()); + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &(ACPIPatchedAMLTmp.MenuItem); + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + } - mOpenCoreConfiguration.Booter.MmioWhitelist.Count = (UINT32)gSettings.Quirks.mmioWhiteListArray.size(); - mOpenCoreConfiguration.Booter.MmioWhitelist.AllocCount = mOpenCoreConfiguration.Booter.MmioWhitelist.Count; - mOpenCoreConfiguration.Booter.MmioWhitelist.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Booter.MmioWhitelist.Values)); // sizeof(OC_KERNEL_ADD_ENTRY) == 680 - if ( mOpenCoreConfiguration.Booter.MmioWhitelist.Count > 0 ) { - mOpenCoreConfiguration.Booter.MmioWhitelist.Values = (OC_BOOTER_WL_ENTRY**)AllocatePool(mOpenCoreConfiguration.Booter.MmioWhitelist.AllocCount * sizeof(*mOpenCoreConfiguration.Booter.MmioWhitelist.Values)); // sizeof(OC_KERNEL_ADD_ENTRY) == 680 - } else { - mOpenCoreConfiguration.Booter.MmioWhitelist.Values = NULL; - } - for ( size_t idx = 0 ; idx < gSettings.Quirks.mmioWhiteListArray.size() ; idx++ ) { - const SETTINGS_DATA::QuirksClass::MMIOWhiteList& entry = gSettings.Quirks.mmioWhiteListArray[idx]; - DBG("Bridge mmioWhiteList[%zu] to OC : comment=%s\n", idx, entry.comment.c_str()); - mOpenCoreConfiguration.Booter.MmioWhitelist.Values[idx] = (__typeof_am__(*mOpenCoreConfiguration.Booter.MmioWhitelist.Values))AllocatePool(mOpenCoreConfiguration.Booter.MmioWhitelist.ValueSize); - mOpenCoreConfiguration.Booter.MmioWhitelist.Values[idx]->Address = entry.address; - OC_STRING_ASSIGN(mOpenCoreConfiguration.Booter.MmioWhitelist.Values[idx]->Comment, entry.comment.c_str()); - mOpenCoreConfiguration.Booter.MmioWhitelist.Values[idx]->Enabled = entry.enabled; - } - - // It's possible to memcpy the whole struct instead of assigning individual member. But that would be relying on internel C++ binary structure, - // and worse, if a field is added by OC, everything could be shifted. - memset(&mOpenCoreConfiguration.Booter.Quirks, 0, sizeof(mOpenCoreConfiguration.Booter.Quirks)); - mOpenCoreConfiguration.Booter.Quirks.AvoidRuntimeDefrag = gSettings.Quirks.OcBooterQuirks.AvoidRuntimeDefrag; - mOpenCoreConfiguration.Booter.Quirks.DevirtualiseMmio = gSettings.Quirks.OcBooterQuirks.DevirtualiseMmio; - mOpenCoreConfiguration.Booter.Quirks.DisableSingleUser = gSettings.Quirks.OcBooterQuirks.DisableSingleUser; - mOpenCoreConfiguration.Booter.Quirks.DisableVariableWrite = gSettings.Quirks.OcBooterQuirks.DisableVariableWrite; - mOpenCoreConfiguration.Booter.Quirks.DiscardHibernateMap = gSettings.Quirks.OcBooterQuirks.DiscardHibernateMap; - mOpenCoreConfiguration.Booter.Quirks.EnableSafeModeSlide = gSettings.Quirks.OcBooterQuirks.EnableSafeModeSlide; - mOpenCoreConfiguration.Booter.Quirks.EnableWriteUnprotector = gSettings.Quirks.OcBooterQuirks.EnableWriteUnprotector; - mOpenCoreConfiguration.Booter.Quirks.ForceExitBootServices = gSettings.Quirks.OcBooterQuirks.ForceExitBootServices; - mOpenCoreConfiguration.Booter.Quirks.ProtectMemoryRegions = gSettings.Quirks.OcBooterQuirks.ProtectMemoryRegions; - mOpenCoreConfiguration.Booter.Quirks.ProtectSecureBoot = gSettings.Quirks.OcBooterQuirks.ProtectSecureBoot; - mOpenCoreConfiguration.Booter.Quirks.ProtectUefiServices = gSettings.Quirks.OcBooterQuirks.ProtectUefiServices; - mOpenCoreConfiguration.Booter.Quirks.ProvideCustomSlide = gSettings.Quirks.OcBooterQuirks.ProvideCustomSlide; - mOpenCoreConfiguration.Booter.Quirks.ProvideMaxSlide = gSettings.Quirks.OcBooterQuirks.ProvideMaxSlide; - mOpenCoreConfiguration.Booter.Quirks.RebuildAppleMemoryMap = gSettings.Quirks.OcBooterQuirks.RebuildAppleMemoryMap; - mOpenCoreConfiguration.Booter.Quirks.ResizeAppleGpuBars = gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars; - mOpenCoreConfiguration.Booter.Quirks.SetupVirtualMap = gSettings.Quirks.OcBooterQuirks.SetupVirtualMap; - mOpenCoreConfiguration.Booter.Quirks.SignalAppleOS = false; //gSettings.Quirks.OcBooterQuirks.SignalAppleOS; - mOpenCoreConfiguration.Booter.Quirks.SyncRuntimePermissions = gSettings.Quirks.OcBooterQuirks.SyncRuntimePermissions; - - - #endif - - - FillOCCpuInfo(&mOpenCoreCpuInfo); - - mOpenCoreConfiguration.Uefi.Quirks.TscSyncTimeout = gSettings.Quirks.OcBooterQuirks.TscSyncTimeout; - - #ifndef USE_OC_SECTION_Kernel - - XObjArray kextArray; - if (!DoHibernateWake) { - AddKextsInArray(&kextArray); - } - - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Scheme.KernelArch, "x86_64"); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Scheme.KernelCache, gSettings.Quirks.OcKernelCache.c_str()); - mOpenCoreConfiguration.Kernel.Scheme.FuzzyMatch = gSettings.Quirks.FuzzyMatch; - - memset(&mOpenCoreConfiguration.Kernel.Quirks, 0, sizeof(mOpenCoreConfiguration.Kernel.Quirks)); - - mOpenCoreConfiguration.Kernel.Quirks.SetApfsTrimTimeout = -1; // Jief: Slice modified OcConfigurationLib.h to set -1 by default instead of 999. I prefer the modification here to minimize commits in OC submodule. Makes it easier to upgrade submodule. - mOpenCoreConfiguration.Kernel.Quirks.AppleCpuPmCfgLock = GlobalConfig.KPAppleIntelCPUPM || GlobalConfig.NeedPMfix ; - mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmCfgLock = GlobalConfig.KPKernelPm || GlobalConfig.NeedPMfix ; - - mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmExtraMsrs = gSettings.Quirks.OcKernelQuirks.AppleXcpmExtraMsrs; - mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmForceBoost = gSettings.Quirks.OcKernelQuirks.AppleXcpmForceBoost; - #ifndef USE_OC_SECTION_PlatformInfo - mOpenCoreConfiguration.Kernel.Quirks.CustomSmbiosGuid = gSettings.KernelAndKextPatches.KPDELLSMBIOS; - #endif - mOpenCoreConfiguration.Kernel.Quirks.DisableIoMapper = gSettings.Quirks.OcKernelQuirks.DisableIoMapper; - mOpenCoreConfiguration.Kernel.Quirks.DisableLinkeditJettison = gSettings.Quirks.OcKernelQuirks.DisableLinkeditJettison; - mOpenCoreConfiguration.Kernel.Quirks.DisableRtcChecksum = gSettings.KernelAndKextPatches.KPAppleRTC; - mOpenCoreConfiguration.Kernel.Emulate.DummyPowerManagement = gSettings.Quirks.OcKernelQuirks.DummyPowerManagement; - mOpenCoreConfiguration.Kernel.Quirks.ExtendBTFeatureFlags = gSettings.Quirks.OcKernelQuirks.ExtendBTFeatureFlags; - mOpenCoreConfiguration.Kernel.Quirks.ExternalDiskIcons = gSettings.Quirks.OcKernelQuirks.ExternalDiskIcons; - mOpenCoreConfiguration.Kernel.Quirks.IncreasePciBarSize = gSettings.Quirks.OcKernelQuirks.IncreasePciBarSize; - mOpenCoreConfiguration.Kernel.Quirks.ForceAquantiaEthernet = gSettings.Quirks.OcKernelQuirks.ForceAquantiaEthernet; - mOpenCoreConfiguration.Kernel.Quirks.LapicKernelPanic = gSettings.KernelAndKextPatches.KPKernelLapic; - mOpenCoreConfiguration.Kernel.Quirks.PanicNoKextDump = gSettings.KernelAndKextPatches.KPPanicNoKextDump; - mOpenCoreConfiguration.Kernel.Quirks.PowerTimeoutKernelPanic = gSettings.Quirks.OcKernelQuirks.PowerTimeoutKernelPanic; - mOpenCoreConfiguration.Kernel.Quirks.ThirdPartyDrives = gSettings.Quirks.OcKernelQuirks.ThirdPartyDrives; - mOpenCoreConfiguration.Kernel.Quirks.XhciPortLimit = gSettings.Quirks.OcKernelQuirks.XhciPortLimit; - mOpenCoreConfiguration.Kernel.Quirks.ProvideCurrentCpuInfo = gSettings.Quirks.OcKernelQuirks.ProvideCurrentCpuInfo; - - mOpenCoreConfiguration.Kernel.Add.Count = (UINT32)kextArray.size(); - mOpenCoreConfiguration.Kernel.Add.AllocCount = mOpenCoreConfiguration.Kernel.Add.Count; - mOpenCoreConfiguration.Kernel.Add.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Kernel.Add.Values)); // sizeof(OC_KERNEL_ADD_ENTRY) == 680 - mOpenCoreConfiguration.Kernel.Add.Values = (OC_KERNEL_ADD_ENTRY**)malloc(mOpenCoreConfiguration.Kernel.Add.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Add.Values)); // sizeof(OC_KERNEL_ADD_ENTRY*) == sizeof(ptr) - memset(mOpenCoreConfiguration.Kernel.Add.Values, 0, mOpenCoreConfiguration.Kernel.Add.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Add.Values)); - - // Seems that Lilu must be first. - size_t pos = setKextAtPos(&kextArray, "Lilu.kext"_XS8, 0); - pos = setKextAtPos(&kextArray, "VirtualSMC.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "FakeSMC.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "WhateverGreen.kext"_XS8, pos); -// pos = setKextAtPos(&kextArray, "AppleMCEReporterDisabler.kext"_XS8, pos); -// pos = setKextAtPos(&kextArray, "AppleIntelI210Ethernet.kext"_XS8, pos); -// pos = setKextAtPos(&kextArray, "USBWakeFixup.kext"_XS8, pos); -// pos = setKextAtPos(&kextArray, "FeatureUnlock.kext"_XS8, pos); -// pos = setKextAtPos(&kextArray, "vecLib.kext"_XS8, pos); -// pos = setKextAtPos(&kextArray, "IOAudioFamily.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "IOSkywalkFamily.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "FakePCIID.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "FakePCIID_XHCIMux.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "AMDRyzenCPUPowerManagement.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "SMCAMDProcessor.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "AppleALC.kext"_XS8, pos); -// pos = setKextAtPos(&kextArray, "IntelMausi.kext"_XS8, pos); // not needed special order? - pos = setKextAtPos(&kextArray, "SMCProcessor.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "USBPorts.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "VoodooGPIO.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "VoodooI2CServices.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "VoodooI2C.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "VoodooI2CHID.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "VoodooSMBus.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "VoodooRMI.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "BrcmFirmwareData.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "BrcmPatchRAM2.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "BrcmPatchRAM3.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "IO80211FamilyLegacy.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "AirPortBrcmNIC.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "HS80211Family.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "corecaptureElCap.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "IO80211ElCap.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "AirPortAtheros40.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "SMCProcessorAMD.kext"_XS8, pos); - pos = setKextAtPos(&kextArray, "SMCSuperIO.kext"_XS8, pos); - - for (size_t kextIdx = 0 ; kextIdx < kextArray.size() ; kextIdx++ ) { - const SIDELOAD_KEXT& KextEntry = kextArray[kextIdx]; - DBG("Bridge kext to OC : Path=%ls\\%ls\n", KextEntry.KextDirNameUnderOEMPath.wc_str(), KextEntry.FileName.wc_str()); - mOpenCoreConfiguration.Kernel.Add.Values[kextIdx] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Add.Values))malloc(mOpenCoreConfiguration.Kernel.Add.ValueSize); - memset(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx], 0, mOpenCoreConfiguration.Kernel.Add.ValueSize); - mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Enabled = 1; - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Comment, ""); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->MaxKernel, ""); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->MinKernel, ""); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Identifier, ""); - - assert( selfOem.isKextsDirFound() ); // be sure before calling getKextsPathRelToSelfDir() - XStringW dirPath = SWPrintf("%ls\\%ls", selfOem.getKextsDirPathRelToSelfDir().wc_str(), KextEntry.KextDirNameUnderOEMPath.wc_str()); - - XString8 bundleFullPath = S8Printf("%ls\\%ls", dirPath.wc_str(), KextEntry.FileName.wc_str()); - if ( FileExists(&self.getCloverDir(), bundleFullPath) ) { - XString8 bundlePathUnderKextsDir = S8Printf("%ls\\%ls", KextEntry.KextDirNameUnderOEMPath.wc_str(), KextEntry.FileName.wc_str()); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath, bundlePathUnderKextsDir.c_str()); - // DBG("OC BundlePath = '%s'\n", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath)); - } else { - DBG("Cannot find kext bundlePath at '%s'\n", bundleFullPath.c_str()); - } - #if 1 - //CFBundleExecutable - XBool NoContents = false; - XStringW infoPlistPathRelToSelf = getKextPlist(&self.getCloverDir(), dirPath, KextEntry.FileName, &NoContents); //it will be fullPath, including dir - - // XBool inject = checkOSBundleRequired(dict); - XBool inject = true; - if (inject) { - if ( infoPlistPathRelToSelf.notEmpty()) { - if (NoContents) { - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistPath, "Info.plist"); - } else { - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistPath, "Contents\\Info.plist"); - } - // DBG("OC PlistPath = '%s'\n", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistPath)); - } else { - DBG("Cannot find kext info.plist at '%ls'\n", KextEntry.FileName.wc_str()); - } - TagDict* dict = getInfoPlist(&self.getCloverDir(), infoPlistPathRelToSelf); - XString8 execpath = getKextExecPath(&self.getCloverDir(), KextEntry.KextDirNameUnderOEMPath, KextEntry.FileName, dict, NoContents); - if (execpath.notEmpty()) { - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ExecutablePath, execpath.c_str()); - // DBG("OC ExecutablePath = '%s'\n", execpath.c_str()); - } - if ( dict ) dict->ReleaseTag(); - } - - #else - XStringW execpath = S8Printf("Contents\\MacOS\\%ls", KextEntry.FileName.subString(0, KextEntry.FileName.rindexOf(".")).wc_str()); - XStringW fullPath = SWPrintf("%s\\%ls", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath), execpath.wc_str()); - if ( FileExists(&self.getCloverDir(), fullPath) ) { - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ExecutablePath, S8Printf("Contents\\MacOS\\%ls", KextEntry.FileName.subString(0, KextEntry.FileName.rindexOf(".")).wc_str()).c_str()); - } - XStringW infoPlistPathRelToSelf = SWPrintf("%s\\Contents\\Info.plist", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath)); - if (FileExists(&self.getCloverDir(), infoPlistPathRelToSelf)) { - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistPath, "Contents/Info.plist"); // TODO : is always Contents/Info.plist ? - } else { - DBG("Cannot find kext info.plist at '%ls'\n", infoPlistPathRelToSelf.wc_str()); - } - #endif - mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ImageData = NULL; - mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ImageDataSize = 0; - mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistData = NULL; - mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistDataSize = 0; - - } // for (size_t kextIdx - - - mOpenCoreConfiguration.Kernel.Force.Count = (UINT32)KernelAndKextPatches.ForceKextsToLoad.size(); - mOpenCoreConfiguration.Kernel.Force.AllocCount = mOpenCoreConfiguration.Kernel.Force.Count; - mOpenCoreConfiguration.Kernel.Force.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Kernel.Force.Values)); // sizeof(OC_KERNEL_FORCE_ENTRY) - int valuesSize = mOpenCoreConfiguration.Kernel.Force.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Force.Values); - mOpenCoreConfiguration.Kernel.Force.Values = (OC_KERNEL_ADD_ENTRY**)malloc(valuesSize); // sizeof(OC_KERNEL_FORCE_ENTRY*) == sizeof(ptr) - memset(mOpenCoreConfiguration.Kernel.Force.Values, 0, valuesSize); - - - - for (size_t kextIdx = 0; kextIdx < KernelAndKextPatches.ForceKextsToLoad.size(); kextIdx++) { - const XStringW& forceKext = KernelAndKextPatches.ForceKextsToLoad[kextIdx]; - - DBG("Force kext to OC : Path=%ls\n", forceKext.wc_str()); - mOpenCoreConfiguration.Kernel.Force.Values[kextIdx] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Force.Values))malloc(mOpenCoreConfiguration.Kernel.Force.ValueSize); - memset(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx], 0, mOpenCoreConfiguration.Kernel.Force.ValueSize); - mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Enabled = 1; - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Comment, ""); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->MaxKernel, ""); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->MinKernel, ""); - // OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Identifier, ""); - - mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ImageData = NULL; - mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ImageDataSize = 0; - mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->PlistData = NULL; - mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->PlistDataSize = 0; - - REFIT_VOLUME * SystemVolume = Volume; - EFI_FILE* SysRoot = Volume->RootDir; - - - if (Volume->ApfsRole == APPLE_APFS_VOLUME_ROLE_PREBOOT) { - //search for other partition - DBG("boot from Preboot, index=%llu\n", Volume->Index); - size_t numbers = Volumes.size(); - size_t sysIndex = 0; - for (sysIndex=Volume->Index+1; sysIndex < numbers; sysIndex++) { - SystemVolume = &Volumes[sysIndex]; - SysRoot = SystemVolume->RootDir; - - DBG("test volume %zd, name %ls:\n", sysIndex, SystemVolume->VolName.wc_str()); - - if (FileExists(SysRoot, L"\\System\\Library\\CoreServices\\boot.efi")) { - DBG("boot.efi found on %zd\n", sysIndex); - } - REFIT_DIR_ITER DirIter; - EFI_FILE_INFO *DirEntry = NULL; - DirIterOpen(SysRoot, L"\\System\\Library\\Extensions\\AMDSupport.kext\\Contents\\MacOS\\", &DirIter); - while (DirIterNext(&DirIter, 1, L"*", &DirEntry)) { - if (DirEntry->FileName[0] == '.') { - DBG("Skip dot entries: %ls\n", DirEntry->FileName); - continue; - } - DBG("%ls attr=%llu\n", DirEntry->FileName, DirEntry->Attribute); - } - DirIterClose(&DirIter); - if (FileExists(SysRoot, L"\\System\\Library\\Extensions\\AMDSupport.kext\\Contents\\MacOS\\AMDSupport")) { - DBG("AMDSupport found on %zd\n", sysIndex); //never found - break; - } - } - } - mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ImageData = (UINT8*)SysRoot; - - size_t i1 = forceKext.rindexOf("\\") + 1; - size_t i2 = forceKext.rindexOf("."); - XStringW identifier = forceKext.subString(i1, i2 - i1); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Identifier, S8Printf("%ls", identifier.wc_str()).c_str()); - - XString8 execpath = S8Printf("Contents\\MacOS\\%ls", identifier.wc_str()); - DBG("calculated execpath=%s\n", execpath.c_str()); - - - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->BundlePath, S8Printf("%ls",forceKext.wc_str()).c_str()); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->PlistPath, "Contents\\Info.plist"); - - //then we have to find executablePath and plistPath - DBG("bundle path=%s\n", mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->BundlePath.Value); - - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ExecutablePath, execpath.c_str()); - DBG("assign executable as '%s'\n", mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ExecutablePath.Value); - - } - if (gSettings.KernelAndKextPatches.BlockSkywalk) { - mOpenCoreConfiguration.Kernel.Block.Count = 1; - mOpenCoreConfiguration.Kernel.Block.AllocCount = 1; - mOpenCoreConfiguration.Kernel.Block.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Kernel.Block.Values)); - valuesSize = mOpenCoreConfiguration.Kernel.Block.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Block.Values); - mOpenCoreConfiguration.Kernel.Block.Values = (OC_KERNEL_BLOCK_ENTRY**)malloc(valuesSize); - - memset(mOpenCoreConfiguration.Kernel.Block.Values, 0, valuesSize); - - mOpenCoreConfiguration.Kernel.Block.Values[0] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Block.Values))malloc(mOpenCoreConfiguration.Kernel.Block.ValueSize); - memset(mOpenCoreConfiguration.Kernel.Block.Values[0], 0, mOpenCoreConfiguration.Kernel.Block.ValueSize); - mOpenCoreConfiguration.Kernel.Block.Values[0]->Enabled = 1; - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->Comment, "Allow IOSkywalk Downgrade"); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->MaxKernel, ""); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->MinKernel, "23"); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->Identifier, "com.apple.iokit.IOSkywalkFamily"); - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->Strategy, "Exclude"); - -// mOpenCoreConfiguration.Kernel.Block.Values[1] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Block.Values))malloc(mOpenCoreConfiguration.Kernel.Block.ValueSize); -// memset(mOpenCoreConfiguration.Kernel.Block.Values[1], 0, mOpenCoreConfiguration.Kernel.Block.ValueSize); -// mOpenCoreConfiguration.Kernel.Block.Values[1]->Enabled = 1; -// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); -// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->Comment, ""); -// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->MaxKernel, ""); -// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->MinKernel, "23"); -// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->Identifier, "com.apple.driver.mDNSOffloadUserClient"); -// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->Strategy, "Exclude"); - - } - #endif - - mOpenCoreConfiguration.Uefi.Output.ProvideConsoleGop = gSettings.GUI.ProvideConsoleGop; - OC_STRING_ASSIGN(mOpenCoreConfiguration.Uefi.Output.Resolution, XString8(gSettings.GUI.ScreenResolution).c_str()); - - if ( OpenRuntimeEfiName.notEmpty() ) { - XStringW FileName = SWPrintf("%ls\\%ls\\%ls", self.getCloverDirFullPath().wc_str(), getDriversPath().wc_str(), OpenRuntimeEfiName.wc_str()); - EFI_HANDLE DriverHandle; - Status = gBS->LoadImage(false, gImageHandle, FileDevicePath(self.getSelfLoadedImage().DeviceHandle, FileName), NULL, 0, &DriverHandle); - if ( !EFI_ERROR(Status) ) { - Status = gBS->StartImage(DriverHandle, 0, 0); - DBG("Start '%ls' : Status %s\n", OpenRuntimeEfiName.wc_str(), efiStrError(Status)); - - if ( !EFI_ERROR(Status) ) - { - OC_FIRMWARE_RUNTIME_PROTOCOL *FwRuntime; - Status = gBS->LocateProtocol ( - gOcFirmwareRuntimeProtocolGuid, - NULL, - (VOID **) &FwRuntime - ); - - if (!EFI_ERROR (Status)) { - if (FwRuntime->Revision == OC_FIRMWARE_RUNTIME_REVISION) { - } else { - DEBUG (( - DEBUG_ERROR, - "OCABC: Incompatible OpenRuntime r%u, require r%u\n", - (UINT32) FwRuntime->Revision, - (UINT32) OC_FIRMWARE_RUNTIME_REVISION - )); - DBG("Incompatible OpenRuntime r%llu, require r%u\n", FwRuntime->Revision, OC_FIRMWARE_RUNTIME_REVISION); - } - } - } - }else{ - DBG("Error when loading '%ls' : Status %s.\n", OpenRuntimeEfiName.wc_str(), efiStrError(Status)); - } - }else{ - DBG("No OpenRuntime driver. This is wrong, OpenRuntime is mandatory.\n"); - } - - OcMain(&mOpenCoreStorage, NULL); - - XStringW DevicePathAsString = DevicePathToXStringW(DevicePath); - if ( DevicePathAsString.rindexOf(".dmg") == MAX_XSIZE ) - { - // point to InternalEfiLoadImage from OC - Status = gBS->LoadImage ( - false, - gImageHandle, - DevicePath, - NULL, - 0, - &ImageHandle - ); - if ( EFI_ERROR(Status) ) { - DBG("LoadImage at '%ls' failed. Status = %s\n", DevicePathAsString.wc_str(), efiStrError(Status)); - return; - } - DBG("ImageHandle = %llx\n", uintptr_t(ImageHandle)); - } else { - // NOTE : OpenCore ignore the name of the dmg. - // InternalLoadDmg calls InternalFindFirstDmgFileName to find the dmg file name. - // So be careful that, if an other dmg exists in the dir, that might boot on the wrong one. - - EFI_DEVICE_PATH_PROTOCOL* DevicePathCopy = DuplicateDevicePath(DevicePath); - - EFI_DEVICE_PATH_PROTOCOL* PreviousNode = NULL; - EFI_DEVICE_PATH_PROTOCOL* Node = DevicePathCopy; - while (!IsDevicePathEnd(Node)) { - if ( Node->Type == MEDIA_DEVICE_PATH && Node->SubType == MEDIA_FILEPATH_DP ) { - PreviousNode = Node; - break; - } - - PreviousNode = Node; - Node = NextDevicePathNode(Node); - } - SetDevicePathEndNode(PreviousNode); - - EFI_DEVICE_PATH_PROTOCOL* LoaderPathBasenameNode = ConvertTextToDeviceNode(LoaderPath.dirname().wc_str()); - EFI_DEVICE_PATH_PROTOCOL* DevicePathToDmgDir = AppendDevicePathNode(DevicePathCopy, LoaderPathBasenameNode); - DBG("DevicePathToDmgDir = %ls\n", DevicePathToXStringW(DevicePathToDmgDir).wc_str()); - - INTERNAL_DMG_LOAD_CONTEXT DmgLoadContext = {0,0,0}; - DmgLoadContext.DevicePath = DevicePathToDmgDir; - EFI_DEVICE_PATH_PROTOCOL* BootEfiFromDmgDevicePath = InternalLoadDmg(&DmgLoadContext, OcDmgLoadingAnyImage); - DBG("DevicePath of dmg = %ls\n", DevicePathToXStringW(BootEfiFromDmgDevicePath).wc_str()); - - // point to InternalEfiLoadImage from OC - Status = gBS->LoadImage ( - false, - gImageHandle, - BootEfiFromDmgDevicePath, - NULL, - 0, - &ImageHandle - ); - if ( EFI_ERROR(Status) ) { - DBG("LoadImage at '%ls' failed. Status = %s\n", DevicePathToXStringW(BootEfiFromDmgDevicePath).wc_str(), efiStrError(Status)); - return; - } - } - - EFI_STATUS OptionalStatus = gBS->HandleProtocol ( - ImageHandle, - &gEfiLoadedImageProtocolGuid, - (void **) &LoadedImage - ); - if ( EFI_ERROR(OptionalStatus) ) return; // TODO message ? - } else { - // Load image into memory (will be started later) - Status = LoadEFIImage(DevicePath, LoaderPath.basename(), NULL, &ImageHandle); - if (EFI_ERROR(Status)) { - DBG("Image is not loaded, status=%s\n", efiStrError(Status)); - return; // no reason to continue if loading image failed - } - } - - egClearScreen(&BootBgColor); //if not set then it is already MenuBackgroundPixel - -// KillMouse(); - -// if (LoaderType == OSTYPE_OSX) { - if (OSTYPE_IS_OSX(LoaderType) || - OSTYPE_IS_OSX_RECOVERY(LoaderType) || - OSTYPE_IS_OSX_INSTALLER(LoaderType)) { - - // To display progress bar properly (especially in FV2 mode) boot.efi needs to be in graphics mode. - // Unfortunately many UEFI implementations change the resolution when SetMode happens. - // This is not what boot.efi expects, and it freely calls SetMode at its will. - // As a result we see progress bar at improper resolution and the background is also missing (10.12.x+). - // - // libeg already has a workaround for SetMode behaviour, so we extend it for boot.efi support. - // The approach tries to be follows: - // 1. Ensure we have graphics mode set (since it is a must in the future). - // 2. Request text mode for boot.efi, which it expects by default (here a SetMode libeg hack will trigger - // on problematic UEFI implementations like AMI). - egSetGraphicsModeEnabled(true); - egSetGraphicsModeEnabled(false); - - DBG("GetOSVersion:"); - - //needed for boot.efi patcher - Status = gBS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (void **) &LoadedImage); - // Correct OSVersion if it was not found - // This should happen only for 10.7-10.9 OSTYPE_OSX_INSTALLER - // For these cases, take OSVersion from loaded boot.efi image in memory - if ( macOSVersion.isEmpty()) { - - if (!EFI_ERROR(Status)) { - // version in boot.efi appears as "Mac OS X 10.?" - /* - Start OSName Mac OS X 10.12 End OSName Start OSVendor Apple Inc. End - */ - - InstallerVersion = AsciiStrStr((CHAR8*)LoadedImage->ImageBase, "Mac OS X "); - int location = 9; - if (InstallerVersion == NULL) { - InstallerVersion = AsciiStrStr((CHAR8*)LoadedImage->ImageBase, "macOS "); - location = 7; - } - if (InstallerVersion != NULL) { // string was found - InstallerVersion += location; // advance to version location - - if (strncmp(InstallerVersion, "10.7", 4) && - strncmp(InstallerVersion, "10.8", 4) && - strncmp(InstallerVersion, "10.9", 4) && - strncmp(InstallerVersion, "10.10", 5) && - strncmp(InstallerVersion, "10.11", 5) && - strncmp(InstallerVersion, "10.12", 5) && - strncmp(InstallerVersion, "10.13", 5) && - strncmp(InstallerVersion, "10.14", 5) && - strncmp(InstallerVersion, "10.15", 5) && - strncmp(InstallerVersion, "10.16", 5) && - strncmp(InstallerVersion, "11.", 3) && - strncmp(InstallerVersion, "12.", 3) && - strncmp(InstallerVersion, "13.", 3) && - strncmp(InstallerVersion, "14.", 3) && - strncmp(InstallerVersion, "15.", 3) - ) { - InstallerVersion = NULL; // flag known version was not found - } - if (InstallerVersion != NULL) { // known version was found in image - macOSVersion = InstallerVersion; - DBG("Corrected OSVersion: %s\n", macOSVersion.asString().c_str()); - } - } - } - BuildVersion.setEmpty(); - } - - if (BuildVersion.notEmpty()) { - DBG(" %s (%s)\n", macOSVersion.asString().c_str(), BuildVersion.c_str()); - } else { - DBG(" %s\n", macOSVersion.asString().c_str()); - } - - if ( macOSVersion >= MacOsVersion("10.11"_XS8) ) { - if (OSFLAG_ISSET(Flags, OSFLAG_NOSIP)) { - gSettings.RtVariables.CsrActiveConfig = (UINT32)0xBEF; - gSettings.RtVariables.BooterConfig = 0x28; - } - } - - FilterKextPatches(); - FilterKernelPatches(); - FilterBootPatches(); - if (LoadedImage && !BooterPatch((UINT8*)LoadedImage->ImageBase, LoadedImage->ImageSize)) { - DBG("Will not patch boot.efi\n"); - } - gConf.ReloadSmbios(OSName); - DelegateKernelPatches(); - - // Set boot argument for kernel if no caches, this should force kernel loading - if ( OSFLAG_ISSET(Flags, OSFLAG_NOCACHES) && !LoadOptions.containsStartWithIC("Kernel=") ) { - XString8 KernelLocation; - - if ( macOSVersion.notEmpty() && macOSVersion <= MacOsVersion("10.9"_XS8) ) { - KernelLocation.S8Printf("\"Kernel=/mach_kernel\""); - } else { - // used for 10.10, 10.11, and new version. Jief : also for unknown version. - KernelLocation.S8Printf("\"Kernel=/System/Library/Kernels/kernel\""); - } - LoadOptions.AddID(KernelLocation); - } - - // first patchACPI and find PCIROOT and RTC - // but before ACPI patch we need smbios patch - CheckEmptyFB(); - - - SmbiosFillPatchingValues(GlobalConfig.SetTable132, GlobalConfig.EnabledCores, g_SmbiosDiscoveredSettings.RamSlotCount, gConf.SlotDeviceArray, gSettings, gCPUStructure, &g_SmbiosInjectedSettings); - PatchSmbios(g_SmbiosInjectedSettings); - -#ifdef USE_OC_SECTION_Acpi - // If we use the ACPI section form config-oc.plist, let's also delegate the acpi patching to OC -#else - PatchACPI(Volume, macOSVersion); -#endif - -#ifdef JIEF_DEBUG - //SaveOemTables(); -#endif -// - - DbgHeader("RestSetup macOS"); - SetDevices(this); - SetVariablesForOSX(this); -// Jief : if we want to use our FixUSBOwnership, we need our OnExitBootServices - EventsInitialize(this); - FinalizeSmbios(g_SmbiosInjectedSettings); - - SetCPUProperties(); //very special procedure - - if (OSFLAG_ISSET(Flags, OSFLAG_HIBERNATED)) { - DoHibernateWake = PrepareHibernation(Volume); - } - SetupDataForOSX(DoHibernateWake); - - - if ( gDriversFlags.AptioFixLoaded && - !DoHibernateWake && - !LoadOptions.containsStartWithIC("slide=") ) { - // Add slide=0 argument for ML+ if not present - LoadOptions.AddID("slide=0"_XS8); - } - - - /** - * syscl - append "-xcpm" argument conditionally if set KernelXCPM on Intel Haswell+ low-end CPUs - */ - if (KernelAndKextPatches.KPKernelXCPM && - gCPUStructure.Vendor == CPU_VENDOR_INTEL && gCPUStructure.Model >= CPU_MODEL_HASWELL && - (gCPUStructure.BrandString.contains("Celeron") || gCPUStructure.BrandString.contains("Pentium")) && - macOSVersion >= MacOsVersion("10.8.5"_XS8) && macOSVersion < MacOsVersion("10.12"_XS8) && - (!LoadOptions.containsIC("-xcpm"))) { - // add "-xcpm" argv if not present on Haswell+ Celeron/Pentium - LoadOptions.AddID("-xcpm"_XS8); - } - - // add -xcpm on Ivy Bridge if set KernelXCPM and system version is 10.8.5 - 10.11.x - if (KernelAndKextPatches.KPKernelXCPM && - gCPUStructure.Model == CPU_MODEL_IVY_BRIDGE && - macOSVersion >= MacOsVersion("10.8.5"_XS8) && macOSVersion < MacOsVersion("10.12"_XS8) && - (!LoadOptions.containsIC("-xcpm"))) { - // add "-xcpm" argv if not present on Ivy Bridge - LoadOptions.AddID("-xcpm"_XS8); - } - - if (AudioIo) { - AudioIo->StopPlayback(AudioIo); -// CheckSyncSound(true); - EFI_DRIVER_BINDING_PROTOCOL *DriverBinding = NULL; - Status = gBS->HandleProtocol(AudioDriverHandle, &gEfiDriverBindingProtocolGuid, (void **)&DriverBinding); - if (DriverBinding) { - DriverBinding->Stop(DriverBinding, AudioDriverHandle, 0, NULL); - } - } - - - // blocking boot.efi output if -v is not specified - // note: this blocks output even if -v is specified in - // /Library/Preferences/SystemConfiguration/com.apple.Boot.plist - // which is wrong - // apianti - only block console output if using graphics - // but don't block custom boot logo - if (LoadOptions.containsIC("-v")) { - Flags = OSFLAG_UNSET(Flags, OSFLAG_USEGRAPHICS); - } - } - else if (OSTYPE_IS_WINDOWS(LoaderType)) { - - if (AudioIo) { - AudioIo->StopPlayback(AudioIo); - } - - DBG("Closing events for Windows\n"); - gBS->CloseEvent (OnReadyToBootEvent); - gBS->CloseEvent (ExitBootServiceEvent); - gBS->CloseEvent (mSimpleFileSystemChangeEvent); - - - if (gEmuVariableControl != NULL) { - gEmuVariableControl->UninstallEmulation(gEmuVariableControl); - } - - PatchACPI_OtherOS(L"Windows", false); - - } - else if (OSTYPE_IS_LINUX(LoaderType) || (LoaderType == OSTYPE_LINEFI)) { - - DBG("Closing events for Linux\n"); - gBS->CloseEvent (OnReadyToBootEvent); - gBS->CloseEvent (ExitBootServiceEvent); - gBS->CloseEvent (mSimpleFileSystemChangeEvent); - - if (gEmuVariableControl != NULL) { - gEmuVariableControl->UninstallEmulation(gEmuVariableControl); - } - - PatchACPI_OtherOS(L"Linux", false); - } - - if (gSettings.Boot.LastBootedVolume) { - if ( APFSTargetUUID.notNull() ) { - // Jief : we need to LoaderPath. If not, GUI can't know which target was selected. - SetStartupDiskVolume(Volume, LoaderPath); - }else{ - // Jief : I'm not sure why NullXStringW was given if LoaderType == OSTYPE_OSX. - // Let's do it like it was before when not in case of APFSTargetUUID - SetStartupDiskVolume(Volume, LoaderType == OSTYPE_OSX ? NullXStringW : LoaderPath); - } - } else if (gSettings.Boot.DefaultVolume.notEmpty()) { - // DefaultVolume specified in Config.plist or in Boot Option - // we'll remove macOS Startup Disk vars which may be present if it is used - // to reboot into another volume - RemoveStartupDiskVolume(); - } -/* - { - // UINT32 machineSignature = 0; - EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtPointer = NULL; - EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs = NULL; - - // DBG("---dump hibernations data---\n"); - FadtPointer = GetFadt(); - if (FadtPointer != NULL) { - Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*)(UINTN)(FadtPointer->FirmwareCtrl); - - DBG(" Firmware wake address=%08lx\n", Facs->FirmwareWakingVector); - DBG(" Firmware wake 64 addr=%16llx\n", Facs->XFirmwareWakingVector); - DBG(" Hardware signature =%08lx\n", Facs->HardwareSignature); - DBG(" GlobalLock =%08lx\n", Facs->GlobalLock); - DBG(" Flags =%08lx\n", Facs->Flags); - DBG(" HS at offset 0x%08X\n", OFFSET_OF(EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE, HardwareSignature)); - // machineSignature = Facs->HardwareSignature; - } - } -*/ - - BeginExternalScreen(OSFLAG_ISSET(Flags, OSFLAG_USEGRAPHICS)/*, L"Booting OS"*/); - - if (!OSTYPE_IS_WINDOWS(LoaderType) && !OSTYPE_IS_LINUX(LoaderType)) { - if (OSFLAG_ISSET(Flags, OSFLAG_USEGRAPHICS)) { - // save orig OutputString and replace it with - // null implementation - ConOutOutputString = gST->ConOut->OutputString; - gST->ConOut->OutputString = NullConOutOutputString; - } - - // Initialize the boot screen - if (EFI_ERROR(Status = InitBootScreen(this))) { - if (Status != EFI_ABORTED) DBG("Failed to initialize custom boot screen: %s!\n", efiStrError(Status)); - } - else if (EFI_ERROR(Status = LockBootScreen())) { - DBG("Failed to lock custom boot screen: %s!\n", efiStrError(Status)); - } - } // !OSTYPE_IS_WINDOWS - - if (OSTYPE_IS_OSX(LoaderType) || - OSTYPE_IS_OSX_RECOVERY(LoaderType) || - OSTYPE_IS_OSX_INSTALLER(LoaderType)) { - - if (DoHibernateWake) { - DBG("Closing events for wake\n"); - gBS->CloseEvent (OnReadyToBootEvent); -// gBS->CloseEvent (ExitBootServiceEvent); // Jief : we don't need that anymore, if we continue to use OC onExtBootService event - gBS->CloseEvent (mSimpleFileSystemChangeEvent); - - // When doing hibernate wake, save to DataHub only up to initial size of log - SavePreBootLog = false; - } else { - // delete boot-switch-vars if exists - Status = gRT->SetVariable(L"boot-switch-vars", gEfiAppleBootGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - 0, NULL); - DeleteNvramVariable(L"IOHibernateRTCVariables", gEfiAppleBootGuid); - DeleteNvramVariable(L"boot-image", gEfiAppleBootGuid); - - } - SetupBooterLog(!DoHibernateWake); - - XStringW LoadOptionsAsXStringW = SWPrintf("%ls %s ", Basename(LoaderPath.wc_str()), LoadOptions.ConcatAll(" "_XS8).c_str()); - LoadedImage->LoadOptions = (void*)LoadOptionsAsXStringW.wc_str(); - LoadedImage->LoadOptionsSize = (UINT32)LoadOptionsAsXStringW.sizeInBytesIncludingTerminator(); - - DBG("Kernel quirks\n"); - DBG("ACPCL %d AXCL %d AXEM %d AXFB %d CSG %d DIM %d DLJ %d DRC %d DPM %d EBTFF %d EDI %d FAI %d IPBS %d LKP %d PNKD %d PTKP %d TPD %d XPL %d PCC %d\n", - mOpenCoreConfiguration.Kernel.Quirks.AppleCpuPmCfgLock, - mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmCfgLock, - mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmExtraMsrs, - mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmForceBoost, - mOpenCoreConfiguration.Kernel.Quirks.CustomSmbiosGuid, - mOpenCoreConfiguration.Kernel.Quirks.DisableIoMapper, - mOpenCoreConfiguration.Kernel.Quirks.DisableLinkeditJettison, - mOpenCoreConfiguration.Kernel.Quirks.DisableRtcChecksum, - mOpenCoreConfiguration.Kernel.Emulate.DummyPowerManagement, - mOpenCoreConfiguration.Kernel.Quirks.ExtendBTFeatureFlags, - mOpenCoreConfiguration.Kernel.Quirks.ExternalDiskIcons, - mOpenCoreConfiguration.Kernel.Quirks.IncreasePciBarSize, - mOpenCoreConfiguration.Kernel.Quirks.ForceAquantiaEthernet, - mOpenCoreConfiguration.Kernel.Quirks.LapicKernelPanic, - mOpenCoreConfiguration.Kernel.Quirks.PanicNoKextDump, - mOpenCoreConfiguration.Kernel.Quirks.PowerTimeoutKernelPanic, - mOpenCoreConfiguration.Kernel.Quirks.ThirdPartyDrives, - mOpenCoreConfiguration.Kernel.Quirks.XhciPortLimit, - mOpenCoreConfiguration.Kernel.Quirks.ProvideCurrentCpuInfo); - - - DBG("Closing log\n"); - if (SavePreBootLog) { - Status = SaveBooterLog(&self.getCloverDir(), PREBOOT_LOG); - } - AllocSmallBlocks(); // shrink memory map; - -#ifdef JIEF_DEBUG - PrintMemoryMap(); - displayFreeMemory("Just before launching image"_XS8); -#endif - Status = gBS->StartImage (ImageHandle, 0, NULL); // point to OcStartImage from OC - - if ( EFI_ERROR(Status) ) { - // Ideally, we would return to the menu, displaying an error message - // Truth is that we get a black screen before seeing the menu again. - // If I remember well, we get a freeze in BdsLibConnectAllEfi() - // I'm guessing there is a lot of patching done for booting. - // To be able to go back to the menu and boot another thing, - // we must undo all the patching... - // Here is a quick, not as bad as a black screen solution : a text message and a reboot ! - DBG("StartImage failed : %s\n", efiStrError(Status)); - SaveBooterLog(&self.getCloverDir(), PREBOOT_LOG); - egSetGraphicsModeEnabled(false); - printf("StartImage failed : %s\n", efiStrError(Status)); - PauseForKey("Reboot needed."_XS8); - // Attempt warm reboot - gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); - // Warm reboot may not be supported attempt cold reboot - gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); - // Terminate the screen and just exit - - return; - } - -}else{ - - StartEFILoadedImage(ImageHandle, LoadOptions, NullXStringW, LoaderPath.basename(), NULL); -} - // Unlock boot screen - if (EFI_ERROR(Status = UnlockBootScreen())) { - DBG("Failed to unlock custom boot screen: %s!\n", efiStrError(Status)); - } - if (OSFLAG_ISSET(Flags, OSFLAG_USEGRAPHICS)) { - // return back orig OutputString - gST->ConOut->OutputString = ConOutOutputString; - } - - - FinishExternalScreen(); - -} - - -void LEGACY_ENTRY::StartLegacy() -{ - EFI_STATUS Status = EFI_UNSUPPORTED; - - // Unload EmuVariable before booting legacy. - // This is not needed in most cases, but it seems to interfere with legacy OS - // booted on some UEFI bioses, such as Phoenix UEFI 2.0 - if (gEmuVariableControl != NULL) { - gEmuVariableControl->UninstallEmulation(gEmuVariableControl); - } - - if (gSettings.Boot.LastBootedVolume) { - SetStartupDiskVolume(Volume, NullXStringW); - } else if (gSettings.Boot.DefaultVolume.notEmpty()) { - // DefaultVolume specified in Config.plist: - // we'll remove macOS Startup Disk vars which may be present if it is used - // to reboot into another volume - RemoveStartupDiskVolume(); - } - - - egClearScreen(&MenuBackgroundPixel); - BeginExternalScreen(true/*, L"Booting Legacy OS"*/); - XImage BootLogoX; - BootLogoX.LoadXImage(&ThemeX->getThemeDir(), Volume->LegacyOS.IconName); - BootLogoX.Draw((UGAWidth - BootLogoX.GetWidth()) >> 1, - (UGAHeight - BootLogoX.GetHeight()) >> 1); - - //try my LegacyBoot - switch (Volume->BootType) { - case BOOTING_BY_CD: - Status = bootElTorito(Volume); - break; - case BOOTING_BY_MBR: - Status = bootMBR(Volume); - break; - case BOOTING_BY_PBR: - if (gSettings.Boot.LegacyBoot == "LegacyBiosDefault"_XS8) { - Status = bootLegacyBiosDefault(gSettings.Boot.LegacyBiosDefaultEntry); - } else if (gSettings.Boot.LegacyBoot == "PBRtest"_XS8) { - Status = bootPBRtest(Volume); - } else if (gSettings.Boot.LegacyBoot == "PBRsata"_XS8) { - Status = bootPBR(Volume, true); - } else { - // default - Status = bootPBR(Volume, false); - } - break; - default: - break; - } - CheckError(Status, L"while LegacyBoot"); - - FinishExternalScreen(); -} - -// -// pre-boot tool functions -// - -void REFIT_MENU_ENTRY_LOADER_TOOL::StartTool() -{ - DBG("Start Tool: %ls\n", LoaderPath.wc_str()); - egClearScreen(&MenuBackgroundPixel); - // assumes "Start " as assigned below - BeginExternalScreen(OSFLAG_ISSET(Flags, OSFLAG_USEGRAPHICS)/*, &Entry->Title[6]*/); // Shouldn't we check that length of Title is at least 6 ? - StartEFIImage(DevicePath, LoadOptions, NullXStringW, LoaderPath.basename(), NULL, NULL); - FinishExternalScreen(); -} - -// -// pre-boot driver functions -// - -static void ScanDriverDir(IN CONST CHAR16 *Path, OUT EFI_HANDLE **DriversToConnect, OUT UINTN *DriversToConnectNum) -{ - EFI_STATUS Status; - REFIT_DIR_ITER DirIter; - EFI_FILE_INFO *DirEntry; - EFI_HANDLE DriverHandle; - EFI_DRIVER_BINDING_PROTOCOL *DriverBinding; - UINTN DriversArrSize; - UINTN DriversArrNum; - EFI_HANDLE *DriversArr; - XBool Skip; - UINT8 AptioBlessed; - STATIC CHAR16 CONST * CONST AptioNames[] = { - L"AptioMemoryFix", - L"AptioFix3Drv", - L"AptioFix2Drv", - L"AptioFixDrv", - L"LowMemFix" - }; - STATIC UINT8 CONST AptioIndices[] = { - OFFSET_OF(DRIVERS_FLAGS, AptioMemFixLoaded), - OFFSET_OF(DRIVERS_FLAGS, AptioFix3Loaded), - OFFSET_OF(DRIVERS_FLAGS, AptioFix2Loaded), - OFFSET_OF(DRIVERS_FLAGS, AptioFixLoaded), - OFFSET_OF(DRIVERS_FLAGS, MemFixLoaded) - }; - - DriversArrSize = 0; - DriversArrNum = 0; - DriversArr = NULL; - // OpenRuntimeEfiName.setEmpty(); - -//only one driver with highest priority will obtain status "Loaded" - DirIterOpen(&self.getCloverDir(), Path, &DirIter); -#define BOOLEAN_AT_INDEX(k) (*(XBool*)((UINTN)&gDriversFlags + AptioIndices[(k)])) - for (size_t i = 0; i != ARRAY_SIZE(AptioIndices); ++i) - BOOLEAN_AT_INDEX(i) = false; - AptioBlessed = (UINT8) ARRAY_SIZE(AptioNames); - while (DirIterNext(&DirIter, 2, L"*.efi", &DirEntry)) { - size_t i; - for (i = 0; i != ARRAY_SIZE(AptioNames); ++i) - if (StrStr(DirEntry->FileName, AptioNames[i]) != NULL) - break; - if (((UINT8) i) >= AptioBlessed) - continue; - AptioBlessed = (UINT8) i; - if (!i) - break; - } - DirIterClose(&DirIter); - - // look through contents of the directory - DirIterOpen(&self.getCloverDir(), Path, &DirIter); - while (DirIterNext(&DirIter, 2, L"*.efi", &DirEntry)) { - Skip = (DirEntry->FileName[0] == L'.'); - for (size_t i=0; i<gSettings.DisabledDriverArray.size(); i++) { - if (StrStr(DirEntry->FileName, gSettings.DisabledDriverArray[i].wc_str()) != NULL) { - Skip = true; // skip this - break; - } - } - if (Skip) { - continue; - } - if ( LStringW(DirEntry->FileName).startWith("._") ) { - continue; - } - if ( LStringW(DirEntry->FileName).containsIC("OcQuirks") ) { - continue; - } - if ( LStringW(DirEntry->FileName).containsIC("AptioMemoryFix") ) { - continue; - } - - if ( LStringW(DirEntry->FileName).containsIC("OpenRuntime") ) { - if (!OpenRuntimeEfiName.isEmpty()) { - DBG(" - OpenRuntime already detected\n"); - continue; - } - if ( LStringW(DirEntry->FileName).isEqualIC("OpenRuntime-v12.efi") && LString8(OPEN_CORE_VERSION).isEqual("0.7.5") ) { - OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); - DBG(" - OpenRuntime-v12 for 075 taken from %ls\n", getDriversPath().wc_str()); - }else - if ( LStringW(DirEntry->FileName).isEqualIC("OpenRuntime-v12.efi") && LString8(OPEN_CORE_VERSION).isEqual("0.7.3") ) { - OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); - DBG(" - OpenRuntime-v12 for 073 taken from %ls\n", getDriversPath().wc_str()); - }else - if ( LStringW(DirEntry->FileName).isEqualIC("OpenRuntime-v11.efi") && LString8(OPEN_CORE_VERSION).isEqual("0.6.5") ) { - OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); - DBG(" - OpenRuntime-v11 for 065 taken from %ls\n", getDriversPath().wc_str()); - }else - if ( LStringW(DirEntry->FileName).isEqualIC("OpenRuntime-v11.efi") && LString8(OPEN_CORE_VERSION).isEqual("0.6.1") ) { - OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); - DBG(" - OpenRuntime-v11 for 061 taken from %ls\n", getDriversPath().wc_str()); - }else - if ( OpenRuntimeEfiName.isEmpty() ) { - OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); - } - continue; - } - { - size_t i; - // either AptioMem, AptioFix* or LowMemFix exclusively - for (i = 0; i != ARRAY_SIZE(AptioNames); ++i) - if (StrStr(DirEntry->FileName, AptioNames[i]) != NULL) - break; - if (i != ARRAY_SIZE(AptioNames)) { - if (((UINT8) i) != AptioBlessed) - continue; - if (AptioBlessed < (UINT8) ARRAY_SIZE(AptioIndices)) - BOOLEAN_AT_INDEX(AptioBlessed) = true; - AptioBlessed = (UINT8) ARRAY_SIZE(AptioNames); - } - } -#undef BOOLEAN_AT_INDEX - - XStringW FileName = SWPrintf("%ls\\%ls\\%ls", self.getCloverDirFullPath().wc_str(), Path, DirEntry->FileName); - Status = StartEFIImage(apd<EFI_DEVICE_PATH_PROTOCOL*>(FileDevicePath(self.getSelfLoadedImage().DeviceHandle, FileName)), NullXString8Array, LStringW(DirEntry->FileName), XStringW().takeValueFrom(DirEntry->FileName), NULL, &DriverHandle); - if (EFI_ERROR(Status)) { - continue; - } - if ( FileName.containsIC("AudioDxe") ) { - AudioDriverHandle = DriverHandle; - } - if ( FileName.containsIC("EmuVariable") ) { - gDriversFlags.EmuVariableLoaded = true; - } else if ( FileName.containsIC("Video") ) { - gDriversFlags.VideoLoaded = true; - } else if ( FileName.containsIC("Partition") ) { - gDriversFlags.PartitionLoaded = true; - } else if ( FileName.containsIC("HFS") ) { - gDriversFlags.HFSLoaded = true; - } else if ( FileName.containsIC("apfs") ) { - gDriversFlags.APFSLoaded = true; - } - if (DriverHandle != NULL && DriversToConnectNum != NULL && DriversToConnect != NULL) { - // driver loaded - check for EFI_DRIVER_BINDING_PROTOCOL - Status = gBS->HandleProtocol(DriverHandle, &gEfiDriverBindingProtocolGuid, (void **) &DriverBinding); - if (!EFI_ERROR(Status) && DriverBinding != NULL) { - DBG(" - driver needs connecting\n"); - // standard UEFI driver - we would reconnect after loading - add to array - MemoryStopRecord msr; // DriversArr won't be deallocated because it's passed to RegisterDriversToHighestPriority that keeps it global. - if (DriversArrSize == 0) { - // new array - DriversArrSize = 16; - DriversArr = (__typeof__(DriversArr))AllocateZeroPool(sizeof(EFI_HANDLE) * DriversArrSize); - } else if (DriversArrNum + 1 == DriversArrSize) { - // extend array - DriversArr = (__typeof__(DriversArr))ReallocatePool(DriversArrSize, DriversArrSize + 16, DriversArr); - DriversArrSize += 16; - } - DriversArr[DriversArrNum] = DriverHandle; - // DBG(" driver %ls included with Binding=%X\n", FileName, DriverBinding); - DriversArrNum++; - // we'll make array terminated - DriversArr[DriversArrNum] = NULL; - } - } - } - Status = DirIterClose(&DirIter); - if (Status != EFI_NOT_FOUND) { - CheckError(Status, SWPrintf( "while scanning the %ls directory", Path).wc_str()); - } - - if (DriversToConnectNum != NULL && DriversToConnect != NULL) { - *DriversToConnectNum = DriversArrNum; - *DriversToConnect = DriversArr; - } -} - - -/** - * Some UEFI's (like HPQ EFI from HP notebooks) have DiskIo protocols - * opened BY_DRIVER (by Partition driver in HP case) even when no file system - * is produced from this DiskIo. This then blocks our FS drivers from connecting - * and producing file systems. - * To fix it: we will disconnect drivers that connected to DiskIo BY_DRIVER - * if this is partition volume and if those drivers did not produce file system. - */ -void DisconnectInvalidDiskIoChildDrivers(void) -{ - EFI_STATUS Status; - UINTN HandleCount = 0; - UINTN Index; - UINTN OpenInfoIndex; - EFI_HANDLE *Handles = NULL; - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs; - EFI_BLOCK_IO_PROTOCOL *BlockIo; - EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo; - UINTN OpenInfoCount; - XBool Found; - - DBG("Searching for invalid DiskIo BY_DRIVER connects:"); - - // - // Get all DiskIo handles - // - Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDiskIoProtocolGuid, NULL, &HandleCount, &Handles); - if (EFI_ERROR(Status) || HandleCount == 0) { - DBG(" no DiskIo handles\n"); - return; - } - - // - // Check every DiskIo handle - // - Found = false; - for (Index = 0; Index < HandleCount; Index++) { - //DBG("\n"); - //DBG(" - Handle %p:", Handles[Index]); - // - // If this is not partition - skip it. - // This is then whole disk and DiskIo - // should be opened here BY_DRIVER by Partition driver - // to produce partition volumes. - // - Status = gBS->HandleProtocol ( - Handles[Index], - &gEfiBlockIoProtocolGuid, - (void **) &BlockIo - ); - if (EFI_ERROR(Status)) { - //DBG(" BlockIo: %s - skipping\n", efiStrError(Status)); - continue; - } - if (BlockIo->Media == NULL) { - //DBG(" BlockIo: no media - skipping\n"); - continue; - - } - if (!BlockIo->Media->LogicalPartition) { - //DBG(" BlockIo: whole disk - skipping\n"); - continue; - - } - //DBG(" BlockIo: partition"); - - // - // If SimpleFileSystem is already produced - skip it, this is ok - // - Status = gBS->HandleProtocol ( - Handles[Index], - &gEfiSimpleFileSystemProtocolGuid, - (void **) &Fs - ); - if (Status == EFI_SUCCESS) { - //DBG(" FS: ok - skipping\n"); - continue; - } - //DBG(" FS: no"); - - // - // If no SimpleFileSystem on this handle but DiskIo is opened BY_DRIVER - // then disconnect this connection - // - Status = gBS->OpenProtocolInformation ( - Handles[Index], - &gEfiDiskIoProtocolGuid, - &OpenInfo, - &OpenInfoCount - ); - if (EFI_ERROR(Status)) { - //DBG(" OpenInfo: no - skipping\n"); - continue; - } - //DBG(" OpenInfo: %d", OpenInfoCount); - for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) { - if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) { - if (!Found) { - DBG("\n"); - } - Found = true; - Status = gBS->DisconnectController (Handles[Index], OpenInfo[OpenInfoIndex].AgentHandle, NULL); - //DBG(" BY_DRIVER Agent: %p, Disconnect: %s", OpenInfo[OpenInfoIndex].AgentHandle, efiStrError(Status)); - DBG(" - Handle %llx with DiskIo, is Partition, no Fs, BY_DRIVER Agent: %llx, Disconnect: %s\n", (uintptr_t)Handles[Index], (uintptr_t)(OpenInfo[OpenInfoIndex].AgentHandle), efiStrError(Status)); - } - } - gBS->FreePool(OpenInfo); // use gBS->FreePool instead of FreePool to avoid message from MemoryTracker - } - gBS->FreePool(Handles); // use gBS->FreePool instead of FreePool to avoid message from MemoryTracker - - if (!Found) { - DBG(" not found, all ok\n"); - } -} - -void DisconnectSomeDevices(void) -{ - EFI_STATUS Status; - UINTN HandleCount; - UINTN Index, Index2; - EFI_HANDLE *Handles ; - EFI_HANDLE *ControllerHandles; - UINTN ControllerHandleCount; - EFI_BLOCK_IO_PROTOCOL *BlockIo = NULL; -// EFI_DISK_IO_PROTOCOL *DiskIo = NULL; - EFI_PCI_IO_PROTOCOL *PciIo = NULL; -// EFI_FILE_PROTOCOL *RootFP = NULL; -// EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *VolumeFS = NULL; - PCI_TYPE00 Pci; - CHAR16 *DriverName = NULL; - EFI_COMPONENT_NAME_PROTOCOL *CompName = NULL; - - if (gDriversFlags.PartitionLoaded) { - DBG("Partition driver loaded: "); - // get all BlockIo handles - HandleCount = 0; - Handles = NULL; - - Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &HandleCount, &Handles); - if (Status == EFI_SUCCESS) { - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol(Handles[Index], &gEfiBlockIoProtocolGuid, (void **) &BlockIo); - if (EFI_ERROR(Status)) { - continue; - } - if (BlockIo->Media->BlockSize == 2048) { - // disconnect CD controller - Status = gBS->DisconnectController(Handles[Index], NULL, NULL); - DBG("CD disconnect %s", efiStrError(Status)); - } - } -/* for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->DisconnectController(Handles[Index], NULL, NULL); - } */ - FreePool(Handles); - } - DBG("\n"); - } - - if ((gDriversFlags.HFSLoaded) || (gDriversFlags.APFSLoaded)) { - if (gDriversFlags.HFSLoaded) { - DBG("HFS+ driver loaded\n"); - } - if (gDriversFlags.APFSLoaded) { - DBG("APFS driver loaded\n"); - } - - // get all FileSystem handles - ControllerHandleCount = 0; - ControllerHandles = NULL; - - Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &ControllerHandleCount, &ControllerHandles); - /* if (!EFI_ERROR(Status)) { - for (Index2 = 0; Index2 < ControllerHandleCount; Index2++) { - Status = gBS->DisconnectController(ControllerHandles[Index2], - NULL, NULL); - DBG("Driver [%d] disconnect %s\n", Index2, efiStrError(Status)); - } - } */ - - HandleCount = 0; - Handles = NULL; - - Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid, NULL, &HandleCount, &Handles); - if (!EFI_ERROR(Status)) { - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->OpenProtocol( - Handles[Index], - gEfiComponentNameProtocolGuid, - (void**)&CompName, - gImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL); - - if (EFI_ERROR(Status)) { -// DBG("CompName %s\n", efiStrError(Status)); - continue; - } - // 2021-05, Jief : PG7 had a crash. In some cases, CompName->GetDriverName == NULL. - if ( CompName->GetDriverName == NULL ) { - DBG("DisconnectSomeDevices: GetDriverName CompName=%lld, CompName->GetDriverName=NULL\n", uintptr_t(CompName)); - continue; - } - Status = CompName->GetDriverName(CompName, "eng", &DriverName); - if (EFI_ERROR(Status)) { - continue; - } - if ((StriStr(DriverName, L"HFS")) || (StriStr(DriverName, L"apfs"))) { - for (Index2 = 0; Index2 < ControllerHandleCount; Index2++) { - Status = gBS->DisconnectController(ControllerHandles[Index2], - Handles[Index], NULL); - //DBG("Disconnect [%ls] from %llX: %s\n", DriverName, uintptr_t(ControllerHandles[Index2]), efiStrError(Status)); - } - } - } - gBS->FreePool(Handles); // use gBS->FreePool instead of FreePool to avoid message from MemoryTracker - } -// DBG("\n"); - gBS->FreePool(ControllerHandles); // use gBS->FreePool instead of FreePool to avoid message from MemoryTracker - } - - - if (gDriversFlags.VideoLoaded) { - DBG("Video driver loaded: "); - // get all PciIo handles - HandleCount = 0; - Handles = NULL; - Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiPciIoProtocolGuid, NULL, &HandleCount, &Handles); - if (Status == EFI_SUCCESS) { - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol(Handles[Index], &gEfiPciIoProtocolGuid, (void **) &PciIo); - if (EFI_ERROR(Status)) { - continue; - } - Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0, sizeof (Pci) / sizeof (UINT32), &Pci); - if (!EFI_ERROR(Status)) { - if(IS_PCI_VGA(&Pci) == true) { - // disconnect VGA - Status = gBS->DisconnectController(Handles[Index], NULL, NULL); - DBG("disconnect %s", efiStrError(Status)); - } - } - } - FreePool(Handles); - } - DBG("\n"); - } - - if (!gFirmwareClover) { - DisconnectInvalidDiskIoChildDrivers(); - } -} - - -void PatchVideoBios(UINT8 *Edid) -{ - - if ( gSettings.Graphics.PatchVBiosBytes.notEmpty() ) { - VideoBiosPatchBytes(gSettings.Graphics.PatchVBiosBytes.getVBIOS_PATCH_BYTES(), gSettings.Graphics.PatchVBiosBytes.getVBIOS_PATCH_BYTES_count()); - } - - if (gSettings.Graphics.PatchVBios) { - VideoBiosPatchNativeFromEdid(Edid); - } -} - - -static void LoadDrivers(void) -{ - EFI_STATUS Status; - EFI_HANDLE *DriversToConnect = NULL; - UINTN DriversToConnectNum = 0; - UINT8 *Edid; - UINTN VarSize = 0; - XBool VBiosPatchNeeded; - - DbgHeader("LoadDrivers"); - - // load drivers from /efi/drivers -#if defined(MDE_CPU_X64) - if (gFirmwareClover) { - if (FileExists(&self.getCloverDir(), L"drivers\\BIOS")) { - ScanDriverDir(L"drivers\\BIOS", &DriversToConnect, &DriversToConnectNum); - } else { - ScanDriverDir(L"drivers64", &DriversToConnect, &DriversToConnectNum); - } - } else { - OpenRuntimeEfiName.setEmpty(); - if (FileExists(&self.getCloverDir(), L"drivers\\5142")) { - ScanDriverDir(L"drivers\\5142", &DriversToConnect, &DriversToConnectNum); - } - if (FileExists(&self.getCloverDir(), L"drivers\\UEFI")) { - ScanDriverDir(L"drivers\\UEFI", &DriversToConnect, &DriversToConnectNum); - } else { - ScanDriverDir(L"drivers64UEFI", &DriversToConnect, &DriversToConnectNum); - } - } -#else - ScanDriverDir(L"drivers32", &DriversToConnect, &DriversToConnectNum); -#endif - // DriversToConnect is allocated by ScanDriverDir, but DO NOT free it. RegisterDriversToHighestPriority will store it in the global var mPriorityDrivers. - - VBiosPatchNeeded = gSettings.Graphics.PatchVBios || gSettings.Graphics.PatchVBiosBytes.getVBIOS_PATCH_BYTES_count() > 0; - if (VBiosPatchNeeded) { - // check if it is already done in CloverEFI BiosVideo - Status = gRT->GetVariable ( - L"CloverVBiosPatchDone", - gEfiGlobalVariableGuid, - NULL, - &VarSize, - NULL - ); - if (Status == EFI_BUFFER_TOO_SMALL) { - // var exists - it's done - let's not do it again - VBiosPatchNeeded = false; - } - } - - if ( (gSettings.Graphics.EDID.CustomEDID.notEmpty() && gFirmwareClover) || (VBiosPatchNeeded && !gDriversFlags.VideoLoaded)) { - // we have video bios patch - force video driver reconnect - DBG("Video bios patch requested or CustomEDID - forcing video reconnect\n"); - gDriversFlags.VideoLoaded = true; - DriversToConnectNum++; - } - - UninitRefitLib(); - if (DriversToConnectNum > 0) { - DBG("%llu drivers needs connecting ...\n", DriversToConnectNum); - // note: our platform driver protocol - // will use DriversToConnect - do not release it - RegisterDriversToHighestPriority(DriversToConnect); - if (VBiosPatchNeeded) { - if (gSettings.Graphics.EDID.CustomEDID.notEmpty()) { - Edid = gSettings.Graphics.EDID.CustomEDID.data(); - } else { - Edid = getCurrentEdid(); - } - DisconnectSomeDevices(); - PatchVideoBios(Edid); - if (gSettings.Graphics.EDID.CustomEDID.isEmpty()) { - FreePool(Edid); - } - } else { - DisconnectSomeDevices(); - } - BdsLibConnectAllDriversToAllControllers(); - - // Boot speedup: remove temporary "BiosVideoBlockSwitchMode" RT var - // to unlock mode switching in CsmVideo - gRT->SetVariable(L"BiosVideoBlockSwitchMode", gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); - }else{ - BdsLibConnectAllEfi(); // jief : without any driver loaded, i couldn't see my CD, unless I call BdsLibConnectAllEfi - } - ReinitRefitLib(); + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } - -INTN FindDefaultEntry(void) +REFIT_ABSTRACT_MENU_ENTRY* SubMenuSmbios() { - INTN Index = -1; - REFIT_VOLUME *Volume; - XBool SearchForLoader; - -// DBG("FindDefaultEntry ...\n"); - //DbgHeader("FindDefaultEntry"); - - if ( gSettings.Boot.BootFirstAvailable ) return 0; - - // - // try to detect volume set by Startup Disk or previous Clover selection - // with broken nvram this requires emulation to be installed. - // enable emulation to determine efi-boot-device-data - if (gEmuVariableControl != NULL) { - gEmuVariableControl->InstallEmulation(gEmuVariableControl); - } - - Index = FindStartupDiskVolume(&MainMenu); + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_SMBIOS, "SMBIOS settings->"_XS8); + + SubScreen->AddMenuInfoLine_f("%s", gCPUStructure.BrandString.c_str()); + SubScreen->AddMenuInfoLine_f("%s", GlobalConfig.OEMProductFromSmbios.c_str()); + SubScreen->AddMenuInfoLine_f("with board %s", GlobalConfig.OEMBoardFromSmbios.c_str()); + + SubScreen->AddMenuItemInput(78, "Product Name:", true); + SubScreen->AddMenuItemInput(79, "Product Version:", true); + SubScreen->AddMenuItemInput(80, "Product SN:", true); + SubScreen->AddMenuItemInput(131, "Fake CPUID:", true); + SubScreen->AddMenuItemInput(81, "Board ID:", true); + SubScreen->AddMenuItemInput(82, "Board SN:", true); + SubScreen->AddMenuItemInput(83, "Board Type:", true); + SubScreen->AddMenuItemInput(84, "Board Version:", true); + SubScreen->AddMenuItemInput(85, "Chassis Type:", true); + SubScreen->AddMenuItemInput(86, "ROM Version:", true); + SubScreen->AddMenuItemInput(87, "ROM Release Date:", true); + SubScreen->AddMenuItemInput(62, "FirmwareFeatures:", true); + SubScreen->AddMenuItemInput(63, "FirmwareFeaturesMask:", true); + SubScreen->AddMenuItemInput(125, "ExtendedFirmwareFeatures:", true); + SubScreen->AddMenuItemInput(126, "ExtendedFirmwareFeaturesMask:", true); + SubScreen->AddMenuItemInput(17, "PlatformFeature:", true); + SubScreen->AddMenuItemInput(117, "EFI Version:", true); + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; +} - if (Index >= 0) { - DBG("Boot redirected to Entry %lld. '%ls'\n", Index, MainMenu.Entries[Index].Title.s()); - // we got boot-device-data, no need to keep emulating anymore - if (gEmuVariableControl != NULL) { - gEmuVariableControl->UninstallEmulation(gEmuVariableControl); - } - return Index; - } - // - // if not found, then try DefaultVolume from config.plist - // if not null or empty, search volume that matches gSettings.Boot.DefaultVolume - // - if (gSettings.Boot.DefaultVolume.notEmpty()) { +REFIT_ABSTRACT_MENU_ENTRY* SubMenuChooseSmbios() +{ + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_MENU_SWITCH *InputBootArgs; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_CHOOSE_SMBIOS, NullXString8); + Entry->Title.SWPrintf("SMBIOS->"); + + SubScreen->AddMenuInfoLine_f("Select SMBIOS:"); + + for (UINTN i = 0; i < SmbiosList.size(); i++) { + InputBootArgs = new REFIT_MENU_SWITCH; + InputBootArgs->Title = SmbiosList[i]; + InputBootArgs->Row = i; + InputBootArgs->Item = &InputItems[65]; + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + } + SubScreen->AddMenuEntry(SubMenuSmbios(), true); + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; +} - // if not null or empty, also search for loader that matches gSettings.Boot.DefaultLoader - SearchForLoader = gSettings.Boot.DefaultLoader.notEmpty(); -/* - if (SearchForLoader) { - DBG("Searching for DefaultVolume '%ls', DefaultLoader '%ls' ...\n", gSettings.Boot.DefaultVolume, gSettings.Boot.DefaultLoader); - } else { - DBG("Searching for DefaultVolume '%ls' ...\n", gSettings.Boot.DefaultVolume); - } -*/ - for (Index = 0; Index < (INTN)MainMenu.Entries.size() && MainMenu.Entries[Index].getLOADER_ENTRY() && MainMenu.Entries[Index].getLOADER_ENTRY()->Row == 0 ; Index++) { - LOADER_ENTRY& Entry = *MainMenu.Entries[Index].getLOADER_ENTRY(); - if (!Entry.Volume) { - continue; - } +REFIT_ABSTRACT_MENU_ENTRY* SubMenuDsdtFix() +{ + REFIT_MENU_ITEM_OPTIONS *Entry; //, *SubEntry; + REFIT_MENU_SCREEN *SubScreen; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_DSDT, NullXString8); + + SubScreen->AddMenuCheck("Add DTGP", FIX_DTGP, 67); + SubScreen->AddMenuCheck("Fix Darwin as WinXP", FIX_WARNING, 67); + SubScreen->AddMenuCheck("Fix Darwin as Win7", FIX_DARWIN, 67); + SubScreen->AddMenuCheck("Fix shutdown", FIX_SHUTDOWN, 67); + SubScreen->AddMenuCheck("Add MCHC", FIX_MCHC, 67); + SubScreen->AddMenuCheck("Fix HPET", FIX_HPET, 67); + SubScreen->AddMenuCheck("Fake LPC", FIX_LPC, 67); + SubScreen->AddMenuCheck("Fix IPIC", FIX_IPIC, 67); + SubScreen->AddMenuCheck("Add SMBUS", FIX_SBUS, 67); + SubScreen->AddMenuCheck("Fix display", FIX_DISPLAY, 67); + SubScreen->AddMenuCheck("Fix IDE", FIX_IDE, 67); + SubScreen->AddMenuCheck("Fix SATA", FIX_SATA, 67); + SubScreen->AddMenuCheck("Fix Firewire", FIX_FIREWIRE, 67); + SubScreen->AddMenuCheck("Fix USB", FIX_USB, 67); + SubScreen->AddMenuCheck("Fix LAN", FIX_LAN, 67); + SubScreen->AddMenuCheck("Fix Airport", FIX_WIFI, 67); + SubScreen->AddMenuCheck("Fix sound", FIX_HDA, 67); + SubScreen->AddMenuCheck("Fix RTC", FIX_RTC, 67); + SubScreen->AddMenuCheck("Fix TMR", FIX_TMR, 67); + SubScreen->AddMenuCheck("Add IMEI", FIX_IMEI, 67); + SubScreen->AddMenuCheck("Fix IntelGFX", FIX_INTELGFX, 67); + SubScreen->AddMenuCheck("Fix _WAK", FIX_WAK, 67); + SubScreen->AddMenuCheck("Del unused", FIX_UNUSED, 67); + SubScreen->AddMenuCheck("Fix ADP1", FIX_ADP1, 67); + SubScreen->AddMenuCheck("Add PNLF", FIX_PNLF, 67); + SubScreen->AddMenuCheck("Fix S3D", FIX_S3D, 67); + SubScreen->AddMenuCheck("Rename ACST", FIX_ACST, 67); + SubScreen->AddMenuCheck("Add HDMI", FIX_HDMI, 67); + SubScreen->AddMenuCheck("Fix Regions", FIX_REGIONS, 67); + SubScreen->AddMenuCheck("Fix Mutex", FIX_MUTEX, 67); + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + ModifyTitles(Entry); + + return Entry; +} - Volume = Entry.Volume; - if ( (Volume->VolName.isEmpty() || Volume->VolName != gSettings.Boot.DefaultVolume) && - !Volume->DevicePathString.contains(gSettings.Boot.DefaultVolume) ) { - continue; - } +REFIT_ABSTRACT_MENU_ENTRY* SubMenuDSDTPatches() +{ + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_INPUT_DIALOG *InputBootArgs; - // we alreday know that Entry.isLoader - if (SearchForLoader && (/*Entry.Tag != TAG_LOADER ||*/ !Entry.LoaderPath.containsIC(gSettings.Boot.DefaultLoader))) { - continue; - } + size_t PatchDsdtNum = gSettings.ACPI.DSDT.DSDTPatchArray.size(); - DBG(" - found entry %lld. '%ls', Volume '%ls', DevicePath '%ls'\n", Index, Entry.Title.s(), Volume->VolName.wc_str(), Entry.DevicePathString.wc_str()); - // if first method failed and second succeeded - uninstall emulation - if (gEmuVariableControl != NULL) { - gEmuVariableControl->UninstallEmulation(gEmuVariableControl); - } - return Index; - } + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_DSDT_PATCHES, "Custom DSDT patches->"_XS8); + for (size_t Index = 0; Index < PatchDsdtNum; Index++) { + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf("%90s", gSettings.ACPI.DSDT.DSDTPatchArray[Index].PatchDsdtLabel.c_str()); + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &gSettings.ACPI.DSDT.DSDTPatchArray[Index].PatchDsdtMenuItem; + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); } - DBG("Default boot entry not found\n"); - // if both methods to determine default boot entry have failed - uninstall emulation before GUI - if (gEmuVariableControl != NULL) { - gEmuVariableControl->UninstallEmulation(gEmuVariableControl); - } - return -1; + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -void SetVariablesFromNvram() +REFIT_ABSTRACT_MENU_ENTRY* SubMenuDsdts() { - CHAR8 *tmpString; - UINTN Size = 0; - UINTN index = 0, index2, i; - CHAR8 *arg = NULL; - -// DbgHeader("SetVariablesFromNvram"); - - tmpString = (__typeof__(tmpString))GetNvramVariable(L"boot-args", gEfiAppleBootGuid, NULL, &Size); - if (tmpString && (Size <= 0x1000) && (Size > 0)) { - DBG("found boot-args in NVRAM:%s, size=%llu\n", tmpString, Size); - // use and forget old one -// DeleteNvramVariable(L"boot-args", &gEfiAppleBootGuid); - Size = AsciiStrLen(tmpString); // some EFI implementations include '\0' in Size, and others don't, so update Size to string length - arg = (__typeof__(arg))AllocatePool(Size+1); - -/* if (AsciiStrStr(tmpString, "nvda_drv=1")) { //found substring - gSettings.NvidiaWeb = true; - } */ - //first we will find new args that is not present in main args - index = 0; - while ((index < Size) && (tmpString[index] != 0x0)) { - ZeroMem(arg, Size+1); - index2 = 0; - if (tmpString[index] != '\"') { - // DBG("search space index=%d\n", index); - while ((index < Size) && (tmpString[index] != 0x20) && (tmpString[index] != 0x0)) { - arg[index2++] = tmpString[index++]; - } - DBG("...found arg:%s\n", arg); - } else { - index++; -// DBG("search quote index=%d\n", index); - while ((index < Size) && (tmpString[index] != '\"') && (tmpString[index] != 0x0)) { - arg[index2++] = tmpString[index++]; - } - if (tmpString[index] == '\"') { - index++; - } - DBG("...found quoted arg:\n"/*, arg*/); - } - while (tmpString[index] == 0x20) { - index++; - } - // For the moment only arg -s must be ignored - if (AsciiStrCmp(arg, "-s") == 0) { - DBG("...ignoring arg:%s\n", arg); - continue; - } - if (!gSettings.Boot.BootArgs.contains(arg)) { - //this arg is not present will add - DBG("...adding arg:%s\n", arg); - gSettings.Boot.BootArgs.trim(); - gSettings.Boot.BootArgs += ' '; - for (i = 0; i < index2; i++) { - gSettings.Boot.BootArgs += arg[i]; - } - gSettings.Boot.BootArgs += ' '; - } - } - FreePool(arg); - } - if (tmpString) { - FreePool(tmpString); - } - - tmpString = (__typeof__(tmpString))GetNvramVariable(L"nvda_drv", gEfiAppleBootGuid, NULL, NULL); - if (tmpString && AsciiStrCmp(tmpString, "1") == 0) { - gSettings.SystemParameters.NvidiaWeb = true; - } - if (tmpString) { - FreePool(tmpString); - } - + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_MENU_SWITCH *InputBootArgs; + UINTN i; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_ACPI, "Dsdt name->"_XS8); + + SubScreen->AddMenuInfoLine_f("Select a DSDT file:"); + SubScreen->AddMenuItemSwitch(116, "BIOS.aml", false); + + for (i = 0; i < DsdtsList.size(); i++) { + InputBootArgs = new REFIT_MENU_SWITCH; + InputBootArgs->Title.takeValueFrom(DsdtsList[i]); + InputBootArgs->Row = i + 1; + InputBootArgs->Item = &InputItems[116]; + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + } + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -void -GetListOfConfigs() + +REFIT_ABSTRACT_MENU_ENTRY* SubMenuACPI() { - REFIT_DIR_ITER DirIter; - EFI_FILE_INFO *DirEntry; + // init + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; - ConfigsList.setEmpty(); - OldChosenConfig = 0; + // create the entry in the options menu + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_ACPI, "ACPI patching->"_XS8); - DirIterOpen(&selfOem.getConfigDir(), NULL, &DirIter); - DbgHeader("Found config plists"); - while (DirIterNext(&DirIter, 2, L"config*.plist", &DirEntry)) { - if (DirEntry->FileName[0] == L'.') { - continue; - } - if (StriCmp(DirEntry->FileName, L"config.plist") == 0) { - OldChosenConfig = ConfigsList.size(); // DirEntry->FileName is not yet inserted into ConfigsList. So its index will be ConfigsList.size() - } - size_t NameLen = wcslen(DirEntry->FileName) - 6; //without ".plist" - if ( NameLen <= MAX_INTN ) { - ConfigsList.AddReference(SWPrintf("%.*ls", (int)NameLen, DirEntry->FileName).forgetDataWithoutFreeing(), true); // this avoid to reallocate and copy memory - DBG("- %ls\n", DirEntry->FileName); - }else{ - DBG("- bug!, NameLen > MAX_INTN"); - } - } - DirIterClose(&DirIter); -} + // submenu description + SubScreen->AddMenuInfoLine_f("Choose options to patch ACPI"); -void -GetListOfDsdts() -{ - REFIT_DIR_ITER DirIter; - EFI_FILE_INFO *DirEntry; + SubScreen->AddMenuItemInput(102, "Debug DSDT", false); - DsdtsList.setEmpty(); - OldChosenDsdt = 0xFFFF; + SubScreen->AddMenuEntry(SubMenuDsdts(), true); + SubScreen->AddMenuEntry(SubMenuDropTables(), true); + SubScreen->AddMenuEntry(SubMenuDsdtFix(), true); + SubScreen->AddMenuEntry(SubMenuDSDTPatches(), true); + SubScreen->AddMenuItemInput(49, "Fix MCFG", false); + SubScreen->AddMenuItemInput(124, "Fix Headers", gSettings.ACPI.FixHeaders); - DirIterOpen(&selfOem.getConfigDir(), L"ACPI\\patched", &DirIter); - DbgHeader("Found DSDT tables"); - while (DirIterNext(&DirIter, 2, L"DSDT*.aml", &DirEntry)) { - if (DirEntry->FileName[0] == L'.') { - continue; - } - if ( gSettings.ACPI.DSDT.DsdtName.isEqualIC(DirEntry->FileName) ) { - OldChosenDsdt = DsdtsList.size(); // DirEntry->FileName is not yet inserted into DsdtsList. So its index will be DsdtsList.size() - } - size_t NameLen = wcslen(DirEntry->FileName); //with ".aml" - DsdtsList.AddReference(SWPrintf("%.*ls", (int)NameLen, DirEntry->FileName).forgetDataWithoutFreeing(), true); // this avoid to reallocate and copy memory - DBG("- %ls\n", DirEntry->FileName); - } - DirIterClose(&DirIter); + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -void -GetListOfACPI() +REFIT_ABSTRACT_MENU_ENTRY* SubMenuAudioPort() { - REFIT_DIR_ITER DirIter; - EFI_FILE_INFO *DirEntry = NULL; + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_MENU_SWITCH *InputBootArgs; + UINTN i; -// XStringW AcpiPath = SWPrintf("%ls\\ACPI\\patched", OEMPath.wc_str()); -// DBG("Get list of ACPI at path %ls\n", AcpiPath.wc_str()); - ACPIPatchedAML.setEmpty(); - DirIterOpen(&selfOem.getConfigDir(), L"ACPI\\patched", &DirIter); + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_AUDIOPORTS, "Startup sound output->"_XS8); - while (DirIterNext(&DirIter, 2, L"*.aml", &DirEntry)) { -// DBG("next entry is %ls\n", DirEntry->FileName); - if (DirEntry->FileName[0] == L'.') { - continue; - } - if (StriStr(DirEntry->FileName, L"DSDT")) { - continue; - } -// DBG("Found name %ls\n", DirEntry->FileName); - XBool ACPIDisabled = false; - ACPI_PATCHED_AML* ACPIPatchedAMLTmp = new ACPI_PATCHED_AML; - ACPIPatchedAMLTmp->FileName.takeValueFrom(DirEntry->FileName); - - INTN Count = gSettings.ACPI.DisabledAML.size(); - for (INTN i = 0; i < Count; i++) { - if ( gSettings.ACPI.DisabledAML[i].isEqualIC(ACPIPatchedAMLTmp->FileName) ) { -// if ((gSettings.ACPI.DisabledAML[i] != NULL) && -// (StriCmp(ACPIPatchedAMLTmp->FileName, gSettings.ACPI.DisabledAML[i]) == 0) -// ) { - ACPIDisabled = true; - break; - } - } - ACPIPatchedAMLTmp->MenuItem.BValue = ACPIDisabled; - ACPIPatchedAML.AddReference(ACPIPatchedAMLTmp, true); - } + SubScreen->AddMenuInfoLine_f("Select an audio output, press F7 to test"); + SubScreen->AddMenuItemInput(120, "Volume:", true); + + for (i = 0; i < AudioList.size(); i++) { + InputBootArgs = new REFIT_MENU_SWITCH; + InputBootArgs->Title.SWPrintf("%ls_%s", AudioList[i].Name.wc_str(), AudioOutputNames[AudioList[i].Device]); + InputBootArgs->Row = i; + InputBootArgs->Item = &InputItems[119]; + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + } - DirIterClose(&DirIter); + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; } -void -GetListOfThemes () +void CreateMenuProps(REFIT_MENU_SCREEN* SubScreen, SETTINGS_DATA::DevicesClass::SimplePropertyClass* Prop) { - EFI_STATUS Status = EFI_NOT_FOUND; - REFIT_DIR_ITER DirIter; - EFI_FILE_INFO *DirEntry; - XStringW ThemeTestPath; - EFI_FILE *ThemeTestDir = NULL; - UINT8 *ThemePtr = NULL; - UINTN Size = 0; - - DbgHeader("GetListOfThemes"); - - ThemeNameArray.setEmpty(); - if ( !self.themesDirExists() ) { - DBG("No theme dir was discovered\n"); - return; - } - DirIterOpen(&self.getThemesDir(), NULL, &DirIter); - while (DirIterNext(&DirIter, 1, L"*", &DirEntry)) { - if (DirEntry->FileName[0] == '.') { - //DBG("Skip theme: %ls\n", DirEntry->FileName); - continue; - } - //DBG("Found theme directory: %ls", DirEntry->FileName); - DBG("- [%02zu]: %ls", ThemeNameArray.size(), DirEntry->FileName); - Status = self.getThemesDir().Open(&self.getThemesDir(), &ThemeTestDir, DirEntry->FileName, EFI_FILE_MODE_READ, 0); - if (!EFI_ERROR(Status)) { - Status = egLoadFile(ThemeTestDir, CONFIG_THEME_FILENAME, &ThemePtr, &Size); - if (EFI_ERROR(Status) || (ThemePtr == NULL) || (Size == 0)) { - Status = egLoadFile(ThemeTestDir, CONFIG_THEME_SVG, &ThemePtr, &Size); - if (EFI_ERROR(Status)) { - Status = EFI_NOT_FOUND; - DBG(" - bad theme because %ls nor %ls can't be load", CONFIG_THEME_FILENAME, CONFIG_THEME_SVG); - } - } - if (!EFI_ERROR(Status)) { - //we found a theme - if ((StriCmp(DirEntry->FileName, L"embedded") == 0) || - (StriCmp(DirEntry->FileName, L"random") == 0)) { - ThemePtr = NULL; - } else { - ThemeNameArray.Add(DirEntry->FileName); - } - } - } - DBG("\n"); - if (ThemePtr) { - FreePool(ThemePtr); - } - } - DirIterClose(&DirIter); + REFIT_INPUT_DIALOG *InputBootArgs; + + InputBootArgs = new REFIT_INPUT_DIALOG; + InputBootArgs->Title.SWPrintf(" key: %s", Prop->Key.c_str()); + InputBootArgs->Row = 0xFFFF; //cursor + InputBootArgs->Item = &Prop->MenuItem; + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + switch (Prop->ValueType) { + case kTagTypeInteger: + SubScreen->AddMenuInfo_f(" value: 0x%08llx", *(UINT64*)Prop->Value.data()); + break; + case kTagTypeString: + SubScreen->AddMenuInfo_f(" value: %90s", Prop->Value.data()); + break; + case kTagTypeFalse: + SubScreen->AddMenuInfo_f((" value: false")); + break; + case kTagTypeTrue: + SubScreen->AddMenuInfo_f((" value: true")); + break; + case kTagTypeFloat: + SubScreen->AddMenuInfo_f(" value: %f", *(float*)Prop->Value.data()); + break; + default: //type data, print first 24 bytes + SubScreen->AddMenuInfo_f(" value[%zu]: %24s", Prop->Value.size(), Bytes2HexStr((UINT8*)Prop->Value.data(), MIN(24, Prop->Value.size())).c_str()); + break; + } } -// -// secondary main entry point -// -EFI_STATUS -EFIAPI -RefitMainMain (IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable) +REFIT_ABSTRACT_MENU_ENTRY* SubMenuProperties() { - EFI_STATUS Status; - XBool MainLoopRunning = true; - XBool ReinitDesktop = true; - XBool AfterTool = false; - REFIT_ABSTRACT_MENU_ENTRY *ChosenEntry = NULL; - REFIT_ABSTRACT_MENU_ENTRY *DefaultEntry = NULL; - REFIT_ABSTRACT_MENU_ENTRY *OptionEntry = NULL; - INTN DefaultIndex; - UINTN MenuExit; - UINTN i; - EFI_TIME Now; - XBool HaveDefaultVolume; - REFIT_MENU_SCREEN BootScreen; - BootScreen.isBootScreen = true; //other screens will be constructed as false - - MemLogInit(); - - // bootstrap - gST = SystemTable; - gImageHandle = ImageHandle; - gBS = SystemTable->BootServices; - gRT = SystemTable->RuntimeServices; - /*Status = */EfiGetSystemConfigurationTable (&gEfiDxeServicesTableGuid, (void **) &gDS); - - - InitBooterLog(); + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; -// ConsoleInHandle = SystemTable->ConsoleInHandle; - -//#define DEBUG_ERALY_CRASH -#ifdef DEBUG_ERALY_CRASH - SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step1"); -// PauseForKey(); -#endif - -#ifdef DEBUG_ON_SERIAL_PORT - SerialPortInitialize(); -#endif + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_DEVICES, "Properties->"_XS8); + for ( size_t idx = 0 ; idx < gSettings.Devices.Properties.PropertyArray.size(); ++idx) { - EFI_LOADED_IMAGE* LoadedImage; - Status = gBS->HandleProtocol(gImageHandle, &gEfiLoadedImageProtocolGuid, (void **) &LoadedImage); + SETTINGS_DATA::DevicesClass::PropertiesClass::PropertyClass& Prop = gSettings.Devices.Properties.PropertyArray[idx]; -#ifdef DEBUG_ERALY_CRASH - SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step2"); -// PauseForKey(); -#endif - -// if ( !EFI_ERROR(Status) ) { -// XString8 msg = S8Printf("CloverX64 : Image base = 0x%llX\n", (uintptr_t)LoadedImage->ImageBase); // do not change, it's used by grep to feed the debugger -// SerialPortWrite((UINT8*)msg.c_str(), msg.length()); -// } - if ( !EFI_ERROR(Status) ) { - DBG("CloverX64 : Image base = 0x%llX\n", (uintptr_t)LoadedImage->ImageBase); // do not change, it's used by grep to feed the debugger - DBG("Clover ImageHandle = %llx\n", (uintptr_t)ImageHandle); -#ifdef DEBUG_ERALY_CRASH - SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step3"); -// PauseForKey(); -#endif + if ( idx > 0 ) SubScreen->AddMenuInfo_f("------------"); + SubScreen->AddMenuInfo_f("%ls", Prop.DevicePathAsString.wc_str()); + for ( size_t idxChild = 0 ; idxChild < Prop.propertiesArray.size(); ++idxChild) { + SETTINGS_DATA::DevicesClass::SimplePropertyClass& Props = Prop.propertiesArray[idxChild]; + CreateMenuProps(SubScreen, &Props); } -#ifdef JIEF_DEBUG - gBS->Stall(2500000); // to give time to gdb to connect -// PauseForKey(); -#endif } + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + Entry->SubScreen = SubScreen; + return Entry; +} -#ifdef DEBUG_ERALY_CRASH - SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step4"); -// PauseForKey(); -#endif - -#ifdef CLOVER_BUILD - // BE CAREFUL. construct_globals_objects will call ctor on every static struct and classes. - // For example, if you do "gCPUStructure.TSCCalibr = GetMemLogTscTicksPerSecond();" before this point, it will be erased by construct_globals_objects() - construct_globals_objects(gImageHandle); -#endif - - MemoryTrackerInstallHook(); - - gCPUStructure.TSCCalibr = GetMemLogTscTicksPerSecond(); //ticks for 1second +REFIT_ABSTRACT_MENU_ENTRY* SubMenuPCI() +{ + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_USB, "PCI devices->"_XS8); + + SubScreen->AddMenuItemInput(74, "USB Ownership", false); + SubScreen->AddMenuItemInput(92, "USB Injection", false); + SubScreen->AddMenuItemInput(93, "Inject ClockID", false); + SubScreen->AddMenuItemInput(106, "Inject EFI Strings", false); + SubScreen->AddMenuItemInput(107, "No Default Properties", false); + SubScreen->AddMenuItemInput(97, "FakeID LAN:", true); + SubScreen->AddMenuItemInput(98, "FakeID WIFI:", true); + SubScreen->AddMenuItemInput(99, "FakeID SATA:", true); + SubScreen->AddMenuItemInput(100, "FakeID XHCI:", true); + SubScreen->AddMenuItemInput(103, "FakeID IMEI:", true); + SubScreen->AddMenuEntry(SubMenuProperties(), true); + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + Entry->SubScreen = SubScreen; + return Entry; +} -#ifdef DEBUG_ERALY_CRASH - SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step5"); - PauseForKey(); -#endif -#ifdef JIEF_DEBUG -// all_tests(); -// PauseForKey(L"press\n"); -#endif +REFIT_ABSTRACT_MENU_ENTRY* SubMenuThemes() +{ + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_MENU_SWITCH *InputBootArgs; + UINTN i; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_THEME, "Themes->"_XS8); + + SubScreen->AddMenuInfoLine_f("Installed themes:"); + //add embedded + SubScreen->AddMenuItemSwitch(3, "embedded", false); + + for (i = 0; i < ThemeNameArray.size(); i++) { + InputBootArgs = new REFIT_MENU_SWITCH; + InputBootArgs->Title.takeValueFrom(ThemeNameArray[i]); + InputBootArgs->Row = i + 1; + InputBootArgs->Item = &InputItems[3]; + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + } + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; +} - gRT->GetTime(&Now, NULL); +REFIT_ABSTRACT_MENU_ENTRY* SubMenuGUI() +{ + // init + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; - Status = InitRefitLib(gImageHandle); // From here, debug.log starts to be saved because InitRefitLib call self.initialize() - if (EFI_ERROR(Status)) - return Status; + // create the entry in the options menu + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_GUI, "GUI tuning->"_XS8); -#ifdef DEBUG_ERALY_CRASH - SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step6"); - PauseForKey(); -#endif + // submenu description + SubScreen->AddMenuInfoLine_f("Choose options to tune the Interface"); -// firmware detection - gFirmwareClover = StrCmp(gST->FirmwareVendor, L"CLOVER") == 0; - if (!gFirmwareRevision) { -// gFirmwareRevision = P__oolPrint(L"%d", gST->FirmwareRevision); - } - DataHubInstall (ImageHandle, SystemTable); - InitializeConsoleSim(); + SubScreen->AddMenuItemInput(70, "Pointer Speed:", true); + SubScreen->AddMenuItemInput(72, "Mirror Move", false); + SubScreen->AddMenuEntry(SubMenuThemes(), true); - DbgHeader("Starting Clover"); - if (Now.TimeZone < -1440 || Now.TimeZone > 1440) { - MsgLog("Now is %02d.%02d.%d, %02d:%02d:%02d (GMT)\n", - Now.Day, Now.Month, Now.Year, Now.Hour, Now.Minute, Now.Second); - } else { - MsgLog("Now is %02d.%02d.%d, %02d:%02d:%02d (GMT+%d)\n", - Now.Day, Now.Month, Now.Year, Now.Hour, Now.Minute, Now.Second, gSettings.GUI.Timezone); - } - //MsgLog("Starting Clover rev %ls on %ls EFI\n", gFirmwareRevision, gST->FirmwareVendor); - MsgLog("Starting %s on %ls EFI\n", gRevisionStr, gST->FirmwareVendor); - MsgLog("Build id: %s\n", gBuildId.c_str()); - if ( gBuildInfo ) DBG("Build with: [%s]\n", gBuildInfo); -#ifdef JIEF_DEBUG - displayFreeMemory(""_XS8); -#endif + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; +} - //dumping SETTING structure - // if you change something in Platform.h, please uncomment and test that all offsets - // are natural aligned i.e. pointers are 8 bytes aligned - /* - DBG("Settings offsets:\n"); - DBG(" OEMProduct: %X\n", OFFSET_OF(SETTINGS_DATA, OEMProduct)); - DBG(" DefaultVolume: %X\n", OFFSET_OF(SETTINGS_DATA, DefaultVolume)); - DBG(" DefaultLoader: %X\n", OFFSET_OF(SETTINGS_DATA, DefaultLoader)); - DBG(" ResetAddr: %X\n", OFFSET_OF(SETTINGS_DATA, ResetAddr)); - DBG(" FixDsdt: %X\n", OFFSET_OF(SETTINGS_DATA, FixDsdt)); - DBG(" FakeATI: %X\n", OFFSET_OF(SETTINGS_DATA, FakeATI)); - DBG(" PatchVBiosBytes:%X\n", OFFSET_OF(SETTINGS_DATA, PatchVBiosBytes)); - DBG(" VRAM: %X\n", OFFSET_OF(SETTINGS_DATA, VRAM)); - DBG(" SecureBootWhiteListCount: %X\n", OFFSET_OF(SETTINGS_DATA, SecureBootWhiteListCount)); - DBG(" LegacyBoot: %X\n", OFFSET_OF(SETTINGS_DATA, LegacyBoot)); - DBG(" HVHideStrings: %X\n", OFFSET_OF(SETTINGS_DATA, HVHideStrings)); - DBG(" PointerSpeed: %X\n", OFFSET_OF(SETTINGS_DATA, PointerSpeed)); - DBG(" RtMLB: %X\n", OFFSET_OF(SETTINGS_DATA, RtMLB)); - DBG(" ConfigName: %X\n", OFFSET_OF(SETTINGS_DATA, ConfigName)); - DBG(" PointerSpeed: %X\n", OFFSET_OF(SETTINGS_DATA, PointerSpeed)); - DBG(" PatchDsdtNum: %X\n", OFFSET_OF(SETTINGS_DATA, PatchDsdtNum)); - DBG(" LenToReplace: %X\n", OFFSET_OF(SETTINGS_DATA, LenToReplace)); - DBG(" ACPIDropTables: %X\n", OFFSET_OF(SETTINGS_DATA, ACPIDropTables)); - DBG(" CustomEntries: %X\n", OFFSET_OF(SETTINGS_DATA, CustomEntries)); - DBG(" CustomTool: %X\n", OFFSET_OF(SETTINGS_DATA, CustomTool)); - DBG(" AddProperties: %X\n", OFFSET_OF(SETTINGS_DATA, AddProperties)); - DBG(" BlockKexts: %X\n", OFFSET_OF(SETTINGS_DATA, BlockKexts)); - */ - - // disable EFI watchdog timer - gBS->SetWatchdogTimer(0x0000, 0x0000, 0x0000, NULL); -// ZeroMem((void*)&gSettings, sizeof(SETTINGS_DATA)); - - Status = InitializeUnicodeCollationProtocol(); - if (EFI_ERROR(Status)) { - DBG("UnicodeCollation Status=%s\n", efiStrError(Status)); - } - -// Status = gBS->HandleProtocol(ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (void **)&SimpleTextEx); -// if ( EFI_ERROR(Status) ) { -// SimpleTextEx = NULL; -// } -// DBG("SimpleTextEx Status=%s\n", efiStrError(Status)); - gConf.InitialisePlatform(); +/* + * This is a simple and user friendly submenu which makes it possible to modify + * the System Integrity Protection configuration from the Clover's GUI. + * Author: Needy. + * The below function is based on the SubMenuDsdtFix function. + */ +REFIT_ABSTRACT_MENU_ENTRY* SubMenuCSR() +{ + // init + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + + // create the entry in the main menu + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_CSR, NullXString8); + + // submenu description + SubScreen->AddMenuInfoLine_f("Modify the System Integrity Protection configuration."); + SubScreen->AddMenuInfoLine_f("All configuration changes apply to the entire machine."); + + // available configurations + SubScreen->AddMenuCheck("Allow Untrusted Kexts", CSR_ALLOW_UNTRUSTED_KEXTS, 66); + SubScreen->AddMenuCheck("Allow Unrestricted FS", CSR_ALLOW_UNRESTRICTED_FS, 66); + SubScreen->AddMenuCheck("Allow Task For PID", CSR_ALLOW_TASK_FOR_PID, 66); + SubScreen->AddMenuCheck("Allow Kernel Debuger", CSR_ALLOW_KERNEL_DEBUGGER, 66); + SubScreen->AddMenuCheck("Allow Apple Internal", CSR_ALLOW_APPLE_INTERNAL, 66); + SubScreen->AddMenuCheck("Allow Unrestricted DTrace", CSR_ALLOW_UNRESTRICTED_DTRACE, 66); + SubScreen->AddMenuCheck("Allow Unrestricted NVRAM", CSR_ALLOW_UNRESTRICTED_NVRAM, 66); + SubScreen->AddMenuCheck("Allow Device Configuration", CSR_ALLOW_DEVICE_CONFIGURATION, 66); + SubScreen->AddMenuCheck("Allow Any Recovery OS", CSR_ALLOW_ANY_RECOVERY_OS, 66); + SubScreen->AddMenuCheck("Allow Unapproved Kexts", CSR_ALLOW_UNAPPROVED_KEXTS, 66); + SubScreen->AddMenuCheck("Allow Executable Policy Override", CSR_ALLOW_EXECUTABLE_POLICY_OVERRIDE, 66); + SubScreen->AddMenuCheck("Allow Non-authenticated Root", CSR_ALLOW_NON_AUTHENTICATED_ROOT, 66); + + // return + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + ModifyTitles(Entry); + return Entry; +} +/* +REFIT_ABSTRACT_MENU_ENTRY* SubMenuBLC() +{ + // init + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + + // create the entry in the main menu + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_BLC, NullXString8); + + // submenu description + SubScreen->AddMenuInfoLine_f("Modify flags for boot.efi"); + + SubScreen->AddMenuCheck("Reboot On Panic", kBootArgsFlagRebootOnPanic, 65); + SubScreen->AddMenuCheck("Hi DPI", kBootArgsFlagHiDPI, 65); + SubScreen->AddMenuCheck("Black Screen", kBootArgsFlagBlack, 65); + SubScreen->AddMenuCheck("CSR Active Config", kBootArgsFlagCSRActiveConfig, 65); + SubScreen->AddMenuCheck("CSR Pending Config", kBootArgsFlagCSRConfigMode, 65); + SubScreen->AddMenuCheck("CSR Boot", kBootArgsFlagCSRBoot, 65); + SubScreen->AddMenuCheck("Black Background", kBootArgsFlagBlackBg, 65); + SubScreen->AddMenuCheck("Login UI", kBootArgsFlagLoginUI, 65); + SubScreen->AddMenuCheck("Install UI", kBootArgsFlagInstallUI, 65); + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + ModifyTitles(Entry); + return Entry; +} +*/ +REFIT_ABSTRACT_MENU_ENTRY* SubMenuSystem() +{ + // init + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; -#ifdef JIEF_DEBUG - //DumpNvram(); -#endif + // create the entry in the options menu + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_SYSTEM, "System Parameters->"_XS8); - /* - * saving debug.log works from here - */ + // submenu description + SubScreen->AddMenuInfoLine_f("Choose options for booted OS"); + SubScreen->AddMenuItemInput(2, "Block kext:", true); + SubScreen->AddMenuItemInput(51, "Set OS version if not detected:", true); + SubScreen->AddMenuItemInput(118, "Booter Cfg Command:", true); + SubScreen->AddMenuItemInput(129, "Reset SMC", false); - { -// UINT32 machineSignature = 0; - EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtPointer = NULL; - EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs = NULL; - -// DBG("---dump hibernations data---\n"); - FadtPointer = GetFadt(); - if (FadtPointer != NULL) { - Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*)(UINTN)(FadtPointer->FirmwareCtrl); - /* - DBG(" Firmware wake address=%08lx\n", Facs->FirmwareWakingVector); - DBG(" Firmware wake 64 addr=%16llx\n", Facs->XFirmwareWakingVector); - DBG(" Hardware signature =%08lx\n", Facs->HardwareSignature); - DBG(" GlobalLock =%08lx\n", Facs->GlobalLock); - DBG(" Flags =%08lx\n", Facs->Flags); - */ - machineSignature = Facs->HardwareSignature; - } -#if HIBERNATE_DUMP_DATA -//------------------------------------------------------ - DumpVariable(L"Boot0082", gEfiGlobalVariableGuid, 8); - DumpVariable(L"boot-switch-vars", gEfiAppleBootGuid, -1); - DumpVariable(L"boot-signature", gEfiAppleBootGuid, -1); - DumpVariable(L"boot-image-key", gEfiAppleBootGuid, -1); - DumpVariable(L"boot-image", gEfiAppleBootGuid, 0); -//----------------------------------------------------------- - -#endif // - } - -#if 0 - //testing place - { - //#define ARRAY_SIZE(Array) (sizeof (Array) / sizeof ((Array)[0])) - #define L_STR_LEN(String) (ARRAY_SIZE (String) - 1) -DBG("strlen '<' =%ld or %lld\n", L_STR_LEN("<"), AsciiStrLen("<")); - DBG(" size CHAR8=%ld\n", sizeof(CHAR8)); - DBG(" size CHAR16=%ld\n", sizeof(CHAR16)); - DBG(" size wchar_t=%ld\n", sizeof(wchar_t)); - DBG(" size char32_t=%ld\n", sizeof(char32_t)); - DBG(" size char16_t=%ld\n", sizeof(char16_t)); - const CHAR16 aaa[] = L"12345 "; - const CHAR8 *bbb = "12345 "; - DBG(" string %ls, size=%lld, len=%lld sizeof=%ld iStrLen=%lld\n", aaa, StrSize(aaa), StrLen(aaa), sizeof(aaa), iStrLen(bbb, 10)); - const CHAR8* ccc = "Выход "; - DBG(" string %s, size=%lld, len=%lld sizeof=%ld iStrLen=%lld\n", ccc, AsciiStrSize(ccc), AsciiStrLen(ccc), sizeof(ccc), iStrLen(ccc, 10)); - XString8 ddd = "Выход "_XS8; - // size_t sizex = ddd.allocatedSize(); - DBG(" xstring %s, asize=%ld, sizeinbyte=%ld sizeof=%ld lastcharat=%ld\n", ddd.c_str(), ddd.allocatedSize(), - ddd.sizeInBytes(), sizeof(ddd), ddd.indexOf(ddd.lastChar())); - CHAR8 compatible[64]; - UINT32 FakeLAN = 0x0030168c; - UINT32 FakeID = FakeLAN >> 16; - UINT32 FakeVendor = FakeLAN & 0xFFFF; - snprintf(compatible, 64, "pci%x,%x", FakeVendor, FakeID); - DBG(" FakeLAN = 0x%x\n", FakeLAN); - DBG(" Compatible=%s strlen=%ld sizeof=%ld iStrLen=%lld\n", compatible, - strlen(compatible), sizeof(compatible), iStrLen(compatible, 64)); -// LowCase(compatible); -// DBG(" Low Compatible=%s strlen=%ld sizeof=%ld iStrLen=%lld\n", compatible, -// strlen(compatible), sizeof(compatible), iStrLen(compatible, 64)); - - DBG("void*=%ld int=%ld long=%ld longlong=%ld enum=%ld\n", - sizeof(void*), sizeof(int), sizeof(long int), sizeof(long long), sizeof(EFI_ALLOCATE_TYPE)); - /* - Results - 1:200 0:025 size CHAR8=1 - 1:226 0:025 size CHAR16=2 - 1:251 0:024 size wchar_t=2 - 1:275 0:024 size char16_t=2 - 1:381 0:000 string 12345 , size=16, len=7 sizeof=16 iStrLen=5 - 1:381 0:000 string Выход , size=13, len=12 sizeof=8 iStrLen=10 - 1:381 0:000 xstring Выход , asize=0, sizeinbyte=11 sizeof=16 lastcharat=5 - 1:381 0:000 FakeLAN = 0x30168c - 1:381 0:000 Compatible=pci168c,30 strlen=10 sizeof=64 iStrLen=10 - 1:430 0:025 void*=8 int=4 long=8 longlong=8 enum=4 - */ - } -#endif - if (!GlobalConfig.isFastBoot()) { - GetListOfThemes(); - GetListOfConfigs(); -// SmbiosList.setEmpty(); -// SmbiosList.AddReference(new XStringW(L"auto"_XSW), true); - } -// ThemeX->FillByEmbedded(); //init XTheme before EarlyUserSettings - { - void *Value = NULL; - UINTN Size = 0; - //read aptiofixflag from nvram for special boot - Status = GetVariable2(L"aptiofixflag", gEfiAppleBootGuid, &Value, &Size); - if (!EFI_ERROR(Status)) { - GlobalConfig.SpecialBootMode = true; - FreePool(Value); - DBG("Fast option enabled\n"); - } - } + SubScreen->AddMenuEntry(SubMenuCSR(), true); +// SubScreen->AddMenuEntry(SubMenuBLC(), true); -// for (i=0; i<2; i++) { -// if (gConfigDict[i]) { -// GetEarlyUserSettings(gConfigDict[i], gSettings); -// } -// } + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; +} -#ifdef ENABLE_SECURE_BOOT - // Install secure boot shim - if (EFI_ERROR(Status = InstallSecureBoot())) { - PauseForKey("Secure boot failure!\n"_XS8); - return Status; - } -#endif // ENABLE_SECURE_BOOT +REFIT_ABSTRACT_MENU_ENTRY* SubMenuConfigs() +{ + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; + REFIT_MENU_SWITCH *InputBootArgs; + UINTN i; + + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_THEME, "Configs->"_XS8); + + SubScreen->AddMenuInfoLine_f("Select a config file:"); + + for (i = 0; i < ConfigsList.size(); i++) { + InputBootArgs = new REFIT_MENU_SWITCH; + InputBootArgs->Title = ConfigsList[i]; + InputBootArgs->Row = i; + InputBootArgs->Item = &InputItems[90]; + InputBootArgs->AtClick = ActionEnter; + InputBootArgs->AtRightClick = ActionDetails; + SubScreen->AddMenuEntry(InputBootArgs, true); + } + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + return Entry; +} - MainMenu.TimeoutSeconds = gSettings.Boot.Timeout >= 0 ? gSettings.Boot.Timeout : 0; - //DBG("LoadDrivers() start\n"); - LoadDrivers(); +REFIT_ABSTRACT_MENU_ENTRY* SubMenuQuirks() +{ + // init + REFIT_MENU_ITEM_OPTIONS *Entry; + REFIT_MENU_SCREEN *SubScreen; - Status = gBS->LocateProtocol(gEmuVariableControlProtocolGuid, NULL, (void**)&gEmuVariableControl); - if (EFI_ERROR(Status)) { - gEmuVariableControl = NULL; - } - if (gEmuVariableControl != NULL) { - gEmuVariableControl->InstallEmulation(gEmuVariableControl); - } - - DbgHeader("InitScreen"); - - if (!GlobalConfig.isFastBoot()) { - // init screen and dump video modes to log - if (gDriversFlags.VideoLoaded) { - InitScreen(false); - } else { - InitScreen(!gFirmwareClover); // ? false : true); - } - //DBG("DBG: setup screen\n"); - SetupScreen(); - } else { - InitScreen(false); - } - - //DBG("ReinitRefitLib\n"); - //Now we have to reinit handles - Status = ReinitRefitLib(); - if (EFI_ERROR(Status)){ - // DebugLog(2, " %s", efiStrError(Status)); - PauseForKey("Error reinit refit."_XS8); -#ifdef ENABLE_SECURE_BOOT - UninstallSecureBoot(); -#endif // ENABLE_SECURE_BOOT - return Status; - } - - ThemeX = new XTheme(); - - // DBG("DBG: messages\n"); - if (!gSettings.Boot.NoEarlyProgress && !GlobalConfig.isFastBoot() && gSettings.Boot.Timeout>0) { - XStringW Message = SWPrintf(" Welcome to Clover %ls ", gFirmwareRevision); - BootScreen.DrawTextXY(Message, (UGAWidth >> 1), UGAHeight >> 1, X_IS_CENTER); - BootScreen.DrawTextXY(L"... testing hardware ..."_XSW, (UGAWidth >> 1), (UGAHeight >> 1) + 20, X_IS_CENTER); - } - -// DumpBiosMemoryMap(); - -// PrintMemoryMap(); - - GuiEventsInitialize(); - - //DBG("ScanSPD() start\n"); - ScanSPD(); - //DBG("ScanSPD() end\n"); - - SetPrivateVarProto(); -// GetDefaultSettings(); - GetAcpiTablesList(); - - - if (!gSettings.Boot.NoEarlyProgress && !GlobalConfig.isFastBoot() && gSettings.Boot.Timeout>0) { - XStringW Message = SWPrintf("... user settings ..."); - BootScreen.EraseTextXY(); - BootScreen.DrawTextXY(Message, (UGAWidth >> 1), (UGAHeight >> 1) + 20, X_IS_CENTER); - } + // create the entry in the main menu + Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_QUIRKS, NullXString8); + Entry->Title.SWPrintf("Quirks mask [0x%04x]->", gSettings.Quirks.QuirksMask); - afterGetUserSettings(gSettings); - gFakeCPUID = gSettings.KernelAndKextPatches.FakeCPUID; - DBG("Set FakeCPUID: 0x%X\n", gFakeCPUID); - - HaveDefaultVolume = gSettings.Boot.DefaultVolume.notEmpty(); - if (!gFirmwareClover && - !gDriversFlags.EmuVariableLoaded && - !HaveDefaultVolume && - gSettings.Boot.Timeout == 0 && !ReadAllKeyStrokes()) { -// UEFI boot: get gEfiBootDeviceGuid from NVRAM. -// if present, ScanVolumes() will skip scanning other volumes -// in the first run. -// this speeds up loading of default macOS volume. - GetEfiBootDeviceFromNvram(); - } - - if (!gSettings.Boot.NoEarlyProgress && !GlobalConfig.isFastBoot() && gSettings.Boot.Timeout>0) { - XStringW Message = SWPrintf("... scan entries ..."); - BootScreen.EraseTextXY(); - BootScreen.DrawTextXY(Message, (UGAWidth >> 1), (UGAHeight >> 1) + 20, X_IS_CENTER); - } - - AfterTool = false; - gGuiIsReady = true; - GlobalConfig.gBootChanged = true; - GlobalConfig.gThemeChanged = true; - - do { - if (GlobalConfig.gBootChanged && GlobalConfig.gThemeChanged) { // config changed - GetListOfDsdts(); //only after GetUserSettings - GetListOfACPI(); //ssdt and other tables - } - GlobalConfig.gBootChanged = false; - MainMenu.Entries.setEmpty(); - OptionMenu.Entries.setEmpty(); - InitKextList(); - ScanVolumes(); - - // as soon as we have Volumes, find latest nvram.plist and copy it to RT vars - if (!AfterTool) { - if (gFirmwareClover || gDriversFlags.EmuVariableLoaded) { - PutNvramPlistToRtVars(); - } - } - - // log Audio devices in boot-log. This is for clients like Clover.app - GetOutputs(); - for (i = 0; i < AudioList.size(); i++) { - if (AudioList[i].Name.notEmpty()) { - // Never change this log, otherwise clients will stop interpret the output. - MsgLog("Found Audio Device %ls (%s) at index %llu\n", AudioList[i].Name.wc_str(), AudioOutputNames[AudioList[i].Device], i); - } - } - - if (!GlobalConfig.isFastBoot()) { - if (gThemeNeedInit) { - UINTN Size = 0; - CHAR8* ChoosenTheme = (CHAR8*)GetNvramVariable(L"Clover.Theme", gEfiAppleBootGuid, NULL, &Size); - InitTheme(ChoosenTheme); - FreePool(ChoosenTheme); - gThemeNeedInit = false; - } else if (GlobalConfig.gThemeChanged) { - DBG("change theme\n"); - InitTheme(NULL); - AboutMenu.Entries.setEmpty(); - HelpMenu.Entries.setEmpty(); - } - DBG("theme inited\n"); - if (ThemeX->embedded) { - DBG("Chosen embedded theme\n"); - } else { - DBG("Chosen theme %ls\n", ThemeX->Theme.wc_str()); - } - - //now it is a time to set RtVariables - SetVariablesFromNvram(); - - XString8Array TmpArgs = Split<XString8Array>(gSettings.Boot.BootArgs, " "); - DBG("after NVRAM boot-args=%s\n", gSettings.Boot.BootArgs.c_str()); - GlobalConfig.OptionsBits = EncodeOptions(TmpArgs); -// DBG("initial OptionsBits %X\n", GlobalConfig.OptionsBits); - FillInputs(true); - - // scan for loaders and tools, add then to the menu - if (gSettings.GUI.Scan.LegacyFirst){ - AddCustomLegacy(); - if (!gSettings.GUI.Scan.NoLegacy) { - ScanLegacy(); - } - } - } - GetSmcKeys(true); - - // Add custom entries - AddCustomEntries(); - if (gSettings.GUI.Scan.DisableEntryScan) { - DBG("Entry scan disabled\n"); - } else { - ScanLoader(); - } - - if (!GlobalConfig.isFastBoot()) { - if (!gSettings.GUI.Scan.LegacyFirst) { - AddCustomLegacy(); - if (!gSettings.GUI.Scan.NoLegacy) { - ScanLegacy(); - } - } - - // fixed other menu entries - if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_TOOLS)) { - AddCustomTool(); - if (!gSettings.GUI.Scan.DisableToolScan) { - ScanTool(); -#ifdef ENABLE_SECURE_BOOT - // Check for secure boot setup mode - AddSecureBootTool(); -#endif // ENABLE_SECURE_BOOT - } - } - - MenuEntryOptions.Image = ThemeX->GetIcon(BUILTIN_ICON_FUNC_OPTIONS); -// DBG("Options: IconID=%lld name=%s empty=%s\n", MenuEntryOptions.Image.Id, MenuEntryOptions.Image.Name.c_str(), - if (gSettings.Boot.DisableCloverHotkeys) - MenuEntryOptions.ShortcutLetter = 0x00; - MainMenu.AddMenuEntry(&MenuEntryOptions, false); - - MenuEntryAbout.Image = ThemeX->GetIcon((INTN)BUILTIN_ICON_FUNC_ABOUT); -// DBG("About: IconID=%lld name=%s empty=%s\n", MenuEntryAbout.Image.Id, MenuEntryAbout.Image.Name.c_str(), - - if (gSettings.Boot.DisableCloverHotkeys) - MenuEntryAbout.ShortcutLetter = 0x00; - MainMenu.AddMenuEntry(&MenuEntryAbout, false); - - if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_FUNCS) || MainMenu.Entries.size() == 0) { - if (gSettings.Boot.DisableCloverHotkeys) - MenuEntryReset.ShortcutLetter = 0x00; - MenuEntryReset.Image = ThemeX->GetIcon(BUILTIN_ICON_FUNC_RESET); - MainMenu.AddMenuEntry(&MenuEntryReset, false); - if (gSettings.Boot.DisableCloverHotkeys) - MenuEntryShutdown.ShortcutLetter = 0x00; - MenuEntryShutdown.Image = ThemeX->GetIcon(BUILTIN_ICON_FUNC_EXIT); - MainMenu.AddMenuEntry(&MenuEntryShutdown, false); - } - - } - // wait for user ACK when there were errors - FinishTextScreen(false); -#if CHECK_SMC - DumpSmcKeys(); -#endif - - DefaultIndex = FindDefaultEntry(); -// DBG("DefaultIndex=%lld and MainMenu.Entries.size()=%llu\n", DefaultIndex, MainMenu.Entries.size()); - if ((DefaultIndex >= 0) && (DefaultIndex < (INTN)MainMenu.Entries.size())) { - DefaultEntry = &MainMenu.Entries[DefaultIndex]; - } else { - DefaultEntry = NULL; - } - - MainLoopRunning = true; - if (DefaultEntry && (GlobalConfig.isFastBoot() || - (gSettings.Boot.SkipHibernateTimeout && - DefaultEntry->getLOADER_ENTRY() - && OSFLAG_ISSET(DefaultEntry->getLOADER_ENTRY()->Flags, OSFLAG_HIBERNATED)))) { - if (DefaultEntry->getLOADER_ENTRY()) { - DefaultEntry->StartLoader(); - } else if (DefaultEntry->getLEGACY_ENTRY()){ - DefaultEntry->StartLegacy(); - } - gSettings.Boot.FastBoot = false; //Hmm... will never be here - } -#ifdef JIEF_DEBUG -//MainMenu.TimeoutSeconds=1; -//DefaultEntry = NULL; -//DefaultIndex = MainMenu.Entries.length()-1; // this should be "Exit Clover" -#endif - AfterTool = false; - gEvent = 0; //clear to cancel loop - while (MainLoopRunning) { - if (gSettings.Boot.Timeout == 0 && DefaultEntry != NULL && !ReadAllKeyStrokes()) { - // go strait to DefaultVolume loading - MenuExit = MENU_EXIT_TIMEOUT; - } else { - MainMenu.GetAnime(); - if (GlobalConfig.gThemeChanged) { - GlobalConfig.gThemeChanged = false; - ThemeX->ClearScreen(); - } -#ifdef JIEF_DEBUG -displayFreeMemory("Before RunMainMenu"_XS8); -#endif - MenuExit = MainMenu.RunMainMenu(DefaultIndex, &ChosenEntry); - } -// DBG("exit from MainMenu %llu ChosenEntry=%zu\n", MenuExit, MainMenu.Entries.indexOf(*ChosenEntry)); //MENU_EXIT_ENTER=(1) MENU_EXIT_DETAILS=3 - // disable default boot - have sense only in the first run - gSettings.Boot.Timeout = -1; - if ((DefaultEntry != NULL) && (MenuExit == MENU_EXIT_TIMEOUT)) { - if (DefaultEntry->getLOADER_ENTRY()) { - DefaultEntry->StartLoader(); - } else if (DefaultEntry->getLEGACY_ENTRY()){ - DefaultEntry->StartLegacy(); - } - // if something goes wrong - break main loop to reinit volumes - break; - } - - if (MenuExit == MENU_EXIT_OPTIONS){ - GlobalConfig.gBootChanged = false; - OptionsMenu(&OptionEntry); - if (GlobalConfig.gBootChanged) { - AfterTool = true; - MainLoopRunning = false; - break; - } - continue; - } - - if (MenuExit == MENU_EXIT_HELP){ - HelpRefit(); - continue; - } - - // EjectVolume - if (MenuExit == MENU_EXIT_EJECT){ - Status = EFI_SUCCESS; - if (ChosenEntry->getLOADER_ENTRY() ) { - Status = EjectVolume(ChosenEntry->getLOADER_ENTRY()->Volume); - } - if ( ChosenEntry->getLEGACY_ENTRY() ) { - Status = EjectVolume(ChosenEntry->getLEGACY_ENTRY()->Volume); - } - if (!EFI_ERROR(Status)) { - break; //main loop is broken so Reinit all - } - continue; - } - - // Hide toggle - if (MenuExit == MENU_EXIT_HIDE_TOGGLE) { - MainMenu.Entries.includeHidden = !MainMenu.Entries.includeHidden; - continue; - } - - // We don't allow exiting the main menu with the Escape key. - if (MenuExit == MENU_EXIT_ESCAPE){ - break; //refresh main menu - // continue; - } - - if ( ChosenEntry->getREFIT_MENU_ITEM_RESET() ) { // Restart - if (MenuExit == MENU_EXIT_DETAILS) { - - //do clear cmos as for AMI BIOS - // not sure for more robust method - IoWrite8 (PCAT_RTC_ADDRESS_REGISTER, 0x10); - IoWrite8 (PCAT_RTC_DATA_REGISTER, 0x0); - IoWrite8 (PCAT_RTC_ADDRESS_REGISTER, 0x11); - IoWrite8 (PCAT_RTC_DATA_REGISTER, 0x0); -// or may be -// IoWrite8 (PCAT_RTC_ADDRESS_REGISTER, 0x17); -// IoWrite8 (PCAT_RTC_DATA_REGISTER, 0x17); - -// } - } - // Attempt warm reboot - gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); - // Warm reboot may not be supported attempt cold reboot - gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); - // Terminate the screen and just exit - TerminateScreen(); - MainLoopRunning = false; - ReinitDesktop = false; - AfterTool = true; - } + // submenu description + SubScreen->AddMenuInfoLine_f("Choose options to fix memory"); + + SubScreen->AddMenuCheck("AvoidRuntimeDefrag", QUIRK_DEFRAG, 101); + SubScreen->AddMenuCheck("DevirtualiseMmio", QUIRK_MMIO, 101); + SubScreen->AddMenuCheck("DisableSingleUser", QUIRK_SU, 101); + SubScreen->AddMenuCheck("DisableVariableWrite", QUIRK_VAR, 101); + SubScreen->AddMenuCheck("DiscardHibernateMap", QUIRK_HIBER, 101); + SubScreen->AddMenuCheck("EnableSafeModeSlide", QUIRK_SAFE, 101); + SubScreen->AddMenuCheck("EnableWriteUnprotector", QUIRK_UNPROT, 101); + SubScreen->AddMenuCheck("ForceExitBootServices", QUIRK_EXIT, 101); + SubScreen->AddMenuCheck("ProtectMemoryRegions", QUIRK_REGION, 101); + SubScreen->AddMenuCheck("ProtectSecureBoot", QUIRK_SECURE, 101); + SubScreen->AddMenuCheck("ProtectUefiServices", QUIRK_UEFI, 101); + SubScreen->AddMenuCheck("ProvideCustomSlide", QUIRK_CUSTOM, 101); +//decimal + SubScreen->AddMenuItemInput(122, "ProvideMaxSlide:", true); + SubScreen->AddMenuCheck("RebuildAppleMemoryMap", QUIRK_MAP, 101); + SubScreen->AddMenuItemInput(127, "ResizeAppleGpuBars:", true); + SubScreen->AddMenuCheck("SetupVirtualMap", QUIRK_VIRT, 101); + SubScreen->AddMenuCheck("SyncRuntimePermissions", QUIRK_PERM, 101); + + SubScreen->AddMenuItemInput(130, "TscSyncTimeout:", true); + + SubScreen->AddMenuEntry(&MenuEntryReturn, false); + ModifyTitles(Entry); + + return Entry; +} - if ( ChosenEntry->getREFIT_MENU_ITEM_SHUTDOWN() ) { // It is not Shut Down, it is Exit from Clover - TerminateScreen(); - // gRT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL); - MainLoopRunning = false; // just in case we get this far - ReinitDesktop = false; - AfterTool = true; - } - if ( ChosenEntry->getREFIT_MENU_ITEM_OPTIONS() ) { // Options like KernelFlags, DSDTname etc. - GlobalConfig.gBootChanged = false; - OptionsMenu(&OptionEntry); - if (GlobalConfig.gBootChanged) - AfterTool = true; - if (GlobalConfig.gBootChanged || GlobalConfig.gThemeChanged) // If theme has changed reinit the desktop - MainLoopRunning = false; - } - if ( ChosenEntry->getREFIT_MENU_ITEM_ABOUT() ) { // About rEFIt - AboutRefit(); - } - /* -- not passed here -// case TAG_HELP: - HelpRefit(); +void OptionsMenu(OUT REFIT_ABSTRACT_MENU_ENTRY **ChosenEntry) +{ + REFIT_ABSTRACT_MENU_ENTRY *TmpChosenEntry = NULL; + REFIT_ABSTRACT_MENU_ENTRY *NextChosenEntry = NULL; + UINTN MenuExit = 0; + UINTN SubMenuExit; + UINTN NextMenuExit; + INTN EntryIndex = 0; + INTN SubEntryIndex = -1; //value -1 means old position to remember + INTN NextEntryIndex = -1; + + XBool OldFontStyle = ThemeX->Proportional; + ThemeX->Proportional = false; //temporary disable proportional + + + // remember, if you extended this menu then change procedures + // FillInputs and ApplyInputs + gThemeOptionsChanged = false; + + if (OptionMenu.Entries.size() == 0) { + OptionMenu.Daylight = ThemeX->Daylight; + if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_MENU_TITLE_IMAGE)) { + OptionMenu.TitleImage = ThemeX->GetIcon(BUILTIN_ICON_FUNC_OPTIONS); + } + gThemeOptionsChanged = true; + OptionMenu.ID = SCREEN_OPTIONS; + OptionMenu.GetAnime(); //false; + + OptionMenu.AddMenuItemInput(0, "Boot Args:", true); + OptionMenu.AddMenuEntry( SubMenuConfigs(), true); + + if (AllowGraphicsMode) { + OptionMenu.AddMenuEntry( SubMenuGUI(), true); + } + OptionMenu.AddMenuEntry( SubMenuACPI(), true); + OptionMenu.AddMenuEntry( SubMenuChooseSmbios(), true); + // OptionMenu.AddMenuEntry( SubMenuSmbios(), true); + OptionMenu.AddMenuEntry( SubMenuBinaries(), true); + OptionMenu.AddMenuEntry( SubMenuQuirks(), true); + OptionMenu.AddMenuEntry( SubMenuGraphics(), true); + OptionMenu.AddMenuEntry( SubMenuPCI(), true); + OptionMenu.AddMenuEntry( SubMenuSpeedStep(), true); + OptionMenu.AddMenuEntry( SubMenuAudio(), true); + OptionMenu.AddMenuEntry( SubMenuAudioPort(), true); + OptionMenu.AddMenuEntry( SubMenuSystem(), true); + OptionMenu.AddMenuEntry( &MenuEntryReturn, false); + //DBG("option menu created entries=%d\n", OptionMenu.Entries.size()); + } + + while (!MenuExit) { + MenuExit = OptionMenu.RunGenericMenu(&EntryIndex, ChosenEntry); + if (MenuExit == MENU_EXIT_ESCAPE || (*ChosenEntry)->getREFIT_MENU_ITEM_RETURN()) break; - */ - if ( ChosenEntry->getLOADER_ENTRY() ) { // Boot OS via .EFI loader - SetBootCurrent(ChosenEntry->getLOADER_ENTRY()); - ChosenEntry->StartLoader(); - //if boot.efi failed we should somehow exit from the loop - TerminateScreen(); - MainLoopRunning = false; - ReinitDesktop = false; - AfterTool = true; - } - if ( ChosenEntry->getLEGACY_ENTRY() ) { // Boot legacy OS - if (StrCmp(gST->FirmwareVendor, L"Phoenix Technologies Ltd.") == 0 && - gST->Hdr.Revision >> 16 == 2 && (gST->Hdr.Revision & ((1 << 16) - 1)) == 0){ - // Phoenix SecureCore Tiano 2.0 can't properly initiate LegacyBios protocol when called externally - // which results in "Operating System not found" message coming from BIOS - // in this case just quit Clover to enter BIOS again - TerminateScreen(); - MainLoopRunning = false; - ReinitDesktop = false; - AfterTool = true; - } else { - SetBootCurrent(ChosenEntry->getLEGACY_ENTRY()); - ChosenEntry->StartLegacy(); - } - } - if ( ChosenEntry->getREFIT_MENU_ENTRY_LOADER_TOOL() ) { // Start a EFI tool - ChosenEntry->StartTool(); - TerminateScreen(); //does not happen - // return EFI_SUCCESS; - // BdsLibConnectAllDriversToAllControllers(); - // PauseForKey(L"Returned from StartTool\n"); - MainLoopRunning = false; - AfterTool = true; - } - #ifdef ENABLE_SECURE_BOOT -//log_technical_bug("not done yet"); -// if ( ChosenEntry->getREFIT_MENU_ENTRY_SECURE_BOOT() ) { // Try to enable secure boot -// EnableSecureBoot(); -// MainLoopRunning = false; -// AfterTool = true; -// } -// -// if ( ChosenEntry->getREFIT_MENU_ENTRY_SECURE_BOOT_CONFIG() ) { // Configure secure boot -// MainLoopRunning = !ConfigureSecureBoot(); -// AfterTool = true; -// } - #endif // ENABLE_SECURE_BOOT -// DBG("come to Clover entry with letter %c\n", ChosenEntry->ShortcutLetter); - REFIT_MENU_ENTRY_CLOVER* LoaderEntry = ChosenEntry->getREFIT_MENU_ENTRY_CLOVER(); - if ((ChosenEntry->ShortcutLetter == L'C') || LoaderEntry != NULL ) { // Clover options -// DBG("enter Clover entry\n"); - - if (LoaderEntry->LoadOptions.notEmpty()) { - - // we are uninstalling in case user selected Clover Options and EmuVar is installed - // because adding bios boot option requires access to real nvram - //Slice: sure? - /* if (gEmuVariableControl != NULL) { - gEmuVariableControl->UninstallEmulation(gEmuVariableControl); + if (MenuExit == MENU_EXIT_ENTER || MenuExit == MENU_EXIT_DETAILS) { + //enter input dialog or subscreen + if ((*ChosenEntry)->SubScreen != NULL) { + SubMenuExit = 0; + while (!SubMenuExit) { + SubMenuExit = (*ChosenEntry)->SubScreen->RunGenericMenu(&SubEntryIndex, &TmpChosenEntry); + if (SubMenuExit == MENU_EXIT_ESCAPE || TmpChosenEntry->getREFIT_MENU_ITEM_RETURN() ){ + ApplyInputs(); + ModifyTitles(*ChosenEntry); + break; } - */ - // DBG(" Clover entry not empty\n"); - if ( LoaderEntry->LoadOptions.contains(L"BO-ADD") ) { - // DBG(" BO-ADD"); - XStringW Description; - CONST CHAR16 *LoaderName; - INTN EntryIndex, NameSize, Name2Size; - LOADER_ENTRY *Entry; - UINT8 *OptionalData; - UINTN OptionalDataSize; - UINTN BootNum; - // EFI_HANDLE UsedHandle = 0; - - PrintBootOptions(false); - - for (EntryIndex = 0; EntryIndex < (INTN)MainMenu.Entries.size(); EntryIndex++) { - if (MainMenu.Entries[EntryIndex].Row != 0) { - continue; - } - if (!MainMenu.Entries[EntryIndex].getLOADER_ENTRY()) { - continue; - } - - Entry = (LOADER_ENTRY *)MainMenu.Entries[EntryIndex].getLOADER_ENTRY(); - XStringW& VolName = Entry->Volume->VolName; - DBG("add entry for volume %ls\n", VolName.wc_str()); - if (VolName.isEmpty()) { - VolName = NullXStringW; - } - NameSize = VolName.sizeInBytes(); - Name2Size = 0; - if (Entry->LoaderPath.notEmpty()) { - LoaderName = Basename(Entry->LoaderPath.wc_str()); - } else { - LoaderName = NULL; //legacy boot - } - if (LoaderName != NULL) { - Name2Size = StrSize(LoaderName); - } - - Description = SWPrintf("Clover UEFI"); - OptionalDataSize = NameSize + Name2Size + 4 + 2; //signature + VolNameSize - OptionalData = (__typeof__(OptionalData))AllocateZeroPool(OptionalDataSize); - if (OptionalData == NULL) { - break; - } - CopyMem(OptionalData, "Clvr", 4); //signature = 0x72766c43 - CopyMem(OptionalData + 4, &NameSize, 2); - CopyMem(OptionalData + 6, VolName.wc_str(), VolName.sizeInBytes()); - if (Name2Size != 0) { - CopyMem(OptionalData + 6 + NameSize, LoaderName, Name2Size); - } -// UsedHandle = LoaderEntry->Volume->DeviceHandle; - Status = AddBootOptionForFile ( - LoaderEntry->Volume->DeviceHandle, - LoaderEntry->LoaderPath, - true, - Description.wc_str(), - OptionalData, - OptionalDataSize, - EntryIndex, - (UINT16*)&BootNum - ); - if (!EFI_ERROR(Status)) { - DBG("Entry %lld assigned option %04llX\n", EntryIndex, BootNum); - Entry->BootNum = BootNum; - } - FreePool(OptionalData); - break; - } //for (EntryIndex - - - PrintBootOptions(false); - } else if ( LoaderEntry->LoadOptions.contains(L"BO-REMOVE") ) { - PrintBootOptions(false); - Status = DeleteBootOptionForFile (LoaderEntry->Volume->DeviceHandle, - LoaderEntry->LoaderPath - ); - PrintBootOptions(false); - } else if ( LoaderEntry->LoadOptions.contains(L"BO-PRINT") ) { - PrintBootOptions(true); + if (SubMenuExit == MENU_EXIT_ENTER || MenuExit == MENU_EXIT_DETAILS) { + if (TmpChosenEntry->SubScreen != NULL) { + NextMenuExit = 0; + while (!NextMenuExit) { + NextMenuExit = TmpChosenEntry->SubScreen->RunGenericMenu(&NextEntryIndex, &NextChosenEntry); + if (NextMenuExit == MENU_EXIT_ESCAPE || NextChosenEntry->getREFIT_MENU_ITEM_RETURN() ){ + ApplyInputs(); + ModifyTitles(TmpChosenEntry); + break; + } + if (NextMenuExit == MENU_EXIT_ENTER || MenuExit == MENU_EXIT_DETAILS) { + // enter input dialog + NextMenuExit = 0; + ApplyInputs(); + ModifyTitles(TmpChosenEntry); + } + } //while(!NextMenuExit) + } + // enter input dialog + SubMenuExit = 0; + ApplyInputs(); + ModifyTitles(TmpChosenEntry); } - - } - MainLoopRunning = false; - AfterTool = true; - } - } //MainLoopRunning - UninitRefitLib(); - if (!AfterTool) { - // PauseForKey(L"After uninit"); - //reconnectAll - if (!gFirmwareClover) { - BdsLibConnectAllEfi(); - } - else { - DBG("ConnectAll after refresh menu\n"); - BdsLibConnectAllDriversToAllControllers(); + } //while(!SubMenuExit) } - // ReinitRefitLib(); - // PauseForKey(L"After ReinitRefitLib"); - } - if (ReinitDesktop) { - DBG("ReinitRefitLib after theme change\n"); - ReinitRefitLib(); - } - // PauseForKey(L"After ReinitRefitLib"); - } while (ReinitDesktop); - - // If we end up here, things have gone wrong. Try to reboot, and if that - // fails, go into an endless loop. - //Slice - NO!!! Return to EFI GUI - // gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); - // EndlessIdleLoop(); - -#ifdef ENABLE_SECURE_BOOT - UninstallSecureBoot(); -#endif // ENABLE_SECURE_BOOT - - // Unload EmuVariable before returning to EFI GUI, as it should not be present when booting other Operating Systems. - // This seems critical in some UEFI implementations, such as Phoenix UEFI 2.0 - if (gEmuVariableControl != NULL) { - gEmuVariableControl->UninstallEmulation(gEmuVariableControl); + MenuExit = 0; + } // if MENU_EXIT_ENTER } +//exit: + ThemeX->Proportional = OldFontStyle; - UninitializeConsoleSim (); - - delete ThemeX; // do this before destruct_globals_objects() - FreePool(BlankLine); // Convert BlankLine to XStringW instead. - TagStruct::EmptyCache(); - -#ifdef CLOVER_BUILD - destruct_globals_objects(NULL); -#endif - - return EFI_SUCCESS; -} - -// -// main entry point -// -EFI_STATUS -EFIAPI -RefitMain (IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable) -{ - MemoryTrackerInit(); - //MemoryTrackerInstallHook(); can't install hook before construct_globals_objects()... yet - - EFI_STATUS Status = RefitMainMain(ImageHandle, SystemTable); - - DBG("MT_alloc_count=%lld\n", MT_getAllocCount()); - MT_outputDanglingPtr(); - -#ifdef TagStruct_COUNT_CACHEHIT - DBG("cache hits = %zu\n", TagStruct::cachehit); - DBG("cache miss = %zu\n", TagStruct::cachemiss); -#endif - - return Status; + ApplyInputs(); } - From 048c5bf23c1ec62138f05a4a4a6900211a540de9 Mon Sep 17 00:00:00 2001 From: chris1111 <leblond1111@gmail.com> Date: Thu, 19 Sep 2024 22:33:10 -0400 Subject: [PATCH 3/6] Update Credits on source code --- rEFIt_UEFI/refit/main.cpp | 5795 ++++++++++++++++++++++--------------- rEFIt_UEFI/refit/menu.cpp | 3 + 2 files changed, 3454 insertions(+), 2344 deletions(-) diff --git a/rEFIt_UEFI/refit/main.cpp b/rEFIt_UEFI/refit/main.cpp index 5f26aa81e..02bd0028e 100644 --- a/rEFIt_UEFI/refit/main.cpp +++ b/rEFIt_UEFI/refit/main.cpp @@ -1,8 +1,8 @@ /* - * refit/menu.c - * Menu functions + * refit/main.c + * Main code for the boot menu * - * Copyright (c) 2006 Christoph Pfisterer + * Copyright (c) 2006-2010 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,2573 +34,3680 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "menu.h" #include <Platform.h> // Only use angled for Platform, else, xcode project won't compile -#include "../libeg/libegint.h" +#include <cpp_util/globals_ctor.h> +#include <cpp_util/globals_dtor.h> -#include "../Platform/Settings.h" +#include "../cpp_foundation/XString.h" +#include "../cpp_lib/MemoryTracker.h" +#include "../cpp_unit_test/all_tests.h" +#include "../entry_scan/entry_scan.h" #include "../libeg/nanosvg.h" -#include "../libeg/FloatLib.h" -#include "../Platform/HdaCodecDump.h" +#include "../gui/menu_items/menu_globals.h" #include "menu.h" +#include "../Platform/Utils.h" +#include "../Platform/Settings.h" +#include "../Platform/DataHubCpu.h" +#include "../Platform/Events.h" #include "screen.h" -#include "../cpp_foundation/XString.h" -#include "../libeg/XTheme.h" -#include "../libeg/VectorGraphics.h" // for testSVG +#include "../entry_scan/bootscreen.h" +#include "../Platform/Nvram.h" +#include "../entry_scan/common.h" #include "../gui/shared_with_menu.h" #include "../Platform/platformdata.h" +#include "../Platform/guid.h" +#include "../Platform/APFS.h" #include "../Platform/cpu.h" -#include "../Platform/Nvram.h" -#include "../include/DsdtFixList.h" -#include "../include/Devices.h" -#include "../include/QuirksCodes.h" -#include "../Platform/boot.h" +#include "../Platform/smbios.h" +#include "../Platform/AcpiPatcher.h" +#include "../Platform/Hibernate.h" +#include "../Platform/LegacyBoot.h" +#include "../Platform/PlatformDriverOverride.h" +#include "../Platform/Edid.h" +#include "../Platform/Console.h" +#include "../Platform/spd.h" #include "../Platform/Injectors.h" +#include "../Platform/StartupSound.h" +#include "../Platform/BootOptions.h" +#include "../Platform/boot.h" +#include "../Platform/kext_inject.h" +#include "../Platform/device_inject.h" #include "../Platform/KextList.h" #include "../gui/REFIT_MENU_SCREEN.h" #include "../gui/REFIT_MAINMENU_SCREEN.h" #include "../Settings/Self.h" -#include "../Platform/VersionString.h" +#include "../Settings/SelfOem.h" +#include "../Platform/BasicIO.h" +#include "../include/OSTypes.h" +#include "../include/OSFlags.h" +#include "../libeg/XTheme.h" #include "../Settings/ConfigManager.h" #include "../Platform/CloverVersion.h" +#include "../Platform/SmbiosFillPatchingValues.h" + +#include "../include/OC.h" + #ifndef DEBUG_ALL -#define DEBUG_MENU 1 +# ifdef DEBUG_ERALY_CRASH +# define DEBUG_MAIN 2 +# else +# define DEBUG_MAIN 1 +# endif #else -#define DEBUG_MENU DEBUG_ALL +# define DEBUG_MAIN DEBUG_ALL #endif -#if DEBUG_MENU == 0 +#if DEBUG_MAIN == 0 #define DBG(...) #else -#define DBG(...) DebugLog(DEBUG_MENU, __VA_ARGS__) +#define DBG(...) DebugLog(DEBUG_MAIN, __VA_ARGS__) #endif +#ifndef HIBERNATE +#define HIBERNATE 0 +#endif -INTN LayoutMainMenuHeight = 376; -INTN LayoutAnimMoveForMenuX = 0; -#define TEXT_CORNER_REVISION (1) -#define TEXT_CORNER_HELP (2) -#define TEXT_CORNER_OPTIMUS (3) +#ifndef CHECK_SMC +#define CHECK_SMC 0 +#endif -REFIT_MENU_ITEM_OPTIONS MenuEntryOptions (L"Options"_XSW, 1, 0, 'O', ActionEnter); -REFIT_MENU_ITEM_ABOUT MenuEntryAbout (L"About Clover"_XSW, 1, 0, 'A', ActionEnter); -REFIT_MENU_ITEM_RESET MenuEntryReset (L"Restart Computer"_XSW, 1, 0, 'R', ActionSelect); -REFIT_MENU_ITEM_SHUTDOWN MenuEntryShutdown(L"Exit Clover"_XSW, 1, 0, 'U', ActionSelect); -REFIT_MENU_ITEM_RETURN MenuEntryReturn (L"Return"_XSW, 0, 0, 0, ActionEnter); -REFIT_MAINMENU_SCREEN MainMenu(1, L"Main Menu"_XSW, L"Automatic boot"_XSW); -REFIT_MENU_SCREEN AboutMenu(2, L"About"_XSW, L""_XSW); -REFIT_MENU_SCREEN HelpMenu(3, L"Help"_XSW, L""_XSW); -REFIT_MENU_SCREEN OptionMenu(4, L"Options"_XSW, L""_XSW); +#define PCAT_RTC_ADDRESS_REGISTER 0x70 +#define PCAT_RTC_DATA_REGISTER 0x71 -XBool gResetSMC = false; -extern APPLE_SMC_IO_PROTOCOL *gAppleSmc; -extern ConfigManager gConf; +// variables -void FillInputs(XBool New) -{ - UINTN i,j; //for loops - CHAR8 tmp[41]; - - tmp[40] = 0; //make it null-terminated - - UINTN InputItemsCount = 0; - - InputItems[InputItemsCount].ItemType = ASString; //0 - //even though Ascii we will keep value as Unicode to convert later - // no need for extra space here, it is added by ApplyInputs() - InputItems[InputItemsCount++].SValue.takeValueFrom(gSettings.Boot.BootArgs); - InputItems[InputItemsCount].ItemType = UNIString; //1 - InputItems[InputItemsCount++].SValue.takeValueFrom(gSettings.ACPI.DSDT.DsdtName); // 1-> 2 - InputItems[InputItemsCount].ItemType = UNIString; //2 - InputItems[InputItemsCount++].SValue = GlobalConfig.BlockKexts; - - InputItems[InputItemsCount].ItemType = RadioSwitch; //3 - Themes chooser - InputItems[InputItemsCount++].IValue = 3; - - InputItems[InputItemsCount].ItemType = BoolValue; //4 - InputItems[InputItemsCount++].BValue = GlobalConfig.DropSSDT; - InputItems[InputItemsCount].ItemType = BoolValue; //5 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.SSDT.Generate.GeneratePStates; - InputItems[InputItemsCount].ItemType = BoolValue; //6 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.SlpSmiEnable; - InputItems[InputItemsCount].ItemType = Decimal; //7 - InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gSettings.ACPI.SSDT.PLimitDict); - InputItems[InputItemsCount].ItemType = Decimal; //8 - InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gSettings.ACPI.SSDT.UnderVoltStep); - InputItems[InputItemsCount].ItemType = BoolValue; //9 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.SSDT.Generate.GenerateCStates; - InputItems[InputItemsCount].ItemType = BoolValue; //10 - InputItems[InputItemsCount++].BValue = GlobalConfig.EnableC2; - InputItems[InputItemsCount].ItemType = BoolValue; //11 - InputItems[InputItemsCount++].BValue = GlobalConfig.EnableC4; - InputItems[InputItemsCount].ItemType = BoolValue; //12 - InputItems[InputItemsCount++].BValue = GlobalConfig.EnableC6; - InputItems[InputItemsCount].ItemType = BoolValue; //13 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.SSDT.EnableISS; - InputItems[InputItemsCount].ItemType = Decimal; //14 - InputItems[InputItemsCount++].SValue.SWPrintf("%06d", gSettings.CPU.QPI); - InputItems[InputItemsCount].ItemType = BoolValue; //15 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.PatchNMI; - InputItems[InputItemsCount].ItemType = BoolValue; //16 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.PatchVBios; - InputItems[InputItemsCount].ItemType = Decimal; //17 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%llX", gSettings.Smbios.gPlatformFeature); - InputItems[InputItemsCount].ItemType = Hex; //18 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%hX", gSettings.SystemParameters.BacklightLevel); - InputItems[InputItemsCount].ItemType = Decimal; //19 - if (gSettings.CPU.BusSpeed > 20000) { - InputItems[InputItemsCount++].SValue.SWPrintf("%06d", gSettings.CPU.BusSpeed); - } else { - InputItems[InputItemsCount++].SValue.SWPrintf("%06llu", gCPUStructure.ExternalClock); - } - InputItemsCount = 20; - for (i=0; i<gConf.GfxPropertiesArray.size(); i++) { - InputItems[InputItemsCount].ItemType = ASString; //20+i*6 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gConf.GfxPropertiesArray[i].Model.c_str()); - - if (gConf.GfxPropertiesArray[i].Vendor == Ati) { - InputItems[InputItemsCount].ItemType = BoolValue; //21+i*6 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.InjectAsDict.InjectATI; - InputItems[InputItemsCount].ItemType = ASString; //22+6i - if ( gSettings.Graphics.FBName.length() > 2 ) { //fool proof: cfg_name is 3 character or more. - InputItems[InputItemsCount++].SValue.SWPrintf("%ls", gSettings.Graphics.FBName.wc_str()); - } else { - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gConf.GfxPropertiesArray[i].Config.c_str()); - } - } else if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { - InputItems[InputItemsCount].ItemType = BoolValue; //21+i*6 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.InjectAsDict.InjectNVidia; - InputItems[InputItemsCount].ItemType = ASString; //22+6i - for (j=0; j<8; j++) { - snprintf((CHAR8*)&tmp[2*j], 3, "%02hhX", gSettings.Graphics.Dcfg[j]); - } - InputItems[InputItemsCount++].SValue.SWPrintf("%s", tmp); - } else /*if (gGraphics[i].Vendor == Intel) */ { - InputItems[InputItemsCount].ItemType = BoolValue; //21+i*6 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.InjectAsDict.InjectIntel; - InputItems[InputItemsCount].ItemType = Hex; //22+6i - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", GlobalConfig.IgPlatform); - } - - InputItems[InputItemsCount].ItemType = Decimal; //23+6i - if (gSettings.Graphics.VideoPorts > 0) { - InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gSettings.Graphics.VideoPorts); - } else { - InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gConf.GfxPropertiesArray[i].Ports); - } - - if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { - InputItems[InputItemsCount].ItemType = ASString; //24+6i - for (j=0; j<gSettings.Graphics.NVCAP.size(); j++) { - snprintf((CHAR8*)&tmp[2*j], 3, "%02hhX", gSettings.Graphics.NVCAP[j]); - } - InputItems[InputItemsCount++].SValue.SWPrintf("%s", tmp); - } else { //ATI and others there will be connectors - InputItems[InputItemsCount].ItemType = Hex; //24+6i - InputItems[InputItemsCount++].SValue.SWPrintf("%08x", gConf.GfxPropertiesArray[i].Connectors); - } - - InputItems[InputItemsCount].ItemType = BoolValue; //25+6i - InputItems[InputItemsCount++].BValue = gConf.GfxPropertiesArray[i].LoadVBios; - } - //and so on - - InputItemsCount = 44; - InputItems[InputItemsCount].ItemType = BoolValue; //44 - InputItems[InputItemsCount++].BValue = GlobalConfig.KextPatchesAllowed; - InputItems[InputItemsCount].ItemType = BoolValue; //45 - InputItems[InputItemsCount++].BValue = gSettings.KernelAndKextPatches.EightApple; - InputItems[InputItemsCount].ItemType = BoolValue; //46 - InputItems[InputItemsCount++].BValue = GlobalConfig.KPAppleIntelCPUPM; - InputItems[InputItemsCount].ItemType = BoolValue; //47 - InputItems[InputItemsCount++].BValue = gSettings.KernelAndKextPatches.KPAppleRTC; - InputItems[InputItemsCount].ItemType = BoolValue; //48 - InputItems[InputItemsCount++].BValue = GlobalConfig.KPKernelPm; - InputItems[InputItemsCount].ItemType = BoolValue; //49 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.FixMCFG; - - InputItems[InputItemsCount].ItemType = Decimal; //50 - InputItems[InputItemsCount++].SValue.SWPrintf("%06d", gSettings.Graphics.RefCLK); - - InputItems[InputItemsCount].ItemType = ASString; //51 OS version if non-detected - InputItems[InputItemsCount++].SValue.SWPrintf("%s ", NonDetected.c_str()); - - InputItems[InputItemsCount].ItemType = BoolValue; //52 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.EDID.InjectEDID; - - //VendorEDID & ProductEDID 53, 54 - InputItems[InputItemsCount].ItemType = Decimal; //53 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%04hX", gSettings.Graphics.EDID.VendorEDID); - InputItems[InputItemsCount].ItemType = Decimal; //54 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%04hX", gSettings.Graphics.EDID.ProductEDID); - - // ErmaC: NvidiaGeneric menu selector y/n - InputItems[InputItemsCount].ItemType = BoolValue; //55 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.NvidiaGeneric; - InputItems[InputItemsCount].ItemType = BoolValue; //56 - InputItems[InputItemsCount++].BValue = gSettings.SystemParameters.NvidiaWeb; - InputItems[InputItemsCount].ItemType = BoolValue; //57 - InputItems[InputItemsCount++].BValue = gSettings.Devices.Audio.ResetHDA; - InputItems[InputItemsCount].ItemType = BoolValue; //58 - InputItems[InputItemsCount++].BValue = gSettings.Devices.Audio.AFGLowPowerState; - InputItems[InputItemsCount].ItemType = BoolValue; //59 - InputItems[InputItemsCount++].BValue = gSettings.Devices.Audio.HDAInjection; - InputItems[InputItemsCount].ItemType = Decimal; // 60 - InputItems[InputItemsCount++].SValue.SWPrintf("%d", gSettings.Devices.Audio.HDALayoutId); - - // syscl change here - InputItems[InputItemsCount].ItemType = BoolValue; //61 - InputItems[InputItemsCount++].BValue = gSettings.KernelAndKextPatches.KPDELLSMBIOS; - // end of change - - InputItems[InputItemsCount].ItemType = Hex; //62 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Smbios.FirmwareFeatures); - - InputItems[InputItemsCount].ItemType = Hex; //63 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Smbios.FirmwareFeaturesMask); - - // Debug for KernelAndKextPatches - InputItems[InputItemsCount].ItemType = BoolValue; //64 - InputItems[InputItemsCount++].BValue = gSettings.KernelAndKextPatches.KPDebug; - - - // SMBIOS chooser - InputItems[InputItemsCount].ItemType = RadioSwitch; //CheckBit; //65 - InputItems[InputItemsCount++].IValue = 65; //gSettings.RtVariables.BooterConfig; - - // CSR - aka System Integrity Protection configuration - InputItems[InputItemsCount].ItemType = CheckBit; //66 - InputItems[InputItemsCount++].IValue = gSettings.RtVariables.CsrActiveConfig; - - - InputItems[InputItemsCount].ItemType = CheckBit; //67 - InputItems[InputItemsCount++].IValue = gSettings.ACPI.DSDT.FixDsdt; - InputItems[InputItemsCount].ItemType = CheckBit; //68 - InputItems[InputItemsCount++].IValue = GlobalConfig.OptionsBits; - InputItems[InputItemsCount].ItemType = CheckBit; //69 - InputItems[InputItemsCount++].IValue = GlobalConfig.FlagsBits; - - InputItems[InputItemsCount].ItemType = Decimal; //70 - InputItems[InputItemsCount++].SValue.SWPrintf("%02lld", gSettings.GUI.Mouse.PointerSpeed); - InputItems[InputItemsCount].ItemType = Decimal; //71 - InputItems[InputItemsCount++].SValue.SWPrintf("%04llu", gSettings.GUI.Mouse.DoubleClickTime); - InputItems[InputItemsCount].ItemType = BoolValue; //72 - InputItems[InputItemsCount++].BValue = gSettings.GUI.Mouse.PointerMirror; - - //reserve for mouse and continue - - InputItemsCount = 74; - InputItems[InputItemsCount].ItemType = BoolValue; //74 - InputItems[InputItemsCount++].BValue = gSettings.Devices.USB.USBFixOwnership; - - InputItems[InputItemsCount].ItemType = Hex; //75 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%04hX", GlobalConfig.C3Latency); - InputItems[InputItemsCount].ItemType = Decimal; //76 - InputItems[InputItemsCount++].SValue.SWPrintf("%02d", GlobalConfig.EnabledCores); - InputItems[InputItemsCount].ItemType = Decimal; //77 - InputItems[InputItemsCount++].SValue.SWPrintf("%02d", gSettings.CPU.SavingMode); - - InputItems[InputItemsCount].ItemType = ASString; //78 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.ProductName.c_str()); - InputItems[InputItemsCount].ItemType = ASString; //79 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.SystemVersion.c_str()); - InputItems[InputItemsCount].ItemType = ASString; //80 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.SerialNr.c_str()); - InputItems[InputItemsCount].ItemType = ASString; //81 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.BoardNumber.c_str()); - InputItems[InputItemsCount].ItemType = ASString; //82 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.BoardSerialNumber.c_str()); - InputItems[InputItemsCount].ItemType = Decimal; //83 - InputItems[InputItemsCount++].SValue.SWPrintf("%d", gSettings.Smbios.BoardType); - InputItems[InputItemsCount].ItemType = ASString; //84 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.BoardVersion.c_str()); - InputItems[InputItemsCount].ItemType = Decimal; //85 - InputItems[InputItemsCount++].SValue.SWPrintf("%d", gSettings.Smbios.ChassisType); - InputItems[InputItemsCount].ItemType = ASString; //86 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.BiosVersion.c_str()); - InputItems[InputItemsCount].ItemType = ASString; //87 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.BiosReleaseDate.c_str()); - - InputItems[InputItemsCount].ItemType = BoolValue; //88 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.SSDT.DoubleFirstState; - InputItems[InputItemsCount].ItemType = BoolValue; //89 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.SSDT.EnableC7; - InputItems[InputItemsCount].ItemType = RadioSwitch; //90 - InputItems[InputItemsCount++].IValue = 90; - - InputItems[InputItemsCount].ItemType = BoolValue; //91 - InputItems[InputItemsCount++].BValue = gSettings.KernelAndKextPatches.KPKernelLapic; - - InputItems[InputItemsCount].ItemType = BoolValue; //92 - InputItems[InputItemsCount++].BValue = gSettings.Devices.USB.USBInjection; - InputItems[InputItemsCount].ItemType = BoolValue; //93 - InputItems[InputItemsCount++].BValue = gSettings.Devices.USB.InjectClockID; - - InputItems[InputItemsCount].ItemType = Hex; //94 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Devices.FakeID.FakeATI); - InputItems[InputItemsCount].ItemType = Hex; //95 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Devices.FakeID.FakeNVidia); - InputItems[InputItemsCount].ItemType = Hex; //96 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Devices.FakeID.FakeIntel); - - InputItems[InputItemsCount].ItemType = Hex; //97 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Devices.FakeID.FakeLAN); - InputItems[InputItemsCount].ItemType = Hex; //98 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Devices.FakeID.FakeWIFI); - InputItems[InputItemsCount].ItemType = Hex; //99 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Devices.FakeID.FakeSATA); - InputItems[InputItemsCount].ItemType = Hex; //100 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Devices.FakeID.FakeXHCI); - InputItems[InputItemsCount].ItemType = CheckBit; //101 - Quirks - InputItems[InputItemsCount++].IValue = gSettings.Quirks.QuirksMask; // - - InputItems[InputItemsCount].ItemType = BoolValue; //102 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.DSDT.DebugDSDT; - InputItems[InputItemsCount].ItemType = Hex; //103 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Devices.FakeID.FakeIMEI); - InputItems[InputItemsCount].ItemType = Hex; //104 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.KernelAndKextPatches.FakeCPUID); - - - InputItems[InputItemsCount].ItemType = BoolValue; //105 - InputItems[InputItemsCount++].BValue = gSettings.KernelAndKextPatches.KPKernelXCPM; - - InputItems[InputItemsCount].ItemType = BoolValue; //106 - InputItems[InputItemsCount++].BValue = gSettings.Devices.StringInjector; - InputItems[InputItemsCount].ItemType = BoolValue; //107 - InputItems[InputItemsCount++].BValue = gSettings.Devices.NoDefaultProperties; - InputItems[InputItemsCount].ItemType = BoolValue; //108 - InputItems[InputItemsCount++].BValue = GlobalConfig.KernelPatchesAllowed; - - InputItems[InputItemsCount].ItemType = Hex; //109 - InputItems[InputItemsCount++].SValue.SWPrintf("%01X", gSettings.Graphics.DualLink); - - InputItems[InputItemsCount].ItemType = BoolValue; //110 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.NvidiaNoEFI; - InputItems[InputItemsCount].ItemType = BoolValue; //111 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.NvidiaSingle; - - InputItems[InputItemsCount].ItemType = Hex; //112 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%04X", gSettings.Devices.IntelMaxValue); - - InputItems[InputItemsCount].ItemType = BoolValue; //113 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.AutoMerge; - InputItems[InputItemsCount].ItemType = BoolValue; //114 - InputItems[InputItemsCount++].BValue = gSettings.Graphics.RadeonDeInit; - InputItems[InputItemsCount].ItemType = BoolValue; //115 - InputItems[InputItemsCount++].BValue = gSettings.KernelAndKextPatches.BlockSkywalk; - InputItems[InputItemsCount].ItemType = RadioSwitch; //116 - DSDT chooser - InputItems[InputItemsCount++].IValue = 116; - - InputItems[InputItemsCount].ItemType = ASString; //117 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.Smbios.EfiVersion.c_str()); - InputItems[InputItemsCount].ItemType = ASString; //118 - InputItems[InputItemsCount++].SValue.SWPrintf("%s", gSettings.RtVariables.BooterCfgStr.c_str()); - - InputItems[InputItemsCount].ItemType = RadioSwitch; //119 - Audio chooser - InputItems[InputItemsCount++].IValue = 119; - InputItems[InputItemsCount].ItemType = Decimal; //120 - InputItems[InputItemsCount++].SValue.SWPrintf("%04d", DefaultAudioVolume); - - InputItems[InputItemsCount].ItemType = BoolValue; //121 - InputItems[InputItemsCount++].BValue = gSettings.KernelAndKextPatches.KPPanicNoKextDump; - InputItems[InputItemsCount].ItemType = Decimal; //122 - InputItems[InputItemsCount++].SValue.SWPrintf("%04hhu", gSettings.Quirks.OcBooterQuirks.ProvideMaxSlide); - InputItems[InputItemsCount].ItemType = BoolValue; //123 - InputItems[InputItemsCount++].BValue = gSettings.GUI.ProvideConsoleGop; - InputItems[InputItemsCount].ItemType = BoolValue; //124 - InputItems[InputItemsCount++].BValue = gSettings.ACPI.FixHeaders; + EFI_PHYSICAL_ADDRESS SomePages = EFI_SYSTEM_TABLE_MAX_ADDRESS; //0xFE000000;? - InputItems[InputItemsCount].ItemType = Hex; //125 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%016llX", gSettings.Smbios.ExtendedFirmwareFeatures); - InputItems[InputItemsCount].ItemType = Hex; //126 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%016llX", gSettings.Smbios.ExtendedFirmwareFeaturesMask); - InputItems[InputItemsCount].ItemType = Decimal; //127 - InputItems[InputItemsCount++].SValue.SWPrintf("%04d", gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars); +XBool gGuiIsReady = false; +XBool gThemeNeedInit = true; +XBool DoHibernateWake = false; +UINT32 mCurrentColor; - InputItems[InputItemsCount].ItemType = BoolValue; //128 - InputItems[InputItemsCount++].BValue = gSettings.Quirks.OcKernelQuirks.ProvideCurrentCpuInfo; +extern UINT32 gFakeCPUID; - InputItems[InputItemsCount].ItemType = BoolValue; //129 - InputItems[InputItemsCount++].BValue = gResetSMC; - InputItems[InputItemsCount].ItemType = Decimal; //130 - InputItems[InputItemsCount++].SValue.SWPrintf("%08d", gSettings.Quirks.OcBooterQuirks.TscSyncTimeout); - InputItems[InputItemsCount].ItemType = Hex; //131 - InputItems[InputItemsCount++].SValue.SWPrintf("0x%08X", gSettings.Smbios.SFakeCPU); +EFI_HANDLE AudioDriverHandle; +XStringW OpenRuntimeEfiName; +extern void HelpRefit(void); +extern void AboutRefit(void); +extern EFI_AUDIO_IO_PROTOCOL *AudioIo; +extern EFI_DXE_SERVICES *gDS; - //menu for drop table - if (GlobalConfig.ACPIDropTables.notEmpty()) { - for ( size_t idx = 0 ; idx < GlobalConfig.ACPIDropTables.length() ; ++idx ) { - ACPI_DROP_TABLE& DropTable = GlobalConfig.ACPIDropTables[idx]; - DropTable.MenuItem.ItemType = BoolValue; - } - } +EFI_PHYSICAL_ADDRESS ExtraSpace = EFI_SYSTEM_TABLE_MAX_ADDRESS; - for ( size_t idx = 0 ; idx < ACPIPatchedAML.size() ; ++idx) { - ACPI_PATCHED_AML& ACPIPatchedAMLTmp = ACPIPatchedAML[idx]; - ACPIPatchedAMLTmp.MenuItem.ItemType = BoolValue; +void PrintMemoryMap() +{ + apd<EFI_MEMORY_DESCRIPTOR*> MemMap; + UINTN MemMapSize; + UINTN MapKey, DescriptorSize; + UINT32 DescriptorVersion; + EFI_STATUS Status; + + MemMapSize = 0; + DescriptorSize = 0; + Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion); + if (Status != EFI_BUFFER_TOO_SMALL) { + DBG("PrintMemoryMap: GetMemStatus=%s not EFI_BUFFER_TOO_SMALL\n", efiStrError(Status)); + return; + } + MemMapSize += EFI_PAGE_SIZE; + MemMap = (EFI_MEMORY_DESCRIPTOR*)AllocatePool(MemMapSize); + + Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion); + if ( EFI_ERROR(Status) ) { + DBG("PrintMemoryMap: GetMemoryMap failed=%s\n", efiStrError(Status)); + return; + } + +#ifndef JIEF_DEBUG + EFI_MEMORY_DESCRIPTOR* MemMapPtr = MemMap; + + for (UINTN Index = 0; Index < MemMapSize / DescriptorSize; Index ++) { + UINT64 Bytes = LShiftU64 (MemMapPtr->NumberOfPages, 12); + DEBUG ((EFI_D_ERROR, "%llX-%llX %llX %llX %X\n", + MemMapPtr->PhysicalStart, + MemMapPtr->PhysicalStart + Bytes - 1, + MemMapPtr->NumberOfPages, + MemMapPtr->Attribute, + MemMapPtr->Type)); + MemMapPtr = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemMapPtr + DescriptorSize); } +#else + OcPrintMemoryMap(MemMapSize, MemMap, DescriptorSize); +#endif } - -void ApplyInputs(void) +void AllocSmallBlocks(UINTN NumberOfPagesMax) { -// EFI_STATUS Status = EFI_NOT_FOUND; - MacModel Model; - XBool NeedSave = true; - INTN i = 0; - UINTN j; - -// DBG("ApplyInputs\n"); - if (InputItems[i].Valid) { - gSettings.Boot.BootArgs = InputItems[i].SValue; - gSettings.Boot.BootArgs.replaceAll('\\', '_'); - GlobalConfig.gBootChanged = true; - } - i++; //1 - if (InputItems[i].Valid) { - gSettings.ACPI.DSDT.DsdtName = InputItems[i].SValue; - } - i++; //2 - if (InputItems[i].Valid) { - GlobalConfig.BlockKexts = InputItems[i].SValue; - } - i++; //3 - if (InputItems[i].Valid) { - if (OldChosenTheme == 0xFFFF) { - gSettings.GUI.Theme = L"embedded"_XSW; - } else { - gSettings.GUI.Theme.takeValueFrom(ThemeNameArray[OldChosenTheme]); - } - - //will change theme after ESC - GlobalConfig.gThemeChanged = true; - } - i++; //4 - if (InputItems[i].Valid) { - GlobalConfig.DropSSDT = InputItems[i].BValue != 0; - } - i++; //5 - if (InputItems[i].Valid) { - gSettings.ACPI.SSDT.Generate.GeneratePStates = InputItems[i].BValue != 0; - } - i++; //6 - if (InputItems[i].Valid) { - gSettings.ACPI.SlpSmiEnable = InputItems[i].BValue != 0; - } - i++; //7 - if (InputItems[i].Valid) { -// DBG("InputItems[i]: %ls\n", InputItems[i].SValue); - gSettings.ACPI.SSDT.PLimitDict = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x7F); -// DBG("Item 7=PLimitDict %d\n", gSettings.ACPI.SSDT.PLimitDict); - } - i++; //8 - if (InputItems[i].Valid) { - gSettings.ACPI.SSDT.UnderVoltStep = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x3F); -// DBG("Item 8=UnderVoltStep %d\n", gSettings.ACPI.SSDT.UnderVoltStep); - } - i++; //9 - if (InputItems[i].Valid) { - gSettings.ACPI.SSDT.Generate.GenerateCStates = InputItems[i].BValue != 0; - } - i++; //10 - if (InputItems[i].Valid) { - GlobalConfig.EnableC2 = InputItems[i].BValue != 0; - } - i++; //11 - if (InputItems[i].Valid) { - GlobalConfig.EnableC4 = InputItems[i].BValue != 0; - } - i++; //12 - if (InputItems[i].Valid) { - GlobalConfig.EnableC6 = InputItems[i].BValue != 0; - } - i++; //13 - if (InputItems[i].Valid) { - gSettings.ACPI.SSDT.EnableISS = InputItems[i].BValue != 0; - } - i++; //14 - if (InputItems[i].Valid) { - gSettings.CPU.QPI = (UINT16)StrDecimalToUintn(InputItems[i].SValue.wc_str()); - DBG("applied QPI=%d\n", gSettings.CPU.QPI); - } - i++; //15 - if (InputItems[i].Valid) { - gSettings.ACPI.PatchNMI = InputItems[i].BValue != 0; - } - i++; //16 - if (InputItems[i].Valid) { - gSettings.Graphics.PatchVBios = InputItems[i].BValue != 0; - } - i++; //17 - if (InputItems[i].Valid) { - gSettings.Smbios.gPlatformFeature = (UINT64)StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied PlatformFeature=0x%llX\n", gSettings.Smbios.gPlatformFeature); - } - i++; //18 | Download-Fritz: There is no GUI element for BacklightLevel; please revise - if (InputItems[i].Valid) { - gSettings.SystemParameters.BacklightLevel = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); - gSettings.SystemParameters.BacklightLevelConfig = true; - } - i++; //19 - if (InputItems[i].Valid) { - gSettings.CPU.BusSpeed = (UINT32)StrDecimalToUintn(InputItems[i].SValue.wc_str()); - DBG("applied BusSpeed=%d\n", gSettings.CPU.BusSpeed); - } - - i = 19; - for (j = 0; j < gConf.GfxPropertiesArrayNonConst.size(); j++) { - i++; //20 - if (InputItems[i].Valid) { - gConf.GfxPropertiesArrayNonConst[j].Model = InputItems[i].SValue; - } - i++; //21 - if (InputItems[i].Valid) { - if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Ati) { - gSettings.Graphics.InjectAsDict.InjectATI = InputItems[i].BValue != 0; - } else if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Nvidia) { - gSettings.Graphics.InjectAsDict.InjectNVidia = InputItems[i].BValue != 0; - } else if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Intel) { - gSettings.Graphics.InjectAsDict.InjectIntel = InputItems[i].BValue != 0; - } - } - i++; //22 - if (InputItems[i].Valid) { - if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Ati) { - gSettings.Graphics.FBName = InputItems[i].SValue; - } else if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Nvidia) { - hex2bin(InputItems[i].SValue, (UINT8*)&gSettings.Graphics.Dcfg[0], sizeof(gSettings.Graphics.Dcfg)); - } else if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Intel) { - //ig-platform-id for Ivy+ and snb-platform-id for Sandy - GlobalConfig.IgPlatform = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied *-platform-id=0x%X\n", GlobalConfig.IgPlatform); - } - } - - if (gConf.GfxPropertiesArrayNonConst[j].Vendor == Intel) { - i += 3; + EFI_MEMORY_DESCRIPTOR *MemMap; + UINTN MemMapSize; + UINTN MapKey, DescriptorSize; + UINT32 DescriptorVersion; + EFI_STATUS Status; + + + MemMapSize = 0; + MemMap = NULL; + DescriptorSize = 0; + Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion); + if (Status != EFI_BUFFER_TOO_SMALL) { + DBG("PrintMemoryMap: GetMemStatus=%s not EFI_BUFFER_TOO_SMALL\n", efiStrError(Status)); + return; + } + MemMapSize += EFI_PAGE_SIZE; + MemMap = (EFI_MEMORY_DESCRIPTOR*)AllocatePool(MemMapSize); + + Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize, &DescriptorVersion); + if ( EFI_ERROR(Status) ) { + DBG("PrintMemoryMap: GetMemoryMap failed=%s\n", efiStrError(Status)); + return; + } + + for ( + EFI_MEMORY_DESCRIPTOR* EntryWalker = MemMap; + (UINT8 *)EntryWalker < ((UINT8 *)MemMap + MemMapSize); + EntryWalker = NEXT_MEMORY_DESCRIPTOR (EntryWalker, DescriptorSize)) + { + if (EntryWalker->Type != EfiConventionalMemory) { continue; } - i++; //23 - if (InputItems[i].Valid) { - gConf.GfxPropertiesArrayNonConst[j].Ports = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x0F); - } - i++; //24 - if (InputItems[i].Valid) { - if (gConf.GfxPropertiesArray[j].Vendor == Nvidia) { - if ( InputItems[i].SValue.notEmpty() ) { - hex2bin(InputItems[i].SValue, gSettings.Graphics.NVCAP.data(), gSettings.Graphics.NVCAP.size()); - } - } else { - gConf.GfxPropertiesArrayNonConst[j].Connectors = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - gConf.GfxPropertiesArrayNonConst[j].ConnChanged = true; - } - } - i++; //25 - if (InputItems[i].Valid) { - gConf.GfxPropertiesArrayNonConst[j].LoadVBios = InputItems[i].BValue != 0; + if ( (UINTN)EntryWalker->NumberOfPages < NumberOfPagesMax ) + { + gBS->AllocatePages(AllocateAddress, EfiBootServicesData, EntryWalker->NumberOfPages, &EntryWalker->PhysicalStart); } - } //end of Graphics Cards - // next number == 42 - - i = 44; - if (InputItems[i].Valid) { - GlobalConfig.KextPatchesAllowed = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } - i++; //45 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.EightApple = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } - i++; //46 - if (InputItems[i].Valid) { - GlobalConfig.KPAppleIntelCPUPM = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } - i++; //47 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.KPAppleRTC = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } - i++; //48 - if (InputItems[i].Valid) { - GlobalConfig.KPKernelPm = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } - i++; //49 - if (InputItems[i].Valid) { - gSettings.ACPI.FixMCFG = InputItems[i].BValue != 0; - } - - i++; //50 - if (InputItems[i].Valid) { - gSettings.Graphics.RefCLK = (UINT32)StrDecimalToUintn(InputItems[i].SValue.wc_str()); } - i++; //51 - if (InputItems[i].Valid) { - NonDetected = InputItems[i].SValue; - } + FreePool(MemMap); +} - i++; //52 - if (InputItems[i].Valid) { - gSettings.Graphics.EDID.InjectEDID = InputItems[i].BValue != 0; - } - i++; //53 - if (InputItems[i].Valid) { - gSettings.Graphics.EDID.VendorEDID = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); - } - i++; //54 - if (InputItems[i].Valid) { - gSettings.Graphics.EDID.ProductEDID = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); - } - i++; //55 - // ErmaC: NvidiaGeneric XBool(Y/N) - if (InputItems[i].Valid) { - gSettings.Graphics.NvidiaGeneric = InputItems[i].BValue != 0; - } - i++; //56 - if (InputItems[i].Valid) { - gSettings.SystemParameters.NvidiaWeb = InputItems[i].BValue != 0; - } - i++; //57 - if (InputItems[i].Valid) { - gSettings.Devices.Audio.ResetHDA = InputItems[i].BValue != 0; - } - i++; //58 - if (InputItems[i].Valid) { - gSettings.Devices.Audio.AFGLowPowerState = InputItems[i].BValue != 0; - } - i++; //59 - if (InputItems[i].Valid) { - gSettings.Devices.Audio.HDAInjection = InputItems[i].BValue != 0; - } - i++; //60 - if (InputItems[i].Valid) { - gSettings.Devices.Audio.HDALayoutId = (UINT32)(StrDecimalToUintn(InputItems[i].SValue.wc_str())); - } - i++; //61 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.KPDELLSMBIOS = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } - i++; //62 - if (InputItems[i].Valid) { - gSettings.Smbios.FirmwareFeatures = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied FirmwareFeatures=0x%X\n", gSettings.Smbios.FirmwareFeatures); - } - i++; //63 - if (InputItems[i].Valid) { - gSettings.Smbios.FirmwareFeaturesMask = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied FirmwareFeaturesMask=0x%X\n", gSettings.Smbios.FirmwareFeaturesMask); - } - i++; //64 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.KPDebug = InputItems[i].BValue != 0; - // GlobalConfig.gBootChanged = true; - } +void AllocSmallBlocks() +{ + CONST EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable; - i++; //65 - if (InputItems[i].Valid) { - XStringW& tmpStr = SmbiosList[OldChosenSmbios]; - gConf.ReloadSmbios(tmpStr); -// gConf.FillSmbiosWithDefaultValue(GlobalConfig.CurrentModel, configPlist.getSMBIOS()); +//PrintMemoryMap(); - DBG("chosen SMBIOS of %ls\n", tmpStr.wc_str()); - GlobalConfig.gBootChanged = true; - FillInputs(false); - NeedSave = false; - } - // CSR - i++; //66 - if (InputItems[i].Valid) { - gSettings.RtVariables.CsrActiveConfig = InputItems[i].IValue; - } + UINTN size = 64; + UINTN nb = 0; - i++; //67 - if (InputItems[i].Valid) { - gSettings.ACPI.DSDT.FixDsdt = InputItems[i].IValue; - } - i++; //68 - if (InputItems[i].Valid) { - GlobalConfig.OptionsBits = InputItems[i].IValue; - } - i++; //69 - if (InputItems[i].Valid) { - GlobalConfig.FlagsBits = InputItems[i].IValue; - } + AllocSmallBlocks(size); // 252KB + MemoryAttributesTable = OcGetMemoryAttributes (NULL); + nb = MemoryAttributesTable->NumberOfEntries; - i++; //70 - if (InputItems[i].Valid) { - INTN Minus = 0; - if (InputItems[i].SValue[0] == '-') { - Minus = 1; - } - gSettings.GUI.Mouse.PointerSpeed = StrDecimalToUintn(InputItems[i].SValue.data(Minus)); - if (Minus) { - gSettings.GUI.Mouse.PointerSpeed = -gSettings.GUI.Mouse.PointerSpeed; - } -// DBG("Pointer Speed=%d\n", gSettings.PointerSpeed); +//PrintMemoryMap(); + while ( size <= 2048 && nb > 100 ) { // XNU seems to handle max 128 entries. So let's shrink a little bit under 128 + size *= 2; + AllocSmallBlocks(size); + MemoryAttributesTable = OcGetMemoryAttributes (NULL); + nb = MemoryAttributesTable->NumberOfEntries; +//PrintMemoryMap(); } - i++; //71 - if (InputItems[i].Valid) { - gSettings.GUI.Mouse.DoubleClickTime = StrDecimalToUintn(InputItems[i].SValue.wc_str()); -// DBG("DoubleClickTime=%d ms\n", gSettings.DoubleClickTime); - } - i++; //72 - if (InputItems[i].Valid) { - gSettings.GUI.Mouse.PointerMirror = InputItems[i].BValue != 0; + if ( size > 2048 ) { + DBG("Cannot shrink memory map enough. Nb entries = %lld\n", nb); } +} +OC_GLOBAL_CONFIG + mOpenCoreConfiguration; - i = 74; - if (InputItems[i].Valid) { - gSettings.Devices.USB.USBFixOwnership = InputItems[i].BValue != 0; - } - i++; //75 - if (InputItems[i].Valid) { - GlobalConfig.C3Latency = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); - } +OC_STORAGE_CONTEXT + mOpenCoreStorage; - i++; //76 - if (InputItems[i].Valid) { - GlobalConfig.EnabledCores = (UINT8)StrDecimalToUintn(InputItems[i].SValue.wc_str()); - } - i++; //77 - if (InputItems[i].Valid) { - gSettings.CPU.SavingMode = (UINT8)StrDecimalToUintn(InputItems[i].SValue.wc_str()); - } +OC_CPU_INFO + mOpenCoreCpuInfo; - i++; //78 - if (InputItems[i].Valid) { - gSettings.Smbios.ProductName = InputItems[i].SValue; - // let's fill all other fields based on this ProductName - // to serve as default - Model = GetModelFromString(gSettings.Smbios.ProductName); - if (Model != MaxMacModel) { - GlobalConfig.CurrentModel = Model; - SetDMISettingsForModel(Model, &gSettings); - FillInputs(false); - } - } +UINT8 + mOpenCoreBooterHash[SHA1_DIGEST_SIZE]; - i++; //79 - if (InputItems[i].Valid) { - gSettings.Smbios.SystemVersion = InputItems[i].SValue; - } - i++; //80 - if (InputItems[i].Valid) { - gSettings.Smbios.SerialNr = InputItems[i].SValue; - } - i++; //81 - if (InputItems[i].Valid) { - gSettings.Smbios.BoardNumber = InputItems[i].SValue; - } - i++; //82 - if (InputItems[i].Valid) { - gSettings.Smbios.BoardSerialNumber = InputItems[i].SValue; - } - i++; //83 - if (InputItems[i].Valid) { - gSettings.Smbios.BoardType = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x0F); - } - i++; //84 - if (InputItems[i].Valid) { - gSettings.Smbios.BoardVersion = InputItems[i].SValue; - } - i++; //85 - if (InputItems[i].Valid) { - gSettings.Smbios.ChassisType = (UINT8)(StrDecimalToUintn(InputItems[i].SValue.wc_str()) & 0x0F); - } - i++; //86 - if (InputItems[i].Valid) { - gSettings.Smbios.BiosVersion = InputItems[i].SValue; - } - i++; //87 - if (InputItems[i].Valid) { - gSettings.Smbios.BiosReleaseDate = InputItems[i].SValue; - } +OC_RSA_PUBLIC_KEY * + mOpenCoreVaultKey; - i++; //88 - if (InputItems[i].Valid) { - gSettings.ACPI.SSDT.DoubleFirstState = InputItems[i].BValue != 0; - } - i++; //89 - if (InputItems[i].Valid) { - gSettings.ACPI.SSDT.EnableC7 = InputItems[i].BValue != 0; - } +OC_PRIVILEGE_CONTEXT + mOpenCorePrivilege; - i++; //90 - if (InputItems[i].Valid) { - gConf.ReLoadConfig(XStringW(ConfigsList[OldChosenConfig])); - // TODO: make a ReloadConfig, because in case of a reload, there are probably slightly different things to do. - GlobalConfig.gBootChanged = true; - GlobalConfig.gThemeChanged = true; - FillInputs(false); - NeedSave = false; - } - i++; //91 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.KPKernelLapic = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } - i++; //92 - if (InputItems[i].Valid) { - gSettings.Devices.USB.USBInjection = InputItems[i].BValue != 0; - } - i++; //93 - if (InputItems[i].Valid) { - gSettings.Devices.USB.InjectClockID = InputItems[i].BValue != 0; - } - i++; //94 - if (InputItems[i].Valid) { - gSettings.Devices.FakeID.FakeATI = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - } - i++; //95 - if (InputItems[i].Valid) { - gSettings.Devices.FakeID.FakeNVidia = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - } - i++; //96 - if (InputItems[i].Valid) { - gSettings.Devices.FakeID.FakeIntel = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied FakeIntel=0x%X\n", gSettings.Devices.FakeID.FakeIntel); - } - i++; //97 - if (InputItems[i].Valid) { - gSettings.Devices.FakeID.FakeLAN = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - } - i++; //98 - if (InputItems[i].Valid) { - gSettings.Devices.FakeID.FakeWIFI = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - } - i++; //99 - if (InputItems[i].Valid) { - gSettings.Devices.FakeID.FakeSATA = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - } - i++; //100 - if (InputItems[i].Valid) { - gSettings.Devices.FakeID.FakeXHCI = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - } +EFI_HANDLE + mStorageHandle; - i++; //101 - Quirks - if (InputItems[i].Valid) { - gSettings.Quirks.QuirksMask = InputItems[i].IValue; - gSettings.Quirks.OcBooterQuirks.AvoidRuntimeDefrag = ((gSettings.Quirks.QuirksMask & QUIRK_DEFRAG) != 0); //1 - gSettings.Quirks.OcBooterQuirks.DevirtualiseMmio = ((gSettings.Quirks.QuirksMask & QUIRK_MMIO) != 0); //0 - gSettings.Quirks.OcBooterQuirks.DisableSingleUser = ((gSettings.Quirks.QuirksMask & QUIRK_SU) != 0); //0 - gSettings.Quirks.OcBooterQuirks.DisableVariableWrite = ((gSettings.Quirks.QuirksMask & QUIRK_VAR) != 0); //0 - gSettings.Quirks.OcBooterQuirks.DiscardHibernateMap = ((gSettings.Quirks.QuirksMask & QUIRK_HIBER) != 0); //0 - gSettings.Quirks.OcBooterQuirks.EnableSafeModeSlide = ((gSettings.Quirks.QuirksMask & QUIRK_SAFE) != 0); //0 - gSettings.Quirks.OcBooterQuirks.EnableWriteUnprotector = ((gSettings.Quirks.QuirksMask & QUIRK_UNPROT) != 0); //1 - gSettings.Quirks.OcBooterQuirks.ForceExitBootServices = ((gSettings.Quirks.QuirksMask & QUIRK_EXIT) != 0); //0 - gSettings.Quirks.OcBooterQuirks.ProtectMemoryRegions = ((gSettings.Quirks.QuirksMask & QUIRK_REGION) != 0); //0 - gSettings.Quirks.OcBooterQuirks.ProtectSecureBoot = ((gSettings.Quirks.QuirksMask & QUIRK_SECURE) != 0); //0 - gSettings.Quirks.OcBooterQuirks.ProtectUefiServices = ((gSettings.Quirks.QuirksMask & QUIRK_UEFI) != 0); //0 - gSettings.Quirks.OcBooterQuirks.ProvideCustomSlide = ((gSettings.Quirks.QuirksMask & QUIRK_CUSTOM) != 0); //1 - gSettings.Quirks.OcBooterQuirks.RebuildAppleMemoryMap = ((gSettings.Quirks.QuirksMask & QUIRK_MAP) != 0); //0 - gSettings.Quirks.OcBooterQuirks.SetupVirtualMap = ((gSettings.Quirks.QuirksMask & QUIRK_VIRT) != 0); //1 - gSettings.Quirks.OcBooterQuirks.SignalAppleOS = ((gSettings.Quirks.QuirksMask & QUIRK_OS) != 0); //0 - gSettings.Quirks.OcBooterQuirks.SyncRuntimePermissions = ((gSettings.Quirks.QuirksMask & QUIRK_PERM) != 0); //1 - DBG("applied Quirks mask:%x\n", gSettings.Quirks.QuirksMask); //default is 0xA861 - } - i++; //102 - if (InputItems[i].Valid) { - gSettings.ACPI.DSDT.DebugDSDT = InputItems[i].BValue != 0; - } - i++; //103 - if (InputItems[i].Valid) { - gSettings.Devices.FakeID.FakeIMEI = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - } +EFI_DEVICE_PATH_PROTOCOL * + mStoragePath; - i++; //104 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.FakeCPUID = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied FakeCPUID=%06X\n", gSettings.KernelAndKextPatches.FakeCPUID); - GlobalConfig.gBootChanged = true; - } +CHAR16 * + mStorageRoot; - i++; //105 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.KPKernelXCPM = InputItems[i].BValue != 0; - DBG("applied KernelXCPM\n"); - GlobalConfig.gBootChanged = true; - } - - i++; //106 - if (InputItems[i].Valid) { - gSettings.Devices.StringInjector = InputItems[i].BValue != 0; - } - - i++; //107 - if (InputItems[i].Valid) { - gSettings.Devices.NoDefaultProperties = InputItems[i].BValue != 0; +VOID +OcMain ( + IN OC_STORAGE_CONTEXT *Storage, + IN EFI_DEVICE_PATH_PROTOCOL *LoadPath + ) +{ + EFI_STATUS Status; +// OC_PRIVILEGE_CONTEXT *Privilege; + + DEBUG ((DEBUG_INFO, "OC: OcMiscEarlyInit...\n")); + Status = OcMiscEarlyInit ( + Storage, + &mOpenCoreConfiguration, + mOpenCoreVaultKey + ); + + if (EFI_ERROR (Status)) { + return; + } + +// OcCpuScanProcessor (&mOpenCoreCpuInfo); + +// DEBUG ((DEBUG_INFO, "OC: OcLoadNvramSupport...\n")); +// OcLoadNvramSupport (Storage, &mOpenCoreConfiguration); + DEBUG ((DEBUG_INFO, "OC: OcMiscMiddleInit...\n")); + OcMiscMiddleInit ( + Storage, + &mOpenCoreConfiguration, + mStorageRoot, + LoadPath, + mStorageHandle, + mOpenCoreConfiguration.Booter.Quirks.ForceBooterSignature ? mOpenCoreBooterHash : NULL + ); + DEBUG ((DEBUG_INFO, "OC: OcLoadUefiSupport...\n")); + OcLoadUefiSupport (Storage, &mOpenCoreConfiguration, &mOpenCoreCpuInfo, mOpenCoreBooterHash); +// DEBUG_CODE_BEGIN (); +// DEBUG ((DEBUG_INFO, "OC: OcMiscLoadSystemReport...\n")); +// OcMiscLoadSystemReport (&mOpenCoreConfiguration, mStorageHandle); +// DEBUG_CODE_END (); +// DEBUG ((DEBUG_INFO, "OC: OcLoadAcpiSupport...\n")); +// OcLoadAcpiSupport (&mOpenCoreStorage, &mOpenCoreConfiguration); +// DEBUG ((DEBUG_INFO, "OC: OcLoadPlatformSupport...\n")); +// OcLoadPlatformSupport (&mOpenCoreConfiguration, &mOpenCoreCpuInfo); +// DEBUG ((DEBUG_INFO, "OC: OcLoadDevPropsSupport...\n")); +// OcLoadDevPropsSupport (&mOpenCoreConfiguration); + DEBUG ((DEBUG_INFO, "OC: OcMiscLateInit...\n")); + OcMiscLateInit (Storage, &mOpenCoreConfiguration); + DEBUG ((DEBUG_INFO, "OC: OcLoadKernelSupport...\n")); + OcLoadKernelSupport (&mOpenCoreStorage, &mOpenCoreConfiguration, &mOpenCoreCpuInfo); + + if (mOpenCoreConfiguration.Misc.Security.EnablePassword) { + mOpenCorePrivilege.CurrentLevel = OcPrivilegeUnauthorized; + mOpenCorePrivilege.Hash = mOpenCoreConfiguration.Misc.Security.PasswordHash; + mOpenCorePrivilege.Salt = OC_BLOB_GET (&mOpenCoreConfiguration.Misc.Security.PasswordSalt); + mOpenCorePrivilege.SaltSize = mOpenCoreConfiguration.Misc.Security.PasswordSalt.Size; + +// Privilege = &mOpenCorePrivilege; + } else { +// Privilege = NULL; } - i++; //108 - if (InputItems[i].Valid) { - GlobalConfig.KernelPatchesAllowed = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } + DEBUG ((DEBUG_INFO, "OC: All green, starting boot management...\n")); - i++; //109 - if (InputItems[i].Valid) { - gSettings.Graphics.DualLink = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied DualLink=%X\n", gSettings.Graphics.DualLink); - } +// OcMiscBoot ( +// &mOpenCoreStorage, +// &mOpenCoreConfiguration, +// Privilege, +// OcStartImage, +// mOpenCoreConfiguration.Uefi.Quirks.RequestBootVarRouting, +// mStorageHandle +// ); +} - i++; //110 - if (InputItems[i].Valid) { - gSettings.Graphics.NvidiaNoEFI = InputItems[i].BValue != 0; - } - i++; //111 - if (InputItems[i].Valid) { - gSettings.Graphics.NvidiaSingle = InputItems[i].BValue != 0; - } - i++; //112 - if (InputItems[i].Valid) { - gSettings.Devices.IntelMaxValue = (UINT16)StrHexToUint64(InputItems[i].SValue.wc_str()); +static EFI_STATUS LoadEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, + IN CONST XStringW& ImageTitle, + OUT UINTN *ErrorInStep, + OUT EFI_HANDLE *NewImageHandle) +{ + EFI_STATUS Status, ReturnStatus; + EFI_HANDLE ChildImageHandle = 0; + UINTN DevicePathIndex; + + DBG("Loading %ls", ImageTitle.wc_str()); + if (ErrorInStep != NULL) { + *ErrorInStep = 0; } - i++; //113 - if (InputItems[i].Valid) { - gSettings.ACPI.AutoMerge = InputItems[i].BValue != 0; + if (NewImageHandle != NULL) { + *NewImageHandle = NULL; } - i++; //114 - if (InputItems[i].Valid) { - gSettings.Graphics.RadeonDeInit = InputItems[i].BValue != 0; + + // load the image into memory + ReturnStatus = Status = EFI_NOT_FOUND; // in case the list is empty + for (DevicePathIndex = 0; DevicePaths[DevicePathIndex] != NULL; DevicePathIndex++) { + ReturnStatus = Status = gBS->LoadImage(false, self.getSelfImageHandle(), DevicePaths[DevicePathIndex], NULL, 0, &ChildImageHandle); + DBG(" status=%s", efiStrError(Status)); + if (ReturnStatus != EFI_NOT_FOUND) + break; } - i++; //115 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.BlockSkywalk = InputItems[i].BValue != 0; + XStringW ErrorInfo = SWPrintf(" while loading %ls", ImageTitle.wc_str()); + if (CheckError(Status, ErrorInfo.wc_str())) { + if (ErrorInStep != NULL) + *ErrorInStep = 1; + PauseForKey(NullXString8); + goto bailout; + }else{ + DBG("\n"); +#ifdef JIEF_DEBUG + DBG("ChildImaheHandle=%llx\n", uintptr_t(ChildImageHandle)); +#endif } - i++; //116 - if (InputItems[i].Valid) { - if (OldChosenDsdt == 0xFFFF) { - gSettings.ACPI.DSDT.DsdtName = L"BIOS.aml"_XSW; - } else { - gSettings.ACPI.DSDT.DsdtName = DsdtsList[OldChosenDsdt]; - } - } - i++; //117 - if (InputItems[i].Valid) { - gSettings.Smbios.EfiVersion = InputItems[i].SValue; - } - i++; //118 - if (InputItems[i].Valid) { - gSettings.RtVariables.BooterCfgStr = InputItems[i].SValue; - } - i++; //119 - if (InputItems[i].Valid) { - EFI_DEVICE_PATH_PROTOCOL* DevicePath = NULL; - int TmpIndex; - if (OldChosenAudio >= AudioList.size()) { -// DBG("crasy OldChosenAudio = %lld\n", OldChosenAudio); - OldChosenAudio = 0; - } - TmpIndex = OldChosenAudio & 0x2F; -// DBG("Chosen output %u:%ls_%s\n", TmpIndex, AudioList[TmpIndex].Name, -// AudioOutputNames[AudioList[TmpIndex].Device]); - - DevicePath = DevicePathFromHandle(AudioList[TmpIndex].Handle); -// DBG("choosen sound devicepath=%ls\n", DevicePathToStr(DevicePath)); - if (DevicePath != NULL) { - SetNvramVariable(L"Clover.SoundDevice", gEfiAppleBootGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - GetDevicePathSize(DevicePath), (UINT8 *)DevicePath); - SetNvramVariable(L"Clover.SoundIndex", gEfiAppleBootGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - 1, (UINT8 *)&TmpIndex); -// DBG(" sound written to nvram variables\n"); - } - } - i++; //120 - if (InputItems[i].Valid) { - DefaultAudioVolume = (UINT8)StrDecimalToUintn(InputItems[i].SValue.wc_str()); -// DBG(" set output volume to %d\n", DefaultAudioVolume); - if (DefaultAudioVolume > 100) { - // correct wrong input - DefaultAudioVolume = 90; - InputItems[i].SValue.SWPrintf("%04d", DefaultAudioVolume); - } - SetNvramVariable(L"Clover.SoundVolume", gEfiAppleBootGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - 1, &DefaultAudioVolume); - } - i++; //121 - if (InputItems[i].Valid) { - gSettings.KernelAndKextPatches.KPPanicNoKextDump = InputItems[i].BValue != 0; - GlobalConfig.gBootChanged = true; - } - i++; //122 - if (InputItems[i].Valid) { - gSettings.Quirks.OcBooterQuirks.ProvideMaxSlide = (uint8_t)StrDecimalToUintn(InputItems[i].SValue.wc_str()); - DBG(" set MaxSlide = %hhu\n", gSettings.Quirks.OcBooterQuirks.ProvideMaxSlide); - } - i++; //123 - if (InputItems[i].Valid) { - gSettings.GUI.ProvideConsoleGop = InputItems[i].BValue != 0; - DBG("applied ConsoleGopEnable=%s\n", gSettings.GUI.ProvideConsoleGop ? "Y" : "N" ); - } - i++; //124 - if (InputItems[i].Valid) { - gSettings.ACPI.FixHeaders = InputItems[i].BValue != 0; - DBG("applied gSettings.ACPI.FixHeaders=%s\n", gSettings.ACPI.FixHeaders ? "Y" : "N" ); - } - i++; //125 - if (InputItems[i].Valid) { - gSettings.Smbios.ExtendedFirmwareFeatures = StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied ExtendedFirmwareFeatures=0x%llX\n", gSettings.Smbios.ExtendedFirmwareFeatures); - } - i++; //126 - if (InputItems[i].Valid) { - gSettings.Smbios.ExtendedFirmwareFeaturesMask = StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("applied ExtendedFirmwareFeaturesMask=0x%llX\n", gSettings.Smbios.ExtendedFirmwareFeaturesMask); - } - i++; //127 - if (InputItems[i].Valid) { - INTN Minus = 0; - if (InputItems[i].SValue[0] == '-') { - Minus = 1; - } - gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars = StrDecimalToUintn(InputItems[i].SValue.data(Minus)); - if (Minus) { - gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars = -gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars; - } - DBG(" set GpuBar = %d\n", gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars); - } - i++; //128 - if (InputItems[i].Valid) { - gSettings.Quirks.OcKernelQuirks.ProvideCurrentCpuInfo = InputItems[i].BValue != 0; - DBG("applied ProvideCurrentCpuInfo=%s\n", gSettings.Quirks.OcKernelQuirks.ProvideCurrentCpuInfo ? "Y" : "N" ); - } - i++; //129 - if (InputItems[i].Valid) { - gResetSMC = InputItems[i].BValue != 0; - if (gResetSMC) { - // reset controller - if (gAppleSmc && (gAppleSmc->Signature == NON_APPLE_SMC_SIGNATURE)) { - gAppleSmc->SmcReset(gAppleSmc, 1); - DBG("SMC store is resetted\n"); - } else { - DBG("SMC protocol not found\n"); - } - gResetSMC = false; + + if (!EFI_ERROR(ReturnStatus)) { //why unload driver?! + if (NewImageHandle != NULL) { + *NewImageHandle = ChildImageHandle; } - } - i++; //130 - if (InputItems[i].Valid) { - INTN Minus = 0; - gSettings.Quirks.OcBooterQuirks.TscSyncTimeout = (decltype(gSettings.Quirks.OcBooterQuirks.TscSyncTimeout))StrDecimalToUintn(InputItems[i].SValue.data(Minus)); - DBG("set TscSyncTimeout=%d\n", gSettings.Quirks.OcBooterQuirks.TscSyncTimeout); - } - //gSettings.Smbios.SFakeCPU - i++; //131 - if (InputItems[i].Valid) { - gSettings.Smbios.SFakeCPU = (UINT32)StrHexToUint64(InputItems[i].SValue.wc_str()); - DBG("set FakeCPUID=%X\n", gSettings.Smbios.SFakeCPU); +#ifdef JIEF_DEBUG + EFI_LOADED_IMAGE_PROTOCOL* loadedBootImage = NULL; + if (!EFI_ERROR(Status = gBS->HandleProtocol(ChildImageHandle, &gEfiLoadedImageProtocolGuid, (void**)(&loadedBootImage)))) { + DBG("%ls : Image base = 0x%llx\n", ImageTitle.wc_str(), (uintptr_t)loadedBootImage->ImageBase); // Jief : Do not change this, it's used by grep to feed the debugger + }else{ + DBG("Can't get loaded image protocol\n"); + } +#endif + goto bailout; } - if (NeedSave) { - ApplySettings(); - } + // unload the image, we don't care if it works or not... + Status = gBS->UnloadImage(ChildImageHandle); +bailout: + return ReturnStatus; } -void AboutRefit(void) +static EFI_STATUS StartEFILoadedImage(IN EFI_HANDLE ChildImageHandle, + IN CONST XString8Array& LoadOptions, IN CONST XStringW& LoadOptionsPrefix, + IN CONST XStringW& ImageTitle, + OUT UINTN *ErrorInStep) { - if (AboutMenu.Entries.size() == 0) { - AboutMenu.Daylight = ThemeX->Daylight; - if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_MENU_TITLE_IMAGE)) { - AboutMenu.TitleImage = ThemeX->GetIcon(BUILTIN_ICON_FUNC_ABOUT); - } - - if ( "unknown"_XS8 != LString8(gRevisionStr) ) AboutMenu.AddMenuInfo_f("%s", gRevisionStr); - if ( "unknown"_XS8 != LString8(gFirmwareBuildDate) ) AboutMenu.AddMenuInfo_f(" Build: %s", gFirmwareBuildDate); - if ( "unknown"_XS8 != gBuildId ) AboutMenu.AddMenuInfo_f(" Build id: %s", gBuildId.c_str()); - AboutMenu.AddMenuInfo_f("%s", path_independant.c_str()); // trick to let the compiler think path_independant is used and must be kept in binary. - AboutMenu.Entries[AboutMenu.Entries.size()-1].Title.SWPrintf("%s", gBuildIdGrepTag.c_str()); - AboutMenu.Entries[AboutMenu.Entries.size()-1].Title.SWPrintf(" "); - AboutMenu.AddMenuInfo_f("Based on rEFIt (c) 2006-2010 Christoph Pfisterer"); - AboutMenu.AddMenuInfo_f("Portions Copyright (c) Intel Corporation"); - AboutMenu.AddMenuInfo_f("Developers:"); - AboutMenu.AddMenuInfo_f(" Slice, dmazar, apianti, JrCs, pene, usrsse2"); - AboutMenu.AddMenuInfo_f(" Kabyl, pcj, jadran, Blackosx, STLVNUB, ycr.ru"); - AboutMenu.AddMenuInfo_f(" FrodoKenny, skoczi, crazybirdy, Oscar09, xsmile"); - AboutMenu.AddMenuInfo_f(" cparm, rehabman, nms42, Sherlocks, Zenith432"); - AboutMenu.AddMenuInfo_f(" stinga11, TheRacerMaster, solstice, SoThOr, DF"); - AboutMenu.AddMenuInfo_f(" cecekpawon, Micky1979, Needy, joevt, ErmaC, vit9696"); - AboutMenu.AddMenuInfo_f(" ath, savvas, syscl, goodwin_c, clovy, jief_machak"); - AboutMenu.AddMenuInfo_f(" chris1111, vector_sigma, LAbyOne, Florin9doi"); - AboutMenu.AddMenuInfo_f("Package credits:"); - AboutMenu.AddMenuInfo_f(" Chameleon team, crazybirdy, JrCs, chris1111"); - AboutMenu.AddMenuInfo_f("Credits also:"); - AboutMenu.AddMenuInfo_f(" projectosx.com, applelife.ru, insanelymac.com"); - AboutMenu.AddMenuInfo_f(" "); - AboutMenu.AddMenuInfo_f("Running on:"); - AboutMenu.AddMenuInfo_f(" EFI Revision %d.%02d", - gST->Hdr.Revision >> 16, gST->Hdr.Revision & ((1 << 16) - 1)); -#if defined(MDE_CPU_IA32) - AboutMenu.AddMenuInfo_f(" Platform: i386 (32 bit)"); -#elif defined(MDE_CPU_X64) - AboutMenu.AddMenuInfo_f(" Platform: x86_64 (64 bit)"); -#elif defined(_MSC_VER) - AboutMenu.AddMenuInfo_f(" Platform: x86_64 (64 bit) VS"); -#else - AboutMenu.AddMenuInfo_f(" Platform: unknown"); -#endif - AboutMenu.AddMenuInfo_f(" Firmware: %ls rev %d.%04d", gST->FirmwareVendor, gST->FirmwareRevision >> 16, gST->FirmwareRevision & ((1 << 16) - 1)); - AboutMenu.AddMenuInfo_f(" Screen Output: %s", egScreenDescription().c_str()); - AboutMenu.GetAnime(); - AboutMenu.AddMenuEntry(&MenuEntryReturn, false); - } else if (AboutMenu.Entries.size() >= 2) { - AboutMenu.Entries[AboutMenu.Entries.size()-2].Title.SWPrintf(" Screen Output: %s", egScreenDescription().c_str()); - } + EFI_STATUS Status, ReturnStatus; + EFI_LOADED_IMAGE_PROTOCOL *ChildLoadedImage; + CHAR16 ErrorInfo[256]; - AboutMenu.RunMenu(NULL); -} + XStringW loadOptionsW; // This has to be declared here, so it's not be freed before calling StartImage -void HelpRefit(void) -{ - if (HelpMenu.Entries.size() == 0) { - HelpMenu.Daylight = ThemeX->Daylight; - if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_MENU_TITLE_IMAGE)) { - HelpMenu.TitleImage = ThemeX->GetIcon(BUILTIN_ICON_FUNC_HELP); +// DBG("Starting %ls\n", ImageTitle); + if (ErrorInStep != NULL) { + *ErrorInStep = 0; + } + ReturnStatus = Status = EFI_NOT_FOUND; // in case no image handle was specified + if (ChildImageHandle == NULL) { + if (ErrorInStep != NULL) *ErrorInStep = 1; + goto bailout; + } + + // set load options + if (!LoadOptions.isEmpty()) { + ReturnStatus = Status = gBS->HandleProtocol(ChildImageHandle, &gEfiLoadedImageProtocolGuid, (void **) &ChildLoadedImage); + if (CheckError(Status, L"while getting a LoadedImageProtocol handle")) { + if (ErrorInStep != NULL) + *ErrorInStep = 2; + goto bailout_unload; } - switch (gSettings.GUI.languageCode) - { - case russian: - HelpMenu.AddMenuInfo_f("ESC - Выход из подменю, обновление главного меню"); - HelpMenu.AddMenuInfo_f("F1 - Помощь по горячим клавишам"); - HelpMenu.AddMenuInfo_f("F2 - Сохранить отчет в preboot.log (только если FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Показать скрытые значки в меню"); - HelpMenu.AddMenuInfo_f("F4 - Родной DSDT сохранить в %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Патченный DSDT сохранить в %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Сохранить ВидеоБиос в %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Проверить звук на выбранном выходе"); - HelpMenu.AddMenuInfo_f("F8 - Сделать дамп звуковых устройств в %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Изменить разрешение экрана на одно из возможных"); - HelpMenu.AddMenuInfo_f("F10 - Снимок экрана в папку %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Извлечь указанный DVD"); - HelpMenu.AddMenuInfo_f("Пробел - Дополнительное меню запуска выбранного тома"); - HelpMenu.AddMenuInfo_f("Цифры 1-9 - Быстрый запуск тома по порядку в меню"); - HelpMenu.AddMenuInfo_f("A (About) - О загрузчике"); - HelpMenu.AddMenuInfo_f("O (Options) - Дополнительные настройки"); - HelpMenu.AddMenuInfo_f("R (Reset) - Теплый перезапуск"); - HelpMenu.AddMenuInfo_f("U (go oUt) - Завершить работу в Кловере"); - HelpMenu.AddMenuInfo_f("S (Shell) - Переход в режим командной строки"); - break; - case ukrainian: - HelpMenu.AddMenuInfo_f("ESC - Вийти з меню, оновити головне меню"); - HelpMenu.AddMenuInfo_f("F1 - Ця довідка"); - HelpMenu.AddMenuInfo_f("F2 - Зберегти preboot.log (тiльки FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Відображати приховані розділи"); - HelpMenu.AddMenuInfo_f("F4 - Зберегти OEM DSDT в %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Зберегти патчений DSDT в %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F6 - Зберегти VideoBios в %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F10 - Зберегти знімок екрану в %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Відкрити обраний диск (DVD)"); - HelpMenu.AddMenuInfo_f("Пробіл - докладніше про обраний пункт меню"); - HelpMenu.AddMenuInfo_f("Клавіші 1-9 -  клавіші пунктів меню"); - HelpMenu.AddMenuInfo_f("A - Про систему"); - HelpMenu.AddMenuInfo_f("O - Опції меню"); - HelpMenu.AddMenuInfo_f("R - Перезавантаження"); - HelpMenu.AddMenuInfo_f("U - Відключити ПК"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case spanish: - HelpMenu.AddMenuInfo_f("ESC - Salir de submenu o actualizar el menu principal"); - HelpMenu.AddMenuInfo_f("F1 - Esta Ayuda"); - HelpMenu.AddMenuInfo_f("F2 - Guardar preboot.log (Solo FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Guardar DSDT oem en %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Guardar DSDT parcheado en %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Guardar VideoBios en %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Guardar Captura de pantalla en %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Expulsar volumen seleccionado (DVD)"); - HelpMenu.AddMenuInfo_f("Espacio - Detalles acerca selected menu entry"); - HelpMenu.AddMenuInfo_f("Digitos 1-9 - Atajo a la entrada del menu"); - HelpMenu.AddMenuInfo_f("A - Menu Acerca de"); - HelpMenu.AddMenuInfo_f("O - Menu Optiones"); - HelpMenu.AddMenuInfo_f("R - Reiniciar Equipo"); - HelpMenu.AddMenuInfo_f("U - Apagar"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case portuguese: - case brasil: - HelpMenu.AddMenuInfo_f("ESC - Sai do submenu, atualiza o menu principal"); - HelpMenu.AddMenuInfo_f("F1 - Esta ajuda"); - HelpMenu.AddMenuInfo_f("F2 - Salva preboot.log (somente FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Salva oem DSDT em %ls/ACPI/origin/ (somente FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Salva DSDT corrigido em %ls/ACPI/origin/ (somente FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Salva VideoBios em %ls/misc/ (somente FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Salva screenshot em %ls/misc/ (somente FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Ejeta o volume selecionado (DVD)"); - HelpMenu.AddMenuInfo_f("Espaco - Detalhes sobre a opcao do menu selecionada"); - HelpMenu.AddMenuInfo_f("Tecle 1-9 - Atalho para as entradas do menu"); - HelpMenu.AddMenuInfo_f("A - Sobre o Menu"); - HelpMenu.AddMenuInfo_f("O - Opcoes do Menu"); - HelpMenu.AddMenuInfo_f("R - Reiniciar"); - HelpMenu.AddMenuInfo_f("U - Desligar"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case italian: - HelpMenu.AddMenuInfo_f("ESC - Esci dal submenu, Aggiorna menu principale"); - HelpMenu.AddMenuInfo_f("F1 - Aiuto"); - HelpMenu.AddMenuInfo_f("F2 - Salva il preboot.log (solo su FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Mostra volumi nascosti"); - HelpMenu.AddMenuInfo_f("F4 - Salva il DSDT oem in %ls/ACPI/origin/ (solo suFAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Salva il patched DSDT in %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Salva il VideoBios in %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Controlla il suono sull'uscita selezionata"); - HelpMenu.AddMenuInfo_f("F8 - Scarica le uscite audio in %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Cambia la risoluzione dello schermo alla prossima disponibile"); - HelpMenu.AddMenuInfo_f("F10 - Salva screenshot in %ls/misc/ (solo su FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Resetta NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Espelli il volume selezionato (DVD)"); - HelpMenu.AddMenuInfo_f("Spazio - Dettagli sul menu selezionato"); - HelpMenu.AddMenuInfo_f("Digita 1-9 - Abbreviazioni per il menu"); - HelpMenu.AddMenuInfo_f("A - Informazioni"); - HelpMenu.AddMenuInfo_f("O - Menu Opzioni"); - HelpMenu.AddMenuInfo_f("R - Riavvio"); - HelpMenu.AddMenuInfo_f("U - Spegnimento"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case german: - HelpMenu.AddMenuInfo_f("ESC - Zurueck aus Untermenue, Hauptmenue erneuern"); - HelpMenu.AddMenuInfo_f("F1 - Diese Hilfe"); - HelpMenu.AddMenuInfo_f("F2 - Sichere preboot.log (nur mit FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Sichere OEM DSDT in %ls/ACPI/origin/ (nur mit FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Sichere gepatchtes DSDT in %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Sichere VideoBios in %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Sichere Bildschirmfoto in %ls/misc/ (nur mit FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Volume auswerfen (DVD)"); - HelpMenu.AddMenuInfo_f("Leertaste - Details über den gewählten Menue Eintrag"); - HelpMenu.AddMenuInfo_f("Zahlen 1-9 - Kurzwahl zum Menue Eintrag"); - HelpMenu.AddMenuInfo_f("A - Menue Informationen"); - HelpMenu.AddMenuInfo_f("O - Menue Optionen"); - HelpMenu.AddMenuInfo_f("R - Neustart"); - HelpMenu.AddMenuInfo_f("U - Ausschalten"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case dutch: - HelpMenu.AddMenuInfo_f("ESC - Verlaat submenu, Vernieuw hoofdmenu"); - HelpMenu.AddMenuInfo_f("F1 - Onderdeel hulp"); - HelpMenu.AddMenuInfo_f("F2 - preboot.log opslaan (Alleen FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Verborgen opties weergeven"); - HelpMenu.AddMenuInfo_f("F4 - Opslaan oem DSDT in %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Opslaan gepatchte DSDT in %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Opslaan VideoBios in %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Controleer geluid op geselecteerde uitgang"); - HelpMenu.AddMenuInfo_f("F8 - Opslaan audio uitgangen in %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Wijzig schermresolutie naar eerstvolgende mogelijke modus"); - HelpMenu.AddMenuInfo_f("F10 - Opslaan schermafdruk in %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Uitwerpen geselecteerd volume (DVD)"); - HelpMenu.AddMenuInfo_f("Spatie - Details over geselecteerd menuoptie"); - HelpMenu.AddMenuInfo_f("Cijfers 1-9 - Snelkoppeling naar menuoptie"); - HelpMenu.AddMenuInfo_f("A - Menu Over"); - HelpMenu.AddMenuInfo_f("O - Menu Opties"); - HelpMenu.AddMenuInfo_f("R - Soft Reset"); - HelpMenu.AddMenuInfo_f("U - Verlaten"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case french: - HelpMenu.AddMenuInfo_f("ESC - Quitter sous-menu, Retour menu principal"); - HelpMenu.AddMenuInfo_f("F1 - Aide"); - HelpMenu.AddMenuInfo_f("F2 - Enregistrer preboot.log (FAT32 only)"); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Enregistrer oem DSDT dans %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Enregistrer DSDT modifié dans %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Enregistrer VideoBios dans %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Enregistrer la capture d'écran dans %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Ejecter le volume (DVD)"); - HelpMenu.AddMenuInfo_f("Space - Détails a propos du menu selectionné"); - HelpMenu.AddMenuInfo_f("Digits 1-9 - Raccourci vers entrée menu"); - HelpMenu.AddMenuInfo_f("A - A propos"); - HelpMenu.AddMenuInfo_f("O - Options Menu"); - HelpMenu.AddMenuInfo_f("R - Redémarrer"); - HelpMenu.AddMenuInfo_f("U - Eteindre"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case indonesian: - HelpMenu.AddMenuInfo_f("ESC - Keluar submenu, Refresh main menu"); - HelpMenu.AddMenuInfo_f("F1 - Help"); - HelpMenu.AddMenuInfo_f("F2 - Simpan preboot.log ke %ls/ACPI/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Simpan oem DSDT ke %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Simpan patched DSDT ke %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Simpan VideoBios ke %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Simpan screenshot ke %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Eject volume (DVD)"); - HelpMenu.AddMenuInfo_f("Spasi - Detail dari menu yang dipilih"); - HelpMenu.AddMenuInfo_f("Tombol 1-9 - Shortcut pilihan menu"); - HelpMenu.AddMenuInfo_f("A - About"); - HelpMenu.AddMenuInfo_f("O - Opsi"); - HelpMenu.AddMenuInfo_f("R - Soft Reset"); - HelpMenu.AddMenuInfo_f("U - Shutdown"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case polish: - HelpMenu.AddMenuInfo_f("ESC - Wyjscie z podmenu, Odswiezenie glownego menu"); - HelpMenu.AddMenuInfo_f("F1 - Pomoc"); - HelpMenu.AddMenuInfo_f("F2 - Zapis preboot.log (tylko FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Zapis DSDT do %ls/ACPI/origin/ (tylko FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Zapis poprawionego DSDT do %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Zapis BIOSu k. graficznej do %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Zapis zrzutu ekranu do %ls/misc/ (tylko FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Wysuniecie zaznaczonego dysku (tylko dla DVD)"); - HelpMenu.AddMenuInfo_f("Spacja - Informacje nt. dostepnych opcji dla zaznaczonego dysku"); - HelpMenu.AddMenuInfo_f("Znaki 1-9 - Skroty opcji dla wybranego dysku"); - HelpMenu.AddMenuInfo_f("A - Menu Informacyjne"); - HelpMenu.AddMenuInfo_f("O - Menu Opcje"); - HelpMenu.AddMenuInfo_f("R - Restart komputera"); - HelpMenu.AddMenuInfo_f("U - Wylaczenie komputera"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case croatian: - HelpMenu.AddMenuInfo_f("ESC - izlaz iz podizbornika, Osvježi glavni izbornik"); - HelpMenu.AddMenuInfo_f("F1 - Ovaj izbornik"); - HelpMenu.AddMenuInfo_f("F2 - Spremi preboot.log (samo na FAT32)"); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Spremi oem DSDT u %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Spremi patched DSDT into %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Spremi VideoBios into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Spremi screenshot into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Izbaci izabrai (DVD)"); - HelpMenu.AddMenuInfo_f("Space - Detalji o odabranom sistemu"); - HelpMenu.AddMenuInfo_f("Brojevi 1 do 9 su prečac do izbora"); - HelpMenu.AddMenuInfo_f("A - Izbornik o meni"); - HelpMenu.AddMenuInfo_f("O - Izbornik opcije"); - HelpMenu.AddMenuInfo_f("R - Restart računala"); - HelpMenu.AddMenuInfo_f("U - Isključivanje računala"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case czech: - HelpMenu.AddMenuInfo_f("ESC - Vrátit se do hlavní nabídky"); - HelpMenu.AddMenuInfo_f("F1 - Tato Nápověda"); - HelpMenu.AddMenuInfo_f("F2 - Uložit preboot.log (FAT32 only)"); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Uložit oem DSDT do %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Uložit patchnuté DSDT do %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Uložit VideoBios do %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Uložit snímek obrazovky do %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Vysunout vybranou mechaniku (DVD)"); - HelpMenu.AddMenuInfo_f("Mezerník - Podrobnosti o vybraném disku"); - HelpMenu.AddMenuInfo_f("čísla 1-9 - Klávesové zkratky pro disky"); - HelpMenu.AddMenuInfo_f("A - Menu O Programu"); - HelpMenu.AddMenuInfo_f("O - Menu Možnosti"); - HelpMenu.AddMenuInfo_f("R - Částečný restart"); - HelpMenu.AddMenuInfo_f("U - Odejít"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case korean: - HelpMenu.AddMenuInfo_f("ESC - 하위메뉴에서 나감, 메인메뉴 새로 고침"); - HelpMenu.AddMenuInfo_f("F1 - 이 도움말"); - HelpMenu.AddMenuInfo_f("F2 - preboot.log를 저장합니다. (FAT32방식에만 해당됨)"); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - oem DSDT를 %ls/ACPI/origin/에 저장합니다. (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - 패치된 DSDT를 %ls/ACPI/origin/에 저장합니다. (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - VideoBios를 %ls/misc/에 저장합니다. (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - 선택한 출력에서 사운드 확인"); - HelpMenu.AddMenuInfo_f("F8 - 오디오 코덱덤프를 %ls/misc/에 저장합니다.", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - 스크린샷을 %ls/misc/에 저장합니다. (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - NVRAM 초기화"); - HelpMenu.AddMenuInfo_f("F12 - 선택한 볼륨을 제거합니다. (DVD)"); - HelpMenu.AddMenuInfo_f("Space - 선택한 메뉴의 상세 설명"); - HelpMenu.AddMenuInfo_f("Digits 1-9 - 메뉴 단축 번호"); - HelpMenu.AddMenuInfo_f("A - 단축키 - 이 부트로더에 관하여"); - HelpMenu.AddMenuInfo_f("O - 단축키 - 부트 옵션"); - HelpMenu.AddMenuInfo_f("R - 단축키 - 리셋"); - HelpMenu.AddMenuInfo_f("U - 단축키 - 시스템 종료"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case romanian: - HelpMenu.AddMenuInfo_f("ESC - Iesire din sub-meniu, Refresh meniul principal"); - HelpMenu.AddMenuInfo_f("F1 - Ajutor"); - HelpMenu.AddMenuInfo_f("F2 - Salvare preboot.log (doar pentru FAT32)"); - HelpMenu.AddMenuInfo_f("F4 - Salvare oem DSDT in EFI/ACPI/origin/ (FAT32)"); - HelpMenu.AddMenuInfo_f("F5 - Salvare DSDT modificat in EFI/ACPI/origin/ (FAT32)"); - HelpMenu.AddMenuInfo_f("F6 - Salvare VideoBios in EFI/misc/ (FAT32)"); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resoluton to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Salvare screenshot in EFI/misc/ (FAT32)"); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Scoatere volum selectat (DVD)"); - HelpMenu.AddMenuInfo_f("Space - Detalii despre item-ul selectat"); - HelpMenu.AddMenuInfo_f("Cifre 1-9 - Scurtaturi pentru itemele meniului"); - HelpMenu.AddMenuInfo_f("A - Despre"); - HelpMenu.AddMenuInfo_f("O - Optiuni"); - HelpMenu.AddMenuInfo_f("R - Soft Reset"); - HelpMenu.AddMenuInfo_f("U - Inchidere"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case chinese: - HelpMenu.AddMenuInfo_f("ESC - 离开子菜单, 刷新主菜单"); - HelpMenu.AddMenuInfo_f("F1 - 帮助"); - HelpMenu.AddMenuInfo_f("F2 - 保存 preboot.log 到 %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F3 - 显示隐藏的启动项"); - HelpMenu.AddMenuInfo_f("F4 - 保存原始的 DSDT 到 EFI/ACPI/origin/ (FAT32)"); - HelpMenu.AddMenuInfo_f("F5 - 保存修正后的 DSDT 到 EFI/ACPI/origin/ (FAT32)"); - HelpMenu.AddMenuInfo_f("F6 - 保存 VideoBios 到 EFI/misc/ (FAT32)"); - HelpMenu.AddMenuInfo_f("F7 - 检查选中输出设备的声音"); - HelpMenu.AddMenuInfo_f("F8 - 生成声卡输出转储到 %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - 调整屏幕分辨率为下一个可用的模式"); - HelpMenu.AddMenuInfo_f("F10 - 保存截图到 EFI/misc/ (FAT32)"); - HelpMenu.AddMenuInfo_f("F11 - 重置 NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - 推出选中的卷 (DVD)"); - HelpMenu.AddMenuInfo_f("空格 - 关于选中项的详情"); - HelpMenu.AddMenuInfo_f("数字 1-9 - 菜单快捷键"); - HelpMenu.AddMenuInfo_f("A - 关于"); - HelpMenu.AddMenuInfo_f("O - 选项"); - HelpMenu.AddMenuInfo_f("R - 软复位"); - HelpMenu.AddMenuInfo_f("U - 退出"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; - case english: - default: - HelpMenu.AddMenuInfo_f("ESC - Escape from submenu, Refresh main menu"); - HelpMenu.AddMenuInfo_f("F1 - This help"); - HelpMenu.AddMenuInfo_f("F2 - Save preboot.log into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F3 - Show hidden entries"); - HelpMenu.AddMenuInfo_f("F4 - Save oem DSDT into %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F5 - Save patched DSDT into %ls/ACPI/origin/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F6 - Save VideoBios into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F7 - Check sound on selected output"); - HelpMenu.AddMenuInfo_f("F8 - Make audio outputs dump into %ls/misc/", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F9 - Switch screen resolution to next possible mode"); - HelpMenu.AddMenuInfo_f("F10 - Save screenshot into %ls/misc/ (FAT32)", self.getCloverDirFullPath4Display().wc_str()); - HelpMenu.AddMenuInfo_f("F11 - Reset NVRAM"); - HelpMenu.AddMenuInfo_f("F12 - Eject selected volume (DVD)"); - HelpMenu.AddMenuInfo_f("Space - Details about selected menu entry"); - HelpMenu.AddMenuInfo_f("Digits 1-9 - Shortcut to menu entry"); - HelpMenu.AddMenuInfo_f("A - Menu About"); - HelpMenu.AddMenuInfo_f("O - Menu Options"); - HelpMenu.AddMenuInfo_f("R - Soft Reset"); - HelpMenu.AddMenuInfo_f("U - Exit from Clover"); - HelpMenu.AddMenuInfo_f("S - Shell"); - break; + + if ( LoadOptionsPrefix.notEmpty() ) { + // NOTE: That last space is also added by the EFI shell and seems to be significant + // when passing options to Apple's boot.efi... + loadOptionsW = SWPrintf("%ls %s ", LoadOptionsPrefix.wc_str(), LoadOptions.ConcatAll(" "_XS8).c_str()); + }else{ + loadOptionsW = SWPrintf("%s ", LoadOptions.ConcatAll(" "_XS8).c_str()); // Jief : should we add a space ? Wasn't the case before big refactoring. Yes, a space required. } - HelpMenu.GetAnime(); - HelpMenu.AddMenuEntry(&MenuEntryReturn, false); + // NOTE: We also include the terminating null in the length for safety. + ChildLoadedImage->LoadOptionsSize = (UINT32)loadOptionsW.sizeInBytes() + sizeof(wchar_t); + ChildLoadedImage->LoadOptions = loadOptionsW.wc_str(); //will it be deleted after the procedure exit? Yes, if we don't copy loadOptionsW, so it'll be freed at the end of method + + DBG("start image '%ls'\n", ImageTitle.s()); + DBG("Using load options '%ls'\n", (CHAR16*)ChildLoadedImage->LoadOptions); + } + + // close open file handles + UninitRefitLib(); - HelpMenu.RunMenu(NULL); -} + // turn control over to the image + // + // Before calling the image, enable the Watchdog Timer for + // the 5 Minute period - Slice - NO! For slow driver and slow disk we need more + // + gBS->SetWatchdogTimer (600, 0x0000, 0x00, NULL); -// -// Graphics helper functions -// + ReturnStatus = Status = gBS->StartImage(ChildImageHandle, NULL, NULL); + // + // Clear the Watchdog Timer after the image returns + // + gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL); -/* - SelectionImages: - [0] SelectionBig - [2] SelectionSmall - [4] SelectionIndicator - Buttons: - [0] radio_button - [1] radio_button_selected - [2] checkbox - [3] checkbox_checked -*/ + ReinitRefitLib(); + // control returns here when the child image calls Exit() + if (ImageTitle.notEmpty()) { + snwprintf(ErrorInfo, 512, "returned from %ls", ImageTitle.s()); + } -// -// user-callable dispatcher functions -// + if (CheckError(Status, ErrorInfo)) { + if (ErrorInStep != NULL) + *ErrorInStep = 3; + } + if (!EFI_ERROR(ReturnStatus)) { //why unload driver?! + goto bailout; + } -REFIT_ABSTRACT_MENU_ENTRY* NewEntry_(REFIT_ABSTRACT_MENU_ENTRY *Entry, REFIT_MENU_SCREEN **SubScreen, ACTION AtClick, UINTN ID, const XString8& Title) -{ - Entry->Title = Title; - Entry->Image = OptionMenu.TitleImage; - Entry->AtClick = AtClick; - // create the submenu - *SubScreen = new REFIT_MENU_SCREEN; - (*SubScreen)->Title = Entry->Title; - (*SubScreen)->TitleImage = Entry->Image; - (*SubScreen)->ID = ID; - (*SubScreen)->GetAnime(); - Entry->SubScreen = *SubScreen; - return Entry; +bailout_unload: + // unload the image, we don't care if it works or not... + Status = gBS->UnloadImage(ChildImageHandle); +bailout: + return ReturnStatus; } -REFIT_MENU_ITEM_OPTIONS* newREFIT_MENU_ITEM_OPTIONS(REFIT_MENU_SCREEN **SubScreen, ACTION AtClick, UINTN ID, const XString8& Title) -{ - REFIT_MENU_ITEM_OPTIONS* Entry = new REFIT_MENU_ITEM_OPTIONS; - return NewEntry_(Entry, SubScreen, AtClick, ID, Title)->getREFIT_MENU_ITEM_OPTIONS(); -} -void ModifyTitles(REFIT_ABSTRACT_MENU_ENTRY *ChosenEntry) +static EFI_STATUS LoadEFIImage(IN EFI_DEVICE_PATH *DevicePath, + IN CONST XStringW& ImageTitle, + OUT UINTN *ErrorInStep, + OUT EFI_HANDLE *NewImageHandle) { - if (ChosenEntry->SubScreen->ID == SCREEN_DSDT) { - ChosenEntry->Title.SWPrintf("DSDT fix mask [0x%08x]->", gSettings.ACPI.DSDT.FixDsdt); - //MsgLog("@ESC: %ls\n", (*ChosenEntry)->Title); - } else if (ChosenEntry->SubScreen->ID == SCREEN_CSR) { - // CSR - ChosenEntry->Title.SWPrintf("System Integrity Protection [0x%04x]->", gSettings.RtVariables.CsrActiveConfig); - // check for the right booter flag to allow the application - // of the new System Integrity Protection configuration. - if (gSettings.RtVariables.CsrActiveConfig != 0 && gSettings.RtVariables.BooterConfig == 0) { - gSettings.RtVariables.BooterConfig = 0x28; - } -// } else if (ChosenEntry->SubScreen->ID == SCREEN_BLC) { -// ChosenEntry->Title.SWPrintf("boot_args->flags [0x%04hx]->", gSettings.RtVariables.BooterConfig); + EFI_DEVICE_PATH *DevicePaths[2]; + +#ifdef ENABLE_SECURE_BOOT + // Verify secure boot policy + if (GlobalConfig.SecureBoot && GlobalConfig.SecureBootSetupMode) { + // Only verify if in forced secure boot mode + EFI_STATUS Status = VerifySecureBootImage(DevicePath); + if (EFI_ERROR(Status)) { + return Status; + } } +#endif // ENABLE_SECURE_BOOT + + // Load the image now + DevicePaths[0] = DevicePath; + DevicePaths[1] = NULL; + return LoadEFIImageList(DevicePaths, ImageTitle, ErrorInStep, NewImageHandle); } -REFIT_ABSTRACT_MENU_ENTRY *SubMenuGraphics() -{ - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_GRAPHICS, "Graphics Injector->"_XS8); - SubScreen->AddMenuInfoLine_f("Number of VideoCard%s=%zu",((gConf.GfxPropertiesArray.size()!=1)?"s":""), gConf.GfxPropertiesArray.size()); - SubScreen->AddMenuItemInput(52, "InjectEDID", false); - SubScreen->AddMenuItemInput(53, "Fake Vendor EDID:", true); - SubScreen->AddMenuItemInput(54, "Fake Product EDID:", true); - SubScreen->AddMenuItemInput(18, "Backlight Level:", true); - SubScreen->AddMenuItemInput(112, "Intel Max Backlight:", true); //gSettings.Devices.IntelMaxValue - - - for (UINTN i = 0; i < gConf.GfxPropertiesArray.size(); i++) { - SubScreen->AddMenuInfo_f("----------------------"); - SubScreen->AddMenuInfo_f("Card DeviceID=%04hx", gConf.GfxPropertiesArray[i].DeviceID); - UINTN N = 20 + i * 6; - SubScreen->AddMenuItemInput(N, "Model:", true); - - if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { - SubScreen->AddMenuItemInput(N+1, "InjectNVidia", false); - } else if (gConf.GfxPropertiesArray[i].Vendor == Ati) { - SubScreen->AddMenuItemInput(N+1, "InjectATI", false); - } else if (gConf.GfxPropertiesArray[i].Vendor == Intel) { - SubScreen->AddMenuItemInput(N+1, "InjectIntel", false); - } else { - SubScreen->AddMenuItemInput(N+1, "InjectX3", false); - } - UINTN Ven = 97; //it can be used for non Ati, Nvidia, Intel in QEMU for example - if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { - Ven = 95; - } else if (gConf.GfxPropertiesArray[i].Vendor == Ati) { - Ven = 94; - } else if (gConf.GfxPropertiesArray[i].Vendor == Intel) { - Ven = 96; - } +static EFI_STATUS StartEFIImage(IN EFI_DEVICE_PATH *DevicePath, + IN CONST XString8Array& LoadOptions, IN CONST XStringW& LoadOptionsPrefix, + IN CONST XStringW& ImageTitle, + OUT UINTN *ErrorInStep, + OUT EFI_HANDLE *NewImageHandle) +{ + EFI_STATUS Status; + EFI_HANDLE ChildImageHandle = NULL; - if ((gConf.GfxPropertiesArray[i].Vendor == Ati) || (gConf.GfxPropertiesArray[i].Vendor == Intel)) { - SubScreen->AddMenuItemInput(109, "DualLink:", true); - } - if (gConf.GfxPropertiesArray[i].Vendor == Ati) { - SubScreen->AddMenuItemInput(114, "DeInit:", true); - } + Status = LoadEFIImage(DevicePath, ImageTitle, ErrorInStep, &ChildImageHandle); + if (!EFI_ERROR(Status)) { + Status = StartEFILoadedImage(ChildImageHandle, LoadOptions, LoadOptionsPrefix, ImageTitle, ErrorInStep); + } - SubScreen->AddMenuItemInput(Ven, "FakeID:", true); + if (NewImageHandle != NULL) { + *NewImageHandle = ChildImageHandle; + } + return Status; +} - if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { - SubScreen->AddMenuItemInput(N+2, "DisplayCFG:", true); - } else if (gConf.GfxPropertiesArray[i].Vendor == Ati) { - SubScreen->AddMenuItemInput(N+2, "FBConfig:", true); - } else /*if (gGraphics[i].Vendor == Intel)*/{ - SubScreen->AddMenuItemInput(N+2, "*-platform-id:", true); - } - // ErmaC: NvidiaGeneric entry - if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { - SubScreen->AddMenuItemInput(55, "Generic NVIDIA name", false); - SubScreen->AddMenuItemInput(110, "NVIDIA No EFI", false); - SubScreen->AddMenuItemInput(111, "NVIDIA Single", false); - SubScreen->AddMenuItemInput(56, "Use NVIDIA WEB drivers", false); +#ifdef DUMP_KERNEL_KEXT_PATCHES +void DumpKernelAndKextPatches(KERNEL_AND_KEXT_PATCHES *Patches) +{ + if (!Patches) { + DBG("Kernel and Kext Patches null pointer\n"); + return; + } + DBG("Kernel and Kext Patches at %llx:\n", (uintptr_t)Patches); + DBG("\tAllowed: %c\n", GlobalConfig.KextPatchesAllowed ? 'y' : 'n'); + DBG("\tDebug: %c\n", Patches->KPDebug ? 'y' : 'n'); +// DBG("\tKernelCpu: %c\n", Patches->KPKernelCpu ? 'y' : 'n'); + DBG("\tKernelLapic: %c\n", Patches->KPKernelLapic ? 'y' : 'n'); + DBG("\tKernelXCPM: %c\n", Patches->KPKernelXCPM ? 'y' : 'n'); + DBG("\tKernelPm: %c\n", Patches->KPKernelPm ? 'y' : 'n'); + DBG("\tAppleIntelCPUPM: %c\n", Patches->KPAppleIntelCPUPM ? 'y' : 'n'); + DBG("\tAppleRTC: %c\n", Patches->KPAppleRTC ? 'y' : 'n'); + // Dell smbios truncate fix + DBG("\tDellSMBIOSPatch: %c\n", Patches->KPDELLSMBIOS ? 'y' : 'n'); + DBG("\tFakeCPUID: 0x%X\n", Patches->FakeCPUID); + DBG("\tATIController: %s\n", Patches->KPATIConnectorsController.isEmpty() ? "(null)": Patches->KPATIConnectorsController.c_str()); + DBG("\tATIDataLength: %zu\n", Patches->KPATIConnectorsData.size()); + DBG("\t%zu Kexts to load\n", Patches->ForceKextsToLoad.size()); + if (Patches->ForceKextsToLoad.size()) { + size_t i = 0; + for (; i < Patches->ForceKextsToLoad.size(); ++i) { + DBG("\t KextToLoad[%zu]: %ls\n", i, Patches->ForceKextsToLoad[i].wc_str()); } - - if (gConf.GfxPropertiesArray[i].Vendor == Intel) { - continue; + } + DBG("\t%zu Kexts to patch\n", Patches->KextPatches.size()); + if (Patches->KextPatches.size()) { + size_t i = 0; + for (; i < Patches->KextPatches.size(); ++i) { + if (Patches->KextPatches[i].IsPlistPatch) { + DBG("\t KextPatchPlist[%zu]: %zu bytes, %s\n", i, Patches->KextPatches[i].Data.size(), Patches->KextPatches[i].Name.c_str()); + } else { + DBG("\t KextPatch[%zu]: %zu bytes, %s\n", i, Patches->KextPatches[i].Data.size(), Patches->KextPatches[i].Name.c_str()); + } } - SubScreen->AddMenuItemInput(N+3, "Ports:", true); + } +} +#endif +void LOADER_ENTRY::FilterKextPatches() +{ + if ( GlobalConfig.KextPatchesAllowed && KernelAndKextPatches.KextPatches.size() > 0 ) { + DBG("Filtering KextPatches:\n"); + for (size_t i = 0; i < KernelAndKextPatches.KextPatches.size(); i++) { + DBG(" - [%02zu]: %s :: %s :: [OS: %s | MatchOS: %s | MatchBuild: %s]", + i, + KernelAndKextPatches.KextPatches[i].Label.c_str(), + KernelAndKextPatches.KextPatches[i].IsPlistPatch ? "PlistPatch" : "BinPatch", + macOSVersion.asString().c_str(), + KernelAndKextPatches.KextPatches[i].MatchOS.notEmpty() ? KernelAndKextPatches.KextPatches[i].MatchOS.c_str() : "All", + KernelAndKextPatches.KextPatches[i].MatchBuild.notEmpty() ? KernelAndKextPatches.KextPatches[i].MatchBuild.c_str() : "All" + ); + if (!gSettings.KernelAndKextPatches.KextPatches[i].MenuItem.BValue) { + KernelAndKextPatches.KextPatches[i].MenuItem.BValue = false; + DBG(" ==> disabled by user\n"); + continue; + } + KernelAndKextPatches.KextPatches[i].MenuItem.BValue = true; + if ((BuildVersion.notEmpty()) && (KernelAndKextPatches.KextPatches[i].MatchBuild.notEmpty())) { + KernelAndKextPatches.KextPatches[i].MenuItem.BValue = KernelAndKextPatches.KextPatches[i].IsPatchEnabledByBuildNumber(BuildVersion); + DBG(" ==> %s\n", KernelAndKextPatches.KextPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); + continue; + } - if (gConf.GfxPropertiesArray[i].Vendor == Nvidia) { - SubScreen->AddMenuItemInput(N+4, "NVCAP:", true); - } else { - SubScreen->AddMenuItemInput(N+4, "Connectors:", true); - SubScreen->AddMenuItemInput(50, "RefCLK:", true); + KernelAndKextPatches.KextPatches[i].MenuItem.BValue = KernelAndKextPatches.KextPatches[i].IsPatchEnabled(macOSVersion); + DBG(" ==> %s\n", KernelAndKextPatches.KextPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); } - SubScreen->AddMenuItemInput(N+5, "Load Video Bios", false); } - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; } -// ErmaC: Audio submenu -REFIT_ABSTRACT_MENU_ENTRY *SubMenuAudio() +void LOADER_ENTRY::FilterKernelPatches() { - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - // create the entry in the main menu - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_AUDIO, "Audio tuning->"_XS8); + if ( GlobalConfig.KernelPatchesAllowed && KernelAndKextPatches.KernelPatches.notEmpty() ) { + DBG("Filtering KernelPatches:\n"); + for (size_t i = 0; i < KernelAndKextPatches.KernelPatches.size(); ++i) { + DBG(" - [%02zu]: %s :: [OS: %s | MatchOS: %s | MatchBuild: %s]", + i, + KernelAndKextPatches.KernelPatches[i].Label.c_str(), + macOSVersion.asString().c_str(), + KernelAndKextPatches.KernelPatches[i].MatchOS.notEmpty() ? KernelAndKextPatches.KernelPatches[i].MatchOS.c_str() : "All", + KernelAndKextPatches.KernelPatches[i].MatchBuild.notEmpty() ? KernelAndKextPatches.KernelPatches[i].MatchBuild.c_str() : "All" + ); + if (!gSettings.KernelAndKextPatches.KernelPatches[i].MenuItem.BValue) { + KernelAndKextPatches.KernelPatches[i].MenuItem.BValue = false; + DBG(" ==> disabled by user\n"); + continue; + } + KernelAndKextPatches.KernelPatches[i].MenuItem.BValue = true; + if ((BuildVersion.notEmpty()) && (KernelAndKextPatches.KernelPatches[i].MatchBuild.notEmpty())) { + KernelAndKextPatches.KernelPatches[i].MenuItem.BValue = KernelAndKextPatches.KernelPatches[i].IsPatchEnabledByBuildNumber(BuildVersion); + DBG(" ==> %s by build\n", KernelAndKextPatches.KernelPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); + continue; + } - // submenu description - SubScreen->AddMenuInfoLine_f("Choose options to tune the HDA devices"); - SubScreen->AddMenuInfoLine_f("Number of Audio Controller%s=%zu", ((gConf.HdaPropertiesArray.size()!=1)?"s":""), gConf.HdaPropertiesArray.size()); - for (UINTN i = 0 ; i < gConf.HdaPropertiesArray.size() ; i++) { - SubScreen->AddMenuInfoLine_f("%llu) %ls [%04hX][%04hX]", - (i+1), - gConf.HdaPropertiesArray[i].controller_name.wc_str(), - gConf.HdaPropertiesArray[i].controller_vendor_id, - gConf.HdaPropertiesArray[i].controller_device_id - ); + KernelAndKextPatches.KernelPatches[i].MenuItem.BValue = KernelAndKextPatches.KernelPatches[i].IsPatchEnabled(macOSVersion); + DBG(" ==> %s by OS\n", KernelAndKextPatches.KernelPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); + } } +} - //SubScreen->AddMenuItemInput(59, "HDAInjection", false); - if (gSettings.Devices.Audio.HDAInjection) { - SubScreen->AddMenuItemInput(60, "HDALayoutId:", true); +void LOADER_ENTRY::FilterBootPatches() +{ + if ( KernelAndKextPatches.BootPatches.notEmpty() ) { + DBG("Filtering BootPatches:\n"); + for (size_t i = 0; i < KernelAndKextPatches.BootPatches.size(); ++i) { + DBG(" - [%02zu]: %s :: [OS: %s | MatchOS: %s | MatchBuild: %s]", + i, + KernelAndKextPatches.BootPatches[i].Label.c_str(), + macOSVersion.asString().c_str(), + KernelAndKextPatches.BootPatches[i].MatchOS.notEmpty() ? KernelAndKextPatches.BootPatches[i].MatchOS.c_str() : "All", + KernelAndKextPatches.BootPatches[i].MatchBuild.notEmpty() ? KernelAndKextPatches.BootPatches[i].MatchBuild.c_str() : "All" + ); + if (!gSettings.KernelAndKextPatches.BootPatches[i].MenuItem.BValue) { + DBG(" ==> disabled by user\n"); + continue; + } + KernelAndKextPatches.BootPatches[i].MenuItem.BValue = true; + if ((BuildVersion.notEmpty()) && (KernelAndKextPatches.BootPatches[i].MatchBuild.notEmpty())) { + KernelAndKextPatches.BootPatches[i].MenuItem.BValue = KernelAndKextPatches.BootPatches[i].IsPatchEnabledByBuildNumber(BuildVersion); + DBG(" ==> %s by build\n", KernelAndKextPatches.BootPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); + continue; + } + + KernelAndKextPatches.BootPatches[i].MenuItem.BValue = KernelAndKextPatches.BootPatches[i].IsPatchEnabled(macOSVersion); + DBG(" ==> %s by OS\n", KernelAndKextPatches.BootPatches[i].MenuItem.BValue ? "allowed" : "not allowed"); + + } } +} - // avaiable configuration - SubScreen->AddMenuItemInput(57, "ResetHDA", false); - SubScreen->AddMenuItemInput(58, "AFGLowPowerState", false); - - // return - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; +// +// Null ConOut OutputString() implementation - for blocking +// text output from boot.efi when booting in graphics mode +// +EFI_STATUS EFIAPI +NullConOutOutputString(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *, IN CONST CHAR16 *) { + return EFI_SUCCESS; } -#define nya(x) x/10,x%10 -REFIT_ABSTRACT_MENU_ENTRY* SubMenuSpeedStep() +void CheckEmptyFB() { - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_CPU, "CPU tuning->"_XS8); - SubScreen->AddMenuInfoLine_f("%s", gCPUStructure.BrandString.c_str()); - SubScreen->AddMenuInfoLine_f("Model: %2X/%2X/%2X", - gCPUStructure.Family, gCPUStructure.Model, gCPUStructure.Stepping); - SubScreen->AddMenuInfoLine_f("Cores: %d Threads: %d", - gCPUStructure.Cores, gCPUStructure.Threads); - SubScreen->AddMenuInfoLine_f("FSB speed MHz: %llu", - DivU64x32(gCPUStructure.FSBFrequency, Mega)); - SubScreen->AddMenuInfoLine_f("CPU speed MHz: %llu", - DivU64x32(gCPUStructure.CPUFrequency, Mega)); - SubScreen->AddMenuInfoLine_f("Ratio: Min=%d.%d Max=%d.%d Turbo=%d.%d/%d.%d/%d.%d/%d.%d", - nya(gCPUStructure.MinRatio), nya(gCPUStructure.MaxRatio), - nya(gCPUStructure.Turbo4), nya(gCPUStructure.Turbo3), nya(gCPUStructure.Turbo2), nya(gCPUStructure.Turbo1)); - - - SubScreen->AddMenuItemInput(76, "Cores enabled:", true); - SubScreen->AddMenuItemInput(6, "Halt Enabler", false); - SubScreen->AddMenuItemInput(7, "PLimitDict:", true); - SubScreen->AddMenuItemInput(8, "UnderVoltStep:", true); - SubScreen->AddMenuItemInput(88, "DoubleFirstState", false); - SubScreen->AddMenuItemInput(5, "GeneratePStates", false); - SubScreen->AddMenuItemInput(9, "GenerateCStates", false); - SubScreen->AddMenuItemInput(10, "EnableC2", false); - SubScreen->AddMenuItemInput(11, "EnableC4", false); - SubScreen->AddMenuItemInput(12, "EnableC6", false); - SubScreen->AddMenuItemInput(89, "EnableC7", false); - SubScreen->AddMenuItemInput(13, "Use SystemIO", false); - SubScreen->AddMenuItemInput(75, "C3Latency:", true); - SubScreen->AddMenuItemInput(19, "BusSpeed [kHz]:", true); - SubScreen->AddMenuItemInput(14, "QPI [MHz]:", true); - SubScreen->AddMenuItemInput(77, "Saving Mode:", true); - SubScreen->AddMenuItemInput(15, "PatchAPIC", false); //-> move to ACPI? - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; + XBool EmptyFB = (GlobalConfig.IgPlatform == 0x00050000) || + (GlobalConfig.IgPlatform == 0x01620007) || + (GlobalConfig.IgPlatform == 0x04120004) || + (GlobalConfig.IgPlatform == 0x19120001) || + (GlobalConfig.IgPlatform == 0x59120003) || + (GlobalConfig.IgPlatform == 0x9BC80003) || + (GlobalConfig.IgPlatform == 0x3E910003); + if (EmptyFB) { + gSettings.Smbios.gPlatformFeature |= PT_FEATURE_HAS_HEADLESS_GPU; + } else { + gSettings.Smbios.gPlatformFeature &= ~PT_FEATURE_HAS_HEADLESS_GPU; + } } -REFIT_ABSTRACT_MENU_ENTRY* SubMenuKextPatches() +size_t setKextAtPos(XObjArray<SIDELOAD_KEXT>* kextArrayPtr, const XString8& kextName, size_t pos) { - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_INPUT_DIALOG *InputBootArgs; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_KEXTS, "Custom kexts patches->"_XS8); + XObjArray<SIDELOAD_KEXT>& kextArray = *kextArrayPtr; - for ( size_t Index = 0; Index < gSettings.KernelAndKextPatches.KextPatches.size(); Index++) { - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf("%90s", gSettings.KernelAndKextPatches.KextPatches[Index].Label.c_str()); -// InputBootArgs->Tag = TAG_INPUT; - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &(gSettings.KernelAndKextPatches.KextPatches[Index].MenuItem); - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); + for (size_t kextIdx = 0 ; kextIdx < kextArray.size() ; kextIdx++ ) { + if ( kextArray[kextIdx].FileName.contains(kextName) ) { + if ( pos >= kextArray.size() ) { + log_technical_bug("pos >= kextArray.size()"); + return kextArray.size() - 1 ; // If we're here, kextArray.size() is at least 1 + } + if ( pos == kextIdx ) return pos+1; + if ( pos > kextIdx ) pos -= 1; + SIDELOAD_KEXT* kextToMove = &kextArray[kextIdx]; + kextArray.RemoveWithoutFreeingAtIndex(kextIdx); + kextArray.InsertRef(kextToMove, pos, false); + return pos+1; + } } - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; + return pos; } -REFIT_ABSTRACT_MENU_ENTRY* SubMenuKextBlockInjection(const XString8& UniSysVer) +static XStringW getDriversPath() { - REFIT_MENU_ITEM_OPTIONS *Entry = NULL; - REFIT_MENU_SCREEN *SubScreen = NULL; - REFIT_INPUT_DIALOG *InputBootArgs; - - for ( size_t idx = 0 ; idx < InjectKextList.size() ; idx ++ ) { - SIDELOAD_KEXT& Kext = InjectKextList[idx]; - if ( Kext.KextDirNameUnderOEMPath == UniSysVer ) { - if ( SubScreen == NULL ) { - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_KEXT_INJECT, S8Printf("%s->", UniSysVer.c_str())); - SubScreen->AddMenuInfoLine_f("Choose/check kext to disable:"); - } - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf("%ls, v.%ls", Kext.FileName.wc_str(), Kext.Version.wc_str()); -// InputBootArgs->Tag = TAG_INPUT; - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &(Kext.MenuItem); - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - - for ( size_t idxPlugin = 0 ; idxPlugin < Kext.PlugInList.size() ; idxPlugin ++ ) { - SIDELOAD_KEXT& plugInKext = Kext.PlugInList[idxPlugin]; - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf(" |-- %ls, v.%ls", plugInKext.FileName.wc_str(), plugInKext.Version.wc_str()); - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &(plugInKext.MenuItem); - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - } - } - } - - if ( SubScreen != NULL ) SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; +#if defined(MDE_CPU_X64) + if (gFirmwareClover) { + if (FileExists(&self.getCloverDir(), L"drivers\\BIOS")) { + return L"drivers\\BIOS"_XSW; + } else { + return L"drivers64"_XSW; //backward compatibility + } + } else if (FileExists(&self.getCloverDir(), L"drivers\\5142")) { // can be excluded as obsolete + return L"drivers\\5142"_XSW; + } else if (FileExists(&self.getCloverDir(), L"drivers\\UEFI")) { + return L"drivers\\UEFI"_XSW; + } else { + return L"drivers64UEFI"_XSW; + } +#else + return L"drivers32"_XSW; +#endif } -LOADER_ENTRY* LOADER_ENTRY::SubMenuKextInjectMgmt() +#ifdef JIEF_DEBUG +void debugStartImageWithOC() { - LOADER_ENTRY *SubEntry; - REFIT_MENU_SCREEN *SubSubScreen; - - SubEntry = new LOADER_ENTRY; - NewEntry_(SubEntry, &SubSubScreen, ActionEnter, SCREEN_SYSTEM, "Block injected kexts->"_XS8); - SubEntry->Flags = Flags; - if (macOSVersion.notEmpty()) { - - XString8 OSVersionKextsDirName; // declare here to avoid multiple allocation - - { - XString8 ShortOSVersion = macOSVersion.nbElement() == 1 ? macOSVersion.asString(1) : macOSVersion.asString(macOSVersion.nbElement()-1); - SubSubScreen->AddMenuInfoLine_f("Block injected kexts for target version of macOS: %s", ShortOSVersion.c_str()); - } - - // Add kext from 10 or 11 - { - OSVersionKextsDirName = macOSVersion.asString(1); - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); - OSVersionKextsDirName.S8Catf("_%s", getSuffixForMacOsVersion(LoaderType).c_str()); - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); - } - - // Add kext from 10(or 11).{version} - { - OSVersionKextsDirName = macOSVersion.asString(2); - if ( macOSVersion.elementAt(1) == -1 ) OSVersionKextsDirName.S8Catf(".0"); - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); - OSVersionKextsDirName.S8Catf("_%s", getSuffixForMacOsVersion(LoaderType).c_str()); - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); - } - - // Add kext from : - // 10(or 1*).{version}.0 if NO minor version - // 10(or 1*).{version}.{minor version} if minor version is > 0 - if ( macOSVersion.nbElement() >= 2 ) - { - OSVersionKextsDirName = macOSVersion.asString(3); - if ( macOSVersion.elementAt(1) == -1 ) OSVersionKextsDirName.S8Catf(".0"); - if ( macOSVersion.elementAt(2) == -1 ) OSVersionKextsDirName.S8Catf(".0"); - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); - OSVersionKextsDirName.S8Catf("_%s", getSuffixForMacOsVersion(LoaderType).c_str()); - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection(OSVersionKextsDirName), true); - } - } - else { - SubSubScreen->AddMenuInfoLine_f("Block injected kexts for unknown macOS version"); - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection("Unknown"_XS8), true); - } - - XStringW kextDir; - kextDir = GetOtherKextsDir(true); - if ( kextDir.notEmpty() ) { - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection("Other"_XS8), true); - } - kextDir = GetOtherKextsDir(false); - if ( kextDir.notEmpty() ) { - SubSubScreen->AddMenuEntry(SubMenuKextBlockInjection("Off"_XS8), true); - } - - SubSubScreen->AddMenuEntry(&MenuEntryReturn, false); - return SubEntry; + MsgLog("debugStartImageWithOC\n"); + UINT64 CPUFrequencyFromART; + InternalCalculateARTFrequencyIntel(&CPUFrequencyFromART, NULL, 1); + + EFI_LOADED_IMAGE* OcLoadedImage; + EFI_STATUS Status = gBS->HandleProtocol(gImageHandle, &gEfiLoadedImageProtocolGuid, (void **) &OcLoadedImage); + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* FileSystem = OcLocateFileSystem(OcLoadedImage->DeviceHandle, OcLoadedImage->FilePath); + Status = OcStorageInitFromFs(&mOpenCoreStorage, FileSystem, NULL, NULL, self.getCloverDirFullPath().wc_str(), NULL); + + Status = ClOcReadConfigurationFile(&mOpenCoreStorage, L"config-oc.plist", &mOpenCoreConfiguration); + if ( EFI_ERROR(Status) ) panic("ClOcReadConfigurationFile"); + + mOpenCoreConfiguration.Misc.Debug.Target = 0; + OC_STRING_ASSIGN(mOpenCoreConfiguration.Misc.Boot.PickerMode, "Builtin"); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Misc.Security.DmgLoading, "Any"); + mOpenCoreConfiguration.Uefi.Quirks.IgnoreInvalidFlexRatio = 0; + + mOpenCoreConfiguration.Uefi.Quirks.TscSyncTimeout = 0; + + OcMain(&mOpenCoreStorage, NULL); + + XStringW devicePathToLookFor; +// devicePathToLookFor.takeValueFrom("PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x0,0x0,0x0)/HD(4,GPT,CA224585-830E-4274-5826-1ACB6DA08A4E,0x299F000,0x4AE6310)/VenMedia(BE74FCF7-0B7C-49F3-9147-01F4042E6842,1ABE434C8D0357398516CFDF0A9DD7EF)"); // Jief High Sierra DevicePath + devicePathToLookFor.takeValueFrom("PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x0,0x0,0x0)/HD(2,GPT,D8C7DA82-1E4C-4579-BA7C-6737A5D43464,0x64028,0x1BF08E8)"); // Jief Big Sur Install device path + UINTN HandleCount = 0; + EFI_HANDLE *Handles = NULL; + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &HandleCount, &Handles); + UINTN HandleIndex = 0; + for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) { + EFI_DEVICE_PATH_PROTOCOL* DevicePath = DevicePathFromHandle(Handles[HandleIndex]); + CHAR16* UnicodeDevicePath = ConvertDevicePathToText(DevicePath, false, false); + MsgLog("debugStartImageWithOC : path %ls\n", UnicodeDevicePath); + if ( StrCmp(devicePathToLookFor.wc_str(), UnicodeDevicePath) == 0 ) break; + } + if ( HandleIndex < HandleCount ) + { + EFI_DEVICE_PATH_PROTOCOL* jfkImagePath = FileDevicePath(Handles[HandleIndex], L"\\System\\Library\\CoreServices\\boot.efi"); + CHAR16* UnicodeDevicePath = ConvertDevicePathToText (jfkImagePath, false, false); (void)UnicodeDevicePath; + + EFI_HANDLE EntryHandle = NULL; + + // point to InternalEfiLoadImage from OC + Status = gBS->LoadImage ( + false, + gImageHandle, + jfkImagePath, + NULL, + 0, + &EntryHandle + ); + if ( EFI_ERROR(Status) ) return; // TODO message ? + + EFI_LOADED_IMAGE *LoadedImage = NULL; + EFI_STATUS OptionalStatus = gBS->HandleProtocol ( + EntryHandle, + &gEfiLoadedImageProtocolGuid, + (void **) &LoadedImage + ); + if ( EFI_ERROR(OptionalStatus) ) return; // TODO message ? + + // XStringW LoadOptionsAsXStringW = SWPrintf("%s ", LoadOptions.ConcatAll(" "_XS8).c_str()); + XStringW LoadOptionsAsXStringW = SWPrintf("boot.efi -v -no_compat_check slide=0 kext-dev-mode=1 keepsyms=1 -wegdbg igfxgl=1 bpr_probedelay=200 bpr_initialdelay=400 bpr_postresetdelay=400 "); + LoadedImage->LoadOptions = (void*)LoadOptionsAsXStringW.wc_str(); + LoadedImage->LoadOptionsSize = (UINT32)LoadOptionsAsXStringW.sizeInBytesIncludingTerminator(); + + // point to OcStartImage from OC + Status = gBS->StartImage (EntryHandle, 0, NULL); + if ( EFI_ERROR(Status) ) return; // TODO message ? + }else{ + MsgLog("debugStartImageWithOC : not found\n"); + } } +#endif - -REFIT_ABSTRACT_MENU_ENTRY* SubMenuKernelPatches() +void LOADER_ENTRY::DelegateKernelPatches() { - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_INPUT_DIALOG *InputBootArgs; + XObjArray<ABSTRACT_KEXT_OR_KERNEL_PATCH> selectedPathArray; + for (size_t kernelPatchIdx = 0 ; kernelPatchIdx < KernelAndKextPatches.KernelPatches.size() ; kernelPatchIdx++ ) + { + if ( KernelAndKextPatches.KernelPatches[kernelPatchIdx].MenuItem.BValue ) + selectedPathArray.AddReference(&KernelAndKextPatches.KernelPatches[kernelPatchIdx], false); + } + for (size_t kextPatchIdx = 0 ; kextPatchIdx < KernelAndKextPatches.KextPatches.size() ; kextPatchIdx++ ) + { + if ( KernelAndKextPatches.KextPatches[kextPatchIdx].MenuItem.BValue ) + selectedPathArray.AddReference(&KernelAndKextPatches.KextPatches[kextPatchIdx], false); + } + mOpenCoreConfiguration.Kernel.Patch.Count = (UINT32)selectedPathArray.size(); + mOpenCoreConfiguration.Kernel.Patch.AllocCount = mOpenCoreConfiguration.Kernel.Patch.Count; + mOpenCoreConfiguration.Kernel.Patch.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Kernel.Patch.Values)); + mOpenCoreConfiguration.Kernel.Patch.Values = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Patch.Values)*)malloc(mOpenCoreConfiguration.Kernel.Patch.AllocCount*sizeof(__typeof_am__(*mOpenCoreConfiguration.Kernel.Patch.Values))); + memset(mOpenCoreConfiguration.Kernel.Patch.Values, 0, mOpenCoreConfiguration.Kernel.Patch.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Patch.Values)); + + UINT32 FakeCPUID = gSettings.Smbios.SFakeCPU; + if (FakeCPUID != 0) gFakeCPUID = FakeCPUID; + DBG("Set FakeCPUID: 0x%X\n", gFakeCPUID); - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_KERNELS, "Custom kernel patches->"_XS8); + memset(mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Data, 0, sizeof(mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Data)); + memset(mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Mask, 0, sizeof(mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Mask)); + mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Data[0] = gFakeCPUID; + mOpenCoreConfiguration.Kernel.Emulate.Cpuid1Mask[0] = 0xFFFFFFFF; - for (size_t Index = 0; Index < gSettings.KernelAndKextPatches.KernelPatches.size(); Index++) { - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf("%90s", gSettings.KernelAndKextPatches.KernelPatches[Index].Label.c_str()); - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &(gSettings.KernelAndKextPatches.KernelPatches[Index].MenuItem); - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); + for (size_t kextPatchIdx = 0 ; kextPatchIdx < selectedPathArray.size() ; kextPatchIdx++ ) + { + const ABSTRACT_KEXT_OR_KERNEL_PATCH& kextPatch = selectedPathArray[kextPatchIdx]; //as well as kernel patches + DBG("Bridge %s patch to OC : %s\n", kextPatch.getName().c_str(), kextPatch.Label.c_str()); + mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Patch.Values))AllocateZeroPool(mOpenCoreConfiguration.Kernel.Patch.ValueSize); // sizeof(OC_KERNEL_ADD_ENTRY) == 680 + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Base, kextPatch.ProcedureName.c_str()); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Comment, kextPatch.Label.c_str()); + mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Count = (UINT32)kextPatch.Count; + mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Enabled = 1; + + OC_DATA_ASSIGN_N(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Find, kextPatch.Find.data(), kextPatch.Find.size()); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Identifier, kextPatch.getName().c_str()); + mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Limit = (UINT32)kextPatch.SearchLen; + OC_DATA_ASSIGN_N(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Mask, kextPatch.MaskFind.data(), kextPatch.MaskFind.size()); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->MaxKernel, ""); // it has been filtered, so we don't need to set Min and MaxKernel + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->MinKernel, ""); + OC_DATA_ASSIGN_N(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Replace, kextPatch.Replace.data(), kextPatch.Replace.size()); + OC_DATA_ASSIGN_N(mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->ReplaceMask, kextPatch.MaskReplace.data(), kextPatch.MaskReplace.size()); + mOpenCoreConfiguration.Kernel.Patch.Values[kextPatchIdx]->Skip = (UINT32)kextPatch.Skip; } - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; } -REFIT_ABSTRACT_MENU_ENTRY* SubMenuBootPatches() +void LOADER_ENTRY::StartLoader() { - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_INPUT_DIALOG *InputBootArgs; + EFI_STATUS Status; + EFI_TEXT_STRING ConOutOutputString = 0; + EFI_HANDLE ImageHandle = NULL; + EFI_LOADED_IMAGE *LoadedImage = NULL; + CONST CHAR8 *InstallerVersion; - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_BOOTER, "Custom booter patches->"_XS8); + DbgHeader("StartLoader"); - for (size_t Index = 0; Index < gSettings.KernelAndKextPatches.BootPatches.size(); Index++) { - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf("%90s", gSettings.KernelAndKextPatches.BootPatches[Index].Label.c_str()); - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &(gSettings.KernelAndKextPatches.BootPatches[Index].MenuItem); - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); + DBG("Starting %ls\n", FileDevicePathToXStringW(DevicePath).wc_str()); +#ifdef JIEF_DEBUG + displayFreeMemory("LOADER_ENTRY::StartLoader()"_XS8); +#endif +// while ( OcCountFreePages(NULL) > 300000 && AllocatePages(100) ) /*DBG("Free memory : %lld\n", OcCountFreePages(NULL))*/; +// displayFreeMemory(); + + if (Settings.notEmpty()) { + DBG(" Settings: %ls\n", Settings.wc_str()); + Status = gConf.ReLoadConfig(Settings); + if (!EFI_ERROR(Status)) { + DBG(" - found custom settings for this entry: %ls\n", Settings.wc_str()); + } else { + DBG(" - [!] LoadUserSettings failed: %s\n", efiStrError(Status)); + /* we are not sure of the state of gSettings here... try to boot anyway */ + } + } + + DBG("Finally: ExternalClock=%lluMHz BusSpeed=%llukHz CPUFreq=%uMHz", + DivU64x32(gCPUStructure.ExternalClock + Kilo - 1, Kilo), + DivU64x32(gCPUStructure.FSBFrequency + Kilo - 1, Kilo), + gCPUStructure.MaxSpeed); + if (gSettings.CPU.QPI) { + DBG(" QPI: hw.busfrequency=%lluHz\n", MultU64x32(gSettings.CPU.QPI, Mega)); + } else { + // to match the value of hw.busfrequency in the terminal + DBG(" PIS: hw.busfrequency=%lluHz\n", MultU64x32(LShiftU64(DivU64x32(gCPUStructure.ExternalClock + Kilo - 1, Kilo), 2), Mega)); } + + //Free memory + ConfigsList.setEmpty(); + DsdtsList.setEmpty(); - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; -} + OptionMenu.FreeMenu(); + //there is a place to free memory + // GuiAnime + // mainParser + // BuiltinIcons + // OSIcons -REFIT_ABSTRACT_MENU_ENTRY* SubMenuBinaries() -{ - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_BINARIES, "Binaries patching->"_XS8); - - SubScreen->AddMenuInfoLine_f("%s", gCPUStructure.BrandString.c_str()); - SubScreen->AddMenuInfoLine_f("Real CPUID: 0x%06X", gCPUStructure.Signature); - - SubScreen->AddMenuItemInput(64, "Debug", false); - SubScreen->AddMenuInfo_f("----------------------"); - SubScreen->AddMenuItemInput(104, "Fake CPUID:", true); - SubScreen->AddMenuItemInput(91, "Kernel Lapic", false); - SubScreen->AddMenuItemInput(105, "Kernel XCPM", false); - SubScreen->AddMenuItemInput(48, "Kernel PM", false); - SubScreen->AddMenuItemInput(121, "Panic No Kext Dump", false); - SubScreen->AddMenuItemInput(128, "Provide CPU Info", false); - SubScreen->AddMenuEntry(SubMenuKernelPatches(), true); - SubScreen->AddMenuInfo_f("----------------------"); - SubScreen->AddMenuItemInput(46, "AppleIntelCPUPM Patch", false); - SubScreen->AddMenuItemInput(47, "AppleRTC Patch", false); -// SubScreen->AddMenuItemInput(45, "No 8 Apples Patch", false); - SubScreen->AddMenuItemInput(61, "Dell SMBIOS Patch", false); - SubScreen->AddMenuItemInput(115, "Block SkywalkFamily", false); -// SubScreen->AddMenuItemInput(115, "No Caches", false); -// SubScreen->AddMenuItemInput(44, "Kext patching allowed", false); - SubScreen->AddMenuEntry(SubMenuKextPatches(), true); - SubScreen->AddMenuInfo_f("----------------------"); - SubScreen->AddMenuEntry(SubMenuBootPatches(), true); - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; -} + delete ThemeX; + ThemeX = NULL; -REFIT_ABSTRACT_MENU_ENTRY* SubMenuDropTables() -{ - CHAR8 sign[5]; - CHAR8 OTID[9]; - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_INPUT_DIALOG *InputBootArgs; + devprop_free_string(); - sign[4] = 0; - OTID[8] = 0; - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_TABLES, "Tables dropping->"_XS8); +#ifdef NANOSVG_MEMORY_ALLOCATION_TRACE + if ( nsvg__nbDanglingPtr() > 0 ) { + DBG("There is %zu dangling ptr from SVG subsytem\n", nsvg__nbDanglingPtr()); + nsvg__outputDanglingPtr(); + } +#endif +#ifdef JIEF_DEBUG + displayFreeMemory("LOADER_ENTRY::StartLoader() atfer ThemeX deleted"_XS8); +#endif - if (GlobalConfig.ACPIDropTables.notEmpty()) { - for ( size_t idx = 0 ; idx < GlobalConfig.ACPIDropTables.length() ; ++idx ) - { - ACPI_DROP_TABLE& DropTable = GlobalConfig.ACPIDropTables[idx]; - - CopyMem((CHAR8*)&sign, (CHAR8*)&(DropTable.Signature), 4); - CopyMem((CHAR8*)&OTID, (CHAR8*)&(DropTable.TableId), 8); - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf("Drop \"%4.4s\" \"%8.8s\" %d", sign, OTID, DropTable.Length); - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &(DropTable.MenuItem); - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - } - } + if ( OSTYPE_IS_OSX(LoaderType) || OSTYPE_IS_OSX_RECOVERY(LoaderType) || OSTYPE_IS_OSX_INSTALLER(LoaderType) ) { + + // if OC is NOT initialized with OcMain, we need the following + // OcConfigureLogProtocol ( + // 9, + // 0, + // 2151678018, + // 2147483648, + // OPEN_CORE_LOG_PREFIX_PATH, + // mOpenCoreStorage.FileSystem + // ); + // DEBUG ((DEBUG_INFO, "OC: Log initialized...\n")); + // OcAppleDebugLogInstallProtocol(0); + + DBG("Beginning OC\n"); + + EFI_LOADED_IMAGE* OcLoadedImage; + Status = gBS->HandleProtocol(gImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &OcLoadedImage); + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* FileSystem = OcLocateFileSystem(OcLoadedImage->DeviceHandle, OcLoadedImage->FilePath); + Status = OcStorageInitFromFs(&mOpenCoreStorage, FileSystem, NULL, NULL, self.getCloverDirFullPath().wc_str(), NULL); + + /* + * Define READ_FROM_OC to have mOpenCoreConfiguration initialized from config-oc.plist + * The boot should work. + * Next, comment out the next lines one by one. Once the boot failed, we got the section that + * holds the setting that makes a difference. + */ + //#define USE_OC_SECTION_Acpi + //#define USE_OC_SECTION_Booter + //#define USE_OC_SECTION_DeviceProperties + //#define USE_OC_SECTION_Kernel + //#define USE_OC_SECTION_Misc + //#define USE_OC_SECTION_Nvram + //#define USE_OC_SECTION_PlatformInfo + //#define USE_OC_SECTION_Uefi + + #if !defined(USE_OC_SECTION_Acpi) && !defined(USE_OC_SECTION_Booter) && !defined(USE_OC_SECTION_DeviceProperties) && !defined(USE_OC_SECTION_Kernel) && !defined(USE_OC_SECTION_Misc) && \ + !defined(USE_OC_SECTION_Nvram) && !defined(USE_OC_SECTION_PlatformInfo) && !defined(USE_OC_SECTION_Uefi) + + memset(&mOpenCoreConfiguration, 0, sizeof(mOpenCoreConfiguration)); +// DBG("config-oc.plist isn't used at all\n"); + + #else + Status = ClOcReadConfigurationFile(&mOpenCoreStorage, L"config-oc.plist", &mOpenCoreConfiguration); + if ( EFI_ERROR(Status) ) panic("ClOcReadConfigurationFile"); + + #ifndef USE_OC_SECTION_Acpi + memset(&mOpenCoreConfiguration.Acpi, 0, sizeof(mOpenCoreConfiguration.Acpi)); + DBG("Erase mOpenCoreConfiguration.Acpi\n"); + #else + DBG("Keep mOpenCoreConfiguration.Acpi\n"); + #endif + #ifndef USE_OC_SECTION_Booter + memset(&mOpenCoreConfiguration.Booter, 0, sizeof(mOpenCoreConfiguration.Booter)); + DBG("Erase mOpenCoreConfiguration.Booter\n"); + #else + DBG("Keep mOpenCoreConfiguration.Booter\n"); + #endif + #ifndef USE_OC_SECTION_DeviceProperties + memset(&mOpenCoreConfiguration.DeviceProperties, 0, sizeof(mOpenCoreConfiguration.DeviceProperties)); + DBG("Erase mOpenCoreConfiguration.DeviceProperties\n"); + #else + DBG("Keep mOpenCoreConfiguration.DeviceProperties\n"); + #endif + #ifndef USE_OC_SECTION_Kernel + memset(&mOpenCoreConfiguration.Kernel, 0, sizeof(mOpenCoreConfiguration.Kernel)); + DBG("Erase mOpenCoreConfiguration.Kernel\n"); + #else + DBG("Keep mOpenCoreConfiguration.Kernel\n"); + for ( size_t i = 0 ; i < mOpenCoreConfiguration.Kernel.Add.Count ; i ++ ) { + OC_KERNEL_ADD_ENTRY* entry = mOpenCoreConfiguration.Kernel.Add.Values[i]; + OC_STRING_ASSIGN(entry->BundlePath, S8Printf("Kexts\\%s", OC_BLOB_GET(&entry->BundlePath)).c_str()); + } - SubScreen->AddMenuItemInput(4, "Drop all OEM SSDT", false); - SubScreen->AddMenuItemInput(113, "Automatic smart merge", false); +// DBG("mOpenCoreConfiguration.Kernel.Add.Count=%d\n", mOpenCoreConfiguration.Kernel.Add.Count); +// for ( size_t i = 0 ; i < mOpenCoreConfiguration.Kernel.Add.Count ; i++ ) +// { +// DBG("mOpenCoreConfiguration.Kernel.Add.Values[%zd]->Identifier=%s\n", i, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[i]->Identifier)); +// DBG("mOpenCoreConfiguration.Kernel.Add.Values[%zd]->BundlePath=%s\n", i, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[i]->BundlePath)); +// DBG("mOpenCoreConfiguration.Kernel.Add.Values[%zd]->PlistPath=%s\n", i, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[i]->PlistPath)); +// } + #endif + #ifndef USE_OC_SECTION_Misc + memset(&mOpenCoreConfiguration.Misc, 0, sizeof(mOpenCoreConfiguration.Misc)); + DBG("Erase mOpenCoreConfiguration.Misc\n"); + #else + DBG("Keep mOpenCoreConfiguration.Misc\n"); + #endif + #ifndef USE_OC_SECTION_Nvram + memset(&mOpenCoreConfiguration.Nvram, 0, sizeof(mOpenCoreConfiguration.Nvram)); + DBG("Erase mOpenCoreConfiguration.Nvram\n"); + #else + DBG("Keep mOpenCoreConfiguration.Nvram\n"); + #endif + #ifndef USE_OC_SECTION_PlatformInfo + memset(&mOpenCoreConfiguration.PlatformInfo, 0, sizeof(mOpenCoreConfiguration.PlatformInfo)); + DBG("Erase mOpenCoreConfiguration.PlatformInfo\n"); + #else + DBG("Keep mOpenCoreConfiguration.PlatformInfo\n"); + #endif + #ifndef USE_OC_SECTION_Uefi + memset(&mOpenCoreConfiguration.Uefi, 0, sizeof(mOpenCoreConfiguration.Uefi)); + DBG("Erase mOpenCoreConfiguration.Uefi\n"); + #else + DBG("Keep mOpenCoreConfiguration.Uefi\n"); + // memset(&mOpenCoreConfiguration.Uefi.Apfs, 0, sizeof(mOpenCoreConfiguration.Uefi.Apfs)); + // memset(&mOpenCoreConfiguration.Uefi.Audio, 0, sizeof(mOpenCoreConfiguration.Uefi.Audio)); + // memset(&mOpenCoreConfiguration.Uefi.ConnectDrivers, 0, sizeof(mOpenCoreConfiguration.Uefi.ConnectDrivers)); + // memset(&mOpenCoreConfiguration.Uefi.Drivers, 0, sizeof(mOpenCoreConfiguration.Uefi.Drivers)); + // memset(&mOpenCoreConfiguration.Uefi.Input, 0, sizeof(mOpenCoreConfiguration.Uefi.Input)); + // memset(&mOpenCoreConfiguration.Uefi.Output, 0, sizeof(mOpenCoreConfiguration.Uefi.Output)); + // memset(&mOpenCoreConfiguration.Uefi.ProtocolOverrides, 0, sizeof(mOpenCoreConfiguration.Uefi.ProtocolOverrides)); + // memset(&mOpenCoreConfiguration.Uefi.Quirks, 0, sizeof(mOpenCoreConfiguration.Uefi.Quirks)); + // memset(&mOpenCoreConfiguration.Uefi.ReservedMemory, 0, sizeof(mOpenCoreConfiguration.Uefi.ReservedMemory)); // doesn't matter + #endif + + #endif + + + + if ( gSettings.Boot.DebugLog ) { + mOpenCoreConfiguration.Misc.Debug.AppleDebug = true; + mOpenCoreConfiguration.Misc.Debug.ApplePanic = true; + + #ifndef LESS_DEBUG + mOpenCoreConfiguration.Misc.Debug.DisplayLevel = 0x80400042; + #else + mOpenCoreConfiguration.Misc.Debug.DisplayLevel = 0x80000042; + #endif + mOpenCoreConfiguration.Misc.Debug.Target = 0x41; + } else { + #ifdef JIEF_DEBUG + egSetGraphicsModeEnabled(false); + mOpenCoreConfiguration.Misc.Debug.ApplePanic = true; + mOpenCoreConfiguration.Misc.Debug.DisplayLevel = 0x80000042; + mOpenCoreConfiguration.Misc.Debug.Target = 0x3; + #endif + } - for ( size_t idx = 0 ; idx < ACPIPatchedAML.size() ; ++idx) { - ACPI_PATCHED_AML& ACPIPatchedAMLTmp = ACPIPatchedAML[idx]; - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf("Drop \"%s\"", ACPIPatchedAMLTmp.FileName.c_str()); - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &(ACPIPatchedAMLTmp.MenuItem); - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - } + #ifndef USE_OC_SECTION_Misc + OC_STRING_ASSIGN(mOpenCoreConfiguration.Misc.Security.SecureBootModel, "Disabled"); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Misc.Security.Vault, "Optional"); + #endif + #ifdef USE_OC_SECTION_Nvram + mOpenCoreConfiguration.Nvram.WriteFlash = true; + #endif +#ifndef USE_OC_SECTION_Uefi + mOpenCoreConfiguration.Uefi.Quirks.ForceOcWriteFlash = gSettings.Quirks.OcBooterQuirks.ForceOcWriteFlash; +#endif - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; -} + #ifndef USE_OC_SECTION_Booter -REFIT_ABSTRACT_MENU_ENTRY* SubMenuSmbios() -{ - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_SMBIOS, "SMBIOS settings->"_XS8); - - SubScreen->AddMenuInfoLine_f("%s", gCPUStructure.BrandString.c_str()); - SubScreen->AddMenuInfoLine_f("%s", GlobalConfig.OEMProductFromSmbios.c_str()); - SubScreen->AddMenuInfoLine_f("with board %s", GlobalConfig.OEMBoardFromSmbios.c_str()); - - SubScreen->AddMenuItemInput(78, "Product Name:", true); - SubScreen->AddMenuItemInput(79, "Product Version:", true); - SubScreen->AddMenuItemInput(80, "Product SN:", true); - SubScreen->AddMenuItemInput(131, "Fake CPUID:", true); - SubScreen->AddMenuItemInput(81, "Board ID:", true); - SubScreen->AddMenuItemInput(82, "Board SN:", true); - SubScreen->AddMenuItemInput(83, "Board Type:", true); - SubScreen->AddMenuItemInput(84, "Board Version:", true); - SubScreen->AddMenuItemInput(85, "Chassis Type:", true); - SubScreen->AddMenuItemInput(86, "ROM Version:", true); - SubScreen->AddMenuItemInput(87, "ROM Release Date:", true); - SubScreen->AddMenuItemInput(62, "FirmwareFeatures:", true); - SubScreen->AddMenuItemInput(63, "FirmwareFeaturesMask:", true); - SubScreen->AddMenuItemInput(125, "ExtendedFirmwareFeatures:", true); - SubScreen->AddMenuItemInput(126, "ExtendedFirmwareFeaturesMask:", true); - SubScreen->AddMenuItemInput(17, "PlatformFeature:", true); - SubScreen->AddMenuItemInput(117, "EFI Version:", true); - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; + mOpenCoreConfiguration.Booter.MmioWhitelist.Count = (UINT32)gSettings.Quirks.mmioWhiteListArray.size(); + mOpenCoreConfiguration.Booter.MmioWhitelist.AllocCount = mOpenCoreConfiguration.Booter.MmioWhitelist.Count; + mOpenCoreConfiguration.Booter.MmioWhitelist.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Booter.MmioWhitelist.Values)); // sizeof(OC_KERNEL_ADD_ENTRY) == 680 + if ( mOpenCoreConfiguration.Booter.MmioWhitelist.Count > 0 ) { + mOpenCoreConfiguration.Booter.MmioWhitelist.Values = (OC_BOOTER_WL_ENTRY**)AllocatePool(mOpenCoreConfiguration.Booter.MmioWhitelist.AllocCount * sizeof(*mOpenCoreConfiguration.Booter.MmioWhitelist.Values)); // sizeof(OC_KERNEL_ADD_ENTRY) == 680 + } else { + mOpenCoreConfiguration.Booter.MmioWhitelist.Values = NULL; + } + for ( size_t idx = 0 ; idx < gSettings.Quirks.mmioWhiteListArray.size() ; idx++ ) { + const SETTINGS_DATA::QuirksClass::MMIOWhiteList& entry = gSettings.Quirks.mmioWhiteListArray[idx]; + DBG("Bridge mmioWhiteList[%zu] to OC : comment=%s\n", idx, entry.comment.c_str()); + mOpenCoreConfiguration.Booter.MmioWhitelist.Values[idx] = (__typeof_am__(*mOpenCoreConfiguration.Booter.MmioWhitelist.Values))AllocatePool(mOpenCoreConfiguration.Booter.MmioWhitelist.ValueSize); + mOpenCoreConfiguration.Booter.MmioWhitelist.Values[idx]->Address = entry.address; + OC_STRING_ASSIGN(mOpenCoreConfiguration.Booter.MmioWhitelist.Values[idx]->Comment, entry.comment.c_str()); + mOpenCoreConfiguration.Booter.MmioWhitelist.Values[idx]->Enabled = entry.enabled; + } + + // It's possible to memcpy the whole struct instead of assigning individual member. But that would be relying on internel C++ binary structure, + // and worse, if a field is added by OC, everything could be shifted. + memset(&mOpenCoreConfiguration.Booter.Quirks, 0, sizeof(mOpenCoreConfiguration.Booter.Quirks)); + mOpenCoreConfiguration.Booter.Quirks.AvoidRuntimeDefrag = gSettings.Quirks.OcBooterQuirks.AvoidRuntimeDefrag; + mOpenCoreConfiguration.Booter.Quirks.DevirtualiseMmio = gSettings.Quirks.OcBooterQuirks.DevirtualiseMmio; + mOpenCoreConfiguration.Booter.Quirks.DisableSingleUser = gSettings.Quirks.OcBooterQuirks.DisableSingleUser; + mOpenCoreConfiguration.Booter.Quirks.DisableVariableWrite = gSettings.Quirks.OcBooterQuirks.DisableVariableWrite; + mOpenCoreConfiguration.Booter.Quirks.DiscardHibernateMap = gSettings.Quirks.OcBooterQuirks.DiscardHibernateMap; + mOpenCoreConfiguration.Booter.Quirks.EnableSafeModeSlide = gSettings.Quirks.OcBooterQuirks.EnableSafeModeSlide; + mOpenCoreConfiguration.Booter.Quirks.EnableWriteUnprotector = gSettings.Quirks.OcBooterQuirks.EnableWriteUnprotector; + mOpenCoreConfiguration.Booter.Quirks.ForceExitBootServices = gSettings.Quirks.OcBooterQuirks.ForceExitBootServices; + mOpenCoreConfiguration.Booter.Quirks.ProtectMemoryRegions = gSettings.Quirks.OcBooterQuirks.ProtectMemoryRegions; + mOpenCoreConfiguration.Booter.Quirks.ProtectSecureBoot = gSettings.Quirks.OcBooterQuirks.ProtectSecureBoot; + mOpenCoreConfiguration.Booter.Quirks.ProtectUefiServices = gSettings.Quirks.OcBooterQuirks.ProtectUefiServices; + mOpenCoreConfiguration.Booter.Quirks.ProvideCustomSlide = gSettings.Quirks.OcBooterQuirks.ProvideCustomSlide; + mOpenCoreConfiguration.Booter.Quirks.ProvideMaxSlide = gSettings.Quirks.OcBooterQuirks.ProvideMaxSlide; + mOpenCoreConfiguration.Booter.Quirks.RebuildAppleMemoryMap = gSettings.Quirks.OcBooterQuirks.RebuildAppleMemoryMap; + mOpenCoreConfiguration.Booter.Quirks.ResizeAppleGpuBars = gSettings.Quirks.OcBooterQuirks.ResizeAppleGpuBars; + mOpenCoreConfiguration.Booter.Quirks.SetupVirtualMap = gSettings.Quirks.OcBooterQuirks.SetupVirtualMap; + mOpenCoreConfiguration.Booter.Quirks.SignalAppleOS = false; //gSettings.Quirks.OcBooterQuirks.SignalAppleOS; + mOpenCoreConfiguration.Booter.Quirks.SyncRuntimePermissions = gSettings.Quirks.OcBooterQuirks.SyncRuntimePermissions; + + + #endif + + + FillOCCpuInfo(&mOpenCoreCpuInfo); + + mOpenCoreConfiguration.Uefi.Quirks.TscSyncTimeout = gSettings.Quirks.OcBooterQuirks.TscSyncTimeout; + + #ifndef USE_OC_SECTION_Kernel + + XObjArray<SIDELOAD_KEXT> kextArray; + if (!DoHibernateWake) { + AddKextsInArray(&kextArray); + } + + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Scheme.KernelArch, "x86_64"); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Scheme.KernelCache, gSettings.Quirks.OcKernelCache.c_str()); + mOpenCoreConfiguration.Kernel.Scheme.FuzzyMatch = gSettings.Quirks.FuzzyMatch; + + memset(&mOpenCoreConfiguration.Kernel.Quirks, 0, sizeof(mOpenCoreConfiguration.Kernel.Quirks)); + + mOpenCoreConfiguration.Kernel.Quirks.SetApfsTrimTimeout = -1; // Jief: Slice modified OcConfigurationLib.h to set -1 by default instead of 999. I prefer the modification here to minimize commits in OC submodule. Makes it easier to upgrade submodule. + mOpenCoreConfiguration.Kernel.Quirks.AppleCpuPmCfgLock = GlobalConfig.KPAppleIntelCPUPM || GlobalConfig.NeedPMfix ; + mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmCfgLock = GlobalConfig.KPKernelPm || GlobalConfig.NeedPMfix ; + + mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmExtraMsrs = gSettings.Quirks.OcKernelQuirks.AppleXcpmExtraMsrs; + mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmForceBoost = gSettings.Quirks.OcKernelQuirks.AppleXcpmForceBoost; + #ifndef USE_OC_SECTION_PlatformInfo + mOpenCoreConfiguration.Kernel.Quirks.CustomSmbiosGuid = gSettings.KernelAndKextPatches.KPDELLSMBIOS; + #endif + mOpenCoreConfiguration.Kernel.Quirks.DisableIoMapper = gSettings.Quirks.OcKernelQuirks.DisableIoMapper; + mOpenCoreConfiguration.Kernel.Quirks.DisableLinkeditJettison = gSettings.Quirks.OcKernelQuirks.DisableLinkeditJettison; + mOpenCoreConfiguration.Kernel.Quirks.DisableRtcChecksum = gSettings.KernelAndKextPatches.KPAppleRTC; + mOpenCoreConfiguration.Kernel.Emulate.DummyPowerManagement = gSettings.Quirks.OcKernelQuirks.DummyPowerManagement; + mOpenCoreConfiguration.Kernel.Quirks.ExtendBTFeatureFlags = gSettings.Quirks.OcKernelQuirks.ExtendBTFeatureFlags; + mOpenCoreConfiguration.Kernel.Quirks.ExternalDiskIcons = gSettings.Quirks.OcKernelQuirks.ExternalDiskIcons; + mOpenCoreConfiguration.Kernel.Quirks.IncreasePciBarSize = gSettings.Quirks.OcKernelQuirks.IncreasePciBarSize; + mOpenCoreConfiguration.Kernel.Quirks.ForceAquantiaEthernet = gSettings.Quirks.OcKernelQuirks.ForceAquantiaEthernet; + mOpenCoreConfiguration.Kernel.Quirks.LapicKernelPanic = gSettings.KernelAndKextPatches.KPKernelLapic; + mOpenCoreConfiguration.Kernel.Quirks.PanicNoKextDump = gSettings.KernelAndKextPatches.KPPanicNoKextDump; + mOpenCoreConfiguration.Kernel.Quirks.PowerTimeoutKernelPanic = gSettings.Quirks.OcKernelQuirks.PowerTimeoutKernelPanic; + mOpenCoreConfiguration.Kernel.Quirks.ThirdPartyDrives = gSettings.Quirks.OcKernelQuirks.ThirdPartyDrives; + mOpenCoreConfiguration.Kernel.Quirks.XhciPortLimit = gSettings.Quirks.OcKernelQuirks.XhciPortLimit; + mOpenCoreConfiguration.Kernel.Quirks.ProvideCurrentCpuInfo = gSettings.Quirks.OcKernelQuirks.ProvideCurrentCpuInfo; + + mOpenCoreConfiguration.Kernel.Add.Count = (UINT32)kextArray.size(); + mOpenCoreConfiguration.Kernel.Add.AllocCount = mOpenCoreConfiguration.Kernel.Add.Count; + mOpenCoreConfiguration.Kernel.Add.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Kernel.Add.Values)); // sizeof(OC_KERNEL_ADD_ENTRY) == 680 + mOpenCoreConfiguration.Kernel.Add.Values = (OC_KERNEL_ADD_ENTRY**)malloc(mOpenCoreConfiguration.Kernel.Add.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Add.Values)); // sizeof(OC_KERNEL_ADD_ENTRY*) == sizeof(ptr) + memset(mOpenCoreConfiguration.Kernel.Add.Values, 0, mOpenCoreConfiguration.Kernel.Add.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Add.Values)); + + // Seems that Lilu must be first. + size_t pos = setKextAtPos(&kextArray, "Lilu.kext"_XS8, 0); + pos = setKextAtPos(&kextArray, "VirtualSMC.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "FakeSMC.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "WhateverGreen.kext"_XS8, pos); +// pos = setKextAtPos(&kextArray, "AppleMCEReporterDisabler.kext"_XS8, pos); +// pos = setKextAtPos(&kextArray, "AppleIntelI210Ethernet.kext"_XS8, pos); +// pos = setKextAtPos(&kextArray, "USBWakeFixup.kext"_XS8, pos); +// pos = setKextAtPos(&kextArray, "FeatureUnlock.kext"_XS8, pos); +// pos = setKextAtPos(&kextArray, "vecLib.kext"_XS8, pos); +// pos = setKextAtPos(&kextArray, "IOAudioFamily.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "IOSkywalkFamily.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "FakePCIID.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "FakePCIID_XHCIMux.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "AMDRyzenCPUPowerManagement.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "SMCAMDProcessor.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "AppleALC.kext"_XS8, pos); +// pos = setKextAtPos(&kextArray, "IntelMausi.kext"_XS8, pos); // not needed special order? + pos = setKextAtPos(&kextArray, "SMCProcessor.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "USBPorts.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "VoodooGPIO.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "VoodooI2CServices.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "VoodooI2C.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "VoodooI2CHID.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "VoodooSMBus.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "VoodooRMI.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "BrcmFirmwareData.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "BrcmPatchRAM2.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "BrcmPatchRAM3.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "IO80211FamilyLegacy.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "AirPortBrcmNIC.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "HS80211Family.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "corecaptureElCap.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "IO80211ElCap.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "AirPortAtheros40.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "SMCProcessorAMD.kext"_XS8, pos); + pos = setKextAtPos(&kextArray, "SMCSuperIO.kext"_XS8, pos); + + for (size_t kextIdx = 0 ; kextIdx < kextArray.size() ; kextIdx++ ) { + const SIDELOAD_KEXT& KextEntry = kextArray[kextIdx]; + DBG("Bridge kext to OC : Path=%ls\\%ls\n", KextEntry.KextDirNameUnderOEMPath.wc_str(), KextEntry.FileName.wc_str()); + mOpenCoreConfiguration.Kernel.Add.Values[kextIdx] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Add.Values))malloc(mOpenCoreConfiguration.Kernel.Add.ValueSize); + memset(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx], 0, mOpenCoreConfiguration.Kernel.Add.ValueSize); + mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Enabled = 1; + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Comment, ""); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->MaxKernel, ""); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->MinKernel, ""); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Identifier, ""); + + assert( selfOem.isKextsDirFound() ); // be sure before calling getKextsPathRelToSelfDir() + XStringW dirPath = SWPrintf("%ls\\%ls", selfOem.getKextsDirPathRelToSelfDir().wc_str(), KextEntry.KextDirNameUnderOEMPath.wc_str()); + + XString8 bundleFullPath = S8Printf("%ls\\%ls", dirPath.wc_str(), KextEntry.FileName.wc_str()); + if ( FileExists(&self.getCloverDir(), bundleFullPath) ) { + XString8 bundlePathUnderKextsDir = S8Printf("%ls\\%ls", KextEntry.KextDirNameUnderOEMPath.wc_str(), KextEntry.FileName.wc_str()); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath, bundlePathUnderKextsDir.c_str()); + // DBG("OC BundlePath = '%s'\n", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath)); + } else { + DBG("Cannot find kext bundlePath at '%s'\n", bundleFullPath.c_str()); + } + #if 1 + //CFBundleExecutable + XBool NoContents = false; + XStringW infoPlistPathRelToSelf = getKextPlist(&self.getCloverDir(), dirPath, KextEntry.FileName, &NoContents); //it will be fullPath, including dir + + // XBool inject = checkOSBundleRequired(dict); + XBool inject = true; + if (inject) { + if ( infoPlistPathRelToSelf.notEmpty()) { + if (NoContents) { + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistPath, "Info.plist"); + } else { + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistPath, "Contents\\Info.plist"); + } + // DBG("OC PlistPath = '%s'\n", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistPath)); + } else { + DBG("Cannot find kext info.plist at '%ls'\n", KextEntry.FileName.wc_str()); + } + TagDict* dict = getInfoPlist(&self.getCloverDir(), infoPlistPathRelToSelf); + XString8 execpath = getKextExecPath(&self.getCloverDir(), KextEntry.KextDirNameUnderOEMPath, KextEntry.FileName, dict, NoContents); + if (execpath.notEmpty()) { + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ExecutablePath, execpath.c_str()); + // DBG("OC ExecutablePath = '%s'\n", execpath.c_str()); + } + if ( dict ) dict->ReleaseTag(); + } + + #else + XStringW execpath = S8Printf("Contents\\MacOS\\%ls", KextEntry.FileName.subString(0, KextEntry.FileName.rindexOf(".")).wc_str()); + XStringW fullPath = SWPrintf("%s\\%ls", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath), execpath.wc_str()); + if ( FileExists(&self.getCloverDir(), fullPath) ) { + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ExecutablePath, S8Printf("Contents\\MacOS\\%ls", KextEntry.FileName.subString(0, KextEntry.FileName.rindexOf(".")).wc_str()).c_str()); + } + XStringW infoPlistPathRelToSelf = SWPrintf("%s\\Contents\\Info.plist", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath)); + if (FileExists(&self.getCloverDir(), infoPlistPathRelToSelf)) { + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistPath, "Contents/Info.plist"); // TODO : is always Contents/Info.plist ? + } else { + DBG("Cannot find kext info.plist at '%ls'\n", infoPlistPathRelToSelf.wc_str()); + } + #endif + mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ImageData = NULL; + mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ImageDataSize = 0; + mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistData = NULL; + mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistDataSize = 0; + + } // for (size_t kextIdx + + + mOpenCoreConfiguration.Kernel.Force.Count = (UINT32)KernelAndKextPatches.ForceKextsToLoad.size(); + mOpenCoreConfiguration.Kernel.Force.AllocCount = mOpenCoreConfiguration.Kernel.Force.Count; + mOpenCoreConfiguration.Kernel.Force.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Kernel.Force.Values)); // sizeof(OC_KERNEL_FORCE_ENTRY) + int valuesSize = mOpenCoreConfiguration.Kernel.Force.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Force.Values); + mOpenCoreConfiguration.Kernel.Force.Values = (OC_KERNEL_ADD_ENTRY**)malloc(valuesSize); // sizeof(OC_KERNEL_FORCE_ENTRY*) == sizeof(ptr) + memset(mOpenCoreConfiguration.Kernel.Force.Values, 0, valuesSize); + + + + for (size_t kextIdx = 0; kextIdx < KernelAndKextPatches.ForceKextsToLoad.size(); kextIdx++) { + const XStringW& forceKext = KernelAndKextPatches.ForceKextsToLoad[kextIdx]; + + DBG("Force kext to OC : Path=%ls\n", forceKext.wc_str()); + mOpenCoreConfiguration.Kernel.Force.Values[kextIdx] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Force.Values))malloc(mOpenCoreConfiguration.Kernel.Force.ValueSize); + memset(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx], 0, mOpenCoreConfiguration.Kernel.Force.ValueSize); + mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Enabled = 1; + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Comment, ""); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->MaxKernel, ""); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->MinKernel, ""); + // OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Identifier, ""); + + mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ImageData = NULL; + mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ImageDataSize = 0; + mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->PlistData = NULL; + mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->PlistDataSize = 0; + + REFIT_VOLUME * SystemVolume = Volume; + EFI_FILE* SysRoot = Volume->RootDir; + + + if (Volume->ApfsRole == APPLE_APFS_VOLUME_ROLE_PREBOOT) { + //search for other partition + DBG("boot from Preboot, index=%llu\n", Volume->Index); + size_t numbers = Volumes.size(); + size_t sysIndex = 0; + for (sysIndex=Volume->Index+1; sysIndex < numbers; sysIndex++) { + SystemVolume = &Volumes[sysIndex]; + SysRoot = SystemVolume->RootDir; + + DBG("test volume %zd, name %ls:\n", sysIndex, SystemVolume->VolName.wc_str()); + + if (FileExists(SysRoot, L"\\System\\Library\\CoreServices\\boot.efi")) { + DBG("boot.efi found on %zd\n", sysIndex); + } + REFIT_DIR_ITER DirIter; + EFI_FILE_INFO *DirEntry = NULL; + DirIterOpen(SysRoot, L"\\System\\Library\\Extensions\\AMDSupport.kext\\Contents\\MacOS\\", &DirIter); + while (DirIterNext(&DirIter, 1, L"*", &DirEntry)) { + if (DirEntry->FileName[0] == '.') { + DBG("Skip dot entries: %ls\n", DirEntry->FileName); + continue; + } + DBG("%ls attr=%llu\n", DirEntry->FileName, DirEntry->Attribute); + } + DirIterClose(&DirIter); + if (FileExists(SysRoot, L"\\System\\Library\\Extensions\\AMDSupport.kext\\Contents\\MacOS\\AMDSupport")) { + DBG("AMDSupport found on %zd\n", sysIndex); //never found + break; + } + } + } + mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ImageData = (UINT8*)SysRoot; + + size_t i1 = forceKext.rindexOf("\\") + 1; + size_t i2 = forceKext.rindexOf("."); + XStringW identifier = forceKext.subString(i1, i2 - i1); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Identifier, S8Printf("%ls", identifier.wc_str()).c_str()); + + XString8 execpath = S8Printf("Contents\\MacOS\\%ls", identifier.wc_str()); + DBG("calculated execpath=%s\n", execpath.c_str()); + + + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->BundlePath, S8Printf("%ls",forceKext.wc_str()).c_str()); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->PlistPath, "Contents\\Info.plist"); + + //then we have to find executablePath and plistPath + DBG("bundle path=%s\n", mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->BundlePath.Value); + + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ExecutablePath, execpath.c_str()); + DBG("assign executable as '%s'\n", mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->ExecutablePath.Value); + + } + if (gSettings.KernelAndKextPatches.BlockSkywalk) { + mOpenCoreConfiguration.Kernel.Block.Count = 1; + mOpenCoreConfiguration.Kernel.Block.AllocCount = 1; + mOpenCoreConfiguration.Kernel.Block.ValueSize = sizeof(__typeof_am__(**mOpenCoreConfiguration.Kernel.Block.Values)); + valuesSize = mOpenCoreConfiguration.Kernel.Block.AllocCount*sizeof(*mOpenCoreConfiguration.Kernel.Block.Values); + mOpenCoreConfiguration.Kernel.Block.Values = (OC_KERNEL_BLOCK_ENTRY**)malloc(valuesSize); + + memset(mOpenCoreConfiguration.Kernel.Block.Values, 0, valuesSize); + + mOpenCoreConfiguration.Kernel.Block.Values[0] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Block.Values))malloc(mOpenCoreConfiguration.Kernel.Block.ValueSize); + memset(mOpenCoreConfiguration.Kernel.Block.Values[0], 0, mOpenCoreConfiguration.Kernel.Block.ValueSize); + mOpenCoreConfiguration.Kernel.Block.Values[0]->Enabled = 1; + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->Comment, "Allow IOSkywalk Downgrade"); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->MaxKernel, ""); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->MinKernel, "23"); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->Identifier, "com.apple.iokit.IOSkywalkFamily"); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[0]->Strategy, "Exclude"); + +// mOpenCoreConfiguration.Kernel.Block.Values[1] = (__typeof_am__(*mOpenCoreConfiguration.Kernel.Block.Values))malloc(mOpenCoreConfiguration.Kernel.Block.ValueSize); +// memset(mOpenCoreConfiguration.Kernel.Block.Values[1], 0, mOpenCoreConfiguration.Kernel.Block.ValueSize); +// mOpenCoreConfiguration.Kernel.Block.Values[1]->Enabled = 1; +// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->Arch, OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Scheme.KernelArch)); +// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->Comment, ""); +// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->MaxKernel, ""); +// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->MinKernel, "23"); +// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->Identifier, "com.apple.driver.mDNSOffloadUserClient"); +// OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Block.Values[1]->Strategy, "Exclude"); + + } + #endif + + mOpenCoreConfiguration.Uefi.Output.ProvideConsoleGop = gSettings.GUI.ProvideConsoleGop; + OC_STRING_ASSIGN(mOpenCoreConfiguration.Uefi.Output.Resolution, XString8(gSettings.GUI.ScreenResolution).c_str()); + + if ( OpenRuntimeEfiName.notEmpty() ) { + XStringW FileName = SWPrintf("%ls\\%ls\\%ls", self.getCloverDirFullPath().wc_str(), getDriversPath().wc_str(), OpenRuntimeEfiName.wc_str()); + EFI_HANDLE DriverHandle; + Status = gBS->LoadImage(false, gImageHandle, FileDevicePath(self.getSelfLoadedImage().DeviceHandle, FileName), NULL, 0, &DriverHandle); + if ( !EFI_ERROR(Status) ) { + Status = gBS->StartImage(DriverHandle, 0, 0); + DBG("Start '%ls' : Status %s\n", OpenRuntimeEfiName.wc_str(), efiStrError(Status)); + + if ( !EFI_ERROR(Status) ) + { + OC_FIRMWARE_RUNTIME_PROTOCOL *FwRuntime; + Status = gBS->LocateProtocol ( + gOcFirmwareRuntimeProtocolGuid, + NULL, + (VOID **) &FwRuntime + ); + + if (!EFI_ERROR (Status)) { + if (FwRuntime->Revision == OC_FIRMWARE_RUNTIME_REVISION) { + } else { + DEBUG (( + DEBUG_ERROR, + "OCABC: Incompatible OpenRuntime r%u, require r%u\n", + (UINT32) FwRuntime->Revision, + (UINT32) OC_FIRMWARE_RUNTIME_REVISION + )); + DBG("Incompatible OpenRuntime r%llu, require r%u\n", FwRuntime->Revision, OC_FIRMWARE_RUNTIME_REVISION); + } + } + } + }else{ + DBG("Error when loading '%ls' : Status %s.\n", OpenRuntimeEfiName.wc_str(), efiStrError(Status)); + } + }else{ + DBG("No OpenRuntime driver. This is wrong, OpenRuntime is mandatory.\n"); + } + + OcMain(&mOpenCoreStorage, NULL); + + XStringW DevicePathAsString = DevicePathToXStringW(DevicePath); + if ( DevicePathAsString.rindexOf(".dmg") == MAX_XSIZE ) + { + // point to InternalEfiLoadImage from OC + Status = gBS->LoadImage ( + false, + gImageHandle, + DevicePath, + NULL, + 0, + &ImageHandle + ); + if ( EFI_ERROR(Status) ) { + DBG("LoadImage at '%ls' failed. Status = %s\n", DevicePathAsString.wc_str(), efiStrError(Status)); + return; + } + DBG("ImageHandle = %llx\n", uintptr_t(ImageHandle)); + } else { + // NOTE : OpenCore ignore the name of the dmg. + // InternalLoadDmg calls InternalFindFirstDmgFileName to find the dmg file name. + // So be careful that, if an other dmg exists in the dir, that might boot on the wrong one. + + EFI_DEVICE_PATH_PROTOCOL* DevicePathCopy = DuplicateDevicePath(DevicePath); + + EFI_DEVICE_PATH_PROTOCOL* PreviousNode = NULL; + EFI_DEVICE_PATH_PROTOCOL* Node = DevicePathCopy; + while (!IsDevicePathEnd(Node)) { + if ( Node->Type == MEDIA_DEVICE_PATH && Node->SubType == MEDIA_FILEPATH_DP ) { + PreviousNode = Node; + break; + } + + PreviousNode = Node; + Node = NextDevicePathNode(Node); + } + SetDevicePathEndNode(PreviousNode); + + EFI_DEVICE_PATH_PROTOCOL* LoaderPathBasenameNode = ConvertTextToDeviceNode(LoaderPath.dirname().wc_str()); + EFI_DEVICE_PATH_PROTOCOL* DevicePathToDmgDir = AppendDevicePathNode(DevicePathCopy, LoaderPathBasenameNode); + DBG("DevicePathToDmgDir = %ls\n", DevicePathToXStringW(DevicePathToDmgDir).wc_str()); + + INTERNAL_DMG_LOAD_CONTEXT DmgLoadContext = {0,0,0}; + DmgLoadContext.DevicePath = DevicePathToDmgDir; + EFI_DEVICE_PATH_PROTOCOL* BootEfiFromDmgDevicePath = InternalLoadDmg(&DmgLoadContext, OcDmgLoadingAnyImage); + DBG("DevicePath of dmg = %ls\n", DevicePathToXStringW(BootEfiFromDmgDevicePath).wc_str()); + + // point to InternalEfiLoadImage from OC + Status = gBS->LoadImage ( + false, + gImageHandle, + BootEfiFromDmgDevicePath, + NULL, + 0, + &ImageHandle + ); + if ( EFI_ERROR(Status) ) { + DBG("LoadImage at '%ls' failed. Status = %s\n", DevicePathToXStringW(BootEfiFromDmgDevicePath).wc_str(), efiStrError(Status)); + return; + } + } + + EFI_STATUS OptionalStatus = gBS->HandleProtocol ( + ImageHandle, + &gEfiLoadedImageProtocolGuid, + (void **) &LoadedImage + ); + if ( EFI_ERROR(OptionalStatus) ) return; // TODO message ? + } else { + // Load image into memory (will be started later) + Status = LoadEFIImage(DevicePath, LoaderPath.basename(), NULL, &ImageHandle); + if (EFI_ERROR(Status)) { + DBG("Image is not loaded, status=%s\n", efiStrError(Status)); + return; // no reason to continue if loading image failed + } + } + + egClearScreen(&BootBgColor); //if not set then it is already MenuBackgroundPixel + +// KillMouse(); + +// if (LoaderType == OSTYPE_OSX) { + if (OSTYPE_IS_OSX(LoaderType) || + OSTYPE_IS_OSX_RECOVERY(LoaderType) || + OSTYPE_IS_OSX_INSTALLER(LoaderType)) { + + // To display progress bar properly (especially in FV2 mode) boot.efi needs to be in graphics mode. + // Unfortunately many UEFI implementations change the resolution when SetMode happens. + // This is not what boot.efi expects, and it freely calls SetMode at its will. + // As a result we see progress bar at improper resolution and the background is also missing (10.12.x+). + // + // libeg already has a workaround for SetMode behaviour, so we extend it for boot.efi support. + // The approach tries to be follows: + // 1. Ensure we have graphics mode set (since it is a must in the future). + // 2. Request text mode for boot.efi, which it expects by default (here a SetMode libeg hack will trigger + // on problematic UEFI implementations like AMI). + egSetGraphicsModeEnabled(true); + egSetGraphicsModeEnabled(false); + + DBG("GetOSVersion:"); + + //needed for boot.efi patcher + Status = gBS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (void **) &LoadedImage); + // Correct OSVersion if it was not found + // This should happen only for 10.7-10.9 OSTYPE_OSX_INSTALLER + // For these cases, take OSVersion from loaded boot.efi image in memory + if ( macOSVersion.isEmpty()) { + + if (!EFI_ERROR(Status)) { + // version in boot.efi appears as "Mac OS X 10.?" + /* + Start OSName Mac OS X 10.12 End OSName Start OSVendor Apple Inc. End + */ + + InstallerVersion = AsciiStrStr((CHAR8*)LoadedImage->ImageBase, "Mac OS X "); + int location = 9; + if (InstallerVersion == NULL) { + InstallerVersion = AsciiStrStr((CHAR8*)LoadedImage->ImageBase, "macOS "); + location = 7; + } + if (InstallerVersion != NULL) { // string was found + InstallerVersion += location; // advance to version location + + if (strncmp(InstallerVersion, "10.7", 4) && + strncmp(InstallerVersion, "10.8", 4) && + strncmp(InstallerVersion, "10.9", 4) && + strncmp(InstallerVersion, "10.10", 5) && + strncmp(InstallerVersion, "10.11", 5) && + strncmp(InstallerVersion, "10.12", 5) && + strncmp(InstallerVersion, "10.13", 5) && + strncmp(InstallerVersion, "10.14", 5) && + strncmp(InstallerVersion, "10.15", 5) && + strncmp(InstallerVersion, "10.16", 5) && + strncmp(InstallerVersion, "11.", 3) && + strncmp(InstallerVersion, "12.", 3) && + strncmp(InstallerVersion, "13.", 3) && + strncmp(InstallerVersion, "14.", 3) && + strncmp(InstallerVersion, "15.", 3) + ) { + InstallerVersion = NULL; // flag known version was not found + } + if (InstallerVersion != NULL) { // known version was found in image + macOSVersion = InstallerVersion; + DBG("Corrected OSVersion: %s\n", macOSVersion.asString().c_str()); + } + } + } + BuildVersion.setEmpty(); + } + + if (BuildVersion.notEmpty()) { + DBG(" %s (%s)\n", macOSVersion.asString().c_str(), BuildVersion.c_str()); + } else { + DBG(" %s\n", macOSVersion.asString().c_str()); + } + + if ( macOSVersion >= MacOsVersion("10.11"_XS8) ) { + if (OSFLAG_ISSET(Flags, OSFLAG_NOSIP)) { + gSettings.RtVariables.CsrActiveConfig = (UINT32)0xBEF; + gSettings.RtVariables.BooterConfig = 0x28; + } + } + + FilterKextPatches(); + FilterKernelPatches(); + FilterBootPatches(); + if (LoadedImage && !BooterPatch((UINT8*)LoadedImage->ImageBase, LoadedImage->ImageSize)) { + DBG("Will not patch boot.efi\n"); + } + gConf.ReloadSmbios(OSName); + DelegateKernelPatches(); + + // Set boot argument for kernel if no caches, this should force kernel loading + if ( OSFLAG_ISSET(Flags, OSFLAG_NOCACHES) && !LoadOptions.containsStartWithIC("Kernel=") ) { + XString8 KernelLocation; + + if ( macOSVersion.notEmpty() && macOSVersion <= MacOsVersion("10.9"_XS8) ) { + KernelLocation.S8Printf("\"Kernel=/mach_kernel\""); + } else { + // used for 10.10, 10.11, and new version. Jief : also for unknown version. + KernelLocation.S8Printf("\"Kernel=/System/Library/Kernels/kernel\""); + } + LoadOptions.AddID(KernelLocation); + } + + // first patchACPI and find PCIROOT and RTC + // but before ACPI patch we need smbios patch + CheckEmptyFB(); + + + SmbiosFillPatchingValues(GlobalConfig.SetTable132, GlobalConfig.EnabledCores, g_SmbiosDiscoveredSettings.RamSlotCount, gConf.SlotDeviceArray, gSettings, gCPUStructure, &g_SmbiosInjectedSettings); + PatchSmbios(g_SmbiosInjectedSettings); + +#ifdef USE_OC_SECTION_Acpi + // If we use the ACPI section form config-oc.plist, let's also delegate the acpi patching to OC +#else + PatchACPI(Volume, macOSVersion); +#endif + +#ifdef JIEF_DEBUG + //SaveOemTables(); +#endif +// + + DbgHeader("RestSetup macOS"); + SetDevices(this); + SetVariablesForOSX(this); +// Jief : if we want to use our FixUSBOwnership, we need our OnExitBootServices + EventsInitialize(this); + FinalizeSmbios(g_SmbiosInjectedSettings); + + SetCPUProperties(); //very special procedure + + if (OSFLAG_ISSET(Flags, OSFLAG_HIBERNATED)) { + DoHibernateWake = PrepareHibernation(Volume); + } + SetupDataForOSX(DoHibernateWake); + + + if ( gDriversFlags.AptioFixLoaded && + !DoHibernateWake && + !LoadOptions.containsStartWithIC("slide=") ) { + // Add slide=0 argument for ML+ if not present + LoadOptions.AddID("slide=0"_XS8); + } + + + /** + * syscl - append "-xcpm" argument conditionally if set KernelXCPM on Intel Haswell+ low-end CPUs + */ + if (KernelAndKextPatches.KPKernelXCPM && + gCPUStructure.Vendor == CPU_VENDOR_INTEL && gCPUStructure.Model >= CPU_MODEL_HASWELL && + (gCPUStructure.BrandString.contains("Celeron") || gCPUStructure.BrandString.contains("Pentium")) && + macOSVersion >= MacOsVersion("10.8.5"_XS8) && macOSVersion < MacOsVersion("10.12"_XS8) && + (!LoadOptions.containsIC("-xcpm"))) { + // add "-xcpm" argv if not present on Haswell+ Celeron/Pentium + LoadOptions.AddID("-xcpm"_XS8); + } + + // add -xcpm on Ivy Bridge if set KernelXCPM and system version is 10.8.5 - 10.11.x + if (KernelAndKextPatches.KPKernelXCPM && + gCPUStructure.Model == CPU_MODEL_IVY_BRIDGE && + macOSVersion >= MacOsVersion("10.8.5"_XS8) && macOSVersion < MacOsVersion("10.12"_XS8) && + (!LoadOptions.containsIC("-xcpm"))) { + // add "-xcpm" argv if not present on Ivy Bridge + LoadOptions.AddID("-xcpm"_XS8); + } + + if (AudioIo) { + AudioIo->StopPlayback(AudioIo); +// CheckSyncSound(true); + EFI_DRIVER_BINDING_PROTOCOL *DriverBinding = NULL; + Status = gBS->HandleProtocol(AudioDriverHandle, &gEfiDriverBindingProtocolGuid, (void **)&DriverBinding); + if (DriverBinding) { + DriverBinding->Stop(DriverBinding, AudioDriverHandle, 0, NULL); + } + } + + + // blocking boot.efi output if -v is not specified + // note: this blocks output even if -v is specified in + // /Library/Preferences/SystemConfiguration/com.apple.Boot.plist + // which is wrong + // apianti - only block console output if using graphics + // but don't block custom boot logo + if (LoadOptions.containsIC("-v")) { + Flags = OSFLAG_UNSET(Flags, OSFLAG_USEGRAPHICS); + } + } + else if (OSTYPE_IS_WINDOWS(LoaderType)) { + + if (AudioIo) { + AudioIo->StopPlayback(AudioIo); + } + + DBG("Closing events for Windows\n"); + gBS->CloseEvent (OnReadyToBootEvent); + gBS->CloseEvent (ExitBootServiceEvent); + gBS->CloseEvent (mSimpleFileSystemChangeEvent); + + + if (gEmuVariableControl != NULL) { + gEmuVariableControl->UninstallEmulation(gEmuVariableControl); + } + + PatchACPI_OtherOS(L"Windows", false); + + } + else if (OSTYPE_IS_LINUX(LoaderType) || (LoaderType == OSTYPE_LINEFI)) { + + DBG("Closing events for Linux\n"); + gBS->CloseEvent (OnReadyToBootEvent); + gBS->CloseEvent (ExitBootServiceEvent); + gBS->CloseEvent (mSimpleFileSystemChangeEvent); + + if (gEmuVariableControl != NULL) { + gEmuVariableControl->UninstallEmulation(gEmuVariableControl); + } + + PatchACPI_OtherOS(L"Linux", false); + } + + if (gSettings.Boot.LastBootedVolume) { + if ( APFSTargetUUID.notNull() ) { + // Jief : we need to LoaderPath. If not, GUI can't know which target was selected. + SetStartupDiskVolume(Volume, LoaderPath); + }else{ + // Jief : I'm not sure why NullXStringW was given if LoaderType == OSTYPE_OSX. + // Let's do it like it was before when not in case of APFSTargetUUID + SetStartupDiskVolume(Volume, LoaderType == OSTYPE_OSX ? NullXStringW : LoaderPath); + } + } else if (gSettings.Boot.DefaultVolume.notEmpty()) { + // DefaultVolume specified in Config.plist or in Boot Option + // we'll remove macOS Startup Disk vars which may be present if it is used + // to reboot into another volume + RemoveStartupDiskVolume(); + } +/* + { + // UINT32 machineSignature = 0; + EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtPointer = NULL; + EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs = NULL; + + // DBG("---dump hibernations data---\n"); + FadtPointer = GetFadt(); + if (FadtPointer != NULL) { + Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*)(UINTN)(FadtPointer->FirmwareCtrl); + + DBG(" Firmware wake address=%08lx\n", Facs->FirmwareWakingVector); + DBG(" Firmware wake 64 addr=%16llx\n", Facs->XFirmwareWakingVector); + DBG(" Hardware signature =%08lx\n", Facs->HardwareSignature); + DBG(" GlobalLock =%08lx\n", Facs->GlobalLock); + DBG(" Flags =%08lx\n", Facs->Flags); + DBG(" HS at offset 0x%08X\n", OFFSET_OF(EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE, HardwareSignature)); + // machineSignature = Facs->HardwareSignature; + } + } +*/ + + BeginExternalScreen(OSFLAG_ISSET(Flags, OSFLAG_USEGRAPHICS)/*, L"Booting OS"*/); + + if (!OSTYPE_IS_WINDOWS(LoaderType) && !OSTYPE_IS_LINUX(LoaderType)) { + if (OSFLAG_ISSET(Flags, OSFLAG_USEGRAPHICS)) { + // save orig OutputString and replace it with + // null implementation + ConOutOutputString = gST->ConOut->OutputString; + gST->ConOut->OutputString = NullConOutOutputString; + } + + // Initialize the boot screen + if (EFI_ERROR(Status = InitBootScreen(this))) { + if (Status != EFI_ABORTED) DBG("Failed to initialize custom boot screen: %s!\n", efiStrError(Status)); + } + else if (EFI_ERROR(Status = LockBootScreen())) { + DBG("Failed to lock custom boot screen: %s!\n", efiStrError(Status)); + } + } // !OSTYPE_IS_WINDOWS + + if (OSTYPE_IS_OSX(LoaderType) || + OSTYPE_IS_OSX_RECOVERY(LoaderType) || + OSTYPE_IS_OSX_INSTALLER(LoaderType)) { + + if (DoHibernateWake) { + DBG("Closing events for wake\n"); + gBS->CloseEvent (OnReadyToBootEvent); +// gBS->CloseEvent (ExitBootServiceEvent); // Jief : we don't need that anymore, if we continue to use OC onExtBootService event + gBS->CloseEvent (mSimpleFileSystemChangeEvent); + + // When doing hibernate wake, save to DataHub only up to initial size of log + SavePreBootLog = false; + } else { + // delete boot-switch-vars if exists + Status = gRT->SetVariable(L"boot-switch-vars", gEfiAppleBootGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + 0, NULL); + DeleteNvramVariable(L"IOHibernateRTCVariables", gEfiAppleBootGuid); + DeleteNvramVariable(L"boot-image", gEfiAppleBootGuid); + + } + SetupBooterLog(!DoHibernateWake); + + XStringW LoadOptionsAsXStringW = SWPrintf("%ls %s ", Basename(LoaderPath.wc_str()), LoadOptions.ConcatAll(" "_XS8).c_str()); + LoadedImage->LoadOptions = (void*)LoadOptionsAsXStringW.wc_str(); + LoadedImage->LoadOptionsSize = (UINT32)LoadOptionsAsXStringW.sizeInBytesIncludingTerminator(); + + DBG("Kernel quirks\n"); + DBG("ACPCL %d AXCL %d AXEM %d AXFB %d CSG %d DIM %d DLJ %d DRC %d DPM %d EBTFF %d EDI %d FAI %d IPBS %d LKP %d PNKD %d PTKP %d TPD %d XPL %d PCC %d\n", + mOpenCoreConfiguration.Kernel.Quirks.AppleCpuPmCfgLock, + mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmCfgLock, + mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmExtraMsrs, + mOpenCoreConfiguration.Kernel.Quirks.AppleXcpmForceBoost, + mOpenCoreConfiguration.Kernel.Quirks.CustomSmbiosGuid, + mOpenCoreConfiguration.Kernel.Quirks.DisableIoMapper, + mOpenCoreConfiguration.Kernel.Quirks.DisableLinkeditJettison, + mOpenCoreConfiguration.Kernel.Quirks.DisableRtcChecksum, + mOpenCoreConfiguration.Kernel.Emulate.DummyPowerManagement, + mOpenCoreConfiguration.Kernel.Quirks.ExtendBTFeatureFlags, + mOpenCoreConfiguration.Kernel.Quirks.ExternalDiskIcons, + mOpenCoreConfiguration.Kernel.Quirks.IncreasePciBarSize, + mOpenCoreConfiguration.Kernel.Quirks.ForceAquantiaEthernet, + mOpenCoreConfiguration.Kernel.Quirks.LapicKernelPanic, + mOpenCoreConfiguration.Kernel.Quirks.PanicNoKextDump, + mOpenCoreConfiguration.Kernel.Quirks.PowerTimeoutKernelPanic, + mOpenCoreConfiguration.Kernel.Quirks.ThirdPartyDrives, + mOpenCoreConfiguration.Kernel.Quirks.XhciPortLimit, + mOpenCoreConfiguration.Kernel.Quirks.ProvideCurrentCpuInfo); + + + DBG("Closing log\n"); + if (SavePreBootLog) { + Status = SaveBooterLog(&self.getCloverDir(), PREBOOT_LOG); + } + AllocSmallBlocks(); // shrink memory map; + +#ifdef JIEF_DEBUG + PrintMemoryMap(); + displayFreeMemory("Just before launching image"_XS8); +#endif + Status = gBS->StartImage (ImageHandle, 0, NULL); // point to OcStartImage from OC + + if ( EFI_ERROR(Status) ) { + // Ideally, we would return to the menu, displaying an error message + // Truth is that we get a black screen before seeing the menu again. + // If I remember well, we get a freeze in BdsLibConnectAllEfi() + // I'm guessing there is a lot of patching done for booting. + // To be able to go back to the menu and boot another thing, + // we must undo all the patching... + // Here is a quick, not as bad as a black screen solution : a text message and a reboot ! + DBG("StartImage failed : %s\n", efiStrError(Status)); + SaveBooterLog(&self.getCloverDir(), PREBOOT_LOG); + egSetGraphicsModeEnabled(false); + printf("StartImage failed : %s\n", efiStrError(Status)); + PauseForKey("Reboot needed."_XS8); + // Attempt warm reboot + gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); + // Warm reboot may not be supported attempt cold reboot + gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); + // Terminate the screen and just exit + + return; + } + +}else{ + + StartEFILoadedImage(ImageHandle, LoadOptions, NullXStringW, LoaderPath.basename(), NULL); +} + // Unlock boot screen + if (EFI_ERROR(Status = UnlockBootScreen())) { + DBG("Failed to unlock custom boot screen: %s!\n", efiStrError(Status)); + } + if (OSFLAG_ISSET(Flags, OSFLAG_USEGRAPHICS)) { + // return back orig OutputString + gST->ConOut->OutputString = ConOutOutputString; + } + + + FinishExternalScreen(); + +} + + +void LEGACY_ENTRY::StartLegacy() +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + + // Unload EmuVariable before booting legacy. + // This is not needed in most cases, but it seems to interfere with legacy OS + // booted on some UEFI bioses, such as Phoenix UEFI 2.0 + if (gEmuVariableControl != NULL) { + gEmuVariableControl->UninstallEmulation(gEmuVariableControl); + } + + if (gSettings.Boot.LastBootedVolume) { + SetStartupDiskVolume(Volume, NullXStringW); + } else if (gSettings.Boot.DefaultVolume.notEmpty()) { + // DefaultVolume specified in Config.plist: + // we'll remove macOS Startup Disk vars which may be present if it is used + // to reboot into another volume + RemoveStartupDiskVolume(); + } + + + egClearScreen(&MenuBackgroundPixel); + BeginExternalScreen(true/*, L"Booting Legacy OS"*/); + XImage BootLogoX; + BootLogoX.LoadXImage(&ThemeX->getThemeDir(), Volume->LegacyOS.IconName); + BootLogoX.Draw((UGAWidth - BootLogoX.GetWidth()) >> 1, + (UGAHeight - BootLogoX.GetHeight()) >> 1); + + //try my LegacyBoot + switch (Volume->BootType) { + case BOOTING_BY_CD: + Status = bootElTorito(Volume); + break; + case BOOTING_BY_MBR: + Status = bootMBR(Volume); + break; + case BOOTING_BY_PBR: + if (gSettings.Boot.LegacyBoot == "LegacyBiosDefault"_XS8) { + Status = bootLegacyBiosDefault(gSettings.Boot.LegacyBiosDefaultEntry); + } else if (gSettings.Boot.LegacyBoot == "PBRtest"_XS8) { + Status = bootPBRtest(Volume); + } else if (gSettings.Boot.LegacyBoot == "PBRsata"_XS8) { + Status = bootPBR(Volume, true); + } else { + // default + Status = bootPBR(Volume, false); + } + break; + default: + break; + } + CheckError(Status, L"while LegacyBoot"); + + FinishExternalScreen(); +} + +// +// pre-boot tool functions +// + +void REFIT_MENU_ENTRY_LOADER_TOOL::StartTool() +{ + DBG("Start Tool: %ls\n", LoaderPath.wc_str()); + egClearScreen(&MenuBackgroundPixel); + // assumes "Start <title>" as assigned below + BeginExternalScreen(OSFLAG_ISSET(Flags, OSFLAG_USEGRAPHICS)/*, &Entry->Title[6]*/); // Shouldn't we check that length of Title is at least 6 ? + StartEFIImage(DevicePath, LoadOptions, NullXStringW, LoaderPath.basename(), NULL, NULL); + FinishExternalScreen(); +} + +// +// pre-boot driver functions +// + +static void ScanDriverDir(IN CONST CHAR16 *Path, OUT EFI_HANDLE **DriversToConnect, OUT UINTN *DriversToConnectNum) +{ + EFI_STATUS Status; + REFIT_DIR_ITER DirIter; + EFI_FILE_INFO *DirEntry; + EFI_HANDLE DriverHandle; + EFI_DRIVER_BINDING_PROTOCOL *DriverBinding; + UINTN DriversArrSize; + UINTN DriversArrNum; + EFI_HANDLE *DriversArr; + XBool Skip; + UINT8 AptioBlessed; + STATIC CHAR16 CONST * CONST AptioNames[] = { + L"AptioMemoryFix", + L"AptioFix3Drv", + L"AptioFix2Drv", + L"AptioFixDrv", + L"LowMemFix" + }; + STATIC UINT8 CONST AptioIndices[] = { + OFFSET_OF(DRIVERS_FLAGS, AptioMemFixLoaded), + OFFSET_OF(DRIVERS_FLAGS, AptioFix3Loaded), + OFFSET_OF(DRIVERS_FLAGS, AptioFix2Loaded), + OFFSET_OF(DRIVERS_FLAGS, AptioFixLoaded), + OFFSET_OF(DRIVERS_FLAGS, MemFixLoaded) + }; + + DriversArrSize = 0; + DriversArrNum = 0; + DriversArr = NULL; + // OpenRuntimeEfiName.setEmpty(); + +//only one driver with highest priority will obtain status "Loaded" + DirIterOpen(&self.getCloverDir(), Path, &DirIter); +#define BOOLEAN_AT_INDEX(k) (*(XBool*)((UINTN)&gDriversFlags + AptioIndices[(k)])) + for (size_t i = 0; i != ARRAY_SIZE(AptioIndices); ++i) + BOOLEAN_AT_INDEX(i) = false; + AptioBlessed = (UINT8) ARRAY_SIZE(AptioNames); + while (DirIterNext(&DirIter, 2, L"*.efi", &DirEntry)) { + size_t i; + for (i = 0; i != ARRAY_SIZE(AptioNames); ++i) + if (StrStr(DirEntry->FileName, AptioNames[i]) != NULL) + break; + if (((UINT8) i) >= AptioBlessed) + continue; + AptioBlessed = (UINT8) i; + if (!i) + break; + } + DirIterClose(&DirIter); + + // look through contents of the directory + DirIterOpen(&self.getCloverDir(), Path, &DirIter); + while (DirIterNext(&DirIter, 2, L"*.efi", &DirEntry)) { + Skip = (DirEntry->FileName[0] == L'.'); + for (size_t i=0; i<gSettings.DisabledDriverArray.size(); i++) { + if (StrStr(DirEntry->FileName, gSettings.DisabledDriverArray[i].wc_str()) != NULL) { + Skip = true; // skip this + break; + } + } + if (Skip) { + continue; + } + if ( LStringW(DirEntry->FileName).startWith("._") ) { + continue; + } + if ( LStringW(DirEntry->FileName).containsIC("OcQuirks") ) { + continue; + } + if ( LStringW(DirEntry->FileName).containsIC("AptioMemoryFix") ) { + continue; + } + + if ( LStringW(DirEntry->FileName).containsIC("OpenRuntime") ) { + if (!OpenRuntimeEfiName.isEmpty()) { + DBG(" - OpenRuntime already detected\n"); + continue; + } + if ( LStringW(DirEntry->FileName).isEqualIC("OpenRuntime-v12.efi") && LString8(OPEN_CORE_VERSION).isEqual("0.7.5") ) { + OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); + DBG(" - OpenRuntime-v12 for 075 taken from %ls\n", getDriversPath().wc_str()); + }else + if ( LStringW(DirEntry->FileName).isEqualIC("OpenRuntime-v12.efi") && LString8(OPEN_CORE_VERSION).isEqual("0.7.3") ) { + OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); + DBG(" - OpenRuntime-v12 for 073 taken from %ls\n", getDriversPath().wc_str()); + }else + if ( LStringW(DirEntry->FileName).isEqualIC("OpenRuntime-v11.efi") && LString8(OPEN_CORE_VERSION).isEqual("0.6.5") ) { + OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); + DBG(" - OpenRuntime-v11 for 065 taken from %ls\n", getDriversPath().wc_str()); + }else + if ( LStringW(DirEntry->FileName).isEqualIC("OpenRuntime-v11.efi") && LString8(OPEN_CORE_VERSION).isEqual("0.6.1") ) { + OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); + DBG(" - OpenRuntime-v11 for 061 taken from %ls\n", getDriversPath().wc_str()); + }else + if ( OpenRuntimeEfiName.isEmpty() ) { + OpenRuntimeEfiName.takeValueFrom(DirEntry->FileName); + } + continue; + } + { + size_t i; + // either AptioMem, AptioFix* or LowMemFix exclusively + for (i = 0; i != ARRAY_SIZE(AptioNames); ++i) + if (StrStr(DirEntry->FileName, AptioNames[i]) != NULL) + break; + if (i != ARRAY_SIZE(AptioNames)) { + if (((UINT8) i) != AptioBlessed) + continue; + if (AptioBlessed < (UINT8) ARRAY_SIZE(AptioIndices)) + BOOLEAN_AT_INDEX(AptioBlessed) = true; + AptioBlessed = (UINT8) ARRAY_SIZE(AptioNames); + } + } +#undef BOOLEAN_AT_INDEX + + XStringW FileName = SWPrintf("%ls\\%ls\\%ls", self.getCloverDirFullPath().wc_str(), Path, DirEntry->FileName); + Status = StartEFIImage(apd<EFI_DEVICE_PATH_PROTOCOL*>(FileDevicePath(self.getSelfLoadedImage().DeviceHandle, FileName)), NullXString8Array, LStringW(DirEntry->FileName), XStringW().takeValueFrom(DirEntry->FileName), NULL, &DriverHandle); + if (EFI_ERROR(Status)) { + continue; + } + if ( FileName.containsIC("AudioDxe") ) { + AudioDriverHandle = DriverHandle; + } + if ( FileName.containsIC("EmuVariable") ) { + gDriversFlags.EmuVariableLoaded = true; + } else if ( FileName.containsIC("Video") ) { + gDriversFlags.VideoLoaded = true; + } else if ( FileName.containsIC("Partition") ) { + gDriversFlags.PartitionLoaded = true; + } else if ( FileName.containsIC("HFS") ) { + gDriversFlags.HFSLoaded = true; + } else if ( FileName.containsIC("apfs") ) { + gDriversFlags.APFSLoaded = true; + } + if (DriverHandle != NULL && DriversToConnectNum != NULL && DriversToConnect != NULL) { + // driver loaded - check for EFI_DRIVER_BINDING_PROTOCOL + Status = gBS->HandleProtocol(DriverHandle, &gEfiDriverBindingProtocolGuid, (void **) &DriverBinding); + if (!EFI_ERROR(Status) && DriverBinding != NULL) { + DBG(" - driver needs connecting\n"); + // standard UEFI driver - we would reconnect after loading - add to array + MemoryStopRecord msr; // DriversArr won't be deallocated because it's passed to RegisterDriversToHighestPriority that keeps it global. + if (DriversArrSize == 0) { + // new array + DriversArrSize = 16; + DriversArr = (__typeof__(DriversArr))AllocateZeroPool(sizeof(EFI_HANDLE) * DriversArrSize); + } else if (DriversArrNum + 1 == DriversArrSize) { + // extend array + DriversArr = (__typeof__(DriversArr))ReallocatePool(DriversArrSize, DriversArrSize + 16, DriversArr); + DriversArrSize += 16; + } + DriversArr[DriversArrNum] = DriverHandle; + // DBG(" driver %ls included with Binding=%X\n", FileName, DriverBinding); + DriversArrNum++; + // we'll make array terminated + DriversArr[DriversArrNum] = NULL; + } + } + } + Status = DirIterClose(&DirIter); + if (Status != EFI_NOT_FOUND) { + CheckError(Status, SWPrintf( "while scanning the %ls directory", Path).wc_str()); + } + + if (DriversToConnectNum != NULL && DriversToConnect != NULL) { + *DriversToConnectNum = DriversArrNum; + *DriversToConnect = DriversArr; + } } -REFIT_ABSTRACT_MENU_ENTRY* SubMenuChooseSmbios() -{ - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_MENU_SWITCH *InputBootArgs; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_CHOOSE_SMBIOS, NullXString8); - Entry->Title.SWPrintf("SMBIOS->"); - - SubScreen->AddMenuInfoLine_f("Select SMBIOS:"); - - for (UINTN i = 0; i < SmbiosList.size(); i++) { - InputBootArgs = new REFIT_MENU_SWITCH; - InputBootArgs->Title = SmbiosList[i]; - InputBootArgs->Row = i; - InputBootArgs->Item = &InputItems[65]; - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - } - SubScreen->AddMenuEntry(SubMenuSmbios(), true); - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; +/** + * Some UEFI's (like HPQ EFI from HP notebooks) have DiskIo protocols + * opened BY_DRIVER (by Partition driver in HP case) even when no file system + * is produced from this DiskIo. This then blocks our FS drivers from connecting + * and producing file systems. + * To fix it: we will disconnect drivers that connected to DiskIo BY_DRIVER + * if this is partition volume and if those drivers did not produce file system. + */ +void DisconnectInvalidDiskIoChildDrivers(void) +{ + EFI_STATUS Status; + UINTN HandleCount = 0; + UINTN Index; + UINTN OpenInfoIndex; + EFI_HANDLE *Handles = NULL; + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs; + EFI_BLOCK_IO_PROTOCOL *BlockIo; + EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo; + UINTN OpenInfoCount; + XBool Found; + + DBG("Searching for invalid DiskIo BY_DRIVER connects:"); + + // + // Get all DiskIo handles + // + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDiskIoProtocolGuid, NULL, &HandleCount, &Handles); + if (EFI_ERROR(Status) || HandleCount == 0) { + DBG(" no DiskIo handles\n"); + return; + } + + // + // Check every DiskIo handle + // + Found = false; + for (Index = 0; Index < HandleCount; Index++) { + //DBG("\n"); + //DBG(" - Handle %p:", Handles[Index]); + // + // If this is not partition - skip it. + // This is then whole disk and DiskIo + // should be opened here BY_DRIVER by Partition driver + // to produce partition volumes. + // + Status = gBS->HandleProtocol ( + Handles[Index], + &gEfiBlockIoProtocolGuid, + (void **) &BlockIo + ); + if (EFI_ERROR(Status)) { + //DBG(" BlockIo: %s - skipping\n", efiStrError(Status)); + continue; + } + if (BlockIo->Media == NULL) { + //DBG(" BlockIo: no media - skipping\n"); + continue; + + } + if (!BlockIo->Media->LogicalPartition) { + //DBG(" BlockIo: whole disk - skipping\n"); + continue; + + } + //DBG(" BlockIo: partition"); + + // + // If SimpleFileSystem is already produced - skip it, this is ok + // + Status = gBS->HandleProtocol ( + Handles[Index], + &gEfiSimpleFileSystemProtocolGuid, + (void **) &Fs + ); + if (Status == EFI_SUCCESS) { + //DBG(" FS: ok - skipping\n"); + continue; + } + //DBG(" FS: no"); + + // + // If no SimpleFileSystem on this handle but DiskIo is opened BY_DRIVER + // then disconnect this connection + // + Status = gBS->OpenProtocolInformation ( + Handles[Index], + &gEfiDiskIoProtocolGuid, + &OpenInfo, + &OpenInfoCount + ); + if (EFI_ERROR(Status)) { + //DBG(" OpenInfo: no - skipping\n"); + continue; + } + //DBG(" OpenInfo: %d", OpenInfoCount); + for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) { + if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) { + if (!Found) { + DBG("\n"); + } + Found = true; + Status = gBS->DisconnectController (Handles[Index], OpenInfo[OpenInfoIndex].AgentHandle, NULL); + //DBG(" BY_DRIVER Agent: %p, Disconnect: %s", OpenInfo[OpenInfoIndex].AgentHandle, efiStrError(Status)); + DBG(" - Handle %llx with DiskIo, is Partition, no Fs, BY_DRIVER Agent: %llx, Disconnect: %s\n", (uintptr_t)Handles[Index], (uintptr_t)(OpenInfo[OpenInfoIndex].AgentHandle), efiStrError(Status)); + } + } + gBS->FreePool(OpenInfo); // use gBS->FreePool instead of FreePool to avoid message from MemoryTracker + } + gBS->FreePool(Handles); // use gBS->FreePool instead of FreePool to avoid message from MemoryTracker + + if (!Found) { + DBG(" not found, all ok\n"); + } +} + +void DisconnectSomeDevices(void) +{ + EFI_STATUS Status; + UINTN HandleCount; + UINTN Index, Index2; + EFI_HANDLE *Handles ; + EFI_HANDLE *ControllerHandles; + UINTN ControllerHandleCount; + EFI_BLOCK_IO_PROTOCOL *BlockIo = NULL; +// EFI_DISK_IO_PROTOCOL *DiskIo = NULL; + EFI_PCI_IO_PROTOCOL *PciIo = NULL; +// EFI_FILE_PROTOCOL *RootFP = NULL; +// EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *VolumeFS = NULL; + PCI_TYPE00 Pci; + CHAR16 *DriverName = NULL; + EFI_COMPONENT_NAME_PROTOCOL *CompName = NULL; + + if (gDriversFlags.PartitionLoaded) { + DBG("Partition driver loaded: "); + // get all BlockIo handles + HandleCount = 0; + Handles = NULL; + + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &HandleCount, &Handles); + if (Status == EFI_SUCCESS) { + for (Index = 0; Index < HandleCount; Index++) { + Status = gBS->HandleProtocol(Handles[Index], &gEfiBlockIoProtocolGuid, (void **) &BlockIo); + if (EFI_ERROR(Status)) { + continue; + } + if (BlockIo->Media->BlockSize == 2048) { + // disconnect CD controller + Status = gBS->DisconnectController(Handles[Index], NULL, NULL); + DBG("CD disconnect %s", efiStrError(Status)); + } + } +/* for (Index = 0; Index < HandleCount; Index++) { + Status = gBS->DisconnectController(Handles[Index], NULL, NULL); + } */ + FreePool(Handles); + } + DBG("\n"); + } + + if ((gDriversFlags.HFSLoaded) || (gDriversFlags.APFSLoaded)) { + if (gDriversFlags.HFSLoaded) { + DBG("HFS+ driver loaded\n"); + } + if (gDriversFlags.APFSLoaded) { + DBG("APFS driver loaded\n"); + } + + // get all FileSystem handles + ControllerHandleCount = 0; + ControllerHandles = NULL; + + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &ControllerHandleCount, &ControllerHandles); + /* if (!EFI_ERROR(Status)) { + for (Index2 = 0; Index2 < ControllerHandleCount; Index2++) { + Status = gBS->DisconnectController(ControllerHandles[Index2], + NULL, NULL); + DBG("Driver [%d] disconnect %s\n", Index2, efiStrError(Status)); + } + } */ + + HandleCount = 0; + Handles = NULL; + + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid, NULL, &HandleCount, &Handles); + if (!EFI_ERROR(Status)) { + for (Index = 0; Index < HandleCount; Index++) { + Status = gBS->OpenProtocol( + Handles[Index], + gEfiComponentNameProtocolGuid, + (void**)&CompName, + gImageHandle, + NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL); + + if (EFI_ERROR(Status)) { +// DBG("CompName %s\n", efiStrError(Status)); + continue; + } + // 2021-05, Jief : PG7 had a crash. In some cases, CompName->GetDriverName == NULL. + if ( CompName->GetDriverName == NULL ) { + DBG("DisconnectSomeDevices: GetDriverName CompName=%lld, CompName->GetDriverName=NULL\n", uintptr_t(CompName)); + continue; + } + Status = CompName->GetDriverName(CompName, "eng", &DriverName); + if (EFI_ERROR(Status)) { + continue; + } + if ((StriStr(DriverName, L"HFS")) || (StriStr(DriverName, L"apfs"))) { + for (Index2 = 0; Index2 < ControllerHandleCount; Index2++) { + Status = gBS->DisconnectController(ControllerHandles[Index2], + Handles[Index], NULL); + //DBG("Disconnect [%ls] from %llX: %s\n", DriverName, uintptr_t(ControllerHandles[Index2]), efiStrError(Status)); + } + } + } + gBS->FreePool(Handles); // use gBS->FreePool instead of FreePool to avoid message from MemoryTracker + } +// DBG("\n"); + gBS->FreePool(ControllerHandles); // use gBS->FreePool instead of FreePool to avoid message from MemoryTracker + } + + + if (gDriversFlags.VideoLoaded) { + DBG("Video driver loaded: "); + // get all PciIo handles + HandleCount = 0; + Handles = NULL; + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiPciIoProtocolGuid, NULL, &HandleCount, &Handles); + if (Status == EFI_SUCCESS) { + for (Index = 0; Index < HandleCount; Index++) { + Status = gBS->HandleProtocol(Handles[Index], &gEfiPciIoProtocolGuid, (void **) &PciIo); + if (EFI_ERROR(Status)) { + continue; + } + Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0, sizeof (Pci) / sizeof (UINT32), &Pci); + if (!EFI_ERROR(Status)) { + if(IS_PCI_VGA(&Pci) == true) { + // disconnect VGA + Status = gBS->DisconnectController(Handles[Index], NULL, NULL); + DBG("disconnect %s", efiStrError(Status)); + } + } + } + FreePool(Handles); + } + DBG("\n"); + } + + if (!gFirmwareClover) { + DisconnectInvalidDiskIoChildDrivers(); + } +} + + +void PatchVideoBios(UINT8 *Edid) +{ + + if ( gSettings.Graphics.PatchVBiosBytes.notEmpty() ) { + VideoBiosPatchBytes(gSettings.Graphics.PatchVBiosBytes.getVBIOS_PATCH_BYTES(), gSettings.Graphics.PatchVBiosBytes.getVBIOS_PATCH_BYTES_count()); + } + + if (gSettings.Graphics.PatchVBios) { + VideoBiosPatchNativeFromEdid(Edid); + } +} + + +static void LoadDrivers(void) +{ + EFI_STATUS Status; + EFI_HANDLE *DriversToConnect = NULL; + UINTN DriversToConnectNum = 0; + UINT8 *Edid; + UINTN VarSize = 0; + XBool VBiosPatchNeeded; + + DbgHeader("LoadDrivers"); + + // load drivers from /efi/drivers +#if defined(MDE_CPU_X64) + if (gFirmwareClover) { + if (FileExists(&self.getCloverDir(), L"drivers\\BIOS")) { + ScanDriverDir(L"drivers\\BIOS", &DriversToConnect, &DriversToConnectNum); + } else { + ScanDriverDir(L"drivers64", &DriversToConnect, &DriversToConnectNum); + } + } else { + OpenRuntimeEfiName.setEmpty(); + if (FileExists(&self.getCloverDir(), L"drivers\\5142")) { + ScanDriverDir(L"drivers\\5142", &DriversToConnect, &DriversToConnectNum); + } + if (FileExists(&self.getCloverDir(), L"drivers\\UEFI")) { + ScanDriverDir(L"drivers\\UEFI", &DriversToConnect, &DriversToConnectNum); + } else { + ScanDriverDir(L"drivers64UEFI", &DriversToConnect, &DriversToConnectNum); + } + } +#else + ScanDriverDir(L"drivers32", &DriversToConnect, &DriversToConnectNum); +#endif + // DriversToConnect is allocated by ScanDriverDir, but DO NOT free it. RegisterDriversToHighestPriority will store it in the global var mPriorityDrivers. + + VBiosPatchNeeded = gSettings.Graphics.PatchVBios || gSettings.Graphics.PatchVBiosBytes.getVBIOS_PATCH_BYTES_count() > 0; + if (VBiosPatchNeeded) { + // check if it is already done in CloverEFI BiosVideo + Status = gRT->GetVariable ( + L"CloverVBiosPatchDone", + gEfiGlobalVariableGuid, + NULL, + &VarSize, + NULL + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + // var exists - it's done - let's not do it again + VBiosPatchNeeded = false; + } + } + + if ( (gSettings.Graphics.EDID.CustomEDID.notEmpty() && gFirmwareClover) || (VBiosPatchNeeded && !gDriversFlags.VideoLoaded)) { + // we have video bios patch - force video driver reconnect + DBG("Video bios patch requested or CustomEDID - forcing video reconnect\n"); + gDriversFlags.VideoLoaded = true; + DriversToConnectNum++; + } + + UninitRefitLib(); + if (DriversToConnectNum > 0) { + DBG("%llu drivers needs connecting ...\n", DriversToConnectNum); + // note: our platform driver protocol + // will use DriversToConnect - do not release it + RegisterDriversToHighestPriority(DriversToConnect); + if (VBiosPatchNeeded) { + if (gSettings.Graphics.EDID.CustomEDID.notEmpty()) { + Edid = gSettings.Graphics.EDID.CustomEDID.data(); + } else { + Edid = getCurrentEdid(); + } + DisconnectSomeDevices(); + PatchVideoBios(Edid); + if (gSettings.Graphics.EDID.CustomEDID.isEmpty()) { + FreePool(Edid); + } + } else { + DisconnectSomeDevices(); + } + BdsLibConnectAllDriversToAllControllers(); + + // Boot speedup: remove temporary "BiosVideoBlockSwitchMode" RT var + // to unlock mode switching in CsmVideo + gRT->SetVariable(L"BiosVideoBlockSwitchMode", gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); + }else{ + BdsLibConnectAllEfi(); // jief : without any driver loaded, i couldn't see my CD, unless I call BdsLibConnectAllEfi + } + ReinitRefitLib(); } -REFIT_ABSTRACT_MENU_ENTRY* SubMenuDsdtFix() +INTN FindDefaultEntry(void) { - REFIT_MENU_ITEM_OPTIONS *Entry; //, *SubEntry; - REFIT_MENU_SCREEN *SubScreen; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_DSDT, NullXString8); - - SubScreen->AddMenuCheck("Add DTGP", FIX_DTGP, 67); - SubScreen->AddMenuCheck("Fix Darwin as WinXP", FIX_WARNING, 67); - SubScreen->AddMenuCheck("Fix Darwin as Win7", FIX_DARWIN, 67); - SubScreen->AddMenuCheck("Fix shutdown", FIX_SHUTDOWN, 67); - SubScreen->AddMenuCheck("Add MCHC", FIX_MCHC, 67); - SubScreen->AddMenuCheck("Fix HPET", FIX_HPET, 67); - SubScreen->AddMenuCheck("Fake LPC", FIX_LPC, 67); - SubScreen->AddMenuCheck("Fix IPIC", FIX_IPIC, 67); - SubScreen->AddMenuCheck("Add SMBUS", FIX_SBUS, 67); - SubScreen->AddMenuCheck("Fix display", FIX_DISPLAY, 67); - SubScreen->AddMenuCheck("Fix IDE", FIX_IDE, 67); - SubScreen->AddMenuCheck("Fix SATA", FIX_SATA, 67); - SubScreen->AddMenuCheck("Fix Firewire", FIX_FIREWIRE, 67); - SubScreen->AddMenuCheck("Fix USB", FIX_USB, 67); - SubScreen->AddMenuCheck("Fix LAN", FIX_LAN, 67); - SubScreen->AddMenuCheck("Fix Airport", FIX_WIFI, 67); - SubScreen->AddMenuCheck("Fix sound", FIX_HDA, 67); - SubScreen->AddMenuCheck("Fix RTC", FIX_RTC, 67); - SubScreen->AddMenuCheck("Fix TMR", FIX_TMR, 67); - SubScreen->AddMenuCheck("Add IMEI", FIX_IMEI, 67); - SubScreen->AddMenuCheck("Fix IntelGFX", FIX_INTELGFX, 67); - SubScreen->AddMenuCheck("Fix _WAK", FIX_WAK, 67); - SubScreen->AddMenuCheck("Del unused", FIX_UNUSED, 67); - SubScreen->AddMenuCheck("Fix ADP1", FIX_ADP1, 67); - SubScreen->AddMenuCheck("Add PNLF", FIX_PNLF, 67); - SubScreen->AddMenuCheck("Fix S3D", FIX_S3D, 67); - SubScreen->AddMenuCheck("Rename ACST", FIX_ACST, 67); - SubScreen->AddMenuCheck("Add HDMI", FIX_HDMI, 67); - SubScreen->AddMenuCheck("Fix Regions", FIX_REGIONS, 67); - SubScreen->AddMenuCheck("Fix Mutex", FIX_MUTEX, 67); - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - ModifyTitles(Entry); - - return Entry; -} + INTN Index = -1; + REFIT_VOLUME *Volume; + XBool SearchForLoader; -REFIT_ABSTRACT_MENU_ENTRY* SubMenuDSDTPatches() -{ - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_INPUT_DIALOG *InputBootArgs; +// DBG("FindDefaultEntry ...\n"); + //DbgHeader("FindDefaultEntry"); + + if ( gSettings.Boot.BootFirstAvailable ) return 0; + + // + // try to detect volume set by Startup Disk or previous Clover selection + // with broken nvram this requires emulation to be installed. + // enable emulation to determine efi-boot-device-data + if (gEmuVariableControl != NULL) { + gEmuVariableControl->InstallEmulation(gEmuVariableControl); + } - size_t PatchDsdtNum = gSettings.ACPI.DSDT.DSDTPatchArray.size(); + Index = FindStartupDiskVolume(&MainMenu); - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_DSDT_PATCHES, "Custom DSDT patches->"_XS8); + if (Index >= 0) { + DBG("Boot redirected to Entry %lld. '%ls'\n", Index, MainMenu.Entries[Index].Title.s()); + // we got boot-device-data, no need to keep emulating anymore + if (gEmuVariableControl != NULL) { + gEmuVariableControl->UninstallEmulation(gEmuVariableControl); + } + return Index; + } + + // + // if not found, then try DefaultVolume from config.plist + // if not null or empty, search volume that matches gSettings.Boot.DefaultVolume + // + if (gSettings.Boot.DefaultVolume.notEmpty()) { + + // if not null or empty, also search for loader that matches gSettings.Boot.DefaultLoader + SearchForLoader = gSettings.Boot.DefaultLoader.notEmpty(); +/* + if (SearchForLoader) { + DBG("Searching for DefaultVolume '%ls', DefaultLoader '%ls' ...\n", gSettings.Boot.DefaultVolume, gSettings.Boot.DefaultLoader); + } else { + DBG("Searching for DefaultVolume '%ls' ...\n", gSettings.Boot.DefaultVolume); + } +*/ + for (Index = 0; Index < (INTN)MainMenu.Entries.size() && MainMenu.Entries[Index].getLOADER_ENTRY() && MainMenu.Entries[Index].getLOADER_ENTRY()->Row == 0 ; Index++) { + + LOADER_ENTRY& Entry = *MainMenu.Entries[Index].getLOADER_ENTRY(); + if (!Entry.Volume) { + continue; + } + + Volume = Entry.Volume; + if ( (Volume->VolName.isEmpty() || Volume->VolName != gSettings.Boot.DefaultVolume) && + !Volume->DevicePathString.contains(gSettings.Boot.DefaultVolume) ) { + continue; + } + + // we alreday know that Entry.isLoader + if (SearchForLoader && (/*Entry.Tag != TAG_LOADER ||*/ !Entry.LoaderPath.containsIC(gSettings.Boot.DefaultLoader))) { + continue; + } + + DBG(" - found entry %lld. '%ls', Volume '%ls', DevicePath '%ls'\n", Index, Entry.Title.s(), Volume->VolName.wc_str(), Entry.DevicePathString.wc_str()); + // if first method failed and second succeeded - uninstall emulation + if (gEmuVariableControl != NULL) { + gEmuVariableControl->UninstallEmulation(gEmuVariableControl); + } + return Index; + } - for (size_t Index = 0; Index < PatchDsdtNum; Index++) { - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf("%90s", gSettings.ACPI.DSDT.DSDTPatchArray[Index].PatchDsdtLabel.c_str()); - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &gSettings.ACPI.DSDT.DSDTPatchArray[Index].PatchDsdtMenuItem; - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); } - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; + DBG("Default boot entry not found\n"); + // if both methods to determine default boot entry have failed - uninstall emulation before GUI + if (gEmuVariableControl != NULL) { + gEmuVariableControl->UninstallEmulation(gEmuVariableControl); + } + return -1; } -REFIT_ABSTRACT_MENU_ENTRY* SubMenuDsdts() +void SetVariablesFromNvram() { - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_MENU_SWITCH *InputBootArgs; - UINTN i; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_ACPI, "Dsdt name->"_XS8); - - SubScreen->AddMenuInfoLine_f("Select a DSDT file:"); - SubScreen->AddMenuItemSwitch(116, "BIOS.aml", false); - - for (i = 0; i < DsdtsList.size(); i++) { - InputBootArgs = new REFIT_MENU_SWITCH; - InputBootArgs->Title.takeValueFrom(DsdtsList[i]); - InputBootArgs->Row = i + 1; - InputBootArgs->Item = &InputItems[116]; - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - } - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; -} + CHAR8 *tmpString; + UINTN Size = 0; + UINTN index = 0, index2, i; + CHAR8 *arg = NULL; + +// DbgHeader("SetVariablesFromNvram"); + + tmpString = (__typeof__(tmpString))GetNvramVariable(L"boot-args", gEfiAppleBootGuid, NULL, &Size); + if (tmpString && (Size <= 0x1000) && (Size > 0)) { + DBG("found boot-args in NVRAM:%s, size=%llu\n", tmpString, Size); + // use and forget old one +// DeleteNvramVariable(L"boot-args", &gEfiAppleBootGuid); + Size = AsciiStrLen(tmpString); // some EFI implementations include '\0' in Size, and others don't, so update Size to string length + arg = (__typeof__(arg))AllocatePool(Size+1); + +/* if (AsciiStrStr(tmpString, "nvda_drv=1")) { //found substring + gSettings.NvidiaWeb = true; + } */ + //first we will find new args that is not present in main args + index = 0; + while ((index < Size) && (tmpString[index] != 0x0)) { + ZeroMem(arg, Size+1); + index2 = 0; + if (tmpString[index] != '\"') { + // DBG("search space index=%d\n", index); + while ((index < Size) && (tmpString[index] != 0x20) && (tmpString[index] != 0x0)) { + arg[index2++] = tmpString[index++]; + } + DBG("...found arg:%s\n", arg); + } else { + index++; +// DBG("search quote index=%d\n", index); + while ((index < Size) && (tmpString[index] != '\"') && (tmpString[index] != 0x0)) { + arg[index2++] = tmpString[index++]; + } + if (tmpString[index] == '\"') { + index++; + } + DBG("...found quoted arg:\n"/*, arg*/); + } + while (tmpString[index] == 0x20) { + index++; + } + // For the moment only arg -s must be ignored + if (AsciiStrCmp(arg, "-s") == 0) { + DBG("...ignoring arg:%s\n", arg); + continue; + } + if (!gSettings.Boot.BootArgs.contains(arg)) { + //this arg is not present will add + DBG("...adding arg:%s\n", arg); + gSettings.Boot.BootArgs.trim(); + gSettings.Boot.BootArgs += ' '; + for (i = 0; i < index2; i++) { + gSettings.Boot.BootArgs += arg[i]; + } + gSettings.Boot.BootArgs += ' '; + } + } + FreePool(arg); + } + if (tmpString) { + FreePool(tmpString); + } + + tmpString = (__typeof__(tmpString))GetNvramVariable(L"nvda_drv", gEfiAppleBootGuid, NULL, NULL); + if (tmpString && AsciiStrCmp(tmpString, "1") == 0) { + gSettings.SystemParameters.NvidiaWeb = true; + } + if (tmpString) { + FreePool(tmpString); + } +} -REFIT_ABSTRACT_MENU_ENTRY* SubMenuACPI() +void +GetListOfConfigs() { - // init - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; + REFIT_DIR_ITER DirIter; + EFI_FILE_INFO *DirEntry; - // create the entry in the options menu - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_ACPI, "ACPI patching->"_XS8); + ConfigsList.setEmpty(); + OldChosenConfig = 0; - // submenu description - SubScreen->AddMenuInfoLine_f("Choose options to patch ACPI"); + DirIterOpen(&selfOem.getConfigDir(), NULL, &DirIter); + DbgHeader("Found config plists"); + while (DirIterNext(&DirIter, 2, L"config*.plist", &DirEntry)) { + if (DirEntry->FileName[0] == L'.') { + continue; + } + if (StriCmp(DirEntry->FileName, L"config.plist") == 0) { + OldChosenConfig = ConfigsList.size(); // DirEntry->FileName is not yet inserted into ConfigsList. So its index will be ConfigsList.size() + } + size_t NameLen = wcslen(DirEntry->FileName) - 6; //without ".plist" + if ( NameLen <= MAX_INTN ) { + ConfigsList.AddReference(SWPrintf("%.*ls", (int)NameLen, DirEntry->FileName).forgetDataWithoutFreeing(), true); // this avoid to reallocate and copy memory + DBG("- %ls\n", DirEntry->FileName); + }else{ + DBG("- bug!, NameLen > MAX_INTN"); + } + } + DirIterClose(&DirIter); +} - SubScreen->AddMenuItemInput(102, "Debug DSDT", false); +void +GetListOfDsdts() +{ + REFIT_DIR_ITER DirIter; + EFI_FILE_INFO *DirEntry; - SubScreen->AddMenuEntry(SubMenuDsdts(), true); - SubScreen->AddMenuEntry(SubMenuDropTables(), true); - SubScreen->AddMenuEntry(SubMenuDsdtFix(), true); - SubScreen->AddMenuEntry(SubMenuDSDTPatches(), true); - SubScreen->AddMenuItemInput(49, "Fix MCFG", false); - SubScreen->AddMenuItemInput(124, "Fix Headers", gSettings.ACPI.FixHeaders); + DsdtsList.setEmpty(); + OldChosenDsdt = 0xFFFF; - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; + DirIterOpen(&selfOem.getConfigDir(), L"ACPI\\patched", &DirIter); + DbgHeader("Found DSDT tables"); + while (DirIterNext(&DirIter, 2, L"DSDT*.aml", &DirEntry)) { + if (DirEntry->FileName[0] == L'.') { + continue; + } + if ( gSettings.ACPI.DSDT.DsdtName.isEqualIC(DirEntry->FileName) ) { + OldChosenDsdt = DsdtsList.size(); // DirEntry->FileName is not yet inserted into DsdtsList. So its index will be DsdtsList.size() + } + size_t NameLen = wcslen(DirEntry->FileName); //with ".aml" + DsdtsList.AddReference(SWPrintf("%.*ls", (int)NameLen, DirEntry->FileName).forgetDataWithoutFreeing(), true); // this avoid to reallocate and copy memory + DBG("- %ls\n", DirEntry->FileName); + } + DirIterClose(&DirIter); } -REFIT_ABSTRACT_MENU_ENTRY* SubMenuAudioPort() +void +GetListOfACPI() { - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_MENU_SWITCH *InputBootArgs; - UINTN i; + REFIT_DIR_ITER DirIter; + EFI_FILE_INFO *DirEntry = NULL; - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_AUDIOPORTS, "Startup sound output->"_XS8); +// XStringW AcpiPath = SWPrintf("%ls\\ACPI\\patched", OEMPath.wc_str()); +// DBG("Get list of ACPI at path %ls\n", AcpiPath.wc_str()); + ACPIPatchedAML.setEmpty(); + DirIterOpen(&selfOem.getConfigDir(), L"ACPI\\patched", &DirIter); - SubScreen->AddMenuInfoLine_f("Select an audio output, press F7 to test"); - SubScreen->AddMenuItemInput(120, "Volume:", true); - - for (i = 0; i < AudioList.size(); i++) { - InputBootArgs = new REFIT_MENU_SWITCH; - InputBootArgs->Title.SWPrintf("%ls_%s", AudioList[i].Name.wc_str(), AudioOutputNames[AudioList[i].Device]); - InputBootArgs->Row = i; - InputBootArgs->Item = &InputItems[119]; - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - } + while (DirIterNext(&DirIter, 2, L"*.aml", &DirEntry)) { +// DBG("next entry is %ls\n", DirEntry->FileName); + if (DirEntry->FileName[0] == L'.') { + continue; + } + if (StriStr(DirEntry->FileName, L"DSDT")) { + continue; + } +// DBG("Found name %ls\n", DirEntry->FileName); + XBool ACPIDisabled = false; + ACPI_PATCHED_AML* ACPIPatchedAMLTmp = new ACPI_PATCHED_AML; + ACPIPatchedAMLTmp->FileName.takeValueFrom(DirEntry->FileName); + + INTN Count = gSettings.ACPI.DisabledAML.size(); + for (INTN i = 0; i < Count; i++) { + if ( gSettings.ACPI.DisabledAML[i].isEqualIC(ACPIPatchedAMLTmp->FileName) ) { +// if ((gSettings.ACPI.DisabledAML[i] != NULL) && +// (StriCmp(ACPIPatchedAMLTmp->FileName, gSettings.ACPI.DisabledAML[i]) == 0) +// ) { + ACPIDisabled = true; + break; + } + } + ACPIPatchedAMLTmp->MenuItem.BValue = ACPIDisabled; + ACPIPatchedAML.AddReference(ACPIPatchedAMLTmp, true); + } - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; + DirIterClose(&DirIter); } -void CreateMenuProps(REFIT_MENU_SCREEN* SubScreen, SETTINGS_DATA::DevicesClass::SimplePropertyClass* Prop) +void +GetListOfThemes () { - REFIT_INPUT_DIALOG *InputBootArgs; - - InputBootArgs = new REFIT_INPUT_DIALOG; - InputBootArgs->Title.SWPrintf(" key: %s", Prop->Key.c_str()); - InputBootArgs->Row = 0xFFFF; //cursor - InputBootArgs->Item = &Prop->MenuItem; - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - switch (Prop->ValueType) { - case kTagTypeInteger: - SubScreen->AddMenuInfo_f(" value: 0x%08llx", *(UINT64*)Prop->Value.data()); - break; - case kTagTypeString: - SubScreen->AddMenuInfo_f(" value: %90s", Prop->Value.data()); - break; - case kTagTypeFalse: - SubScreen->AddMenuInfo_f((" value: false")); - break; - case kTagTypeTrue: - SubScreen->AddMenuInfo_f((" value: true")); - break; - case kTagTypeFloat: - SubScreen->AddMenuInfo_f(" value: %f", *(float*)Prop->Value.data()); - break; - default: //type data, print first 24 bytes - SubScreen->AddMenuInfo_f(" value[%zu]: %24s", Prop->Value.size(), Bytes2HexStr((UINT8*)Prop->Value.data(), MIN(24, Prop->Value.size())).c_str()); - break; - } + EFI_STATUS Status = EFI_NOT_FOUND; + REFIT_DIR_ITER DirIter; + EFI_FILE_INFO *DirEntry; + XStringW ThemeTestPath; + EFI_FILE *ThemeTestDir = NULL; + UINT8 *ThemePtr = NULL; + UINTN Size = 0; + + DbgHeader("GetListOfThemes"); + + ThemeNameArray.setEmpty(); + if ( !self.themesDirExists() ) { + DBG("No theme dir was discovered\n"); + return; + } + DirIterOpen(&self.getThemesDir(), NULL, &DirIter); + while (DirIterNext(&DirIter, 1, L"*", &DirEntry)) { + if (DirEntry->FileName[0] == '.') { + //DBG("Skip theme: %ls\n", DirEntry->FileName); + continue; + } + //DBG("Found theme directory: %ls", DirEntry->FileName); + DBG("- [%02zu]: %ls", ThemeNameArray.size(), DirEntry->FileName); + Status = self.getThemesDir().Open(&self.getThemesDir(), &ThemeTestDir, DirEntry->FileName, EFI_FILE_MODE_READ, 0); + if (!EFI_ERROR(Status)) { + Status = egLoadFile(ThemeTestDir, CONFIG_THEME_FILENAME, &ThemePtr, &Size); + if (EFI_ERROR(Status) || (ThemePtr == NULL) || (Size == 0)) { + Status = egLoadFile(ThemeTestDir, CONFIG_THEME_SVG, &ThemePtr, &Size); + if (EFI_ERROR(Status)) { + Status = EFI_NOT_FOUND; + DBG(" - bad theme because %ls nor %ls can't be load", CONFIG_THEME_FILENAME, CONFIG_THEME_SVG); + } + } + if (!EFI_ERROR(Status)) { + //we found a theme + if ((StriCmp(DirEntry->FileName, L"embedded") == 0) || + (StriCmp(DirEntry->FileName, L"random") == 0)) { + ThemePtr = NULL; + } else { + ThemeNameArray.Add(DirEntry->FileName); + } + } + } + DBG("\n"); + if (ThemePtr) { + FreePool(ThemePtr); + } + } + DirIterClose(&DirIter); } -REFIT_ABSTRACT_MENU_ENTRY* SubMenuProperties() +// +// secondary main entry point +// +EFI_STATUS +EFIAPI +RefitMainMain (IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable) { - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; + EFI_STATUS Status; + XBool MainLoopRunning = true; + XBool ReinitDesktop = true; + XBool AfterTool = false; + REFIT_ABSTRACT_MENU_ENTRY *ChosenEntry = NULL; + REFIT_ABSTRACT_MENU_ENTRY *DefaultEntry = NULL; + REFIT_ABSTRACT_MENU_ENTRY *OptionEntry = NULL; + INTN DefaultIndex; + UINTN MenuExit; + UINTN i; + EFI_TIME Now; + XBool HaveDefaultVolume; + REFIT_MENU_SCREEN BootScreen; + BootScreen.isBootScreen = true; //other screens will be constructed as false + + MemLogInit(); + + // bootstrap + gST = SystemTable; + gImageHandle = ImageHandle; + gBS = SystemTable->BootServices; + gRT = SystemTable->RuntimeServices; + /*Status = */EfiGetSystemConfigurationTable (&gEfiDxeServicesTableGuid, (void **) &gDS); + + + InitBooterLog(); - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_DEVICES, "Properties->"_XS8); +// ConsoleInHandle = SystemTable->ConsoleInHandle; + +//#define DEBUG_ERALY_CRASH +#ifdef DEBUG_ERALY_CRASH + SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step1"); +// PauseForKey(); +#endif + +#ifdef DEBUG_ON_SERIAL_PORT + SerialPortInitialize(); +#endif - for ( size_t idx = 0 ; idx < gSettings.Devices.Properties.PropertyArray.size(); ++idx) { - SETTINGS_DATA::DevicesClass::PropertiesClass::PropertyClass& Prop = gSettings.Devices.Properties.PropertyArray[idx]; + EFI_LOADED_IMAGE* LoadedImage; + Status = gBS->HandleProtocol(gImageHandle, &gEfiLoadedImageProtocolGuid, (void **) &LoadedImage); - if ( idx > 0 ) SubScreen->AddMenuInfo_f("------------"); - SubScreen->AddMenuInfo_f("%ls", Prop.DevicePathAsString.wc_str()); - for ( size_t idxChild = 0 ; idxChild < Prop.propertiesArray.size(); ++idxChild) { - SETTINGS_DATA::DevicesClass::SimplePropertyClass& Props = Prop.propertiesArray[idxChild]; - CreateMenuProps(SubScreen, &Props); +#ifdef DEBUG_ERALY_CRASH + SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step2"); +// PauseForKey(); +#endif + +// if ( !EFI_ERROR(Status) ) { +// XString8 msg = S8Printf("CloverX64 : Image base = 0x%llX\n", (uintptr_t)LoadedImage->ImageBase); // do not change, it's used by grep to feed the debugger +// SerialPortWrite((UINT8*)msg.c_str(), msg.length()); +// } + if ( !EFI_ERROR(Status) ) { + DBG("CloverX64 : Image base = 0x%llX\n", (uintptr_t)LoadedImage->ImageBase); // do not change, it's used by grep to feed the debugger + DBG("Clover ImageHandle = %llx\n", (uintptr_t)ImageHandle); +#ifdef DEBUG_ERALY_CRASH + SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step3"); +// PauseForKey(); +#endif } +#ifdef JIEF_DEBUG + gBS->Stall(2500000); // to give time to gdb to connect +// PauseForKey(); +#endif } - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - Entry->SubScreen = SubScreen; - return Entry; -} -REFIT_ABSTRACT_MENU_ENTRY* SubMenuPCI() -{ - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_USB, "PCI devices->"_XS8); - - SubScreen->AddMenuItemInput(74, "USB Ownership", false); - SubScreen->AddMenuItemInput(92, "USB Injection", false); - SubScreen->AddMenuItemInput(93, "Inject ClockID", false); - SubScreen->AddMenuItemInput(106, "Inject EFI Strings", false); - SubScreen->AddMenuItemInput(107, "No Default Properties", false); - SubScreen->AddMenuItemInput(97, "FakeID LAN:", true); - SubScreen->AddMenuItemInput(98, "FakeID WIFI:", true); - SubScreen->AddMenuItemInput(99, "FakeID SATA:", true); - SubScreen->AddMenuItemInput(100, "FakeID XHCI:", true); - SubScreen->AddMenuItemInput(103, "FakeID IMEI:", true); - SubScreen->AddMenuEntry(SubMenuProperties(), true); - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - Entry->SubScreen = SubScreen; - return Entry; -} +#ifdef DEBUG_ERALY_CRASH + SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step4"); +// PauseForKey(); +#endif +#ifdef CLOVER_BUILD + // BE CAREFUL. construct_globals_objects will call ctor on every static struct and classes. + // For example, if you do "gCPUStructure.TSCCalibr = GetMemLogTscTicksPerSecond();" before this point, it will be erased by construct_globals_objects() + construct_globals_objects(gImageHandle); +#endif -REFIT_ABSTRACT_MENU_ENTRY* SubMenuThemes() -{ - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_MENU_SWITCH *InputBootArgs; - UINTN i; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_THEME, "Themes->"_XS8); - - SubScreen->AddMenuInfoLine_f("Installed themes:"); - //add embedded - SubScreen->AddMenuItemSwitch(3, "embedded", false); - - for (i = 0; i < ThemeNameArray.size(); i++) { - InputBootArgs = new REFIT_MENU_SWITCH; - InputBootArgs->Title.takeValueFrom(ThemeNameArray[i]); - InputBootArgs->Row = i + 1; - InputBootArgs->Item = &InputItems[3]; - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - } - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; -} + MemoryTrackerInstallHook(); -REFIT_ABSTRACT_MENU_ENTRY* SubMenuGUI() -{ - // init - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; + gCPUStructure.TSCCalibr = GetMemLogTscTicksPerSecond(); //ticks for 1second - // create the entry in the options menu - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_GUI, "GUI tuning->"_XS8); +#ifdef DEBUG_ERALY_CRASH + SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step5"); + PauseForKey(); +#endif - // submenu description - SubScreen->AddMenuInfoLine_f("Choose options to tune the Interface"); +#ifdef JIEF_DEBUG +// all_tests(); +// PauseForKey(L"press\n"); +#endif - SubScreen->AddMenuItemInput(70, "Pointer Speed:", true); - SubScreen->AddMenuItemInput(72, "Mirror Move", false); - SubScreen->AddMenuEntry(SubMenuThemes(), true); + gRT->GetTime(&Now, NULL); - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; -} + Status = InitRefitLib(gImageHandle); // From here, debug.log starts to be saved because InitRefitLib call self.initialize() + if (EFI_ERROR(Status)) + return Status; +#ifdef DEBUG_ERALY_CRASH + SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Step6"); + PauseForKey(); +#endif -/* - * This is a simple and user friendly submenu which makes it possible to modify - * the System Integrity Protection configuration from the Clover's GUI. - * Author: Needy. - * The below function is based on the SubMenuDsdtFix function. - */ -REFIT_ABSTRACT_MENU_ENTRY* SubMenuCSR() -{ - // init - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - // create the entry in the main menu - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_CSR, NullXString8); - - // submenu description - SubScreen->AddMenuInfoLine_f("Modify the System Integrity Protection configuration."); - SubScreen->AddMenuInfoLine_f("All configuration changes apply to the entire machine."); - - // available configurations - SubScreen->AddMenuCheck("Allow Untrusted Kexts", CSR_ALLOW_UNTRUSTED_KEXTS, 66); - SubScreen->AddMenuCheck("Allow Unrestricted FS", CSR_ALLOW_UNRESTRICTED_FS, 66); - SubScreen->AddMenuCheck("Allow Task For PID", CSR_ALLOW_TASK_FOR_PID, 66); - SubScreen->AddMenuCheck("Allow Kernel Debuger", CSR_ALLOW_KERNEL_DEBUGGER, 66); - SubScreen->AddMenuCheck("Allow Apple Internal", CSR_ALLOW_APPLE_INTERNAL, 66); - SubScreen->AddMenuCheck("Allow Unrestricted DTrace", CSR_ALLOW_UNRESTRICTED_DTRACE, 66); - SubScreen->AddMenuCheck("Allow Unrestricted NVRAM", CSR_ALLOW_UNRESTRICTED_NVRAM, 66); - SubScreen->AddMenuCheck("Allow Device Configuration", CSR_ALLOW_DEVICE_CONFIGURATION, 66); - SubScreen->AddMenuCheck("Allow Any Recovery OS", CSR_ALLOW_ANY_RECOVERY_OS, 66); - SubScreen->AddMenuCheck("Allow Unapproved Kexts", CSR_ALLOW_UNAPPROVED_KEXTS, 66); - SubScreen->AddMenuCheck("Allow Executable Policy Override", CSR_ALLOW_EXECUTABLE_POLICY_OVERRIDE, 66); - SubScreen->AddMenuCheck("Allow Non-authenticated Root", CSR_ALLOW_NON_AUTHENTICATED_ROOT, 66); - - // return - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - ModifyTitles(Entry); - return Entry; -} -/* -REFIT_ABSTRACT_MENU_ENTRY* SubMenuBLC() -{ - // init - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - // create the entry in the main menu - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_BLC, NullXString8); - - // submenu description - SubScreen->AddMenuInfoLine_f("Modify flags for boot.efi"); - - SubScreen->AddMenuCheck("Reboot On Panic", kBootArgsFlagRebootOnPanic, 65); - SubScreen->AddMenuCheck("Hi DPI", kBootArgsFlagHiDPI, 65); - SubScreen->AddMenuCheck("Black Screen", kBootArgsFlagBlack, 65); - SubScreen->AddMenuCheck("CSR Active Config", kBootArgsFlagCSRActiveConfig, 65); - SubScreen->AddMenuCheck("CSR Pending Config", kBootArgsFlagCSRConfigMode, 65); - SubScreen->AddMenuCheck("CSR Boot", kBootArgsFlagCSRBoot, 65); - SubScreen->AddMenuCheck("Black Background", kBootArgsFlagBlackBg, 65); - SubScreen->AddMenuCheck("Login UI", kBootArgsFlagLoginUI, 65); - SubScreen->AddMenuCheck("Install UI", kBootArgsFlagInstallUI, 65); - - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - ModifyTitles(Entry); - return Entry; -} -*/ -REFIT_ABSTRACT_MENU_ENTRY* SubMenuSystem() -{ - // init - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; +// firmware detection + gFirmwareClover = StrCmp(gST->FirmwareVendor, L"CLOVER") == 0; + if (!gFirmwareRevision) { +// gFirmwareRevision = P__oolPrint(L"%d", gST->FirmwareRevision); + } + DataHubInstall (ImageHandle, SystemTable); + InitializeConsoleSim(); - // create the entry in the options menu - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_SYSTEM, "System Parameters->"_XS8); + DbgHeader("Starting Clover"); + if (Now.TimeZone < -1440 || Now.TimeZone > 1440) { + MsgLog("Now is %02d.%02d.%d, %02d:%02d:%02d (GMT)\n", + Now.Day, Now.Month, Now.Year, Now.Hour, Now.Minute, Now.Second); + } else { + MsgLog("Now is %02d.%02d.%d, %02d:%02d:%02d (GMT+%d)\n", + Now.Day, Now.Month, Now.Year, Now.Hour, Now.Minute, Now.Second, gSettings.GUI.Timezone); + } + //MsgLog("Starting Clover rev %ls on %ls EFI\n", gFirmwareRevision, gST->FirmwareVendor); + MsgLog("Starting %s on %ls EFI\n", gRevisionStr, gST->FirmwareVendor); + MsgLog("Build id: %s\n", gBuildId.c_str()); + if ( gBuildInfo ) DBG("Build with: [%s]\n", gBuildInfo); +#ifdef JIEF_DEBUG + displayFreeMemory(""_XS8); +#endif - // submenu description - SubScreen->AddMenuInfoLine_f("Choose options for booted OS"); + //dumping SETTING structure + // if you change something in Platform.h, please uncomment and test that all offsets + // are natural aligned i.e. pointers are 8 bytes aligned + /* + DBG("Settings offsets:\n"); + DBG(" OEMProduct: %X\n", OFFSET_OF(SETTINGS_DATA, OEMProduct)); + DBG(" DefaultVolume: %X\n", OFFSET_OF(SETTINGS_DATA, DefaultVolume)); + DBG(" DefaultLoader: %X\n", OFFSET_OF(SETTINGS_DATA, DefaultLoader)); + DBG(" ResetAddr: %X\n", OFFSET_OF(SETTINGS_DATA, ResetAddr)); + DBG(" FixDsdt: %X\n", OFFSET_OF(SETTINGS_DATA, FixDsdt)); + DBG(" FakeATI: %X\n", OFFSET_OF(SETTINGS_DATA, FakeATI)); + DBG(" PatchVBiosBytes:%X\n", OFFSET_OF(SETTINGS_DATA, PatchVBiosBytes)); + DBG(" VRAM: %X\n", OFFSET_OF(SETTINGS_DATA, VRAM)); + DBG(" SecureBootWhiteListCount: %X\n", OFFSET_OF(SETTINGS_DATA, SecureBootWhiteListCount)); + DBG(" LegacyBoot: %X\n", OFFSET_OF(SETTINGS_DATA, LegacyBoot)); + DBG(" HVHideStrings: %X\n", OFFSET_OF(SETTINGS_DATA, HVHideStrings)); + DBG(" PointerSpeed: %X\n", OFFSET_OF(SETTINGS_DATA, PointerSpeed)); + DBG(" RtMLB: %X\n", OFFSET_OF(SETTINGS_DATA, RtMLB)); + DBG(" ConfigName: %X\n", OFFSET_OF(SETTINGS_DATA, ConfigName)); + DBG(" PointerSpeed: %X\n", OFFSET_OF(SETTINGS_DATA, PointerSpeed)); + DBG(" PatchDsdtNum: %X\n", OFFSET_OF(SETTINGS_DATA, PatchDsdtNum)); + DBG(" LenToReplace: %X\n", OFFSET_OF(SETTINGS_DATA, LenToReplace)); + DBG(" ACPIDropTables: %X\n", OFFSET_OF(SETTINGS_DATA, ACPIDropTables)); + DBG(" CustomEntries: %X\n", OFFSET_OF(SETTINGS_DATA, CustomEntries)); + DBG(" CustomTool: %X\n", OFFSET_OF(SETTINGS_DATA, CustomTool)); + DBG(" AddProperties: %X\n", OFFSET_OF(SETTINGS_DATA, AddProperties)); + DBG(" BlockKexts: %X\n", OFFSET_OF(SETTINGS_DATA, BlockKexts)); + */ + + // disable EFI watchdog timer + gBS->SetWatchdogTimer(0x0000, 0x0000, 0x0000, NULL); +// ZeroMem((void*)&gSettings, sizeof(SETTINGS_DATA)); + + Status = InitializeUnicodeCollationProtocol(); + if (EFI_ERROR(Status)) { + DBG("UnicodeCollation Status=%s\n", efiStrError(Status)); + } + +// Status = gBS->HandleProtocol(ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (void **)&SimpleTextEx); +// if ( EFI_ERROR(Status) ) { +// SimpleTextEx = NULL; +// } +// DBG("SimpleTextEx Status=%s\n", efiStrError(Status)); - SubScreen->AddMenuItemInput(2, "Block kext:", true); - SubScreen->AddMenuItemInput(51, "Set OS version if not detected:", true); - SubScreen->AddMenuItemInput(118, "Booter Cfg Command:", true); - SubScreen->AddMenuItemInput(129, "Reset SMC", false); + gConf.InitialisePlatform(); - SubScreen->AddMenuEntry(SubMenuCSR(), true); -// SubScreen->AddMenuEntry(SubMenuBLC(), true); +#ifdef JIEF_DEBUG + //DumpNvram(); +#endif - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; -} + /* + * saving debug.log works from here + */ -REFIT_ABSTRACT_MENU_ENTRY* SubMenuConfigs() -{ - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - REFIT_MENU_SWITCH *InputBootArgs; - UINTN i; - - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_THEME, "Configs->"_XS8); - - SubScreen->AddMenuInfoLine_f("Select a config file:"); - - for (i = 0; i < ConfigsList.size(); i++) { - InputBootArgs = new REFIT_MENU_SWITCH; - InputBootArgs->Title = ConfigsList[i]; - InputBootArgs->Row = i; - InputBootArgs->Item = &InputItems[90]; - InputBootArgs->AtClick = ActionEnter; - InputBootArgs->AtRightClick = ActionDetails; - SubScreen->AddMenuEntry(InputBootArgs, true); - } - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - return Entry; -} -REFIT_ABSTRACT_MENU_ENTRY* SubMenuQuirks() -{ - // init - REFIT_MENU_ITEM_OPTIONS *Entry; - REFIT_MENU_SCREEN *SubScreen; - - // create the entry in the main menu - Entry = newREFIT_MENU_ITEM_OPTIONS(&SubScreen, ActionEnter, SCREEN_QUIRKS, NullXString8); - Entry->Title.SWPrintf("Quirks mask [0x%04x]->", gSettings.Quirks.QuirksMask); - - // submenu description - SubScreen->AddMenuInfoLine_f("Choose options to fix memory"); - - SubScreen->AddMenuCheck("AvoidRuntimeDefrag", QUIRK_DEFRAG, 101); - SubScreen->AddMenuCheck("DevirtualiseMmio", QUIRK_MMIO, 101); - SubScreen->AddMenuCheck("DisableSingleUser", QUIRK_SU, 101); - SubScreen->AddMenuCheck("DisableVariableWrite", QUIRK_VAR, 101); - SubScreen->AddMenuCheck("DiscardHibernateMap", QUIRK_HIBER, 101); - SubScreen->AddMenuCheck("EnableSafeModeSlide", QUIRK_SAFE, 101); - SubScreen->AddMenuCheck("EnableWriteUnprotector", QUIRK_UNPROT, 101); - SubScreen->AddMenuCheck("ForceExitBootServices", QUIRK_EXIT, 101); - SubScreen->AddMenuCheck("ProtectMemoryRegions", QUIRK_REGION, 101); - SubScreen->AddMenuCheck("ProtectSecureBoot", QUIRK_SECURE, 101); - SubScreen->AddMenuCheck("ProtectUefiServices", QUIRK_UEFI, 101); - SubScreen->AddMenuCheck("ProvideCustomSlide", QUIRK_CUSTOM, 101); -//decimal - SubScreen->AddMenuItemInput(122, "ProvideMaxSlide:", true); - SubScreen->AddMenuCheck("RebuildAppleMemoryMap", QUIRK_MAP, 101); - SubScreen->AddMenuItemInput(127, "ResizeAppleGpuBars:", true); - SubScreen->AddMenuCheck("SetupVirtualMap", QUIRK_VIRT, 101); - SubScreen->AddMenuCheck("SyncRuntimePermissions", QUIRK_PERM, 101); - - SubScreen->AddMenuItemInput(130, "TscSyncTimeout:", true); + { +// UINT32 machineSignature = 0; + EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtPointer = NULL; + EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs = NULL; + +// DBG("---dump hibernations data---\n"); + FadtPointer = GetFadt(); + if (FadtPointer != NULL) { + Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*)(UINTN)(FadtPointer->FirmwareCtrl); + /* + DBG(" Firmware wake address=%08lx\n", Facs->FirmwareWakingVector); + DBG(" Firmware wake 64 addr=%16llx\n", Facs->XFirmwareWakingVector); + DBG(" Hardware signature =%08lx\n", Facs->HardwareSignature); + DBG(" GlobalLock =%08lx\n", Facs->GlobalLock); + DBG(" Flags =%08lx\n", Facs->Flags); + */ + machineSignature = Facs->HardwareSignature; + } +#if HIBERNATE_DUMP_DATA +//------------------------------------------------------ + DumpVariable(L"Boot0082", gEfiGlobalVariableGuid, 8); + DumpVariable(L"boot-switch-vars", gEfiAppleBootGuid, -1); + DumpVariable(L"boot-signature", gEfiAppleBootGuid, -1); + DumpVariable(L"boot-image-key", gEfiAppleBootGuid, -1); + DumpVariable(L"boot-image", gEfiAppleBootGuid, 0); +//----------------------------------------------------------- + +#endif // + } + +#if 0 + //testing place + { + //#define ARRAY_SIZE(Array) (sizeof (Array) / sizeof ((Array)[0])) + #define L_STR_LEN(String) (ARRAY_SIZE (String) - 1) +DBG("strlen '<' =%ld or %lld\n", L_STR_LEN("<"), AsciiStrLen("<")); + DBG(" size CHAR8=%ld\n", sizeof(CHAR8)); + DBG(" size CHAR16=%ld\n", sizeof(CHAR16)); + DBG(" size wchar_t=%ld\n", sizeof(wchar_t)); + DBG(" size char32_t=%ld\n", sizeof(char32_t)); + DBG(" size char16_t=%ld\n", sizeof(char16_t)); + const CHAR16 aaa[] = L"12345 "; + const CHAR8 *bbb = "12345 "; + DBG(" string %ls, size=%lld, len=%lld sizeof=%ld iStrLen=%lld\n", aaa, StrSize(aaa), StrLen(aaa), sizeof(aaa), iStrLen(bbb, 10)); + const CHAR8* ccc = "Выход "; + DBG(" string %s, size=%lld, len=%lld sizeof=%ld iStrLen=%lld\n", ccc, AsciiStrSize(ccc), AsciiStrLen(ccc), sizeof(ccc), iStrLen(ccc, 10)); + XString8 ddd = "Выход "_XS8; + // size_t sizex = ddd.allocatedSize(); + DBG(" xstring %s, asize=%ld, sizeinbyte=%ld sizeof=%ld lastcharat=%ld\n", ddd.c_str(), ddd.allocatedSize(), + ddd.sizeInBytes(), sizeof(ddd), ddd.indexOf(ddd.lastChar())); + CHAR8 compatible[64]; + UINT32 FakeLAN = 0x0030168c; + UINT32 FakeID = FakeLAN >> 16; + UINT32 FakeVendor = FakeLAN & 0xFFFF; + snprintf(compatible, 64, "pci%x,%x", FakeVendor, FakeID); + DBG(" FakeLAN = 0x%x\n", FakeLAN); + DBG(" Compatible=%s strlen=%ld sizeof=%ld iStrLen=%lld\n", compatible, + strlen(compatible), sizeof(compatible), iStrLen(compatible, 64)); +// LowCase(compatible); +// DBG(" Low Compatible=%s strlen=%ld sizeof=%ld iStrLen=%lld\n", compatible, +// strlen(compatible), sizeof(compatible), iStrLen(compatible, 64)); + + DBG("void*=%ld int=%ld long=%ld longlong=%ld enum=%ld\n", + sizeof(void*), sizeof(int), sizeof(long int), sizeof(long long), sizeof(EFI_ALLOCATE_TYPE)); + /* + Results + 1:200 0:025 size CHAR8=1 + 1:226 0:025 size CHAR16=2 + 1:251 0:024 size wchar_t=2 + 1:275 0:024 size char16_t=2 + 1:381 0:000 string 12345 , size=16, len=7 sizeof=16 iStrLen=5 + 1:381 0:000 string Выход , size=13, len=12 sizeof=8 iStrLen=10 + 1:381 0:000 xstring Выход , asize=0, sizeinbyte=11 sizeof=16 lastcharat=5 + 1:381 0:000 FakeLAN = 0x30168c + 1:381 0:000 Compatible=pci168c,30 strlen=10 sizeof=64 iStrLen=10 + 1:430 0:025 void*=8 int=4 long=8 longlong=8 enum=4 + */ + } +#endif + if (!GlobalConfig.isFastBoot()) { + GetListOfThemes(); + GetListOfConfigs(); +// SmbiosList.setEmpty(); +// SmbiosList.AddReference(new XStringW(L"auto"_XSW), true); + } +// ThemeX->FillByEmbedded(); //init XTheme before EarlyUserSettings + { + void *Value = NULL; + UINTN Size = 0; + //read aptiofixflag from nvram for special boot + Status = GetVariable2(L"aptiofixflag", gEfiAppleBootGuid, &Value, &Size); + if (!EFI_ERROR(Status)) { + GlobalConfig.SpecialBootMode = true; + FreePool(Value); + DBG("Fast option enabled\n"); + } + } + +// for (i=0; i<2; i++) { +// if (gConfigDict[i]) { +// GetEarlyUserSettings(gConfigDict[i], gSettings); +// } +// } + +#ifdef ENABLE_SECURE_BOOT + // Install secure boot shim + if (EFI_ERROR(Status = InstallSecureBoot())) { + PauseForKey("Secure boot failure!\n"_XS8); + return Status; + } +#endif // ENABLE_SECURE_BOOT + + MainMenu.TimeoutSeconds = gSettings.Boot.Timeout >= 0 ? gSettings.Boot.Timeout : 0; + //DBG("LoadDrivers() start\n"); + LoadDrivers(); - SubScreen->AddMenuEntry(&MenuEntryReturn, false); - ModifyTitles(Entry); + Status = gBS->LocateProtocol(gEmuVariableControlProtocolGuid, NULL, (void**)&gEmuVariableControl); + if (EFI_ERROR(Status)) { + gEmuVariableControl = NULL; + } + if (gEmuVariableControl != NULL) { + gEmuVariableControl->InstallEmulation(gEmuVariableControl); + } + + DbgHeader("InitScreen"); + + if (!GlobalConfig.isFastBoot()) { + // init screen and dump video modes to log + if (gDriversFlags.VideoLoaded) { + InitScreen(false); + } else { + InitScreen(!gFirmwareClover); // ? false : true); + } + //DBG("DBG: setup screen\n"); + SetupScreen(); + } else { + InitScreen(false); + } + + //DBG("ReinitRefitLib\n"); + //Now we have to reinit handles + Status = ReinitRefitLib(); + if (EFI_ERROR(Status)){ + // DebugLog(2, " %s", efiStrError(Status)); + PauseForKey("Error reinit refit."_XS8); +#ifdef ENABLE_SECURE_BOOT + UninstallSecureBoot(); +#endif // ENABLE_SECURE_BOOT + return Status; + } + + ThemeX = new XTheme(); + + // DBG("DBG: messages\n"); + if (!gSettings.Boot.NoEarlyProgress && !GlobalConfig.isFastBoot() && gSettings.Boot.Timeout>0) { + XStringW Message = SWPrintf(" Welcome to Clover %ls ", gFirmwareRevision); + BootScreen.DrawTextXY(Message, (UGAWidth >> 1), UGAHeight >> 1, X_IS_CENTER); + BootScreen.DrawTextXY(L"... testing hardware ..."_XSW, (UGAWidth >> 1), (UGAHeight >> 1) + 20, X_IS_CENTER); + } + +// DumpBiosMemoryMap(); + +// PrintMemoryMap(); + + GuiEventsInitialize(); + + //DBG("ScanSPD() start\n"); + ScanSPD(); + //DBG("ScanSPD() end\n"); + + SetPrivateVarProto(); +// GetDefaultSettings(); + GetAcpiTablesList(); + + + if (!gSettings.Boot.NoEarlyProgress && !GlobalConfig.isFastBoot() && gSettings.Boot.Timeout>0) { + XStringW Message = SWPrintf("... user settings ..."); + BootScreen.EraseTextXY(); + BootScreen.DrawTextXY(Message, (UGAWidth >> 1), (UGAHeight >> 1) + 20, X_IS_CENTER); + } - return Entry; -} + afterGetUserSettings(gSettings); + gFakeCPUID = gSettings.KernelAndKextPatches.FakeCPUID; + DBG("Set FakeCPUID: 0x%X\n", gFakeCPUID); + + HaveDefaultVolume = gSettings.Boot.DefaultVolume.notEmpty(); + if (!gFirmwareClover && + !gDriversFlags.EmuVariableLoaded && + !HaveDefaultVolume && + gSettings.Boot.Timeout == 0 && !ReadAllKeyStrokes()) { +// UEFI boot: get gEfiBootDeviceGuid from NVRAM. +// if present, ScanVolumes() will skip scanning other volumes +// in the first run. +// this speeds up loading of default macOS volume. + GetEfiBootDeviceFromNvram(); + } + + if (!gSettings.Boot.NoEarlyProgress && !GlobalConfig.isFastBoot() && gSettings.Boot.Timeout>0) { + XStringW Message = SWPrintf("... scan entries ..."); + BootScreen.EraseTextXY(); + BootScreen.DrawTextXY(Message, (UGAWidth >> 1), (UGAHeight >> 1) + 20, X_IS_CENTER); + } + + AfterTool = false; + gGuiIsReady = true; + GlobalConfig.gBootChanged = true; + GlobalConfig.gThemeChanged = true; + + do { + if (GlobalConfig.gBootChanged && GlobalConfig.gThemeChanged) { // config changed + GetListOfDsdts(); //only after GetUserSettings + GetListOfACPI(); //ssdt and other tables + } + GlobalConfig.gBootChanged = false; + MainMenu.Entries.setEmpty(); + OptionMenu.Entries.setEmpty(); + InitKextList(); + ScanVolumes(); + + // as soon as we have Volumes, find latest nvram.plist and copy it to RT vars + if (!AfterTool) { + if (gFirmwareClover || gDriversFlags.EmuVariableLoaded) { + PutNvramPlistToRtVars(); + } + } + + // log Audio devices in boot-log. This is for clients like Clover.app + GetOutputs(); + for (i = 0; i < AudioList.size(); i++) { + if (AudioList[i].Name.notEmpty()) { + // Never change this log, otherwise clients will stop interpret the output. + MsgLog("Found Audio Device %ls (%s) at index %llu\n", AudioList[i].Name.wc_str(), AudioOutputNames[AudioList[i].Device], i); + } + } + + if (!GlobalConfig.isFastBoot()) { + if (gThemeNeedInit) { + UINTN Size = 0; + CHAR8* ChoosenTheme = (CHAR8*)GetNvramVariable(L"Clover.Theme", gEfiAppleBootGuid, NULL, &Size); + InitTheme(ChoosenTheme); + FreePool(ChoosenTheme); + gThemeNeedInit = false; + } else if (GlobalConfig.gThemeChanged) { + DBG("change theme\n"); + InitTheme(NULL); + AboutMenu.Entries.setEmpty(); + HelpMenu.Entries.setEmpty(); + } + DBG("theme inited\n"); + if (ThemeX->embedded) { + DBG("Chosen embedded theme\n"); + } else { + DBG("Chosen theme %ls\n", ThemeX->Theme.wc_str()); + } + //now it is a time to set RtVariables + SetVariablesFromNvram(); + + XString8Array TmpArgs = Split<XString8Array>(gSettings.Boot.BootArgs, " "); + DBG("after NVRAM boot-args=%s\n", gSettings.Boot.BootArgs.c_str()); + GlobalConfig.OptionsBits = EncodeOptions(TmpArgs); +// DBG("initial OptionsBits %X\n", GlobalConfig.OptionsBits); + FillInputs(true); + + // scan for loaders and tools, add then to the menu + if (gSettings.GUI.Scan.LegacyFirst){ + AddCustomLegacy(); + if (!gSettings.GUI.Scan.NoLegacy) { + ScanLegacy(); + } + } + } + GetSmcKeys(true); + + // Add custom entries + AddCustomEntries(); + if (gSettings.GUI.Scan.DisableEntryScan) { + DBG("Entry scan disabled\n"); + } else { + ScanLoader(); + } -void OptionsMenu(OUT REFIT_ABSTRACT_MENU_ENTRY **ChosenEntry) -{ - REFIT_ABSTRACT_MENU_ENTRY *TmpChosenEntry = NULL; - REFIT_ABSTRACT_MENU_ENTRY *NextChosenEntry = NULL; - UINTN MenuExit = 0; - UINTN SubMenuExit; - UINTN NextMenuExit; - INTN EntryIndex = 0; - INTN SubEntryIndex = -1; //value -1 means old position to remember - INTN NextEntryIndex = -1; - - XBool OldFontStyle = ThemeX->Proportional; - ThemeX->Proportional = false; //temporary disable proportional - - - // remember, if you extended this menu then change procedures - // FillInputs and ApplyInputs - gThemeOptionsChanged = false; - - if (OptionMenu.Entries.size() == 0) { - OptionMenu.Daylight = ThemeX->Daylight; - if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_MENU_TITLE_IMAGE)) { - OptionMenu.TitleImage = ThemeX->GetIcon(BUILTIN_ICON_FUNC_OPTIONS); - } - gThemeOptionsChanged = true; - OptionMenu.ID = SCREEN_OPTIONS; - OptionMenu.GetAnime(); //false; - - OptionMenu.AddMenuItemInput(0, "Boot Args:", true); - OptionMenu.AddMenuEntry( SubMenuConfigs(), true); - - if (AllowGraphicsMode) { - OptionMenu.AddMenuEntry( SubMenuGUI(), true); - } - OptionMenu.AddMenuEntry( SubMenuACPI(), true); - OptionMenu.AddMenuEntry( SubMenuChooseSmbios(), true); - // OptionMenu.AddMenuEntry( SubMenuSmbios(), true); - OptionMenu.AddMenuEntry( SubMenuBinaries(), true); - OptionMenu.AddMenuEntry( SubMenuQuirks(), true); - OptionMenu.AddMenuEntry( SubMenuGraphics(), true); - OptionMenu.AddMenuEntry( SubMenuPCI(), true); - OptionMenu.AddMenuEntry( SubMenuSpeedStep(), true); - OptionMenu.AddMenuEntry( SubMenuAudio(), true); - OptionMenu.AddMenuEntry( SubMenuAudioPort(), true); - OptionMenu.AddMenuEntry( SubMenuSystem(), true); - OptionMenu.AddMenuEntry( &MenuEntryReturn, false); - //DBG("option menu created entries=%d\n", OptionMenu.Entries.size()); - } - - while (!MenuExit) { - MenuExit = OptionMenu.RunGenericMenu(&EntryIndex, ChosenEntry); - if (MenuExit == MENU_EXIT_ESCAPE || (*ChosenEntry)->getREFIT_MENU_ITEM_RETURN()) + if (!GlobalConfig.isFastBoot()) { + if (!gSettings.GUI.Scan.LegacyFirst) { + AddCustomLegacy(); + if (!gSettings.GUI.Scan.NoLegacy) { + ScanLegacy(); + } + } + + // fixed other menu entries + if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_TOOLS)) { + AddCustomTool(); + if (!gSettings.GUI.Scan.DisableToolScan) { + ScanTool(); +#ifdef ENABLE_SECURE_BOOT + // Check for secure boot setup mode + AddSecureBootTool(); +#endif // ENABLE_SECURE_BOOT + } + } + + MenuEntryOptions.Image = ThemeX->GetIcon(BUILTIN_ICON_FUNC_OPTIONS); +// DBG("Options: IconID=%lld name=%s empty=%s\n", MenuEntryOptions.Image.Id, MenuEntryOptions.Image.Name.c_str(), + if (gSettings.Boot.DisableCloverHotkeys) + MenuEntryOptions.ShortcutLetter = 0x00; + MainMenu.AddMenuEntry(&MenuEntryOptions, false); + + MenuEntryAbout.Image = ThemeX->GetIcon((INTN)BUILTIN_ICON_FUNC_ABOUT); +// DBG("About: IconID=%lld name=%s empty=%s\n", MenuEntryAbout.Image.Id, MenuEntryAbout.Image.Name.c_str(), + + if (gSettings.Boot.DisableCloverHotkeys) + MenuEntryAbout.ShortcutLetter = 0x00; + MainMenu.AddMenuEntry(&MenuEntryAbout, false); + + if (!(ThemeX->HideUIFlags & HIDEUI_FLAG_FUNCS) || MainMenu.Entries.size() == 0) { + if (gSettings.Boot.DisableCloverHotkeys) + MenuEntryReset.ShortcutLetter = 0x00; + MenuEntryReset.Image = ThemeX->GetIcon(BUILTIN_ICON_FUNC_RESET); + MainMenu.AddMenuEntry(&MenuEntryReset, false); + if (gSettings.Boot.DisableCloverHotkeys) + MenuEntryShutdown.ShortcutLetter = 0x00; + MenuEntryShutdown.Image = ThemeX->GetIcon(BUILTIN_ICON_FUNC_EXIT); + MainMenu.AddMenuEntry(&MenuEntryShutdown, false); + } + + } + // wait for user ACK when there were errors + FinishTextScreen(false); +#if CHECK_SMC + DumpSmcKeys(); +#endif + + DefaultIndex = FindDefaultEntry(); +// DBG("DefaultIndex=%lld and MainMenu.Entries.size()=%llu\n", DefaultIndex, MainMenu.Entries.size()); + if ((DefaultIndex >= 0) && (DefaultIndex < (INTN)MainMenu.Entries.size())) { + DefaultEntry = &MainMenu.Entries[DefaultIndex]; + } else { + DefaultEntry = NULL; + } + + MainLoopRunning = true; + if (DefaultEntry && (GlobalConfig.isFastBoot() || + (gSettings.Boot.SkipHibernateTimeout && + DefaultEntry->getLOADER_ENTRY() + && OSFLAG_ISSET(DefaultEntry->getLOADER_ENTRY()->Flags, OSFLAG_HIBERNATED)))) { + if (DefaultEntry->getLOADER_ENTRY()) { + DefaultEntry->StartLoader(); + } else if (DefaultEntry->getLEGACY_ENTRY()){ + DefaultEntry->StartLegacy(); + } + gSettings.Boot.FastBoot = false; //Hmm... will never be here + } +#ifdef JIEF_DEBUG +//MainMenu.TimeoutSeconds=1; +//DefaultEntry = NULL; +//DefaultIndex = MainMenu.Entries.length()-1; // this should be "Exit Clover" +#endif + AfterTool = false; + gEvent = 0; //clear to cancel loop + while (MainLoopRunning) { + if (gSettings.Boot.Timeout == 0 && DefaultEntry != NULL && !ReadAllKeyStrokes()) { + // go strait to DefaultVolume loading + MenuExit = MENU_EXIT_TIMEOUT; + } else { + MainMenu.GetAnime(); + if (GlobalConfig.gThemeChanged) { + GlobalConfig.gThemeChanged = false; + ThemeX->ClearScreen(); + } +#ifdef JIEF_DEBUG +displayFreeMemory("Before RunMainMenu"_XS8); +#endif + MenuExit = MainMenu.RunMainMenu(DefaultIndex, &ChosenEntry); + } +// DBG("exit from MainMenu %llu ChosenEntry=%zu\n", MenuExit, MainMenu.Entries.indexOf(*ChosenEntry)); //MENU_EXIT_ENTER=(1) MENU_EXIT_DETAILS=3 + // disable default boot - have sense only in the first run + gSettings.Boot.Timeout = -1; + if ((DefaultEntry != NULL) && (MenuExit == MENU_EXIT_TIMEOUT)) { + if (DefaultEntry->getLOADER_ENTRY()) { + DefaultEntry->StartLoader(); + } else if (DefaultEntry->getLEGACY_ENTRY()){ + DefaultEntry->StartLegacy(); + } + // if something goes wrong - break main loop to reinit volumes + break; + } + + if (MenuExit == MENU_EXIT_OPTIONS){ + GlobalConfig.gBootChanged = false; + OptionsMenu(&OptionEntry); + if (GlobalConfig.gBootChanged) { + AfterTool = true; + MainLoopRunning = false; + break; + } + continue; + } + + if (MenuExit == MENU_EXIT_HELP){ + HelpRefit(); + continue; + } + + // EjectVolume + if (MenuExit == MENU_EXIT_EJECT){ + Status = EFI_SUCCESS; + if (ChosenEntry->getLOADER_ENTRY() ) { + Status = EjectVolume(ChosenEntry->getLOADER_ENTRY()->Volume); + } + if ( ChosenEntry->getLEGACY_ENTRY() ) { + Status = EjectVolume(ChosenEntry->getLEGACY_ENTRY()->Volume); + } + if (!EFI_ERROR(Status)) { + break; //main loop is broken so Reinit all + } + continue; + } + + // Hide toggle + if (MenuExit == MENU_EXIT_HIDE_TOGGLE) { + MainMenu.Entries.includeHidden = !MainMenu.Entries.includeHidden; + continue; + } + + // We don't allow exiting the main menu with the Escape key. + if (MenuExit == MENU_EXIT_ESCAPE){ + break; //refresh main menu + // continue; + } + + if ( ChosenEntry->getREFIT_MENU_ITEM_RESET() ) { // Restart + if (MenuExit == MENU_EXIT_DETAILS) { + + //do clear cmos as for AMI BIOS + // not sure for more robust method + IoWrite8 (PCAT_RTC_ADDRESS_REGISTER, 0x10); + IoWrite8 (PCAT_RTC_DATA_REGISTER, 0x0); + IoWrite8 (PCAT_RTC_ADDRESS_REGISTER, 0x11); + IoWrite8 (PCAT_RTC_DATA_REGISTER, 0x0); +// or may be +// IoWrite8 (PCAT_RTC_ADDRESS_REGISTER, 0x17); +// IoWrite8 (PCAT_RTC_DATA_REGISTER, 0x17); + +// } + } + // Attempt warm reboot + gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); + // Warm reboot may not be supported attempt cold reboot + gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); + // Terminate the screen and just exit + TerminateScreen(); + MainLoopRunning = false; + ReinitDesktop = false; + AfterTool = true; + } + + if ( ChosenEntry->getREFIT_MENU_ITEM_SHUTDOWN() ) { // It is not Shut Down, it is Exit from Clover + TerminateScreen(); + // gRT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL); + MainLoopRunning = false; // just in case we get this far + ReinitDesktop = false; + AfterTool = true; + } + if ( ChosenEntry->getREFIT_MENU_ITEM_OPTIONS() ) { // Options like KernelFlags, DSDTname etc. + GlobalConfig.gBootChanged = false; + OptionsMenu(&OptionEntry); + if (GlobalConfig.gBootChanged) + AfterTool = true; + if (GlobalConfig.gBootChanged || GlobalConfig.gThemeChanged) // If theme has changed reinit the desktop + MainLoopRunning = false; + } + if ( ChosenEntry->getREFIT_MENU_ITEM_ABOUT() ) { // About rEFIt + AboutRefit(); + } + + /* -- not passed here +// case TAG_HELP: + HelpRefit(); break; - if (MenuExit == MENU_EXIT_ENTER || MenuExit == MENU_EXIT_DETAILS) { - //enter input dialog or subscreen - if ((*ChosenEntry)->SubScreen != NULL) { - SubMenuExit = 0; - while (!SubMenuExit) { - SubMenuExit = (*ChosenEntry)->SubScreen->RunGenericMenu(&SubEntryIndex, &TmpChosenEntry); - if (SubMenuExit == MENU_EXIT_ESCAPE || TmpChosenEntry->getREFIT_MENU_ITEM_RETURN() ){ - ApplyInputs(); - ModifyTitles(*ChosenEntry); - break; + */ + if ( ChosenEntry->getLOADER_ENTRY() ) { // Boot OS via .EFI loader + SetBootCurrent(ChosenEntry->getLOADER_ENTRY()); + ChosenEntry->StartLoader(); + //if boot.efi failed we should somehow exit from the loop + TerminateScreen(); + MainLoopRunning = false; + ReinitDesktop = false; + AfterTool = true; + } + if ( ChosenEntry->getLEGACY_ENTRY() ) { // Boot legacy OS + if (StrCmp(gST->FirmwareVendor, L"Phoenix Technologies Ltd.") == 0 && + gST->Hdr.Revision >> 16 == 2 && (gST->Hdr.Revision & ((1 << 16) - 1)) == 0){ + // Phoenix SecureCore Tiano 2.0 can't properly initiate LegacyBios protocol when called externally + // which results in "Operating System not found" message coming from BIOS + // in this case just quit Clover to enter BIOS again + TerminateScreen(); + MainLoopRunning = false; + ReinitDesktop = false; + AfterTool = true; + } else { + SetBootCurrent(ChosenEntry->getLEGACY_ENTRY()); + ChosenEntry->StartLegacy(); + } + } + if ( ChosenEntry->getREFIT_MENU_ENTRY_LOADER_TOOL() ) { // Start a EFI tool + ChosenEntry->StartTool(); + TerminateScreen(); //does not happen + // return EFI_SUCCESS; + // BdsLibConnectAllDriversToAllControllers(); + // PauseForKey(L"Returned from StartTool\n"); + MainLoopRunning = false; + AfterTool = true; + } + #ifdef ENABLE_SECURE_BOOT +//log_technical_bug("not done yet"); +// if ( ChosenEntry->getREFIT_MENU_ENTRY_SECURE_BOOT() ) { // Try to enable secure boot +// EnableSecureBoot(); +// MainLoopRunning = false; +// AfterTool = true; +// } +// +// if ( ChosenEntry->getREFIT_MENU_ENTRY_SECURE_BOOT_CONFIG() ) { // Configure secure boot +// MainLoopRunning = !ConfigureSecureBoot(); +// AfterTool = true; +// } + #endif // ENABLE_SECURE_BOOT +// DBG("come to Clover entry with letter %c\n", ChosenEntry->ShortcutLetter); + REFIT_MENU_ENTRY_CLOVER* LoaderEntry = ChosenEntry->getREFIT_MENU_ENTRY_CLOVER(); + if ((ChosenEntry->ShortcutLetter == L'C') || LoaderEntry != NULL ) { // Clover options +// DBG("enter Clover entry\n"); + + if (LoaderEntry->LoadOptions.notEmpty()) { + + // we are uninstalling in case user selected Clover Options and EmuVar is installed + // because adding bios boot option requires access to real nvram + //Slice: sure? + /* if (gEmuVariableControl != NULL) { + gEmuVariableControl->UninstallEmulation(gEmuVariableControl); } - if (SubMenuExit == MENU_EXIT_ENTER || MenuExit == MENU_EXIT_DETAILS) { - if (TmpChosenEntry->SubScreen != NULL) { - NextMenuExit = 0; - while (!NextMenuExit) { - NextMenuExit = TmpChosenEntry->SubScreen->RunGenericMenu(&NextEntryIndex, &NextChosenEntry); - if (NextMenuExit == MENU_EXIT_ESCAPE || NextChosenEntry->getREFIT_MENU_ITEM_RETURN() ){ - ApplyInputs(); - ModifyTitles(TmpChosenEntry); - break; - } - if (NextMenuExit == MENU_EXIT_ENTER || MenuExit == MENU_EXIT_DETAILS) { - // enter input dialog - NextMenuExit = 0; - ApplyInputs(); - ModifyTitles(TmpChosenEntry); - } - } //while(!NextMenuExit) - } - // enter input dialog - SubMenuExit = 0; - ApplyInputs(); - ModifyTitles(TmpChosenEntry); + */ + // DBG(" Clover entry not empty\n"); + if ( LoaderEntry->LoadOptions.contains(L"BO-ADD") ) { + // DBG(" BO-ADD"); + XStringW Description; + CONST CHAR16 *LoaderName; + INTN EntryIndex, NameSize, Name2Size; + LOADER_ENTRY *Entry; + UINT8 *OptionalData; + UINTN OptionalDataSize; + UINTN BootNum; + // EFI_HANDLE UsedHandle = 0; + + PrintBootOptions(false); + + for (EntryIndex = 0; EntryIndex < (INTN)MainMenu.Entries.size(); EntryIndex++) { + if (MainMenu.Entries[EntryIndex].Row != 0) { + continue; + } + if (!MainMenu.Entries[EntryIndex].getLOADER_ENTRY()) { + continue; + } + + Entry = (LOADER_ENTRY *)MainMenu.Entries[EntryIndex].getLOADER_ENTRY(); + XStringW& VolName = Entry->Volume->VolName; + DBG("add entry for volume %ls\n", VolName.wc_str()); + if (VolName.isEmpty()) { + VolName = NullXStringW; + } + NameSize = VolName.sizeInBytes(); + Name2Size = 0; + if (Entry->LoaderPath.notEmpty()) { + LoaderName = Basename(Entry->LoaderPath.wc_str()); + } else { + LoaderName = NULL; //legacy boot + } + if (LoaderName != NULL) { + Name2Size = StrSize(LoaderName); + } + + Description = SWPrintf("Clover UEFI"); + OptionalDataSize = NameSize + Name2Size + 4 + 2; //signature + VolNameSize + OptionalData = (__typeof__(OptionalData))AllocateZeroPool(OptionalDataSize); + if (OptionalData == NULL) { + break; + } + CopyMem(OptionalData, "Clvr", 4); //signature = 0x72766c43 + CopyMem(OptionalData + 4, &NameSize, 2); + CopyMem(OptionalData + 6, VolName.wc_str(), VolName.sizeInBytes()); + if (Name2Size != 0) { + CopyMem(OptionalData + 6 + NameSize, LoaderName, Name2Size); + } +// UsedHandle = LoaderEntry->Volume->DeviceHandle; + Status = AddBootOptionForFile ( + LoaderEntry->Volume->DeviceHandle, + LoaderEntry->LoaderPath, + true, + Description.wc_str(), + OptionalData, + OptionalDataSize, + EntryIndex, + (UINT16*)&BootNum + ); + if (!EFI_ERROR(Status)) { + DBG("Entry %lld assigned option %04llX\n", EntryIndex, BootNum); + Entry->BootNum = BootNum; + } + FreePool(OptionalData); + break; + } //for (EntryIndex + + + PrintBootOptions(false); + } else if ( LoaderEntry->LoadOptions.contains(L"BO-REMOVE") ) { + PrintBootOptions(false); + Status = DeleteBootOptionForFile (LoaderEntry->Volume->DeviceHandle, + LoaderEntry->LoaderPath + ); + PrintBootOptions(false); + } else if ( LoaderEntry->LoadOptions.contains(L"BO-PRINT") ) { + PrintBootOptions(true); } - } //while(!SubMenuExit) + + } + MainLoopRunning = false; + AfterTool = true; + } + } //MainLoopRunning + UninitRefitLib(); + if (!AfterTool) { + // PauseForKey(L"After uninit"); + //reconnectAll + if (!gFirmwareClover) { + BdsLibConnectAllEfi(); + } + else { + DBG("ConnectAll after refresh menu\n"); + BdsLibConnectAllDriversToAllControllers(); } - MenuExit = 0; - } // if MENU_EXIT_ENTER + // ReinitRefitLib(); + // PauseForKey(L"After ReinitRefitLib"); + } + if (ReinitDesktop) { + DBG("ReinitRefitLib after theme change\n"); + ReinitRefitLib(); + } + // PauseForKey(L"After ReinitRefitLib"); + } while (ReinitDesktop); + + // If we end up here, things have gone wrong. Try to reboot, and if that + // fails, go into an endless loop. + //Slice - NO!!! Return to EFI GUI + // gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); + // EndlessIdleLoop(); + +#ifdef ENABLE_SECURE_BOOT + UninstallSecureBoot(); +#endif // ENABLE_SECURE_BOOT + + // Unload EmuVariable before returning to EFI GUI, as it should not be present when booting other Operating Systems. + // This seems critical in some UEFI implementations, such as Phoenix UEFI 2.0 + if (gEmuVariableControl != NULL) { + gEmuVariableControl->UninstallEmulation(gEmuVariableControl); } -//exit: - ThemeX->Proportional = OldFontStyle; - ApplyInputs(); + UninitializeConsoleSim (); + + delete ThemeX; // do this before destruct_globals_objects() + FreePool(BlankLine); // Convert BlankLine to XStringW instead. + TagStruct::EmptyCache(); + +#ifdef CLOVER_BUILD + destruct_globals_objects(NULL); +#endif + + return EFI_SUCCESS; +} + +// +// main entry point +// +EFI_STATUS +EFIAPI +RefitMain (IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable) +{ + MemoryTrackerInit(); + //MemoryTrackerInstallHook(); can't install hook before construct_globals_objects()... yet + + EFI_STATUS Status = RefitMainMain(ImageHandle, SystemTable); + + DBG("MT_alloc_count=%lld\n", MT_getAllocCount()); + MT_outputDanglingPtr(); + +#ifdef TagStruct_COUNT_CACHEHIT + DBG("cache hits = %zu\n", TagStruct::cachehit); + DBG("cache miss = %zu\n", TagStruct::cachemiss); +#endif + + return Status; } + diff --git a/rEFIt_UEFI/refit/menu.cpp b/rEFIt_UEFI/refit/menu.cpp index d04b84cf2..5f26aa81e 100644 --- a/rEFIt_UEFI/refit/menu.cpp +++ b/rEFIt_UEFI/refit/menu.cpp @@ -1141,6 +1141,9 @@ void AboutRefit(void) AboutMenu.AddMenuInfo_f(" stinga11, TheRacerMaster, solstice, SoThOr, DF"); AboutMenu.AddMenuInfo_f(" cecekpawon, Micky1979, Needy, joevt, ErmaC, vit9696"); AboutMenu.AddMenuInfo_f(" ath, savvas, syscl, goodwin_c, clovy, jief_machak"); + AboutMenu.AddMenuInfo_f(" chris1111, vector_sigma, LAbyOne, Florin9doi"); + AboutMenu.AddMenuInfo_f("Package credits:"); + AboutMenu.AddMenuInfo_f(" Chameleon team, crazybirdy, JrCs, chris1111"); AboutMenu.AddMenuInfo_f("Credits also:"); AboutMenu.AddMenuInfo_f(" projectosx.com, applelife.ru, insanelymac.com"); AboutMenu.AddMenuInfo_f(" "); From 4ead199d8de98a4be5d991a67d8be770b7b10be3 Mon Sep 17 00:00:00 2001 From: chris1111 <leblond1111@gmail.com> Date: Wed, 2 Oct 2024 16:13:18 -0400 Subject: [PATCH 4/6] Update FakeSMC V-3.5.6 --- .../Other/FakeSMC.kext/Contents/Info.plist | 506 ++++++++++-------- .../Other/FakeSMC.kext/Contents/MacOS/FakeSMC | Bin 98112 -> 98144 bytes 2 files changed, 281 insertions(+), 225 deletions(-) diff --git a/CloverPackage/CloverV2/ThirdParty/kexts/Other/FakeSMC.kext/Contents/Info.plist b/CloverPackage/CloverV2/ThirdParty/kexts/Other/FakeSMC.kext/Contents/Info.plist index dbfaa4595..063f4df96 100644 --- a/CloverPackage/CloverV2/ThirdParty/kexts/Other/FakeSMC.kext/Contents/Info.plist +++ b/CloverPackage/CloverV2/ThirdParty/kexts/Other/FakeSMC.kext/Contents/Info.plist @@ -1,229 +1,285 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> - <dict> - <key>BuildMachineOSBuild</key> - <string>18G9323</string> - <key>CFBundleDevelopmentRegion</key> - <string>English</string> - <key>CFBundleExecutable</key> - <string>FakeSMC</string> - <key>CFBundleIdentifier</key> - <string>org.netkas.FakeSMC</string> - <key>CFBundleInfoDictionaryVersion</key> - <string>6.0</string> - <key>CFBundleName</key> - <string>FakeSMC</string> - <key>CFBundlePackageType</key> - <string>KEXT</string> - <key>CFBundleShortVersionString</key> - <string>3.5.4</string> - <key>CFBundleSignature</key> - <string>????</string> - <key>CFBundleSupportedPlatforms</key> - <array> - <string>MacOSX</string> - </array> - <key>CFBundleVersion</key> - <string>3.5.4</string> - <key>DTCompiler</key> - <string>com.apple.compilers.llvm.clang.1_0</string> - <key>DTPlatformBuild</key> - <string>11B53</string> - <key>DTPlatformVersion</key> - <string>GM</string> - <key>DTSDKBuild</key> - <string>17C76</string> - <key>DTSDKName</key> - <string>macosx10.13</string> - <key>DTXcode</key> - <string>1120</string> - <key>DTXcodeBuild</key> - <string>11B53</string> - <key>IOKitPersonalities</key> - <dict> - <key>SMC Device Emulator</key> - <dict> - <key>CFBundleIdentifier</key> - <string>org.netkas.FakeSMC</string> - <key>Configuration</key> - <dict> - <key>Keys</key> - <dict> - <key>$Num</key> - <array> - <string>ui8 </string> - <data>AQ==</data> - </array> - <key>ACID</key> - <array> - <string>ch8*</string> - <data>ur48RcADEEM=</data> - </array> - <key>ALI0</key> - <array> - <string>{ali</string> - <data>BgECAA==</data> - </array> - <key>ALRV</key> - <array> - <string>ui16</string> - <data>AAE=</data> - </array> - <key>ALV0</key> - <array> - <string>{alv</string> - <data>AQEDtwCjABVq9A==</data> - </array> - <key>CLKH</key> - <array> - <string>{clh</string> - <data>AABwgAABGUA=</data> - </array> - <key>CLKT</key> - <array> - <string>ui32</string> - <data>AAByGw==</data> - </array> - <key>EPCI</key> - <array> - <string>flag</string> - <data>AQ==</data> - </array> - <key>FNum</key> - <array> - <string>ui8</string> - <data>AA==</data> - </array> - <key>LSOF</key> - <array> - <string>flag</string> - <data>AQ==</data> - </array> - <key>LSSB</key> - <array> - <string>{lso</string> - <data>AQE=</data> - </array> - <key>LsNM</key> - <array> - <string>ui8</string> - <data>AQ==</data> - </array> - <key>LsbV</key> - <array> - <string>{rev</string> - <data>AQQKAAY=</data> - </array> - <key>MOST</key> - <array> - <string>ui16</string> - <data>gAM=</data> - </array> - <key>MSDW</key> - <array> - <string>ui8</string> - <data>AQ==</data> - </array> - <key>MSPS</key> - <array> - <string>{msp</string> - <data>AA==</data> - </array> - <key>MSSD</key> - <array> - <string>si8</string> - <data>BQ==</data> - </array> - <key>NATJ</key> - <array> - <string>ui8</string> - <data>AA==</data> - </array> - <key>NATi</key> - <array> - <string>ui16</string> - <string>0000</string> - </array> - <key>NTOK</key> - <array> - <string>ui8</string> - <data>AQ==</data> - </array> - <key>NVPR</key> - <array> - <string>ui8</string> - <data>AA==</data> - </array> - <key>OSK0</key> - <array> - <string>ch8*</string> - <data>b3VyaGFyZHdvcmtieXRoZXNld29yZHNndWFyZGVkcGw=</data> - </array> - <key>OSK1</key> - <array> - <string>ch8*</string> - <data>ZWFzZWRvbnRzdGVhbChjKUFwcGxlQ29tcHV0ZXJJbmM=</data> - </array> - <key>REV </key> - <array> - <string>{rev</string> - <data>ATAPAAAD</data> - </array> - <key>RGEN</key> - <array> - <string>ui8</string> - <data>Ag==</data> - </array> - <key>RMde</key> - <array> - <string>char</string> - <data>QQ==</data> - </array> - <key>RPlt</key> - <array> - <string>ch8*</string> - <string>m82</string> - </array> - <key>RVBF</key> - <array> - <string>{rev</string> - <data>ATAPAAAD</data> - </array> - </dict> - <key>debug</key> - <false/> - <key>smc-compatible</key> - <string>smc-napa</string> - </dict> - <key>IOClass</key> - <string>FakeSMC</string> - <key>IOMatchCategory</key> - <string>IOACPIPlatformDevice</string> - <key>IOProviderClass</key> - <string>AppleACPIPlatformExpert</string> - <key>IOResourceMatch</key> - <string>ACPI</string> - </dict> - </dict> - <key>LSMinimumSystemVersion</key> - <string>10.13</string> - <key>OSBundleCompatibleVersion</key> - <string>3.3.0</string> - <key>OSBundleLibraries</key> - <dict> - <key>com.apple.iokit.IOACPIFamily</key> - <string>1.0.0d1</string> - <key>com.apple.kpi.iokit</key> - <string>9.0.0</string> - <key>com.apple.kpi.libkern</key> - <string>9.0.0</string> - <key>com.apple.kpi.mach</key> - <string>9.0.0</string> - <key>com.apple.kpi.unsupported</key> - <string>9.0.0</string> - </dict> - <key>OSBundleRequired</key> - <string>Root</string> - </dict> +<dict> + <key>BuildMachineOSBuild</key> + <string>23C64</string> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>FakeSMC</string> + <key>CFBundleIdentifier</key> + <string>org.netkas.FakeSMC</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>FakeSMC</string> + <key>CFBundlePackageType</key> + <string>KEXT</string> + <key>CFBundleShortVersionString</key> + <string>3.5.6</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleSupportedPlatforms</key> + <array> + <string>MacOSX</string> + </array> + <key>CFBundleVersion</key> + <string>3.5.6</string> + <key>DTCompiler</key> + <string>com.apple.compilers.llvm.clang.1_0</string> + <key>DTPlatformBuild</key> + <string></string> + <key>DTPlatformName</key> + <string>macosx</string> + <key>DTPlatformVersion</key> + <string>14.2</string> + <key>DTSDKBuild</key> + <string>23C53</string> + <key>DTSDKName</key> + <string>macosx14.2</string> + <key>DTXcode</key> + <string>1510</string> + <key>DTXcodeBuild</key> + <string>15C65</string> + <key>IOKitPersonalities</key> + <dict> + <key>SMC Device Emulator</key> + <dict> + <key>CFBundleIdentifier</key> + <string>org.netkas.FakeSMC</string> + <key>Configuration</key> + <dict> + <key>Keys</key> + <dict> + <key>$Num</key> + <array> + <string>ui8 </string> + <data> + AQ== + </data> + </array> + <key>ACID</key> + <array> + <string>ch8*</string> + <data> + ur48RcADEEM= + </data> + </array> + <key>ALI0</key> + <array> + <string>{ali</string> + <data> + BgECAA== + </data> + </array> + <key>ALRV</key> + <array> + <string>ui16</string> + <data> + AAE= + </data> + </array> + <key>ALV0</key> + <array> + <string>{alv</string> + <data> + AQEDtwCjABVq9A== + </data> + </array> + <key>CLKH</key> + <array> + <string>{clh</string> + <data> + AABwgAABGUA= + </data> + </array> + <key>CLKT</key> + <array> + <string>ui32</string> + <data> + AAByGw== + </data> + </array> + <key>EPCI</key> + <array> + <string>flag</string> + <data> + AQ== + </data> + </array> + <key>FNum</key> + <array> + <string>ui8</string> + <data> + AA== + </data> + </array> + <key>LSOF</key> + <array> + <string>flag</string> + <data> + AQ== + </data> + </array> + <key>LSSB</key> + <array> + <string>{lso</string> + <data> + AQE= + </data> + </array> + <key>LsNM</key> + <array> + <string>ui8</string> + <data> + AQ== + </data> + </array> + <key>LsbV</key> + <array> + <string>{rev</string> + <data> + AQQKAAY= + </data> + </array> + <key>MOST</key> + <array> + <string>ui16</string> + <data> + gAM= + </data> + </array> + <key>MSDW</key> + <array> + <string>ui8</string> + <data> + AQ== + </data> + </array> + <key>MSPS</key> + <array> + <string>{msp</string> + <data> + AA== + </data> + </array> + <key>MSSD</key> + <array> + <string>si8</string> + <data> + BQ== + </data> + </array> + <key>NATJ</key> + <array> + <string>ui8</string> + <data> + AA== + </data> + </array> + <key>NATi</key> + <array> + <string>ui16</string> + <string>0000</string> + </array> + <key>NTOK</key> + <array> + <string>ui8</string> + <data> + AQ== + </data> + </array> + <key>NVPR</key> + <array> + <string>ui8</string> + <data> + AA== + </data> + </array> + <key>OSK0</key> + <array> + <string>ch8*</string> + <data> + b3VyaGFyZHdvcmtieXRoZXNld29y + ZHNndWFyZGVkcGw= + </data> + </array> + <key>OSK1</key> + <array> + <string>ch8*</string> + <data> + ZWFzZWRvbnRzdGVhbChjKUFwcGxl + Q29tcHV0ZXJJbmM= + </data> + </array> + <key>REV </key> + <array> + <string>{rev</string> + <data> + ATAPAAAD + </data> + </array> + <key>RGEN</key> + <array> + <string>ui8</string> + <data> + Ag== + </data> + </array> + <key>RMde</key> + <array> + <string>char</string> + <data> + QQ== + </data> + </array> + <key>RPlt</key> + <array> + <string>ch8*</string> + <string>m82</string> + </array> + <key>RVBF</key> + <array> + <string>{rev</string> + <data> + ATAPAAAD + </data> + </array> + </dict> + <key>debug</key> + <false/> + <key>smc-compatible</key> + <string>smc-napa</string> + </dict> + <key>IOClass</key> + <string>FakeSMC</string> + <key>IOMatchCategory</key> + <string>IOACPIPlatformDevice</string> + <key>IOProviderClass</key> + <string>AppleACPIPlatformExpert</string> + <key>IOResourceMatch</key> + <string>ACPI</string> + </dict> + </dict> + <key>LSMinimumSystemVersion</key> + <string>10.13</string> + <key>OSBundleCompatibleVersion</key> + <string>3.3.0</string> + <key>OSBundleLibraries</key> + <dict> + <key>com.apple.iokit.IOACPIFamily</key> + <string>1.0.0d1</string> + <key>com.apple.kpi.iokit</key> + <string>9.0.0</string> + <key>com.apple.kpi.libkern</key> + <string>9.0.0</string> + <key>com.apple.kpi.mach</key> + <string>9.0.0</string> + <key>com.apple.kpi.unsupported</key> + <string>9.0.0</string> + </dict> + <key>OSBundleRequired</key> + <string>Root</string> +</dict> </plist> diff --git a/CloverPackage/CloverV2/ThirdParty/kexts/Other/FakeSMC.kext/Contents/MacOS/FakeSMC b/CloverPackage/CloverV2/ThirdParty/kexts/Other/FakeSMC.kext/Contents/MacOS/FakeSMC index 952311d74c27c1c76a89975ec1c21da01bc039d3..23363e642e6e9a977e62a3539bc2c791d018f853 100755 GIT binary patch literal 98144 zcmeFa3t(JTxi&m0O&dzvi3k`j;&2bxmP{^f3KTL;rk&8F8JbWc3duB?G}9)TVKURE zq7qCCnU2vYh&@LSM$b{}Ij9k|1W=lAX@eJxf*Qn2P{fod1}_j0oBw&%T6<>pnwcc6 z`knv(zXp<Lo_D?LUGKVI_S(}Qy!nTt3oVw6lPng?DfrF8uWP==vIoeYGx1xTVX@TJ z)i`Twgvk8IZKf8*Ga=?L?eeFtF68Y9$<LCT?R^hU@aH{iB$CgQALZZqmd-?4SJ%)U z3i{f%DxvP*MNS#;<wX(=ZrCu{h7k7rZS8Rfb$cUKGG?AKK#pQc`@?d}MIv=|WsVw0 zf|^lYh9Ql!y!g97MX9UX>W_Ps-d?Yf1ne1QZio`GuCCSJSm$f=h3cBZZ4F8O^(udC zDiV33y^|A-;j^?C@&;Q|+w0ftktf<y)f2OtTo2~*8&USAE|5{kXR3#~x<*gP6EmNb z-(gj_Pbd{~y=}x}%XZS*>Tfe-dj0l>Wyq+Z08Gp;x{~RK?Zk!Oy1I(;jT@Y0<uxj} zQ=vu0P`rLx$|+5>MW1u<+uMac1k(9K*sYg+S{0e)EQIs-3-~>V-+xau0G{f{_GOD@ zF*|an#S#RZjbEnI^7ZA9-uuzjzwN#8xmRv_{5?xAgDe}r#?L$PfqcZCVd<?jq$lu1 z37jZ_e^m)w?~44^)sy*9E4qHv;@UG9I_akAG5g?6kE@WMwjiWyFgqqVBn9r6;F}Oc zOBTm?IN4TjFRk5lgt_3SYPT!$w{fyZYw^bw`IW2diLCcZ1)&R{ieTra#|0DmuIOz! zu07MCMUQf95wTs-TWv|A%x|nuFge}V2W?@+af4&C<9bI;wX5s*Ic1T`XUigwmq)%| z9(lGr@_KpXs4JSe3sI+g_aVmaLF?|vfE5w%U`3>LxGd^@wleae?8-gU*4-H3EC*v= zlt<RVG3b8+;)gl2Jj5_p<ghCm9u$t2N7v;XD#<iQg6o4JPeruVRuTPRjvjH?h-hO( zBwbP&X>+-v&RnGDc68sI>x?ul1J4G}>(6j>y>-&g)5{_+xOz^%b{(o@@m@z{WAVg1 z`ydK8=e>^iIc{>??5LCVBuX^8ewnLlYTnMXT|G;to$xq1e+WgI?TWVNxuVwT(}qOs z=muN#<lEn93V8EF7u^0vd!TSj$VQ&;4HsA+9Ci&@219q{Amc9U*M=r?hQ{ViyaV!m zLsM4!@X**PF5loYm0Pl1L*o}W4Gm^lAEZa9Zqdf#ts?%(vAOyn8-}dp$m10~MVD+B zC0Y@AO$vK5y~w01a#BU)b)`1?UdPS4&4iZLC+Z|sOZ)RSy`>#w6L3WrPP=o_Dz>w1 zj5aD86k9R8L^DSC282)d)?x~E+F#o}7_!-?l}la14yt*{;jX)3l0S|E8D){ln6GS= zs(ok96NZK}k=*LhP`3SfS7cNam8>{d^dz`3-RsW6VtepIV~z(i96jr&UC~pl2PPTv z@mho!TFnWc>+#tUIb;L{K%Ki^3->v#2VOUXwCXr|xNP<0ZC{?)o!IX(x0Nx2Bk&8k zD|Yp)IRi^>yQ+!E;n=6HZshNQ47BU;Y0x@&CA6Nm%PxSX^t{TA>eVQ@x54mD(|x0` zEJ`%7hgL)?hbtq8%Og)mo+*#~wLJ2cE4skdQ}j5jRz&`Y0>@ee{%oj-{LOLjv3ZuU z$~~`z-tF4+eCXne$nV%vz5@+*vNK%KEOf`|kJ}(<ia3AL6gkOhpDv3`X<Y*@eW=u8 zu^xCvSa_u(@@i#dsv=rBY*w7^8^&r|l+gf}Q7T7~N%W+zthHG7&d=(;lf%K$!R|Zn z5(>;;e}-zGvgOCd*wrx$rZLJ9c^ZS0EAr>^$h7OQa|CuQ4s_ViIry6qy2OcczM?$3 zup%;D5qWyLw;MG$VM`G7QeaIG?1P{@@}w)`9GO4~`~k)3K;p>kIE|yI&WEVLBnmHc z4E=UqlVj+~EQj^MCnwJ2-=VRkDS9=`mPZeE!;%w45nbpyJpV%4h0R4JNT#Q9<Y6u# zU6JRedk0a17&Y(KhbK|0#tfvR>@DSy*IZH2M}^z0;zC#CacA^uj1+%wiuZwBHh{?C z*r)-;Q(RG3PT7^K!_TXsF$-Oh!=gwxJ_f}<89tyze~z|$il$dFiPO(^V5pCeQ$3ld zqV2dMnYRk9HJ_2nFH7YGRPICOrOQ2;pR5qdJD??71?>AkRQQ@A1|&|IoO$lU#y|`@ z3*pATA~EhDkLU&`Bl?{XOoZ8?dy4kpvluN@H(~e(7=FDB-;pAG3&V?K_)X^U@H?c~ zV-|-_g;^J6@d;ciZqyW+ei>vFKbGNZ%;ARp%gkbtty3B8UK#D}TKHm^oi4Okj@&vu zjggQ!{|jhh&Z+V`Rcd1@e@LP7994>9DnCe}@=L0m8dG`3tYT#039~rF^!GF7=uyMP zucuIXgeu>RseChq3ZotQL`>xiDO5gA6@N_S4zo(wDT^qqiC0MRHchPR+-nw#3@wN3 z$ii4UHD(o~D9X%Y5%W^U{QlpKqR2I?7#^<B#LC0fnpk=GRzY%=k3)9E8%xJ#jwxJO z4B3&jF_p{|DzDPYyJ9LYr%320RC((yBSYU!R1u3WE_D*-)1IP(REeJc{8ifc@uRDm zjgw?w60<{m{el&7J7(Q@aNMFXqEsh`n+6apR(gs`W!iOm+MAQomg^ggsQ=^P6cJl^ z{T@-}!i$R-F+vGnV*0n5^}m%)U!U#EFn?fKULN@|26)VQ+8Xep3t(4_<}VpJ_86w+ z{KZxr`Bg>aXhq~t6_F!lQRlN|(aMqOux&b=Gab&J4i8WF=3u-;3EOrLhA|h26_q>J zSZe9(WLI>3jvAe#>uvIr^}zaE`3Vc?*ji?No|IKU&tW}a>6!|MPV1U#4_UjWnyh<1 zfK(lOT^SR%@o(oFzHnRQPeU)i>#DHBdiT(t*BsV;k40X6{W<%fbN6?w&Jk<b(@yK7 zu6d5GH|*BkQ<yjKsldAXZM4(%MzM9za(?RUILTt&^G<y1ye&7wy65fq6d8VfbV(;- z?EaCpY{+_G@W?z!uWGmMc^$&eHv-l@uh8D!j(PCqq_Up%pDpXD`f^F<;Ss0(M<t!p zi%P5qrXAMOHyxc*3$R2SDzlaz?%4&c@-KG|jdZ@TsLXocIj6PsXHZ^%%svI>?;hka zljFRp^L|j4aoA}eys8N~8+3FHTFX`+4&N4;e0|jFI%NIYW3GL!XU4D@ILY<U4_>eS z%@;oXgw6H(3$CG;=SN1CSURVt_q=8;e@yKZCd!$|mEkqW-@Ndu*PpxnDXK7QPd5z> zVKXr_aWPf$!)HNde)u$@f_w@U>r<}C@I+?hX;;G`SwC{E-BVPZhh`8x-H)}-Lw)ev zXi`V9B#n16^KKP=@DkbLR2NO|gA0?xll$OLFBfV5xmZj4!%1mJCaniP#f9W6z`KCI zM}4X`r$Qo=31P!SFJ$$s%SaLF<YDZ)%rW~H8Zlu*mX2IsIU=tq3)ra`I!JkP=%p-Y z&xZ{2SU)EO4xjvLQ{-d4@X`9<5AB1uzsbYK;O5(3SU8DA_nxQ18?bOW_@+_R)(4|P z_rP7uo=oR1l|!auH3FE15iof2WYg*)xn?x2+f3_b>>LK2kwXq+Z_mSqgMY>NjOE|y zSoKy!#!-KXT^%O^S@yxQNb9p`&EGf15btnB<kwiqV*Nkp-j?AWU-vf{!O%fN4{{wH zeMD^VxCDP?x_1B>#!BozAns<KqLt5b5e(ZHci)MHi~UCxkvA%$&f#jg{DrM-EP?kl zV@YwO34i1`nlLW9$|FDJYFF$tCswlApmjP&Dtep;9fx3X5R2;m@<;~O!%VXx`VLoQ z{)I?y0T)U=OS+chOagvc9MhkWEAG%LtVdpj7@JkKH^a8)W6JiG7<%@25TODq_^u~h z3Fij(!EWb4SG2O<df?>l%7Ya>-T_B<*@g2Ru~q)*XThvEp23d7u-$X|Z<eu3VO)Oc zA#Ro&EGL|3ygI&?>j$2ku=ABi4vE7RwhCse^@;L`b3T5jtp_R(;#A{tm|>z?0!@y? z&bKTXjzi9)mWLN3@<aTC9U|rd*{Nl9uqt{g2VIfHES_gD4OaAIhGEn3P&Si9-MnDz zN<vFfMmHl&WdenK&~X%nEGpK#v&rLx+Oy;=S`s-E#cf!!?*1$@*|TN?!jF6epHb{b zqCnvr#}{pU5b{ScG_cH21^T&I>y5G9qB=LYEj#HD?A8=VWx3Qk*?OSerivwVuUzoR zL{goUxzUwIunCu4N$f;<OtuN}<S|)f2rHaD&s%qoz~9|ZS$7Xhzhw%n+HXQ&IxB;- z5Z|lv7dbROfRE1ZHk(O{Cu*S&RPK2(w8Yq*LJ~gDv3H&A=<ro1?aanNh+?n8Zo49S z;n2jwik^#lF|L+JcjPd}7FeY+rul`AL+flA{TQ}JQKZ5(oSC6G2193|zi+l-QGuox zIu|VlTT`Jhai&_j#m~)Lk)OzHMX}8lXKoX}5T_PA2f`lxsA!l*3bAvkuBrLrY|mv~ zJ0g0)Yq4dMx%T7j04u43YydJjasIWlmhB<FlkLfLUPDRB^Di{F_0;bvx)TpsFw5PN zk8TmS*ppdO!pNEDK}!z&h;kZ9;)YYK7oF0=<+_EVGI`l{lGmzVGA$>Q=gB*h!;{l~ z>QdqT19r{(4=1G^TYFaBz`h?_tJ-8TsEk;lo7bxEGV4#uC3KQL)`4n$7n^BthFv-0 z;PCvH^2p!y`Z~Os1)Nx4pNyGStw^p_amMuPGBGP)_4Sloo~B%yV!n$V;hN`(nLSyP z<jE;BdV-}JCcKej@dTw~JRpdzm$6D#>t$n<%H#NRjVrn#yCPbeizVa+n|UNXatViF zW8@5-hI8m_w95&IBaa!=38E&nIZ+$pL_ZtjstYT}-JfU2k38$#{i1dEJ@|~neN3O$ z13Qu0ZMkK|FNH3lBblNW%DNl4T7OIRG}y+VP>+f$+baT|jZY%C=HcX)G0SGi!Y9mG zI8$Ze?!+wc<n1*qc#w^3)~P&wg72Y|IUu+qJM(U0PChv(ca3m6TZ|yWNerHMa~(&0 zo6tw$yP_YGDlUwt$g@0HyXkTJpy-*RcTDmTM^Dj;8qqLSh975s&%~Gs6Sr!q3{Bwh z^m({p8)oMbmb5-9tUSt7)zov<k?Po7mDq1^SdDY@B@bY=;ELK&+QN?G(Ze{zg+tce z?}f#3K0o0YwgsaAjyR`#v*uBM$$f}c5j{`zF0~UxCYp^iUKhQIo<fHrho(P1z6g{y z7fPEI(FeFNt%%lVGvW7QYmWwi#-Y3@k1j>;$6Cb|d2IUQBf{7tjKO*Pi)>F^M-=@g zH_<6}^q4Ew-Cu<o)(TSqS<X!VPR7M~wm7ey?o~&VF!h;DO06RLpG=5Vas^hG714lj zaR5gPa50?V;^GT2#bKC>`KYYAb0<CvKe_r+Lm&#Gr|5DxE6M{oYDOW-#+Nvt$V|P{ zl&R>Fe5_d#Du|9fVU!aI*1+ccKvp|*J%oOMb)L#-MYLID@TXW-BZE7VGx$m@gA<=Z zfvRdS<*gcBD=}}ek~ne(7Sv*XHrCVb%E;3deC7uq;?ENTqIt!iCu|##&k}IjT8*;8 zLj~*ZYw^K);CZpqxf-9#qw{4A9G&hJ4Xmf=CvN&7TQbY$Oc2yi<Y(hG$R5{8SRU=k zK;(gMp_w0f9W`AZb+Uoa(>%B??!ga5d%*f?7#~nZPrLSDk@bj(JO4roL_@%`<!9Je zWKZ{wqPg3jf&(HIt8?hcN8<^7P1J8ZtDbm5&B~-S7t0mzX2o(984^Z?3&qfPMawa! z!=HD92veefcpBk~oN{EbFe!3ap(R``R{DPwz3E#Qn)}HwxLy`(o-SONQYSP<cZp5y zSPQ-wJH0vbIblg8^(NXw;^U#K;(6Q+EqEBZO%-Hl2kS9KA&#IBj~sv>s)8O)w24yS zIJNt!&?+t(mnXFacJ>@Z-s`e;V;DL-{`wRwMHbixCo*LzaZw+i%-KdOB6p6`yU3@8 z1$>O_>Bxg)_{+x+V!k(?L!?7j^iIZ7jqgqD2!*Za{j?n2OIy<;F>7i(m-7RANKJKl z<a>_DPaI;tJcuHYgBRD}r>acKMF9>H`0NDFfqt6t820&iCK0mU{^opO_}v3;R68<y z9a};4N>}uOaaa;19-V&}J=K`<rpJs=!UsK9oG+@~IElbqQ4u{zBd$F^3cbx0o#%@D z)No`Nj^Om^!9y9tYtE$~xohY~=!!M;DttMci1Yv{KTO$lZ!fYoVR!7klMNL6^+k?D z;-h8a98^(`ISQ>|tAi-qZ-|PEKP`$3ca6Q(HI*Hne`sCC;_ju`A+KA|y)NtU9oaC= zpZKYYymyct8MYo++BG!U^~OooJD+43iLC>+w}Lb*#_8Y>r(eM0Xn_klJ63kSG2go9 z-=NrCy6{kGM&_Z?EQ}iqFh{u}znt#f&!+l*1RF7|cYYn|c9)$p58CsO)QO<#1zm5R zwDau9PljGP>FYTqxvxGmmeEBYsWbgpclCnKH<3({lw?L9V3?80&!&6(kP6zBbvMr! zqn1eNydx*$lac1mQ;hWXZdh=1sC&Z#;q^;!r0H<!!Uaqw6Xsme&VE>uz9%k!rpFK= zoNeR}Srt>Q^+0vj-VF<jzhmwCl*rWEPwrWp(OsHF#o}S>p4%a<=(+V|6ntq0&IU$J z2NG~^9+sJ<CvmMgA0INs(a7md=O&#}Kw+WGFD7#PkMPhJ&%5DjdE|*ld9I1|2U{R! zgBL@1pvvNh;&ksAbdHvysuGrRW$61m@cVK6zKmb??`pU8z=E#9$*w6>dlZITsK1^i zU*M;P`M0|=hNs7@2dc96u3uO@)ZV)Heb$qwhq|k>iig52ht_A{!20mX!jXw}owsFJ zLN{S~orTLAC+)mp@B0?cn;z_5pEa>DZsFZ~KVv-&HDnmML>RgKFlCP}K&m1)6ALJ| zKW{zoxM<opJr15ZF^O*QNBi?v%@4oC@QJae-bT!&qxg;D_ls&?wH{cfo@dLx>WVyr z?#gG?xH!=}DVt0Pm0prPk?ZI@DEb6CaL=0M@8lZ9IDI<QB|0MN6k}aN7c=H=abHJv zlZu`XjyVpkpKoy-UWiPf0d8asuVW2wL=CS~HN5+rSPf6Bje}8X#*B?A`aCW%yB<H8 zV|4YO#Tw)Wn^;T8Mf60Gqw`Ve^@TV#nTO_h5?c}yE6v284Oj@SIUh->BveL_1)MF$ zM+vd|=J|lD>(D$=Hfl{8TEi(K$~rmJbte8|RT{wI#p|MSFpIAq-m$>3_q3%L<bKqB z_bI1C#Wg*IabbS=H*<3CZ@7DDb}qJ(kFCdXKG`82xp13=!<{|nBNZ&Xamol*2j;ZD zX#WxSro2zUi%}D}uW|4kcq1HjMY@QOQednV4vEo)Yvzi`1DurrlK@vwc(5X}Bda2^ z5@q*Uxc6{2#KI1ybQ^?sK}fZD0QOxRd$wUHF6(}PPe9@qY`AuaGqHT`S+iZ3DDnwd zvX!aKXDU}sa%s_(MMvfG9M_!0E`bMkYO=oq>S6(*wi`>%qjqeUlCZTHWD_?YIZgKt zE80`^7Ou>q9dR$)52x`6?G;FjitTaXAdwHMUyy2eScSVAVpS<tFh3BwSfwckzGX8z zfR<Z;MKtON7N>h%bUpHfY~Rzpd7!Zr?lMyN^~Cw`;$x}2@EbbH3+Y=cq!06UKl1Sq z9Ka;l8F#Tp7>c`SPj+#su@A_FLlg7*k>}Vor7ReB^?b0;b$C5%-{L}VMmd3I!I0%q z#86F(_0E-q$geywc@1L=Mlh9MckV&6_A;UUq$YirkUmin`CvB^?nHtd1Rq6vmI-kr zU|KE6Bif)B`4ept=_ao4jAkNEm*EIGI?0xI5%P?-@UpxNhNT7e|CyEMz+cNi1Y9Ko zu<>TTa8<AyAuNSx<{}lPXU$7zqIsk5;ZR2SgYEAg%w7rY5!IT*8l?AY>3wv`U1kjt zbS8r$UF?HL&X$?{WDY8Z2Q1&^2aaXa_<+uSWWKPI*(L1cAz%RlOl~l>o!FOFM8492 z=|Ge#?pXB{z5EWQgR54&7X@E_hoL^fTQt;zws@gG8CzF&hzc?ad%Cv-91T4m*R)El z2MVud=R~Qiv-Lh|cO9M=i%#{(VEO99!5=Ek>0X)?dEdehkv#!8>Y5(JCq8e%RMWG> zQ!GO28N$nt5od4N-eTwO=}-_iD|;(?0vSfHh36H~uP~-#uX7r8drn#LRQOcc5^#p6 zhOp4;^64ihe(s9y5k`?**A$9&$?L1I9KBmS|3C@j!e_VGAEEXRp~Q}KqfGeFBiz^I zh^)gS6*f;xxAViet=8G?ych5pB+o1$Mb$Ln&<A^sl}Y)fPn1uify;GDdB&4iQo6-Z z#+3@5hN~9z5DEj&jjvu7#?@1J(FKYcz5`w;4eV+h)=$FJ>#;_c8Ne*ZNkKdw`ZP?G zMaD4CbtG(KIM%};ykv_wvgu8f)VD-p-{xP2t+gH~yQr^x`up&-Yie0&K8E~>@~*#U zgwGU(B4T#EF%J)p4>@fw9a#z+$VP<i8@-mrBl7a9ax7Li8Bdn?EXHNlp+4w*24Xyq zWBw7*$OGcrUwarsw9&DjWCjx?qHZep{K2|gG!(Y*tt@T~=jen+QZ7;CJa`e6;P?in zrf?>r-S#19ekZ*q)D|GC3vb&Dz1?%rTLHbTGwI<R5C*Ld>wi4qustE%KQe&zrf|%B zLX0`S*cJKUpg17C9z9b$Q<Uor(M7C6#sfFBAayv!5_knwCmwWWUW~G=h}tkZEn{_v z1;T!?1u@o-yV8BeG7FDGrw|uI0cuQmB+|J<%Ho2s5IipI;c6=<3&g=_xL@d?*U9lQ zF{obzA+=#F$E~|B5^;v)FvrhP=V0dmmkAbmRa;E#k;(z|964R0pW_MYMTbsjy&6|X zJ~#qTje2F?zYhbk!GyD{iuU}>(Zrdv9IZ^Lot-`!9;yytu&ZNg*o2$>M1va^i$>+a zuxZS5M9f1dv<EAqXcKsf9Svgvcl~gAWYB?w%-C85cbY4rtf+;ts%8x%$9t|p>xrG8 zu^3&^fhm-NNS_M}3>5#4Y(x%;g?e$k_aA{4L;oA0DZ}FJQJmK2$+hO0m{(*|8bvIw zI3vzsjCJ3NI0pbvMCd~1-#DjWdhJ>Bp|`<&;&jM*s=?Y$u7@!HY<;`vtC*VQ{IeBt zE267KJ5-N@QPS5MixV+Npwahu@ko!)&DXqJ7<kDTHpD{hRLC%#*a=t;Wg)MXkukMH z6ql0EHYLkOA5W~g^AXV)L#Ly2z{NkFs$A@YixVkaL6r$tz9SUPuKXA>xbj6pYF7pf z^P&XIuH2@%@)1K<xZ+7H73+hp`J!M39PkFSQU#v$V<zT#S<QtR_*-#dCd#W4CQOAD zpldy+w-MkWCo-+DYK>Iq;NdbucLom!XZG+FHX393#C7*+(!=jTp2ou|1YyKit;ke{ z*4-aLj<j+dHuQy;ZDQ2o&>|NhWl_t(G$NHn4xM+XEb`dU%US0=Ru&l=I+A_fkYi{( z2gMkTI~nWXY@8M10Kb{8_ME<Nsq~nenRvIBt*Xm#Aw{9OHHWMR*qJuZm}G%W@_GWQ zk)x@e<kiQV<lAOU@)c|bkjq6gB>88kq^X!tRl=r-MQ44Gxjcjzs`k~EK`abqx&D_- zafpCSqCX~N5+lzp_IR=E84WMNdM7V-WGSW~<Ag%IRfMMtPvD+}D{?)ClGnxiL^uX9 zw)&^xNE?0T$7(_>`OWn7L=^=XggH{<^2zvryny8nMyCs*TONH>jlANRZvgo*+~-Tz z6K_Y>+L^WIG1M5X+jv_f-E-m@JzR=ZdAxOfMWi7w$+ze+`u0=noPFc@4qvlb%x)>x z6<AsxoJ3t<{{Ez>5*`9`dHlh_^2que{AS}ft30x>BDxMwlQ*IVoqiWm#6tU%fJbeJ zg@RS(f={Blu*u^xt{GWD$?veCE|eUb=|`9#COQ<S*pSzvG4Oo<<k*DB*Gs^7_9x#9 zdM_KQXdPp?O4{{At~&KGw+)`F^K}JQrwCycuR>uvqZe27thsk3jfiWg#_A_=@_4&w z)Fs(vSK7j(6IobfPb|hC6$4W_UnMf0A+tTIl;k-RS`Eg#E15*(aQxYATn8`Ta9$U) zvwBW198H+<!+%kmk##sqe<Taq@-XFtV`#17dXhN5FX?`eM`h|+MLezeC!B*Fv_VA{ zf_TF7RFUv3_Ee`Q^C0(}k&_N}i7AuSg<^wbG<I->hW`mh>nY-K6fU=X05$$l+;C6k zf8u!>F1NHmD|Wf1jzp|d67t$pR4GlY)=kt46KQW^pK0<kp%g?JN|$>w|IEE_EH4RK z@iLKR-c$4>jx&*!uVa8WWo0y1m`I2#P80uzy+IEyVI>sY9j3%ka4ay9VKGXHchwN< z26HU;jIrYJ<N12DSJX$Un`sxowyJ-0=OW|<&8rXUvR!6gASLWsl&JQWxfo)cp5aW9 zJ>y)|?|&|ijoDy7j58dB#@>ljDT#AT*~i53<)cezO}?v!%XdgU-sm_0^juU^z%s>9 zp!Ov_nb%@>i@^lXfmExLdxDCHy6(qC1AW3A5nEWkMjk&FERR|-%%DER6YBx2wsAy& zQO&q8Xvb+$KeH&hy1^dEm^jV;yf}opj=3~mmSb~Qom!RM?+~2urd+&c;-A>RSUIx! ziT?HRe3jMMg{Z@Ll$rk4n1}j3MQ8JTE_!-3(tIdxu_yCSmoswamC%ZHtQ91&c4oBa z=frm7^tb62`h|tG{pwQbooep!o@(@{las@f)4oZj{YhlP<b7dM+OfXmvzz+T=Px!2 zDb|VP{>A7;tIhhsWPL}A&)c@s6ZBdffk2DbR^HaILVmP3syF!?wgaxOuJLZLmHJx) zVSF2gt$brCR3ME9RaLsLuW@dYL1o^S7HNl{EM@D;`70&P(rSy-?XR_!8c|BCRxGns z)RYOa#kqOC!?Mm7Y!5*niM4q`K7X61C6@X!X=hz|sb$^u*Ou2*UvHqTy4+dm+*oZ{ z@7wCxvMc1Z)p#44+x#v5t-BDNse~F=#6m4D@6Hx)D74(|Y1r-wHd<V6OZnPL3zKb; ze-SGfSdsAA9~ACb$~V?HD@3RvsqnV>cla$8&W%-@t1OkihM<3Wb;yIlO3a0&vbx+- zSzfxSYI${ygT;kH+vun%uiEH<J)<OM)L>CnH-|%^7O$nIs@he))?uk#S8J*9+qQUZ zO}>^EZ=-F?E?d<K=ZeY|mg;c88!WG?_O`YAgBHFEjX&OeLtg2}*QFrf`nK(D{+(@> zbsO<o{JM*39S!_jUS_$qsj=NqUgv4`wd}gW_TC#j!8Uw9%}q9MFz653JdKTDwveZx z+287A6Y(|Lc6eIC-bJ%T4F~WYCXCF4=NKpG^@#N56s5t_c1g(A;&1SvK{R=`du`Q~ zrM5=z4qt<JnQc41xW~2=WoB#hQ_Iu1$g&Pf(AnVKWeNL=E!!1e?+tBcmP$P>EnCoJ z67&*FL}c40vgNe}y|;wDXvz&Ljw-Jvl-YLgF55-z%b*ep2it6U9T#;hiltS3ENL|~ zd)l_5&b>RlZF5gb<*G~+gyo_J`Ja&~DNf86{bd<7`NM6EHbZ}zt;O56HPmcdZiD}^ zvP&Hujj{o;Lr}H(+T+${iRNo-^2e3aByCx~(-&&q<lJmo-sUG<?rrj29%%7|P}r@O zN`E6d^#vQ8??Igw<XbW<s9v<|%2JEN?as@~vs>CctzJueYs2yejB{v{ThPA}J~E`u z6YyB-&~q(~-Ywy+=?kmL<6|!j`E3notY~<$Ky0nvR)27p%@YiIcFmCMr0Dqmrclt2 zo*isI_Q>r4Z-cMNcU*Bpt?ZwkMHZibxhLRjSe|FO+#leO+@3!7o4i|n_yVh4Hnd0l zH6oxFuq$GaYVfp&Wbt6&+q}t9xgx1B+QSVE-uCvUa7)WBn-61@&(q?2zZcz8b}dw& z=#3Wfx7`x(2g0aquSP52h-H(zC8T@HLBOqA#}(*^i!2Sz#g|z&tqrEqTpRSXH8e{- zsMsuQVWu8*g&0;gp*OXoaBS_~5NaP0^6VWeF3QXAXyTtmjAygl8uae4Y}&kb-HayI zu1jwPac!6{OUqMPDD}5B`L>pqB}C8ffG3H67FpIhE7$6=EB#y0ZWGG|<=xcc*=o6A zLycS4zJY^jXjj0CY_eW_#WqW6#SI%$>NQ{l-fk$`SL!+!HQE9}FPb?#4+qgUFx=#} zU&@(<b*>e4eEw<kC&z1-W7G_>WJ6S4lLH&;|DyKg;(tpM^2OecfW!eg*5Zr_!O_?V znak7Gh<+K<#59pYx(OYBhc`ulG$Na_VOW}wvPw^bJLtCn*82V19loIPF+oaEEBc7V zr?iR4k5Oy}USabGxC{sf8xm(ho41u+2Xhhz=r(U?yQkfjTY9N2KQC`}tProT1zN&e zeQoWwi({YK!-0T57_#A8*D$_dg5|J4Bdz}T`y2h+{L5_N_TcjNc5nVNTYC#8TxHju zx5y$}X;>|&R0Usw8QK^*+39Vl2RU?Nscc!X5r6O__C7$~@#4>^3diwKn!lvf|9{)h zU$B4V&%M~o^5@nP0hVV=CDveb&z~Qv@UNB#YFSt&u`et!-QU728FID4bb7kH{uuT3 z`004tzsPR7^wP<{q5K#;Ih}@-U#l8T&Hr-ax%r=*{_rgA=3bTF{$ot{JIAO$bLq!J zNB>23<0+i@^sgv^`8dcp@pGaCPL#m^nG(2G^|zN4mf;Zd|E8bK|Ci<W|0{L72v0Wn zbB4l|3a?gJrtn&YwF>Li`nXwPK%umj{C8A^|9Td^<e2|l$?yLUrC)(tlKk1MP_o(o zb{wPr>=vcQ9seS`b4}mS`{gWtT&wm|H42S*|EKZhe{%Y3T`~uss+72*LgE?MO3c|I zG2P#(^JK`p^V4ahmS1>``l+p)ke(=k|J@SEKhci=cPrpT>L*IzI7;BY3y&jGLKHVH zXYePa@B<2WEBuH;ei_P%pA#i8*AjS4wU=RqPb=J%D=plpaErpZ+Wr5l-U8fR<j)F) zdGD5d{xXS66*enewp_{|Q}{((mE_OLVu_2^NW4#>>uSj_zDDA|D|}SpvkFfwk>Tn7 z+En;uv*@LZ|Id;a{*%+6)Se4Gu~B;ZU4=hU_=3VC3SU+DhQg9r_8BiZq}@q{b1jck z*UnY**z|1wBD=@t#R=_WErI+K^>(a9c0&I|2^@C`l&Su<S7DpFr*PZ`PeeRX0{_Ai z=v3`<@BeZ;z58F3KJPW*MgM7kaO(<rPiuv`H+5`<TCk#M1>Uqe?jQOvTV&(kJk80P zP4h(fi4r(b0w+q~L<yWIffFTgq6AKqz=;z0=aj&Hw|Ey|L7&2X3VRg}D;!ifps-&d z|NV7b8DEgSN!rO$*m<4gxeBM0{-nYIrB|#l&xl_w?G3(H#vf4FuW-M@K85=f_A2aF z*r~8X;n;hmy~$dM;|j+V2Ci4>A${y27St=uQ<$r;`F$$BVOQb!O)8$kEQO;=e?(#L z%~CI0VV1%v;5?)|sc>B3m_kdPESKDEGQLe=j>2q(Sqd!*r+iX>QsKD5F@>WFM-&b# z98@@<uwUVRg?$S5HB0-w3cD3{D(p}gP*~C=^@|neDa=)9Q<$T0)T{ElMPe<=f%TKC z(57%i<=3syrO>urmRmiL<y))Jt<a^gL}9VQJcZ4`lM&B-i%i$0utecVtCZ)oNF0Pd z{p(fOt*|2`<x}kvCl&6-^9AaEK;hTWZq9|k*c(2m_)80Ae}6{t*A@Sh;#pZT{1mho z#y9qqr-Cm9H{RPQRNQ!fW3%GMJ;7ay8}|i2qqy;2&Z9<r^&Zam6gTdVO&H<tl>RJ2 z{V;vweV$7dH{Rd5LUCJ()PJAimnr@s#f|rX`V{}F3cp`*<6PtWiW}z}<BA*a56!Qa z{uu8Iok4z*#WGT55kL9h=c2-UQ6KzSQ!n{G#nFZ=R^;avmH#spU##+b6*=M?&y8+W z;gjd$1Acblm+?2BC#dD~<fzL5j1T-7#4p2lzl+Rbc@@9p-8M3d<!pQ=H|`Y{C~n;E zt5bZbO{iPMw~0e`zT%%$;W>);E51ze?<xLkm7fX4Z&v;<LIE)SubwCEuU5Q8aeg0& z@K5ob<j5cUA%E^t;cqH?{F)}}7b^a9#d{ThRq@jlKMi$7{XxYqRouAmd9~ukJ<w{! zYm|O7IqJu__ZK0De_3cJ{P}OCZ`^wtRouAea8z;QxoIB0zKi}C&q+5cZainbLviEY z#8(tI?oa$!apQi)wBp9|+12=(5!yHIW9(Mkc;3r@ri$UlbKfb&jpx0~7RYep9>)!e z8}~#0O>yISGXE)T+B2RzzoEGC-1$<J6~m3^%3j5d=hL53+;}eioZ`mw=p`7Z7~go_ zyi9T9xpTSV#`FKM;>PpnyA?O?2@EN2+#h&FapPXWIjC!<cWQ~KUdxq=4=R3>;x2~_ zzfE!De!^E3H|{O`f*g6`e9WJ>RCtbxfBqtw-uo55Lh(P92z5)n;{7Td?>h_sjQgd% ziW~P%`Mw$bzgp?@YpU6PjrSa1AcsGrSXc39-YHW5tkWgGSaIY1zV|C`ym!biR-ygz z)1>|biod1!4;BBD;(t_pfwI4Jv5cRs_;SUK_XsN#U-@=vzfJM`74Id7|6E7%=W8mw zOr>{J@ouGm;S!nNi;7>Rc(dYL6hBSHf4}0!`<|ar+;|W4zZKuF;y*@?@-^NEd{KoP z_w*MomHuW|OMfpVNBJ4|@hcTK?(GK^H}3D>ulV~oap329#f|p?GBB?Qd-$qL{^TmY zTk$HzjeGw)6gS=rxL5H<mHu}WH{JtTk}d6zs_-?68}A#u#|THe;!jv{<Gr=d8v3Xg z{yeF;@!rC(6*u0yIpu9KJ>&hGe8nF=L&oP<5;DIll|LPd_vXm(2Nmx?Iq~Ob<Y+Hh zs{G$H;-jAUbM~py-eP5Mt>V8|>G>2l-sAkR;>P=(pH_UCivJCAv<Kt<#?$0TKd@b< zH?H)J`x0*{ZajxS7wwAqGoA}xrMU6j@FvBL=Z7CqJf}?B|CHi)E6#qy^tmqO&v#V# zHWhwE@k5Hgsra>upNW1!e_m7kGR2L1Cs!(N+()TUe6P~KNpa(SiQ5!6?(P4l;>P{= zVZ{qegu9kMDsH?_eHz9M`eVG$d!^#Wd$S(JjrT_)iW~P{zNEPEJn1kw%4blmr=C+h zTaDMRC_d(v{+xt%LH(R+$<I{0LzV9(icevk%^#=Y#oHurQrxyl@;enD!M>0`Usimq zUGm4tF-HxDB!3zl**_|o#qv{)|4QR8X?#-SZ)ki8+Hs=&VvRRw{G%FwNaHVR+=_mh zX#Wb0do})HjqlU=BN~5E<MS|Xn$pwwEgFA7<A2aNzX?0hUY*8!HU6;1U)1>Gv(5I3 zG=7W5zpn8YG=A<mW_xape^}%9Y5Zl4Uy5~oVtzdue?a3eX`Ek{m>9o8<F{%2evSWD z<2l&pB--1c@egVI>l**9#?Q2w?Nw_0c8z~i<3}|9&hyOnuG9D)jX$LEKWO~C^Ue0I z*LXzZ-`4o68o%fQv%U9dyhr0h8vm=tFTK!guSw&d*7&H#7hhzKzg**9jqlU=cQt-g z<MxZq_8T>RkH){Namyv<_(dAurg8oopcx6{^S3q5f95nX+?H$Rw`hDo<F9L+`=~^F zH);I8G(Ms6%Pup=_i6lF8lTp<<K5=?w`lwu8vnh<mn}2LZ_)S@8qZj6)?cIXT^b+J z_>vXo_}6OuPK`gI@r=vO@vqkStr{QD_+K@ipJ%og(D+w1{(FsIW;e%g*7z4S{-Vau z&o{@f*Z92}|GCD`Dlo^d)%ZOce^%qC7MkO`HU3eJe^29!ip=p{8oxv1`!)Vsji0*G zY!6?nW$It88jonaPvehhd{pC;8b4)~Ilap@Uaj$+8vnG$4{H238edp!PVe0suhMwC z#`kIb+ZzA1#uu(Or?*Vw*J->-<9BF$pT_Ug_@f&Cg~ngg_~}=e{kuZrH5$J~<2@Sx zn#P~j_#ZX?_AAZl=WF~rjR!RTF^xZ^@d=Hea+Nu~<r=?H<Db*`a~gk3<L_Eyw(rn* ztHwX7@%uIYjK)vB+HAj4<DDA+w#I*@@r-NC_Ab!)dX4)u9@RL{Art54ag8r2F^A`A z{AP{cuJJEw{AG>X9A^9LH15;*M>KxF#{aDGcdRwruhsa6H2y7(zo792rDl7pHO_O9 zjD+>oT^b+I_%Ag+zswx}GL5@6zC+`m(fDH;AJ_Q#PIG!Ljr%ozkH){P@fS6I$~v?C ze2u?H<DDA+lE$Cb_+K@C&U$ltr5fL+@sDeKK;ysC_yU*N{&J1iX#7@<e_rEHX?#-S z?<hB?ceTd78vlsKAJF*EG@fy-*?z9Zt2Dkt<Nu-YCp12x@l!XL)2q_>ZjJws#($*o zqZ+qYnC;)J@x2;<O5=agxUJG`Z-d5nY5adQ{sWDlywPm$LXBUg@y!~)MdN!l{&|f* ztnp_x{))yISDF30SmO?jZ_#*I;~&%b{TlzN#{aJI3*Baa$~E4u@sDZzK8-)6@xN+Z z-S0VSQ9t$9nbYsp__G?Hzsaoc(s)4Q_i6lh8n;!O?Omtwdo+Gn<BMy|@ryJb)cAcG z|FgzdTyM7L)A-jl{s)a;w%HtiyT-q)@t<qldV@LsI*sqrc)!M9)Ob#<*`8bDJ2d`P zjX$sPMei}&TdnaHjo+{FBN{*NMzg)O8gJD2of_Y-@j;D0r|~~&{H*ty(_gLeT8-bT zadodP)}Ib*;eXTkh3_+`SEcdo8oxv1pV#=K8vnk=f1&Z;Yy7Cj-*%JPKbyuc(RhKz zt2Dk%<F{&jx5huJ@q09Wug1Tm@j;9)PvVMD0Qn;ByIJDsHi?}fiNnx4gzygN5&NJ= z9D^RQ8+ybM=p6=jLXWr~dc<+)5qqIW9EIL6up4^Be&`V=p-0>YJ>nSjo&xqlk2nB5 z;uQ3Veb6J0L+?Aleb6HgLXT+KE^$Bf$S0xqU0@&dh{Mn$W<ihG4?W@(^u7n&4?W@t z^oZHeBMv~1Xu*8(Ltr1qrDuTqwn()2B~C*AEac;m6Wx##ry&0^a1wH2E#$;*jE_G7 zc6ua^w<-?#Pa*GsoHzzKu@~}DU^nE%Nyv%)kUt094>>WrP2xVte+J$QIdKa5#6HNM z2kwKMXn{U)Kjc4WION1E$cer1{};e+_)naKoS2RA^q0V_28jXWi#!+lzXEnckJt%5 z1{?z?4kDcwfCET}XoFmE$bSvq4>>Uha^f)LzX1+HPRxazxDR$;1opx&;uPe>ZpeQN z90w<MApT3h0OAuzQ4YlB8jIz3!1{WL!z~g6kdHGQa^eW=h00WQ{M<FM6LjE$t zAt#POPV9z!g5i)8#~~;7LjHS(Lr$E8oVXA2KQJ6};uPe>KFD8TIOIeN{3q^*{ErNW zoR|eUu^;kDhC@!whMYJ6`Kt_voR|YSaS-x9F&uKD4RYcz<bP&3<iuRai6fBzh2fAB z^B^aVLjG5VLryG)oHz#gYYc~+SOPh59P-y04mr^UIdKy5DTYH%bVE*@g8U7JLr$!P zoM=J)zR7UNiS>{ZvmpN)!%^?VX2^-zkiW%n$cX{Si8+w}o#BuZJ0K_8AV11*$cdeh z6LTS-W;o=;ZpevwkmDd=X)ff%UdV~XkY@n%ASdpFoLB<+JcdI~?1P->g8U?gLr&Ze zInfRIe1=0#?1!9K3wb8PAtw$%POOJ~0mC6D4nj_BhI}EzAtw$)P8>o1!9S<BbQt}L zn1_B%9EJR3hC@y)hMc$`@>76)kQ1{Y7l`q4F}V9W6bi5x<1DeeT4KrjB<9^DvH50+ zoploTZ<9E_U7|ZAu@?4l&tmC5*dzAB9?=DR#A4VZ24Iia4SU3X*dtED9<dhoh+OC6 zp9oyq2YbYQut#*m9<c=Wh#jy;?1eqz0PGQ`V2@Z2d&Fkg!@pUubU*A7`(Te)3wuNt z>=8R*kGK!^h=Z_4w4mP;n_-U_fIa-12TS{5kGLQ9i1n~Xbi*F88}^92S4<p+Jz^H@ z5d*MCZ1#$OOJQkXtHp8}cn9!wU?=blU^nm`z--iC4v_ariQ|ZOCU6kpXHgD38`yz* zKL<Dp{!ZW+5cjs14g=o>90A&Z<G}NPQ^50qlfVmrmS&6PLSQHCTm&ouzZhr(UINSo z<^o;7OMyAS%YeOz|8C$u;4)wy<jaB0z!ku3;N`$tU>>j-Xb1KI^MU(;1;Bn_A#ea# z1RMme1P%jN0Y`wvz)|38;27`<;5hI~;3V)W;1qBT(Bi`#M_?B48elfC1egPK0Byjv zz+7M{Fb`M;ECxD(CBSt+7jQk$4Rir(f#tw@;I+VJ;09m-SOM$+RsuVL8-d-xDqt_r z4crI34%m<S+yv}Hxm5#mP|vkM8}PlrT;ThFyoX8TeQshm+Tl&WL9{<&Guj<-0QQJB zv@;_2$u|Rsp+^irk2nZDVlMQE`=EzA-b+WIN9=$eaTt2UJm?YopjQtZg&wgJdc+av z5sRTm+z&kua146HZs-w5p+_u%9<d*KTY%%xBlbd%I0ikU3wp!>=rsT*p-0>YJ>od@ zh;HZ+2cg#poPr*)4|>E&=n-q7M;wNp7ig)GxF34tQ_v&ULytHDy(VB5^oae?BU&)O z5u2e$9EILiU^euK1JEO8L5~=K9&rqM&A=S!5eK11%!VGZ1A4@9==p#)=n;pZN6dj9 zu@id4N$70@=0cA+0zIM)dc<z%5vQQH9he6_;wbcpxzHo_LXT*{xYhzJh8}SYdc-{F z5%)ol*a3U3z<!i7u@-v7{U|?THuQ*jXt(XaV&D#7?RzYioj^CnFXF&05=#)?0iF$e zMBalG9QwP!v!G85K%Y2#qlNDvEFEl;nA<Kf2l}@{o(+9s2lR<~SRa1?nA;$+7xN;y z8~Psvx}Z<&hdyx<@((dQs1WJhMm?lQ?1!AleRn7I(0_>o@Pk;3^lqmd=@AEz9&rkG zJ`9|M9bzr?i6yYp1uTXgVjtwh0Q}eu9D!fNdc@xYtVMj{Ap9WigZvI)FXY52$ccTB z-^p;ui5A!;W+T0BU;vz$3x6X(8~i19!(ZYU;_n5HB0jMM`ovDiqreWxiDO8Q=z{zs z!2RIFX7C<hJ@kmfkP}@<|D(VX<d?V~c8T4{Z!fSD^+6m*z6FQ;<KP{T6UQJYy5aXH zfG+q=?1$gPVx)T)a39hm_JiLI+z&s9*+@?y<al>wX%^(f0Q8B)uzL?M4|a+BV3!zx z-=6|D!*AjU><~w5EtY-cjS`FDA9)V!|2r@n_K6*^Pjn$ap9Yp7Kg9jeC)UIMXMnY^ zPaK4OVh8N}2QUCT#8KEGmOy?lun(M=2mV=LFE}v(-Un<(JmLuCL<`dS9B>M9Vm;C! z+K}(h19OmXVkh!V<oVTq0{fs(%z{4A4Lkn@birR@Kjg#?<nIf>0P;s1MgEB0u=7P= zC+rZ%;SaGHcD@9xhaKWD>=1ilXFsqTc8HU(BM^4J3_cD!L^t$_Hpu@Q*a^GDaq#~E zjzN#;f*!FLcJBk`!7gzh>=K(H{|c}ka^f)Lf<yjQ@LI@;gOC%m;P=;n7WhqUhJ9iQ z%CR3<jB+IQp&W_zkbfOm3psHRa$+;&_cI)F;xOdI0OSua9CG3a<irlhzrk?GiKCDc zJ0brj!yzY*K~C(3`~brtCyql-?1lV6hC@!Agq*k!@&SfJPMm_AID+zg2sn)LB<3N% z#9YW926m&|iG7Iw2yh?b6D<LW`yu}p!yzYTK~C(4{M*3&kQ1{ZCk{aVD8nHq=0Hvy zg!~}GAt%}(Ck{hC$Z*JsxsVe_ARl5l<itG4iKCD|#&F1q#gG%nAb*_UkP}NFCyqn@ z1j8XGx*#V`LjEMfAt$;aCr&|rh~bbEYau6EFkT#HION27$cb5y4>KI&2(cM*Vm9PY zF&uJY0CFPF&A-EN$cY`06K#-xm*J2TJ0U0LLjFC5Lr(05oR|ms_Zbd3u@`b;G2~A( z9CG45$cZJ8|A66;6Z;@1x*#86ION3rkP~^H|3ijDPV9%ASPS`&7!Emc0CHkI<j*i1 za^fK5#Ae8!WjN%-VaSOA$bZam$cZD66FVUP3Bw^LjzUiCg#4!rhnzSDIk6k^QHDcK z9EY6P3;A;lhnzSGIdLE4KVvxL#3{&$eULxTaL9=kj2FcHkpG<FkQ1{YC-y`B3x-2Z z%!Zse0QoN&4mmLga^fK5zhXG#L>uJ9VaUfA4mmLwa$*Vk<qN=ZjAOqBj$s@lx*#V` zLH--yB;>?e$cZJ8zX&XboY)6@f@9qKEqETrJ>ou$14I|v`%AzQv}@vij2px}=>HCw z3w>fQ^aWzv7zgjhctV^+y2Me)j{rv?Cl*7WXo37?;1v8J)<d6|1^EQSp-*gvoS2Jr ze-E@FU1B%v5OW~^127wMVh7|z8|1Gr9CBhO<iuv2%lwgY<Zlv~jr<WikU!!S%KcT~ zB+8vwi*h24gZ~L=K{@^zI0a6uM>ug5{4c;U;9r3Q$j58Ie&mCggY=1mkiX7w$cZ+{ ziThx83fPPCAWp$9u@CY$7!Enng7P5N!p@sOH|!7xASdQQ|8Kxt=o5QkM{vmB0=Gd< z?1r3(f3Vv!4Q$?I!2uck#J-eRf^!dIC(b*Fxgm)i(90l)9?=awVlVWF#n2;mLT?^0 z4|>E}=n?lpk5~ddVmI_o0v1D$SPwm7AM}VW=m~`0eDEpME71l$Vm<VTS<oZ8p|=2N zfjwd_^oY&SBW6R7SOUF;z)9F6=0J~F3q7I*dV)hQ3p@+<h<VT>2B1gGfgZ6QdM5+3 zp+_u+9<c*@L>u&o!#LN&JJL&Y(cXw-Jm&+B@|+J?0=eKgM_dd(g7!)*#<@Fj67nU$ zama~o$cZD6F9i-mPRxUxI1afLI0iY<1-ammXM>MIPAq|(I0gCJfRm6DYau5N!p~EI z1Mrh*gP+84$lneegPiDsoR|gqX+R6)#Aetbx@vGP1}v$UxF7pVatrj&08SxYVm<VU zZs@-Q=z>16ANs^>=;r{lV4oO(KCuM)X9A0%Pway}u@?Gg0o~9i4nUt+4Efo>JjjXr zASc$t&N;wZ*dY$W4zUFK?*tY@pV$X|q8svafiB32{g4xDVdq^8haKVo>=0ehw*gC_ zPuvfEViv}w^MK7LM`9lI&Ijf~kJt-6Vh-dN0J9+{c0f+-hx|g|e#nX0utT)K?nS^U z$cgok69dq{7}yLsaRhdV^^jiztc9F72sv>8@?2m)<is4<A$CB1DKG#zaTNN*X2>rC z)<aGlhMbsp9nKkn0rVSUbG1Yp`VV<F&LM~{^dn+D&LfE3=ugC9oGTFXLJ|jIe;N1y z#{1>K{lFE#e&FT6ESw|e0WBEs?LaqpKCm8G04#<-g}?y(Am$)_Vl&bujvzf^3G|A9 z9nd4%phpZqk2nfFq6>N}ft}DJ=0cCy0X^av^oUu|TLmnE9&sG`Cl*7G*atmgHuQ>t zF6a>_p+_u%9&tbPh!*Ir1{On)I0ijp9`uO&phwJs-W5PM^oUc?Bf6kR?1vuF2E8kR zwa_D4kPo68dc*<f5%*($xeC~a`GuGjl-LjX8iqqo%!Zt3gZye>4&=nnTO^J^ehv6A z<itGa69*tK0ro>q%z>O}L;G@&qyCAVXkWxp=&uEiK%ZC)ec~YGrN9Bmi8jcIS&)|j zEsztN;SX^H>j5Wl81p(Y4|2hwzYcs5`ovt=A-XZ2t_RivUBG%^Ij|X60So}EfE_?L zuoHM4up77uIB^N~KWM^tWMRJp{5OU7o-H}w2c-OQg~K+<^A}?u1o_ivO8nzl5_ch- z@~h61Sg}mv>B}YFukhyulK(;B>BW-U6^<)xU#;R_A@M<l@4Hg+A1GXVmE_-4_{lYr z+pm`BTPty=!n#t)7oTjgJO+Oq3X9K?{APuN3V)1zQE%}IiEDGPuLG|Ee*)O5@a<OY zf51x=R=-{HA1LJev<$C)hs1BcQ{uG3ThEpJ-%BL^LZR0o`Jdr8;}?}l{JKK-BJ8gq zzfs{Ymr6daupa&}yj7ta=?Q&>zf^cJ(xW_2;Ufy~K)RIoDm)G8lHa`o`#0eJ3$R}U z?!Hjs);#RTz&q?%cVt+WPb<6=^-6wVDb^9dLue<&n)4-oRN<MhNBQ*%`CcITxfe<N zi^9%}C4UosFr4p42|c7w+>3OH_bDvSm%L!5#AbzE3Lk-g)Xzn`BR-(;dbB(8*A@OZ z+8y~j(cXx?3cc4z{;<Ngl}f%D<yZr~w-la_`Xv9D!Y37ecde8kMY&v$@Wm((Vj04T zJt()$z!fMD;yjc$aWl$+_}wCjWylZtRq%u8M80nT{tWis1N<Q36K_U*;t0x%_<i&j z;zg%eEH?u0K)Dh>iE!foDC|T#YXc9WT@yc{@C}8Ro+jnH6?US1QSV%|Z{pPozo78P z3iIA2!yi_71;!&k^j!+S3j5@nFdh->72b&W<nM)E0Qe;QBeo-)_%7s|xCG@(+>Y>D zfPVN#+z$VUXCqzW7Zf^BU*rc6kN7#%C-IzYizNvB=GFK&iGbrMmoV@&jEf%wE&~1= z@U=5={{VOf`aAIe;uCAoe~2N4&nrB|DdqnK|BfR3euepnPyTzf1LB(sdl8TP6VS_? zXIXAVeu&p7yhq_DkUz>FK{*j86s|=+$-k%2kNlF~2m8cdEBr0;Pd*I)iLWAE;(73w zcsa(;Yk|!QU%<FY?n3!*0DcbblDJ@v#PhF_c;8ug-U<0z(BB9=AAS<2E|YlZ-4bnR zhm@~Fcs1}<o5bH@ej&dMc4~l8g(HYhem}yA4;M(hqfp}46@CTv$MBylLH`0CQFsyj z*$f_1cp1_qZ&)tzDvUGak16~U`WJZ@(jk6AVV^?2XGr-Q3NK(k1>c~sUEvSeZz0cG zCGi@C?>`Uy7xF%ZV+!8^`;=!PJ~3b6jS4@ka13@C{tnn9Zd5n~e`>*>QE0Q&)!kUU z!`s&A50;m?i>s=uLqT8LR*E;;^VD~jZ}9H2=Qa2PyQ+7!Zt=G`-5VO*4JlN%R(eC8 z(iTs9yE9d&H{|lPHMV$z&K)U&+vCCR)#X*y-rx>jgEy68IN%MYOU1s^7iu<=fuGg( zy5<?p6(ilvo|dq8UC`gUHr&(%_uLzHG$$oo*c9}7Q+QtJYx9LzBqFH|J7!94)mCq4 zqo*~M83tAR-k&b0W>+9pP%&Z&?^8IoI#wH{_L+n8Qw96lowtNNEj51R&0bVh9kaI9 z)1F){s}t3e+eTt=bzM@~u5L}=a8|QMWgg>&oMZu6gq!vRH&dx3x4Y8(+2f@up0d0Y zWmcA|oXcX-3siS1^Ri{z^OCxYuF$TxbWNcEZPy+2qdSCr-gYOuZ`GD<-iDCOyQW>( z;0d>T%iBWUU@#mAIen?M+C4kG=<qfEjhi<)DxL1cQ6P1UaG=o>@>Vx{f&oM{%0)}P z$kW(}&>PZLrmpX8^K5CE)!mhizV<okp`*mIE;^GBcXY%krzN~9?&xgeh#oWO-Rf&c z@x~Hz`r>usUbh1yggbG3@HwmVRcFvl6?+1K7H@lNLtT@vrKJw#>p@KvIw-BKEUgZC zLgDt5?rSl9ZB6LFbBo#H_pplEITDt(_;+w5)JI~?&(-0!6q!!tSbkoEr=`W+;t4hR zgRSerZ4DuxzYU#_bB>r+wzzjx7u3oBQ(Cac3dQHIYiMn(3wk|`Tb%A4+fu6M>*_m$ zzK~bw&mjVfe6|D<3#`m1GUN&FLUHF;RmXWs=L!;?6KT!nT~RCsnsVKC@2<KnyXt&x zjouFDwmDU>nyBJ6ItM>jA}#i5jJ&C`VFafv&s9GECR9+dGvv10%d0BAt^VMyN>3n_ zA<ko^{%~6;_2^M7P1#q@$(B?u$e*L~4Qv+hvUv_}V!$o)ZV7L7Zb_AkR5Px*!z5^= znHE<2{K6sTbq)n*s57@{2D6oO(nM=^FWoGfq@^ZOO`c{hP0~skJ3gbD_2ZMOCXW|j zHRnk#8Qa?Z!Bq3ArjR_ZnicHcwg!KrS1vlX8PkMWr+~{o&Sq6R+c;3#3srcf9|8U# z*D3{d&GuqbwDm!MIMCYC(xRG=DbTdSEHDM>3&-Tp#I<8`XyWqG9Lk<2yo&WaQ^E`` z7lVvZX-UDR^{3f*LUWHTjnZnQsn6slYw|!W5C3^}khTYy5{)mY&ACapnoQD4S(phu zz?51-4=~GPC8o8#6kQ-mqutwrg`(RZ3^~<aCs{>be(D-_PQaV}Eg{cVud`J)X<a8D z4X6^GsU>mWlcc1UkfH-~vcXDeTgtAJI*|gb*=jru&3^17&>34})0Li30lZ<J+f9>= zu2tB=Wn3E-*X{~=(-lyH+713-V_G$qQlfXM^H3zzysa3@u(%7REzs4n<|_PKeOOV+ zy+oR%k7v!Ll|?>F%#@a+u`%ey4nK9PDfD(=H>{esX3I3b>0xpgooeNzYqp2{f#ij$ zrd8zSJ|~SMMS-Ayi#O4Ru@}&-w1+(CAW5rWO)b?hmtG}ZuU(BsET^y;dq8aR&{IG~ z#iOTeV@X4)ZbFoc7!y+0V7k#!vy*NZ)YRhRogNUIEc5`Q>{h9*bn-|S4{6tiFC!$e z8OCI3n_o;LWwSFv)3&IXLh6=e1gB_0DT4Ie>-A|wNmES;!LoW|g47GQgkZCNtl|uf z*bEgD7_M$eJU+0C$sl&rBaNCg;^k0;-J-uib>Izl^V%<sA+u6?Tc%kwoh_46T3cEJ zO=C>cN@vX|z0_8W(A2SOHYb)eyFVo60x^W9oGGE^p_CdaN@h9_jyoZadTTas)Dlaj zU`jZJg62fBhT)JYWP7W>5gXwqzoo9cs?6Ks*~Jg*a9T^m+(oDq&556?TfAQELEX-} zfG61Qt=r=Fhw41Rt!>QZM$-{uzP)afv)Z|7v$HJWU@>;`mw4KkS~WI~&8}*6m^nC5 zU`%VXTP>WsYSG+PSI%8^RVr06KQy>ERM)A4gT#!)&r40GDE54w1DARNo(5lNms3SF zs}xcte(-{6G?s!%Q6D$$g={!Hl$D1R_5x2Z=-I_{unMdMo$ig*b=X?-oWI4}ij{?t zd{KGTCUNG6Q=hg_aF^ZQh|#T~*|7zuXGq?jpn#*VHg#^EAXU+Du2A7`@aRWk$87<H zdn{?ILu8)w#2x{~PcCK0Na?f|QJmu)Ys7|Qk6@hm&E^yL5p(mtK^^GKYH^opc}a=| zo)D|P#$Vd(YiV@4tLx@o2L%m`!}jL(gqpehOA*)IV60M;(?<JIRgvmJK$3o;;j7yd zWOF_yXA6Tk$=l)8sy^YdVRCXQV~EC*rgoCkQ0I?Hwu@ws6KB@PUhpg9v5%)HR>sSH zR}CLSq(1via(Y!T+-8)YLmh;#OMF(a0}lq||4uaF7>PYD&@JW{#bzpPNQ%u?bB_|6 zwdNirHhaxIN^BOJdz9F0Huos8S#9o7Vzb-aqr_&pxko8BCdRo(S)De@%5=4FPhb7% z<D{?u^l{QRfb?<Fw}A9<(l>$haniSe^l{QRg7k6Hw}SL>(l>+jagL)M<R3>n$UlyD zkbfNQApbbpLH=>HgZ$%Y2l>a*4)Twq9poQJJIFtdc2IB}?VuoSJ6MJ3PaNweJjG41 za7jJKCqz!Q+DRR$xM}t^5*9P5Bd=DA^A_G<n&a{~X{(^$gt6zhdz!Fsz{MvIw+h&D zz<A<@MmdwPgX9gGgc(~4iFXGrAbpg0Z<uqGcxRY%lz3m5bCg(DSXo|WJo{JIUkX}1 zp@!!8t|$InS{7JRjQqqA(QGW%s*fd7tXUsRq}cd&ERl>F&Ce^Za+JEu&CVyEVW!dJ z>DeZ4yFVOkz-=FSdX`3&H-lt3izk0_&oYCq+rQHr<gF4scF<3|(?m<!LnQVnv8_$l z$<i70?!Y}fxFGK^slBM&QpUH4)kSsNX3S1ul9>i~LiEDfqQeOv?=vNPA=+g+=aZtz z4NDsJBEv~u723+@$MJhG?rjPF&Yag7&FuO|%ryLCUNpGpo_dNs*gx8oR`OYzdQer3 z6C>=)c5Sm4$lj;q+h#7>Ri1`h!oHw)eT#pKrv<~*b|;Di2hpwA<ky9Kt={&4cg8wi z6~rS}jPwZ>W^A~t#0?;m*T?8|e!i~_&ly@;Vi(ZX`Gf1-PFxUDCnl+zW4^e|AVwyR z1C^dOJkS;ATyq->@(cKI<R6HSqLMe~5_50dzT4(r=hG_>)rmau`rJ%Kn$OF<soWA* z3!PhLYytVJQxxVpUx&BRiTl#V5n!4E#Y5Uq^)5U_ZoR>?-OE$UExs0>TdI_27)tUJ z?$jM)am-W}1$ha3#N<iHm_bwLXO_suOnO|AjT!a0BF{Xt&f>PQYC5izjrG%UMK)Ga z#}(OFQyo`iW1n$ck&O*Un#l2|C8?J=GcH*QW{EvZ8=EEeERAfI*t4{<Sz^!9%w~x_ zOFNq-_ACu;me{kjv{_=$($r>&{SURZ*m1{kwba<b$MMDfhuT`~Fy#2s{)gIH?11F> z(*B3qTI|r|_|pD|+FI-&<+#$09jP2&?3u^4#Jeh~?I+*r-jV8Fck0M#F6yLKjy;&o z&#S5~^|$c;Ag=J2<DQiV7hdh+>1$lhGZs8`jSIw@XC-dN<7R!zr@1OjKXNg|e7MW& zczDregIdn6s;YMINo`7VMxbsl_LfZY#ycKV99u0J@6;G8q?vS#%A85Z7#?QQF(#au zbd0V(la4WY%%o#<+nIEXiC`ujqYKWYV+`tXoz+R@9D8Ijqf&B7r?8Y<)G3sb%Q}Tp za$%=XN-AyHH|0T1EH`QTTr51+&0>;9oLBCU*K1?4ww>z2EhO@lO}lvY5w8aE{Y`Wc zxi^gkr|1RpwVU+u#L<g=mAH2y&2IFU;w{jaaU9u|)ri-`bnEfMJbRv}aa*`Ov^Lzn zOTBWI7^uGkml)P8-WIJ2c=4JLE^@eKK_+T!^ZVM|l_9>EX`K2d1ly$nyvo!r!sYfT zK_S1<*I45Xw))z5@Fmia*8mcAaOg(g<>6S83#rcJ5@QFww}idzd^nE_r^yb4ye%!I zaC58o`hcp?#Mts$^d@hB*R<Vs1j)~g(&la9<rEZ)@l-e=CND&bGribl1Tp%WG}^bz zl*{}(+mh4Pk7w1PdZGm!fwbeGptQv&_QUZ*HlwvBDz|xeUf<65c7?LLFyv|9j#CM3 zu5yEySH%^RyiR9kws_c&o6a~>WM?Pdv@^E`J@rBlX1pEP#@F~7w&P)ctL&5s*(~Hs zT6lL-W)m~jx*cd%JgHC@Q4)1izK@xxU@G8tp5i1Y7;izT>#=aB#}~pekb0k5zo6hw zb)c2tLs5gj75C&4ZhM%oXeV44(o1XhsB(xhr`Fcw+lt%o$I<3-<vZ1zpo!-3=4+du zS4B2?amBtZc|0mYZ%@1lrnan!Hrl)$p>n*%UV|e*e>mjarEUZz>I8U<X7sK$<0^lm zhH>C!R7=v(P=wARZlv)ki5k(h&XQE%u|t1(jm_ycmOx3GShLAd&*+cFMY#kYSMti_ zPBn^fh)NzLR;uQX;cbVn(Hoq(!KZsyH!)3=f9&wm^qOv>l2Ld<6Qe68B+hg4Q33AJ z@IBIP=y!ltC;s4ny##PVEG{w0iV_#L?5psMN^n00SFyHD5lal`GY=Ch+r=C_Q#)J9 zZj0Ge4E?D)F5g4m==C;w8;xf^iSw>%H}+Mk28^P>>7=PJb|j9<PCPu(v$U$g)7Ic^ znX#HznFj%J#Y`IpQY`foYK*V1Iks-)dm}y^p7QmPR(H}^7CQxwwSbiGPgmE)-<wWM zgJ->38c9hM<4*Z@jE0Wj7GDV47QTX<H02kICzHngtn~M~5)z+76m@woF%mpBMv|c0 z8}#`ble<`PyF5n5<W$`p4mEPJP8uxYi_zE@XBcbWg!EEq8H?YUwT#v8%v#3scV;bP zyD_ttvEi6m%h+<vtYvIE619vGL^S)dAQ~ke!C|82O<;GWkctIgQUgjjoKI+_TBpiS zJZm?4s<D5JyOC1O*x1aXmR!9lttHoQO10z)PN|k$!ztC0t2m`vavi5sORnUUYRR>n zN-cIUICJsFP5@_7n_Df!&h%!nHn&=cozl%>ZEm#?J9nGK+T3a(c9J%;wb+r_ENXM> z3wZTi-<GAS`hvOjg@U=&Lc!enLc!c>p<r%(p<r&cP%yW?P&l^{sc>$!P&l_*D4bg@ z6wa*{3g=b}g>$Qg!c?_z%->p)*rwA&Zs1p)7#F;g<_>KOlK7@_qU~^7inUBqN3aLD zq7`#lnXgf<H}REDt*w~t^px}Y6<=~gaD#Z)23J$?l^ux-%A_c9^EY6HGPC^xPs8>$ z|IQX~<5urRf5_K_7ntQ6FX}iqA$tYJ!3o_j^S63@ZSn-B)tzFUu20kXg<2spKk{n~ z^tDrdVXG&QxaCVwP1cQP7mG-fTYAZ?YV~x)pZm|EU0~<?r#_EdhKr2O5<?yPn^)nQ z4~C9@!#v%+ta$Mk;yb0%9J&?C_h6G+Pf<g<V>aX6SS+vPS82r4DQcJRS0`Cp>8=!S z<m&Aia*=+LT)xnf;uKKbE=m!yN*%A@T!lw8THzHp;Z(4NU&yAng4MCjb5c;6v)y=x zV~4w|tE$)f{kR|0rXQV}FOQ~v71VUU)Si#;U)aiRVhFtiy;WvKvr}Lwi91Pi*OFDH z8Dsa7$t8|Xnv%RfgUw~BAGeZ%;f4^e&WK_*Yho`hJWmy7T%uA(HRg!1z*I4D1t*9e z#Tvx-;^26|pvnWiSJ>@pmn&~H#}3Zj#?hVW%CNZLXt$#r;x|}L3h~$dOyYPvV}GfJ z*ZBKW$Dp60C(G74HyiOcu#Q3hA4pT4_syPGs{7z+^MzSUoKUjbaQ=jPlQ%cT?MM08 zB3+G(3GaC7PeeSH3QQZ}SV}XMkr}HnZG?X$)wGqUr*=%W$gdfZ&noyHE&4>_70?;` zl5ylN-`_KzKpu-3vG@^h5FWD!@Ljz<c&t&ym%8zJ0Tafnn5G8?$KXBA+5@|e(+7Tu zn@Hbyl7B3v&&YgdwG^Gu-^S-ad`<NjJm=A%bo@Ay&o69@eeE9CZK_N1fYO)}^kF{s zO<HsJQM$<Ya*ru%tMF`+?|dIaajx>U%TB-*NpcsECzU3-m`{pX`|3rUx%L}=u~(Tl zAl^2fa~xm0YGbqbr@bGN`0cNFKSmD6sV|w#J`1Ob#{neajR#fzX_VuSd0gTdv(Z{+ zRp-(?9BW)@)Y&I^!&aOe^R^3GK!cjUW{7eO-6*w{{DNjrd&*nKGnPhvA)>`@NsG+~ zzNkYya#l{q=G1gc&A39kW#&v8YKa+FNwd6+DQFAEm^`)~)GfvWR6)dI%(6&~FWkja z55tRi%w;qeEf`+{w!OlSFQ-zeBn0Q<K@Xl8mbc5>46#m-pu$l`ZoXp!VX~doP%^xj zNiDYaO&AeVt%Bp}=W{Jf?`HEsd?OeYXZK^JFMWPF{)o1gTw2VedM+tSpk{OG_Revn zW^=4AC5`6@ysp*T%Ex?l4b9t0+wlzz+ezx0JU)I0V}fLB*b{7&qF`G?V3&-u<^A3u zzF1}}Z@Q>u2tLP-{;{<Q1$h-N*p9DB6?(C-YP=tUGmeBH^(a8uQNCH~+S>xSvlD8< zr%<q=6<<yRZ1Lg?X@G5pAmpdR$UzWa?_5>A0gs{AqnyG)euG1KBmRiQlEXH`13c$4 zmcn|}3ViEtjfda(&Yd*?UxH))zQXvo?Zm$4DZPeqsHlG*W-23TzwbwV!PNSSs<n;^ zI2PVgS6-*SJ!qY$)z`9XMMHqT8X9GF9_e|)SJtOWF?F!?*{~&3i+}Zfa#AY_^Hn*S zzR^2Xg63~vO3;`gO*xIFNY<XWN~D|oHAu0FNf9(dN~zMYuVfk(`S$AT-Of$rRdv-h zj*VrGO*M7ys!cTr!@E^2JdeXi4;r2LXi-0J{&Mjk{sp{WfMzNY{-puSJp7M;$%(Rg zJMk~U;p0g`O9nL-{1|Z<zREIB2=LkRCH&%F*bp{Ovt-yuPRp?1U)Yd8{@~UXZQjs! zPx}g0{Fd|XxhJ!@&GiMx*H-^#$rl$nK0O||$52nihDBL-<^>nrbH?|-Xa9fNyYr`{ z_9y`0Sz(BjTDDl3NSmg3O-%?vQ%OpNd?lo2=0>hOGZEv}6qRC{I<4wcbI%rYsi>Fs z3bz)mG^52dZ82>z8_6U!&3CbWsF^o!-XC!8Pv5!o{T`Ule9yhZy=M*sK77GKEPn?z zTG@t)GuBPfZQq?I-JVsIT_3gbfN&0ZOsjKsqvE1RTd8UOC%pfBA}O433p;pTJlAnB z?l`0PJ=1y*qFy@X!IybF_P5mT)G_4;_FjWM6WbeaapTz!sTs0aqra8-)a$>Nn=@?U z%eNT@jICqh_4&!CyJ?$F2IyAM{PWl9Nz%j5ggW~3PW1S;bFiPP6c?P=WV#C)3Op}H zbzHqFqGFm8rH0DFliOP={a+wCwGmv)veGu6Bfg7cyhf&1)m|vt*Fg^#oLLm?MOTxZ zAd_P5DXA>u#H=a12VBf4GIm-Thh=7%(CVF1Q<5Dz;j4L*P5b^_!F=zOoKvjC$(Ts` z+<2X*11`O+T{`-ssm4V*#VxBwgp{NZdpA8JeB1M~QRSHUHfAXfyH1et&L#0~Y{c^U zUD}-s@cPB%8hSyCQS93{Wu5H$9<|N#*6!;V`qao218?C34&|z!)j<~Tw57)#yJPav zCDg8|=LRd8`;1btq2hP9cj_d4>d7#y63d@>sZ~;T{vI8d-sfdl98%RkQ!|I|;*k=d zu>aD>ew|S3pH`hlxcAMdu0C|jlHv>@x@}bZWqex<cSJ^_<F7Qk9sF<t`Z8B_!J`wG zo0$^{<Gp;*0vbAz<L*SF5bbPnG(*NZM|V%R)r4)TPM-ufj)Uu3M*@+AAoi*b>j=Vd zXAs<6*KTkppfM0+HJeBv1`7n+s0b1h6Jw?-y5O0i4<1w#qmUmrS&^z9kAyBT3lszr z(U18a{g<zUo>l#1vBhc7&=%gdXow%dqIdz(Xd`No8G7?0sfy!B<K;IrL^TbajXpr* zA?Rx4`*IpG9^4l9J$ohv{FFVND8(<?LzwuV*<+JmxXRi1814LwU2`r_Svu`}<goG0 z4W+ZXkDoO9)35vI4Ene6R!N6;ej@U6p7ot8{5$7vFKw!OuM@^9R>b;vee}=HOcxOj zv5R@rqIV==oO8?9vqQzQTXPFYgAd3>vmJ*docr^w^7g;E#92sCA5i9%zN)CfJ+FF~ zc(BZqJ40_$&|&)0WNVYj{R=Qo_#;}}qOCha9xeDXOJtF_eyotsapp*)DAhhK3Y>wH zRq}|&p@V7>3CbI1F9+;tx+blbj@lc>#=pY0-j&D-JR{0`GKUAH+NSsQ<l?MmEvBmz zZsxg)_+&{v;iI>S#hI>moAoL}77g)dmPB@?4XFpGN1yZFOerYMTuhcIq*}!NkyTS2 zR<0O$YxOk%Qy%2%@G#x|;E_+8xSw6=W7Y4qx9mNe)wDT-o~je1-WQn8T7Ec>Upw!K zM8v!%l3UCxOEK}FOevVWoz}M3&j7pZ#f{e9^@%s+O<nY-%uI%(F}EOyvS>E7#^E)W z+w5mR$6I2r*oaL{rv0s%yZ<TWlu3VxIqBx6TFEFjmq*O9T+340YVk?zId<8ey$y}N zMc3^fCuN2*9_-e|kLY9%5ty|R$`NH_4(9cNPMaww{bql*6`l@hh&#XL<I#Gm>55>7 zjdjQHMh4Hhq3g`*?&+G=ZA`t3;W#<5M?HMi)#jvp%kGTa!c6~zLn$i1bV|1M(A%aZ zkJ7xQa!H>LUOQ~l`<>0MNgCJV;@+eVsBxC3tbF@dkCS3W2@!8?(Ojr0a!z;>k?L&i zCw%3yI=cTuYb@hpVA2b}s{=jx;>UP$Mg3iKT}6qnuyfb(smxPyp9alcePNPkBE~5B znljMa(zU_lQ43B=zv-q{d3=Z`eiortJMCKfi^45C1RDMK@|NAvv!@=~DBCJ{EW9wm zJBmD^*Rk3~wrAP(WUb)`M#9eF#YKv<u^qFw58ba>__F5c%b>Q#&*sePqIe4p87{X{ zqR&aI)i8|gB}_}ZoX~ilf3b@^U3;=JESa05ZJ#~dp{cskpno+52MB-w2!H?xfB*=9 z00@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p w2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?x{4arj0Mm^_QUCw| literal 98112 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 Q2!H?xfB*=9!2c5X2V2oM5C8xG From 70217e5ee6e1425df6800f25a2b26a2e670e6fea Mon Sep 17 00:00:00 2001 From: chris1111 <leblond1111@gmail.com> Date: Sun, 6 Oct 2024 21:40:11 -0400 Subject: [PATCH 5/6] Remove Duet clover script --- .github/workflows/main.yml | 2 - Clover_Duet.command | 225 ------------------------------------- Clover_Duet.tool | 8 -- 3 files changed, 235 deletions(-) delete mode 100755 Clover_Duet.command delete mode 100755 Clover_Duet.tool diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d6914f4ce..f261fdf34 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,8 +27,6 @@ jobs: - name: Build Clover Pack run: | chmod +x ./buildme - chmod +x ./Clover_Duet.command - cp -rf ./Clover_Duet.command ./CloverPackage/CloverV2/ ./buildme "" ci - name: Prepare Release Packs run: | diff --git a/Clover_Duet.command b/Clover_Duet.command deleted file mode 100755 index 8881c8cf8..000000000 --- a/Clover_Duet.command +++ /dev/null @@ -1,225 +0,0 @@ -#!/bin/bash -# Clover-LegacyDuet: by chris1111 -# Thanks: CloverHackyColor -# Thanks: Acidanthera -apptitle="Clover-LegacyDuet" -version="1.0" -# Set Icon directory and file -iconfile="/System/Library/CoreServices/Finder.app/Contents/Resources/Finder.icns" -printf '\e[8;47;83t' -PARENTDIR=$(dirname "$0") -cd "$PARENTDIR" -echo " " -echo "🚫 Do not use this program on a disk where Clover or OpenCore is already installed!" -rm -rf ./boot* -Sleep 1 -cp -Rp ./Bootloaders/x64/{boot6,boot7} ./ -cp -Rp ./BootSectors/{boot0af,boot1f32} ./ - -# Install Clover booter on physical disk. - -#get BOOT File -if [ "$2" == "" ]; then -echo " " -echo "Choose (6 or 7) for the Booter -6 = -> Clover EFI 64-bits using SATA to access drives. -7 = -> Clover EFI 64-bit using Bios Block I/O to access drives. " -echo "Make a choice followed by Enter: " - -while [ -z "$BOOT" ]; do -read BOOT -done - -else -BOOT="$2" -fi - -export ARCHS=$BOOT - -if [ ! -f "boot${ARCHS}" ] || [ ! -f boot0af ] || [ ! -f boot1f32 ] || [ ! -f EFI/CLOVER/CLOVERX64.efi ]; then - echo "Clover is not build?" - echo "Or you probably have change directory on this package?" - exit 1 -fi - -if [ "$(uname)" = "Linux" ]; then - if [ "$EUID" -ne 0 ] - then echo "Please run this script as root" - exit - fi - if [ "$(which lsblk)" = "" ]; then - echo "lsblk tool is missing! Try installing util-linux package" - exit 1 - fi - if [ "$(which fdisk)" = "" ]; then - echo "fdisk tool is missing!" - exit 1 - fi - - rm -rf ./origbs - rm -rf ./newbs - rm -rf ./boot* - - echo "Select the disk where you want to install boot files:" - lsblk -d | tail -n+2 | cut -d" " -f1 - echo "Example: sda" - read -r DRIVE - - DRIVE="/dev/${DRIVE}" - - if ! lsblk "$DRIVE"; then - echo Disk "${DRIVE}" not found - exit 1 - fi - - echo "Choose EFI partition on selected disk:" - lsblk -f "${DRIVE}" - echo "Example: sda1" - read -r EFI_PART - - EFI_PART="/dev/${EFI_PART}" - - if ! lsblk -f "$EFI_PART" | grep -q -e FAT32 -e vfat; then - echo "No FAT32 partition to install" - exit 1 - fi - - # Write MBR - dd if=boot0af of="$DRIVE" bs=1 count=446 conv=notrunc || exit 1 - - umount "${EFI_PART}" - - dd if="${EFI_PART}" count=1 of=origbs - cp -v boot1f32 newbs - dd if=origbs of=newbs skip=3 seek=3 bs=1 count=87 conv=notrunc - dd if=/dev/random of=newbs skip=496 seek=496 bs=1 count=14 conv=notrunc - dd if=newbs of="${EFI_PART}" - - p=/tmp/$(uuidgen)/EFI - mkdir -p "${p}" || exit 1 - mount -t vfat "${EFI_PART}" "${p}" -o rw,noatime,uid="$(id -u)",gid="$(id -g)" || exit 1 - - cp -v "boot${ARCHS}" "${p}/boot" || exit 1 - echo "Install EFI -> /Volumes/EFI/EFI Wait. . ." - cp -Rp "EFI" "${p}" || exit 1 - - echo Check "${p}" boot drive to install Clover Duet - - DISK_SCHEME=$(fdisk -l "${DRIVE}" | sed -n 's/.*Disklabel type: *//p') - if [ "$DISK_SCHEME" != "gpt" ]; then - BOOT_FLAG=$(dd if="$DRIVE" bs=1 count=1 status=none skip=$((0x1BE)) | od -t x1 -A n | tr -d ' ') - if [ "$BOOT_FLAG" != "80" ]; then - fdisk "$DRIVE" <<END -p -a -1 -w -END - fi - fi -else - rm -rf ./origbs - rm -rf ./newbs - - diskutil list - echo "Disable SIP in the case of any problems with installation!!!" - echo "Enter disk number to install to:" - read -r N - - if ! diskutil info disk"${N}" | grep -q "/dev/disk"; then - echo Disk "$N" not found - exit 1 - fi - - if ! diskutil info disk"${N}"s1 | grep -q -e FAT_32 -e EFI; then - echo "No FAT32 partition to install" - exit 1 - fi - - # Write MBR - echo "Type your password to continue!" - sudo fdisk -uy -f boot0af /dev/rdisk"${N}" || exit 1 - echo " " - echo "Clover Duet boot$ARCHS$BO0T will be Install to ➤ EFI System Partition" - echo " " - diskutil umount disk"${N}"s1 - sudo dd if=/dev/rdisk"${N}"s1 count=1 of=origbs - cp -v boot1f32 newbs - sudo dd if=origbs of=newbs skip=3 seek=3 bs=1 count=87 conv=notrunc - dd if=/dev/random of=newbs skip=496 seek=496 bs=1 count=14 conv=notrunc - sudo dd if=newbs of=/dev/rdisk"${N}"s1 - #if [[ "$(sudo diskutil mount disk"${N}"s1)" == *"mounted" ]] - if sudo diskutil mount disk"${N}"s1 | grep -q mounted; then - cp -v "boot${ARCHS}" "$(diskutil info disk"${N}"s1 | sed -n 's/.*Mount Point: *//p')/boot" - else - p=/tmp/$(uuidgen)/EFI - mkdir -p "${p}" || exit 1 - sudo mount_msdos /dev/disk"${N}"s1 "${p}" || exit 1 - cp -v "boot${ARCHS}" "${p}/boot" || exit 1 - fi - - if diskutil info disk"${N}" | grep -q FDisk_partition_scheme; then - sudo fdisk -e /dev/rdisk"$N" <<-MAKEACTIVE -p -f 1 -w -y -q -MAKEACTIVE - fi -fi - -Sleep 1 -rm -rf ./origbs -rm -rf ./newbs -rm -rf ./boot* - -while true - do - response=$(osascript -e 'tell app "System Events" to display dialog "Clover Duet is installed! -You can install a Clover EFI folder that you created. -You can use Generic Clover EFI folder from this release.\n\nCancel to not install EFI folder." buttons {"Cancel","Generic Clover EFI","Personal EFI"} default button 3 with title "'"$apptitle"' '"$version"'" with icon POSIX file "'"$iconfile"'" ') - - action=$(echo $response | cut -d ':' -f2) - - # Exit if Canceled - if [ ! "$action" ] ; then - osascript -e 'display notification "Program closing" with title "'"$apptitle"'" subtitle "User cancelled"' - echo "User cancelled Program Clover-LegacyDuet closing in 2 sec" - Sleep 2 - exit 1 - fi - - if [ "$action" == "Generic Clover EFI" ] ; then - mv ./EFI/CLOVER/config-sample.plist ./EFI/CLOVER/config.plist - Sleep 1 - cp -Rp "EFI" "$(diskutil info disk${N}s1 | sed -n 's/.*Mount Point: *//p')" - echo "Install EFI -> /Volumes/EFI/EFI Done!" - mv ./EFI/CLOVER/config.plist ./EFI/CLOVER/config-sample.plist - Sleep 2 - Open -R "$(diskutil info disk"${N}"s1 | sed -n 's/.*Mount Point: *//p')/boot" - exit 1 - fi - - if [ "$action" == "Personal EFI" ] ; then - echo " " - #get EFI folder - if [ "$2" == "" ]; then - echo " " - echo "Move your EFI folder here" - echo "Followed by Enter: " - - while [ -z "$EFIfolder" ]; do - read EFIfolder - done - - else - EFIfolder="$2" - fi - cp -Rp "$EFIfolder" "$(diskutil info disk${N}s1 | sed -n 's/.*Mount Point: *//p')" - echo "Install EFI -> /Volumes/EFI/EFI Done!" - Sleep 2 - Open -R "$(diskutil info disk"${N}"s1 | sed -n 's/.*Mount Point: *//p')/boot" - exit 1 - fi - done diff --git a/Clover_Duet.tool b/Clover_Duet.tool deleted file mode 100755 index cc86e7636..000000000 --- a/Clover_Duet.tool +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -cd "$(dirname "$0")" || exit 1 -export DUETTOOL=Clover_Duet.command -cp -Rp $DUETTOOL ./CloverPackage/CloverV2 -./CloverPackage/CloverV2/$DUETTOOL -Sleep 1 -rm -rf ./CloverPackage/CloverV2/$DUETTOOL From 891d1741b9845b18298ea65575e9f19717d84b55 Mon Sep 17 00:00:00 2001 From: chris1111 <leblond1111@gmail.com> Date: Mon, 7 Oct 2024 19:14:53 -0400 Subject: [PATCH 6/6] clean up useless --- Xcode/ConfigValidator/ConfigValidator.sh | 49 -- .../ConfigValidator.xcodeproj/project.pbxproj | 276 ---------- .../contents.xcworkspacedata | 7 - .../ConfigValidator/ConfigValidator/.gitkeep | 1 - .../ConfigValidator/ConfigValidator.c | 504 ------------------ Xcode/ConfigValidator/CreateBuild.sh | 7 - Xcode/ConfigValidator/makefile | 28 - Xcode/ConfigValidator/shc | Bin 69192 -> 0 bytes 8 files changed, 872 deletions(-) delete mode 100755 Xcode/ConfigValidator/ConfigValidator.sh delete mode 100644 Xcode/ConfigValidator/ConfigValidator.xcodeproj/project.pbxproj delete mode 100644 Xcode/ConfigValidator/ConfigValidator.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Xcode/ConfigValidator/ConfigValidator/.gitkeep delete mode 100644 Xcode/ConfigValidator/ConfigValidator/ConfigValidator.c delete mode 100755 Xcode/ConfigValidator/CreateBuild.sh delete mode 100644 Xcode/ConfigValidator/makefile delete mode 100755 Xcode/ConfigValidator/shc diff --git a/Xcode/ConfigValidator/ConfigValidator.sh b/Xcode/ConfigValidator/ConfigValidator.sh deleted file mode 100755 index d53fe076f..000000000 --- a/Xcode/ConfigValidator/ConfigValidator.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh -#Credit: chris1111 -#Credit: Jief_Machak -#Vars -apptitle="Config Validator" -version="1.0" -sleep 1 -rm -rf /Private/tmp/CloverConfigPlistValidator.zip -#Dialog Text -read -r -d '' applescriptCode <<'EOF' - set dialogText to text returned of (display dialog " -Type the numer of the CloverConfigPlistValidator you whant to use? -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -The lowest you can start is ➢ 5143 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Type the number then click Continue" default answer "" with icon 0 buttons {"Continue"} default button "Continue") - return dialogText -EOF - -dialogText=$(osascript -e "$applescriptCode"); -echo " " -echo Your choice is CloverConfigPlistValidator $dialogText; - -echo " " -echo " -****************************************************** -Clover Config.Plist Validator -Drag config.plist file to verify it -******************************************************" -#Set Droping directory and file -rm -rf /Private/tmp/CloverConfigPlistValidator.zip -sleep 1 -rm -rf /Private/tmp/CloverConfigPlistValidator -curl -L https://github.com/CloverHackyColor/CloverBootloader/releases/download/$dialogText/CloverConfigPlistValidator_$dialogText.zip -s -o /Private/tmp/CloverConfigPlistValidator.zip -Sleep 1 -ditto -x -k --sequesterRsrc --rsrc /Private/tmp/CloverConfigPlistValidator.zip /Private/tmp -sleep 1 -rm -rf /Private/tmp/CloverConfigPlistValidator.zip -#get config path -if [ "$2" == "" ]; then -while [ -z "$config" ]; do -read config -echo "Start of verification:" -sleep 1 -done -else -config="$2" -fi -/Private/tmp/CloverConfigPlistValidator_$dialogText -v "$config" diff --git a/Xcode/ConfigValidator/ConfigValidator.xcodeproj/project.pbxproj b/Xcode/ConfigValidator/ConfigValidator.xcodeproj/project.pbxproj deleted file mode 100644 index 43f5138c3..000000000 --- a/Xcode/ConfigValidator/ConfigValidator.xcodeproj/project.pbxproj +++ /dev/null @@ -1,276 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 48; - objects = { - -/* Begin PBXBuildFile section */ - 83D6FCAC274A7F8600DF00C5 /* ConfigValidator.c in Sources */ = {isa = PBXBuildFile; fileRef = 83D6FCAB274A7F8600DF00C5 /* ConfigValidator.c */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 83D6FCA6274A7F8600DF00C5 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 83D6FCA8274A7F8600DF00C5 /* ConfigValidator */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ConfigValidator; sourceTree = BUILT_PRODUCTS_DIR; }; - 83D6FCAB274A7F8600DF00C5 /* ConfigValidator.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ConfigValidator.c; sourceTree = "<group>"; }; - 83D6FCB2274A7FBA00DF00C5 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - 83D6FCB3274A7FBF00DF00C5 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 83D6FCA5274A7F8600DF00C5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 83D6FC9F274A7F8600DF00C5 = { - isa = PBXGroup; - children = ( - 83D6FCB3274A7FBF00DF00C5 /* CoreFoundation.framework */, - 83D6FCB2274A7FBA00DF00C5 /* IOKit.framework */, - 83D6FCAA274A7F8600DF00C5 /* ConfigValidator */, - 83D6FCA9274A7F8600DF00C5 /* Products */, - ); - sourceTree = "<group>"; - }; - 83D6FCA9274A7F8600DF00C5 /* Products */ = { - isa = PBXGroup; - children = ( - 83D6FCA8274A7F8600DF00C5 /* ConfigValidator */, - ); - name = Products; - sourceTree = "<group>"; - }; - 83D6FCAA274A7F8600DF00C5 /* ConfigValidator */ = { - isa = PBXGroup; - children = ( - 83D6FCAB274A7F8600DF00C5 /* ConfigValidator.c */, - ); - path = ConfigValidator; - sourceTree = "<group>"; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 83D6FCA7274A7F8600DF00C5 /* ConfigValidator */ = { - isa = PBXNativeTarget; - buildConfigurationList = 83D6FCAF274A7F8600DF00C5 /* Build configuration list for PBXNativeTarget "ConfigValidator" */; - buildPhases = ( - 83D6FCA4274A7F8600DF00C5 /* Sources */, - 83D6FCA5274A7F8600DF00C5 /* Frameworks */, - 83D6FCA6274A7F8600DF00C5 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ConfigValidator; - productName = ConfigValidator; - productReference = 83D6FCA8274A7F8600DF00C5 /* ConfigValidator */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83D6FCA0274A7F8600DF00C5 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = chris; - TargetAttributes = { - 83D6FCA7274A7F8600DF00C5 = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 83D6FCA3274A7F8600DF00C5 /* Build configuration list for PBXProject "ConfigValidator" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 83D6FC9F274A7F8600DF00C5; - productRefGroup = 83D6FCA9274A7F8600DF00C5 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 83D6FCA7274A7F8600DF00C5 /* ConfigValidator */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 83D6FCA4274A7F8600DF00C5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 83D6FCAC274A7F8600DF00C5 /* ConfigValidator.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 83D6FCAD274A7F8600DF00C5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.12; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 83D6FCAE274A7F8600DF00C5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.12; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - }; - name = Release; - }; - 83D6FCB0274A7F8600DF00C5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 83D6FCB1274A7F8600DF00C5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 83D6FCA3274A7F8600DF00C5 /* Build configuration list for PBXProject "ConfigValidator" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83D6FCAD274A7F8600DF00C5 /* Debug */, - 83D6FCAE274A7F8600DF00C5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83D6FCAF274A7F8600DF00C5 /* Build configuration list for PBXNativeTarget "ConfigValidator" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83D6FCB0274A7F8600DF00C5 /* Debug */, - 83D6FCB1274A7F8600DF00C5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83D6FCA0274A7F8600DF00C5 /* Project object */; -} diff --git a/Xcode/ConfigValidator/ConfigValidator.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Xcode/ConfigValidator/ConfigValidator.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index d1803040a..000000000 --- a/Xcode/ConfigValidator/ConfigValidator.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Workspace - version = "1.0"> - <FileRef - location = "self:ConfigValidator.xcodeproj"> - </FileRef> -</Workspace> diff --git a/Xcode/ConfigValidator/ConfigValidator/.gitkeep b/Xcode/ConfigValidator/ConfigValidator/.gitkeep deleted file mode 100644 index 8b1378917..000000000 --- a/Xcode/ConfigValidator/ConfigValidator/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Xcode/ConfigValidator/ConfigValidator/ConfigValidator.c b/Xcode/ConfigValidator/ConfigValidator/ConfigValidator.c deleted file mode 100644 index 8d53a50d5..000000000 --- a/Xcode/ConfigValidator/ConfigValidator/ConfigValidator.c +++ /dev/null @@ -1,504 +0,0 @@ -#if 0 - shc Version 3.8.9b, Generic Script Compiler - Copyright (c) 1994-2015 Francisco Rosales <frosal@fi.upm.es> - - ./shc -v -r -T -f ./ConfigValidator.sh -#endif - -static char data [] = -#define msg1_z 42 -#define msg1 ((&data[6])) - "\233\150\044\313\040\005\310\215\377\044\043\272\360\062\203\301" - "\267\327\203\242\173\355\003\065\230\317\341\013\160\222\025\257" - "\174\041\006\331\151\070\053\007\161\263\250\222\134\220\123\167" - "\132" -#define chk1_z 22 -#define chk1 ((&data[51])) - "\036\002\301\354\114\036\262\160\323\316\126\322\103\333\125\146" - "\245\002\206\002\302\177\220\025\340\262\075\021" -#define msg2_z 19 -#define msg2 ((&data[77])) - "\322\362\137\041\163\034\331\056\026\024\206\006\040\313\175\267" - "\067\213\234\312" -#define xecc_z 15 -#define xecc ((&data[99])) - "\152\276\165\352\335\200\050\306\016\010\342\317\342\326\250\255" - "\175" -#define chk2_z 19 -#define chk2 ((&data[118])) - "\041\003\140\147\350\325\334\344\324\351\240\333\135\077\321\230" - "\013\116\211\034\222\145\003\375\162\133" -#define text_z 1633 -#define text ((&data[468])) - "\332\223\133\117\353\157\261\253\233\243\035\167\326\172\152\035" - "\101\260\305\012\170\154\302\114\065\020\023\076\356\070\072\277" - "\152\331\254\253\373\123\144\076\067\200\154\336\363\223\106\042" - "\141\214\277\011\064\125\324\043\034\240\310\130\375\366\242\112" - "\177\362\352\073\002\312\163\254\025\316\167\210\017\137\306\143" - "\267\003\017\235\073\240\047\334\161\136\257\341\265\327\212\252" - "\332\025\210\104\346\176\362\206\321\365\026\227\050\070\176\033" - "\142\160\050\162\353\141\370\353\364\265\215\351\022\022\035\264" - "\227\212\263\256\215\312\147\114\301\131\025\365\000\267\337\233" - "\365\035\073\016\302\355\032\140\002\246\212\212\166\220\166\143" - "\301\153\074\347\370\320\007\221\031\220\107\206\307\117\322\244" - "\214\171\221\302\113\374\176\363\017\073\037\275\013\243\357\377" - "\312\337\255\361\206\105\235\012\060\044\176\106\243\055\273\044" - "\254\120\100\001\253\117\043\105\324\234\155\153\167\307\001\326" - "\370\115\336\172\005\153\122\056\335\075\110\336\054\101\265\342" - "\057\107\146\320\172\366\156\201\036\360\226\335\343\220\237\377" - "\161\217\342\117\031\060\343\325\204\317\326\311\114\370\210\206" - "\115\236\203\363\065\174\164\160\210\044\021\167\330\004\340\342" - "\016\245\055\264\025\050\070\300\247\154\264\263\032\257\322\125" - "\062\020\331\224\257\040\201\324\021\354\052\217\205\244\045\263" - "\175\165\341\154\246\304\124\070\113\022\327\355\200\173\222\207" - "\201\066\360\011\364\057\376\366\340\301\275\355\236\320\003\036" - "\375\263\160\163\034\043\307\277\177\371\161\166\050\177\334\311" - "\241\012\041\321\317\211\272\330\040\351\214\311\341\000\352\235" - "\353\350\003\074\126\031\377\227\145\064\301\266\335\002\112\011" - "\046\053\005\145\124\301\315\242\021\153\355\314\011\342\221\304" - "\121\336\326\162\376\247\070\147\124\157\211\063\010\301\350\205" - "\130\337\141\073\203\011\345\243\227\166\162\302\201\164\331\064" - "\121\006\006\326\362\300\022\051\317\164\132\046\057\221\040\225" - "\255\376\254\341\066\053\105\211\034\146\206\201\134\272\064\252" - "\264\036\147\274\354\262\277\132\373\303\211\352\266\377\250\324" - "\006\126\167\076\252\067\307\025\025\231\020\132\340\336\360\107" - "\214\155\047\014\315\170\120\235\175\233\372\170\351\173\272\335" - "\006\106\102\303\247\255\070\153\153\302\054\037\221\061\277\076" - "\153\021\033\002\003\232\345\326\160\341\200\343\356\054\260\237" - "\337\234\112\160\374\105\126\071\314\110\036\014\241\025\365\106" - "\072\130\333\135\157\302\127\043\207\000\034\104\240\012\205\054" - "\041\054\271\221\166\210\011\066\052\324\134\141\236\240\007\244" - "\035\143\211\247\001\215\173\363\332\153\235\255\046\045\255\140" - "\351\257\205\147\262\232\077\022\070\010\075\233\017\313\241\155" - "\360\113\143\225\356\356\243\260\015\077\206\256\273\347\260\242" - "\105\114\231\213\366\117\310\326\035\055\146\334\127\312\151\132" - "\042\362\057\153\223\064\311\054\237\331\030\346\267\123\001\227" - "\147\262\136\073\216\042\360\310\253\157\144\214\050\375\012\056" - "\264\253\006\231\052\321\215\273\250\127\151\047\166\005\076\005" - "\122\061\113\017\073\346\276\164\333\221\067\310\321\177\162\216" - "\057\107\064\013\141\217\056\044\304\072\140\077\366\253\125\003" - "\055\165\046\311\226\272\107\011\040\145\241\202\005\174\146\210" - "\044\213\157\350\324\356\215\142\244\244\133\302\024\027\332\075" - "\314\017\153\122\142\261\303\300\136\021\270\314\326\370\235\226" - "\320\167\042\012\171\255\271\234\331\147\327\140\367\123\242\102" - "\260\204\120\165\213\056\064\335\336\075\367\212\216\005\316\223" - "\272\267\212\127\020\034\053\267\102\234\175\177\113\134\112\246" - "\067\212\006\024\323\056\172\370\206\072\205\361\030\150\247\212" - "\345\022\255\306\170\233\016\002\230\273\121\347\032\131\005\166" - "\054\165\210\170\110\046\024\046\000\053\352\077\020\140\062\014" - "\276\172\251\375\134\357\257\206\040\366\226\334\235\212\167\135" - "\062\377\252\067\264\204\126\163\223\243\247\340\031\211\350\154" - "\032\074\275\122\375\035\276\366\177\104\135\254\037\134\374\372" - "\375\001\122\131\342\226\023\147\155\200\231\317\203\067\343\226" - "\310\321\022\277\240\362\242\360\364\017\056\111\110\032\235\234" - "\364\216\115\357\027\215\343\145\152\322\330\140\304\337\042\262" - "\324\147\155\270\110\000\167\372\246\050\205\231\067\161\222\337" - "\220\347\256\343\064\137\150\325\267\375\146\020\053\021\120\171" - "\327\011\363\221\362\266\345\373\200\265\207\200\167\200\245\021" - "\264\311\333\253\022\155\363\231\303\300\066\244\024\111\264\024" - "\101\245\311\043\115\242\031\347\257\241\014\051\100\326\323\135" - "\151\316\024\037\206\023\020\125\036\363\021\214\350\214\357\106" - "\255\277\122\057\162\144\146\047\061\160\337\105\040\121\133\001" - "\323\102\034\164\305\053\113\110\252\176\072\272\220\313\156\321" - "\213\116\022\273\176\212\130\366\113\320\116\010\004\011\023\024" - "\037\222\240\174\375\301\067\364\025\270\015\232\353\037\014\354" - "\263\134\055\001\120\060\131\130\232\204\343\337\055\326\147\131" - "\273\231\154\153\314\376\344\211\263\215\177\310\371\246\225\011" - "\215\001\221\342\112\220\026\027\355\114\205\374\226\211\064\126" - "\041\134\321\353\276\107\170\231\000\145\372\010\146\346\261\310" - "\244\327\352\253\221\363\261\331\341\100\135\204\163\237\300\375" - "\037\000\126\246\035\200\034\040\263\216\213\210\205\065\064\316" - "\035\251\344\013\176\044\322\353\225\266\304\055\104\131\213\162" - "\177\023\112\251\250\077\303\271\156\027\012\145\075\120\005\162" - "\273\325\106\313\354\370\231\262\132\041\302\060\106\211\153\061" - "\036\346\006\250\063\006\174\050\210\050\304\301\242\274\055\121" - "\376\176\055\325\155\365\200\000\146\352\107\135\150\332\330\220" - "\216\127\277\230\310\161\145\030\300\327\107\242\026\267\102\241" - "\302\353\035\252\134\125\261\120\354\132\373\162\063\177\257\361" - "\170\353\214\314\212\272\275\174\110\214\033\372\106\107\172\205" - "\061\351\377\077\144\360\165\200\050\051\254\101\173\354\233\104" - "\361\143\352\030\340\341\006\360\370\206\124\166\215\107\231\346" - "\027\330\137\233\311\301\005\366\021\342\350\235\127\334\116\275" - "\031\220\156\301\244\030\304\217\207\256\036\136\333\362\175\345" - "\047\017\065\256\213\132\101\143\216\376\353\074\372\362\222\217" - "\115\344\226\042\044\177\326\122\144\317\015\300\226\236\261\346" - "\045\132\065\355\250\120\161\031\120\032\001\217\056\237\151\360" - "\177\131\276\114\252\162\201\001\114\003\355\352\303\244\177\151" - "\137\014\021\312\165\003\065\316\351\345\232\167\017\235\170\037" - "\100\122\371\034\205\150\327\217\333\247\001\044\146\305\347\324" - "\100\072\147\065\367\246\007\017\031\337\177\016\215\022\134\005" - "\253\315\124\146\170\236\335\326\041\157\240\204\001\251\115\353" - "\306\046\176\370\044\106\314\127\046\327\033\020\131\300\312\207" - "\076\151\336\226\251\276\341\177\361\224\210\170\124\341\156\022" - "\257\370\242\132\340\212\167\033\312\013\037\224\004\051\156\157" - "\043\035\101\215\361\107\036\362\331\247\037\250\207\127\124\226" - "\253\136\045\331\054\043\226\310\133\312\002\066\116\112\366\151" - "\322\213\226\364\150\312\053\276\230\003\143\150\273\366\225\012" - "\117\354\031\341\347\211\203\050\103\066\262\373\257\165\263\034" - "\256\324\267\252\137\310\365\155\125\177\265\106\037\301\135\344" - "\203\064\235\200\351\204\352\151\041\165\302\046\111\110\305\314" - "\220\325\353\001\203\356\322\146\032\005\143\361\134\061\007\173" - "\055\066\277\053\000\054\077\315\332\076\343\375\003\074\260\253" - "\176\055\331\350\117\240\321\113\303\054\026\240\103\276\055\350" - "\024\040\345\076\074\261\332\221\060\225\312\344\150\032\051\334" - "\066\075\005\330\020\150\304\114\264\062\114\077\061\043\264\254" - "\054\334\226\237\305\326\165\265\016\004\274\037\070\014\377\336" - "\355\242\123\323\226\336\142\077\271\256\044\254\237\273\035\115" - "\257\371\225\233\103\336\371\353\044\030\150\372\343\000\112\266" - "\047\112\334\365\034\275\133\100\225\032\221\101\133\315\106\251" - "\334\231\134\236\327\376\372\271\042\350\263\006\322\305\252\133" - "\352\027\130\236\153\257\057\141\325\215\324\113\347\027\177\103" - "\327\330\036\276\122\265\044\200\025\025\223\275\253\010\276\301" - "\331\264\062\310\062\126\070\154\150\146\210\343\207\204\124\130" - "\343\226\032\123\301\126\366\275\033\306\323\072\051\143\251\024" - "\272\321\032\164\143\242\024\067\126\063\132\340\133\332\076\052" - "\275\170\224\175\152\122\246\266\161\151\013\020\004\170\273\245" - "\151\021\153\306\204\006\311\374\247\035\162\260\076\005\270\122" - "\053\236\304\250\162\025\105\361\027\341\223\155\330\017\377\055" - "\236\361\000\354\017\077\274\105\217\371\251\225\230\113\011\317" - "\065\237\010\176\137\004\133\035\001\223\277\065\010\117\253\334" - "\234\342\340\342\326\020\310\304\102\132\020\144\313\352\022\250" - "\306\241\144\362\167\126\174\361\330\245\111\332\003\030\175\044" - "\023\311\221\201\363\233\166\373\172\253\165\047\003\141\120\304" - "\211\361\207\103\243\367\143\203\156" -#define tst1_z 22 -#define tst1 ((&data[2230])) - "\014\205\023\224\235\247\111\054\223\114\047\203\345\017\017\165" - "\056\117\361\057\223\267\263\257" -#define lsto_z 1 -#define lsto ((&data[2253])) - "\001" -#define pswd_z 256 -#define pswd ((&data[2274])) - "\347\010\271\264\150\206\136\015\366\114\323\264\020\217\331\124" - "\100\253\020\335\153\115\253\134\027\054\010\254\246\146\371\045" - "\030\377\005\205\343\252\376\352\056\335\171\171\025\252\046\026" - "\205\177\074\370\323\213\032\334\135\314\026\022\062\333\245\213" - "\055\145\341\150\216\152\301\004\100\331\001\160\216\043\041\076" - "\362\060\211\036\245\026\152\301\212\054\172\342\006\313\010\107" - "\226\140\112\312\000\063\152\323\014\350\120\202\354\045\135\356" - "\344\054\167\014\054\367\355\306\317\052\233\271\175\314\327\336" - "\213\062\057\124\035\032\241\023\022\172\016\133\014\320\016\064" - "\346\026\323\274\066\122\040\364\047\347\141\147\200\215\052\301" - "\262\104\202\331\374\154\315\166\170\017\114\124\252\340\010\307" - "\034\117\146\363\300\234\232\005\151\143\152\326\023\371\012\247" - "\341\005\334\242\154\137\226\312\202\337\011\017\347\315\134\344" - "\060\314\152\301\161\345\217\164\255\161\334\153\220\123\305\067" - "\244\064\006\152\210\226\320\307\201\060\323\205\146\324\344\163" - "\043\150\135\352\142\170\346\025\110\323\063\221\266\315\032\271" - "\152\365\213\252\265\317\066\266\273\017\232\313\167\207\317\110" - "\135\161\337\036\132\001\221\065\066\326\236\255\061\322\156\101" - "\325\126\266\345\127\233\135\263\146\126\322\026\306\075\116\005" - "\173\367\013\073\076\260\014\315\046\170\371\265\155\167\215\321" - "\202\061\304\224\223\174\236\344\220\057\046\273\140\007\077\353" - "\203\140\355\073" -#define shll_z 8 -#define shll ((&data[2595])) - "\353\337\372\041\022\264\303\351\006" -#define date_z 1 -#define date ((&data[2603])) - "\332" -#define opts_z 1 -#define opts ((&data[2604])) - "\371" -#define rlax_z 1 -#define rlax ((&data[2605])) - "\222" -#define inlo_z 3 -#define inlo ((&data[2606])) - "\037\174\041" -#define tst2_z 19 -#define tst2 ((&data[2609])) - "\030\170\107\235\170\073\371\345\000\376\025\161\056\245\327\250" - "\340\122\041\153\054\353\204"/* End of data[] */; -#define hide_z 4096 -#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */ -#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */ - -/* rtc.c */ - -#include <sys/stat.h> -#include <sys/types.h> - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <unistd.h> - -/* 'Alleged RC4' */ - -static unsigned char stte[256], indx, jndx, kndx; - -/* - * Reset arc4 stte. - */ -void stte_0(void) -{ - indx = jndx = kndx = 0; - do { - stte[indx] = indx; - } while (++indx); -} - -/* - * Set key. Can be used more than once. - */ -void key(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - do { - tmp = stte[indx]; - kndx += tmp; - kndx += ptr[(int)indx % len]; - stte[indx] = stte[kndx]; - stte[kndx] = tmp; - } while (++indx); - ptr += 256; - len -= 256; - } -} - -/* - * Crypt data. - */ -void arc4(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } -} - -/* End of ARC4 */ - -/* - * Key with file invariants. - */ -int key_with_file(char * file) -{ - struct stat statf[1]; - struct stat control[1]; - - if (stat(file, statf) < 0) - return -1; - - /* Turn on stable fields */ - memset(control, 0, sizeof(control)); - control->st_ino = statf->st_ino; - control->st_dev = statf->st_dev; - control->st_rdev = statf->st_rdev; - control->st_uid = statf->st_uid; - control->st_gid = statf->st_gid; - control->st_size = statf->st_size; - control->st_mtime = statf->st_mtime; - control->st_ctime = statf->st_ctime; - key(control, sizeof(control)); - return 0; -} - -#if DEBUGEXEC -void debugexec(char * sh11, int argc, char ** argv) -{ - int i; - fprintf(stderr, "shll=%s\n", sh11 ? sh11 : "<null>"); - fprintf(stderr, "argc=%d\n", argc); - if (!argv) { - fprintf(stderr, "argv=<null>\n"); - } else { - for (i = 0; i <= argc ; i++) - fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : "<null>"); - } -} -#endif /* DEBUGEXEC */ - -void rmarg(char ** argv, char * arg) -{ - for (; argv && *argv && *argv != arg; argv++); - for (; argv && *argv; argv++) - *argv = argv[1]; -} - -int chkenv(int argc) -{ - char buff[512]; - unsigned long mask, m; - int l, a, c; - char * string; - extern char ** environ; - - mask = (unsigned long)&chkenv; - mask ^= (unsigned long)getpid() * ~mask; - sprintf(buff, "x%lx", mask); - string = getenv(buff); -#if DEBUGEXEC - fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : "<null>"); -#endif - l = strlen(buff); - if (!string) { - /* 1st */ - sprintf(&buff[l], "=%lu %d", mask, argc); - putenv(strdup(buff)); - return 0; - } - c = sscanf(string, "%lu %d%c", &m, &a, buff); - if (c == 2 && m == mask) { - /* 3rd */ - rmarg(environ, &string[-l - 1]); - return 1 + (argc - a); - } - return -1; -} - -#if !TRACEABLE - -#define _LINUX_SOURCE_COMPAT -#include <sys/ptrace.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <fcntl.h> -#include <signal.h> -#include <stdio.h> -#include <unistd.h> - -#if !defined(PTRACE_ATTACH) && defined(PT_ATTACH) -# define PTRACE_ATTACH PT_ATTACH -#endif -void untraceable(char * argv0) -{ - char proc[80]; - int pid, mine; - - switch(pid = fork()) { - case 0: - pid = getppid(); - /* For problematic SunOS ptrace */ -#if defined(__FreeBSD__) - sprintf(proc, "/proc/%d/mem", (int)pid); -#else - sprintf(proc, "/proc/%d/as", (int)pid); -#endif - close(0); - mine = !open(proc, O_RDWR|O_EXCL); - if (!mine && errno != EBUSY) - mine = !ptrace(PTRACE_ATTACH, pid, 0, 0); - if (mine) { - kill(pid, SIGCONT); - } else { - perror(argv0); - kill(pid, SIGKILL); - } - _exit(mine); - case -1: - break; - default: - if (pid == waitpid(pid, 0, 0)) - return; - } - perror(argv0); - _exit(1); -} -#endif /* !TRACEABLE */ - -char * xsh(int argc, char ** argv) -{ - char * scrpt; - int ret, i, j; - char ** varg; - char * me = argv[0]; - - stte_0(); - key(pswd, pswd_z); - arc4(msg1, msg1_z); - arc4(date, date_z); - if (date[0] && (atoll(date)<time(NULL))) - return msg1; - arc4(shll, shll_z); - arc4(inlo, inlo_z); - arc4(xecc, xecc_z); - arc4(lsto, lsto_z); - arc4(tst1, tst1_z); - key(tst1, tst1_z); - arc4(chk1, chk1_z); - if ((chk1_z != tst1_z) || memcmp(tst1, chk1, tst1_z)) - return tst1; - ret = chkenv(argc); - arc4(msg2, msg2_z); - if (ret < 0) - return msg2; - varg = (char **)calloc(argc + 10, sizeof(char *)); - if (!varg) - return 0; - if (ret) { - arc4(rlax, rlax_z); - if (!rlax[0] && key_with_file(shll)) - return shll; - arc4(opts, opts_z); - arc4(text, text_z); - arc4(tst2, tst2_z); - key(tst2, tst2_z); - arc4(chk2, chk2_z); - if ((chk2_z != tst2_z) || memcmp(tst2, chk2, tst2_z)) - return tst2; - /* Prepend hide_z spaces to script text to hide it. */ - scrpt = malloc(hide_z + text_z); - if (!scrpt) - return 0; - memset(scrpt, (int) ' ', hide_z); - memcpy(&scrpt[hide_z], text, text_z); - } else { /* Reexecute */ - if (*xecc) { - scrpt = malloc(512); - if (!scrpt) - return 0; - sprintf(scrpt, xecc, me); - } else { - scrpt = me; - } - } - j = 0; - varg[j++] = argv[0]; /* My own name at execution */ - if (ret && *opts) - varg[j++] = opts; /* Options on 1st line of code */ - if (*inlo) - varg[j++] = inlo; /* Option introducing inline code */ - varg[j++] = scrpt; /* The script itself */ - if (*lsto) - varg[j++] = lsto; /* Option meaning last option */ - i = (ret > 1) ? ret : 0; /* Args numbering correction */ - while (i < argc) - varg[j++] = argv[i++]; /* Main run-time arguments */ - varg[j] = 0; /* NULL terminated array */ -#if DEBUGEXEC - debugexec(shll, j, varg); -#endif - execvp(shll, varg); - return shll; -} - -int main(int argc, char ** argv) -{ -#if DEBUGEXEC - debugexec("main", argc, argv); -#endif -#if !TRACEABLE - untraceable(argv[0]); -#endif - argv[1] = xsh(argc, argv); - fprintf(stderr, "%s%s%s: %s\n", argv[0], - errno ? ": " : "", - errno ? strerror(errno) : "", - argv[1] ? argv[1] : "<null>" - ); - return 1; -} diff --git a/Xcode/ConfigValidator/CreateBuild.sh b/Xcode/ConfigValidator/CreateBuild.sh deleted file mode 100755 index 91610cb52..000000000 --- a/Xcode/ConfigValidator/CreateBuild.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -./shc -v -r -T -f ./ConfigValidator.sh -Sleep 1 -rm -rf ./ConfigValidator/ConfigValidator.c -cp -rp ./ConfigValidator.sh.x.c ./ConfigValidator/ConfigValidator.c -rm -rf ./ConfigValidator.sh.x -rm -rf ./ConfigValidator.sh.x.c diff --git a/Xcode/ConfigValidator/makefile b/Xcode/ConfigValidator/makefile deleted file mode 100644 index 8241956b1..000000000 --- a/Xcode/ConfigValidator/makefile +++ /dev/null @@ -1,28 +0,0 @@ - -XCODE_VERSION_GE_4 := $(shell expr `xcodebuild -version | sed -nE 's/^Xcode ([0-9]+).*/\1/p'` \>= 4) -XCODE_VERSION_GE_10 := $(shell expr `xcodebuild -version | sed -nE 's/^Xcode ([0-9]+).*/\1/p'` \>= 10) - -XCODEBUILD_OPTIONS=-project 'ConfigValidator.xcodeproj' CONFIGURATION_BUILD_DIR=$(CURDIR)/build DEPLOYMENT_LOCATION=NO - -ifeq "$(XCODE_VERSION_GE_10)" "1" - XCODEBUILD_OPTIONS += ARCHS=x86_64 VALID_ARCHS=x86_64 ONLY_ACTIVE_ARCH=YES -endif - -ifeq "$(XCODE_VERSION_GE_4)" "1" - XCODEBUILD_OPTIONS += -scheme 'ConfigValidator' -# BUILD_ACTION=running -else - XCODEBUILD_OPTIONS += -configuration 'Release' -endif - -ConfigValidator: - @echo "Building ConfigValidator..." - @echo "ConfigValidator uses release of User choice" - @$/chmod 755 CreateBuild.sh - @$/chmod 755 ConfigValidator.sh - @$/chmod 755 shc - @$(CURDIR)/CreateBuild.sh - @/usr/bin/xcodebuild $(XCODEBUILD_OPTIONS) $(BUILD_ACTION) >/dev/null - @echo [XCODE] $(PROGRAMS) - -.PHONY: ConfigValidator clean diff --git a/Xcode/ConfigValidator/shc b/Xcode/ConfigValidator/shc deleted file mode 100755 index 9defa57c98cb528841634aec2b75749f1b86208d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69192 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