From de962298cc55438cd54c854bf8ac9bc9a1ef7218 Mon Sep 17 00:00:00 2001 From: Miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sat, 4 Jun 2022 22:58:59 +0200 Subject: [PATCH] Add nn::fp lib (#205) --- include/nn/fp.h | 8 + include/nn/fp/fp_cpp.h | 675 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 683 insertions(+) create mode 100644 include/nn/fp.h create mode 100644 include/nn/fp/fp_cpp.h diff --git a/include/nn/fp.h b/include/nn/fp.h new file mode 100644 index 00000000..bc7d89c8 --- /dev/null +++ b/include/nn/fp.h @@ -0,0 +1,8 @@ +#pragma once + +/** + * \defgroup nn_fp nn_fp + * Friend Presence API + */ + +#include diff --git a/include/nn/fp/fp_cpp.h b/include/nn/fp/fp_cpp.h new file mode 100644 index 00000000..8f4f0815 --- /dev/null +++ b/include/nn/fp/fp_cpp.h @@ -0,0 +1,675 @@ +#pragma once +#include +#include +#include +#include + +/** + * \defgroup nn_fp_fp Friends Presence + * \ingroup nn_fp + * See \link nn::fp \endlink. + * + * @{ + */ + +#ifdef __cplusplus + +namespace nn +{ +namespace fp +{ + + +enum NotificationType +{ + NOTIFICATION_ONLINE = 1, + NOTIFICATION_OFFLINE = 2, + NOTIFICATION_PREFERENCE = 3, + NOTIFICATION_FRIEND_ONLINE = 4, + NOTIFICATION_FRIEND_OFFLINE = 5, + NOTIFICATION_FRIEND_PRESENCE = 6, + NOTIFICATION_FRIEND_MII = 7, + NOTIFICATION_FRIEND_PROFILE = 8, + NOTIFICATION_FRIEND_ADDED = 9, + NOTIFICATION_FRIEND_REMOVED = 10, + NOTIFICATION_MY_REQUEST_ADDED = 11, + NOTIFICATION_MY_REQUEST_REMOVED = 12, + NOTIFICATION_MY_REQUEST_UPDATED = 13, + NOTIFICATION_BLACKLIST_ADDED = 14, + NOTIFICATION_BLACKLIST_REMOVED = 15, + NOTIFICATION_BLACKLIST_UPDATED = 16, + NOTIFICATION_REQUEST_ADDED = 17, + NOTIFICATION_REQUEST_REMOVED = 18, + + //! TODO: find all notification types +}; +struct DateTime +{ + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; // hour-1 + uint8_t minutes; + uint8_t seconds; // unsure + uint8_t milliseconds; // unsure +}; +WUT_CHECK_OFFSET(DateTime, 0x00, year); +WUT_CHECK_OFFSET(DateTime, 0x02, month); +WUT_CHECK_OFFSET(DateTime, 0x03, day); +WUT_CHECK_OFFSET(DateTime, 0x04, hour); +WUT_CHECK_OFFSET(DateTime, 0x05, minutes); +WUT_CHECK_OFFSET(DateTime, 0x06, seconds); +WUT_CHECK_OFFSET(DateTime, 0x07, milliseconds); +WUT_CHECK_SIZE(DateTime, 0x08); + +struct GameKey +{ + uint64_t titleId; + uint16_t unk_0x8; + uint32_t unk_0xC; +}; +WUT_CHECK_OFFSET(GameKey, 0x00, titleId); +WUT_CHECK_SIZE(GameKey, 0x10); + +struct RecentPlayRecord +{ + nn::act::PrincipalId principalId; + uint16_t unk_0x04; + char16_t inGameName[nn::act::AccountIdSize]; + char16_t myMiiName[nn::act::AccountIdSize]; +}; +WUT_CHECK_OFFSET(RecentPlayRecord, 0x00, principalId); +WUT_CHECK_OFFSET(RecentPlayRecord, 0x04, unk_0x04); +WUT_CHECK_OFFSET(RecentPlayRecord, 0x06, inGameName); +WUT_CHECK_OFFSET(RecentPlayRecord, 0x28, myMiiName); +WUT_CHECK_SIZE(RecentPlayRecord, 0x4C); + +struct RecentPlayRecordEx +{ + RecentPlayRecord playRecord; + GameKey game; + DateTime date; +}; +WUT_CHECK_OFFSET(RecentPlayRecordEx, 0x00, playRecord); +WUT_CHECK_OFFSET(RecentPlayRecordEx, 0x50, game); +WUT_CHECK_OFFSET(RecentPlayRecordEx, 0x60, date); +WUT_CHECK_SIZE(RecentPlayRecordEx, 0x68); + +struct Preference +{ + bool unk_0x00; + bool unk_0x01; + bool unk_0x02; + WUT_PADDING_BYTES(1); +}; +WUT_CHECK_SIZE(Preference, 0x04); + +struct GameMode +{ + BOOL joinAvailabilityFlag; + uint32_t matchmakeSystemType; // 2 ?? + uint32_t joinGameId; + uint32_t joinGameMode; + //! only set when joinAvailabilityFlag is TRUE + nn::act::PrincipalId ownerPrincipalId; + uint32_t joinGroupId; + uint8_t applicationArg[0x14]; +}; +WUT_CHECK_OFFSET(GameMode, 0x00, joinAvailabilityFlag); +WUT_CHECK_OFFSET(GameMode, 0x04, matchmakeSystemType); +WUT_CHECK_OFFSET(GameMode, 0x08, joinGameId); +WUT_CHECK_OFFSET(GameMode, 0x0C, joinGameMode); +WUT_CHECK_OFFSET(GameMode, 0x10, ownerPrincipalId); +WUT_CHECK_OFFSET(GameMode, 0x14, joinGroupId); +WUT_CHECK_OFFSET(GameMode, 0x18, applicationArg); +WUT_CHECK_SIZE(GameMode, 0x2C); + +struct Presence +{ + GameMode gameMode; + uint8_t region; + uint8_t language; + uint8_t platform; +}; +WUT_CHECK_OFFSET(Presence, 0x00, gameMode); +WUT_CHECK_OFFSET(Presence, 0x2C, region); +WUT_CHECK_OFFSET(Presence, 0x2D, language); +WUT_CHECK_OFFSET(Presence, 0x2E, platform); +WUT_CHECK_SIZE(Presence, 0x30); + +struct FriendPresence : Presence +{ + bool isOnline; + bool isValid; +}; +WUT_CHECK_OFFSET(FriendPresence, 0x30, isOnline); +WUT_CHECK_OFFSET(FriendPresence, 0x31, isValid); +WUT_CHECK_SIZE(FriendPresence, 0x34); + +struct MyPresence : Presence +{ + char16_t presenceText[64]; +}; +WUT_CHECK_OFFSET(MyPresence, 0x30, presenceText); +WUT_CHECK_SIZE(MyPresence, 0xB0); + +//! TODO: find member types and names +struct BasicInfo +{ + WUT_UNKNOWN_BYTES(0x68); +}; +WUT_CHECK_SIZE(BasicInfo, 0x68); + +//! TODO: find member types and names +struct BlackListedPrincipal +{ + WUT_UNKNOWN_BYTES(0xB0); +}; +WUT_CHECK_SIZE(BlackListedPrincipal, 0xB0); + +//! TODO: find member types and names +struct Profile +{ + WUT_UNKNOWN_BYTES(4); +}; +WUT_CHECK_SIZE(Profile, 0x04); + +struct Comment +{ + uint8_t unk_0x00; // probably bool isVisible + uint8_t unk_0x01; // probably bool + char16_t comment[17]; +}; +WUT_CHECK_OFFSET(Comment, 0x00, unk_0x00); +WUT_CHECK_OFFSET(Comment, 0x01, unk_0x01); +WUT_CHECK_OFFSET(Comment, 0x02, comment); +WUT_CHECK_SIZE(Comment, 0x24); + +struct FriendData +{ + /*! TODO: find types and names */ + WUT_UNKNOWN_BYTES(0x228); +}; +WUT_CHECK_SIZE(FriendData, 0x228); + +struct GameModeDescription +{ + /*! TODO: find size and member types/names */ +}; + +struct FriendRequest +{ + /* Notes: + * MaxCharsOnKBD = char16_t[63] + * Real Buffer prolly = char16_t[64] + **/ + WUT_UNKNOWN_BYTES(0x164); +}; +WUT_CHECK_SIZE(FriendRequest, 0x164); + +typedef void(*FPAsyncCallback)(nn::Result, void *); +typedef void(*NotificationHandlerFn)(nn::fp::NotificationType, nn::act::PrincipalId, void *); + +nn::Result +AcceptFriendRequestAsync(nn::act::LocalFriendCode/*unsure*/, FPAsyncCallback, void *) + asm("AcceptFriendRequestAsync__Q2_2nn2fpFULPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +AddBlackListAsync(nn::act::PrincipalId, nn::fp::GameKey *, FPAsyncCallback, void *) + asm("AddBlackListAsync__Q2_2nn2fpFUiPCQ3_2nn2fp7GameKeyPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +AddBlackListAsync(nn::act::PrincipalId, FPAsyncCallback, void *) + asm("AddBlackListAsync__Q2_2nn2fpFUiPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +AddFriendAsync(char nnid[nn::act::AccountIdSize]/*unsure*/, FPAsyncCallback, void *) + asm("AddFriendAsync__Q2_2nn2fpFPCcPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +AddFriendAsync(nn::act::PrincipalId /*unsure*/, FPAsyncCallback, void *) + asm("AddFriendAsync__Q2_2nn2fpFUiPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +AddFriendRequestAsync(const nn::fp::RecentPlayRecordEx *, const char16_t *, FPAsyncCallback, void *) + asm("AddFriendRequestAsync__Q2_2nn2fpFPCQ3_2nn2fp18RecentPlayRecordExPCwPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +AddFriendRequestAsync(unsigned int, unsigned char, const char16_t *, unsigned char, const char16_t *, FPAsyncCallback, void *) + asm("AddFriendRequestAsync__Q2_2nn2fpFUiUcPCwT2T3PFQ2_2nn6ResultPv_vPv"); + + +nn::Result +AddFriendRequestNoTitleAsync(unsigned int, unsigned char, const char16_t *, unsigned char, const char16_t *, FPAsyncCallback, void *) + asm("AddFriendRequestNoTitleAsync__Q2_2nn2fpFUiUcPCwT2T3PFQ2_2nn6ResultPv_vPv"); + + +nn::Result +AddRecentPlayRecordEx(const nn::fp::RecentPlayRecordEx *, unsigned int) + asm("AddRecentPlayRecordEx__Q2_2nn2fpFPCQ3_2nn2fp18RecentPlayRecordExUi"); + + +nn::Result +AddRecentPlayRecord(const nn::fp::RecentPlayRecord *, unsigned int) + asm("AddRecentPlayRecord__Q2_2nn2fpFPCQ3_2nn2fp16RecentPlayRecordUi"); + + +nn::Result +CancelFriendRequestAsync(nn::act::LocalFriendCode/*unsure*/, FPAsyncCallback, void *) + asm("CancelFriendRequestAsync__Q2_2nn2fpFULPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +CheckSettingStatusAsync(unsigned char *, FPAsyncCallback, void *) + asm("CheckSettingStatusAsync__Q2_2nn2fpFPUcPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +ClearLedEvent(void) + asm("ClearLedEvent__Q2_2nn2fpFv"); + + +nn::Result +DeleteFriendFlagsAsync(const unsigned int *, unsigned int, unsigned int, FPAsyncCallback, void *) + asm("DeleteFriendFlagsAsync__Q2_2nn2fpFPCUiUiT2PFQ2_2nn6ResultPv_vPv"); + + +nn::Result +DeleteFriendRequestAsync(nn::act::LocalFriendCode/*unsure*/, FPAsyncCallback, void *) + asm("DeleteFriendRequestAsync__Q2_2nn2fpFULPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +DeleteRecentPlayRecordAll(void) + asm("DeleteRecentPlayRecordAll__Q2_2nn2fpFv"); + + +nn::Result +DeleteSaveDirectory(unsigned int) + asm("DeleteSaveDirectory__Q2_2nn2fpFUi"); + + +nn::Result +DenyFriendRequestAsync(nn::act::LocalFriendCode/*unsure*/, FPAsyncCallback, void *) + asm("DenyFriendRequestAsync__Q2_2nn2fpFULPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +DetectNatPropertiesAsync(unsigned char *, unsigned char *, unsigned int *, FPAsyncCallback, void *) + asm("DetectNatPropertiesAsync__Q2_2nn2fpFPUcT1PUiPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +FinalizeAdmin(void) + asm("FinalizeAdmin__Q2_2nn2fpFv"); + + +nn::Result +Finalize(void) + asm("Finalize__Q2_2nn2fpFv"); + + +nn::Result +GetBasicInfoAsync(nn::fp::BasicInfo *, unsigned int *, unsigned int, FPAsyncCallback, void *) + asm("GetBasicInfoAsync__Q2_2nn2fpFPQ3_2nn2fp9BasicInfoPCUiUiPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +GetBlackListAccountId(char *outAccountIds, unsigned int *, unsigned int) + asm("GetBlackListAccountId__Q2_2nn2fpFPA17_cPCUiUi"); + + +nn::Result +GetBlackListAdditionalTime(nn::fp::DateTime *, unsigned int *, unsigned int) + asm("GetBlackListAdditionalTime__Q2_2nn2fpFPQ3_2nn2fp8DateTimePCUiUi"); + + +nn::Result +GetBlackListEx(nn::fp::BlackListedPrincipal *outBlackList, unsigned int *, unsigned int) + asm("GetBlackListEx__Q2_2nn2fpFPQ3_2nn2fp20BlackListedPrincipalPCUiUi"); + + +nn::Result +GetBlackList(nn::act::PrincipalId *outBlackListPrincipalBuffer, unsigned int *outBlackListPrincipalBufferSize, unsigned int/*unk*/, unsigned int maxReadCount) + asm("GetBlackList__Q2_2nn2fpFPUiT1UiT3"); + + +nn::Result +GetFriendAccountId(char *outAccountIdBuffer, nn::act::PrincipalId *principalBuffer, unsigned int accountIdBufferSize) + asm("GetFriendAccountId__Q2_2nn2fpFPA17_cPCUiUi"); + + +nn::Result +GetFriendApprovalTime(nn::fp::DateTime *outDateTime, unsigned int *, unsigned int) + asm("GetFriendApprovalTime__Q2_2nn2fpFPQ3_2nn2fp8DateTimePCUiUi"); + + +nn::Result +GetFriendComment(nn::fp::Comment *outComment, unsigned int *, unsigned int) + asm("GetFriendComment__Q2_2nn2fpFPQ3_2nn2fp7CommentPCUiUi"); + + +nn::Result +GetFriendListAll(unsigned int *, unsigned int *, unsigned int, unsigned int) + asm("GetFriendListAll__Q2_2nn2fpFPUiT1UiT3"); + + +nn::Result +GetFriendListEx(nn::fp::FriendData *outFriendData, nn::act::PrincipalId *principalBuffer, unsigned int count) + asm("GetFriendListEx__Q2_2nn2fpFPQ3_2nn2fp10FriendDataPCUiUi"); + + +nn::Result +GetFriendList(nn::act::PrincipalId *outPrincipalBuffer, unsigned int *outPrincipalBufferReadCount, unsigned int unkn/*slotId maybe*/, unsigned int principalBufferSize) + asm("GetFriendList__Q2_2nn2fpFPUiT1UiT3"); + + +nn::Result +GetFriendMii(FFLStoreData *outMiiData, nn::act::PrincipalId *principalBuffer, unsigned int count) + asm("GetFriendMii__Q2_2nn2fpFP12FFLStoreDataPCUiUi"); + + +nn::Result +GetFriendPlayingGame(nn::fp::GameKey *outGameKey, nn::fp::GameModeDescription *outGameModeDescription, nn::act::PrincipalId *principalBuffer, unsigned int maxReadCount) + asm("GetFriendPlayingGame__Q2_2nn2fpFPQ3_2nn2fp7GameKeyPQ3_2nn2fp19GameModeDescriptionPCUiUi"); + + +nn::Result +GetFriendPresenceEx(nn::fp::FriendPresence *, nn::act::PrincipalId *principalBuffer, unsigned int maxReadCount) + asm("GetFriendPresenceEx__Q2_2nn2fpFPQ3_2nn2fp14FriendPresencePCUiUi"); + + +nn::Result +GetFriendPresence(nn::fp::FriendPresence *, nn::act::PrincipalId *principalBuffer, unsigned int count) + asm("GetFriendPresence__Q2_2nn2fpFPQ3_2nn2fp14FriendPresencePCUiUi"); + + +nn::Result +GetFriendProfile(nn::fp::Profile *, nn::act::PrincipalId *principalBuffer, unsigned int readCount) + asm("GetFriendProfile__Q2_2nn2fpFPQ3_2nn2fp7ProfilePCUiUi"); + + +nn::Result +GetFriendRelationship(uint8_t *outRelationshipNum, nn::act::PrincipalId *principalBuffer, unsigned int count) + asm("GetFriendRelationship__Q2_2nn2fpFPUcPCUiUi"); + + +nn::Result +GetFriendRequestAccountId(char *outAccountIds, nn::act::PrincipalId *principalBuffer, unsigned int count) + asm("GetFriendRequestAccountId__Q2_2nn2fpFPA17_cPCUiUi"); + + +nn::Result +GetFriendRequestListEx(nn::fp::FriendRequest *, nn::act::PrincipalId *principalBuffer, unsigned int count) + asm("GetFriendRequestListEx__Q2_2nn2fpFPQ3_2nn2fp13FriendRequestPCUiUi"); + + +nn::Result +GetFriendRequestList(nn::act::PrincipalId *outBuffer, unsigned int *outReadCount, unsigned int/*unk*/, unsigned int count) + asm("GetFriendRequestList__Q2_2nn2fpFPUiT1UiT3"); + + +nn::Result +GetFriendRequestMessageId(unsigned long long *outMessageIds, unsigned int *, unsigned int) + asm("GetFriendRequestMessageId__Q2_2nn2fpFPULPCUiUi"); + + +nn::Result +GetFriendScreenName(char16_t outScreenName[nn::act::MiiNameSize], unsigned int *, unsigned int, bool, unsigned char *) + asm("GetFriendScreenName__Q2_2nn2fpFPA11_wPCUiUibPUc"); + + +nn::Result +GetFriendSortTime(nn::fp::DateTime *, nn::act::PrincipalId *principalBuffer, unsigned int count) + asm("GetFriendSortTime__Q2_2nn2fpFPQ3_2nn2fp8DateTimePCUiUi"); + + +nn::Result +GetLastLedEvent(unsigned int *, unsigned int *) + asm("GetLastLedEvent__Q2_2nn2fpFPUiT1"); + + +nn::Result +GetMyAccountId(char *outAccountId) + asm("GetMyAccountId__Q2_2nn2fpFPc"); + + +nn::Result +GetMyComment(nn::fp::Comment *outComment) + asm("GetMyComment__Q2_2nn2fpFPQ3_2nn2fp7Comment"); + + +nn::Result +GetMyMii(FFLStoreData *outMiiData) + asm("GetMyMii__Q2_2nn2fpFP12FFLStoreData"); + + +nn::Result +GetMyPlayingGame(nn::fp::GameKey *outPlayingGmae) + asm("GetMyPlayingGame__Q2_2nn2fpFPQ3_2nn2fp7GameKey"); + + +nn::Result +GetMyPreference(nn::fp::Preference *outPreference) + asm("GetMyPreference__Q2_2nn2fpFPQ3_2nn2fp10Preference"); + + +nn::Result +GetMyPresence(nn::fp::MyPresence *outMyPresence) + asm("GetMyPresence__Q2_2nn2fpFPQ3_2nn2fp10MyPresence"); + + +nn::act::PrincipalId +GetMyPrincipalId(void) + asm("GetMyPrincipalId__Q2_2nn2fpFv"); + + +nn::Result +GetMyProfile(nn::fp::Profile *outProfile) + asm("GetMyProfile__Q2_2nn2fpFPQ3_2nn2fp7Profile"); + + +nn::Result +GetMyScreenName(char16_t *outScreenName) + asm("GetMyScreenName__Q2_2nn2fpFPw"); + + +nn::Result +GetRecentPlayRecord(nn::fp::RecentPlayRecordEx *outPlayRecordBuffer, unsigned int *outPlayRecordBufferSize, unsigned int, unsigned int maxReadCount) + asm("GetRecentPlayRecord__Q2_2nn2fpFPQ3_2nn2fp18RecentPlayRecordExPUiUiT3"); + + +nn::Result +GetRequestBlockSettingAsync(unsigned char *, unsigned int *, unsigned int, FPAsyncCallback, void *) + asm("GetRequestBlockSettingAsync__Q2_2nn2fpFPUcPCUiUiPFQ2_2nn6ResultPv_vPv"); + + +bool +HasLoggedIn(void) + asm("HasLoggedIn__Q2_2nn2fpFv"); + + +nn::Result +InitializeAdmin(void) + asm("InitializeAdmin__Q2_2nn2fpFv"); + + +nn::Result +Initialize(void) + asm("Initialize__Q2_2nn2fpFv"); + + +bool +IsFriendRequestAllowed(void) + asm("IsFriendRequestAllowed__Q2_2nn2fpFv"); + + +bool +IsInitializedAdmin(void) + asm("IsInitializedAdmin__Q2_2nn2fpFv"); + + +bool +IsInitialized(void) + asm("IsInitialized__Q2_2nn2fpFv"); + + +bool +IsInvitation(nn::fp::GameMode *, nn::act::PrincipalId myPrincipalId, unsigned int/*unk*/) + asm("IsInvitation__Q2_2nn2fpFPCQ3_2nn2fp8GameModeUiT2"); + + +bool +IsJoinableForFriendListViewer(nn::fp::FriendPresence *, unsigned int, unsigned long long) + asm("IsJoinableForFriendListViewer__Q2_2nn2fpFPCQ3_2nn2fp14FriendPresenceUiUL"); + + +bool +IsJoinableForFriendListViewer(nn::fp::Presence *, unsigned int, unsigned long long) + asm("IsJoinableForFriendListViewer__Q2_2nn2fpFPCQ3_2nn2fp8PresenceUiUL"); + + +bool +IsJoinable(nn::fp::FriendPresence *, unsigned long long) + asm("IsJoinable__Q2_2nn2fpFPCQ3_2nn2fp14FriendPresenceUL"); + + +bool +IsOnline(void) + asm("IsOnline__Q2_2nn2fpFv"); + + +bool +IsPreferenceValid(void) + asm("IsPreferenceValid__Q2_2nn2fpFv"); + + +bool +IsRecentPlayRecordCorrupted(void) + asm("IsRecentPlayRecordCorrupted__Q2_2nn2fpFv"); + + +bool +IsRequestBlockForced(void) + asm("IsRequestBlockForced__Q2_2nn2fpFv"); + + +nn::Result +LoginAsync(FPAsyncCallback, void *) + asm("LoginAsync__Q2_2nn2fpFPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +Logout(void) + asm("Logout__Q2_2nn2fpFv"); + + +nn::Result +MarkFriendRequestsAsReceivedAsync(unsigned long long *, unsigned int, FPAsyncCallback, void *) + asm("MarkFriendRequestsAsReceivedAsync__Q2_2nn2fpFPCULUiPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +RegisterAccountAsync(FPAsyncCallback, void *) + asm("RegisterAccountAsync__Q2_2nn2fpFPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +RemoveBlackListAsync(unsigned int, FPAsyncCallback, void *) + asm("RemoveBlackListAsync__Q2_2nn2fpFUiPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +RemoveFriendAsync(unsigned int, FPAsyncCallback, void *) + asm("RemoveFriendAsync__Q2_2nn2fpFUiPFQ2_2nn6ResultPv_vPv"); + + +uint32_t +ResultToErrorCode(nn::Result) + asm("ResultToErrorCode__Q2_2nn2fpFQ2_2nn6Result"); + + +nn::Result +SetInvitationParameter(nn::fp::GameMode *, unsigned int *, unsigned int, bool) + asm("SetInvitationParameter__Q2_2nn2fpFPQ3_2nn2fp8GameModePCUiUib"); + + +nn::Result +SetLedEventMask(uint32_t) + asm("SetLedEventMask__Q2_2nn2fpFUi"); + + +nn::Result +SetNotificationHandler(uint32_t /*notificationFlags = 1 << NotificationType */, NotificationHandlerFn, void *) + asm("SetNotificationHandler__Q2_2nn2fpFUiPFQ3_2nn2fp16NotificationTypeUiPv_vPv"); + + +nn::Result +UnlockParentalControlTemporarily(const char pinCode[5]) + asm("UnlockParentalControlTemporarily__Q2_2nn2fpFPCc"); + + +nn::Result +UpdateCommentAsync(const char16_t *, FPAsyncCallback, void *) + asm("UpdateCommentAsync__Q2_2nn2fpFPCwPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +UpdateGameModeDescription(const char16_t *description) + asm("UpdateGameModeDescription__Q2_2nn2fpFPCw"); + + +nn::Result +UpdateGameModeEx(nn::fp::GameMode *, const char16_t *) + asm("UpdateGameModeEx__Q2_2nn2fpFPCQ3_2nn2fp8GameModePCw"); + + +nn::Result +UpdateGameModeForOverlayApplication(nn::fp::GameMode *, const char16_t *) + asm("UpdateGameModeForOverlayApplication__Q2_2nn2fpFPCQ3_2nn2fp8GameModePCw"); + + +nn::Result +UpdateGameMode(nn::fp::GameMode *, const char16_t *) + asm("UpdateGameMode__Q2_2nn2fpFPCQ3_2nn2fp8GameModePCw"); + + +nn::Result +UpdateGameMode(nn::fp::GameMode *, const char16_t *, unsigned int) + asm("UpdateGameMode__Q2_2nn2fpFPCQ3_2nn2fp8GameModePCwUi"); + + +nn::Result +UpdateMiiAsync(FFLStoreData *, char16_t *, FPAsyncCallback, void *) + asm("UpdateMiiAsync__Q2_2nn2fpFPC12FFLStoreDataPCwPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +UpdateMiiAsync(FFLStoreData *miiData, FPAsyncCallback, void *) + asm("UpdateMiiAsync__Q2_2nn2fpFPC12FFLStoreDataPFQ2_2nn6ResultPv_vPv"); + + +nn::Result +UpdatePlayingGame(nn::fp::GameKey *, unsigned int) + asm("UpdatePlayingGame__Q2_2nn2fpFPCQ3_2nn2fp7GameKeyUi"); + + +nn::Result +UpdatePlayingOverlayApplication(nn::fp::GameKey *, unsigned int) + asm("UpdatePlayingOverlayApplication__Q2_2nn2fpFPCQ3_2nn2fp7GameKeyUi"); + + +nn::Result +UpdatePreferenceAsync(nn::fp::Preference *, FPAsyncCallback, void *) + asm("UpdatePreferenceAsync__Q2_2nn2fpFPCQ3_2nn2fp10PreferencePFQ2_2nn6ResultPv_vPv"); + +} // namespace fp +} // namespace nn + +#endif // ifdef __cplusplus \ No newline at end of file