From 0628bf5db41ed8a92bf37ba4d62dbf6c2274ce50 Mon Sep 17 00:00:00 2001 From: Adubbz Date: Tue, 23 Jul 2019 21:15:46 +1000 Subject: [PATCH] Implement fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId and fsWriteSaveDataFileSystemExtraData --- nx/include/switch/services/fs.h | 2 + nx/source/services/fs.c | 82 ++++++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/nx/include/switch/services/fs.h b/nx/include/switch/services/fs.h index cf356275..e8cc978f 100644 --- a/nx/include/switch/services/fs.h +++ b/nx/include/switch/services/fs.h @@ -269,7 +269,9 @@ Result fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId saveDataSpa Result fsIsExFatSupported(bool* out); Result fsOpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartiton partition); +Result fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId saveDataSpaceId, u64 saveID); Result fsReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID); +Result fsWriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDataSpaceId saveDataSpaceId, u64 saveID); /// Do not call this directly, see fs_dev.h. Result fsMountSdcard(FsFileSystem* out); diff --git a/nx/source/services/fs.c b/nx/source/services/fs.c index 959ae6ae..5e4fdbb2 100644 --- a/nx/source/services/fs.c +++ b/nx/source/services/fs.c @@ -776,6 +776,46 @@ Result fsOpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handl return rc; } +Result fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId saveDataSpaceId, u64 saveID) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + IpcCommand c; + ipcInitialize(&c); + ipcAddRecvBuffer(&c, buf, len, BufferType_Normal); + + struct { + u64 magic; + u64 cmd_id; + u64 saveDataSpaceId; + u64 saveID; + } *raw; + + raw = serviceIpcPrepareHeader(&g_fsSrv, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 57; + raw->saveDataSpaceId = saveDataSpaceId; + raw->saveID = saveID; + + Result rc = serviceIpcDispatch(&g_fsSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + } *resp; + + serviceIpcParse(&g_fsSrv, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + Result fsReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID) { IpcCommand c; ipcInitialize(&c); @@ -784,7 +824,7 @@ Result fsReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID) { struct { u64 magic; u64 cmd_id; - u32 saveID; + u64 saveID; } *raw; raw = serviceIpcPrepareHeader(&g_fsSrv, &c, sizeof(*raw)); @@ -811,6 +851,46 @@ Result fsReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID) { return rc; } +Result fsWriteSaveDataFileSystemExtraData(const void* buf, size_t len, FsSaveDataSpaceId saveDataSpaceId, u64 saveID) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + IpcCommand c; + ipcInitialize(&c); + ipcAddSendBuffer(&c, buf, len, BufferType_Normal); + + struct { + u64 magic; + u64 cmd_id; + u64 saveDataSpaceId; + u64 saveID; + } *raw; + + raw = serviceIpcPrepareHeader(&g_fsSrv, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 59; + raw->saveDataSpaceId = saveDataSpaceId; + raw->saveID = saveID; + + Result rc = serviceIpcDispatch(&g_fsSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + } *resp; + + serviceIpcParse(&g_fsSrv, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + // Wrapper(s) for fsCreateSaveDataFileSystemBySystemSaveDataId. Result fsCreate_SystemSaveDataWithOwner(FsSaveDataSpaceId saveDataSpaceId, u64 saveID, u128 userID, u64 ownerId, u64 size, u64 journalSize, u32 flags) { FsSave save = {