・NAMUT_Format関数の仕様変更。

Common eTikcetのユーザーアプリは、アプリ本体も残すようにする。
・GetETicketTypeのcommon eTicket判定を変更。
・テスト用関数NAMUT_PrintInstalledTitleETicketTypeの追加。
・TWLランチャー.mmapに上記変更を反映。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2825 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2009-05-28 07:40:17 +00:00
parent 907660fded
commit 50b98f97b7
4 changed files with 147 additions and 46 deletions

View File

@ -85,7 +85,7 @@ static u32 sNCFGAddr;
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseCommonETicket ); static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseAllUserApp );
static BOOL NAMUTi_ClearSavedataAll(void); static BOOL NAMUTi_ClearSavedataAll(void);
static BOOL NAMUTi_InitShareData(void); static BOOL NAMUTi_InitShareData(void);
static BOOL NAMUTi_MountAndFormatOtherTitleSaveData(u64 titleID, const char *arcname); static BOOL NAMUTi_MountAndFormatOtherTitleSaveData(u64 titleID, const char *arcname);
@ -143,19 +143,19 @@ BOOL NAMUT_Format( void )
common, personalizedに関わらず全て消去するか common, personalizedに関わらず全て消去するか
       personalizedのみ消去するかを引数で選択できます        personalizedのみ消去するかを引数で選択できます
