Result enablethemecache(u32 type) { Result ret=0; u32 filesize = 0; printf("Reading SaveData.dat...\n"); ret = archive_getfilesize(HomeMenu_Extdata, "/SaveData.dat", &filesize); if(ret!=0) { printf("Failed to get filesize for extdata SaveData.dat: 0x%08x\n", (unsigned int)ret); return ret; } if(filesize > filebuffer_maxsize) { printf("Extdata SaveData.dat filesize is too large: 0x%08x\n", (unsigned int)filesize); return ret; } ret = archive_readfile(HomeMenu_Extdata, "/SaveData.dat", filebuffer, filesize); if(ret!=0) { printf("Failed to read file: 0x%08x\n", (unsigned int)ret); return ret; } if(ret==0) { if(filebuffer[0x141b]==0 && filebuffer[0x13b8]!=0 && filebuffer[0x13bc]==0 && filebuffer[0x13bd]==type) { ret = 0; printf("SaveData.dat is already set for using the theme cache with a regular theme.\n"); return ret; } } if(ret==0) { filebuffer[0x141b]=0;//Disable theme shuffle. memset(&filebuffer[0x13b8], 0, 8);//Clear the regular-theme structure. filebuffer[0x13bd]=type;//theme-type filebuffer[0x13b8] = 0xff;//theme-index printf("Writing updated SaveData.dat...\n"); ret = archive_writefile(HomeMenu_Extdata, "/SaveData.dat", filebuffer, filesize); if(ret!=0) { printf("Failed to write file: 0x%08x\n", (unsigned int)ret); } } return ret; }
Result archive_copyfile(Archive inarchive, Archive outarchive, char *inpath, char *outpath, u8* buffer, u32 size, u32 maxbufsize, char *display_filepath) { Result ret=0; u32 filesize=0; ret = archive_getfilesize(inarchive, inpath, &filesize); if (ret > 0) { printf("archive_getfilesize() ret=0x%08x, size=0x%08x\n", (unsigned int)ret, (unsigned int)filesize); gfxFlushBuffers(); gfxSwapBuffers(); } if(ret!=0)return ret; if(size==0 || size>filesize) { size = filesize; } if(size>maxbufsize) { printf("-----Size is too large.-----\n"); gfxFlushBuffers(); gfxSwapBuffers(); ret = -1; return ret; } /*printf("Reading %s...\n", display_filepath); gfxFlushBuffers(); gfxSwapBuffers();*/ ret = archive_readfile(inarchive, inpath, buffer, size); if(ret!=0) { printf("-----Failed to read %s (%d): 0x%08x-----\n", display_filepath, (unsigned int) size, (unsigned int)ret); gfxFlushBuffers(); gfxSwapBuffers(); return ret; } /*printf("Writing %s...\n", display_filepath); gfxFlushBuffers(); gfxSwapBuffers();*/ ret = archive_writefile(outarchive, outpath, buffer, size); if(ret!=0) { printf("-----Failed to write %s (%d): 0x%08x-----\n", display_filepath, (unsigned int) size, (unsigned int)ret); gfxFlushBuffers(); gfxSwapBuffers(); return ret; } return ret; }
Result disablethemecache() { Result ret=0; u32 filesize = 0; printf("Reading SaveData.dat...\n"); ret = archive_getfilesize(HomeMenu_Extdata, "/SaveData.dat", &filesize); if(ret!=0) { printf("Failed to get filesize for extdata SaveData.dat: 0x%08x\n", (unsigned int)ret); return ret; } if(filesize > filebuffer_maxsize) { printf("Extdata SaveData.dat filesize is too large: 0x%08x\n", (unsigned int)filesize); return ret; } ret = archive_readfile(HomeMenu_Extdata, "/SaveData.dat", filebuffer, filesize); if(ret!=0) { printf("Failed to read file: 0x%08x\n", (unsigned int)ret); return ret; } if(ret==0) { filebuffer[0x141b]=0;//Disable theme shuffle. memset(&filebuffer[0x13b8], 0, 8);//Clear the regular-theme structure. printf("Writing updated SaveData.dat...\n"); ret = archive_writefile(HomeMenu_Extdata, "/SaveData.dat", filebuffer, filesize); if(ret!=0) { printf("Failed to write file: 0x%08x\n", (unsigned int)ret); } } return ret; }
int sd2themecache(char *body_filepath, char *bgm_filepath, u32 install_type) { Result ret=0; u32 body_size=0, bgm_size=0; u32 thememanage[0x20>>2]; memset(thememanage, 0, sizeof(thememanage)); ret = archive_getfilesize(SDArchive, body_filepath, &body_size); if(ret!=0) { printf("Failed to get the filesize of the body-filepath: %s\n", body_filepath); if(install_type==0) { printf("Verify that you have a menuhax build for your system on SD card: make sure that the release archive you're using actually includes builds for your system-version.\n"); printf("Also verify that the following directory containing .lz files actually exists on your SD card: '/3ds/menuhax_manager/themepayload/'.\n"); } return ret; } else { printf("Using body-filepath: %s\n", body_filepath); } if(body_size==0) { printf("Error: the theme body-data file is empty(filesize is 0-bytes).\n"); return -1; } if(bgm_filepath) { ret = archive_getfilesize(SDArchive, bgm_filepath, &bgm_size); if(ret!=0) { ret = archive_getfilesize(SDArchive, bgm_filepath, &bgm_size); printf("Skipping BGM copying since failed for it.\n"); bgm_size = 0; } else { printf("Using bgm-filepath: %s\n", bgm_filepath); } } printf("Generating a ThemeManage.bin + writing it to extdata...\n"); memset(thememanage, 0, 0x20); thememanage[0x0>>2] = 1; thememanage[0x8>>2] = body_size; thememanage[0xC>>2] = bgm_size; thememanage[0x10>>2] = 0xff; thememanage[0x14>>2] = 1; thememanage[0x18>>2] = 0xff; thememanage[0x1c>>2] = 0x200; memset(filebuffer, 0, 0x800); memcpy(filebuffer, thememanage, 0x20); ret = archive_writefile(Theme_Extdata, install_type==0 ? "/ThemeManage.bin" : "/yhemeManage.bin", filebuffer, 0x800); if(ret!=0) { printf("Failed to write ThemeManage.bin to extdata, aborting.\n"); return ret; } ret = archive_copyfile(SDArchive, Theme_Extdata, body_filepath, install_type==0 ? "/BodyCache.bin" : "/yodyCache.bin", filebuffer, thememanage[0x8>>2], 0x150000, "body-data"); if(ret==0) { printf("Successfully finished copying body-data.\n"); } else { return ret; } if(bgm_filepath && bgm_size) { ret = archive_copyfile(SDArchive, Theme_Extdata, bgm_filepath, "/BgmCache.bin", filebuffer, thememanage[0xC>>2], 0x337000, "bgm-data"); if(ret==0) { printf("Successfully finished copying bgm-data.\n"); } else { return ret; } }