CMAC検証エラー時にFAILするように

Thread::IsAliveの前にThread::IsValidをチェックするように

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@138 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-03-14 12:14:49 +00:00
parent 4dc123cbf9
commit ad0301f4b0
7 changed files with 228 additions and 134 deletions

View File

@ -558,7 +558,7 @@ u32 GetProgress()
bool IsExportFinished() bool IsExportFinished()
{ {
return !s_ExportThread.IsAlive(); return s_ExportThread.IsValid() && !s_ExportThread.IsAlive();
} }
} }

View File

@ -20,6 +20,7 @@
#include <nn/ptm/CTR/ptm_ApiSysmenu.h> #include <nn/ptm/CTR/ptm_ApiSysmenu.h>
#include <nn/ptm/CTR/ptm_ApiSystem.h> #include <nn/ptm/CTR/ptm_ApiSystem.h>
#include <nn/pl/CTR/pl_PlayHistoryApiSysmenu.h> #include <nn/pl/CTR/pl_PlayHistoryApiSysmenu.h>
#include <nn/cfg/CTR/cfg_ApiSys.h>
#include "Controller.h" #include "Controller.h"
#include "FileChecker.h" #include "FileChecker.h"
@ -90,6 +91,8 @@ bool s_PlayedSdPullOutCursor = false;
bool s_ExistsVersionDataAnnotation = false; bool s_ExistsVersionDataAnnotation = false;
// バージョンデータを読んだかどうか // バージョンデータを読んだかどうか
bool s_ReadVersionDone = false; bool s_ReadVersionDone = false;
// バージョンデータを読んだ結果
nn::Result s_ReadVersionResult = nn::ResultSuccess();
// SDに書き込みできない警告サウンドを鳴らしたかどうか // SDに書き込みできない警告サウンドを鳴らしたかどうか
bool s_SdWriteProetctAnnotation = false; bool s_SdWriteProetctAnnotation = false;
@ -147,7 +150,7 @@ bool CheckAndReadAPSetting(::std::vector<std::string>& operationMessage)
return s_ReadSettingSuccess; return s_ReadSettingSuccess;
} }
bool CheckAndReadVersionData(::std::vector<std::string>& operationMessage) nn::Result CheckAndReadVersionData(::std::vector<std::string>& operationMessage)
{ {
using namespace common; using namespace common;
@ -159,17 +162,18 @@ bool CheckAndReadVersionData(::std::vector<std::string>& operationMessage)
common::PlaySound(common::SOUND_ANNOTATION); common::PlaySound(common::SOUND_ANNOTATION);
} }
operationMessage.push_back(::std::string("Version Data does not exist!")); operationMessage.push_back(::std::string("Version Data does not exist!"));
return false; return nn::Result(nn::Result::LEVEL_PERMANENT, nn::Result::SUMMARY_NOT_FOUND, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_NOT_FOUND);
} }
// バージョン情報ファイルを読み込む // バージョン情報ファイルを読み込む
if (!s_ReadVersionDone) if (!s_ReadVersionDone)
{ {
s_ReadVersionDone = true; s_ReadVersionDone = true;
ReadVersionData(); s_ReadVersionResult = ReadVersionData();
} }
return s_ReadSettingSuccess; return s_ReadVersionResult;
} }
void PutAliveMessage(::std::vector<std::string>& operationMessage, const char* str) void PutAliveMessage(::std::vector<std::string>& operationMessage, const char* str)
@ -195,14 +199,20 @@ void PutAliveMessage(::std::vector<std::string>& operationMessage, const char* s
i += 4; i += 4;
} }
void ExecSyncMcuRtc() nn::Result ExecSyncMcuRtc()
{ {
nn::Result result = nn::ResultSuccess();
if(!common::ExistsRtcSyncFinishedFile()) if(!common::ExistsRtcSyncFinishedFile())
{ {
ImportMcuRtc(); result = ImportMcuRtc();
// 時計を無効化する if(result.IsSuccess())
CreateRtcSyncFinishedFile(); {
// RTCを同期完了ファイルを作る
CreateRtcSyncFinishedFile();
}
} }
return result;
} }
// Zero NUP限定コード // Zero NUP限定コード
@ -221,6 +231,7 @@ bool NeedsNup()
void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep, bool& continueRestore) void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep, bool& continueRestore)
{ {
using namespace common; using namespace common;
nn::Result result;
// 状態遷移Controller // 状態遷移Controller
switch (s_RestoreState) switch (s_RestoreState)
@ -248,7 +259,14 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
break; break;
} }
CheckAndReadVersionData(operationMessage); result = CheckAndReadVersionData(operationMessage);
if(result.IsFailure())
{
// バージョン情報の取得に失敗
error = true;
s_RestoreState = FAIL;
}
validApSetting = CheckAndReadAPSetting(operationMessage); validApSetting = CheckAndReadAPSetting(operationMessage);
if (!validApSetting) if (!validApSetting)
{ {
@ -287,8 +305,18 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
} }
else else
{ {
::std::string serial(reinterpret_cast<char*> (ReadSerialNumber())); u8 serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
operationMessage.push_back(::std::string("Serial Number in SD : ") + serial); result = ReadSerialNumber(serial);
if(result.IsSuccess())
{
::std::string serialStr(reinterpret_cast<char*> (serial));
operationMessage.push_back(::std::string("Serial Number in SD : ") + serialStr);
}
else
{
error = true;
s_RestoreState = FAIL;
}
} }
@ -296,7 +324,7 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
if (ExistsRegionData()) if (ExistsRegionData())
{ {
// リージョンデータは一致しているか? // リージョンデータは一致しているか?
if (!EqualsRegionDataandRegion()) if (EqualsRegionDataandRegion().IsFailure())
{ {
COMMON_LOGGER("Current Region and Region in SD differ!!\n"); COMMON_LOGGER("Current Region and Region in SD differ!!\n");
error = true; error = true;
@ -416,11 +444,16 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
// Zero NUP限定 // Zero NUP限定
// RTC同期を行う // RTC同期を行う
// NUPされない場合があるのでここで同期 // NUPされない場合があるのでここで同期
ExecSyncMcuRtc(); result = ExecSyncMcuRtc();
if(result <= nn::fs::ResultVerificationFailed())
s_RestoreState = RESTORE_TWL_SOUND; {
s_RestoreState = FAIL;
}
else
{
s_RestoreState = RESTORE_TWL_SOUND;
}
} }
} }
} }
break; break;
@ -460,9 +493,15 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
// アップデートを行う // アップデートを行う
if(!s_ExecuteFgNup) if(!s_ExecuteFgNup)
{ {
ImportCountryLanguageData(); if(ImportCountryLanguageData().IsSuccess())
StartFGNetworkUpdate(); {
s_ExecuteFgNup = true; StartFGNetworkUpdate();
s_ExecuteFgNup = true;
}
else
{
s_RestoreState = FAIL;
}
} }
// 動いていることを表示 // 動いていることを表示
@ -588,7 +627,10 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
} }
// データを読み込む // データを読み込む
ImportData(); if(ImportData().IsFailure())
{
s_RestoreState = FAIL;
}
// 処理が完了した // 処理が完了した
if (continueRestore && IsImportFinished()) if (continueRestore && IsImportFinished())
@ -616,8 +658,7 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep,
if (init) if (init)
{ {
// ErrDispから引用 // ErrDispから引用
// 権限をもらえば成功するはず result = nn::ns::CTR::InitializeForShell();
nn::Result result = nn::ns::CTR::InitializeForShell();
if (result.IsSuccess()) if (result.IsSuccess())
{ {
COMMON_LOGGER("System Reboot.\n"); COMMON_LOGGER("System Reboot.\n");
@ -866,6 +907,7 @@ void InitializeState()
s_NupOnlyMode = false; s_NupOnlyMode = false;
s_ReadVersionDone = false; s_ReadVersionDone = false;
s_SdWriteProetctAnnotation = false; s_SdWriteProetctAnnotation = false;
s_ReadVersionResult = nn::ResultSuccess();
} }
u32 GetProgress() u32 GetProgress()

View File

@ -79,7 +79,7 @@ bool CreateEmptyFile(const wchar_t* path);
// SDからNANDにセーブデータをコピーする // SDからNANDにセーブデータをコピーする
void ImportSaveData(); void ImportSaveData();
// SDからNORにNORデータをコピーする // SDからNORにNORデータをコピーする
void ImportNorData(); nn::Result ImportNorData();
// SDカードに保存してあるバージョン情報 // SDカードに保存してあるバージョン情報
common::VerDef s_SDVersionData; common::VerDef s_SDVersionData;
@ -198,13 +198,14 @@ bool CreateEmptyFile(const wchar_t* path)
} }
u8* ReadSerialNumber() nn::Result ReadSerialNumber(u8* serial)
{ {
nn::Result result; static nn::Result result = nn::ResultSuccess();
if(s_ReadSerialNumber) if(s_ReadSerialNumber)
{ {
return s_SerialNo; std::memcpy(serial, s_SerialNo, sizeof(s_SerialNo));
return result;
} }
COMMON_LOGGER("Read Serial Number in SD.\n"); COMMON_LOGGER("Read Serial Number in SD.\n");
@ -219,21 +220,26 @@ u8* ReadSerialNumber()
if(result.IsSuccess()) if(result.IsSuccess())
{ {
std::memcpy(s_SerialNo, buf, sizeof(s_SerialNo)); std::memcpy(s_SerialNo, buf, sizeof(s_SerialNo));
s_ReadSerialNumber = true; std::memcpy(serial, s_SerialNo, sizeof(s_SerialNo));
s_ReadSerialNumber = true;
} }
common::HeapManager::GetHeap()->Free(buf); common::HeapManager::GetHeap()->Free(buf);
} }
return s_SerialNo; else
{
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
}
return result;
} }
bool EqualsDeviceIdFileandDeviceId() nn::Result EqualsDeviceIdFileandDeviceId()
{ {
nn::Result result; static nn::Result result = nn::ResultSuccess();
static bool retval = false;
if(s_CheckedEqualsDeviceIdFileandDeviceId) if(s_CheckedEqualsDeviceIdFileandDeviceId)
{ {
return retval; return result;
} }
COMMON_LOGGER("Check Device Id\n"); COMMON_LOGGER("Check Device Id\n");
@ -245,24 +251,29 @@ bool EqualsDeviceIdFileandDeviceId()
s_CheckedEqualsDeviceIdFileandDeviceId = true; s_CheckedEqualsDeviceIdFileandDeviceId = true;
if(result.IsSuccess()) if(result.IsSuccess())
{ {
retval = (GetDeviceId() == sdDeviceId); if(GetDeviceId() == sdDeviceId)
return retval; {
result = nn::ResultSuccess();
return result;
}
result = nn::Result(nn::Result::LEVEL_STATUS, nn::Result::SUMMARY_INVALID_RESULT_VALUE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_INVALID_RESULT_VALUE);
return result;
} }
else else
{ {
retval = false; return result;
return retval;
} }
} }
bool EqualsRegionDataandRegion() nn::Result EqualsRegionDataandRegion()
{ {
nn::Result result; static nn::Result result = nn::ResultSuccess();
static bool retval = false;
if(s_CheckedEqualsRegionDataandRegion) if(s_CheckedEqualsRegionDataandRegion)
{ {
return retval; return result;
} }
COMMON_LOGGER("Check Region\n"); COMMON_LOGGER("Check Region\n");
@ -281,24 +292,26 @@ bool EqualsRegionDataandRegion()
if (result.IsSuccess()) if (result.IsSuccess())
{ {
std::memcpy(&sdRegion, buf, sizeof(sdRegion)); std::memcpy(&sdRegion, buf, sizeof(sdRegion));
s_CheckedEqualsRegionDataandRegion = true; s_CheckedEqualsRegionDataandRegion = true;
if(result.IsSuccess()) if(region == sdRegion)
{ {
retval = (region == sdRegion); result = nn::ResultSuccess();
} }
else else
{ {
retval = false; result = nn::Result(nn::Result::LEVEL_STATUS, nn::Result::SUMMARY_INVALID_RESULT_VALUE,
} nn::Result::MODULE_COMMON, nn::Result::DESCRIPTION_INVALID_RESULT_VALUE);
} }
else
{
retval = false;
} }
common::HeapManager::GetHeap()->Free(buf); common::HeapManager::GetHeap()->Free(buf);
} }
else
{
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
}
return retval; return result;
} }
void SetCountry(nn::cfg::CTR::CfgCountryCode countryCode) void SetCountry(nn::cfg::CTR::CfgCountryCode countryCode)
@ -339,9 +352,9 @@ void SetLanguage(nn::cfg::CTR::CfgLanguageCode languageCode)
nn::cfg::nor::CTR::Finalize(); nn::cfg::nor::CTR::Finalize();
} }
void ImportCountryLanguageData() nn::Result ImportCountryLanguageData()
{ {
nn::Result result; nn::Result result = nn::ResultSuccess();
if (common::ExistsCountryLanguageFile()) if (common::ExistsCountryLanguageFile())
{ {
@ -360,11 +373,9 @@ void ImportCountryLanguageData()
SetLanguage(reinterpret_cast<common::CfgCountryLanguage*> (buf)->language); SetLanguage(reinterpret_cast<common::CfgCountryLanguage*> (buf)->language);
} }
else
{
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
}
common::HeapManager::GetHeap()->Free(buf); common::HeapManager::GetHeap()->Free(buf);
NN_UTIL_RETURN_IF_FAILED(result);
} }
} }
else else
@ -419,6 +430,8 @@ void ImportCountryLanguageData()
} }
} }
return result;
} }
inline u8 DecimalToBcd(u8 param) inline u8 DecimalToBcd(u8 param)
@ -429,10 +442,10 @@ inline u8 DecimalToBcd(u8 param)
return (theTen << 4 | theOne); return (theTen << 4 | theOne);
} }
void ImportMcuRtc() nn::Result ImportMcuRtc()
{ {
COMMON_LOGGER("Import RTC Data.\n"); COMMON_LOGGER("Import RTC Data.\n");
nn::Result result; nn::Result result = nn::ResultSuccess();
nn::Handle handle = GetMcuHandle(); nn::Handle handle = GetMcuHandle();
if(handle.IsValid()) if(handle.IsValid())
@ -469,16 +482,25 @@ void ImportMcuRtc()
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
} }
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
common::HeapManager::GetHeap()->Free(buf); common::HeapManager::GetHeap()->Free(buf);
NN_UTIL_RETURN_IF_FAILED(result);
} }
else else
{ {
COMMON_LOGGER("Failed Allocate Heap!!\n"); COMMON_LOGGER("Failed Allocate Heap!!\n");
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
} }
} }
} }
else
{
result = nn::Result(nn::Result::LEVEL_PERMANENT, nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_INVALID_HANDLE);
}
return result;
} }
void InitializeFileSystem() void InitializeFileSystem()
@ -558,9 +580,9 @@ void InitializeFileSystem()
nn::fs::InitializeCtrFileSystem(); nn::fs::InitializeCtrFileSystem();
} }
void ImportIvs() nn::Result ImportIvs()
{ {
nn::Result result; nn::Result result = nn::ResultSuccess();
nn::fs::FileOutputStream fos; nn::fs::FileOutputStream fos;
size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize() / 2; size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize() / 2;
@ -606,17 +628,27 @@ void ImportIvs()
else else
{ {
COMMON_LOGGER("Failed Allocate Heap!!\n"); COMMON_LOGGER("Failed Allocate Heap!!\n");
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
} }
} }
nn::fs::Unmount(common::NAND_ARCHIVE_NAME); nn::fs::Unmount(common::NAND_ARCHIVE_NAME);
} }
else
{
return result;
}
common::HeapManager::GetHeap()->Free(enc); common::HeapManager::GetHeap()->Free(enc);
} }
else else
{ {
COMMON_LOGGER("Failed Allocate Heap!!\n"); COMMON_LOGGER("Failed Allocate Heap!!\n");
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
} }
return result;
} }
void ImportThreadFunc() void ImportThreadFunc()
@ -678,11 +710,11 @@ void ImportSaveData()
} }
void ImportNorData() nn::Result ImportNorData()
{ {
COMMON_LOGGER("Import NOR Data.\n"); COMMON_LOGGER("Import NOR Data.\n");
nn::Result result; nn::Result result = nn::ResultSuccess();
nn::cfg::nor::CTR::Initialize(); nn::cfg::nor::CTR::Initialize();
@ -714,24 +746,28 @@ void ImportNorData()
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
} }
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
common::HeapManager::GetHeap()->Free(buf); common::HeapManager::GetHeap()->Free(buf);
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_UTIL_RETURN_IF_FAILED(result);
} }
else else
{ {
COMMON_LOGGER("Failed Allocate Heap!!\n"); COMMON_LOGGER("Failed Allocate Heap!!\n");
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
} }
return result;
} }
} }
void ReadVersionData() nn::Result ReadVersionData()
{ {
nn::Result result; nn::Result result = nn::ResultSuccess();
std::memset(&s_SDVersionData, 0, sizeof(common::VerDef)); std::memset(&s_SDVersionData, 0, sizeof(common::VerDef));
size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize();
@ -755,14 +791,19 @@ void ReadVersionData()
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
} }
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
common::HeapManager::GetHeap()->Free(buf); common::HeapManager::GetHeap()->Free(buf);
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_UTIL_RETURN_IF_FAILED(result);
} }
else else
{ {
COMMON_LOGGER("Failed Allocate Heap!!\n"); COMMON_LOGGER("Failed Allocate Heap!!\n");
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
} }
return result;
} }
bool AlreadyExecutedNup() bool AlreadyExecutedNup()
@ -811,7 +852,7 @@ void FinalizeImportThread()
bool IsImportFinished() bool IsImportFinished()
{ {
return !s_ImportThread.IsAlive(); return s_ImportThread.IsValid() && !s_ImportThread.IsAlive();
} }
void CreateWriteFinishedFile() void CreateWriteFinishedFile()
@ -1386,12 +1427,11 @@ void ExportCalData()
common::SdMountManager::Unmount(); common::SdMountManager::Unmount();
} }
bool ImportCalData(common::CfgCalData *data) nn::Result ImportCalData(common::CfgCalData *data)
{ {
using namespace nn::cfg::CTR::detail; using namespace nn::cfg::CTR::detail;
nn::Result result; nn::Result result = nn::ResultSuccess();
bool retval = false;
COMMON_LOGGER("Import CalData\n"); COMMON_LOGGER("Import CalData\n");
@ -1409,61 +1449,63 @@ bool ImportCalData(common::CfgCalData *data)
{ {
// SDから読み出し成功 // SDから読み出し成功
std::memcpy(data, buf, readSize); std::memcpy(data, buf, readSize);
retval = true;
}
else
{
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
} }
common::HeapManager::GetHeap()->Free(buf); common::HeapManager::GetHeap()->Free(buf);
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_UTIL_RETURN_IF_FAILED(result);
}
else
{
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
} }
common::SdMountManager::Unmount(); common::SdMountManager::Unmount();
return retval; return result;
} }
void InitializeHardwareDependentSetting() nn::Result InitializeHardwareDependentSetting()
{ {
using namespace nn::cfg::CTR::detail; using namespace nn::cfg::CTR::detail;
nn::Result result = nn::ResultSuccess(); nn::Result result = nn::ResultSuccess();
common::CfgCalData cfgCalData; common::CfgCalData cfgCalData;
if (ImportCalData(&cfgCalData)) result = ImportCalData(&cfgCalData);
{ NN_UTIL_RETURN_IF_FAILED(result);
result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_HID, NN_CFG_HID_CAL_TOUCHPANEL),
&cfgCalData.touchPanelCfgData, sizeof(TouchPanelCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_LCD, NN_CFG_LCD_CAL_FLICKER), result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_HID, NN_CFG_HID_CAL_TOUCHPANEL),
&cfgCalData.lcdFlickerCfgData, sizeof(LcdFlickerCfgData)); &cfgCalData.touchPanelCfgData, sizeof(TouchPanelCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_FCRAM, NN_CFG_FCRAM_CAL_DELAY), result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_LCD, NN_CFG_LCD_CAL_FLICKER),
&cfgCalData.fcramCfgData, sizeof(FcramCfgData)); &cfgCalData.lcdFlickerCfgData, sizeof(LcdFlickerCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_RTC, NN_CFG_RTC_CAL_COMPENSATION), result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_FCRAM, NN_CFG_FCRAM_CAL_DELAY), &cfgCalData.fcramCfgData,
&cfgCalData.rtcCfgData, sizeof(RtcCfgData)); sizeof(FcramCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_HID, NN_CFG_HID_CAL_GYROSCOPE), result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_RTC, NN_CFG_RTC_CAL_COMPENSATION),
&cfgCalData.gyroscopeCfgData, sizeof(GyroscopeCfgData)); &cfgCalData.rtcCfgData, sizeof(RtcCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_HID, NN_CFG_HID_CAL_ACCELEROMETER), result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_HID, NN_CFG_HID_CAL_GYROSCOPE),
&cfgCalData.accelCfgData, sizeof(AccelCfgData)); &cfgCalData.gyroscopeCfgData, sizeof(GyroscopeCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_CODEC, NN_CFG_CODEC_CAL), &cfgCalData.codecCfgData, result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_HID, NN_CFG_HID_CAL_ACCELEROMETER),
sizeof(CodecCfgData)); &cfgCalData.accelCfgData, sizeof(AccelCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_MCU, NN_CFG_MCU_SLIDE_VOLUME), &cfgCalData.mcuSlideVolumeRangeCfgData, result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_CODEC, NN_CFG_CODEC_CAL), &cfgCalData.codecCfgData,
sizeof(McuSlideVolumeRangeCfgData)); sizeof(CodecCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_LOG("Set cfgCalData\n"); result = nn::cfg::CTR::init::SetConfig(GET_CFG_KEY(NN_CFG_MCU, NN_CFG_MCU_SLIDE_VOLUME),
} &cfgCalData.mcuSlideVolumeRangeCfgData, sizeof(McuSlideVolumeRangeCfgData));
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_LOG("Set cfgCalData\n");
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
@ -1472,21 +1514,28 @@ void InitializeHardwareDependentSetting()
nn::cfg::CTR::init::ResetAnalogStickCalibration(); nn::cfg::CTR::init::ResetAnalogStickCalibration();
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
return result;
} }
void ImportData() nn::Result ImportData()
{ {
static nn::Result result = nn::ResultSuccess();
static bool init = true; static bool init = true;
if(init) if(init)
{ {
init = false;
// NANDのごみを削除する // NANDのごみを削除する
Cleanup(); Cleanup();
// SDカードのIVSファイルを書き込む // SDカードのIVSファイルを書き込む
ImportIvs(); result = ImportIvs();
NN_UTIL_RETURN_IF_FAILED(result);
// NORデータを書き込む // NORデータを書き込む
ImportNorData(); result = ImportNorData();
NN_UTIL_RETURN_IF_FAILED(result);
// 固体固有calLデータをSDカードに出力する // 固体固有calLデータをSDカードに出力する
// 本体初期化後はcal値が設定されている // 本体初期化後はcal値が設定されている
@ -1494,10 +1543,9 @@ void ImportData()
// SDカードのセーブデータをNANDに書き込む // SDカードのセーブデータをNANDに書き込む
ImportSaveData(); ImportSaveData();
init = false;
} }
return result;
} }
} }

