VCK および VCW タイトルのバックアップデータ検証における初回リード時のエラーでFATALになるように変更

(接触不良時、初回リード時のWIPポーリングでタイムアウトになる)

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@3046 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
n1481 2012-02-21 01:55:32 +00:00
parent 5094584a2f
commit d36d59ffa3
2 changed files with 32 additions and 17 deletions

View File

@ -76,7 +76,13 @@ BOOL checkVCK( TitleProperty* tp)
OS_TPrintf("verifyBuffer:0x%x\n", verify_data); OS_TPrintf("verifyBuffer:0x%x\n", verify_data);
InitializeBackup(); InitializeBackup();
readEEPROM( 0, (u32*)data, VCK_BACKUP_READ_SIZE);//sizeof(VCK_SlotHeader) + sizeof(VCK_ProfileSlotBody)が32Bytesの倍数でないため if( !readEEPROM( 0, (u32*)data, VCK_BACKUP_READ_SIZE))//sizeof(VCK_SlotHeader) + sizeof(VCK_ProfileSlotBody)が32Bytesの倍数でないため
{
OS_TPrintf("launch NG.\n");
FinalizeBackup();
MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
return FALSE;
}
header = (VCK_SlotHeader*)data; header = (VCK_SlotHeader*)data;
body = (VCK_ProfileSlotBody*)((u8*)data + sizeof(VCK_SlotHeader)); body = (VCK_ProfileSlotBody*)((u8*)data + sizeof(VCK_SlotHeader));
body_u8 = (u8*)body; body_u8 = (u8*)body;
@ -103,13 +109,15 @@ BOOL checkVCK( TitleProperty* tp)
// checksumがBになるようにランダムな1箇所へ書き込み // checksumがBになるようにランダムな1箇所へ書き込み
{ {
MATH_CalcSHA1( calculatedSha1, (const void*)data, sizeof(VCK_ProfileSlotBody)); MATH_CalcSHA1( calculatedSha1, (const void*)data, sizeof(VCK_ProfileSlotBody));
}
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1); rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
MATH_InitRand16( &rc16, rseed); MATH_InitRand16( &rc16, rseed);
for( i=0; i<sizeof(VCK_ProfileSlotBody); i++) for( i=0; i<sizeof(VCK_ProfileSlotBody); i++)
{ {
body_u8[i] = (u8)(MATH_Rand16( &rc16, 0xFF)); body_u8[i] = (u8)(MATH_Rand16( &rc16, 0xFF));
} }
}
B_checksum = getChecksum( body); B_checksum = getChecksum( body);
// 書き込んだ後の checksum が、S_checksum でも マジコンヘッダのchecksum にもならないようにする // 書き込んだ後の checksum が、S_checksum でも マジコンヘッダのchecksum にもならないようにする
while( (B_checksum == S_checksum) || while( (B_checksum == S_checksum) ||

View File

@ -66,8 +66,13 @@ BOOL checkVCW( TitleProperty* tp, u32 ggid)
OS_TPrintf("verifyBuffer:0x%x\n", verify_data); OS_TPrintf("verifyBuffer:0x%x\n", verify_data);
InitializeBackup(); InitializeBackup();
readEEPROM( 0, (u32*)data, VCW_BACKUP_READ_SIZE); if( !readEEPROM( 0, (u32*)data, VCW_BACKUP_READ_SIZE))
{
OS_TPrintf("launch NG!\n");
FinalizeBackup();
MI_FreeWramSlot( MI_WRAM_C, WRAM_SLOT_FOR_FS, WRAM_SIZE_FOR_FS, MI_WRAM_ARM9);
return FALSE;
}
buf = (u8*)data; buf = (u8*)data;
VCW_Initialize( &vcw[0], buf, ggid); VCW_Initialize( &vcw[0], buf, ggid);
buf = (u8*)data + (sizeof(VCW_SavegameHeader) + sizeof(VCW_BodyForCheck)); buf = (u8*)data + (sizeof(VCW_SavegameHeader) + sizeof(VCW_BodyForCheck));
@ -196,13 +201,15 @@ static u16 VCW_Modify( VCW* vcw)
// checksumがBになるようにランダムな1箇所へ書き込み // checksumがBになるようにランダムな1箇所へ書き込み
{ {
MATH_CalcSHA1( calculatedSha1, (const void*)vcw->body, sizeof(VCW_BodyForCheck)); MATH_CalcSHA1( calculatedSha1, (const void*)vcw->body, sizeof(VCW_BodyForCheck));
}
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1); rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
MATH_InitRand16( &rc16, rseed); MATH_InitRand16( &rc16, rseed);
for( i=0; i<sizeof(VCW_BodyForCheck); i++) for( i=0; i<sizeof(VCW_BodyForCheck); i++)
{ {
body_u8[i] = (u8)(MATH_Rand16( &rc16, 0xFF)); body_u8[i] = (u8)(MATH_Rand16( &rc16, 0xFF));
} }
}
VCW_UpdateChecksum( vcw); VCW_UpdateChecksum( vcw);
vcw->B_checksum = VCW_GetChecksum( vcw); vcw->B_checksum = VCW_GetChecksum( vcw);
// 書き込んだ後の checksum が、S_checksum でも マジコンヘッダのchecksum にもならないようにする // 書き込んだ後の checksum が、S_checksum でも マジコンヘッダのchecksum にもならないようにする