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.
This commit is contained in:
parent
ee9f283d4d
commit
eb6d8523d1
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
},
|
||||
@ -862,11 +863,19 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
|
||||
}
|
||||
|
||||
if(CONFIG(PATCHGAMES))
|
||||
{
|
||||
bool isApp = ((progId >> 32) & ~0x12) == 0x00040000;
|
||||
bool isApplet = (progId >> 32) == 0x00040030;
|
||||
bool isSysmodule = (progId >> 32) == 0x00040130;
|
||||
|
||||
bool shouldPatchIps = !isSysmodule || (isSysmodule && CONFIG(LOADEXTFIRMSANDMODULES));
|
||||
if (shouldPatchIps)
|
||||
{
|
||||
if(!patcherApplyCodeBpsPatch(progId, code, size)) goto error;
|
||||
if(!applyCodeIpsPatch(progId, code, size)) goto error;
|
||||
}
|
||||
|
||||
if((u32)((progId >> 0x20) & 0xFFFFFFEDULL) == 0x00040000 || isHomeMenu)
|
||||
if(isApp || isApplet)
|
||||
{
|
||||
u8 mask,
|
||||
regionId,
|
||||
|
Loading…
x
Reference in New Issue
Block a user