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]] | + | | [[Title_list|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 Header Size |
| + | |} |
| | | |
− | An optional header can follow, depending on the title type.
| + | == Application Extended Header == |
− | | + | {| class="wikitable" border="1" |
− | At the end of the file following the entries is a 0x20-byte block, presumably a hash.
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x8 |
| + | | Patch ID |
| + | |- |
| + | | 0x8 |
| + | | 0x4 |
| + | | Required System Version |
| + | |} |
| | | |
− | With Patch-format, there's additional data after the end of the entries specified in the header and before the ending hash.
| + | == Patch Extended Header == |
− | | |
− | == Application header == | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 67: |
Line 99: |
| ! 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 123: |
| ! 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 143: |
| ! 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 165: |
| |- | | |- |
| | 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]]) | + | | Title 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 == | | == Meta records == |
− |
| |
− | Each entry is 0x10 bytes:
| |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 150: |
Line 194: |
| |- | | |- |
| | 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 |
| |} | | |} |
| | | |