From 652498e995ae918fe50f86cf5e5ac0ef67f22c48 Mon Sep 17 00:00:00 2001 From: Katharine Chui Date: Sat, 18 Nov 2023 02:18:17 +0800 Subject: [PATCH] Handle SCE_UTILITY_SAVEDATA_TYPE_SAVE then SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA Modnation racers does a normal save for global profile, then writes an insecure file for keeping track of selected language. During SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA it also provides no data for param.sfo, so I'm assuming that utility.prx does not update param.sfo data in that mode since the PSP save provided on the issue tracker has information. --- Core/Dialog/SavedataParam.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index ae241ccbb8..58f107b218 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -496,13 +496,18 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD std::string sfopath = dirPath + "/" + SFO_FILENAME; std::shared_ptr sfoFile = LoadCachedSFO(sfopath, true); + bool subWrite = param->mode == SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE || param->mode == SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA; + bool wasCrypted = GetSaveCryptMode(param, saveDirName) != 0; + // Update values - sfoFile->SetValue("TITLE", param->sfoParam.title, 128); - sfoFile->SetValue("SAVEDATA_TITLE", param->sfoParam.savedataTitle, 128); - sfoFile->SetValue("SAVEDATA_DETAIL", param->sfoParam.detail, 1024); - sfoFile->SetValue("PARENTAL_LEVEL", param->sfoParam.parentalLevel, 4); - sfoFile->SetValue("CATEGORY", "MS", 4); - sfoFile->SetValue("SAVEDATA_DIRECTORY", GetSaveDir(param, saveDirName), 64); + if(!subWrite){ + sfoFile->SetValue("TITLE", param->sfoParam.title, 128); + sfoFile->SetValue("SAVEDATA_TITLE", param->sfoParam.savedataTitle, 128); + sfoFile->SetValue("SAVEDATA_DETAIL", param->sfoParam.detail, 1024); + sfoFile->SetValue("PARENTAL_LEVEL", param->sfoParam.parentalLevel, 4); + sfoFile->SetValue("CATEGORY", "MS", 4); + sfoFile->SetValue("SAVEDATA_DIRECTORY", GetSaveDir(param, saveDirName), 64); + } // Always write and update the file list. // For each file, 13 bytes for filename, 16 bytes for file hash (0 in PPSSPP), 3 byte for padding @@ -542,7 +547,7 @@ int SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &saveD sfoFile->WriteSFO(&sfoData, &sfoSize); // Calc SFO hash for PSP. - if (cryptedData != 0) { + if (cryptedData != 0 || (subWrite && wasCrypted)) { int offset = sfoFile->GetDataOffset(sfoData, "SAVEDATA_PARAMS"); if(offset >= 0) UpdateHash(sfoData, (int)sfoSize, offset, DetermineCryptMode(param));