Changes

2,252 bytes added ,  21:44, 24 August 2024
no edit summary
Line 8: Line 8:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#InitializeUsbTransferPipeFile|InitializeUsbTransferPipeFile]]
+
| 0 || [[#InitializeForUfio|InitializeForUfio]]
 
|-
 
|-
| 1 || [[#IsFileExist|IsFileExist]]
+
| 1 || [[#GetFileSize|GetFileSize]]
 
|-
 
|-
| 2 || [[#ReadFile|ReadFile]]
+
| 2 || [[#ReadFromHost|ReadFromHost]]
 
|-
 
|-
| 3 || [[#WriteFile|WriteFile]]
+
| 3 || [[#WriteToHost|WriteToHost]]
 
|-
 
|-
| 4 || [[#InitializeUsbTransferPipeRaw|InitializeUsbTransferPipeRaw]]
+
| 4 || [[#InitializeForUsbTransfer|InitializeForUsbTransfer]]
 
|-
 
|-
| 5 || [[#ReadRaw|ReadRaw]]
+
| 5 || [[#UsbRead|UsbRead]]
 
|-
 
|-
| 6 || [[#WriteRaw|WriteRaw]]
+
| 6 || [[#UsbWrite|UsbWrite]]
 
|-
 
|-
 
| 7 || [7.0.0+]  
 
| 7 || [7.0.0+]  
Line 43: Line 43:  
  SerialNumber:  "SerialNumber"
 
  SerialNumber:  "SerialNumber"
   −
== InitializeUsbTransferPipeFile ==
+
== InitializeForUfio ==
Unofficial name.
  −
 
   
Takes an input u32. No output.
 
Takes an input u32. No output.
    
Configures a transfer pipe over [[USB_services|usb:ds]] for file access mode.
 
Configures a transfer pipe over [[USB_services|usb:ds]] for file access mode.
   −
== IsFileExist ==
+
== GetFileSize ==
Unofficial name.
  −
 
   
Takes a type-0x9 input buffer containing a path string. Returns an output u64.
 
Takes a type-0x9 input buffer containing a path string. Returns an output u64.
    
Checks whether the specified file exists.
 
Checks whether the specified file exists.
   −
This is "FsFile::Exists" in SystemInitializer.
+
== ReadFromHost ==
 
  −
== 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.
 
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.
 
Reads data from the specified file.
   −
== WriteFile ==
+
== WriteToHost ==
Unofficial name.
+
Takes a type-0x5 input buffer, a type-0x9 input buffer containing a path string and three u64s '''OutSize''', '''Offset''' and '''InSize'''. No output.
 
  −
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.
 
Writes data to the specified file.
   −
SystemInitializer also uses this as "FsFile::Create" with all input u64s set to 0.
+
== InitializeForUsbTransfer ==
 
  −
== InitializeUsbTransferPipeRaw ==
  −
Unofficial name.
  −
 
   
Takes an input u32. No output.
 
Takes an input u32. No output.
    
Configures a transfer pipe over [[USB_services|usb:ds]] for raw access mode.
 
Configures a transfer pipe over [[USB_services|usb:ds]] for raw access mode.
   −
== ReadRaw ==
+
== UsbRead ==
Unofficial name.
  −
 
   
Takes a type-0x6 output buffer and two u64s '''Offset''' and '''Size'''. No output.
 
Takes a type-0x6 output buffer and two u64s '''Offset''' and '''Size'''. No output.
    
Reads raw data from the device.
 
Reads raw data from the device.
   −
== WriteRaw ==
+
== UsbWrite ==
Unofficial name.
  −
 
   
Takes a type-0x5 input buffer and two u64s '''Offset''' and '''Size'''. No output.
 
Takes a type-0x5 input buffer and two u64s '''Offset''' and '''Size'''. No output.
   Line 103: Line 85:     
= Protocol =
 
= Protocol =
   
== CommandId ==
 
== CommandId ==
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 109: Line 90:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 1 || [[#IsFileExist|IsFileExist]]
+
| 1 || [[#GetFileSize|GetFileSize]]
 
|-
 
|-
| 2 || [[#ReadFile|ReadFile]]
+
| 2 || [[#ReadFromHost|ReadFromHost]]
 
|-
 
|-
| 3 || [[#WriteFile|WriteFile]]
+
| 3 || [[#WriteToHost|WriteToHost]]
 
|-
 
|-
 
| 4 || [[#Cmd7]]
 
| 4 || [[#Cmd7]]
Line 125: Line 106:  
! Value || Name
 
! 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 [[Applet_Manager_services|am]] IGlobalStateController StartShutdownSequence/StartRebootSequence cmd.
 +
 +
=== LaunchProgram ===
 +
This essentially supports launching a specified program ([[NS_services|ns:dev]], [[PGL_services|pgl]] in newer versions) with the input arguments passed to [[Loader_services|ldr:shel]], etc.
 +
 +
The u64 at [[#Command|payload]]+0 is the ProgramId, while the rest of the data is passed as the ldr:shel arguments buffer (size is determined from the payload size).
 +
 +
This first terminates the previously launched process, if the PID field is still set (TerminateProcess). Then the arguments are passed to ldr:shel (SetProgramArgument), if required FlushArguments is used then SetProgramArgument is used again. Then LaunchProgram is used with the input ProgramId and BuiltInSystem, launch_flags=0x1, and pgl_launch_flags=0x0. Then SetProgramArgument is used to clear the program arguments (empty string is passed).
 +
 +
Then pgl IEventObserver is used to wait on process events. When events Exited/DebugRunning occur for the launched program, TerminateProcess is used with that PID with the stored PID being cleared, then the wait loop exits. Other events result in the wait loop continuing. Event-wait timeout will result in breaking from the loop, without process-termination. The timeout in nanoseconds is 10 days.
 +
 +
Lastly cleanup is done, then the func returns.
 +
 +
=== 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 ==