Instead of filtering mountpoints in the LayeredFS payload by their first letters, change known mountpoints not starting with "r" to start with "r" throughout the code

This commit is contained in:
Aurora Wright 2017-04-28 00:33:30 +02:00
parent c7e7dd8248
commit db33c315f2
2 changed files with 19 additions and 7 deletions

View File

@ -54,8 +54,6 @@ _start:
stmfd sp!, {r0-r12, lr} stmfd sp!, {r0-r12, lr}
ldrb r12, [r1] ldrb r12, [r1]
cmp r12, #0x72 ; 'r', should include "rom:", "rom2:" and "rex:" cmp r12, #0x72 ; 'r', should include "rom:", "rom2:" and "rex:"
cmpne r12, #0x70 ; 'p', should include "patch:"
cmpne r12, #0x65 ; 'e', should include "ext:"
bne endRedir bne endRedir
sub sp, sp, #0x400 sub sp, sp, #0x400
pathRedir: pathRedir:

View File

@ -13,7 +13,7 @@ static u32 patchMemory(u8 *start, u32 size, const void *pattern, u32 patSize, in
{ {
u32 i; u32 i;
for(i = 0; i < count; i++) for(i = 0; !count || i < count; i++)
{ {
u8 *found = memsearch(start, pattern, size, patSize); u8 *found = memsearch(start, pattern, size, patSize);
@ -510,7 +510,7 @@ exit:
return ret; return ret;
} }
static inline bool patchLayeredFs(u64 progId, u8 *code, u32 size) static inline bool patchLayeredFs(u64 progId, u8 *code, u32 size, u32 textSize)
{ {
/* Here we look for "/luma/titles/[u64 titleID in hex, uppercase]/romfs" /* Here we look for "/luma/titles/[u64 titleID in hex, uppercase]/romfs"
If it exists it should be a folder containing ROMFS files */ If it exists it should be a folder containing ROMFS files */
@ -530,8 +530,22 @@ static inline bool patchLayeredFs(u64 progId, u8 *code, u32 size)
fsOpenFileDirectly = 0xFFFFFFFF, fsOpenFileDirectly = 0xFFFFFFFF,
payloadOffset; payloadOffset;
if(!findLayeredFsSymbols(code, size, &fsMountArchive, &fsRegisterArchive, &fsTryOpenFile, &fsOpenFileDirectly) || if(!findLayeredFsSymbols(code, textSize, &fsMountArchive, &fsRegisterArchive, &fsTryOpenFile, &fsOpenFileDirectly) ||
!findLayeredFsPayloadOffset(code, size, &payloadOffset)) return false; !findLayeredFsPayloadOffset(code, textSize, &payloadOffset)) return false;
static const char *updateRomFsMounts[] = { "patch:",
"ext:" };
//Change update RomFS mountpoints to start with "r"
for(u32 i = 0, ret = 0; i < sizeof(updateRomFsMounts) / sizeof(char *) && !ret; i++)
{
ret = patchMemory(code, size,
updateRomFsMounts[i],
strnlen(updateRomFsMounts[i], 255), 0,
"r",
1, 0
);
}
//Setup the payload //Setup the payload
u8 *payload = code + payloadOffset; u8 *payload = code + payloadOffset;
@ -840,7 +854,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 textSize, u32 ro
if(!loadTitleCodeSection(progId, code, size) || if(!loadTitleCodeSection(progId, code, size) ||
!applyCodeIpsPatch(progId, code, size) || !applyCodeIpsPatch(progId, code, size) ||
!loadTitleLocaleConfig(progId, &regionId, &languageId) || !loadTitleLocaleConfig(progId, &regionId, &languageId) ||
!patchLayeredFs(progId, code, textSize)) goto error; !patchLayeredFs(progId, code, size, textSize)) goto error;
if(regionId != 0xFF) if(regionId != 0xFF)
{ {