Line 1: |
Line 1: |
− | = Metadata file =
| + | This is the metadata file that ends in <code>".cnmt{.nca}"</code> or <code>"meta0.ncd"</code>. This seems to replace the TMD format. |
− | This is the file that ends in <code>".cnmt{.nca}"</code> or <code>"meta0.ncd"</code>. | |
| | | |
− | It starts with a header:
| + | The official name for CNMT is "PackagedContentMeta". |
| + | |
| + | == Header == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 10: |
Line 11: |
| |- | | |- |
| | 0x0 | | | 0x0 |
− | | 8 | + | | 0x8 |
− | | Title ID | + | | ID |
| |- | | |- |
| | 0x8 | | | 0x8 |
− | | 4 | + | | 0x4 |
− | | | + | | Version |
| |- | | |- |
| | 0xC | | | 0xC |
− | | 1 | + | | 0x1 |
− | | Type (see [[Content_Manager_services#Title_Types|Title Types]]) | + | | [[NCM_services#ContentMetaType|Content Meta Type]] |
| |- | | |- |
| | 0xD | | | 0xD |
− | | 1 | + | | 0x1 |
− | | | + | | Reserved |
| |- | | |- |
| | 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 entries | + | | Content Count |
| |- | | |- |
| | 0x12 | | | 0x12 |
− | | 14 | + | | 0x2 |
− | | | + | | Content Meta Count |
| + | |- |
| + | | 0x14 |
| + | | 0x1 |
| + | | Content Meta Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless) |
| + | |- |
| + | | 0x15 |
| + | | 0x3 |
| + | | Reserved |
| + | |- |
| + | | 0x18 |
| + | | 0x4 |
| + | | Required Download System Version |
| + | |- |
| + | | 0x1C |
| + | | 0x4 |
| + | | Reserved |
| + | |} |
| + | |
| + | == SystemUpdate Extended Header == |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | Extended Data Size |
| + | |} |
| + | |
| + | == Application Extended Header == |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Patch ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Required System Version |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Required Application Version |
| + | |} |
| + | |
| + | == Patch Extended Header == |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Application ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Required System Version |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Extended Data Size |
| + | |- |
| + | | 0x10 |
| + | | 0x8 |
| + | | Reserved |
| |} | | |} |
| | | |
− | An optional header can follow, depending on the title type.
| + | == AddOnContent Extended Header == |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Application ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Required Application Version |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Reserved |
| + | |} |
| | | |
− | At the end of the file following the entries is a 0x20-byte block, presumably a hash.
| + | == Delta Extended Header == |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Application ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Extended Data Size |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Reserved |
| + | |} |
| | | |
− | With update-format, there's additional data after the end of the entries specified in the header and before the ending hash.
| + | == Packaged Content Info == |
| | | |
− | == Application header ==
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 50: |
Line 158: |
| ! Size | | ! Size |
| ! Description | | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x20 |
| + | | Hash (SHA256 of the referenced content) |
| |- | | |- |
| | 0x20 | | | 0x20 |
− | | 8 | + | | 0x10 |
− | | Patch title ID | + | | Content ID |
| + | |- |
| + | | 0x30 |
| + | | 0x6 |
| + | | Size |
| + | |- |
| + | | 0x36 |
| + | | 0x1 |
| + | | Content Type (0=Meta, 1=Program, 2=Data, 3=Control, 4=[[Internet_Browser|HtmlDocument]], 5=[[Internet_Browser|LegalInformation]], 6=[[NCA_Format|DeltaFragment]]) |
| + | |- |
| + | | 0x37 |
| + | | 0x1 |
| + | | ID Offset |
| + | |} |
| + | |
| + | == Content Meta Info == |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Version |
| + | |- |
| + | | 0xC |
| + | | 0x1 |
| + | | [[NCM_services#Title_Types|Content Meta Type]] |
| + | |- |
| + | | 0xD |
| + | | 0x1 |
| + | | Content Meta Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless) |
| + | |- |
| + | | 0xE |
| + | | 0x2 |
| + | | Reserved |
| + | |} |
| + | |
| + | This is used for SystemUpdate, see here: [[NCM_services#ReadEntryMetaRecords]]. |
| + | |
| + | == SystemUpdate Extended Data == |
| + | |
| + | If the Version field is 1, the format is: |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | Version |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Variation Count |
| + | |- |
| + | | 0x8 |
| + | | 0x20 * Variation Count |
| + | | [[CNMT#Firmware_Variation_Info_(Version_1)|Firmware Variation Info (Version 1)]] |
| + | |} |
| + | |
| + | If the Version field is 2, the format is: |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | Version |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Variation Count |
| + | |- |
| + | | 0x8 |
| + | | 0x4 * Variation Count |
| + | | Firmware Variation ID |
| + | |- |
| + | | |
| + | | 0x20 * Variation Count |
| + | | [[CNMT#Firmware_Variation_Info_(Version_2)|Firmware Variation Info (Version 2)]] |
| + | |- |
| + | | |
| + | | 0x10 * Meta Count (From [[CNMT#Firmware_Variation_Info_(Version_2)|Firmware Variation Info (Version 2)]]) |
| + | | [[CNMT#Content_Meta_Info|Content Meta Info]] (If Refer To Base is False) |
| + | |} |
| + | |
| + | === Firmware Variation Info (Version 1) === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | Firmware Variation ID |
| + | |- |
| + | | 0x4 |
| + | | 0x1C |
| + | | Reserved |
| + | |} |
| + | |
| + | === Firmware Variation Info (Version 2) === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Refer To Base (0=False, 1=True) |
| + | |- |
| + | | 0x1 |
| + | | 0x3 |
| + | | Reserved |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Meta Count |
| + | |- |
| + | | 0x8 |
| + | | 0x18 |
| + | | Reserved |
| + | |} |
| + | |
| + | == Patch Extended Data == |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x4 |
| + | | History Count |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Delta History Count |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Delta Count |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Fragment Set Count |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | History Content Count |
| + | |- |
| + | | 0x14 |
| + | | 0x4 |
| + | | Delta Content Count |
| + | |- |
| + | | 0x18 |
| + | | 0x4 |
| + | | Reserved |
| + | |- |
| + | | 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#Packaged_Content_Info|History Content Info]] (Packaged Content Info without the Hash entry) |
| + | |- |
| + | | |
| + | | 0x38 * Delta Content Count |
| + | | [[CNMT#Packaged_Content_Info|Delta Packaged Content Info]] |
| |- | | |- |
− | | 0x28
| |
− | | 8
| |
| | | | | |
| + | | 0x4 * Fragment Indicator Count (From [[CNMT#Fragment_Set|Fragment Sets]]) |
| + | | [[CNMT#Fragment_Indicator|Fragment Indicators]] |
| |} | | |} |
| | | |
− | == Patch header == | + | === History Header === |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 67: |
Line 376: |
| ! Description | | ! Description |
| |- | | |- |
| + | | 0x0 |
| + | | 0x10 |
| + | | Content Meta Key (Slightly different Content Meta Info) |
| + | |- |
| + | | 0x10 |
| | 0x20 | | | 0x20 |
− | | 8 | + | | Digest |
− | | Original title ID | + | |- |
| + | | 0x30 |
| + | | 0x2 |
| + | | Content Info Count |
| |- | | |- |
− | | 0x28 | + | | 0x32 |
− | | 8 | + | | 0x6 |
− | | | + | | Reserved |
| |} | | |} |
| | | |
− | == Add-on content header == | + | === Delta History === |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 82: |
Line 400: |
| ! Size | | ! Size |
| ! Description | | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Source Patch ID |
| + | |- |
| + | | 0x8 |
| + | | 0x8 |
| + | | Destination Patch ID |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | Source Version |
| + | |- |
| + | | 0x14 |
| + | | 0x4 |
| + | | Destination Version |
| + | |- |
| + | | 0x18 |
| + | | 0x8 |
| + | | Download Size |
| |- | | |- |
| | 0x20 | | | 0x20 |
| + | | 0x8 |
| + | | Reserved |
| + | |} |
| + | |
| + | === Delta Header === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Source Patch ID |
| + | |- |
| + | | 0x8 |
| | 8 | | | 8 |
− | | Application title ID | + | | Destination Patch ID |
| + | |- |
| + | | 0x10 |
| + | | 0x4 |
| + | | Source Version |
| |- | | |- |
− | | 0x28 | + | | 0x14 |
− | | 8 | + | | 0x4 |
− | | | + | | Destination Version |
| + | |- |
| + | | 0x18 |
| + | | 0x2 |
| + | | Fragment Set Count |
| + | |- |
| + | | 0x1A |
| + | | 0x6 |
| + | | Reserved |
| + | |- |
| + | | 0x20 |
| + | | 0x2 |
| + | | Content Info Count |
| + | |- |
| + | | 0x22 |
| + | | 0x6 |
| + | | Reserved |
| |} | | |} |
| | | |
− | == Content records == | + | === Fragment Set === |
− | | |
− | Each entry is 0x38 bytes:
| |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 103: |
Line 476: |
| |- | | |- |
| | 0x0 | | | 0x0 |
− | | 32 | + | | 0x10 |
− | | Hash | + | | Source Content ID |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Destination Content ID |
| |- | | |- |
| | 0x20 | | | 0x20 |
− | | 16 | + | | 0x6 |
− | | NcaId [same as first 16-bytes of hash] | + | | Source Size |
| + | |- |
| + | | 0x26 |
| + | | 0x6 |
| + | | Destination Size |
| + | |- |
| + | | 0x2C |
| + | | 0x2 |
| + | | Fragment Indicator Count |
| + | |- |
| + | | 0x2E |
| + | | 0x1 |
| + | | Fragment Target 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 | | | 0x30 |
− | | 6 | + | | 0x4 |
− | | Size, same as the output from [[Content_Manager_services#GetEntrySize]]. | + | | Reserved |
| + | |} |
| + | |
| + | === Fragment Indicator === |
| + | |
| + | {| class="wikitable" border="1" |
| |- | | |- |
− | | 0x36 | + | ! Offset |
− | | 1 | + | ! Size |
− | | Type (0=meta, 1=program, 2=data, 3=control, 4=offline-manual [[Internet_Browser|html]], 5=legal [[Internet_Browser|html]]) | + | ! 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 |
| + | | Reserved |
| + | |- |
| + | | 0x20 |
| + | | 0x34 * Fragment Set Count |
| + | | [[CNMT#Fragment_Set|Fragment Sets]] |
| |- | | |- |
− | | 0x37
| |
− | | 1
| |
| | | | | |
| + | | 0x4 * Fragment Indicator Count (From [[CNMT#Fragment_Set|Fragment Sets]]) |
| + | | [[CNMT#Fragment_Indicator|Fragment Indicators]] |
| + | |} |
| + | |
| + | == Digest == |
| + | |
| + | Always found at the end of the file. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x20 |
| + | | Digest |
| |} | | |} |