View File

@ -23,15 +23,15 @@
namespace ConsoleRestore namespace ConsoleRestore
{ {
bool EqualsDeviceIdFileandDeviceId(); nn::Result EqualsDeviceIdFileandDeviceId();
bool EqualsRegionDataandRegion(); nn::Result EqualsRegionDataandRegion();
u8* ReadSerialNumber(); nn::Result ReadSerialNumber(u8* serial);
void FinalizeImportThread(); void FinalizeImportThread();
bool IsImportFinished(); bool IsImportFinished();
void ImportTwlSoundData(); void ImportTwlSoundData();
void ImportTwlPhotoData(); void ImportTwlPhotoData();
void ImportData(); nn::Result ImportData();
void CreateWriteFinishedFile(); void CreateWriteFinishedFile();
void CreateUpdateFinishedFile(); void CreateUpdateFinishedFile();
void CreateConsoleInitializedFile(); void CreateConsoleInitializedFile();
@ -71,8 +71,8 @@ struct CheckedNetworkSetting
}; };
CheckedNetworkSetting* GetTempNetworkSetting(); CheckedNetworkSetting* GetTempNetworkSetting();
void ImportCountryLanguageData(); nn::Result ImportCountryLanguageData();
void ImportMcuRtc(); nn::Result ImportMcuRtc();
// TWL写真領域を初期化してから本体初期化を行う // TWL写真領域を初期化してから本体初期化を行う
void InitializeFileSystem(); void InitializeFileSystem();
@ -83,10 +83,10 @@ void ClearFileReadResult();
void ImportPlayHistory(); void ImportPlayHistory();
// cfgのハードウェア固有領域をcal値で初期化します // cfgのハードウェア固有領域をcal値で初期化します
void InitializeHardwareDependentSetting(); nn::Result InitializeHardwareDependentSetting();
// SDカード上のバージョン情報を読みます // SDカード上のバージョン情報を読みます
void ReadVersionData(); nn::Result ReadVersionData();
// 移行元本体がNUP済みかどうか // 移行元本体がNUP済みかどうか
bool AlreadyExecutedNup(); bool AlreadyExecutedNup();

