int LPP_UtilsSavedataInit(int type, void *data, u32 datasize, const char *cPath, const char *gamename, const char *key, const char *title, const char *subtitle, const char *detail) { lpp_UtilsSaveDataData = data; PspUtilitySavedataListSaveNewData newData; memset(&newData, 0, sizeof(newData)); memset(&lpp_UtilsSavedataParams, 0, sizeof(lpp_UtilsSavedataParams)); lpp_UtilsSavedataParams.base.size = sizeof(lpp_UtilsSavedataParams); void *icon0data = null; size_t icon0size = 0; void *pic1data = null; size_t pic1size = 0; void* snd0data = null; size_t snd0size = 0; char *titleshow = "New Save"; sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_LANGUAGE, &lpp_UtilsSavedataParams.base.language); sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_UNKNOWN, &lpp_UtilsSavedataParams.base.buttonSwap); lpp_UtilsSavedataParams.base.graphicsThread = 17; lpp_UtilsSavedataParams.base.accessThread = 19; lpp_UtilsSavedataParams.base.fontThread = 18; lpp_UtilsSavedataParams.base.soundThread = 16; lpp_UtilsSavedataParams.mode = type; lpp_UtilsSavedataParams.overwrite = 1; if(type == LPP_UTILS_SAVEDATA_TYPE_LISTLOAD) { lpp_UtilsSavedataParams.focus = PSP_UTILITY_SAVEDATA_FOCUS_LATEST; } else { lpp_UtilsSavedataParams.focus = PSP_UTILITY_SAVEDATA_FOCUS_FIRSTEMPTY; } strncpy(lpp_UtilsSavedataParams.key, key, 16); strncpy(lpp_UtilsSavedataParams.gameName, gamename, 9); strcpy(lpp_UtilsSavedataParams.saveName, "<>"); if(type == LPP_UTILS_SAVEDATA_TYPE_AUTOLOAD || type == LPP_UTILS_SAVEDATA_TYPE_AUTOSAVE) { strcpy(lpp_UtilsSavedataParams.saveName, lpp_UtilsSavedataSaveName); } else { lpp_UtilsSavedataParams.saveNameList = lpp_UtilsSaveNameMultiple; } strcpy(lpp_UtilsSavedataParams.fileName, "DATA.BIN"); lpp_UtilsSavedataParams.dataBuf = malloc(datasize); lpp_UtilsSavedataParams.dataBufSize = datasize; lpp_UtilsSavedataParams.dataSize = datasize; if(type == LPP_UTILS_SAVEDATA_TYPE_AUTOSAVE || type == LPP_UTILS_SAVEDATA_TYPE_LISTSAVE) { memset(lpp_UtilsSavedataParams.dataBuf, 0, datasize); strncpy(lpp_UtilsSavedataParams.dataBuf, data, datasize); strcpy(lpp_UtilsSavedataParams.sfoParam.title, title); strcpy(lpp_UtilsSavedataParams.sfoParam.savedataTitle, subtitle); strcpy(lpp_UtilsSavedataParams.sfoParam.detail, detail); lpp_UtilsSavedataParams.sfoParam.parentalLevel = 0; if(type != LPP_UTILS_SAVEDATA_TYPE_AUTOSAVE) { if(strcmp(cPath, "EBOOT.PBP") == 0 || strcmp(cPath, "EBOOT.PBP/") == 0 || strcmp(cPath, "EBOOT.PBP\\") == 0) { SceUID fd = sceIoOpen(cPath, PSP_O_RDONLY, 0777); if(fd >= 0) { EBOOT_HEADER pbpHeader; memset(&pbpHeader, 0, sizeof(pbpHeader)); sceIoRead(fd, &pbpHeader, sizeof(pbpHeader)); u32 filesize = pbpHeader.offset[2] - pbpHeader.offset[1]; if(filesize > 0) { sceIoLseek32(fd, pbpHeader.offset[1], PSP_SEEK_SET); icon0data = malloc(filesize); icon0size = filesize; sceIoRead(fd, icon0data, filesize); } filesize = pbpHeader.offset[5] - pbpHeader.offset[4]; if(filesize) { sceIoLseek32(fd, pbpHeader.offset[4], PSP_SEEK_SET); pic1data = malloc(filesize); pic1size = filesize; sceIoRead(fd, pic1data, filesize); } filesize = pbpHeader.offset[6] - pbpHeader.offset[5]; if(filesize) { sceIoLseek32(fd, pbpHeader.offset[5], PSP_SEEK_SET); snd0data = malloc(filesize); snd0size = filesize; sceIoRead(fd, snd0data, filesize); } sceIoClose(fd); } } else { char fname[512]; u8 o = cPath[strlen(cPath) - 1] == '/' || cPath[strlen(cPath) - 1] == '\\'; sprintf(fname, o ? "%sICON0.PNG" : "%s/ICON0.PNG", cPath); if(LPP_FileExists(fname)) { SceUID fd = sceIoOpen(fname, PSP_O_RDONLY, 0777); icon0size = sceIoLseek32(fd, 0, PSP_SEEK_END); sceIoLseek32(fd, 0, PSP_SEEK_SET); icon0data = malloc(icon0size); sceIoRead(fd, icon0data, icon0size); sceIoClose(fd); } sprintf(fname, o ? "%sPIC1.PNG" : "%s/PIC1.PNG", cPath); if(LPP_FileExists(fname)) { SceUID fd = sceIoOpen(fname, PSP_O_RDONLY, 0777); pic1size = sceIoLseek32(fd, 0, PSP_SEEK_END); sceIoLseek32(fd, 0, PSP_SEEK_SET); pic1data = malloc(pic1size); sceIoRead(fd, pic1data, pic1size); sceIoClose(fd); } sprintf(fname, o ? "%sSND0.AT3" : "%s/SND0.AT3", cPath); if(LPP_FileExists(fname)) { SceUID fd = sceIoOpen(fname, PSP_O_RDONLY, 0777); snd0size = sceIoLseek32(fd, 0, PSP_SEEK_END); sceIoLseek32(fd, 0, PSP_SEEK_SET); snd0data = malloc(snd0size); sceIoRead(fd, snd0data, snd0size); sceIoClose(fd); } } } lpp_UtilsSavedataParams.icon1FileData.buf = null; lpp_UtilsSavedataParams.icon1FileData.bufSize = 0; lpp_UtilsSavedataParams.icon1FileData.size = 0; lpp_UtilsSavedataParams.pic1FileData.buf = pic1data; lpp_UtilsSavedataParams.pic1FileData.bufSize = pic1size; lpp_UtilsSavedataParams.pic1FileData.size = pic1size; lpp_UtilsSavedataParams.icon0FileData.buf = icon0data; lpp_UtilsSavedataParams.icon0FileData.bufSize = icon0size; lpp_UtilsSavedataParams.icon0FileData.size = icon0size; lpp_UtilsSavedataParams.snd0FileData.buf = snd0data; lpp_UtilsSavedataParams.snd0FileData.bufSize = snd0size; lpp_UtilsSavedataParams.snd0FileData.size = snd0size; newData.title = titleshow; lpp_UtilsSavedataParams.newData = &newData; } int res = sceUtilitySavedataInitStart(&lpp_UtilsSavedataParams); if(res == 0) return 1; 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; }