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:
parent
c7e7dd8248
commit
db33c315f2
@ -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:
|
||||||
|
@ -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, ®ionId, &languageId) ||
|
!loadTitleLocaleConfig(progId, ®ionId, &languageId) ||
|
||||||
!patchLayeredFs(progId, code, textSize)) goto error;
|
!patchLayeredFs(progId, code, size, textSize)) goto error;
|
||||||
|
|
||||||
if(regionId != 0xFF)
|
if(regionId != 0xFF)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user