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;
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;
default:
path[ 0 ] = 0;

View File

@ -24,7 +24,8 @@
// define data-----------------------------------------------------------------
#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 SIGN_HEAP_ADDR 0x023c0000 // 署名計算のためのヒープ領域開始アドレス
@ -382,13 +383,14 @@ static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle )
break;
case LAUNCHER_BOOTTYPE_TEMP:
// tmpフォルダ
STD_TSNPrintf( path, 31, "nand:/tmp/%.16llx.srl", pBootTitle->titleID );
STD_TSNPrintf( path, 256, OS_TMP_APP_PATH, pBootTitle->titleID );
break;
default:
// unknown
return;
}
FS_InitFile( file );
bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R);
if( ! bSuccess )
@ -699,17 +701,39 @@ static AuthResult SYSMi_AuthenticateTWLHeader( TitleProperty *pBootTitle )
prev = OS_GetTick();
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
// アプリ種別とボンディングオプションによって使う鍵を分ける
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];
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 {
// 開発版
key = g_devPubKey[keynum];
b_dev = TRUE;
}
#endif
// 署名を鍵で復号
MI_CpuClear8( buf, 0x80 );
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 *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 );
MoveByScrollBar();
// 描画関係
PollBackLightBrightness();
DrawScrollBar( pTitleList );

View File

@ -308,34 +308,18 @@ static void INTR_VBlank(void)
// nandのtmpディレクトリの中身を消す
static void deleteTmp()
{
FSFile dir;
FSDirectoryEntryInfo info;
FS_InitFile(&dir);
if(!FS_OpenDirectory(&dir, "nand:/tmp", FS_FILEMODE_R | FS_FILEMODE_W))
{
OS_TPrintf( "ERROR deleteTmp: open nand:/tmp failed!\n" );
return;
}
while(FS_ReadDirectory(&dir, &info))
{
if(info.attributes & FS_ATTRIBUTE_IS_DIRECTORY)
{
//ディレクトリは今のところ削除しない
}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);
if( FS_DeleteFile( OS_TMP_APP_PATH ) )
{
OS_TPrintf( "deleteTmp: deleted File '%s' \n", OS_TMP_APP_PATH );
}else
{
FSResult res = FS_GetArchiveResultCode("nand");
if( FS_RESULT_SUCCESS == res )
{
OS_TPrintf( "deleteTmp: File '%s' not exists.\n", OS_TMP_APP_PATH );
}else
{
OS_TPrintf( "deleteTmp: delete File '%s' failed. Error code = %d.\n", OS_TMP_APP_PATH, res );
}
}
}