mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
BGSとの通信にチェックデジット無しのシリアルナンバーを使うように
プリインストールダウンロード部分を組み込む git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@601 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
8055ccf482
commit
322464beb9
@ -82,9 +82,16 @@ u32 s_FgNupRetryCount = 0;
|
||||
// 時計同期モードかどうか
|
||||
bool s_IsSyncClock = false;
|
||||
// TWLタイトルのダウンロードを開始したかどうか
|
||||
bool s_ExecuteTitleDownload = false;
|
||||
bool s_ExecuteTwlTitleDownload = false;
|
||||
// TWLタイトルのダウンロードを何回リトライしたか
|
||||
u32 s_TitleDownloadRetryCount = 0;
|
||||
u32 s_TwlTitleDownloadRetryCount = 0;
|
||||
|
||||
// プリインストールタイトルのダウンロードを開始したかどうか
|
||||
bool s_ExecutePreinstallTitleDownload = false;
|
||||
// プリインストールタイトルのダウンロードを何回リトライしたか
|
||||
u32 s_PreinstallTitleDownloadRetryCount = 0;
|
||||
// プリインストールタイトルのダウンロードが成功したかどうか
|
||||
bool s_PreinstallTitleDownloadSuccess = false;
|
||||
|
||||
// ショップ処理を開始したかどうか
|
||||
bool s_ShopOperationExecuted[SHOP_OPERATION_NUM_MAX];
|
||||
@ -1418,10 +1425,10 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!s_ExecuteTitleDownload)
|
||||
if (!s_ExecuteTwlTitleDownload)
|
||||
{
|
||||
COMMON_LOGGER("Download Twl Title\n");
|
||||
s_ExecuteTitleDownload = true;
|
||||
s_ExecuteTwlTitleDownload = true;
|
||||
StartTwlTitleDownload();
|
||||
}
|
||||
|
||||
@ -1440,13 +1447,13 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
||||
}
|
||||
else
|
||||
{
|
||||
if (s_TitleDownloadRetryCount++ < RETRY_MAX)
|
||||
if (s_TwlTitleDownloadRetryCount++ < RETRY_MAX)
|
||||
{
|
||||
// エラーのためやり直す
|
||||
COMMON_LOGGER_RESULT_IF_FAILED(GetShopOperationSingleResult());
|
||||
COMMON_LOGGER("Download Twl Title Failed. Retrying... %d\n", s_TitleDownloadRetryCount);
|
||||
COMMON_LOGGER("Download Twl Title Failed. Retrying... %d\n", s_TwlTitleDownloadRetryCount);
|
||||
|
||||
s_ExecuteTitleDownload = false;
|
||||
s_ExecuteTwlTitleDownload = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1702,8 +1709,45 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
||||
|
||||
case PREINSTALL_DOWNLOAD_APP:
|
||||
{
|
||||
COMMON_LOGGER("Download App Stub\n");
|
||||
s_RestoreState = PREINSTALL_WAIT_USER_SD_EJECT;
|
||||
if (!s_ExecutePreinstallTitleDownload)
|
||||
{
|
||||
COMMON_LOGGER("Download PreInstall Application\n");
|
||||
s_ExecutePreinstallTitleDownload = true;
|
||||
bit64 deviceId = manager.GetDeviceId() + 0x400000000;
|
||||
u8 serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
|
||||
manager.GetSerialNumberWithoutCD(serial);
|
||||
StartPreinstallTitleDownload(deviceId, serial);
|
||||
}
|
||||
|
||||
// 動いていることを表示
|
||||
{
|
||||
PutAliveMessage(operationMessage, "Download PreInstall Title");
|
||||
}
|
||||
|
||||
if (IsDownloadTitleFinished())
|
||||
{
|
||||
FinalizeTitleDownload();
|
||||
if (DownloadTitleSucceeded())
|
||||
{
|
||||
s_PreinstallTitleDownloadSuccess = true;
|
||||
s_RestoreState = PREINSTALL_WAIT_USER_SD_EJECT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (s_PreinstallTitleDownloadRetryCount++ < RETRY_MAX)
|
||||
{
|
||||
// エラーのためやり直す
|
||||
COMMON_LOGGER_RESULT_IF_FAILED(GetShopOperationSingleResult());
|
||||
COMMON_LOGGER("Download PreInstall Title Failed. Retrying... %d\n", s_PreinstallTitleDownloadRetryCount);
|
||||
|
||||
s_ExecutePreinstallTitleDownload = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
s_RestoreState = PREINSTALL_WAIT_USER_SD_EJECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1724,8 +1768,16 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
||||
if (ExistsAPSetting())
|
||||
{
|
||||
NN_LOG("AP Setting Exists. OK\n");
|
||||
COMMON_LOGGER("Download Preinstall done\n");
|
||||
ChangeState(saved, s_RestoreState, WAIT_SD_EJECT);
|
||||
if(s_PreinstallTitleDownloadSuccess)
|
||||
{
|
||||
COMMON_LOGGER("Download Preinstall done\n");
|
||||
ChangeState(saved, s_RestoreState, WAIT_SD_EJECT);
|
||||
}
|
||||
else
|
||||
{
|
||||
COMMON_LOGGER("Download Preinstall failed\n");
|
||||
ChangeState(saved, s_RestoreState, FAIL);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -95,6 +95,11 @@ nn::Result PreinstallImporter::GetHtmlBodyAndParseXmlData(BgsCommunicator& comm,
|
||||
return comm.GetLastResult();
|
||||
}
|
||||
|
||||
if(!comm.Finalize())
|
||||
{
|
||||
return comm.GetLastResult();
|
||||
}
|
||||
|
||||
// XMLを解析してタイトルリストを設定する
|
||||
NN_UTIL_RETURN_IF_FAILED(ParseXmlData(buf, list, num));
|
||||
|
||||
|
||||
@ -68,6 +68,11 @@ void HardwareStateManager::GetSerialNumber(u8** serial, size_t* size)
|
||||
return m_pUtil->GetSerialNumber(serial, size);
|
||||
}
|
||||
|
||||
void HardwareStateManager::GetSerialNumberWithoutCD(u8* serial)
|
||||
{
|
||||
return m_pUtil->GetSerialNumberWithoutCD(serial);
|
||||
}
|
||||
|
||||
void HardwareStateManager::GetVersionData(common::VerDef* version)
|
||||
{
|
||||
return m_pUtil->GetVersionData(version);
|
||||
|
||||
@ -37,6 +37,7 @@ public:
|
||||
void GetIvs(void** ivs, size_t* size);
|
||||
nn::Handle GetMcuHandle();
|
||||
void GetSerialNumber(u8** serial, size_t* size);
|
||||
void GetSerialNumberWithoutCD(u8* serial);
|
||||
void GetVersionData(common::VerDef* version);
|
||||
|
||||
private:
|
||||
|
||||
@ -44,7 +44,7 @@ namespace common
|
||||
{
|
||||
|
||||
Util::Util() :
|
||||
m_FriendCode(0), mp_Ivs(NULL), m_SizeofIvs(0), m_BatteryRemain(100), m_CanReadSerialNumber(false), m_CanReadIvs(
|
||||
m_FriendCode(0), mp_Ivs(NULL), m_SizeofIvs(0), m_SerialNoWithoutCGLen(0), m_BatteryRemain(100), m_CanReadSerialNumber(false), m_CanReadIvs(
|
||||
false), m_HasReadFriendCode(false)
|
||||
{
|
||||
|
||||
@ -191,11 +191,11 @@ void Util::ReadIvs(u8 cupMajorVersion)
|
||||
// NULL終端された場所にチェックデジットを付加して新たにNULL終端する
|
||||
void Util::AddCheckDigit(char* serial)
|
||||
{
|
||||
size_t len = std::strlen(serial);
|
||||
m_SerialNoWithoutCGLen = std::strlen(serial);
|
||||
|
||||
u8 digit = 0;
|
||||
bool odd = true;
|
||||
for(u8 i = len - 1; i > 0 && std::isdigit(serial[i]); i--)
|
||||
for(u8 i = m_SerialNoWithoutCGLen - 1; i > 0 && std::isdigit(serial[i]); i--)
|
||||
{
|
||||
if(odd)
|
||||
{
|
||||
@ -210,14 +210,14 @@ void Util::AddCheckDigit(char* serial)
|
||||
|
||||
if(digit % 10 != 0)
|
||||
{
|
||||
serial[len] = 10 - (digit % 10) + '0';
|
||||
serial[m_SerialNoWithoutCGLen] = 10 - (digit % 10) + '0';
|
||||
}
|
||||
else
|
||||
{
|
||||
serial[len] = '0';
|
||||
serial[m_SerialNoWithoutCGLen] = '0';
|
||||
}
|
||||
|
||||
serial[len + 1] = '\0';
|
||||
serial[m_SerialNoWithoutCGLen + 1] = '\0';
|
||||
}
|
||||
|
||||
// /Nintendo 3DS/6ea6b9d6ab70493ea9edd8b947d5d819/853600b24760a87f534430320002544d
|
||||
@ -284,6 +284,11 @@ u8* Util::GetSerialNumber()
|
||||
return m_SerialNo;
|
||||
}
|
||||
|
||||
void Util::GetSerialNumberWithoutCD(u8* serial)
|
||||
{
|
||||
std::memcpy(serial, m_SerialNo, nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN);
|
||||
serial[m_SerialNoWithoutCGLen] = '\0';
|
||||
}
|
||||
|
||||
void Util::GetIvs(void** ivs, size_t* size)
|
||||
{
|
||||
|
||||
@ -40,7 +40,7 @@ public:
|
||||
void FinalizeForRestore();
|
||||
|
||||
// シリアルナンバーにモジュラス10 ウェイト3・1(M10W31)でチェックデジットを付加する
|
||||
static void AddCheckDigit(char* serial);
|
||||
void AddCheckDigit(char* serial);
|
||||
|
||||
// IVSから計算されるセーブデータディレクトリ名を取得する
|
||||
static void GetSaveDataDirectoryRoot(::std::string& sysSaveRoot);
|
||||
@ -63,6 +63,9 @@ public:
|
||||
// シリアルナンバーを返す
|
||||
u8* GetSerialNumber();
|
||||
|
||||
// チェックデジット無しのシリアルナンバーを取得する
|
||||
void GetSerialNumberWithoutCD(u8* serial);
|
||||
|
||||
// IVSを取得する
|
||||
void GetIvs(void** ivs, size_t* size);
|
||||
|
||||
@ -131,7 +134,8 @@ private:
|
||||
|
||||
// IVSのサイズ
|
||||
size_t m_SizeofIvs;
|
||||
NN_PADDING4;
|
||||
// チェックデジット無しのシリアルナンバーの長さ
|
||||
size_t m_SerialNoWithoutCGLen;
|
||||
|
||||
// MCUへのポインタ
|
||||
nn::mcu::CTR::HwCheck* mp_Mcu;
|
||||
|
||||
@ -73,7 +73,8 @@ void UtilTest::AddCheckDigit()
|
||||
const char serialWithCheckDigit[] = "EJF100004458";
|
||||
char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
|
||||
std::memcpy(serial, serialBase, sizeof(serialBase));
|
||||
common::Util::AddCheckDigit(serial);
|
||||
common::Util util;
|
||||
util.AddCheckDigit(serial);
|
||||
|
||||
NN_TEST_ASSERT_EQUAL(std::strcmp(serial, serialWithCheckDigit), 0);
|
||||
}
|
||||
@ -84,7 +85,8 @@ void UtilTest::AddCheckDigit()
|
||||
const char serialWithCheckDigit[] = "CJF100046380";
|
||||
char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
|
||||
std::memcpy(serial, serialBase, sizeof(serialBase));
|
||||
common::Util::AddCheckDigit(serial);
|
||||
common::Util util;
|
||||
util.AddCheckDigit(serial);
|
||||
|
||||
NN_TEST_ASSERT_EQUAL(std::strcmp(serial, serialWithCheckDigit), 0);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user