lzss_decompress((u8 *)shared->text_addr + size);
}
- // Dump code section
- dump_code(progid, (u8 *)shared->text_addr, shared->total_size << 12);
+ // Load/Dump code section
+ sd_code(progid, (u8 *)shared->text_addr, shared->total_size << 12);
// Patch segments
patch_exe(progid, progver, (u8 *)shared->text_addr, shared->text_size << 12, original->text_size << 12, (u8 *)shared->data_addr, shared->data_size << 12,
}
void
-dump_code(u64 progId, u8 *code_loc, u32 code_len)
+sd_code(u64 progId, u8 *code_loc, u32 code_len)
{
- // If configuration was not loaded, or the option is disabled
- if (failed_load_config || !config.options[OPTION_LOADER_DUMPCODE])
+ // If configuration was not loaded, or both options (load / dump) are disabled
+ if (failed_load_config || (!config.options[OPTION_LOADER_DUMPCODE] && !config.options[OPTION_LOADER_LOADCODE]))
return;
u32 highTid = progId >> 0x20;
- // Only dump user titles unless the user is prepared for pain.
- if (highTid != 0x00040000 && highTid != 0x00040002 && !config.options[OPTION_LOADER_DUMPCODE_ALL])
- return;
-
char code_path[] = CODE_PATH;
u32 i = strlen(code_path) - 1;
Handle code_f;
+
while (progId) {
code_path[i--] = hexDigits[(u32)(progId & 0xF)];
progId >>= 4;
}
- if (!R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, code_path, FS_OPEN_READ)))
+ u32 len;
+
+ // Attempts to load code section from SD card, including system titles/modules/etc.
+ if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, code_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE])
+ {
+ FSFILE_Read(code_f, &len, 0, code_loc, code_len);
+ logstr(" loaded code from ");
+ logstr(code_path);
+ logstr("\n");
+ }
+
+ // Either system title with OPTION_LOADER_DUMPCODE_ALL enabled, or regular title
+ else if ( config.options[OPTION_LOADER_DUMPCODE] && ((highTid != 0x00040000 && highTid != 0x00040002 && config.options[OPTION_LOADER_DUMPCODE_ALL]) || (highTid == 0x00040000 || highTid == 0x00040002)))
{
- FSFILE_Close(code_f);
- if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, code_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) {
- u32 len = 0;
+ if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, code_path, FS_OPEN_WRITE | FS_OPEN_CREATE)))
+ {
FSFILE_Write(code_f, &len, 0, code_loc, code_len, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME);
logstr(" dumped code to ");
logstr(code_path);
logstr("\n");
}
+ else
+ {
+ FSFILE_Close(code_f);
+ return;
+ }
}
- // Code was already dumped, do nothing
FSFILE_Close(code_f);
-
return;
}
void patch_exe(u64 progId, u16 progver, u8 *text, u32 text_size, u32 orig_text, u8 *data, u32 data_size, u32 orig_data, u8 *ro, u32 ro_size, u32 orig_ro);
-void dump_code(u64 progId, u8 *code_loc, u32 code_len);
+void sd_code(u64 progId, u8 *code_loc, u32 code_len);
u32 get_text_extend(u64 progId, u16 progver, u32 size_orig);
u32 get_ro_extend(u64 progId, u16 progver, u32 size_orig);
// Dump *all* code, from system applications, modules, etc. You'll be sitting around for about five minutes.
#define OPTION_LOADER_DUMPCODE_ALL 20
+// Load *all* code sections. This is intended for big patches that are currently not implementable and quick testing.
+#define OPTION_LOADER_LOADCODE 21
+
// Save log files during boot and from loader.
// This will slow things down a bit.
#define OPTION_SAVE_LOGS 253
{ OPTION_LOADER_CPU_L2, " CPU - L2 cache (n3ds)", "Forces the system to use the L2 cache. Ignored if not a N3DS.", boolean_val_n3ds, 0, 0 },
{ OPTION_LOADER_CPU_800MHZ, " CPU - 800Mhz (n3ds)", "Forces the system to run in 800Mhz mode. Ignored if not a N3DS.", boolean_val_n3ds, 0, 0 },
{ OPTION_LOADER_LANGEMU, " Language Emulation", "Reads language emulation configuration and imitates the region/language.", boolean_val, 0, 0 },
+
+ { OPTION_LOADER_LOADCODE, " Load Code Sections", "Loads code sections from SD card and patches afterwards.", boolean_val, 0, 0 },
{ OPTION_LOADER_DUMPCODE, " Dump Title Code Sections",
"Dumps code sections for titles to SD card the first time they're loaded. Slows things down considerably.", boolean_val,