ListTwlSaveDataDirectoryの挙動を正しく

SdReaderWriterをスタックから確保するように

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@378 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-07-12 07:51:24 +00:00
parent d9f8ab4547
commit 233b1bf3da

View File

@ -53,7 +53,6 @@ namespace ConsoleBackup
namespace namespace
{ {
common::SdReaderWriter s_SdWriter;
common::NtrNorData s_NtrNorData; common::NtrNorData s_NtrNorData;
common::CfgCountryLanguage s_CountryLanguage; common::CfgCountryLanguage s_CountryLanguage;
@ -169,7 +168,8 @@ nn::Result WriteTwlTitleList(std::vector<std::wstring>& programIdList)
writeSize += it->size() + sizeof('\n'); writeSize += it->size() + sizeof('\n');
} }
return s_SdWriter.WriteBufWithCmac(common::TWL_TITLELIST_PATHNAME, titleListBuf, writeSize); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::TWL_TITLELIST_PATHNAME, titleListBuf, writeSize);
} }
else else
{ {
@ -186,7 +186,8 @@ nn::Result WriteRegionData()
nn::cfg::CTR::CfgRegionCode region; nn::cfg::CTR::CfgRegionCode region;
region = nn::cfg::CTR::GetRegion(); region = nn::cfg::CTR::GetRegion();
return s_SdWriter.WriteBufWithCmac(common::REGION_DATA_PATHNAME, &region, sizeof(nn::cfg::CTR::CfgRegionCode)); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::REGION_DATA_PATHNAME, &region, sizeof(nn::cfg::CTR::CfgRegionCode));
} }
nn::Result WriteCountryLanguageData() nn::Result WriteCountryLanguageData()
@ -204,7 +205,8 @@ nn::Result WriteCountryLanguageData()
// 言語設定 // 言語設定
s_CountryLanguage.language = nn::cfg::CTR::GetLanguage(); s_CountryLanguage.language = nn::cfg::CTR::GetLanguage();
return s_SdWriter.WriteBufWithCmac(common::COUNTRY_SETTING_PATHNAME, &s_CountryLanguage, sizeof(s_CountryLanguage)); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::COUNTRY_SETTING_PATHNAME, &s_CountryLanguage, sizeof(s_CountryLanguage));
} }
return nn::ResultSuccess(); return nn::ResultSuccess();
@ -232,7 +234,8 @@ nn::Result WriteNorData()
result = nn::cfg::nor::CTR::ReadNtrWifiSetting(0, s_NtrNorData.NtrWiFiSetting, common::NTR_WIFI_SETTING_SIZE); result = nn::cfg::nor::CTR::ReadNtrWifiSetting(0, s_NtrNorData.NtrWiFiSetting, common::NTR_WIFI_SETTING_SIZE);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
return s_SdWriter.WriteBufWithCmac(common::NOR_PATHNAME, &s_NtrNorData, sizeof(common::NtrNorData)); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::NOR_PATHNAME, &s_NtrNorData, sizeof(common::NtrNorData));
} }
nn::Result WriteSerialNumber(common::HardwareStateManager& manager) nn::Result WriteSerialNumber(common::HardwareStateManager& manager)
@ -243,7 +246,8 @@ nn::Result WriteSerialNumber(common::HardwareStateManager& manager)
size_t size; size_t size;
manager.GetSerialNumber(&serial, &size); manager.GetSerialNumber(&serial, &size);
return s_SdWriter.WriteBufWithCmac(common::SERIAL_PATHNAME, serial, size); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::SERIAL_PATHNAME, serial, size);
} }
nn::Result WriteDeviceId(common::HardwareStateManager& manager) nn::Result WriteDeviceId(common::HardwareStateManager& manager)
@ -252,7 +256,8 @@ nn::Result WriteDeviceId(common::HardwareStateManager& manager)
bit32 deviceId = manager.GetDeviceId(); bit32 deviceId = manager.GetDeviceId();
return s_SdWriter.WriteBufWithCmac(common::DEVICE_ID_PATHNAME, &deviceId, sizeof(deviceId)); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::DEVICE_ID_PATHNAME, &deviceId, sizeof(deviceId));
} }
nn::Result WriteIvs(common::HardwareStateManager& manager) nn::Result WriteIvs(common::HardwareStateManager& manager)
@ -277,7 +282,8 @@ nn::Result WriteIvs(common::HardwareStateManager& manager)
swAesCtrContest.Initialize(common::iv, common::key, sizeof(common::key)); swAesCtrContest.Initialize(common::iv, common::key, sizeof(common::key));
swAesCtrContest.Encrypt(enc, ivs, size); swAesCtrContest.Encrypt(enc, ivs, size);
return s_SdWriter.WriteBufWithCmac(common::IVS_PATHNAME, enc, size); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::IVS_PATHNAME, enc, size);
} }
else else
{ {
@ -290,7 +296,8 @@ void CreateTwlDirectory(enum common::TWL_PATH_INDEX path)
{ {
NN_ASSERT(path < common::TWL_PATHNAME_MAX); NN_ASSERT(path < common::TWL_PATHNAME_MAX);
s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + common::SdReaderWriter sdWriter;
sdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) +
std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str()); std::wstring(common::SD_TWL_ROOTNAME_TABLE[path])).c_str());
} }
@ -364,7 +371,8 @@ void AddCurrentDirectory(std::vector<common::SavePathInfo>* list, std::wstring c
list->push_back(pathInfo); list->push_back(pathInfo);
} }
// TWLセーブデータが存在するディレクトリの一覧をlistに追加する
// return: dataディレクトリが存在するかどうか
bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vector<common::SavePathInfo>* list, bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vector<common::SavePathInfo>* list,
std::vector<std::wstring>* programIdList) std::vector<std::wstring>* programIdList)
{ {
@ -373,6 +381,9 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
nn::Result result; nn::Result result;
std::vector<nn::fs::DirectoryEntry> entryList; //カレントディレクトリのエントリ一覧を格納 std::vector<nn::fs::DirectoryEntry> entryList; //カレントディレクトリのエントリ一覧を格納
std::vector<nn::fs::DirectoryEntry>::iterator entryIndex; std::vector<nn::fs::DirectoryEntry>::iterator entryIndex;
// level 0 1 2
// twln:/title/00030005/484e4441/data/
const u8 TWL_SAVEDATA_DIRECTORY_LEVEL = 2; // data ディレクトリまでの階層 const u8 TWL_SAVEDATA_DIRECTORY_LEVEL = 2; // data ディレクトリまでの階層
const wchar_t* const TWL_SAVEDATA_DIRECTORY_NAME = L"data"; const wchar_t* const TWL_SAVEDATA_DIRECTORY_NAME = L"data";
@ -390,7 +401,7 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
{ {
dir.Finalize(); dir.Finalize();
bool retValue = false; bool hasDataDirectory = false;
for (entryIndex = entryList.begin(); entryIndex != entryList.end(); entryIndex++) for (entryIndex = entryList.begin(); entryIndex != entryList.end(); entryIndex++)
{ {
// レベル2未満のディレクトリなら再帰的に開く // レベル2未満のディレクトリなら再帰的に開く
@ -398,18 +409,17 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
{ {
if (entryIndex->attributes.isDirectory) if (entryIndex->attributes.isDirectory)
{ {
if (ListTwlSaveDataDirectory( if (!ListTwlSaveDataDirectory(
currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), level + 1, currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), level + 1,
list, programIdList)) list, programIdList))
{ {
NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName); hasDataDirectory |= false;
retValue = true;
AddCurrentDirectory(list, currentDirectory, entryIndex->entryName);
} }
else else
{ {
return false; NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName);
AddCurrentDirectory(list, currentDirectory, entryIndex->entryName);
hasDataDirectory |= true;
} }
} }
} }
@ -419,15 +429,16 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
if (std::wcscmp(entryIndex->entryName, TWL_SAVEDATA_DIRECTORY_NAME) == 0) if (std::wcscmp(entryIndex->entryName, TWL_SAVEDATA_DIRECTORY_NAME) == 0)
{ {
// ファイル一覧を取得する // ファイル一覧を取得する
retValue = true;
if (!ListTwlSaveData( if (!ListTwlSaveData(
currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), list)) currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), list))
{ {
return false; hasDataDirectory |= false;
} }
NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName);
AddCurrentDirectory(list, currentDirectory, entryIndex->entryName); AddCurrentDirectory(list, currentDirectory, entryIndex->entryName);
AddCurrentProgramIdPath(programIdList, currentDirectory); AddCurrentProgramIdPath(programIdList, currentDirectory);
hasDataDirectory |= true;
} }
} }
else else
@ -436,12 +447,7 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
} }
} }
if (level != 0) return hasDataDirectory;
{
return retValue;
}
break;
} }
else else
{ {
@ -449,8 +455,6 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec
entryList.push_back(entry); entryList.push_back(entry);
} }
} }
return true;
} }
@ -568,18 +572,17 @@ void WriteTwlSaveData()
COMMON_LOGGER("Export Twl Save Data.\n"); COMMON_LOGGER("Export Twl Save Data.\n");
// ディレクトリ作成 // ディレクトリ作成
result = s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + common::SdReaderWriter sdWriter;
result = sdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) +
std::wstring(common::SD_SAVEDATA_TWL_ROOT_NAME)).c_str()); std::wstring(common::SD_SAVEDATA_TWL_ROOT_NAME)).c_str());
COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsExportSucceeded); COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsExportSucceeded);
// セーブデータを含むディレクトリ一覧を生成 // セーブデータを含むディレクトリ一覧を生成
result = nn::fs::MountSpecialArchive(common::NAND_TWL_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_TWL_NAND); result = nn::fs::MountSpecialArchive(common::NAND_TWL_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_TWL_NAND);
COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsExportSucceeded); COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsExportSucceeded);
ListTwlSaveDataDirectory(std::wstring(common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH), 0, &fileList, & programIdList); if(!ListTwlSaveDataDirectory(std::wstring(common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH), 0, &fileList, & programIdList))
NN_LOG("No Twl Savedata\n");
if(fileList.size() == 0)
{ {
NN_LOG("No Twl Savedata\n");
s_IsExportSucceeded = true; s_IsExportSucceeded = true;
return; return;
} }
@ -722,7 +725,8 @@ nn::Result WriteMcuRtcData(common::HardwareStateManager& manager)
{ {
NN_LOG("RTC = 20%02d/%02d/%02d %02d:%02d:%02d\n", rtc.m_Year, rtc.m_Month, rtc.m_Day, rtc.m_Hour, rtc.m_Minute, rtc.m_Second); NN_LOG("RTC = 20%02d/%02d/%02d %02d:%02d:%02d\n", rtc.m_Year, rtc.m_Month, rtc.m_Day, rtc.m_Hour, rtc.m_Minute, rtc.m_Second);
return s_SdWriter.WriteBufWithCmac(common::MCU_RTC_PATHNAME, &rtc, sizeof(rtc)); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::MCU_RTC_PATHNAME, &rtc, sizeof(rtc));
} }
nn::os::Thread::Sleep( nn::os::Thread::Sleep(
nn::fnd::TimeSpan::FromMilliSeconds( nn::fnd::TimeSpan::FromMilliSeconds(
@ -822,7 +826,8 @@ nn::Result WriteSaveData(::std::string& sysSaveRoot)
// セーブデータディレクトリ以下のデータをSDカードにコピー // セーブデータディレクトリ以下のデータをSDカードにコピー
// コピー用ディレクトリ作成 // コピー用ディレクトリ作成
result = s_SdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring( common::SdReaderWriter sdWriter;
result = sdWriter.CreateDirectory((::std::wstring(common::SDMC_ROOT_DIRECTORY_PATH) + ::std::wstring(
common::SD_SAVEDATA_ROOT_NAME)).c_str()); common::SD_SAVEDATA_ROOT_NAME)).c_str());
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
@ -847,7 +852,8 @@ nn::Result WriteVersionData(common::HardwareStateManager& manager)
common::VerDef versionData; common::VerDef versionData;
manager.GetVersionData(&versionData); manager.GetVersionData(&versionData);
return s_SdWriter.WriteBufWithCmac(common::VERSION_DATA_PATHNAME, &versionData, sizeof(common::VerDef)); common::SdReaderWriter sdWriter;
return sdWriter.WriteBufWithCmac(common::VERSION_DATA_PATHNAME, &versionData, sizeof(common::VerDef));
} }
bool DeleteNimSaveData() bool DeleteNimSaveData()