Difference between revisions of "Manu services"
Line 131: | Line 131: | ||
| 3 || Reboot | | 3 || Reboot | ||
|- | |- | ||
− | | 5 || | + | | 5 || GetReports |
− | |||
|} | |} | ||
Line 140: | Line 139: | ||
Shutdown/Reboot were added at some point after LaunchProgram, these are present in [9.1.0] (exact version which added these is unknown). These call the SystemApplet Main() func (also used by qlaunch) with a funcptr to call the relevant [[Applet_Manager_services|am]] IGlobalStateController StartShutdownSequence/StartRebootSequence cmd. | Shutdown/Reboot were added at some point after LaunchProgram, these are present in [9.1.0] (exact version which added these is unknown). These call the SystemApplet Main() func (also used by qlaunch) with a funcptr to call the relevant [[Applet_Manager_services|am]] IGlobalStateController StartShutdownSequence/StartRebootSequence cmd. | ||
− | |||
− | |||
=== LaunchProgram === | === LaunchProgram === | ||
This essentially supports launching a specified ProgramId with BuiltInSystem ([[NS_services|ns:dev]], [[PGL_services|pgl]] in newer versions) with the input arguments passed to [[Loader_services|ldr:shel]], etc. | This essentially supports launching a specified ProgramId with BuiltInSystem ([[NS_services|ns:dev]], [[PGL_services|pgl]] in newer versions) with the input arguments passed to [[Loader_services|ldr:shel]], etc. | ||
+ | |||
+ | === GetReports === | ||
+ | This was added at some point after Shutdown/Reboot, this is present in [14.0.0] (exact version which added this is unknown). The command payload data contains a s32 path_size, followed by a NUL-terminated string with that size. After loading the input string, a handler func is called with this string. | ||
+ | |||
+ | This essentially loads the error reports from [[Error_Report_services|erpt:r]] (GetReportList and reads each report). Once finished it calls the IPC vfunc for [[#WriteFile|WriteFile]] with the data buffer, and with the path from: <code>nn::util::SNPrintf(out, 0x100, "%s/%s", inarg_path, tmpstr);</code> Where tmpstr is from the following earlier: <code>nn::util::SNPrintf(tmpstr, 0x20, "%s%02d.txt", "_report", cur_report_index);</code> | ||
== Command == | == Command == |
Revision as of 03:36, 24 August 2024
Manu ("Manufacturing") services are provided by the 010000000000B14A sysmodule, which is installed at the factory but not on normal retail systems.
manu
This is "nn::manu::IManu".
Cmd | Name |
---|---|
0 | InitializeUsbTransferPipeFile |
1 | IsFileExist |
2 | ReadFile |
3 | WriteFile |
4 | InitializeUsbTransferPipeRaw |
5 | ReadRaw |
6 | WriteRaw |
7 | [7.0.0+] |
8 | [14.0.0+] |
All commands are wrappers for usb:ds requests with USB configured as:
VID: 0x057E (Nintendo Co., Ltd) PID: 0x3000 bcdDevice: 0x0100 (1.00) Manufacturer: "Nintendo" Product: "NintendoSdkDebugger" SerialNumber: "SerialNumber"
[7.0.0+] USB is now configured as:
VID: 0x057E (Nintendo Co., Ltd) PID: 0x3003 bcdDevice: 0x0100 (1.00) Manufacturer: "Nintendo" Product: "NintendoSdkManufacturing" SerialNumber: "SerialNumber"
InitializeUsbTransferPipeFile
Unofficial name.
Takes an input u32. No output.
Configures a transfer pipe over usb:ds for file access mode.
IsFileExist
Unofficial name.
Takes a type-0x9 input buffer containing a path string. Returns an output u64.
Checks whether the specified file exists.
This is "FsFile::Exists" in SystemInitializer.
ReadFile
Unofficial name.
Takes a type-0x6 output buffer, a type-0x9 input buffer containing a path string and three u64s OutSize, Offset and InSize. No output.
Reads data from the specified file.
WriteFile
Unofficial name.
Takes a type-0x5 output input, a type-0x9 input buffer containing a path string and three u64s OutSize, Offset and InSize. No output.
Writes data to the specified file.
SystemInitializer also uses this as "FsFile::Create" with all input u64s set to 0.
InitializeUsbTransferPipeRaw
Unofficial name.
Takes an input u32. No output.
Configures a transfer pipe over usb:ds for raw access mode.
ReadRaw
Unofficial name.
Takes a type-0x6 output buffer and two u64s Offset and Size. No output.
Reads raw data from the device.
WriteRaw
Unofficial name.
Takes a type-0x5 input buffer and two u64s Offset and Size. No output.
Writes raw data to the device.
Cmd7
Takes a type-0x9 input buffer containing a path string. No output.
Cmd8
Takes a type-0x9 input buffer containing a path string. No output.
Protocol
CommandId
Value | Name |
---|---|
1 | IsFileExist |
2 | ReadFile |
3 | WriteFile |
4 | #Cmd7 |
5 | #Cmd8 |
ServerCommandId
Value | Name |
---|---|
1 | LaunchProgram |
2 | Shutdown |
3 | Reboot |
5 | GetReports |
Unofficial names.
Unrecognized commands are handled by just returning 0.
Shutdown/Reboot were added at some point after LaunchProgram, these are present in [9.1.0] (exact version which added these is unknown). These call the SystemApplet Main() func (also used by qlaunch) with a funcptr to call the relevant am IGlobalStateController StartShutdownSequence/StartRebootSequence cmd.
LaunchProgram
This essentially supports launching a specified ProgramId with BuiltInSystem (ns:dev, pgl in newer versions) with the input arguments passed to ldr:shel, etc.
GetReports
This was added at some point after Shutdown/Reboot, this is present in [14.0.0] (exact version which added this is unknown). The command payload data contains a s32 path_size, followed by a NUL-terminated string with that size. After loading the input string, a handler func is called with this string.
This essentially loads the error reports from erpt:r (GetReportList and reads each report). Once finished it calls the IPC vfunc for WriteFile with the data buffer, and with the path from: nn::util::SNPrintf(out, 0x100, "%s/%s", inarg_path, tmpstr);
Where tmpstr is from the following earlier: nn::util::SNPrintf(tmpstr, 0x20, "%s%02d.txt", "_report", cur_report_index);
Command
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Magicnum (0xDEADCAFEDEADCAFE) |
0x8 | 0x4 | CommandId when sent to the remote device, ServerCommandId for received commands. |
0xC | 0x4 | Padding |
0x10 | 0x8 | Payload size |
The payload data with the above size follows.
After WriteFile sends the file-data, it reads an additional Response.
Response
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | Ignored by manu. |
0x8 | 0x4 | Status, non-zero indicates error. |
0xC | 0x4 | Padding |
0x10 | 0x8 | Output value if any. May be returned by the service commands. |
ReadFile additionally returns the requested file-data, followed by another Response.
CommandServerStatus
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Status, non-zero indicates error. |
CommandServerResponse
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Status, non-zero indicates error. |
0x4 | 0x4 | Padding |
0x8 | 0x4 | Result from handling the ServerCommandId. |
Notes
There's a total of 3 threads: 2 for the IPC handler threads (which send commands to the remote device and gets the response). And there's the separate nn::manu::CommandServer::RunThread, which receives commands from the remote device and sends replies. This latter thread runs regardless of any service commands being used.