Better name for Preboot.

Ordering of Preboot Main Recovery
This commit is contained in:
jief666 2020-10-22 16:55:30 +03:00
parent bef59ccfa2
commit 6a96d48330
18 changed files with 403 additions and 186 deletions

View File

@ -39,8 +39,12 @@ extern EFI_GUID gAppleApfsContainerInfoGuid;
{ 0xB4, 0x4E, 0x97, 0x45, 0x15, 0xD2, 0x7C, 0x78 } } { 0xB4, 0x4E, 0x97, 0x45, 0x15, 0xD2, 0x7C, 0x78 } }
#define APPLE_APFS_VOLUME_ROLE_RECOVERY BIT2 #define APPLE_APFS_VOLUME_ROLE_RECOVERY BIT2 // 0x04
#define APPLE_APFS_VOLUME_ROLE_PREBOOT BIT4 #define APPLE_APFS_VOLUME_ROLE_PREBOOT BIT4 // 0x10
#define APPLE_APFS_VOLUME_ROLE_DATA BIT6 // 0x40
#define APPLE_APFS_VOLUME_ROLE_VM BIT3 // 0x08
#define APPLE_APFS_VOLUME_ROLE_SYSTEM BIT0 // 0x01 Main partition. Joint with DATA.
//#define APPLE_APFS_VOLUME_ROLE_UPDATE 0xC0 // I got 0xC0, maybe the meaning is DATA + UPDATE ?
typedef UINT32 APPLE_APFS_VOLUME_ROLE; typedef UINT32 APPLE_APFS_VOLUME_ROLE;

@ -1 +1 @@
Subproject commit b2824181efe897583c7c6d7b817e6707842eb564 Subproject commit 39fb43413e5d3377de65bd0355a11b790edada4f

View File

