・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_InitShareData(void);
static BOOL NAMUTi_MountAndFormatOtherTitleSaveData(u64 titleID, const char *arcname);
@ -143,19 +143,19 @@ BOOL NAMUT_Format( void )
common, personalizedに関わらず全て消去するか
       personalizedのみ消去するかを引数で選択できます
Arguments: isForceEraseCommonETicket: TRUE common, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketを残す
Arguments: isForceEraseAllUserApp: TRUE common, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketのアプリを残す
isDeleteWifiSettings: WiFi設定を削除するかTRUEで削除
Returns: None
*---------------------------------------------------------------------------*/
BOOL NAMUT_FormatCore( BOOL isForceEraseCommonETicket, BOOL isDeleteWiFiSettings )
BOOL NAMUT_FormatCore( BOOL isForceEraseAllUserApp, BOOL isDeleteWiFiSettings )
{
int i;
BOOL ret = TRUE;
// プロテクトされていないタイトルの削除を行います
if (!NAMUTi_DeleteNonprotectedTitle( isForceEraseCommonETicket ))
if (!NAMUTi_DeleteNonprotectedTitle( isForceEraseAllUserApp ))
{
ret = FALSE;
OS_TWarning("Fail! NAMUTi_DeleteNonprotectedTitle()\n");
@ -377,12 +377,12 @@ BOOL NAMUT_DeleteNandTmpDirectory(void)
Description: User App
Arguments: isForceEraseCommonETicket : TRUEの時はcommon, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketを残す
Arguments: isForceEraseAllUserApp : TRUEの時はcommon, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketのアプリを残す
Returns: None
*---------------------------------------------------------------------------*/
static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseCommonETicket )
static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseAllUserApp )
{
char dirPath[NAM_PATH_LEN];
u32 title_num; // NAND にインストールされているアプリの数
@ -443,46 +443,56 @@ static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseCommonETicket )
for (i=0;i<title_num_all;i++)
{
// プロテクト対象以外であればtitleId_Hiディレクトリごと消去する
// プロテクト対象以外(ユーザーアプリ)の場合
if (!(pTitleIdArray[i] & PROTECT_TITLE_PROPERTY))
{
// nand:/title/titleID_Hi/ 以下を消去
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/title/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) );
if ( !FS_DeleteDirectoryAuto( dirPath ) )
{
result = FALSE;
}
// nand:/ticket/titleID_Hi/ 以下を消去
{
if( isForceEraseAllUserApp ) {
// 強制イレースの場合NandInitializerやSystemUpdaterが利用
// nand:/title/titleID_Hi/ 以下(ユーザーアプリフォルダ全部)を消去
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/title/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) );
if ( !FS_DeleteDirectoryAuto( dirPath ) )
{
result = FALSE;
}
// 強制 CommonETicket 消去フラグが有効な場合は、全ユーザーアプリチケットを消去
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/ticket/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) );
if ( !FS_DeleteDirectoryAuto( dirPath ) )
{
result = FALSE;
}
}else {
// 強制イレースでない場合(本体設定が利用)
ETicketType eTicketType = ETICKET_TYPE_PERSONALIZED; // default
if( isForceEraseCommonETicket ) {
// 強制 CommonETicket 消去フラグが有効な場合は、全チケットを消去
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/ticket/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) );
if ( !FS_DeleteDirectoryAuto( dirPath ) )
{
result = FALSE;
}
}else {
// そうでない場合は、CommonETicket 以外のタイトルの eTicket のみ消去
if( GetETicketType( pTitleIdArray[i], &eTicketType ) == NAM_OK )
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",
NAM_GetTitleIdHi(pTitleIdArray[i]),
NAM_GetTitleIdLo(pTitleIdArray[i]) );
if ( !FS_DeleteFile( dirPath ) &&
FS_GetArchiveResultCode( dirPath ) != FS_RESULT_ALREADY_DONE )
{
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/ticket/%08x/%08x.tik",
NAM_GetTitleIdHi(pTitleIdArray[i]),
NAM_GetTitleIdLo(pTitleIdArray[i]) );
if ( !FS_DeleteFile( dirPath ) &&
FS_GetArchiveResultCode( dirPath ) != FS_RESULT_ALREADY_DONE )
{
result = FALSE;
}
}
}
else
{
result = FALSE;
result = FALSE;
}
}
}
}
@ -1182,10 +1192,14 @@ static s32 GetETicketType(NAMTitleId titleId, ETicketType *pETicketType )
{
if( numTicket > 0 )
{
// 先頭 eTicket の deviceId が 0x00000000 なら、common eTicket と判断。
// ※全ての eTicket を舐める必要はない?
if( ptv->deviceId == 0x00000000 ) {
*pETicketType = ETICKET_TYPE_COMMON;
int i;
// eTicket は、そのままもしくは追加しかありえないので、プリインストールされたアプリでは、必ずCommon eTikcetが存在する。
// よって、全ての eTicket のうち、ひとつでも deviceId が 0x00000000 なら、common eTicket と判断。
for( i = 0; i < numTicket; i++ )
{
if( ptv[i].deviceId == 0x00000000 ) {
*pETicketType = ETICKET_TYPE_COMMON;
}
}
}
NAMUT_Free(ptv);
@ -1245,3 +1259,86 @@ static s32 GetTicketViews(ESTicketView** pptv, u32* pNumTicket, NAMTitleId title
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) );
}
(void) NAMUT_PrintInstalledTitleETicketType();
// ::::::::::::::::::::::::::::::::::::::::::::::
// TWL設定データファイルの読み込み
// ::::::::::::::::::::::::::::::::::::::::::::::

Binary file not shown.

View File

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