Changes

Jump to navigation Jump to search
1,588 bytes added ,  21:27, 15 October 2023
no edit summary
Line 3: Line 3:  
The official name for CNMT is "PackagedContentMeta".
 
The official name for CNMT is "PackagedContentMeta".
   −
== Header ==
+
= PackagedContentMetaHeader =
 +
This is "nn::ncm::PackagedContentMetaHeader".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 12: Line 14:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| ID
+
| Id
 
|-
 
|-
 
| 0x8
 
| 0x8
Line 20: Line 22:  
| 0xC
 
| 0xC
 
| 0x1
 
| 0x1
| [[NCM_services#ContentMetaType|Content Meta Type]]
+
| [[NCM_services#ContentMetaType|ContentMetaType]]
 
|-
 
|-
 
| 0xD
 
| 0xD
 
| 0x1
 
| 0x1
| Reserved
+
| [17.0.0+] [[NCM_services#ContentMetaPlatform|ContentMetaPlatform]] ([1.0.0-16.1.0] Reserved)
 
|-
 
|-
 
| 0xE
 
| 0xE
 
| 0x2
 
| 0x2
| Extended Header Size
+
| ExtendedHeaderSize
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x2
 
| 0x2
| Content Count
+
| ContentCount
 
|-
 
|-
 
| 0x12
 
| 0x12
 
| 0x2
 
| 0x2
| Content Meta Count
+
| ContentMetaCount
 
|-
 
|-
 
| 0x14
 
| 0x14
 
| 0x1
 
| 0x1
| Content Meta Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless)
+
| ContentMetaAttributes (0=None, 1=IncludesExFatDriver, 2=Rebootless, 4=Compacted)
 
|-
 
|-
 
| 0x15
 
| 0x15
Line 48: Line 50:  
| 0x18
 
| 0x18
 
| 0x4
 
| 0x4
| Required Download System Version
+
| RequiredDownloadSystemVersion
 
|-
 
|-
 
| 0x1C
 
| 0x1C
Line 55: Line 57:  
|}
 
|}
   −
== SystemUpdate Extended Header ==
+
= SystemUpdateMetaExtendedHeader =
 +
This is "nn::ncm::SystemUpdateMetaExtendedHeader".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 64: Line 68:  
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| Extended Data Size
+
| ExtendedDataSize
 
|}
 
|}
   −
== Application Extended Header ==
+
= ApplicationMetaExtendedHeader =
 +
This is "nn::ncm::ApplicationMetaExtendedHeader".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 76: Line 82:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Patch ID
+
| PatchId
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x4
 
| 0x4
| Required System Version
+
| RequiredSystemVersion
 
|-
 
|-
 
| 0xC
 
| 0xC
 
| 0x4
 
| 0x4
| Required Application Version
+
| RequiredApplicationVersion
 
|}
 
|}
   −
== Patch Extended Header ==
+
= PatchMetaExtendedHeader =
 +
This is "nn::ncm::PatchMetaExtendedHeader".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 96: Line 104:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Application ID
+
| ApplicationId
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x4
 
| 0x4
| Required System Version
+
| RequiredSystemVersion
 
|-
 
|-
 
| 0xC
 
| 0xC
 
| 0x4
 
| 0x4
| Extended Data Size
+
| ExtendedDataSize
 
|-
 
|-
 
| 0x10
 
| 0x10
Line 111: Line 119:  
|}
 
|}
   −
== AddOnContent Extended Header ==
+
= AddOnContentMetaExtendedHeader =
 +
This is "nn::ncm::AddOnContentMetaExtendedHeader".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 120: Line 130:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Application ID
+
| ApplicationId
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x4
 
| 0x4
| Required Application Version
+
| RequiredApplicationVersion
 +
|-
 +
| 0xC
 +
| 0x1
 +
| [15.0.0+] ContentAccessibilities ([1.0.0-14.1.2] Reserved)
 +
|-
 +
| 0xD
 +
| 0x3
 +
| Reserved
 +
|-
 +
| 0x10
 +
