makerom v0.3-alternate

This commit is contained in:
3DSGuy
2014-02-22 09:14:00 +08:00
parent 3c9fffd56a
commit 84c8e37b48
11 changed files with 679 additions and 218 deletions
+123 -108
View File
@@ -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
+76
View File
@@ -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:
+2 -2
View File
@@ -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
+23 -4
View File
@@ -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);
+45 -42
View File
@@ -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);
+42 -44
View File
@@ -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;
+2 -1
View File
@@ -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"
+45 -12
View File
@@ -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;
}
+31 -2
View File
@@ -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;
+106
View File
@@ -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> NCCH Format (cxi|cfa)\n");
printf(" -desc <desc path> DESC File\n");
printf(" -elf <elf path> ELF File\n");
printf(" -icon <icon path> Icon File\n");
printf(" -banner <banner path> Banner File\n");
+184 -3
View File
@@ -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);