diff --git a/nx/include/switch/services/ns.h b/nx/include/switch/services/ns.h index ea040a7f..981ae9a8 100644 --- a/nx/include/switch/services/ns.h +++ b/nx/include/switch/services/ns.h @@ -18,6 +18,18 @@ void nsExit(void); Result nsGetApplicationControlData(u8 flag, u64 titleID, NsApplicationControlData* buffer, size_t size, size_t* actual_size); +/** + * @brief Returns the total storage from content manager services. + * @param size Pointer to output the total storage size to. + */ +Result nsGetTotalSpaceSize(u64 *size); + +/** + * @brief Returns the available storage from content manager services. + * @param size Pointer to output the free storage size to. + */ +Result nsGetFreeSpaceSize(u64 *size); + Result nsvmInitialize(void); void nsvmExit(void); diff --git a/nx/source/services/ns.c b/nx/source/services/ns.c index 1c64f6e6..15864d36 100644 --- a/nx/source/services/ns.c +++ b/nx/source/services/ns.c @@ -117,6 +117,80 @@ Result nsGetApplicationControlData(u8 flag, u64 titleID, NsApplicationControlDat return rc; } +Result nsGetTotalSpaceSize(u64 *size) +{ + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 media_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 47; + raw->media_id = 5; + + Result rc = serviceIpcDispatch(&g_nsAppManSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + u64 size; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc) && size) *size = resp->size; + } + + return rc; +} + +Result nsGetFreeSpaceSize(u64 *size) +{ + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 media_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 48; + raw->media_id = 5; + + Result rc = serviceIpcDispatch(&g_nsAppManSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + u64 size; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc) && size) *size = resp->size; + } + + return rc; +} + Result nsvmInitialize(void) { if (!kernelAbove300())