ESによってtmpフォルダがクリアされるので、暫定対応。

・SDK4397以降のlauncherParam.hヘッダが必要

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@759 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-02-28 04:47:34 +00:00
parent 3e2878f456
commit 914441f42d
4 changed files with 89 additions and 37 deletions

View File

@ -133,7 +133,7 @@ static void SYSMi_SetBootSRLPath( LauncherBootType bootType, NAMTitleId titleID
} }
break; break;
case LAUNCHER_BOOTTYPE_TEMP: case LAUNCHER_BOOTTYPE_TEMP:
STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", titleID ); STD_TSNPrintf( path, FS_ENTRY_LONGNAME_MAX, OS_TMP_APP_PATH, titleID );
break; break;
default: default:
path[ 0 ] = 0; path[ 0 ] = 0;

View File

@ -24,7 +24,8 @@
// define data----------------------------------------------------------------- // define data-----------------------------------------------------------------
#define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 ) #define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 )
#define SYSTEM_APP_KEY_OFFSET 1 // ファームから送られてくるキーのためのオフセット #define SYSTEM_APP_KEY_OFFSET 1 // ファームから送られてくるSYSTEMアプリキーのためのオフセット
#define LAUNCHER_KEY_OFFSET 0 // ファームから送られてくるLauncherキーのためのオフセット
#define ROM_HEADER_HASH_OFFSET (0x10) // 署名からROMヘッダハッシュを取り出すためのオフセット #define ROM_HEADER_HASH_OFFSET (0x10) // 署名からROMヘッダハッシュを取り出すためのオフセット
#define SIGN_HEAP_ADDR 0x023c0000 // 署名計算のためのヒープ領域開始アドレス #define SIGN_HEAP_ADDR 0x023c0000 // 署名計算のためのヒープ領域開始アドレス
@ -382,13 +383,14 @@ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
break; break;
case LAUNCHER_BOOTTYPE_TEMP: case LAUNCHER_BOOTTYPE_TEMP:
// tmpフォルダ // tmpフォルダ
STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", pBootTitle->titleID ); STD_TSNPrintf( path, 256, OS_TMP_APP_PATH, pBootTitle->titleID );
break; break;
default: default:
// unknown // unknown
return; return;
} }
FS_InitFile( file );
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess ) if( ! bSuccess )
@ -699,17 +701,39 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
prev = OS_GetTick(); prev = OS_GetTick();
prop = ((u16 *)&(pBootTitle->titleID))[2]; prop = ((u16 *)&(pBootTitle->titleID))[2];
prop = (u16)(prop & 0x1); // prop = 0:UserApp 1:SystemApp 2:ShopApp? prop = (u16)(prop & 0x3); // prop = 0:UserApp 1:SystemApp 2:ShopApp?
keynum = (u8)( prop == 0 ? 2 : (prop == 1 ? 0 : 1) );// keynum = 0:SystemApp 1:ShopApp 2:UserApp keynum = (u8)( prop == 0 ? 2 : (prop == 1 ? 0 : 1) );// keynum = 0:SystemApp 1:ShopApp 2:UserApp
// アプリ種別とボンディングオプションによって使う鍵を分ける // アプリ種別とボンディングオプションによって使う鍵を分ける
if( SCFG_GetBondingOption() == 0 ) { // #define LNC_PDTKEY_DBG
#ifdef LNC_PDTKEY_DBG
{
// 製品版鍵デバグ用コード
u8 *gamecode = (u8 *)&(pBootTitle->titleID);
// 製品版鍵取得 // 製品版鍵取得
key = ((OSFromFirm9Buf *)HW_FIRM_FROM_FIRM_BUF)->rsa_pubkey[SYSTEM_APP_KEY_OFFSET + keynum]; key = ((OSFromFirm9Buf *)HW_FIRM_FROM_FIRM_BUF)->rsa_pubkey[SYSTEM_APP_KEY_OFFSET + keynum];
b_dev = TRUE; // 開発版のスルーフラグ
// 製品版のLauncherは専用の鍵を使う。開発版は今のところSystemAppの鍵で代用
if( gamecode[3] == 'L' && gamecode[2] == 'N' && gamecode[1] == 'C' )
{
key = ((OSFromFirm9Buf *)HW_FIRM_FROM_FIRM_BUF)->rsa_pubkey[LAUNCHER_KEY_OFFSET];
}
}
#else
if( SCFG_GetBondingOption() == 0 ) {
u8 *gamecode = (u8 *)&(pBootTitle->titleID);
// 製品版鍵取得
key = ((OSFromFirm9Buf *)HW_FIRM_FROM_FIRM_BUF)->rsa_pubkey[SYSTEM_APP_KEY_OFFSET + keynum];
// 製品版のLauncherは専用の鍵を使う。開発版は今のところSystemAppの鍵で代用
if( gamecode[3] == 'L' && gamecode[2] == 'N' && gamecode[1] == 'C' )
{
key = ((OSFromFirm9Buf *)HW_FIRM_FROM_FIRM_BUF)->rsa_pubkey[LAUNCHER_KEY_OFFSET];
}
}else { }else {
// 開発版 // 開発版
key = g_devPubKey[keynum]; key = g_devPubKey[keynum];
b_dev = TRUE; b_dev = TRUE;
} }
#endif
// 署名を鍵で復号 // 署名を鍵で復号
MI_CpuClear8( buf, 0x80 ); MI_CpuClear8( buf, 0x80 );
SVC_InitSignHeap( &con, (void *)SIGN_HEAP_ADDR, SIGN_HEAP_SIZE );// ヒープの初期化 SVC_InitSignHeap( &con, (void *)SIGN_HEAP_ADDR, SIGN_HEAP_SIZE );// ヒープの初期化

