From 420bc60d72d9c147ffd0af5b6cc7402f2f7d47e7 Mon Sep 17 00:00:00 2001 From: HookedBehemoth Date: Mon, 10 Feb 2020 18:36:57 +0100 Subject: [PATCH] fix structs expose overlay fix aruid un-/registration --- nx/include/switch/services/caps.h | 14 +++++----- nx/include/switch/services/capsc.h | 7 +++-- nx/source/services/capsc.c | 41 ++++++++++++++++++------------ 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/nx/include/switch/services/caps.h b/nx/include/switch/services/caps.h index a52ca0f5..67d5341e 100644 --- a/nx/include/switch/services/caps.h +++ b/nx/include/switch/services/caps.h @@ -88,9 +88,8 @@ typedef struct { CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime u8 storage; ///< \ref CapsAlbumStorage u8 content; ///< \ref CapsAlbumFileContents - u32 pad_x12; ///< Set to 0 by official software - u16 pad_x16; ///< Set to 0 by official software -} PACKED CapsAlbumFileId; + u8 pad_x12[0x6]; ///< padding +} CapsAlbumFileId; /// AlbumEntry typedef struct { @@ -104,14 +103,17 @@ typedef struct { u8 data[0x20]; ///< Data. struct { - u8 unk_x0[0x20]; ///< Unknown. + u8 unk_x0[0x20]; ///< aes256 with random key over \ref AlbumEntry. } v0; ///< Pre-7.0.0 struct { u64 size; ///< size of the entry - u64 application_id; ///< ApplicationId + u64 hash; ///< aes256 with hardcoded key over \ref AlbumEntry. CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime - u8 unk_x18[0x8]; ///< Unknown. + u8 storage; ///< \ref CapsAlbumStorage + u8 content; ///< \ref CapsAlbumFileContents + u8 pad_x1a[0x5]; ///< padding + u8 unk_x1f; ///< Set to 1 by official software } v1; ///< [7.0.0+] }; } CapsApplicationAlbumEntry; diff --git a/nx/include/switch/services/capsc.h b/nx/include/switch/services/capsc.h index eb822aab..86524397 100644 --- a/nx/include/switch/services/capsc.h +++ b/nx/include/switch/services/capsc.h @@ -19,13 +19,16 @@ void capscExit(void); Service* capscGetServiceSession(void); Result capscNotifyAlbumStorageIsAvailable(CapsAlbumStorage storage); Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage); -Result capscRegisterAppletResourceUserId(u64 appletResourceUserId); -Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId); +Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id); +Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id); Result capscGetApplicationIdFromAruid(u64 *application_id, u64 aruid); Result capscCheckApplicationIdRegistered(u64 application_id); Result capscGenerateCurrentAlbumFileId(u64 application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_id); +Result capscGenerateApplicationAlbumEntry(CapsApplicationAlbumEntry *appEntry, const CapsAlbumEntry *entry, u64 application_id); Result capscSaveAlbumScreenShotFile(CapsAlbumFileId *file_id, void* buffer, u64 buffer_size); Result capscSaveAlbumScreenShotFileEx(CapsAlbumFileId *file_id, u64 unk_0, u64 unk_1, u64 unk_2, void* buffer, u64 buffer_size); +Result capscSetOverlayScreenShotThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size); +Result capscSetOverlayMovieThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size); Result capscOpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id); Result capscCloseAlbumMovieStream(u64 stream); diff --git a/nx/source/services/capsc.c b/nx/source/services/capsc.c index 3f3fb720..5cb82068 100644 --- a/nx/source/services/capsc.c +++ b/nx/source/services/capsc.c @@ -56,23 +56,23 @@ Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage) { return _capscCmdInU8NoOut(&g_capscSrv, 2002, inval); } -Result capscRegisterAppletResourceUserId(u64 appletResourceUserId) { +Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { - u64 version; - u64 AppletResourceUserId; - } in = { capsGetShimLibraryVersion(), appletResourceUserId }; + u64 appletResourceUserId; + u64 applicationId; + } in = { appletResourceUserId, application_id }; return serviceDispatchIn(&g_capscSrv, 2011, in); } -Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId) { +Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { - u64 version; - u64 AppletResourceUserId; - } in = { capsGetShimLibraryVersion(), appletResourceUserId }; + u64 appletResourceUserId; + u64 applicationId; + } in = { appletResourceUserId, application_id }; return serviceDispatchIn(&g_capscSrv, 2012, in); } @@ -85,7 +85,6 @@ Result capscGetApplicationIdFromAruid(u64 *application_id, u64 aruid) { Result capscCheckApplicationIdRegistered(u64 application_id) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return serviceDispatchIn(&g_capscSrv, 2014, application_id); } @@ -94,11 +93,21 @@ Result capscGenerateCurrentAlbumFileId(u64 application_id, CapsAlbumFileContents return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); const struct { u8 type; - u64 application_id; + u64 applicationId; } in = { contents, application_id }; return serviceDispatchInOut(&g_capscSrv, 2101, in, *file_id); } +Result capscGenerateApplicationAlbumEntry(CapsApplicationAlbumEntry *appEntry, const CapsAlbumEntry *entry, u64 application_id) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + const struct { + CapsAlbumEntry entry; + u64 applicationId; + } in = { *entry, application_id }; + return serviceDispatchInOut(&g_capscSrv, 2102, in, *appEntry); +} + Result capscSaveAlbumScreenShotFile(CapsAlbumFileId *file_id, void* buffer, u64 buffer_size) { if (hosversionBefore(2,0,0) || hosversionAtLeast(4,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); @@ -123,23 +132,23 @@ Result capscSaveAlbumScreenShotFileEx(CapsAlbumFileId *file_id, u64 unk_0, u64 u ); } -static Result _capscSetOverlayThumbnailData(u32 cmd_id, CapsAlbumFileId *file_id, void* buffer, u64 size) { +static Result _capscSetOverlayThumbnailData(u32 cmd_id, const CapsAlbumFileId *file_id, const void* image, u64 image_size) { return serviceDispatchIn(&g_capscSrv, cmd_id, *file_id, .buffer_attrs = { SfBufferAttr_HipcMapTransferAllowsNonSecure | SfBufferAttr_HipcMapAlias | SfBufferAttr_In }, - .buffers = { { buffer, size }, }, + .buffers = { { image, image_size }, }, ); } -Result capscSetOverlayScreenShotThumbnailData(CapsAlbumFileId *file_id, void* buffer, u64 size) { +Result capscSetOverlayScreenShotThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return _capscSetOverlayThumbnailData(2301, file_id, buffer, size); + return _capscSetOverlayThumbnailData(2301, file_id, image, image_size); } -Result capscSetOverlayMovieThumbnailData(CapsAlbumFileId *file_id, void* buffer, u64 size) { +Result capscSetOverlayMovieThumbnailData(const CapsAlbumFileId *file_id, const void* image, u64 image_size) { if (hosversionBefore(4,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return _capscSetOverlayThumbnailData(2302, file_id, buffer, size); + return _capscSetOverlayThumbnailData(2302, file_id, image, image_size); } static Result _capscOpenControlSession(Service *srv_out) {