From 92bf401d7c4ffc2433d20a2453f545e99cc8dbfe Mon Sep 17 00:00:00 2001 From: SergeySlice Date: Wed, 14 Oct 2020 21:54:18 +0300 Subject: [PATCH] fix full path for kexts Signed-off-by: SergeySlice --- rEFIt_UEFI/Platform/kext_inject.cpp | 49 +++++++++++--------------- rEFIt_UEFI/gui/menu_items/menu_items.h | 4 +-- rEFIt_UEFI/refit/main.cpp | 17 ++++----- 3 files changed, 31 insertions(+), 39 deletions(-) diff --git a/rEFIt_UEFI/Platform/kext_inject.cpp b/rEFIt_UEFI/Platform/kext_inject.cpp index 87436c136..5fbc963bb 100644 --- a/rEFIt_UEFI/Platform/kext_inject.cpp +++ b/rEFIt_UEFI/Platform/kext_inject.cpp @@ -131,32 +131,27 @@ BOOLEAN LOADER_ENTRY::checkOSBundleRequired(const TagDict* dict) //extern void KernelAndKextPatcherInit(IN LOADER_ENTRY *Entry); //extern void AnyKextPatch(UINT8 *Driver, UINT32 DriverSize, CHAR8 *InfoPlist, UINT32 InfoPlistSize, INT32 N, LOADER_ENTRY *Entry); -//XStringW infoPlistPath = getKextPlist(KextEntry); -void LOADER_ENTRY::getKextPlist(const SIDELOAD_KEXT& KextEntry, BOOLEAN* NoContents, XStringW* OutName) +//XStringW infoPlistPath = getKextPlist(dir, KextEntry, &NoContents); +XStringW LOADER_ENTRY::getKextPlist(const XStringW& dirPath, const SIDELOAD_KEXT& KextEntry, BOOLEAN* NoContents) { EFI_STATUS Status; XStringW TempName; - UINT8* infoDictBuffer = NULL; - UINTN infoDictBufferLength = 0; - TempName = SWPrintf("%ls\\%ls", KextEntry.FileName.wc_str(), L"Contents\\Info.plist"); - Status = egLoadFile(SelfVolume->RootDir, TempName.wc_str(), &infoDictBuffer, &infoDictBufferLength); + TempName = SWPrintf("%ls\\%ls\\%ls", dirPath.wc_str(), KextEntry.FileName.wc_str(), L"Contents\\Info.plist"); + MsgLog("info plist path: %ls\n", TempName.wc_str()); - if (EFI_ERROR(Status)) { + if (!FileExists(&self.getCloverDir(), TempName)) { //try to find a planar kext, without Contents - TempName = SWPrintf("%ls\\%ls", KextEntry.FileName.wc_str(), L"Info.plist"); - infoDictBufferLength = 0; - Status = egLoadFile(SelfVolume->RootDir, TempName.wc_str(), &infoDictBuffer, &infoDictBufferLength); - if (EFI_ERROR(Status)) { + TempName = SWPrintf("%ls\\%ls\\%ls", dirPath.wc_str(), KextEntry.FileName.wc_str(), L"Info.plist"); + if (!FileExists(&self.getCloverDir(), TempName)) { MsgLog("Failed to load extra kext : %ls status=%s\n", TempName.wc_str(), efiStrError(Status)); - return; // L""_XSW; + return L""_XSW; } *NoContents = TRUE; } else { *NoContents = FALSE; } - *OutName = TempName; - return; // &TempName; + return TempName; } //TagDict* dict = getInfoPlist(infoPlistPath); @@ -167,7 +162,7 @@ TagDict* LOADER_ENTRY::getInfoPlist(const XStringW& infoPlistPath) UINTN infoDictBufferLength = 0; TagDict* dict = NULL; - Status = egLoadFile(SelfVolume->RootDir, infoPlistPath.wc_str(), &infoDictBuffer, &infoDictBufferLength); + Status = egLoadFile(&self.getCloverDir(), infoPlistPath.wc_str(), &infoDictBuffer, &infoDictBufferLength); if (!EFI_ERROR(Status)) { //double check if( ParseXML((CHAR8*)infoDictBuffer, &dict, infoDictBufferLength)!=0 ) { MsgLog("Failed to parse Info.plist: %ls\n", infoPlistPath.wc_str()); @@ -179,31 +174,27 @@ TagDict* LOADER_ENTRY::getInfoPlist(const XStringW& infoPlistPath) return NULL; } -//XStringW execpath = getKextExecPath(KextEntry, dict); -void LOADER_ENTRY::getKextExecPath(const SIDELOAD_KEXT& KextEntry, TagDict* dict, BOOLEAN NoContents, OUT XStringW* OutName) +//XString8 execpath = getKextExecPath(dir, KextEntry, dict, NoContents); +XString8 LOADER_ENTRY::getKextExecPath(const XStringW& dirPath, const SIDELOAD_KEXT& KextEntry, TagDict* dict, BOOLEAN NoContents) { - EFI_STATUS Status; const TagStruct* prop = NULL; - XStringW TempName = L""_XSW; - UINT8* executableFatBuffer = NULL; - UINTN executableBufferLength = 0; + XString8 TempName; prop = dict->propertyForKey("CFBundleExecutable"); if( prop != NULL && prop->isString() && prop->getString()->stringValue().notEmpty() ) { - XString8 Executable = prop->getString()->stringValue(); + const XString8& Executable = prop->getString()->stringValue(); if (NoContents) { - TempName = SWPrintf("%ls\\%s", KextEntry.FileName.wc_str(), Executable.c_str()); + TempName = S8Printf("%s", Executable.c_str()); } else { - TempName = SWPrintf("%ls\\Contents\\MacOS\\%s", KextEntry.FileName.wc_str(), Executable.c_str()); + TempName = S8Printf("Contents\\MacOS\\%s", Executable.c_str()); } - Status = egLoadFile(SelfVolume->RootDir, TempName.wc_str(), &executableFatBuffer, &executableBufferLength); - if (EFI_ERROR(Status)) { + const XStringW& fullPath = SWPrintf("%ls\\%ls\\%s", dirPath.wc_str(), KextEntry.FileName.wc_str(), TempName.c_str()); + if (!FileExists(&self.getCloverDir(), fullPath)) { MsgLog("Failed to load kext executable: %ls\n", KextEntry.FileName.wc_str()); - return; + return ""_XS8; //no executable } - *OutName = TempName; } - return; //no executable + return TempName; } //it seems no more used? Or??? diff --git a/rEFIt_UEFI/gui/menu_items/menu_items.h b/rEFIt_UEFI/gui/menu_items/menu_items.h index a7e739924..1af74a5a2 100644 --- a/rEFIt_UEFI/gui/menu_items/menu_items.h +++ b/rEFIt_UEFI/gui/menu_items/menu_items.h @@ -500,9 +500,9 @@ class REFIT_ABSTRACT_MENU_ENTRY void DelegateKernelPatches(); BOOLEAN checkOSBundleRequired(const TagDict* dict); - void getKextPlist(const SIDELOAD_KEXT& KextEntry, BOOLEAN* NoContents, XStringW* plist ); + XStringW getKextPlist(const XStringW& dirPath, const SIDELOAD_KEXT& KextEntry, BOOLEAN* NoContents); TagDict* getInfoPlist(const XStringW& infoPlistPath); - void getKextExecPath(const SIDELOAD_KEXT& KextEntry, TagDict* dict, BOOLEAN NoContents, XStringW* exec ); + XString8 getKextExecPath(const XStringW& dirPath, const SIDELOAD_KEXT& KextEntry, TagDict* dict, BOOLEAN NoContents); } ; diff --git a/rEFIt_UEFI/refit/main.cpp b/rEFIt_UEFI/refit/main.cpp index 5a655a827..b3a7006ad 100644 --- a/rEFIt_UEFI/refit/main.cpp +++ b/rEFIt_UEFI/refit/main.cpp @@ -1102,7 +1102,9 @@ DBG("Beginning OC\n"); OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->MinKernel, ""); OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->Identifier, ""); - XString8 bundlePath = S8Printf("%ls\\%ls\\%ls", selfOem.getKextsPathRelToSelfDir().wc_str(), KextEntry.KextDirNameUnderOEMPath.wc_str(), KextEntry.FileName.wc_str()); + XStringW dirPath = SWPrintf("%ls\\%ls", selfOem.getKextsPathRelToSelfDir().wc_str(), KextEntry.KextDirNameUnderOEMPath.wc_str()); +// XString8 bundlePath = S8Printf("%ls\\%ls\\%ls", selfOem.getKextsPathRelToSelfDir().wc_str(), KextEntry.KextDirNameUnderOEMPath.wc_str(), KextEntry.FileName.wc_str()); + XString8 bundlePath = S8Printf("%ls\\%ls", dirPath.wc_str(), KextEntry.FileName.wc_str()); if ( FileExists(&self.getCloverDir(), bundlePath) ) { OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath, bundlePath.c_str()); }else{ @@ -1110,10 +1112,9 @@ DBG("Beginning OC\n"); } #if 1 //CFBundleExecutable - BOOLEAN NoContents = FALSE; - XStringW infoPlistPath = L""_XSW; - getKextPlist(KextEntry, &NoContents, &infoPlistPath); - TagDict* dict = getInfoPlist(infoPlistPath); + BOOLEAN NoContents = FALSE; + XStringW infoPlistPath = getKextPlist(dirPath, KextEntry, &NoContents); //it will be fullPath, including dir + TagDict* dict = getInfoPlist(infoPlistPath); BOOLEAN inject = checkOSBundleRequired(dict); if (inject) { if ( infoPlistPath.notEmpty()) { @@ -1125,10 +1126,10 @@ DBG("Beginning OC\n"); }else{ DBG("Cannot find kext info.plist at '%ls'\n", KextEntry.FileName.wc_str()); } - XStringW execpath; - getKextExecPath(KextEntry, dict, NoContents, &execpath); + XString8 execpath = getKextExecPath(dirPath, KextEntry, dict, NoContents); if (execpath.notEmpty()) { - OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ExecutablePath, S8Printf("%ls", execpath.wc_str()).c_str()); + OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ExecutablePath, execpath.c_str()); + DBG("assign executable as '%s'\n", execpath.c_str()); } }