View File

@ -232,7 +232,7 @@ void FinishFGNetworkUpdate()
bool IsNetworkUpdateFinished() bool IsNetworkUpdateFinished()
{ {
return !s_UpdaterThread.IsAlive(); return s_UpdaterThread.IsValid() && !s_UpdaterThread.IsAlive();
} }
u32 GetUpdateProgress() u32 GetUpdateProgress()

View File

@ -78,9 +78,9 @@ void PlayHistoryManager::Export()
SdMountManager::Unmount(); SdMountManager::Unmount();
} }
void PlayHistoryManager::GetPlayHistoryNums(size_t* nums) nn::Result PlayHistoryManager::GetPlayHistoryNums(size_t* nums)
{ {
nn::Result result; nn::Result result = nn::ResultSuccess();
size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize(); size_t bufSize = common::HeapManager::GetHeap()->GetAllocatableSize();
void* buf = common::HeapManager::GetHeap()->Allocate(bufSize); void* buf = common::HeapManager::GetHeap()->Allocate(bufSize);
@ -95,13 +95,15 @@ void PlayHistoryManager::GetPlayHistoryNums(size_t* nums)
*nums = *reinterpret_cast<size_t*> (buf); *nums = *reinterpret_cast<size_t*> (buf);
} }
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
HeapManager::GetHeap()->Free(buf);
} }
HeapManager::GetHeap()->Free(buf); return result;
} }
void PlayHistoryManager::Import() nn::Result PlayHistoryManager::Import()
{ {
nn::Result result; nn::Result result = nn::ResultSuccess();
SdMountManager::Mount(); SdMountManager::Mount();
SdReaderWriter sd; SdReaderWriter sd;
@ -161,10 +163,12 @@ void PlayHistoryManager::Import()
else else
{ {
NN_LOG("Failed Allocate Heap!! %s, %d", __FILE__, __LINE__); NN_LOG("Failed Allocate Heap!! %s, %d", __FILE__, __LINE__);
return; return result;
} }
SdMountManager::Unmount(); SdMountManager::Unmount();
return result;
} }
void PlayHistoryManager::Dump() void PlayHistoryManager::Dump()

View File

@ -30,13 +30,13 @@ public:
void Export(); void Export();
//! @brief SDカードからプレイ履歴に書き込みます //! @brief SDカードからプレイ履歴に書き込みます
void Import(); nn::Result Import();
//! @brief デバッグ用。プレイ履歴をデバッグ出力します。 //! @brief デバッグ用。プレイ履歴をデバッグ出力します。
void Dump(); void Dump();
private: private:
void GetPlayHistoryNums(size_t* nums); nn::Result GetPlayHistoryNums(size_t* nums);
}; };