NS services: Difference between revisions

No edit summary
 
(19 intermediate revisions by 3 users not shown)
Line 359: Line 359:


== GetApplicationContentPath ==
== GetApplicationContentPath ==
Takes a 0x16-type output buffer, an u8 [[NCM_services#ContentMetaType|ContentMetaType]], and an [[NCM_services#ApplicationId|ApplicationId]].
Takes a 0x16-type output buffer, an u8 [[NCM_services#ContentType|ContentType]], and an [[NCM_services#ApplicationId|ApplicationId]].


The input [[NCM_services#ApplicationId|ApplicationId]] is used with the application-title table like various other cmds, anything not in that table can't be used with this.
The input [[NCM_services#ApplicationId|ApplicationId]] is used with the application-title table like various other cmds, anything not in that table can't be used with this.
Line 406: Line 406:
These are "nn::ns::detail::IServiceGetterInterface".
These are "nn::ns::detail::IServiceGetterInterface".


These commands check a state field for a command-specific bit and returns an error if not set, this is likely a permissions check for service+command.
These commands check a state field for a command-specific bit and returns an error if not set, this is a permissions check for service+command.


[11.0.0+] ns:ro was added.
[11.0.0+] ns:ro was added.
Line 414: Line 414:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
! Cmd || Name || Permission bit
|-
| 7988 || [6.0.0+] [[#IDynamicRightsInterface|GetDynamicRightsInterface]] || 10
|-
| 7989 || [5.1.0+] [[#IReadOnlyApplicationControlDataInterface|GetReadOnlyApplicationControlDataInterface]] || 9
|-
| 7991 || [5.0.0+] [[#IReadOnlyApplicationRecordInterface|GetReadOnlyApplicationRecordInterface]] || 8
|-
| 7992 || [4.0.0+] [[#IECommerceInterface|GetECommerceInterface]] || 7
|-
| 7993 || [4.0.0+] [[#IApplicationVersionInterface|GetApplicationVersionInterface]] || 6
|-
| 7994 || [[#IFactoryResetInterface|GetFactoryResetInterface]] || 5
|-
| 7995 || [[#IAccountProxyInterface|GetAccountProxyInterface]] || 4
|-
| 7996 || [[#IApplicationManagerInterface|GetApplicationManagerInterface]] || 3
|-
|-
| 7988 || [6.0.0+] [[#IDynamicRightsInterface|GetDynamicRightsInterface]]
| 7997 || [[#IDownloadTaskInterface|GetDownloadTaskInterface]] || 1
|-
|-
| 7989 || [5.1.0+] [[#IReadOnlyApplicationControlDataInterface|GetReadOnlyApplicationControlDataInterface]]
| 7998 || [[#IContentManagementInterface|GetContentManagementInterface]] || 0
|-
|-
| 7991 || [5.0.0+] [[#IReadOnlyApplicationRecordInterface|GetReadOnlyApplicationRecordInterface]]
| 7999 || [[#IDocumentInterface|GetDocumentInterface]] || 2
|}
 
Permissions state field with each service:
 
{| class="wikitable" border="1"
|-
|-
| 7992 || [4.0.0+] [[#IECommerceInterface|GetECommerceInterface]]
! Service || Permissions
|-
|-
| 7993 || [4.0.0+] [[#IApplicationVersionInterface|GetApplicationVersionInterface]]
| ns:web || 0x304
|-
|-
| 7994 || [[#IFactoryResetInterface|GetFactoryResetInterface]]
| ns:ec || 0x83
|-
|-
| 7995 || [[#IAccountProxyInterface|GetAccountProxyInterface]]
| ns:sweb || 0x387
|-
|-
| 7996 || [[#IApplicationManagerInterface|GetApplicationManagerInterface]]
| ns:rid || 0x10
|-
|-
| 7997 || [[#IDownloadTaskInterface|GetDownloadTaskInterface]]
| ns:rt || 0x20
|-
|-
| 7998 || [[#IContentManagementInterface|GetContentManagementInterface]]
| ns:ro || 0x301
|-
|-
| 7999 || [[#IDocumentInterface|GetDocumentInterface]]
| ns:am2 || 0x7FF
|}
|}


Line 649: Line 670:
|-
|-
| 307 || TerminateOverlayApplet
| 307 || TerminateOverlayApplet
|-
| 308 || [S2]
|-
| 309 || [S2]
|-
|-
| 400 || [[#GetApplicationControlData]]
| 400 || [[#GetApplicationControlData]]
Line 667: Line 692:
|-
|-
| 408 || [8.0.0+] [[#ListApplicationIcon]]
| 408 || [8.0.0+] [[#ListApplicationIcon]]
|-
| 409 || [S2]
|-
| 410 || [S2]
|-
|-
| 411 || [19.0.0+]
| 411 || [19.0.0+]
Line 701: Line 730:
|-
|-
| 427 || [20.0.0+]
| 427 || [20.0.0+]
|-
| 428 || [21.0.0+]
|-
| 429 || [21.0.0+]
|-
| 430 || [21.0.0+]
|-
|-
| 502 || [[#RequestCheckGameCardRegistration]]
| 502 || [[#RequestCheckGameCardRegistration]]
Line 729: Line 764:
|-
|-
| 515 || [20.0.0+]
| 515 || [20.0.0+]
|-
| 516 || [21.0.0+]
|-
| 517 || [21.0.0+]
|-
| 518 || [21.0.0+]
|-
| 519 || [21.0.0+]
|-
|-
| 600 || [[#CountApplicationContentMeta]]
| 600 || [[#CountApplicationContentMeta]]
Line 817: Line 860:
|-
|-
| 923 || [20.0.0+]
| 923 || [20.0.0+]
|-
| 924 || [S2]
|-
| 925 || [S2]
|-
| 926 || [S2]
|-
| 927 || [S2]
|-
|-
| 928 || [20.0.0+]
| 928 || [20.0.0+]
Line 827: Line 878:
|-
|-
| 933 || [20.1.0+]
| 933 || [20.1.0+]
|-
| 934 || [21.0.0+]
|-
| 935 || [21.0.0+]
|-
| 936 || [21.0.0+]
|-
|-
| 1000 || [[#RequestVerifyApplicationDeprecated]]
| 1000 || [[#RequestVerifyApplicationDeprecated]]
Line 1,053: Line 1,110:
|-
|-
| 2368 || [20.0.0+]
| 2368 || [20.0.0+]
|-
| 2369 || [21.0.0+]
|-
|-
| 2400 || [8.0.0+] [[#GetPromotionInfo]]
| 2400 || [8.0.0+] [[#GetPromotionInfo]]
Line 1,132: Line 1,191:
| 3050 || [14.0.0+] ListAssignELicenseTaskResult
| 3050 || [14.0.0+] ListAssignELicenseTaskResult
|-
|-
| 3100 || [17.0.0+] GetSafeSystemVersionCheckInfo
| 3100 || [17.0.0+] [[#GetSafeSystemVersionCheckInfo|GetSafeSystemVersionCheckInfo]]
|-
|-
| 3101 || [17.0.0+] RequestUpdateSafeSystemVersionCheckInfo
| 3101 || [17.0.0+] [[#RequestUpdateSafeSystemVersionCheckInfo|RequestUpdateSafeSystemVersionCheckInfo]]
|-
|-
| 3102 || [17.0.0+] ResetSafeSystemVersionCheckInfo
| 3102 || [17.0.0+] [[#ResetSafeSystemVersionCheckInfo|ResetSafeSystemVersionCheckInfo]]
|-
|-
| 3104 || [18.0.0+] GetApplicationNintendoLogo
| 3104 || [18.0.0+] GetApplicationNintendoLogo
|-
|-
| 3105 || [18.0.0+] GetApplicationStartupMovie
| 3105 || [18.0.0+] GetApplicationStartupMovie
|-
| 3150 || [S2]
|-
|-
| 4000 || [20.0.0+]
| 4000 || [20.0.0+]
Line 1,315: Line 1,376:
|-
|-
| 4097 || [20.0.0+]
| 4097 || [20.0.0+]
|-
| 4099 || [21.0.0+]
|-
|-
| 5000 || [18.0.0+]  
| 5000 || [18.0.0+]  
Line 1,393: Line 1,456:
==== GetRequestServerStopper ====
==== GetRequestServerStopper ====
No input, returns an output [[#IRequestServerStopper]].
No input, returns an output [[#IRequestServerStopper]].
This increfs a state ref-count, with decref being handled when the object is closed. This ref-count is checked by [[#GetApplicationDeliveryInfo|GetApplicationDeliveryInfo]] and related cmds.


==== CancelApplicationApplyDelta ====
==== CancelApplicationApplyDelta ====
Line 1,528: Line 1,593:


This is essentially an async wrapper for [[#GetApplicationControlData]], with support for multiple ApplicationIds.
This is essentially an async wrapper for [[#GetApplicationControlData]], with support for multiple ApplicationIds.
==== Cmd421 ====
Takes an input TransferMemory handle, a type-0x5 input buffer containing an array of u64 [[NCM_services#ApplicationId|ApplicationIds]], an u8 [[#ApplicationControlSource]], an u64 size, returns an output Event handle and an [[#IAsyncValue]].
This is essentially the same as [[#ListApplicationTitle|ListApplicationTitle]] except the ApplicationControlSource is used here (ListApplicationTitle ignores it and uses 0xF0 instead).
The TransferMemory size must be at least: count*sizeof(u64) + count*[[NACP#ApplicationTitle|0x300]] + [[#GetApplicationControlData|0x1d000]].
The async task impl code eventually compares ApplicationControlSource with 0xF0, with a separate code-path being used when it doesn't match (which also handles [[NACP|compression]] when needed).


==== RequestCheckGameCardRegistration ====
==== RequestCheckGameCardRegistration ====
Line 1,694: Line 1,768:
An error is thrown if any bit is set in ApplicationDeliveryAttributeTag besides bit1, this must also be <=0x3. The output array-count must be at least 1: only 1 entry will be written to this array (hence on success total_out will also only be 1 on success).
An error is thrown if any bit is set in ApplicationDeliveryAttributeTag besides bit1, this must also be <=0x3. The output array-count must be at least 1: only 1 entry will be written to this array (hence on success total_out will also only be 1 on success).


[7.0.0+] An error is thrown if a state ref-count is zero. [7.0.0-7.0.1] The func which checks this would also return success when a field prior to the previously mentioned field is 0 (checked before the ref-count).
[7.0.0+] An error is thrown if the state ref-count for [[#GetRequestServerStopper|RequestServerStopper]] is zero. [7.0.0-7.0.1] The func which checks this would also return success when a field prior to the previously mentioned field is 0 (checked before the ref-count).


An error is thrown if [[NIM_services|nim]] ListApplicationApplyDeltaTask returns a task.
An error is thrown if [[NIM_services|nim]] ListApplicationApplyDeltaTask returns a task.
Line 1,841: Line 1,915:
An error is thrown if [[NIM_services|nim]] ListApplicationApplyDeltaTask returns a task.
An error is thrown if [[NIM_services|nim]] ListApplicationApplyDeltaTask returns a task.


The [[NCM_services#ContentMetaType|ContentMetaType]] in the ContentMetaKey must match Patch.
This does various setup and loops through the input ContentMetaKey array for initializing the array passed to the nim cmd during the async task. This loop does the following:
* Throws an error if the [[NCM_services#ContentMetaType|ContentMetaType]] in the ContentMetaKey doesn't match Patch.
* Calls a func with the ContentMetaKey and the ApplicationId, throwing an error if the output value is 0.
* Calls a func with the ContentMetaKey for getting the StorageId. This essentially loops through each valid ncm [[NCM_services|IContentMetaDatabase]] using cmd [[NCM_services|Has]] with the input ContentMetaKey, returning the relevant StorageId when found.
* The ContentMetaKey and the StorageId are copied into a tmp struct.
* if (ContentMetaType==Patch && StorageId==GameCard) { <call a func etc> }
* Copies the above tmp struct into the async task state array.


This does various setup and loops through the input ContentMetaKey array for initializing the array passed to the nim cmd during the async task. This then creates the [[#IAsyncResult]] + the async thread which handles the [[#IAsyncResult]] operation. Then the thread does:
This then creates the [[#IAsyncResult]] + the async thread which handles the [[#IAsyncResult]] operation. Then the thread does:


* Calls a func which does:
* Calls a func which does:
Line 2,233: Line 2,313:
|-
|-
| 607 || [[#IsAnyApplicationRunning]]
| 607 || [[#IsAnyApplicationRunning]]
|-
| 608 || [21.0.0+]
|}
|}


Line 2,262: Line 2,344:
|-
|-
| 92 || [5.0.0+] GetRunningApplicationProgramId
| 92 || [5.0.0+] GetRunningApplicationProgramId
|-
| 100 || [S2]
|-
| 101 || [S2]
|-
|-
| 2524 || [19.0.0+]  
| 2524 || [19.0.0+]  
|}
|}
==== Cmd100 ====
Takes a type-0x16 output buffer containing a 0x300-byte struct, an input u8, an u64. Returns two output u8s.
==== Cmd101 ====
Takes a type-0x16 output buffer containing a 0x300-byte struct, an input u8, an u64. Returns an output u8, an u8 [[Filesystem_services|ContentAttributes]], and a [[NCM_services#ProgramId|ProgramId]].
This is similar to Cmd2524. On [S2] this is used instead of Cmd2524.
==== Cmd2524 ====
Takes a type-0x16 output buffer containing a 0x300-byte struct, an input u8, an u64. Returns an output u8 [[Filesystem_services|ContentAttributes]] and a [[NCM_services#ProgramId|ProgramId]].
The user-process uses the output from this as the input for [[Filesystem_services|OpenFileSystemWithId]] (out-buffer is used as the [[Filesystem_services|FspPath]]).


=== IDownloadTaskInterface ===
=== IDownloadTaskInterface ===
Line 2,335: Line 2,434:
| 2 || [10.0.0+] IsDataCorruptedResult ||
| 2 || [10.0.0+] IsDataCorruptedResult ||
|-
|-
| 3 || [20.0.0+] ||
| 3 || [20.0.0+] [[#ListApplicationRecord|ListApplicationRecord]] ||
|}
|}


Line 2,357: Line 2,456:
| 4 || [9.0.0+] SelectApplicationDesiredLanguage ||
| 4 || [9.0.0+] SelectApplicationDesiredLanguage ||
|-
|-
| 5 || [19.0.0+] ||
| 5 || [19.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 411
|-
|-
| 6 || [19.0.0+] ||
| 6 || [19.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 416
|-
|-
| 7 || [20.0.0+] ||
| 7 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 921
|-
|-
| 8 || [20.0.0+] ||
| 8 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 922
|-
|-
| 9 || [20.0.0+] ||
| 9 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 923
|-
|-
| 10 || [20.0.0+] ||
| 10 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 421
|-
|-
| 11 || [20.0.0+] ||
| 11 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 422
|-
|-
| 12 || [20.0.0+] ||
| 12 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 423
|-
|-
| 13 || [20.0.0+] ||
| 13 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 407
|-
|-
| 14 || [20.0.0+] ||
| 14 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 408
|-
|-
| 15 || [20.0.0+] ||
| 15 || [20.0.0+] || Same as [[#IApplicationManagerInterface]] cmd 415
|-
|-
| 16 || [20.0.0+] ||
| 16 || [20.0.0+] ||
|-
|-
| 17 || [20.1.0+] ||
| 17 || [20.1.0+] || Same as [[#IApplicationManagerInterface]] cmd 933
|-
| 18 || [21.0.0+] ||
|-
| 19 || [21.0.0+] ||
|-
| 20 || [21.0.0+] ||
|-
| 21 || [21.0.0+] ||
|-
| 22 || [21.0.0+] ||
|}
|}


Line 2,446: Line 2,555:
|-
|-
| 28 || [20.0.0+]
| 28 || [20.0.0+]
|-
| 29 || [21.0.0+]
|-
| 30 || [21.0.0+]
|}
|}


Line 2,541: Line 2,654:
|-
|-
| 13 || [20.0.0+]
| 13 || [20.0.0+]
|-
| 14 || [21.0.0+]
|}
|}


Line 2,668: Line 2,783:
| 1202 || [4.0.0+] [[#GetSafeSystemVersion]]
| 1202 || [4.0.0+] [[#GetSafeSystemVersion]]
|-
|-
| 3100 || [18.0.0+]  
| 3100 || [18.0.0+] [[#GetSafeSystemVersionCheckInfo|GetSafeSystemVersionCheckInfo]]
|-
|-
| 3101 || [18.0.0+]  
| 3101 || [18.0.0+] [[#RequestUpdateSafeSystemVersionCheckInfo|RequestUpdateSafeSystemVersionCheckInfo]]
|-
|-
| 3102 || [18.0.0+]  
| 3102 || [18.0.0+] [[#ResetSafeSystemVersionCheckInfo|ResetSafeSystemVersionCheckInfo]]
|}
|}


Line 2,678: Line 2,793:
No input, returns an output u8 bool flag.
No input, returns an output u8 bool flag.


Web-applets use this command to check if the system needs an update.
[S1] Web-applets use this command to check if the system needs an update.


== UpdateSafeSystemVersionForDebug ==
== UpdateSafeSystemVersionForDebug ==
Takes an input [[NCM_services#ApplicationId|ApplicationId]] and an u32 '''version'''.
Takes an input u32 '''version''' and an [[NCM_services#ApplicationId|ApplicationId]].


This command is not available for retail units. On a debug unit, if the [[System_Settings|system setting]] <code>vulnerability!enable_debug</code> is set, this mounts the system savegame [[Flash_Filesystem#System_Savegames|0x8000000000000049]] as "ns_ssversion:/", opens the file "ns_ssversion:/entry" and writes the supplied [[NCM_services#ApplicationId|ApplicationId]] and '''version''' in it.
This command is not available for retail units. On a debug unit, if the [[System_Settings|system setting]] <code>vulnerability!enable_debug</code> is set, this mounts the system savegame [[Flash_Filesystem#System_Savegames|0x8000000000000049]] as "ns_ssversion:/", opens the file "ns_ssversion:/entry" and writes the supplied [[NCM_services#ApplicationId|ApplicationId]] and '''version''' in it.
Line 2,691: Line 2,806:
== GetSafeSystemVersion ==
== GetSafeSystemVersion ==
No input, returns an output [[NCM_services#ContentMetaKey|ContentMetaKey]] with the cached contents of "ns_ssversion:/entry" ([[NCM_services#ApplicationId|ApplicationId]], u32 '''version''' and u32 '''policy''' from <code>vulnerability!needs_update_vulnerability_policy</code>).
No input, returns an output [[NCM_services#ContentMetaKey|ContentMetaKey]] with the cached contents of "ns_ssversion:/entry" ([[NCM_services#ApplicationId|ApplicationId]], u32 '''version''' and u32 '''policy''' from <code>vulnerability!needs_update_vulnerability_policy</code>).
== GetSafeSystemVersionCheckInfo ==
No input, returns 0x10-bytes of output.
[S2] Used by web-applets via ns:vm.
== RequestUpdateSafeSystemVersionCheckInfo ==
No input, returns an output Event handle and an [[#IAsyncResult|IAsyncResult]].
[S2] Used by web-applets via ns:vm.
The async task thread uses [[NIM_services|nim]] RequestCheckSafeSystemVersion, etc.
== ResetSafeSystemVersionCheckInfo ==
No input/output.
This throws an error if [[Settings_services|GetDebugModeFlag]] returns false.


= ns:su =
= ns:su =
Line 2,732: Line 2,864:
|-
|-
| 18 || [4.0.0+] [[#GetSendSystemUpdateProgress]]
| 18 || [4.0.0+] [[#GetSendSystemUpdateProgress]]
|-
| 19 || [S2]
|-
| 20 || [S2]
|}
|}


Line 2,821: Line 2,957:


Same as [[#GetReceiveProgress]] except this uses nim ListLocalCommunicationSendSystemUpdateTask and GetLocalCommunicationSendSystemUpdateTaskInfo. The data copied to output is also swapped: u64 nim_out+0x8 is copied to out+0x8, and u64 nim_out+0x10 is copied to out+0x0.
Same as [[#GetReceiveProgress]] except this uses nim ListLocalCommunicationSendSystemUpdateTask and GetLocalCommunicationSendSystemUpdateTaskInfo. The data copied to output is also swapped: u64 nim_out+0x8 is copied to out+0x8, and u64 nim_out+0x10 is copied to out+0x0.
== Cmd19 ==
This is exclusive to S2.
No input/output.
== Cmd20 ==
This is exclusive to S2.
No input, returns an output u8.


== ISystemUpdateControl ==
== ISystemUpdateControl ==
Line 4,718: Line 4,864:
| 0x21 || 0x1 || [20.0.0+] ProperProgramExists. Set to whether the bit for ProperProgramExists is set from [[NCM_services|ncm]] IContentMetaDatabase GetAttributes.
| 0x21 || 0x1 || [20.0.0+] ProperProgramExists. Set to whether the bit for ProperProgramExists is set from [[NCM_services|ncm]] IContentMetaDatabase GetAttributes.
|-
|-
| 0x22 || 0xBE || Reserved
| 0x22 || 0x1 || [S2]
|-
| 0x23 || 0xBD || Reserved
|-
|-
| 0xE0 || 0x20 || HMAC-SHA256 over the previous 0xE0-bytes. Uses a different key than [[#SystemDeliveryInfo]].
| 0xE0 || 0x20 || HMAC-SHA256 over the previous 0xE0-bytes. Uses a different key than [[#SystemDeliveryInfo]].