From 192209ec58c28d4ebf11c90d6d72b8fb68fe3fda Mon Sep 17 00:00:00 2001 From: N2614 Date: Wed, 27 Apr 2011 05:46:42 +0000 Subject: [PATCH] =?UTF-8?q?TWL=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E3=83=AA=E3=82=B9=E3=83=88=E3=82=92eTicket=E3=81=A7?= =?UTF-8?q?=E3=81=AF=E3=81=AA=E3=81=8F=E3=82=BB=E3=83=BC=E3=83=96=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88?= =?UTF-8?q?=E3=83=AA=E3=81=A7=E5=88=A4=E6=96=AD=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB?= 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@231 385bec56-5757-e545-9c3a-d8741f4650f1 --- .../sources/ConsoleBackup/Controller.cpp | 23 +--- .../sources/ConsoleBackup/Exporter.cpp | 116 +++++++++--------- .../sources/common/FileTransfer.h | 2 + .../ConsoleBackup/Exporter/test_Exporter.cpp | 10 +- 4 files changed, 63 insertions(+), 88 deletions(-) diff --git a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Controller.cpp b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Controller.cpp index a5e1891..3b4b98d 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Controller.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Controller.cpp @@ -30,7 +30,6 @@ namespace typedef enum BackupState { STARTUP, // 初期値 - EXPORT_TWL_LIST, // TWLアプリのリストを書き出し中 EXPORT_TWL_NAND, // TWLセーブデータ領域の吸出し中 EXPORT_TWL_SOUND, // TWLサウンド領域の吸出し中 EXPORT_TWL_PHOTO, // TWL写真領域の吸出し中 @@ -148,32 +147,12 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector& programIdList) { - COMMON_LOGGER("Export TwlTitle Data.\n"); + COMMON_LOGGER("Export TwlTitle List.\n"); - const u32 AM_TICKET_MAX = 8192; + size_t heapSize = common::HeapManager::GetHeap()->GetAllocatableSize(); + char* titleListBuf = reinterpret_cast (common::HeapManager::GetHeap()->Allocate(heapSize)); - s32 personalizedTicketNum; - nn::am::TicketInfo *ticketInfoBuffer = - reinterpret_cast (common::HeapManager::GetHeap()->Allocate( - sizeof(nn::am::TicketInfo) * AM_TICKET_MAX)); - if(ticketInfoBuffer == NULL) + size_t writeSize = 0; + if (titleListBuf != NULL) { - return; + for (std::vector::iterator it = programIdList.begin(); it != programIdList.end(); it++) + { + nn::nstd::TSNPrintf(titleListBuf + writeSize, heapSize - writeSize, "%s\n", common::GetCharStr(it->c_str())); + NN_LOG("%ls\n", it->c_str()); + writeSize += it->size() + sizeof('\n'); + } } - nn::Result result=nn::am::GetPersonalizedTicketInfoList(&personalizedTicketNum, ticketInfoBuffer, AM_TICKET_MAX); // 全部 + nn::Result result = s_SdWriter.WriteBufWithCmac(common::TWL_TITLELIST_PATHNAME, titleListBuf, writeSize); COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - if(result.IsFailure()) - { - return; - } - - - u32 twlTiteNum = 0; - for (u32 i = 0; i < personalizedTicketNum; i++) - { - if (nn::CTR::IsTwlApp(ticketInfoBuffer[i].titleId)) - { - twlTiteNum++; - } - } - - if (twlTiteNum > 0) - { - const size_t BYTES_PER_LINE = sizeof(nn::ProgramID) * 2 + sizeof('\n'); - char* titleListBuf = reinterpret_cast (common::HeapManager::GetHeap()->Allocate( - BYTES_PER_LINE * twlTiteNum + sizeof('0'))); - if (titleListBuf != NULL) - { - for (u32 i = 0; i < personalizedTicketNum; i++) - { - if (nn::CTR::IsTwlApp(ticketInfoBuffer[i].titleId)) - { - nn::nstd::TSNPrintf(titleListBuf + i * BYTES_PER_LINE, - BYTES_PER_LINE * twlTiteNum + sizeof('0') - i * BYTES_PER_LINE, "%016llx\n", - ticketInfoBuffer[i].titleId); - NN_LOG("%016llx\n", ticketInfoBuffer[i].titleId); - } - } - - result = s_SdWriter.WriteBufWithCmac(common::TWL_TITLELIST_PATHNAME, titleListBuf, - BYTES_PER_LINE * twlTiteNum); - COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result); - common::HeapManager::GetHeap()->Free(titleListBuf); - } - } - - common::HeapManager::GetHeap()->Free(ticketInfoBuffer); + common::HeapManager::GetHeap()->Free(titleListBuf); } @@ -357,6 +320,37 @@ void ListTwlSaveData(std::wstring currentDirectory, std::vector* programIdList, std::wstring currentDir) +{ + std::wstring currentPath(currentDir); + std::wstring token(common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH); + + std::wstring::size_type pos; + pos = currentPath.find(token); + if(pos != std::wstring::npos) + { + std::wstring subStr = currentPath.substr(token.size()); + + std::wstring slash(L"/"); + pos = subStr.find(slash); + while(pos != std::wstring::npos) + { + subStr.erase(pos, slash.size()); + pos = subStr.find(slash); + } + + std::wstring ctrProgramIdHi(L"00048"); + subStr.replace(0, ctrProgramIdHi.size(), ctrProgramIdHi); + + programIdList->push_back(subStr); + } + else + { + NN_LOG("Can't find %ls\n", common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH); + } + +} + void AddCurrentDirectory(std::vector* list, std::wstring currentDir, wchar_t* currentEntry) { common::SavePathInfo pathInfo; @@ -367,7 +361,8 @@ void AddCurrentDirectory(std::vector* list, std::wstring c } -bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vector* list) +bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vector* list, + std::vector* programIdList) { // TODO: リードオンリーのファイルが消去できない nn::fs::FileInputStream fis; @@ -404,7 +399,7 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec { if (ListTwlSaveDataDirectory( currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), - level + 1, list)) + level + 1, list, programIdList)) { NN_LOG("%ls/%ls has data directory.\n", currentDirectory.c_str(), entryIndex->entryName); retValue = true; @@ -423,6 +418,7 @@ bool ListTwlSaveDataDirectory(std::wstring currentDirectory, u32 level, std::vec ListTwlSaveData(currentDirectory + std::wstring(L"/") + std::wstring(entryIndex->entryName), list); AddCurrentDirectory(list, currentDirectory, entryIndex->entryName); + AddCurrentProgramIdPath(programIdList, currentDirectory); } } else @@ -550,6 +546,7 @@ void WriteTwlSaveData() { nn::Result result; std::vector fileList; + std::vector programIdList; COMMON_LOGGER("Export Twl Save Data.\n"); @@ -560,14 +557,16 @@ void WriteTwlSaveData() // セーブデータを含むディレクトリ一覧を生成 result = nn::fs::MountSpecialArchive(common::NAND_TWL_ARCHIVE_NAME, nn::fs::CTR::ARCHIVE_TYPE_TWL_NAND); COMMON_LOGGER_RESULT_IF_FAILED(result); - ListTwlSaveDataDirectory(std::wstring(common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH), 0, &fileList); + ListTwlSaveDataDirectory(std::wstring(common::NAND_TWL_DATA_ROOT_PATHNAME_WITHOUT_SLASH), 0, &fileList, & programIdList); - NN_LOG("\n"); + NN_LOG("listup Twl Savedata Directory\n"); for (std::vector::reverse_iterator it = fileList.rbegin(); it != fileList.rend(); it++) { NN_LOG("%ls\n", it->name.c_str()); } + WriteTwlTitleList(programIdList); + // 合計サイズ取得 s64 fileSize; CalculateTwlSaveData(&fileList, &fileSize); @@ -655,16 +654,11 @@ void InitializeFileListContext() s_FileListContext.Initialize(); } -void ExportTwlTitleList() +void ExportTwlSaveData() { // 不要なデータを削除する DeleteTrash((std::wstring(common::LOG_ROOT_DIRECTORY_PATH) + std::wstring(L"/")).c_str()); - s_ExportThread.Start(WriteTwlTitleData, s_ExportThreadStack); -} - -void ExportTwlSaveData() -{ s_ExportThread.Start(WriteTwlSaveData, s_ExportThreadStack); } diff --git a/trunk/ConsoleDataMigration/sources/common/FileTransfer.h b/trunk/ConsoleDataMigration/sources/common/FileTransfer.h index abc65cc..10505f0 100644 --- a/trunk/ConsoleDataMigration/sources/common/FileTransfer.h +++ b/trunk/ConsoleDataMigration/sources/common/FileTransfer.h @@ -34,6 +34,8 @@ bool CopyDirectory(ImportDataList* fileList, const wchar_t * from_path, const wc u32 GetProgress(); void InitializeTransferProgress(u64 totalSize); +const char* GetCharStr(const wchar_t* path); + } #endif /* FILETRANSFER_H_ */ diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleBackup/Exporter/test_Exporter.cpp b/trunk/ConsoleDataMigration/sources/tests/ConsoleBackup/Exporter/test_Exporter.cpp index 61b3427..436e3d6 100644 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleBackup/Exporter/test_Exporter.cpp +++ b/trunk/ConsoleDataMigration/sources/tests/ConsoleBackup/Exporter/test_Exporter.cpp @@ -37,10 +37,10 @@ public: ExporterTest() { SUITE_NAME("TestUtil"); - TEST_ADD(ExporterTest::WriteTwlTitleData); + TEST_ADD(ExporterTest::ExportTwlSaveData); } private: - void WriteTwlTitleData(); + void ExportTwlSaveData(); }; namespace @@ -93,18 +93,18 @@ void ExporterTest::FinalizeSuite() // Test Functions //------------------------------------------------------------------ -void ExporterTest::WriteTwlTitleData() +void ExporterTest::ExportTwlSaveData() { NN_LOG("WriteTwlTitleData\n"); - ConsoleBackup::ExportTwlTitleList(); + ConsoleBackup::ExportTwlSaveData(); while (!ConsoleBackup::IsExportFinished()) { nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(10)); } ConsoleBackup::FinalizeExportThread(); -} +} NN_TEST_DEFINE_MAIN(ExporterTest)