Difference between revisions of "NIM services"

From Nintendo Switch Brew
Jump to navigation Jump to search
Line 577: Line 577:
 
Content can be transferred with a custom protocol over the network. This is intended for use with local [[LDN_services|ldn]] networks, however the used IP addresses can be arbitary. This can be used for SystemUpdates via the above Send/Receive commands (which are then used via [[NS_Services#ns:su|ns:su]]). Application content can also be transferred, which uses a similar (?) protocol.
 
Content can be transferred with a custom protocol over the network. This is intended for use with local [[LDN_services|ldn]] networks, however the used IP addresses can be arbitary. This can be used for SystemUpdates via the above Send/Receive commands (which are then used via [[NS_Services#ns:su|ns:su]]). Application content can also be transferred, which uses a similar (?) protocol.
  
Task [[#Cmd69|creation]] for Receive will eventually use the input addr/port with [[Sockets_services|connect()]], while the Send version will eventually do the same with [[Sockets_services|bind()]]. Hence, Receive system = client, while Send system = host.
+
Task [[#Cmd69|creation]] for Receive will eventually use the input addr/port with [[Sockets_services|connect()]], while the Send version will eventually do the same with [[Sockets_services|bind()]]. Hence, Receive system = client, while Send system = server.
  
 
Messages (requests/replies) begin with the following 0x10-byte header, then any associated data.
 
Messages (requests/replies) begin with the following 0x10-byte header, then any associated data.
Line 585: Line 585:
 
! Offset || Size || Description
 
! Offset || Size || Description
 
|-
 
|-
| 0x0 || 0x4 || u32 magicnum. Must match 0x7152444c (request messages, normally from the Receive system) or 0x7352444c (replies, messages normally from the Send system). Code validating the magicnum always checks both magicnums, not an individual one.
+
| 0x0 || 0x4 || u32 magicnum. Must match 0x7152444c (request messages from the Receive system) or 0x7352444c (reply messages from the Send system). Code validating the magicnum always checks both magicnums, not an individual one.
 
|-
 
|-
 
| 0x4 || 0x1 || u8 ID. The reply ID must match the request ID.
 
| 0x4 || 0x1 || u8 ID. The reply ID must match the request ID.
Line 596: Line 596:
 
|}
 
|}
  
After the header is the associated data for size0 and size1, then the message-specific data if any. Generally size0 is 0, when receiving the data for size0 the received data is unused.
+
After the header is the associated data for size0 and size1. Generally size0 is 0, when receiving the data for size0 the received data is unused.
  
 
Messages:
 
Messages:
Line 602: Line 602:
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! ID || Request size0 / data || Request size1 / data || Request-specific data || Reply size0 / data || Reply size1 / data || Reply-specific data || Description
+
! ID || Request size0 / data || Request size1 / data || Reply size0 / data || Reply size1 / data || Description
 
|-
 
|-
| 0x1 || 0x0 || SystemUpdate Meta [[#Cmd69|ContentMetaKey]] || None || 0x0 || 0x38-bytes, unknown. || None || This is the first message used by SystemUpdate.
+
| 0x0 || 0x0 || 0x0 || 0x0 || 0x0 || Tells the server to exit.
 
|-
 
|-
| 0x3 || 0x0 || 0x10-bytes, unknown. || None || 0x0 || 0x8-bytes: two size u32s. || Two blocks of data with the sizes specified by the u32s. || This is presumably used by Application-Delivery. The two blocks of data are used as the buffers for [[ETicket_services|es]] ImportTicket.
+
| 0x1 || 0x0 || SystemUpdate Meta [[#Cmd69|ContentMetaKey]] || 0x0 || 0x38-bytes, unknown. || This is the first message used by SystemUpdate.
 +
|-
 +
| 0x3 || 0x0 || 0x10-bytes, unknown. || 0x0 || 0x8-bytes: two size u32s. Then two blocks of data with the sizes specified by the u32s. || This is presumably used by the client for Application-Delivery. The two blocks of data are used as the buffers for [[ETicket_services|es]] ImportTicket.
 
|}
 
|}
  
 
[[Category:Services]]
 
[[Category:Services]]

Revision as of 08:23, 4 November 2019

nim

This is "nn::nim::detail::INetworkInstallManager".

Cmd Name
0 #CreateSystemUpdateTask
1 #DestroySystemUpdateTask
2 #ListSystemUpdateTask
3 RequestSystemUpdateTaskRun
4 #GetSystemUpdateTaskInfo
5 #CommitSystemUpdateTask
6 CreateNetworkInstallTask
7 DestroyNetworkInstallTask
8 ListNetworkInstallTask
9 RequestNetworkInstallTaskRun
10 #GetNetworkInstallTaskInfo
11 CommitNetworkInstallTask
12 RequestLatestSystemUpdateMeta
14 ListApplicationNetworkInstallTask
15 ListNetworkInstallTaskContentMeta
16 RequestLatestVersion
17 SetNetworkInstallTaskAttribute
18 AddNetworkInstallTaskContentMeta
19 #GetDownloadedSystemDataPath
20 CalculateNetworkInstallTaskRequiredSize
21 #IsExFatDriverIncluded
22 GetBackgroundDownloadStressTaskInfo
23 [2.0.0+] RequestDeviceAuthenticationToken
24 [2.0.0+] RequestGameCardRegistrationStatus
25 [2.0.0+] RequestRegisterGameCard
26 [2.0.0+] RequestRegisterNotificationToken
27 [2.0.0+] RequestDownloadTaskList
28 [2.0.0+] RequestApplicationControl
29 [2.0.0+] RequestLatestApplicationControl
30 [2.0.0+] RequestVersionList
31 [2.0.0+] CreateApplyDeltaTask
32 [2.0.0+] DestroyApplyDeltaTask
33 [2.0.0+] ListApplicationApplyDeltaTask
34 [2.0.0+] RequestApplyDeltaTaskRun
35 [2.0.0+] #GetApplyDeltaTaskInfo
36 [2.0.0+] ListApplyDeltaTask
37 [2.0.0+] CommitApplyDeltaTask
38 [2.0.0+] CalculateApplyDeltaTaskRequiredSize
39 [2.0.0+] PrepareShutdown
40 [2.0.0+] ListApplyDeltaTask2
41 [2.0.0+] ClearNotEnoughSpaceStateOfApplyDeltaTask
42 [3.0.0+]
43 [3.0.0+]
44 [3.0.0+]
45 [3.0.0+]
46 [3.0.0+]
47 [4.0.0+]
48 [4.0.0+]
49 [4.0.0+]
50 [4.0.0+]
51 [4.0.0+]
52 [4.0.0+]
53 [4.0.0+]
54 [4.0.0+]
55 [4.0.0+]
56 [4.0.0+]
57 [4.0.0+]
58 [4.0.0+]
59 [4.0.0+]
60 [4.0.0+]
61 [4.0.0+]
62 [4.0.0+]
63 [4.0.0+]
64 [4.0.0+]
65 [4.0.0+]
66 [4.0.0+]
67 [4.0.0+]
68 [4.0.0+]
69 [4.0.0+]
70 [4.0.0+]
71 [4.0.0+]
72 [4.0.0+]
73 [4.0.0+]
74 [4.0.0+]
75 [4.0.0+]
76 [4.0.0+]
77 [4.0.0+]
78 [4.0.0+]
79 [4.0.0+]
80 [4.0.0+]
81 [4.0.0+]
82 [4.0.0+]
83 [4.0.0+]
84 [5.0.0+]
85 [5.0.0+]
86 [5.0.0+]
87 [6.0.0+]
88 [6.0.0+]
89 [6.0.0+]
90 [6.0.0+]
91 [6.0.0+]
92 [6.0.0+]
93 [6.0.0+]
94 [6.0.0+]
95 [6.0.0+]
96 [6.0.0+]
97 [6.0.0+]
98 [6.0.0+]
99 [7.0.0+]
100 [9.0.0+]
101 [9.0.0+]
102 [9.0.0+]
103 [9.0.0+]
104 [9.0.0+]
105 [9.0.0+]
106 [9.0.0+]

[5.0.0+] RequestGameCardRegistrationStatus/RequestRegisterGameCard removed 8-bytes of input, and now takes an additional type-0x5 input buffer.

[8.0.0+] Cmd76 now takes an additional 0x8-bytes of input.

CreateSystemUpdateTask

Takes an input u32 firmware_variation, an u32 unk, a ContentMetaKey, returns an output #SystemUpdateTask.

Official sw sets unk to: unk = inflag & 1 ? 0xC : 0x4.

DestroySystemUpdateTask

Takes an input #SystemUpdateTask, no output.

ListSystemUpdateTask

Takes a type-0x6 output buffer, for an array of #SystemUpdateTask. Returns a s32 for total output entries.

GetSystemUpdateTaskInfo

Takes an input #SystemUpdateTask, returns an output #SystemUpdateTaskInfo.

CommitSystemUpdateTask

Takes an input #SystemUpdateTask, no output.

GetNetworkInstallTaskInfo

Takes an input #NetworkInstallTask, returns an output #NetworkInstallTaskInfo.

GetDownloadedSystemDataPath

Takes an input u64 titleID, a #SystemUpdateTask, and an type-0x16 output buffer containing the ContentPath.

Gets the FS ContentPath for the specified task and title.

IsExFatDriverIncluded

Takes an input #SystemUpdateTask, returns an output u8 bool flag.

GetApplyDeltaTaskInfo

Takes an input #ApplyDeltaTask, returns an output #ApplyDeltaTaskInfo.

Cmd69

Takes an input u16 port, an u32 Ipv4Address, an u32 firmware_variation, an u32 unk, a ContentMetaKey, returns an output #ReceiveSystemUpdateTask.

Official sw sets unk to: unk = stateflag==0 ? 0x4 : 0xC. The port/Ipv4Address params originate from the RequestReceiveSystemUpdate params.

This is the Receive version of #CreateSystemUpdateTask.

The ContentMetaKey is for the SystemUpdate Meta.

Cmd71

Takes a type-0x6 output buffer, for an array of #ReceiveSystemUpdateTask. Returns a s32 for total output entries.

This is the Receive version of #ListSystemUpdateTask.

Cmd72

Takes an input #ReceiveSystemUpdateTask, returns an output Event and an #IAsyncResult.

This is the Receive version of RequestSystemUpdateTaskRun.

Cmd73

Takes an input #ReceiveSystemUpdateTask, returns an output #ReceiveSystemUpdateTaskInfo.

This is the Receive version of #GetSystemUpdateTaskInfo.

SystemUpdateTask

This is a 0x10-byte struct.

SystemUpdateTaskInfo

Offset Size Description
0x0 0x1 Status
0x1 0x7 ?
0x8 0x8 Unknown
0x10 0x8 DownloadSize
0x18 0x8 ContentMetaId
0x20 0x4 Version
0x24 0x4 ?
0x28 0x8 Unknown
0x30 0x8 Unknown
0x38 0x8 ?

This is a 0x28-byte struct. [3.0.0+] This is a 0x38-byte struct. [5.0.0+] This is a 0x40-byte struct.

The 0x10-bytes at +0x8 are returned by NS_Services#GetDownloadProgress.

The two u64s at +0x28/+0x30 are used by NS to calculate "ThroughputKBps" for a SystemPlayReport.

NetworkInstallTask

This is a 0x10-byte struct.

NetworkInstallTaskInfo

This is a 0x28-byte struct. [3.0.0+] This is a 0x40-byte struct.

ApplyDeltaTask

This is a 0x10-byte struct.

ApplyDeltaTaskInfo

This is a 0x20-byte struct. [3.0.0+] This is a 0x30-byte struct.

ReceiveSystemUpdateTask

This is a 0x10-byte struct.

ReceiveSystemUpdateTaskInfo

This is a 0x38-byte struct.

nim:shp

This is "nn::nim::detail::IShopServiceManager".

Cmd Name
0 RequestDeviceAuthenticationToken
1 [3.0.0+] RequestCachedDeviceAuthenticationToken
100 RequestRegisterDeviceAccount
101 RequestUnregisterDeviceAccount
102 RequestDeviceAccountStatus
103 GetDeviceAccountInfo
104 RequestDeviceRegistrationInfo
105 RequestTransferDeviceAccount
106 [3.0.0+] RequestSyncRegistration
107 [3.0.0+] IsOwnDeviceId
200 RequestRegisterNotificationToken
300 RequestUnlinkDevice
301 RequestUnlinkDeviceIntegrated
302 RequestLinkDevice
303 HasDeviceLink
304 [4.0.0+] RequestUnlinkDeviceAll
305 [4.0.0+] RequestCreateVirtualAccount
306 [4.0.0+] RequestDeviceLinkStatus
400 GetAccountByVirtualAccount
401 [6.0.0+] GetVirtualAccount
500 RequestSyncTicketLegacy ([1.0.0-8.1.0] RequestSyncTicket)
501 RequestDownloadTicket
502 [4.0.0+] #RequestDownloadTicketForPrepurchasedContents
503 [9.0.0+] RequestSyncTicket
504 [9.0.0+] RequestDownloadTicketForPrepurchasedContents2

RequestDownloadTicketForPrepurchasedContents

[6.0.0+] Now takes an additional 4-bytes of input.

nim:eca

This is "nn::nim::detail::IShopServiceAccessServerInterface".

This was added with [5.0.0+].

Cmd Name
0 CreateServerInterface
1 [6.0.0+] RefreshDebugAvailability
2 [6.0.0+] ClearDebugResponse
3 [6.0.0+] RegisterDebugResponse

IShopServiceAccessServer

This is "nn::nim::detail::IShopServiceAccessServer".

This was added with [5.0.0+].

Cmd Name
0 CreateAccessorInterface

IShopServiceAccessor

This is "nn::nim::detail::IShopServiceAccessor".

This was added with [5.0.0+].

Cmd Name
0 CreateAsyncInterface

IShopServiceAsync

This is "nn::nim::detail::IShopServiceAsync".

This was added with [5.0.0+].

Cmd Name
0 Cancel
1 GetSize
2 Read
3 GetErrorCode
4 Request
5 Prepare

nim:ecas

This is "nn::nim::detail::IShopServiceAccessSystemInterface".

This was added with [7.0.0+].

Cmd Name
0 RegisterSpecialClient
1 UnregisterSpecialClient

ntc

This is "nn::ntc::detail::service::IStaticService".

Cmd Name
0 OpenEnsureNetworkClockAvailabilityService
100 [3.0.0+] SuspendAutonomicTimeCorrection
101 [3.0.0+] ResumeAutonomicTimeCorrection

Network-time-sync uses the "<...>/time" HTTPS URL listed in the below Network section. This just returns an UTC Unix time string.

IEnsureNetworkClockAvailabilityService

This is "nn::ntc::detail::service::IEnsureNetworkClockAvailabilityService".

Cmd Name
0 StartTask
1 GetFinishNotificationEvent
2 GetResult
3 Cancel
4 IsProcessing
5 [3.0.0+] GetServerTime

IAsyncValue

This is "nn::nim::detail::IAsyncValue".

Cmd Name
0 GetSize
1 Get
2 Cancel
3 [4.0.0+] GetErrorContext

IAsyncResult

This is "nn::nim::detail::IAsyncResult".

Cmd Name
0 Get
1 Cancel
2 [4.0.0+] GetErrorContext

IAsyncProgressResult

This is "nn::nim::detail::IAsyncProgressResult".

Cmd Name
0 Get
1 Cancel
2 GetProgress
3 [4.0.0+] GetErrorContext

IAsyncData

This is "nn::nim::detail::IAsyncData".

Cmd Name
0
1
2
3
4
5 [4.0.0+]

Contents Delivery

Content can be transferred with a custom protocol over the network. This is intended for use with local ldn networks, however the used IP addresses can be arbitary. This can be used for SystemUpdates via the above Send/Receive commands (which are then used via ns:su). Application content can also be transferred, which uses a similar (?) protocol.

Task creation for Receive will eventually use the input addr/port with connect(), while the Send version will eventually do the same with bind(). Hence, Receive system = client, while Send system = server.

Messages (requests/replies) begin with the following 0x10-byte header, then any associated data.

Offset Size Description
0x0 0x4 u32 magicnum. Must match 0x7152444c (request messages from the Receive system) or 0x7352444c (reply messages from the Send system). Code validating the magicnum always checks both magicnums, not an individual one.
0x4 0x1 u8 ID. The reply ID must match the request ID.
0x5 0x1 Padding
0x6 0x2 u16 size0. Must be <=0x1000.
0x8 0x8 s64 size1. Must not be negative.

After the header is the associated data for size0 and size1. Generally size0 is 0, when receiving the data for size0 the received data is unused.

Messages:

ID Request size0 / data Request size1 / data Reply size0 / data Reply size1 / data Description
0x0 0x0 0x0 0x0 0x0 Tells the server to exit.
0x1 0x0 SystemUpdate Meta ContentMetaKey 0x0 0x38-bytes, unknown. This is the first message used by SystemUpdate.
0x3 0x0 0x10-bytes, unknown. 0x0 0x8-bytes: two size u32s. Then two blocks of data with the sizes specified by the u32s. This is presumably used by the client for Application-Delivery. The two blocks of data are used as the buffers for es ImportTicket.