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

View File

@ -73,7 +73,6 @@ TimeZone s_TimeZone;
const size_t NTP_SERVER_NAME_LENGTH = 256; const size_t NTP_SERVER_NAME_LENGTH = 256;
char s_NtpServerName[NTP_SERVER_NAME_LENGTH]; char s_NtpServerName[NTP_SERVER_NAME_LENGTH];
bool s_CheckedEqualsDeviceIdFileandDeviceId = false;
bool s_CheckedEqualsRegionDataandRegion = false; bool s_CheckedEqualsRegionDataandRegion = false;
bool s_ReadSerialNumber = false; bool s_ReadSerialNumber = false;
@ -260,15 +259,24 @@ nn::Result ReadSerialNumber(u8* serial)
return result; return result;
} }
nn::Result EqualsDeviceIdFileandDeviceId(common::HardwareStateManager& manager) nn::Result ExistsDeviceIdFile()
{ {
static nn::Result result = nn::ResultSuccess(); common::SdReaderWriter sdReader;
size_t totalSize;
if(s_CheckedEqualsDeviceIdFileandDeviceId) 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"); COMMON_LOGGER("Check Device Id\n");
bit32 sdDeviceId; bit32 sdDeviceId;
@ -277,32 +285,16 @@ nn::Result EqualsDeviceIdFileandDeviceId(common::HardwareStateManager& manager)
size_t bufSize = 1024; size_t bufSize = 1024;
common::HeapManager heap(bufSize); common::HeapManager heap(bufSize);
void* buf = heap.GetAddr(); void* buf = heap.GetAddr();
if (buf != NULL) if (buf == NULL)
{ {
result = sdReader.ReadBufWithCmac(common::DEVICE_ID_PATHNAME, buf, bufSize, &totalSize); return false;
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);
}
}
}
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() nn::Result EqualsRegionDataandRegion()
@ -1624,7 +1616,6 @@ void ImportTwlSaveData()
void ClearFileReadResult() void ClearFileReadResult()
{ {
s_CheckedEqualsDeviceIdFileandDeviceId = false;
s_CheckedEqualsRegionDataandRegion = false; s_CheckedEqualsRegionDataandRegion = false;
s_ReadSerialNumber = false; s_ReadSerialNumber = false;
} }

View File

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