Difference between revisions of "CNMT"

From Nintendo Switch Brew
Jump to navigation Jump to search
(→‎Meta records: broken link)
m
(6 intermediate revisions by the same user not shown)
Line 12: Line 12:
 
* "Delta_{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 20: 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 [[NCM_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"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| Patch ID
 +
|-
 +
| 0x8
 +
| 0x4
 +
| Required System Version
 +
|-
 +
| 0xC
 +
| 0x4
 +
| Unused
 +
|}
  
At the end of the file following the entries is a 0x20-byte block, presumably a hash.
+
== Patch Extended Header ==
 
 
With Patch-format, there's additional data after the end of the entries specified in the header and before the ending hash.
 
 
 
== Application header ==
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 67: 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 83: 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 99: 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 119: 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 [[NCM_services#GetSizeFromContentId]].
+
| Size
 
|-
 
|-
 
| 0x36
 
| 0x36
| 1
+
| 0x1
| Type (0=Meta, 1=Program, 2=Data, 3=Control, 4=[[Internet_Browser|HtmlDocument]], 5=[[Internet_Browser|LegalInformation]], 6=[[NCA_Format|DeltaFragment]])
+
| 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
 
|}
 
|}
  
== Meta records ==
+
== Content Meta Records ==
 
 
Each entry is 0x10 bytes:
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 150: Line 198:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 8
+
| 0x8
 
| Title ID
 
| Title ID
 
|-
 
|-
 
| 0x8
 
| 0x8
| 4
+
| 0x4
| Title version
+
| Version
 
|-
 
|-
 
| 0xC
 