| 0x8
 +
| [15.0.0+] DataPatchId
 +
|}
 +
 
 +
= DeltaMetaExtendedHeader =
 +
This is "nn::ncm::DeltaMetaExtendedHeader".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| ApplicationId
 +
|-
 +
| 0x8
 +
| 0x4
 +
| ExtendedDataSize
 
|-
 
|-
 
| 0xC
 
| 0xC
Line 131: Line 171:  
|}
 
|}
   −
== Delta Extended Header ==
+
= DataPatchMetaExtendedHeader =
 +
This is "nn::ncm::DataPatchMetaExtendedHeader".
 +
 
 +
This was added with [15.0.0+].
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 140: Line 184:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Application ID
+
| DataId
 
|-
 
|-
 
| 0x8
 
| 0x8
 +
| 0x8
 +
| ApplicationId
 +
|-
 +
| 0x10
 
| 0x4
 
| 0x4
| Extended Data Size
+
| RequiredApplicationVersion
 
|-
 
|-
| 0xC
+
| 0x14
 
| 0x4
 
| 0x4
 +
| ExtendedDataSize
 +
|-
 +
| 0x18
 +
| 0x8
 
| Reserved
 
| Reserved
 
|}
 
|}
   −
== Packaged Content Info ==
+
= PackagedContentInfo =
 +
This is "nn::ncm::PackagedContentInfo".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 161: Line 214:  
| 0x0
 
| 0x0
 
| 0x20
 
| 0x20
| Hash
+
| Hash (SHA256 of the referenced content)
 
|-
 
|-
 
| 0x20
 
| 0x20
 
| 0x10
 
| 0x10
| Content ID
+
| ContentId
 
|-
 
|-
 
| 0x30
 
| 0x30
| 0x6
+
| [15.0.0+] 0x5 ([1.0.0-14.1.2] 0x6)
 
| Size
 
| Size
 +
|-
 +
| 0x35
 +
| 0x1
 +
| [15.0.0+] ContentAttributes
 
|-
 
|-
 
| 0x36
 
| 0x36
 
| 0x1
 
| 0x1
| Content Type (0=Meta, 1=Program, 2=Data, 3=Control, 4=[[Internet_Browser|HtmlDocument]], 5=[[Internet_Browser|LegalInformation]], 6=[[NCA_Format|DeltaFragment]])
+
| ContentType (0=Meta, 1=Program, 2=Data, 3=Control, 4=[[Internet_Browser|HtmlDocument]], 5=[[Internet_Browser|LegalInformation]], 6=[[NCA_Format|DeltaFragment]])
 
|-
 
|-
 
| 0x37
 
| 0x37
 
| 0x1
 
| 0x1
| ID Offset
+
| IdOffset
 
|}
 
|}
   −
== Content Meta Info ==
+
= ContentMetaInfo =
 +
This is "nn::ncm::ContentMetaInfo".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 190: Line 248:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| ID
+
| Id
 
|-
 
|-
 
| 0x8
 
| 0x8
Line 198: Line 256:  
| 0xC
 
| 0xC
 
| 0x1
 
