ctr_Repair/trunk/SkipFirstLaunch/CfgChanger.cpp
N2614 2f46b6b89a リージョンも保存するように
バージョンの不一致をエラー表示するように

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@707 385bec56-5757-e545-9c3a-d8741f4650f1
2012-05-01 01:54:26 +00:00

412 lines
19 KiB
C++

/*---------------------------------------------------------------------------*
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 <nn/cfg.h>
#include <nn/cfg/CTR/cfg_ApiSys.h>
#include <nn/cfg/CTR/detail/cfg_Keys.h>
#include <nn/cfg/CTR/detail/cfg_DataStructures.h>
#include <nn/cfg/CTR/cfg_NtrSettings.h>
#include <nn/cfg/CTR/cfg_ApiNor.h>
#include <nn/ac/CTR/private/ac_InternalApi.h>
#include <nn/ac/CTR/private/ac_NetworkSetting.h>
#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;
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);
// 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);
// バージョン確認
VerDef currentVersion;
NN_UTIL_RETURN_IF_FAILED(
GetSystemVersion(&currentVersion, nn::cfg::CTR::GetRegion())
);
NN_UTIL_RETURN_IF_FAILED(
CheckSystemVersion(&currentVersion, &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);
// 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->region == savedVersion->region
&& 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);
}
}