@ -187,6 +187,7 @@
9A670D2224E53FD500B5D780 /* XBuffer_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A670D2024E53FD400B5D780 /* XBuffer_tests.cpp */; }; 9A670D2224E53FD500B5D780 /* XBuffer_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A670D2024E53FD400B5D780 /* XBuffer_tests.cpp */; };
9A670D2324E53FD500B5D780 /* XBuffer_tests.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A670D2124E53FD500B5D780 /* XBuffer_tests.h */; }; 9A670D2324E53FD500B5D780 /* XBuffer_tests.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A670D2124E53FD500B5D780 /* XBuffer_tests.h */; };
9A7AEDE7245963BF003AAD04 /* XToolsCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A7AEDE6245963BF003AAD04 /* XToolsCommon.h */; }; 9A7AEDE7245963BF003AAD04 /* XToolsCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A7AEDE6245963BF003AAD04 /* XToolsCommon.h */; };
9A80B49F2540175E00E56B08 /* OC.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A80B49E2540175D00E56B08 /* OC.h */; };
9A9AEB94243F7B5600FBD7D8 /* unicode_conversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9AEB90243F7B5600FBD7D8 /* unicode_conversions.cpp */; }; 9A9AEB94243F7B5600FBD7D8 /* unicode_conversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9AEB90243F7B5600FBD7D8 /* unicode_conversions.cpp */; };
9A9AEB97243F7B5600FBD7D8 /* unicode_conversions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A9AEB93243F7B5600FBD7D8 /* unicode_conversions.h */; }; 9A9AEB97243F7B5600FBD7D8 /* unicode_conversions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A9AEB93243F7B5600FBD7D8 /* unicode_conversions.h */; };
9A9AEB99243F7B7A00FBD7D8 /* printf_lite-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A9AEB98243F7B7900FBD7D8 /* printf_lite-test.h */; }; 9A9AEB99243F7B7A00FBD7D8 /* printf_lite-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A9AEB98243F7B7900FBD7D8 /* printf_lite-test.h */; };
@ -787,6 +788,7 @@
9A670D2024E53FD400B5D780 /* XBuffer_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XBuffer_tests.cpp; sourceTree = "<group>"; }; 9A670D2024E53FD400B5D780 /* XBuffer_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XBuffer_tests.cpp; sourceTree = "<group>"; };
9A670D2124E53FD500B5D780 /* XBuffer_tests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBuffer_tests.h; sourceTree = "<group>"; }; 9A670D2124E53FD500B5D780 /* XBuffer_tests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBuffer_tests.h; sourceTree = "<group>"; };
9A7AEDE6245963BF003AAD04 /* XToolsCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XToolsCommon.h; sourceTree = "<group>"; }; 9A7AEDE6245963BF003AAD04 /* XToolsCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XToolsCommon.h; sourceTree = "<group>"; };
9A80B49E2540175D00E56B08 /* OC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OC.h; sourceTree = "<group>"; };
9A9AEB90243F7B5600FBD7D8 /* unicode_conversions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unicode_conversions.cpp; sourceTree = "<group>"; }; 9A9AEB90243F7B5600FBD7D8 /* unicode_conversions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unicode_conversions.cpp; sourceTree = "<group>"; };
9A9AEB93243F7B5600FBD7D8 /* unicode_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unicode_conversions.h; sourceTree = "<group>"; }; 9A9AEB93243F7B5600FBD7D8 /* unicode_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unicode_conversions.h; sourceTree = "<group>"; };
9A9AEB98243F7B7900FBD7D8 /* printf_lite-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "printf_lite-test.h"; sourceTree = "<group>"; }; 9A9AEB98243F7B7900FBD7D8 /* printf_lite-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "printf_lite-test.h"; sourceTree = "<group>"; };
@ -1135,6 +1137,7 @@
9AC77F1324176C04005CDD5C /* include */ = { 9AC77F1324176C04005CDD5C /* include */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
9A80B49E2540175D00E56B08 /* OC.h */,
9AD469542452B63300D6D0DB /* XToolsConf.h */, 9AD469542452B63300D6D0DB /* XToolsConf.h */,
9AD4694D2452B5A600D6D0DB /* Devices.h */, 9AD4694D2452B5A600D6D0DB /* Devices.h */,
9AD4694C2452B5A600D6D0DB /* Efi.h */, 9AD4694C2452B5A600D6D0DB /* Efi.h */,
@ -1529,6 +1532,7 @@
9AD469552452B63300D6D0DB /* XToolsConf.h in Headers */, 9AD469552452B63300D6D0DB /* XToolsConf.h in Headers */,
9AD469512452B5A600D6D0DB /* Devices.h in Headers */, 9AD469512452B5A600D6D0DB /* Devices.h in Headers */,
9A28CC98241AB34800F3D247 /* XString_test.h in Headers */, 9A28CC98241AB34800F3D247 /* XString_test.h in Headers */,
9A80B49F2540175E00E56B08 /* OC.h in Headers */,
9A61B3012522165100AEE0FA /* Self.h in Headers */, 9A61B3012522165100AEE0FA /* Self.h in Headers */,
9AC7807424176C04005CDD5C /* REFIT_MENU_SCREEN.h in Headers */, 9AC7807424176C04005CDD5C /* REFIT_MENU_SCREEN.h in Headers */,
9A105B7C24483AE40006DE06 /* StartupSound.h in Headers */, 9A105B7C24483AE40006DE06 /* StartupSound.h in Headers */,

View File

@ -81,7 +81,7 @@ static EFI_FILE_PROTOCOL* gLogFile = NULL;
// Just instanciante this, the destructor will restore the callback. // Just instanciante this, the destructor will restore the callback.
class SuspendMemLogCallback class SuspendMemLogCallback
{ {
MEM_LOG_CALLBACK memlogCallBack_saved; MEM_LOG_CALLBACK memlogCallBack_saved = NULL;
public: public:
SuspendMemLogCallback() { SuspendMemLogCallback() {
memlogCallBack_saved = GetMemLogCallback(); memlogCallBack_saved = GetMemLogCallback();

View File

@ -29,8 +29,6 @@
#define CREATE_NEW_BOOT_IMAGE 1 #define CREATE_NEW_BOOT_IMAGE 1
extern XObjArray<REFIT_VOLUME> Volumes;
#pragma pack(push, 1) #pragma pack(push, 1)
// //

View File

@ -29,8 +29,6 @@ Copyright (c) 2006 JLA
#define DBG(...) DebugLog(0, __VA_ARGS__) // until a better solution is found, force DebugLog(0, ...) to prevent saving to DebugLog, which may cause legacy boot to fail #define DBG(...) DebugLog(0, __VA_ARGS__) // until a better solution is found, force DebugLog(0, ...) to prevent saving to DebugLog, which may cause legacy boot to fail
#endif #endif
extern XObjArray<REFIT_VOLUME> Volumes;
#pragma pack(push) #pragma pack(push)
#pragma pack(1) #pragma pack(1)

View File

@ -23,8 +23,6 @@
#define DBG(...) DebugLog (DEBUG_SET, __VA_ARGS__) #define DBG(...) DebugLog (DEBUG_SET, __VA_ARGS__)
#endif #endif
extern XObjArray<REFIT_VOLUME> Volumes;
// for saving nvram.plist and it's data // for saving nvram.plist and it's data
TagDict* gNvramDict; TagDict* gNvramDict;

View File

@ -27,6 +27,7 @@ static void panic_(const char* format, VA_LIST va)
#ifdef CLOVER_BUILD #ifdef CLOVER_BUILD
extern void egSetGraphicsModeEnabled(BOOLEAN); extern void egSetGraphicsModeEnabled(BOOLEAN);
extern const LString8 gBuildId;
#endif #endif
#define FATAL_ERROR_MSG "\nA fatal error happened. System halted.\n" #define FATAL_ERROR_MSG "\nA fatal error happened. System halted.\n"
@ -35,6 +36,7 @@ static void panic_(const char* format, VA_LIST va)
#ifdef CLOVER_BUILD #ifdef CLOVER_BUILD
egSetGraphicsModeEnabled(false); egSetGraphicsModeEnabled(false);
#endif #endif
printf("Clover build id: %s\n", gBuildId.c_str());
if ( format ) { if ( format ) {
vprintf(format, va); vprintf(format, va);
#ifdef DEBUG_ON_SERIAL_PORT #ifdef DEBUG_ON_SERIAL_PORT

View File

@ -135,7 +135,7 @@ EFI_STATUS SelfOem::_initialize()
if ( m_KextsDir != NULL ) panic("%s : m_KextsDir != NULL", __FUNCTION__); if ( m_KextsDir != NULL ) panic("%s : Kexts dir != NULL.", __FUNCTION__);
if ( oemDirExists() ) { if ( oemDirExists() ) {
Status = m_OemDir->Open(m_OemDir, &m_KextsDir, KEXTS_DIRNAME.wc_str(), EFI_FILE_MODE_READ, 0); Status = m_OemDir->Open(m_OemDir, &m_KextsDir, KEXTS_DIRNAME.wc_str(), EFI_FILE_MODE_READ, 0);
if ( !EFI_ERROR(Status) ) { if ( !EFI_ERROR(Status) ) {
@ -192,6 +192,8 @@ EFI_STATUS SelfOem::initialize(const XString8& confName, bool isFirmwareClover,
EFI_STATUS SelfOem::reInitialize() EFI_STATUS SelfOem::reInitialize()
{ {
if ( m_ConfName.isEmpty() ) panic("%s : initialize() must called once first", __FUNCTION__);
closeHandle(); closeHandle();
// No need to call _setOemPathRelToSelfDir again, but need to open m_OemDir, if it exists // No need to call _setOemPathRelToSelfDir again, but need to open m_OemDir, if it exists

View File

@ -45,7 +45,6 @@ extern REFIT_MENU_ITEM_SHUTDOWN MenuEntryShutdown;
//extern REFIT_MENU_ENTRY MenuEntryExit; //extern REFIT_MENU_ENTRY MenuEntryExit;
extern REFIT_MENU_SCREEN MainMenu; extern REFIT_MENU_SCREEN MainMenu;
extern XObjArray<REFIT_VOLUME> Volumes;
// common // common
const XIcon& ScanVolumeDefaultIcon(REFIT_VOLUME *Volume, IN UINT8 OSType, const EFI_DEVICE_PATH_PROTOCOL *DevicePath); const XIcon& ScanVolumeDefaultIcon(REFIT_VOLUME *Volume, IN UINT8 OSType, const EFI_DEVICE_PATH_PROTOCOL *DevicePath);

View File

@ -439,6 +439,7 @@ STATIC EFI_STATUS GetOSXVolumeName(LOADER_ENTRY *Entry)
} }
return Status; return Status;
} }
STATIC LOADER_ENTRY *CreateLoaderEntry(IN CONST XStringW& LoaderPath, STATIC LOADER_ENTRY *CreateLoaderEntry(IN CONST XStringW& LoaderPath,
IN CONST XString8Array& LoaderOptions, IN CONST XString8Array& LoaderOptions,
IN CONST XStringW& FullTitle, IN CONST XStringW& FullTitle,
@ -810,10 +811,13 @@ void LOADER_ENTRY::AddDefaultMenu()
SubScreen->AddMenuInfoLine_f("APFS volume name: %ls", DisplayedVolName.wc_str()); SubScreen->AddMenuInfoLine_f("APFS volume name: %ls", DisplayedVolName.wc_str());
} }
if ( Volume->ApfsFileSystemUUID.notEmpty() ) { if ( Volume->ApfsFileSystemUUID.notEmpty() ) {
SubScreen->AddMenuInfoLine_f("APFS File System UUID: %s", Volume->ApfsFileSystemUUID.c_str()); SubScreen->AddMenuInfoLine_f("APFS file system UUID: %s", Volume->ApfsFileSystemUUID.c_str());
}
if ( Volume->ApfsContainerUUID.notEmpty() ) {
SubScreen->AddMenuInfoLine_f("APFS container UUID: %s", Volume->ApfsContainerUUID.c_str());
} }
if ( APFSTargetUUID.notEmpty() ) { if ( APFSTargetUUID.notEmpty() ) {
SubScreen->AddMenuInfoLine_f("APFS Target UUID: %ls", APFSTargetUUID.wc_str()); SubScreen->AddMenuInfoLine_f("APFS target UUID: %ls", APFSTargetUUID.wc_str());
} }
SubScreen->AddMenuInfoLine_f("Options: %s", LoadOptions.ConcatAll(" "_XS8).c_str()); SubScreen->AddMenuInfoLine_f("Options: %s", LoadOptions.ConcatAll(" "_XS8).c_str());
// loader-specific submenu entries // loader-specific submenu entries
@ -1002,7 +1006,7 @@ LOADER_ENTRY* AddLoaderEntry(IN CONST XStringW& LoaderPath, IN CONST XString8Arr
return NULL; return NULL;
} }
DBG(" AddLoaderEntry for Volume Name=%ls\n", Volume->VolName.wc_str()); DBG(" AddLoaderEntry for Volume Name=%ls, idx=%zu\n", Volume->VolName.wc_str(), MainMenu.Entries.sizeIncludingHidden());
if (OSFLAG_ISSET(Flags, OSFLAG_DISABLED)) { if (OSFLAG_ISSET(Flags, OSFLAG_DISABLED)) {
DBG(" skipped because entry is disabled\n"); DBG(" skipped because entry is disabled\n");
return NULL; return NULL;
@ -1020,6 +1024,10 @@ LOADER_ENTRY* AddLoaderEntry(IN CONST XStringW& LoaderPath, IN CONST XString8Arr
// } // }
// } // }
// } // }
if ( Volume->ApfsContainerUUID.notEmpty() ) DBG(" ApfsContainerUUID=%s\n", Volume->ApfsContainerUUID.c_str());
if ( Volume->ApfsFileSystemUUID.notEmpty() ) DBG(" ApfsFileSystemUUID=%s\n", Volume->ApfsFileSystemUUID.c_str());
if ( APFSTargetUUID.notEmpty() ) DBG(" APFSTargetUUID=%ls\n", APFSTargetUUID.wc_str());
Entry = CreateLoaderEntry(LoaderPath, LoaderOptions, FullTitle, LoaderTitle, Volume, APFSTargetUUID, Image, NULL, OSType, Flags, 0, MenuBackgroundPixel, CUSTOM_BOOT_DISABLED, NULL, NULL, FALSE); Entry = CreateLoaderEntry(LoaderPath, LoaderOptions, FullTitle, LoaderTitle, Volume, APFSTargetUUID, Image, NULL, OSType, Flags, 0, MenuBackgroundPixel, CUSTOM_BOOT_DISABLED, NULL, NULL, FALSE);
if (Entry != NULL) { if (Entry != NULL) {
if ((Entry->LoaderType == OSTYPE_OSX) || if ((Entry->LoaderType == OSTYPE_OSX) ||
@ -1344,10 +1352,6 @@ void ScanLoader(void)
continue; continue;
} }
// if (Volume->Hidden) {
// DBG(", hidden\n");
// continue;
// }
DBG("\n"); DBG("\n");
// check for Mac OS X Install Data // check for Mac OS X Install Data
@ -1412,7 +1416,7 @@ void ScanLoader(void)
AddLoaderEntry(MACOSX_LOADER_PATH, NullXString8Array, L""_XSW, L"OS X"_XSW, Volume, L""_XSW, NULL, OSTYPE_OSX, 0); // 10.8 - 10.11 AddLoaderEntry(MACOSX_LOADER_PATH, NullXString8Array, L""_XSW, L"OS X"_XSW, Volume, L""_XSW, NULL, OSTYPE_OSX, 0); // 10.8 - 10.11
} else { } else {
XString8 OSVersion; XString8 OSVersion;
if ( Volume->ApfsFileSystemUUID.notEmpty() && Volume->ApfsTargetUUIDArray.size() == 0 ) if ( Volume->ApfsFileSystemUUID.notEmpty() && (Volume->ApfsRole & APPLE_APFS_VOLUME_ROLE_SYSTEM) != 0 )
{ {
XStringW plist = SWPrintf("\\System\\Library\\CoreServices\\SystemVersion.plist"); XStringW plist = SWPrintf("\\System\\Library\\CoreServices\\SystemVersion.plist");
if ( !FileExists(Volume->RootDir, plist) ) { if ( !FileExists(Volume->RootDir, plist) ) {
@ -1444,7 +1448,7 @@ void ScanLoader(void)
if ( PlistBuffer ) FreePool(PlistBuffer); if ( PlistBuffer ) FreePool(PlistBuffer);
} }
} }
if ( OSVersion.isEmpty() || !OSVersion.equal("11.0") ) { if ( !OSVersion.equal("11.0") ) {
AddLoaderEntry(MACOSX_LOADER_PATH, NullXString8Array, L""_XSW, L"macOS"_XSW, Volume, L""_XSW, NULL, OSTYPE_OSX, 0); // 10.12+ AddLoaderEntry(MACOSX_LOADER_PATH, NullXString8Array, L""_XSW, L"macOS"_XSW, Volume, L""_XSW, NULL, OSTYPE_OSX, 0); // 10.12+
} }
} }
@ -1519,52 +1523,56 @@ void ScanLoader(void)
for (UINTN i = 0; i < Volume->ApfsTargetUUIDArray.size(); i++) for (UINTN i = 0; i < Volume->ApfsTargetUUIDArray.size(); i++)
{ {
const XString8& ApfsTargetUUID = Volume->ApfsTargetUUIDArray[i]; const XString8& ApfsTargetUUID = Volume->ApfsTargetUUIDArray[i];
XStringW FullTitle;
XStringW FullTitleRecovery;
XStringW FullTitleInstaller;
XStringW LoaderTitle;
XStringW LoaderTitleInstaller;
const LOADER_ENTRY* targetLoaderEntry = NULL;
for ( size_t entryIdx = 0 ; entryIdx < MainMenu.Entries.size() ; entryIdx ++ )
{
if ( MainMenu.Entries[entryIdx].getLOADER_ENTRY() ) {
const LOADER_ENTRY* loaderEntry = MainMenu.Entries[entryIdx].getLOADER_ENTRY();
if ( loaderEntry->Volume->ApfsFileSystemUUID == ApfsTargetUUID ) {
targetLoaderEntry = loaderEntry;
}
}
}
if ( targetLoaderEntry ) {
AddLoaderEntry(SWPrintf("\\%s\\System\\Library\\CoreServices\\boot.efi", ApfsTargetUUID.c_str()), NullXString8Array, SWPrintf("Boot Mac OS X from %ls via %ls", targetLoaderEntry->DisplayedVolName.wc_str(), Volume->VolName.wc_str()), L""_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_OSX, 0);
//Try to add Recovery APFS entry
AddLoaderEntry(SWPrintf("\\%s\\boot.efi", Volume->ApfsTargetUUIDArray[i].c_str()), NullXString8Array, SWPrintf("Boot Mac OS X Recovery for %ls via %ls", targetLoaderEntry->DisplayedVolName.wc_str(), Volume->VolName.wc_str()), L""_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_RECOVERY, 0);
//Try to add macOS install entry
AddLoaderEntry(SWPrintf("\\%s\\com.apple.installer\\boot.efi", Volume->ApfsTargetUUIDArray[i].c_str()), NullXString8Array, L""_XSW, L"macOS Install Prebooter"_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_OSX_INSTALLER, 0);
}
else
{
REFIT_VOLUME* targetVolume = NULL; REFIT_VOLUME* targetVolume = NULL;
for (UINTN VolumeIndex2 = 0; VolumeIndex2 < Volumes.size(); VolumeIndex2++) { for (UINTN VolumeIndex2 = 0; VolumeIndex2 < Volumes.size(); VolumeIndex2++) {
REFIT_VOLUME* Volume2 = &Volumes[VolumeIndex2]; REFIT_VOLUME* Volume2 = &Volumes[VolumeIndex2];
//DBG("name %ls uuid=%ls \n", Volume2->VolName, Volume2->ApfsFileSystemUUID.wc_str()); //DBG("name %ls uuid=%ls \n", Volume2->VolName, Volume2->ApfsFileSystemUUID.wc_str());
if ( Volume2->ApfsContainerUUID == Volume->ApfsContainerUUID ) {
if ( Volume2->ApfsFileSystemUUID == ApfsTargetUUID ) { if ( Volume2->ApfsFileSystemUUID == ApfsTargetUUID ) {
targetVolume = Volume2; targetVolume = Volume2;
} }
} }
}
if ( targetVolume ) { if ( targetVolume ) {
AddLoaderEntry(SWPrintf("\\%s\\System\\Library\\CoreServices\\boot.efi", ApfsTargetUUID.c_str()), NullXString8Array, SWPrintf("Boot Mac OS X from %ls via %ls", targetVolume->VolName.wc_str(), Volume->VolName.wc_str()), L""_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_OSX, 0); if ( (targetVolume->ApfsRole & APPLE_APFS_VOLUME_ROLE_DATA) != 0 ) {
//Try to add Recovery APFS entry for (UINTN VolumeIndex2 = 0; VolumeIndex2 < Volumes.size(); VolumeIndex2++) {
AddLoaderEntry(SWPrintf("\\%s\\boot.efi", Volume->ApfsTargetUUIDArray[i].c_str()), NullXString8Array, SWPrintf("Boot Mac OS X Recovery for %ls via %ls", targetVolume->VolName.wc_str(), Volume->VolName.wc_str()), L""_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_RECOVERY, 0); REFIT_VOLUME* Volume2 = &Volumes[VolumeIndex2];
//Try to add macOS install entry //DBG("name %ls uuid=%ls \n", Volume2->VolName, Volume2->ApfsFileSystemUUID.wc_str());
AddLoaderEntry(SWPrintf("\\%s\\com.apple.installer\\boot.efi", Volume->ApfsTargetUUIDArray[i].c_str()), NullXString8Array, SWPrintf("Boot Mac OS X Install for %ls via %ls", targetVolume->VolName.wc_str(), Volume->VolName.wc_str()), L""_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_OSX_INSTALLER, 0); if ( Volume2->ApfsContainerUUID == targetVolume->ApfsContainerUUID ) {
} else { if ( (Volume2->ApfsRole & APPLE_APFS_VOLUME_ROLE_SYSTEM) != 0 ) {
AddLoaderEntry(SWPrintf("\\%s\\System\\Library\\CoreServices\\boot.efi", ApfsTargetUUID.c_str()), NullXString8Array, L""_XSW, L"FileVault Prebooter"_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_OSX, 0); targetVolume = Volume2;
//Try to add Recovery APFS entry
AddLoaderEntry(SWPrintf("\\%s\\boot.efi", Volume->ApfsTargetUUIDArray[i].c_str()), NullXString8Array, SWPrintf("Boot Mac OS X Recovery via %ls", Volume->VolName.wc_str()), L""_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_RECOVERY, 0);
//Try to add macOS install entry
AddLoaderEntry(SWPrintf("\\%s\\com.apple.installer\\boot.efi", Volume->ApfsTargetUUIDArray[i].c_str()), NullXString8Array, L""_XSW, L"macOS Install Prebooter"_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_OSX_INSTALLER, 0);
} }
} }
} }
} }
} }
if ( FullTitle.isEmpty() ) {
if ( targetVolume ) {
FullTitle.SWPrintf("Boot Mac OS X from %ls via %ls", targetVolume->getVolLabelOrOSXVolumeNameOrVolName().wc_str(), Volume->getVolLabelOrOSXVolumeNameOrVolName().wc_str());
FullTitleRecovery.SWPrintf("Boot Mac OS X Recovery for %ls via %ls", targetVolume->getVolLabelOrOSXVolumeNameOrVolName().wc_str(), Volume->getVolLabelOrOSXVolumeNameOrVolName().wc_str());
FullTitleInstaller.SWPrintf("Boot Mac OS X Install for %ls via %ls", targetVolume->getVolLabelOrOSXVolumeNameOrVolName().wc_str(), Volume->getVolLabelOrOSXVolumeNameOrVolName().wc_str());
}else{
FullTitle.SWPrintf("Boot Mac OS X via %ls", Volume->getVolLabelOrOSXVolumeNameOrVolName().wc_str());
FullTitleRecovery.SWPrintf("Boot Mac OS X Recovery via %ls", Volume->getVolLabelOrOSXVolumeNameOrVolName().wc_str());
FullTitleInstaller.SWPrintf("Mac OS X Install via %ls", Volume->getVolLabelOrOSXVolumeNameOrVolName().wc_str());
}
}
AddLoaderEntry(SWPrintf("\\%s\\System\\Library\\CoreServices\\boot.efi", ApfsTargetUUID.c_str()), NullXString8Array, FullTitle, LoaderTitle, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_OSX, 0);
//Try to add Recovery APFS entry
AddLoaderEntry(SWPrintf("\\%s\\boot.efi", Volume->ApfsTargetUUIDArray[i].c_str()), NullXString8Array, FullTitleRecovery, L""_XSW, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_RECOVERY, 0);
//Try to add macOS install entry
AddLoaderEntry(SWPrintf("\\%s\\com.apple.installer\\boot.efi", Volume->ApfsTargetUUIDArray[i].c_str()), NullXString8Array, FullTitleInstaller, LoaderTitleInstaller, Volume, Volume->ApfsTargetUUIDArray[i], NULL, OSTYPE_OSX_INSTALLER, 0);
}
}
}
// Hide redundant preboot partition
for (size_t entryIdx1 = 0; entryIdx1 < MainMenu.Entries.sizeIncludingHidden(); entryIdx1++) for (size_t entryIdx1 = 0; entryIdx1 < MainMenu.Entries.sizeIncludingHidden(); entryIdx1++)
{ {
LOADER_ENTRY* loaderEntry1Ptr = MainMenu.Entries.ElementAt(entryIdx1).getLOADER_ENTRY(); LOADER_ENTRY* loaderEntry1Ptr = MainMenu.Entries.ElementAt(entryIdx1).getLOADER_ENTRY();
@ -1577,6 +1585,7 @@ void ScanLoader(void)
{ {
if ( MainMenu.Entries.ElementAt(entryIdx2).getLOADER_ENTRY() ) { if ( MainMenu.Entries.ElementAt(entryIdx2).getLOADER_ENTRY() ) {
LOADER_ENTRY& loaderEntry2 = *MainMenu.Entries.ElementAt(entryIdx2).getLOADER_ENTRY(); LOADER_ENTRY& loaderEntry2 = *MainMenu.Entries.ElementAt(entryIdx2).getLOADER_ENTRY();
if ( loaderEntry2.Volume->ApfsContainerUUID == loaderEntry1.Volume->ApfsContainerUUID ) {
if ( loaderEntry2.Volume->ApfsFileSystemUUID == loaderEntry1.APFSTargetUUID ) { if ( loaderEntry2.Volume->ApfsFileSystemUUID == loaderEntry1.APFSTargetUUID ) {
loaderEntry1.Hidden = true; loaderEntry1.Hidden = true;
} }
@ -1584,8 +1593,60 @@ void ScanLoader(void)
} }
} }
} }
}
bool hasMovedSomething;
// Re-order preboot partition
do {
hasMovedSomething = false;
for (size_t prebootIdx = 0; !hasMovedSomething && prebootIdx < MainMenu.Entries.sizeIncludingHidden(); prebootIdx++)
{
LOADER_ENTRY* loaderEntry1Ptr = MainMenu.Entries.ElementAt(prebootIdx).getLOADER_ENTRY();
if ( !loaderEntry1Ptr ) continue;
LOADER_ENTRY& loaderEntry1 = *loaderEntry1Ptr;
if ( (loaderEntry1.Volume->ApfsRole & APPLE_APFS_VOLUME_ROLE_PREBOOT) != 0 )
{
size_t idxMain = MainMenu.Entries.getApfsLoaderIdx(loaderEntry1.Volume->ApfsContainerUUID, loaderEntry1.APFSTargetUUID);
if ( idxMain != SIZE_T_MAX && idxMain != prebootIdx+1 ) {
DBG("Move preboot entry %zu before system %zu\n", prebootIdx, idxMain);
MainMenu.Entries.moveBefore(prebootIdx, idxMain); // this will move preboot entry just before main
hasMovedSomething = true;
}
}
}
} while ( hasMovedSomething );
// Re-order recovery partition
do {
hasMovedSomething = false;
for (size_t recoveryIdx = 0; !hasMovedSomething && recoveryIdx < MainMenu.Entries.sizeIncludingHidden(); recoveryIdx++)
{
LOADER_ENTRY* loaderEntry1Ptr = MainMenu.Entries.ElementAt(recoveryIdx).getLOADER_ENTRY();
if ( !loaderEntry1Ptr ) continue;
LOADER_ENTRY& loaderEntry1 = *loaderEntry1Ptr;
if ( (loaderEntry1.Volume->ApfsRole & APPLE_APFS_VOLUME_ROLE_RECOVERY) != 0 )
{
size_t idxMain = MainMenu.Entries.getApfsLoaderIdx(loaderEntry1.Volume->ApfsContainerUUID, loaderEntry1.APFSTargetUUID);
if ( idxMain != SIZE_T_MAX ) {
if ( idxMain + 1 != recoveryIdx ) {
DBG("Move recovery entry %zu after system %zu\n", recoveryIdx, idxMain);
MainMenu.Entries.moveAfter(recoveryIdx, idxMain); // this will move preboot entry just before main
hasMovedSomething = true;
}
}else{
size_t idxPreboot = MainMenu.Entries.getApfsPrebootLoaderIdx(loaderEntry1.Volume->ApfsContainerUUID, loaderEntry1.APFSTargetUUID);
if ( idxPreboot + 1 != recoveryIdx ) {
DBG("Move recovery entry %zu after preboot %zu\n", recoveryIdx, idxPreboot);
MainMenu.Entries.moveAfter(recoveryIdx, idxPreboot); // this will move preboot entry just before main
hasMovedSomething = true;
}
}
}
}
} while ( hasMovedSomething );
} }
STATIC void AddCustomEntry(IN UINTN CustomIndex, STATIC void AddCustomEntry(IN UINTN CustomIndex,

View File

@ -123,6 +123,70 @@ public:
} }
panic("EntryArray::operator[] nIndex > size()"); panic("EntryArray::operator[] nIndex > size()");
} }
size_t getApfsLoaderIdx(const XString8& ApfsContainerUUID, const XString8& ApfsFileSystemUUID)
{
for ( size_t i=0 ; i < XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::size() ; i++ ) {
if ( XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::ElementAt(i).getLOADER_ENTRY() ) {
if ( XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::ElementAt(i).getLOADER_ENTRY()->Volume->ApfsContainerUUID == ApfsContainerUUID ) {
if ( XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::ElementAt(i).getLOADER_ENTRY()->Volume->ApfsFileSystemUUID == ApfsFileSystemUUID ) {
return i;
}
}
}
}
return SIZE_T_MAX;
}
size_t getApfsPrebootLoaderIdx(const XString8& ApfsContainerUUID, const XString8& ApfsFileSystemUUID)
{
for ( size_t i=0 ; i < XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::size() ; i++ ) {
if ( XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::ElementAt(i).getLOADER_ENTRY() ) {
if ( (XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::ElementAt(i).getLOADER_ENTRY()->Volume->ApfsRole & APPLE_APFS_VOLUME_ROLE_PREBOOT) != 0 ) {
if ( XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::ElementAt(i).getLOADER_ENTRY()->Volume->ApfsContainerUUID == ApfsContainerUUID ) {
if ( XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::ElementAt(i).getLOADER_ENTRY()->APFSTargetUUID == ApfsFileSystemUUID ) {
return i;
}
}
}
}
}
return SIZE_T_MAX;
}
template<typename IntegralType1, typename IntegralType2, enable_if(is_integral(IntegralType1) && is_integral(IntegralType2))>
void moveBefore(IntegralType1 idxFrom, IntegralType2 idxTo)
{
if (idxFrom < 0) panic("EntryArray::move(IntegralType1, IntegralType2) : idxFrom < 0. System halted\n");
if (idxFrom > XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::size()) panic("EntryArray::move(IntegralType1, IntegralType2) : idxFrom > size(). System halted\n");
if (idxTo < 0) panic("EntryArray::move(IntegralType1, IntegralType2) : idxTo < 0. System halted\n");
if (idxTo > XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::size()) panic("EntryArray::move(IntegralType1, IntegralType2) : idxTo > size(). System halted\n");
REFIT_ABSTRACT_MENU_ENTRY* entry = &ElementAt(idxFrom);
RemoveWithoutFreeingAtIndex(idxFrom);
if ( idxTo > idxFrom ) {
InsertRef(entry, idxTo-1, true);
}else{
InsertRef(entry, idxTo, true);
}
}
template<typename IntegralType1, typename IntegralType2, enable_if(is_integral(IntegralType1) && is_integral(IntegralType2))>
void moveAfter(IntegralType1 idxFrom, IntegralType2 idxTo)
{
if (idxFrom < 0) panic("EntryArray::move(IntegralType1, IntegralType2) : idxFrom < 0. System halted\n");
if (idxFrom > XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::size()) panic("EntryArray::move(IntegralType1, IntegralType2) : idxFrom > size(). System halted\n");
if (idxTo < 0) panic("EntryArray::move(IntegralType1, IntegralType2) : idxTo < 0. System halted\n");
if (idxTo > XObjArray<REFIT_ABSTRACT_MENU_ENTRY>::size()) panic("EntryArray::move(IntegralType1, IntegralType2) : idxTo > size(). System halted\n");
REFIT_ABSTRACT_MENU_ENTRY* entry = &ElementAt(idxFrom);
RemoveWithoutFreeingAtIndex(idxFrom);
if ( idxTo > idxFrom ) {
InsertRef(entry, idxTo, true);
}else{
InsertRef(entry, idxTo+1, true);
}
}
}; };
class REFIT_MENU_SCREEN class REFIT_MENU_SCREEN

129
rEFIt_UEFI/include/OC.h Normal file
View File

@ -0,0 +1,129 @@
/*
* OC.h
*
* Created on: Oct 21, 2020
* Author: jief
*/
#ifndef INCLUDE_OC_H_
#define INCLUDE_OC_H_
#ifdef __cplusplus
extern "C" {
#endif
//#include "../../OpenCorePkg/Include/Acidanthera/OpenCore.h"
#include <Library/OcRtcLib.h>
#include <Library/OcOSInfoLib.h>
#include <Library/OcVirtualFsLib.h>
#include <Library/OcConfigurationLib.h>
#include <Library/OcDevicePathLib.h>
//#include <Library/OcCpuLib.h> // OC_CPU_INFO
//#include <Protocol/OcBootstrap.h> // OC_BOOTSTRAP_PROTOCOL
#include <Guid/AppleApfsInfo.h>
extern OC_GLOBAL_CONFIG mOpenCoreConfiguration;
extern OC_STORAGE_CONTEXT mOpenCoreStorage;
//extern OC_CPU_INFO mOpenCoreCpuInfo;
//extern OC_BOOTSTRAP_PROTOCOL mOpenCoreBootStrap;
//extern OC_RSA_PUBLIC_KEY* mOpenCoreVaultKey;
//extern EFI_HANDLE mLoadHandle;
EFI_STATUS
EFIAPI
OcStartImage_2 (
IN OC_BOOT_ENTRY *Chosen,
IN EFI_HANDLE ImageHandle,
OUT UINTN *ExitDataSize,
OUT CHAR16 **ExitData OPTIONAL
);
EFI_STATUS
EFIAPI
OcKernelFileOpen (
IN EFI_FILE_PROTOCOL *This,
OUT EFI_FILE_PROTOCOL **NewHandle,
IN CHAR16 *FileName,
IN UINT64 OpenMode,
IN UINT64 Attributes
);
EFI_STATUS
EFIAPI
InternalEfiLoadImage (
IN BOOLEAN BootPolicy,
IN EFI_HANDLE ParentImageHandle,
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN void *SourceBuffer OPTIONAL,
IN UINTN SourceSize,
OUT EFI_HANDLE *ImageHandle
);
EFI_STATUS
EFIAPI
OcStartImage (
IN EFI_HANDLE ImageHandle,
OUT UINTN *ExitDataSize,
OUT CHAR16 **ExitData OPTIONAL
);
void
OcLoadBooterUefiSupport (
IN OC_GLOBAL_CONFIG *Config
);
UINT64
InternalCalculateARTFrequencyIntel (
OUT UINT64 *CPUFrequency,
OUT UINT64 *TscAdjustPtr OPTIONAL,
IN BOOLEAN Recalculate
);
EFI_STATUS
ClOcReadConfigurationFile(
IN OC_STORAGE_CONTEXT *Storage,
IN CONST CHAR16* configPath,
OUT OC_GLOBAL_CONFIG *Config
);
EFI_STATUS
InternalGetApfsSpecialFileInfo (
IN EFI_FILE_PROTOCOL *Root,
IN OUT APPLE_APFS_VOLUME_INFO **VolumeInfo OPTIONAL,
IN OUT APPLE_APFS_CONTAINER_INFO **ContainerInfo OPTIONAL
);
void
OcMain (
IN OC_STORAGE_CONTEXT *Storage,
IN EFI_DEVICE_PATH_PROTOCOL *LoadPath OPTIONAL
);
#ifdef __cplusplus
} // extern "C"
#endif
#define OC_STRING_ASSIGN_N(ocString, value, len) do { \
if( len >= sizeof(ocString.Value) ) { \
memset(ocString.Value, 0, sizeof(ocString.Value)); \
ocString.DynValue = (__typeof__(ocString.DynValue))malloc(len); \
memcpy(ocString.DynValue, value, len); \
ocString.MaxSize = (UINT32)len; \
ocString.Size = (UINT32)len; /* unsafe cast */ \
}else{ \
ocString.DynValue = NULL; \
memcpy(ocString.Value, value, len); \
ocString.MaxSize = sizeof(ocString.Value); \
ocString.Size = (UINT32)len; /* unsafe cast */ \
} \
} while (0)
#define OC_STRING_ASSIGN(ocString, value) OC_STRING_ASSIGN_N(ocString, value, strlen(value)+1)
#endif /* INCLUDE_OC_H_ */

