diff --git a/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.cpp b/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.cpp index 61e86b5..18ebc3c 100644 --- a/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.cpp +++ b/trunk/ConsoleDataMigration/ConsoleBackup/ConsoleBackup.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include "demo.h" @@ -187,6 +188,9 @@ extern "C" void nnMain(void) nn::mcu::CTR::HwCheck mcu(s_McuSession); + // amの初期化 + nn::am::InitializeForSystemMenu(); + // ヒープの確保 common::HeapManager::GetHeap()->Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR); diff --git a/trunk/ConsoleDataMigration/ConsoleBackup/Controller.cpp b/trunk/ConsoleDataMigration/ConsoleBackup/Controller.cpp index 7e7561a..b14a40c 100644 --- a/trunk/ConsoleDataMigration/ConsoleBackup/Controller.cpp +++ b/trunk/ConsoleDataMigration/ConsoleBackup/Controller.cpp @@ -31,6 +31,7 @@ namespace typedef enum BackupState { STARTUP, // 初期値 + EXPORT_TWL_LIST, // TWLアプリのリストを書き出し中 EXPORT_TWL_NAND, // TWLセーブデータ領域の吸出し中 EXPORT_TWL_SOUND, // TWLサウンド領域の吸出し中 EXPORT_TWL_PHOTO, // TWL写真領域の吸出し中 @@ -146,6 +147,28 @@ void ControlState(::std::vector& operationMessage, bool& nextStep, if (nextStep && !error) { COMMON_LOGGER("Start Export Data\n"); + + s_BackupState = EXPORT_TWL_LIST; + } + } + break; + + + // TWLセーブデータ領域の吸出し中 + case EXPORT_TWL_LIST: + { + static bool init = true; + if(init) + { + // データを書き込む + ExportTwlTitleList(); + init = false; + } + + // 処理が完了した + if (IsExportFinished()) + { + FinalizeExportThread(); s_BackupState = EXPORT_TWL_NAND; } } diff --git a/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.cpp b/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.cpp index bd8f3de..7126a74 100644 --- a/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.cpp +++ b/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include "Exporter.h" #include "CommonLogger.h" @@ -154,6 +156,67 @@ void DeleteTrash(std::wstring currentDirectory) common::SdMountManager::Unmount(); } +void WriteTwlTitleData() +{ + COMMON_LOGGER("Export TwlTitle Data.\n"); + + const u32 AM_TICKET_MAX = 8192; + + s32 personalizedTicketNum; + nn::am::TicketInfo *ticketInfoBuffer = + reinterpret_cast (common::HeapManager::GetHeap()->Allocate( + sizeof(nn::am::TicketInfo) * AM_TICKET_MAX)); + if(ticketInfoBuffer == NULL) + { + return; + } + + nn::Result result=nn::am::GetPersonalizedTicketInfoList(&personalizedTicketNum, ticketInfoBuffer, AM_TICKET_MAX); // 全部 + 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); +} + + void WriteRegionData() { COMMON_LOGGER("Export Region Data.\n"); @@ -639,11 +702,16 @@ void InitializeFileListContext() s_FileListContext.Initialize(); } -void ExportTwlSaveData() +void ExportTwlTitleList() { // 不要なデータを削除する 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/ConsoleBackup/Exporter.h b/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.h index 3291e1e..89c184e 100644 --- a/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.h +++ b/trunk/ConsoleDataMigration/ConsoleBackup/Exporter.h @@ -22,6 +22,7 @@ namespace ConsoleBackup { void InitializeFileListContext(); +void ExportTwlTitleList(); void ExportTwlSaveData(); void ExportTwlPhotoData(); void ExportTwlSoundData(); diff --git a/trunk/ConsoleDataMigration/ConsoleBackup/OMakefile b/trunk/ConsoleDataMigration/ConsoleBackup/OMakefile index a2088ff..44be172 100644 --- a/trunk/ConsoleDataMigration/ConsoleBackup/OMakefile +++ b/trunk/ConsoleDataMigration/ConsoleBackup/OMakefile @@ -72,6 +72,7 @@ LIBS += libnn_cfg \ libnn_nwm \ libnn_friends \ libnn_nim \ + libnn_am \ INSTALL_SDK_TOOL = true diff --git a/trunk/ConsoleDataMigration/common/FileName.h b/trunk/ConsoleDataMigration/common/FileName.h index 685eed6..6bd3784 100644 --- a/trunk/ConsoleDataMigration/common/FileName.h +++ b/trunk/ConsoleDataMigration/common/FileName.h @@ -59,6 +59,7 @@ const wchar_t* const VERSION_DATA_PATHNAME = L"sdmc:/CTR_Console_Repair/version. const wchar_t* const REGION_DATA_PATHNAME = L"sdmc:/CTR_Console_Repair/Region.bin"; const wchar_t* const DEVICE_ID_PATHNAME = L"sdmc:/CTR_Console_Repair/deviceId.bin"; const wchar_t* const FILE_LIST_PATHNAME = L"sdmc:/CTR_Console_Repair/FileList.txt"; +const wchar_t* const TWL_TITLELIST_PATHNAME = L"sdmc:/CTR_Console_Repair/TwlTitleList.txt"; enum TWL_PATH_INDEX {