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 svcConnectToPort, service handles are retrieved through the port srv: ("service manager").

When a service is registered, 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.

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 svcGetSystemInfo. Other processes are limited to access services listed in their service access control list, as passed to SRVPM:RegisterProcess.

Attempting to use GetServiceHandle with a service that the process has access to when that service isn't registered will block until it is registered.

Service Manager Port "srv:"

Command Header Description
0x00010002 RegisterClient
0x00020000 EnableNotification
0x00030100 RegisterService
0x000400C0 UnregisterService
0x00050100 GetServiceHandle
0x000600C2 RegisterPort
0x000700C0 UnregisterPort
0x00080100 GetPort
0x00090040 Subscribe
0x000A0040 Unsubscribe
0x000B0000 ReceiveNotification
0x000C0080 PublishToSubscriber
0x000D0040 PublishAndGetSubscriber
0x000E00C0 IsServiceRegistered

It appears these "port" commands can be used for transferring arbitrary handles, however GetPort still uses the same service-access-control validation as GetServiceHandle. Despite this fact, it appears that a "port" and a service with the same name can coexist independently.

Service Manager Process-Manager Port/Service "srv:pm"

Command Header (port), prior to 7.0.0-13 Command Header (service), post 7.0.0-13 Description
0x04010042 0x00010042 PublishToProcess
0x04020040 0x00020040 PublishToAll
0x04030082 0x00030082 RegisterProcess
0x04040040 0x00040040 UnregisterProcess

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 the recipient must terminate. Does not require subscription.
0x101 Signaled to NS on sleep mode entry.
0x102 Sleep Mode related? Published by PTM
0x103 Fired on sleep mode entry, subscribed to by NS, CSND, NWM, AC and NIM. (Kernel state is modified by PTM after publishing this)
0x104 This indicates that the system is entering sleep mode. (Kernel state is modified by PTM before publishing this)
0x105 This indicates that the system has exited sleep mode.
0x106 Fired after sleep mode exit, subscribed to by NS, MIC, AC, NEWS, CECD and BOSS.
0x107 Unknown. Subscribed to by CECD module.
0x108 System is going to Power Down. Published by PTM.
0x109 ? (Subscribed to by GSP)
0x10C Sent by PM after it starts a regular application.
0x110-0x11F Sent to NS on application exit. See PM launch flags.
0x179 Sent by PM to the caller (PTM or NS), after all other processes have terminated
0x200 Signaled just before sleep mode is exited from, subscribed to by NS.
0x202 POWER button pressed
0x203 POWER button held long
0x204 HOME button pressed
0x205 HOME button released
0x206 This is signaled by NWMEXT:ControlWirelessEnabled and when the physical Wi-Fi slider is enabled
0x207 SD card inserted
0x208 Game cartridge inserted
0x209 SD card removed
0x20A Game cartridge removed
0x20B Game cartridge inserted or removed
0x20C mcu-module publishes this on a (fatal) hardware condition?, ptm throws fatal error F960D407 in receipt of this
0x20D Charger plugged out
0x20E Charger plugged in
0x20F Published by the mcu module when (bitmask & 0x8000) is true. This bitmask is obtained by reading i2c register 0x10.
0x210 Published by the mcu module when (bitmask & 0x4000) is true. This bitmask is obtained by reading i2c register 0x10.
0x211 Battery Related? (Published by PTM module)
0x212 Battery Related? (Published by PTM module)
0x213 Signaled after exiting sleep mode and early during system boot. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP powers LCD on in receipt to this, etc.
0x214 Signaled before entering sleep mode. Subscribed to by CODEC, HID, GSP, CAMERA, MIC, NDM and PTM. GSP shutdowns LCD in receipt to this, etc.
0x300 Signaled after sleep mode exit and during system boot, subscribed to by NDM.
0x301 Signaled just before sleep mode is exited from, subscribed to by FRIENDS and NDM.
0x302 Unknown. Signaled by nwm/AC module.
0x303 Unknown. Subscribed to by CECD module.
0x304 Unknown. Subscribed to by CECD module.