@@ -186,17 +186,16 @@ static inline u8 *getCfgOffsets(u8 *code, u32 size, u32 *CFGUHandleOffset)
186186
187187 for (u8 * CFGU_GetConfigInfoBlk2_endPos = code ; CFGU_GetConfigInfoBlk2_endPos <= code + size - 12 ; CFGU_GetConfigInfoBlk2_endPos += 4 )
188188 {
189- static const u32 CFGU_GetConfigInfoBlk2_endPattern [] = {0xE8BD8010 , 0x00010082 };
190-
191189 //There might be multiple implementations of GetConfigInfoBlk2 but let's search for the one we want
192190 u32 * cmp = (u32 * )CFGU_GetConfigInfoBlk2_endPos ;
193191
194- if (cmp [0 ] != CFGU_GetConfigInfoBlk2_endPattern [ 0 ] || cmp [1 ] != CFGU_GetConfigInfoBlk2_endPattern [ 1 ] ) continue ;
192+ if (cmp [0 ] != 0xE8BD8010 || cmp [1 ] != 0x00010082 ) continue ;
195193
196194 for (u32 i = 0 ; i < n ; i ++ )
197195 if (possible [i ] == cmp [2 ])
198196 {
199197 * CFGUHandleOffset = cmp [2 ];
198+
200199 return CFGU_GetConfigInfoBlk2_endPos ;
201200 }
202201
@@ -256,14 +255,12 @@ static inline void patchCfgGetRegion(u8 *code, u32 size, u8 regionId, u32 CFGUHa
256255{
257256 for (u8 * cmdPos = code ; cmdPos <= code + size - 28 ; cmdPos += 4 )
258257 {
259- static const u32 cfgSecureInfoGetRegionCmdPattern [] = {0xEE1D0F70 , 0xE3A00802 };
260-
261258 u32 * cmp = (u32 * )cmdPos ;
262259
263- if (* cmp != cfgSecureInfoGetRegionCmdPattern [ 1 ] ) continue ;
260+ if (* cmp != 0xE3A00802 ) continue ;
264261
265262 for (u32 i = 1 ; i < 3 ; i ++ )
266- if ((* (cmp - i ) & 0xFFFF0FFF ) == cfgSecureInfoGetRegionCmdPattern [ 0 ] && * ((u16 * )cmdPos + 5 ) == 0xE59F &&
263+ if ((* (cmp - i ) & 0xFFFF0FFF ) == 0xEE1D0F70 && * ((u16 * )cmdPos + 5 ) == 0xE59F &&
267264 * (u32 * )(cmdPos + 16 + * ((u16 * )cmdPos + 4 )) == CFGUHandleOffset )
268265 {
269266 cmp [3 ] = 0xE3A00000 | regionId ; //mov r0, =regionId
@@ -290,37 +287,45 @@ static u32 findFunctionStart(u8 *code, u32 pos)
290287
291288static inline bool findLayeredFsSymbols (u8 * code , u32 size , u32 * fsMountArchive , u32 * fsRegisterArchive , u32 * fsTryOpenFile , u32 * fsOpenFileDirectly )
292289{
290+ u32 found = 0 ,
291+ * temp = NULL ;
292+
293293 for (u32 addr = 0 ; addr <= size - 4 ; addr += 4 )
294294 {
295- if ( * fsMountArchive == 0xFFFFFFFF )
295+ switch ( * ( u32 * )( code + addr ) )
296296 {
297- if (addr <= size - 12 && * (u32 * )(code + addr ) == 0xE5970010 )
298- {
299- if ((* (u32 * )(code + addr + 4 ) == 0xE1CD20D8 ) && ((* (u32 * )(code + addr + 8 ) & 0xFFFFFF ) == 0x008D0000 ))
300- * fsMountArchive = findFunctionStart (code , addr );
301- }
302- else if (addr <= size - 16 && * (u32 * )(code + addr ) == 0xE24DD028 )
303- {
304- if ((* (u32 * )(code + addr + 4 ) == 0xE1A04000 ) && (* (u32 * )(code + addr + 8 ) == 0xE59F60A8 ) && (* (u32 * )(code + addr + 0xC ) == 0xE3A0C001 ))
305- * fsMountArchive = findFunctionStart (code , addr );
306- }
297+ case 0xE5970010 :
298+ if (addr <= size - 12 && * fsMountArchive == 0xFFFFFFFF && * (u32 * )(code + addr + 4 ) == 0xE1CD20D8 && (* (u32 * )(code + addr + 8 ) & 0xFFFFFF ) == 0x008D0000 ) temp = fsMountArchive ;
299+ break ;
300+ case 0xE24DD028 :
301+ if (addr <= size - 16 && * fsMountArchive == 0xFFFFFFFF && * (u32 * )(code + addr + 4 ) == 0xE1A04000 && * (u32 * )(code + addr + 8 ) == 0xE59F60A8 && * (u32 * )(code + addr + 0xC ) == 0xE3A0C001 ) temp = fsMountArchive ;
302+ break ;
303+ case 0xE3500008 :
304+ if (addr <= size - 12 && * fsRegisterArchive == 0xFFFFFFFF && (* (u32 * )(code + addr + 4 ) & 0xFFF00FF0 ) == 0xE1800400 && (* (u32 * )(code + addr + 8 ) & 0xFFF00FF0 ) == 0xE1800FC0 ) temp = fsRegisterArchive ;
305+ break ;
306+ case 0xE351003A :
307+ if (addr <= size - 0x40 && * fsTryOpenFile == 0xFFFFFFFF && * (u32 * )(code + addr + 4 ) == 0x1AFFFFFC && * (u32 * )(code + addr + 0x34 ) == 0xE590C000 && * (u32 * )(code + addr + 0x3C ) == 0xE12FFF3C ) temp = fsTryOpenFile ;
308+ break ;
309+ case 0x08030204 :
310+ if (* fsOpenFileDirectly == 0xFFFFFFFF ) temp = fsOpenFileDirectly ;
311+ break ;
307312 }
308313
309- if (addr <= size - 12 && * fsRegisterArchive == 0xFFFFFFFF && * (u32 * )(code + addr ) == 0xE3500008 &&
310- (* (u32 * )(code + addr + 4 ) & 0xFFF00FF0 ) == 0xE1800400 && (* (u32 * )(code + addr + 8 ) & 0xFFF00FF0 ) == 0xE1800FC0 )
311- * fsRegisterArchive = findFunctionStart (code , addr );
312-
313- if (addr <= size - 0x40 && * fsTryOpenFile == 0xFFFFFFFF && * (u32 * )(code + addr + 4 ) == 0x1AFFFFFC && * (u32 * )(code + addr ) == 0xE351003A &&
314- * (u32 * )(code + addr + 0x34 ) == 0xE590C000 && * (u32 * )(code + addr + 0x3C ) == 0xE12FFF3C )
315- * fsTryOpenFile = findFunctionStart (code , addr );
314+ if (temp != NULL )
315+ {
316+ * temp = findFunctionStart (code , addr );
316317
317- if (* fsOpenFileDirectly == 0xFFFFFFFF && * (u32 * )(code + addr ) == 0x08030204 )
318- * fsOpenFileDirectly = findFunctionStart (code , addr );
318+ if (* temp != 0xFFFFFFFF )
319+ {
320+ found ++ ;
321+ if (found == 4 ) break ;
322+ }
319323
320- if (* fsMountArchive != 0xFFFFFFFF && * fsRegisterArchive != 0xFFFFFFFF && * fsTryOpenFile != 0xFFFFFFFF && * fsOpenFileDirectly != 0xFFFFFFFF ) return true;
324+ temp = NULL ;
325+ }
321326 }
322327
323- return false ;
328+ return found == 4 ;
324329}
325330
326331static inline bool findLayeredFsPayloadOffset (u8 * code , u32 size , u32 * payloadOffset )
@@ -476,33 +481,33 @@ static inline bool loadTitleLocaleConfig(u64 progId, u8 *regionId, u8 *languageI
476481
477482 if (R_FAILED (IFile_Read (& file , & total , buf , fileSize ))) goto exit ;
478483
479- u32 i ,
480- j ;
484+ static const char * regions [] = { "JPN" , "USA" , "EUR" , "AUS" , "CHN" , "KOR" , "TWN" } ,
485+ * languages [] = { "JP" , "EN" , "FR" , "DE" , "IT" , "ES" , "ZH" , "KO" , "NL" , "PT" , "RU" , "TW" } ;
481486
482- for (i = 0 ; i < 7 ; i ++ )
483- {
484- static const char * regions [] = {"JPN" , "USA" , "EUR" , "AUS" , "CHN" , "KOR" , "TWN" };
487+ u32 i ;
485488
489+ for (i = 0 ; i < sizeof (regions ) / sizeof (char * ); i ++ )
490+ {
486491 if (memcmp (buf , regions [i ], 3 ) == 0 )
487492 {
488493 * regionId = (u8 )i ;
489494 break ;
490495 }
491496 }
492497
493- for ( j = 0 ; j < 12 ; j ++ )
498+ if ( i != sizeof ( regions ) / sizeof ( char * ) )
494499 {
495- static const char * languages [] = {"JP" , "EN" , "FR" , "DE" , "IT" , "ES" , "ZH" , "KO" , "NL" , "PT" , "RU" , "TW" };
496-
497- if (memcmp (buf + 4 , languages [j ], 2 ) == 0 )
500+ for (i = 0 ; i < sizeof (languages ) / sizeof (char * ); i ++ )
498501 {
499- * languageId = (u8 )j ;
500- break ;
502+ if (memcmp (buf + 4 , languages [i ], 2 ) == 0 )
503+ {
504+ * languageId = (u8 )i ;
505+ ret = true;
506+ break ;
507+ }
501508 }
502509 }
503510
504- ret = i != 7 && j != 12 ;
505-
506511exit :
507512 IFile_Close (& file );
508513
@@ -553,7 +558,7 @@ static inline bool patchLayeredFs(u64 progId, u8 *code, u32 size, u32 textSize)
553558 u32 * payload32 = (u32 * )payload ;
554559 for (u32 i = 0 ; i < romfsredir_bin_size / 4 ; i ++ )
555560 {
556- switch (payload32 [i ])
561+ switch (payload32 [i ])
557562 {
558563 case 0xdead0000 :
559564 payload32 [i ] = * (u32 * )(code + fsOpenFileDirectly );
0 commit comments