diff --git a/build/libraries_sysmenu/errorLog/ARM9/src/errorLog.c b/build/libraries_sysmenu/errorLog/ARM9/src/errorLog.c index 094ea5f0..c096bf5e 100644 --- a/build/libraries_sysmenu/errorLog/ARM9/src/errorLog.c +++ b/build/libraries_sysmenu/errorLog/ARM9/src/errorLog.c @@ -857,4 +857,6 @@ static char *s_strError[ FATAL_ERROR_MAX ] = { "FATAL_ERROR_LOAD_UNKNOWN_BOOTTYPE", "FATAL_ERROR_LOAD_AUTH_HEADER_FAILED", "FATAL_ERROR_LOAD_NEVER_STARTED", + "FATAL_ERROR_EJECT_CARD_AFTER_LOAD_START", + "FATAL_ERROR_TITLEID_COMPARE_FAILED_NTR", }; \ No newline at end of file diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 807d9815..7ec58833 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -984,6 +984,14 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) OS_TPrintf("SYSM_StartLoadTitle failed: This App has Data_Only flag.\n"); return; } + + // 最後、カード抜き挿しが発生してからSYSM_GetCardTitleListが呼ばれていない状態 + // (画面表示やリストに変更が通知されていない)だったらFATAL + // ただし、カード起動のときのみ + if( SYSMi_GetWork()->flags.hotsw.isCardStateChanged && pBootTitle->flags.bootType == LAUNCHER_BOOTTYPE_ROM ) + { + UTL_SetFatalError(FATAL_ERROR_EJECT_CARD_AFTER_LOAD_START); + } s_loadstart = TRUE; s_loadTimes++; // ロード回数のチェック用、二回目以降は非対応の実装なので @@ -1382,6 +1390,7 @@ void SYSM_ResumeLoadingThread( BOOL force ) static BOOL SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, ROM_Header *head ) { BOOL ret = TRUE; + OSTitleId ntr_fake_titleID; #ifdef DEV_WHITELIST_CHECK_SKIP // 開発版ではハッシュチェックスルーフラグを立てる @@ -1390,6 +1399,24 @@ static BOOL SYSMi_AuthenticateNTRCardAppHeader( TitleProperty *pBootTitle, ROM_H s_b_dev = TRUE; } #endif + + // pBootTitle->titleIDとROMヘッダのゲームコードの一致確認をする。 + ntr_fake_titleID = (u64)( ( head->s.game_code[ 3 ] << 0 ) | + ( head->s.game_code[ 2 ] << 8 ) | + ( head->s.game_code[ 1 ] << 16 ) | + ( head->s.game_code[ 0 ] << 24 ) ); + if( pBootTitle->titleID != ntr_fake_titleID ) + { + // ヘッダから作成した擬似titleIDが起動指定されたタイトルに格納されている擬似IDと違う + OS_TPrintf( "SYSMi_AuthenticateNTRCardAppHeader failed: header TitleID error\n" ); + OS_TPrintf( "SYSMi_AuthenticateNTRCardAppHeader failed: selectedTitleID=%.16llx\n", pBootTitle->titleID ); + OS_TPrintf( "SYSMi_AuthenticateNTRCardAppHeader failed: headerTitleID=%.16llx\n", ntr_fake_titleID ); + UTL_SetFatalError(FATAL_ERROR_TITLEID_COMPARE_FAILED_NTR); + return FALSE; + }else + { + OS_TPrintf( "Authenticate_Header : header TitleID check succeed.\n" ); + } if( head->s.exFlags.enable_nitro_whitelist_signature ) { diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 64020eb1..e1124701 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -121,7 +121,9 @@ static const char *fatal_error_msg[FATAL_ERROR_MAX] = "DHT_PHASE1_CALC_FAILED", "LOAD_UNKNOWN_BOOTTYPE", "LOAD_AUTH_HEADER_FAILED", - "LOAD_NEVER_STARTED" + "LOAD_NEVER_STARTED", + "EJECT_CARD_AFTER_LOAD_START", + "TITLEID_COMPARE_FAILED_NTR" }; //#define DEBUG_LAUNCHER_DUMP diff --git a/build/tests/FatalErrorChecker/ARM9/src/main.c b/build/tests/FatalErrorChecker/ARM9/src/main.c index ce98efe0..4bbb0665 100644 --- a/build/tests/FatalErrorChecker/ARM9/src/main.c +++ b/build/tests/FatalErrorChecker/ARM9/src/main.c @@ -23,7 +23,7 @@ #define BUFSIZE 256 -#define FATAL_ERROR_MAX 49 +#define FATAL_ERROR_MAX 51 #define NUM_ENTRY_PER_PAGE 5 #define NUM_LINE_PER_ENTRY 4 #define SKIP_SPAN 5 @@ -637,5 +637,7 @@ static char *s_strError[ FATAL_ERROR_MAX ] = { "DHT_PHASE1_CALC_FAILED", "LOAD_UNKNOWN_BOOTTYPE", "LOAD_AUTH_HEADER_FAILED", - "LOAD_NEVER_STARTED" + "LOAD_NEVER_STARTED", + "EJECT_CARD_AFTER_LOAD_START", + "TITLEID_COMPARE_FAILED_NTR" }; diff --git a/include/sysmenu/util.h b/include/sysmenu/util.h index 8025480c..34df2d31 100644 --- a/include/sysmenu/util.h +++ b/include/sysmenu/util.h @@ -78,8 +78,10 @@ typedef enum FatalErrorCode { FATAL_ERROR_LOAD_UNKNOWN_BOOTTYPE = 46, FATAL_ERROR_LOAD_AUTH_HEADER_FAILED = 47, FATAL_ERROR_LOAD_NEVER_STARTED = 48, + FATAL_ERROR_EJECT_CARD_AFTER_LOAD_START = 49, + FATAL_ERROR_TITLEID_COMPARE_FAILED_NTR = 50, - FATAL_ERROR_MAX = 49 + FATAL_ERROR_MAX = 51 }FatalErrorCode;