From: chaoskagami Date: Sun, 12 Jun 2016 22:26:37 +0000 (-0400) Subject: Split text/data/ro loading in @Wolfvak's code X-Git-Tag: v0.0.10~21 X-Git-Url: https://chaos.moe/g/?a=commitdiff_plain;h=7272178d6b9a250a2cee1aaa4d4fedbcdbce8ae9;p=corbenik%2Fcorbenik.git Split text/data/ro loading in @Wolfvak's code --- diff --git a/external/loader/source/exheader.h b/external/loader/source/exheader.h index 2892ecb..c1bf9be 100644 --- a/external/loader/source/exheader.h +++ b/external/loader/source/exheader.h @@ -3,6 +3,17 @@ #include <3ds/types.h> +typedef struct +{ + u32 text_addr; + u32 text_size; + u32 ro_addr; + u32 ro_size; + u32 data_addr; + u32 data_size; + u32 total_size; +} prog_addrs_t; + typedef struct { u8 reserved[5]; diff --git a/external/loader/source/loader.c b/external/loader/source/loader.c index db01ae0..db6c9e9 100644 --- a/external/loader/source/loader.c +++ b/external/loader/source/loader.c @@ -16,17 +16,6 @@ const char CODE_PATH[] = { 0x01, 0x00, 0x00, 0x00, 0x2E, 0x63, 0x6F, 0x64, 0x65, 0x00, 0x00, 0x00 }; -typedef struct -{ - u32 text_addr; - u32 text_size; - u32 ro_addr; - u32 ro_size; - u32 data_addr; - u32 data_size; - u32 total_size; -} prog_addrs_t; - static Handle g_handles[MAX_SESSIONS + 2]; static int g_active_handles; static u64 g_cached_prog_handle; @@ -94,8 +83,8 @@ load_code(u64 progid, u16 progver, prog_addrs_t *shared, prog_addrs_t *original, lzss_decompress((u8 *)shared->text_addr + size); } - // Load/Dump code section - sd_code(progid, (u8 *)shared->text_addr, shared->total_size << 12); + // Load/Dump code sections + code_handler(progid, shared); // 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, diff --git a/external/loader/source/patcher.c b/external/loader/source/patcher.c index a98e7c5..3818db8 100644 --- a/external/loader/source/patcher.c +++ b/external/loader/source/patcher.c @@ -1,5 +1,6 @@ #include <3ds.h> #include "patcher.h" +#include "exheader.h" #include "fsldr.h" #include "internal.h" #include "memory.h" @@ -13,7 +14,9 @@ #endif #include "../../../source/config.h" -#define CODE_PATH PATH_EXEFS "/0000000000000000" +#define TEXT_PATH PATH_EXEFS_TEXT "/0000000000000000" +#define DATA_PATH PATH_EXEFS_DATA "/0000000000000000" +#define RO_PATH PATH_EXEFS_RO "/0000000000000000" #define LANG_PATH PATH_LOCEMU "/0000000000000000" const char hexDigits[] = "0123456789ABCDEF"; @@ -382,7 +385,7 @@ overlay_patch(u64 progId, u8 *code, u32 size) } void -sd_code(u64 progId, u8 *code_loc, u32 code_len) +code_handler(u64 progId, prog_addrs_t *shared) { // 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])) @@ -390,37 +393,79 @@ sd_code(u64 progId, u8 *code_loc, u32 code_len) u32 highTid = progId >> 0x20; - static char code_path[] = CODE_PATH; + if ((highTid == 0x00040000 || highTid == 0x00040002) && !config.options[OPTION_LOADER_DUMPCODE_ALL]) + return; + + static char text_path[] = TEXT_PATH; + static char data_path[] = DATA_PATH; + static char ro_path[] = RO_PATH; Handle code_f; - hexdump_titleid(progId, code_path); + hexdump_titleid(progId, text_path); + hexdump_titleid(progId, data_path); + hexdump_titleid(progId, ro_path); u32 len; + // Text section. + // 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); + if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, text_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE]) { + FSFILE_Read(code_f, &len, 0, (void*)shared->text_addr, shared->text_size << 12); + logstr(" loaded text from "); + logstr(text_path); logstr("\n"); } // Either system title with OPTION_LOADER_DUMPCODE_ALL enabled, or regular title else if (config.options[OPTION_LOADER_DUMPCODE]) { - if ((highTid == 0x00040000 || highTid == 0x00040002) && !config.options[OPTION_LOADER_DUMPCODE_ALL]) - goto return_close; + if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, text_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) { + FSFILE_Write(code_f, &len, 0, (void*)shared->text_addr, shared->text_size << 12, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME); + logstr(" dumped text to "); + logstr(text_path); + logstr("\n"); + } + } + FSFILE_Close(code_f); + + // Data section. - 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); + // Attempts to load code section from SD card, including system titles/modules/etc. + if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, data_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE]) { + FSFILE_Read(code_f, &len, 0, (void*)shared->data_addr, shared->data_size << 12); + logstr(" loaded data from "); + logstr(data_path); + logstr("\n"); + } + // Either system title with OPTION_LOADER_DUMPCODE_ALL enabled, or regular title + else if (config.options[OPTION_LOADER_DUMPCODE]) { + if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, data_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) { + FSFILE_Write(code_f, &len, 0, (void*)shared->data_addr, shared->data_size << 12, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME); + logstr(" dumped data to "); + logstr(data_path); logstr("\n"); } } + FSFILE_Close(code_f); -return_close: + // RO Section. + // Attempts to load code section from SD card, including system titles/modules/etc. + if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, ro_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE]) { + FSFILE_Read(code_f, &len, 0, (void*)shared->ro_addr, shared->ro_size << 12); + logstr(" loaded ro from "); + logstr(ro_path); + logstr("\n"); + } + // Either system title with OPTION_LOADER_DUMPCODE_ALL enabled, or regular title + else if (config.options[OPTION_LOADER_DUMPCODE]) { + if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, ro_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) { + FSFILE_Write(code_f, &len, 0, (void*)shared->ro_addr, shared->ro_size << 12, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME); + logstr(" dumped ro to "); + logstr(ro_path); + logstr("\n"); + } + } FSFILE_Close(code_f); - return; } // This is only for the .code segment. diff --git a/external/loader/source/patcher.h b/external/loader/source/patcher.h index 3bcf32f..cf3b70b 100644 --- a/external/loader/source/patcher.h +++ b/external/loader/source/patcher.h @@ -2,10 +2,11 @@ #define __PATCHER_H #include <3ds/types.h> +#include "exheader.h" 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 sd_code(u64 progId, u8 *code_loc, u32 code_len); +void code_handler(u64 progId, prog_addrs_t* shared); u32 get_text_extend(u64 progId, u16 progver, u32 size_orig); u32 get_ro_extend(u64 progId, u16 progver, u32 size_orig); diff --git a/host/bytecode_asm.py b/host/bytecode_asm.py index 18463ce..d623aee 100755 --- a/host/bytecode_asm.py +++ b/host/bytecode_asm.py @@ -310,7 +310,6 @@ def parse_op(token_list, instr_offs): return bytearray.fromhex("87") + pad_zero_r(val, 2) elif token_list[0] == "n3ds": # Sets the eq flag if this is an n3ds. return bytearray.fromhex("10") - elif token_list[0] == "abort": return bytearray.fromhex("18") elif token_list[0] == "aborteq": diff --git a/patch/mset_str.pco b/patch/mset_str.pco index e0b051c..b2dd371 100644 --- a/patch/mset_str.pco +++ b/patch/mset_str.pco @@ -6,12 +6,8 @@ rel exe_text -# Status: needs loader - -# u"Ver." find u"Ver." abortnf -# u".hax" -set u".hax" +set u".hack//%d%d%d:%d%ls" diff --git a/source/config.c b/source/config.c index 50e22fd..60d7684 100644 --- a/source/config.c +++ b/source/config.c @@ -33,6 +33,9 @@ mk_structure() f_mkdir(PATH_SVC); f_mkdir(PATH_KEYS); f_mkdir(PATH_EXEFS); + f_mkdir(PATH_EXEFS_TEXT); + f_mkdir(PATH_EXEFS_DATA); + f_mkdir(PATH_EXEFS_RO); f_mkdir(PATH_TEMP); f_mkdir(PATH_LOADER_CACHE); } diff --git a/source/patch_format.h b/source/patch_format.h index dc1b077..d217a0d 100644 --- a/source/patch_format.h +++ b/source/patch_format.h @@ -50,7 +50,10 @@ #define PATH_KEYS PATH_CFW "/keys" // Keyfiles will be loaded from this dir, and // additionally the root if not found. -#define PATH_EXEFS PATH_CFW "/exe" // ExeFS overrides/dumps, named by titleid +#define PATH_EXEFS PATH_CFW "/exe" // ExeFS overrides/dumps, named by titleid +#define PATH_EXEFS_TEXT PATH_EXEFS "/text" // Text segment overrides/dumps, named by titleid +#define PATH_EXEFS_RO PATH_EXEFS "/ro" // RO segment overrides/dumps, named by titleid +#define PATH_EXEFS_DATA PATH_EXEFS "/data" // Data segment overrides/dumps, named by titleid #define PATH_BITS PATH_CFW "/bits" // Path to misc bits we need (emunand code, reboot code, etc) @@ -87,8 +90,11 @@ struct system_patch char magic[4]; // "AIDA" for shits and giggles and because we like .hack. uint8_t version; // Version of the patch itself. - char name[64]; // User-readable name for patch in menu. - char desc[256]; // User-readable description for patch in menu. + // NOTE - This metadata stuff is temporary, I eventually plan to move it down + // to the same 'variable' width section as tids. + char name[64]; // User-readable name for patch in menu. + char desc[256]; // User-readable description for patch in menu. + uint64_t uuid; // Unique ID for patch. Each unique patch should provide // a unique ID.