mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
タイトルリストの作成方式変更
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1096 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
5d40bc12f8
commit
5f9914777a
@ -59,7 +59,7 @@ static void SYSMi_EnableHotSW( BOOL enable );
|
||||
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle );
|
||||
static void SYSMi_Relocate( void );
|
||||
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
|
||||
static void SYSMi_makeTitleIdList( TitleProperty *pTitleList );
|
||||
static void SYSMi_makeTitleIdList( void );
|
||||
|
||||
// global variable-------------------------------------------------------------
|
||||
// static variable-------------------------------------------------------------
|
||||
@ -72,6 +72,9 @@ static MbAuthCode s_authcode;
|
||||
|
||||
static BOOL s_loadstart = FALSE;
|
||||
|
||||
static NAMTitleId *s_pTitleIDList = NULL;
|
||||
static int s_listLength = 0;
|
||||
|
||||
// const data------------------------------------------------------------------
|
||||
static const OSBootType s_launcherToOSBootType[ LAUNCHER_BOOTTYPE_MAX ] = {
|
||||
OS_BOOTTYPE_ILLEGAL, // ILLEGAL
|
||||
@ -221,51 +224,70 @@ BOOL SYSMi_CopyCardBanner( void )
|
||||
return retval;
|
||||
}
|
||||
|
||||
// NANDタイトルリストの取得
|
||||
// listNumにはカード部分も含めたリストの長さを与える
|
||||
// インポートされているすべてのNANDアプリを列挙したリストの準備
|
||||
// SYSM_GetNandTitleListおよびSYSM_TryToBootTitle前に呼ぶ必要あり
|
||||
BOOL SYSM_InitNandTitleList( void )
|
||||
{
|
||||
OSTick start;
|
||||
|
||||
if( s_pTitleIDList != NULL ) return TRUE;
|
||||
|
||||
// インポートされているタイトルの取得
|
||||
start = OS_GetTick();
|
||||
s_listLength = NAM_GetNumTitles();
|
||||
OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
|
||||
s_pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * s_listLength );
|
||||
if( s_pTitleIDList == NULL ) {
|
||||
OS_TPrintf( "%s: alloc error.\n", __FUNCTION__ );
|
||||
return FALSE;
|
||||
}
|
||||
start = OS_GetTick();
|
||||
(void)NAM_GetTitleList( s_pTitleIDList, (u32)s_listLength );
|
||||
OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// NANDアプリリストの解放
|
||||
void SYSM_FreeNandTitleList( void )
|
||||
{
|
||||
if(s_pTitleIDList != NULL)
|
||||
{
|
||||
SYSM_Free( s_pTitleIDList );
|
||||
s_pTitleIDList = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// ローンチ対象となるNANDタイトルリストの取得
|
||||
// listNumには、pTitleList_Nandの長さを与える
|
||||
// 得られる最大のタイトル数は、(LAUNCHER_TITLE_LIST_NUM - 1)に制限される(ランチャーが表示できる最大数からカードぶんを引いた数)
|
||||
// return:取得したNANDタイトルの数
|
||||
int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
|
||||
{
|
||||
// filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。
|
||||
// とりあえずALL
|
||||
OSTick start;
|
||||
int l;
|
||||
int getNum;
|
||||
int validNum = 0;
|
||||
NAMTitleId titleIDArray[ LAUNCHER_TITLE_LIST_NUM ];
|
||||
NAMTitleId *pTitleIDList = NULL;
|
||||
NAMTitleId titleIDArray[ LAUNCHER_TITLE_LIST_NUM - 1 ];// ローンチ可能なタイトルリストの一時置き場
|
||||
|
||||
|
||||
if( listNum > LAUNCHER_TITLE_LIST_NUM ) {
|
||||
OS_TPrintf( "Warning: TitleList_Nand num over LAUNCHER_TITLE_LIST_NUM(%d)\n", LAUNCHER_TITLE_LIST_NUM );
|
||||
}
|
||||
|
||||
// インストールされているタイトルの取得
|
||||
start = OS_GetTick();
|
||||
getNum = NAM_GetNumTitles();
|
||||
OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
|
||||
pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * getNum );
|
||||
if( pTitleIDList == NULL ) {
|
||||
OS_TPrintf( "%s: alloc error.\n", __FUNCTION__ );
|
||||
return 0;
|
||||
}
|
||||
start = OS_GetTick();
|
||||
(void)NAM_GetTitleList( pTitleIDList, (u32)getNum );
|
||||
OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
|
||||
if( s_pTitleIDList == NULL ) return -1;
|
||||
|
||||
// 取得したタイトルがローンチ対象かどうかをチェック
|
||||
for( l = 0; l < getNum; l++ ) {
|
||||
for( l = 0; l < s_listLength; l++ ) {
|
||||
// "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 ], &s_bannerBuf[ validNum ] );
|
||||
if( ( s_pTitleIDList[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) {
|
||||
titleIDArray[ validNum ] = s_pTitleIDList[ l ];
|
||||
SYSMi_ReadBanner_NAND( s_pTitleIDList[ l ], &s_bannerBuf[ validNum ] );
|
||||
validNum++;
|
||||
if( !( validNum < LAUNCHER_TITLE_LIST_NUM - 1 ) )// 最大(LAUNCHER_TITLE_LIST_NUM - 1)まで
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
SYSM_Free( pTitleIDList );
|
||||
|
||||
// 念のため残り領域を0クリア
|
||||
for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM; l++ ) {
|
||||
for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM - 1; l++ ) {
|
||||
titleIDArray[ l ] = 0;
|
||||
}
|
||||
|
||||
@ -274,6 +296,7 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
|
||||
|
||||
listNum--; // カードのぶん引いておく
|
||||
|
||||
// 引数に与えられたリストの長さ-1 と、ローンチ可能タイトルリストの長さの比較
|
||||
listNum = ( validNum < listNum ) ? validNum : listNum;
|
||||
|
||||
for(l=0;l<listNum;l++)
|
||||
@ -1019,7 +1042,7 @@ BOOL SYSM_IsAuthenticateTitleFinished( void )
|
||||
}
|
||||
|
||||
// ロード済みの指定タイトルの認証とブートを行う
|
||||
AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitleList )
|
||||
AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle )
|
||||
{
|
||||
if(s_authResult != AUTH_RESULT_SUCCEEDED)
|
||||
{
|
||||
@ -1045,7 +1068,8 @@ AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitle
|
||||
( (OSBootInfo *)OS_GetBootInfo() )->boot_type = s_launcherToOSBootType[ pBootTitle->flags.bootType ];
|
||||
|
||||
// タイトルIDリストの作成
|
||||
SYSMi_makeTitleIdList( pTitleList );
|
||||
SYSMi_makeTitleIdList();
|
||||
SYSM_FreeNandTitleList();
|
||||
|
||||
BOOT_Ready(); // never return.
|
||||
|
||||
@ -1053,16 +1077,21 @@ AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitle
|
||||
}
|
||||
|
||||
// タイトルIDリストの作成
|
||||
static void SYSMi_makeTitleIdList( TitleProperty *pTitleList )
|
||||
static void SYSMi_makeTitleIdList( void )
|
||||
{
|
||||
// [TODO:]現在ランチャーで表示できるタイトル(ブート可能タイトル)のみ
|
||||
// リストに入れるようになっているが
|
||||
// ブート不可タイトルについても対応する必要あり?(特にセキュアアプリの場合)
|
||||
// [TODO:]現在ブート不可タイトルについても入れるようにしているが
|
||||
// これで良いのか?
|
||||
OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST;
|
||||
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BUF;
|
||||
int l;
|
||||
u8 count = 0;
|
||||
|
||||
if( s_pTitleIDList == NULL )
|
||||
{
|
||||
OS_TPrintf("SYSMi_makeTitleIdList failed: SYSM_InitNandTitleList() is not called.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// とりあえずゼロクリア
|
||||
MI_CpuClear8( (void *)HW_OS_TITLE_ID_LIST, HW_OS_TITLE_ID_LIST_SIZE );
|
||||
|
||||
@ -1071,17 +1100,8 @@ static void SYSMi_makeTitleIdList( TitleProperty *pTitleList )
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
// ランチャーで作成したリストを使わないバージョン
|
||||
NAMTitleId *pTitleIDList = NULL;
|
||||
s32 getNum;
|
||||
|
||||
// インストールされているタイトルの取得
|
||||
getNum = NAM_GetNumTitles();
|
||||
pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * getNum ); // Free忘れず
|
||||
(void)NAM_GetTitleList( pTitleIDList, (u32)getNum );
|
||||
*/
|
||||
for(l=0;l<LAUNCHER_TITLE_LIST_NUM;l++)
|
||||
for(l=-1;l<s_listLength;l++) // -1はカードアプリの特別処理用
|
||||
{
|
||||
ROM_Header_Short e_hs;
|
||||
ROM_Header_Short *pe_hs;
|
||||
@ -1091,7 +1111,7 @@ static void SYSMi_makeTitleIdList( TitleProperty *pTitleList )
|
||||
FSFile file[1];
|
||||
BOOL bSuccess;
|
||||
s32 readLen;
|
||||
if(l==0)
|
||||
if(l==-1)
|
||||
{
|
||||
// カードアプリ
|
||||
if(SYSM_IsExistCard())
|
||||
@ -1100,12 +1120,12 @@ static void SYSMi_makeTitleIdList( TitleProperty *pTitleList )
|
||||
}
|
||||
}else
|
||||
{
|
||||
if(pTitleList[l].titleID == NULL)
|
||||
if(s_pTitleIDList[l] == NULL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// romヘッダ読み込み
|
||||
NAM_GetTitleBootContentPathFast(path, pTitleList[l].titleID);
|
||||
NAM_GetTitleBootContentPathFast(path, s_pTitleIDList[l]);
|
||||
FS_InitFile( file );
|
||||
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
|
||||
if( ! bSuccess )
|
||||
|
||||
@ -145,6 +145,9 @@ void TwlMain( void )
|
||||
{
|
||||
deleteTmp();
|
||||
}
|
||||
|
||||
// NANDタイトルリストの準備
|
||||
SYSM_InitNandTitleList();
|
||||
|
||||
// 「ダイレクトブートでない」なら
|
||||
if( !pBootTitle ) {
|
||||
@ -289,7 +292,7 @@ void TwlMain( void )
|
||||
// FATALエラー処理
|
||||
}
|
||||
|
||||
switch ( SYSM_TryToBootTitle( pBootTitle, s_titleList ) ) { // アプリ認証結果取得orブート 成功時:never return
|
||||
switch ( SYSM_TryToBootTitle( pBootTitle ) ) { // アプリ認証結果取得orブート 成功時:never return
|
||||
case AUTH_RESULT_TITLE_LOAD_FAILED:
|
||||
case AUTH_RESULT_TITLE_POINTER_ERROR:
|
||||
case AUTH_RESULT_AUTHENTICATE_FAILED:
|
||||
|
||||
@ -92,6 +92,8 @@ extern TitleProperty *SYSM_ReadParameters( void ); //
|
||||
|
||||
// アプリ情報取得
|
||||
extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ); // カードアプリタイトルリストの取得
|
||||
extern BOOL SYSM_InitNandTitleList( void ); // NANDアプリタイトルリスト取得準備
|
||||
extern void SYSM_FreeNandTitleList( void ); // NANDアプリタイトルリスト
|
||||
extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); // NAND アプリタイトルリストの取得
|
||||
|
||||
// アプリ起動
|
||||
@ -99,9 +101,7 @@ extern void SYSM_StartLoadTitle( TitleProperty *pBootTitle ); //
|
||||
extern BOOL SYSM_IsLoadTitleFinished( void ); // SYSM_StartLoadTitleで起動したスレッドが終了したかどうかを確認
|
||||
extern void SYSM_StartAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを別スレッドで検証開始
|
||||
extern BOOL SYSM_IsAuthenticateTitleFinished( void ); // SYSM_StartAuthenticateTitleで起動したスレッドが終了したかどうかを確認
|
||||
extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle, TitleProperty *pTitleList );
|
||||
// pBootTitleで指定したタイトルをブート
|
||||
// 成功時は、never return.
|
||||
extern AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ); // pBootTitleで指定したタイトルをブート。成功時は、never return.
|
||||
extern void SYSM_StartDecryptAESRegion( ROM_Header_Short *hs ); // 起動するROMのAES暗号化領域のデクリプト開始
|
||||
|
||||
// デバイス制御
|
||||
|
||||
Loading…
Reference in New Issue
Block a user