Difference between revisions of "Services"
(Fill in a command header) |
|||
Line 13: | Line 13: | ||
|- | |- | ||
| 0x00020000 | | 0x00020000 | ||
− | | GetProcSemaphore (the handle from this gets signaled when notifications for this process gets triggered) | + | | GetProcSemaphore() (the handle from this gets signaled when notifications for this process gets triggered) |
|- | |- | ||
| 0x00030100 | | 0x00030100 | ||
− | | RegisterService (8-byte servicename, u32 strlen, u32 | + | | RegisterService(8-byte servicename, u32 strlen, u32 max_sessions) |
|- | |- | ||
| 0x000400C0 | | 0x000400C0 | ||
− | | UnregisterService (8-byte servicename, u32 strlen) | + | | UnregisterService(8-byte servicename, u32 strlen) |
|- | |- | ||
| 0x00050100 | | 0x00050100 | ||
− | | | + | | GetServiceSessionHandle(8-byte servicename, u32 strlen, u32 flags?) |
|- | |- | ||
| 0x000600c2 | | 0x000600c2 | ||
− | | | + | | RegisterServiceWithHandle(8-byte servicename, u32 strlen, Handle h) |
|- | |- | ||
| 0x0007.... | | 0x0007.... | ||
− | | | + | | UnregisterServiceWithHandle(8-byte servicename, u32 strlen) |
|- | |- | ||
| 0x0008.... | | 0x0008.... | ||
− | | | + | | GetServicePortHandle(8-byte servicename, u32 strlen, u32 flags) |
|- | |- | ||
| 0x00090040 | | 0x00090040 | ||
− | | Subscribe () This enables the specified notificationID for the current process. | + | | Subscribe(). This enables the specified notificationID for the current process. |
|- | |- | ||
| 0x000A0040 | | 0x000A0040 | ||
− | | This disables the specified notificationID for the current process (u32 ID) | + | | Unsubscribe(). This disables the specified notificationID for the current process (u32 ID) |
|- | |- | ||
| 0x000B0000 | | 0x000B0000 | ||
Line 49: | Line 49: | ||
|- | |- | ||
| 0x000E.... | | 0x000E.... | ||
− | | | + | | HasAccessToService(8-byte servicename, u32 strlen). Returns 1 if your process has access to the service. |
|} | |} | ||
Revision as of 05:51, 20 January 2015
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").
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.
Service Manager Port "srv:"
Command Header | Description |
---|---|
0x00010002 | Initialize |
0x00020000 | GetProcSemaphore() (the handle from this gets signaled when notifications for this process gets triggered) |
0x00030100 | RegisterService(8-byte servicename, u32 strlen, u32 max_sessions) |
0x000400C0 | UnregisterService(8-byte servicename, u32 strlen) |
0x00050100 | GetServiceSessionHandle(8-byte servicename, u32 strlen, u32 flags?) |
0x000600c2 | RegisterServiceWithHandle(8-byte servicename, u32 strlen, Handle h) |
0x0007.... | UnregisterServiceWithHandle(8-byte servicename, u32 strlen) |
0x0008.... | GetServicePortHandle(8-byte servicename, u32 strlen, u32 flags) |
0x00090040 | Subscribe(). This enables the specified notificationID for the current process. |
0x000A0040 | Unsubscribe(). This disables the specified notificationID for the current process (u32 ID) |
0x000B0000 | ReceiveNotification This returns the notificationID which was triggered, if any(see GetProcSemaphore). |
0x000C0080 | PublishToSubscriber(u32 ID,u32 flag) This can fire notificationID (Bit(0) only fire if not already fired, Bit(1) = return error if error happens, else it always returns 0) |
0x000D.... | This can fire notificationIDs and return the number of fired notificationID |
0x000E.... | HasAccessToService(8-byte servicename, u32 strlen). Returns 1 if your process has access to the service. |
Service Manager Process-Manager Port "srv:pm"
Command Header, prior to 7.0.0-13 | Description |
---|---|
0x04030082 | RegisterProcess (u32 procid, u32 wordsz, ((wordsz<<16) | 2), serviceaccesscontrol*). |
0x04040040 | UnregisterProcess (u32 procid). |
The Register command registers a process with the service-manager, which includes registering the serviceaccesscontrol for the process which normally originates from the 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 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.
Notifications
ID | Description |
---|---|
0x100 | This indicates that all processes must terminate: power-off, reboot, or FIRM-launch. |
0x108 | error at boot? |
0x204 | This indicates that the HOME button was pressed. |