diff --git a/nx/include/switch/services/fs.h b/nx/include/switch/services/fs.h index 4ea337eb..aa8a37df 100644 --- a/nx/include/switch/services/fs.h +++ b/nx/include/switch/services/fs.h @@ -17,6 +17,9 @@ /// For use with fsMountSaveData(). #define FS_MOUNTSAVEDATA_INVAL_DEFAULT 0x1 +/// For use with fsMountSystemSaveData(). +#define FS_MOUNTSYSTEMSAVEDATA_INVAL_DEFAULT 0x0 + /// For use with FsSave. #define FS_SAVEDATA_CURRENT_TITLEID 0 @@ -96,6 +99,7 @@ Service* fsGetServiceSession(void); Result fsMountSdcard(FsFileSystem* out); Result fsMountSaveData(FsFileSystem* out, u8 inval, FsSave *save); +Result fsMountSystemSaveData(FsFileSystem* out, u8 inval, FsSave *save); Result fsOpenDataStorageByCurrentProcess(FsStorage* out); // todo: Rest of commands here @@ -105,6 +109,10 @@ Result fsOpenDataStorageByCurrentProcess(FsStorage* out); /// See FsSave for titleID and userID. Result fsMount_SaveData(FsFileSystem* out, u64 titleID, u128 userID); +/// Wrapper for fsMountSystemSaveData. +/// WARNING: You can brick when writing to SystemSaveData, if the data is corrupted etc. +Result fsMount_SystemSaveData(FsFileSystem* out, u64 saveID); + // IFileSystem Result fsFsCreateFile(FsFileSystem* fs, const char* path, size_t size, int flags); Result fsFsDeleteFile(FsFileSystem* fs, const char* path); diff --git a/nx/source/services/fs.c b/nx/source/services/fs.c index 22634b72..c02d3edb 100644 --- a/nx/source/services/fs.c +++ b/nx/source/services/fs.c @@ -138,6 +138,45 @@ Result fsMountSaveData(FsFileSystem* out, u8 inval, FsSave *save) { return rc; } +Result fsMountSystemSaveData(FsFileSystem* out, u8 inval, FsSave *save) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 inval;//Actually u8. + FsSave save; + } PACKED *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 52; + raw->inval = (u64)inval; + memcpy(&raw->save, save, sizeof(FsSave)); + + Result rc = serviceIpcDispatch(&g_fsSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + out->h = r.Handles[0]; + } + } + + return rc; +} + Result fsOpenDataStorageByCurrentProcess(FsStorage* out) { IpcCommand c; ipcInitialize(&c); @@ -185,6 +224,16 @@ Result fsMount_SaveData(FsFileSystem* out, u64 titleID, u128 userID) { return fsMountSaveData(out, FS_MOUNTSAVEDATA_INVAL_DEFAULT, &save); } +Result fsMount_SystemSaveData(FsFileSystem* out, u64 saveID) { + FsSave save; + + memset(&save, 0, sizeof(save)); + save.saveID = saveID; + save.ContentStorageId = FS_CONTENTSTORAGEID_NandSystem; + + return fsMountSystemSaveData(out, FS_MOUNTSYSTEMSAVEDATA_INVAL_DEFAULT, &save); +} + // IFileSystem impl Result fsFsCreateFile(FsFileSystem* fs, const char* path, size_t size, int flags) { IpcCommand c;