fix structs

expose overlay
fix aruid un-/registration
This commit is contained in:
HookedBehemoth 2020-02-10 18:36:57 +01:00 committed by HookedBehemoth
parent 4d973fc3be
commit 1132d6bac0
3 changed files with 38 additions and 24 deletions

View File

@ -88,9 +88,8 @@ typedef struct {
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime
u8 storage; ///< \ref CapsAlbumStorage u8 storage; ///< \ref CapsAlbumStorage
u8 content; ///< \ref CapsAlbumFileContents u8 content; ///< \ref CapsAlbumFileContents
u32 pad_x12; ///< Set to 0 by official software u8 pad_x12[0x6]; ///< padding
u16 pad_x16; ///< Set to 0 by official software } CapsAlbumFileId;
} PACKED CapsAlbumFileId;
/// AlbumEntry /// AlbumEntry
typedef struct { typedef struct {
@ -104,14 +103,17 @@ typedef struct {
u8 data[0x20]; ///< Data. u8 data[0x20]; ///< Data.
struct { struct {
u8 unk_x0[0x20]; ///< Unknown. u8 unk_x0[0x20]; ///< aes256 with random key over \ref AlbumEntry.
} v0; ///< Pre-7.0.0 } v0; ///< Pre-7.0.0
struct { struct {
u64 size; ///< size of the entry u64 size; ///< size of the entry
u64 application_id; ///< ApplicationId u64 hash; ///< aes256 with hardcoded key over \ref AlbumEntry.
CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime 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+] } v1; ///< [7.0.0+]
}; };
} CapsApplicationAlbumEntry; } CapsApplicationAlbumEntry;

View File

@ -19,13 +19,16 @@ void capscExit(void);
Service* capscGetServiceSession(void); Service* capscGetServiceSession(void);
Result capscNotifyAlbumStorageIsAvailable(CapsAlbumStorage storage); Result capscNotifyAlbumStorageIsAvailable(CapsAlbumStorage storage);
Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage); Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage);
Result capscRegisterAppletResourceUserId(u64 appletResourceUserId); Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id);
Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId); Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id);
Result capscGetApplicationIdFromAruid(u64 *application_id, u64 aruid); Result capscGetApplicationIdFromAruid(u64 *application_id, u64 aruid);
Result capscCheckApplicationIdRegistered(u64 application_id); Result capscCheckApplicationIdRegistered(u64 application_id);
Result capscGenerateCurrentAlbumFileId(u64 application_id, CapsAlbumFileContents contents, CapsAlbumFileId *file_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 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 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 capscOpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id);
Result capscCloseAlbumMovieStream(u64 stream); Result capscCloseAlbumMovieStream(u64 stream);

View File

@ -56,23 +56,23 @@ Result capscNotifyAlbumStorageIsUnAvailable(CapsAlbumStorage storage) {
return _capscCmdInU8NoOut(&g_capscSrv, 2002, inval); return _capscCmdInU8NoOut(&g_capscSrv, 2002, inval);
} }
Result capscRegisterAppletResourceUserId(u64 appletResourceUserId) { Result capscRegisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id) {
if (hosversionBefore(2,0,0)) if (hosversionBefore(2,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
const struct { const struct {
u64 version; u64 appletResourceUserId;
u64 AppletResourceUserId; u64 applicationId;
} in = { capsGetShimLibraryVersion(), appletResourceUserId }; } in = { appletResourceUserId, application_id };
return serviceDispatchIn(&g_capscSrv, 2011, in); return serviceDispatchIn(&g_capscSrv, 2011, in);
} }
Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId) { Result capscUnregisterAppletResourceUserId(u64 appletResourceUserId, u64 application_id) {
if (hosversionBefore(2,0,0)) if (hosversionBefore(2,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
const struct { const struct {
u64 version; u64 appletResourceUserId;
u64 AppletResourceUserId; u64 applicationId;
} in = { capsGetShimLibraryVersion(), appletResourceUserId }; } in = { appletResourceUserId, application_id };
return serviceDispatchIn(&g_capscSrv, 2012, in); return serviceDispatchIn(&g_capscSrv, 2012, in);
} }
@ -85,7 +85,6 @@ Result capscGetApplicationIdFromAruid(u64 *application_id, u64 aruid) {
Result capscCheckApplicationIdRegistered(u64 application_id) { Result capscCheckApplicationIdRegistered(u64 application_id) {
if (hosversionBefore(2,0,0)) if (hosversionBefore(2,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
return serviceDispatchIn(&g_capscSrv, 2014, application_id); return serviceDispatchIn(&g_capscSrv, 2014, application_id);
} }
@ -94,11 +93,21 @@ Result capscGenerateCurrentAlbumFileId(u64 application_id, CapsAlbumFileContents
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
const struct { const struct {
u8 type; u8 type;
u64 application_id; u64 applicationId;
} in = { contents, application_id }; } in = { contents, application_id };
return serviceDispatchInOut(&g_capscSrv, 2101, in, *file_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) { Result capscSaveAlbumScreenShotFile(CapsAlbumFileId *file_id, void* buffer, u64 buffer_size) {
if (hosversionBefore(2,0,0) || hosversionAtLeast(4,0,0)) if (hosversionBefore(2,0,0) || hosversionAtLeast(4,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); 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, return serviceDispatchIn(&g_capscSrv, cmd_id, *file_id,
.buffer_attrs = { SfBufferAttr_HipcMapTransferAllowsNonSecure | SfBufferAttr_HipcMapAlias | SfBufferAttr_In }, .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)) if (hosversionBefore(2,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); 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)) if (hosversionBefore(4,0,0))
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); 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) { static Result _capscOpenControlSession(Service *srv_out) {