View File

@ -45,6 +45,7 @@
extern "C" { extern "C" {
#include <Library/OcConfigurationLib.h> #include <Library/OcConfigurationLib.h>
#include <Guid/AppleApfsInfo.h>
} }
/* types */ /* types */
@ -164,8 +165,8 @@ public:
EFI_HANDLE DeviceHandle; EFI_HANDLE DeviceHandle;
EFI_FILE *RootDir; EFI_FILE *RootDir;
XStringW DevicePathString; XStringW DevicePathString;
XStringW VolName; XStringW VolName; // comes from EfiLibFileSystemInfo, EfiLibFileSystemVolumeLabelInfo, "EFI" if gEfiPartTypeSystemPartGuid or "Unknown HD"
XStringW VolLabel; XStringW VolLabel; // comes from \\.VolumeLabel.txt, or empty.
UINT8 DiskKind; UINT8 DiskKind;
LEGACY_OS *LegacyOS; LEGACY_OS *LegacyOS;
BOOLEAN Hidden; BOOLEAN Hidden;
@ -183,7 +184,10 @@ public:
UINT32 DriveCRC32; UINT32 DriveCRC32;
EFI_GUID RootUUID; //for recovery it is UUID of parent partition EFI_GUID RootUUID; //for recovery it is UUID of parent partition
UINT64 SleepImageOffset; UINT64 SleepImageOffset;
XStringW osxVolumeName = NullXStringW; // comes from \\System\\Library\\CoreServices\\.disk_label.contentDetails, or empty.
XString8 ApfsFileSystemUUID; // apfs file system UUID of that partition. It's not the UUID of subfolder like in Preboot. XString8 ApfsFileSystemUUID; // apfs file system UUID of that partition. It's not the UUID of subfolder like in Preboot.
XString8 ApfsContainerUUID = NullXString8;
APPLE_APFS_VOLUME_ROLE ApfsRole = 0;
XString8Array ApfsTargetUUIDArray; // this is the array of folders that are named as UUID XString8Array ApfsTargetUUIDArray; // this is the array of folders that are named as UUID
REFIT_VOLUME() : DevicePath(0), DeviceHandle(0), RootDir(0), DevicePathString(), VolName(), VolLabel(), DiskKind(0), LegacyOS(0), Hidden(0), BootType(0), IsAppleLegacy(0), HasBootCode(0), REFIT_VOLUME() : DevicePath(0), DeviceHandle(0), RootDir(0), DevicePathString(), VolName(), VolLabel(), DiskKind(0), LegacyOS(0), Hidden(0), BootType(0), IsAppleLegacy(0), HasBootCode(0),
@ -194,6 +198,11 @@ public:
const REFIT_VOLUME& operator = ( const REFIT_VOLUME & ) = delete; // Can be defined if needed const REFIT_VOLUME& operator = ( const REFIT_VOLUME & ) = delete; // Can be defined if needed
~REFIT_VOLUME() {} ~REFIT_VOLUME() {}
const XStringW getVolLabelOrOSXVolumeNameOrVolName() {
if ( VolLabel.notEmpty() ) return VolLabel;
if ( osxVolumeName.notEmpty() ) return osxVolumeName;
return VolName;
}
}; };
class KEXT_PATCH class KEXT_PATCH