| 0xC
| 1
+
| 0x1
| Type (see [[NCM_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
 
|}
 
|}
  
 
This is used for SystemUpdate, see here: [[NCM_services#ReadEntryMetaRecords]].
 
This is used for SystemUpdate, see here: [[NCM_services#ReadEntryMetaRecords]].
  
== Extended data ==
+
== SystemUpdate Extended Data ==
  
Patch-type cnmt files include an extended data section.
+
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x4
 +
| Version
 +
|-
 +
| 0x4
 +
| 0x4
 +
| Variation Count
 +
|-
 +
| 0x8
 +
| 0x4
 +
| Firmware Variation
 +
|-
 +
| 0xC
 +
| 0x1C * Variation Count
 +
| Unused
 +
|}
 +
 
 +
== Patch Extended Data ==
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 183: Line 254:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 4
+
| 0x4
| Number of previous cnmt entries.
+
| History Count
 
|-
 
|-
 
| 0x4
 
| 0x4
| 4
+
| 0x4
| Number of previous delta entries.
+
| Delta History Count
 
|-
 
|-
 
| 0x8
 
| 0x8
| 4
+
| 0x4
| Number of delta info entries.
+
| Delta Count
 
|-
 
|-
 
| 0xC
 
| 0xC
| 4
+
| 0x4
| Number of delta application info entries.
+
| Fragment Set Count
 
|-
 
|-
 
| 0x10
 
| 0x10
| 4
+
| 0x4
| Number of previous content entries.
+
| History Content Count
 
|-
 
|-
 
| 0x14
 
| 0x14
| 4
+
| 0x4
| Number of delta content entries.
+
| Delta Content Count
 
|-
 
|-
 
| 0x18
 
| 0x18
| 4
+
| 0x4
| Unused?
+
| Unused
 
|-
 
|-
 
| 0x1C
 
| 0x1C
| 0x38*X
+
| 0x38 * History Count
| Previous cnmt entries
+
| [[CNMT#History_Header|History Headers]]
 
|-
 
|-
 
|  
 
|  
| 0x28*X
+
| 0x28 * Delta History Count
| Previous delta entries
+
| [[CNMT#Delta_History|Delta Histories]]
 
|-
 
|-
 
|  
 
|  
| 0x28*X
+
| 0x28 * Delta Count
| Delta info entries
+
| [[CNMT#Delta_Header|Delta Headers]]
 
|-
 
|-
 
|  
 
|  
| 0x34*X
+
| 0x34 * Fragment Set Count
| Delta application info entries
+
| [[CNMT#Fragment_Set|Fragment Sets]]
 
|-
 
|-
 
|  
 
|  
| 0x18*X
+
| 0x18 * History Content Count
| Previous content entries
+
| [[CNMT#Content_Records|History Content Records (Content Records without the Hash entry)]]
 
|-
 
|-
 
|  
 
|  
| 0x38*X
+
| 0x38 * Delta Content Count
| Delta content entries. (Standard content records)
+
| [[CNMT#Content_Records|Delta Content Records]]
|-
 
|  
 
| 4
 
| Unknown
 
|-
 
|
 
| 4
 
| Unknown
 
|-
 
|
 
| 4
 
| Unknown
 
 
|-
 
|-
 +
|
 +
| 0x4 * Fragment Indicator Count (Fragment Set)
 +
| [[CNMT#Fragment_Indicator|Fragment Indicators]]
 
|}
 
|}
  
== Previous cnmt records ==
+
=== History Header ===
 
 
Each entry is 0x38 bytes:
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 259: Line 319:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 8
+
| 0x10
| Title ID
+
| [[CNMT#Content_Meta_Records|Content Meta Record]]
|-
 
| 0x8
 
| 4
 
| Title version
 
 
|-
 
|-
 
| 0xC
 
| 0xC
| 1
+
| 0x1
| Type (see [[NCM_services#Title_Types|Title Types]])
+
| [[NCM_services#Title_Types|Meta Type]]
 
|-
 
|-
 
| 0xD
 
| 0xD
| 3
+
| 0x1
| Unused?
+
| Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless)
 +
|-
 +
| 0xE
 +
| 0x2
 +
| Unused
 
|-
 
|-
 
| 0x10
 
| 0x10
| 32
+
| 0x20
| Hash
+
| Digest
 
|-
 
|-
 
| 0x30
 
| 0x30
| 2
+
| 0x2
| Unknown
+
| Content Info Count
 
|-
 
|-
 
| 0x32
 
| 0x32
| 2
+
| 0x6
| Unused?
+
| Unused
|-
 
| 0x34
 
| 4
 
| Unused?
 
|-
 
 
|}
 
|}
  
This contains information on previous metadata files.
+
=== Delta History ===
 
 
== Previous delta records ==
 
 
 
Each entry is 0x28 bytes:
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 305: Line 356:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 8
+
| 0x8
| Old title ID
+
| Source Patch ID
 
|-
 
|-
 
| 0x8
 
| 0x8
| 8
+
| 0x8
| New title ID
+
| Destination Patch ID
 
|-
 
|-
 
| 0x10
 
| 0x10
| 4
+
| 0x4
| Old title version
+
| Source Version
 
|-
 
|-
 
| 0x14
 
| 0x14
| 4
+
| 0x4
| New title version
+
| Destination Version
 
|-
 
|-
 
| 0x18
 
| 0x18
| 8
+
| 0x8
| Size
+
| Download Size
 
|-
 
|-
 
| 0x20
 
| 0x20
| 8
+
| 0x8
| Unused?
+
| Unused
|-
 
 
|}
 
|}
  
This contains information on previous delta patches.
+
=== Delta Header ===
 
 
== Delta info records ==
 
 
 
Each entry is 0x28 bytes:
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 343: Line 389:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 8
+
| 0x8
| Old title ID
+
| Source Patch ID
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 8
 
| 8
| New title ID
+
| Destination Patch ID
 
|-
 
|-
 
| 0x10
 
| 0x10
| 4
+
| 0x4
| Old title version
+
| Source Version
 
|-
 
|-
 
| 0x14
 
| 0x14
| 4
+
| 0x4
| New title version
+
| Destination Version
 
|-
 
|-
 
| 0x18
 
| 0x18
| 8
+
| 0x2
| Some sort of index?
+
| Fragment Set Count
 +
|-
 +
| 0x1A
 +
| 0x6
 +
| Unused
 
|-
 
|-
 
| 0x20
 
| 0x20
| 8
+
| 0x2
| Some sort of index?
+
| Content Info Count
 
|-
 
|-
 +
| 0x22
 +
| 0x6
 +
| Unused
 
|}
 
|}
  
This contains information on the current delta patch.
+
=== Fragment Set ===
 
 
== Delta application info records ==
 
 
 
Each entry is 0x34 bytes:
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 381: Line 430:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 16
+
| 0x10
| Old NcaId
+
| Source Content ID
 
|-
 
|-
 
| 0x10
 
| 0x10
| 16
+
| 0x10
| New NcaId
+
| Destination Content ID
 
|-
 
|-
 
| 0x20
 
| 0x20
| 6
+
| 0x6
| Old size
+
| Source Size
 
|-
 
|-
 
| 0x26
 
| 0x26
| 2
+
| 0x6
| Upper 2 bytes of the new size
+
| Destination Size
|-
 
| 0x28
 
| 4
 
| Lower 4 bytes of the new size
 
 
|-
 
|-
 
| 0x2C
 
| 0x2C
| 2
+
| 0x2
| Unknown
+
| Fragment Indicator Count
 
|-
 
|-
 
| 0x2E
 
| 0x2E
| 1
+
| 0x1
| Type (see [[NCM_services#Title_Types|Title Types]])
+
| Content Type (0=Meta, 1=Program, 2=Data, 3=Control, 4=[[Internet_Browser|HtmlDocument]], 5=[[Internet_Browser|LegalInformation]], 6=[[NCA_Format|DeltaFragment]])
 
|-
 
|-
 
| 0x2F
 
| 0x2F
| 1
+
| 0x1
| ? bit0 set = don't install?
+
| Update Type (0=ApplyAsDelta, 1=Overwrite, 2=Create)
 
|-
 
|-
 
| 0x30
 
| 0x30
| 4
+
| 0x4
| Unused?
+
| Unused
|-
 
 
|}
 
|}
  
This contains information on how to apply deltas to the previous patch.
+
=== Fragment Indicator ===
  
== Previous content records ==
+
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x2
 +
| Content Info Index
 +
|-
 +
| 0x2
 +
| 0x2
 +
| Fragment Index
 +
|}
  
Each entry is 0x18 bytes:
+
== Delta Extended Data ==
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 431: Line 488:
 
|-
 
|-
 
| 0x0
 
| 0x0
| 16
+
| 0x8
| NcaId
+
| Source Patch ID
 +
|-
 +
| 0x8
 +
| 0x8
 +
| Destination Patch ID
 
|-
 
|-
 
| 0x10
 
| 0x10
| 6
+
| 0x4
| Size
+
| Source Version
 +
|-
 +
| 0x14
 +
| 0x4
 +
| Destination Version
 +
|-
 +
| 0x18
 +
| 0x2
 +
| Fragment Set Count
 
|-
 
|-
| 0x16
+
| 0x1A
| 1
+
| 0x6
| Type (see [[NCM_services#Title_Types|Title Types]])
+
| Unused
 
|-
 
|-
| 0x17
+
| 0x20
| 1
+
| 0x34 * Fragment Set Count
|  
+
| [[CNMT#Fragment_Set|Fragment Sets]]
 
|-
 
|-
 +
|
 +
| 0x4 * Fragment Indicator Count (Fragment Set)
 +
| [[CNMT#Fragment_Indicator|Fragment Indicators]]
 
|}
 
|}
  
This contains information on previous title content from earlier patches.
+
== Digest ==
 +
 
 +
Always found at the end of the file.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x20
 +
| Digest
 +
|}

Revision as of 17:09, 22 May 2019

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

There's at least 9 different filenames used for ".cnmt":

  • "Application_{lower-case hex titleID}.cnmt"
  • "Patch_{lower-case hex titleID}.cnmt"
  • "AddOnContent_{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"
  • "Delta_{lower-case hex titleID}.cnmt"

Header

Offset Size Description
0x0 0x8 Title ID
0x8 0x4 Version
0xC 0x1 Meta Type
0xD 0x1 Unused
0xE 0x2 Extended Header Size
0x10 0x2 Content Count
0x12 0x2 Content Meta Count
0x14 0x1 Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless)
0x15 0x3 Unused
0x18 0x4 Required Download System Version
0x1C 0x4 Unused

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 Unused

Patch Extended Header

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

AddOnContent Extended Header

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

Delta Extended Header

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

Content Records

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 Records

Offset Size Description
0x0 0x8 Title ID
0x8 0x4 Version
0xC 0x1 Meta Type
0xD 0x1 Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless)
0xE 0x2 Unused

This is used for SystemUpdate, see here: NCM_services#ReadEntryMetaRecords.

SystemUpdate Extended Data

Offset Size Description
0x0 0x4 Version
0x4 0x4 Variation Count
0x8 0x4 Firmware Variation
0xC 0x1C * Variation Count Unused

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 Unused
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 Records (Content Records without the Hash entry)
0x38 * Delta Content Count Delta Content Records
0x4 * Fragment Indicator Count (Fragment Set) Fragment Indicators

History Header

Offset Size Description
0x0 0x10 Content Meta Record
0xC 0x1 Meta Type
0xD 0x1 Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless)
0xE 0x2 Unused
0x10 0x20 Digest
0x30 0x2 Content Info Count
0x32 0x6 Unused

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 Unused

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 Unused
0x20 0x2 Content Info Count
0x22 0x6 Unused

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 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 Unused

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 Unused
0x20 0x34 * Fragment Set Count Fragment Sets
0x4 * Fragment Indicator Count (Fragment Set) Fragment Indicators

Digest

Always found at the end of the file.

Offset Size Description
0x0 0x20 Digest