CNMT: Difference between revisions

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
Line 28: Line 30:
| 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+] ContentAccessibilityIndividual ([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 165: Line 218:
| 0x20
| 0x20
| 0x10
| 0x10
| Content ID
| ContentId
|-
|-
| 0x30
| 0x30
Line 173: Line 226:
| 0x35
| 0x35
| 0x1
| 0x1
| [15.0.0+] Content Attributes
| [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 194: Line 248:
| 0x0
| 0x0
| 0x8
| 0x8
| ID
| Id
|-
|-
| 0x8
| 0x8
Line 202: Line 256:
| 0xC
| 0xC
| 0x1
| 0x1
| [[NCM_services#Title_Types|Content Meta Type]]
| [[NCM_services#Title_Types|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 215: 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 230: 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 250: 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 275: Line 332:
| 0x0
| 0x0
| 0x4
| 0x4
| Firmware Variation ID
| FirmwareVariationId
|-
|-
| 0x4
| 0x4
Line 282: 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 292: Line 348:
| 0x0
| 0x0
| 0x1
| 0x1
| Refer To Base (0=False, 1=True)
| ReferToBase (0=False, 1=True)
|-
|-
| 0x1
| 0x1
Line 300: Line 356:
| 0x4
| 0x4
| 0x4
| 0x4
| Meta Count
| MetaCount
|-
|-
| 0x8
| 0x8
Line 307: Line 363:
|}
|}


== Patch Extended Data ==
= PatchMetaExtendedData =
This is "nn::ncm::PatchMetaExtendedData".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 317: 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 344: 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 382: Line 440:
| 0x0
| 0x0
| 0x10
| 0x10
| Content Meta Key (Slightly different Content Meta Info)
| ContentMetaKey
|-
|-
| 0x10
| 0x10
Line 390: Line 448:
| 0x30
| 0x30
| 0x2
| 0x2
| Content Info Count
| ContentInfoCount
|-
|-
| 0x32
| 0x32
Line 397: Line 455:
|}
|}


=== Delta History ===
== PatchDeltaHistory ==
This is "nn::ncm::PatchDeltaHistory".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 407: 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 430: Line 489:
|}
|}


=== Delta Header ===
== PatchDeltaHeader ==
This is "nn::ncm::PatchDeltaHeader".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 440: 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 464: Line 524:
| 0x20
| 0x20
| 0x2
| 0x2
| Content Info Count
| ContentInfoCount
|-
|-
| 0x22
| 0x22
Line 471: Line 531:
|}
|}


=== Fragment Set ===
== FragmentSet ==
This is "nn::ncm::FragmentSet".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 481: 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 512: Line 573:
|}
|}


=== Fragment Indicator ===
== FragmentIndicator ==
This is "nn::ncm::FragmentIndicator".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 522: 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 539: 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 562: 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.
Always found at the end of the file.