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);
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Ì”{<7B>ÅÈ¢½ß
{
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;
body = (VCK_ProfileSlotBody*)((u8*)data + sizeof(VCK_SlotHeader));
body_u8 = (u8*)body;
@ -103,13 +109,15 @@ BOOL checkVCK( TitleProperty* tp)
// checksumがBになるようにランダムな1箇所へ書き込み
{
MATH_CalcSHA1( calculatedSha1, (const void*)data, sizeof(VCK_ProfileSlotBody));
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
MATH_InitRand16( &rc16, rseed);
for( i=0; i<sizeof(VCK_ProfileSlotBody); i++)
{
body_u8[i] = (u8)(MATH_Rand16( &rc16, 0xFF));
}
}
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
MATH_InitRand16( &rc16, rseed);
for( i=0; i<sizeof(VCK_ProfileSlotBody); i++)
{
body_u8[i] = (u8)(MATH_Rand16( &rc16, 0xFF));
}
B_checksum = getChecksum( body);
// 書き込んだ後の checksum が、S_checksum でも マジコンヘッダの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);
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;
VCW_Initialize( &vcw[0], buf, ggid);
buf = (u8*)data + (sizeof(VCW_SavegameHeader) + sizeof(VCW_BodyForCheck));
@ -196,13 +201,15 @@ static u16 VCW_Modify( VCW* vcw)
// checksumがBになるようにランダムな1箇所へ書き込み
{
MATH_CalcSHA1( calculatedSha1, (const void*)vcw->body, sizeof(VCW_BodyForCheck));
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
MATH_InitRand16( &rc16, rseed);
for( i=0; i<sizeof(VCW_BodyForCheck); i++)
{
body_u8[i] = (u8)(MATH_Rand16( &rc16, 0xFF));
}
}
rseed = (u32)(OS_GetTick()) + *(u32*)(calculatedSha1);
MATH_InitRand16( &rc16, rseed);
for( i=0; i<sizeof(VCW_BodyForCheck); i++)
{
body_u8[i] = (u8)(MATH_Rand16( &rc16, 0xFF));
}
VCW_UpdateChecksum( vcw);
vcw->B_checksum = VCW_GetChecksum( vcw);
// 書き込んだ後の checksum が、S_checksum でも マジコンヘッダのchecksum にもならないようにする