From eb6d8523d10d1591567e5edfd8a796a6cd142def Mon Sep 17 00:00:00 2001 From: TuxSH <1922548+TuxSH@users.noreply.github.com> Date: Sun, 22 Jan 2023 18:45:47 +0000 Subject: [PATCH] loader: enable layeredfs+locale emu for all applets Not tested (except for HM which is known to work). And restrict code.bin and exheader.bin to when *both* "external firm and modules" and "game patching" are enabled. --- sysmodules/loader/source/loader.c | 35 ++++++++++++++++++++++++++++-- sysmodules/loader/source/patcher.c | 19 +++++++++++----- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/sysmodules/loader/source/loader.c b/sysmodules/loader/source/loader.c index 9884f2d..617ba83 100644 --- a/sysmodules/loader/source/loader.c +++ b/sysmodules/loader/source/loader.c @@ -108,6 +108,11 @@ static Result allocateProgramMemoryWrapper(prog_addrs_t *mapped, const ExHeader_ return allocateProgramMemory(exhi, mapped->text_addr, mapped->total_size << 12); } +static inline bool IsSysmoduleId(u64 tid) +{ + return (tid >> 32) == 0x00040130; +} + static Result loadCode(const ExHeader_Info *exhi, u64 programHandle, const prog_addrs_t *mapped) { IFile file; @@ -120,7 +125,20 @@ static Result loadCode(const ExHeader_Info *exhi, u64 programHandle, const prog_ const ExHeader_CodeSetInfo *csi = &exhi->sci.codeset_info; bool isCompressed = csi->flags.compress_exefs_code; - if(!CONFIG(PATCHGAMES) || !loadTitleCodeSection(titleId, (u8 *)mapped->text_addr, (u64)mapped->total_size << 12)) + bool codeLoadedExternally = false; + if (CONFIG(PATCHGAMES)) + { + // Require both "load external FIRM & modules" and "patch games" for sysmodules + if (IsSysmoduleId(titleId)) + codeLoadedExternally = CONFIG(LOADEXTFIRMSANDMODULES); + else + codeLoadedExternally = true; + } + + if (codeLoadedExternally) + codeLoadedExternally = loadTitleCodeSection(titleId, (u8 *)mapped->text_addr, (u64)mapped->total_size << 12); + + if(!codeLoadedExternally) { archivePath.type = PATH_BINARY; archivePath.data = &programHandle; @@ -178,7 +196,20 @@ static Result GetProgramInfoImpl(ExHeader_Info *exheaderInfo, u64 programHandle) else { u64 originalTitleId = exheaderInfo->aci.local_caps.title_id; - if(CONFIG(PATCHGAMES) && loadTitleExheaderInfo(exheaderInfo->aci.local_caps.title_id, exheaderInfo)) + bool exhLoadedExternally = false; + if (CONFIG(PATCHGAMES)) + { + // Require both "load external FIRM & modules" and "patch games" for sysmodules + if (IsSysmoduleId(originalTitleId)) + exhLoadedExternally = CONFIG(LOADEXTFIRMSANDMODULES); + else + exhLoadedExternally = true; + } + + if (exhLoadedExternally) + exhLoadedExternally = loadTitleExheaderInfo(originalTitleId, exheaderInfo); + + if(exhLoadedExternally) exheaderInfo->aci.local_caps.title_id = originalTitleId; } diff --git a/sysmodules/loader/source/patcher.c b/sysmodules/loader/source/patcher.c index 1a4fdcb..a0216c6 100644 --- a/sysmodules/loader/source/patcher.c +++ b/sysmodules/loader/source/patcher.c @@ -746,7 +746,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro 0x00, 0x26 }; - //Disable SecureInfo signature check + //Disable SecureInfo signature check (redundant) if(!patchMemory(code, textSize, pattern, sizeof(pattern), 0, @@ -784,7 +784,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro 0x00, 0x00, 0xA0, 0xE3, 0x1E, 0xFF, 0x2F, 0xE1 //mov r0, #0; bx lr }; - //Disable CRR0 signature (RSA2048 with SHA256) check and CRO0/CRR0 SHA256 hash checks (section hashes, and hash table) + //Disable CRR0 signature (RSA2048 with SHA256) check (redundant) and CRO0/CRR0 SHA256 hash checks (section hashes, and hash table) if(!patchMemory(code, textSize, pattern, sizeof(pattern), -9, @@ -845,6 +845,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro else if((progId & ~0xF0000001ULL) == 0x0004013000001A02LL) //DSP, SAFE_FIRM DSP { + // This patch is redundant static const u8 pattern[] = { 0xE3, 0x10, 0x10, 0x80, 0xE2 }, @@ -863,10 +864,18 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro if(CONFIG(PATCHGAMES)) { - if(!patcherApplyCodeBpsPatch(progId, code, size)) goto error; - if(!applyCodeIpsPatch(progId, code, size)) goto error; + bool isApp = ((progId >> 32) & ~0x12) == 0x00040000; + bool isApplet = (progId >> 32) == 0x00040030; + bool isSysmodule = (progId >> 32) == 0x00040130; - if((u32)((progId >> 0x20) & 0xFFFFFFEDULL) == 0x00040000 || isHomeMenu) + bool shouldPatchIps = !isSysmodule || (isSysmodule && CONFIG(LOADEXTFIRMSANDMODULES)); + if (shouldPatchIps) + { + if(!patcherApplyCodeBpsPatch(progId, code, size)) goto error; + if(!applyCodeIpsPatch(progId, code, size)) goto error; + } + + if(isApp || isApplet) { u8 mask, regionId,