RO services

From Nintendo Switch Brew
Revision as of 18:24, 22 February 2020 by Hexkyz (talk | contribs)
Jump to navigation Jump to search

Prior to 3.0.0, ro was included as part of Loader services. Despite the separation, the service name ldr:ro is retained to maintain compatibility with old games.

ldr:ro, ro:1

[1.0.0-2.3.0] This is "nn::ldr::detail::IRoInterface"

[3.0.0+] This is "nn::ro::detail::IRoInterface".

[7.0.0+] ro:1 was added, and also creates nn::ro::detail::IRoInterface objects.

Cmd Name
0 #LoadNro
1 UnloadNro
2 #LoadNrr
3 UnloadNrr
4 #Initialize
10 [7.0.0+] #LoadNrrEx

LoadNro

Word Value
0 0x00000004
1 0x80000012
2 0x00000001
0-1 Pid
0 "SCFI"
1 0x00000000
2 Always 0.
3 Nro heap address
4 Nro size
5 Bss backing heap address
6 Bss size

LoadNrr

Word Value
0 0x00000004
1 0x8000000E
2 0x00000001
0-1 Pid
0 "SFCI"
1 0x00000002
2 Always 0.
3 Nrr address
4 Nrr size

[7.0.0+] NrrKind must be 0 (User) for this function to succeed.

Initialize

Word Value
0 0x00000004
1 0x8000000A
2 0x00000003
0-1 Pid
2 Process handle (0xFFFF8001)
0 "SFCI"
1 0x00000004
2 Always 0.

LoadNrrEx

Takes in a u64 nrr_address, a u64 nrr_size, a pid descriptor, and a process handle.

First, this validates that the pid descriptor matches the pid for the process handle sent to this->Initialize() earlier. Then, this calls the same function as LoadNrr, except using the passed process handle instead of the one sent to Initialize.

When called from an ro:1 session, NrrKind must be 1 (JitPlugin). When called from ldr:ro session, NrrKind must be 0 (User).