From 29341dc9ddd67d10994fc183f601145e1cc4b078 Mon Sep 17 00:00:00 2001 From: kamikawa Date: Fri, 18 Apr 2008 05:51:26 +0000 Subject: [PATCH] =?UTF-8?q?IS=E3=83=87=E3=83=90=E3=83=83=E3=82=AC=E3=82=BF?= =?UTF-8?q?=E3=82=B9=E3=82=AF=E3=81=AE=EF=BC=AE=EF=BC=A1=EF=BC=AE=EF=BC=A4?= =?UTF-8?q?=E3=82=A2=E3=83=97=E3=83=AA=E3=83=87=E3=83=90=E3=83=83=E3=82=B0?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=81=AE=E4=BB=95=E6=A7=98=E3=82=92=E5=86=8D?= =?UTF-8?q?=E3=81=B3=E8=AA=BF=E6=95=B4=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=80=82=20ImportJump=E3=82=92=E3=81=9D=E3=81=AE=E4=BB=95?= =?UTF-8?q?=E6=A7=98=E3=81=AB=E5=90=88=E3=82=8F=E3=81=9B=E3=81=A6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1184 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../ImportJump/ARM9.TWL/include/ImportJump.h | 1 - .../ImportJump/ARM9.TWL/include/import.h | 2 +- .../ImportJump/ARM9.TWL/src/import.c | 125 +++++++++++++----- .../ImportJump/ARM9.TWL/src/main.c | 6 +- docs/ISデバッガ/ISデバッガタスク.vsd | Bin 123904 -> 122880 bytes 5 files changed, 94 insertions(+), 40 deletions(-) diff --git a/build/systemMenu_RED/ImportJump/ARM9.TWL/include/ImportJump.h b/build/systemMenu_RED/ImportJump/ARM9.TWL/include/ImportJump.h index f16082ae..df6e3964 100644 --- a/build/systemMenu_RED/ImportJump/ARM9.TWL/include/ImportJump.h +++ b/build/systemMenu_RED/ImportJump/ARM9.TWL/include/ImportJump.h @@ -38,7 +38,6 @@ typedef struct _ImportJumpSetting u32 clearSaveBannerFile:1; // Z[uoi[t@CNAiftHgOFFj u32 importTad:1; // pXŎw肳ꂽTADt@CC|[g邩iTAD̍XVLɈˑj u32 rsv :28; // \ - u64 bootTitleID; // ^CgID u32 tadRomOffset; // TAD[hG~[VROMItZbg u32 tadLength; // TADt@C̒ } ImportJump; diff --git a/build/systemMenu_RED/ImportJump/ARM9.TWL/include/import.h b/build/systemMenu_RED/ImportJump/ARM9.TWL/include/import.h index cf44b1bf..8d1f599d 100644 --- a/build/systemMenu_RED/ImportJump/ARM9.TWL/include/import.h +++ b/build/systemMenu_RED/ImportJump/ARM9.TWL/include/import.h @@ -34,7 +34,7 @@ extern "C" { ֐` *---------------------------------------------------------------------------*/ -BOOL kamiImportTad(void); +BOOL kamiImportTad(NAMTitleId* pTitleID); /*===========================================================================*/ diff --git a/build/systemMenu_RED/ImportJump/ARM9.TWL/src/import.c b/build/systemMenu_RED/ImportJump/ARM9.TWL/src/import.c index 999f96c2..41660b81 100644 --- a/build/systemMenu_RED/ImportJump/ARM9.TWL/src/import.c +++ b/build/systemMenu_RED/ImportJump/ARM9.TWL/src/import.c @@ -69,23 +69,16 @@ static void UpdateNandBoxCount( void ); Returns: None. *---------------------------------------------------------------------------*/ -BOOL kamiImportTad(void) +BOOL kamiImportTad(NAMTitleId* pTitleID) { NAMTadInfo tadInfo; - NAMTitleInfo titleInfo; + NAMTitleInfo titleInfoTmp; OSThread thread; s32 nam_result; FSFile file; - - // TADt@CXVĂȂ߃C|[gXLbv - if (GetImportJumpSetting()->importTad == 0) - { - // NandInitializerɂďÔ\̂ŊmF - if (NAM_ReadTitleInfo(&titleInfo, GetImportJumpSetting()->bootTitleID) == NAM_OK) - { - return TRUE; - } - } + char savePublicPath[FS_ENTRY_LONGNAME_MAX]; + char savePrivatePath[FS_ENTRY_LONGNAME_MAX]; + char subBannerPath[FS_ENTRY_LONGNAME_MAX]; // t@C FS_InitFile(&file); @@ -104,6 +97,9 @@ BOOL kamiImportTad(void) return FALSE; } + // titleIDۑĂ + *pTitleID = tadInfo.titleInfo.titleId; + // Data Only Ȃ玸s if (tadInfo.titleInfo.titleId & TITLE_ID_DATA_ONLY_FLAG_MASK) { @@ -119,34 +115,91 @@ BOOL kamiImportTad(void) return FALSE; } - // C|[gJntO𗧂Ă - sNowImport = TRUE; - - // iXbh쐬 - spStack = OS_Alloc(THREAD_STACK_SIZE); - MI_CpuClear8(spStack, THREAD_STACK_SIZE); - OS_CreateThread(&thread, ProgressThread, NULL, - (void*)((u32)spStack + THREAD_STACK_SIZE), THREAD_STACK_SIZE, OS_GetCurrentThread()->priority - 1); - OS_SetThreadDestructor( &thread, Destructor ); - OS_WakeupThreadDirect(&thread); - - // ImportJn - nam_result = NAM_ImportTadWithFile( &file ); - - // iXbh̎͏I҂ - while (sNowImport){}; - - if ( nam_result == NAM_OK ) + // TADt@CXVĂꍇɌC|[gs + // NandInitializerɂďÔ\̂ŊmF + if (GetImportJumpSetting()->importTad == 1 || NAM_ReadTitleInfo(&titleInfoTmp, tadInfo.titleInfo.titleId) != NAM_OK) { - // InstalledSoftBoxCount, FreeSoftBoxCount ̒l݂NAND̏Ԃɍ킹čXV܂B - UpdateNandBoxCount(); - return TRUE; + // C|[gJntO𗧂Ă + sNowImport = TRUE; + + // iXbh쐬 + spStack = OS_Alloc(THREAD_STACK_SIZE); + MI_CpuClear8(spStack, THREAD_STACK_SIZE); + OS_CreateThread(&thread, ProgressThread, NULL, + (void*)((u32)spStack + THREAD_STACK_SIZE), THREAD_STACK_SIZE, OS_GetCurrentThread()->priority - 1); + OS_SetThreadDestructor( &thread, Destructor ); + OS_WakeupThreadDirect(&thread); + + // ImportJn + nam_result = NAM_ImportTadWithFile( &file ); + + // iXbh̎͏I҂ + while (sNowImport){}; + + if ( nam_result == NAM_OK ) + { + // InstalledSoftBoxCount, FreeSoftBoxCount ̒l݂NAND̏Ԃɍ킹čXV܂B + UpdateNandBoxCount(); + } + else + { + OS_Warning(" Fail! : NAM Result Code = 0x%x\n", nam_result); + return FALSE; + } } - else + + // Z[uf[^NA + if (GetImportJumpSetting()->clearPublicSaveData || GetImportJumpSetting()->clearPrivateSaveData) { - OS_Warning(" Fail! : NAM Result Code = 0x%x\n", nam_result); - return FALSE; + // Z[ut@CpX擾 + if ( NAM_GetTitleSaveFilePath(savePublicPath, savePrivatePath, tadInfo.titleInfo.titleId) != NAM_OK ) + { + OS_Warning(" Fail! NAM_GetTitleSaveFilePath\n"); + return FALSE; + } + + // publicZ[uf[^FFNAtH[}bg + if (GetImportJumpSetting()->clearPublicSaveData && tadInfo.titleInfo.publicSaveSize > 0) + { + if (NAMUTi_ClearSavedataPublic(savePublicPath, tadInfo.titleInfo.titleId) == FALSE) + { + OS_Warning(" Fail! NAMUTi_ClearSavedataPublic\n"); + return FALSE; + } + } + + // privateZ[uf[^FFNAtH[}bg + if (GetImportJumpSetting()->clearPrivateSaveData && tadInfo.titleInfo.privateSaveSize > 0) + { + if (NAMUTi_ClearSavedataPublic(savePrivatePath, tadInfo.titleInfo.titleId) == FALSE) + { + OS_Warning(" Fail! NAMUTi_ClearSavedataPrivate\n"); + return FALSE; + } + } } + + // Tuoi[NA + if (GetImportJumpSetting()->clearSaveBannerFile) + { + // Tuoi[pX擾 + if ( NAM_GetTitleBannerFilePath(subBannerPath, tadInfo.titleInfo.titleId) != NAM_OK ) + { + OS_Warning(" Fail! NAM_GetTitleBannerFilePath\n"); + return FALSE; + } + + // Tuoi[j + { + if (NAMUTi_DestroySubBanner(subBannerPath) == FALSE) + { + OS_Warning(" Fail! NAMUTi_DestroySubBanner\n"); + return FALSE; + } + } + } + + return TRUE; } static void Destructor(void* /*arg*/) diff --git a/build/systemMenu_RED/ImportJump/ARM9.TWL/src/main.c b/build/systemMenu_RED/ImportJump/ARM9.TWL/src/main.c index 59d010b0..f4dde22b 100644 --- a/build/systemMenu_RED/ImportJump/ARM9.TWL/src/main.c +++ b/build/systemMenu_RED/ImportJump/ARM9.TWL/src/main.c @@ -53,6 +53,8 @@ extern void FS_MountHostIO(const char *basepath); void TwlMain() { + NAMTitleId titleID; + // OS_InitOɎs { // SRĽɔzuTADt@CɃANZX”\ɂ邽߂ @@ -131,10 +133,10 @@ TwlMain() } // TAD̃C|[gJn - if (kamiImportTad()) + if (kamiImportTad(&titleID)) { // C|[gɐȂAvWv - OS_DoApplicationJump( GetImportJumpSetting()->bootTitleID, OS_APP_JUMP_NORMAL ); + OS_DoApplicationJump( titleID, OS_APP_JUMP_NORMAL ); } // AvWvɐȂ炱ւ͓BȂ diff --git a/docs/ISデバッガ/ISデバッガタスク.vsd b/docs/ISデバッガ/ISデバッガタスク.vsd index c9e11c8cd6d6c50fcaa88ed57b8e86eee478e9de..191c60a9359c769778fce869adaa3c06c1291f37 100644 GIT binary patch delta 11009 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 EKWMgOFaQ7m delta 11962 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