From ac8ac4919e2e17c1acddeb8445aceb543e1fa629 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Thu, 20 Aug 2020 23:20:10 -0400 Subject: [PATCH] set: Updated for [10.1.0+], added more cmds, use struct for nickname. --- nx/include/switch/services/set.h | 44 +++++++++++-- nx/source/services/set.c | 104 +++++++++++++++---------------- 2 files changed, 89 insertions(+), 59 deletions(-) diff --git a/nx/include/switch/services/set.h b/nx/include/switch/services/set.h index 40f2d24d..9ed2b1bb 100644 --- a/nx/include/switch/services/set.h +++ b/nx/include/switch/services/set.h @@ -16,7 +16,6 @@ #include "../sf/service.h" #define SET_MAX_NAME_SIZE 0x48 -#define SET_MAX_NICKNAME_SIZE 0x80 typedef enum { ColorSetId_Light = 0, @@ -43,6 +42,7 @@ typedef enum SetLanguage_ES419 = 14, ///< "LatinAmericanSpanish" SetLanguage_ZHHANS = 15, ///< [4.0.0+] ChineseSimplified SetLanguage_ZHHANT = 16, ///< [4.0.0+] ChineseTraditional + SetLanguage_PTBR = 17, ///< [10.1.0+] "BrazilianPortuguese" SetLanguage_Total, ///< Total languages supported by this enum. } SetLanguage; @@ -346,6 +346,11 @@ typedef struct { char number[0x18]; } SetSysSerialNumber; +/// DeviceNickName +typedef struct { + char nickname[0x80]; +} SetSysDeviceNickName; + /// UserSelectorSettings typedef struct { u32 flags; ///< Bitmask with \ref SetSysUserSelectorFlag. @@ -891,6 +896,20 @@ Result setGetAvailableLanguageCodeCount(s32 *total); /// Gets the RegionCode. Result setGetRegionCode(SetRegion *out); +/** + * @brief GetQuestFlag + * @note Only available on [5.0.0+]. + * @param[out] out Output flag. + */ +Result setGetQuestFlag(bool *out); + +/** + * @brief Gets the system's nickname. + * @note Only available on [10.1.0+]. + * @param[out] nickname \ref SetSysDeviceNickName + */ +Result setGetDeviceNickname(SetSysDeviceNickName *nickname); + /// Initialize setsys. Result setsysInitialize(void); @@ -1358,15 +1377,16 @@ Result setsysSetInitialLaunchSettings(const SetSysInitialLaunchSettings *setting /** * @brief Gets the system's nickname. - * @param nickname Pointer to output the nickname to. (The buffer size needs to be at least 0x80 bytes) + * @note Same as \ref setGetDeviceNickname, which official sw uses instead on [10.1.0+]. + * @param[out] nickname \ref SetSysDeviceNickName */ -Result setsysGetDeviceNickname(char* nickname); +Result setsysGetDeviceNickname(SetSysDeviceNickName *nickname); /** * @brief Sets the system's nickname. - * @param nickname Pointer to read the nickname from. + * @param[in] nickname \ref SetSysDeviceNickName */ -Result setsysSetDeviceNickname(const char* nickname); +Result setsysSetDeviceNickname(const SetSysDeviceNickName *nickname); /** * @brief GetProductModel @@ -2238,6 +2258,20 @@ Result setsysGetButtonConfigRegisteredSettings(s32 *total_out, SetSysButtonConfi */ Result setsysSetButtonConfigRegisteredSettings(const SetSysButtonConfigRegisteredSettings *settings, s32 count); +/** + * @brief GetFieldTestingFlag + * @note Only available on [10.1.0+]. + * @param[out] out Output flag. + */ +Result setsysGetFieldTestingFlag(bool *out); + +/** + * @brief SetFieldTestingFlag + * @note Only available on [10.1.0+]. + * @param[in] flag Input flag. + */ +Result setsysSetFieldTestingFlag(bool flag); + /// Initialize setcal. Result setcalInitialize(void); diff --git a/nx/source/services/set.c b/nx/source/services/set.c index af9bde8c..dd1232dd 100644 --- a/nx/source/services/set.c +++ b/nx/source/services/set.c @@ -118,6 +118,13 @@ static Result _setCmdInUuidNoOut(Service* srv, const Uuid *inval, u32 cmd_id) { return serviceDispatchIn(srv, cmd_id, *inval); } +static Result _setCmdOutBufAliasFixed(Service* srv, void* buffer, size_t size, u32 cmd_id) { + return serviceDispatch(srv, cmd_id, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out | SfBufferAttr_FixedSize }, + .buffers = { { buffer, size } }, + ); +} + static Result setInitializeLanguageCodesCache(void) { if (g_setLanguageCodesInitialized) return 0; Result rc = 0; @@ -213,6 +220,20 @@ Result setGetRegionCode(SetRegion *out) { return rc; } +Result setGetQuestFlag(bool *out) { + if (hosversionBefore(5,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setSrv, out, 8); +} + +Result setGetDeviceNickname(SetSysDeviceNickName *nickname) { + if (hosversionBefore(10,1,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdOutBufAliasFixed(&g_setSrv, nickname, sizeof(*nickname), 11); +} + Result setsysSetLanguageCode(u64 LanguageCode) { return _setCmdInU64NoOut(&g_setsysSrv, LanguageCode, 0); } @@ -605,20 +626,14 @@ Result setsysSetInitialLaunchSettings(const SetSysInitialLaunchSettings *setting return serviceDispatchIn(&g_setsysSrv, 76, *settings); } -Result setsysGetDeviceNickname(char* nickname) { - return serviceDispatch(&g_setsysSrv, 77, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { nickname, SET_MAX_NICKNAME_SIZE } }, - ); +Result setsysGetDeviceNickname(SetSysDeviceNickName *nickname) { + return _setCmdOutBufAliasFixed(&g_setsysSrv, nickname, sizeof(*nickname), 77); } -Result setsysSetDeviceNickname(const char* nickname) { - char send_nickname[SET_MAX_NICKNAME_SIZE] = {0}; - strncpy(send_nickname, nickname, SET_MAX_NICKNAME_SIZE-1); - +Result setsysSetDeviceNickname(const SetSysDeviceNickName *nickname) { return serviceDispatch(&g_setsysSrv, 78, .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_In }, - .buffers = { { send_nickname, SET_MAX_NICKNAME_SIZE } }, + .buffers = { { nickname, sizeof(*nickname) } }, ); } @@ -1049,10 +1064,7 @@ Result setsysGetHostFsMountPoint(SetSysHostFsMountPoint *out) { if (hosversionBefore(4,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return serviceDispatch(&g_setsysSrv, 140, - .buffer_attrs = { SfBufferAttr_FixedSize | SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetSysHostFsMountPoint) } }, - ); + return _setCmdOutBufAliasFixed(&g_setsysSrv, out, sizeof(*out), 140); } Result setsysGetRequiresRunRepairTimeReviser(bool *out) { @@ -1504,10 +1516,7 @@ Result setsysGetButtonConfigRegisteredSettingsEmbedded(SetSysButtonConfigRegiste if (hosversionBefore(10,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return serviceDispatch(&g_setsysSrv, 197, - .buffer_attrs = { SfBufferAttr_FixedSize | SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { settings, sizeof(SetSysButtonConfigRegisteredSettings) } }, - ); + return _setCmdOutBufAliasFixed(&g_setsysSrv, settings, sizeof(*settings), 197); } Result setsysSetButtonConfigRegisteredSettingsEmbedded(const SetSysButtonConfigRegisteredSettings *settings) { @@ -1540,6 +1549,20 @@ Result setsysSetButtonConfigRegisteredSettings(const SetSysButtonConfigRegistere ); } +Result setsysGetFieldTestingFlag(bool *out) { + if (hosversionBefore(10,1,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdNoInOutBool(&g_setsysSrv, out, 201); +} + +Result setsysSetFieldTestingFlag(bool flag) { + if (hosversionBefore(10,1,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _setCmdInBoolNoOut(&g_setsysSrv, flag, 202); +} + Result setcalGetBdAddress(SetCalBdAddress *out) { return serviceDispatchOut(&g_setcalSrv, 0, *out); } @@ -1596,45 +1619,27 @@ Result setcalGetBatteryLot(SetBatteryLot *out) { } Result setcalGetEciDeviceCertificate(SetCalEccB233DeviceCertificate *out) { - return serviceDispatch(&g_setcalSrv, 14, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalEccB233DeviceCertificate) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 14); } Result setcalGetEticketDeviceCertificate(SetCalRsa2048DeviceCertificate *out) { - return serviceDispatch(&g_setcalSrv, 15, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalRsa2048DeviceCertificate) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 15); } Result setcalGetSslKey(SetCalSslKey *out) { - return serviceDispatch(&g_setcalSrv, 16, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalSslKey) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 16); } Result setcalGetSslCertificate(SetCalSslCertificate *out) { - return serviceDispatch(&g_setcalSrv, 17, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalSslCertificate) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 17); } Result setcalGetGameCardKey(SetCalGameCardKey *out) { - return serviceDispatch(&g_setcalSrv, 18, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalGameCardKey) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 18); } Result setcalGetGameCardCertificate(SetCalGameCardCertificate *out) { - return serviceDispatch(&g_setcalSrv, 19, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalGameCardCertificate) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 19); } Result setcalGetEciDeviceKey(SetCalEccB233DeviceKey *out) { @@ -1642,10 +1647,7 @@ Result setcalGetEciDeviceKey(SetCalEccB233DeviceKey *out) { } Result setcalGetEticketDeviceKey(SetCalRsa2048DeviceKey *out) { - return serviceDispatch(&g_setcalSrv, 21, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalRsa2048DeviceKey) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 21); } Result setcalGetSpeakerParameter(SetCalSpeakerParameter *out) { @@ -1663,20 +1665,14 @@ Result setcalGetEciDeviceCertificate2(SetCalRsa2048DeviceCertificate *out) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return serviceDispatch(&g_setcalSrv, 24, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalRsa2048DeviceCertificate) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 24); } Result setcalGetEciDeviceKey2(SetCalRsa2048DeviceKey *out) { if (hosversionBefore(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - return serviceDispatch(&g_setcalSrv, 25, - .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, - .buffers = { { out, sizeof(SetCalRsa2048DeviceKey) } }, - ); + return _setCmdOutBufAliasFixed(&g_setcalSrv, out, sizeof(*out), 25); } Result setcalGetAmiiboKey(SetCalAmiiboKey *out) {