From b01ff7f8a1631d77f6bb5b76450066104ccdb5be Mon Sep 17 00:00:00 2001 From: yosiokat Date: Fri, 11 Jul 2008 08:56:30 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BB=E3=82=AB=E3=83=BC=E3=83=89=E3=82=A2?= =?UTF-8?q?=E3=83=97=E3=83=AA=E3=80=81NAND=E3=82=A2=E3=83=97=E3=83=AA?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E6=99=82=E3=81=AB=E3=80=81ROM?= =?UTF-8?q?=E3=83=98=E3=83=83=E3=83=80CRC=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=81=A8=E3=83=AA=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=82=92=E8=A1=8C=E3=81=86?= =?UTF-8?q?=E3=82=88=E3=81=86=E5=A4=89=E6=9B=B4=E3=80=82=20=E3=83=BB?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E9=96=A2=E6=95=B0=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4=20=E3=80=80DS=5FCheckROMCloneBoot,=20DSi=5FExistNitro?= =?UTF-8?q?Card,=20SYSMi=5FCheckCardCloneBoot,=20SYSMi=5FIsValidCard=20?= =?UTF-8?q?=E3=83=BB=E9=96=A2=E6=95=B0=E6=95=B4=E7=90=86=E3=81=AB=E4=BC=B4?= =?UTF-8?q?=E3=81=84=E6=9C=AA=E4=BD=BF=E7=94=A8=E3=81=AB=E3=81=AA=E3=81=A3?= =?UTF-8?q?=E3=81=9FSYSM=5Fwork=E6=A7=8B=E9=80=A0=E4=BD=93=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=90=E3=80=81cardHeaderCrc16=E3=81=A8cardHeaderCr?= =?UTF-8?q?c16=5Fbak=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82=20=E3=83=BB?= =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3=E3=83=88=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=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@1860 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../ds/common/src/ds_wlpatch.c | 42 ------------------ .../hotsw/ARM7/include/hotswTypes.h | 3 +- .../libraries_sysmenu/hotsw/ARM7/src/hotsw.c | 26 ++++++----- .../sysmenu/ARM9/src/sysmenu_lib.c | 21 --------- .../sysmenu/ARM9/src/title.c | 4 -- .../sysmenu/common/src/status.c | 16 +------ .../util/ARM9/src/util_menuAppManager.c | 12 +++++ build/systemMenu_RED/Launcher/ARM9/Makefile | 1 + docs/format_TitleID.xls | Bin 15872 -> 15872 bytes .../TwlSDK 5.0 rc タスク.mmap | Bin 31305 -> 35576 bytes docs/鍵管理.xls | Bin 44032 -> 44032 bytes include/sysmenu/ds/common/ds.h | 1 - .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 3 -- include/sysmenu/util.h | 18 ++++++++ include/sysmenu/util_menuAppManager.h | 1 + 15 files changed, 51 insertions(+), 97 deletions(-) diff --git a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c index c0590710..18ac209d 100644 --- a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c +++ b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c @@ -32,7 +32,6 @@ #define PATCH3_OFFSET_IN_PATTERN 0x04 // function's prototype------------------------------------------------- -static int DSi_ExistNitroCard(void); static void* DSi_GetPatchBaseAddr( void ); static BOOL DSi_IsPatchedSDKVersion( void ); static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset ); @@ -283,44 +282,3 @@ asm void DSi_CopyWLPatch( void ) (u8 *)(destp), \ ( DMA_SRC_INC | ( (size)/(32/8) & 0x1fffff ) ) ) */ - -// N[u[g -void DS_CheckROMCloneBoot( void ) -{ - s32 lockCardID; - u8 *buffp = (u8 *)&mbSignBuf; - u32 auth_offset = dh->s.rom_valid_size ? dh->s.rom_valid_size : 0x01000000; - u32 page_offset = auth_offset & 0xFFFFFE00; - - if( !DSi_ExistNitroCard() ) { - return; - } - - if ((lockCardID = OS_GetLockID()) > 0) { - (void)OS_LockCard( (u16 )lockCardID ); -// DC_FlushRange( buffp, sizeof(mbSignBuf) ); -// IPL2_ReadCard( (void *)page_offset, buffp, sizeof(mbSignBuf) ); - (void)OS_UnLockCard( (u16 )lockCardID ); - OS_ReleaseLockID( (u16 )lockCardID ); - } - - buffp += auth_offset & 0x000001FF; - if( *buffp++ == 'a' && *buffp == 'c' ) { - SYSMi_GetWork()->cloneBootMode = SYSM_CLONE_BOOT_MODE; - }else { - SYSMi_GetWork()->cloneBootMode = SYSM_OTHER_BOOT_MODE; - } -} - -// NITROJ[h݃`FbN u^[@1FJ[hF@0FJ[hȂv -static int DSi_ExistNitroCard(void) -{ - if((dh->s.nintendo_logo_crc16 == 0xcf56) - &&(dh->s.header_crc16 == SYSMi_GetWork()->cardHeaderCrc16)) { - return TRUE; // NITROJ[hiNintendoSCRCAJ[hwb_CRCꍇj - // NintendoSf[^̃`FbŃA̓sAS\[`Nɍs܂B - }else { - return FALSE; // NITROJ[hȂ - } -} - diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 7c91ac3a..97756aaf 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -239,7 +239,8 @@ typedef enum HotSwState{ HOTSW_TIME_OUT, HOTSW_CARD_LOCK_ERROR, HOTSW_CRC_CHECK_ERROR, - HOTSW_HASH_CHECK_ERROR, + HOWSW_REGION_CHECK_ERROR, + HOTSW_HASH_CHECK_ERROR, HOTSW_ID_CHECK_ERROR, HOTSW_PULLED_OUT_ERROR, HOTSW_DATA_DECRYPT_ERROR, diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 1f161313..8710fad9 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -404,16 +404,18 @@ static HotSwState LoadCardData(void) } SYSMi_GetWork()->gameCommondParam = s_cbData.gameCommondParam; - // ROMwb_CRCZoă`FbNBNintendoSCRCmFB - SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); - OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n", - SYSMi_GetWork()->cardHeaderCrc16_bak, s_cbData.pBootSegBuf->rh.s.header_crc16 ); - - if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || - ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){ - retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval; - } - + + + // CRC`FbN + if( !UTL_CheckAppCRC16( &s_cbData.pBootSegBuf->rh.s ) ) { + retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval; + } + + // [W`FbN + if( !UTL_CheckAppRegion( s_cbData.pBootSegBuf->rh.s.card_region_bitmap ) ) { + retval = (retval == HOTSW_SUCCESS) ? HOWSW_REGION_CHECK_ERROR : retval; + } + // AvWṽfobOROMG~[V񂾂Kvȏꍇ if(SYSMi_GetWork()->flags.hotsw.isLoadRomEmuOnly){ SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; @@ -2382,6 +2384,10 @@ static void DebugPrintErrorMessage(HotSwState state) OS_PutString(" - Error 3 : CRC Check\n"); break; + case HOWSW_REGION_CHECK_ERROR: + OS_PutString(" - Error 3 : Region Check\n"); + break; + case HOTSW_HASH_CHECK_ERROR: OS_PutString(" - Error 4 : Hash Check\n"); break; diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 62c1b1eb..cc0a11f2 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -34,7 +34,6 @@ static void SYSMi_CopyLCFGDataSettings( void ); static TitleProperty *SYSMi_CheckDebuggerBannerViewModeBoot( void ); static TitleProperty *SYSMi_CheckShortcutBoot1( void ); static TitleProperty *SYSMi_CheckShortcutBoot2( void ); -static void SYSMi_CheckCardCloneBoot( void ); void SYSMi_SendKeysToARM7( void ); static OSTitleId SYSMi_getTitleIdOfMachineSettings( void ); @@ -556,26 +555,6 @@ static TitleProperty *SYSMi_CheckShortcutBoot2( void ) } -// N[u[g -static void SYSMi_CheckCardCloneBoot( void ) -{ -#if 0 - u8 *buffp = (u8 *)&pTempBuffer; - u32 total_rom_size = SYSM_GetCardRomHeader()->rom_valid_size ? SYSM_GetCardRomHeader()->rom_valid_size : 0x01000000; - u32 file_offset = total_rom_size & 0xFFFFFE00; - - DC_FlushRange( buffp, BNR_IMAGE_SIZE ); - CARD_ReadRom( 4, (void *)file_offset, buffp, BNR_IMAGE_SIZE ); - - buffp += total_rom_size & 0x000001FF; - if( *buffp++ == 'a' && *buffp == 'c' ) { - SYSMi_GetWork()->flags.common.cloneBootMode = CLONE_BOOT_MODE; - }else { - SYSMi_GetWork()->flags.common.cloneBootMode = OTHER_BOOT_MODE; - } -#endif -} - // NAM_Init悤ɂȂ̂ŁANAMŖ{̐ݒID擾 // 炵̂CXg[ĂȂꍇ0iNULLj^[ static OSTitleId SYSMi_getTitleIdOfMachineSettings( void ) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 44e982db..792654a2 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -281,9 +281,6 @@ TitleProperty *SYSM_GetCardTitleList( BOOL *changed ) // [hJnĂAwb_^Cg͕ύXȂ return pTitleList_Card; } - // [TODO:] ROMwb_ platform_code NTR,TWL-HYB,TWL-LTDȊÔ - // region_code{̏ƈႤ - // ̏ꍇ́AɔFłȂ^Cgł邱ƂB if( SYSMi_GetWork()->flags.hotsw.isCardStateChanged ) { u16 id = (u16)OS_GetLockID(); @@ -335,7 +332,6 @@ BOOL SYSMi_CopyCardRomHeader( void ) // ROMwb_̃[h DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_APP_ROM_HEADER_SIZE ); // LbVPA MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)SYSM_APP_ROM_HEADER_BUF, SYSM_APP_ROM_HEADER_SIZE ); // ROMwb_Rs[ - SYSMi_GetWork()->cardHeaderCrc16 = SYSMi_GetWork()->cardHeaderCrc16_bak; // ROMwb_CRCRs[ retval = TRUE; } diff --git a/build/libraries_sysmenu/sysmenu/common/src/status.c b/build/libraries_sysmenu/sysmenu/common/src/status.c index f2f3f1f9..17a48c24 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/status.c +++ b/build/libraries_sysmenu/sysmenu/common/src/status.c @@ -22,7 +22,6 @@ // define data----------------------------------------------------------------- // extern data----------------------------------------------------------------- // function's prototype------------------------------------------------------- -static int SYSMi_IsValidCard( void ); // global variable------------------------------------------------------------- // static variable------------------------------------------------------------- // const data------------------------------------------------------------------ @@ -68,7 +67,7 @@ BOOL SYSMi_IsDebuggerBannerViewMode( void ) { #if 0 return ( SYSM_IsRunOnDebugger() && - SYSMi_IsValidCard() && + SYSMi_IsExistCard() && SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE; #else return FALSE; @@ -120,19 +119,6 @@ BOOL SYSM_IsNTRCard( void ) } -// NTR,TWLJ[h݃`FbN u^[@1FJ[hF@0FJ[hȂv -static int SYSMi_IsValidCard( void ) -{ - if( ( SYSM_GetCardRomHeader()->nintendo_logo_crc16 == 0xcf56 ) && - ( SYSM_GetCardRomHeader()->header_crc16 == SYSMi_GetWork()->cardHeaderCrc16 ) ) { - return TRUE; // NTR,TWLJ[hiNintendoSCRCAJ[hwb_CRCꍇj - // NintendoSf[^̃`FbŃA̓sAS\[`Nɍs܂B - }else { - return FALSE; // NTR,TWLJ[hȂ - } -} - - // GgAhX̐`FbN BOOL SYSMi_CheckEntryAddress( void ) { diff --git a/build/libraries_sysmenu/util/ARM9/src/util_menuAppManager.c b/build/libraries_sysmenu/util/ARM9/src/util_menuAppManager.c index 4d5136b2..5fd9bc38 100644 --- a/build/libraries_sysmenu/util/ARM9/src/util_menuAppManager.c +++ b/build/libraries_sysmenu/util/ARM9/src/util_menuAppManager.c @@ -477,6 +477,18 @@ static void AMNi_getAndAddNandTitleData( NAMTitleId titleID, BOOL readShowData ) return; } + // ROMwb_̃[W`FbNCRC`FbNsAsȃAv͖B + if( !UTL_CheckAppRegion( s_AllRomHeaderArray[rhArrayLen].card_region_bitmap ) ) { + OS_TPrintf( "Region Check NG : %llx\n", titleID ); + FS_CloseFile(file); + return; + } + if( !UTL_CheckAppCRC16( &s_AllRomHeaderArray[rhArrayLen] ) ) { + OS_TPrintf( "CRC16 Check NG : %llx\n", titleID ); + FS_CloseFile(file); + return; + } + sNandAppRomHeaderArrayLength++; // `[\p͐I[o[Ă邩A\pǂ܂Ȃݒ diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index e181c924..f509b058 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -22,6 +22,7 @@ SUBDIRS = \ ../../../libraries_sysmenu/sysmenu \ ../../../libraries_sysmenu/boot \ ../../../libraries_sysmenu/hotsw \ + ../../../libraries_sysmenu/util \ # ../../../libraries_sysmenu/sharedFont \ # ../../../libraries_sysmenu/reloc_info \ # ../../../libraries_sysmenu/mcu \ diff --git a/docs/format_TitleID.xls b/docs/format_TitleID.xls index d7622bac75c44cb60f89afee7908f288fbeb385f..668897bacd920b7d9de522eee3745e91f9b2d080 100644 GIT binary patch delta 129 zcmZpuX{g!2!Ner2u$hZ#Hz$x@e4Lw;Wr`^`^W@Va3G5)o2M*!Mf#S-WLq$ayd5Tk$ zON&w!tPHIc6egF66|g)3DSaiDzz$*raDtRxU@1CBm3Ej83i8 Re{_P8c{8K-XTC*RA^;|mB(eYi delta 129 zcmZpuX{g!2!Nhb)elr)-ZcZS*_&7Hwi-_q=#>uBe64*hE4;(_11I3j$hl+|a@{|^* zx(54XCMj4MT2C$$D_}_hDSaiDzz$*raDtRxVA%o^RFz0z2QeDBAo|x!gfVeExpghG Q`~)NOW=8GLe2cV107T0vWB>pF diff --git a/docs/リリース_SDK_5_0_RC/TwlSDK 5.0 rc タスク.mmap b/docs/リリース_SDK_5_0_RC/TwlSDK 5.0 rc タスク.mmap index 05980fe167b60cebecee4a335c290748c60f89da..8cc0c64d9a48e872736e12b2d00c260540434a19 100644 GIT binary patch delta 18400 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∋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 delta 14122 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 VM6x2Od4fPNAZ{iWCJt_v{{z;UKNtW2 diff --git a/docs/鍵管理.xls b/docs/鍵管理.xls index 1991f315d68dab306aba4d2a50d87d84cdb94dbd..e8f78f335219c6ab0bed6cbfa0d7469d95034496 100644 GIT binary patch delta 19 bcmZp;!PIbrX+zE`76qN)^34USCNKg3Qw#_5 delta 19 bcmZp;!PIbrX+zE`mH@U)p3McTCNKg3QKSc` diff --git a/include/sysmenu/ds/common/ds.h b/include/sysmenu/ds/common/ds.h index 64693a01..479fe350 100644 --- a/include/sysmenu/ds/common/ds.h +++ b/include/sysmenu/ds/common/ds.h @@ -29,7 +29,6 @@ extern "C" { #define DS_WLPATCH_COPYCODE_SIZE (10*4) void DS_InsertWLPatch( void* romHeaderNTR ); -void DS_CheckROMCloneBoot( void ); #ifdef __cplusplus diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 0e0469d9..8d25f32b 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -122,9 +122,6 @@ typedef struct SYSM_work { }hotsw; }flags; // 8B - u16 cardHeaderCrc16; // J[hoɎZoROMwb_CRC16iARM9ŃRs[Ďgp鑤j - u16 cardHeaderCrc16_bak; // J[hoɎZoROMwb_CRC16iARM7CuŃ_CNgɏ鑤j - OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // J[h\[Xrp OSLockWord lockHotSW; // J[h\[Xrp u32 appCardID; // J[hID diff --git a/include/sysmenu/util.h b/include/sysmenu/util.h index df636827..b56d8f5d 100644 --- a/include/sysmenu/util.h +++ b/include/sysmenu/util.h @@ -119,6 +119,24 @@ extern void UTL_SetFatalError( FatalErrorCode error ); // FATAL extern u64 UTL_GetFatalError( void ); // FATALG[Ԃ̎擾iFatalErrorCoderbgɊ蓖ĂĊi[Ă܂Bj +// [W`FbN +static inline BOOL UTL_CheckAppRegion( u32 card_region_bitmap ) +{ + return ( card_region_bitmap & ( 0x00000001 << OS_GetRegion() ) ) ? TRUE : FALSE; +} + +// CRC`FbN +static BOOL UTL_CheckAppCRC16( ROM_Header_Short *pROMH ) +{ + u16 calc_crc = SVC_GetCRC16( 65535, pROMH, 0x015e ); + if( ( calc_crc != pROMH->header_crc16 ) || + ( 0xcf56 != pROMH->nintendo_logo_crc16 ) ){ + return FALSE; + } + return TRUE; +} + + #ifdef __cplusplus } #endif diff --git a/include/sysmenu/util_menuAppManager.h b/include/sysmenu/util_menuAppManager.h index 2e1a89be..42fa2bba 100644 --- a/include/sysmenu/util_menuAppManager.h +++ b/include/sysmenu/util_menuAppManager.h @@ -25,6 +25,7 @@ #include <../build/libraries/os/common/include/application_jump_private.h> #include +#include typedef struct AMNBannerCounter {