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:
N2614 2012-01-24 06:24:14 +00:00
parent 8055ccf482
commit 322464beb9
7 changed files with 95 additions and 21 deletions

View File

@ -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
{

View File

@ -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));

View File

@ -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);

View File

@ -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:

View File

@ -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)
{

View File

@ -40,7 +40,7 @@ public:
void FinalizeForRestore();
// シリアルナンバーにモジュラス10 ウェイト3・1M10W31でチェックデジットを付加する
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;

View File

@ -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);
}