View File

@ -741,13 +741,57 @@ static void DrawScrollBar( TitleProperty *pTitleList )
TitleProperty *LauncherMain( TitleProperty *pTitleList ) TitleProperty *LauncherMain( TitleProperty *pTitleList )
{ {
TitleProperty *ret = NULL; TitleProperty *ret = NULL;
//#define DBGLP
#ifdef DBGLP
typedef struct NandFirmResetParameter {
u8 isHotStart :1;
u8 isResetSW :1;
u8 rsv :5;
u8 isValid :1;
}NandFirmResetParameter;
{
static BOOL a=FALSE;
if( pad.cont & PAD_BUTTON_Y )
{
u8 *p = (u8 *)SYSMi_GetLauncherParamAddr();
int l;
if( a )
{
return ret;
}
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
for(l=0;l<16;l++)
PrintfSJIS( 0, l*12, TXT_COLOR_RED, "%.02x%.02x%.02x%.02x %.02x%.02x%.02x%.02x",
*(p+l*8), *(p+1+l*8), *(p+2+l*8), *(p+3+l*8), *(p+4+l*8), *(p+5+l*8), *(p+6+l*8), *(p+7+l*8) );
a=TRUE;
return ret;
}
if( a ){
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
a=FALSE;
}
}
PrintfSJIS( 1, 12, TXT_COLOR_RED,
"ValidLParam:%d\n", SYSMi_GetWork()->flags.common.isValidLauncherParam );
#define OSi_GetNandFirmResetParam() ( (NandFirmResetParameter *)HW_NAND_FIRM_HOTSTART_FLAG )
PrintfSJIS( 1, 24, TXT_COLOR_RED,
"HotStartFlag:%d\n", OSi_GetNandFirmResetParam()->isHotStart );
PrintfSJIS( 1, 36, TXT_COLOR_RED,
"ResetSWFlag:%d\n", OSi_GetNandFirmResetParam()->isResetSW );
PrintfSJIS( 1, 48, TXT_COLOR_RED,
"LParamCRC16:%.04x\n", SVC_GetCRC16( 65535, &SYSMi_GetLauncherParamAddr()->body, SYSMi_GetLauncherParamAddr()->header.bodyLength ) );
PrintfSJIS( 1, 60, TXT_COLOR_RED,
"NandFirmResetParam:%.01x\n", *(u8 *)(OSi_GetNandFirmResetParam()) );
PrintfSJIS( 1, 72, TXT_COLOR_RED,
"McuVersion:%d\n", SYSMi_GetMcuVersion() );
#endif
// キー及びタッチ制御 // キー及びタッチ制御
ret = ProcessPads( pTitleList ); ret = ProcessPads( pTitleList );
MoveByScrollBar(); MoveByScrollBar();
// 描画関係 // 描画関係
PollBackLightBrightness(); PollBackLightBrightness();
DrawScrollBar( pTitleList ); DrawScrollBar( pTitleList );

View File

@ -308,34 +308,18 @@ static void INTR_VBlank(void)
// nandのtmpディレクトリの中身を消す // nandのtmpディレクトリの中身を消す
static void deleteTmp() static void deleteTmp()
{ {
FSFile dir; if( FS_DeleteFile( OS_TMP_APP_PATH ) )
FSDirectoryEntryInfo info; {
FS_InitFile(&dir); OS_TPrintf( "deleteTmp: deleted File '%s' \n", OS_TMP_APP_PATH );
if(!FS_OpenDirectory(&dir, "nand:/tmp", FS_FILEMODE_R | FS_FILEMODE_W)) }else
{ {
OS_TPrintf( "ERROR deleteTmp: open nand:/tmp failed!\n" ); FSResult res = FS_GetArchiveResultCode("nand");
return; if( FS_RESULT_SUCCESS == res )
} {
while(FS_ReadDirectory(&dir, &info)) OS_TPrintf( "deleteTmp: File '%s' not exists.\n", OS_TMP_APP_PATH );
{ }else
if(info.attributes & FS_ATTRIBUTE_IS_DIRECTORY) {
{ OS_TPrintf( "deleteTmp: delete File '%s' failed. Error code = %d.\n", OS_TMP_APP_PATH, res );
//ディレクトリは今のところ削除しない }
}else }
{
//ファイルは今のところsrlのみ削除
char buf[512];
u32 end = info.longname_length;
if( (info.longname[end-1]=='l' || info.longname[end-1]=='L') &&
(info.longname[end-2]=='r' || info.longname[end-2]=='R') &&
(info.longname[end-3]=='s' || info.longname[end-3]=='S') &&
(info.longname[end-4]=='.') )
{
STD_TSNPrintf( buf, 512, "nand:/tmp/%s",info.longname);
FS_DeleteFile( buf );
OS_TPrintf( "deleteTmp: deleted File '%s' \n", buf );
}
}
}
FS_CloseDirectory(&dir);
} }