mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-23 11:35:19 +01:00
search info and exec pathes
Signed-off-by: SergeySlice <sergey.slice@gmail.com>
This commit is contained in:
parent
1bb8b0dd34
commit
22f694d2da
@ -103,7 +103,7 @@ void toLowerStr(CHAR8 *tstr, IN CONST CHAR8 *str) {
|
|||||||
*tstr = '\0';
|
*tstr = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN checkOSBundleRequired(UINT8 loaderType, const TagDict* dict)
|
BOOLEAN LOADER_ENTRY::checkOSBundleRequired(const TagDict* dict)
|
||||||
{
|
{
|
||||||
BOOLEAN inject = TRUE;
|
BOOLEAN inject = TRUE;
|
||||||
const TagStruct* osBundleRequiredTag;
|
const TagStruct* osBundleRequiredTag;
|
||||||
@ -115,8 +115,8 @@ BOOLEAN checkOSBundleRequired(UINT8 loaderType, const TagDict* dict)
|
|||||||
osbundlerequired.lowerAscii();
|
osbundlerequired.lowerAscii();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OSTYPE_IS_OSX_RECOVERY(loaderType) ||
|
if (OSTYPE_IS_OSX_RECOVERY(LoaderType) ||
|
||||||
OSTYPE_IS_OSX_INSTALLER(loaderType)) {
|
OSTYPE_IS_OSX_INSTALLER(LoaderType)) {
|
||||||
if ( osbundlerequired != "root"_XS8 &&
|
if ( osbundlerequired != "root"_XS8 &&
|
||||||
osbundlerequired != "local"_XS8 &&
|
osbundlerequired != "local"_XS8 &&
|
||||||
osbundlerequired != "console"_XS8 &&
|
osbundlerequired != "console"_XS8 &&
|
||||||
@ -131,6 +131,82 @@ BOOLEAN checkOSBundleRequired(UINT8 loaderType, const TagDict* dict)
|
|||||||
//extern void KernelAndKextPatcherInit(IN LOADER_ENTRY *Entry);
|
//extern void KernelAndKextPatcherInit(IN LOADER_ENTRY *Entry);
|
||||||
//extern void AnyKextPatch(UINT8 *Driver, UINT32 DriverSize, CHAR8 *InfoPlist, UINT32 InfoPlistSize, INT32 N, 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)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (EFI_ERROR(Status)) {
|
||||||
|
//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)) {
|
||||||
|
MsgLog("Failed to load extra kext : %ls status=%s\n", TempName.wc_str(), efiStrError(Status));
|
||||||
|
return; // L""_XSW;
|
||||||
|
}
|
||||||
|
*NoContents = TRUE;
|
||||||
|
} else {
|
||||||
|
*NoContents = FALSE;
|
||||||
|
}
|
||||||
|
*OutName = TempName;
|
||||||
|
return; // &TempName;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TagDict* dict = getInfoPlist(infoPlistPath);
|
||||||
|
TagDict* LOADER_ENTRY::getInfoPlist(const XStringW& infoPlistPath)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT8* infoDictBuffer = NULL;
|
||||||
|
UINTN infoDictBufferLength = 0;
|
||||||
|
TagDict* dict = NULL;
|
||||||
|
|
||||||
|
Status = egLoadFile(SelfVolume->RootDir, 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());
|
||||||
|
dict = NULL;
|
||||||
|
}
|
||||||
|
FreePool(infoDictBuffer);
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//XStringW execpath = getKextExecPath(KextEntry, dict);
|
||||||
|
void LOADER_ENTRY::getKextExecPath(const SIDELOAD_KEXT& KextEntry, TagDict* dict, BOOLEAN NoContents, OUT XStringW* OutName)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
const TagStruct* prop = NULL;
|
||||||
|
XStringW TempName = L""_XSW;
|
||||||
|
UINT8* executableFatBuffer = NULL;
|
||||||
|
UINTN executableBufferLength = 0;
|
||||||
|
|
||||||
|
prop = dict->propertyForKey("CFBundleExecutable");
|
||||||
|
if( prop != NULL && prop->isString() && prop->getString()->stringValue().notEmpty() ) {
|
||||||
|
XString8 Executable = prop->getString()->stringValue();
|
||||||
|
if (NoContents) {
|
||||||
|
TempName = SWPrintf("%ls\\%s", KextEntry.FileName.wc_str(), Executable.c_str());
|
||||||
|
} else {
|
||||||
|
TempName = SWPrintf("%ls\\Contents\\MacOS\\%s", KextEntry.FileName.wc_str(), Executable.c_str());
|
||||||
|
}
|
||||||
|
Status = egLoadFile(SelfVolume->RootDir, TempName.wc_str(), &executableFatBuffer, &executableBufferLength);
|
||||||
|
if (EFI_ERROR(Status)) {
|
||||||
|
MsgLog("Failed to load kext executable: %ls\n", KextEntry.FileName.wc_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*OutName = TempName;
|
||||||
|
}
|
||||||
|
return; //no executable
|
||||||
|
}
|
||||||
|
|
||||||
|
//it seems no more used? Or???
|
||||||
EFI_STATUS LOADER_ENTRY::LoadKext(const EFI_FILE *RootDir, const XString8& FileName, IN cpu_type_t archCpuType, IN OUT void *kext_v)
|
EFI_STATUS LOADER_ENTRY::LoadKext(const EFI_FILE *RootDir, const XString8& FileName, IN cpu_type_t archCpuType, IN OUT void *kext_v)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -168,7 +244,7 @@ EFI_STATUS LOADER_ENTRY::LoadKext(const EFI_FILE *RootDir, const XString8& FileN
|
|||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
inject = checkOSBundleRequired(LoaderType, dict);
|
inject = checkOSBundleRequired(dict);
|
||||||
if(!inject) {
|
if(!inject) {
|
||||||
MsgLog("Skipping kext injection by OSBundleRequired : %s\n", FileName.c_str());
|
MsgLog("Skipping kext injection by OSBundleRequired : %s\n", FileName.c_str());
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
|
@ -498,6 +498,11 @@ class REFIT_ABSTRACT_MENU_ENTRY
|
|||||||
virtual LOADER_ENTRY* getLOADER_ENTRY() { return this; };
|
virtual LOADER_ENTRY* getLOADER_ENTRY() { return this; };
|
||||||
LOADER_ENTRY* SubMenuKextInjectMgmt();
|
LOADER_ENTRY* SubMenuKextInjectMgmt();
|
||||||
void DelegateKernelPatches();
|
void DelegateKernelPatches();
|
||||||
|
|
||||||
|
BOOLEAN checkOSBundleRequired(const TagDict* dict);
|
||||||
|
void getKextPlist(const SIDELOAD_KEXT& KextEntry, BOOLEAN* NoContents, XStringW* plist );
|
||||||
|
TagDict* getInfoPlist(const XStringW& infoPlistPath);
|
||||||
|
void getKextExecPath(const SIDELOAD_KEXT& KextEntry, TagDict* dict, BOOLEAN NoContents, XStringW* exec );
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -735,11 +735,11 @@ MsgLog("debugStartImageWithOC\n");
|
|||||||
for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
|
for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
|
||||||
EFI_DEVICE_PATH_PROTOCOL* DevicePath = DevicePathFromHandle(Handles[HandleIndex]);
|
EFI_DEVICE_PATH_PROTOCOL* DevicePath = DevicePathFromHandle(Handles[HandleIndex]);
|
||||||
CHAR16* UnicodeDevicePath = ConvertDevicePathToText(DevicePath, FALSE, FALSE);
|
CHAR16* UnicodeDevicePath = ConvertDevicePathToText(DevicePath, FALSE, FALSE);
|
||||||
MsgLog("debugStartImageWithOC : path %ls\n", UnicodeDevicePath);
|
MsgLog("debugStartImageWithOC : path %ls\n", UnicodeDevicePath);
|
||||||
if ( StrCmp(devicePathToLookFor.wc_str(), UnicodeDevicePath) == 0 ) break;
|
if ( StrCmp(devicePathToLookFor.wc_str(), UnicodeDevicePath) == 0 ) break;
|
||||||
}
|
}
|
||||||
if ( HandleIndex < HandleCount )
|
if ( HandleIndex < HandleCount )
|
||||||
{
|
{
|
||||||
EFI_DEVICE_PATH_PROTOCOL* jfkImagePath = FileDevicePath(Handles[HandleIndex], L"\\System\\Library\\CoreServices\\boot.efi");
|
EFI_DEVICE_PATH_PROTOCOL* jfkImagePath = FileDevicePath(Handles[HandleIndex], L"\\System\\Library\\CoreServices\\boot.efi");
|
||||||
CHAR16* UnicodeDevicePath = ConvertDevicePathToText (jfkImagePath, FALSE, FALSE); (void)UnicodeDevicePath;
|
CHAR16* UnicodeDevicePath = ConvertDevicePathToText (jfkImagePath, FALSE, FALSE); (void)UnicodeDevicePath;
|
||||||
|
|
||||||
@ -1108,7 +1108,31 @@ DBG("Beginning OC\n");
|
|||||||
}else{
|
}else{
|
||||||
DBG("Cannot find kext bundlePath at '%s'\n", bundlePath.c_str());
|
DBG("Cannot find kext bundlePath at '%s'\n", bundlePath.c_str());
|
||||||
}
|
}
|
||||||
|
#if 1
|
||||||
|
//CFBundleExecutable
|
||||||
|
BOOLEAN NoContents = FALSE;
|
||||||
|
XStringW infoPlistPath = L""_XSW;
|
||||||
|
getKextPlist(KextEntry, &NoContents, &infoPlistPath);
|
||||||
|
TagDict* dict = getInfoPlist(infoPlistPath);
|
||||||
|
BOOLEAN inject = checkOSBundleRequired(dict);
|
||||||
|
if (inject) {
|
||||||
|
if ( infoPlistPath.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");
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
DBG("Cannot find kext info.plist at '%ls'\n", KextEntry.FileName.wc_str());
|
||||||
|
}
|
||||||
|
XStringW execpath;
|
||||||
|
getKextExecPath(KextEntry, dict, NoContents, &execpath);
|
||||||
|
if (execpath.notEmpty()) {
|
||||||
|
OC_STRING_ASSIGN(mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ExecutablePath, S8Printf("%ls", execpath.wc_str()).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
XStringW execpath = S8Printf("Contents\\MacOS\\%ls", KextEntry.FileName.subString(0, KextEntry.FileName.rindexOf(".")).wc_str());
|
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());
|
XStringW fullPath = SWPrintf("%s\\%ls", OC_BLOB_GET(&mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->BundlePath), execpath.wc_str());
|
||||||
if ( FileExists(&self.getCloverDir(), fullPath) ) {
|
if ( FileExists(&self.getCloverDir(), fullPath) ) {
|
||||||
@ -1120,10 +1144,12 @@ DBG("Beginning OC\n");
|
|||||||
}else{
|
}else{
|
||||||
DBG("Cannot find kext info.plist at '%ls'\n", infoPlistPath.wc_str());
|
DBG("Cannot find kext info.plist at '%ls'\n", infoPlistPath.wc_str());
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ImageData = NULL;
|
mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ImageData = NULL;
|
||||||
mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ImageDataSize = 0;
|
mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->ImageDataSize = 0;
|
||||||
mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistData = NULL;
|
mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistData = NULL;
|
||||||
mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistDataSize = 0;
|
mOpenCoreConfiguration.Kernel.Add.Values[kextIdx]->PlistDataSize = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//DelegateKernelPatches();
|
//DelegateKernelPatches();
|
||||||
|
Loading…
Reference in New Issue
Block a user