int LPP_UtilsSavedataUpdate(void) { int res = -1; switch(sceUtilitySavedataGetStatus()) { case PSP_UTILITY_DIALOG_NONE: break; case PSP_UTILITY_DIALOG_VISIBLE: sceUtilitySavedataUpdate(1); break; case PSP_UTILITY_DIALOG_QUIT: sceUtilitySavedataShutdownStart(); strcpy(lpp_UtilsSavedataSaveName, lpp_UtilsSavedataParams.saveName); if(lpp_UtilsSavedataParams.mode == LPP_UTILS_SAVEDATA_TYPE_AUTOLOAD || lpp_UtilsSavedataParams.mode == LPP_UTILS_SAVEDATA_TYPE_LISTLOAD) { kuKernelMemcpy(lpp_UtilsSaveDataData, lpp_UtilsSavedataParams.dataBuf, lpp_UtilsSavedataParams.dataBufSize); } if(lpp_UtilsSavedataParams.pic1FileData.buf != null) { free(lpp_UtilsSavedataParams.pic1FileData.buf); } if(lpp_UtilsSavedataParams.icon0FileData.buf != null) { free(lpp_UtilsSavedataParams.icon0FileData.buf); } if(lpp_UtilsSavedataParams.snd0FileData.buf != null) { free(lpp_UtilsSavedataParams.snd0FileData.buf); } if(lpp_UtilsSavedataParams.dataBuf != null) { free(lpp_UtilsSavedataParams.dataBuf); } res = lpp_UtilsSavedataParams.base.result; break; default: break; } return(res); }
void mainImpl() { int result, previousResult; SceUtilitySavedataParamNew savedata; // read info file int fd = sceIoOpen("ms0:/savename.txt", O_RDONLY, 0); if (!fd) { print("ms0:/savename.txt not found"); return; } char file[1000]; int len = sceIoRead(fd, file, 1000); sceIoClose(fd); file[len] = 0; // extract first 3 lines char *ptr = file; g_gameName = ptr; while (*ptr != 10 && *ptr != 13 && *ptr != 0) ptr++; if (*ptr == 13) *ptr++ = 0; if (*ptr == 10) *ptr++ = 0; g_saveName = ptr; while (*ptr != 10 && *ptr != 13 && *ptr != 0) ptr++; if (*ptr == 13) *ptr++ = 0; if (*ptr == 10) *ptr++ = 0; g_dataName = ptr; while (*ptr != 10 && *ptr != 13 && *ptr != 0) ptr++; if (*ptr == 13) *ptr++ = 0; if (*ptr == 10) *ptr++ = 0; // ask for load or update pgPrint2(0, 0, 0xffff, "Shine's SavedataTool"); char buf[100]; strcpy(buf, "game name: "); print(strcat(buf, g_gameName)); strcpy(buf, "save name: "); print(strcat(buf, g_saveName)); strcpy(buf, "data name: "); print(strcat(buf, g_dataName)); y++; print("Press Cross for savedata mode 0 (AUTOLOAD)"); print("Press Circle for savedata mode 1 (AUTOSAVE)"); print("Press Triangle for savedata mode 8 (SIZES)"); print("Press Square for savedata mode 11 (LIST)"); print("Press Left for savedata mode 12 (FILES)"); print("Press Up for savedata mode 15 (READSECURE)"); print("Press Down for savedata mode 22 (GETSIZE)"); y++; sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(0); SceCtrlData ctrl; int mode = -1; while (mode < 0) { sceCtrlReadBufferPositive(&ctrl, 1); if (ctrl.Buttons & CTRL_CROSS) { mode = 0; // AUTOLOAD } else if (ctrl.Buttons & CTRL_CIRCLE) { mode = 1; // AUTOSAVE } else if (ctrl.Buttons & CTRL_TRIANGLE) { mode = 8; // SIZES } else if (ctrl.Buttons & CTRL_SQUARE) { mode = 11; // LIST } else if (ctrl.Buttons & CTRL_UP) { mode = 15; // READSECURE } else if (ctrl.Buttons & CTRL_DOWN) { mode = 22; // GETSIZE } else if (ctrl.Buttons & CTRL_LEFT) { mode = 12; // FILES } sceDisplayWaitVblankStart(); } if (mode == 0) { print("Loading savedata with mode 0 (AUTOLOAD)..."); initSavedata(&savedata, mode); result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &savedata); if (result) { print("sceUtilitySavedataInitStart failed"); printHex(result); return; } previousResult = -1; while (1) { result = sceUtilitySavedataGetStatus(); if (result != previousResult) { print("sceUtilitySavedataGetStatus result:"); printHex(result); previousResult = result; } if (result == 3) break; sceUtilitySavedataUpdate(1); sceDisplayWaitVblankStart(); } // write data print("writing extracted savedata..."); fd = sceIoOpen("ms0:/params.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/params.bin"); return; } sceIoWrite(fd, &savedata.paramsSfoTitle, PARAMS_LEN); sceIoClose(fd); fd = sceIoOpen("ms0:/data.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/data.bin"); return; } sceIoWrite(fd, g_dataBuf, savedata.sizeOfData); sceIoClose(fd); fd = sceIoOpen("ms0:/savedata.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/savedata.bin"); return; } sceIoWrite(fd, &savedata, sizeof(savedata)); sceIoClose(fd); } else if (mode == 1) { print("Loading savedata with mode 1 (AUTOSAVE)..."); initSavedata(&savedata, mode); savedata.readIcon0Buf = 0; savedata.sizeOfReadIcon0Buf = 0; savedata.readIcon1Buf = 0; savedata.sizeOfReadIcon1Buf = 0; savedata.readPic1Buf = 0; savedata.sizeOfReadPic1Buf = 0; // load extracted data print("loading extracted savedata..."); fd = sceIoOpen("ms0:/params.bin", O_RDONLY, 0); if (!fd) { print("can't open ms0:/params.bin"); return; } sceIoRead(fd, &savedata.paramsSfoTitle, PARAMS_LEN); sceIoClose(fd); fd = sceIoOpen("ms0:/data.bin", O_RDONLY, 0); if (!fd) { print("can't open ms0:/data.bin"); return; } int len = sceIoRead(fd, g_dataBuf, 0x100000); sceIoClose(fd); // update gamedata print("updating savedata..."); savedata.sizeOfData = len; result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &savedata); if (result) { print("sceUtilitySavedataInitStart failed"); printHex(result); return; } previousResult = -1; while (1) { result = sceUtilitySavedataGetStatus(); if (result != previousResult) { print("sceUtilitySavedataGetStatus result:"); printHex(result); previousResult = result; } if (result == 3) break; sceUtilitySavedataUpdate(1); sceDisplayWaitVblankStart(); } } else if (mode == 8) { print("loading savedata with mode 8 (SIZES)..."); initSavedata(&savedata, mode); /* savedata.sizeOfDataBuf = 0x1000; */ savedata.sizeOfData = savedata.sizeOfDataBuf; result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &savedata); if (result) { print("sceUtilitySavedataInitStart failed"); printHex(result); return; } previousResult = -1; while (1) { result = sceUtilitySavedataGetStatus(); if (result != previousResult) { print("sceUtilitySavedataGetStatus result:"); printHex(result); previousResult = result; } if (result == 3) break; sceUtilitySavedataUpdate(1); sceDisplayWaitVblankStart(); } // write data print("writing savedata structure..."); fd = sceIoOpen("ms0:/savedata.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/savedata.bin"); return; } sceIoWrite(fd, &savedata, sizeof(savedata)); sceIoClose(fd); #if FW15 #else char buffer[100]; sprintf(buffer, "Free space: %s", msFreeBuffer + 12); print(buffer); sprintf(buffer, "Required space1: %s", utilityDataBuffer + 8); print(buffer); sprintf(buffer, "Required space2: %s", utilityDataBuffer + 20); print(buffer); fd = sceIoOpen("ms0:/msFreeBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/msFreeBuffer.bin"); return; } sceIoWrite(fd, msFreeBuffer, sizeof(msFreeBuffer)); sceIoClose(fd); fd = sceIoOpen("ms0:/msDataBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/msDataBuffer.bin"); return; } sceIoWrite(fd, msDataBuffer, sizeof(msDataBuffer)); sceIoClose(fd); fd = sceIoOpen("ms0:/utilityDataBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/utilityDataBuffer.bin"); return; } sceIoWrite(fd, utilityDataBuffer, sizeof(utilityDataBuffer)); sceIoClose(fd); #endif } else if (mode == 11) { print("Loading savedata with mode 11 (LIST)..."); initSavedata(&savedata, mode); result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &savedata); if (result) { print("sceUtilitySavedataInitStart failed"); printHex(result); return; } previousResult = -1; while (1) { result = sceUtilitySavedataGetStatus(); if (result != previousResult) { print("sceUtilitySavedataGetStatus result:"); printHex(result); previousResult = result; } if (result == 3) break; sceUtilitySavedataUpdate(1); sceDisplayWaitVblankStart(); } int numEntries = *((int *) (idListBuffer + 4)); int i; char buffer[100]; for (i = 0; i < numEntries; i++) { sprintf(buffer, "Name: %s", (char *) (idListDataBuffer + i * 72 + 52)); print(buffer); } // write data print("writing savedata structure..."); fd = sceIoOpen("ms0:/savedata.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/savedata.bin"); return; } sceIoWrite(fd, &savedata, sizeof(savedata)); sceIoClose(fd); #if FW15 #else fd = sceIoOpen("ms0:/idListBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/idListBuffer.bin"); return; } sceIoWrite(fd, idListBuffer, sizeof(idListBuffer)); sceIoClose(fd); fd = sceIoOpen("ms0:/idListDataBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/idListDataBuffer.bin"); return; } sceIoWrite(fd, idListDataBuffer, sizeof(idListDataBuffer)); sceIoClose(fd); fd = sceIoOpen("ms0:/fileListBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/fileListBuffer.bin"); return; } sceIoWrite(fd, fileListBuffer, sizeof(fileListBuffer)); sceIoClose(fd); fd = sceIoOpen("ms0:/sizeBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/sizeBuffer.bin"); return; } sceIoWrite(fd, sizeBuffer, sizeof(sizeBuffer)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileSecureEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileSecureEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileSecureEntriesAddr, sizeof(saveFileSecureEntriesAddr)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileSystemEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileSystemEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileSystemEntriesAddr, sizeof(saveFileSystemEntriesAddr)); sceIoClose(fd); #endif } else if (mode == 15) { print("Loading savedata with mode 15 (READSECURE)..."); initSavedata(&savedata, mode); result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &savedata); if (result) { print("sceUtilitySavedataInitStart failed"); printHex(result); return; } previousResult = -1; while (1) { result = sceUtilitySavedataGetStatus(); if (result != previousResult) { print("sceUtilitySavedataGetStatus result:"); printHex(result); previousResult = result; } if (result == 3) break; sceUtilitySavedataUpdate(1); sceDisplayWaitVblankStart(); } // write data print("writing extracted savedata..."); fd = sceIoOpen("ms0:/params.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/params.bin"); return; } sceIoWrite(fd, &savedata.paramsSfoTitle, PARAMS_LEN); sceIoClose(fd); fd = sceIoOpen("ms0:/data.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/data.bin"); return; } sceIoWrite(fd, g_dataBuf, savedata.sizeOfData); sceIoClose(fd); fd = sceIoOpen("ms0:/savedata.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/savedata.bin"); return; } sceIoWrite(fd, &savedata, sizeof(savedata)); sceIoClose(fd); } else if (mode == 22) { print("Loading savedata with mode 22..."); initSavedata(&savedata, mode); result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &savedata); if (result) { print("sceUtilitySavedataInitStart failed"); printHex(result); return; } previousResult = -1; while (1) { result = sceUtilitySavedataGetStatus(); if (result != previousResult) { print("sceUtilitySavedataGetStatus result:"); printHex(result); previousResult = result; } if (result == 3) break; sceUtilitySavedataUpdate(1); sceDisplayWaitVblankStart(); } // write data print("writing extracted savedata..."); fd = sceIoOpen("ms0:/params.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/params.bin"); return; } sceIoWrite(fd, &savedata.paramsSfoTitle, PARAMS_LEN); sceIoClose(fd); fd = sceIoOpen("ms0:/data.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/data.bin"); return; } sceIoWrite(fd, g_dataBuf, savedata.sizeOfData); sceIoClose(fd); fd = sceIoOpen("ms0:/savedata.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/savedata.bin"); return; } sceIoWrite(fd, &savedata, sizeof(savedata)); sceIoClose(fd); fd = sceIoOpen("ms0:/sizeBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/sizeBuffer.bin"); return; } sceIoWrite(fd, sizeBuffer, sizeof(sizeBuffer)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileSecureEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileSecureEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileSecureEntriesAddr, sizeof(saveFileSecureEntriesAddr)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileSystemEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileSystemEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileSystemEntriesAddr, sizeof(saveFileSystemEntriesAddr)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileEntriesAddr, sizeof(saveFileEntriesAddr)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileSecureEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileSecureEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileSecureEntriesAddr, sizeof(saveFileSecureEntriesAddr)); sceIoClose(fd); } else if (mode == 12) { print("Loading savedata with mode 12 (FILES)..."); initSavedata(&savedata, mode); result = sceUtilitySavedataInitStart((SceUtilitySavedataParam *) &savedata); if (result) { print("sceUtilitySavedataInitStart failed"); printHex(result); return; } previousResult = -1; while (1) { result = sceUtilitySavedataGetStatus(); if (result != previousResult) { print("sceUtilitySavedataGetStatus result:"); printHex(result); previousResult = result; } if (result == 3) break; sceUtilitySavedataUpdate(1); sceDisplayWaitVblankStart(); } int numSecureEntries = *((int *) (fileListBuffer + 12)); int numEntries = *((int *) (fileListBuffer + 16)); int numSystemEntries = *((int *) (fileListBuffer + 20)); int i; char buffer[100]; for (i = 0; i < numSecureEntries; i++) { sprintf(buffer, "Secure Entry Name: '%s'", (char *) (saveFileSecureEntriesAddr + i * 80 + 64)); print(buffer); } for (i = 0; i < numEntries; i++) { sprintf(buffer, "Entry Name: '%s'", (char *) (saveFileEntriesAddr + i * 80 + 64)); print(buffer); } for (i = 0; i < numSystemEntries; i++) { sprintf(buffer, "System Entry Name: '%s'", (char *) (saveFileSystemEntriesAddr + i * 80 + 64)); print(buffer); } // write data print("writing savedata structure..."); fd = sceIoOpen("ms0:/savedata.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/savedata.bin"); return; } sceIoWrite(fd, &savedata, sizeof(savedata)); sceIoClose(fd); fd = sceIoOpen("ms0:/fileListBuffer.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/fileListBuffer.bin"); return; } sceIoWrite(fd, fileListBuffer, sizeof(fileListBuffer)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileEntriesAddr, sizeof(saveFileEntriesAddr)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileSecureEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileSecureEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileSecureEntriesAddr, sizeof(saveFileSecureEntriesAddr)); sceIoClose(fd); fd = sceIoOpen("ms0:/saveFileSystemEntriesAddr.bin", O_CREAT | O_TRUNC | O_WRONLY, 0777); if (!fd) { print("can't open ms0:/saveFileSystemEntriesAddr.bin"); return; } sceIoWrite(fd, saveFileSystemEntriesAddr, sizeof(saveFileSystemEntriesAddr)); sceIoClose(fd); } sceUtilitySavedataShutdownStart(); previousResult = -1; while (1) { result = sceUtilitySavedataGetStatus(); if (result != previousResult) { print("sceUtilitySavedataGetStatus result:"); printHex(result); previousResult = result; } if (result == 4) break; sceUtilitySavedataUpdate(1); sceDisplayWaitVblankStart(); } y++; print("operation successful"); print("savedata.result:"); printHex(savedata.result); }
int ShowSaveDialog( /* セーブモード */ int mode, /* セーブデータのバッファ */ void * buf, /* bufのサイズ */ unsigned int size, /* ms0:/PSP/SAVEDATA/GameName */ const char * GameName, /* ゲームのタイトル、セーブデータのタイトル、セーブデータの詳細 */ const char * GameTitle, const char * SaveTitle, const char * SaveDetail ) { if ( mode < 0 || mode > 6 ) return -1; //オートセーブモードでは0000にセーブする char NameList[][20] = { "0000", "0001", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009", "" }; SceUtilitySavedataParam dialog; if ( dxpSaveDialogInit(&dialog, mode, buf, size, GameName, "0000", NameList, GameTitle, SaveTitle, SaveDetail) < 0 ) return -1; if ( sceUtilitySavedataInitStart(&dialog) != 0 ) return -1; int done = 0; while( ProcessMessage() != -1 && !done ) { if ( mode != PSP_UTILITY_SAVEDATA_AUTOSAVE ) { ClearDrawScreen(); if ( dxpDialogDrawScene != NULL ) dxpDialogDrawScene(); } GUFINISH switch( sceUtilitySavedataGetStatus() ) { case PSP_UTILITY_DIALOG_INIT: break; case PSP_UTILITY_DIALOG_VISIBLE: sceUtilitySavedataUpdate(1); break; case PSP_UTILITY_DIALOG_QUIT: sceUtilitySavedataShutdownStart(); break; case PSP_UTILITY_DIALOG_FINISHED: done = 1; break; case PSP_UTILITY_DIALOG_NONE: done = 1; default: break; } if ( mode != PSP_UTILITY_SAVEDATA_AUTOSAVE ) ScreenFlip(); } memset(dxp_save_resource, 0, sizeof(PspUtilitySavedataFileData) * 4); int ret; if ( mode == DXP_SAVE_MODE_LOAD ) { //正常に読み込んだ //if(dialog.unknown1 != 0) //if(dialog.unknown1 == 1021) if ( dialog.base.result == 0 ) { memcpy(buf, dialog.dataBuf, size); ret = 0; } //キャンセルされた else if ( dialog.base.result == 1 ) { memset(buf, 0x0, size); ret = -2; } //セーブデータが存在しなかった //else if(dialog.base.result == -2146368761) else { memset(buf, 0x0, size); ret = -3; } } else { ret = 0; } free(dialog.dataBuf); return ret; }