Arguments: isForceEraseCommonETicket: TRUE common, personalizedに関わらずユーザーアプリを全消去 Arguments: isForceEraseAllUserApp: TRUE common, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketを残す FALSEの時はcommonETicketのアプリを残す
isDeleteWifiSettings: WiFi設定を削除するかTRUEで削除 isDeleteWifiSettings: WiFi設定を削除するかTRUEで削除
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
BOOL NAMUT_FormatCore( BOOL isForceEraseCommonETicket, BOOL isDeleteWiFiSettings ) BOOL NAMUT_FormatCore( BOOL isForceEraseAllUserApp, BOOL isDeleteWiFiSettings )
{ {
int i; int i;
BOOL ret = TRUE; BOOL ret = TRUE;
// プロテクトされていないタイトルの削除を行います // プロテクトされていないタイトルの削除を行います
if (!NAMUTi_DeleteNonprotectedTitle( isForceEraseCommonETicket )) if (!NAMUTi_DeleteNonprotectedTitle( isForceEraseAllUserApp ))
{ {
ret = FALSE; ret = FALSE;
OS_TWarning("Fail! NAMUTi_DeleteNonprotectedTitle()\n"); OS_TWarning("Fail! NAMUTi_DeleteNonprotectedTitle()\n");
@ -377,12 +377,12 @@ BOOL NAMUT_DeleteNandTmpDirectory(void)
Description: User App Description: User App
Arguments: isForceEraseCommonETicket : TRUEの時はcommon, personalizedに関わらずユーザーアプリを全消去 Arguments: isForceEraseAllUserApp : TRUEの時はcommon, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketを残す FALSEの時はcommonETicketのアプリを残す
Returns: None Returns: None
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseCommonETicket ) static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseAllUserApp )
{ {
char dirPath[NAM_PATH_LEN]; char dirPath[NAM_PATH_LEN];
u32 title_num; // NAND にインストールされているアプリの数 u32 title_num; // NAND にインストールされているアプリの数
@ -443,33 +443,48 @@ static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseCommonETicket )
for (i=0;i<title_num_all;i++) for (i=0;i<title_num_all;i++)
{ {
// プロテクト対象以外であればtitleId_Hiディレクトリごと消去する // プロテクト対象以外(ユーザーアプリ)の場合
if (!(pTitleIdArray[i] & PROTECT_TITLE_PROPERTY)) if (!(pTitleIdArray[i] & PROTECT_TITLE_PROPERTY))
{ {
// nand:/title/titleID_Hi/ 以下を消去 if( isForceEraseAllUserApp ) {
// 強制イレースの場合NandInitializerやSystemUpdaterが利用
// nand:/title/titleID_Hi/ 以下(ユーザーアプリフォルダ全部)を消去
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/title/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) ); STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/title/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) );
if ( !FS_DeleteDirectoryAuto( dirPath ) ) if ( !FS_DeleteDirectoryAuto( dirPath ) )
{ {
result = FALSE; result = FALSE;
} }
// nand:/ticket/titleID_Hi/ 以下を消去 // 強制 CommonETicket 消去フラグが有効な場合は、全ユーザーアプリチケットを消去
{
ETicketType eTicketType = ETICKET_TYPE_PERSONALIZED; // default
if( isForceEraseCommonETicket ) {
// 強制 CommonETicket 消去フラグが有効な場合は、全チケットを消去
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/ticket/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) ); STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/ticket/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) );
if ( !FS_DeleteDirectoryAuto( dirPath ) ) if ( !FS_DeleteDirectoryAuto( dirPath ) )
{ {
result = FALSE; result = FALSE;
} }
}else { }else {
// そうでない場合は、CommonETicket 以外のタイトルの eTicket のみ消去 // 強制イレースでない場合(本体設定が利用)
if( GetETicketType( pTitleIdArray[i], &eTicketType ) == NAM_OK )
ETicketType eTicketType = ETICKET_TYPE_PERSONALIZED; // default
if( GetETicketType( pTitleIdArray[i], &eTicketType ) != NAM_OK )
{
result = FALSE;
}
else
{ {
if( eTicketType != ETICKET_TYPE_COMMON ) if( eTicketType != ETICKET_TYPE_COMMON )
{ {
// nand:/title/[titleID_Hi]/[titleID_Lo] 以下(対象ユーザーアプリのみ)を消去
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/title/%08x/%08x",
NAM_GetTitleIdHi(pTitleIdArray[i]),
NAM_GetTitleIdLo(pTitleIdArray[i]) );
if ( !FS_DeleteDirectoryAuto( dirPath ) )
{
result = FALSE;
}
// nand:/ticket/[titleid_Hi]/[titleID_Lo].tikファイル対象ユーザーアプリのみを削除
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/ticket/%08x/%08x.tik", STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/ticket/%08x/%08x.tik",
NAM_GetTitleIdHi(pTitleIdArray[i]), NAM_GetTitleIdHi(pTitleIdArray[i]),
NAM_GetTitleIdLo(pTitleIdArray[i]) ); NAM_GetTitleIdLo(pTitleIdArray[i]) );
@ -480,11 +495,6 @@ static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseCommonETicket )
} }
} }
} }
else
{
result = FALSE;
}
}
} }
} }
} }
@ -1182,12 +1192,16 @@ static s32 GetETicketType(NAMTitleId titleId, ETicketType *pETicketType )
{ {
if( numTicket > 0 ) if( numTicket > 0 )
{ {
// 先頭 eTicket の deviceId が 0x00000000 なら、common eTicket と判断。 int i;
// ※全ての eTicket を舐める必要はない? // eTicket は、そのままもしくは追加しかありえないので、プリインストールされたアプリでは、必ずCommon eTikcetが存在する。
if( ptv->deviceId == 0x00000000 ) { // よって、全ての eTicket のうち、ひとつでも deviceId が 0x00000000 なら、common eTicket と判断。
for( i = 0; i < numTicket; i++ )
{
if( ptv[i].deviceId == 0x00000000 ) {
*pETicketType = ETICKET_TYPE_COMMON; *pETicketType = ETICKET_TYPE_COMMON;
} }
} }
}
NAMUT_Free(ptv); NAMUT_Free(ptv);
} }
return result; return result;
@ -1245,3 +1259,86 @@ static s32 GetTicketViews(ESTicketView** pptv, u32* pNumTicket, NAMTitleId title
return result; return result;
} }
// インストールされているタイトルのeTikcetタイプを出力
BOOL NAMUT_PrintInstalledTitleETicketType( void )
{
u32 title_num; // NAND にインストールされているアプリの数
u32 title_num_installed; // NANDにインストールされたことがあるアプリの数
u32 title_num_all; // 上2つをマージしたアプリの数
NAMTitleId* pTitleIdArray;
NAMTitleId* pTitleIdArrayInstalled;
s32 result = TRUE;
s32 i,j;
// タイトル数取得
title_num = (u32)NAM_GetNumTitles();
title_num_installed = (u32)NAM_GetNumInstalledTitles();
// タイトルID配列用メモリ確保
pTitleIdArray = NAMUT_Alloc(sizeof(NAMTitleId)*(title_num + title_num_installed));
pTitleIdArrayInstalled = NAMUT_Alloc(sizeof(NAMTitleId)*title_num_installed);
if (pTitleIdArray == NULL || pTitleIdArrayInstalled == NULL)
{
OS_TWarning("Allocation failed in %s\n", __func__);
NAMUT_Free(pTitleIdArray);
NAMUT_Free(pTitleIdArrayInstalled);
return FALSE;
}
// タイトルリスト取得
if (NAM_GetTitleList(pTitleIdArray, title_num) != NAM_OK ||
NAM_GetInstalledTitleList(pTitleIdArrayInstalled, title_num_installed) != NAM_OK)
{
OS_TWarning("Fail! NAM_Get*TitleList() in %s\n", __func__);
NAMUT_Free(pTitleIdArray);
NAMUT_Free(pTitleIdArrayInstalled);
return FALSE;
}
// NAM_GetTitleListでは削除されているがeTicketのみ存在するタイトルがリストアップされず
// NAM_GetInstalledTitleListではSRLはあるがeTicketがないタイトルがリストアップされない。
// そのため両者をマージする
title_num_all = title_num;
for (i=0;i<title_num_installed;i++)
{
BOOL find = FALSE;
for (j=0;j<title_num;j++)
{
if (pTitleIdArrayInstalled[i] == pTitleIdArray[j])
{
find = TRUE;
break;
}
}
if (find == FALSE)
{
pTitleIdArray[title_num_all] = pTitleIdArrayInstalled[i];
title_num_all++;
}
}
for (i=0;i<title_num_all;i++)
{
ETicketType eTicketType = ETICKET_TYPE_PERSONALIZED; // default
if( GetETicketType( pTitleIdArray[i], &eTicketType ) != NAM_OK )
{
result = FALSE;
}
else
{
u32 titleID_Lo = NAM_GetTitleIdLo( pTitleIdArray[i] );
u8 *p = (u8 *)&titleID_Lo;
OS_TPrintf( "%c%c%c%c : %llx : %s\n",
*p++, *p++, *p++, *p++,
pTitleIdArray[i], eTicketType == ETICKET_TYPE_COMMON ? "Common":"Personalized" );
}
}
NAMUT_Free(pTitleIdArray);
NAMUT_Free(pTitleIdArrayInstalled);
return result;
}

View File

@ -92,6 +92,8 @@ void TwlMain(void)
OS_TPrintf( "LCFGTWLSettingsData : 0x%04x\n", sizeof(LCFGTWLSettingsData) ); OS_TPrintf( "LCFGTWLSettingsData : 0x%04x\n", sizeof(LCFGTWLSettingsData) );
} }
(void) NAMUT_PrintInstalledTitleETicketType();
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルの読み込み // TWL設定データファイルの読み込み
// :::::::::::::::::::::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::

Binary file not shown.

View File

@ -165,6 +165,8 @@ BOOL NAMUT_DeleteNandTmpDirectory(void);
BOOL NAMUT_ClearTWLSettings( BOOL doWriteback ); BOOL NAMUT_ClearTWLSettings( BOOL doWriteback );
BOOL NAMUT_PrintInstalledTitleETicketType( void );
#endif // SDK_ARM9 #endif // SDK_ARM9
#ifdef __cplusplus #ifdef __cplusplus