Difference between revisions of "CNMT"

From Nintendo Switch Brew
Jump to navigation Jump to search
m (Fix link)
(25 intermediate revisions by 8 users not shown)
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]].
+
The official name for CNMT is "PackagedContentMeta".
  
= Metadata file =
+
== Header ==
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"
 
* "Patch_{lower-case hex titleID}.cnmt"
 
* "SystemUpdate_{hex titleID}.cnmt"
 
* "SystemData_{lower-case hex titleID}.cnmt"
 
* "SystemProgram_{lower-case hex titleID}.cnmt"
 
* "BootImagePackage_{lower-case hex titleID}.cnmt"
 
* "BootImagePackageSafe_{lower-case hex titleID}.cnmt"
 
 
 
It starts with a header:
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 23: Line 11:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 8
+
| 0x8
| Title ID
+
| Program 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#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 content entries
+
| Content Count
 
|-
 
|-
 
| 0x12
 
| 0x12
| 2
+
| 0x2
| Number of meta entries
+
| Content Meta Count
 
|-
 
|-
 
| 0x14
 
| 0x14
| 12
+
| 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
 
|}
 
|}
  
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).
+
== 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 Patch-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 70: Line 159:
 
! Description
 
! Description
 
|-
 
|-
 +
| 0x0
 
| 0x20
 
| 0x20
| 8
+
| Hash
| Patch title ID
+
|-
 +
| 0x20
 +
| 0x10
 +
| 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
 +
| 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]]
 
|-
 
|-
| 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 86: 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 101: 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
 
|-
 
|-
| 0x28
+
| 0x10
| 8
+
| 0x4
|
+
| Source Version
 +
|-
 +
| 0x14
 +
| 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 122: 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
 
|-
 
|-
| 0x37
+
| 0x2
| 1
+
| 0x2
|
+
| Fragment Index
 
|}
 
|}
  
== Meta records ==
+
== Delta Extended Data ==
 
 
Each entry is 0x10 bytes:
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 153: Line 534:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 8
+
| 0x8
| Title ID
+
| Source Patch ID
 
|-
 
|-
 
| 0x8
 
| 0x8
| 4
+
| 0x8
| Title version
+
| Destination Patch ID
 +
|-
 +
| 0x10
 +
| 0x4
 +
| Source Version
 +
|-
 +
| 0x14
 +
| 0x4
 +
| Destination Version
 +
|-
 +
| 0x18
 +
| 0x2
 +
| Fragment Set Count
 
|-
 
|-
| 0xC
+
| 0x1A
| 1
+
| 0x6
| Type (see [[Content_Manager_services#Title_Types|Title Types]])
+
| Reserved
 
|-
 
|-
| 0xD
+
| 0x20
| 1
+
| 0x34 * Fragment Set Count
| ? bit0 set = don't install?
+
| [[CNMT#Fragment_Set|Fragment Sets]]
 
|-
 
|-
| 0xE
+
|
| 2
+
| 0x4 * Fragment Indicator Count (From [[CNMT#Fragment_Set|Fragment Sets]])
| Unused?
+
| [[CNMT#Fragment_Indicator|Fragment Indicators]]
 
|}
 
|}
  
This is used for SystemUpdate, see here: [[Content_Manager_services#GetUpdateTitleList]].
+
== Digest ==
 +
 
 +
Always found at the end of the file.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x20
 +
| Digest
 +
|}

Revision as of 19:29, 20 April 2020

This is the metadata file that ends in ".cnmt{.nca}" or "meta0.ncd". This seems to replace the TMD format.

The official name for CNMT is "PackagedContentMeta".

Header

Offset Size Description
0x0 0x8 Program ID
0x8 0x4 Version
0xC 0x1 Content Meta Type
0xD 0x1 Reserved
0xE 0x2 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

Offset Size Description
0x0 0x4 Extended Data Size

Application Extended Header

Offset Size Description
0x0 0x8 Patch ID
0x8 0x4 Required System Version
0xC 0x4 Required Application Version

Patch Extended Header

Offset Size Description
0x0 0x8 Application ID
0x8 0x4 Required System Version
0xC 0x4 Extended Data Size
0x10 0x8 Reserved

AddOnContent Extended Header

Offset Size Description
0x0 0x8 Application ID
0x8 0x4 Required Application Version
0xC 0x4 Reserved

Delta Extended Header

Offset Size Description
0x0 0x8 Application ID
0x8 0x4 Extended Data Size
0xC 0x4 Reserved

Packaged Content Info

Offset Size Description
0x0 0x20 Hash
0x20 0x10 Content ID
0x30 0x6 Size
0x36 0x1 Content Type (0=Meta, 1=Program, 2=Data, 3=Control, 4=HtmlDocument, 5=LegalInformation, 6=DeltaFragment)
0x37 0x1 ID Offset

Content Meta Info

Offset Size Description
0x0 0x8 Program ID
0x8 0x4 Version
0xC 0x1 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:

Offset Size Description
0x0 0x4 Version
0x4 0x4 Variation Count
0x8 0x20 * Variation Count Firmware Variation Info (Version 1)

If the Version field is 2, the format is:

Offset Size Description
0x0 0x4 Version
0x4 0x4 Variation Count
0x8 0x4 * Variation Count Firmware Variation ID
0x20 * Variation Count Firmware Variation Info (Version 2)
0x10 * Meta Count (From Firmware Variation Info (Version 2)) Content Meta Info (If Refer To Base is True)

Firmware Variation Info (Version 1)

Offset Size Description
0x0 0x4 Firmware Variation ID
0x4 0x1C Reserved

Firmware Variation Info (Version 2)

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

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 History Headers
0x28 * Delta History Count Delta Histories
0x28 * Delta Count Delta Headers
0x34 * Fragment Set Count Fragment Sets
0x18 * History Content Count History Content Info (Packaged Content Info without the Hash entry)
0x38 * Delta Content Count Delta Packaged Content Info
0x4 * Fragment Indicator Count (From Fragment Sets) Fragment Indicators

History Header

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

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

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

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=HtmlDocument, 5=LegalInformation, 6=DeltaFragment)
0x2F 0x1 Update Type (0=ApplyAsDelta, 1=Overwrite, 2=Create)
0x30 0x4 Reserved

Fragment Indicator

Offset Size Description
0x0 0x2 Content Info Index
0x2 0x2 Fragment Index

Delta Extended Data

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 Fragment Sets
0x4 * Fragment Indicator Count (From Fragment Sets) Fragment Indicators

Digest

Always found at the end of the file.

Offset Size Description
0x0 0x20 Digest