From df7a9c9db6ffc06de2f5194d1607826ae1da04a6 Mon Sep 17 00:00:00 2001 From: N2614 Date: Thu, 19 Mar 2015 08:22:38 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9A=97=E5=8F=B7=E5=BC=8F=E4=BA=88=E7=B4=84?= =?UTF-8?q?=E8=B2=A9=E5=A3=B2=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E7=90=86=E3=82=92=E3=82=B7=E3=83=BC=E3=82=B1=E3=83=B3?= =?UTF-8?q?=E3=82=B9=E3=81=AB=E7=B5=84=E3=81=BF=E8=BE=BC=E3=82=80?= 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@844 385bec56-5757-e545-9c3a-d8741f4650f1 --- .../sources/ConsoleRestore/Controller.cpp | 147 +++++++++++++++++- .../sources/ConsoleRestore/OMakefile | 1 + .../ConsoleRestore/PreorderTitleRestorer.cpp | 8 +- .../ConsoleRestore/PreorderTitleRestorer.h | 7 +- .../PreorderTitleRestorerManager.cpp | 94 +++++++++++ .../PreorderTitleRestorerManager.h | 57 +++++++ 6 files changed, 310 insertions(+), 4 deletions(-) create mode 100644 trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorerManager.cpp create mode 100644 trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorerManager.h diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp index b46f997..81ce40b 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp @@ -35,6 +35,8 @@ #include "Shop.h" #include "Util.h" #include "ActCompleter.h" +#include "PreorderTitleRestorerManager.h" +#include "HeapManager.h" namespace ConsoleRestore { @@ -96,6 +98,13 @@ bool s_ShopOperationExecuted[SHOP_OPERATION_NUM_MAX]; // ショップ処理を何回リトライしたか u32 s_ShopOperationRetryCount[SHOP_OPERATION_NUM_MAX]; +// Personal eTicketで権利を持つプログラムIDのリストへのポインタ +nn::ProgramId* sp_ProgramId; + +// 予約販売タイトルの修復を何回リトライしたか +u32 s_PreorderTitleRestorerRetryCount = 0; + + ActCompleter::CompleteMode s_ActCompleteMode; void PutAliveMessage(common::OperationMessage& operationMessage, const char* str); @@ -154,6 +163,8 @@ typedef enum RestoreState ERASE, // 削除処理を行う COMPLETE_ACT, // actアカウント移行完了処理を行う COMPLETE_ACT_WAIT, // actアカウント移行完了処理の完了待ち + RESTORE_PREORDER_TITLE, // 予約販売タイトルの修復を行う + RESTORE_PREORDER_TITLE_WAIT, // 予約販売タイトルの修復完了待ち RESTORE_CAL, // cfgの一部をcal値で上書きする REPAIR_SIMPLE_ADDRESS_ID, // 本ツールで過去に破壊されたSimpleAddress.idを修正する TIME_ADJUST, // 時計あわせを行う @@ -179,6 +190,8 @@ typedef enum RestoreState PREINSTALL_WAIT_USER_SD_EJECT, // ユーザSD抜き出し待ち PREINSTALL_CHECK_REPAIR_SD_WAIT_NEXT, // 修理用SDのチェック・Aボタン待ち PREINSTALL_CHECK_REPAIR_SD, // 修理用SDのチェック + PREINSTALL_RESTORE_PREORDER_TITLE, // プリインストールダウンロードモード向けに予約販売タイトルの修復を行う + PREINSTALL_RESTORE_PREORDER_TITLE_WAIT, // プリインストールダウンロードモード向けに予約販売タイトルの修復完了待ち RESTORE_STATE_MAX } RestoreState; @@ -873,6 +886,51 @@ nn::Result ExecSyncMcuRtc(common::HardwareStateManager& manager) return result; } +bool SetUpProgramIdListBasedOnPersonalizedTicket(nn::ProgramId* list, s32* personalizedTicketNum) +{ + const size_t MAX_TICKET_NUM = 2000; + common::HeapManager ticketBuffer(sizeof(nn::am::TicketInfo) * MAX_TICKET_NUM); + if(!ticketBuffer.GetAddr()) + { + return false; + } + + nn::am::TicketInfo* ticketInfo = new (ticketBuffer.GetAddr()) nn::am::TicketInfo[MAX_TICKET_NUM]; + + nn::Result result = nn::am::GetPersonalizedTicketInfoList(personalizedTicketNum, ticketInfo, MAX_TICKET_NUM); + if(result.IsFailure()) + { + COMMON_LOGGER_RESULT(result, __func__) + return false; + } + + list = reinterpret_cast(common::GetAllocator()->Allocate( + sizeof(nn::ProgramId) * (*personalizedTicketNum), nn::fnd::ExpHeap::DEFAULT_ALIGNMENT)); + if(!list) + { + return false; + } + + for (s32 i = 0; i < *personalizedTicketNum; i++) + { + list[i] = ticketInfo[i].titleId; + } + + return true; +} + +void SetupCountryCodeForPreorder(nn::cfg::CTR::CfgCountryCode& country) +{ + if (GetCountryCodeFromEci() != nn::cfg::CTR::CFG_COUNTRY_UNDEFINED) + { + country = GetCountryCodeFromEci(); + } + else if (ActCompleter::GetCountryCodeFromNna() != nn::cfg::CTR::CFG_COUNTRY_UNDEFINED) + { + country = ActCompleter::GetCountryCodeFromNna(); + } +} + } // namespace void ControlState(common::HardwareStateManager& manager, common::OperationMessage& operationMessage, bool& nextStep, @@ -1476,12 +1534,12 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag if(s_GetIvsOnlyMode) { ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_CONNECT, "Shop Connect", - "Shop Connect Finished.\n", "Shop Connect Failed. Retrying...", WAIT_SD_EJECT); + "Shop Connect Finished.\n", "Shop Connect Failed. Retrying...", RESTORE_PREORDER_TITLE); } else if(s_DownloadPreinstallMode) { ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_CONNECT, "Shop Connect", - "Shop Connect Finished.\n", "Shop Connect Failed. Retrying...", REPAIR_SIMPLE_ADDRESS_ID); + "Shop Connect Finished.\n", "Shop Connect Failed. Retrying...", PREINSTALL_RESTORE_PREORDER_TITLE); } else { @@ -1491,6 +1549,86 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag } break; + case RESTORE_PREORDER_TITLE: + { + s32 personalizedTicketNum; + if(!SetUpProgramIdListBasedOnPersonalizedTicket(sp_ProgramId, &personalizedTicketNum)) + { + s_RestoreState = FAIL; + break; + } + + // 適切な国コードを設定する + nn::cfg::CTR::CfgCountryCode country = nn::cfg::CTR::CFG_COUNTRY_UNDEFINED;; + SetupCountryCodeForPreorder(country); + + PreorderTitleRestorerManager::Start(sp_ProgramId, personalizedTicketNum, country, nn::cfg::CTR::GetRegion()); + s_RestoreState = RESTORE_PREORDER_TITLE_WAIT; + } + break; + + case RESTORE_PREORDER_TITLE_WAIT: + { + PutAliveMessage(operationMessage, "Restoring PreOrdered Title"); + if(PreorderTitleRestorerManager::IsFinished()) + { + PreorderTitleRestorerManager::End(); + if(PreorderTitleRestorerManager::GetResult().IsFailure()) + { + if(s_PreorderTitleRestorerRetryCount++ < RETRY_MAX) + { + common::GetAllocator()->Free(sp_ProgramId); + s_RestoreState = RESTORE_PREORDER_TITLE; + break; + } + } + else + { + s_RestoreState = WAIT_SD_EJECT; + } + } + } + break; + + case PREINSTALL_RESTORE_PREORDER_TITLE: + { + s32 personalizedTicketNum; + if(!SetUpProgramIdListBasedOnPersonalizedTicket(sp_ProgramId, &personalizedTicketNum)) + { + s_RestoreState = FAIL; + break; + } + + // アカウントから国コードが取れないので、UNDEFINEDを渡す + PreorderTitleRestorerManager::Start(sp_ProgramId, personalizedTicketNum, nn::cfg::CTR::CFG_COUNTRY_UNDEFINED, nn::cfg::CTR::GetRegion()); + s_RestoreState = PREINSTALL_RESTORE_PREORDER_TITLE_WAIT; + } + break; + + case PREINSTALL_RESTORE_PREORDER_TITLE_WAIT: + { + PutAliveMessage(operationMessage, "Restoring PreOrdered Title"); + if(PreorderTitleRestorerManager::IsFinished()) + { + PreorderTitleRestorerManager::End(); + if(PreorderTitleRestorerManager::GetResult().IsFailure()) + { + if(s_PreorderTitleRestorerRetryCount++ < RETRY_MAX) + { + common::GetAllocator()->Free(sp_ProgramId); + s_RestoreState = PREINSTALL_RESTORE_PREORDER_TITLE; + break; + } + } + else + { + s_RestoreState = REPAIR_SIMPLE_ADDRESS_ID; + } + } + + } + break; + case DOWNLOAD_TWL: { // ファイルリストがなければ次へ @@ -2134,6 +2272,7 @@ void InitializeState() s_PlayedFailSound = false; s_ExecuteFgNup = false; s_FgNupRetryCount = 0; + s_PreorderTitleRestorerRetryCount = 0; s_NupOnlyMode = false; s_GetIvsOnlyMode = false; @@ -2171,6 +2310,10 @@ u32 GetProgress() { return GetTitleDownloadProgress(); } + else if(s_RestoreState == RESTORE_PREORDER_TITLE_WAIT || s_RestoreState == PREINSTALL_RESTORE_PREORDER_TITLE_WAIT) + { + return PreorderTitleRestorerManager::GetProgress(); + } else { return 0; diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile b/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile index 79d2708..64029d4 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile @@ -38,6 +38,7 @@ SOURCES[] = NinjaCommunicator.cpp SimpleXmlPreprocessor.cpp PreorderTitleRestorer.cpp + PreorderTitleRestorerManager.cpp NinjaXmlReader.cpp ../common/Util.cpp ../common/DrawSystemState.cpp diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorer.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorer.cpp index 4f7807e..50a0bab 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorer.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorer.cpp @@ -53,7 +53,7 @@ const size_t s_TypicalCountryCodeSize = sizeof(s_TypicalCountryCode) / sizeof(s_ } -PreorderTitleRestorer::PreorderTitleRestorer() +PreorderTitleRestorer::PreorderTitleRestorer() : m_Progress(0) { } @@ -66,6 +66,7 @@ nn::Result PreorderTitleRestorer::Execute(nn::ProgramId list[], size_t size, nn: { for(s32 i = 0; i < size; ++i) { + m_Progress = i * 100 / size; std::string xml; nn::cfg::CfgCountryCode deliveredCountry; COMMON_LOGGER_RETURN_RESULT_IF_FAILED( @@ -78,6 +79,11 @@ nn::Result PreorderTitleRestorer::Execute(nn::ProgramId list[], size_t size, nn: return nn::ResultSuccess(); } +u64 PreorderTitleRestorer::GetProgress() +{ + return m_Progress; +} + nn::Result PreorderTitleRestorer::GetExternalSeedInfo( nn::cfg::CTR::CfgCountryCode* deliveredCountry, std::string& xml, diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorer.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorer.h index 297eb38..9f4b8b5 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorer.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorer.h @@ -32,13 +32,17 @@ public: PreorderTitleRestorer(); virtual ~PreorderTitleRestorer(); - //! @brief @予約販売タイトルの修復を行います + //! @brief 予約販売タイトルの修復を行います //! @param[in] list[] Personalized eTicketで権利を持っているタイトルの配列 //! @param[in] size listのサイズ //! @param[in] country 国コード。国コードが取得できない場合はCFG_COUNTRY_UNDEFINEDを渡してください //! @param[in] region リージョンコード nn::Result Execute(nn::ProgramId list[], size_t size, nn::cfg::CTR::CfgCountryCode country, nn::cfg::CTR::CfgRegionCode region); + // @brief 進捗状況を取得します + // @return 0-100の進捗 + u64 GetProgress(); + private: nn::Result GetExternalSeedInfo( nn::cfg::CTR::CfgCountryCode* deliveredCountry, @@ -57,6 +61,7 @@ private: bool IsValidCountry(nn::cfg::CfgCountryCode countryCode, nn::cfg::CfgRegionCode region); std::map m_SuccessfulCountryMap; + u64 m_Progress; }; } /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorerManager.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorerManager.cpp new file mode 100644 index 0000000..ff036c1 --- /dev/null +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorerManager.cpp @@ -0,0 +1,94 @@ +/*---------------------------------------------------------------------------* + Project: Horizon + File: PreorderTitleRestoreManager.cpp + + Copyright (C)2015 Nintendo Co., Ltd. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Rev$ + *---------------------------------------------------------------------------*/ +#include "PreorderTitleRestorerManager.h" +#include "HeapManager.h" + +namespace ConsoleRestore +{ + +const size_t PreorderTitleRestorerManager::STACK_SIZE; +nn::Result PreorderTitleRestorerManager::s_Result; +nn::os::Thread PreorderTitleRestorerManager::s_Thread; +nn::os::StackBuffer PreorderTitleRestorerManager::s_ThreadStack; +bool PreorderTitleRestorerManager::s_Started = false; +PreorderTitleRestorer* PreorderTitleRestorerManager::m_Restorer = NULL; +nn::ProgramId* PreorderTitleRestorerManager::s_List; +size_t PreorderTitleRestorerManager::s_Size; +nn::cfg::CTR::CfgCountryCode PreorderTitleRestorerManager::s_Country; +nn::cfg::CTR::CfgRegionCode PreorderTitleRestorerManager::s_Region; + + + +PreorderTitleRestorerManager::PreorderTitleRestorerManager() +{ + // TODO 自動生成されたコンストラクター・スタブ + +} + +PreorderTitleRestorerManager::~PreorderTitleRestorerManager() +{ + // TODO Auto-generated destructor stub +} + +void PreorderTitleRestorerManager::Start(nn::ProgramId list[], size_t size, nn::cfg::CTR::CfgCountryCode country, nn::cfg::CTR::CfgRegionCode region) +{ + if(!s_Started) + { + s_List = list; + s_Size = size; + s_Country = country; + s_Region = region; + s_Thread.Start(ThreadFunc, s_ThreadStack); + s_Started = true; + } +} + +bool PreorderTitleRestorerManager::IsFinished() +{ + return s_Thread.IsAlive(); +} + +nn::Result PreorderTitleRestorerManager::GetResult() +{ + return s_Result; +} + +void PreorderTitleRestorerManager::End() +{ + if(s_Started) + { + s_Thread.Join(); + s_Thread.Finalize(); + if(m_Restorer) + { + delete m_Restorer; + } + s_Started = false; + } +} + +u64 PreorderTitleRestorerManager::GetProgress() +{ + return m_Restorer->GetProgress(); +} + +void PreorderTitleRestorerManager::ThreadFunc() +{ + m_Restorer = new PreorderTitleRestorer; + s_Result = m_Restorer->Execute(s_List, s_Size, s_Country, s_Region); + +} + +} /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorerManager.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorerManager.h new file mode 100644 index 0000000..8312761 --- /dev/null +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreorderTitleRestorerManager.h @@ -0,0 +1,57 @@ +/*---------------------------------------------------------------------------* + Project: Horizon + File: PreorderTitleRestoreManager.h + + Copyright (C)2015 Nintendo Co., Ltd. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Rev$ + *---------------------------------------------------------------------------*/ +#ifndef SOURCES_CONSOLERESTORE_PREORDERTITLERESTORERMANAGER_H_ +#define SOURCES_CONSOLERESTORE_PREORDERTITLERESTORERMANAGER_H_ + +#include +#include +#include +#include "PreorderTitleRestorer.h" + +namespace ConsoleRestore +{ + +class PreorderTitleRestorerManager +{ +public: + PreorderTitleRestorerManager(); + virtual ~PreorderTitleRestorerManager(); + + // 修復を開始する。既に開始していた場合何もしない + static void Start(nn::ProgramId list[], size_t size, nn::cfg::CTR::CfgCountryCode country, nn::cfg::CTR::CfgRegionCode region); + + static bool IsFinished(); + static nn::Result GetResult(); + static void End(); + static u64 GetProgress(); + +private: + static void ThreadFunc(); + static nn::ProgramId* s_List; + static size_t s_Size; + static nn::cfg::CTR::CfgCountryCode s_Country; + static nn::cfg::CTR::CfgRegionCode s_Region; + + static nn::Result s_Result; + static nn::os::Thread s_Thread; + static const size_t STACK_SIZE = 12 * 1024; + static nn::os::StackBuffer s_ThreadStack; + static PreorderTitleRestorer* m_Restorer; + static bool s_Started; +}; + +} /* namespace ConsoleRestore */ + +#endif /* SOURCES_CONSOLERESTORE_PREORDERTITLERESTORERMANAGER_H_ */