NCM services
LR (Location Resolver) contains services for internal file path and content management.
LR services
lr
Cmd | Name | Notes |
---|---|---|
0 | GetPathResolverForStorage | Takes a StorageID |
1 | GetPatchPathResolver? | |
2 | CheckStorage | Takes a StorageID |
3 |
IPathResolver
Cmd | Name | Notes |
---|---|---|
0 | GetProgramNcaPath | |
1 | SetProgramNcaPath | |
2 | ||
3 | ||
4 | GetControlNcaPath | |
5 | SetControlNcaPath | |
6 | ||
7 | ||
8 | ||
9 |
Content Manager services
ncm
Cmd | Name | Notes |
---|---|---|
0 | ||
1 | ||
2 | ||
3 | ||
4 | GetIContentStorage | |
5 | GetIContentMetaDatabase | |
8 | ||
9 | InitializeStorageForMediaId | |
10 | UninitializeStorageForMediaId | |
11 | InitializeDatabaseForMediaId | |
12 | UninitializeDatabaseForMediaId |
All of the above cmds takes a u8 as input.
IContentStorage
Cmd | Name | Notes |
---|---|---|
0 | #GetRootEntry | |
1 | Takes two 0x10-sized entries, and a u64. | |
2 | Takes a 0x10-sized entry. | |
3 | Takes a 0x10-sized entry, returns a bool/u8. | |
4 | Takes a 0x10-sized entry, a u64-offset, and type-5 array. | |
5 | Takes two 0x10-sized entries. | |
6 | DeleteContent? | Takes a 0x10-sized entry. |
7 | IsNcaEntryValid | Takes a 0x10-sized entry, returns a bool/u8. |
8 | MakeNcaRegisteredPath | Takes a type-0x1A string and a 0x10-sized entry. |
9 | MakeNcaPlaceholderPath | Takes a type-0x1A string and a 0x10-sized entry. |
10 | Void. | |
11 | Takes a type-6 buffer, each entry 0x10 bytes, and returns a u32. | |
12 | #GetNumberOfEntries | |
13 | #GetEntries | |
14 | #GetEntrySize | |
15 | Void. | |
16 | Takes three 0x10-sized entries. | |
17 | Takes a 0x10-sized entry and a u64. | |
18 | #ReadEntryRaw | |
19 | Takes a 0x10-sized entry and returns another 0x10-sized entry. | |
20 | #GetNcaTitleInfo | |
21 | Takes a 0x10-sized entry, a u64, and a type5 buffer. | |
22 | GetFreeSpace | |
23 | GetTotalSpace |
GetRootEntry
Returns an entry of 16 completely random-looking bytes. It is not possible to read this entry.
Changes on reboot?
GetNumberOfEntries
Writes the total number of entries which can be read by GetEntries, to cmdreply <SFCO_offset>+0x10.
GetEntries
Takes an output buffer, u32 offset and gets all entries starting at that offset. Returns number of entries read.
Each entry is a #NcaID.
The total read entries is exactly the same as the number of "<hex>.nca" directories in the storage FS(or at least under the "registered" directory?).
GetEntrySize
Takes a #NcaID as input.
Returns the total size readable by ReadEntryRaw. This is the same as the size-field in the NAX0 "<NcaID>.nca/00" file.
ReadEntryRaw
Takes an output buffer, a #NcaID as input, and a u64 file offset.
Returns encrypted looking data from the content in the NAX0. Doesn't match the encrypted raw data in the NAX0 "<NcaID>.nca/00" file. Seems to be at least one crypto layer below the initial NAX0 layer, since the data doesn't change after NAX0 recreation.
Manually modifying the content in the NAX0(starting at offset 0x4000) results in different output data being returned by this cmd. Changing any data within the first 0x10-bytes results in the entire 0x10-byte block changing. Likewise for offset 0x4010 size 0x1, entire 0x10-byte block at 0x4010 changes. Changing the first 0x20-bytes at 0x4000 to zeros has the same combined changed output, as when offset 0x4000 size 0x10 and offset 0x4010 size 0x10 were changed to zeros separately. Output BlockA and BlockB are completely different, where the raw NAX0 data for those blocks are all-zero.
Overwriting the entire raw NAX0 content with zeros results in output data which doesn't seem to have any duplicate blocks/data. When changing the previously mentioned raw content for the first 8 blocks to last-block-byte = 1<<i, where i is 0-7, none of the changed output blocks match any output blocks from the previously mentioned output(all-zero raw content).
This implies that that an AES mode is being used which isn't CTR, where changing data in one block doesn't affect other blocks.
See GetEntrySize for the total size readable with this.
GetNcaTitleInfo
Takes a #NcaID and returns the following 0x10-sized entry.
With some NcaIDs this may return 0 with an all-zero output entry. This seems to be the case for most/all (?) NandSystem NcaIds? This seems to be only usable with NcaIds which have type 1 or 4.
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Big-endian titleID |
0x8 | 0x8 | Unknown. Usually zero? |
IContentMetaDatabase
Cmd | Name | Notes |
---|---|---|
0 | InsertContentEntry? | Takes a 0x10-sized entry, a type-5 buffer and a u64. |
1 | Takes a 0x10-sized entry, a type-6 buffer and a u64. Returns a u64. | |
2 | Takes a 0x10-sized entry. | |
3 | Takes a 0x10-sized entry and a bool/u8. Returns an 0x10-sized entry. | |
4 | Takes a type-6 buffer, each entry being 24 bytes, 0x10-sized entry and a u32. Returns a u32. | |
5 | Iterate | Takes a type-6 buffer, each entry being 16 bytes, a 0x10-sized entry, and a u32. Returns a u32. |
6 | #GetTitleIdInfo | |
7 | #GetTitleList | Takes a type-6 buffer, each entry being 24 bytes, and a u8/bool. Returns two u32's. |
8 | Takes a 0x10-sized entry. Returns a bool/u8. | |
9 | Takes a type-5 buffer, each entry being 16 bytes. Returns a bool/u8. | |
10 | Takes a 0x10-sized entry. Returns a u64. | |
11 | Takes a 0x10-sized entry. Returns a u32. | |
12 | Takes a 0x10-sized entry. Returns a u64. | |
13 | Void. | |
14 | Takes a type-6 byte buffer, and a type-5 buffer with each entry being 16 bytes. | |
15 | EndIteration | Void. |
16 | Takes two 0x10-sized entries. Returns a bool/u8. | |
17 | #GetUpdateTitleList | |
18 | Takes a 0x10-sized entry. Returns a bool/u8. | |
19 | Takes a 0x10-sized entry. Returns a u32. |
GetTitleIdInfo
Takes a u64 title-id as input, returns same title-id together with info struct.
struct title_info { u32 version; u8 type; u8 pad[3]; };
GetTitleList
Each 24-byte entries is as follows:
u64 title_id_update; struct title_info info; u64 title_id;
GetUpdateTitleList
Takes a type-6 output buffer, each entry being 0x10-byte bytes, a u32 entryoffset and a 0x10-sized entry. Returns a u32 for total_read_entries.
The input entry is the output entry from #GetTitleIdInfo starting at the TID. The output 0x10-bytes entries are the same as the output from #GetTitleIdInfo starting at the TID. However, "pad[0]" is used for something else it seems?(0 for everything except for TID 010000000000081B, where it's 1)
See NCA#Meta_records.
This reads the titlelist stored in the specified title, normally a title with title-type 3, which is sysupdate-title 0100000000000816. Returns 0 with total_read_entries=0 when used with other title(s).
NcaID
This is a 0x10-byte entry. This is originally from the hex portion of "<hex>.nca" directory-names from this storage FS(like SD).
The NcaID is the same as the first 0x10-bytes from the calculated SHA256 hash, from hashing the entire output from ReadEntryRaw.
Enums
Title Types
Value | Description |
---|---|
0x01 | System Programs (System Modules or System Applets) |
0x02 | System Data Archives |
0x03 | System Update |
0x04 | Firmware package A |
0x05 | Firmware package B |
0x80 | Regular application |
0x81 | Update title |
0x82 | Add-on content |