From 48de61eb1fac2043093fd4d958fc4fa2de526847 Mon Sep 17 00:00:00 2001 From: N2614 Date: Wed, 13 Jul 2011 04:42:20 +0000 Subject: [PATCH] =?UTF-8?q?trunk=20r375-378=E3=82=92=E3=83=9E=E3=83=BC?= =?UTF-8?q?=E3=82=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@380 385bec56-5757-e545-9c3a-d8741f4650f1 --- .../sources/ConsoleBackup/Exporter.cpp | 76 ++++---- .../sources/ConsoleRestore/Controller.cpp | 180 ++++++++---------- .../sources/ConsoleRestore/Importer.cpp | 107 +---------- .../sources/ConsoleRestore/Importer.h | 3 - .../RW_Aging/sources/common/CommonLogger.h | 4 + .../RW_Aging/sources/common/FileTransfer.cpp | 85 +-------- .../RW_Aging/sources/common/FileTransfer.h | 3 - 7 files changed, 124 insertions(+), 334 deletions(-) diff --git a/branches/work/RW_Aging/sources/ConsoleBackup/Exporter.cpp b/branches/work/RW_Aging/sources/ConsoleBackup/Exporter.cpp index fc7a82f..1fe9845 100644 --- a/branches/work/RW_Aging/sources/ConsoleBackup/Exporter.cpp +++ b/branches/work/RW_Aging/sources/ConsoleBackup/Exporter.cpp @@ -53,7 +53,6 @@ namespace ConsoleBackup namespace { -common::SdReaderWriter s_SdWriter; common::NtrNorData s_NtrNorData; common::CfgCountryLanguage s_CountryLanguage; @@ -171,7 +170,8 @@ nn::Result WriteTwlTitleList(std::vector& programIdList) 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 { @@ -188,7 +188,8 @@ nn::Result WriteRegionData() nn::cfg::CTR::CfgRegionCode region; region = nn::cfg::CTR::GetRegion(); - return s_SdWriter.WriteBufWithCmac(common::REGION_DATA_PATHNAME, ®ion, sizeof(nn::cfg::CTR::CfgRegionCode)); + common::SdReaderWriter sdWriter; + return sdWriter.WriteBufWithCmac(common::REGION_DATA_PATHNAME, ®ion, sizeof(nn::cfg::CTR::CfgRegionCode)); } nn::Result WriteCountryLanguageData() @@ -206,7 +207,8 @@ nn::Result WriteCountryLanguageData() // 言語設定 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(); @@ -234,7 +236,8 @@ nn::Result WriteNorData() result = nn::cfg::nor::CTR::ReadNtrWifiSetting(0, s_NtrNorData.NtrWiFiSetting, common::NTR_WIFI_SETTING_SIZE); 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) @@ -245,7 +248,8 @@ nn::Result WriteSerialNumber(common::HardwareStateManager& manager) size_t 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) @@ -254,7 +258,8 @@ nn::Result WriteDeviceId(common::HardwareStateManager& manager) 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) @@ -279,7 +284,8 @@ nn::Result WriteIvs(common::HardwareStateManager& manager) swAesCtrContest.Initialize(common::iv, common::key, sizeof(common::key)); 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 { @@ -292,7 +298,8 @@ void CreateTwlDirectory(enum common::TWL_PATH_INDEX path) { 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()); } @@ -366,7 +373,8 @@ void AddCurrentDirectory(std::vector* list, std::wstring c list->push_back(pathInfo); } - +// TWLセーブデータが存在するディレクトリの一覧をlistに追加する +// return: dataディレクトリが存在するかどうか bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vector* list, std::vector* programIdList) { @@ -375,6 +383,9 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec nn::Result result; std::vector entryList; //カレントディレクトリのエントリ一覧を格納 std::vector::iterator entryIndex; + + // level 0 1 2 + // twln:/title/00030005/484e4441/data/ const u8 TWL_SAVEDATA_DIRECTORY_LEVEL = 2; // data ディレクトリまでの階層 const wchar_t* const TWL_SAVEDATA_DIRECTORY_NAME = L"data"; @@ -392,7 +403,7 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec { dir.Finalize(); - bool retValue = false; + bool hasDataDirectory = false; for (entryIndex = entryList.begin(); entryIndex != entryList.end(); entryIndex++) { // レベル2未満のディレクトリなら再帰的に開く @@ -400,18 +411,17 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec { if (entryIndex->attributes.isDirectory) { - if (ListTwlSaveDataDirectory( + if (!ListTwlSaveDataDirectory( currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), level + 1, list, programIdList)) { - NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName); - retValue = true; - - AddCurrentDirectory(list, currentDirectory, entryIndex->entryName); + hasDataDirectory |= false; } else { - return false; + NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName); + AddCurrentDirectory(list, currentDirectory, entryIndex->entryName); + hasDataDirectory |= true; } } } @@ -421,15 +431,16 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec if (std::wcscmp(entryIndex->entryName, TWL_SAVEDATA_DIRECTORY_NAME) == 0) { // ファイル一覧を取得する - retValue = true; if (!ListTwlSaveData( 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); AddCurrentProgramIdPath(programIdList, currentDirectory); + hasDataDirectory |= true; } } else @@ -438,12 +449,7 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec } } - if (level != 0) - { - return retValue; - } - - break; + return hasDataDirectory; } else { @@ -451,8 +457,6 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec entryList.push_back(entry); } } - - return true; } @@ -570,18 +574,17 @@ void WriteTwlSaveData() 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()); 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); 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); - - NN_LOG("No Twl Savedata\n"); - if(fileList.size() == 0) + if(!ListTwlSaveDataDirectory(std::wstring(common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH), 0, &fileList, & programIdList)) { + NN_LOG("No Twl Savedata\n"); s_IsExportSucceeded = true; return; } @@ -724,7 +727,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); - 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::fnd::TimeSpan::FromMilliSeconds( @@ -824,7 +828,8 @@ nn::Result WriteSaveData(::std::string& sysSaveRoot) // セーブデータディレクトリ以下のデータを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_LOGGER_RETURN_RESULT_IF_FAILED(result); @@ -849,7 +854,8 @@ nn::Result WriteVersionData(common::HardwareStateManager& manager) common::VerDef 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() diff --git a/branches/work/RW_Aging/sources/ConsoleRestore/Controller.cpp b/branches/work/RW_Aging/sources/ConsoleRestore/Controller.cpp index 684bac9..9363bc5 100644 --- a/branches/work/RW_Aging/sources/ConsoleRestore/Controller.cpp +++ b/branches/work/RW_Aging/sources/ConsoleRestore/Controller.cpp @@ -135,7 +135,6 @@ typedef enum RestoreState RESTORE_IN_PROGRESS, // 書き込み中 POST_RESTORE, // 書き込み後の処理 RESTORE_DONE, // 書き込み完了 - RESTORE_TEST, // 書き込み後のチェック REBOOTING, // 再起動を行う ERASE, // 削除処理を行う RESTORE_CAL, // cfgの一部をcal値で上書きする @@ -789,14 +788,15 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector(serial)); + ::std::string serialStr(reinterpret_cast (serial)); operationMessage.push_back(::std::string("Serial Number in SD : ") + serialStr); } else @@ -860,7 +860,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector 99) { - s_RestoreState = RESTORE_TEST; + s_RestoreState = POST_RESTORE; } else { @@ -1265,8 +1265,8 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector #include #include -#include #include #include // cfg:norの初期化に必要 #include @@ -623,43 +622,6 @@ bool InitializeFileSystem() return true; } -nn::Result GetNewIvs(void* oldBuf, size_t oldBufSize, void* newBuf, size_t newBufSize, size_t* newIvsSize) -{ - if (oldBufSize < nn::fs::CTR::SIZE_INTEGRITY_VERIFICATION_SEED - || newBufSize < nn::fs::CTR::SIZE_INTEGRITY_VERIFICATION_SEED - || oldBuf == NULL || newBuf == NULL - ) - { - return nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON, - nn::Result::DESCRIPTION_OUT_OF_MEMORY); - } - - nn::Result result; - result = common::SdMountManager::Mount(); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - - common::SdReaderWriter sdReader; - size_t readSize; - result = sdReader.ReadBufWithCmac(common::IVS_PATHNAME, oldBuf, oldBufSize, &readSize); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - *newIvsSize = readSize; - - // AES復号化する - nn::crypto::Initialize(); - nn::crypto::SwAesCtrContext swAesCtrContest; - - swAesCtrContest.Initialize(common::iv, common::key, sizeof(common::key)); - result = swAesCtrContest.Decrypt(newBuf, oldBuf, readSize); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - - nn::crypto::Finalize(); - - result = common::SdMountManager::Unmount(); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - - return nn::ResultSuccess(); -} - nn::Result ImportIvs() { nn::Result result = nn::ResultSuccess(); @@ -674,7 +636,7 @@ nn::Result ImportIvs() size_t readSize; result = sdReader.ReadBufWithCmac(common::IVS_PATHNAME, enc, bufSize, &readSize); - if (result.IsSuccess()) + if(result.IsSuccess()) { // SDから読み出し成功 result = nn::fs::MountSpecialArchive(common::NAND_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND); @@ -770,7 +732,6 @@ void ImportThreadFunc() NN_LOG("Import Thread Finalize\n"); } - namespace { @@ -1895,72 +1856,6 @@ bool IsImportSucceeded() return s_IsImportSucceeded; } - -nn::Result GetNewSaveDirRoot(std::wstring& sysSaveRoot) -{ - nn::Result result; - - const size_t BUF_SIZE = 1024; - common::HeapManager oldBuf(BUF_SIZE); - common::HeapManager newBuf(BUF_SIZE); - size_t ivsSize; - - result = GetNewIvs(oldBuf.GetAddr(), BUF_SIZE, newBuf.GetAddr(), BUF_SIZE, &ivsSize); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - - std::string root; - common::Util::GetSaveDataDirectoryRoot(root, newBuf.GetAddr(), ivsSize); - - wchar_t rootName[256]; - std::mbstowcs(rootName, root.c_str(), root.size() + 1); - sysSaveRoot = rootName; - - return nn::ResultSuccess(); -} - -void TestCtrDataThreadFunc() -{ - nn::Result result; - s_IsImportSucceeded = true; - - // 新IVSディレクトリを取得 - std::wstring sysSaveRoot; - result = GetNewSaveDirRoot(sysSaveRoot); - COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsImportSucceeded); - - result = nn::fs::MountSpecialArchive(common::NAND_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_CTR_NAND); - COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsImportSucceeded); - - u32 fileNum = 0; - s64 fileSize = 0; - result = common::CalculateFileNum( - ::std::wstring(common::NAND_DATA_ROOT_PATHNAME_WITH_SLASH) + sysSaveRoot + std::wstring(L"/"), fileNum, - fileSize); - COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsImportSucceeded); - - common::InitializeTransferProgress(fileSize); - - size_t bufSize = common::GetAllocatableSize(AES_BLOCK_SIZE); - common::HeapManager buf(bufSize, AES_BLOCK_SIZE); - - if(!common::TestReadDirectory((std::wstring(common::NAND_DATA_ROOT_PATHNAME_WITH_SLASH) + sysSaveRoot + std::wstring(L"/")).c_str(), buf.GetAddr(), bufSize - )) - { - s_IsImportSucceeded = false; - return; - } - - result = nn::fs::Unmount(common::NAND_ARCHIVE_NAME); - COMMON_LOGGER_RETURN_VOID_SET_BOOL_IF_FAILED(result, s_IsImportSucceeded); - -} - -void TestCtrData() -{ - COMMON_LOGGER("Test NAND Data Start...\n"); - s_ImportThread.Start(TestCtrDataThreadFunc, s_ImportThreadStack); -} - nn::Result ImportData() { static nn::Result result = nn::ResultSuccess(); diff --git a/branches/work/RW_Aging/sources/ConsoleRestore/Importer.h b/branches/work/RW_Aging/sources/ConsoleRestore/Importer.h index a875a7c..e2c49b1 100644 --- a/branches/work/RW_Aging/sources/ConsoleRestore/Importer.h +++ b/branches/work/RW_Aging/sources/ConsoleRestore/Importer.h @@ -160,9 +160,6 @@ bool ImportIvsData(); // 書き込みが成功したかどうか bool IsImportSucceeded(); -// 新たにスレッドを立て、CTR-NAND領域をテストする -void TestCtrData(); - } #endif /* IMPORTER_H_ */ diff --git a/branches/work/RW_Aging/sources/common/CommonLogger.h b/branches/work/RW_Aging/sources/common/CommonLogger.h index 6cabc1c..4c0ae93 100644 --- a/branches/work/RW_Aging/sources/common/CommonLogger.h +++ b/branches/work/RW_Aging/sources/common/CommonLogger.h @@ -93,6 +93,10 @@ return; \ } \ +#define COMMON_LOGGER_RETURN_FALSE(result) \ + COMMON_LOGGER_RESULT_WITH_LINE(result, __LINE__, __func__); \ + return false; \ + namespace common { diff --git a/branches/work/RW_Aging/sources/common/FileTransfer.cpp b/branches/work/RW_Aging/sources/common/FileTransfer.cpp index ba419f3..cc76f83 100644 --- a/branches/work/RW_Aging/sources/common/FileTransfer.cpp +++ b/branches/work/RW_Aging/sources/common/FileTransfer.cpp @@ -674,6 +674,7 @@ bool ConfirmFile(nn::fs::FileInputStream* from_file, nn::fs::FileStream* to_file COMMON_LOGGER("**********Verification Failed %s, Delete**********\n", GetCharStr(sdPath)); result = nn::fs::TryDeleteFile(tmpPath); COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); + return false; } else { @@ -767,88 +768,4 @@ bool AddPathNameAndUpdateContext(nn::fs::FileOutputStream* file, const wchar_t * return true; } - -bool TestReadDirectory(const wchar_t* path, void* buf, const size_t bufSize) -{ - nn::fs::Directory dir; - nn::fs::DirectoryEntry entry; - s32 numread = 0; - std::wostringstream targetStream; - - NN_LOG("Read Directory %ls\n", path); - nn::Result result = dir.TryInitialize(path); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); - - while (1) - { - result = dir.TryRead(&numread, &entry, 1); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); - - if(numread == 0) - { - break; - } - - if (std::wcscmp(entry.entryName, L".") == 0 || std::wcscmp(entry.entryName, L"..") == 0) - { - continue; - } - - targetStream.str(L""); - targetStream.clear(std::stringstream::goodbit); - targetStream << path << entry.entryName; - - // ディレクトリの場合 - if (entry.attributes.isDirectory) - { - targetStream << L"/"; - - // 再帰処理 - if (!TestReadDirectory(targetStream.str().c_str(), buf, bufSize)) - { - return false; - } - } - // ファイルの場合 - else - { - // ファイル作成 - nn::fs::FileInputStream file; - s64 filesize; - s32 readsize; - - NN_LOG("Read File %ls\n", targetStream.str().c_str()); - - // 読み込み対象ファイル開く - result = file.TryInitialize(targetStream.str().c_str()); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); - - // 読み込み対象ファイルのサイズ取得 - result = file.TryGetSize(&filesize); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); - - // ファイル全体を読みきるまでループ - while (1) - { - result = file.TryRead(&readsize, buf, bufSize); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result); - - if (readsize == 0) - { - break; - } - else - { - s_FinishedFileSize += readsize; - s_Progress = s_FinishedFileSize * 100 / s_TotalFileSize; - NN_LOG( - "finish = %lld, total = %lld, progress = %lld\n", s_FinishedFileSize, s_TotalFileSize, s_Progress); - } - } - } - } - - return true; -} - } diff --git a/branches/work/RW_Aging/sources/common/FileTransfer.h b/branches/work/RW_Aging/sources/common/FileTransfer.h index 7a6e4c0..e55f3bf 100644 --- a/branches/work/RW_Aging/sources/common/FileTransfer.h +++ b/branches/work/RW_Aging/sources/common/FileTransfer.h @@ -57,9 +57,6 @@ void InitializeTransferProgress(u64 totalSize); // 内部のバッファを使用するためスレッドアンセーフ const char* GetCharStr(const wchar_t* path); -// pathで指定したディレクトリ以下を再帰的に読み込んでエラーが発生しないかテストする -bool TestReadDirectory(const wchar_t* path, void* buf, const size_t bufSize); - } #endif /* FILETRANSFER_H_ */