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 an 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? | + | | Program 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 | + | | Extended Header Size |
| + | |- |
| + | | 0x10 |
| + | | 0x2 |
| + | | Content Count |
| + | |- |
| + | | 0x12 |
| + | | 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 | | | 0x10 |
− | | 2 | + | | 0x8 |
− | | Number of entries | + | | Reserved |
| |} | | |} |
| | | |
− | Each entry is 0x38 bytes:
| + | == AddOnContent Extended Header == |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Application ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Required Application Version |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Reserved |
| + | |} |
| | | |
| + | == Delta Extended Header == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 43: |
Line 139: |
| |- | | |- |
| | 0x0 | | | 0x0 |
− | | 32 | + | | 0x8 |
− | | | + | | Application ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Extended Data Size |
| + | |- |
| + | | 0xC |
| + | | 0x4 |
| + | | Reserved |
| + | |} |
| + | |
| + | == Packaged Content Info == |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x20 |
| + | | Hash |
| |- | | |- |
| | 0x20 | | | 0x20 |
− | | 16 | + | | 0x10 |
− | | NcaId | + | | Content ID |
| |- | | |- |
| | 0x30 | | | 0x30 |
− | | 6 | + | | 0x6 |
− | | | + | | Size |
| |- | | |- |
| | 0x36 | | | 0x36 |
− | | 1 | + | | 0x1 |
− | | Type (1=program, 3=control, 4=html, 5=legal) | + | | 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 Info == |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Program 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 True) |
| + | |} |
| + | |
| + | === 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]] |
| + | |- |
| + | | |
| + | | 0x4 * Fragment Indicator Count (From [[CNMT#Fragment_Set|Fragment Sets]]) |
| + | | [[CNMT#Fragment_Indicator|Fragment Indicators]] |
| + | |} |
| + | |
| + | === History Header === |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x10 |
| + | | Content Meta Key (Slightly different Content Meta Info) |
| + | |- |
| + | | 0x10 |
| + | | 0x20 |
| + | | Digest |
| + | |- |
| + | | 0x30 |
| + | | 0x2 |
| + | | Content Info Count |
| + | |- |
| + | | 0x32 |
| + | | 0x6 |
| + | | Reserved |
| + | |} |
| + | |
| + | === 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 |
| + | | Reserved |
| + | |} |
| + | |
| + | === 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 |
| + | | Reserved |
| + | |- |
| + | | 0x20 |
| + | | 0x2 |
| + | | Content Info Count |
| + | |- |
| + | | 0x22 |
| + | | 0x6 |
| + | | Reserved |
| + | |} |
| + | |
| + | === 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 |
| + | | 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 |
| + | | 0x4 |
| + | | Reserved |
| + | |} |
| + | |
| + | === 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 |
| + | | Reserved |
| + | |- |
| + | | 0x20 |
| + | | 0x34 * Fragment Set Count |
| + | | [[CNMT#Fragment_Set|Fragment Sets]] |
| + | |- |
| | | | | |
| + | | 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 |
| |} | | |} |