| 0x1
| [[NCM_services#Title_Types|Content Meta Type]]
+
| [[NCM_services#ContentMetaType|ContentMetaType]]
 
|-
 
|-
 
| 0xD
 
| 0xD
 
| 0x1
 
| 0x1
| Content Meta Attributes (0=None, 1=IncludesExFatDriver, 2=Rebootless)
+
| ContentMetaAttributes (0=None, 1=IncludesExFatDriver, 2=Rebootless, 4=Compacted)
 
|-
 
|-
 
| 0xE
 
| 0xE
Line 211: Line 269:  
This is used for SystemUpdate, see here: [[NCM_services#ReadEntryMetaRecords]].
 
This is used for SystemUpdate, see here: [[NCM_services#ReadEntryMetaRecords]].
   −
== SystemUpdate Extended Data ==
+
= SystemUpdateMetaExtendedData =
 +
This is "nn::ncm::SystemUpdateMetaExtendedData".
    
If the Version field is 1, the format is:
 
If the Version field is 1, the format is:
Line 226: Line 285:  
| 0x4
 
| 0x4
 
| 0x4
 
| 0x4
| Variation Count
+
| VariationCount
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x20 * Variation Count
+
| 0x20 * VariationCount
| [[CNMT#Firmware_Variation_Info_(Version_1)|Firmware Variation Info (Version 1)]]
+
| [[#FirmwareVariationInfo|FirmwareVariationInfo]] (Version 1)
 
|}
 
|}
   Line 246: Line 305:  
| 0x4
 
| 0x4
 
| 0x4
 
| 0x4
| Variation Count
+
| VariationCount
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x4 * Variation Count
+
| 0x4 * VariationCount
| Firmware Variation ID
+
| FirmwareVariationId
 
|-
 
|-
|  
+
| Variable
| 0x20 * Variation Count
+
| 0x20 * VariationCount
| [[CNMT#Firmware_Variation_Info_(Version_2)|Firmware Variation Info (Version 2)]]
+
| [[#FirmwareVariationInfo|FirmwareVariationInfo]] (Version 2)
 
|-
 
|-
|  
+
| Variable
| 0x10 * Meta Count (From [[CNMT#Firmware_Variation_Info_(Version_2)|Firmware Variation Info (Version 2)]])
+
| 0x10 * MetaCount (from [[#FirmwareVariationInfo|FirmwareVariationInfo]] (Version 2))
| [[CNMT#Content_Meta_Info|Content Meta Info]] (If Refer To Base is False)
+
| [[#ContentMetaInfo|ContentMetaInfo]] (if ReferToBase is False)
 
|}
 
|}
   −
=== Firmware Variation Info (Version 1) ===
+
== FirmwareVariationInfo ==
 +
This is "FirmwareVariationInfo ".
    +
If the Version field is 1, the format is:
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 271: Line 332:  
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| Firmware Variation ID
+
| FirmwareVariationId
 
|-
 
|-
 
| 0x4
 
| 0x4
Line 278: Line 339:  
|}
 
|}
   −
=== Firmware Variation Info (Version 2) ===
+
If the Version field is 2, the format is:
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 288: Line 348:  
| 0x0
 
| 0x0
 
| 0x1
 
| 0x1
| Refer To Base (0=False, 1=True)
+
| ReferToBase (0=False, 1=True)
 
|-
 
|-
 
| 0x1
 
| 0x1
Line 296: Line 356:  
| 0x4
 
| 0x4
 
| 0x4
 
| 0x4
| Meta Count
+
| MetaCount
 
|-
 
|-
 
| 0x8
 
| 0x8
Line 303: Line 363:  
|}
 
|}
   −
== Patch Extended Data ==
+
= PatchMetaExtendedData =
 +
This is "nn::ncm::PatchMetaExtendedData".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 313: Line 374:  
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| History Count
+
| PatchHistoryHeaderCount
 
|-
 
|-
 
| 0x4
 
| 0x4
 
| 0x4
 
| 0x4
| Delta History Count
+
| PatchDeltaHistoryCount
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x4
 
| 0x4
| Delta Count
+
| PatchDeltaHeaderCount
 
|-
 
|-
 
| 0xC
 
| 0xC
 
| 0x4
 
| 0x4
| Fragment Set Count
+
| FragmentSetCount
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x4
 
| 0x4
| History Content Count
+
| PatchHistoryContentInfoCount
 
|-
 
|-
 
| 0x14
 
| 0x14
 
| 0x4
 
| 0x4
| Delta Content Count
+
| PatchDeltaPackagedContentInfoCount
 
|-
 
|-
 
| 0x18
 
| 0x18
Line 340: Line 401:  
|-
 
|-
 
| 0x1C
 
| 0x1C
| 0x38 * History Count
+
| 0x38 * PatchHistoryHeaderCount
| [[CNMT#History_Header|History Headers]]
+
| [[#PatchHistoryHeader|PatchHistoryHeader]]
 
|-
 
|-
|  
+
| Variable
| 0x28 * Delta History Count
+
| 0x28 * PatchDeltaHistoryCount
| [[CNMT#Delta_History|Delta Histories]]
+
| [[#PatchDeltaHistory|PatchDeltaHistory]]
 
|-
 
|-
|  
+
| Variable
| 0x28 * Delta Count
+
| 0x28 * PatchDeltaHeaderCount
| [[CNMT#Delta_Header|Delta Headers]]
+
| [[#PatchDeltaHeader|PatchDeltaHeader]]
 
|-
 
|-
|  
+
| Variable
| 0x34 * Fragment Set Count
+
| 0x34 * FragmentSetCount
| [[CNMT#Fragment_Set|Fragment Sets]]
+
| [[#FragmentSet|FragmentSet]]
 
|-
 
|-
|  
+
| Variable
| 0x18 * History Content Count
+
| 0x18 * PatchHistoryContentInfoCount
| [[CNMT#Packaged_Content_Info|History Content Info]] (Packaged Content Info without the Hash entry)
+
| [[#PackagedContentInfo|PatchHistoryContentInfo]] ([[#PackagedContentInfo|PackagedContentInfo]] without the Hash entry)
 
|-
 
|-
|  
+
| Variable
| 0x38 * Delta Content Count
+
| 0x38 * PatchDeltaPackagedContentInfoCount
| [[CNMT#Packaged_Content_Info|Delta Packaged Content Info]]
+
| [[#PackagedContentInfo|PatchDeltaPackagedContentInfo]]
 
|-
 
|-
|
+
| Variable
| 0x4 * Fragment Indicator Count (From [[CNMT#Fragment_Set|Fragment Sets]])
+
| 0x4 * FragmentIndicatorCount (from [[#FragmentSet|FragmentSet]])
| [[CNMT#Fragment_Indicator|Fragment Indicators]]
+
| [[#FragmentIndicator|FragmentIndicator]]
 
|}
 
|}
   −
=== History Header ===
+
== PatchHistoryHeader ==
 +
This is "nn::ncm::PatchHistoryHeader".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 378: Line 440:  
| 0x0
 
| 0x0
 
| 0x10
 
| 0x10
| Content Meta Key (Slightly different Content Meta Info)
+
| ContentMetaKey
 
|-
 
|-
 
| 0x10
 
| 0x10
Line 386: Line 448:  
| 0x30
 
| 0x30
 
| 0x2
 
| 0x2
| Content Info Count
+
| ContentInfoCount
 
|-
 
|-
 
| 0x32
 
| 0x32
Line 393: Line 455:  
|}
 
|}
   −
=== Delta History ===
+
== PatchDeltaHistory ==
 +
This is "nn::ncm::PatchDeltaHistory".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 403: Line 466:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Source Patch ID
+
| SourcePatchId
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Destination Patch ID
+
| DestinationPatchId
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x4
 
| 0x4
| Source Version
+
| SourceVersion
 
|-
 
|-
 
| 0x14
 
| 0x14
 
| 0x4
 
| 0x4
| Destination Version
+
| DestinationVersion
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Download Size
+
| DownloadSize
 
|-
 
|-
 
| 0x20
 
| 0x20
Line 426: Line 489:  
|}
 
|}
   −
=== Delta Header ===
+
== PatchDeltaHeader ==
 +
This is "nn::ncm::PatchDeltaHeader".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 436: Line 500:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Source Patch ID
+
| SourcePatchId
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 8
 
| 8
| Destination Patch ID
+
| DestinationPatchId
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x4
 
| 0x4
| Source Version
+
| SourceVersion
 
|-
 
|-
 
| 0x14
 
| 0x14
 
| 0x4
 
| 0x4
| Destination Version
+
| DestinationVersion
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x2
 
| 0x2
| Fragment Set Count
+
| FragmentSetCount
 
|-
 
|-
 
| 0x1A
 
| 0x1A
Line 460: Line 524:  
| 0x20
 
| 0x20
 
| 0x2
 
| 0x2
| Content Info Count
+
| ContentInfoCount
 
|-
 
|-
 
| 0x22
 
| 0x22
Line 467: Line 531:  
|}
 
|}
   −
=== Fragment Set ===
+
== FragmentSet ==
 +
This is "nn::ncm::FragmentSet".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 477: Line 542:  
| 0x0
 
| 0x0
 
| 0x10
 
| 0x10
| Source Content ID
+
| SourceContentId
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x10
 
| 0x10
| Destination Content ID
+
| DestinationContentId
 
|-
 
|-
 
| 0x20
 
| 0x20
 
| 0x6
 
| 0x6
| Source Size
+
| SourceSize
 
|-
 
|-
 
| 0x26
 
| 0x26
 
| 0x6
 
| 0x6
| Destination Size
+
| DestinationSize
 
|-
 
|-
 
| 0x2C
 
| 0x2C
 
| 0x2
 
| 0x2
| Fragment Indicator Count
+
| FragmentIndicatorCount
 
|-
 
|-
 
| 0x2E
 
| 0x2E
 
| 0x1
 
| 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]])
+
| FragmentTargetContentType (0=Meta, 1=Program, 2=Data, 3=Control, 4=[[Internet_Browser|HtmlDocument]], 5=[[Internet_Browser|LegalInformation]], 6=[[NCA_Format|DeltaFragment]])
 
|-
 
|-
 
| 0x2F
 
| 0x2F
 
| 0x1
 
| 0x1
| Update Type (0=ApplyAsDelta, 1=Overwrite, 2=Create)
+
| UpdateType (0=ApplyAsDelta, 1=Overwrite, 2=Create)
 
|-
 
|-
 
| 0x30
 
| 0x30
Line 508: Line 573:  
|}
 
|}
   −
=== Fragment Indicator ===
+
== FragmentIndicator ==
 +
This is "nn::ncm::FragmentIndicator".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 518: Line 584:  
| 0x0
 
| 0x0
 
| 0x2
 
| 0x2
| Content Info Index
+
| ContentInfoIndex
 
|-
 
|-
 
| 0x2
 
| 0x2
 
| 0x2
 
| 0x2
| Fragment Index
+
| FragmentIndex
 
|}
 
|}
   −
== Delta Extended Data ==
+
= DeltaMetaExtendedData =
 +
This is "nn::ncm::DeltaMetaExtendedData".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 535: Line 602:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Source Patch ID
+
| SourcePatchId
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Destination Patch ID
+
| DestinationPatchId
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x4
 
| 0x4
| Source Version
+
| SourceVersion
 
|-
 
|-
 
| 0x14
 
| 0x14
 
| 0x4
 
| 0x4
| Destination Version
+
| DestinationVersion
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x2
 
| 0x2
| Fragment Set Count
+
| FragmentSetCount
 
|-
 
|-
 
| 0x1A
 
| 0x1A
Line 558: Line 625:  
|-
 
|-
 
| 0x20
 
| 0x20
| 0x34 * Fragment Set Count
+
| 0x34 * FragmentSetCount
| [[CNMT#Fragment_Set|Fragment Sets]]
+
| [[#FragmentSet|FragmentSet]]
 
|-
 
|-
|
+
| Variable
| 0x4 * Fragment Indicator Count (From [[CNMT#Fragment_Set|Fragment Sets]])
+
| 0x4 * FragmentIndicatorCount (from [[#FragmentSet|FragmentSet]])
| [[CNMT#Fragment_Indicator|Fragment Indicators]]
+
| [[#FragmentIndicator|FragmentIndicator]]
 
|}
 
|}
   −
== Digest ==
+
= Digest =
 
  −
Always found at the end of the file.
  −
 
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 580: Line 644:  
| Digest
 
| Digest
 
|}
 
|}
 +
 +
This is a SHA-256 hash always found at the end of the file. The hash is calculated over the CNMT file's contents, but this is only done for the development version of the file which results in its production version counterpart sharing the same hash value.

Navigation menu