diff --git a/nx/include/switch/services/ns.h b/nx/include/switch/services/ns.h index f3733666..5003ef68 100644 --- a/nx/include/switch/services/ns.h +++ b/nx/include/switch/services/ns.h @@ -104,13 +104,15 @@ typedef struct { /// SystemDeliveryInfo typedef struct { - u32 protocol_version; ///< Must be <= to and match a system-setting. - u8 unk_x4[0x8]; ///< Unused by \ref nssuRequestSendSystemUpdate / \ref nssuControlRequestReceiveSystemUpdate, besides HMAC validation. - u32 systemupdate_meta_version; ///< SystemUpdate meta version. - u64 systemupdate_meta_titleid; ///< SystemUpdate meta titleID. - u8 unk_x18; ///< Copied into state by \ref nssuRequestSendSystemUpdate. - u8 unk_x19[0xc7]; ///< Unused by \ref nssuRequestSendSystemUpdate / \ref nssuControlRequestReceiveSystemUpdate, besides HMAC validation. - u8 hmac[0x20]; ///< HMAC-SHA256 over the previous 0xe0-bytes. + u32 system_delivery_protocol_version; ///< Must be <= to and match a system-setting. + u32 application_delivery_protocol_version; ///< Loaded from a system-setting. Unused by \ref nssuRequestSendSystemUpdate / \ref nssuControlRequestReceiveSystemUpdate, besides HMAC validation. + u32 includes_exfat; ///< Whether ExFat is included. Unused by \ref nssuRequestSendSystemUpdate / \ref nssuControlRequestReceiveSystemUpdate, besides HMAC validation. + u32 systemupdate_meta_version; ///< SystemUpdate meta version. + u64 systemupdate_meta_titleid; ///< SystemUpdate meta titleID. + u8 unk_x18; ///< Copied into state by \ref nssuRequestSendSystemUpdate. + u8 unk_x19; ///< Unused by \ref nssuRequestSendSystemUpdate / \ref nssuControlRequestReceiveSystemUpdate, besides HMAC validation. + u8 unk_x1a[0xc6]; ///< Unused by \ref nssuRequestSendSystemUpdate / \ref nssuControlRequestReceiveSystemUpdate, besides HMAC validation. + u8 hmac[0x20]; ///< HMAC-SHA256 over the previous 0xe0-bytes. } NsSystemDeliveryInfo; /// Default size for \ref nssuControlSetupCardUpdate / \ref nssuControlSetupCardUpdateViaSystemUpdater. This is the size used by qlaunch for SetupCardUpdate. @@ -174,6 +176,13 @@ Result nsGetTotalSpaceSize(FsStorageId storage_id, u64 *size); */ Result nsGetFreeSpaceSize(FsStorageId storage_id, u64 *size); +/** + * @brief Generates a \ref NsSystemDeliveryInfo using the currently installed SystemUpdate meta title. + * @note Only available on [4.0.0+]. + * @param[out] info \ref NsSystemDeliveryInfo + */ +Result nsGetSystemDeliveryInfo(NsSystemDeliveryInfo *info); + ///@} ///@name ns:vm diff --git a/nx/source/services/ns.c b/nx/source/services/ns.c index 211a7a4e..6ee153ca 100644 --- a/nx/source/services/ns.c +++ b/nx/source/services/ns.c @@ -216,6 +216,16 @@ Result nsGetFreeSpaceSize(FsStorageId storage_id, u64 *size) { return _nsCmdInU64OutU64(&g_nsAppManSrv, storage_id, size, 48); } +Result nsGetSystemDeliveryInfo(NsSystemDeliveryInfo *info) { + if (hosversionBefore(4,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return serviceDispatch(&g_nsAppManSrv, 2000, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { info, sizeof(*info) } }, + ); +} + // ns:vm NX_GENERATE_SERVICE_GUARD(nsvm);