forked from Mirror/GodMode9
CIA building / installing: also take over SRL flags
This commit is contained in:
parent
158fa78a5d
commit
253cb2849c
@ -102,28 +102,32 @@ typedef struct {
|
|||||||
// extended mode stuff (DSi only)
|
// extended mode stuff (DSi only)
|
||||||
u8 ignored0[0x30]; // ignored
|
u8 ignored0[0x30]; // ignored
|
||||||
u32 region_flags;
|
u32 region_flags;
|
||||||
u8 ignored1[0xC]; // ignored
|
u32 access_control;
|
||||||
|
u32 arm7_scfg_ext7;
|
||||||
|
u8 reserved2[3];
|
||||||
|
u8 srl_flag;
|
||||||
u32 arm9i_rom_offset;
|
u32 arm9i_rom_offset;
|
||||||
u32 reserved2;
|
u32 reserved3;
|
||||||
u32 arm9i_load_adress;
|
u32 arm9i_load_adress;
|
||||||
u32 arm9i_size;
|
u32 arm9i_size;
|
||||||
u32 arm7i_rom_offset;
|
u32 arm7i_rom_offset;
|
||||||
u32 unknown1;
|
u32 unknown1;
|
||||||
u32 arm7i_load_adress;
|
u32 arm7i_load_adress;
|
||||||
u32 arm7i_size;
|
u32 arm7i_size;
|
||||||
u8 ignored2[0x30]; // ignored
|
u8 ignored1[0x30]; // ignored
|
||||||
u32 ntr_twl_rom_size;
|
u32 ntr_twl_rom_size;
|
||||||
u8 unknown2[12];
|
u8 unknown2[12];
|
||||||
u8 ignored3[0x10]; // ignored
|
u8 ignored2[0x10]; // ignored
|
||||||
u64 title_id;
|
u64 title_id;
|
||||||
u32 pubsav_size;
|
u32 pubsav_size;
|
||||||
u32 prvsav_size;
|
u32 prvsav_size;
|
||||||
u8 reserved3[176];
|
u8 reserved4[176];
|
||||||
u8 unknown3[0x10];
|
u8 unknown3[0x10];
|
||||||
u8 ignored4[0xD00]; // ignored
|
u8 ignored3[0xD00]; // ignored
|
||||||
} PACKED_STRUCT TwlHeader;
|
} PACKED_STRUCT TwlHeader;
|
||||||
|
|
||||||
u32 ValidateTwlHeader(TwlHeader* twl);
|
u32 ValidateTwlHeader(TwlHeader* twl);
|
||||||
|
u32 BuildTwlSaveHeader(void* sav, u32 size);
|
||||||
u32 LoadTwlMetaData(const char* path, TwlHeader* hdr, TwlIconData* icon);
|
u32 LoadTwlMetaData(const char* path, TwlHeader* hdr, TwlIconData* icon);
|
||||||
u32 GetTwlTitle(char* desc, const TwlIconData* twl_icon);
|
u32 GetTwlTitle(char* desc, const TwlIconData* twl_icon);
|
||||||
u32 GetTwlIcon(u16* icon, const TwlIconData* twl_icon);
|
u32 GetTwlIcon(u16* icon, const TwlIconData* twl_icon);
|
||||||
|
@ -76,7 +76,7 @@ u32 FixTmdHashes(TitleMetaData* tmd) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 BuildFakeTmd(TitleMetaData* tmd, u8* title_id, u32 n_contents, u32 save_size, u32 twl_privsave_size) {
|
u32 BuildFakeTmd(TitleMetaData* tmd, u8* title_id, u32 n_contents, u32 save_size, u32 twl_privsave_size, u8 twl_flag) {
|
||||||
static const u8 sig_type[4] = { TMD_SIG_TYPE };
|
static const u8 sig_type[4] = { TMD_SIG_TYPE };
|
||||||
// safety check: number of contents
|
// safety check: number of contents
|
||||||
if (n_contents > TMD_MAX_CONTENTS) return 1; // potential incompatibility here (!)
|
if (n_contents > TMD_MAX_CONTENTS) return 1; // potential incompatibility here (!)
|
||||||
@ -91,6 +91,7 @@ u32 BuildFakeTmd(TitleMetaData* tmd, u8* title_id, u32 n_contents, u32 save_size
|
|||||||
tmd->title_type[3] = 0x40; // whatever
|
tmd->title_type[3] = 0x40; // whatever
|
||||||
for (u32 i = 0; i < 4; i++) tmd->save_size[i] = (save_size >> (i*8)) & 0xFF; // le save size
|
for (u32 i = 0; i < 4; i++) tmd->save_size[i] = (save_size >> (i*8)) & 0xFF; // le save size
|
||||||
for (u32 i = 0; i < 4; i++) tmd->twl_privsave_size[i] = (twl_privsave_size >> (i*8)) & 0xFF; // le privsave size
|
for (u32 i = 0; i < 4; i++) tmd->twl_privsave_size[i] = (twl_privsave_size >> (i*8)) & 0xFF; // le privsave size
|
||||||
|
tmd->twl_flag = twl_flag;
|
||||||
tmd->content_count[0] = (u8) ((n_contents >> 8) & 0xFF);
|
tmd->content_count[0] = (u8) ((n_contents >> 8) & 0xFF);
|
||||||
tmd->content_count[1] = (u8) (n_contents & 0xFF);
|
tmd->content_count[1] = (u8) (n_contents & 0xFF);
|
||||||
memset(tmd->contentinfo_hash, 0xFF, 0x20); // placeholder (hash)
|
memset(tmd->contentinfo_hash, 0xFF, 0x20); // placeholder (hash)
|
||||||
|
@ -62,5 +62,5 @@ u32 ValidateTmdSignature(TitleMetaData* tmd);
|
|||||||
u32 VerifyTmd(TitleMetaData* tmd);
|
u32 VerifyTmd(TitleMetaData* tmd);
|
||||||
u32 GetTmdCtr(u8* ctr, TmdContentChunk* chunk);
|
u32 GetTmdCtr(u8* ctr, TmdContentChunk* chunk);
|
||||||
u32 FixTmdHashes(TitleMetaData* tmd);
|
u32 FixTmdHashes(TitleMetaData* tmd);
|
||||||
u32 BuildFakeTmd(TitleMetaData* tmd, u8* title_id, u32 n_contents, u32 save_size, u32 twl_privsave_size);
|
u32 BuildFakeTmd(TitleMetaData* tmd, u8* title_id, u32 n_contents, u32 save_size, u32 twl_privsave_size, u8 twl_flag);
|
||||||
u32 BuildTmdCert(u8* tmdcert);
|
u32 BuildTmdCert(u8* tmdcert);
|
||||||
|
@ -2011,7 +2011,7 @@ u32 BuildInstallFromNcchFile(const char* path_ncch, const char* path_dest, bool
|
|||||||
if ((BuildCiaHeader(&(cia->header), TICKET_COMMON_SIZE) != 0) ||
|
if ((BuildCiaHeader(&(cia->header), TICKET_COMMON_SIZE) != 0) ||
|
||||||
(BuildCiaCert(cia->cert) != 0) ||
|
(BuildCiaCert(cia->cert) != 0) ||
|
||||||
(BuildFakeTicket((Ticket*)&(cia->ticket), title_id) != 0) ||
|
(BuildFakeTicket((Ticket*)&(cia->ticket), title_id) != 0) ||
|
||||||
(BuildFakeTmd(&(cia->tmd), title_id, 1, save_size, 0)) ||
|
(BuildFakeTmd(&(cia->tmd), title_id, 1, save_size, 0, 0)) ||
|
||||||
(FixCiaHeaderForTmd(&(cia->header), &(cia->tmd)) != 0) ||
|
(FixCiaHeaderForTmd(&(cia->header), &(cia->tmd)) != 0) ||
|
||||||
(!install && (WriteCiaStub(cia, path_dest) != 0))) {
|
(!install && (WriteCiaStub(cia, path_dest) != 0))) {
|
||||||
free(cia);
|
free(cia);
|
||||||
@ -2081,7 +2081,7 @@ u32 BuildInstallFromNcsdFile(const char* path_ncsd, const char* path_dest, bool
|
|||||||
if ((BuildCiaHeader(&(cia->header), TICKET_COMMON_SIZE) != 0) ||
|
if ((BuildCiaHeader(&(cia->header), TICKET_COMMON_SIZE) != 0) ||
|
||||||
(BuildCiaCert(cia->cert) != 0) ||
|
(BuildCiaCert(cia->cert) != 0) ||
|
||||||
(BuildFakeTicket((Ticket*)&(cia->ticket), title_id) != 0) ||
|
(BuildFakeTicket((Ticket*)&(cia->ticket), title_id) != 0) ||
|
||||||
(BuildFakeTmd(&(cia->tmd), title_id, content_count, save_size, 0)) ||
|
(BuildFakeTmd(&(cia->tmd), title_id, content_count, save_size, 0, 0)) ||
|
||||||
(FixCiaHeaderForTmd(&(cia->header), &(cia->tmd)) != 0) ||
|
(FixCiaHeaderForTmd(&(cia->header), &(cia->tmd)) != 0) ||
|
||||||
(!install && (WriteCiaStub(cia, path_dest) != 0))) {
|
(!install && (WriteCiaStub(cia, path_dest) != 0))) {
|
||||||
free(cia);
|
free(cia);
|
||||||
@ -2146,17 +2146,19 @@ u32 BuildInstallFromNdsFile(const char* path_nds, const char* path_dest, bool in
|
|||||||
u8 title_id[8];
|
u8 title_id[8];
|
||||||
u32 save_size = 0;
|
u32 save_size = 0;
|
||||||
u32 privsave_size = 0;
|
u32 privsave_size = 0;
|
||||||
|
u8 twl_flag = 0;
|
||||||
|
|
||||||
// Init progress bar
|
// Init progress bar
|
||||||
if (!ShowProgress(0, 0, path_nds)) return 1;
|
if (!ShowProgress(0, 0, path_nds)) return 1;
|
||||||
|
|
||||||
// load TWL header, get save sizes && title id
|
// load TWL header, get save sizes, srl flag && title id
|
||||||
if (fvx_qread(path_nds, &twl, 0, sizeof(TwlHeader), NULL) != FR_OK)
|
if (fvx_qread(path_nds, &twl, 0, sizeof(TwlHeader), NULL) != FR_OK)
|
||||||
return 1;
|
return 1;
|
||||||
for (u32 i = 0; i < 8; i++)
|
for (u32 i = 0; i < 8; i++)
|
||||||
title_id[i] = (twl.title_id >> ((7-i)*8)) & 0xFF;
|
title_id[i] = (twl.title_id >> ((7-i)*8)) & 0xFF;
|
||||||
save_size = twl.pubsav_size;
|
save_size = twl.pubsav_size;
|
||||||
privsave_size = twl.prvsav_size;
|
privsave_size = twl.prvsav_size;
|
||||||
|
twl_flag = twl.srl_flag;
|
||||||
|
|
||||||
// some basic sanity checks
|
// some basic sanity checks
|
||||||
// see: https://problemkaputt.de/gbatek.htm#dsicartridgeheader
|
// see: https://problemkaputt.de/gbatek.htm#dsicartridgeheader
|
||||||
@ -2176,7 +2178,7 @@ u32 BuildInstallFromNdsFile(const char* path_nds, const char* path_dest, bool in
|
|||||||
if ((BuildCiaHeader(&(cia->header), TICKET_COMMON_SIZE) != 0) ||
|
if ((BuildCiaHeader(&(cia->header), TICKET_COMMON_SIZE) != 0) ||
|
||||||
(BuildCiaCert(cia->cert) != 0) ||
|
(BuildCiaCert(cia->cert) != 0) ||
|
||||||
(BuildFakeTicket((Ticket*)&(cia->ticket), title_id) != 0) ||
|
(BuildFakeTicket((Ticket*)&(cia->ticket), title_id) != 0) ||
|
||||||
(BuildFakeTmd(&(cia->tmd), title_id, 1, save_size, privsave_size)) ||
|
(BuildFakeTmd(&(cia->tmd), title_id, 1, save_size, privsave_size, twl_flag)) ||
|
||||||
(FixCiaHeaderForTmd(&(cia->header), &(cia->tmd)) != 0) ||
|
(FixCiaHeaderForTmd(&(cia->header), &(cia->tmd)) != 0) ||
|
||||||
(!install && (WriteCiaStub(cia, path_dest) != 0))) {
|
(!install && (WriteCiaStub(cia, path_dest) != 0))) {
|
||||||
free(cia);
|
free(cia);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user