diff --git a/nx/include/switch/services/capsc.h b/nx/include/switch/services/capsc.h index c348022a0..d44f0c89d 100644 --- a/nx/include/switch/services/capsc.h +++ b/nx/include/switch/services/capsc.h @@ -9,6 +9,13 @@ #include "../sf/service.h" #include "../services/caps.h" +typedef struct { + u64 application_id; + u8 unknown_08; + u8 unknown_09; + u8 reserved[6]; +} CapsApplicationId; + /// Initialize caps:c Result capscInitialize(void); @@ -40,7 +47,7 @@ Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage); * @param[in] appletResourceUserId AppletResourceUserId. * @param[in] application_id ApplicationId. */ -Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id); +Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id); /** * @brief Unregister an applet. @@ -49,7 +56,7 @@ Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 applicati * @param[in] appletResourceUserId AppletResourceUserId. * @param[in] application_id ApplicationId. */ -Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id); +Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id); /** * @brief Get an ApplicationId that corresponds to an AppletResourceUserId. @@ -58,7 +65,7 @@ Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 applica * @param[out] application_id ApplicationId. * @param[in] appletResourceUserId AppletResourceUserId. */ -Result capscGetApplicationIdFromAruid(u64 *application_id, u64 aruid); +Result capscGetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid); /** * @brief Checks whether an ApplicationId is registered. @@ -74,7 +81,7 @@ Result capscCheckApplicationIdRegistered(u64 application_id); * @param[in] contents \ref CapsAlbumFileContents * @param[out] file_id \ref CapsAlbumFileId */ -Result capscGenerateCurrentAlbumFileId(u64 application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id); +Result capscGenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id); /** * @brief Generate an ApplicationAlbumEntry based on parameters. diff --git a/nx/source/services/capsc.c b/nx/source/services/capsc.c index 062e49fe7..1f49d3814 100644 --- a/nx/source/services/capsc.c +++ b/nx/source/services/capsc.c @@ -54,30 +54,38 @@ Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage) { return _capscCmdInU8NoOut(&g_capscSrv, 2002, storage); } -Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id) { +Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { u64 appletResourceUserId; - u64 applicationId; - } in = { appletResourceUserId, application_id }; + CapsApplicationId applicationId; + } in = { appletResourceUserId, *application_id }; return serviceDispatchIn(&g_capscSrv, 2011, in); } -Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id) { +Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, const CapsApplicationId *application_id) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { u64 appletResourceUserId; - u64 applicationId; - } in = { appletResourceUserId, application_id }; + CapsApplicationId applicationId; + } in = { appletResourceUserId, *application_id }; return serviceDispatchIn(&g_capscSrv, 2012, in); } -Result capscGetApplicationIdFromAruid(u64 *application_id, u64 aruid) { +Result capscGetApplicationIdFromAruid(CapsApplicationId *application_id, u64 aruid) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return serviceDispatchInOut(&g_capscSrv, 2013, aruid, *application_id); + + if (hosversionAtLeast(19,0,0)) + return serviceDispatchInOut(&g_capscSrv, 2013, aruid, *application_id); + + u64 old_application_id=0; + Result rc = serviceDispatchInOut(&g_capscSrv, 2013, aruid, old_application_id); + if (R_SUCCEEDED(rc)) + *application_id = (CapsApplicationId){ old_application_id, 0, 0 }; + return rc; } Result capscCheckApplicationIdRegistered(u64 application_id) { @@ -86,13 +94,13 @@ Result capscCheckApplicationIdRegistered(u64 application_id) { return serviceDispatchIn(&g_capscSrv, 2014, application_id); } -Result capscGenerateCurrentAlbumFileId(u64 application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id) { +Result capscGenerateCurrentAlbumFileId(const CapsApplicationId *application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { u8 type; - u64 applicationId; - } in = { contents, application_id }; + CapsApplicationId applicationId; + } in = { contents, *application_id }; return serviceDispatchInOut(&g_capscSrv, 2101, in, *file_id); }