Profile Selector

From Nintendo Switch Brew
Revision as of 02:37, 19 December 2019 by Yellows8 (talk | contribs) (→‎Usage)
Jump to navigation Jump to search

This is the applet presented when launching a game that allows the user to select a user.

See AM_services#Library_Applets.

Library Applet Versions

System Version Value
[1.0.0+] 0x1
[2.0.0+] 0x10000
[6.0.0+] 0x20000

UiSettings

This is "nn::account::UiSettings".

Offset Size Description
0x0 0x4 #UiMode
0x4 0x4 Padding.
0x8 0x80 u128 invalidUidList[8]. This is copied from #UserSelectionSettings.
0x88 0x8 ApplicationId with ShowUserSelectorForLauncher.
0x90 0x1 u8 isNetworkServiceAccountRequired. This is copied from #UserSelectionSettings.
0x91 0x1 u8 isSkipEnabled. This is copied from #UserSelectionSettings.
0x92 0x1 Set to 0x1 by ShowUserSelectorForSystem/ShowUserSelectorForLauncher.
0x93 0x1 u8 isPermitted. ShowUserSelector* sets this to the output bool from IsUserRegistrationRequestPermitted. With UserSelector this enables the option to create a new user. When not set, a dialog will be displayed when the user attempts to create an user.
0x94 0x1 u8 showSkipButton. This is copied from #UserSelectionSettings.
0x95 0x1 u8 additionalSelect. This is copied from #UserSelectionSettings.
0x96 0x1 [2.0.0+] This is copied from #UserSelectionSettingsForSystemService+0x4. ShowUserSelectorForLauncher/ShowUserSelector sets this to value 1.
0x97 0x1 [6.0.0+] Set to #UserSelectionSettings isUnqualifiedUserSelectable ^ 1.
0x98 0x4 [2.0.0+] This is copied from the 4-bytes at #UserSelectionSettingsForSystemService+0x0.
0x9C 0x4

This has size 0xA0 (0x98 with [1.0.0]) and seems to only affect the UI display. Typical value is all zero with byte 0x96 equal to 0x01. Setting the first byte to 1 will make the applet display in order to create a new user. "starter" sets the first byte to 5 in order to display initial user setup.

UiMode

This is "nn::account::UiMode".

Value Description
0 UserSelector
1 UserCreator
2 EnsureNetworkServiceAccountAvailable
3 UserIconEditor
4 UserNicknameEditor
5 UserCreatorForStarter
6 NintendoAccountAuthorizationRequestContext
7 IntroduceExternalNetworkServiceAccount
8 [6.0.0+] IntroduceExternalNetworkServiceAccountForRegistration
9 [6.0.0+] NintendoAccountNnidLinker
10 [6.0.0+] LicenseRequirementsForNetworkService
11 [7.0.0+] LicenseRequirementsForNetworkServiceWithUserContextImpl
12 [7.0.0+] UserCreatorForImmediateNaLoginTest

UserSelectionSettings

This is "nn::account::UserSelectionSettings ".

Offset Size Description
0x0 0x80 u128 invalidUidList[8]
0x80 0x1 u8 isSkipEnabled
0x81 0x1 u8 isNetworkServiceAccountRequired. Whether the user needs to be linked to a Nintendo account.
0x82 0x1 u8 showSkipButton. Enables the option to skip user selection with a button.
0x83 0x1 u8 additionalSelect
0x84 0x1 [6.0.0+] u8 isUnqualifiedUserSelectable

ShowUserSelector* calls ShowUserSelectorCommon for launching the applet, which does the following:

  • When isSkipEnabled is set, the first user in invalidUidList must not be set, and additionalSelect must be 0 (asserting otherwise). When enabled TrySelectUserWithoutInteraction will be used to select the user (with isNetworkServiceAccountRequired), in this case the applet will only be launched if that cmd doesn't return an user.

UserSelectionSettingsForSystemService

This is "nn::account::UserSelectionSettingsForSystemService". This was added as an additional input param with sdknso [2.0.0+].

Offset Size Description
0x0 0x4 #UserSelectionPurpose
0x4 0x1 Enables the user-creation button when set. Whether user-creation when pressing the button is actually allowed is controlled by #UiSettings isPermitted.
0x5 0x3 u8 padding[3]

UiReturnArg

This is "nn::account::UiReturnArg". This is the struct for the output storage.

Offset Size Description
0x0 0x8 Result. Returned directly as the Result when launching is successful.
0x8 0x10 Uid of selected user, only used with UserSelector when no error is thrown (see above Result).

NintendoAccountStartupDialogType

This is "nn::account::NintendoAccountStartupDialogType".

Value Description
0 LoginAndCreate
1 Login
2 Create

UserSelectionPurpose

This is "nn::account::UserSelectionPurpose". This controls the UI message text to display with UserSelector. Invalid values are handled as value 0.

Value Description UI message text
0 General "Select a user."
1 [2.0.0+] GameCardRegistration "Who will receive the points?"
2 [2.0.0+] EShopLaunch "Who is using Nintendo eShop?"
3 [2.0.0+] EShopItemShow "Who is making this purchase?"
4 [2.0.0+] PicturePost "Who is posting?"
5 [2.0.0+] NintendoAccountLinkage "Select a user to link to a Nintendo Account."
6 [2.0.0+] SettingsUpdate "Change settings for which user?"
7 [2.0.0+] SaveDataDeletion "Format data for which user?"
8 [4.0.0+] UserMigration "Which user will be transferred to another console?"
9 [8.0.0+] SaveDataTransfer(?) "Send save data for which user?"

Usage

User-processes should push a common arguments struct and #UiSettings. Official sw can optionally push an additional storage from CreateTransferMemoryStorage with flag=0 using an input buffer when that input buffer is not NULL, however sdknso itself doesn't use this besides a wrapper func which sdknso itself doesn't call (the applet itself ignores this storage, at least with [9.1.0+]). After launching the applet and waiting for it to finish, on success the output storage #UiReturnArg should be popped.