Profile Selector
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.