View File

@ -365,6 +365,7 @@
OpenCoreLib OpenCoreLib
#OcDebugLogLib #OcDebugLogLib
OcDebugLogLibOc2Clover OcDebugLogLibOc2Clover
OcAppleBootPolicyLib
[Guids] [Guids]
gEfiAcpiTableGuid gEfiAcpiTableGuid

View File

@ -35,6 +35,7 @@
*/ */
#include <Platform.h> // Only use angled for Platform, else, xcode project won't compile #include <Platform.h> // Only use angled for Platform, else, xcode project won't compile
#include "lib.h"
#include "screen.h" #include "screen.h"
#include "../Platform/guid.h" #include "../Platform/guid.h"
#include "../Platform/APFS.h" #include "../Platform/APFS.h"
@ -42,6 +43,7 @@
#include "../Platform/Settings.h" #include "../Platform/Settings.h"
#include "Self.h" #include "Self.h"
#include "SelfOem.h" #include "SelfOem.h"
#include "../include/OC.h"
#ifndef DEBUG_ALL #ifndef DEBUG_ALL
#define DEBUG_LIB 1 #define DEBUG_LIB 1
@ -69,7 +71,12 @@ BOOLEAN gThemeOptionsChanged = FALSE;
REFIT_VOLUME *SelfVolume = NULL; REFIT_VOLUME *SelfVolume = NULL;
//REFIT_VOLUME **Volumes = NULL; //REFIT_VOLUME **Volumes = NULL;
//UINTN VolumesCount = 0; //UINTN VolumesCount = 0;
XObjArray<REFIT_VOLUME> Volumes; VolumesArrayClass Volumes;
//REFIT_VOLUME* VolumesArrayClass::getApfsPartitionWithUUID(const XString8& ApfsContainerUUID, const XString8& APFSTargetUUID)
//{
//}
// //
// Unicode collation protocol interface // Unicode collation protocol interface
// //
@ -561,6 +568,25 @@ static void ScanVolumeBootcode(IN OUT REFIT_VOLUME *Volume, OUT BOOLEAN *Bootabl
FreeAlignedPages((void*)SectorBuffer, EFI_SIZE_TO_PAGES (2048)); FreeAlignedPages((void*)SectorBuffer, EFI_SIZE_TO_PAGES (2048));
} }
//Set Entry->VolName to .disk_label.contentDetails if it exists
STATIC XStringW GetOSXVolumeName(REFIT_VOLUME *Volume)
{
XStringW returnValue;
EFI_STATUS Status = EFI_NOT_FOUND;
CONST CHAR16* targetNameFile = L"\\System\\Library\\CoreServices\\.disk_label.contentDetails";
CHAR8* fileBuffer;
UINTN fileLen = 0;
if(FileExists(Volume->RootDir, targetNameFile)) {
Status = egLoadFile(Volume->RootDir, targetNameFile, (UINT8 **)&fileBuffer, &fileLen);
if(!EFI_ERROR(Status)) {
returnValue.strncpy(fileBuffer, fileLen);
FreePool(fileBuffer);
return returnValue;
}
}
return NullXStringW;
}
//at start we have only Volume->DeviceHandle //at start we have only Volume->DeviceHandle
static EFI_STATUS ScanVolume(IN OUT REFIT_VOLUME *Volume) static EFI_STATUS ScanVolume(IN OUT REFIT_VOLUME *Volume)
{ {
@ -592,9 +618,6 @@ static EFI_STATUS ScanVolume(IN OUT REFIT_VOLUME *Volume)
// DumpHex(1, 0, GetDevicePathSize(Volume->DevicePath), Volume->DevicePath); // DumpHex(1, 0, GetDevicePathSize(Volume->DevicePath), Volume->DevicePath);
//#endif //#endif
} }
if ( Volume->ApfsFileSystemUUID.notEmpty() ) {
DBG(" apfsFileSystemUUID=%s\n", Volume->ApfsFileSystemUUID.c_str());
}
#else #else
DBG("\n"); DBG("\n");
#endif #endif
@ -794,6 +817,27 @@ static EFI_STATUS ScanVolume(IN OUT REFIT_VOLUME *Volume)
return EFI_SUCCESS; return EFI_SUCCESS;
} }
if ( Volume->ApfsFileSystemUUID.notEmpty() ) {
APPLE_APFS_CONTAINER_INFO *ApfsContainerInfo;
APPLE_APFS_VOLUME_INFO *ApfsVolumeInfo;
EFI_STATUS Status = InternalGetApfsSpecialFileInfo(Volume->RootDir, &ApfsVolumeInfo, &ApfsContainerInfo);
if ( !EFI_ERROR(Status) ) {
//DBG("Status : %s, APFS role : %x\n", efiStrError(Status), ApfsVolumeInfo->Role);
Volume->ApfsRole = ApfsVolumeInfo->Role;
Volume->ApfsContainerUUID = GuidLEToXString8(ApfsContainerInfo->Uuid);
}else{
MsgLog("Status : %s, APFS role : %x\n", efiStrError(Status), ApfsVolumeInfo->Role);
}
}
if ( Volume->ApfsFileSystemUUID.notEmpty() ) {
DBG(" apfsFileSystemUUID=%s, ApfsContainerUUID=%s, ApfsRole=0x%x\n", Volume->ApfsFileSystemUUID.c_str(), Volume->ApfsContainerUUID.c_str(), Volume->ApfsRole);
}
Volume->osxVolumeName = GetOSXVolumeName(Volume);
DBG(" osxVolumeName=%ls\n", Volume->osxVolumeName.wc_str());
if ( FileExists(Volume->RootDir, L"\\.VolumeLabel.txt") ) { if ( FileExists(Volume->RootDir, L"\\.VolumeLabel.txt") ) {
EFI_FILE* FileHandle; EFI_FILE* FileHandle;
Status = Volume->RootDir->Open(Volume->RootDir, &FileHandle, L"\\.VolumeLabel.txt", EFI_FILE_MODE_READ, 0); Status = Volume->RootDir->Open(Volume->RootDir, &FileHandle, L"\\.VolumeLabel.txt", EFI_FILE_MODE_READ, 0);
@ -838,7 +882,7 @@ static EFI_STATUS ScanVolume(IN OUT REFIT_VOLUME *Volume)
{ {
void *Instance; void *Instance;
if (!EFI_ERROR(gBS->HandleProtocol(Volume->DeviceHandle, &gEfiPartTypeSystemPartGuid, &Instance))) { if (!EFI_ERROR(gBS->HandleProtocol(Volume->DeviceHandle, &gEfiPartTypeSystemPartGuid, &Instance))) {
Volume->VolName = L"EFI"_XSW; \ Volume->VolName = L"EFI"_XSW;
} }
} }
if (Volume->VolName.isEmpty()) { if (Volume->VolName.isEmpty()) {
@ -874,6 +918,8 @@ static EFI_STATUS ScanVolume(IN OUT REFIT_VOLUME *Volume)
DirIterClose(&DirIter); DirIterClose(&DirIter);
} }
DBG(" label : %ls\n", Volume->getVolLabelOrOSXVolumeNameOrVolName().wc_str());
//Status = GetOSVersion(Volume); NOTE: Sothor - We will find icon names later once we have found boot.efi on the volume //here we set Volume->IconName (tiger,leo,snow,lion,cougar, etc) //Status = GetOSVersion(Volume); NOTE: Sothor - We will find icon names later once we have found boot.efi on the volume //here we set Volume->IconName (tiger,leo,snow,lion,cougar, etc)
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -69,15 +69,6 @@ extern XTheme ThemeX; //global variable defined in lib.cpp
#define REFIT_DEBUG (2) #define REFIT_DEBUG (2)
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
// //
// lib module // lib module
// //
@ -298,9 +289,19 @@ typedef enum {
#define SCREEN_EDGE_BOTTOM 80000 #define SCREEN_EDGE_BOTTOM 80000
extern REFIT_VOLUME *SelfVolume; extern REFIT_VOLUME *SelfVolume;
#ifdef __cplusplus #ifdef __cplusplus
extern XObjArray<REFIT_VOLUME> Volumes; class VolumesArrayClass : public XObjArray<REFIT_VOLUME>
{
public:
// REFIT_VOLUME* getApfsPartitionWithUUID(const XString8& ApfsContainerUUID, const XString8& APFSTargetUUID);
};
extern VolumesArrayClass Volumes;
#endif #endif
//extern UINTN VolumesCount; //extern UINTN VolumesCount;
extern BOOLEAN gThemeChanged; extern BOOLEAN gThemeChanged;
@ -469,10 +470,6 @@ void DebugPause(void);
#ifdef _cplusplus
extern XObjArray<REFIT_VOLUME> Volumes;
#endif
// //
// BmLib // BmLib

View File

@ -75,9 +75,8 @@
#include "SelfOem.h" #include "SelfOem.h"
#include "../Platform/Net.h" #include "../Platform/Net.h"
extern "C" { #include "../include/OC.h"
#include "../../OpenCorePkg/Include/Acidanthera/OpenCore.h"
}
#ifndef DEBUG_ALL #ifndef DEBUG_ALL
#define DEBUG_MAIN 1 #define DEBUG_MAIN 1
@ -572,103 +571,6 @@ void CheckEmptyFB()
} }
} }
extern "C" {
#include <Library/OcRtcLib.h>
#include <Library/OcOSInfoLib.h>
#include <Library/OcVirtualFsLib.h>
#include <Library/OcConfigurationLib.h>
#include <Library/OcDevicePathLib.h>
extern OC_GLOBAL_CONFIG mOpenCoreConfiguration;
extern OC_STORAGE_CONTEXT mOpenCoreStorage;
extern OC_CPU_INFO mOpenCoreCpuInfo;
extern OC_BOOTSTRAP_PROTOCOL mOpenCoreBootStrap;
extern OC_RSA_PUBLIC_KEY* mOpenCoreVaultKey;
extern EFI_HANDLE mLoadHandle;
EFI_STATUS
EFIAPI
OcStartImage_2 (
IN OC_BOOT_ENTRY *Chosen,
IN EFI_HANDLE ImageHandle,
OUT UINTN *ExitDataSize,
OUT CHAR16 **ExitData OPTIONAL
);
EFI_STATUS
EFIAPI
OcKernelFileOpen (
IN EFI_FILE_PROTOCOL *This,
OUT EFI_FILE_PROTOCOL **NewHandle,
IN CHAR16 *FileName,
IN UINT64 OpenMode,
IN UINT64 Attributes
);
EFI_STATUS
EFIAPI
InternalEfiLoadImage (
IN BOOLEAN BootPolicy,
IN EFI_HANDLE ParentImageHandle,
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN void *SourceBuffer OPTIONAL,
IN UINTN SourceSize,
OUT EFI_HANDLE *ImageHandle
);
EFI_STATUS
EFIAPI
OcStartImage (
IN EFI_HANDLE ImageHandle,
OUT UINTN *ExitDataSize,
OUT CHAR16 **ExitData OPTIONAL
);
void
OcLoadBooterUefiSupport (
IN OC_GLOBAL_CONFIG *Config
);
UINT64
InternalCalculateARTFrequencyIntel (
OUT UINT64 *CPUFrequency,
OUT UINT64 *TscAdjustPtr OPTIONAL,
IN BOOLEAN Recalculate
);
EFI_STATUS
ClOcReadConfigurationFile(
IN OC_STORAGE_CONTEXT *Storage,
IN CONST CHAR16* configPath,
OUT OC_GLOBAL_CONFIG *Config
);
void
OcMain (
IN OC_STORAGE_CONTEXT *Storage,
IN EFI_DEVICE_PATH_PROTOCOL *LoadPath OPTIONAL
);
} // extern "C"
#define OC_STRING_ASSIGN_N(ocString, value, len) do { \
if( len >= sizeof(ocString.Value) ) { \
memset(ocString.Value, 0, sizeof(ocString.Value)); \
ocString.DynValue = (__typeof__(ocString.DynValue))malloc(len); \
memcpy(ocString.DynValue, value, len); \
ocString.MaxSize = (UINT32)len; \
ocString.Size = (UINT32)len; /* unsafe cast */ \
}else{ \
ocString.DynValue = NULL; \
memcpy(ocString.Value, value, len); \
ocString.MaxSize = sizeof(ocString.Value); \
ocString.Size = (UINT32)len; /* unsafe cast */ \
} \
} while (0)
#define OC_STRING_ASSIGN(ocString, value) OC_STRING_ASSIGN_N(ocString, value, strlen(value)+1)
size_t setKextAtPos(XObjArray<SIDELOAD_KEXT>* kextArrayPtr, const XString8& kextName, size_t pos) size_t setKextAtPos(XObjArray<SIDELOAD_KEXT>* kextArrayPtr, const XString8& kextName, size_t pos)
{ {
XObjArray<SIDELOAD_KEXT>& kextArray = *kextArrayPtr; XObjArray<SIDELOAD_KEXT>& kextArray = *kextArrayPtr;
@ -829,6 +731,8 @@ void LOADER_ENTRY::StartLoader()
DbgHeader("StartLoader"); DbgHeader("StartLoader");
DBG("Starting %ls\n", FileDevicePathToXStringW(DevicePath).wc_str());
if (Settings.notEmpty()) { if (Settings.notEmpty()) {
DBG(" Settings: %ls\n", Settings.wc_str()); DBG(" Settings: %ls\n", Settings.wc_str());
TagDict* dict; TagDict* dict;
@ -1125,7 +1029,8 @@ DBG("Beginning OC\n");
BOOLEAN NoContents = FALSE; BOOLEAN NoContents = FALSE;
XStringW infoPlistPath = getKextPlist(dirPath, KextEntry, &NoContents); //it will be fullPath, including dir XStringW infoPlistPath = getKextPlist(dirPath, KextEntry, &NoContents); //it will be fullPath, including dir
TagDict* dict = getInfoPlist(infoPlistPath); TagDict* dict = getInfoPlist(infoPlistPath);
BOOLEAN inject = checkOSBundleRequired(dict); // BOOLEAN inject = checkOSBundleRequired(dict);
BOOLEAN inject = true;
if (inject) { if (inject) {
if ( infoPlistPath.notEmpty()) { if ( infoPlistPath.notEmpty()) {
if (NoContents) { if (NoContents) {