本体設定の本体初期化で使用するために、NAMUT_Formatを下記のように拡張し、NAMUT_FormatCoreとする。

・Common eTicketのユーザーアプリのeTicketを消去しないよう選択できる
 ・WiFi設定を消去しないよう選択できる

既存のNAMUT_Formatは、NandInitializerやSystemUpdater用として、挙動が変わらないよう上記NAMUT_Format
をラップした関数とする。

TWLランチャー.mmapの本体初期化部分に上記変更を反映。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2824 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2009-05-27 05:45:11 +00:00
parent e0fefd4684
commit 907660fded
5 changed files with 190 additions and 20 deletions

View File

@ -12,8 +12,8 @@
# in whole or in part, without the prior written consent of Nintendo.
#
# $Date:: $
# $Rev:$
# $Author:$
# $Rev$
# $Author$
#----------------------------------------------------------------------------
#----------------------------------------------------------------------------
@ -27,11 +27,15 @@ TWL_PROC = ARM9
INCDIR = include
# es のヘッダを参照します。
LINCLUDES += $(ES_ROOT)/twl/include
SRCS = namut.c
TARGET_LIB = libnamut$(TWL_LIBSUFFIX).a
include $(TWLSDK_ROOT)/add-ins/es/commondefs.es
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
INSTALL_TARGETS = $(TARGETS)
@ -46,7 +50,7 @@ CCFLAGS += -DSMALL_CODE_SIZE \
-DNO_STDIO_H \
-DNO_STDLIB_H
do-build: $(TARGETS)
do-build: $(TARGETS)
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules

View File

