diff --git a/nx/include/switch/services/ncm.h b/nx/include/switch/services/ncm.h index 8f7ea1cc..cd2f9cbd 100644 --- a/nx/include/switch/services/ncm.h +++ b/nx/include/switch/services/ncm.h @@ -76,6 +76,7 @@ Result ncmContentStorageDelete(NcmContentStorage* cs, const NcmNcaId* registered Result ncmContentStorageHas(NcmContentStorage* cs, const NcmNcaId* ncaId, bool* out); Result ncmContentStorageGetPath(NcmContentStorage* cs, const NcmNcaId* ncaId, char* out, size_t outSize); Result ncmContentStorageGetSize(NcmContentStorage* cs, const NcmNcaId* ncaId, u64* out); +Result ncmContentStorageDisableForcibly(NcmContentStorage* cs); Result ncmContentStorageReadContentIdFile(NcmContentStorage* cs, const NcmNcaId* ncaId, u64 offset, void* outBuf, size_t bufSize); Result ncmContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, const NcmNcaId* ncaId, NcmRightsId* rightsIdOut, u32* keyGenerationOut); @@ -88,4 +89,5 @@ Result ncmContentMetaDatabaseList(NcmContentMetaDatabase* db, u32 titleType, u64 Result ncmContentMetaDatabaseGetLatestContentMetaKey(NcmContentMetaDatabase* db, u64 titleId, NcmMetaRecord* out); Result ncmContentMetaDatabaseListApplication(NcmContentMetaDatabase* db, u8 filter, NcmApplicationContentMetaKey* outBuf, size_t outBufSize, u32* numEntriesWritten, u32* numEntriesTotal); Result ncmContentMetaDatabaseHas(NcmContentMetaDatabase* db, const NcmMetaRecord* record, bool* out); +Result ncmContentMetaDatabaseDisableForcibly(NcmContentMetaDatabase* db); Result ncmContentMetaDatabaseCommit(NcmContentMetaDatabase* db); diff --git a/nx/source/services/ncm.c b/nx/source/services/ncm.c index 4308cb3b..584cdf2f 100644 --- a/nx/source/services/ncm.c +++ b/nx/source/services/ncm.c @@ -408,6 +408,36 @@ Result ncmContentStorageGetSize(NcmContentStorage* cs, const NcmNcaId* ncaId, u6 return rc; } +Result ncmContentStorageDisableForcibly(NcmContentStorage* cs) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + raw->magic = SFCI_MAGIC; + raw->cmd_id = 15; + + Result rc = serviceIpcDispatch(&cs->s); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + Result ncmContentStorageReadContentIdFile(NcmContentStorage* cs, const NcmNcaId* ncaId, u64 offset, void* outBuf, size_t bufSize) { IpcCommand c; ipcInitialize(&c); @@ -828,6 +858,36 @@ Result ncmContentMetaDatabaseHas(NcmContentMetaDatabase* db, const NcmMetaRecord return rc; } +Result ncmContentMetaDatabaseDisableForcibly(NcmContentMetaDatabase* db) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 13; + + Result rc = serviceIpcDispatch(&db->s); + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + Result ncmContentMetaDatabaseCommit(NcmContentMetaDatabase* db) { IpcCommand c; ipcInitialize(&c);