@@ -289,7 +289,7 @@ static u32 findFunctionStart(u8* code, u32 pos)
289
289
return 0xFFFFFFFF ;
290
290
}
291
291
292
- static bool findLayeredFsSymbols (u8 * code , u32 size , u32 * fsMountArchive , u32 * fsRegisterArchive , u32 * fsTryOpenFile , u32 * fsOpenFileDirectly )
292
+ static inline bool findLayeredFsSymbols (u8 * code , u32 size , u32 * fsMountArchive , u32 * fsRegisterArchive , u32 * fsTryOpenFile , u32 * fsOpenFileDirectly )
293
293
{
294
294
for (u32 addr = 0 ; addr <= size - 4 ; addr += 4 )
295
295
{
@@ -324,17 +324,19 @@ static bool findLayeredFsSymbols(u8* code, u32 size, u32 *fsMountArchive, u32 *f
324
324
return false;
325
325
}
326
326
327
- static bool findLayeredFsPayloadOffset (u8 * code , u32 text_size , u32 * payload_offset ) {
328
- // First check for sufficient padding at the end of the .text segment
329
- if (((text_size + 4095 ) & 0xfffff000 ) - text_size >= romfsredir_bin_size ) {
330
- * payload_offset = text_size ;
327
+ static inline bool findLayeredFsPayloadOffset (u8 * code , u32 textSize , u32 * payloadOffset )
328
+ {
329
+ //First check for sufficient padding at the end of the .text segment
330
+ if (((textSize + 4095 ) & 0xfffff000 ) - textSize >= romfsredir_bin_size )
331
+ {
332
+ * payloadOffset = textSize ;
331
333
return true;
332
334
}
333
335
334
- // If there isn't enough padding look for the "throwFatalError" function to replace
336
+ //If there isn't enough padding look for the "throwFatalError" function to replace
335
337
u32 svcConnectToPort = 0xFFFFFFFF ;
336
338
337
- for (u32 addr = 4 ; svcConnectToPort == 0xFFFFFFFF && addr <= text_size - 4 ; addr += 4 )
339
+ for (u32 addr = 4 ; svcConnectToPort == 0xFFFFFFFF && addr <= textSize - 4 ; addr += 4 )
338
340
{
339
341
if (* (u32 * )(code + addr ) == 0xEF00002D )
340
342
svcConnectToPort = addr - 4 ;
@@ -344,18 +346,19 @@ static bool findLayeredFsPayloadOffset(u8* code, u32 text_size, u32* payload_off
344
346
{
345
347
u32 func = 0xFFFFFFFF ;
346
348
347
- for (u32 i = 4 ; func == 0xFFFFFFFF && i <= text_size - 4 ; i += 4 )
349
+ for (u32 i = 4 ; func == 0xFFFFFFFF && i <= textSize - 4 ; i += 4 )
348
350
{
349
351
if (* (u32 * )(code + i ) != MAKE_BRANCH_LINK (i , svcConnectToPort )) continue ;
350
352
351
353
func = findFunctionStart (code , i );
352
354
353
- for (u32 pos = func + 4 ; func != 0xFFFFFFFF && pos <= text_size - 4 && * (u16 * )(code + pos + 2 ) != 0xE92D ; pos += 4 )
355
+ for (u32 pos = func + 4 ; func != 0xFFFFFFFF && pos <= textSize - 4 && * (u16 * )(code + pos + 2 ) != 0xE92D ; pos += 4 )
354
356
if (* (u32 * )(code + pos ) == 0xE200167E ) func = 0xFFFFFFFF ;
355
357
}
356
358
357
- if (func != 0xFFFFFFFF ) {
358
- * payload_offset = func ;
359
+ if (func != 0xFFFFFFFF )
360
+ {
361
+ * payloadOffset = func ;
359
362
return true;
360
363
}
361
364
}
@@ -505,7 +508,7 @@ static inline bool loadTitleLocaleConfig(u64 progId, u8 *regionId, u8 *languageI
505
508
return ret ;
506
509
}
507
510
508
- static inline bool patchLayeredFs (u64 progId , u8 * code , u32 size , u32 text_size )
511
+ static inline bool patchLayeredFs (u64 progId , u8 * code , u32 size , u32 textSize )
509
512
{
510
513
/* Here we look for "/luma/titles/[u64 titleID in hex, uppercase]/romfs"
511
514
If it exists it should be a folder containing ROMFS files */
@@ -522,14 +525,14 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size, u32 text_size)
522
525
u32 fsMountArchive = 0xFFFFFFFF ,
523
526
fsRegisterArchive = 0xFFFFFFFF ,
524
527
fsTryOpenFile = 0xFFFFFFFF ,
525
- fsOpenFileDirectly = 0xFFFFFFFF ;
528
+ fsOpenFileDirectly = 0xFFFFFFFF ,
529
+ payloadOffset ;
526
530
527
- if (!findLayeredFsSymbols (code , size , & fsMountArchive , & fsRegisterArchive , & fsTryOpenFile , & fsOpenFileDirectly )) return false;
531
+ if (!findLayeredFsSymbols (code , size , & fsMountArchive , & fsRegisterArchive , & fsTryOpenFile , & fsOpenFileDirectly ) ||
532
+ !findLayeredFsPayloadOffset (code , textSize , & payloadOffset )) return false;
528
533
529
534
//Setup the payload
530
- u32 payload_offset ;
531
- if (!findLayeredFsPayloadOffset (code , text_size , & payload_offset )) return false;
532
- u8 * payload = code + payload_offset ;
535
+ u8 * payload = code + payloadOffset ;
533
536
memcpy (payload , romfsredir_bin , romfsredir_bin_size );
534
537
535
538
//Insert symbols in the payload
@@ -542,13 +545,13 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size, u32 text_size)
542
545
payload32 [i ] = * (u32 * )(code + fsOpenFileDirectly );
543
546
break ;
544
547
case 0xdead0001 :
545
- payload32 [i ] = MAKE_BRANCH (payload_offset + i * 4 , fsOpenFileDirectly + 4 );
548
+ payload32 [i ] = MAKE_BRANCH (payloadOffset + i * 4 , fsOpenFileDirectly + 4 );
546
549
break ;
547
550
case 0xdead0002 :
548
551
payload32 [i ] = * (u32 * )(code + fsTryOpenFile );
549
552
break ;
550
553
case 0xdead0003 :
551
- payload32 [i ] = MAKE_BRANCH (payload_offset + i * 4 , fsTryOpenFile + 4 );
554
+ payload32 [i ] = MAKE_BRANCH (payloadOffset + i * 4 , fsTryOpenFile + 4 );
552
555
break ;
553
556
case 0xdead0004 :
554
557
memcpy (payload32 + i , mount , 5 );
@@ -570,13 +573,13 @@ static inline bool patchLayeredFs(u64 progId, u8* code, u32 size, u32 text_size)
570
573
}
571
574
572
575
//Place the hooks
573
- * (u32 * )(code + fsOpenFileDirectly ) = MAKE_BRANCH (fsOpenFileDirectly , payload_offset );
574
- * (u32 * )(code + fsTryOpenFile ) = MAKE_BRANCH (fsTryOpenFile , payload_offset + 12 );
576
+ * (u32 * )(code + fsOpenFileDirectly ) = MAKE_BRANCH (fsOpenFileDirectly , payloadOffset );
577
+ * (u32 * )(code + fsTryOpenFile ) = MAKE_BRANCH (fsTryOpenFile , payloadOffset + 12 );
575
578
576
579
return true;
577
580
}
578
581
579
- void patchCode (u64 progId , u16 progVer , u8 * code , u32 size , u32 text_size )
582
+ void patchCode (u64 progId , u16 progVer , u8 * code , u32 size , u32 textSize )
580
583
{
581
584
loadCFWInfo ();
582
585
@@ -838,7 +841,7 @@ void patchCode(u64 progId, u16 progVer, u8 *code, u32 size, u32 text_size)
838
841
if (!loadTitleCodeSection (progId , code , size ) ||
839
842
!applyCodeIpsPatch (progId , code , size ) ||
840
843
!loadTitleLocaleConfig (progId , & regionId , & languageId ) ||
841
- !patchLayeredFs (progId , code , size , text_size )) goto error ;
844
+ !patchLayeredFs (progId , code , size , textSize )) goto error ;
842
845
843
846
if (regionId != 0xFF )
844
847
{
0 commit comments