/*---------------------------------------------------------------------------* Project: Horizon File: CfgChanger.cpp Copyright 2009-2011 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev$ *---------------------------------------------------------------------------*/ #include "CfgChanger.h" #include #include #include #include #include #include #include #include #include "VersionDetect.h" namespace { struct SaveData { // NANDデータ s64 m_RtcUserTimeOffsetCfgData; s64 m_RtcSystemTimeOffsetCfgData; nn::cfg::CTR::detail::BackLightCfgData m_BackLight; nn::cfg::CTR::detail::SoundSettingCfgData m_SoundSetting; NN_PADDING1; // インターネット接続設定 nn::ac::CTR::NetworkSetting m_NetworkSetting[3]; nn::cfg::CTR::detail::UserNameCfgData m_UserName; nn::cfg::CTR::detail::BirthdayCfgData m_Birthday; nn::cfg::CTR::detail::LanguageCfgData m_Language; NN_PADDING1; nn::cfg::CTR::detail::SimpleAddressIdCfgData m_SimpleAddressId; nn::cfg::CTR::detail::SimpleAddressCountryNameCfgData m_SimpleAddressCountryName; nn::cfg::CTR::detail::SimpleAddressRegionNameCfgData m_SimpleAddressRegionName; nn::cfg::CTR::detail::SimpleAddressPositionCfgData m_SimpleAddressPos; nn::cfg::CTR::detail::ParentalControlInfoCfgData m_ParentalControl; nn::cfg::CTR::detail::CoppacsCfgData m_CoppacsCfgData; nn::cfg::CTR::detail::EulaInfoCfgData m_EulaInfo; nn::cfg::CTR::detail::BossSettingCfgData m_BossSetting; NN_PADDING3; NN_PADDING4; nn::cfg::CTR::detail::SystemInfoCfgData m_SystemInfo; nn::cfg::CTR::detail::PseudoRomIdCfgData m_PseudoRomId; nn::cfg::CTR::detail::HomeButtonSettingCfgData m_HomeButtonSetting; NN_PADDING3; // TWL 本体設定 nn::cfg::CTR::detail::TwlEulaInfoCfgData m_TwlEulaInfo; NN_PADDING2; nn::cfg::CTR::detail::TwlParentalControlInfoCfgData m_ParentalCtrlInfo; nn::cfg::CTR::detail::TwlCountryCodeCfgData m_TwlCountryCode; NN_PADDING3; nn::cfg::CTR::detail::FirstLaunchInfoCfgData m_FirstLaunchInfoCfgData; NN_PADDING4; nn::cfg::CTR::detail::MenuInfoCfgData m_MenuInfoCfgData; nn::cfg::CTR::detail::DebugParamCfgData m_DebugParam; // NOR // NTR 本体設定 nn::cfg::CTR::NtrSettingData m_NtrSettingData; nn::cfg::CTR::NtrSettingDataEx m_NtrSettingDataEx; NN_PADDING2; // 時間 nn::fnd::DateTime m_DateTime; // バージョン情報 VerDef m_Version; }; SaveData s_SaveData; } CfgChanger::CfgChanger() { // TODO 自動生成されたコンストラクター・スタブ } CfgChanger::~CfgChanger() { // TODO Auto-generated destructor stub } nn::Result CfgChanger::RestoreFromBackup() { NN_UTIL_RETURN_IF_FAILED( nn::fs::MountSaveData("data:") ); NN_UTIL_RETURN_IF_FAILED( CheckBackupFormat() ); NN_UTIL_RETURN_IF_FAILED( RestoreCfgDataFromBackup() ); NN_UTIL_RETURN_IF_FAILED( nn::fs::Unmount("data:") ); return nn::ResultSuccess(); } nn::Result CfgChanger::CheckBackupFormat() { size_t maxFiles; size_t maxDirectories; bool isDuplicateAll; NN_UTIL_RETURN_IF_FAILED( nn::fs::GetSaveDataFormatInfo(&maxFiles, &maxDirectories, &isDuplicateAll) ); NN_LOG("%d, %d, %d\n", maxFiles, maxDirectories, isDuplicateAll); if(maxFiles != FILE_NUM || maxDirectories != DIR_NUM || isDuplicateAll != DUPLICATE ) { return nn::MakePermanentResult(nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_INVALID_RESULT_VALUE); } return nn::ResultSuccess(); } nn::Result CfgChanger::ImportToBackup() { NN_UTIL_RETURN_IF_FAILED( GetCfgData() ); // バックアップメモリをフォーマットします NN_UTIL_RETURN_IF_FAILED( nn::fs::FormatSaveData(FILE_NUM, DIR_NUM, DUPLICATE) ); NN_UTIL_RETURN_IF_FAILED( ImportCfgDatatoBackup() ); return nn::ResultSuccess(); } nn::Result CfgChanger::GetCfgData() { using namespace nn::cfg::CTR::detail; nn::Result result; nn::cfg::CTR::system::Initialize(); s_SaveData.m_DateTime = nn::fnd::DateTime::GetNow(); // cfg の情報取得 result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_RtcUserTimeOffsetCfgData, sizeof(s_SaveData.m_RtcUserTimeOffsetCfgData), GET_CFG_KEY(NN_CFG_RTC, NN_CFG_RTC_USERTIME_OFFSET)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_RtcSystemTimeOffsetCfgData, sizeof(s_SaveData.m_RtcSystemTimeOffsetCfgData), GET_CFG_KEY(NN_CFG_RTC, NN_CFG_RTC_SYSTEMTIME_OFFSET)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_BackLight, sizeof(s_SaveData.m_BackLight), GET_CFG_KEY(NN_CFG_LCD, NN_CFG_LCD_BACKLIGHT)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_SoundSetting, sizeof(s_SaveData.m_SoundSetting), GET_CFG_KEY(NN_CFG_SOUND, NN_CFG_SOUND_SETTING)); NN_UTIL_RETURN_IF_FAILED(result); // インターネット接続設定取得 result = nn::ac::CTR::InitializeInternal(); if (result.IsSuccess()) { for(s32 i = 0; i < 3; i++) { result = nn::ac::CTR::LoadNetworkSetting(i, s_SaveData.m_NetworkSetting[i]); if(result.IsFailure()) { std::memset(&s_SaveData.m_NetworkSetting[i], 0 , sizeof(s_SaveData.m_NetworkSetting[i])); } } } else { std::memset(s_SaveData.m_NetworkSetting, 0, sizeof(s_SaveData.m_NetworkSetting)); } result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_UserName, sizeof(s_SaveData.m_UserName), GET_CFG_KEY(NN_CFG_USER_INFO, NN_CFG_USER_INFO_USER_NAME)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_Birthday, sizeof(s_SaveData.m_Birthday), GET_CFG_KEY(NN_CFG_USER_INFO, NN_CFG_USER_INFO_BIRTHDAY)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_Language, sizeof(s_SaveData.m_Language), GET_CFG_KEY(NN_CFG_USER_INFO, NN_CFG_USER_INFO_LANGUAGE)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_SimpleAddressId, sizeof(s_SaveData.m_SimpleAddressId), GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_ID)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_SimpleAddressCountryName, sizeof(s_SaveData.m_SimpleAddressCountryName), GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_COUNTRY_NAME)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_SimpleAddressRegionName, sizeof(s_SaveData.m_SimpleAddressRegionName), GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_REGION_NAME)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_SimpleAddressPos, sizeof(s_SaveData.m_SimpleAddressPos), GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_POSITION)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_ParentalControl, sizeof(s_SaveData.m_ParentalControl), GET_CFG_KEY(NN_CFG_PARENTAL_CONTROL, NN_CFG_PARENTAL_CONTROL_INFO)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_CoppacsCfgData, sizeof(s_SaveData.m_CoppacsCfgData), GET_CFG_KEY(NN_CFG_PARENTAL_CONTROL, NN_CFG_PARENTAL_CONTROL_COPPACS)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_EulaInfo, sizeof(s_SaveData.m_EulaInfo), GET_CFG_KEY(NN_CFG_EULA, NN_CFG_EULA_INFO)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_BossSetting, sizeof(s_SaveData.m_BossSetting), GET_CFG_KEY(NN_CFG_BOSS, NN_CFG_BOSS_SETTING)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_SystemInfo, sizeof(s_SaveData.m_SystemInfo), GET_CFG_KEY(NN_CFG_SYSTEM, NN_CFG_SYSTEM_INFO)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_PseudoRomId, sizeof(s_SaveData.m_PseudoRomId), GET_CFG_KEY(NN_CFG_SYSTEM, NN_CFG_SYSTEM_PSEUDO_ROM_ID)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_HomeButtonSetting, sizeof(s_SaveData.m_HomeButtonSetting), GET_CFG_KEY(NN_CFG_SYSTEM, NN_CFG_SYSTEM_HOME_BUTTON)); NN_UTIL_RETURN_IF_FAILED(result); // Twl 設定 result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_TwlEulaInfo, sizeof(s_SaveData.m_TwlEulaInfo), GET_CFG_KEY(NN_CFG_TWL, NN_CFG_TWL_EULA_INFO)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_ParentalCtrlInfo, sizeof(s_SaveData.m_ParentalCtrlInfo), GET_CFG_KEY(NN_CFG_TWL, NN_CFG_TWL_PARENTAL_CONTROL_INFO)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_TwlCountryCode, sizeof(s_SaveData.m_TwlCountryCode), GET_CFG_KEY(NN_CFG_TWL, NN_CFG_TWL_COUNTRY_CODE)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_FirstLaunchInfoCfgData, sizeof(s_SaveData.m_FirstLaunchInfoCfgData), GET_CFG_KEY(NN_CFG_MENU, NN_CFG_MENU_FIRST_LAUNCH)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_MenuInfoCfgData, sizeof(s_SaveData.m_MenuInfoCfgData), GET_CFG_KEY(NN_CFG_MENU, NN_CFG_MENU_MENU_INFO)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::GetConfig(&s_SaveData.m_DebugParam, sizeof(s_SaveData.m_DebugParam), GET_CFG_KEY(NN_CFG_DBG, NN_CFG_DBG_PARAM)); NN_UTIL_RETURN_IF_FAILED(result); nn::cfg::CTR::system::Finalize(); // NTR 設定 (NOR) nn::cfg::nor::CTR::Initialize(); result = nn::cfg::nor::CTR::GetNtrSetting(&s_SaveData.m_NtrSettingData, &s_SaveData.m_NtrSettingDataEx); NN_UTIL_RETURN_IF_FAILED(result); nn::cfg::nor::CTR::Finalize(); // バージョン情報 NN_UTIL_RETURN_IF_FAILED( GetSystemVersion(&s_SaveData.m_Version, nn::cfg::CTR::GetRegion()) ); return nn::ResultSuccess(); } nn::Result CfgChanger::ImportCfgDatatoBackup() { nn::Result result; result = nn::fs::MountSaveData("data:"); NN_UTIL_RETURN_IF_FAILED(result); nn::fs::FileOutputStream file; result = file.TryInitialize(L"data:/savedata.bin", true); NN_UTIL_RETURN_IF_FAILED(result); s32 writeSize; result = file.TryWrite(&writeSize, &s_SaveData, sizeof(s_SaveData), true); NN_UTIL_RETURN_IF_FAILED(result); result = nn::fs::CommitSaveData("data:"); NN_UTIL_RETURN_IF_FAILED(result); result = nn::fs::Unmount("data:"); NN_UTIL_RETURN_IF_FAILED(result); return nn::ResultSuccess(); } nn::Result CfgChanger::RestoreCfgDataFromBackup() { using namespace nn::cfg::CTR::detail; nn::Result result; nn::fs::FileInputStream file; result = file.TryInitialize(L"data:/savedata.bin"); NN_UTIL_RETURN_IF_FAILED(result); s32 readSize; result = file.TryRead(&readSize, &s_SaveData, sizeof(s_SaveData)); NN_UTIL_RETURN_IF_FAILED(result); nn::cfg::CTR::system::Initialize(); // バージョン確認 VerDef currentVersion; NN_UTIL_RETURN_IF_FAILED( GetSystemVersion(¤tVersion, nn::cfg::CTR::GetRegion()) ); NN_UTIL_RETURN_IF_FAILED( CheckSystemVersion(¤tVersion, &s_SaveData.m_Version) ); nn::fnd::DateTime now = nn::fnd::DateTime::GetNow(); s64 usertimeOffset; result = nn::cfg::CTR::system::GetConfig(&usertimeOffset, sizeof(usertimeOffset), GET_CFG_KEY(NN_CFG_RTC, NN_CFG_RTC_USERTIME_OFFSET)); NN_UTIL_RETURN_IF_FAILED(result); usertimeOffset += (s_SaveData.m_DateTime - now).GetNanoSeconds(); // cfg の情報設定 result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_RTC, NN_CFG_RTC_USERTIME_OFFSET), &usertimeOffset, sizeof(usertimeOffset)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_RTC, NN_CFG_RTC_SYSTEMTIME_OFFSET), &s_SaveData.m_RtcSystemTimeOffsetCfgData, sizeof(s_SaveData.m_RtcSystemTimeOffsetCfgData)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_LCD, NN_CFG_LCD_BACKLIGHT), &s_SaveData.m_BackLight, sizeof(s_SaveData.m_BackLight)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SOUND, NN_CFG_SOUND_SETTING), &s_SaveData.m_SoundSetting, sizeof(s_SaveData.m_SoundSetting)); NN_UTIL_RETURN_IF_FAILED(result); // インターネット接続設定 result = nn::ac::CTR::InitializeInternal(); if (result.IsSuccess()) { for(s32 i = 0; i < 3; i++) { result = nn::ac::CTR::UpdateNetworkSetting(i, s_SaveData.m_NetworkSetting[i]); if(result.IsFailure()) { std::memset(&s_SaveData.m_NetworkSetting[i], 0 , sizeof(s_SaveData.m_NetworkSetting[i])); } } result = nn::ac::CTR::FlushNetworkSetting(); NN_UTIL_RETURN_IF_FAILED(result); } else { std::memset(s_SaveData.m_NetworkSetting, 0, sizeof(s_SaveData.m_NetworkSetting)); } result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_USER_INFO, NN_CFG_USER_INFO_USER_NAME), &s_SaveData.m_UserName, sizeof(s_SaveData.m_UserName)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_USER_INFO, NN_CFG_USER_INFO_BIRTHDAY), &s_SaveData.m_Birthday, sizeof(s_SaveData.m_Birthday)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_USER_INFO, NN_CFG_USER_INFO_LANGUAGE), &s_SaveData.m_Language, sizeof(s_SaveData.m_Language)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_ID), &s_SaveData.m_SimpleAddressId, sizeof(s_SaveData.m_SimpleAddressId)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_COUNTRY_NAME), &s_SaveData.m_SimpleAddressCountryName, sizeof(s_SaveData.m_SimpleAddressCountryName)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_REGION_NAME), &s_SaveData.m_SimpleAddressRegionName, sizeof(s_SaveData.m_SimpleAddressRegionName)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SIMPLE_ADDRESS, NN_CFG_SIMPLE_ADDRESS_POSITION), &s_SaveData.m_SimpleAddressPos, sizeof(s_SaveData.m_SimpleAddressPos)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_PARENTAL_CONTROL, NN_CFG_PARENTAL_CONTROL_INFO), &s_SaveData.m_ParentalControl, sizeof(s_SaveData.m_ParentalControl)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_PARENTAL_CONTROL, NN_CFG_PARENTAL_CONTROL_COPPACS), &s_SaveData.m_CoppacsCfgData, sizeof(s_SaveData.m_CoppacsCfgData)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_EULA, NN_CFG_EULA_INFO), &s_SaveData.m_EulaInfo, sizeof(s_SaveData.m_EulaInfo)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_BOSS, NN_CFG_BOSS_SETTING), &s_SaveData.m_BossSetting, sizeof(s_SaveData.m_BossSetting)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SYSTEM, NN_CFG_SYSTEM_INFO), &s_SaveData.m_SystemInfo, sizeof(s_SaveData.m_SystemInfo)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SYSTEM, NN_CFG_SYSTEM_PSEUDO_ROM_ID), &s_SaveData.m_PseudoRomId, sizeof(s_SaveData.m_PseudoRomId)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_SYSTEM, NN_CFG_SYSTEM_HOME_BUTTON), &s_SaveData.m_HomeButtonSetting, sizeof(s_SaveData.m_HomeButtonSetting)); NN_UTIL_RETURN_IF_FAILED(result); // Twl 設定 result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_TWL, NN_CFG_TWL_EULA_INFO), &s_SaveData.m_TwlEulaInfo, sizeof(s_SaveData.m_TwlEulaInfo)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_TWL, NN_CFG_TWL_PARENTAL_CONTROL_INFO), &s_SaveData.m_ParentalCtrlInfo, sizeof(s_SaveData.m_ParentalCtrlInfo)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_TWL, NN_CFG_TWL_COUNTRY_CODE), &s_SaveData.m_TwlCountryCode, sizeof(s_SaveData.m_TwlCountryCode)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_MENU, NN_CFG_MENU_FIRST_LAUNCH), &s_SaveData.m_FirstLaunchInfoCfgData, sizeof(s_SaveData.m_FirstLaunchInfoCfgData)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_MENU, NN_CFG_MENU_MENU_INFO), &s_SaveData.m_MenuInfoCfgData, sizeof(s_SaveData.m_MenuInfoCfgData)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::SetConfig(GET_CFG_KEY(NN_CFG_DBG, NN_CFG_DBG_PARAM), &s_SaveData.m_DebugParam, sizeof(s_SaveData.m_DebugParam)); NN_UTIL_RETURN_IF_FAILED(result); result = nn::cfg::CTR::system::FlushConfig(); NN_UTIL_RETURN_IF_FAILED(result); nn::cfg::CTR::system::Finalize(); // NTR 設定 (NOR) nn::cfg::nor::CTR::Initialize(); result = nn::cfg::nor::CTR::SetNtrSetting(&s_SaveData.m_NtrSettingData, &s_SaveData.m_NtrSettingDataEx); NN_UTIL_RETURN_IF_FAILED(result); nn::cfg::nor::CTR::Finalize(); return nn::ResultSuccess(); } nn::Result CfgChanger::CheckSystemVersion(VerDef* currentVersion, VerDef* savedVersion) { if(currentVersion->cup.majorVersion == savedVersion->cup.majorVersion && currentVersion->cup.minorVersion == savedVersion->cup.minorVersion && currentVersion->cup.microVersion == savedVersion->cup.microVersion && currentVersion->nup.majorVersion == savedVersion->nup.majorVersion) { return nn::ResultSuccess(); } else { return nn::MakePermanentResult(nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_OUT_OF_RANGE); } }