NS services: Difference between revisions

No edit summary
No edit summary
Line 1,574: Line 1,574:


==== CreateApplicationResource ====
==== CreateApplicationResource ====
Returns an [[#IApplicationResource]].
Takes an input [[#ApplicationResourceType]]. Returns an [[#IApplicationResource]].


==== GetApplicationResource ====
==== GetApplicationResource ====
Returns an [[#IApplicationResource]].
Takes an input u64 ProcessId and an input [[#ApplicationResourceType]]. Returns an [[#IApplicationResource]].


==== RegisterDeviceLockKey ====
==== RegisterDeviceLockKey ====
Line 3,414: Line 3,414:


= ApplicationUpdateInfo =
= ApplicationUpdateInfo =
This is "nn::ns::ApplicationUpdateInfo".
This is "nn::ns::ApplicationUpdateInfo". This is an u8.


This is an u8. [[qlaunch]] just checks whether this is 0.
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || UpToDate
|-
| 1 || Updatable
|}
 
[[qlaunch]] just checks whether this is 0.


= ApplicationOccupiedSize =
= ApplicationOccupiedSize =
This is "nn::ns::ApplicationOccupiedSize". This is a 0x80-byte struct.
This is "nn::ns::ApplicationOccupiedSize". This is a 0x80-byte struct.


= ProgressForDeleteUserSaveDataAll =
{| class="wikitable" border="1"
This is "nn::ns::detail::ProgressForDeleteUserSaveDataAll". This is a 0x28-byte struct.
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x20 * 4 || Array of [[#ApplicationOccupiedSizeEntity]]
|}


= ApplicationViewDeprecated =
= ApplicationOccupiedSizeEntity =
This is "nn::ns::ApplicationViewDeprecated". This is a 0x40-byte struct.
This is "nn::ns::ApplicationOccupiedSizeEntity". This is a 0x20-byte struct.
 
This is converted from [[#ApplicationView]] by [[#GetApplicationViewDeprecated]] on newer system-versions as follows:


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 3,435: Line 3,449:
! Description
! Description
|-
|-
| 0x0 || 0x20 || Same as [[#ApplicationView]] +0x0.
| 0x0 || 0x1 || [[NCM_services#StorageId|StorageId]]
|-
|-
| 0x20 || 0x4 || Same as [[#ApplicationView]] +0x20.
| 0x1 || 0x7 || Reserved
|-
|-
| 0x24 || 0x2 || Same as [[#ApplicationView]] +0x24.
| 0x8 || 0x8 || AppSize
|-
|-
| 0x26 || 0x2 || Cleared to 0.
| 0x10 || 0x8 || PatchSize
|-
|-
| 0x28 || 0x10 || Same as [[#ApplicationView]] +0x30.
| 0x18 || 0x8 || AocSize
|}
 
= ProgressForDeleteUserSaveDataAll =
This is "nn::ns::detail::ProgressForDeleteUserSaveDataAll". This is a 0x28-byte struct.
 
{| class="wikitable" border="1"
|-
|-
| 0x38 || 0x4 || Same as [[#ApplicationView]] +0x40.
! Offset
! Size
! Description
|-
| 0x0 || 0x8 || StartedAt
|-
| 0x8 || 0x4 || Count
|-
| 0xC || 0x4 || Reserved
|-
| 0x10 || 0x8 || SizeInBytes
|-
|-
| 0x3C || 0x1 || Same as [[#ApplicationView]] +0x44.
| 0x18 || 0x1 || IsSystem
|-
|-
| 0x3D || 0x2 || Cleared to 0.
| 0x19 || 0x7 || Reserved
|-
|-
| 0x3F || 0x1 || Cleared to 0.
| 0x20 || 0x8 || ApplicationId
|}
|}


= ApplicationView =
= ApplicationViewDeprecated =
This is "nn::ns::ApplicationView". This is a 0x50-byte struct.
This is "nn::ns::ApplicationViewDeprecated". This is a 0x40-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 3,465: Line 3,495:
| 0x0 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
| 0x0 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
|-
|-
| 0x8 || 0x4 || ?
| 0x8 || 0x4 || Version
|-
| 0xC || 0x4 || [[#ApplicationViewFlag|Flag]]
|-
|-
| 0xC || 0x4 || Flags
| 0x10 || 0x18 || [[#ApplicationDownloadProgress|Progress]]
|-
|-
| 0x10 || 0x40 || ?
| 0x28 || 0x18 || [[#ApplicationApplyDeltaProgress|ApplyProgress]]
|}
|}


= ApplicationViewWithPromotionInfo =
This is converted from [[#ApplicationView]] by [[#GetApplicationViewDeprecated]] on newer system-versions as follows:
This is a 0x70-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 3,481: Line 3,512:
! Description
! Description
|-
|-
| 0x0 || 0x50 || [[#ApplicationView]]
| 0x0 || 0x20 || Same as [[#ApplicationView]] +0x0.
|-
| 0x20 || 0x4 || Same as [[#ApplicationView]] +0x20.
|-
| 0x24 || 0x2 || Same as [[#ApplicationView]] +0x24.
|-
|-
| 0x50 || 0x20 || [[#PromotionInfo]]
| 0x26 || 0x2 || Cleared to 0.
|}
|-
 
| 0x28 || 0x10 || Same as [[#ApplicationView]] +0x30.
= PromotionInfo =
|-
This is a 0x20-byte struct.
| 0x38 || 0x4 || Same as [[#ApplicationView]] +0x40.
|-
| 0x3C || 0x1 || Same as [[#ApplicationView]] +0x44.
|-
| 0x3D || 0x2 || Cleared to 0.
|-
| 0x3F || 0x1 || Cleared to 0.
|}
 
= ApplicationViewFlag =
This is "nn::ns::ApplicationViewFlag". This is a 32-bit flag.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Bit
! Size
! Description
! Description
|-
|-
| 0x0 || 0x8 || PosixTime start_timestamp.
| 0
|  
|-
| 1
|  
|-
|-
| 0x8 || 0x8 || PosixTime end_timestamp.
| 2
|  
|-
|-
| 0x10 || 0x8 || Remaining time until the promotion ends, in nanoseconds ({end_timestamp - current_time} converted to nanoseconds).
| 3
|  
|-
|-
| 0x18 || 0x4 || Not set, left at zero.
| 4
|  
|-
|-
| 0x1C || 0x1 || Flags. Bit0: whether the PromotionInfo is valid (including bit1). Bit1 clear: u64 +0x10 is set.
| 5
|  
|-
|-
| 0x1D || 0x3 || Padding
| 6
|}
|  
 
= NoDownloadRightsErrorResolution =
This is "nn::ns::NoDownloadRightsErrorResolution".
 
= BackgroundNetworkUpdateState =
{| class="wikitable" border="1"
|-
|-
!  Value
| 7
!  Description
|
|-
|-
| 0 || No sysupdate task exists.
| 8
|  
|-
|-
| 1 || Sysupdate download in progress.
| 9
|  
|-
|-
| 2 || Sysupdate ready, pending install.
| 10
|  
|-
| 11
|
|-
| 12
|
|-
| 13
|
|-
| 14
|
|-
| 15
|
|-
| 16
|
|-
| 17
|  
|}
|}


This is "nn::ns::BackgroundNetworkUpdateState". This is an u8.
= ApplicationDownloadProgress =
 
This is "nn::ns::ApplicationDownloadProgress". This is a 0x18-byte struct.
Similar to [[#HasDownloaded]], [[#GetBackgroundNetworkUpdateState]] uses [[NIM_services|nim]] ListSystemUpdateTask and [[NIM_services|nim]] GetSystemUpdateTaskInfo. When ListSystemUpdateTask successfully returns a task and GetSystemUpdateTaskInfo is successful, the output value is set to: <code>1 + *((u8*)(taskinfo+0) == 0x3</code>. Otherwise, value=0.
 
[[#GetBackgroundNetworkUpdateState]] always returns Result 0, however this will assert if GetSystemUpdateTaskInfo fails with ret!=0x3C89.


= SystemUpdateProgress =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 3,537: Line 3,603:
! Description
! Description
|-
|-
| 0x0 || 0x8 || s64 Current size. This value can be larger than total_size when the async operation is finishing. When total_size is <=0, this current_size field may contain a progress value for when the total_size is not yet determined.
| 0x0 || 0x8 || Downloaded
|-
| 0x8 || 0x8 || Total
|-
| 0x10 || 0x4 || LastResult
|-
|-
| 0x8 || 0x8 || s64 Total size, this field is only valid when >0.
| 0x14 || 0x1 || [[#ApplicationDownloadState|State]]
|-
| 0x15 || 0x3 || Reserved
|}
|}


This is "nn::ns::SystemUpdateProgress". This is a 0x10-byte struct.
= ApplicationApplyDeltaProgress =
 
This is "nn::ns::ApplicationApplyDeltaProgress". This is a 0x18-byte struct.
Commands which have this as output will return 0 with the output cleared, when no task is available.
 
= EulaDataPath =
This is "nn::ns::detail::EulaDataPath". This is a 0x100-byte struct.
 
This contains a file path.


= SystemDeliveryInfo =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 3,558: Line 3,623:
! Description
! Description
|-
|-
| 0x0 || 0x4 || SystemDeliveryProtocolVersion. Must be <= to and match [[System_Settings|system-setting]] <code>contents_delivery!system_delivery_protocol_version</code>.
| 0x0 || 0x8 || Applied
|-
|-
| 0x4 || 0x4 || ApplicationDeliveryProtocolVersion. Loaded from [[System_Settings|system-setting]] <code>contents_delivery!application_delivery_protocol_version</code>. Unused by [[#RequestSendSystemUpdate]]/[[#RequestReceiveSystemUpdate]], besides HMAC validation.
| 0x8 || 0x8 || Total
|-
|-
| 0x8 || 0x1 || HasExFat. Unused by [[#RequestSendSystemUpdate]]/[[#RequestReceiveSystemUpdate]], besides HMAC validation.
| 0x10 || 0x4 || LastResult
|-
|-
| 0x9 || 0x3 || Reserved.
| 0x14 || 0x1 || [[#ApplicationApplyDeltaState|State]]
|-
|-
| 0xC || 0x4 || SystemUpdateMetaVersion.
| 0x15 || 0x3 || Reserved
|}
 
= ApplicationDownloadState =
This is "nn::ns::ApplicationDownloadState". This is an u8.
 
{| class="wikitable" border="1"
|-
|-
| 0x10 || 0x8 || SystemUpdateMetaId.
! Value
! Description
|-
|-
| 0x18 || 0x1 || FirmwareVariationId. Used by [[#RequestSendSystemUpdate]].
| 0 || Runnable
|-
|-
| 0x19 || 0x1 || UpdatableFirmwareGroupId. Unused by [[#RequestSendSystemUpdate]]/[[#RequestReceiveSystemUpdate]], besides HMAC validation.
| 1 || Suspended
|-
|-
| 0x1A || 0x1 || PlatformRegion (0x00 = Unknown, 0x01 = Global, 0x02 = China).
| 2 || NotEnoughSpace
|-
|-
| 0x1B || 0xC5 || Unused by [[#RequestSendSystemUpdate]]/[[#RequestReceiveSystemUpdate]], besides HMAC validation.
| 3 || Fatal
|-
|-
| 0xE0 || 0x20 || HMAC-SHA256 over the previous 0xE0-bytes.
| 4 || Finished
|}
|}


This is "nn::ns::SystemDeliveryInfo". This is a 0x100-byte struct.
= ApplicationApplyDeltaState =
This is "nn::ns::ApplicationApplyDeltaState". This is an u8.


= ApplicationDeliveryInfo =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value
! Size
! Description
! Description
|-
|-
| 0x0 || 0x8 || ?
| 0 || Applying
|-
|-
| 0x8 || 0x8 || ApplicationId.
| 1 || Suspended
|-
|-
| 0x10 || 0x4 || ApplicationVersion.
| 2 || NotEnoughSpace
|-
| 0x14 || 0x4 || ?
|-
|-
| 0x18 || 0x4 || RequiredSystemVersion.
| 3 || Fatal
|-
|-
| 0x1C || 0x4 || ?
| 4 || NoTask
|-
|-
| 0x20 || 0xC0 || ?
| 5 || WaitApply
|-
|-
| 0xE0 || 0x20 || HMAC-SHA256 over the previous 0xE0-bytes. Uses a different key than [[#SystemDeliveryInfo]].
| 6 || Applied
|}
|}


This is "nn::ns::ApplicationDeliveryInfo". This is a 0x100-byte struct.
= ApplicationView =
This is "nn::ns::ApplicationView". This is a 0x50-byte struct.


= LatestSystemUpdate =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value
! Offset
! Description
! Size
! Description
|-
|-
| 1 || Unknown.
| 0x0 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
|-
|-
| 2 || Unknown.
| 0x8 || 0x4 || ?
|-
| 0xC || 0x4 || Flags
|-
|-
| Other values || Unknown.
| 0x10 || 0x40 || ?
|}
|}


This is "nn::ns::LatestSystemUpdate". This is an u8.
= ApplicationViewWithPromotionInfo =
This is a 0x70-byte struct.


= ReceiveApplicationProgress =
{| class="wikitable" border="1"
This is "nn::ns::ReceiveApplicationProgress". This is a 0x10-byte struct.
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x50 || [[#ApplicationView]]
|-
| 0x50 || 0x20 || [[#PromotionInfo]]
|}


= SendApplicationProgress =
= PromotionInfo =
This is "nn::ns::SendApplicationProgress". This is a 0x10-byte struct.
 
= ApplicationRightsOnClient =
This is a 0x20-byte struct.
This is a 0x20-byte struct.
[[qlaunch]] only uses +0x18/+0x19 in this struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 3,641: Line 3,717:
! Description
! Description
|-
|-
| 0x0 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
| 0x0 || 0x8 || PosixTime start_timestamp.
|-
|-
| 0x8 || 0x10 || [[Account_services#Uid|Uid]]
| 0x8 || 0x8 || PosixTime end_timestamp.
|-
|-
| 0x18 || 0x1 || Flags, [[qlaunch]] only uses bit0-bit4 and bit7.
| 0x10 || 0x8 || Remaining time until the promotion ends, in nanoseconds ({end_timestamp - current_time} converted to nanoseconds).
|-
|-
| 0x19 || 0x1 || Flags, [[qlaunch]] only uses bit0.
| 0x18 || 0x4 || Not set, left at zero.
|-
|-
| 0x1A || 0x6 || Unknown
| 0x1C || 0x1 || Flags. Bit0: whether the PromotionInfo is valid (including bit1). Bit1 clear: u64 +0x10 is set.
|}
|-
| 0x1D || 0x3 || Padding
|}
 
= ApplicationResourceType =
This is "nn::ns::ApplicationResourceType". This is an u8.
 
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || ApplicationResource
|-
| 1 || MicroApplicationResource
|}
 
= NoDownloadRightsErrorResolution =
This is "nn::ns::NoDownloadRightsErrorResolution".
 
= BackgroundNetworkUpdateState =
This is "nn::ns::BackgroundNetworkUpdateState". This is an u8.
 
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || None
|-
| 1 || InProgress
|-
| 2 || Ready
|}
 
Similar to [[#HasDownloaded]], [[#GetBackgroundNetworkUpdateState]] uses [[NIM_services|nim]] ListSystemUpdateTask and [[NIM_services|nim]] GetSystemUpdateTaskInfo. When ListSystemUpdateTask successfully returns a task and GetSystemUpdateTaskInfo is successful, the output value is set to: <code>1 + *((u8*)(taskinfo+0) == 0x3</code>. Otherwise, value=0.
 
[[#GetBackgroundNetworkUpdateState]] always returns Result 0, however this will assert if GetSystemUpdateTaskInfo fails with ret!=0x3C89.
 
= SystemUpdateProgress =
This is "nn::ns::SystemUpdateProgress". This is a 0x10-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x8 || Loaded (this value can be larger than total_size when the async operation is finishing and when total_size is <=0, this current_size field may contain a progress value for when the total_size is not yet determined)
|-
| 0x8 || 0x8 || Total (this field is only valid when >0)
|}
 
Commands which have this as output will return 0 with the output cleared, when no task is available.
 
= EulaDataPath =
This is "nn::ns::detail::EulaDataPath". This is a 0x100-byte struct.
 
This contains a file path.
 
= SystemDeliveryInfo =
This is "nn::ns::SystemDeliveryInfo". This is a 0x100-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x4 || SystemDeliveryProtocolVersion. Must be <= to and match [[System_Settings|system-setting]] <code>contents_delivery!system_delivery_protocol_version</code>.
|-
| 0x4 || 0x4 || ApplicationDeliveryProtocolVersion. Loaded from [[System_Settings|system-setting]] <code>contents_delivery!application_delivery_protocol_version</code>. Unused by [[#RequestSendSystemUpdate]]/[[#RequestReceiveSystemUpdate]], besides HMAC validation.
|-
| 0x8 || 0x1 || HasExFat. Unused by [[#RequestSendSystemUpdate]]/[[#RequestReceiveSystemUpdate]], besides HMAC validation.
|-
| 0x9 || 0x3 || Reserved.
|-
| 0xC || 0x4 || SystemUpdateMetaVersion.
|-
| 0x10 || 0x8 || SystemUpdateMetaId.
|-
| 0x18 || 0x1 || FirmwareVariationId. Used by [[#RequestSendSystemUpdate]].
|-
| 0x19 || 0x1 || UpdatableFirmwareGroupId. Unused by [[#RequestSendSystemUpdate]]/[[#RequestReceiveSystemUpdate]], besides HMAC validation.
|-
| 0x1A || 0x1 || PlatformRegion (0x00 = Unknown, 0x01 = Global, 0x02 = China).
|-
| 0x1B || 0xC5 || Unused by [[#RequestSendSystemUpdate]]/[[#RequestReceiveSystemUpdate]], besides HMAC validation.
|-
| 0xE0 || 0x20 || HMAC-SHA256 over the previous 0xE0-bytes.
|}
 
= ApplicationDeliveryInfo =
This is "nn::ns::ApplicationDeliveryInfo". This is a 0x100-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x8 || ?
|-
| 0x8 || 0x8 || ApplicationId.
|-
| 0x10 || 0x4 || ApplicationVersion.
|-
| 0x14 || 0x4 || ?
|-
| 0x18 || 0x4 || RequiredSystemVersion.
|-
| 0x1C || 0x4 || ?
|-
| 0x20 || 0xC0 || ?
|-
| 0xE0 || 0x20 || HMAC-SHA256 over the previous 0xE0-bytes. Uses a different key than [[#SystemDeliveryInfo]].
|}
 
= LatestSystemUpdate =
This is "nn::ns::LatestSystemUpdate". This is an u8.
 
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || UpToDate
|-
| 1 || Downloaded
|-
| 2 || NeedsDownload
|}
 
= ReceiveApplicationProgress =
This is "nn::ns::ReceiveApplicationProgress". This is a 0x10-byte struct.
 
= SendApplicationProgress =
This is "nn::ns::SendApplicationProgress". This is a 0x10-byte struct.
 
= ApplicationRightsOnClient =
This is a 0x20-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
|-
| 0x8 || 0x10 || [[Account_services#Uid|Uid]]
|-
| 0x18 || 0x1 || Flags, [[qlaunch]] only uses bit0-bit4 and bit7.
|-
| 0x19 || 0x1 || Flags, [[qlaunch]] only uses bit0.
|-
| 0x1A || 0x6 || Unknown
|}
 
[[qlaunch]] only uses +0x18/+0x19 in this struct.
 
= DownloadTaskStatus =
This is "nn::ns::DownloadTaskStatus". This is a 0x20-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x10 || Uuid
|-
| 0x10 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
|-
| 0x18 || 0x1 || [[#DownloadTaskStatusDetail|Detail]]
|-
| 0x19 || 0x1 || NeedsCleanup
|-
| 0x1A || 0x2 || Reserved
|-
| 0x1C || 0x4 || Result
|}
 
= DownloadTaskStatusDetail =
This is "nn::ns::DownloadTaskStatusDetail". This is an u8.
 
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || Created
|-
| 1 || Added
|-
| 2 || AlreadyExists
|-
| 3 || Failed
|}
 
= ApplicationLaunchInfo =
This is a 0x40-byte struct.
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
|-
| 0x8 || 0x4 || Application version
|-
| 0xC || 0x4 || [[Process_Manager_services#LaunchFlags|LaunchFlags]], set to hard-coded value 0xB by [[#GetApplicationLaunchInfo]].
|-
| 0x10 || 0x1 || Application [[NCM_services#StorageId|StorageId]]
|-
| 0x11 || 0x1 || Update [[NCM_services#StorageId|StorageId]]
|-
| 0x12 || 0x2E ||
|}


= DownloadTaskStatus =
= UserData =
This is "nn::ns::DownloadTaskStatus". This is a 0x20-byte struct.
This is a 0x80-byte struct.
 
= ApplicationLaunchInfo =
This is a 0x40-byte struct.


{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0 || 0x8 || [[NCM_services#ApplicationId|ApplicationId]]
|-
| 0x8 || 0x4 || Application version
|-
| 0xC || 0x4 || [[Process_Manager_services#LaunchFlags|LaunchFlags]], set to hard-coded value 0xB by [[#GetApplicationLaunchInfo]].
|-
| 0x10 || 0x1 || Application [[NCM_services#StorageId|StorageId]]
|-
| 0x11 || 0x1 || Update [[NCM_services#StorageId|StorageId]]
|-
| 0x12 || 0x2E ||
|}
= UserData =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 3,695: Line 3,968:
|}
|}


This is a 0x80-byte struct.
= ProfileBase =
This is a 0x38-byte struct.


= ProfileBase =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 3,709: Line 3,982:
|-
|-
|}
|}
This is a 0x38-byte struct.


= Uid =
= Uid =