Title Database: Difference between revisions
WIP |
Structure may need re-formating |
||
Line 52: | Line 52: | ||
|} | |} | ||
The .db [[extdata|Extdata]] image embeds two almost identical copies(the latter is probably an older backup) of the title database. These database files consist of a pre-header with size of 0x80 identifying the Database Type, followed by a BDRI container. The offsets in the BDRI header are usually relative to the offset to the start of the BDRI header (0x80 in the file) | |||
== | == Pre Header == | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 69: | Line 69: | ||
| 0x78 | | 0x78 | ||
| Reserved | | Reserved | ||
|} | |||
=== Database Magic === | |||
{| class="wikitable" | |||
|- | |||
! Database Type | |||
! Magic | |||
|- | |||
| CTR-NAND import.db | |||
| NANDIDB | |||
|- | |||
| CTR-NAND title.db | |||
| NANDTDB | |||
|- | |||
| CTR-NAND tmp_i.db | |||
| TEMPIDB | |||
|- | |||
| CTR-NAND tmp_t.db | |||
| TEMPIDB | |||
|- | |||
| SD Card import.db | |||
| ? | |||
|- | |||
| SD Card title.db | |||
| TEMPTDB | |||
|} | |||
== BDRI == | |||
Information stored about titles in these Title Database files are stored in two parts in a BDRI partition. Firstly in a Title Entry Table, and secondly in a Title Info Table. | |||
{| class="wikitable" | |||
|- | |||
! Start | |||
! Length | |||
! Description | |||
|- | |- | ||
| | | 0x0 | ||
| 4 | | 4 | ||
| Database Magic ("BDRI") | | Database Magic ("BDRI") | ||
|- | |- | ||
| | | 0x4 | ||
| 4 | | 4 | ||
| Magic Number (0x30000) | | Magic Number (0x30000) | ||
|- | |- | ||
| | | 0x8 | ||
| 8 | | 8 | ||
| Unknown | | Unknown | ||
|- | |- | ||
| | | 0x10 | ||
| 8 | | 8 | ||
| File Size, divided by the value at | | File Size(including pre header), divided by the value at relative offset 0x18 (usually = 0x80) | ||
|- | |- | ||
| | | 0x18 | ||
| 4 | | 4 | ||
| Usually 0x80 | | Usually 0x80 | ||
|- | |- | ||
| | | 0x1C | ||
| 4 | | 4 | ||
| Reserved | | Reserved | ||
|- | |- | ||
| | | 0x20 | ||
| 0x20 | | 0x20 | ||
| Unknown/Constant | | Unknown/Constant | ||
|- | |- | ||
| | | 0x40 | ||
| 0x18 | | 0x18 | ||
| Unknown | | Unknown | ||
|- | |- | ||
| | | 0x58 | ||
| 8 | | 8 | ||
| Title Entry Table Offset | | Relative Title Entry Table Offset | ||
|- | |- | ||
| | | 0x60 | ||
| 0x20 | | 0x20 | ||
| Unknown | | Unknown | ||
|} | |} | ||
==== | == Title Entry Table == | ||
This contains 'Entries' for all the titles stored in the database. However this contains minimal information about a title, but contains the offset (relative to the actual offset of the Title Entry Table) to the title's extended info in the Title Info Table. | |||
=== Header === | |||
{| class="wikitable" | |||
|- | |||
! Start | |||
! Length | |||
! Description | |||
|- | |||
| 0x0 | |||
| 4 | |||
| Unknown | |||
|- | |||
| 0x4 | |||
| 4 | |||
| Unknown | |||
|- | |||
| 0x8 | |||
| 0x24 | |||
| Reserved | |||
|- | |||
| 0x2C | |||
| 4 | |||
| Unknown | |||
|- | |||
| 0x30 | |||
| 0x50 | |||
| Reserved | |||
|- | |||
| 0x80 | |||
| 4 | |||
| MAX Number of Title Entries | |||
|- | |||
| 0x84 | |||
| 4 | |||
| Unknown | |||
|- | |||
| 0x88 | |||
| 0x20 | |||
| Reserved | |||
|} | |||
== Title Entry Format == | |||
The entries are 0x2C bytes long. | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! | ! Start | ||
! | ! Length | ||
! Description | |||
|- | |||
| 0x0 | |||
| 4 | |||
| Unknown | |||
|- | |||
| 0x4 | |||
| 4 | |||
| Entry Flag. If this isn't = 0x1, then this entry slot is unused | |||
|- | |||
| 0x8 | |||
| 0x8 | |||
| Title ID | |||
|- | |||
| 0x10 | |||
| 4 | |||
| Title Entry Index | |||
|- | |||
| 0x14 | |||
| 4 | |||
| Relative Title Info Offset, divided by the value at offset 0x18 in this Title Entry (usually 0x80) | |||
|- | |||
| 0x18 | |||
| 0x4 | |||
| Usually 0x80 | |||
|- | |||
| 0x1c | |||
| 4 | |||
| Reserved | |||
|- | |||
| 0x20 | |||
| 4 | |||
| When value at relative offset 0x24 = 0x1, then this value is the title's "Title ID lower" | |||
|- | |||
| 0x24 | |||
| 0x4 | |||
| Unknown | |||
|- | |||
| 0x28 | |||
| 0x4 | |||
| Unknown | |||
|} | |||
* The actual Title Info offset is calculated by the following: Offset of BDRI Header + Relative Offset of Title Entry Table + Relative Title Info Offset | |||
== Title Info Format == | |||
These are 0x80 bytes long. | |||
{| class="wikitable" | |||
|- | |||
! Start | |||
! Length | |||
! Description | |||
|- | |||
| 0x0 | |||
| 8 | |||
| Title Size | |||
|- | |||
| 0x8 | |||
| 0x4 | |||
| Title Type(usually 0x40) | |||
|- | |||
| 0xC | |||
| 0x4 | |||
| Title Version | |||
|- | |||
| 0x10 | |||
| 4 | |||
| Flags_0 | |||
|- | |||
| 0x14 | |||
| 4 | |||
| TMD Content ID | |||
|- | |||
| 0x18 | |||
| 0x4 | |||
| CMD Content ID | |||
|- | |||
| 0x1c | |||
| 4 | |||
| Flags_1 | |||
|- | |||
| 0x20 | |||
| 4 | |||
| ExtdataID low (zero if title doesn't use Extdata) | |||
|- | |||
| 0x24 | |||
| 0x4 | |||
| Reserved | |||
|- | |||
| 0x28 | |||
| 0x8 | |||
| Flags_2 | |||
|- | |||
| 0x30 | |||
| 0x10 | |||
| Product Code | |||
|- | |||
| 0x40 | |||
| 0x10 | |||
| Reserved | |||
|- | |||
| 0x50 | |||
| 0x4 | |||
| Unknown | |||
|- | |||
| 0x54 | |||
| 0x2c | |||
| Reserved | |||
|} | |||
==== Flags_0 ==== | |||
{| class="wikitable" | |||
|- | |||
! Index | |||
! Description | |||
|- | |||
| 0 | |||
| Electronic Manual | |||
|- | |||
| 1 | |||
| ? | |||
|- | |||
| 2 | |||
| ? | |||
|- | |- | ||
| | | 3 | ||
| | | ? | ||
|} | |||
==== Flags_1 ==== | |||
{| class="wikitable" | |||
|- | |- | ||
! Index | |||
! Description | |||
|- | |- | ||
| | | 0 | ||
| | | SD Save Data | ||
|- | |- | ||
| | | 1 | ||
| | | ? | ||
|- | |- | ||
| | | 2 | ||
| ? | | ? | ||
|- | |- | ||
| | | 3 | ||
| | | ? | ||
|} | |} | ||
==== Flags_2 ==== | |||
{| class="wikitable" | |||
|- | |||
! Index | |||
! Description | |||
|- | |||
| 0 | |||
| DSiWare Related (Visibility on Home Menu/Export Flag?) | |||
|- | |||
| 1 | |||
| ? | |||
|- | |||
| 2 | |||
| ? | |||
|- | |||
| 3 | |||
| ? | |||
|- | |||
| 4 | |||
| Related to Titles with an 'Application' Title ID | |||
|- | |||
| 5 | |||
| DSiWare Related (Visibility on Home Menu/Export Flag?) | |||
|- | |||
| 6 | |||
| ? | |||
|- | |||
| 7 | |||
| ? | |||
|} | |||
'''NOTES:''' | |||
It is important to note the database doesn't contain a hash of the [[Title Data Structure|.cmd]]. So if a user has more than one valid set of [[Title Data Structure|application data]] for a given .cmd Content ID they can be manually interchanged without issue. Though renaming a .cmd file to match the Content ID which the title.db is expecting will result in an error, as the CTR for the per-console encryption layer changes depending on the file path, and the MAC of the .cmd is probably generated with the .cmd Content ID in mind. | It is important to note the database doesn't contain a hash of the [[Title Data Structure|.cmd]]. So if a user has more than one valid set of [[Title Data Structure|application data]] for a given .cmd Content ID they can be manually interchanged without issue. Though renaming a .cmd file to match the Content ID which the title.db is expecting will result in an error, as the CTR for the per-console encryption layer changes depending on the file path, and the MAC of the .cmd is probably generated with the .cmd Content ID in mind. | ||
These NAND/SD /dbs images seem to be loaded by the ARM9 while NATIVE_FIRM is booting. | |||
== Tools == | |||
[https://github.com/ps3hen/ctr_toolchain/tree/master/extdata_tool extdata_tool] - parsing cleartext .db extdata images |