@ -21,6 +21,8 @@
#include <twl/fatfs.h>
#include <twl/os/common/format_rom.h>
#include <twl/nam.h>
#include <es.h>
#include <estypes.h>
#include <twl/aes.h>
#include <twl/os/common/banner.h>
#include <sysmenu/namut.h>
@ -32,6 +34,12 @@
*---------------------------------------------------------------------------*/
// eTicketType
typedef enum ETicketType {
ETICKET_TYPE_COMMON = 0,
ETICKET_TYPE_PERSONALIZED = 1
}ETicketType;
// 本体初期化(NAND初期化)で消去しないタイトルを
// TitleProperty (TitleID 32bitのビットで指定します。
// どれか1つでもビットが立っていれば消去の対象から外します。
@ -77,7 +85,7 @@ static u32 sNCFGAddr;
*---------------------------------------------------------------------------*/
static BOOL NAMUTi_DeleteNonprotectedTitle(void);
static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseCommonETicket );
static BOOL NAMUTi_ClearSavedataAll(void);
static BOOL NAMUTi_InitShareData(void);
static BOOL NAMUTi_MountAndFormatOtherTitleSaveData(u64 titleID, const char *arcname);
@ -87,6 +95,8 @@ static BOOL NAMUTi_ClearWiFiSettings( void );
static BOOL NAMUTi_DeleteShopAccount( void );
static void* NAMUT_Alloc(u32 size);
static void NAMUT_Free(void* buffer);
static s32 GetETicketType(NAMTitleId titleId, ETicketType *pETicketType );
static s32 GetTicketViews(ESTicketView** pptv, u32* pNumTicket, NAMTitleId titleId);
/*---------------------------------------------------------------------------*
Name: NAMUT_Init
@ -113,19 +123,39 @@ void NAMUT_Init(NAMUTAlloc allocFunc, NAMUTFree freeFunc)
Name: NAMUT_Format
Description: (NAND初期化)
common, personalizedに関わらず全て消去します
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
BOOL NAMUT_Format(void)
BOOL NAMUT_Format( void )
{
return NAMUT_FormatCore( TRUE, TRUE );
}
/*---------------------------------------------------------------------------*
Name: NAMUT_FormatCore
Description: (NAND初期化)
common, personalizedに関わらず全て消去するか
       personalizedのみ消去するかを引数で選択できます
Arguments: isForceEraseCommonETicket: TRUE common, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketを残す
isDeleteWifiSettings: WiFi設定を削除するかTRUEで削除
Returns: None
*---------------------------------------------------------------------------*/
BOOL NAMUT_FormatCore( BOOL isForceEraseCommonETicket, BOOL isDeleteWiFiSettings )
{
int i;
BOOL ret = TRUE;
// プロテクトされていないタイトルの削除を行います
if (!NAMUTi_DeleteNonprotectedTitle())
if (!NAMUTi_DeleteNonprotectedTitle( isForceEraseCommonETicket ))
{
ret = FALSE;
OS_TWarning("Fail! NAMUTi_DeleteNonprotectedTitle()\n");
@ -172,14 +202,15 @@ BOOL NAMUT_Format(void)
OS_TWarning("NAMUT_DeleteNandDirectory(%s)\n", sDeleteDirectoryList[i]);
}
}
// WiFi設定データをクリアします
if (!NAMUTi_ClearWiFiSettings())
// WiFi設定データをクリアします
if (isDeleteWiFiSettings &&
!NAMUTi_ClearWiFiSettings())
{
ret = FALSE;
OS_TWarning("Fail! NAMUTi_ClearWiFiSettings()\n");
}
// 本体設定データのクリア
if (!NAMUT_ClearTWLSettings( TRUE ))
{
@ -346,11 +377,12 @@ BOOL NAMUT_DeleteNandTmpDirectory(void)
Description: User App
Arguments: None
Arguments: isForceEraseCommonETicket : TRUEの時はcommon, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketを残す
Returns: None
*---------------------------------------------------------------------------*/
static BOOL NAMUTi_DeleteNonprotectedTitle(void)
static BOOL NAMUTi_DeleteNonprotectedTitle( BOOL isForceEraseCommonETicket )
{
char dirPath[NAM_PATH_LEN];
u32 title_num; // NAND にインストールされているアプリの数
@ -420,12 +452,40 @@ static BOOL NAMUTi_DeleteNonprotectedTitle(void)
{
result = FALSE;
}
// nand:/ticket/titleID_Hi/ 以下を消去
STD_TSNPrintf(dirPath, NAM_PATH_LEN, "nand:/ticket/%08x", NAM_GetTitleIdHi(pTitleIdArray[i]) );
if ( !FS_DeleteDirectoryAuto( dirPath ) )
{
result = FALSE;
}
// nand:/ticket/titleID_Hi/ 以下を消去
{
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( eTicketType != ETICKET_TYPE_COMMON )
{
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;
}
}
}
}
}
@ -1094,3 +1154,94 @@ static void NAMUT_Free(void* buffer)
spFreeFunc(buffer);
}
}
/*---------------------------------------------------------------------------*
Name: GetETicketType
Description: titleID eTicket
Arguments: titleID: common eTicket 調 titleID
pETicketType : ESETicketTypeポインタ
Returns: NAM_OK :
:
*---------------------------------------------------------------------------*/
static s32 GetETicketType(NAMTitleId titleId, ETicketType *pETicketType )
{
s32 result;
ESTicketView* ptv;
u32 numTicket;
*pETicketType = ETICKET_TYPE_PERSONALIZED;
result = GetTicketViews(&ptv, &numTicket, titleId);
if( result == NAM_OK )
{
if( numTicket > 0 )
{
// 先頭 eTicket の deviceId が 0x00000000 なら、common eTicket と判断。
// ※全ての eTicket を舐める必要はない?
if( ptv->deviceId == 0x00000000 ) {
*pETicketType = ETICKET_TYPE_COMMON;
}
}
NAMUT_Free(ptv);
}
return result;
}
/*---------------------------------------------------------------------------*
Name: GetTicketViews
Description: eTicket
        nam_title.c GetTicketViews
Arguments: pptv : eTicket
pNumTicket : eTicket
titleID : eTicket titleID
Returns: NAM_OK :
:
*---------------------------------------------------------------------------*/
static s32 GetTicketViews(ESTicketView** pptv, u32* pNumTicket, NAMTitleId titleId)
{
s32 result;
u32 numTicket;
ESTicketView* ptv = NULL;
result = ES_GetTicketViews(titleId, NULL, &numTicket);
// PRINT_RESULT(result);
if( result != ES_ERR_OK )
{
return result;
}
if( numTicket != 0 )
{
ptv = NAMUT_Alloc(sizeof(ESTicketView) * numTicket);
if( ptv == NULL )
{
return NAM_NO_MEMORY;
}
result = ES_GetTicketViews(titleId, ptv, &numTicket);
// PRINT_RESULT(result);
}
if( result == ES_ERR_OK )
{
*pptv = ptv;
*pNumTicket = numTicket;
}
else
{
NAMUT_Free(ptv);
}
return result;
}

View File

@ -282,7 +282,7 @@ int CleanupMachineMain( void )
case MS_FORMATMACHINE_PROCESSING:
// 選択を受け付けない
if( !NAMUT_Format() ) // <20>‰Šú‰»ŽÀ<C5BD>s
if( !NAMUT_FormatCore(FALSE,TRUE) ) // <20>‰Šú‰»ŽÀ<C5BD>s
{
sState = MS_FORMATMACHINE_ERROR;
}

Binary file not shown.

View File

@ -51,6 +51,21 @@ void NAMUT_Init(NAMUTAlloc allocFunc, NAMUTFree freeFunc);
*---------------------------------------------------------------------------*/
BOOL NAMUT_Format(void);
/*---------------------------------------------------------------------------*
Name: NAMUT_FormatCore
Description: (NAND初期化)
common, personalizedに関わらず全て消去するか
       personalizedのみ消去するかを引数で選択できます
Arguments: isForceEraseCommonETicket: TRUE common, personalizedに関わらずユーザーアプリを全消去
FALSEの時はcommonETicketを残す
isDeleteWifiSettings: WiFi設定を削除するかTRUEで削除
Returns: None
*---------------------------------------------------------------------------*/
BOOL NAMUT_FormatCore( BOOL isForceEraseCommonETicket, BOOL isDeleteWiFiSettings );
/*---------------------------------------------------------------------------*
Name: NAMUT_GetSoftBoxCount