Scripting: add extrcode command

This commit is contained in:
d0k3 2017-09-08 15:27:10 +02:00
parent 01bc03244c
commit c094c6c192
4 changed files with 21 additions and 5 deletions

View File

@ -1186,7 +1186,7 @@ u32 FileHandlerMenu(char* current_path, u32* cursor, u32* scroll, DirStruct* cur
return 0;
} else if (user_select == extrcode) { // -> Extract code
ShowString("%s\nExtracting .code, please wait...", pathstr);
if (ExtractCodeFromCxiFile(curr_entry->path) == 0) {
if (ExtractCodeFromCxiFile(curr_entry->path, NULL) == 0) {
ShowPrompt(false, "%s\n.code extracted to " OUTPUT_PATH, pathstr);
} else ShowPrompt(false, "%s\n.code extract failed", pathstr);
return 0;

View File

@ -1402,7 +1402,7 @@ u32 DumpCxiSrlFromTmdFile(const char* path) {
return 0;
}
u32 ExtractCodeFromCxiFile(const char* path) {
u32 ExtractCodeFromCxiFile(const char* path, const char* path_out) {
u8* code = (u8*) TEMP_BUFFER;
u32 code_max_size = TEMP_BUFFER_SIZE;
@ -1419,9 +1419,13 @@ u32 ExtractCodeFromCxiFile(const char* path) {
if ((exthdr.flag & 0x1) && (DecompressCodeLzss(code, &code_size, code_max_size) != 0))
return 1;
// build output path
// build or take over output path
char dest[256];
if (!path_out) {
// ensure the output dir exists
if (fvx_rmkdir(OUTPUT_PATH) != FR_OK) return 1;
snprintf(dest, 256, OUTPUT_PATH "/%016llX%s%s", ncch.programId, (exthdr.flag & 0x1) ? ".dec" : "", EXEFS_CODE_NAME);
} else strncpy(dest, path_out, 256);
// write output file
fvx_unlink(dest);

View File

@ -7,7 +7,7 @@ u32 CheckEncryptedGameFile(const char* path);
u32 CryptGameFile(const char* path, bool inplace, bool encrypt);
u32 BuildCiaFromGameFile(const char* path, bool force_legit);
u32 DumpCxiSrlFromTmdFile(const char* path);
u32 ExtractCodeFromCxiFile(const char* path);
u32 ExtractCodeFromCxiFile(const char* path, const char* path_out);
u32 ShowGameFileTitleInfo(const char* path);
u32 BuildNcchInfoXorpads(const char* destdir, const char* path);
u32 CheckHealthAndSafetyInject(const char* hsdrv);

View File

@ -69,6 +69,7 @@ typedef enum {
CMD_ID_DECRYPT,
CMD_ID_ENCRYPT,
CMD_ID_BUILDCIA,
CMD_ID_EXTRCODE,
CMD_ID_BOOT,
CMD_ID_SWITCHSD,
CMD_ID_REBOOT,
@ -109,6 +110,7 @@ Gm9ScriptCmd cmd_list[] = {
{ CMD_ID_DECRYPT , "decrypt" , 1, 0 },
{ CMD_ID_ENCRYPT , "encrypt" , 1, 0 },
{ CMD_ID_BUILDCIA, "buildcia", 1, _FLG('l') },
{ CMD_ID_EXTRCODE, "extrcode", 2, 0 },
{ CMD_ID_BOOT , "boot" , 1, 0 },
{ CMD_ID_SWITCHSD, "switchsd", 1, 0 },
{ CMD_ID_REBOOT , "reboot" , 0, 0 },
@ -591,6 +593,16 @@ bool run_cmd(cmd_id id, u32 flags, char** argv, char* err_str) {
} else if (id == CMD_ID_BUILDCIA) {
ret = (BuildCiaFromGameFile(argv[0], (flags & _FLG('n'))) == 0);
if (err_str) snprintf(err_str, _ERR_STR_LEN, "build CIA failed");
} else if (id == CMD_ID_EXTRCODE) {
u32 filetype = IdentifyFileType(argv[0]);
if ((filetype&(GAME_NCCH|FLAG_CXI)) != (GAME_NCCH|FLAG_CXI)) {
ret = false;
if (err_str) snprintf(err_str, _ERR_STR_LEN, "not a CXI file");
} else {
ShowString("Extracting .code, please wait...");
ret = (ExtractCodeFromCxiFile(argv[0], argv[1]) == 0);
if (err_str) snprintf(err_str, _ERR_STR_LEN, "extract .code failed");
}
} else if (id == CMD_ID_BOOT) {
size_t firm_size = FileGetData(argv[0], TEMP_BUFFER, TEMP_BUFFER_SIZE, 0);
ret = firm_size && (firm_size < TEMP_BUFFER_SIZE) &&