Difference between revisions of "Loader services"
(25 intermediate revisions by 7 users not shown) | |||
Line 1: | Line 1: | ||
− | = ldr: | + | = ldr:shel = |
+ | This is "nn::ldr::detail::IShellInterface". | ||
+ | |||
+ | This service has IPC max_sessions 3. | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 || | + | | 0 || [[#SetProgramArgument]] |
|- | |- | ||
− | | 1 || | + | | 1 || [[#FlushArguments]] |
− | |||
− | |||
|} | |} | ||
− | = ldr: | + | == SetProgramArgument == |
+ | Takes a type-0x9 input buffer with launch arguments (as string), an u32 (size of arguments string), and an input [[NCM_services#ProgramId|ProgramId]]. No output. | ||
+ | |||
+ | [11.0.0+] Now takes a type-0x5 buffer instead of type-0x9. Now takes a total of 8-bytes of input, instead of 0x10-bytes total. | ||
+ | |||
+ | Loads a process for the specified title-id and passes along the supplied arguments. | ||
+ | Loaded processes are kept in a queue waiting for PM to launch them. The maximum number of waiting processes in this list is 10. | ||
+ | |||
+ | == FlushArguments == | ||
+ | No input/output. | ||
+ | |||
+ | Clears the loaded processes waiting queue. | ||
+ | |||
+ | = ldr:dmnt = | ||
+ | This is "nn::ldr::detail::IDebugMonitorInterface". | ||
+ | |||
+ | This service has IPC max_sessions 2. | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 | + | | 0 || [[#SetProgramArgument2]] |
− | |||
− | |||
|- | |- | ||
− | | | + | | 1 || [[#FlushArguments2]] |
|- | |- | ||
− | | | + | | 2 || [[#GetProcessModuleInfo]] |
|} | |} | ||
− | == | + | == SetProgramArgument2 == |
− | Takes a | + | Same as [[#SetProgramArgument]]. |
+ | |||
+ | == FlushArguments2 == | ||
+ | Same as [[#FlushArguments]]. | ||
+ | |||
+ | == GetProcessModuleInfo == | ||
+ | Takes a type-0xA output buffer of [[#ModuleInfo]] and an input u64 ProcessId. Returns an output s32. | ||
+ | |||
+ | = ldr:pm = | ||
+ | This is "nn::ldr::detail::IProcessManagerInterface". | ||
+ | |||
+ | This service has IPC max_sessions 1. | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Cmd || Name |
− | |||
− | |||
|- | |- | ||
− | | 0 | + | | 0 || [[#CreateProcess]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | | + | | 1 || [[#GetProgramInfo]] |
− | | | ||
− | | | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
− | | | + | | 2 || [[#PinProgram]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | | + | | 3 || [[#UnpinProgram]] |
− | | | ||
− | | | ||
|- | |- | ||
− | | | + | | 4 || [10.0.0+] [[#SetEnabledProgramVerification]] |
− | | | ||
− | | | ||
|} | |} | ||
− | == | + | == CreateProcess == |
− | Takes | + | Takes an input [[#PinId]], an input [[#CreateProcessFlag]] and an input ResourceLimit handle. Returns an output Process handle. |
− | == | + | == GetProgramInfo == |
− | Takes | + | Takes a type-0x1A output buffer containing a [[#ProgramInfo]] and a [[NCM_services#ProgramLocation|ProgramLocation]]. No output. |
− | = | + | == PinProgram == |
− | + | Takes a [[NCM_services#ProgramLocation|ProgramLocation]]. Returns an output [[#PinId]]. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | + | == UnpinProgram == |
− | Takes | + | Takes an input [[#PinId]]. No output. |
− | + | == SetEnabledProgramVerification == | |
− | + | Takes an input bool. No output. | |
− | == | + | When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA#Header|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort. |
− | |||
− | = | + | = CreateProcessFlag = |
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Value |
+ | ! Description | ||
|- | |- | ||
− | | 0 || | + | | 0 || EnableDebug |
|- | |- | ||
− | | 1 || | + | | 1 || DisableAslr |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
− | == | + | = PinId = |
+ | This is an u64. | ||
+ | |||
+ | = ModuleInfo = | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 |
+ | | 0x20 | ||
+ | | ModuleId | ||
|- | |- | ||
− | | | + | | 0x20 |
+ | | 0x8 | ||
+ | | Address | ||
|- | |- | ||
− | | | + | | 0x28 |
− | + | | 0x8 | |
− | + | | Size | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | | | ||
− | | | ||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
− | = | + | = ProgramInfo = |
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Offset |
+ | ! Size | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | 0x0 |
+ | | 0x1 | ||
+ | | MainThreadPriority | ||
|- | |- | ||
− | | | + | | 0x1 |
+ | | 0x1 | ||
+ | | DefaultCpuId | ||
|- | |- | ||
− | | | + | | 0x2 |
+ | | 0x2 | ||
+ | | Flags | ||
|- | |- | ||
− | | | + | | 0x4 |
− | | | + | | 0x4 |
− | + | | MainThreadStackSize | |
− | | | ||
|- | |- | ||
− | | | + | | 0x8 |
+ | | 0x8 | ||
+ | | [[NCM_services#ProgramId|ProgramId]] | ||
|- | |- | ||
− | | | + | | 0x10 |
+ | | 0x4 | ||
+ | | AcidSacSize | ||
|- | |- | ||
− | | | + | | 0x14 |
+ | | 0x4 | ||
+ | | AciSacSize | ||
|- | |- | ||
− | | | + | | 0x18 |
− | | | + | | 0x4 |
− | + | | AcidFacSize | |
− | |||
− | |||
|- | |- | ||
− | + | | 0x1C | |
+ | | 0x4 | ||
+ | | AciFacSize | ||
|- | |- | ||
− | | | + | | 0x20 |
− | | | + | | 0x10 |
− | | | + | | [19.0.0+] Reserved |
|- | |- | ||
− | | | + | | [19.0.0+] 0x30 ([1.0.0-18.1.0] 0x20) |
− | + | | Variable | |
− | + | | AcidSac | |
|- | |- | ||
− | | | + | | Variable |
− | | | + | | Variable |
− | | | + | | AciSac |
|- | |- | ||
− | | | + | | Variable |
+ | | Variable | ||
+ | | AcidFac | ||
|- | |- | ||
− | | | + | | Variable |
+ | | Variable | ||
+ | | AciFac | ||
|} | |} | ||
[[Category:Services]] | [[Category:Services]] |
Latest revision as of 22:12, 23 October 2024
ldr:shel
This is "nn::ldr::detail::IShellInterface".
This service has IPC max_sessions 3.
Cmd | Name |
---|---|
0 | #SetProgramArgument |
1 | #FlushArguments |
SetProgramArgument
Takes a type-0x9 input buffer with launch arguments (as string), an u32 (size of arguments string), and an input ProgramId. No output.
[11.0.0+] Now takes a type-0x5 buffer instead of type-0x9. Now takes a total of 8-bytes of input, instead of 0x10-bytes total.
Loads a process for the specified title-id and passes along the supplied arguments. Loaded processes are kept in a queue waiting for PM to launch them. The maximum number of waiting processes in this list is 10.
FlushArguments
No input/output.
Clears the loaded processes waiting queue.
ldr:dmnt
This is "nn::ldr::detail::IDebugMonitorInterface".
This service has IPC max_sessions 2.
Cmd | Name |
---|---|
0 | #SetProgramArgument2 |
1 | #FlushArguments2 |
2 | #GetProcessModuleInfo |
SetProgramArgument2
Same as #SetProgramArgument.
FlushArguments2
Same as #FlushArguments.
GetProcessModuleInfo
Takes a type-0xA output buffer of #ModuleInfo and an input u64 ProcessId. Returns an output s32.
ldr:pm
This is "nn::ldr::detail::IProcessManagerInterface".
This service has IPC max_sessions 1.
Cmd | Name |
---|---|
0 | #CreateProcess |
1 | #GetProgramInfo |
2 | #PinProgram |
3 | #UnpinProgram |
4 | [10.0.0+] #SetEnabledProgramVerification |
CreateProcess
Takes an input #PinId, an input #CreateProcessFlag and an input ResourceLimit handle. Returns an output Process handle.
GetProgramInfo
Takes a type-0x1A output buffer containing a #ProgramInfo and a ProgramLocation. No output.
PinProgram
Takes a ProgramLocation. Returns an output #PinId.
UnpinProgram
Takes an input #PinId. No output.
SetEnabledProgramVerification
Takes an input bool. No output.
When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key NPDM ACID signature fails. This also skips verifying the NCA Header signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.
CreateProcessFlag
Value | Description |
---|---|
0 | EnableDebug |
1 | DisableAslr |
PinId
This is an u64.
ModuleInfo
Offset | Size | Description |
---|---|---|
0x0 | 0x20 | ModuleId |
0x20 | 0x8 | Address |
0x28 | 0x8 | Size |
ProgramInfo
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | MainThreadPriority |
0x1 | 0x1 | DefaultCpuId |
0x2 | 0x2 | Flags |
0x4 | 0x4 | MainThreadStackSize |
0x8 | 0x8 | ProgramId |
0x10 | 0x4 | AcidSacSize |
0x14 | 0x4 | AciSacSize |
0x18 | 0x4 | AcidFacSize |
0x1C | 0x4 | AciFacSize |
0x20 | 0x10 | [19.0.0+] Reserved |
[19.0.0+] 0x30 ([1.0.0-18.1.0] 0x20) | Variable | AcidSac |
Variable | Variable | AciSac |
Variable | Variable | AcidFac |
Variable | Variable | AciFac |