Line 1: |
Line 1: |
− | For the content of the NCA FS which can be [[Filesystem_services|mounted]], see [[NCA_Content_FS|here]].
| + | This is the metadata file that ends in <code>".cnmt{.nca}"</code> or <code>"meta0.ncd"</code>. This seems to replace the TMD format. |
| | | |
− | For the format of the actual NCA, see [[NCA_Format|here]].
| + | There's at least 9 different filenames used for ".cnmt": |
− | | |
− | = Metadata file =
| |
− | This is the file that ends in <code>".cnmt{.nca}"</code> or <code>"meta0.ncd"</code>. This seems to replace the TMD format.
| |
− | | |
− | There's at least 7 different filenames used for ".cnmt": | |
| * "Application_{lower-case hex titleID}.cnmt" | | * "Application_{lower-case hex titleID}.cnmt" |
| * "Patch_{lower-case hex titleID}.cnmt" | | * "Patch_{lower-case hex titleID}.cnmt" |
| + | * "AddOnContent_{lower-case hex titleID}.cnmt" |
| * "SystemUpdate_{hex titleID}.cnmt" | | * "SystemUpdate_{hex titleID}.cnmt" |
| * "SystemData_{lower-case hex titleID}.cnmt" | | * "SystemData_{lower-case hex titleID}.cnmt" |
Line 14: |
Line 10: |
| * "BootImagePackage_{lower-case hex titleID}.cnmt" | | * "BootImagePackage_{lower-case hex titleID}.cnmt" |
| * "BootImagePackageSafe_{lower-case hex titleID}.cnmt" | | * "BootImagePackageSafe_{lower-case hex titleID}.cnmt" |
| + | * "Delta_{lower-case hex titleID}.cnmt" |
| | | |
− | It starts with a header:
| + | == Header == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 23: |
Line 20: |
| |- | | |- |
| | 0x0 | | | 0x0 |
− | | 8 | + | | 0x8 |
| | Title ID | | | Title ID |
| |- | | |- |
| | 0x8 | | | 0x8 |
− | | 4 | + | | 0x4 |
− | | u32 [[Title_list|title-version]] | + | | Version |
| |- | | |- |
| | 0xC | | | 0xC |
− | | 1 | + | | 0x1 |
− | | Type (see [[Content_Manager_services#Title_Types|Title Types]]) | + | | [[NCM_services#Title_Types|Meta Type]] |
| |- | | |- |
| | 0xD | | | 0xD |
− | | 1 | + | | 0x1 |
− | | | + | | Unused |
| |- | | |- |
| | 0xE | | | 0xE |
− | | 2 | + | | 0x2 |
− | | Offset to table relative to the end of this 0x20-byte header. | + | | Extended Header Size |
| |- | | |- |
| | 0x10 | | | 0x10 |
− | | 2 | + | | 0x2 |
− | | Number of content entries | + | | Content Count |
| |- | | |- |
| | 0x12 | | | 0x12 |
− | | 2 | + | | 0x2 |
− | | Number of meta entries | + | | Content Meta Count |
| |- | | |- |
| | 0x14 | | | 0x14 |
− | | 12 | + | | 0x1 |
− | | | + | | Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless) |
| + | |- |
| + | | 0x15 |
| + | | 0x3 |
| + | | Unused |
| + | |- |
| + | | 0x18 |
| + | | 0x4 |
| + | | Required Download System Version |
| + | |- |
| + | | 0x1C |
| + | | 0x4 |
| + | | Unused |
| |} | | |} |
| | | |
− | With SystemUpdate, the 4-bytes at offset 0xE are zero, with the entry-count field located at offset 0x12 instead(header size is the same).
| + | == SystemUpdate Extended Header == |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | Extended Data Size |
| + | |} |
| | | |
− | An optional header can follow, depending on the title type.
| + | == Application Extended Header == |
− | | + | {| class="wikitable" border="1" |
− | At the end of the file following the entries is a 0x20-byte block, presumably a hash.
| + | |- |
− | | + | ! Offset |
− | With Patch-format, there's additional data after the end of the entries specified in the header and before the ending hash.
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Patch ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Required System Version |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Unused |
| + | |} |
| | | |
− | == Application header == | + | == Patch Extended Header == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 70: |
Line 103: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x20 | + | | 0x0 |
− | | 8 | + | | 0x8 |
− | | Patch Title ID | + | | Application ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Required System Version |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Extended Data Size |
| |- | | |- |
− | | 0x28 | + | | 0x10 |
− | | 8 | + | | 0x8 |
− | | Minimum system version | + | | Unused |
| |} | | |} |
| | | |
− | == Patch header == | + | == AddOnContent Extended Header == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 86: |
Line 127: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x20 | + | | 0x0 |
− | | 8 | + | | 0x8 |
− | | Original title ID | + | | Application ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Required Application Version |
| |- | | |- |
− | | 0x28 | + | | 0xC |
− | | 8 | + | | 0x4 |
− | | Minimum system version | + | | Unused |
| |} | | |} |
| | | |
− | == Add-on content header == | + | == Delta Extended Header == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 102: |
Line 147: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x20 | + | | 0x0 |
− | | 8 | + | | 0x8 |
− | | Application title ID | + | | Application ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Extended Data Size |
| |- | | |- |
− | | 0x28 | + | | 0xC |
− | | 8 | + | | 0x4 |
− | | Minimum application version | + | | Unused |
| |} | | |} |
| | | |
− | == Content records == | + | == Content Records == |
− | | |
− | Each entry is 0x38 bytes:
| |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 122: |
Line 169: |
| |- | | |- |
| | 0x0 | | | 0x0 |
− | | 32 | + | | 0x20 |
| | Hash | | | Hash |
| |- | | |- |
| | 0x20 | | | 0x20 |
− | | 16 | + | | 0x10 |
− | | NcaId [same as first 16-bytes of hash] | + | | Content ID |
| |- | | |- |
| | 0x30 | | | 0x30 |
− | | 6 | + | | 0x6 |
− | | Size, same as the output from [[Content_Manager_services#GetEntrySize]]. | + | | Size |
| |- | | |- |
| | 0x36 | | | 0x36 |
− | | 1 | + | | 0x1 |
− | | Type (0=meta, 1=program, 2=data, 3=control, 4=offline-manual [[Internet_Browser|html]], 5=legal [[Internet_Browser|html]], 6=[[NCA_Format|game-update]] RomFS patches?) | + | | Content Type (0=Meta, 1=Program, 2=Data, 3=Control, 4=[[Internet_Browser|HtmlDocument]], 5=[[Internet_Browser|LegalInformation]], 6=[[NCA_Format|DeltaFragment]]) |
| |- | | |- |
| | 0x37 | | | 0x37 |
− | | 1 | + | | 0x1 |
− | | | + | | Id Offset |
| + | |} |
| + | |
| + | == Content Meta Records == |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Title ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Version |
| + | |- |
| + | | 0xC |
| + | | 0x1 |
| + | | [[NCM_services#Title_Types|Meta Type]] |
| + | |- |
| + | | 0xD |
| + | | 0x1 |
| + | | Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless) |
| + | |- |
| + | | 0xE |
| + | | 0x2 |
| + | | Unused |
| |} | | |} |
| | | |
− | == Meta records ==
| + | This is used for SystemUpdate, see here: [[NCM_services#ReadEntryMetaRecords]]. |
| | | |
− | Each entry is 0x10 bytes:
| + | == SystemUpdate Extended Data == |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 153: |
Line 229: |
| |- | | |- |
| | 0x0 | | | 0x0 |
− | | 8 | + | | 0x4 |
− | | Title ID | + | | Version |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Variation Count |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Firmware Variation |
| + | |- |
| + | | 0xC |
| + | | 0x1C * Variation Count |
| + | | Unused |
| + | |} |
| + | |
| + | == Patch Extended Data == |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | History Count |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Delta History Count |
| |- | | |- |
| | 0x8 | | | 0x8 |
− | | 4 | + | | 0x4 |
− | | Title version | + | | Delta Count |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Fragment Set Count |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | History Content Count |
| + | |- |
| + | | 0x14 |
| + | | 0x4 |
| + | | Delta Content Count |
| + | |- |
| + | | 0x18 |
| + | | 0x4 |
| + | | Unused |
| + | |- |
| + | | 0x1C |
| + | | 0x38 * History Count |
| + | | [[CNMT#History_Header|History Headers]] |
| + | |- |
| + | | |
| + | | 0x28 * Delta History Count |
| + | | [[CNMT#Delta_History|Delta Histories]] |
| + | |- |
| + | | |
| + | | 0x28 * Delta Count |
| + | | [[CNMT#Delta_Header|Delta Headers]] |
| + | |- |
| + | | |
| + | | 0x34 * Fragment Set Count |
| + | | [[CNMT#Fragment_Set|Fragment Sets]] |
| + | |- |
| + | | |
| + | | 0x18 * History Content Count |
| + | | [[CNMT#Content_Records|History Content Records (Content Records without the Hash entry)]] |
| + | |- |
| + | | |
| + | | 0x38 * Delta Content Count |
| + | | [[CNMT#Content_Records|Delta Content Records]] |
| + | |- |
| + | | |
| + | | 0x4 * Fragment Indicator Count (Fragment Set) |
| + | | [[CNMT#Fragment_Indicator|Fragment Indicators]] |
| + | |} |
| + | |
| + | === History Header === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x10 |
| + | | [[CNMT#Content_Meta_Records|Content Meta Record]] |
| |- | | |- |
| | 0xC | | | 0xC |
− | | 1 | + | | 0x1 |
− | | Type (see [[Content_Manager_services#Title_Types|Title Types]]) | + | | [[NCM_services#Title_Types|Meta Type]] |
| |- | | |- |
| | 0xD | | | 0xD |
− | | 1 | + | | 0x1 |
− | | ? bit0 set = don't install? | + | | Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless) |
| |- | | |- |
| | 0xE | | | 0xE |
− | | 2 | + | | 0x2 |
− | | Unused? | + | | Unused |
| + | |- |
| + | | 0x10 |
| + | | 0x20 |
| + | | Digest |
| + | |- |
| + | | 0x30 |
| + | | 0x2 |
| + | | Content Info Count |
| + | |- |
| + | | 0x32 |
| + | | 0x6 |
| + | | Unused |
| + | |} |
| + | |
| + | === Delta History === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Source Patch ID |
| + | |- |
| + | | 0x8 |
| + | | 0x8 |
| + | | Destination Patch ID |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | Source Version |
| + | |- |
| + | | 0x14 |
| + | | 0x4 |
| + | | Destination Version |
| + | |- |
| + | | 0x18 |
| + | | 0x8 |
| + | | Download Size |
| + | |- |
| + | | 0x20 |
| + | | 0x8 |
| + | | Unused |
| |} | | |} |
| | | |
− | This is used for SystemUpdate, see here: [[Content_Manager_services#GetUpdateTitleList]].
| + | === Delta Header === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Source Patch ID |
| + | |- |
| + | | 0x8 |
| + | | 8 |
| + | | Destination Patch ID |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | Source Version |
| + | |- |
| + | | 0x14 |
| + | | 0x4 |
| + | | Destination Version |
| + | |- |
| + | | 0x18 |
| + | | 0x2 |
| + | | Fragment Set Count |
| + | |- |
| + | | 0x1A |
| + | | 0x6 |
| + | | Unused |
| + | |- |
| + | | 0x20 |
| + | | 0x2 |
| + | | Content Info Count |
| + | |- |
| + | | 0x22 |
| + | | 0x6 |
| + | | Unused |
| + | |} |
| + | |
| + | === Fragment Set === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x10 |
| + | | Source Content ID |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Destination Content ID |
| + | |- |
| + | | 0x20 |
| + | | 0x6 |
| + | | Source Size |
| + | |- |
| + | | 0x26 |
| + | | 0x6 |
| + | | Destination Size |
| + | |- |
| + | | 0x2C |
| + | | 0x2 |
| + | | Fragment Indicator Count |
| + | |- |
| + | | 0x2E |
| + | | 0x1 |
| + | | Content Type (0=Meta, 1=Program, 2=Data, 3=Control, 4=[[Internet_Browser|HtmlDocument]], 5=[[Internet_Browser|LegalInformation]], 6=[[NCA_Format|DeltaFragment]]) |
| + | |- |
| + | | 0x2F |
| + | | 0x1 |
| + | | Update Type (0=ApplyAsDelta, 1=Overwrite, 2=Create) |
| + | |- |
| + | | 0x30 |
| + | | 0x4 |
| + | | Unused |
| + | |} |
| + | |
| + | === Fragment Indicator === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x2 |
| + | | Content Info Index |
| + | |- |
| + | | 0x2 |
| + | | 0x2 |
| + | | Fragment Index |
| + | |} |
| + | |
| + | == Delta Extended Data == |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Source Patch ID |
| + | |- |
| + | | 0x8 |
| + | | 0x8 |
| + | | Destination Patch ID |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | Source Version |
| + | |- |
| + | | 0x14 |
| + | | 0x4 |
| + | | Destination Version |
| + | |- |
| + | | 0x18 |
| + | | 0x2 |
| + | | Fragment Set Count |
| + | |- |
| + | | 0x1A |
| + | | 0x6 |
| + | | Unused |
| + | |- |
| + | | 0x20 |
| + | | 0x34 * Fragment Set Count |
| + | | [[CNMT#Fragment_Set|Fragment Sets]] |
| + | |- |
| + | | |
| + | | 0x4 * Fragment Indicator Count (Fragment Set) |
| + | | [[CNMT#Fragment_Indicator|Fragment Indicators]] |
| + | |} |
| + | |
| + | == Digest == |
| + | |
| + | Always found at the end of the file. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x20 |
| + | | Digest |
| + | |} |