Add error handling to the FILES savedata mode.
Not actually changed yet.
This commit is contained in:
parent
f084781ccf
commit
1d2476f28e
5 changed files with 135 additions and 50 deletions
|
@ -785,10 +785,7 @@ int PSPSaveDialog::Update()
|
||||||
status = SCE_UTILITY_STATUS_FINISHED;
|
status = SCE_UTILITY_STATUS_FINISHED;
|
||||||
break;
|
break;
|
||||||
case SCE_UTILITY_SAVEDATA_TYPE_FILES:
|
case SCE_UTILITY_SAVEDATA_TYPE_FILES:
|
||||||
if (param.GetFilesList(param.GetPspParam()))
|
param.GetPspParam()->result = param.GetFilesList(param.GetPspParam());
|
||||||
param.GetPspParam()->result = 0;
|
|
||||||
else
|
|
||||||
param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA;
|
|
||||||
status = SCE_UTILITY_STATUS_FINISHED;
|
status = SCE_UTILITY_STATUS_FINISHED;
|
||||||
break;
|
break;
|
||||||
case SCE_UTILITY_SAVEDATA_TYPE_GETSIZE:
|
case SCE_UTILITY_SAVEDATA_TYPE_GETSIZE:
|
||||||
|
@ -819,6 +816,7 @@ int PSPSaveDialog::Update()
|
||||||
param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_DELETE_NO_DATA;
|
param.GetPspParam()->result = SCE_UTILITY_SAVEDATA_ERROR_DELETE_NO_DATA;
|
||||||
status = SCE_UTILITY_STATUS_FINISHED;
|
status = SCE_UTILITY_STATUS_FINISHED;
|
||||||
break;
|
break;
|
||||||
|
// TODO: Should reset the directory's other files.
|
||||||
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATA:
|
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATA:
|
||||||
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE:
|
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE:
|
||||||
if (param.Save(param.GetPspParam(), GetSelectedSaveDirName(), param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE))
|
if (param.Save(param.GetPspParam(), GetSelectedSaveDirName(), param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE))
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#define SCE_UTILITY_SAVEDATA_ERROR_RW_NO_MEMSTICK (0x80110321)
|
#define SCE_UTILITY_SAVEDATA_ERROR_RW_NO_MEMSTICK (0x80110321)
|
||||||
#define SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA (0x80110327)
|
#define SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA (0x80110327)
|
||||||
|
#define SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_PARAMS (0x80110328)
|
||||||
#define SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_STATUS (0x8011032c)
|
#define SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_STATUS (0x8011032c)
|
||||||
|
|
||||||
#define SCE_UTILITY_SAVEDATA_ERROR_SAVE_NO_MS (0x80110381)
|
#define SCE_UTILITY_SAVEDATA_ERROR_SAVE_NO_MS (0x80110381)
|
||||||
|
|
|
@ -15,13 +15,15 @@
|
||||||
// Official git repository and contact information can be found at
|
// Official git repository and contact information can be found at
|
||||||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||||
|
|
||||||
#include "SavedataParam.h"
|
#include "Core/Reporting.h"
|
||||||
#include "image/png_load.h"
|
#include "Core/Dialog/SavedataParam.h"
|
||||||
#include "../HLE/sceKernelMemory.h"
|
#include "Core/Dialog/PSPSaveDialog.h"
|
||||||
#include "../ELF/ParamSFO.h"
|
#include "Core/HLE/sceKernelMemory.h"
|
||||||
#include "../HLE/sceChnnlsv.h"
|
#include "Core/HLE/sceChnnlsv.h"
|
||||||
|
#include "Core/ELF/ParamSFO.h"
|
||||||
#include "Core/HW/MemoryStick.h"
|
#include "Core/HW/MemoryStick.h"
|
||||||
#include "PSPSaveDialog.h"
|
|
||||||
|
#include "image/png_load.h"
|
||||||
|
|
||||||
std::string icon0Name = "ICON0.PNG";
|
std::string icon0Name = "ICON0.PNG";
|
||||||
std::string icon1Name = "ICON1.PMF";
|
std::string icon1Name = "ICON1.PMF";
|
||||||
|
@ -309,6 +311,8 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &save
|
||||||
sfoFile.SetValue("SAVEDATA_DIRECTORY", GetSaveDir(param, saveDirName), 64);
|
sfoFile.SetValue("SAVEDATA_DIRECTORY", GetSaveDir(param, saveDirName), 64);
|
||||||
|
|
||||||
// For each file, 13 bytes for filename, 16 bytes for file hash (0 in PPSSPP), 3 byte for padding
|
// For each file, 13 bytes for filename, 16 bytes for file hash (0 in PPSSPP), 3 byte for padding
|
||||||
|
if (secureMode)
|
||||||
|
{
|
||||||
const int FILE_LIST_ITEM_SIZE = 13 + 16 + 3;
|
const int FILE_LIST_ITEM_SIZE = 13 + 16 + 3;
|
||||||
const int FILE_LIST_COUNT_MAX = 99;
|
const int FILE_LIST_COUNT_MAX = 99;
|
||||||
const int FILE_LIST_TOTAL_SIZE = FILE_LIST_ITEM_SIZE * FILE_LIST_COUNT_MAX;
|
const int FILE_LIST_TOTAL_SIZE = FILE_LIST_ITEM_SIZE * FILE_LIST_COUNT_MAX;
|
||||||
|
@ -340,9 +344,10 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, const std::string &save
|
||||||
}
|
}
|
||||||
sfoFile.SetValue("SAVEDATA_FILE_LIST", tmpData, FILE_LIST_TOTAL_SIZE, FILE_LIST_TOTAL_SIZE);
|
sfoFile.SetValue("SAVEDATA_FILE_LIST", tmpData, FILE_LIST_TOTAL_SIZE, FILE_LIST_TOTAL_SIZE);
|
||||||
delete[] tmpData;
|
delete[] tmpData;
|
||||||
|
}
|
||||||
|
|
||||||
// Init param with 0. This will be used to detect crypted save or not on loading
|
// Init param with 0. This will be used to detect crypted save or not on loading
|
||||||
tmpData = new u8[128];
|
u8 *tmpData = new u8[128];
|
||||||
memset(tmpData, 0, 128);
|
memset(tmpData, 0, 128);
|
||||||
sfoFile.SetValue("SAVEDATA_PARAMS", tmpData, 128, 128);
|
sfoFile.SetValue("SAVEDATA_PARAMS", tmpData, 128, 128);
|
||||||
delete[] tmpData;
|
delete[] tmpData;
|
||||||
|
@ -833,12 +838,44 @@ bool SavedataParam::GetList(SceUtilitySavedataParam *param)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SavedataParam::GetFilesList(SceUtilitySavedataParam *param)
|
int SavedataParam::GetFilesList(SceUtilitySavedataParam *param)
|
||||||
{
|
{
|
||||||
if (!param) {
|
if (!param) {
|
||||||
return false;
|
return SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_STATUS;
|
||||||
}
|
}
|
||||||
// TODO : Need to be checked against more game
|
|
||||||
|
if (!Memory::IsValidAddress(param->fileListAddr)) {
|
||||||
|
ERROR_LOG_REPORT(HLE, "SavedataParam::GetFilesList(): bad fileList address %08x", param->fileListAddr);
|
||||||
|
// Should crash.
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto fileList = Memory::GetStruct<SceUtilitySavedataFileListInfo>(param->fileListAddr);
|
||||||
|
if (fileList->secureEntries.Valid() && fileList->maxSecureEntries > 99) {
|
||||||
|
ERROR_LOG_REPORT(HLE, "SavedataParam::GetFilesList(): too many secure entries, %d", fileList->maxSecureEntries);
|
||||||
|
return SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_PARAMS;
|
||||||
|
}
|
||||||
|
if (fileList->normalEntries.Valid() && fileList->maxNormalEntries > 8192) {
|
||||||
|
ERROR_LOG_REPORT(HLE, "SavedataParam::GetFilesList(): too many normal entries, %d", fileList->maxNormalEntries);
|
||||||
|
return SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_PARAMS;
|
||||||
|
}
|
||||||
|
if (fileList->systemEntries.Valid() && fileList->maxSystemEntries > 5) {
|
||||||
|
ERROR_LOG_REPORT(HLE, "SavedataParam::GetFilesList(): too many system entries, %d", fileList->maxSystemEntries);
|
||||||
|
return SCE_UTILITY_SAVEDATA_ERROR_RW_BAD_PARAMS;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string dirPath = savePath + GetGameName(param) + GetSaveName(param);
|
||||||
|
if (!pspFileSystem.GetFileInfo(dirPath).exists) {
|
||||||
|
DEBUG_LOG(HLE, "SavedataParam::GetFilesList(): directory %s does not exist", dirPath.c_str());
|
||||||
|
return SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Even if there are no files, initialize to 0.
|
||||||
|
fileList->resultNumSecureEntries = 0;
|
||||||
|
fileList->resultNumNormalEntries = 0;
|
||||||
|
fileList->resultNumSystemEntries = 0;
|
||||||
|
|
||||||
|
// TODO: Does not list directories, nor recurse into them, and ignores files not ALL UPPERCASE.
|
||||||
|
|
||||||
u32 dataAddr = param->fileListAddr;
|
u32 dataAddr = param->fileListAddr;
|
||||||
int foundFiles = 0;
|
int foundFiles = 0;
|
||||||
|
@ -876,8 +913,7 @@ bool SavedataParam::GetFilesList(SceUtilitySavedataParam *param)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO : verify if return true if at least 1 file found or only if all found
|
return 0;
|
||||||
return foundFiles > 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SavedataParam::GetSize(SceUtilitySavedataParam *param)
|
bool SavedataParam::GetSize(SceUtilitySavedataParam *param)
|
||||||
|
|
|
@ -17,8 +17,9 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../HLE/sceKernel.h"
|
#include "Core/HLE/sceKernel.h"
|
||||||
#include "../System.h"
|
#include "Core/HLE/sceRtc.h"
|
||||||
|
#include "Core/System.h"
|
||||||
|
|
||||||
enum SceUtilitySavedataType
|
enum SceUtilitySavedataType
|
||||||
{
|
{
|
||||||
|
@ -100,6 +101,29 @@ struct PspUtilitySavedataSizeInfo {
|
||||||
char overwriteString[8];
|
char overwriteString[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SceUtilitySavedataFileListEntry
|
||||||
|
{
|
||||||
|
int st_mode;
|
||||||
|
u64 st_size;
|
||||||
|
ScePspDateTime st_ctime;
|
||||||
|
ScePspDateTime st_atime;
|
||||||
|
ScePspDateTime st_mtime;
|
||||||
|
char name[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SceUtilitySavedataFileListInfo
|
||||||
|
{
|
||||||
|
u32 maxSecureEntries;
|
||||||
|
u32 maxNormalEntries;
|
||||||
|
u32 maxSystemEntries;
|
||||||
|
u32 resultNumSecureEntries;
|
||||||
|
u32 resultNumNormalEntries;
|
||||||
|
u32 resultNumSystemEntries;
|
||||||
|
PSPPointer<SceUtilitySavedataFileListEntry> secureEntries;
|
||||||
|
PSPPointer<SceUtilitySavedataFileListEntry> normalEntries;
|
||||||
|
PSPPointer<SceUtilitySavedataFileListEntry> systemEntries;
|
||||||
|
};
|
||||||
|
|
||||||
// Structure to hold the parameters for the sceUtilitySavedataInitStart function.
|
// Structure to hold the parameters for the sceUtilitySavedataInitStart function.
|
||||||
struct SceUtilitySavedataParam
|
struct SceUtilitySavedataParam
|
||||||
{
|
{
|
||||||
|
@ -216,7 +240,7 @@ public:
|
||||||
bool Load(SceUtilitySavedataParam* param, const std::string &saveDirName, int saveId = -1, bool secureMode = true);
|
bool Load(SceUtilitySavedataParam* param, const std::string &saveDirName, int saveId = -1, bool secureMode = true);
|
||||||
bool GetSizes(SceUtilitySavedataParam* param);
|
bool GetSizes(SceUtilitySavedataParam* param);
|
||||||
bool GetList(SceUtilitySavedataParam* param);
|
bool GetList(SceUtilitySavedataParam* param);
|
||||||
bool GetFilesList(SceUtilitySavedataParam* param);
|
int GetFilesList(SceUtilitySavedataParam* param);
|
||||||
bool GetSize(SceUtilitySavedataParam* param);
|
bool GetSize(SceUtilitySavedataParam* param);
|
||||||
bool IsSaveEncrypted(SceUtilitySavedataParam* param, const std::string &saveDirName);
|
bool IsSaveEncrypted(SceUtilitySavedataParam* param, const std::string &saveDirName);
|
||||||
|
|
||||||
|
|
|
@ -264,5 +264,31 @@ const char *GetAddressName(u32 address);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct PSPPointer
|
||||||
|
{
|
||||||
|
u32 ptr;
|
||||||
|
|
||||||
|
T &operator*() const
|
||||||
|
{
|
||||||
|
return *(T *)(Memory::base + ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
T &operator[](int i) const
|
||||||
|
{
|
||||||
|
return *((T *)(Memory::base + ptr) + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
T *operator->() const
|
||||||
|
{
|
||||||
|
return (T *)(Memory::base + ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Valid() const
|
||||||
|
{
|
||||||
|
return Memory::IsValidAddress(ptr);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue