Changes

Jump to navigation Jump to search
987 bytes removed ,  02:11, 10 October 2015
Add links.
Line 1: Line 1: −
Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC]](svcConnectToPort), service handles are retrieved through the port ''srv:'' ("service manager").
+
Services are an abstraction of ports and are the commonly used way of inter-process communication outside of the kernel. While handles of regular ports are retrieved from [[SVC|svcConnectToPort]], service handles are retrieved through the port ''srv:'' ("service manager").
    
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.
 
When a service is registered, [[SVC|svcCreatePort]] is used without a port-name. This means that the port is inaccessible via the port SVCs outside of sm-module. See below for getting a session handle for sending commands to services.
Line 5: Line 5:  
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]].
 
Processes with PID less than or equal to the number of NATIVE_FIRM built-in modules (fs, sm, pm, pxi, ldr) have access to all services. This value is obtained from [[SVC|svcGetSystemInfo]].
   −
Attempting to use srvGetServiceSession with a service that the process has access to when that service isn't registered, results in svcSendSyncRequest never returning(the exact cause is unknown).
+
Attempting to use [[SRV:GetServiceSession|GetServiceSession]] with a service that the process has access to when that service isn't registered, results in [[SVC|svcSendSyncRequest]] never returning(the exact cause is unknown).
    
==Service Manager Port "srv:"==
 
==Service Manager Port "srv:"==
Line 14: Line 14:  
|-
 
|-
 
| 0x00010002
 
| 0x00010002
| Initialize
+
| [[SRV:Initialize|Initialize]]
 
|-
 
|-
 
| 0x00020000
 
| 0x00020000
| GetProcSemaphore() (the handle from this gets signaled when notifications for this process gets triggered)
+
| [[SRV:GetNotificationSemaphore|GetNotificationSemaphore]]
 
|-
 
|-
 
| 0x00030100
 
| 0x00030100
| RegisterService(8-byte servicename, u32 strlen, u32 max_sessions)
+
| [[SRV:RegisterService|RegisterService]]
 
|-
 
|-
 
| 0x000400C0
 
| 0x000400C0
| UnregisterService(8-byte servicename, u32 strlen)
+
| [[SRV:UnregisterService|UnregisterService]]
 
|-
 
|-
 
| 0x00050100
 
| 0x00050100
| GetServiceSession(8-byte servicename, u32 strlen, u32 flags)
+
| [[SRV:GetServiceSession|GetServiceSession]]
 
  −
Flags bit0: if not set, return port-handle instead of session-handle(from [[SVC|svcCreateSessionToPort]]) when session-handle unavailable (max sessions/timeout?).
   
|-
 
|-
 
| 0x000600C2
 
| 0x000600C2
| RegisterPort(8-byte servicename, u32 strlen, Handle client_port)
+
| [[SRV:RegisterPort|RegisterPort]]
 
|-
 
|-
 
| 0x000700C0
 
| 0x000700C0
| UnregisterPort(8-byte servicename, u32 strlen)
+
| [[SRV:UnregisterPort|UnregisterPort]]
 
|-
 
|-
 
| 0x00080100
 
| 0x00080100
| GetPort(8-byte servicename, u32 strlen, u32 flags).
+
| [[SRV:GetPort|GetPort]]
 
  −
Flags bit0: return 0 instead of port handle if port was found.
   
|-
 
|-
 
| 0x00090040
 
| 0x00090040
| Subscribe(u32 notification_id). This enables the specified notificationID for the current process.
+
| [[SRV:Subscribe|Subscribe]]
 
|-
 
|-
 
| 0x000A0040
 
| 0x000A0040
| Unsubscribe(u32 notification_id). This disables the specified notificationID for the current process.
+
| [[SRV:Unsubscribe|Unsubscribe]]
 
|-
 
|-
 
| 0x000B0000
 
| 0x000B0000
| ReceiveNotification() This returns the notificationID which was triggered, if any(see GetProcSemaphore).
+
| [[SRV:ReceiveNotification|ReceiveNotification]]
 
|-
 
|-
 
| 0x000C0080
 
| 0x000C0080
| PublishToSubscriber(u32 notification_id, u32 flag). This fires an notification. Bit0: only fire if not already fired, bit1: return error if error happens, else it always returns 0.
+
| [[SRV:PublishToSubscriber|PublishToSubscriber]]
 
|-
 
|-
 
| 0x000D0040
 
| 0x000D0040
Line 57: Line 53:  
|-
 
|-
 
| 0x000E00C0
 
| 0x000E00C0
| HasAccessToService(8-byte servicename, u32 strlen). Returns 1 if your process has access to the service.
+
| [[SRV:HasAccessToService|HasAccessToService]]
 
|}
 
|}
   Line 67: Line 63:  
|-
 
|-
 
| 0x04030082
 
| 0x04030082
| RegisterProcess (u32 procid, u32 wordsz, <nowiki>((wordsz<<16) | 2)</nowiki>, serviceaccesscontrol*).
+
| [[SRVPM:RegisterProcess|RegisterProcess]]
 
|-
 
|-
 
| 0x04040040
 
| 0x04040040
| UnregisterProcess (u32 procid).
+
| [[SRVPM:UnregisterProcess|UnregisterProcess]]
 
|}
 
|}
  −
The Register command registers a process with the service-manager, which includes registering the serviceaccesscontrol for the process which normally originates from the [[NCCH/Extended_Header|exheader]].
      
Prior to to [[7.0.0-13]], the commands listed for "srv:" were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the "srv:pm" port was changed to a service. With this change, commandIDs for these commands were changed. "srv:pm" was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use "srv:pm", however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses "srv:pm" is the [[Process_Manager_Services|Process Manager]].
 
Prior to to [[7.0.0-13]], the commands listed for "srv:" were also accessible under this port with the same command-headers. Starting with [[7.0.0-13]], the "srv:pm" port was changed to a service. With this change, commandIDs for these commands were changed. "srv:pm" was originally vulnerable, this was fixed with [[7.0.0-13]], see [[3DS_exploits|here]]. Originally any process could use "srv:pm", however starting with [[7.0.0-13]] only the built-in NATIVE_FIRM sysmodules have access to it. The only system title which uses "srv:pm" is the [[Process_Manager_Services|Process Manager]].
1,434

edits

Navigation menu