arp:r

This is "nn::arp::detail::IReader".

Cmd Name
0 #GetApplicationLaunchProperty
1 [10.0.0+] #GetApplicationControlProperty ([1.0.0-9.2.0] #GetApplicationLaunchPropertyWithApplicationId)
2 [10.0.0+] GetApplicationProcessProperty ([1.0.0-9.2.0] #GetApplicationControlProperty)
3 [10.0.0+] GetApplicationInstanceId ([1.0.0-9.2.0] #GetApplicationControlPropertyWithApplicationId)
4 [10.0.0+] #GetApplicationInstanceUnregistrationNotifier
5 [10.0.0+] ListApplicationInstanceId
6 [10.0.0+] GetMicroApplicationInstanceId
7 [10.0.0+] GetApplicationCertificate
9998 [9.0.0-9.2.0] GetPreomiaApplicationLaunchProperty
9999 [9.0.0-9.2.0] GetPreomiaApplicationControlProperty

GetApplicationLaunchProperty

Takes an input u64 ProcessId (1.0.0-9.2.0) or u64 ApplicationInstanceId (10.0.0+), returns an #ApplicationLaunchProperty.

GetApplicationLaunchPropertyWithApplicationId

Takes an input u64 ApplicationId, returns an #ApplicationLaunchProperty.

GetApplicationControlProperty

Takes an input u64 ProcessId (1.0.0-9.2.0) or u64 ApplicationInstanceId (10.0.0+), returns a type-0x16 buffer filled with the contents of control.nacp

GetApplicationControlPropertyWithApplicationId

Takes an input u64 ApplicationId, returns a type-0x16 buffer filled with the contents of control.nacp

GetApplicationInstanceUnregistrationNotifier

Returns an #IUnregistrationNotifier.

IUnregistrationNotifier

This is "nn::arp::detail::IUnregistrationNotifier".

Cmd Name
0 GetReadableHandle

arp:w

This is "nn::arp::detail::IWriter".

Cmd Name
0 #AcquireRegistrar
1 [10.0.0+] UnregisterApplicationInstance ([1.0.0-9.2.0] DeleteProperties)
2 [10.0.0+] #AcquireUpdater

AcquireRegistrar

Returns an #IRegistrar.

AcquireUpdater

Returns an #IUpdater.

IRegistrar

This is "nn::arp::detail::IRegistrar".

Cmd Name
0 #Issue
1 #SetApplicationLaunchProperty
2 #SetApplicationControlProperty

Issue

Takes an input u64.

SetApplicationLaunchProperty

Takes an input #ApplicationLaunchProperty.

SetApplicationControlProperty

Takes an input type-0x15 buffer filled with the contents of control.nacp.

IUpdater

This is "nn::arp::detail::IUpdater".

Cmd Name
0 Issue
1 SetApplicationProcessProperty
2 DeleteApplicationProcessProperty
3 SetApplicationCertificate

bgtc:t

This is "nn::bgtc::ITaskService".

Cmd Name
1 NotifyTaskStarting
2 NotifyTaskFinished
3 GetTriggerEvent
4 IsInHalfAwake
5 NotifyClientName
6 [3.0.0+] IsInFullAwake
11 ScheduleTask
12 GetScheduledTaskInterval
13 UnscheduleTask
14 GetScheduleEvent
15 SchedulePeriodicTask
16 [9.0.0+]
101 [3.0.0+] GetOperationMode
102 [3.0.0+] WillDisconnectNetworkWhenEnteringSleep
103 [3.0.0+] WillStayHalfAwakeInsteadSleep

bgtc:sc

This is "nn::bgtc::IStateControlService".

Cmd Name
1 GetState
2 GetStateChangedEvent
3 NotifyEnteringHalfAwake
4 NotifyLeavingHalfAwake
5 [3.0.0+] SetIsUsingSleepUnsupportedDevices

[10.0.0+] NotifyEnteringHalfAwake now takes 1-byte of input.

time:a, time:r, time:u

These are "nn::timesrv::detail::service::IStaticService".

These were added with [9.0.0+].

The time:u service has max_sessions 17, time:a has max_sessions 4, and time:r has max_sessions 2.

Cmd Name Notes
0 GetStandardUserSystemClock Returns an #ISystemClock.
1 GetStandardNetworkSystemClock Returns an #ISystemClock.
2 GetStandardSteadyClock Returns an #ISteadyClock.
3 GetTimeZoneService Returns an #ITimeZoneService.
4 GetStandardLocalSystemClock Returns an #ISystemClock.
5 [4.0.0+] GetEphemeralNetworkSystemClock Returns an #ISystemClock.
20 [6.0.0+] GetSharedMemoryNativeHandle
30 [6.0.0-8.1.0] GetStandardNetworkClockOperationEventReadableHandle
31 [6.0.0-8.1.0] GetEphemeralNetworkClockOperationEventReadableHandle
50 [4.0.0+] SetStandardSteadyClockInternalOffset
51 [9.0.0+] GetStandardSteadyClockRtcValue
100 IsStandardUserSystemClockAutomaticCorrectionEnabled
101 SetStandardUserSystemClockAutomaticCorrectionEnabled
102 [5.0.0+] GetStandardUserSystemClockInitialYear
200 [3.0.0+] IsStandardNetworkSystemClockAccuracySufficient
201 [6.0.0+] GetStandardUserSystemClockAutomaticCorrectionUpdatedTime
300 [4.0.0+] CalculateMonotonicSystemClockBaseTimePoint
400 [4.0.0+] GetClockSnapshot
401 [4.0.0+] GetClockSnapshotFromSystemClockContext
500 [4.0.0+] CalculateStandardUserSystemClockDifferenceByUser
501 [4.0.0+] CalculateSpanBetween

ISteadyClock

This is "nn::timesrv::detail::service::ISteadyClock".

Cmd Name Notes
0 GetCurrentTimePoint No input, returns an output #SteadyClockTimePoint.
2 GetTestOffset No input, returns an output #TimeSpanType.
3 SetTestOffset Takes an input #TimeSpanType, no output.
100 [2.0.0+] GetRtcValue No input, returns an output s64.
101 [2.0.0+] IsRtcResetDetected No input, returns an output u8 bool.
102 [2.0.0+] GetSetupResultValue No input, returns an output u32.
200 [3.0.0+] GetInternalOffset No input, returns an output #TimeSpanType.
201 [3.0.0-3.0.2] SetInternalOffset Takes an input #TimeSpanType, no output.

SteadyClockTimePoint

Offset Size Description
0x0 0x8 A u64 representing a point in time.
0x8 0x10 An ID representing the clock source.

This is a 0x18-byte struct.

TimeSpanType

This is an u64.

ISystemClock

This is "nn::timesrv::detail::service::ISystemClock".

Cmd Name Notes
0 GetCurrentTime Returns an output #PosixTime.
1 SetCurrentTime Takes an input #PosixTime.
2 GetSystemClockContext Returns an output #SystemClockContext.
3 SetSystemClockContext Takes an input #SystemClockContext.
4 [9.0.0+] GetOperationEventReadableHandle

PosixTime

This is an s64 for UTC POSIX time.

SystemClockContext

This is an 0x20-byte struct.

Offset Size Description
0x0 0x8 a #PosixTime representing the system clock epoch.
0x8 0x18 a #SteadyClockTimePoint

ITimeZoneService

This is "nn::timesrv::detail::service::ITimeZoneService".

Cmd Name Notes
0 GetDeviceLocationName No input, returns an output #LocationName.
1 SetDeviceLocationName Takes an input #LocationName, no output.
2 GetTotalLocationNameCount No input, returns an output s32.
3 LoadLocationNameList
4 LoadTimeZoneRule Takes an input #LocationName and a type-0x16 output buffer for #TimeZoneRule, no output.
5 [2.0.0+] GetTimeZoneRuleVersion No input, returns an output #TimeZoneRuleVersion.
6 [5.0.0+] GetDeviceLocationNameAndUpdatedTime
7 [9.0.0+] SetDeviceLocationNameWithTimeZoneRule
8 [9.0.0+] ParseTimeZoneBinary Stubbed, return 0x7BC74.
20 [9.0.0+] GetDeviceLocationNameOperationEventReadableHandle
100 ToCalendarTime Takes an input #PosixTime and a type-0x15 input buffer for #TimeZoneRule, returns an output #CalendarTime and #CalendarAdditionalInfo.
101 ToCalendarTimeWithMyRule Takes an input #PosixTime, returns an output #CalendarTime and #CalendarAdditionalInfo.
201 ToPosixTime Takes an input #CalendarTime, a type-0x15 input buffer for #TimeZoneRule, an type-0xA output buffer for #PosixTime array, and returns an output s32.
202 ToPosixTimeWithMyRule Takes an input #CalendarTime, an type-0xA output buffer for #PosixTime array, and returns an output s32.

LoadLocationNameList

Takes an input s32 LocationName_index and a type-0x6 output buffer for #LocationName, returns an output s32 for total output entries.

LocationName

This contains a TimeZone location string with a max size of 0x24 bytes.

TimeZoneRule

This is an 0x4000-byte struct. Official sw uses fixed-size 0x4000 for the buffer size with the above commands.

This is loaded from the TimeZoneBinary title with the specified LocationName under the zoneinfo/ directory, the content is then converted into this TimeZoneRule structure.

The files contained under zoneinfo/ directory are Tzif2 files without Tzif1 header and data at the begining of them (see RFC8536 for more information).

The conversion of a Tzif2 file to a TimeZoneRule structure is based on tz database code with some custom modifications (Leap seconds aren't handled, no usage of "posixrules" and Tzif1 support stripped out).

Offset Size Description
0x0 0x4 timecnt
0x4 0x4 typecnt
0x8 0x4 charcnt
0xC 0x1 goback
0xD 0x1 goahead
0xE 0x2 Padding
0x10 0x8 * 1000 ats
0x1f50 0x1 * 1000 types
0x2338 0x10 * 128 ttis (time type information), struct ttinfo[1000]
0x2b38 0x1 * 512 chars
0x2d38 0x4 defaulttype
0x2d3c 0x12c4 Reserved / Unused

ttinfo

This is an 0x10-byte struct. Represent a Time Type Information used in #TimeZoneRule.

Offset Size Description
0x0 0x4 tt_gmtoff
0x4 0x1 tt_isdst
0x5 0x3 Padding
0x8 0x4 tt_abbrind
0xC 0x1 tt_ttisstd
0xD 0x1 tt_ttisgmt
0xE 0x2 Padding

TimeZoneRuleVersion

This is an u128.

CalendarTime

Offset Size Description
0x0 0x2 Year
0x2 0x1 Month
0x3 0x1 Day
0x4 0x1 Hour
0x5 0x1 Minute
0x6 0x1 Second
0x7 0x1 Padding / unknown?

This is an 0x8-byte struct.

CalendarAdditionalInfo

Offset Size Description
0x0 0x4 0-based day-of-week.
0x4 0x4 0-based day-of-year.
0x8 0x8 Timezone name string.
0x10 0x4 0 = no DST, 1 = DST.
0x14 0x4 s32 seconds relative to UTC for this timezone.

This is an 0x18-byte struct. This stores timezone info.

notif:a

This is "nn::notification::server::INotificationServicesForApplication".

This was added with [9.0.0+].

Cmd Name
500 #RegisterAlarmSetting
510 #UpdateAlarmSetting
520 #ListAlarmSettings
530 #LoadApplicationParameter
540 #DeleteAlarmSetting
1000 #Initialize

RegisterAlarmSetting

Takes a type-0x15 input buffer #AlarmSetting and a type-0x5 input buffer. Returns an #AlarmSettingId.

The second buffer can be empty (addr=0/size=0). Size must be <=0x400. This is the ApplicationParameter.

A maximum of 8 Alarms can be registered by an Application at the same time.

Before using the cmd, sdknso uses hid IsFirmwareUpdateNeededForNotification then if needed launches the controller-applet for firmware-update.

After using the cmd when it failed, ShowError will be used when the Result is in a certain range, otherwise this will assert.

UpdateAlarmSetting

Takes a type-0x15 input buffer #AlarmSetting and a type-0x5 input buffer. No output.

The second buffer can be empty (addr=0/size=0). Size must be <=0x400. This is the ApplicationParameter.

ListAlarmSettings

Takes a type-0x6 output buffer to receive an array of #AlarmSetting. Returns a s32 AlarmSettingsCount.

LoadApplicationParameter

Takes an input #AlarmSettingId and a type-0x6 output buffer containing the ApplicationParameter. Returns an u32 actual_size.

DeleteAlarmSetting

Takes an input #AlarmSettingId.

Initialize

Takes a PID-descriptor and an input u64 pid_reserved.

notif:s

This is "nn::notification::server::INotificationServicesForSystem".

This was added with [9.0.0+].

Cmd Name
500 #RegisterAlarmSetting
510 #UpdateAlarmSetting
520 #ListAlarmSettings
530 #LoadApplicationParameter
540 #DeleteAlarmSetting
1000
1010 #ListNotifications
1020 #DeleteNotification
1030 #ClearNotifications
1040 #OpenNotificationSystemEventAccessor
1500 #SetPresentationSetting
1510 #GetPresentationSetting
2000 #GetAlarmSetting
2001
2010 #MuteAlarmSetting
2020 #IsAlarmSettingReady
8000
8010
8999 [10.0.0+]
9000 #GetNextAlarm

Cmd1000

No input, returns a total of 4-bytes of output.

ListNotifications

Unofficial name.

DeleteNotification

Unofficial name.

ClearNotifications

Unofficial name.

No input/output.

OpenNotificationSystemEventAccessor

Unofficial name.

No input, returns an output #INotificationSystemEventAccessor.

INotificationSystemEventAccessor

This is "nn::notification::server::INotificationSystemEventAccessor".

This was added with [9.0.0+].

Cmd Name
0

Cmd0: no input, returns an output handle.

SetPresentationSetting

Unofficial name.

GetPresentationSetting

Unofficial name.

GetAlarmSetting

Unofficial name.

Takes an input #AlarmSettingId. Returns an #AlarmSetting.

MuteAlarmSetting

Unofficial name.

Takes an input #AlarmSettingId and a bool.

IsAlarmSettingReady

Unofficial name.

Takes an input #AlarmSettingId. Returns a bool.

GetNextAlarm

Unofficial name.

Takes an input #AlarmSettingId. Returns an u8 IsAlarmScheduled and a PosixTime for the next scheduled alarm.

ApplicationLaunchProperty

Total size is 0x10 bytes.

Offset Size Description
0x00 0x08 Title ID
0x08 0x04 Version
0x0C 0x01 Base Game Storage Id
0x0D 0x01 Update Storage Id
0x0E 0x02 Padding

AlarmSettingId

This is "nn::notification::AlarmSettingId". This is an u16.

AlarmSetting

This is "nn::notification::AlarmSetting". Total size is 0x40 bytes. When initializing this to the defaults, the entire struct is cleared then the last 0xE-bytes are set to 0xFF.

Offset Size Description
0x00 0x02 #AlarmSettingId
0x02 0x01 Kind (0 = WeeklySchedule)
0x03 0x01 u8 bool Muted (non-zero/true = AlarmSetting turned off, zero/false = on).
0x04 0x04 Padding
0x08 0x10 UID. User account associated with this AlarmSetting. Used for the PreselectedUser when launching the Application when the system was previously in sleep-mode, instead of launching the applet for selecting the user.
0x18 0x08 ApplicationId
0x20 0x08 Not set by sdksno, besides clearing it during initialization.
0x28 0x18 Alarm schedule (WeeklyScheduleAlarmSetting)

Schedule:

Offset Size Description
0x00 0x0A Not set by sdksno, besides clearing it during initialization.
0x0A 0xE(7*2) Array of 7 entries where each entry is 2-bytes. Index is nn::time::DayOfWeek, Sun-Sat.

Array entries:

Each byte is set using an input s32. An entry with value 0xFFFF (the default) indicates that it's disabled. The high byte is the hour, the low byte is the minute. This uses local-time.

sdknso checks whether an entry is enabled with: return ({last 5-bits of the entry} < 3) && ((entry & 0xfc) < 60);. The first check is equivalent to comparing the second entry byte with value 24.