This repository has been archived on 2022-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
Luma3DS-3GX/sysmodules/loader/source/romfsredir.s

131 lines
4.0 KiB
ArmAsm
Raw Normal View History

@ Patch by delebile
.section .data.romfsRedirPatch, "aw", %progbits
.align 4
.global romfsRedirPatch
romfsRedirPatch:
@ Jumps here before the fsOpenFileDirectly call
_mountArchive:
b mountArchive
.global romfsRedirPatchSubstituted1
romfsRedirPatchSubstituted1:
.word 0xdead0000 @ Substituted opcode
.global romfsRedirPatchHook1
romfsRedirPatchHook1:
.word 0xdead0001 @ Branch to hooked function
@ Jumps here before every iFileOpen call
_fsRedir:
b fsRedir
.global romfsRedirPatchSubstituted2
romfsRedirPatchSubstituted2:
.word 0xdead0002 @ Substituted opcode
.global romfsRedirPatchHook2
romfsRedirPatchHook2:
.word 0xdead0002 @ Branch to hooked function
@ Mounts the archive and registers it as 'lf:'
mountArchive:
cmp r3, #3
bne romfsRedirPatchSubstituted1
stmfd sp!, {r0-r4, lr}
sub sp, sp, #4
adr r1, romfsRedirPatchArchiveId
mov r0, sp
ldr r4, romfsRedirPatchFsMountArchive
blx r4
mov r3, #0
mov r2, #0
ldr r1, [sp]
adr r0, romfsRedirPatchArchiveName
ldr r4, romfsRedirPatchFsRegisterArchive
blx r4
add sp, sp, #4
ldmfd sp!, {r0-r4, lr}
b romfsRedirPatchSubstituted1
@ Check the path passed to iFileOpen.
@ If it is trying to access a RomFS file, we try to
@ open it from the LayeredFS folder.
@ If the file cannot be opened, we just open
@ it from its original archive like nothing happened
fsRedir:
stmfd sp!, {r0-r12, lr}
adr r3, romfsRedirPatchRomFsMount
bl compare
adrne r3, romfsRedirPatchUpdateRomFsMount
blne compare
bne endRedir
sub sp, sp, #0x400
pathRedir:
stmfd sp!, {r0-r3}
add r0, sp, #0x10
ldr r3, romfsRedirPatchCustomPath
pathRedir_1:
ldrb r2, [r3], #1
cmp r2, #0
strneh r2, [r0], #2
bne pathRedir_1
pathRedir_2:
ldrh r2, [r1], #2
cmp r2, #0x3A @ ':'
bne pathRedir_2
@ Skip a slash if there are two after the mountpoint,
@ as some games mistakenly have those
ldrh r3, [r1, #2]
cmp r3, #0x2F @ '/'
pathRedir_3:
ldrh r2, [r1], #2
strneh r2, [r0], #2
cmp r2, #0
bne pathRedir_3
ldmfd sp!, {r0-r3}
mov r1, sp
bl romfsRedirPatchSubstituted2
add sp, sp, #0x400
cmp r0, #0
endRedir:
ldmfd sp!, {r0-r12, lr}
moveq r0, #0
bxeq lr
b romfsRedirPatchSubstituted2
compare:
mov r9, r1
add r10, r3, #4
loop:
ldrb r12, [r3], #1
ldrb r11, [r9], #2
cmp r11, r12
bxne lr
cmp r10, r3
bne loop
bx lr
.pool
.balign 4
.global romfsRedirPatchArchiveName
.global romfsRedirPatchFsMountArchive
.global romfsRedirPatchFsRegisterArchive
.global romfsRedirPatchArchiveId
.global romfsRedirPatchRomFsMount
.global romfsRedirPatchUpdateRomFsMount
.global romfsRedirPatchCustomPath
romfsRedirPatchArchiveName : .ascii "lf:\0"
romfsRedirPatchFsMountArchive : .word 0xdead0005
romfsRedirPatchFsRegisterArchive : .word 0xdead0006
romfsRedirPatchArchiveId : .word 0xdead0007
romfsRedirPatchRomFsMount : .ascii "rom:"
romfsRedirPatchUpdateRomFsMount : .word 0xdead0008
romfsRedirPatchCustomPath : .word 0xdead0004
_romfsRedirPatchEnd:
.global romfsRedirPatchSize
romfsRedirPatchSize:
.word _romfsRedirPatchEnd - romfsRedirPatch