From 84c8e37b48ac85872d9a3e68adce251679db5de7 Mon Sep 17 00:00:00 2001 From: 3DSGuy <3dsguy.dev@gmail.com> Date: Sat, 22 Feb 2014 09:14:00 +0800 Subject: [PATCH] makerom v0.3-alternate --- sdapp_FW4X.rsf => Default.desc | 231 ++++++++++++++++++--------------- Default.rsf | 76 +++++++++++ Makefile | 4 +- elf.c | 27 +++- exheader.c | 87 +++++++------ exheader.h | 86 ++++++------ lib.h | 3 +- makerom.c | 57 ++++++-- ncch.c | 33 ++++- usersettings.c | 106 +++++++++++++++ usersettings.h | 187 +++++++++++++++++++++++++- 11 files changed, 679 insertions(+), 218 deletions(-) rename sdapp_FW4X.rsf => Default.desc (63%) create mode 100644 Default.rsf diff --git a/sdapp_FW4X.rsf b/Default.desc similarity index 63% rename from sdapp_FW4X.rsf rename to Default.desc index 86d22a6..790a320 100644 --- a/sdapp_FW4X.rsf +++ b/Default.desc @@ -1,51 +1,85 @@ -# Default value for application -BasicInfo: - Title : "Pyramids" - CompanyCode : "00" - ProductCode : "CTR-T-JA9P" - ContentType : Application # Application / SystemUpdate / Manual / Child / Trial - Logo : Licensed # Nintendo / Licensed / Distributed / iQue / iQueForSystem - BackupMemoryType: None # None / 128KB / 512KB - -TitleInfo: - Category: Application - UniqueId: 0x60f - -Option: - UseOnSD: true # true if App is to be installed to SD - EnableCompress: true - FreeProductCode: true - EnableCrypt : true - -Rom: - SaveDataSize: 128KB - -ExeFs: - ReadOnly: - - .rodata - #- RO - ReadWrite: - - .data - #- RW - Text: - - .text - #- STUP_ENTRY - -# Don't Modify Below here -AccessControlInfo: - MaxCpu: 0x9E - AffinityMask: 1 +ARM11LocalSysCapabilities: + MaxCpu: 0x0 # 0x9E CoreVersion: 2 - DescVersion: 2 + IdealProcessor: 0 + Priority: 16 + AppType: Application + AffinityMask: 1 + ServiceAccessControl: + - APT:U + - $hioFIO + - $hostio0 + - $hostio1 + - ac:u + - boss:U + - cam:u + - cecd:u + - cfg:u + - dlp:FKCL + - dlp:SRVR + - dsp::DSP + - frd:u + - fs:USER + - gsp::Gpu + - hid:USER + - http:C + - mic:u + - ndm:u + - news:u + - nwm::UDS + - ptm:u + - pxi:dev + - soc:U + - ssl:C + - y2r:u + - ldr:ro + - ir:USER + +ARM11KernelCapabilities: + DisableDebug : true + EnableForceDebug : true + CanWriteSharedPage : true + CanUsePrivilegedPriority : true + CanUseNonAlphabetAndNumber : true + PermitMainFunctionArgument : true + CanShareDeviceMemory : true + RunnableOnSleep : true + SpecialMemoryArrange : true + HandleTableSize: 512 + + MemoryType: Application + + ReleaseKernelMajor: "02" + ReleaseKernelMinor: "33" + IORegisterMapping: - 1ff50000-1ff57fff - 1ff70000-1ff77fff - IdealProcessor: 0 MemoryMapping: - 1f000000-1f5fffff:r - Priority: 16 + + FileSystemAccess: + - CategorySystemApplication #0x1 + - CategoryHardwareCheck #0x2 + - CategoryFileSystemTool #0x4 + - Debug #0x8 + - TwlCardBackup #0x10 + - TwlNandData #0x20 + - Boss #0x40 + - DirectSdmc #0x80 + - Core #0x100 + - CtrNandRo #0x200 + - CtrNandRw #0x400 + - CtrNandRoWrite #0x800 + - CategorySystemSettings #0x1000 + - CardBoard #0x2000 + - ExportImportIvs #0x4000 + - DirectSdmcWrite #0x8000 + InterruptNumbers: + - 0x1 + SystemCallAccess: ArbitrateAddress: 34 Break: 60 @@ -98,74 +132,52 @@ AccessControlInfo: UnmapMemoryBlock: 32 WaitSynchronization1: 36 WaitSynchronizationN: 37 - MemoryType: Application - ReleaseKernelMajor: "02" - ReleaseKernelMinor: "33" - ServiceAccessControl: - - APT:U - - $hioFIO - - $hostio0 - - $hostio1 - - ac:u - - boss:U - - cam:u - - cecd:u - - cfg:u - - dlp:FKCL - - dlp:SRVR - - dsp::DSP - - frd:u - - fs:USER - - gsp::Gpu - - hid:USER - - http:C - - mic:u - - ndm:u - - news:u - - nwm::UDS - - ptm:u - - pxi:dev - - soc:U - - ssl:C - - y2r:u - - ldr:ro - - ir:USER - -SystemControlInfo: - Dependency: - ac: 0x0004013000002402L - am: 0x0004013000001502L - boss: 0x0004013000003402L - camera: 0x0004013000001602L - cecd: 0x0004013000002602L - cfg: 0x0004013000001702L - codec: 0x0004013000001802L - csnd: 0x0004013000002702L - dlp: 0x0004013000002802L - dsp: 0x0004013000001a02L - friends: 0x0004013000003202L - gpio: 0x0004013000001b02L - gsp: 0x0004013000001c02L - hid: 0x0004013000001d02L - http: 0x0004013000002902L - i2c: 0x0004013000001e02L - ir: 0x0004013000003302L - mcu: 0x0004013000001f02L - mic: 0x0004013000002002L - ndm: 0x0004013000002b02L - news: 0x0004013000003502L - nim: 0x0004013000002c02L - nwm: 0x0004013000002d02L - pdn: 0x0004013000002102L - ps: 0x0004013000003102L - ptm: 0x0004013000002202L - ro: 0x0004013000003702L - socket: 0x0004013000002e02L - spi: 0x0004013000002302L - ssl: 0x0004013000002f02L - StackSize: 0x40000 - -CommonHeaderKey: + +ARM9AccessControlInfo: + DescVersion: 2 + IoAccessControl: + - FsMountNand # 0x1 + - FsMountNandRoWrite #0x2 + - FsMountTwln #0x4 + - FsMountWnand # 0x8 + - FsMountCardSpi #0x10 + - UseSdif3 # 0x20 + - CreateSeed # 0x40 + - UseCardSpi # 0x80 + +Dependency: + ac: 0x0004013000002402L + am: 0x0004013000001502L + boss: 0x0004013000003402L + camera: 0x0004013000001602L + cecd: 0x0004013000002602L + cfg: 0x0004013000001702L + codec: 0x0004013000001802L + csnd: 0x0004013000002702L + dlp: 0x0004013000002802L + dsp: 0x0004013000001a02L + friends: 0x0004013000003202L + gpio: 0x0004013000001b02L + gsp: 0x0004013000001c02L + hid: 0x0004013000001d02L + http: 0x0004013000002902L + i2c: 0x0004013000001e02L + ir: 0x0004013000003302L + mcu: 0x0004013000001f02L + mic: 0x0004013000002002L + ndm: 0x0004013000002b02L + news: 0x0004013000003502L + nim: 0x0004013000002c02L + nwm: 0x0004013000002d02L + pdn: 0x0004013000002102L + ps: 0x0004013000003102L + ptm: 0x0004013000002202L + ro: 0x0004013000003702L + socket: 0x0004013000002e02L + spi: 0x0004013000002302L + ssl: 0x0004013000002f02L + +CommonHeaderKey: D: | jL2yO86eUQnYbXIrzgFVMm7FVze0LglZ2f5g+c42hWoEdnb5BOotaMQPBfqt aUyAEmzQPaoi/4l4V+hTJRXQfthVRqIEx27B84l8LA6Tl5Fy9PaQaQ+4yRfP @@ -173,6 +185,8 @@ CommonHeaderKey: 0RCb66lYcr2h/p2G7SnpKUliS9h9KnpmG+UEgVYQUK+4SCfByUa9PxYGpT0E nw1UcRz0gsBmdOqcgzwnAd9vVqgb42hVn6uQZyAl+j1RKiMWywZarazIR/k5 Lmr4+groimSEa+3ajyoIho9WaWTDmFU3mkhA2tUDIQ== + Exponent: | + AQAB Modulus: | z+yySANtuAnjXGxiLKlJ4fT0DGzD5S+dUKArWgDGcgALowRdlEbnABtIhbVh LMl0yitDE8F4l1wzLwfHhfDa22CWUA98S3rXF53k5cOrb12leDKtBN2Wbtx1 @@ -180,6 +194,7 @@ CommonHeaderKey: BEou29fQZEOc0HgRQYgz3TFikC0X8sapK5xwq9zTq13a7j1sDoH/9mdaRPms Bz0jlHVlkyAMxXYdD2UGPSGi8JaAtwpJUzijXcB0PKTZQDaFH4zRLRX57ySp fp2yHvigcoEXd3OxVn+tBaLSMFr1068PEEpS2AlHlw== +# The following are associated for signature integrity (dev units only obviously) Signature: | 3xyLmORvojVswxgXmPPOVH4ULn8e2G3PvClO/jIuwRGtRprGcOruKFUi4TYF HASKzg8Mg4/I1t4RjurPrZvPgQ3rcROz066DAkwOEFBZPO5gBvuMf8IgJAFi diff --git a/Default.rsf b/Default.rsf new file mode 100644 index 0000000..b179098 --- /dev/null +++ b/Default.rsf @@ -0,0 +1,76 @@ +BasicInfo: + Title: + CompanyCode: + ProductCode: + ContentType: + Logo: + RemasterVersion: + +TitleInfo: + UniqueId: + Category: + CategoryFlags: + TargetCategory: + #Variation + Version: + ContentsIndex: + DataTitleIndex: + ChildIndex: + DemoIndex: + +CardInfo: + MediaSize: + MediaFootPadding: + + WritableAddress: + CardType: + CryptoType: + CardDevice: + MediaType: + + BackupWriteWaitTime: + +SystemInfo: + SaveDataSize: + JumpID: + +StorageInfo: + #Extdata Related + UseExtSaveData: #Boolean + ExtSaveDataId: + + #SystemSaveIds + SystemSaveDataId1: + SystemSaveDataId2: + + #Other Accessible SaveIds: + UseOtherVariationSaveData: #Boolean + OtherUserSaveDataId1: + OtherUserSaveDataId2: + OtherUserSaveDataId3: + + #SDK 6+ Accessible SaveIds alternate method + # Renders Extdata/OtherUserSaveData values empty + UseExtendedSaveDataAccessControl: #Boolean + AccessibleSaveDataIds: # List of (max 6) SaveIds + +Option: + PageSize: + + EnableCrypt: #Boolean + EnableCompress: #Boolean + FreeProductCode: #Boolean + UseOnSD: #Boolean + +ExeFs: + Text: + ReadOnly: + ReadWrite: + StackSize: + +RomFs: + HostRoot: + DefaultReject: + Reject: + Include: + File: \ No newline at end of file diff --git a/Makefile b/Makefile index 8a40192..59c424e 100644 --- a/Makefile +++ b/Makefile @@ -19,9 +19,9 @@ CFLAGS = --std=c99 -Wall -I. -DMAKEROM_VER_MAJOR=$(VER_MAJOR) -DMAKEROM_VER_MINO CC = gcc # MAKEROM Build Settings -MAKEROM_BUILD_FLAGS = -DPRIVATE_BUILD #-DRETAIL_FSIGN #-DELF_DEBUG +MAKEROM_BUILD_FLAGS = -DPRIVATE_BUILD #-DELF_DEBUG -DRETAIL_FSIGN -DDEBUG VER_MAJOR = 0 -VER_MINOR = 2 +VER_MINOR = 3 OUTPUT = makerom main: build diff --git a/elf.c b/elf.c index 67850b0..ef254dd 100644 --- a/elf.c +++ b/elf.c @@ -70,11 +70,17 @@ int BuildExeFsCode(ncch_settings *ncchset) return result; } +#ifdef DEBUG + printf("[DEBUG] Import ELF\n"); +#endif /* Import ELF */ u8 *ElfFile = malloc(ncchset->ComponentFilePtrs.elf_size); if(!ElfFile) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); return MEM_ERROR;} ReadFile_64(ElfFile,ncchset->ComponentFilePtrs.elf_size,0,ncchset->ComponentFilePtrs.elf); +#ifdef DEBUG + printf("[DEBUG] Create ELF Context\n"); +#endif /* Create ELF Context */ ElfContext *elf = malloc(sizeof(ElfContext)); if(!elf) {fprintf(stderr,"[ELF ERROR] MEM ERROR\n"); free(ElfFile); return MEM_ERROR;} @@ -95,9 +101,18 @@ int BuildExeFsCode(ncch_settings *ncchset) PrintElfContext(elf,ElfFile); #endif +#ifdef DEBUG + PrintElfContext(elf,ElfFile); +#endif + +#ifdef DEBUG + printf("[DEBUG] Create ExeFs Code\n"); +#endif result = CreateExeFsCode(elf,ElfFile,ncchset); if(result) goto finish; - +#ifdef DEBUG + printf("[DEBUG] Get BSS Size\n"); +#endif result = GetBSS_SizeFromElf(elf,ElfFile,ncchset); if(result) goto finish; @@ -110,10 +125,14 @@ finish: else if(result == NOT_FIND_CODE_SECTIONS) fprintf(stderr,"[ELF ERROR] Failed to retrieve code sections from ELF\n"); else fprintf(stderr,"[ELF ERROR] Failed to process ELF file (%d)\n",result); } - for(int i = 0; i < elf->ActiveSegments; i++){ - free(elf->Segments[i].Header); +#ifdef DEBUG + printf("[DEBUG] Free Segment Header/Sections\n"); +#endif + for(int i = 0; i < elf->ActiveSegments; i++) free(elf->Segments[i].Sections); - } +#ifdef DEBUG + printf("[DEBUG] Free others\n"); +#endif free(ElfFile); free(elf->Sections); free(elf->ProgramHeaders); diff --git a/exheader.c b/exheader.c index d84de8b..f13492e 100644 --- a/exheader.c +++ b/exheader.c @@ -90,6 +90,9 @@ int BuildExHeader(ncch_settings *ncchset) result = set_AccessDesc(exhdrset,ncchset); if(result) goto finish; + + exhdrset->ExHdr->AccessDescriptor.ARM11SystemLocalCapabilities.Flags[6] = 5; + finish: if(result) fprintf(stderr,"[EXHEADER ERROR] Failed to create ExHeader\n"); free_ExHeaderSettings(exhdrset); @@ -152,7 +155,7 @@ int get_ExHeaderSettingsFromNcchset(exheader_settings *exhdrset, ncch_settings * if(ncchset->Options.UseOnSD) exhdrset->ExHdr->CodeSetInfo.Flags.flag |= RetailSDAppFlag; if(!ncchset->Options.UseRomFS) // Move this later - exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo.OtherAttributes |= 1 << NOT_USE_ROMFS; + exhdrset->ExHdr->ARM11SystemLocalCapabilities.StorageInfo.OtherAttributes |= 1 << attribute_NOT_USE_ROMFS; return 0; } @@ -443,47 +446,47 @@ int SetARM11StorageInfo(exhdr_ARM11SystemLocalCapabilities *arm11, rsf_settings u32 AccessInfo = 0; for(int i = 0; i < yaml->AccessControlInfo.FileSystemAccessNum; i++){ if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategorySystemApplication") == 0) - AccessInfo |= 1 << CATEGORY_SYSTEM_APPLICATION; + AccessInfo |= 1 << fsaccess_CATEGORY_SYSTEM_APPLICATION; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryHardwareCheck") == 0) - AccessInfo |= 1 << CATEGORY_HARDWARE_CHECK; + AccessInfo |= 1 << fsaccess_CATEGORY_HARDWARE_CHECK; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryFileSystemTool") == 0) - AccessInfo |= 1 << CATEGORY_FILE_SYSTEM_TOOL; + AccessInfo |= 1 << fsaccess_CATEGORY_FILE_SYSTEM_TOOL; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Debug") == 0) - AccessInfo |= 1 << DEBUG; + AccessInfo |= 1 << fsaccess_DEBUG; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"TwlCardBackup") == 0) - AccessInfo |= 1 << TWL_CARD_BACKUP; + AccessInfo |= 1 << fsaccess_TWL_CARD_BACKUP; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"TwlNandData") == 0) - AccessInfo |= 1 << TWL_NAND_DATA; + AccessInfo |= 1 << fsaccess_TWL_NAND_DATA; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Boss") == 0) - AccessInfo |= 1 << BOSS; + AccessInfo |= 1 << fsaccess_BOSS; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - AccessInfo |= 1 << DIRECT_SDMC; + AccessInfo |= 1 << fsaccess_DIRECT_SDMC; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Core") == 0) - AccessInfo |= 1 << CORE; + AccessInfo |= 1 << fsaccess_CORE; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRo") == 0) - AccessInfo |= 1 << CTR_NAND_RO; + AccessInfo |= 1 << fsaccess_CTR_NAND_RO; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRw") == 0) - AccessInfo |= 1 << CTR_NAND_RW; + AccessInfo |= 1 << fsaccess_CTR_NAND_RW; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CtrNandRoWrite") == 0) - AccessInfo |= 1 << CTR_NAND_RO_WRITE; + AccessInfo |= 1 << fsaccess_CTR_NAND_RO_WRITE; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategorySystemSettings") == 0) - AccessInfo |= 1 << CATEGORY_SYSTEM_SETTINGS; + AccessInfo |= 1 << fsaccess_CATEGORY_SYSTEM_SETTINGS; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CardBoard") == 0) - AccessInfo |= 1 << CARD_BOARD; + AccessInfo |= 1 << fsaccess_CARD_BOARD; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"ExportImportIvs") == 0) - AccessInfo |= 1 << EXPORT_IMPORT_IVS; + AccessInfo |= 1 << fsaccess_EXPORT_IMPORT_IVS; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmcWrite") == 0) - AccessInfo |= 1 << DIRECT_SDMC_WRITE; + AccessInfo |= 1 << fsaccess_DIRECT_SDMC_WRITE; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"SwitchCleanup") == 0) - AccessInfo |= 1 << SWITCH_CLEANUP; + AccessInfo |= 1 << fsaccess_SWITCH_CLEANUP; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"SaveDataMove") == 0) - AccessInfo |= 1 << SAVE_DATA_MOVE; + AccessInfo |= 1 << fsaccess_SAVE_DATA_MOVE; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Shop") == 0) - AccessInfo |= 1 << SHOP; + AccessInfo |= 1 << fsaccess_SHOP; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"Shell") == 0) - AccessInfo |= 1 << SHELL; + AccessInfo |= 1 << fsaccess_SHELL; else if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"CategoryHomeMenu") == 0) - AccessInfo |= 1 << CATEGORY_HOME_MENU; + AccessInfo |= 1 << fsaccess_CATEGORY_HOME_MENU; else{ fprintf(stderr,"[EXHEADER ERROR] Invalid FileSystemAccess Name: '%s'\n",yaml->AccessControlInfo.FileSystemAccess[i]); return EXHDR_BAD_YAML_OPT; @@ -602,7 +605,7 @@ int SetARM11StorageInfoAccessibleSaveDataIds(exhdr_ARM11SystemLocalCapabilities } } - arm11->StorageInfo.OtherAttributes |= 1 << USE_EXTENDED_SAVEDATA_ACCESS_CONTROL; + arm11->StorageInfo.OtherAttributes |= 1 << attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL; /* UseOtherVariationSaveData Flag */ if(yaml->AccessControlInfo.UseOtherVariationSaveData){ @@ -1012,23 +1015,23 @@ int SetARM11KernelDescOtherCapabilities(ARM11KernelCapabilityDescriptor *desc, r u32 OtherCapabilities = 0; if(!yaml->AccessControlInfo.DisableDebug) - OtherCapabilities |= 1 << PERMIT_DEBUG; + OtherCapabilities |= 1 << othcap_PERMIT_DEBUG; if(yaml->AccessControlInfo.EnableForceDebug) - OtherCapabilities |= 1 << FORCE_DEBUG; + OtherCapabilities |= 1 << othcap_FORCE_DEBUG; if(yaml->AccessControlInfo.CanUseNonAlphabetAndNumber) - OtherCapabilities |= 1 << CAN_USE_NON_ALPHABET_AND_NUMBER; + OtherCapabilities |= 1 << othcap_CAN_USE_NON_ALPHABET_AND_NUMBER; if(yaml->AccessControlInfo.CanWriteSharedPage) - OtherCapabilities |= 1 << CAN_WRITE_SHARED_PAGE; + OtherCapabilities |= 1 << othcap_CAN_WRITE_SHARED_PAGE; if(yaml->AccessControlInfo.CanUsePrivilegedPriority) - OtherCapabilities |= 1 << CAN_USE_PRIVILEGE_PRIORITY; + OtherCapabilities |= 1 << othcap_CAN_USE_PRIVILEGE_PRIORITY; if(yaml->AccessControlInfo.PermitMainFunctionArgument) - OtherCapabilities |= 1 << PERMIT_MAIN_FUNCTION_ARGUMENT; + OtherCapabilities |= 1 << othcap_PERMIT_MAIN_FUNCTION_ARGUMENT; if(yaml->AccessControlInfo.CanShareDeviceMemory) - OtherCapabilities |= 1 << CAN_SHARE_DEVICE_MEMORY; + OtherCapabilities |= 1 << othcap_CAN_SHARE_DEVICE_MEMORY; if(yaml->AccessControlInfo.RunnableOnSleep) - OtherCapabilities |= 1 << RUNNABLE_ON_SLEEP; + OtherCapabilities |= 1 << othcap_RUNNABLE_ON_SLEEP; if(yaml->AccessControlInfo.SpecialMemoryArrange) - OtherCapabilities |= 1 << SPECIAL_MEMORY_ARRANGE; + OtherCapabilities |= 1 << othcap_SPECIAL_MEMORY_ARRANGE; if(yaml->AccessControlInfo.MemoryType){ u32 MemType = 0; @@ -1123,21 +1126,21 @@ int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_set u32 Arm9AccessControl = 0; for(int i = 0; i < yaml->AccessControlInfo.IoAccessControlNum; i++){ if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountNand") == 0) - Arm9AccessControl |= 1 << FS_MOUNT_NAND; + Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_NAND; else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountNandRoWrite") == 0) - Arm9AccessControl |= 1 << FS_MOUNT_NAND_RO_WRITE; + Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_NAND_RO_WRITE; else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountTwln") == 0) - Arm9AccessControl |= 1 << FS_MOUNT_TWLN; + Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_TWLN; else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountWnand") == 0) - Arm9AccessControl |= 1 << FS_MOUNT_WNAND; + Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_WNAND; else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"FsMountCardSpi") == 0) - Arm9AccessControl |= 1 << FS_MOUNT_CARD_SPI; + Arm9AccessControl |= 1 << arm9cap_FS_MOUNT_CARD_SPI; else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"UseSdif3") == 0) - Arm9AccessControl |= 1 << USE_SDIF3; + Arm9AccessControl |= 1 << arm9cap_USE_SDIF3; else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"CreateSeed") == 0) - Arm9AccessControl |= 1 << CREATE_SEED; + Arm9AccessControl |= 1 << arm9cap_CREATE_SEED; else if(strcmp(yaml->AccessControlInfo.IoAccessControl[i],"UseCardSpi") == 0) - Arm9AccessControl |= 1 << USE_CARD_SPI; + Arm9AccessControl |= 1 << arm9cap_USE_CARD_SPI; else{ fprintf(stderr,"[EXHEADER ERROR] Invalid IoAccessControl Name: '%s'\n",yaml->AccessControlInfo.IoAccessControl[i]); return EXHDR_BAD_YAML_OPT; @@ -1146,11 +1149,11 @@ int get_ExHeaderARM9AccessControlInfo(exhdr_ARM9AccessControlInfo *arm9, rsf_set for(int i = 0; i < yaml->AccessControlInfo.FileSystemAccessNum; i++){ if(strcmp(yaml->AccessControlInfo.FileSystemAccess[i],"DirectSdmc") == 0) - Arm9AccessControl |= 1 << USE_DIRECT_SDMC; + Arm9AccessControl |= 1 << arm9cap_USE_DIRECT_SDMC; } if(yaml->Option.UseOnSD) - Arm9AccessControl |= 1 << SD_APPLICATION; + Arm9AccessControl |= 1 << arm9cap_SD_APPLICATION; u32_to_u8(arm9->descriptors,Arm9AccessControl,LE); diff --git a/exheader.h b/exheader.h index c49cf0f..21bac0b 100644 --- a/exheader.h +++ b/exheader.h @@ -37,60 +37,60 @@ typedef enum typedef enum { - PERMIT_DEBUG, - FORCE_DEBUG, - CAN_USE_NON_ALPHABET_AND_NUMBER, - CAN_WRITE_SHARED_PAGE, - CAN_USE_PRIVILEGE_PRIORITY, - PERMIT_MAIN_FUNCTION_ARGUMENT, - CAN_SHARE_DEVICE_MEMORY, - RUNNABLE_ON_SLEEP, - SPECIAL_MEMORY_ARRANGE = 12, + othcap_PERMIT_DEBUG, + othcap_FORCE_DEBUG, + othcap_CAN_USE_NON_ALPHABET_AND_NUMBER, + othcap_CAN_WRITE_SHARED_PAGE, + othcap_CAN_USE_PRIVILEGE_PRIORITY, + othcap_PERMIT_MAIN_FUNCTION_ARGUMENT, + othcap_CAN_SHARE_DEVICE_MEMORY, + othcap_RUNNABLE_ON_SLEEP, + othcap_SPECIAL_MEMORY_ARRANGE = 12, } OtherCapabilities_Flagbitmask; typedef enum { - CATEGORY_SYSTEM_APPLICATION, - CATEGORY_HARDWARE_CHECK, - CATEGORY_FILE_SYSTEM_TOOL, - DEBUG, - TWL_CARD_BACKUP, - TWL_NAND_DATA, - BOSS, - DIRECT_SDMC, - CORE, - CTR_NAND_RO, - CTR_NAND_RW, - CTR_NAND_RO_WRITE, - CATEGORY_SYSTEM_SETTINGS, - CARD_BOARD, - EXPORT_IMPORT_IVS, - DIRECT_SDMC_WRITE, - SWITCH_CLEANUP, - SAVE_DATA_MOVE, - SHOP, - SHELL, - CATEGORY_HOME_MENU + fsaccess_CATEGORY_SYSTEM_APPLICATION, + fsaccess_CATEGORY_HARDWARE_CHECK, + fsaccess_CATEGORY_FILE_SYSTEM_TOOL, + fsaccess_DEBUG, + fsaccess_TWL_CARD_BACKUP, + fsaccess_TWL_NAND_DATA, + fsaccess_BOSS, + fsaccess_DIRECT_SDMC, + fsaccess_CORE, + fsaccess_CTR_NAND_RO, + fsaccess_CTR_NAND_RW, + fsaccess_CTR_NAND_RO_WRITE, + fsaccess_CATEGORY_SYSTEM_SETTINGS, + fsaccess_CARD_BOARD, + fsaccess_EXPORT_IMPORT_IVS, + fsaccess_DIRECT_SDMC_WRITE, + fsaccess_SWITCH_CLEANUP, + fsaccess_SAVE_DATA_MOVE, + fsaccess_SHOP, + fsaccess_SHELL, + fsaccess_CATEGORY_HOME_MENU } FileSystemAccess; typedef enum { - NOT_USE_ROMFS, - USE_EXTENDED_SAVEDATA_ACCESS_CONTROL + attribute_NOT_USE_ROMFS, + attribute_USE_EXTENDED_SAVEDATA_ACCESS_CONTROL } AttributeName; typedef enum { - FS_MOUNT_NAND, - FS_MOUNT_NAND_RO_WRITE, - FS_MOUNT_TWLN, - FS_MOUNT_WNAND, - FS_MOUNT_CARD_SPI, - USE_SDIF3, - CREATE_SEED, - USE_CARD_SPI, - SD_APPLICATION, - USE_DIRECT_SDMC + arm9cap_FS_MOUNT_NAND, + arm9cap_FS_MOUNT_NAND_RO_WRITE, + arm9cap_FS_MOUNT_TWLN, + arm9cap_FS_MOUNT_WNAND, + arm9cap_FS_MOUNT_CARD_SPI, + arm9cap_USE_SDIF3, + arm9cap_CREATE_SEED, + arm9cap_USE_CARD_SPI, + arm9cap_SD_APPLICATION, + arm9cap_USE_DIRECT_SDMC } Arm9Capability; typedef struct @@ -131,8 +131,6 @@ typedef struct u8 ExtSaveDataId[8]; u8 SystemSaveDataId[8]; u8 StorageAccessableUniqueIds[8]; - //u8 reserved[7]; - //u8 flag; u8 AccessInfo[7]; u8 OtherAttributes; } exhdr_StorageInfo; diff --git a/lib.h b/lib.h index 8fe882c..eada6a6 100644 --- a/lib.h +++ b/lib.h @@ -30,8 +30,9 @@ #include "keys_retail.h" #else #include "keys_debug.h" -#include "accessdesc_sig.h" #endif +#include "accessdesc_sig.h" + #include "keyset.h" #include "usersettings.h" #include "libyaml/yaml.h" diff --git a/makerom.c b/makerom.c index 0791e45..e1b1cdb 100644 --- a/makerom.c +++ b/makerom.c @@ -12,19 +12,30 @@ int main(int argc, char *argv[]) int result; +#ifdef DEBUG + printf("[DEBUG] Parseing Args\n"); +#endif + // Parsing command args result = ParseArgs(argc,argv,usrset); - if(result < 0) goto fail_finalise; + if(result < 0) goto finish; +#ifdef DEBUG + printf("[DEBUG] Importing Yaml Settings\n"); +#endif + // Import RSF Settings if present result = GetYamlSettings(usrset); - if(result < 0) goto fail_finalise; + if(result < 0) goto finish; // Setup Content 0 if(!usrset->IsBuildingNCCH0){ // Import Content 0 if(usrset->Content0IsNcch){ +#ifdef DEBUG + printf("[DEBUG] Import NCCH0\n"); +#endif FILE *ncch0 = fopen(usrset->ContentPath[0],"rb"); - if(!ncch0) {fprintf(stderr,"[MAKEROM ERROR] Failed to open Content 0: %s\n",usrset->ContentPath[0]); goto fail_finalise;} + if(!ncch0) {fprintf(stderr,"[MAKEROM ERROR] Failed to open Content 0: %s\n",usrset->ContentPath[0]); goto finish;} fclose(ncch0); usrset->Content0.size = GetFileSize_u64(usrset->ContentPath[0]); usrset->Content0.buffer = malloc(usrset->Content0.size); @@ -33,8 +44,11 @@ int main(int argc, char *argv[]) fclose(ncch0); } else if(usrset->Content0IsSrl){ +#ifdef DEBUG + printf("[DEBUG] Import SRL\n"); +#endif FILE *srl = fopen(usrset->SrlPath,"rb"); - if(!srl) {fprintf(stderr,"[MAKEROM ERROR] Failed to open SRL: %s\n",usrset->SrlPath); goto fail_finalise;} + if(!srl) {fprintf(stderr,"[MAKEROM ERROR] Failed to open SRL: %s\n",usrset->SrlPath); goto finish;} fclose(srl); u64 size = GetFileSize_u64(usrset->SrlPath); usrset->Content0.size = align_value(size,0x10); @@ -44,8 +58,11 @@ int main(int argc, char *argv[]) fclose(srl); } else if(usrset->ConvertCci){ +#ifdef DEBUG + printf("[DEBUG] Import CCI\n"); +#endif FILE *cci = fopen(usrset->CciPath,"rb"); - if(!cci) {fprintf(stderr,"[MAKEROM ERROR] Failed to open CCI: %s\n",usrset->CciPath); goto fail_finalise;} + if(!cci) {fprintf(stderr,"[MAKEROM ERROR] Failed to open CCI: %s\n",usrset->CciPath); goto finish;} fclose(cci); usrset->Content0.size = GetFileSize_u64(usrset->CciPath); usrset->Content0.buffer = malloc(usrset->Content0.size); @@ -55,39 +72,55 @@ int main(int argc, char *argv[]) } } else{// Build Content 0 +#ifdef DEBUG + printf("[DEBUG] Build NCCH0\n"); +#endif result = build_NCCH(usrset); if(result < 0) { //fprintf(stderr,"[ERROR] %s generation failed\n",usrset->build_ncch_type == CXI? "CXI" : "CFA"); fprintf(stderr,"[RESULT] Failed to build outfile\n"); - goto fail_finalise; + goto finish; } } // Make CCI if(usrset->out_format == CCI){ +#ifdef DEBUG + printf("[DEBUG] Building CCI\n"); +#endif result = build_CCI(usrset); - if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CCI\n"); goto fail_finalise; } + if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CCI\n"); goto finish; } } // Make CIA else if(usrset->out_format == CIA){ +#ifdef DEBUG + printf("[DEBUG] Building CIA\n"); +#endif result = build_CIA(usrset); - if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CIA\n"); goto fail_finalise; } + if(result < 0) { fprintf(stderr,"[RESULT] Failed to build CIA\n"); goto finish; } } // No Container Raw CXI/CFA else if(usrset->out_format == CXI || usrset->out_format == CFA){ +#ifdef DEBUG + printf("[DEBUG] Outputting NCCH, because No Container\n"); +#endif FILE *ncch_out = fopen(usrset->outfile,"wb"); if(!ncch_out) { fprintf(stderr,"[ERROR] Failed to create '%s'\n",usrset->outfile); fprintf(stderr,"[RESULT] Failed to build '%s'\n",usrset->out_format == CXI? "CXI" : "CFA"); result = FAILED_TO_CREATE_OUTFILE; - goto fail_finalise; + goto finish; } WriteBuffer(usrset->Content0.buffer,usrset->Content0.size,0,ncch_out); fclose(ncch_out); } +finish: +#ifdef DEBUG + printf("[DEBUG] Free Context\n"); +#endif free_UserSettings(usrset); - return 0; -fail_finalise: - free_UserSettings(usrset); +#ifdef DEBUG + printf("[DEBUG] Finished returning (result=%d)\n",result); +#endif return result; } \ No newline at end of file diff --git a/ncch.c b/ncch.c index 832fed8..3a408d2 100644 --- a/ncch.c +++ b/ncch.c @@ -57,16 +57,24 @@ int CheckCXISignature(u8 *Signature, u8 *CXI_HDR, u8 *PubK) int build_NCCH(user_settings *usrset) { int result; - +#ifdef DEBUG + printf("[DEBUG] Init Settings\n"); +#endif // Init Settings ncch_settings *ncchset = malloc(sizeof(ncch_settings)); if(!ncchset) {fprintf(stderr,"[NCCH ERROR] MEM ERROR\n"); return MEM_ERROR;} init_NCCHSettings(ncchset); +#ifdef DEBUG + printf("[DEBUG] Get Settings\n"); +#endif // Get Settings result = get_NCCHSettings(ncchset,usrset); if(result) goto finish; +#ifdef DEBUG + printf("[DEBUG] Build ExeFS Code/PlainRegion\n"); +#endif // Build ExeFs Code Section result = BuildExeFsCode(ncchset); if(result) goto finish; @@ -82,25 +90,46 @@ int build_NCCH(user_settings *usrset) memdump(stdout,"Code Hash: ",hash,0x20); #endif +#ifdef DEBUG + printf("[DEBUG] Build Exheader\n"); +#endif // Build ExHeader result = BuildExHeader(ncchset); if(result) goto finish; - + +#ifdef DEBUG + printf("[DEBUG] Exefs\n"); +#endif // Build ExeFs/RomFs result = BuildExeFs(ncchset); if(result) goto finish; +#ifdef DEBUG + printf("[DEBUG] Build Romfs\n"); +#endif result = BuildRomFs(ncchset); if(result) goto finish; // Final Steps +#ifdef DEBUG + printf("[DEBUG] Build common header\n"); +#endif result = BuildCommonHeader(ncchset); if(result) goto finish; +#ifdef DEBUG + printf("[DEBUG] Encrypt Sections\n"); +#endif result = EncryptNCCHSections(ncchset); if(result) goto finish; +#ifdef DEBUG + printf("[DEBUG] Write Sections\n"); +#endif result = WriteNCCHSectionsToBuffer(ncchset); if(result) goto finish; finish: +#ifdef DEBUG + printf("[DEBUG] Finish Building\n"); +#endif if(result) fprintf(stderr,"[NCCH ERROR] NCCH Build Process Failed\n"); free_NCCHSettings(ncchset); return result; diff --git a/usersettings.c b/usersettings.c index ec512db..5b942a8 100644 --- a/usersettings.c +++ b/usersettings.c @@ -555,6 +555,111 @@ void init_UserSettings(user_settings *usr_settings) memset(usr_settings,0,sizeof(user_settings)); } +void free_YamlSettings(yaml_settings *set) +{ + // Option + free(set->Option.PageSize); + + // RomFs + free(set->RomFs.HostRoot); + free_StringCollection(set->RomFs.DefaultReject,set->RomFs.DefaultRejectNum); + free_StringCollection(set->RomFs.Reject,set->RomFs.RejectNum); + free_StringCollection(set->RomFs.Include,set->RomFs.IncludeNum); + free_StringCollection(set->RomFs.File,set->RomFs.FileNum); + + // ExeFs + free(set->ExeFs.StackSize); + free_StringCollection(set->ExeFs.Text,set->ExeFs.TextNum); + free_StringCollection(set->ExeFs.ReadOnly,set->ExeFs.ReadOnlyNum); + free_StringCollection(set->ExeFs.ReadWrite,set->ExeFs.ReadWriteNum); + + // Plain Region + free_StringCollection(set->PlainRegion,set->PlainRegionNum); + + // BasicInfo + free(set->BasicInfo.Title); + free(set->BasicInfo.CompanyCode); + free(set->BasicInfo.ProductCode); + free(set->BasicInfo.ContentType); + free(set->BasicInfo.Logo); + free(set->BasicInfo.RemasterVersion); + + // TitleInfo + free(set->TitleInfo.Category); + free(set->TitleInfo.ChildIndex); + free(set->TitleInfo.ContentsIndex); + free(set->TitleInfo.DataTitleIndex); + free(set->TitleInfo.DemoIndex); + free(set->TitleInfo.Version); + free(set->TitleInfo.TargetCategory); + free(set->TitleInfo.UniqueId); + free_StringCollection(set->TitleInfo.CategoryFlags,set->TitleInfo.CategoryFlagsNum); + + // CardInfo + free(set->CardInfo.BackupWriteWaitTime); + free(set->CardInfo.CardDevice); + free(set->CardInfo.CardType); + free(set->CardInfo.CryptoType); + free(set->CardInfo.MediaSize); + free(set->CardInfo.MediaType); + free(set->CardInfo.WritableAddress); + + // SystemInfo + free(set->SystemInfo.JumpId); + free(set->SystemInfo.SaveDataSize); + + // Dependency + free_StringCollection(set->Dependency,set->DependencyNum); + + // ARM11SystemLocalCapabilities + free(set->ARM11SystemLocalCapabilities.AppType); + free(set->ARM11SystemLocalCapabilities.MaxCpu); + free(set->ARM11SystemLocalCapabilities.CoreVersion); + free(set->ARM11SystemLocalCapabilities.IdealProcessor); + free(set->ARM11SystemLocalCapabilities.Priority); + free(set->ARM11SystemLocalCapabilities.AffinityMask); + free(set->ARM11SystemLocalCapabilities.SystemMode); + free(set->ARM11SystemLocalCapabilities.ResourceLimitCategory); + + free_StringCollection(set->ARM11SystemLocalCapabilities.ServiceAccessControl,set->ARM11SystemLocalCapabilities.ServiceAccessControlNum); + + // ARM11KernelCapabilities + free(set->ARM11KernelCapabilities.MemoryType); + free(set->ARM11KernelCapabilities.HandleTableSize); + free(set->ARM11KernelCapabilities.ReleaseKernelMajor); + free(set->ARM11KernelCapabilities.ReleaseKernelMinor); + free(set->ARM11KernelCapabilities.StorageInfo.SystemSaveDataId1); + free(set->ARM11KernelCapabilities.StorageInfo.SystemSaveDataId2); + free(set->ARM11KernelCapabilities.StorageInfo.OtherUserSaveDataId1); + free(set->ARM11KernelCapabilities.StorageInfo.OtherUserSaveDataId2); + free(set->ARM11KernelCapabilities.StorageInfo.OtherUserSaveDataId3); + free(set->ARM11KernelCapabilities.StorageInfo.ExtSaveDataId); + + free_StringCollection(set->ARM11KernelCapabilities.MemoryMapping,set->ARM11KernelCapabilities.MemoryMappingNum); + free_StringCollection(set->ARM11KernelCapabilities.IORegisterMapping,set->ARM11KernelCapabilities.IORegisterMappingNum); + free_StringCollection(set->ARM11KernelCapabilities.FileSystemAccess,set->ARM11KernelCapabilities.FileSystemAccessNum); + free_StringCollection(set->ARM11KernelCapabilities.InterruptNumbers,set->ARM11KernelCapabilities.InterruptNumbersNum); + free_StringCollection(set->ARM11KernelCapabilities.SystemCallAccess,set->ARM11KernelCapabilities.SystemCallAccessNum); + free_StringCollection(set->ARM11KernelCapabilities.StorageInfo.AccessibleSaveDataIds,set->ARM11KernelCapabilities.StorageInfo.AccessibleSaveDataIdsNum); + + // ARM9AccessControlInfo + free(set->ARM9AccessControlInfo.DescVersion); + free_StringCollection(set->ARM9AccessControlInfo.IoAccessControl,set->ARM9AccessControlInfo.IoAccessControlNum); + + // CommonHeaderKey + free(set->CommonHeaderKey.D); + free(set->CommonHeaderKey.Modulus); + free(set->CommonHeaderKey.Exponent); + free(set->CommonHeaderKey.AccCtlDescSign); + free(set->CommonHeaderKey.AccCtlDescBin); +} + +void free_StringCollection(char **Collection, u32 StringNum) +{ + for(int i = 0; i < StringNum; i++) + free(Collection[i]); + free(Collection); +} void free_RsfSettings(rsf_settings *set) { @@ -805,6 +910,7 @@ void DisplayHelp(char *app_name) //printf(" -DNAME=VALUE Substitute values in Spec files\n"); printf("NCCH Options:\n"); printf(" -ncch0 NCCH Format (cxi|cfa)\n"); + printf(" -desc DESC File\n"); printf(" -elf ELF File\n"); printf(" -icon Icon File\n"); printf(" -banner Banner File\n"); diff --git a/usersettings.h b/usersettings.h index 9e15b24..b7e58ea 100644 --- a/usersettings.h +++ b/usersettings.h @@ -39,7 +39,7 @@ typedef struct { struct{ // Booleans - int NoPadding; + int NoPadding; // DELETE int AllowUnalignedSection; int EnableCrypt; int EnableCompress; @@ -136,8 +136,8 @@ typedef struct char *MediaSize; char *ContentType; char *Logo; - char *BackupMemoryType; - char *InitialCode; + char *BackupMemoryType;// Delete + char *InitialCode;// Delete } BasicInfo; struct{ @@ -213,6 +213,183 @@ typedef struct } CommonHeaderKey; } rsf_settings; +typedef struct +{ + struct{ + // Booleans + int EnableCrypt; + int EnableCompress; + int FreeProductCode; + int UseOnSD; + + // Strings + char *PageSize; + } Option; + + struct{ + // Strings + char *HostRoot; + + // String Collections + u32 DefaultRejectNum; + char **DefaultReject; + u32 RejectNum; + char **Reject; + u32 IncludeNum; + char **Include; + u32 FileNum; + char **File; + } RomFs; + + struct{ + char *StackSize; + + u32 TextNum; + char **Text; + u32 ReadOnlyNum; + char **ReadOnly; + u32 ReadWriteNum; + char **ReadWrite; + } ExeFs; + + u32 PlainRegionNum; + char **PlainRegion; + + struct{ + // Strings + char *Title; + char *CompanyCode; + char *ProductCode; + char *ContentType; + char *Logo; + char *RemasterVersion; + } BasicInfo; + + struct{ + // Strings + char *Category; + char *UniqueId; + char *Version; + char *ContentsIndex; + char *DataTitleIndex; + char *ChildIndex; + char *DemoIndex; + char *TargetCategory; + + // String Collections + u32 CategoryFlagsNum; + char **CategoryFlags; + } TitleInfo; + + struct{ + // Booleans + int MediaFootPadding; + + // Strings + char *WritableAddress; + char *CardType; + char *CryptoType; + char *CardDevice; + char *MediaType; + char *BackupWriteWaitTime; + char *MediaSize; + } CardInfo; + + struct{ + char *SaveDataSize; + char *JumpId; + } SystemInfo; + + u32 DependencyNum; + char **Dependency; + + struct{ + // Strings + char *AppType; + char *MaxCpu; + char *CoreVersion; + char *IdealProcessor; + char *Priority; + char *AffinityMask; + char *SystemMode; + char *ResourceLimitCategory; + + // String Collections + u32 ServiceAccessControlNum; + char **ServiceAccessControl; + } ARM11SystemLocalCapabilities; + + struct{ + struct{ // Set from RSF + // Booleans + bool UseOtherVariationSaveData; + bool UseExtSaveData; + bool UseExtendedSaveDataAccessControl; + + // Strings + char *SystemSaveDataId1; + char *SystemSaveDataId2; + char *OtherUserSaveDataId1; + char *OtherUserSaveDataId2; + char *OtherUserSaveDataId3; + char *ExtSaveDataId; + + // String Collections + u32 AccessibleSaveDataIdsNum; + char **AccessibleSaveDataIds; + } StorageInfo; + + // Booleans + int DisableDebug; + int EnableForceDebug; + int CanWriteSharedPage; + int CanUsePrivilegedPriority; + int CanUseNonAlphabetAndNumber; + int PermitMainFunctionArgument; + int CanShareDeviceMemory; + int RunnableOnSleep; + int SpecialMemoryArrange; + + // Strings + char *MemoryType; + char *HandleTableSize; + char *ReleaseKernelMajor; + char *ReleaseKernelMinor; + + // String Collections + u32 MemoryMappingNum; + char **MemoryMapping; + u32 IORegisterMappingNum; + char **IORegisterMapping; + u32 FileSystemAccessNum; + char **FileSystemAccess; + u32 InterruptNumbersNum; + char **InterruptNumbers; + u32 SystemCallAccessNum; + char **SystemCallAccess; + } ARM11KernelCapabilities; + + struct{ + // Strings + char *DescVersion; + + // String Collections + u32 IoAccessControlNum; + char **IoAccessControl; + } ARM9AccessControlInfo; + + struct{ + bool Found; + + char *D; + char *Modulus; + char *Exponent; + + char *AccCtlDescSign; + char *AccCtlDescBin; + } CommonHeaderKey; +} yaml_settings; + typedef struct { // General Settings @@ -274,3 +451,7 @@ void ReadYAMLtest(char *filepath); void InvalidateRSFBooleans(rsf_settings *rsf_set); void free_RsfSettings(rsf_settings *set); + +void SetYAMLBooleanDefaults(yaml_settings *yaml); +void free_YamlSettings(yaml_settings *set); +void free_StringCollection(char **Collection, u32 StringNum);