diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/banner.c b/build/libraries_sysmenu/sysmenu/ARM9/src/banner.c index 165346d8..9160f0f9 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/banner.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/banner.c @@ -76,6 +76,82 @@ BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner ) */ } +// NANDアプリバナーリード +BOOL SYSMi_ReadBanner_NAND( NAMTitleId titleID, TWLBannerFile *pDst ) +{ +#define PATH_LENGTH 1024 + OSTick start; + FSFile file[1]; + BOOL bSuccess; + char path[PATH_LENGTH]; + s32 readLen; + s32 offset; + + //[TODO:]サブバナーが保存されている場合、そちらを使う + + start = OS_GetTick(); + readLen = NAM_GetTitleBootContentPathFast( path, titleID ); + OS_TPrintf( "NAM_GetTitleBootContentPath : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + + // ファイルパスを取得 + if(readLen != NAM_OK){ + OS_TPrintf("NAM_GetTitleBootContentPath failed %lld,%d\n", titleID, readLen ); + return FALSE; + } + + // ファイルオープン + bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); + if( ! bSuccess ) + { + OS_TPrintf("SYSM_GetNandTitleList failed: cant open file %s\n",path); + return FALSE; + } + + // ROMヘッダのバナーデータオフセットを読み込む + bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET); + if( ! bSuccess ) + { + OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(0)\n"); + FS_CloseFile(file); + return FALSE; + } + readLen = FS_ReadFile(file, &offset, sizeof(offset)); + if( readLen != sizeof(offset) ) + { + OS_TPrintf("SYSM_GetNandTitleList failed: cant read file\n"); + FS_CloseFile(file); + return FALSE; + } + + // バナーが存在する場合のみリード + if( offset ) { + bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET); + if( ! bSuccess ) + { + OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(offset)\n"); + FS_CloseFile(file); + return FALSE; + } + readLen = FS_ReadFile( file, pDst, (s32)sizeof(TWLBannerFile) ); + if( readLen != (s32)sizeof(TWLBannerFile) ) + { + OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n"); + FS_CloseFile(file); + return FALSE; + } + if( !SYSMi_CheckBannerFile( pDst ) ) + { + // 正当性チェック失敗の場合はバッファクリア + MI_CpuClearFast( pDst, sizeof(TWLBannerFile) ); + } + }else { + // バナーが存在しない場合はバッファクリア + MI_CpuClearFast( pDst, sizeof(TWLBannerFile) ); + } + + FS_CloseFile(file); + return TRUE; +} // バナーデータの正誤チェック static BOOL SYSMi_CheckBannerFile( TWLBannerFile *pBanner ) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 5eaa0bf0..910a958d 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -51,7 +51,6 @@ typedef struct MbAuthCode extern const u8 g_devPubKey[ 3 ][ 0x80 ]; // function's prototype------------------------------------------------------- -static BOOL SYSMi_ReadBanner_NAND( NAMTitleId titleID, u8 *pDst ); static s32 ReadFile( FSFile* pf, void* buffer, s32 size ); static void SYSMi_EnableHotSW( BOOL enable ); static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle ); @@ -218,7 +217,7 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) // "Not Launch"でない かつ "Data Only"でない なら有効なタイトルとしてリストに追加 if( ( pTitleIDList[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) { titleIDArray[ validNum ] = pTitleIDList[ l ]; - SYSMi_ReadBanner_NAND( pTitleIDList[ l ], (u8 *)&s_bannerBuf[ validNum ] ); + SYSMi_ReadBanner_NAND( pTitleIDList[ l ], &s_bannerBuf[ validNum ] ); validNum++; } } @@ -247,76 +246,6 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) return listNum; } -static BOOL SYSMi_ReadBanner_NAND( NAMTitleId titleID, u8 *pDst ) -{ -#define PATH_LENGTH 1024 - OSTick start; - FSFile file[1]; - BOOL bSuccess; - char path[PATH_LENGTH]; - s32 readLen; - s32 offset; - - start = OS_GetTick(); - readLen = NAM_GetTitleBootContentPathFast( path, titleID ); - OS_TPrintf( "NAM_GetTitleBootContentPath : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); - - // ファイルパスを取得 - if(readLen != NAM_OK){ - OS_TPrintf("NAM_GetTitleBootContentPath failed %lld,%d\n", titleID, readLen ); - return FALSE; - } - - // ファイルオープン - bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); - if( ! bSuccess ) - { - OS_TPrintf("SYSM_GetNandTitleList failed: cant open file %s\n",path); - return FALSE; - } - - // ROMヘッダのバナーデータオフセットを読み込む - bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET); - if( ! bSuccess ) - { - OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(0)\n"); - FS_CloseFile(file); - return FALSE; - } - readLen = FS_ReadFile(file, &offset, sizeof(offset)); - if( readLen != sizeof(offset) ) - { - OS_TPrintf("SYSM_GetNandTitleList failed: cant read file\n"); - FS_CloseFile(file); - return FALSE; - } - - // バナーが存在する場合のみリード - if( offset ) { - bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET); - if( ! bSuccess ) - { - OS_TPrintf("SYSM_GetNandTitleList failed: cant seek file(offset)\n"); - FS_CloseFile(file); - return FALSE; - } - readLen = ReadFile( file, pDst, (s32)sizeof(TWLBannerFile) ); - if( readLen != (s32)sizeof(TWLBannerFile) ) - { - OS_TPrintf("SYSM_GetNandTitleList failed: cant read file2\n"); - FS_CloseFile(file); - return FALSE; - } - }else { - // バナーが存在しない場合はバッファクリア - MI_CpuClearFast( pDst, sizeof(TWLBannerFile) ); - } - - FS_CloseFile(file); - return TRUE; -} - - // 指定ファイルリード static s32 ReadFile(FSFile* pf, void* buffer, s32 size) { diff --git a/build/libraries_sysmenu/sysmenu/common/include/internal_api.h b/build/libraries_sysmenu/sysmenu/common/include/internal_api.h index 3362975f..cd04b4a0 100644 --- a/build/libraries_sysmenu/sysmenu/common/include/internal_api.h +++ b/build/libraries_sysmenu/sysmenu/common/include/internal_api.h @@ -63,6 +63,9 @@ void SYSMi_CheckRTC( void ); // カードバナーリード(※NTR-IPL2仕様) BOOL SYSMi_ReadCardBannerFile( u32 bannerOffset, TWLBannerFile *pBanner ); +// NANDアプリバナーリード +BOOL SYSMi_ReadBanner_NAND( NAMTitleId titleID, TWLBannerFile *pDst ); + //------------------------------------------------------- // 活線挿抜 //------------------------------------------------------- diff --git a/docs/format_TWLBanner.xls b/docs/format_TWLBanner.xls index c3b58cc2..c0024923 100644 Binary files a/docs/format_TWLBanner.xls and b/docs/format_TWLBanner.xls differ