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;
|
bool s_IsSyncClock = false;
|
||||||
// TWLタイトルのダウンロードを開始したかどうか
|
// TWLタイトルのダウンロードを開始したかどうか
|
||||||
bool s_ExecuteTitleDownload = false;
|
bool s_ExecuteTwlTitleDownload = false;
|
||||||
// TWLタイトルのダウンロードを何回リトライしたか
|
// 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];
|
bool s_ShopOperationExecuted[SHOP_OPERATION_NUM_MAX];
|
||||||
@ -1418,10 +1425,10 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!s_ExecuteTitleDownload)
|
if (!s_ExecuteTwlTitleDownload)
|
||||||
{
|
{
|
||||||
COMMON_LOGGER("Download Twl Title\n");
|
COMMON_LOGGER("Download Twl Title\n");
|
||||||
s_ExecuteTitleDownload = true;
|
s_ExecuteTwlTitleDownload = true;
|
||||||
StartTwlTitleDownload();
|
StartTwlTitleDownload();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1440,13 +1447,13 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (s_TitleDownloadRetryCount++ < RETRY_MAX)
|
if (s_TwlTitleDownloadRetryCount++ < RETRY_MAX)
|
||||||
{
|
{
|
||||||
// エラーのためやり直す
|
// エラーのためやり直す
|
||||||
COMMON_LOGGER_RESULT_IF_FAILED(GetShopOperationSingleResult());
|
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
|
else
|
||||||
{
|
{
|
||||||
@ -1702,8 +1709,45 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
|
|
||||||
case PREINSTALL_DOWNLOAD_APP:
|
case PREINSTALL_DOWNLOAD_APP:
|
||||||
{
|
{
|
||||||
COMMON_LOGGER("Download App Stub\n");
|
if (!s_ExecutePreinstallTitleDownload)
|
||||||
s_RestoreState = PREINSTALL_WAIT_USER_SD_EJECT;
|
{
|
||||||
|
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;
|
break;
|
||||||
|
|
||||||
@ -1724,8 +1768,16 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
if (ExistsAPSetting())
|
if (ExistsAPSetting())
|
||||||
{
|
{
|
||||||
NN_LOG("AP Setting Exists. OK\n");
|
NN_LOG("AP Setting Exists. OK\n");
|
||||||
COMMON_LOGGER("Download Preinstall done\n");
|
if(s_PreinstallTitleDownloadSuccess)
|
||||||
ChangeState(saved, s_RestoreState, WAIT_SD_EJECT);
|
{
|
||||||
|
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
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@ -95,6 +95,11 @@ nn::Result PreinstallImporter::GetHtmlBodyAndParseXmlData(BgsCommunicator& comm,
|
|||||||
return comm.GetLastResult();
|
return comm.GetLastResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!comm.Finalize())
|
||||||
|
{
|
||||||
|
return comm.GetLastResult();
|
||||||
|
}
|
||||||
|
|
||||||
// XMLを解析してタイトルリストを設定する
|
// XMLを解析してタイトルリストを設定する
|
||||||
NN_UTIL_RETURN_IF_FAILED(ParseXmlData(buf, list, num));
|
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);
|
return m_pUtil->GetSerialNumber(serial, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HardwareStateManager::GetSerialNumberWithoutCD(u8* serial)
|
||||||
|
{
|
||||||
|
return m_pUtil->GetSerialNumberWithoutCD(serial);
|
||||||
|
}
|
||||||
|
|
||||||
void HardwareStateManager::GetVersionData(common::VerDef* version)
|
void HardwareStateManager::GetVersionData(common::VerDef* version)
|
||||||
{
|
{
|
||||||
return m_pUtil->GetVersionData(version);
|
return m_pUtil->GetVersionData(version);
|
||||||
|
|||||||
@ -37,6 +37,7 @@ public:
|
|||||||
void GetIvs(void** ivs, size_t* size);
|
void GetIvs(void** ivs, size_t* size);
|
||||||
nn::Handle GetMcuHandle();
|
nn::Handle GetMcuHandle();
|
||||||
void GetSerialNumber(u8** serial, size_t* size);
|
void GetSerialNumber(u8** serial, size_t* size);
|
||||||
|
void GetSerialNumberWithoutCD(u8* serial);
|
||||||
void GetVersionData(common::VerDef* version);
|
void GetVersionData(common::VerDef* version);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -44,7 +44,7 @@ namespace common
|
|||||||
{
|
{
|
||||||
|
|
||||||
Util::Util() :
|
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)
|
false), m_HasReadFriendCode(false)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -191,11 +191,11 @@ void Util::ReadIvs(u8 cupMajorVersion)
|
|||||||
// NULL終端された場所にチェックデジットを付加して新たにNULL終端する
|
// NULL終端された場所にチェックデジットを付加して新たにNULL終端する
|
||||||
void Util::AddCheckDigit(char* serial)
|
void Util::AddCheckDigit(char* serial)
|
||||||
{
|
{
|
||||||
size_t len = std::strlen(serial);
|
m_SerialNoWithoutCGLen = std::strlen(serial);
|
||||||
|
|
||||||
u8 digit = 0;
|
u8 digit = 0;
|
||||||
bool odd = true;
|
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)
|
if(odd)
|
||||||
{
|
{
|
||||||
@ -210,14 +210,14 @@ void Util::AddCheckDigit(char* serial)
|
|||||||
|
|
||||||
if(digit % 10 != 0)
|
if(digit % 10 != 0)
|
||||||
{
|
{
|
||||||
serial[len] = 10 - (digit % 10) + '0';
|
serial[m_SerialNoWithoutCGLen] = 10 - (digit % 10) + '0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
serial[len] = '0';
|
serial[m_SerialNoWithoutCGLen] = '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
serial[len + 1] = '\0';
|
serial[m_SerialNoWithoutCGLen + 1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
// /Nintendo 3DS/6ea6b9d6ab70493ea9edd8b947d5d819/853600b24760a87f534430320002544d
|
// /Nintendo 3DS/6ea6b9d6ab70493ea9edd8b947d5d819/853600b24760a87f534430320002544d
|
||||||
@ -284,6 +284,11 @@ u8* Util::GetSerialNumber()
|
|||||||
return m_SerialNo;
|
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)
|
void Util::GetIvs(void** ivs, size_t* size)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -40,7 +40,7 @@ public:
|
|||||||
void FinalizeForRestore();
|
void FinalizeForRestore();
|
||||||
|
|
||||||
// シリアルナンバーにモジュラス10 ウェイト3・1(M10W31)でチェックデジットを付加する
|
// シリアルナンバーにモジュラス10 ウェイト3・1(M10W31)でチェックデジットを付加する
|
||||||
static void AddCheckDigit(char* serial);
|
void AddCheckDigit(char* serial);
|
||||||
|
|
||||||
// IVSから計算されるセーブデータディレクトリ名を取得する
|
// IVSから計算されるセーブデータディレクトリ名を取得する
|
||||||
static void GetSaveDataDirectoryRoot(::std::string& sysSaveRoot);
|
static void GetSaveDataDirectoryRoot(::std::string& sysSaveRoot);
|
||||||
@ -63,6 +63,9 @@ public:
|
|||||||
// シリアルナンバーを返す
|
// シリアルナンバーを返す
|
||||||
u8* GetSerialNumber();
|
u8* GetSerialNumber();
|
||||||
|
|
||||||
|
// チェックデジット無しのシリアルナンバーを取得する
|
||||||
|
void GetSerialNumberWithoutCD(u8* serial);
|
||||||
|
|
||||||
// IVSを取得する
|
// IVSを取得する
|
||||||
void GetIvs(void** ivs, size_t* size);
|
void GetIvs(void** ivs, size_t* size);
|
||||||
|
|
||||||
@ -131,7 +134,8 @@ private:
|
|||||||
|
|
||||||
// IVSのサイズ
|
// IVSのサイズ
|
||||||
size_t m_SizeofIvs;
|
size_t m_SizeofIvs;
|
||||||
NN_PADDING4;
|
// チェックデジット無しのシリアルナンバーの長さ
|
||||||
|
size_t m_SerialNoWithoutCGLen;
|
||||||
|
|
||||||
// MCUへのポインタ
|
// MCUへのポインタ
|
||||||
nn::mcu::CTR::HwCheck* mp_Mcu;
|
nn::mcu::CTR::HwCheck* mp_Mcu;
|
||||||
|
|||||||
@ -73,7 +73,8 @@ void UtilTest::AddCheckDigit()
|
|||||||
const char serialWithCheckDigit[] = "EJF100004458";
|
const char serialWithCheckDigit[] = "EJF100004458";
|
||||||
char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
|
char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
|
||||||
std::memcpy(serial, serialBase, sizeof(serialBase));
|
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);
|
NN_TEST_ASSERT_EQUAL(std::strcmp(serial, serialWithCheckDigit), 0);
|
||||||
}
|
}
|
||||||
@ -84,7 +85,8 @@ void UtilTest::AddCheckDigit()
|
|||||||
const char serialWithCheckDigit[] = "CJF100046380";
|
const char serialWithCheckDigit[] = "CJF100046380";
|
||||||
char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
|
char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
|
||||||
std::memcpy(serial, serialBase, sizeof(serialBase));
|
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);
|
NN_TEST_ASSERT_EQUAL(std::strcmp(serial, serialWithCheckDigit), 0);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user