データ移行可能本体でデバイスIDファイルが読み取れないときにエラーとする

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@754 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2013-10-23 01:35:08 +00:00
parent 6e5e142e01
commit a1f61d287f
3 changed files with 44 additions and 38 deletions

View File

@ -103,6 +103,11 @@ bool HasValidRtcData()
return !s_CheckSdOnlyMode && !s_NupOnlyMode && !s_GetIvsOnlyMode && !s_DownloadPreinstallMode;
}
bool HasDeviceIdFile()
{
return HasValidRtcData();
}
typedef enum RestoreState
{
STARTUP, // 初期値
@ -392,17 +397,24 @@ void CheckAccountDeleted(common::HardwareStateManager& manager, common::Operatio
}
else
{
// 同一本体下記書き戻しの場合はアカウント削除しない
if(EqualsDeviceIdFileandDeviceId(manager).IsSuccess())
if(HasDeviceIdFile())
{
// IVS専用モードならばIVSを取得させる
if(s_GetIvsOnlyMode)
if (ExistsDeviceIdFile().IsFailure())
{
CheckDownloadIvs(manager, message, goNextStep);
// 異常なのでFAIL
COMMON_LOGGER("Can't Read Device Id!!");
s_RestoreState = FAIL;
return;
}
// 同一本体下記書き戻しの場合はアカウント削除しない
if (EqualsDeviceIdFileandDeviceId(manager))
{
CheckAccountTransfered(manager, message, goNextStep);
}
else
{
CheckAccountTransfered(manager, message, goNextStep);
s_RestoreState = WAIT_START_DELETE_ACCOUNT;
}
}
else

View File

@ -73,7 +73,6 @@ TimeZone s_TimeZone;
const size_t NTP_SERVER_NAME_LENGTH = 256;
char s_NtpServerName[NTP_SERVER_NAME_LENGTH];
bool s_CheckedEqualsDeviceIdFileandDeviceId = false;
bool s_CheckedEqualsRegionDataandRegion = false;
bool s_ReadSerialNumber = false;
@ -260,15 +259,24 @@ nn::Result ReadSerialNumber(u8* serial)
return result;
}
nn::Result EqualsDeviceIdFileandDeviceId(common::HardwareStateManager& manager)
nn::Result ExistsDeviceIdFile()
{
static nn::Result result = nn::ResultSuccess();
if(s_CheckedEqualsDeviceIdFileandDeviceId)
common::SdReaderWriter sdReader;
size_t totalSize;
size_t bufSize = 1024;
common::HeapManager heap(bufSize);
void* buf = heap.GetAddr();
if(buf == NULL)
{
return result;
return nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
}
return sdReader.ReadBufWithCmac(common::DEVICE_ID_PATHNAME, buf, bufSize, &totalSize);
}
bool EqualsDeviceIdFileandDeviceId(common::HardwareStateManager& manager)
{
COMMON_LOGGER("Check Device Id\n");
bit32 sdDeviceId;
@ -277,32 +285,16 @@ nn::Result EqualsDeviceIdFileandDeviceId(common::HardwareStateManager& manager)
size_t bufSize = 1024;
common::HeapManager heap(bufSize);
void* buf = heap.GetAddr();
if (buf != NULL)
if (buf == NULL)
{
result = sdReader.ReadBufWithCmac(common::DEVICE_ID_PATHNAME, buf, bufSize, &totalSize);
if (result.IsSuccess())
{
s_CheckedEqualsDeviceIdFileandDeviceId = true;
std::memcpy(&sdDeviceId, buf, sizeof(sdDeviceId));
if (manager.GetDeviceId() == sdDeviceId)
{
result = nn::ResultSuccess();
}
else
{
result = nn::Result(nn::Result::LEVEL_STATUS, nn::Result::SUMMARY_INVALID_RESULT_VALUE,
nn::Result::MODULE_COMMON, nn::Result::DESCRIPTION_INVALID_RESULT_VALUE);
}
}
return false;
}
else
{
result = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
nn::Result::DESCRIPTION_OUT_OF_MEMORY);
}
return result;
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(
sdReader.ReadBufWithCmac(common::DEVICE_ID_PATHNAME, buf, bufSize, &totalSize));
std::memcpy(&sdDeviceId, buf, sizeof(sdDeviceId));
return (manager.GetDeviceId() == sdDeviceId);
}
nn::Result EqualsRegionDataandRegion()
@ -1624,7 +1616,6 @@ void ImportTwlSaveData()
void ClearFileReadResult()
{
s_CheckedEqualsDeviceIdFileandDeviceId = false;
s_CheckedEqualsRegionDataandRegion = false;
s_ReadSerialNumber = false;
}

View File

@ -25,8 +25,11 @@
namespace ConsoleRestore
{
// SDカードのデバイスIDファイルが存在するか
nn::Result ExistsDeviceIdFile();
// SDカードのデバイスIDファイルと本体のデバイスIDが一致しているかどうか
nn::Result EqualsDeviceIdFileandDeviceId(common::HardwareStateManager& manager);
bool EqualsDeviceIdFileandDeviceId(common::HardwareStateManager& manager);
// SDカードのリージョンと本体のリージョンが一致しているかどうか
nn::Result EqualsRegionDataandRegion();