mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-31 19:48:53 +00:00
Compare commits
5 Commits
a43d439c98
...
141e2c51cb
| Author | SHA1 | Date | |
|---|---|---|---|
| 141e2c51cb | |||
| 7798d7c8ff | |||
| 10d9f5f995 | |||
| 9cd094bfb5 | |||
| bc3fc27967 |
@@ -444,8 +444,6 @@ add_library(core STATIC
|
||||
hle/service/am/process_creation.h
|
||||
hle/service/am/process_holder.cpp
|
||||
hle/service/am/process_holder.h
|
||||
hle/service/am/service/applet_common_functions.cpp
|
||||
hle/service/am/service/applet_common_functions.h
|
||||
hle/service/am/service/application_accessor.cpp
|
||||
hle/service/am/service/application_accessor.h
|
||||
hle/service/am/service/application_creator.cpp
|
||||
@@ -458,8 +456,6 @@ add_library(core STATIC
|
||||
hle/service/am/service/common_state_getter.h
|
||||
hle/service/am/service/cradle_firmware_updater.cpp
|
||||
hle/service/am/service/cradle_firmware_updater.h
|
||||
hle/service/am/service/debug_functions.cpp
|
||||
hle/service/am/service/debug_functions.h
|
||||
hle/service/am/service/display_controller.cpp
|
||||
hle/service/am/service/display_controller.h
|
||||
hle/service/am/service/global_state_controller.cpp
|
||||
@@ -476,8 +472,6 @@ add_library(core STATIC
|
||||
hle/service/am/service/self_controller.h
|
||||
hle/service/am/service/storage.cpp
|
||||
hle/service/am/service/storage.h
|
||||
hle/service/am/service/storage_accessor.cpp
|
||||
hle/service/am/service/storage_accessor.h
|
||||
hle/service/am/service/window_controller.cpp
|
||||
hle/service/am/service/window_controller.h
|
||||
hle/service/am/window_system.cpp
|
||||
@@ -564,8 +558,6 @@ add_library(core STATIC
|
||||
hle/service/btm/btm.h
|
||||
hle/service/caps/caps.cpp
|
||||
hle/service/caps/caps.h
|
||||
hle/service/caps/caps_a.cpp
|
||||
hle/service/caps/caps_a.h
|
||||
hle/service/caps/caps_c.cpp
|
||||
hle/service/caps/caps_c.h
|
||||
hle/service/caps/caps_manager.cpp
|
||||
@@ -621,8 +613,6 @@ add_library(core STATIC
|
||||
hle/service/filesystem/save_data_controller.h
|
||||
hle/service/friend/friend.cpp
|
||||
hle/service/friend/friend.h
|
||||
hle/service/friend/friend_interface.cpp
|
||||
hle/service/friend/friend_interface.h
|
||||
hle/service/glue/arp.cpp
|
||||
hle/service/glue/arp.h
|
||||
hle/service/glue/bgtc.cpp
|
||||
@@ -691,8 +681,6 @@ add_library(core STATIC
|
||||
hle/service/ldn/monitor_service.h
|
||||
hle/service/ldn/sf_monitor_service.cpp
|
||||
hle/service/ldn/sf_monitor_service.h
|
||||
hle/service/ldn/sf_service.cpp
|
||||
hle/service/ldn/sf_service.h
|
||||
hle/service/ldn/sf_service_monitor.cpp
|
||||
hle/service/ldn/sf_service_monitor.h
|
||||
hle/service/ldn/system_local_communication_service.cpp
|
||||
@@ -921,16 +909,8 @@ add_library(core STATIC
|
||||
hle/service/psc/ovln/ovln_types.h
|
||||
hle/service/psc/ovln/receiver_service.cpp
|
||||
hle/service/psc/ovln/receiver_service.h
|
||||
hle/service/psc/ovln/receiver.cpp
|
||||
hle/service/psc/ovln/receiver.h
|
||||
hle/service/psc/ovln/sender_service.cpp
|
||||
hle/service/psc/ovln/sender_service.h
|
||||
hle/service/psc/ovln/sender.cpp
|
||||
hle/service/psc/ovln/sender.h
|
||||
hle/service/psc/pm_control.cpp
|
||||
hle/service/psc/pm_control.h
|
||||
hle/service/psc/pm_module.cpp
|
||||
hle/service/psc/pm_module.h
|
||||
hle/service/psc/psc.cpp
|
||||
hle/service/psc/psc.h
|
||||
hle/service/psc/time/alarms.cpp
|
||||
@@ -981,10 +961,6 @@ add_library(core STATIC
|
||||
hle/service/ptm/ts.h
|
||||
hle/service/ro/ro.cpp
|
||||
hle/service/ro/ro.h
|
||||
hle/service/ro/ro_nro_utils.cpp
|
||||
hle/service/ro/ro_nro_utils.h
|
||||
hle/service/ro/ro_results.h
|
||||
hle/service/ro/ro_types.h
|
||||
hle/service/server_manager.cpp
|
||||
hle/service/server_manager.h
|
||||
hle/service/service.cpp
|
||||
@@ -1013,8 +989,6 @@ add_library(core STATIC
|
||||
hle/service/set/system_settings_server.h
|
||||
hle/service/sm/sm.cpp
|
||||
hle/service/sm/sm.h
|
||||
hle/service/sm/sm_controller.cpp
|
||||
hle/service/sm/sm_controller.h
|
||||
hle/service/sockets/bsd.cpp
|
||||
hle/service/sockets/bsd.h
|
||||
hle/service/sockets/nsd.cpp
|
||||
|
||||
@@ -112,32 +112,32 @@ private:
|
||||
FunctionInfo{0, D<&IManagerForSystemService::CheckAvailability>, "CheckAvailability"},
|
||||
FunctionInfo{1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"},
|
||||
FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"},
|
||||
FunctionInfo{3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated"}, // 19.0.0+
|
||||
FunctionInfo{4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache"}, // 19.0.0+
|
||||
FunctionInfo{3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{100, nullptr, "SetSystemProgramIdentification"},
|
||||
FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+
|
||||
FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+
|
||||
FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+
|
||||
FunctionInfo{112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0
|
||||
FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+
|
||||
FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})},
|
||||
FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})},
|
||||
FunctionInfo{120, nullptr, "GetNintendoAccountId"},
|
||||
FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+
|
||||
FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"},
|
||||
FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
|
||||
FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
|
||||
FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+
|
||||
FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+
|
||||
FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+
|
||||
FunctionInfo{136, nullptr, "GetNintendoAccountUserResourceCache"}, // 19.0.0+
|
||||
FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+
|
||||
FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
|
||||
FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
|
||||
FunctionInfo{143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx"}, // 15.0.0+
|
||||
FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{136, nullptr, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx", MakeVersionGate({15,0,0})},
|
||||
FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
|
||||
FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
|
||||
FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
|
||||
FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+
|
||||
FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication"} // 18.0.0+
|
||||
FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
@@ -192,27 +192,27 @@ private:
|
||||
FunctionInfo{3, nullptr, "LoadIdTokenCache"},
|
||||
FunctionInfo{100, nullptr, "SetSystemProgramIdentification"},
|
||||
FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+
|
||||
FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+
|
||||
FunctionInfo{112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0
|
||||
FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+
|
||||
FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})},
|
||||
FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})},
|
||||
FunctionInfo{120, nullptr, "GetNintendoAccountId"},
|
||||
FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+
|
||||
FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"},
|
||||
FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
|
||||
FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
|
||||
FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+
|
||||
FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync"}, // 9.0.0+
|
||||
FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+
|
||||
FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+
|
||||
FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
|
||||
FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
|
||||
FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{143, nullptr, "GetNetworkServiceLicenseCacheEx"},
|
||||
FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
|
||||
FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
|
||||
FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
|
||||
FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+
|
||||
FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+
|
||||
FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{200, nullptr, "IsRegistered"},
|
||||
FunctionInfo{201, nullptr, "RegisterAsync"},
|
||||
FunctionInfo{202, nullptr, "UnregisterAsync"},
|
||||
@@ -225,15 +225,15 @@ private:
|
||||
FunctionInfo{252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"},
|
||||
FunctionInfo{255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"},
|
||||
FunctionInfo{256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"},
|
||||
FunctionInfo{260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+
|
||||
FunctionInfo{261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+
|
||||
FunctionInfo{260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"},
|
||||
FunctionInfo{290, nullptr, "GetRequestForNintendoAccountUserResourceView"}, // 8.0.0+
|
||||
FunctionInfo{300, nullptr, "TryRecoverNintendoAccountUserStateAsync"}, // 6.0.0+
|
||||
FunctionInfo{400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay"}, // 6.1.0+
|
||||
FunctionInfo{401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync"}, // 6.1.0+
|
||||
FunctionInfo{900, nullptr, "GetAuthenticationInfoForWin"}, // 9.0.0+
|
||||
FunctionInfo{901, nullptr, "ImportAsyncForWin"}, // 9.0.0+
|
||||
FunctionInfo{290, nullptr, "GetRequestForNintendoAccountUserResourceView", MakeVersionGate({8,0,0})},
|
||||
FunctionInfo{300, nullptr, "TryRecoverNintendoAccountUserStateAsync", MakeVersionGate({6,0,0})},
|
||||
FunctionInfo{400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay", MakeVersionGate({6,1,0})},
|
||||
FunctionInfo{401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync", MakeVersionGate({6,1,0})},
|
||||
FunctionInfo{900, nullptr, "GetAuthenticationInfoForWin", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{901, nullptr, "ImportAsyncForWin", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{997, nullptr, "DebugUnlinkNintendoAccountAsync"},
|
||||
FunctionInfo{998, nullptr, "DebugSetAvailabilityErrorDetail"}
|
||||
);
|
||||
@@ -295,7 +295,7 @@ public:
|
||||
FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"},
|
||||
FunctionInfo{102, nullptr, "GetNickname"},
|
||||
FunctionInfo{103, nullptr, "GetProfileImage"},
|
||||
FunctionInfo{104, nullptr, "GetProfileLargeImage"} // 18.0.0+
|
||||
FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
@@ -316,12 +316,12 @@ public:
|
||||
FunctionInfo{10, nullptr, "Suspend"},
|
||||
FunctionInfo{100, nullptr, "GetRequestWithTheme"},
|
||||
FunctionInfo{101, nullptr, "IsNetworkServiceAccountReplaced"},
|
||||
FunctionInfo{199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0
|
||||
FunctionInfo{199, nullptr, "GetUrlForIntroductionOfExtraMembership", MakeVersionGate({2,0,0}, {5,1,0})},
|
||||
FunctionInfo{200, nullptr, "ApplyAsyncWithAuthorizedToken"},
|
||||
FunctionInfo{210, nullptr, "IsProfileAvailable"}, // 17.0.0+
|
||||
FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+
|
||||
FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+
|
||||
FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync"} // 18.0.0+
|
||||
FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
@@ -625,13 +625,13 @@ public:
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "GetSessionId"},
|
||||
FunctionInfo{11, nullptr, "Unknown"}, // 1.0.0 - 2.3.0 (the name is blank on Switchbrew)
|
||||
FunctionInfo{11, nullptr, "Unknown", MakeVersionGate({1,0,0}, {2,3,0})}, // the name is blank on Switchbrew
|
||||
FunctionInfo{12, nullptr, "GetAccountId"},
|
||||
FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"},
|
||||
FunctionInfo{14, nullptr, "GetNickname"},
|
||||
FunctionInfo{15, nullptr, "GetProfileImage"},
|
||||
FunctionInfo{16, nullptr, "GetProfileLargeImage"}, // 18.0.0+
|
||||
FunctionInfo{21, nullptr, "LoadIdTokenCache"} // 3.0.0+
|
||||
FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{21, nullptr, "LoadIdTokenCache", MakeVersionGate({3,0,0})}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
@@ -751,7 +751,7 @@ private:
|
||||
FunctionInfo{3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"},
|
||||
FunctionInfo{4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"},
|
||||
FunctionInfo{130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"},
|
||||
FunctionInfo{136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache"}, // 19.0.0+
|
||||
FunctionInfo{136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
|
||||
FunctionInfo{160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"},
|
||||
FunctionInfo{170, nullptr, "LoadNetworkServiceLicenseKindAsync"}
|
||||
@@ -796,15 +796,15 @@ public:
|
||||
FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"},
|
||||
FunctionInfo{102, nullptr, "GetNickname"},
|
||||
FunctionInfo{103, nullptr, "GetProfileImage"},
|
||||
FunctionInfo{104, nullptr, "GetProfileLargeImage"}, // 18.0.0+
|
||||
FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{110, nullptr, "RegisterUserAsync"},
|
||||
FunctionInfo{111, nullptr, "GetUid"},
|
||||
FunctionInfo{200, nullptr, "ApplyResponseForUserCreationAsync"}, // 17.0.0+
|
||||
FunctionInfo{205, nullptr, "SuspendAfterApplyResponse"}, // 17.0.0+
|
||||
FunctionInfo{210, nullptr, "IsProfileAvailable"}, // 17.0.0+
|
||||
FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+
|
||||
FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+
|
||||
FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync"} // 18.0.0+
|
||||
FunctionInfo{200, nullptr, "ApplyResponseForUserCreationAsync", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{205, nullptr, "SuspendAfterApplyResponse", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
@@ -1260,8 +1260,8 @@ public:
|
||||
FunctionInfo{0, nullptr, "EnsureCacheAsync"},
|
||||
FunctionInfo{1, nullptr, "LoadCache"},
|
||||
FunctionInfo{2, nullptr, "GetDeviceAccountId"},
|
||||
FunctionInfo{50, nullptr, "RegisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0
|
||||
FunctionInfo{51, nullptr, "UnregisterNotificationTokenAsync"} // 1.0.0 - 6.2.0
|
||||
FunctionInfo{50, nullptr, "RegisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})},
|
||||
FunctionInfo{51, nullptr, "UnregisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1286,7 +1286,7 @@ public:
|
||||
FunctionInfo{6, nullptr, "GetProfileDigest"},
|
||||
FunctionInfo{50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
|
||||
FunctionInfo{51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
|
||||
FunctionInfo{52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, // 19.0.0+
|
||||
FunctionInfo{52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
|
||||
FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
|
||||
FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
|
||||
@@ -1323,15 +1323,15 @@ public:
|
||||
FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
|
||||
FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
|
||||
FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"},
|
||||
FunctionInfo{400, nullptr, "SetPinCode"}, // 18.0.0+
|
||||
FunctionInfo{401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+
|
||||
FunctionInfo{402, nullptr, "GetPinCode"}, // 18.0.0+
|
||||
FunctionInfo{400, nullptr, "SetPinCode", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{403, nullptr, "GetPinCodeParity"},
|
||||
FunctionInfo{404, nullptr, "VerifyPinCode"},
|
||||
FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"},
|
||||
FunctionInfo{410, nullptr, "GetPinCodeErrorCount"}, // 18.0.0+
|
||||
FunctionInfo{411, nullptr, "ResetPinCodeErrorCount"}, // 18.0.0+
|
||||
FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount"}, // 18.0.0+
|
||||
FunctionInfo{410, nullptr, "GetPinCodeErrorCount", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{411, nullptr, "ResetPinCodeErrorCount", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"},
|
||||
FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"},
|
||||
FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"},
|
||||
@@ -1359,24 +1359,24 @@ public:
|
||||
FunctionInfo{3, &ACC_U0::ListOpenUsers, "ListOpenUsers"},
|
||||
FunctionInfo{4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"},
|
||||
FunctionInfo{5, &ACC_U0::GetProfile, "GetProfile"},
|
||||
FunctionInfo{6, nullptr, "GetProfileDigest"}, // 3.0.0+
|
||||
FunctionInfo{6, nullptr, "GetProfileDigest", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
|
||||
FunctionInfo{51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
|
||||
FunctionInfo{52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
|
||||
FunctionInfo{60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0
|
||||
FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+
|
||||
FunctionInfo{60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({5,0,0}, {5,1,0})},
|
||||
FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention", MakeVersionGate({6,0,0})},
|
||||
FunctionInfo{100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},
|
||||
FunctionInfo{101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"},
|
||||
FunctionInfo{102, nullptr, "AuthenticateApplicationAsync"},
|
||||
FunctionInfo{103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+
|
||||
FunctionInfo{103, nullptr, "CheckNetworkServiceAvailabilityAsync", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
|
||||
FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
|
||||
FunctionInfo{120, nullptr, "CreateGuestLoginRequest"},
|
||||
FunctionInfo{130, nullptr, "LoadOpenContext"}, // 5.0.0+
|
||||
FunctionInfo{131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 6.0.0+
|
||||
FunctionInfo{140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+
|
||||
FunctionInfo{141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+
|
||||
FunctionInfo{150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+
|
||||
FunctionInfo{130, nullptr, "LoadOpenContext", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({6,0,0})},
|
||||
FunctionInfo{140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted", MakeVersionGate({6,0,0})},
|
||||
FunctionInfo{141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers", MakeVersionGate({6,0,0})},
|
||||
FunctionInfo{150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked", MakeVersionGate({6,0,0})},
|
||||
FunctionInfo{160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"}
|
||||
);
|
||||
};
|
||||
@@ -1423,8 +1423,8 @@ public:
|
||||
FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
|
||||
FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"},
|
||||
FunctionInfo{191, nullptr, "ActivateOpenContextHolder"},
|
||||
FunctionInfo{401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+
|
||||
FunctionInfo{402, nullptr, "GetPinCode"}, // 18.0.0+
|
||||
FunctionInfo{401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
|
||||
FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
|
||||
FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#include "common/settings.h"
|
||||
#include "core/core.h"
|
||||
#include "core/file_sys/common_funcs.h"
|
||||
#include "core/file_sys/patch_manager.h"
|
||||
#include "core/file_sys/romfs_factory.h"
|
||||
#include "core/file_sys/control_metadata.h"
|
||||
@@ -17,11 +18,9 @@
|
||||
#include "core/hle/service/am/am.h"
|
||||
#include "core/hle/service/am/button_poller.h"
|
||||
#include "core/hle/service/am/event_observer.h"
|
||||
#include "core/hle/service/am/service/applet_common_functions.h"
|
||||
#include "core/hle/service/am/service/application_creator.h"
|
||||
#include "core/hle/service/am/service/audio_controller.h"
|
||||
#include "core/hle/service/am/service/common_state_getter.h"
|
||||
#include "core/hle/service/am/service/debug_functions.h"
|
||||
#include "core/hle/service/am/service/display_controller.h"
|
||||
#include "core/hle/service/am/service/global_state_controller.h"
|
||||
#include "core/hle/service/am/service/home_menu_functions.h"
|
||||
@@ -62,6 +61,41 @@ class ISelfController;
|
||||
class IWindowController;
|
||||
class WindowSystem;
|
||||
|
||||
class IDebugFunctions final : public ServiceFramework<IDebugFunctions> {
|
||||
public:
|
||||
explicit IDebugFunctions(Core::System& system_) : ServiceFramework{system_, "IDebugFunctions"} {}
|
||||
~IDebugFunctions() override = default;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "NotifyMessageToHomeMenuForDebug"},
|
||||
FunctionInfo{1, nullptr, "OpenMainApplication"},
|
||||
FunctionInfo{10, nullptr, "PerformSystemButtonPressing"},
|
||||
FunctionInfo{20, nullptr, "InvalidateTransitionLayer"},
|
||||
FunctionInfo{30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"},
|
||||
FunctionInfo{31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"},
|
||||
FunctionInfo{40, nullptr, "GetAppletResourceUsageInfo"},
|
||||
FunctionInfo{50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"},
|
||||
FunctionInfo{51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"},
|
||||
FunctionInfo{100, nullptr, "SetCpuBoostModeForApplet"},
|
||||
FunctionInfo{101, nullptr, "CancelCpuBoostModeForApplet"},
|
||||
FunctionInfo{110, nullptr, "PushToAppletBoundChannelForDebug"},
|
||||
FunctionInfo{111, nullptr, "TryPopFromAppletBoundChannelForDebug"},
|
||||
FunctionInfo{120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"},
|
||||
FunctionInfo{121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"},
|
||||
FunctionInfo{122, nullptr, "AlarmSettingNotificationPushAppEventNotify"},
|
||||
FunctionInfo{130, nullptr, "FriendInvitationSetApplicationParameter"},
|
||||
FunctionInfo{131, nullptr, "FriendInvitationClearApplicationParameter"},
|
||||
FunctionInfo{132, nullptr, "FriendInvitationPushApplicationParameter"},
|
||||
FunctionInfo{140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"},
|
||||
FunctionInfo{200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"},
|
||||
FunctionInfo{300, nullptr, "TerminateAllRunningApplicationsForDebug"},
|
||||
FunctionInfo{900, nullptr, "GetGrcProcessLaunchedSystemEvent"}
|
||||
);
|
||||
};
|
||||
|
||||
class IApplicationProxy final : public ServiceFramework<IApplicationProxy> {
|
||||
public:
|
||||
explicit IApplicationProxy(Core::System& system_, std::shared_ptr<Applet> applet,
|
||||
@@ -193,6 +227,87 @@ public:
|
||||
WindowSystem& m_window_system;
|
||||
};
|
||||
|
||||
class IAppletCommonFunctions final : public ServiceFramework<IAppletCommonFunctions> {
|
||||
public:
|
||||
explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr<Applet> applet_) : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} {}
|
||||
~IAppletCommonFunctions() override = default;
|
||||
|
||||
Result SetHomeButtonDoubleClickEnabled(
|
||||
bool home_button_double_click_enabled) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}", home_button_double_click_enabled);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result GetHomeButtonDoubleClickEnabled(
|
||||
Out<bool> out_home_button_double_click_enabled) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
*out_home_button_double_click_enabled = false;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) {
|
||||
LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width, height);
|
||||
std::scoped_lock lk{applet->lock};
|
||||
applet->display_magnification = Common::Rectangle<f32>{x, y, x + width, y + height};
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result SetCpuBoostRequestPriority(s32 priority) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
std::scoped_lock lk{applet->lock};
|
||||
applet->cpu_boost_request_priority = priority;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result GetCurrentApplicationId(Out<u64> out_application_id) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
*out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID());
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result SetGpuTimeSliceBoost(s64 time_span) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result Unknown350(Out<u16> out_unknown) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
*out_unknown = 0;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "SetTerminateResult"},
|
||||
FunctionInfo{10, nullptr, "ReadThemeStorage"},
|
||||
FunctionInfo{11, nullptr, "WriteThemeStorage"},
|
||||
FunctionInfo{20, nullptr, "PushToAppletBoundChannel"},
|
||||
FunctionInfo{21, nullptr, "TryPopFromAppletBoundChannel"},
|
||||
FunctionInfo{40, nullptr, "GetDisplayLogicalResolution"},
|
||||
FunctionInfo{42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"},
|
||||
FunctionInfo{50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"},
|
||||
FunctionInfo{51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"},
|
||||
FunctionInfo{52, nullptr, "IsHomeButtonShortPressedBlocked"},
|
||||
FunctionInfo{60, nullptr, "IsVrModeCurtainRequired"},
|
||||
FunctionInfo{61, nullptr, "IsSleepRequiredByHighTemperature"},
|
||||
FunctionInfo{62, nullptr, "IsSleepRequiredByLowBattery"},
|
||||
FunctionInfo{70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"},
|
||||
FunctionInfo{80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"},
|
||||
FunctionInfo{81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"},
|
||||
FunctionInfo{90, nullptr, "OpenNamedChannelAsParent"},
|
||||
FunctionInfo{91, nullptr, "OpenNamedChannelAsChild"},
|
||||
FunctionInfo{100, nullptr, "SetApplicationCoreUsageMode"},
|
||||
FunctionInfo{300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"},
|
||||
FunctionInfo{310, nullptr, "IsSystemAppletHomeMenu", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{321, nullptr, "SetGpuTimeSliceBoostDueToApplication", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350", MakeVersionGate({20,0,0})}
|
||||
);
|
||||
const std::shared_ptr<Applet> applet;
|
||||
};
|
||||
|
||||
class ISystemAppletProxy final : public ServiceFramework<ISystemAppletProxy> {
|
||||
public:
|
||||
explicit ISystemAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet, Kernel::KProcess* process, WindowSystem& window_system)
|
||||
@@ -1216,8 +1331,8 @@ public:
|
||||
FunctionInfo{350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"},
|
||||
FunctionInfo{400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"},
|
||||
FunctionInfo{410, nullptr, "GetSystemAppletControllerForDebug"},
|
||||
FunctionInfo{450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions"}, // 19.0.0+
|
||||
FunctionInfo{460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions"}, // 20.0.0+
|
||||
FunctionInfo{450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1000, nullptr, "GetDebugFunctions"}
|
||||
);
|
||||
WindowSystem& m_window_system;
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/core.h"
|
||||
#include "core/file_sys/common_funcs.h"
|
||||
#include "core/hle/service/am/applet.h"
|
||||
#include "core/hle/service/am/service/applet_common_functions.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
|
||||
namespace Service::AM {
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> IAppletCommonFunctions::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "SetTerminateResult"},
|
||||
FunctionInfo{10, nullptr, "ReadThemeStorage"},
|
||||
FunctionInfo{11, nullptr, "WriteThemeStorage"},
|
||||
FunctionInfo{20, nullptr, "PushToAppletBoundChannel"},
|
||||
FunctionInfo{21, nullptr, "TryPopFromAppletBoundChannel"},
|
||||
FunctionInfo{40, nullptr, "GetDisplayLogicalResolution"},
|
||||
FunctionInfo{42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"},
|
||||
FunctionInfo{50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"},
|
||||
FunctionInfo{51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"},
|
||||
FunctionInfo{52, nullptr, "IsHomeButtonShortPressedBlocked"},
|
||||
FunctionInfo{60, nullptr, "IsVrModeCurtainRequired"},
|
||||
FunctionInfo{61, nullptr, "IsSleepRequiredByHighTemperature"},
|
||||
FunctionInfo{62, nullptr, "IsSleepRequiredByLowBattery"},
|
||||
FunctionInfo{70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"},
|
||||
FunctionInfo{80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"},
|
||||
FunctionInfo{81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"},
|
||||
FunctionInfo{90, nullptr, "OpenNamedChannelAsParent"},
|
||||
FunctionInfo{91, nullptr, "OpenNamedChannelAsChild"},
|
||||
FunctionInfo{100, nullptr, "SetApplicationCoreUsageMode"},
|
||||
FunctionInfo{300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"},
|
||||
FunctionInfo{310, nullptr, "IsSystemAppletHomeMenu"}, //19.0.0+
|
||||
FunctionInfo{320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost"}, //19.0.0+
|
||||
FunctionInfo{321, nullptr, "SetGpuTimeSliceBoostDueToApplication"}, //19.0.0+
|
||||
FunctionInfo{350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350"} //20.0.0+
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_,
|
||||
std::shared_ptr<Applet> applet_)
|
||||
: ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} {
|
||||
}
|
||||
|
||||
IAppletCommonFunctions::~IAppletCommonFunctions() = default;
|
||||
|
||||
Result IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled(
|
||||
bool home_button_double_click_enabled) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}",
|
||||
home_button_double_click_enabled);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled(
|
||||
Out<bool> out_home_button_double_click_enabled) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
*out_home_button_double_click_enabled = false;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IAppletCommonFunctions::SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) {
|
||||
LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width,
|
||||
height);
|
||||
std::scoped_lock lk{applet->lock};
|
||||
applet->display_magnification = Common::Rectangle<f32>{x, y, x + width, y + height};
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IAppletCommonFunctions::SetCpuBoostRequestPriority(s32 priority) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
std::scoped_lock lk{applet->lock};
|
||||
applet->cpu_boost_request_priority = priority;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IAppletCommonFunctions::GetCurrentApplicationId(Out<u64> out_application_id) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
*out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID());
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IAppletCommonFunctions::SetGpuTimeSliceBoost(s64 time_span) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IAppletCommonFunctions::Unknown350(Out<u16> out_unknown) {
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||
*out_unknown = 0;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
} // namespace Service::AM
|
||||
@@ -1,34 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Service::AM {
|
||||
|
||||
struct Applet;
|
||||
|
||||
class IAppletCommonFunctions final : public ServiceFramework<IAppletCommonFunctions> {
|
||||
public:
|
||||
explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr<Applet> applet_);
|
||||
~IAppletCommonFunctions() override;
|
||||
|
||||
private:
|
||||
Result SetHomeButtonDoubleClickEnabled(bool home_button_double_click_enabled);
|
||||
Result GetHomeButtonDoubleClickEnabled(Out<bool> out_home_button_double_click_enabled);
|
||||
Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height);
|
||||
Result SetCpuBoostRequestPriority(s32 priority);
|
||||
Result GetCurrentApplicationId(Out<u64> out_application_id);
|
||||
Result SetGpuTimeSliceBoost(s64 time_span);
|
||||
Result Unknown350(Out<u16> out_unknown);
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override;
|
||||
const std::shared_ptr<Applet> applet;
|
||||
};
|
||||
|
||||
} // namespace Service::AM
|
||||
@@ -16,7 +16,7 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioController::FindRequ
|
||||
FunctionInfo{2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"},
|
||||
FunctionInfo{3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"},
|
||||
FunctionInfo{4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"},
|
||||
FunctionInfo{5, nullptr, "Unknown5"} //20.0.0+
|
||||
FunctionInfo{5, nullptr, "Unknown5", MakeVersionGate({20,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -33,20 +33,20 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> ICommonStateGetter::FindRe
|
||||
FunctionInfo{11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"},
|
||||
FunctionInfo{12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"},
|
||||
FunctionInfo{13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"},
|
||||
FunctionInfo{14, nullptr, "GetWakeupCount"}, //11.0.0+
|
||||
FunctionInfo{15, nullptr, "Unknown15"}, //19.0.0+
|
||||
FunctionInfo{14, nullptr, "GetWakeupCount", MakeVersionGate({11,0,0})},
|
||||
FunctionInfo{15, nullptr, "Unknown15", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"},
|
||||
FunctionInfo{30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"},
|
||||
FunctionInfo{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"}, //2.0.0+
|
||||
FunctionInfo{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"}, //7.0.0+
|
||||
FunctionInfo{40, nullptr, "GetCradleFwVersion"}, //2.0.0+
|
||||
FunctionInfo{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"}, //3.0.0+
|
||||
FunctionInfo{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"}, //3.0.0+
|
||||
FunctionInfo{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"}, //4.0.0+
|
||||
FunctionInfo{53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx"}, //7.0.0+
|
||||
FunctionInfo{54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx"}, //7.0.0+
|
||||
FunctionInfo{55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection"}, //3.0.0+
|
||||
FunctionInfo{59, nullptr, "SetVrPositionForDebug"}, //1.0.0+
|
||||
FunctionInfo{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx", MakeVersionGate({2,0,0})},
|
||||
FunctionInfo{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{40, nullptr, "GetCradleFwVersion", MakeVersionGate({2,0,0})},
|
||||
FunctionInfo{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{59, nullptr, "SetVrPositionForDebug", MakeVersionGate({1,0,0})},
|
||||
FunctionInfo{60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"},
|
||||
FunctionInfo{61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"},
|
||||
FunctionInfo{62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"},
|
||||
@@ -61,8 +61,8 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> ICommonStateGetter::FindRe
|
||||
FunctionInfo{91, nullptr, "GetCurrentPerformanceConfiguration"},
|
||||
FunctionInfo{100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
|
||||
FunctionInfo{110, nullptr, "OpenMyGpuErrorHandler"},
|
||||
FunctionInfo{120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory"}, //13.0.0+
|
||||
FunctionInfo{130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage"}, //21.0.0+
|
||||
FunctionInfo{120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"},
|
||||
FunctionInfo{300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"},
|
||||
FunctionInfo{400, nullptr, "ActivateMigrationService"},
|
||||
@@ -71,17 +71,17 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> ICommonStateGetter::FindRe
|
||||
FunctionInfo{501, nullptr, "SuppressDisablingSleepTemporarily"},
|
||||
FunctionInfo{502, nullptr, "IsSleepEnabled"},
|
||||
FunctionInfo{503, nullptr, "IsDisablingSleepSuppressed"},
|
||||
FunctionInfo{600, nullptr, "SetHidInputMagnificationForApplication"}, //20.0.0+
|
||||
FunctionInfo{610, D<&ICommonStateGetter::Unknown610>, "Unknown610"}, //21.0.0+
|
||||
FunctionInfo{611, D<&ICommonStateGetter::Unknown611>, "Unknown611"}, //22.0.0+
|
||||
FunctionInfo{900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled"}, //11.0.0+
|
||||
FunctionInfo{910, nullptr, "GetLaunchRequiredTick"}, //17.0.0+
|
||||
FunctionInfo{1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d"}, //19.0.0+
|
||||
FunctionInfo{1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d"}, //19.0.0+
|
||||
FunctionInfo{1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d"}, //19.0.0+
|
||||
FunctionInfo{1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport"}, //21.0.0+
|
||||
FunctionInfo{1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle"}, //21.0.0+
|
||||
FunctionInfo{1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle"} //21.0.0+
|
||||
FunctionInfo{600, nullptr, "SetHidInputMagnificationForApplication", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{610, D<&ICommonStateGetter::Unknown610>, "Unknown610", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{611, D<&ICommonStateGetter::Unknown611>, "Unknown611", MakeVersionGate({22,0,0})},
|
||||
FunctionInfo{900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled", MakeVersionGate({11,0,0})},
|
||||
FunctionInfo{910, nullptr, "GetLaunchRequiredTick", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle", MakeVersionGate({21,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/am/service/debug_functions.h"
|
||||
|
||||
namespace Service::AM {
|
||||
|
||||
IDebugFunctions::IDebugFunctions(Core::System& system_)
|
||||
: ServiceFramework{system_, "IDebugFunctions"} {
|
||||
}
|
||||
|
||||
IDebugFunctions::~IDebugFunctions() = default;
|
||||
|
||||
} // namespace Service::AM
|
||||
@@ -1,48 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Service::AM {
|
||||
|
||||
class IDebugFunctions final : public ServiceFramework<IDebugFunctions> {
|
||||
public:
|
||||
explicit IDebugFunctions(Core::System& system_);
|
||||
~IDebugFunctions() override;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "NotifyMessageToHomeMenuForDebug"},
|
||||
FunctionInfo{1, nullptr, "OpenMainApplication"},
|
||||
FunctionInfo{10, nullptr, "PerformSystemButtonPressing"},
|
||||
FunctionInfo{20, nullptr, "InvalidateTransitionLayer"},
|
||||
FunctionInfo{30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"},
|
||||
FunctionInfo{31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"},
|
||||
FunctionInfo{40, nullptr, "GetAppletResourceUsageInfo"},
|
||||
FunctionInfo{50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"},
|
||||
FunctionInfo{51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"},
|
||||
FunctionInfo{100, nullptr, "SetCpuBoostModeForApplet"},
|
||||
FunctionInfo{101, nullptr, "CancelCpuBoostModeForApplet"},
|
||||
FunctionInfo{110, nullptr, "PushToAppletBoundChannelForDebug"},
|
||||
FunctionInfo{111, nullptr, "TryPopFromAppletBoundChannelForDebug"},
|
||||
FunctionInfo{120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"},
|
||||
FunctionInfo{121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"},
|
||||
FunctionInfo{122, nullptr, "AlarmSettingNotificationPushAppEventNotify"},
|
||||
FunctionInfo{130, nullptr, "FriendInvitationSetApplicationParameter"},
|
||||
FunctionInfo{131, nullptr, "FriendInvitationClearApplicationParameter"},
|
||||
FunctionInfo{132, nullptr, "FriendInvitationPushApplicationParameter"},
|
||||
FunctionInfo{140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"},
|
||||
FunctionInfo{200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"},
|
||||
FunctionInfo{300, nullptr, "TerminateAllRunningApplicationsForDebug"},
|
||||
FunctionInfo{900, nullptr, "GetGrcProcessLaunchedSystemEvent"}
|
||||
);
|
||||
};
|
||||
|
||||
} // namespace Service::AM
|
||||
@@ -54,10 +54,10 @@ static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr<LibraryAppletS
|
||||
FunctionInfo{25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"},
|
||||
FunctionInfo{30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"},
|
||||
FunctionInfo{50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"},
|
||||
FunctionInfo{60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero"}, //10.0.0+
|
||||
FunctionInfo{80, nullptr, "RequestForLibraryAppletToGetForeground"}, //19.0.0+
|
||||
FunctionInfo{81, nullptr, "GetCurrentChildLibraryApplet"}, //19.0.0+
|
||||
FunctionInfo{90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90"}, //20.0.0+
|
||||
FunctionInfo{60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero", MakeVersionGate({10,0,0})},
|
||||
FunctionInfo{80, nullptr, "RequestForLibraryAppletToGetForeground", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{81, nullptr, "GetCurrentChildLibraryApplet", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"},
|
||||
FunctionInfo{101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"},
|
||||
FunctionInfo{102, nullptr, "PushExtraStorage"},
|
||||
@@ -68,8 +68,8 @@ static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr<LibraryAppletS
|
||||
FunctionInfo{110, nullptr, "NeedsToExitProcess"},
|
||||
FunctionInfo{120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
|
||||
FunctionInfo{150, nullptr, "RequestForAppletToGetForeground"},
|
||||
FunctionInfo{160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle"}, //2.0.0+
|
||||
FunctionInfo{170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170"} //22.0.0+
|
||||
FunctionInfo{160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle", MakeVersionGate({2,0,0})},
|
||||
FunctionInfo{170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170", MakeVersionGate({22,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -4,14 +4,76 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/kernel/k_transfer_memory.h"
|
||||
#include "core/hle/service/am/am_results.h"
|
||||
#include "core/hle/service/am/library_applet_storage.h"
|
||||
#include "core/hle/service/am/service/storage.h"
|
||||
#include "core/hle/service/am/service/storage_accessor.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
|
||||
namespace Service::AM {
|
||||
|
||||
class IStorageAccessor final : public ServiceFramework<IStorageAccessor> {
|
||||
public:
|
||||
explicit IStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl) : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {}
|
||||
~IStorageAccessor() override = default;
|
||||
|
||||
Result GetSize(Out<s64> out_size) {
|
||||
LOG_DEBUG(Service_AM, "called");
|
||||
*out_size = m_impl->GetSize();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset) {
|
||||
LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size());
|
||||
R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size()));
|
||||
}
|
||||
|
||||
Result Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset) {
|
||||
LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size());
|
||||
R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size()));
|
||||
}
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&IStorageAccessor::GetSize>, "GetSize"},
|
||||
FunctionInfo{10, D<&IStorageAccessor::Write>, "Write"},
|
||||
FunctionInfo{11, D<&IStorageAccessor::Read>, "Read"}
|
||||
);
|
||||
|
||||
const std::shared_ptr<LibraryAppletStorage> m_impl;
|
||||
};
|
||||
|
||||
class ITransferStorageAccessor final : public ServiceFramework<ITransferStorageAccessor> {
|
||||
public:
|
||||
explicit ITransferStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl) : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {}
|
||||
~ITransferStorageAccessor() override = default;
|
||||
|
||||
Result GetSize(Out<s64> out_size) {
|
||||
LOG_DEBUG(Service_AM, "called");
|
||||
*out_size = m_impl->GetSize();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result GetHandle(Out<s64> out_size, OutCopyHandle<Kernel::KTransferMemory> out_handle) {
|
||||
LOG_INFO(Service_AM, "called");
|
||||
*out_size = m_impl->GetSize();
|
||||
*out_handle = m_impl->GetHandle();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&ITransferStorageAccessor::GetSize>, "GetSize"},
|
||||
FunctionInfo{1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"}
|
||||
);
|
||||
|
||||
const std::shared_ptr<LibraryAppletStorage> m_impl;
|
||||
};
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> IStorage::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&IStorage::Open>, "Open"},
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/kernel/k_transfer_memory.h"
|
||||
#include "core/hle/service/am/library_applet_storage.h"
|
||||
#include "core/hle/service/am/service/storage_accessor.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
|
||||
namespace Service::AM {
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> IStorageAccessor::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&IStorageAccessor::GetSize>, "GetSize"},
|
||||
FunctionInfo{10, D<&IStorageAccessor::Write>, "Write"},
|
||||
FunctionInfo{11, D<&IStorageAccessor::Read>, "Read"}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
IStorageAccessor::IStorageAccessor(Core::System& system_,
|
||||
std::shared_ptr<LibraryAppletStorage> impl)
|
||||
: ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {
|
||||
}
|
||||
|
||||
IStorageAccessor::~IStorageAccessor() = default;
|
||||
|
||||
Result IStorageAccessor::GetSize(Out<s64> out_size) {
|
||||
LOG_DEBUG(Service_AM, "called");
|
||||
*out_size = m_impl->GetSize();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IStorageAccessor::Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset) {
|
||||
LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size());
|
||||
R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size()));
|
||||
}
|
||||
|
||||
Result IStorageAccessor::Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset) {
|
||||
LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size());
|
||||
R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size()));
|
||||
}
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> ITransferStorageAccessor::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&ITransferStorageAccessor::GetSize>, "GetSize"},
|
||||
FunctionInfo{1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
ITransferStorageAccessor::ITransferStorageAccessor(Core::System& system_,
|
||||
std::shared_ptr<LibraryAppletStorage> impl)
|
||||
: ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {
|
||||
}
|
||||
|
||||
ITransferStorageAccessor::~ITransferStorageAccessor() = default;
|
||||
|
||||
Result ITransferStorageAccessor::GetSize(Out<s64> out_size) {
|
||||
LOG_DEBUG(Service_AM, "called");
|
||||
*out_size = m_impl->GetSize();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result ITransferStorageAccessor::GetHandle(Out<s64> out_size,
|
||||
OutCopyHandle<Kernel::KTransferMemory> out_handle) {
|
||||
LOG_INFO(Service_AM, "called");
|
||||
*out_size = m_impl->GetSize();
|
||||
*out_handle = m_impl->GetHandle();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
} // namespace Service::AM
|
||||
@@ -1,43 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/am/library_applet_storage.h"
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Service::AM {
|
||||
|
||||
class IStorageAccessor final : public ServiceFramework<IStorageAccessor> {
|
||||
public:
|
||||
explicit IStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl);
|
||||
~IStorageAccessor() override;
|
||||
|
||||
private:
|
||||
Result GetSize(Out<s64> out_size);
|
||||
Result Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset);
|
||||
Result Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset);
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override;
|
||||
const std::shared_ptr<LibraryAppletStorage> m_impl;
|
||||
};
|
||||
|
||||
class ITransferStorageAccessor final : public ServiceFramework<ITransferStorageAccessor> {
|
||||
public:
|
||||
explicit ITransferStorageAccessor(Core::System& system_,
|
||||
std::shared_ptr<LibraryAppletStorage> impl);
|
||||
~ITransferStorageAccessor() override;
|
||||
|
||||
private:
|
||||
Result GetSize(Out<s64> out_size);
|
||||
Result GetHandle(Out<s64> out_size, OutCopyHandle<Kernel::KTransferMemory> out_handle);
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override;
|
||||
const std::shared_ptr<LibraryAppletStorage> m_impl;
|
||||
};
|
||||
|
||||
} // namespace Service::AM
|
||||
@@ -28,7 +28,7 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioController::FindRequ
|
||||
FunctionInfo{3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"},
|
||||
FunctionInfo{4, D<&IAudioController::IsTargetMute>, "IsTargetMute"},
|
||||
FunctionInfo{5, D<&IAudioController::SetTargetMute>, "SetTargetMute"},
|
||||
FunctionInfo{6, nullptr, "IsTargetConnected"}, //20.0.0+
|
||||
FunctionInfo{6, nullptr, "IsTargetConnected", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{7, nullptr, "SetDefaultTarget"},
|
||||
FunctionInfo{8, nullptr, "GetDefaultTarget"},
|
||||
FunctionInfo{9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"},
|
||||
@@ -65,8 +65,8 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioController::FindRequ
|
||||
FunctionInfo{40, nullptr, "GetSystemInformationForDebug"},
|
||||
FunctionInfo{41, nullptr, "SetVolumeButtonLongPressTime"},
|
||||
FunctionInfo{42, nullptr, "SetNativeVolumeForDebug"},
|
||||
FunctionInfo{43, nullptr, "Unknown43"}, //21.0.0+
|
||||
FunctionInfo{5000, D<&IAudioController::Unknown5000>, "Unknown5000"}, //19.0.0+
|
||||
FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{5000, D<&IAudioController::Unknown5000>, "Unknown5000", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{10000, nullptr, "NotifyAudioOutputTargetForPlayReport"},
|
||||
FunctionInfo{10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"},
|
||||
FunctionInfo{10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"},
|
||||
@@ -75,13 +75,13 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioController::FindRequ
|
||||
FunctionInfo{10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"},
|
||||
FunctionInfo{10103, nullptr, "GetAudioOutputTargetForPlayReport"},
|
||||
FunctionInfo{10104, nullptr, "GetAudioOutputChannelCountForPlayReport"},
|
||||
FunctionInfo{10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, //14.0.0-19.0.1
|
||||
FunctionInfo{10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport"}, //14.0.0-19.0.1
|
||||
FunctionInfo{10200, nullptr, "Unknown10200"}, //20.0.0+
|
||||
FunctionInfo{50000, nullptr, "SetAnalogInputBoostGainForPrototyping"}, //15.0.0-18.1.0
|
||||
FunctionInfo{50001, nullptr, "OverrideDefaultTargetForDebug"}, //19.0.0-19.0.1
|
||||
FunctionInfo{50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug"}, //19.0.0+
|
||||
FunctionInfo{50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug"} //19.0.0+
|
||||
FunctionInfo{10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})},
|
||||
FunctionInfo{10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})},
|
||||
FunctionInfo{10200, nullptr, "Unknown10200", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{50000, nullptr, "SetAnalogInputBoostGainForPrototyping", MakeVersionGate({15,0,0}, {18,1,0})},
|
||||
FunctionInfo{50001, nullptr, "OverrideDefaultTargetForDebug", MakeVersionGate({19,0,0}, {19,0,1})},
|
||||
FunctionInfo{50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -28,13 +28,13 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioDevice::FindRequest(
|
||||
FunctionInfo{12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"},
|
||||
FunctionInfo{13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"},
|
||||
FunctionInfo{14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"},
|
||||
FunctionInfo{15, nullptr, "AcquireAudioInputDeviceNotification"}, //17.0.0+
|
||||
FunctionInfo{16, nullptr, "ReleaseAudioInputDeviceNotification"}, //17.0.0+
|
||||
FunctionInfo{17, nullptr, "AcquireAudioOutputDeviceNotification"}, //17.0.0+
|
||||
FunctionInfo{18, nullptr, "ReleaseAudioOutputDeviceNotification"}, //17.0.0+
|
||||
FunctionInfo{19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+
|
||||
FunctionInfo{20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+
|
||||
FunctionInfo{21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency"} //21.0.0+
|
||||
FunctionInfo{15, nullptr, "AcquireAudioInputDeviceNotification", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{16, nullptr, "ReleaseAudioInputDeviceNotification", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{17, nullptr, "AcquireAudioOutputDeviceNotification", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{18, nullptr, "ReleaseAudioOutputDeviceNotification", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency", MakeVersionGate({21,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioRenderer::FindReques
|
||||
FunctionInfo{7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"},
|
||||
FunctionInfo{8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"},
|
||||
FunctionInfo{9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"},
|
||||
FunctionInfo{10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"}, //3.0.0+
|
||||
FunctionInfo{11, nullptr, "ExecuteAudioRendererRendering"}, //3.0.0+
|
||||
FunctionInfo{12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"}, //15.0.0+
|
||||
FunctionInfo{13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"} //15.0.0+
|
||||
FunctionInfo{10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{11, nullptr, "ExecuteAudioRendererRendering", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter", MakeVersionGate({15,0,0})},
|
||||
FunctionInfo{13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter", MakeVersionGate({15,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -37,8 +37,8 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IBcatService::FindRequest(
|
||||
FunctionInfo{20401, nullptr, "UnregisterSystemApplicationDeliveryTask"},
|
||||
FunctionInfo{20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"},
|
||||
FunctionInfo{30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"},
|
||||
FunctionInfo{30101, nullptr, "Unknown30101"}, //2.0.0-2.3.0
|
||||
FunctionInfo{30102, nullptr, "Unknown30102"}, //2.0.0-2.3.0
|
||||
FunctionInfo{30101, nullptr, "Unknown30101", MakeVersionGate({2,0,0}, {2,3,0})},
|
||||
FunctionInfo{30102, nullptr, "Unknown30102", MakeVersionGate({2,0,0}, {2,3,0})},
|
||||
FunctionInfo{30200, nullptr, "RegisterBackgroundDeliveryTask"},
|
||||
FunctionInfo{30201, nullptr, "UnregisterBackgroundDeliveryTask"},
|
||||
FunctionInfo{30202, nullptr, "BlockDeliveryTask"},
|
||||
@@ -46,12 +46,12 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IBcatService::FindRequest(
|
||||
FunctionInfo{30210, nullptr, "SetDeliveryTaskTimer"},
|
||||
FunctionInfo{30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"},
|
||||
FunctionInfo{90100, nullptr, "GetDeliveryTaskList"},
|
||||
FunctionInfo{90101, nullptr, "GetDeliveryTaskListForSystem"}, //11.0.0+
|
||||
FunctionInfo{90101, nullptr, "GetDeliveryTaskListForSystem", MakeVersionGate({11,0,0})},
|
||||
FunctionInfo{90200, nullptr, "GetDeliveryList"},
|
||||
FunctionInfo{90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"},
|
||||
FunctionInfo{90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"},
|
||||
FunctionInfo{90300, nullptr, "GetPushNotificationLog"},
|
||||
FunctionInfo{90301, nullptr, "GetDeliveryCacheStorageUsage"} //11.0.0+
|
||||
FunctionInfo{90301, nullptr, "GetDeliveryCacheStorageUsage", MakeVersionGate({11,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -17,19 +17,19 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> INewsService::FindRequest(
|
||||
FunctionInfo{10100, D<&INewsService::PostLocalNews>, "PostLocalNews"},
|
||||
FunctionInfo{20100, D<&INewsService::SetPassphrase>, "SetPassphrase"},
|
||||
FunctionInfo{30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"},
|
||||
FunctionInfo{30101, D<&INewsService::GetTopicList>, "GetTopicList"}, //3.0.0+
|
||||
FunctionInfo{30110, D<&INewsService::GetTopicList>, "Unknown30110"}, //6.0.0+ (stub)
|
||||
FunctionInfo{30101, D<&INewsService::GetTopicList>, "GetTopicList", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{30110, D<&INewsService::GetTopicList>, "Unknown30110", MakeVersionGate({6,0,0})}, // stub
|
||||
FunctionInfo{30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"},
|
||||
FunctionInfo{30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201"}, //8.0.0+ (stub)
|
||||
FunctionInfo{30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210"}, //10.0.0+ (stub)
|
||||
FunctionInfo{30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201", MakeVersionGate({8,0,0})}, // stub
|
||||
FunctionInfo{30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210", MakeVersionGate({10,0,0})}, // stub
|
||||
FunctionInfo{30300, nullptr, "RequestImmediateReception"},
|
||||
FunctionInfo{30400, nullptr, "DecodeArchiveFile"}, //3.0.0-18.1.0 (stub)
|
||||
FunctionInfo{30500, nullptr, "Unknown30500"}, //8.0.0+ (stub)
|
||||
FunctionInfo{30900, nullptr, "Unknown30900"}, //1.0.0 (stub)
|
||||
FunctionInfo{30901, nullptr, "Unknown30901"}, //1.0.0 (stub)
|
||||
FunctionInfo{30902, nullptr, "Unknown30902"}, //1.0.0 (stub)
|
||||
FunctionInfo{30400, nullptr, "DecodeArchiveFile", MakeVersionGate({3,0,0}, {18,1,0})}, // stub
|
||||
FunctionInfo{30500, nullptr, "Unknown30500", MakeVersionGate({8,0,0})}, // stub
|
||||
FunctionInfo{30900, nullptr, "Unknown30900", MakeVersionGate({1,0,0})}, // stub
|
||||
FunctionInfo{30901, nullptr, "Unknown30901", MakeVersionGate({1,0,0})}, // stub
|
||||
FunctionInfo{30902, nullptr, "Unknown30902", MakeVersionGate({1,0,0})}, // stub
|
||||
FunctionInfo{40100, nullptr, "SetSubscriptionStatus"},
|
||||
FunctionInfo{40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription"}, //3.0.0+
|
||||
FunctionInfo{40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{40200, D<&INewsService::ClearStorage>, "ClearStorage"},
|
||||
FunctionInfo{40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"},
|
||||
FunctionInfo{90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"}
|
||||
|
||||
@@ -307,15 +307,15 @@ public:
|
||||
FunctionInfo{6, nullptr, "SetTsiMode"},
|
||||
FunctionInfo{7, nullptr, "GeneralTest"},
|
||||
FunctionInfo{8, nullptr, "HidConnect"},
|
||||
FunctionInfo{9, nullptr, "GeneralGet"}, //5.0.0+
|
||||
FunctionInfo{10, nullptr, "GetGattClientDisconnectionReason"}, //5.0.0+
|
||||
FunctionInfo{11, nullptr, "GetBleConnectionParameter"}, //5.1.0+
|
||||
FunctionInfo{12, nullptr, "GetBleConnectionParameterRequest"}, //5.1.0+
|
||||
FunctionInfo{13, nullptr, "GetDiscoveredDevice"}, //12.0.0+
|
||||
FunctionInfo{14, nullptr, "SleepAwakeLoopTest"}, //15.0.0+
|
||||
FunctionInfo{15, nullptr, "SleepTest"}, //15.0.0+
|
||||
FunctionInfo{16, nullptr, "MinimumAwakeTest"}, //15.0.0+
|
||||
FunctionInfo{17, nullptr, "ForceEnableBtm"} //15.0.0+
|
||||
FunctionInfo{9, nullptr, "GeneralGet", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{10, nullptr, "GetGattClientDisconnectionReason", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{11, nullptr, "GetBleConnectionParameter", MakeVersionGate({5,1,0})},
|
||||
FunctionInfo{12, nullptr, "GetBleConnectionParameterRequest", MakeVersionGate({5,1,0})},
|
||||
FunctionInfo{13, nullptr, "GetDiscoveredDevice", MakeVersionGate({12,0,0})},
|
||||
FunctionInfo{14, nullptr, "SleepAwakeLoopTest", MakeVersionGate({15,0,0})},
|
||||
FunctionInfo{15, nullptr, "SleepTest", MakeVersionGate({15,0,0})},
|
||||
FunctionInfo{16, nullptr, "MinimumAwakeTest", MakeVersionGate({15,0,0})},
|
||||
FunctionInfo{17, nullptr, "ForceEnableBtm", MakeVersionGate({15,0,0})}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -384,33 +384,33 @@ public:
|
||||
FunctionInfo{57, nullptr, "RegisterAppletResourceUserId"},
|
||||
FunctionInfo{58, nullptr, "UnregisterAppletResourceUserId"},
|
||||
FunctionInfo{59, nullptr, "SetAppletResourceUserId"},
|
||||
FunctionInfo{60, nullptr, "AcquireBleConnectionParameterUpdateEvent"}, //8.0.0+
|
||||
FunctionInfo{61, nullptr, "SetCeLength"}, //8.0.0+
|
||||
FunctionInfo{62, nullptr, "EnsureSlotExpansion"}, //9.0.0+
|
||||
FunctionInfo{63, nullptr, "IsSlotExpansionEnsured"}, //9.0.0+
|
||||
FunctionInfo{64, nullptr, "CancelConnectionTrigger"}, //10.0.0+
|
||||
FunctionInfo{65, nullptr, "GetConnectionCapacity"}, //13.0.0+
|
||||
FunctionInfo{66, nullptr, "GetWlanMode"}, //13.0.0+
|
||||
FunctionInfo{67, nullptr, "IsSlotSavingEnabled"}, //13.0.0+
|
||||
FunctionInfo{68, nullptr, "IsSlotSavingForPairingEnabled"}, //13.0.0+
|
||||
FunctionInfo{69, nullptr, "AcquireAudioDeviceConnectionEvent"}, //13.0.0+
|
||||
FunctionInfo{70, nullptr, "GetConnectedAudioDevices"}, //13.0.0+
|
||||
FunctionInfo{71, nullptr, "SetAudioSourceVolume"}, //13.0.0+
|
||||
FunctionInfo{72, nullptr, "GetAudioSourceVolume"}, //13.0.0+
|
||||
FunctionInfo{73, nullptr, "RequestAudioDeviceConnectionRejection"}, //13.0.0+
|
||||
FunctionInfo{74, nullptr, "CancelAudioDeviceConnectionRejection"}, //13.0.0+
|
||||
FunctionInfo{75, nullptr, "GetPairedAudioDevices"}, //13.0.0+
|
||||
FunctionInfo{76, nullptr, "SetWlanModeWithOption"}, //13.1.0+
|
||||
FunctionInfo{100, nullptr, "AcquireConnectionDisallowedEvent"}, //13.0.0+
|
||||
FunctionInfo{101, nullptr, "GetUsecaseViolationFactor"}, //13.0.0+
|
||||
FunctionInfo{110, nullptr, "GetShortenedDeviceInfo"}, //13.0.0+
|
||||
FunctionInfo{60, nullptr, "AcquireBleConnectionParameterUpdateEvent", MakeVersionGate({8,0,0})},
|
||||
FunctionInfo{61, nullptr, "SetCeLength", MakeVersionGate({8,0,0})},
|
||||
FunctionInfo{62, nullptr, "EnsureSlotExpansion", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{63, nullptr, "IsSlotExpansionEnsured", MakeVersionGate({9,0,0})},
|
||||
FunctionInfo{64, nullptr, "CancelConnectionTrigger", MakeVersionGate({10,0,0})},
|
||||
FunctionInfo{65, nullptr, "GetConnectionCapacity", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{66, nullptr, "GetWlanMode", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{67, nullptr, "IsSlotSavingEnabled", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{68, nullptr, "IsSlotSavingForPairingEnabled", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{69, nullptr, "AcquireAudioDeviceConnectionEvent", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{70, nullptr, "GetConnectedAudioDevices", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{71, nullptr, "SetAudioSourceVolume", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{72, nullptr, "GetAudioSourceVolume", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{73, nullptr, "RequestAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{74, nullptr, "CancelAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{75, nullptr, "GetPairedAudioDevices", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{76, nullptr, "SetWlanModeWithOption", MakeVersionGate({13,1,0})},
|
||||
FunctionInfo{100, nullptr, "AcquireConnectionDisallowedEvent", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{101, nullptr, "GetUsecaseViolationFactor", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{110, nullptr, "GetShortenedDeviceInfo", MakeVersionGate({13,0,0})},
|
||||
FunctionInfo{111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+
|
||||
FunctionInfo{112, nullptr, "Unknown112"}, //14.0.0-14.1.2
|
||||
FunctionInfo{113, nullptr, "Unknown113"}, //14.0.0-14.1.2
|
||||
FunctionInfo{114, nullptr, "IsFirstAudioControlConnection"}, //14.0.0+
|
||||
FunctionInfo{115, nullptr, "GetShortenedDeviceCondition"}, //14.0.0+
|
||||
FunctionInfo{116, nullptr, "SetAudioSinkVolume"}, //15.0.0+
|
||||
FunctionInfo{117, nullptr, "GetAudioSinkVolume"} //15.0.0+
|
||||
FunctionInfo{112, nullptr, "Unknown112", MakeVersionGate({14,0,0}, {14,1,2})},
|
||||
FunctionInfo{113, nullptr, "Unknown113", MakeVersionGate({14,0,0}, {14,1,2})},
|
||||
FunctionInfo{114, nullptr, "IsFirstAudioControlConnection", MakeVersionGate({14,0,0})},
|
||||
FunctionInfo{115, nullptr, "GetShortenedDeviceCondition", MakeVersionGate({14,0,0})},
|
||||
FunctionInfo{116, nullptr, "SetAudioSinkVolume", MakeVersionGate({15,0,0})},
|
||||
FunctionInfo{117, nullptr, "GetAudioSinkVolume", MakeVersionGate({15,0,0})}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/caps/caps.h"
|
||||
#include "core/hle/service/caps/caps_a.h"
|
||||
#include "core/hle/service/caps/caps_c.h"
|
||||
#include "core/hle/service/caps/caps_manager.h"
|
||||
#include "core/hle/service/caps/caps_sc.h"
|
||||
@@ -14,7 +13,11 @@
|
||||
#include "core/hle/service/caps/caps_u.h"
|
||||
#include "core/hle/service/server_manager.h"
|
||||
#include "core/hle/service/service.h"
|
||||
#include "common/logging.h"
|
||||
#include "frontend_common/firmware_manager.h"
|
||||
#include "core/hle/service/caps/caps_result.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
|
||||
namespace Service::Capture {
|
||||
|
||||
@@ -32,6 +35,201 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class IAlbumAccessorService final : public ServiceFramework<IAlbumAccessorService> {
|
||||
public:
|
||||
explicit IAlbumAccessorService(Core::System& system_, std::shared_ptr<AlbumManager> album_manager) : ServiceFramework{system_, "caps:a"}, manager{album_manager} {}
|
||||
~IAlbumAccessorService() override = default;
|
||||
|
||||
Result GetAlbumFileList(
|
||||
Out<u64> out_count, AlbumStorage storage,
|
||||
OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
|
||||
LOG_INFO(Service_Capture, "called, storage={}", storage);
|
||||
|
||||
const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result DeleteAlbumFile(AlbumFileId file_id) {
|
||||
LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}",
|
||||
file_id.application_id, file_id.storage, file_id.type);
|
||||
|
||||
const Result result = manager->DeleteAlbumFile(file_id);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage) {
|
||||
LOG_INFO(Service_Capture, "called, storage={}", storage);
|
||||
|
||||
const Result result = manager->IsAlbumMounted(storage);
|
||||
*out_is_mounted = result.IsSuccess();
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result Unknown18(
|
||||
Out<u32> out_buffer_size,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_buffer) {
|
||||
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
||||
*out_buffer_size = 0;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result GetAlbumFileListEx0(
|
||||
Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
|
||||
OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
|
||||
LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags);
|
||||
|
||||
const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result GetAutoSavingStorage(Out<bool> out_is_autosaving) {
|
||||
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
||||
|
||||
const Result result = manager->GetAutoSavingStorage(*out_is_autosaving);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result LoadAlbumScreenShotImageEx1(
|
||||
const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
|
||||
OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
|
||||
LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
|
||||
file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
|
||||
|
||||
const Result result =
|
||||
manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result LoadAlbumScreenShotThumbnailImageEx1(
|
||||
const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
|
||||
OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
|
||||
LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
|
||||
file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
|
||||
|
||||
const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image,
|
||||
file_id, decoder_options);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result TranslateResult(Result in_result) {
|
||||
if (in_result.IsSuccess()) {
|
||||
return in_result;
|
||||
}
|
||||
|
||||
if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) {
|
||||
if (in_result.GetDescription() - 0x514 < 100) {
|
||||
return ResultInvalidFileData;
|
||||
}
|
||||
if (in_result.GetDescription() - 0x5dc < 100) {
|
||||
return ResultInvalidFileData;
|
||||
}
|
||||
|
||||
if (in_result.GetDescription() - 0x578 < 100) {
|
||||
if (in_result == ResultFileCountLimit) {
|
||||
return ResultUnknown22;
|
||||
}
|
||||
return ResultUnknown25;
|
||||
}
|
||||
|
||||
if (in_result.raw < ResultUnknown1801.raw) {
|
||||
if (in_result == ResultUnknown1202) {
|
||||
return ResultUnknown810;
|
||||
}
|
||||
if (in_result == ResultUnknown1203) {
|
||||
return ResultUnknown810;
|
||||
}
|
||||
if (in_result == ResultUnknown1701) {
|
||||
return ResultUnknown5;
|
||||
}
|
||||
} else if (in_result.raw < ResultUnknown1803.raw) {
|
||||
if (in_result == ResultUnknown1801) {
|
||||
return ResultUnknown5;
|
||||
}
|
||||
if (in_result == ResultUnknown1802) {
|
||||
return ResultUnknown6;
|
||||
}
|
||||
} else {
|
||||
if (in_result == ResultUnknown1803) {
|
||||
return ResultUnknown7;
|
||||
}
|
||||
if (in_result == ResultUnknown1804) {
|
||||
return ResultOutOfRange;
|
||||
}
|
||||
}
|
||||
return ResultUnknown1024;
|
||||
}
|
||||
|
||||
if (in_result.GetModule() == ErrorModule::FS) {
|
||||
if ((in_result.GetDescription() >> 0xc < 0x7d) ||
|
||||
(in_result.GetDescription() - 1000 < 2000) ||
|
||||
(((in_result.GetDescription() - 3000) >> 3) < 0x271)) {
|
||||
// TODO: Translate FS error
|
||||
return in_result;
|
||||
}
|
||||
}
|
||||
|
||||
return in_result;
|
||||
}
|
||||
|
||||
Result GetAlbumAccessResultForDebug(Out<Result> out_result) {
|
||||
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
||||
*out_result = ResultSuccess;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "GetAlbumFileCount"},
|
||||
FunctionInfo{1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"},
|
||||
FunctionInfo{2, nullptr, "LoadAlbumFile"},
|
||||
FunctionInfo{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
|
||||
FunctionInfo{4, nullptr, "StorageCopyAlbumFile"},
|
||||
FunctionInfo{5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"},
|
||||
FunctionInfo{6, nullptr, "GetAlbumUsage"},
|
||||
FunctionInfo{7, nullptr, "GetAlbumFileSize"},
|
||||
FunctionInfo{8, nullptr, "LoadAlbumFileThumbnail"},
|
||||
FunctionInfo{9, nullptr, "LoadAlbumScreenShotImage"},
|
||||
FunctionInfo{10, nullptr, "LoadAlbumScreenShotThumbnailImage"},
|
||||
FunctionInfo{11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"},
|
||||
FunctionInfo{12, nullptr, "LoadAlbumScreenShotImageEx"},
|
||||
FunctionInfo{13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"},
|
||||
FunctionInfo{14, nullptr, "LoadAlbumScreenShotImageEx0"},
|
||||
FunctionInfo{15, nullptr, "GetAlbumUsage3"},
|
||||
FunctionInfo{16, nullptr, "GetAlbumMountResult"},
|
||||
FunctionInfo{17, nullptr, "GetAlbumUsage16"},
|
||||
FunctionInfo{18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"},
|
||||
FunctionInfo{19, nullptr, "Unknown19"},
|
||||
FunctionInfo{100, nullptr, "GetAlbumFileCountEx0"},
|
||||
FunctionInfo{101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"},
|
||||
FunctionInfo{202, nullptr, "SaveEditedScreenShot"},
|
||||
FunctionInfo{301, nullptr, "GetLastThumbnail"},
|
||||
FunctionInfo{302, nullptr, "GetLastOverlayMovieThumbnail"},
|
||||
FunctionInfo{401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"},
|
||||
FunctionInfo{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
|
||||
FunctionInfo{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
|
||||
FunctionInfo{1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"},
|
||||
FunctionInfo{1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"},
|
||||
FunctionInfo{8001, nullptr, "ForceAlbumUnmounted"},
|
||||
FunctionInfo{8002, nullptr, "ResetAlbumMountStatus"},
|
||||
FunctionInfo{8011, nullptr, "RefreshAlbumCache"},
|
||||
FunctionInfo{8012, nullptr, "GetAlbumCache"},
|
||||
FunctionInfo{8013, nullptr, "GetAlbumCacheEx"},
|
||||
FunctionInfo{8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"},
|
||||
FunctionInfo{10011, nullptr, "SetInternalErrorConversionEnabled"},
|
||||
FunctionInfo{50000, nullptr, "LoadMakerNoteInfoForDebug"},
|
||||
FunctionInfo{50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"},
|
||||
FunctionInfo{60002, nullptr, "OpenAccessorSession"}
|
||||
);
|
||||
|
||||
std::shared_ptr<AlbumManager> manager = nullptr;
|
||||
};
|
||||
|
||||
void LoopProcess(Core::System& system) {
|
||||
auto server_manager = std::make_unique<ServerManager>(system);
|
||||
auto album_manager = std::make_shared<AlbumManager>(system);
|
||||
|
||||
@@ -1,211 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "common/logging.h"
|
||||
#include "core/hle/service/caps/caps_a.h"
|
||||
#include "core/hle/service/caps/caps_manager.h"
|
||||
#include "core/hle/service/caps/caps_result.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
|
||||
namespace Service::Capture {
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> IAlbumAccessorService::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "GetAlbumFileCount"},
|
||||
FunctionInfo{1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"},
|
||||
FunctionInfo{2, nullptr, "LoadAlbumFile"},
|
||||
FunctionInfo{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
|
||||
FunctionInfo{4, nullptr, "StorageCopyAlbumFile"},
|
||||
FunctionInfo{5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"},
|
||||
FunctionInfo{6, nullptr, "GetAlbumUsage"},
|
||||
FunctionInfo{7, nullptr, "GetAlbumFileSize"},
|
||||
FunctionInfo{8, nullptr, "LoadAlbumFileThumbnail"},
|
||||
FunctionInfo{9, nullptr, "LoadAlbumScreenShotImage"},
|
||||
FunctionInfo{10, nullptr, "LoadAlbumScreenShotThumbnailImage"},
|
||||
FunctionInfo{11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"},
|
||||
FunctionInfo{12, nullptr, "LoadAlbumScreenShotImageEx"},
|
||||
FunctionInfo{13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"},
|
||||
FunctionInfo{14, nullptr, "LoadAlbumScreenShotImageEx0"},
|
||||
FunctionInfo{15, nullptr, "GetAlbumUsage3"},
|
||||
FunctionInfo{16, nullptr, "GetAlbumMountResult"},
|
||||
FunctionInfo{17, nullptr, "GetAlbumUsage16"},
|
||||
FunctionInfo{18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"},
|
||||
FunctionInfo{19, nullptr, "Unknown19"},
|
||||
FunctionInfo{100, nullptr, "GetAlbumFileCountEx0"},
|
||||
FunctionInfo{101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"},
|
||||
FunctionInfo{202, nullptr, "SaveEditedScreenShot"},
|
||||
FunctionInfo{301, nullptr, "GetLastThumbnail"},
|
||||
FunctionInfo{302, nullptr, "GetLastOverlayMovieThumbnail"},
|
||||
FunctionInfo{401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"},
|
||||
FunctionInfo{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
|
||||
FunctionInfo{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
|
||||
FunctionInfo{1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"},
|
||||
FunctionInfo{1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"},
|
||||
FunctionInfo{8001, nullptr, "ForceAlbumUnmounted"},
|
||||
FunctionInfo{8002, nullptr, "ResetAlbumMountStatus"},
|
||||
FunctionInfo{8011, nullptr, "RefreshAlbumCache"},
|
||||
FunctionInfo{8012, nullptr, "GetAlbumCache"},
|
||||
FunctionInfo{8013, nullptr, "GetAlbumCacheEx"},
|
||||
FunctionInfo{8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"},
|
||||
FunctionInfo{10011, nullptr, "SetInternalErrorConversionEnabled"},
|
||||
FunctionInfo{50000, nullptr, "LoadMakerNoteInfoForDebug"},
|
||||
FunctionInfo{50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"},
|
||||
FunctionInfo{60002, nullptr, "OpenAccessorSession"}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
|
||||
std::shared_ptr<AlbumManager> album_manager)
|
||||
: ServiceFramework{system_, "caps:a"}, manager{album_manager} {
|
||||
}
|
||||
|
||||
IAlbumAccessorService::~IAlbumAccessorService() = default;
|
||||
|
||||
Result IAlbumAccessorService::GetAlbumFileList(
|
||||
Out<u64> out_count, AlbumStorage storage,
|
||||
OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
|
||||
LOG_INFO(Service_Capture, "called, storage={}", storage);
|
||||
|
||||
const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result IAlbumAccessorService::DeleteAlbumFile(AlbumFileId file_id) {
|
||||
LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}",
|
||||
file_id.application_id, file_id.storage, file_id.type);
|
||||
|
||||
const Result result = manager->DeleteAlbumFile(file_id);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result IAlbumAccessorService::IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage) {
|
||||
LOG_INFO(Service_Capture, "called, storage={}", storage);
|
||||
|
||||
const Result result = manager->IsAlbumMounted(storage);
|
||||
*out_is_mounted = result.IsSuccess();
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result IAlbumAccessorService::Unknown18(
|
||||
Out<u32> out_buffer_size,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_buffer) {
|
||||
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
||||
*out_buffer_size = 0;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IAlbumAccessorService::GetAlbumFileListEx0(
|
||||
Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
|
||||
OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
|
||||
LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags);
|
||||
|
||||
const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result IAlbumAccessorService::GetAutoSavingStorage(Out<bool> out_is_autosaving) {
|
||||
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
||||
|
||||
const Result result = manager->GetAutoSavingStorage(*out_is_autosaving);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result IAlbumAccessorService::LoadAlbumScreenShotImageEx1(
|
||||
const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
|
||||
OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
|
||||
LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
|
||||
file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
|
||||
|
||||
const Result result =
|
||||
manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1(
|
||||
const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
|
||||
OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
|
||||
LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
|
||||
file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
|
||||
|
||||
const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image,
|
||||
file_id, decoder_options);
|
||||
R_RETURN(TranslateResult(result));
|
||||
}
|
||||
|
||||
Result IAlbumAccessorService::TranslateResult(Result in_result) {
|
||||
if (in_result.IsSuccess()) {
|
||||
return in_result;
|
||||
}
|
||||
|
||||
if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) {
|
||||
if (in_result.GetDescription() - 0x514 < 100) {
|
||||
return ResultInvalidFileData;
|
||||
}
|
||||
if (in_result.GetDescription() - 0x5dc < 100) {
|
||||
return ResultInvalidFileData;
|
||||
}
|
||||
|
||||
if (in_result.GetDescription() - 0x578 < 100) {
|
||||
if (in_result == ResultFileCountLimit) {
|
||||
return ResultUnknown22;
|
||||
}
|
||||
return ResultUnknown25;
|
||||
}
|
||||
|
||||
if (in_result.raw < ResultUnknown1801.raw) {
|
||||
if (in_result == ResultUnknown1202) {
|
||||
return ResultUnknown810;
|
||||
}
|
||||
if (in_result == ResultUnknown1203) {
|
||||
return ResultUnknown810;
|
||||
}
|
||||
if (in_result == ResultUnknown1701) {
|
||||
return ResultUnknown5;
|
||||
}
|
||||
} else if (in_result.raw < ResultUnknown1803.raw) {
|
||||
if (in_result == ResultUnknown1801) {
|
||||
return ResultUnknown5;
|
||||
}
|
||||
if (in_result == ResultUnknown1802) {
|
||||
return ResultUnknown6;
|
||||
}
|
||||
} else {
|
||||
if (in_result == ResultUnknown1803) {
|
||||
return ResultUnknown7;
|
||||
}
|
||||
if (in_result == ResultUnknown1804) {
|
||||
return ResultOutOfRange;
|
||||
}
|
||||
}
|
||||
return ResultUnknown1024;
|
||||
}
|
||||
|
||||
if (in_result.GetModule() == ErrorModule::FS) {
|
||||
if ((in_result.GetDescription() >> 0xc < 0x7d) ||
|
||||
(in_result.GetDescription() - 1000 < 2000) ||
|
||||
(((in_result.GetDescription() - 3000) >> 3) < 0x271)) {
|
||||
// TODO: Translate FS error
|
||||
return in_result;
|
||||
}
|
||||
}
|
||||
|
||||
return in_result;
|
||||
}
|
||||
|
||||
|
||||
Result IAlbumAccessorService::GetAlbumAccessResultForDebug(Out<Result> out_result) {
|
||||
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
||||
*out_result = ResultSuccess;
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
} // namespace Service::Capture
|
||||
@@ -1,64 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/caps/caps_types.h"
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Core {
|
||||
class System;
|
||||
}
|
||||
|
||||
namespace Service::Capture {
|
||||
class AlbumManager;
|
||||
|
||||
class IAlbumAccessorService final : public ServiceFramework<IAlbumAccessorService> {
|
||||
public:
|
||||
explicit IAlbumAccessorService(Core::System& system_,
|
||||
std::shared_ptr<AlbumManager> album_manager);
|
||||
~IAlbumAccessorService() override;
|
||||
|
||||
private:
|
||||
Result GetAlbumFileList(Out<u64> out_count, AlbumStorage storage,
|
||||
OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries);
|
||||
|
||||
Result DeleteAlbumFile(AlbumFileId file_id);
|
||||
|
||||
Result IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage);
|
||||
|
||||
Result Unknown18(
|
||||
Out<u32> out_buffer_size,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure>
|
||||
out_buffer);
|
||||
|
||||
Result GetAlbumFileListEx0(Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
|
||||
OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries);
|
||||
|
||||
Result GetAutoSavingStorage(Out<bool> out_is_autosaving);
|
||||
|
||||
Result LoadAlbumScreenShotImageEx1(
|
||||
const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
|
||||
OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias> out_buffer);
|
||||
|
||||
Result LoadAlbumScreenShotThumbnailImageEx1(
|
||||
const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
|
||||
OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
|
||||
OutArray<u8, BufferAttr_HipcMapAlias> out_buffer);
|
||||
|
||||
Result TranslateResult(Result in_result);
|
||||
|
||||
Result GetAlbumAccessResultForDebug(Out<Result> out_result);
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override;
|
||||
std::shared_ptr<AlbumManager> manager = nullptr;
|
||||
};
|
||||
|
||||
} // namespace Service::Capture
|
||||
@@ -262,16 +262,16 @@ private:
|
||||
FunctionInfo{38, nullptr, "OwnTicket3"},
|
||||
FunctionInfo{39, nullptr, "DeleteAllInactivePersonalizedTicket"},
|
||||
FunctionInfo{40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"},
|
||||
FunctionInfo{101, nullptr, "Unknown101"}, //18.0.0+
|
||||
FunctionInfo{102, nullptr, "Unknown102"}, //18.0.0+
|
||||
FunctionInfo{103, nullptr, "Unknown103"}, //18.0.0+
|
||||
FunctionInfo{104, nullptr, "Unknown104"}, //18.0.0+
|
||||
FunctionInfo{105, nullptr, "Unknown105"}, //20.0.0+
|
||||
FunctionInfo{201, nullptr, "Unknown201"}, //18.0.0+
|
||||
FunctionInfo{202, nullptr, "Unknown202"}, //18.0.0+
|
||||
FunctionInfo{203, nullptr, "Unknown203"}, //18.0.0+
|
||||
FunctionInfo{204, nullptr, "Unknown204"}, //18.0.0+
|
||||
FunctionInfo{205, nullptr, "Unknown205"}, //18.0.0+
|
||||
FunctionInfo{101, nullptr, "Unknown101", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{102, nullptr, "Unknown102", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{103, nullptr, "Unknown103", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{104, nullptr, "Unknown104", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{105, nullptr, "Unknown105", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{201, nullptr, "Unknown201", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{202, nullptr, "Unknown202", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{203, nullptr, "Unknown203", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{204, nullptr, "Unknown204", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{205, nullptr, "Unknown205", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{501, nullptr, "Unknown501"},
|
||||
FunctionInfo{502, nullptr, "Unknown502"},
|
||||
FunctionInfo{503, nullptr, "GetTitleKey"},
|
||||
|
||||
@@ -11,13 +11,27 @@
|
||||
#include "core/hle/kernel/k_event.h"
|
||||
#include "core/hle/service/acc/errors.h"
|
||||
#include "core/hle/service/friend/friend.h"
|
||||
#include "core/hle/service/friend/friend_interface.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/kernel_helpers.h"
|
||||
#include "core/hle/service/server_manager.h"
|
||||
|
||||
namespace Service::Friend {
|
||||
|
||||
class Friend final : public Module::Interface {
|
||||
public:
|
||||
explicit Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name) : Interface(std::move(module_), system_, name) {}
|
||||
~Friend() override = default;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, &Friend::CreateFriendService, "CreateFriendService"},
|
||||
FunctionInfo{1, &Friend::CreateNotificationService, "CreateNotificationService"},
|
||||
FunctionInfo{2, nullptr, "CreateDaemonSuspendSessionService"}
|
||||
);
|
||||
};
|
||||
|
||||
class IFriendService final : public ServiceFramework<IFriendService> {
|
||||
public:
|
||||
explicit IFriendService(Core::System& system_)
|
||||
@@ -259,7 +273,7 @@ private:
|
||||
FunctionInfo{10101, &IFriendService::GetFriendList, "GetFriendList"},
|
||||
FunctionInfo{10102, nullptr, "UpdateFriendInfo"},
|
||||
FunctionInfo{10110, nullptr, "GetFriendProfileImage"},
|
||||
FunctionInfo{10111, nullptr, "GetFriendProfileImageWithImageSize"}, // 18.0.0+
|
||||
FunctionInfo{10111, nullptr, "GetFriendProfileImageWithImageSize", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"},
|
||||
FunctionInfo{10121, nullptr, "EnsureFriendListAvailable"},
|
||||
FunctionInfo{10200, nullptr, "SendFriendRequestForApplication"},
|
||||
@@ -268,7 +282,7 @@ private:
|
||||
FunctionInfo{10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"},
|
||||
FunctionInfo{10421, nullptr, "EnsureBlockedUserListAvailable"},
|
||||
FunctionInfo{10500, nullptr, "GetProfileList"},
|
||||
FunctionInfo{10501, nullptr, "GetProfileListV2"}, // 18.0.0+
|
||||
FunctionInfo{10501, nullptr, "GetProfileListV2", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{10600, nullptr, "DeclareOpenOnlinePlaySession"},
|
||||
FunctionInfo{10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"},
|
||||
FunctionInfo{10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"},
|
||||
@@ -276,7 +290,7 @@ private:
|
||||
FunctionInfo{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
|
||||
FunctionInfo{10702, nullptr, "AddPlayHistory"},
|
||||
FunctionInfo{11000, nullptr, "GetProfileImageUrl"},
|
||||
FunctionInfo{11001, nullptr, "GetProfileImageUrlV2"}, // 18.0.0+
|
||||
FunctionInfo{11001, nullptr, "GetProfileImageUrlV2", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{20100, &IFriendService::GetFriendCount, "GetFriendCount"},
|
||||
FunctionInfo{20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"},
|
||||
FunctionInfo{20102, nullptr, "GetFriendDetailedInfo"},
|
||||
@@ -284,49 +298,49 @@ private:
|
||||
FunctionInfo{20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"},
|
||||
FunctionInfo{20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"},
|
||||
FunctionInfo{20106, nullptr, "UpdateFriendInfoForViewerV1"},
|
||||
FunctionInfo{20107, nullptr, "GetFriendDetailedInfoV2"}, // 20.0.0+
|
||||
FunctionInfo{20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2"}, // 22.0.0+
|
||||
FunctionInfo{20109, nullptr, "UpdateFriendInfoForViewerV2"}, // 22.0.0+
|
||||
FunctionInfo{20107, nullptr, "GetFriendDetailedInfoV2", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2", MakeVersionGate({22,0,0})},
|
||||
FunctionInfo{20109, nullptr, "UpdateFriendInfoForViewerV2", MakeVersionGate({22,0,0})},
|
||||
FunctionInfo{20110, nullptr, "LoadFriendSettingV1"},
|
||||
FunctionInfo{20111, nullptr, "LoadFriendSettingV2"}, // 22.0.0+
|
||||
FunctionInfo{20111, nullptr, "LoadFriendSettingV2", MakeVersionGate({22,0,0})},
|
||||
FunctionInfo{20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"},
|
||||
FunctionInfo{20201, nullptr, "GetFriendRequestListV1"},
|
||||
FunctionInfo{20202, nullptr, "GetFriendRequestListV2"}, // 20.0.0+
|
||||
FunctionInfo{20203, nullptr, "GetFriendRequestReceivedNotificationCount"}, // 22.0.0+
|
||||
FunctionInfo{20202, nullptr, "GetFriendRequestListV2", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{20203, nullptr, "GetFriendRequestReceivedNotificationCount", MakeVersionGate({22,0,0})},
|
||||
FunctionInfo{20300, nullptr, "GetFriendCandidateList"},
|
||||
FunctionInfo{20301, nullptr, "GetNintendoNetworkIdInfo"},
|
||||
FunctionInfo{20302, nullptr, "GetSnsAccountLinkage"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{20303, nullptr, "GetSnsAccountProfile"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{20304, nullptr, "GetSnsAccountFriendList"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{20302, nullptr, "GetSnsAccountLinkage", MakeVersionGate({5,0,0}, {19,0,1})},
|
||||
FunctionInfo{20303, nullptr, "GetSnsAccountProfile", MakeVersionGate({5,0,0}, {19,0,1})},
|
||||
FunctionInfo{20304, nullptr, "GetSnsAccountFriendList", MakeVersionGate({5,0,0}, {19,0,1})},
|
||||
FunctionInfo{20400, nullptr, "GetBlockedUserListV1"},
|
||||
FunctionInfo{20401, nullptr, "SyncBlockedUserList"},
|
||||
FunctionInfo{20402, nullptr, "GetBlockedUserListV2"}, // 20.0.0+
|
||||
FunctionInfo{20402, nullptr, "GetBlockedUserListV2", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{20500, nullptr, "GetProfileExtraListV1"},
|
||||
FunctionInfo{20501, nullptr, "GetRelationship"},
|
||||
FunctionInfo{20502, nullptr, "GetProfileExtraListV2"}, // 19.0.0+
|
||||
FunctionInfo{20502, nullptr, "GetProfileExtraListV2", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"},
|
||||
FunctionInfo{20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2"}, // 19.0.0+
|
||||
FunctionInfo{20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{20700, nullptr, "GetPlayHistoryListV1"},
|
||||
FunctionInfo{20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"},
|
||||
FunctionInfo{20702, nullptr, "GetPlayHistoryListV2"}, // 19.0.0+
|
||||
FunctionInfo{20702, nullptr, "GetPlayHistoryListV2", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"},
|
||||
FunctionInfo{20801, nullptr, "SyncUserSetting"},
|
||||
FunctionInfo{20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2"}, // 19.0.0+
|
||||
FunctionInfo{20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"},
|
||||
FunctionInfo{21000, nullptr, "GetExternalApplicationCatalog"},
|
||||
FunctionInfo{22000, nullptr, "GetReceivedFriendInvitationListV1"},
|
||||
FunctionInfo{22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"},
|
||||
FunctionInfo{22002, nullptr, "GetReceivedFriendInvitationListV2"}, // 19.0.0+
|
||||
FunctionInfo{22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2"}, // 19.0.0+
|
||||
FunctionInfo{22002, nullptr, "GetReceivedFriendInvitationListV2", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"},
|
||||
FunctionInfo{30100, nullptr, "DropFriendNewlyFlags"},
|
||||
FunctionInfo{30101, nullptr, "DeleteFriend"},
|
||||
FunctionInfo{30110, nullptr, "DropFriendNewlyFlag"},
|
||||
FunctionInfo{30120, nullptr, "ChangeFriendFavoriteFlag"},
|
||||
FunctionInfo{30121, nullptr, "ChangeFriendOnlineNotificationFlag"},
|
||||
FunctionInfo{30130, nullptr, "SetFriendNote"}, // 22.0.0+
|
||||
FunctionInfo{30131, nullptr, "RequestUploadPendingNote"}, // 22.0.0+
|
||||
FunctionInfo{30190, nullptr, "RequestSyncLocalUpdates"}, // 22.0.0+
|
||||
FunctionInfo{30130, nullptr, "SetFriendNote", MakeVersionGate({22,0,0})},
|
||||
FunctionInfo{30131, nullptr, "RequestUploadPendingNote", MakeVersionGate({22,0,0})},
|
||||
FunctionInfo{30190, nullptr, "RequestSyncLocalUpdates", MakeVersionGate({22,0,0})},
|
||||
FunctionInfo{30200, nullptr, "SendFriendRequest"},
|
||||
FunctionInfo{30201, nullptr, "SendFriendRequestWithApplicationInfoV1"},
|
||||
FunctionInfo{30202, nullptr, "CancelFriendRequest"},
|
||||
@@ -341,27 +355,27 @@ private:
|
||||
FunctionInfo{30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"},
|
||||
FunctionInfo{30216, nullptr, "ResendFacedFriendRequest"},
|
||||
FunctionInfo{30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"},
|
||||
FunctionInfo{30218, nullptr, "SendFriendRequestWithApplicationInfoV2"}, // 20.0.0+
|
||||
FunctionInfo{30300, nullptr, "GetSnsAccountLinkPageUrl"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{30301, nullptr, "UnlinkSnsAccount"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{30218, nullptr, "SendFriendRequestWithApplicationInfoV2", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{30300, nullptr, "GetSnsAccountLinkPageUrl", MakeVersionGate({5,0,0}, {19,0,1})},
|
||||
FunctionInfo{30301, nullptr, "UnlinkSnsAccount", MakeVersionGate({5,0,0}, {19,0,1})},
|
||||
FunctionInfo{30400, nullptr, "BlockUser"},
|
||||
FunctionInfo{30401, nullptr, "BlockUserWithApplicationInfoV1"},
|
||||
FunctionInfo{30402, nullptr, "UnblockUser"},
|
||||
FunctionInfo{30403, nullptr, "BlockUserWithApplicationInfoV2"}, // 20.0.0+
|
||||
FunctionInfo{30403, nullptr, "BlockUserWithApplicationInfoV2", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{30500, nullptr, "GetProfileExtraFromFriendCodeV1"},
|
||||
FunctionInfo{30501, nullptr, "GetProfileExtraFromFriendCodeV2"}, // 19.0.0+
|
||||
FunctionInfo{30501, nullptr, "GetProfileExtraFromFriendCodeV2", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{30700, nullptr, "DeletePlayHistory"},
|
||||
FunctionInfo{30701, nullptr, "AddPlayHistoryWithApplication"}, // 19.0.0+
|
||||
FunctionInfo{30701, nullptr, "AddPlayHistoryWithApplication", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{30810, nullptr, "ChangePresencePermission"},
|
||||
FunctionInfo{30811, nullptr, "ChangeFriendRequestReception"},
|
||||
FunctionInfo{30812, nullptr, "ChangePlayLogPermission"},
|
||||
FunctionInfo{30820, nullptr, "IssueFriendCode"},
|
||||
FunctionInfo{30830, nullptr, "ClearPlayLog"},
|
||||
FunctionInfo{30900, nullptr, "SendFriendInvitationV1"},
|
||||
FunctionInfo{30901, nullptr, "SendFriendInvitationV2"}, // 19.0.0+
|
||||
FunctionInfo{30901, nullptr, "SendFriendInvitationV2", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{30910, nullptr, "ReadFriendInvitation"},
|
||||
FunctionInfo{30911, nullptr, "ReadAllFriendInvitations"},
|
||||
FunctionInfo{31000, nullptr, "OpenUser"}, // 19.0.0+
|
||||
FunctionInfo{31000, nullptr, "OpenUser", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{40100, nullptr, "DeleteFriendListCache"},
|
||||
FunctionInfo{40400, nullptr, "DeleteBlockedUserListCache"},
|
||||
FunctionInfo{49900, nullptr, "DeleteNetworkServiceAccountCache"}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/friend/friend_interface.h"
|
||||
|
||||
namespace Service::Friend {
|
||||
|
||||
Friend::Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name)
|
||||
: Interface(std::move(module_), system_, name) {
|
||||
}
|
||||
|
||||
Friend::~Friend() = default;
|
||||
|
||||
} // namespace Service::Friend
|
||||
@@ -1,28 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/friend/friend.h"
|
||||
|
||||
namespace Service::Friend {
|
||||
|
||||
class Friend final : public Module::Interface {
|
||||
public:
|
||||
explicit Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name);
|
||||
~Friend() override;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, &Friend::CreateFriendService, "CreateFriendService"},
|
||||
FunctionInfo{1, &Friend::CreateNotificationService, "CreateNotificationService"},
|
||||
FunctionInfo{2, nullptr, "CreateDaemonSuspendSessionService"}
|
||||
);
|
||||
};
|
||||
|
||||
} // namespace Service::Friend
|
||||
@@ -278,7 +278,7 @@ public:
|
||||
FunctionInfo{209, nullptr, "GetAvailableFirmwareVersionForRevert"},
|
||||
FunctionInfo{210, nullptr, "IsFirmwareUpdatingDevice"},
|
||||
FunctionInfo{211, nullptr, "StartFirmwareUpdateIndividual"},
|
||||
FunctionInfo{212, nullptr, "GetDetailFirmwareVersion"}, // 19.0.0+
|
||||
FunctionInfo{212, nullptr, "GetDetailFirmwareVersion", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{215, nullptr, "SetUsbFirmwareForceUpdateEnabled"},
|
||||
FunctionInfo{216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"},
|
||||
FunctionInfo{221, nullptr, "UpdateControllerColor"},
|
||||
@@ -312,11 +312,11 @@ public:
|
||||
FunctionInfo{249, nullptr, "ConnectUniquePad"},
|
||||
FunctionInfo{250, nullptr, "IsVirtual"},
|
||||
FunctionInfo{251, nullptr, "GetAnalogStickModuleParam"},
|
||||
FunctionInfo{253, nullptr, "ClearStorageForShipment"}, //19.0.0+
|
||||
FunctionInfo{261, nullptr, "UpdateDesignInfo12"}, //21.0.0+
|
||||
FunctionInfo{262, nullptr, "GetUniquePadButtonCount"}, //21.0.0+
|
||||
FunctionInfo{267, nullptr, "SetAnalogStickCalibration"}, //21.0.0+
|
||||
FunctionInfo{268, nullptr, "ResetAnalogStickCalibration"}, //21.0.0+
|
||||
FunctionInfo{253, nullptr, "ClearStorageForShipment", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{261, nullptr, "UpdateDesignInfo12", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{262, nullptr, "GetUniquePadButtonCount", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{267, nullptr, "SetAnalogStickCalibration", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{268, nullptr, "ResetAnalogStickCalibration", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{301, nullptr, "GetAbstractedPadHandles"},
|
||||
FunctionInfo{302, nullptr, "GetAbstractedPadState"},
|
||||
FunctionInfo{303, nullptr, "GetAbstractedPadsState"},
|
||||
@@ -333,8 +333,8 @@ public:
|
||||
FunctionInfo{331, nullptr, "DetachHdlsVirtualDevice"},
|
||||
FunctionInfo{332, nullptr, "SetHdlsState"},
|
||||
FunctionInfo{350, nullptr, "AddRegisteredDevice"},
|
||||
FunctionInfo{351, nullptr, "GetRegisteredDevicesCountDebug"}, //17.0.0-18.1.0
|
||||
FunctionInfo{352, nullptr, "DeleteRegisteredDevicesDebug"}, //17.0.0-18.1.0
|
||||
FunctionInfo{351, nullptr, "GetRegisteredDevicesCountDebug", MakeVersionGate({17,0,0}, {18,1,0})},
|
||||
FunctionInfo{352, nullptr, "DeleteRegisteredDevicesDebug", MakeVersionGate({17,0,0}, {18,1,0})},
|
||||
FunctionInfo{400, nullptr, "DisableExternalMcuOnNxDevice"},
|
||||
FunctionInfo{401, nullptr, "DisableRailDeviceFiltering"},
|
||||
FunctionInfo{402, nullptr, "EnableWiredPairing"},
|
||||
@@ -346,26 +346,26 @@ public:
|
||||
FunctionInfo{551, nullptr, "GetAnalogStickModelData"},
|
||||
FunctionInfo{552, nullptr, "ResetAnalogStickModelData"},
|
||||
FunctionInfo{600, nullptr, "ConvertPadState"},
|
||||
FunctionInfo{601, nullptr, "IsButtonConfigSupported"}, //18.0.0+
|
||||
FunctionInfo{602, nullptr, "IsButtonConfigEmbeddedSupported"}, //18.0.0+
|
||||
FunctionInfo{603, nullptr, "DeleteButtonConfig"}, //18.0.0+
|
||||
FunctionInfo{604, nullptr, "DeleteButtonConfigEmbedded"}, //18.0.0+
|
||||
FunctionInfo{605, nullptr, "SetButtonConfigEnabled"}, //18.0.0+
|
||||
FunctionInfo{606, nullptr, "SetButtonConfigEmbeddedEnabled"}, //18.0.0+
|
||||
FunctionInfo{607, nullptr, "IsButtonConfigEnabled"}, //18.0.0+
|
||||
FunctionInfo{608, nullptr, "IsButtonConfigEmbeddedEnabled"}, //18.0.0+
|
||||
FunctionInfo{609, nullptr, "SetButtonConfigEmbedded"}, //18.0.0+
|
||||
FunctionInfo{610, nullptr, "SetButtonConfigFull"}, //18.0.0+
|
||||
FunctionInfo{611, nullptr, "SetButtonConfigLeft"}, //18.0.0+
|
||||
FunctionInfo{612, nullptr, "SetButtonConfigRight"}, //18.0.0+
|
||||
FunctionInfo{613, nullptr, "GetButtonConfigEmbedded"}, //18.0.0+
|
||||
FunctionInfo{614, nullptr, "GetButtonConfigFull"}, //18.0.0+
|
||||
FunctionInfo{615, nullptr, "GetButtonConfigLeft"}, //18.0.0+
|
||||
FunctionInfo{616, nullptr, "GetButtonConfigRight"}, //18.0.0+
|
||||
FunctionInfo{601, nullptr, "IsButtonConfigSupported", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{602, nullptr, "IsButtonConfigEmbeddedSupported", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{603, nullptr, "DeleteButtonConfig", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{604, nullptr, "DeleteButtonConfigEmbedded", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{605, nullptr, "SetButtonConfigEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{606, nullptr, "SetButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{607, nullptr, "IsButtonConfigEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{608, nullptr, "IsButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{609, nullptr, "SetButtonConfigEmbedded", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{610, nullptr, "SetButtonConfigFull", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{611, nullptr, "SetButtonConfigLeft", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{612, nullptr, "SetButtonConfigRight", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{613, nullptr, "GetButtonConfigEmbedded", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{614, nullptr, "GetButtonConfigFull", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{615, nullptr, "GetButtonConfigLeft", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{616, nullptr, "GetButtonConfigRight", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{650, nullptr, "AddButtonPlayData"},
|
||||
FunctionInfo{651, nullptr, "StartButtonPlayData"},
|
||||
FunctionInfo{652, nullptr, "StopButtonPlayData"},
|
||||
FunctionInfo{700, nullptr, "GetRailAttachEventCount"}, //21.0.0+
|
||||
FunctionInfo{700, nullptr, "GetRailAttachEventCount", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{2000, nullptr, "DeactivateDigitizer"},
|
||||
FunctionInfo{2001, nullptr, "SetDigitizerAutoPilotState"},
|
||||
FunctionInfo{2002, nullptr, "UnsetDigitizerAutoPilotState"},
|
||||
|
||||
@@ -140,8 +140,8 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IHidServer::FindRequest(u3
|
||||
FunctionInfo{308, nullptr, "SetSevenSixAxisSensorFusionStrength"},
|
||||
FunctionInfo{309, nullptr, "GetSevenSixAxisSensorFusionStrength"},
|
||||
FunctionInfo{310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"},
|
||||
FunctionInfo{320, nullptr, "EnableNpadImu"}, //21.0.0+
|
||||
FunctionInfo{321, nullptr, "DisableNpadImu"}, //21.0.0+
|
||||
FunctionInfo{320, nullptr, "EnableNpadImu", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{321, nullptr, "DisableNpadImu", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"},
|
||||
FunctionInfo{401, nullptr, "EnableUsbFullKeyController"},
|
||||
FunctionInfo{402, nullptr, "IsUsbFullKeyControllerConnected"},
|
||||
@@ -230,11 +230,11 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IHidServer::FindRequest(u3
|
||||
FunctionInfo{3009, nullptr, "GetFullKeyKeyboardMap"},
|
||||
FunctionInfo{3010, nullptr, "SetFullKeyKeyboardMap"},
|
||||
FunctionInfo{3011, nullptr, "ResetFullKeyKeyboardMap"},
|
||||
FunctionInfo{3012, nullptr, "GetDebugPadGenericPadMap"}, //21.0.0+
|
||||
FunctionInfo{3013, nullptr, "SetDebugPadGenericPadMap"}, //21.0.0+
|
||||
FunctionInfo{3014, nullptr, "GetDebugPadKeyboardMap"}, //21.0.0+
|
||||
FunctionInfo{3015, nullptr, "SetDebugPadKeyboardMap"}, //21.0.0+
|
||||
FunctionInfo{3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion"} //21.0.0+
|
||||
FunctionInfo{3012, nullptr, "GetDebugPadGenericPadMap", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{3013, nullptr, "SetDebugPadGenericPadMap", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{3014, nullptr, "GetDebugPadKeyboardMap", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{3015, nullptr, "SetDebugPadKeyboardMap", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion", MakeVersionGate({21,0,0})}
|
||||
// What? -- {12010, nullptr, "SetButtonConfigLeft"},
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
|
||||
@@ -154,9 +154,9 @@ private:
|
||||
FunctionInfo{328, nullptr, "AttachAbstractedPadToNpad"},
|
||||
FunctionInfo{329, nullptr, "DetachAbstractedPadAll"},
|
||||
FunctionInfo{330, nullptr, "CheckAbstractedPadConnection"},
|
||||
FunctionInfo{332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType"}, //19.0.0+
|
||||
FunctionInfo{333, nullptr, "SetNpadUserSpgApplet"}, //20.0.0+
|
||||
FunctionInfo{334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle"}, //20.0.0+
|
||||
FunctionInfo{332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{333, nullptr, "SetNpadUserSpgApplet", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"},
|
||||
FunctionInfo{502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"},
|
||||
FunctionInfo{503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"},
|
||||
@@ -185,12 +185,12 @@ private:
|
||||
FunctionInfo{547, nullptr, "GetAllowedBluetoothLinksCount"},
|
||||
FunctionInfo{548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"},
|
||||
FunctionInfo{549, nullptr, "GetConnectableRegisteredDevices"},
|
||||
FunctionInfo{551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport"}, //20.0.0+ //mocked via 548 for Diablo 3 (at least)
|
||||
FunctionInfo{551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport", MakeVersionGate({20,0,0})}, //mocked via 548 for Diablo 3 (at least)
|
||||
FunctionInfo{700, nullptr, "ActivateUniquePad"},
|
||||
FunctionInfo{702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"},
|
||||
FunctionInfo{703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"},
|
||||
FunctionInfo{711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle"}, //20.0.0+
|
||||
FunctionInfo{712, nullptr, "GetUniquePadColor12"}, //20.0.0+
|
||||
FunctionInfo{711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{712, nullptr, "GetUniquePadColor12", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"},
|
||||
FunctionInfo{800, nullptr, "ListSixAxisSensorHandles"},
|
||||
FunctionInfo{801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
|
||||
@@ -257,8 +257,8 @@ private:
|
||||
FunctionInfo{1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"},
|
||||
FunctionInfo{1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
|
||||
FunctionInfo{1157, nullptr, "CancelConnectionTrigger"},
|
||||
FunctionInfo{1158, nullptr, "SetConnectionLimitForSplay"}, //20.1.0+
|
||||
FunctionInfo{1159, nullptr, "ClearConnectionLimitForSplay"}, //20.1.0+
|
||||
FunctionInfo{1158, nullptr, "SetConnectionLimitForSplay", MakeVersionGate({20,1,0})},
|
||||
FunctionInfo{1159, nullptr, "ClearConnectionLimitForSplay", MakeVersionGate({20,1,0})},
|
||||
FunctionInfo{1200, nullptr, "IsButtonConfigSupported"},
|
||||
FunctionInfo{1201, nullptr, "IsButtonConfigEmbeddedSupported"},
|
||||
FunctionInfo{1202, nullptr, "DeleteButtonConfig"},
|
||||
@@ -317,17 +317,17 @@ private:
|
||||
FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"},
|
||||
FunctionInfo{1290, nullptr, "DeleteButtonConfigStorageRight"},
|
||||
FunctionInfo{1291, nullptr, "DeleteButtonConfigStorageRight"},
|
||||
FunctionInfo{1308, nullptr, "SetButtonConfigVisible"}, //18.0.0+
|
||||
FunctionInfo{1309, nullptr, "IsButtonConfigVisible"}, //18.0.0+
|
||||
FunctionInfo{1320, nullptr, "WakeTouchScreenUp"}, //17.0.0+
|
||||
FunctionInfo{1321, nullptr, "PutTouchScreenToSleep"}, //17.0.0+
|
||||
FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, //20.0.0+
|
||||
FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, //21.0.0+
|
||||
FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, //21.0.0+
|
||||
FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, //21.0.0+
|
||||
FunctionInfo{1326, nullptr, "SetTouchScreenOffset"}, //21.0.0+
|
||||
FunctionInfo{1420, nullptr, "GetAppletResourceProperty"}, //19.0.0+
|
||||
FunctionInfo{12010, nullptr, "SetButtonConfigLeft"} //11.0.0-17.0.1
|
||||
FunctionInfo{1308, nullptr, "SetButtonConfigVisible", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{1309, nullptr, "IsButtonConfigVisible", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{1320, nullptr, "WakeTouchScreenUp", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{1321, nullptr, "PutTouchScreenToSleep", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1326, nullptr, "SetTouchScreenOffset", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1420, nullptr, "GetAppletResourceProperty", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{12010, nullptr, "SetButtonConfigLeft", MakeVersionGate({11,0,0}, {17,0,1})}
|
||||
);
|
||||
|
||||
Kernel::KEvent* acquire_connection_trigger_timeout_event;
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include "core/hle/service/ldn/ldn.h"
|
||||
#include "core/hle/service/ldn/monitor_service.h"
|
||||
#include "core/hle/service/ldn/sf_monitor_service.h"
|
||||
#include "core/hle/service/ldn/sf_service.h"
|
||||
#include "core/hle/service/ldn/sf_service_monitor.h"
|
||||
#include "core/hle/service/ldn/system_local_communication_service.h"
|
||||
#include "core/hle/service/ldn/user_local_communication_service.h"
|
||||
@@ -82,7 +81,7 @@ private:
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"},
|
||||
FunctionInfo{1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
|
||||
FunctionInfo{1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -112,7 +111,37 @@ private:
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
|
||||
FunctionInfo{1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
|
||||
FunctionInfo{1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
};
|
||||
|
||||
class ISfService final : public ServiceFramework<ISfService> {
|
||||
public:
|
||||
explicit ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {}
|
||||
~ISfService() override = default;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
|
||||
FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"},
|
||||
FunctionInfo{272, nullptr, "GetRole"},
|
||||
FunctionInfo{280, nullptr, "GetAdvertiseData"},
|
||||
FunctionInfo{288, nullptr, "GetGroupInfo"},
|
||||
FunctionInfo{296, nullptr, "GetGroupInfo2"},
|
||||
FunctionInfo{304, nullptr, "GetGroupOwner"},
|
||||
FunctionInfo{312, nullptr, "GetIpConfig"},
|
||||
FunctionInfo{320, nullptr, "GetLinkLevel"},
|
||||
FunctionInfo{512, nullptr, "Scan"},
|
||||
FunctionInfo{768, nullptr, "CreateGroup"},
|
||||
FunctionInfo{776, nullptr, "DestroyGroup"},
|
||||
FunctionInfo{784, nullptr, "SetAdvertiseData"},
|
||||
FunctionInfo{1536, nullptr, "SendToOtherGroup"},
|
||||
FunctionInfo{1544, nullptr, "RecvFromOtherGroup"},
|
||||
FunctionInfo{1552, nullptr, "AddAcceptableGroupId"},
|
||||
FunctionInfo{1560, nullptr, "ClearAcceptableGroupId"}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "core/hle/service/ldn/sf_service.h"
|
||||
|
||||
namespace Service::LDN {
|
||||
|
||||
ISfService::ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {
|
||||
}
|
||||
|
||||
ISfService::~ISfService() = default;
|
||||
|
||||
} // namespace Service::LDN
|
||||
@@ -1,48 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Core {
|
||||
class System;
|
||||
}
|
||||
|
||||
namespace Service::LDN {
|
||||
|
||||
class ISfService final : public ServiceFramework<ISfService> {
|
||||
public:
|
||||
explicit ISfService(Core::System& system_);
|
||||
~ISfService() override;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
|
||||
FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"},
|
||||
FunctionInfo{272, nullptr, "GetRole"},
|
||||
FunctionInfo{280, nullptr, "GetAdvertiseData"},
|
||||
FunctionInfo{288, nullptr, "GetGroupInfo"},
|
||||
FunctionInfo{296, nullptr, "GetGroupInfo2"},
|
||||
FunctionInfo{304, nullptr, "GetGroupOwner"},
|
||||
FunctionInfo{312, nullptr, "GetIpConfig"},
|
||||
FunctionInfo{320, nullptr, "GetLinkLevel"},
|
||||
FunctionInfo{512, nullptr, "Scan"},
|
||||
FunctionInfo{768, nullptr, "CreateGroup"},
|
||||
FunctionInfo{776, nullptr, "DestroyGroup"},
|
||||
FunctionInfo{784, nullptr, "SetAdvertiseData"},
|
||||
FunctionInfo{1536, nullptr, "SendToOtherGroup"},
|
||||
FunctionInfo{1544, nullptr, "RecvFromOtherGroup"},
|
||||
FunctionInfo{1552, nullptr, "AddAcceptableGroupId"},
|
||||
FunctionInfo{1560, nullptr, "ClearAcceptableGroupId"}
|
||||
);
|
||||
};
|
||||
|
||||
} // namespace Service::LDN
|
||||
@@ -328,8 +328,8 @@ private:
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, &ILogger::Log, "Log"},
|
||||
FunctionInfo{1, &ILogger::SetDestination, "SetDestination"},
|
||||
FunctionInfo{2, nullptr, "TransmitHashedLog"}, //20.0.0+
|
||||
FunctionInfo{3, nullptr, "DevNotify"} //20.0.0+
|
||||
FunctionInfo{2, nullptr, "TransmitHashedLog", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{3, nullptr, "DevNotify", MakeVersionGate({20,0,0})}
|
||||
);
|
||||
::Common::unordered_map<LogPacketHeaderEntry, std::vector<u8>> entries{};
|
||||
LogDestination destination{LogDestination::All};
|
||||
|
||||
@@ -21,42 +21,42 @@ public:
|
||||
}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Unknown0"}, //19.0.0+
|
||||
FunctionInfo{1, nullptr, "Unknown1"}, //20.0.0+
|
||||
FunctionInfo{2, nullptr, "Unknown2"}, //20.0.0+
|
||||
FunctionInfo{0, nullptr, "Unknown0", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{1, nullptr, "Unknown1", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2, nullptr, "Unknown2", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{10, nullptr, "TryGetLastMigrationInfo"},
|
||||
FunctionInfo{11, nullptr, "Unknown11"}, //20.0.0+
|
||||
FunctionInfo{100, nullptr, "CreateUserMigrationServer"}, //7.0.0+
|
||||
FunctionInfo{101, nullptr, "ResumeUserMigrationServer"}, //7.0.0+
|
||||
FunctionInfo{200, nullptr, "CreateUserMigrationClient"}, //7.0.0+
|
||||
FunctionInfo{201, nullptr, "ResumeUserMigrationClient"}, //7.0.0+
|
||||
FunctionInfo{1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync"}, //8.0.0-20.5.0
|
||||
FunctionInfo{1010, nullptr, "TryGetLastSaveDataMigrationInfo"}, //7.0.0+
|
||||
FunctionInfo{1100, nullptr, "CreateSaveDataMigrationServer"}, //7.0.0-19.0.1
|
||||
FunctionInfo{1101, nullptr, "ResumeSaveDataMigrationServer"}, //7.0.0+
|
||||
FunctionInfo{1110, nullptr, "Unknown1101"}, //17.0.0+
|
||||
FunctionInfo{1200, nullptr, "CreateSaveDataMigrationClient"}, //7.0.0+
|
||||
FunctionInfo{1201, nullptr, "ResumeSaveDataMigrationClient"}, //7.0.0+
|
||||
FunctionInfo{2001, nullptr, "Unknown2001"}, //20.0.0+
|
||||
FunctionInfo{2010, nullptr, "Unknown2010"}, //20.0.0+
|
||||
FunctionInfo{2100, nullptr, "Unknown2100"}, //20.0.0+
|
||||
FunctionInfo{2110, nullptr, "Unknown2110"}, //20.0.0+
|
||||
FunctionInfo{2200, nullptr, "Unknown2200"}, //20.0.0+
|
||||
FunctionInfo{2210, nullptr, "Unknown2210"}, //20.0.0+
|
||||
FunctionInfo{2220, nullptr, "Unknown2220"}, //20.0.0+
|
||||
FunctionInfo{2230, nullptr, "Unknown2230"}, //20.0.0+
|
||||
FunctionInfo{2231, nullptr, "Unknown2231"}, //20.0.0+
|
||||
FunctionInfo{2232, nullptr, "Unknown2232"}, //20.0.0+
|
||||
FunctionInfo{2233, nullptr, "Unknown2233"}, //20.0.0+
|
||||
FunctionInfo{2234, nullptr, "Unknown2234"}, //20.0.0+
|
||||
FunctionInfo{2250, nullptr, "Unknown2250"}, //20.0.0+
|
||||
FunctionInfo{2260, nullptr, "Unknown2260"}, //20.0.0+
|
||||
FunctionInfo{2270, nullptr, "Unknown2270"}, //20.0.0+
|
||||
FunctionInfo{2280, nullptr, "Unknown2280"}, //20.0.0+
|
||||
FunctionInfo{2300, nullptr, "Unknown2300"}, //20.0.0+
|
||||
FunctionInfo{2310, nullptr, "Unknown2310"}, //20.0.0+
|
||||
FunctionInfo{2400, nullptr, "Unknown2400"}, //20.0.0+
|
||||
FunctionInfo{2420, nullptr, "Unknown2420"} //20.0.0+
|
||||
FunctionInfo{11, nullptr, "Unknown11", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{100, nullptr, "CreateUserMigrationServer", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{101, nullptr, "ResumeUserMigrationServer", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{200, nullptr, "CreateUserMigrationClient", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{201, nullptr, "ResumeUserMigrationClient", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync", MakeVersionGate({8,0,0}, {20,5,0})},
|
||||
FunctionInfo{1010, nullptr, "TryGetLastSaveDataMigrationInfo", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{1100, nullptr, "CreateSaveDataMigrationServer", MakeVersionGate({7,0,0}, {19,0,1})},
|
||||
FunctionInfo{1101, nullptr, "ResumeSaveDataMigrationServer", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{1110, nullptr, "Unknown1101", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{1200, nullptr, "CreateSaveDataMigrationClient", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{1201, nullptr, "ResumeSaveDataMigrationClient", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2010, nullptr, "Unknown2010", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2100, nullptr, "Unknown2100", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2110, nullptr, "Unknown2110", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2200, nullptr, "Unknown2200", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2210, nullptr, "Unknown2210", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2220, nullptr, "Unknown2220", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2230, nullptr, "Unknown2230", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2231, nullptr, "Unknown2231", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2232, nullptr, "Unknown2232", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2233, nullptr, "Unknown2233", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2234, nullptr, "Unknown2234", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2250, nullptr, "Unknown2250", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2260, nullptr, "Unknown2260", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2270, nullptr, "Unknown2270", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2280, nullptr, "Unknown2280", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2300, nullptr, "Unknown2300", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2310, nullptr, "Unknown2310", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2400, nullptr, "Unknown2400", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2420, nullptr, "Unknown2420", MakeVersionGate({20,0,0})}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -493,7 +493,7 @@ private:
|
||||
FunctionInfo{23, nullptr, "SetKeptInSleep"},
|
||||
FunctionInfo{24, nullptr, "RegisterSocketDescriptor"},
|
||||
FunctionInfo{25, nullptr, "UnregisterSocketDescriptor"},
|
||||
FunctionInfo{26, nullptr, "GetNetworkAccessStatus"} //21.0.0+
|
||||
FunctionInfo{26, nullptr, "GetNetworkAccessStatus", MakeVersionGate({21,0,0})}
|
||||
);
|
||||
KernelHelpers::ServiceContext service_context;
|
||||
|
||||
@@ -1086,8 +1086,8 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IGeneralService::FindReque
|
||||
FunctionInfo{30, nullptr, "SetEthernetCommunicationEnabledForTest"},
|
||||
FunctionInfo{31, nullptr, "GetTelemetorySystemEventReadableHandle"},
|
||||
FunctionInfo{32, nullptr, "GetTelemetryInfo"},
|
||||
FunctionInfo{33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability"}, // 2.0.0+
|
||||
FunctionInfo{34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled"}, // 4.0.0+
|
||||
FunctionInfo{33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability", MakeVersionGate({2,0,0})},
|
||||
FunctionInfo{34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{35, &IGeneralService::GetScanDataV2, "GetScanData"},
|
||||
FunctionInfo{36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"},
|
||||
FunctionInfo{37, nullptr, "Shutdown"},
|
||||
@@ -1097,13 +1097,13 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IGeneralService::FindReque
|
||||
FunctionInfo{41, nullptr, "GetAcceptableNetworkTypeFlag"},
|
||||
FunctionInfo{42, nullptr, "NotifyConnectionStateChanged"},
|
||||
FunctionInfo{43, nullptr, "SetWowlDelayedWakeTime"},
|
||||
FunctionInfo{44, nullptr, "IsWiredConnectionAvailable"}, // 18.0.0+
|
||||
FunctionInfo{45, nullptr, "IsNetworkEmulationFeatureEnabled"}, // 18.0.0+
|
||||
FunctionInfo{46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug"}, // 18.0.0+
|
||||
FunctionInfo{47, &IGeneralService::GetScanDataV3, "GetScanData"}, // 19.0.0+
|
||||
FunctionInfo{50, nullptr, "IsRewriteFeatureEnabled"}, // 18.0.0+
|
||||
FunctionInfo{51, nullptr, "CreateRewriteRule"}, // 18.0.0+
|
||||
FunctionInfo{52, nullptr, "DestroyRewriteRule"} // 18.0.0+
|
||||
FunctionInfo{44, nullptr, "IsWiredConnectionAvailable", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{45, nullptr, "IsNetworkEmulationFeatureEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{47, &IGeneralService::GetScanDataV3, "GetScanData", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{50, nullptr, "IsRewriteFeatureEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{51, nullptr, "CreateRewriteRule", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{52, nullptr, "DestroyRewriteRule", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -276,8 +276,8 @@ public:
|
||||
FunctionInfo{88, nullptr, "RequestAssignELicenses"},
|
||||
FunctionInfo{89, nullptr, "RequestExtendELicenses"},
|
||||
FunctionInfo{90, nullptr, "RequestSyncELicenses"},
|
||||
FunctionInfo{91, nullptr, "Unknown91"}, //6.0.0-14.1.2
|
||||
FunctionInfo{92, nullptr, "Unknown92"}, //21.0.0+
|
||||
FunctionInfo{91, nullptr, "Unknown91", MakeVersionGate({6,0,0}, {14,1,2})},
|
||||
FunctionInfo{92, nullptr, "Unknown92", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{93, nullptr, "RequestReportActiveELicenses"},
|
||||
FunctionInfo{94, nullptr, "RequestReportActiveELicensesPassively"},
|
||||
FunctionInfo{95, nullptr, "RequestRegisterDynamicRightsNotificationToken"},
|
||||
@@ -330,85 +330,85 @@ public:
|
||||
FunctionInfo{142, nullptr, "RequestCheckSafeSystemVersion"},
|
||||
FunctionInfo{143, nullptr, "RequestApplicationIcon"},
|
||||
FunctionInfo{144, nullptr, "RequestDownloadIdbeIconFile"},
|
||||
FunctionInfo{147, nullptr, "Unknown147"}, //18.0.0+
|
||||
FunctionInfo{148, nullptr, "Unknown148"}, //18.0.0+
|
||||
FunctionInfo{150, nullptr, "Unknown150"}, //19.0.0+
|
||||
FunctionInfo{151, nullptr, "Unknown151"}, //20.0.0+
|
||||
FunctionInfo{152, nullptr, "Unknown152"}, //20.0.0+
|
||||
FunctionInfo{153, nullptr, "Unknown153"}, //20.0.0+
|
||||
FunctionInfo{154, nullptr, "Unknown154"}, //20.0.0+
|
||||
FunctionInfo{155, nullptr, "Unknown155"}, //20.0.0+
|
||||
FunctionInfo{156, nullptr, "Unknown156"}, //20.0.0+
|
||||
FunctionInfo{157, nullptr, "Unknown157"}, //20.0.0+
|
||||
FunctionInfo{158, nullptr, "Unknown158"}, //20.0.0+
|
||||
FunctionInfo{159, nullptr, "Unknown159"}, //20.0.0+
|
||||
FunctionInfo{160, nullptr, "Unknown160"}, //20.0.0+
|
||||
FunctionInfo{161, nullptr, "Unknown161"}, //20.0.0+
|
||||
FunctionInfo{162, nullptr, "Unknown162"}, //20.0.0+
|
||||
FunctionInfo{163, nullptr, "Unknown163"}, //20.0.0+
|
||||
FunctionInfo{164, nullptr, "Unknown164"}, //20.0.0+
|
||||
FunctionInfo{165, nullptr, "Unknown165"}, //20.0.0+
|
||||
FunctionInfo{166, nullptr, "Unknown166"}, //20.0.0+
|
||||
FunctionInfo{167, nullptr, "Unknown167"}, //20.0.0+
|
||||
FunctionInfo{168, nullptr, "Unknown168"}, //20.0.0+
|
||||
FunctionInfo{169, nullptr, "Unknown169"}, //20.0.0+
|
||||
FunctionInfo{170, nullptr, "Unknown170"}, //20.0.0+
|
||||
FunctionInfo{171, nullptr, "Unknown171"}, //20.0.0+
|
||||
FunctionInfo{172, nullptr, "Unknown172"}, //20.0.0+
|
||||
FunctionInfo{173, nullptr, "Unknown173"}, //20.0.0+
|
||||
FunctionInfo{174, nullptr, "Unknown174"}, //20.0.0+
|
||||
FunctionInfo{175, nullptr, "Unknown175"}, //20.0.0+
|
||||
FunctionInfo{176, nullptr, "Unknown176"}, //20.0.0+
|
||||
FunctionInfo{177, nullptr, "Unknown177"}, //20.0.0+
|
||||
FunctionInfo{2000, nullptr, "Unknown2000"}, //20.0.0+
|
||||
FunctionInfo{2001, nullptr, "Unknown2001"}, //20.0.0+
|
||||
FunctionInfo{2002, nullptr, "Unknown2002"}, //20.0.0+
|
||||
FunctionInfo{2003, nullptr, "Unknown2003"}, //20.0.0+
|
||||
FunctionInfo{2004, nullptr, "Unknown2004"}, //20.0.0+
|
||||
FunctionInfo{2007, nullptr, "Unknown2007"}, //20.0.0+
|
||||
FunctionInfo{2011, nullptr, "Unknown2011"}, //20.0.0+
|
||||
FunctionInfo{2012, nullptr, "Unknown2012"}, //20.0.0+
|
||||
FunctionInfo{2013, nullptr, "Unknown2013"}, //20.0.0+
|
||||
FunctionInfo{2014, nullptr, "Unknown2014"}, //20.0.0+
|
||||
FunctionInfo{2015, nullptr, "Unknown2015"}, //20.0.0+
|
||||
FunctionInfo{2016, nullptr, "Unknown2016"}, //20.0.0+
|
||||
FunctionInfo{2017, nullptr, "Unknown2017"}, //20.0.0+
|
||||
FunctionInfo{2018, nullptr, "Unknown2018"}, //20.0.0+
|
||||
FunctionInfo{2019, nullptr, "Unknown2019"}, //20.0.0+
|
||||
FunctionInfo{2020, nullptr, "Unknown2020"}, //20.0.0+
|
||||
FunctionInfo{2021, nullptr, "Unknown2021"}, //20.0.0+
|
||||
FunctionInfo{2022, nullptr, "Unknown2022"}, //20.0.0+
|
||||
FunctionInfo{2023, nullptr, "Unknown2023"}, //20.0.0+
|
||||
FunctionInfo{2024, nullptr, "Unknown2024"}, //20.0.0+
|
||||
FunctionInfo{2025, nullptr, "Unknown2025"}, //20.0.0+
|
||||
FunctionInfo{2026, nullptr, "Unknown2026"}, //20.0.0+
|
||||
FunctionInfo{2027, nullptr, "Unknown2027"}, //20.0.0+
|
||||
FunctionInfo{2028, nullptr, "Unknown2028"}, //20.0.0+
|
||||
FunctionInfo{2029, nullptr, "Unknown2029"}, //20.0.0+
|
||||
FunctionInfo{2030, nullptr, "Unknown2030"}, //20.0.0+
|
||||
FunctionInfo{2031, nullptr, "Unknown2031"}, //20.0.0+
|
||||
FunctionInfo{2032, nullptr, "Unknown2032"}, //20.0.0+
|
||||
FunctionInfo{2033, nullptr, "Unknown2033"}, //20.0.0+
|
||||
FunctionInfo{2034, nullptr, "Unknown2034"}, //20.0.0+
|
||||
FunctionInfo{2035, nullptr, "Unknown2035"}, //20.0.0+
|
||||
FunctionInfo{2036, nullptr, "Unknown2036"}, //20.0.0+
|
||||
FunctionInfo{2037, nullptr, "Unknown2037"}, //20.0.0+
|
||||
FunctionInfo{2038, nullptr, "Unknown2038"}, //20.0.0+
|
||||
FunctionInfo{2039, nullptr, "Unknown2039"}, //20.0.0+
|
||||
FunctionInfo{2040, nullptr, "Unknown2040"}, //20.0.0+
|
||||
FunctionInfo{2041, nullptr, "Unknown2041"}, //20.0.0+
|
||||
FunctionInfo{2042, nullptr, "Unknown2042"}, //20.0.0+
|
||||
FunctionInfo{2043, nullptr, "Unknown2043"}, //20.0.0+
|
||||
FunctionInfo{2044, nullptr, "Unknown2044"}, //20.0.0+
|
||||
FunctionInfo{2045, nullptr, "Unknown2045"}, //20.0.0+
|
||||
FunctionInfo{2046, nullptr, "Unknown2046"}, //20.0.0+
|
||||
FunctionInfo{2047, nullptr, "Unknown2047"}, //20.0.0+
|
||||
FunctionInfo{2048, nullptr, "Unknown2048"}, //20.0.0+
|
||||
FunctionInfo{2049, nullptr, "Unknown2049"}, //20.0.0+
|
||||
FunctionInfo{2050, nullptr, "Unknown2050"}, //20.0.0+
|
||||
FunctionInfo{2051, nullptr, "Unknown2051"}, //20.0.0+
|
||||
FunctionInfo{3000, nullptr, "RequestLatestApplicationIcon"}, //17.0.0+
|
||||
FunctionInfo{3001, nullptr, "RequestDownloadIdbeLatestIconFile"} //17.0.0+
|
||||
FunctionInfo{147, nullptr, "Unknown147", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{148, nullptr, "Unknown148", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{150, nullptr, "Unknown150", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{151, nullptr, "Unknown151", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{152, nullptr, "Unknown152", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{153, nullptr, "Unknown153", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{154, nullptr, "Unknown154", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{155, nullptr, "Unknown155", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{156, nullptr, "Unknown156", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{157, nullptr, "Unknown157", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{158, nullptr, "Unknown158", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{159, nullptr, "Unknown159", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{160, nullptr, "Unknown160", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{161, nullptr, "Unknown161", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{162, nullptr, "Unknown162", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{163, nullptr, "Unknown163", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{164, nullptr, "Unknown164", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{165, nullptr, "Unknown165", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{166, nullptr, "Unknown166", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{167, nullptr, "Unknown167", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{168, nullptr, "Unknown168", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{169, nullptr, "Unknown169", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{170, nullptr, "Unknown170", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{171, nullptr, "Unknown171", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{172, nullptr, "Unknown172", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{173, nullptr, "Unknown173", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{174, nullptr, "Unknown174", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{175, nullptr, "Unknown175", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{176, nullptr, "Unknown176", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{177, nullptr, "Unknown177", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2000, nullptr, "Unknown2000", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2002, nullptr, "Unknown2002", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2003, nullptr, "Unknown2003", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2004, nullptr, "Unknown2004", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2007, nullptr, "Unknown2007", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2011, nullptr, "Unknown2011", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2012, nullptr, "Unknown2012", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2013, nullptr, "Unknown2013", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2014, nullptr, "Unknown2014", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2015, nullptr, "Unknown2015", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2016, nullptr, "Unknown2016", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2017, nullptr, "Unknown2017", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2018, nullptr, "Unknown2018", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2020, nullptr, "Unknown2020", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2021, nullptr, "Unknown2021", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2022, nullptr, "Unknown2022", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2023, nullptr, "Unknown2023", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2024, nullptr, "Unknown2024", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2025, nullptr, "Unknown2025", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2026, nullptr, "Unknown2026", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2027, nullptr, "Unknown2027", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2028, nullptr, "Unknown2028", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2029, nullptr, "Unknown2029", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2030, nullptr, "Unknown2030", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2031, nullptr, "Unknown2031", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2032, nullptr, "Unknown2032", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2033, nullptr, "Unknown2033", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2034, nullptr, "Unknown2034", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2035, nullptr, "Unknown2035", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2036, nullptr, "Unknown2036", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2037, nullptr, "Unknown2037", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2038, nullptr, "Unknown2038", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2039, nullptr, "Unknown2039", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2040, nullptr, "Unknown2040", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2041, nullptr, "Unknown2041", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2042, nullptr, "Unknown2042", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2043, nullptr, "Unknown2043", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2044, nullptr, "Unknown2044", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2045, nullptr, "Unknown2045", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2046, nullptr, "Unknown2046", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2047, nullptr, "Unknown2047", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2048, nullptr, "Unknown2048", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2049, nullptr, "Unknown2049", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2050, nullptr, "Unknown2050", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2051, nullptr, "Unknown2051", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{3000, nullptr, "RequestLatestApplicationIcon", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{3001, nullptr, "RequestDownloadIdbeLatestIconFile", MakeVersionGate({17,0,0})}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
@@ -457,7 +457,7 @@ private:
|
||||
FunctionInfo{2, nullptr, "ClearDebugResponse"},
|
||||
FunctionInfo{3, nullptr, "RegisterDebugResponse"},
|
||||
FunctionInfo{4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"},
|
||||
FunctionInfo{5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2"} // 17.0.0+
|
||||
FunctionInfo{5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2", MakeVersionGate({17,0,0})}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -83,9 +83,9 @@ private:
|
||||
FunctionInfo{11, nullptr, "SubscribeTopic"},
|
||||
FunctionInfo{12, nullptr, "UnsubscribeTopic"},
|
||||
FunctionInfo{13, nullptr, "QueryIsTopicExist"},
|
||||
FunctionInfo{14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+
|
||||
FunctionInfo{15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+
|
||||
FunctionInfo{16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+
|
||||
FunctionInfo{14, nullptr, "SubscribeTopicByAccount", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{15, nullptr, "UnsubscribeTopicByAccount", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{16, nullptr, "DownloadSubscriptionList", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{21, nullptr, "CreateToken"},
|
||||
FunctionInfo{22, nullptr, "CreateTokenWithApplicationId"},
|
||||
FunctionInfo{23, nullptr, "DestroyToken"},
|
||||
@@ -93,29 +93,29 @@ private:
|
||||
FunctionInfo{25, nullptr, "QueryIsTokenValid"},
|
||||
FunctionInfo{26, nullptr, "ListenToMyApplicationId"},
|
||||
FunctionInfo{27, nullptr, "DestroyTokenAll"},
|
||||
FunctionInfo{28, nullptr, "CreateTokenWithName"}, // 18.0.0+
|
||||
FunctionInfo{29, nullptr, "DestroyTokenWithName"}, // 18.0.0+
|
||||
FunctionInfo{28, nullptr, "CreateTokenWithName", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{29, nullptr, "DestroyTokenWithName", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{31, nullptr, "UploadTokenToBaaS"},
|
||||
FunctionInfo{32, nullptr, "DestroyTokenForBaaS"},
|
||||
FunctionInfo{33, nullptr, "CreateTokenForBaaS"},
|
||||
FunctionInfo{34, nullptr, "SetBaaSDeviceAccountIdList"},
|
||||
FunctionInfo{35, nullptr, "LinkNsaId"}, // 17.0.0+
|
||||
FunctionInfo{36, nullptr, "UnlinkNsaId"}, // 17.0.0+
|
||||
FunctionInfo{37, nullptr, "RelinkNsaId"}, // 18.0.0+
|
||||
FunctionInfo{40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+
|
||||
FunctionInfo{41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+
|
||||
FunctionInfo{42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+
|
||||
FunctionInfo{43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+
|
||||
FunctionInfo{44, nullptr, "SetUidList"}, // 17.0.0+
|
||||
FunctionInfo{45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+
|
||||
FunctionInfo{51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+
|
||||
FunctionInfo{35, nullptr, "LinkNsaId", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{36, nullptr, "UnlinkNsaId", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{37, nullptr, "RelinkNsaId", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{42, nullptr, "SetNetworkServiceAccountIdTokenSuccess", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{43, nullptr, "SetNetworkServiceAccountIdTokenFailure", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{44, nullptr, "SetUidList", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{45, nullptr, "PutDigitalTwinKeyValue", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{51, nullptr, "DeleteDigitalTwinKeyValue", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{101, nullptr, "Suspend"},
|
||||
FunctionInfo{102, nullptr, "Resume"},
|
||||
FunctionInfo{103, C<&INpnsSystem::GetState>, "GetState"},
|
||||
FunctionInfo{104, nullptr, "GetStatistics"},
|
||||
FunctionInfo{105, nullptr, "GetPlayReportRequestEvent"},
|
||||
FunctionInfo{106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime"}, // 18.0.0+
|
||||
FunctionInfo{107, nullptr, "SetLastNotifiedTime"}, // 18.0.0+
|
||||
FunctionInfo{106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{107, nullptr, "SetLastNotifiedTime", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{111, nullptr, "GetJid"},
|
||||
FunctionInfo{112, nullptr, "CreateJid"},
|
||||
FunctionInfo{113, nullptr, "DestroyJid"},
|
||||
@@ -127,17 +127,17 @@ private:
|
||||
FunctionInfo{153, nullptr, "GetDropEventWithHandover"},
|
||||
FunctionInfo{154, nullptr, "CreateTokenAsync"},
|
||||
FunctionInfo{155, nullptr, "CreateTokenAsyncWithApplicationId"},
|
||||
FunctionInfo{156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+
|
||||
FunctionInfo{161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent"}, // 10.0.0+
|
||||
FunctionInfo{156, nullptr, "CreateTokenWithNameAsync", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent", MakeVersionGate({10,0,0})},
|
||||
FunctionInfo{162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"},
|
||||
FunctionInfo{201, nullptr, "RequestChangeStateForceTimed"},
|
||||
FunctionInfo{202, nullptr, "RequestChangeStateForceAsync"},
|
||||
FunctionInfo{301, nullptr, "GetPassword"}, // 18.0.0+
|
||||
FunctionInfo{302, nullptr, "GetAllImmigration"}, // 18.0.0+
|
||||
FunctionInfo{303, nullptr, "GetNotificationHistories"}, // 18.0.0+
|
||||
FunctionInfo{304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+
|
||||
FunctionInfo{305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+
|
||||
FunctionInfo{306, nullptr, "GetDigitalTwinValue"} // 18.0.0+
|
||||
FunctionInfo{301, nullptr, "GetPassword", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{302, nullptr, "GetAllImmigration", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{303, nullptr, "GetNotificationHistories", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{304, nullptr, "GetPersistentConnectionSummary", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{305, nullptr, "GetDigitalTwinSummary", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{306, nullptr, "GetDigitalTwinValue", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
KernelHelpers::ServiceContext service_context;
|
||||
Event get_receive_event;
|
||||
@@ -177,7 +177,7 @@ private:
|
||||
FunctionInfo{4, nullptr, "ReceiveRaw"},
|
||||
FunctionInfo{5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"},
|
||||
FunctionInfo{7, nullptr, "GetStateChangeEvent"},
|
||||
FunctionInfo{8, C<&INpnsUser::ListenToByName>, "ListenToByName"}, // 18.0.0+
|
||||
FunctionInfo{8, C<&INpnsUser::ListenToByName>, "ListenToByName", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{21, nullptr, "CreateToken"},
|
||||
FunctionInfo{23, nullptr, "DestroyToken"},
|
||||
FunctionInfo{25, nullptr, "QueryIsTokenValid"},
|
||||
|
||||
@@ -133,26 +133,26 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{406, nullptr, "GetApplicationControlProperty"},
|
||||
FunctionInfo{407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"},
|
||||
FunctionInfo{408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"},
|
||||
FunctionInfo{411, nullptr, "Unknown411"}, //19.0.0+
|
||||
FunctionInfo{412, nullptr, "Unknown412"}, //19.0.0+
|
||||
FunctionInfo{413, nullptr, "Unknown413"}, //19.0.0+
|
||||
FunctionInfo{414, nullptr, "Unknown414"}, //19.0.0+
|
||||
FunctionInfo{415, nullptr, "Unknown415"}, //19.0.0+
|
||||
FunctionInfo{416, nullptr, "Unknown416"}, //19.0.0+
|
||||
FunctionInfo{417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage"}, //19.0.0+
|
||||
FunctionInfo{418, nullptr, "InvalidateApplicationControlCacheOfTheStage"}, //19.0.0+
|
||||
FunctionInfo{411, nullptr, "Unknown411", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{412, nullptr, "Unknown412", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{413, nullptr, "Unknown413", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{414, nullptr, "Unknown414", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{415, nullptr, "Unknown415", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{416, nullptr, "Unknown416", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{418, nullptr, "InvalidateApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"},
|
||||
FunctionInfo{420, nullptr, "CloneApplicationControlDataCacheForDebug"},
|
||||
FunctionInfo{421, nullptr, "Unknown421"}, //20.0.0+
|
||||
FunctionInfo{422, nullptr, "Unknown422"}, //20.0.0+
|
||||
FunctionInfo{423, nullptr, "Unknown423"}, //20.0.0+
|
||||
FunctionInfo{424, nullptr, "Unknown424"}, //20.0.0+
|
||||
FunctionInfo{425, nullptr, "Unknown425"}, //20.0.0+
|
||||
FunctionInfo{426, nullptr, "Unknown426"}, //20.0.0+
|
||||
FunctionInfo{427, nullptr, "Unknown427"}, //20.0.0+
|
||||
FunctionInfo{428, nullptr, "Unknown428"}, //21.0.0+
|
||||
FunctionInfo{429, nullptr, "Unknown429"}, //21.0.0+
|
||||
FunctionInfo{430, nullptr, "Unknown430"}, //21.0.0+
|
||||
FunctionInfo{421, nullptr, "Unknown421", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{422, nullptr, "Unknown422", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{423, nullptr, "Unknown423", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{424, nullptr, "Unknown424", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{425, nullptr, "Unknown425", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{426, nullptr, "Unknown426", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{427, nullptr, "Unknown427", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{428, nullptr, "Unknown428", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{429, nullptr, "Unknown429", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{430, nullptr, "Unknown430", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{502, nullptr, "RequestCheckGameCardRegistration"},
|
||||
FunctionInfo{503, nullptr, "RequestGameCardRegistrationGoldPoint"},
|
||||
FunctionInfo{504, nullptr, "RequestRegisterGameCard"},
|
||||
@@ -164,13 +164,13 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{510, nullptr, "GetGameCardPlatformRegion"},
|
||||
FunctionInfo{511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"},
|
||||
FunctionInfo{512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"},
|
||||
FunctionInfo{513, nullptr, "Unknown513"}, //20.0.0+
|
||||
FunctionInfo{514, nullptr, "Unknown514"}, //20.0.0+
|
||||
FunctionInfo{515, nullptr, "Unknown515"}, //20.0.0+
|
||||
FunctionInfo{516, nullptr, "Unknown516"}, //21.0.0+
|
||||
FunctionInfo{517, nullptr, "Unknown517"}, //21.0.0+
|
||||
FunctionInfo{518, nullptr, "Unknown518"}, //21.0.0+
|
||||
FunctionInfo{519, nullptr, "Unknown519"}, //21.0.0+
|
||||
FunctionInfo{513, nullptr, "Unknown513", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{514, nullptr, "Unknown514", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{515, nullptr, "Unknown515", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{516, nullptr, "Unknown516", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{517, nullptr, "Unknown517", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{518, nullptr, "Unknown518", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{519, nullptr, "Unknown519", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{600, nullptr, "CountApplicationContentMeta"},
|
||||
FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"},
|
||||
FunctionInfo{602, nullptr, "ListAvailableAddOnContent"},
|
||||
@@ -208,22 +208,22 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{914, nullptr, "HideApplicationRecord"},
|
||||
FunctionInfo{915, nullptr, "ShowApplicationRecord"},
|
||||
FunctionInfo{916, nullptr, "IsApplicationAutoDeleteDisabled"},
|
||||
FunctionInfo{916, nullptr, "Unknown916"}, //20.0.0+
|
||||
FunctionInfo{917, nullptr, "Unknown917"}, //20.0.0+
|
||||
FunctionInfo{918, nullptr, "Unknown918"}, //20.0.0+
|
||||
FunctionInfo{919, nullptr, "Unknown919"}, //20.0.0+
|
||||
FunctionInfo{920, nullptr, "Unknown920"}, //20.0.0+
|
||||
FunctionInfo{921, nullptr, "Unknown921"}, //20.0.0+
|
||||
FunctionInfo{922, nullptr, "Unknown922"}, //20.0.0+
|
||||
FunctionInfo{923, nullptr, "Unknown923"}, //20.0.0+
|
||||
FunctionInfo{928, nullptr, "Unknown928"}, //20.0.0+
|
||||
FunctionInfo{929, nullptr, "Unknown929"}, //20.0.0+
|
||||
FunctionInfo{930, nullptr, "Unknown930"}, //20.0.0+
|
||||
FunctionInfo{931, nullptr, "Unknown931"}, //20.0.0+
|
||||
FunctionInfo{933, nullptr, "Unknown933"}, //20.0.0+
|
||||
FunctionInfo{934, nullptr, "Unknown934"}, //21.0.0+
|
||||
FunctionInfo{935, nullptr, "Unknown935"}, //21.0.0+
|
||||
FunctionInfo{936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936"}, //21.0.0+
|
||||
FunctionInfo{916, nullptr, "Unknown916", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{917, nullptr, "Unknown917", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{918, nullptr, "Unknown918", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{919, nullptr, "Unknown919", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{920, nullptr, "Unknown920", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{921, nullptr, "Unknown921", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{922, nullptr, "Unknown922", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{923, nullptr, "Unknown923", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{928, nullptr, "Unknown928", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{929, nullptr, "Unknown929", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{930, nullptr, "Unknown930", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{931, nullptr, "Unknown931", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{933, nullptr, "Unknown933", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{934, nullptr, "Unknown934", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{935, nullptr, "Unknown935", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1000, nullptr, "RequestVerifyApplicationDeprecated"},
|
||||
FunctionInfo{1001, nullptr, "CorruptApplicationForDebug"},
|
||||
FunctionInfo{1002, nullptr, "RequestVerifyAddOnContentsRights"},
|
||||
@@ -252,11 +252,11 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{1504, nullptr, "InsertSdCard"},
|
||||
FunctionInfo{1505, nullptr, "RemoveSdCard"},
|
||||
FunctionInfo{1506, nullptr, "GetSdCardStartupStatus"},
|
||||
FunctionInfo{1508, nullptr, "Unknown1508"}, //20.0.0+
|
||||
FunctionInfo{1509, nullptr, "Unknown1509"}, //20.0.0+
|
||||
FunctionInfo{1510, nullptr, "Unknown1510"}, //20.0.0+
|
||||
FunctionInfo{1511, nullptr, "Unknown1511"}, //20.0.0+
|
||||
FunctionInfo{1512, nullptr, "Unknown1512"}, //20.0.0+
|
||||
FunctionInfo{1508, nullptr, "Unknown1508", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1509, nullptr, "Unknown1509", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1510, nullptr, "Unknown1510", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1511, nullptr, "Unknown1511", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1512, nullptr, "Unknown1512", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
|
||||
FunctionInfo{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
|
||||
FunctionInfo{1700, nullptr, "ListApplicationDownloadingContentMeta"},
|
||||
@@ -293,11 +293,11 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{2016, nullptr, "ListNotCommittedContentMeta"},
|
||||
FunctionInfo{2017, nullptr, "CreateDownloadTask"},
|
||||
FunctionInfo{2018, nullptr, "GetApplicationDeliveryInfoHash"},
|
||||
FunctionInfo{2019, nullptr, "Unknown2019"}, //20.0.0+
|
||||
FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"},
|
||||
FunctionInfo{2051, nullptr, "InvalidateRightsIdCache"},
|
||||
FunctionInfo{2052, nullptr, "Unknown2052"}, //20.0.0+
|
||||
FunctionInfo{2053, nullptr, "Unknown2053"}, //20.0.0+
|
||||
FunctionInfo{2052, nullptr, "Unknown2052", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2053, nullptr, "Unknown2053", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"},
|
||||
FunctionInfo{2101, nullptr, "GetRawApplicationTerminateResult"},
|
||||
FunctionInfo{2150, nullptr, "CreateRightsEnvironment"},
|
||||
@@ -314,7 +314,7 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
|
||||
FunctionInfo{2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
|
||||
FunctionInfo{2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
|
||||
FunctionInfo{2183, nullptr, "Unknown2183"}, //20.1.0+
|
||||
FunctionInfo{2183, nullptr, "Unknown2183", MakeVersionGate({20,1,0})},
|
||||
FunctionInfo{2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
|
||||
FunctionInfo{2199, nullptr, "GetRightsEnvironmentCountForDebug"},
|
||||
FunctionInfo{2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
|
||||
@@ -331,16 +331,16 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{2357, nullptr, "EnableMultiCoreDownload"},
|
||||
FunctionInfo{2358, nullptr, "DisableMultiCoreDownload"},
|
||||
FunctionInfo{2359, nullptr, "IsMultiCoreDownloadEnabled"},
|
||||
FunctionInfo{2360, nullptr, "GetApplicationDownloadTaskCount"}, //19.0.0+
|
||||
FunctionInfo{2361, nullptr, "GetMaxApplicationDownloadTaskCount"}, //19.0.0+
|
||||
FunctionInfo{2362, nullptr, "Unknown2362"}, //20.0.0+
|
||||
FunctionInfo{2363, nullptr, "Unknown2363"}, //20.0.0+
|
||||
FunctionInfo{2364, nullptr, "Unknown2364"}, //20.0.0+
|
||||
FunctionInfo{2365, nullptr, "Unknown2365"}, //20.0.0+
|
||||
FunctionInfo{2366, nullptr, "Unknown2366"}, //20.0.0+
|
||||
FunctionInfo{2367, nullptr, "Unknown2367"}, //20.0.0+
|
||||
FunctionInfo{2368, nullptr, "Unknown2368"}, //20.0.0+
|
||||
FunctionInfo{2369, nullptr, "Unknown2369"}, //21.0.0+
|
||||
FunctionInfo{2360, nullptr, "GetApplicationDownloadTaskCount", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{2361, nullptr, "GetMaxApplicationDownloadTaskCount", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{2362, nullptr, "Unknown2362", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2363, nullptr, "Unknown2363", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2364, nullptr, "Unknown2364", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2365, nullptr, "Unknown2365", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2366, nullptr, "Unknown2366", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2367, nullptr, "Unknown2367", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2368, nullptr, "Unknown2368", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2369, nullptr, "Unknown2369", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{2400, nullptr, "GetPromotionInfo"},
|
||||
FunctionInfo{2401, nullptr, "CountPromotionInfo"},
|
||||
FunctionInfo{2402, nullptr, "ListPromotionInfo"},
|
||||
@@ -359,9 +359,9 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"},
|
||||
FunctionInfo{2521, nullptr, "GetRightsUserChangedEvent"},
|
||||
FunctionInfo{2522, nullptr, "IsRomRedirectionAvailable"},
|
||||
FunctionInfo{2523, nullptr, "GetProgramId"}, //17.0.0+
|
||||
FunctionInfo{2524, nullptr, "Unknown2524"}, //19.0.0+
|
||||
FunctionInfo{2525, nullptr, "Unknown2525"}, //20.0.0+
|
||||
FunctionInfo{2523, nullptr, "GetProgramId", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{2524, nullptr, "Unknown2524", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{2525, nullptr, "Unknown2525", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2800, nullptr, "GetApplicationIdOfPreomia"},
|
||||
FunctionInfo{3000, nullptr, "RegisterDeviceLockKey"},
|
||||
FunctionInfo{3001, nullptr, "UnregisterDeviceLockKey"},
|
||||
@@ -379,100 +379,100 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterfa
|
||||
FunctionInfo{3013, nullptr, "IsGameCardEnabled"},
|
||||
FunctionInfo{3014, nullptr, "IsLocalContentShareEnabled"},
|
||||
FunctionInfo{3050, nullptr, "ListAssignELicenseTaskResult"},
|
||||
FunctionInfo{3104, nullptr, "GetApplicationNintendoLogo"}, //18.0.0+
|
||||
FunctionInfo{3105, nullptr, "GetApplicationStartupMovie"}, //18.0.0+
|
||||
FunctionInfo{4000, nullptr, "Unknown4000"}, //20.0.0+
|
||||
FunctionInfo{4004, nullptr, "Unknown4004"}, //20.0.0+
|
||||
FunctionInfo{4006, nullptr, "Unknown4006"}, //20.0.0+
|
||||
FunctionInfo{4007, nullptr, "Unknown4007"}, //20.0.0+
|
||||
FunctionInfo{4008, nullptr, "Unknown4008"}, //20.0.0+
|
||||
FunctionInfo{4009, nullptr, "Unknown4009"}, //20.0.0+
|
||||
FunctionInfo{4010, nullptr, "Unknown4010"}, //20.0.0+
|
||||
FunctionInfo{4011, nullptr, "Unknown4011"}, //20.0.0+
|
||||
FunctionInfo{4012, nullptr, "Unknown4012"}, //20.0.0+
|
||||
FunctionInfo{4013, nullptr, "Unknown4013"}, //20.0.0+
|
||||
FunctionInfo{4015, nullptr, "Unknown4015"}, //20.0.0+
|
||||
FunctionInfo{4017, nullptr, "Unknown4017"}, //20.0.0+
|
||||
FunctionInfo{4019, nullptr, "Unknown4019"}, //20.0.0+
|
||||
FunctionInfo{4020, nullptr, "Unknown4020"}, //20.0.0+
|
||||
FunctionInfo{4021, nullptr, "Unknown4021"}, //20.0.0+
|
||||
FunctionInfo{4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022"}, //20.0.0+
|
||||
FunctionInfo{4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023"}, //20.0.0+
|
||||
FunctionInfo{4024, nullptr, "Unknown4024"}, //20.0.0+
|
||||
FunctionInfo{4025, nullptr, "Unknown4025"}, //20.0.0+
|
||||
FunctionInfo{4026, nullptr, "Unknown4026"}, //20.0.0+
|
||||
FunctionInfo{4027, nullptr, "Unknown4027"}, //20.0.0+
|
||||
FunctionInfo{4028, nullptr, "Unknown4028"}, //20.0.0+
|
||||
FunctionInfo{4029, nullptr, "Unknown4029"}, //20.0.0+
|
||||
FunctionInfo{4030, nullptr, "Unknown4030"}, //20.0.0+
|
||||
FunctionInfo{4031, nullptr, "Unknown4031"}, //20.0.0+
|
||||
FunctionInfo{4032, nullptr, "Unknown4032"}, //20.0.0+
|
||||
FunctionInfo{4033, nullptr, "Unknown4033"}, //20.0.0+
|
||||
FunctionInfo{4034, nullptr, "Unknown4034"}, //20.0.0+
|
||||
FunctionInfo{4035, nullptr, "Unknown4035"}, //20.0.0+
|
||||
FunctionInfo{4037, nullptr, "Unknown4037"}, //20.0.0+
|
||||
FunctionInfo{4038, nullptr, "Unknown4038"}, //20.0.0+
|
||||
FunctionInfo{4039, nullptr, "Unknown4039"}, //20.0.0+
|
||||
FunctionInfo{4040, nullptr, "Unknown4040"}, //20.0.0+
|
||||
FunctionInfo{4041, nullptr, "Unknown4041"}, //20.0.0+
|
||||
FunctionInfo{4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042"}, //20.0.0+
|
||||
FunctionInfo{4043, nullptr, "Unknown4043"}, //20.0.0+
|
||||
FunctionInfo{4044, nullptr, "Unknown4044"}, //20.0.0+
|
||||
FunctionInfo{4045, nullptr, "Unknown4045"}, //20.0.0+
|
||||
FunctionInfo{4046, nullptr, "Unknown4046"}, //20.0.0+
|
||||
FunctionInfo{4049, nullptr, "Unknown4049"}, //20.0.0+
|
||||
FunctionInfo{4050, nullptr, "Unknown4050"}, //20.0.0+
|
||||
FunctionInfo{4051, nullptr, "Unknown4051"}, //20.0.0+
|
||||
FunctionInfo{4052, nullptr, "Unknown4052"}, //20.0.0+
|
||||
FunctionInfo{4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053"}, //20.0.0+
|
||||
FunctionInfo{4054, nullptr, "Unknown4054"}, //20.0.0+
|
||||
FunctionInfo{4055, nullptr, "Unknown4055"}, //20.0.0+
|
||||
FunctionInfo{4056, nullptr, "Unknown4056"}, //20.0.0+
|
||||
FunctionInfo{4057, nullptr, "Unknown4057"}, //20.0.0+
|
||||
FunctionInfo{4058, nullptr, "Unknown4058"}, //20.0.0+
|
||||
FunctionInfo{4059, nullptr, "Unknown4059"}, //20.0.0+
|
||||
FunctionInfo{4060, nullptr, "Unknown4060"}, //20.0.0+
|
||||
FunctionInfo{4061, nullptr, "Unknown4061"}, //20.0.0+
|
||||
FunctionInfo{4062, nullptr, "Unknown4062"}, //20.0.0+
|
||||
FunctionInfo{4063, nullptr, "Unknown4063"}, //20.0.0+
|
||||
FunctionInfo{4064, nullptr, "Unknown4064"}, //20.0.0+
|
||||
FunctionInfo{4065, nullptr, "Unknown4065"}, //20.0.0+
|
||||
FunctionInfo{4066, nullptr, "Unknown4066"}, //20.0.0+
|
||||
FunctionInfo{4067, nullptr, "Unknown4067"}, //20.0.0+
|
||||
FunctionInfo{4068, nullptr, "Unknown4068"}, //20.0.0+
|
||||
FunctionInfo{4069, nullptr, "Unknown4069"}, //20.0.0+
|
||||
FunctionInfo{4070, nullptr, "Unknown4070"}, //20.0.0+
|
||||
FunctionInfo{4071, nullptr, "Unknown4071"}, //20.0.0+
|
||||
FunctionInfo{4072, nullptr, "Unknown4072"}, //20.0.0+
|
||||
FunctionInfo{4073, nullptr, "Unknown4073"}, //20.0.0+
|
||||
FunctionInfo{4074, nullptr, "Unknown4074"}, //20.0.0+
|
||||
FunctionInfo{4075, nullptr, "Unknown4075"}, //20.0.0+
|
||||
FunctionInfo{4076, nullptr, "Unknown4076"}, //20.0.0+
|
||||
FunctionInfo{4077, nullptr, "Unknown4077"}, //20.0.0+
|
||||
FunctionInfo{4078, nullptr, "Unknown4078"}, //20.0.0+
|
||||
FunctionInfo{4079, nullptr, "Unknown4079"}, //20.0.0+
|
||||
FunctionInfo{4080, nullptr, "Unknown4080"}, //20.0.0+
|
||||
FunctionInfo{4081, nullptr, "Unknown4081"}, //20.0.0+
|
||||
FunctionInfo{4083, nullptr, "Unknown4083"}, //20.0.0+
|
||||
FunctionInfo{4084, nullptr, "Unknown4084"}, //20.0.0+
|
||||
FunctionInfo{4085, nullptr, "Unknown4085"}, //20.0.0+
|
||||
FunctionInfo{4086, nullptr, "Unknown4086"}, //20.0.0+
|
||||
FunctionInfo{4087, nullptr, "Unknown4087"}, //20.0.0+
|
||||
FunctionInfo{4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088"}, //20.0.0+
|
||||
FunctionInfo{4089, nullptr, "Unknown4089"}, //20.0.0+
|
||||
FunctionInfo{4090, nullptr, "Unknown4090"}, //20.0.0+
|
||||
FunctionInfo{4091, nullptr, "Unknown4091"}, //20.0.0+
|
||||
FunctionInfo{4092, nullptr, "Unknown4092"}, //20.0.0+
|
||||
FunctionInfo{4093, nullptr, "Unknown4093"}, //20.0.0+
|
||||
FunctionInfo{4094, nullptr, "Unknown4094"}, //20.0.0+
|
||||
FunctionInfo{4095, nullptr, "Unknown4095"}, //20.0.0+
|
||||
FunctionInfo{4096, nullptr, "Unknown4096"}, //20.0.0+
|
||||
FunctionInfo{4097, nullptr, "Unknown4097"}, //20.0.0+
|
||||
FunctionInfo{4099, nullptr, "Unknown4099"}, //21.0.0+
|
||||
FunctionInfo{4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105"}, //23.0.0+
|
||||
FunctionInfo{5000, nullptr, "Unknown5000"}, //18.0.0+
|
||||
FunctionInfo{5001, nullptr, "Unknown5001"}, //18.0.0+
|
||||
FunctionInfo{9999, nullptr, "GetApplicationCertificate"} //10.0.0-10.2.0
|
||||
FunctionInfo{3104, nullptr, "GetApplicationNintendoLogo", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{3105, nullptr, "GetApplicationStartupMovie", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{4000, nullptr, "Unknown4000", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4004, nullptr, "Unknown4004", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4006, nullptr, "Unknown4006", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4007, nullptr, "Unknown4007", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4008, nullptr, "Unknown4008", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4009, nullptr, "Unknown4009", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4010, nullptr, "Unknown4010", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4011, nullptr, "Unknown4011", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4012, nullptr, "Unknown4012", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4013, nullptr, "Unknown4013", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4015, nullptr, "Unknown4015", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4017, nullptr, "Unknown4017", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4019, nullptr, "Unknown4019", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4020, nullptr, "Unknown4020", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4021, nullptr, "Unknown4021", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4024, nullptr, "Unknown4024", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4025, nullptr, "Unknown4025", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4026, nullptr, "Unknown4026", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4027, nullptr, "Unknown4027", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4028, nullptr, "Unknown4028", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4029, nullptr, "Unknown4029", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4030, nullptr, "Unknown4030", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4031, nullptr, "Unknown4031", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4032, nullptr, "Unknown4032", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4033, nullptr, "Unknown4033", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4034, nullptr, "Unknown4034", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4035, nullptr, "Unknown4035", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4037, nullptr, "Unknown4037", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4038, nullptr, "Unknown4038", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4039, nullptr, "Unknown4039", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4040, nullptr, "Unknown4040", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4041, nullptr, "Unknown4041", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4043, nullptr, "Unknown4043", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4044, nullptr, "Unknown4044", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4045, nullptr, "Unknown4045", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4046, nullptr, "Unknown4046", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4049, nullptr, "Unknown4049", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4050, nullptr, "Unknown4050", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4051, nullptr, "Unknown4051", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4052, nullptr, "Unknown4052", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4054, nullptr, "Unknown4054", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4055, nullptr, "Unknown4055", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4056, nullptr, "Unknown4056", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4057, nullptr, "Unknown4057", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4058, nullptr, "Unknown4058", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4059, nullptr, "Unknown4059", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4060, nullptr, "Unknown4060", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4061, nullptr, "Unknown4061", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4062, nullptr, "Unknown4062", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4063, nullptr, "Unknown4063", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4064, nullptr, "Unknown4064", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4065, nullptr, "Unknown4065", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4066, nullptr, "Unknown4066", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4067, nullptr, "Unknown4067", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4068, nullptr, "Unknown4068", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4069, nullptr, "Unknown4069", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4070, nullptr, "Unknown4070", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4071, nullptr, "Unknown4071", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4072, nullptr, "Unknown4072", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4073, nullptr, "Unknown4073", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4074, nullptr, "Unknown4074", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4075, nullptr, "Unknown4075", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4076, nullptr, "Unknown4076", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4077, nullptr, "Unknown4077", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4078, nullptr, "Unknown4078", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4079, nullptr, "Unknown4079", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4080, nullptr, "Unknown4080", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4081, nullptr, "Unknown4081", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4083, nullptr, "Unknown4083", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4084, nullptr, "Unknown4084", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4085, nullptr, "Unknown4085", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4086, nullptr, "Unknown4086", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4087, nullptr, "Unknown4087", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4089, nullptr, "Unknown4089", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4090, nullptr, "Unknown4090", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4091, nullptr, "Unknown4091", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4092, nullptr, "Unknown4092", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4093, nullptr, "Unknown4093", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4094, nullptr, "Unknown4094", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4095, nullptr, "Unknown4095", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4096, nullptr, "Unknown4096", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4097, nullptr, "Unknown4097", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{4099, nullptr, "Unknown4099", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105", MakeVersionGate({23,0,0})},
|
||||
FunctionInfo{5000, nullptr, "Unknown5000", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{5001, nullptr, "Unknown5001", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{9999, nullptr, "GetApplicationCertificate", MakeVersionGate({10,0,0}, {10,2,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IAsyncResult::FindRequest(
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Get"},
|
||||
FunctionInfo{1, D<&IAsyncResult::Cancel>, "Cancel"},
|
||||
FunctionInfo{2, nullptr, "GetErrorContext"} // 4.0.0+
|
||||
FunctionInfo{2, nullptr, "GetErrorContext", MakeVersionGate({4,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"},
|
||||
FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
|
||||
FunctionInfo{607, nullptr, "IsAnyApplicationRunning"},
|
||||
FunctionInfo{608, nullptr, "Unknown608"} //21.0.0+
|
||||
FunctionInfo{608, nullptr, "Unknown608", MakeVersionGate({21,0,0})}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -36,10 +36,10 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IDynamicRightsInterface::F
|
||||
FunctionInfo{24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"},
|
||||
FunctionInfo{25, nullptr, "RequestProceedDynamicRightsState"},
|
||||
FunctionInfo{26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"},
|
||||
FunctionInfo{27, nullptr, "Unknown27"}, //20.0.0+
|
||||
FunctionInfo{28, nullptr, "Unknown28"}, //20.0.0+
|
||||
FunctionInfo{29, nullptr, "Unknown29"}, //21.0.0+
|
||||
FunctionInfo{30, nullptr, "Unknown30"} //21.0.0+
|
||||
FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({21,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IReadOnlyApplicationContro
|
||||
FunctionInfo{10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"},
|
||||
FunctionInfo{13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"},
|
||||
FunctionInfo{19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
|
||||
FunctionInfo{23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"} //23.0.0+
|
||||
FunctionInfo{23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData", MakeVersionGate({23,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -16,12 +16,12 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> IDaemonController::FindReq
|
||||
FunctionInfo{2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"},
|
||||
FunctionInfo{3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"},
|
||||
FunctionInfo{4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"},
|
||||
FunctionInfo{5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting"}, // 11.0.0+
|
||||
FunctionInfo{6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting"}, // 11.0.0+
|
||||
FunctionInfo{5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})},
|
||||
FunctionInfo{6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})},
|
||||
FunctionInfo{10, nullptr, "CreateForbiddenSaveDataInidication"},
|
||||
FunctionInfo{11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"},
|
||||
FunctionInfo{12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"},
|
||||
FunctionInfo{13, nullptr, "Unknown13_20_0_0_Plus"} // 20.0.0+
|
||||
FunctionInfo{13, nullptr, "Unknown13_20_0_0_Plus", MakeVersionGate({20,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -136,10 +136,10 @@ public:
|
||||
FunctionInfo{203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"},
|
||||
FunctionInfo{204, nullptr, "ClearDataTransferPolicyCache"},
|
||||
FunctionInfo{205, nullptr, "RequestGetDataTransferPolicyAsync"},
|
||||
FunctionInfo{206, nullptr, "Unknown206"}, //21.0.0+
|
||||
FunctionInfo{206, nullptr, "Unknown206", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{300, nullptr, "GetUserSaveDataProperty"},
|
||||
FunctionInfo{301, nullptr, "SetUserSaveDataProperty"},
|
||||
FunctionInfo{302, nullptr, "Unknown302"}, //21.0.0+
|
||||
FunctionInfo{302, nullptr, "Unknown302", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"},
|
||||
FunctionInfo{900, nullptr, "DeleteAllTransferTask"},
|
||||
FunctionInfo{902, nullptr, "DeleteAllSeriesInfo"},
|
||||
@@ -154,7 +154,7 @@ public:
|
||||
FunctionInfo{911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"},
|
||||
FunctionInfo{912, nullptr, "DeleteSeriesInfoForSaveDataBackup"},
|
||||
FunctionInfo{913, nullptr, "GetSeriesInfoForSaveDataBackup"},
|
||||
FunctionInfo{914, nullptr, "Unknown914"}, //20.2.0+
|
||||
FunctionInfo{914, nullptr, "Unknown914", MakeVersionGate({20,2,0})},
|
||||
FunctionInfo{1000, nullptr, "UpdateIssueOld"},
|
||||
FunctionInfo{1010, nullptr, "Unknown1010"},
|
||||
FunctionInfo{1011, nullptr, "Unknown1011"},
|
||||
|
||||
@@ -34,13 +34,13 @@ namespace Service::OLSC {
|
||||
FunctionInfo{23, nullptr, "TouchSecondarySave"},
|
||||
FunctionInfo{24, nullptr, "GetSecondarySaveDataInfo"},
|
||||
FunctionInfo{25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"},
|
||||
FunctionInfo{26, nullptr, "Unknown26"}, //20.0.0+
|
||||
FunctionInfo{27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2"}, //20.0.0+
|
||||
FunctionInfo{28, nullptr, "Unknown28"}, //20.0.0+
|
||||
FunctionInfo{29, nullptr, "Unknown29"}, //21.0.0+
|
||||
FunctionInfo{800, nullptr, "Unknown800"}, //20.0.0+
|
||||
FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{800, nullptr, "Unknown800", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{900, nullptr, "SetLoadedDataMissing"},
|
||||
FunctionInfo{901, nullptr, "Unknown901"} //20.2.0+
|
||||
FunctionInfo{901, nullptr, "Unknown901", MakeVersionGate({20,2,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -34,16 +34,16 @@ namespace Service::OLSC {
|
||||
FunctionInfo{18, nullptr, "ListTransferTaskInfo"},
|
||||
FunctionInfo{19, nullptr, "DeleteTransferTask"},
|
||||
FunctionInfo{20, nullptr, "RaiseTransferTaskPriority"},
|
||||
FunctionInfo{21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress"}, //10.1.0+
|
||||
FunctionInfo{21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress", MakeVersionGate({10,1,0})},
|
||||
FunctionInfo{22, nullptr, "GetTransferTaskLastResult"},
|
||||
FunctionInfo{23, nullptr, "SuspendTransferTask"},
|
||||
FunctionInfo{24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"},
|
||||
FunctionInfo{25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"},
|
||||
FunctionInfo{26, nullptr, "Unknown26"}, //20.1.0+
|
||||
FunctionInfo{27, nullptr, "Unknown27"}, //20.1.0+
|
||||
FunctionInfo{28, nullptr, "Unknown28"}, //20.1.0+
|
||||
FunctionInfo{29, nullptr, "Unknown29"}, //20.1.0+
|
||||
FunctionInfo{30, nullptr, "Unknown30"} //20.1.0+
|
||||
FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,1,0})},
|
||||
FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,1,0})},
|
||||
FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,1,0})},
|
||||
FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({20,1,0})},
|
||||
FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({20,1,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -473,9 +473,9 @@ public:
|
||||
FunctionInfo{1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"},
|
||||
FunctionInfo{1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"},
|
||||
FunctionInfo{1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
|
||||
FunctionInfo{1020, nullptr, "ConfirmLaunchSharedApplicationPermission"}, //20.0.0+
|
||||
FunctionInfo{1021, nullptr, "TryBeginFreeCommunicationForStreamPlay"}, //21.0.0+
|
||||
FunctionInfo{1022, nullptr, "EndFreeCommunicationForStreamPlay"}, //21.0.0+
|
||||
FunctionInfo{1020, nullptr, "ConfirmLaunchSharedApplicationPermission", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1021, nullptr, "TryBeginFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1022, nullptr, "EndFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"},
|
||||
FunctionInfo{1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"},
|
||||
FunctionInfo{1033, nullptr, "SetSafetyLevel"},
|
||||
@@ -493,8 +493,8 @@ public:
|
||||
FunctionInfo{1047, nullptr, "NotifyApplicationDownloadStarted"},
|
||||
FunctionInfo{1048, nullptr, "NotifyNetworkProfileCreated"},
|
||||
FunctionInfo{1049, nullptr, "ResetFreeCommunicationApplicationList"},
|
||||
FunctionInfo{1050, nullptr, "AddToFreeCommunicationApplicationList"}, //20.0.0+
|
||||
FunctionInfo{1051, nullptr, "NotifyApplicationDownloadStarted"}, //20.0.0+
|
||||
FunctionInfo{1050, nullptr, "AddToFreeCommunicationApplicationList", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1051, nullptr, "NotifyApplicationDownloadStarted", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"},
|
||||
FunctionInfo{1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"},
|
||||
FunctionInfo{1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"},
|
||||
@@ -531,7 +531,7 @@ public:
|
||||
FunctionInfo{1472, nullptr, "CancelNetworkRequest"},
|
||||
FunctionInfo{1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"},
|
||||
FunctionInfo{1474, nullptr, "ClearUnlinkedEvent"},
|
||||
FunctionInfo{1475, nullptr, "GetExtendedPlayTimerEvent"}, // 18.0.0+
|
||||
FunctionInfo{1475, nullptr, "GetExtendedPlayTimerEvent", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{1601, nullptr, "DisableAllFeatures"},
|
||||
FunctionInfo{1602, nullptr, "PostEnableAllFeatures"},
|
||||
FunctionInfo{1603, nullptr, "IsAllFeaturesDisabled"},
|
||||
@@ -547,10 +547,10 @@ public:
|
||||
FunctionInfo{1951, nullptr, "SetPlayTimerSettingsForDebug"},
|
||||
FunctionInfo{1952, nullptr, "GetPlayTimerSpentTimeForTest"},
|
||||
FunctionInfo{1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"},
|
||||
FunctionInfo{1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+
|
||||
FunctionInfo{1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+
|
||||
FunctionInfo{1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+
|
||||
FunctionInfo{1957, nullptr, "GetBedtimeAlarmTimeMinute"}, // 18.0.0+
|
||||
FunctionInfo{1954, nullptr, "IsBedtimeAlarmEnabled", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{1955, nullptr, "GetBedtimeAlarmTime", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{1956, nullptr, "GetBedtimeAlarmTimeHour", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{1957, nullptr, "GetBedtimeAlarmTimeMinute", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{2001, nullptr, "RequestPairingAsync"},
|
||||
FunctionInfo{2002, nullptr, "FinishRequestPairing"},
|
||||
FunctionInfo{2003, nullptr, "AuthorizePairingAsync"},
|
||||
@@ -566,17 +566,17 @@ public:
|
||||
FunctionInfo{2013, nullptr, "SynchronizeParentalControlSettingsAsync"},
|
||||
FunctionInfo{2014, nullptr, "FinishSynchronizeParentalControlSettings"},
|
||||
FunctionInfo{2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"},
|
||||
FunctionInfo{2016, nullptr, "RequestUpdateExemptionListAsync"}, //5.0.0+
|
||||
FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+
|
||||
FunctionInfo{2017, nullptr, "AuthorizePairingAsync"}, //19.0.0+
|
||||
FunctionInfo{2019, nullptr, "RequestUpdateDeviceUsersBackground"}, //19.0.0+
|
||||
FunctionInfo{2021, nullptr, "RequestCopyPairingAsync"}, //20.0.0+
|
||||
FunctionInfo{2022, nullptr, "FinishRequestCopyPairing"}, //20.0.0+
|
||||
FunctionInfo{2023, nullptr, "IsFromPairingActiveDevice"}, //20.0.0+
|
||||
FunctionInfo{2024, nullptr, "RollbackCopyPairing"}, //21.0.0+
|
||||
FunctionInfo{3001, nullptr, "GetErrorContextChangedEvent"}, //20.0.0+
|
||||
FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+
|
||||
FunctionInfo{195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug"} //18.0.0+
|
||||
FunctionInfo{2016, nullptr, "RequestUpdateExemptionListAsync", MakeVersionGate({5,0,0})},
|
||||
FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{2017, nullptr, "AuthorizePairingAsync", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{2019, nullptr, "RequestUpdateDeviceUsersBackground", MakeVersionGate({19,0,0})},
|
||||
FunctionInfo{2021, nullptr, "RequestCopyPairingAsync", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2022, nullptr, "FinishRequestCopyPairing", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2023, nullptr, "IsFromPairingActiveDevice", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{2024, nullptr, "RollbackCopyPairing", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{3001, nullptr, "GetErrorContextChangedEvent", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug", MakeVersionGate({18,0,0})}
|
||||
);
|
||||
States states{};
|
||||
ParentalControlSettings settings{};
|
||||
|
||||
@@ -1,117 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/psc/ovln/receiver.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> IReceiver::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&IReceiver::AddSource>, "AddSource"},
|
||||
FunctionInfo{1, D<&IReceiver::RemoveSource>, "RemoveSource"},
|
||||
FunctionInfo{2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"},
|
||||
FunctionInfo{3, D<&IReceiver::Receive>, "Receive"},
|
||||
FunctionInfo{4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
IReceiver::IReceiver(Core::System& system_)
|
||||
: ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} {
|
||||
receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent");
|
||||
}
|
||||
|
||||
IReceiver::~IReceiver() {
|
||||
service_context.CloseEvent(receive_event);
|
||||
}
|
||||
|
||||
Result IReceiver::AddSource(SourceName source_name) {
|
||||
const std::string name = source_name.GetString();
|
||||
LOG_INFO(Service_PSC, "called: source_name={}", name);
|
||||
|
||||
// Add source if it doesn't already exist
|
||||
if (message_sources.find(name) == message_sources.end()) {
|
||||
message_sources[name] = {};
|
||||
}
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IReceiver::RemoveSource(SourceName source_name) {
|
||||
const std::string name = source_name.GetString();
|
||||
LOG_INFO(Service_PSC, "called: source_name={}", name);
|
||||
|
||||
// Remove source if it exists
|
||||
message_sources.erase(name);
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IReceiver::GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||
LOG_INFO(Service_PSC, "called");
|
||||
*out_event = &receive_event->GetReadableEvent();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result IReceiver::Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags) {
|
||||
u64 tick;
|
||||
return ReceiveWithTick(out_notification, out_flags, Out<u64>(&tick));
|
||||
}
|
||||
|
||||
Result IReceiver::ReceiveWithTick(Out<OverlayNotification> out_notification,
|
||||
Out<MessageFlags> out_flags, Out<u64> out_tick) {
|
||||
LOG_DEBUG(Service_PSC, "called");
|
||||
|
||||
// Find the message with the lowest ID across all sources
|
||||
const std::string* target_source = nullptr;
|
||||
size_t target_index = 0;
|
||||
|
||||
for (const auto& [source_name, messages] : message_sources) {
|
||||
if (!messages.empty()) {
|
||||
if (target_source == nullptr) {
|
||||
target_source = &source_name;
|
||||
target_index = 0;
|
||||
}
|
||||
// Note: In the real implementation, we would track message IDs
|
||||
// For now, just use FIFO order
|
||||
}
|
||||
}
|
||||
|
||||
if (target_source != nullptr) {
|
||||
auto& messages = message_sources[*target_source];
|
||||
*out_notification = messages[target_index].first;
|
||||
*out_flags = messages[target_index].second;
|
||||
*out_tick = 0; // TODO: Implement tick tracking
|
||||
|
||||
// Remove the message
|
||||
messages.erase(messages.begin() + target_index);
|
||||
|
||||
// Clear event if no more messages
|
||||
bool has_messages = false;
|
||||
for (const auto& [_, msgs] : message_sources) {
|
||||
if (!msgs.empty()) {
|
||||
has_messages = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!has_messages) {
|
||||
receive_event->Clear(system.Kernel());
|
||||
}
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
// No messages available
|
||||
*out_notification = {};
|
||||
*out_flags = {};
|
||||
*out_tick = 0;
|
||||
|
||||
LOG_WARNING(Service_PSC, "No messages available");
|
||||
R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available
|
||||
}
|
||||
|
||||
} // namespace Service::PSC
|
||||
@@ -1,47 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/kernel_helpers.h"
|
||||
#include "core/hle/service/service.h"
|
||||
#include "core/hle/service/psc/ovln/ovln_types.h"
|
||||
|
||||
namespace Kernel {
|
||||
class KReadableEvent;
|
||||
}
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
class IReceiver final : public ServiceFramework<IReceiver> {
|
||||
public:
|
||||
explicit IReceiver(Core::System& system_);
|
||||
~IReceiver() override;
|
||||
|
||||
IReceiver(const IReceiver&) = delete;
|
||||
IReceiver& operator=(const IReceiver&) = delete;
|
||||
|
||||
private:
|
||||
Result AddSource(SourceName source_name);
|
||||
Result RemoveSource(SourceName source_name);
|
||||
Result GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||
Result Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags);
|
||||
Result ReceiveWithTick(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags,
|
||||
Out<u64> out_tick);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override;
|
||||
|
||||
KernelHelpers::ServiceContext service_context;
|
||||
Kernel::KEvent* receive_event;
|
||||
|
||||
std::map<std::string, std::vector<std::pair<OverlayNotification, MessageFlags>>> message_sources;
|
||||
};
|
||||
|
||||
} // namespace Service::PSC
|
||||
@@ -5,17 +5,124 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
#include "core/hle/service/psc/ovln/receiver.h"
|
||||
#include "core/hle/service/psc/ovln/ovln_types.h"
|
||||
#include "core/hle/service/psc/ovln/receiver_service.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> IReceiverService::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"}
|
||||
);
|
||||
class IReceiver final : public ServiceFramework<IReceiver> {
|
||||
public:
|
||||
explicit IReceiver(Core::System& system_) : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} {
|
||||
receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent");
|
||||
}
|
||||
|
||||
~IReceiver() override {
|
||||
service_context.CloseEvent(receive_event);
|
||||
}
|
||||
|
||||
Result AddSource(SourceName source_name) {
|
||||
const std::string name = source_name.GetString();
|
||||
LOG_INFO(Service_PSC, "called: source_name={}", name);
|
||||
// Add source if it doesn't already exist
|
||||
if (message_sources.find(name) == message_sources.end()) {
|
||||
message_sources[name] = {};
|
||||
}
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result RemoveSource(SourceName source_name) {
|
||||
const std::string name = source_name.GetString();
|
||||
LOG_INFO(Service_PSC, "called: source_name={}", name);
|
||||
// Remove source if it exists
|
||||
message_sources.erase(name);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||
LOG_INFO(Service_PSC, "called");
|
||||
*out_event = &receive_event->GetReadableEvent();
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags) {
|
||||
u64 tick;
|
||||
return ReceiveWithTick(out_notification, out_flags, Out<u64>(&tick));
|
||||
}
|
||||
|
||||
Result ReceiveWithTick(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags, Out<u64> out_tick) {
|
||||
LOG_DEBUG(Service_PSC, "called");
|
||||
|
||||
// Find the message with the lowest ID across all sources
|
||||
const std::string* target_source = nullptr;
|
||||
size_t target_index = 0;
|
||||
|
||||
for (const auto& [source_name, messages] : message_sources) {
|
||||
if (!messages.empty()) {
|
||||
if (target_source == nullptr) {
|
||||
target_source = &source_name;
|
||||
target_index = 0;
|
||||
}
|
||||
// Note: In the real implementation, we would track message IDs
|
||||
// For now, just use FIFO order
|
||||
}
|
||||
}
|
||||
|
||||
if (target_source != nullptr) {
|
||||
auto& messages = message_sources[*target_source];
|
||||
*out_notification = messages[target_index].first;
|
||||
*out_flags = messages[target_index].second;
|
||||
*out_tick = 0; // TODO: Implement tick tracking
|
||||
|
||||
// Remove the message
|
||||
messages.erase(messages.begin() + target_index);
|
||||
|
||||
// Clear event if no more messages
|
||||
bool has_messages = false;
|
||||
for (const auto& [_, msgs] : message_sources) {
|
||||
if (!msgs.empty()) {
|
||||
has_messages = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!has_messages) {
|
||||
receive_event->Clear(system.Kernel());
|
||||
}
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
// No messages available
|
||||
*out_notification = {};
|
||||
*out_flags = {};
|
||||
*out_tick = 0;
|
||||
|
||||
LOG_WARNING(Service_PSC, "No messages available");
|
||||
R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available
|
||||
}
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&IReceiver::AddSource>, "AddSource"},
|
||||
FunctionInfo{1, D<&IReceiver::RemoveSource>, "RemoveSource"},
|
||||
FunctionInfo{2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"},
|
||||
FunctionInfo{3, D<&IReceiver::Receive>, "Receive"},
|
||||
FunctionInfo{4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"}
|
||||
);
|
||||
|
||||
KernelHelpers::ServiceContext service_context;
|
||||
Kernel::KEvent* receive_event;
|
||||
|
||||
std::map<std::string, std::vector<std::pair<OverlayNotification, MessageFlags>>> message_sources;
|
||||
};
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> IReceiverService::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
IReceiverService::IReceiverService(Core::System& system_) : ServiceFramework{system_, "ovln:rcv"} {
|
||||
}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
#include "core/hle/service/psc/ovln/sender.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> ISender::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&ISender::Send>, "Send"},
|
||||
FunctionInfo{1, nullptr, "GetUnreceivedMessageCount"}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
ISender::ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} {
|
||||
}
|
||||
|
||||
ISender::~ISender() = default;
|
||||
|
||||
Result ISender::Send(const OverlayNotification& notification, MessageFlags flags) {
|
||||
std::string data;
|
||||
for (const auto m : notification) {
|
||||
data += fmt::format("{:016X} ", m);
|
||||
}
|
||||
|
||||
LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
} // namespace Service::PSC
|
||||
@@ -1,26 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/psc/ovln/ovln_types.h"
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
class ISender final : public ServiceFramework<ISender> {
|
||||
public:
|
||||
explicit ISender(Core::System& system_);
|
||||
~ISender() override;
|
||||
|
||||
private:
|
||||
Result Send(const OverlayNotification& notification, MessageFlags flags);
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override;
|
||||
};
|
||||
|
||||
} // namespace Service::PSC
|
||||
@@ -5,17 +5,41 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
#include "core/hle/service/psc/ovln/sender.h"
|
||||
#include "core/hle/service/psc/ovln/ovln_types.h"
|
||||
#include "core/hle/service/psc/ovln/sender_service.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> ISenderService::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&ISenderService::OpenSender>, "OpenSender"}
|
||||
);
|
||||
class ISender final : public ServiceFramework<ISender> {
|
||||
public:
|
||||
explicit ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} {}
|
||||
~ISender() override = default;
|
||||
|
||||
Result Send(const OverlayNotification& notification, MessageFlags flags) {
|
||||
std::string data;
|
||||
for (const auto m : notification) {
|
||||
data += fmt::format("{:016X} ", m);
|
||||
}
|
||||
|
||||
LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&ISender::Send>, "Send"},
|
||||
FunctionInfo{1, nullptr, "GetUnreceivedMessageCount"}
|
||||
);
|
||||
};
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> ISenderService::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, D<&ISenderService::OpenSender>, "OpenSender"}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
ISenderService::ISenderService(Core::System& system_) : ServiceFramework{system_, "ovln:snd"} {
|
||||
}
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/psc/pm_control.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
IPmControl::IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {
|
||||
}
|
||||
|
||||
IPmControl::~IPmControl() = default;
|
||||
|
||||
} // namespace Service::PSC
|
||||
@@ -1,34 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
class IPmControl final : public ServiceFramework<IPmControl> {
|
||||
public:
|
||||
explicit IPmControl(Core::System& system_);
|
||||
~IPmControl() override;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "DispatchRequest"},
|
||||
FunctionInfo{2, nullptr, "GetResult"},
|
||||
FunctionInfo{3, nullptr, "GetState"},
|
||||
FunctionInfo{4, nullptr, "Cancel"},
|
||||
FunctionInfo{5, nullptr, "PrintModuleInformation"},
|
||||
FunctionInfo{6, nullptr, "GetModuleInformation"},
|
||||
FunctionInfo{10, nullptr, "AcquireStateLock"},
|
||||
FunctionInfo{11, nullptr, "HasStateLock"}
|
||||
);
|
||||
};
|
||||
|
||||
} // namespace Service::PSC
|
||||
@@ -1,27 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/service/psc/pm_module.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
std::optional<ServiceFrameworkBase::FunctionInfoBase> IPmModule::FindRequest(u32 key) {
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "GetRequest"},
|
||||
FunctionInfo{2, nullptr, "Acknowledge"},
|
||||
FunctionInfo{3, nullptr, "Finalize"},
|
||||
FunctionInfo{4, nullptr, "AcknowledgeEx"}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
IPmModule::IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {
|
||||
}
|
||||
|
||||
IPmModule::~IPmModule() = default;
|
||||
|
||||
} // namespace Service::PSC
|
||||
@@ -1,20 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Service::PSC {
|
||||
|
||||
class IPmModule final : public ServiceFramework<IPmModule> {
|
||||
public:
|
||||
explicit IPmModule(Core::System& system_);
|
||||
~IPmModule() override;
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override;
|
||||
};
|
||||
|
||||
} // namespace Service::PSC
|
||||
@@ -6,8 +6,6 @@
|
||||
|
||||
#include "core/hle/service/psc/ovln/receiver_service.h"
|
||||
#include "core/hle/service/psc/ovln/sender_service.h"
|
||||
#include "core/hle/service/psc/pm_control.h"
|
||||
#include "core/hle/service/psc/pm_module.h"
|
||||
#include "core/hle/service/psc/psc.h"
|
||||
#include "core/hle/service/psc/time/manager.h"
|
||||
#include "core/hle/service/psc/time/power_state_service.h"
|
||||
@@ -103,7 +101,22 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class IPmModule;
|
||||
class IPmModule final : public ServiceFramework<IPmModule> {
|
||||
public:
|
||||
explicit IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {}
|
||||
~IPmModule() override = default;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "GetRequest"},
|
||||
FunctionInfo{2, nullptr, "Acknowledge"},
|
||||
FunctionInfo{3, nullptr, "Finalize"},
|
||||
FunctionInfo{4, nullptr, "AcknowledgeEx"}
|
||||
);
|
||||
};
|
||||
|
||||
class IPmService final : public ServiceFramework<IPmService> {
|
||||
public:
|
||||
@@ -125,6 +138,27 @@ private:
|
||||
);
|
||||
};
|
||||
|
||||
class IPmControl final : public ServiceFramework<IPmControl> {
|
||||
public:
|
||||
explicit IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {}
|
||||
~IPmControl() override = default;
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "DispatchRequest"},
|
||||
FunctionInfo{2, nullptr, "GetResult"},
|
||||
FunctionInfo{3, nullptr, "GetState"},
|
||||
FunctionInfo{4, nullptr, "Cancel"},
|
||||
FunctionInfo{5, nullptr, "PrintModuleInformation"},
|
||||
FunctionInfo{6, nullptr, "GetModuleInformation"},
|
||||
FunctionInfo{10, nullptr, "AcquireStateLock"},
|
||||
FunctionInfo{11, nullptr, "HasStateLock"}
|
||||
);
|
||||
};
|
||||
|
||||
void LoopProcess(Core::System& system) {
|
||||
auto server_manager = std::make_unique<ServerManager>(system);
|
||||
|
||||
|
||||
@@ -33,8 +33,7 @@ Alarm::~Alarm() {
|
||||
}
|
||||
|
||||
Alarms::Alarms(Core::System& system, StandardSteadyClockCore& steady_clock, PowerStateRequestManager& power_state_request_manager)
|
||||
: m_system{system}
|
||||
, m_ctx{system, "Psc:Alarms"}
|
||||
: m_ctx{system, "Psc:Alarms"}
|
||||
, m_steady_clock{steady_clock}
|
||||
, m_power_state_request_manager{power_state_request_manager}
|
||||
, m_event{m_ctx.CreateEvent("Psc:Alarms:Event")}
|
||||
|
||||
@@ -95,7 +95,6 @@ private:
|
||||
void Erase(Kernel::KernelCore& kernel, Alarm& alarm);
|
||||
Result UpdateClosestAndSignal(Kernel::KernelCore& kernel);
|
||||
|
||||
Core::System& m_system;
|
||||
KernelHelpers::ServiceContext m_ctx;
|
||||
|
||||
StandardSteadyClockCore& m_steady_clock;
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -23,20 +26,20 @@ namespace Service::PSC::Time {
|
||||
class TimeManager {
|
||||
public:
|
||||
explicit TimeManager(Core::System& system)
|
||||
: m_system{system}, m_standard_steady_clock{system}, m_tick_based_steady_clock{m_system},
|
||||
m_standard_local_system_clock{m_standard_steady_clock},
|
||||
m_standard_network_system_clock{m_standard_steady_clock},
|
||||
m_standard_user_system_clock{m_system, m_standard_local_system_clock,
|
||||
m_standard_network_system_clock},
|
||||
m_ephemeral_network_clock{m_tick_based_steady_clock}, m_shared_memory{m_system},
|
||||
m_power_state_request_manager{m_system}, m_alarms{m_system, m_standard_steady_clock,
|
||||
m_power_state_request_manager},
|
||||
m_local_system_clock_context_writer{m_system, m_shared_memory},
|
||||
m_network_system_clock_context_writer{m_system, m_shared_memory,
|
||||
m_standard_user_system_clock},
|
||||
m_ephemeral_network_clock_context_writer{m_system} {}
|
||||
|
||||
Core::System& m_system;
|
||||
: m_standard_steady_clock{system}
|
||||
, m_tick_based_steady_clock{system}
|
||||
, m_standard_local_system_clock{m_standard_steady_clock}
|
||||
, m_standard_network_system_clock{m_standard_steady_clock}
|
||||
, m_standard_user_system_clock{system, m_standard_local_system_clock
|
||||
, m_standard_network_system_clock}
|
||||
, m_ephemeral_network_clock{m_tick_based_steady_clock}
|
||||
, m_shared_memory{system}
|
||||
, m_power_state_request_manager{system}
|
||||
, m_alarms{system, m_standard_steady_clock, m_power_state_request_manager}
|
||||
, m_local_system_clock_context_writer{system, m_shared_memory}
|
||||
, m_network_system_clock_context_writer{system, m_shared_memory, m_standard_user_system_clock}
|
||||
, m_ephemeral_network_clock_context_writer{system}
|
||||
{}
|
||||
|
||||
StandardSteadyClockCore m_standard_steady_clock;
|
||||
TickBasedSteadyClockCore m_tick_based_steady_clock;
|
||||
|
||||
@@ -8,17 +8,330 @@
|
||||
#include <openssl/evp.h>
|
||||
|
||||
#include "core/hle/kernel/k_process.h"
|
||||
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
#include "core/hle/service/ro/ro.h"
|
||||
#include "core/hle/service/ro/ro_nro_utils.h"
|
||||
#include "core/hle/service/ro/ro_results.h"
|
||||
#include "core/hle/service/ro/ro_types.h"
|
||||
#include "core/hle/service/server_manager.h"
|
||||
#include "core/hle/service/service.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
|
||||
namespace Service::RO {
|
||||
|
||||
constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2};
|
||||
constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3};
|
||||
constexpr Result ResultInvalidNro{ErrorModule::RO, 4};
|
||||
constexpr Result ResultInvalidNrr{ErrorModule::RO, 6};
|
||||
constexpr Result ResultTooManyNro{ErrorModule::RO, 7};
|
||||
constexpr Result ResultTooManyNrr{ErrorModule::RO, 8};
|
||||
constexpr Result ResultNotAuthorized{ErrorModule::RO, 9};
|
||||
constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10};
|
||||
constexpr Result ResultInternalError{ErrorModule::RO, 1023};
|
||||
constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025};
|
||||
constexpr Result ResultInvalidSize{ErrorModule::RO, 1026};
|
||||
constexpr Result ResultNotLoaded{ErrorModule::RO, 1028};
|
||||
constexpr Result ResultNotRegistered{ErrorModule::RO, 1029};
|
||||
constexpr Result ResultInvalidSession{ErrorModule::RO, 1030};
|
||||
constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031};
|
||||
|
||||
namespace {
|
||||
|
||||
struct ProcessMemoryRegion {
|
||||
u64 address;
|
||||
u64 size;
|
||||
};
|
||||
|
||||
size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) {
|
||||
size_t total = 0;
|
||||
|
||||
for (size_t i = 0; i < num_regions; ++i) {
|
||||
total += regions[i].size;
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address,
|
||||
u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
|
||||
// Reset region count.
|
||||
size_t num_regions = 0;
|
||||
|
||||
// We always want a region for the nro.
|
||||
regions[num_regions++] = {nro_heap_address, nro_heap_size};
|
||||
|
||||
// If we have bss, create a region for bss.
|
||||
if (bss_heap_size > 0) {
|
||||
regions[num_regions++] = {bss_heap_address, bss_heap_size};
|
||||
}
|
||||
|
||||
return num_regions;
|
||||
}
|
||||
|
||||
Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size,
|
||||
Kernel::Svc::MemoryPermission permission) {
|
||||
auto& page_table = process->GetPageTable();
|
||||
|
||||
// Set permission.
|
||||
R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission));
|
||||
}
|
||||
|
||||
Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address,
|
||||
const ProcessMemoryRegion* regions, size_t num_regions) {
|
||||
// Get the total process memory region size.
|
||||
const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions);
|
||||
|
||||
auto& page_table = process->GetPageTable();
|
||||
|
||||
// Unmap each region in order.
|
||||
size_t cur_offset = total_size;
|
||||
for (size_t i = 0; i < num_regions; ++i) {
|
||||
// We want to unmap in reverse order.
|
||||
const auto& cur_region = regions[num_regions - 1 - i];
|
||||
|
||||
// Subtract to update the current offset.
|
||||
cur_offset -= cur_region.size;
|
||||
|
||||
// Unmap.
|
||||
R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address,
|
||||
cur_region.size));
|
||||
}
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) {
|
||||
Kernel::KMemoryInfo memory_info;
|
||||
Kernel::Svc::PageInfo page_info;
|
||||
|
||||
// Ensure page before mapping is unmapped.
|
||||
R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
|
||||
map_address - 1));
|
||||
R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
|
||||
Kernel::ResultInvalidState);
|
||||
|
||||
// Ensure page after mapping is unmapped.
|
||||
R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
|
||||
map_address + map_size));
|
||||
R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
|
||||
Kernel::ResultInvalidState);
|
||||
|
||||
// Successfully verified guard pages.
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions,
|
||||
size_t num_regions, std::mt19937_64& generate_random) {
|
||||
auto& page_table = process->GetPageTable();
|
||||
const u64 alias_code_start =
|
||||
GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize;
|
||||
const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize;
|
||||
|
||||
for (size_t trial = 0; trial < 64; trial++) {
|
||||
// Generate a new trial address.
|
||||
const u64 mapped_address =
|
||||
(alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize;
|
||||
|
||||
const auto MapRegions = [&] {
|
||||
// Map the regions in order.
|
||||
u64 mapped_size = 0;
|
||||
for (size_t i = 0; i < num_regions; ++i) {
|
||||
// If we fail, unmap up to where we've mapped.
|
||||
ON_RESULT_FAILURE {
|
||||
R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i));
|
||||
};
|
||||
|
||||
// Map the current region.
|
||||
R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address,
|
||||
regions[i].size));
|
||||
|
||||
mapped_size += regions[i].size;
|
||||
}
|
||||
|
||||
// If we fail, unmap all mapped regions.
|
||||
ON_RESULT_FAILURE {
|
||||
R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions));
|
||||
};
|
||||
|
||||
// Ensure guard pages.
|
||||
R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size));
|
||||
};
|
||||
|
||||
if (R_SUCCEEDED(MapRegions())) {
|
||||
// Set the output address.
|
||||
*out = mapped_address;
|
||||
R_SUCCEED();
|
||||
}
|
||||
}
|
||||
|
||||
// We failed to map anything.
|
||||
R_THROW(RO::ResultOutOfAddressSpace);
|
||||
}
|
||||
|
||||
Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
|
||||
u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
|
||||
std::mt19937_64& generate_random) {
|
||||
// Set up the process memory regions.
|
||||
std::array<ProcessMemoryRegion, 2> regions{};
|
||||
const size_t num_regions = SetupNroProcessMemoryRegions(
|
||||
regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
|
||||
|
||||
// Re-map the nro/bss as code memory in the destination process.
|
||||
R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions,
|
||||
generate_random));
|
||||
}
|
||||
|
||||
Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
|
||||
u64 rw_size) {
|
||||
const u64 rx_offset = 0;
|
||||
const u64 ro_offset = rx_offset + rx_size;
|
||||
const u64 rw_offset = ro_offset + ro_size;
|
||||
|
||||
R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size,
|
||||
Kernel::Svc::MemoryPermission::ReadExecute));
|
||||
R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size,
|
||||
Kernel::Svc::MemoryPermission::Read));
|
||||
R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size,
|
||||
Kernel::Svc::MemoryPermission::ReadWrite));
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
|
||||
u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
|
||||
// Set up the process memory regions.
|
||||
std::array<ProcessMemoryRegion, 2> regions{};
|
||||
const size_t num_regions = SetupNroProcessMemoryRegions(
|
||||
regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
|
||||
|
||||
// Unmap the nro/bss.
|
||||
R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
enum class NrrKind : u8 {
|
||||
User = 0,
|
||||
JitPlugin = 1,
|
||||
Count,
|
||||
};
|
||||
|
||||
static constexpr size_t ModuleIdSize = 0x20;
|
||||
struct ModuleId {
|
||||
std::array<u8, ModuleIdSize> data;
|
||||
};
|
||||
static_assert(sizeof(ModuleId) == ModuleIdSize);
|
||||
|
||||
struct NrrCertification {
|
||||
static constexpr size_t RsaKeySize = 0x100;
|
||||
static constexpr size_t SignedSize = 0x120;
|
||||
|
||||
u64 program_id_mask;
|
||||
u64 program_id_pattern;
|
||||
std::array<u8, 0x10> reserved_10;
|
||||
std::array<u8, RsaKeySize> modulus;
|
||||
std::array<u8, RsaKeySize> signature;
|
||||
};
|
||||
static_assert(sizeof(NrrCertification) == NrrCertification::RsaKeySize + NrrCertification::SignedSize);
|
||||
|
||||
class NrrHeader {
|
||||
public:
|
||||
static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0');
|
||||
|
||||
public:
|
||||
bool IsMagicValid() const {
|
||||
return m_magic == Magic;
|
||||
}
|
||||
|
||||
bool IsProgramIdValid() const {
|
||||
return (m_program_id & m_certification.program_id_mask) ==
|
||||
m_certification.program_id_pattern;
|
||||
}
|
||||
|
||||
NrrKind GetNrrKind() const {
|
||||
const NrrKind kind = static_cast<NrrKind>(m_nrr_kind);
|
||||
ASSERT(kind < NrrKind::Count);
|
||||
return kind;
|
||||
}
|
||||
|
||||
u64 GetProgramId() const {
|
||||
return m_program_id;
|
||||
}
|
||||
|
||||
u32 GetSize() const {
|
||||
return m_size;
|
||||
}
|
||||
|
||||
u32 GetNumHashes() const {
|
||||
return m_num_hashes;
|
||||
}
|
||||
|
||||
size_t GetHashesOffset() const {
|
||||
return m_hashes_offset;
|
||||
}
|
||||
|
||||
u32 GetKeyGeneration() const {
|
||||
return m_key_generation;
|
||||
}
|
||||
|
||||
const u8* GetCertificationSignature() const {
|
||||
return m_certification.signature.data();
|
||||
}
|
||||
|
||||
const u8* GetCertificationSignedArea() const {
|
||||
return reinterpret_cast<const u8*>(std::addressof(m_certification));
|
||||
}
|
||||
|
||||
const u8* GetCertificationModulus() const {
|
||||
return m_certification.modulus.data();
|
||||
}
|
||||
|
||||
const u8* GetSignature() const {
|
||||
return m_signature.data();
|
||||
}
|
||||
|
||||
size_t GetSignedAreaSize() const {
|
||||
return m_size - GetSignedAreaOffset();
|
||||
}
|
||||
|
||||
static constexpr size_t GetSignedAreaOffset() {
|
||||
return offsetof(NrrHeader, m_program_id);
|
||||
}
|
||||
|
||||
private:
|
||||
u32 m_magic;
|
||||
u32 m_key_generation;
|
||||
INSERT_PADDING_BYTES_NOINIT(8);
|
||||
NrrCertification m_certification;
|
||||
std::array<u8, 0x100> m_signature;
|
||||
u64 m_program_id;
|
||||
u32 m_size;
|
||||
u8 m_nrr_kind; // 7.0.0+
|
||||
INSERT_PADDING_BYTES_NOINIT(3);
|
||||
u32 m_hashes_offset;
|
||||
u32 m_num_hashes;
|
||||
INSERT_PADDING_BYTES_NOINIT(8);
|
||||
};
|
||||
static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size");
|
||||
|
||||
static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0');
|
||||
struct NroHeader {
|
||||
u32 m_entrypoint_insn;
|
||||
u32 m_mod_offset;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x8);
|
||||
u32 m_magic;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x4);
|
||||
u32 m_size;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x4);
|
||||
u32 m_text_offset;
|
||||
u32 m_text_size;
|
||||
u32 m_ro_offset;
|
||||
u32 m_ro_size;
|
||||
u32 m_rw_offset;
|
||||
u32 m_rw_size;
|
||||
u32 m_bss_size;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x4);
|
||||
ModuleId m_module_id;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x20);
|
||||
};
|
||||
static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size");
|
||||
|
||||
namespace {
|
||||
|
||||
// Atmosphere defines as follows:
|
||||
|
||||
@@ -1,185 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "core/hle/kernel/k_process.h"
|
||||
#include "core/hle/service/ro/ro_nro_utils.h"
|
||||
#include "core/hle/service/ro/ro_results.h"
|
||||
|
||||
namespace Service::RO {
|
||||
|
||||
namespace {
|
||||
|
||||
struct ProcessMemoryRegion {
|
||||
u64 address;
|
||||
u64 size;
|
||||
};
|
||||
|
||||
size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) {
|
||||
size_t total = 0;
|
||||
|
||||
for (size_t i = 0; i < num_regions; ++i) {
|
||||
total += regions[i].size;
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address,
|
||||
u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
|
||||
// Reset region count.
|
||||
size_t num_regions = 0;
|
||||
|
||||
// We always want a region for the nro.
|
||||
regions[num_regions++] = {nro_heap_address, nro_heap_size};
|
||||
|
||||
// If we have bss, create a region for bss.
|
||||
if (bss_heap_size > 0) {
|
||||
regions[num_regions++] = {bss_heap_address, bss_heap_size};
|
||||
}
|
||||
|
||||
return num_regions;
|
||||
}
|
||||
|
||||
Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size,
|
||||
Kernel::Svc::MemoryPermission permission) {
|
||||
auto& page_table = process->GetPageTable();
|
||||
|
||||
// Set permission.
|
||||
R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission));
|
||||
}
|
||||
|
||||
Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address,
|
||||
const ProcessMemoryRegion* regions, size_t num_regions) {
|
||||
// Get the total process memory region size.
|
||||
const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions);
|
||||
|
||||
auto& page_table = process->GetPageTable();
|
||||
|
||||
// Unmap each region in order.
|
||||
size_t cur_offset = total_size;
|
||||
for (size_t i = 0; i < num_regions; ++i) {
|
||||
// We want to unmap in reverse order.
|
||||
const auto& cur_region = regions[num_regions - 1 - i];
|
||||
|
||||
// Subtract to update the current offset.
|
||||
cur_offset -= cur_region.size;
|
||||
|
||||
// Unmap.
|
||||
R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address,
|
||||
cur_region.size));
|
||||
}
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) {
|
||||
Kernel::KMemoryInfo memory_info;
|
||||
Kernel::Svc::PageInfo page_info;
|
||||
|
||||
// Ensure page before mapping is unmapped.
|
||||
R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
|
||||
map_address - 1));
|
||||
R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
|
||||
Kernel::ResultInvalidState);
|
||||
|
||||
// Ensure page after mapping is unmapped.
|
||||
R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
|
||||
map_address + map_size));
|
||||
R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
|
||||
Kernel::ResultInvalidState);
|
||||
|
||||
// Successfully verified guard pages.
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions,
|
||||
size_t num_regions, std::mt19937_64& generate_random) {
|
||||
auto& page_table = process->GetPageTable();
|
||||
const u64 alias_code_start =
|
||||
GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize;
|
||||
const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize;
|
||||
|
||||
for (size_t trial = 0; trial < 64; trial++) {
|
||||
// Generate a new trial address.
|
||||
const u64 mapped_address =
|
||||
(alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize;
|
||||
|
||||
const auto MapRegions = [&] {
|
||||
// Map the regions in order.
|
||||
u64 mapped_size = 0;
|
||||
for (size_t i = 0; i < num_regions; ++i) {
|
||||
// If we fail, unmap up to where we've mapped.
|
||||
ON_RESULT_FAILURE {
|
||||
R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i));
|
||||
};
|
||||
|
||||
// Map the current region.
|
||||
R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address,
|
||||
regions[i].size));
|
||||
|
||||
mapped_size += regions[i].size;
|
||||
}
|
||||
|
||||
// If we fail, unmap all mapped regions.
|
||||
ON_RESULT_FAILURE {
|
||||
R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions));
|
||||
};
|
||||
|
||||
// Ensure guard pages.
|
||||
R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size));
|
||||
};
|
||||
|
||||
if (R_SUCCEEDED(MapRegions())) {
|
||||
// Set the output address.
|
||||
*out = mapped_address;
|
||||
R_SUCCEED();
|
||||
}
|
||||
}
|
||||
|
||||
// We failed to map anything.
|
||||
R_THROW(RO::ResultOutOfAddressSpace);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
|
||||
u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
|
||||
std::mt19937_64& generate_random) {
|
||||
// Set up the process memory regions.
|
||||
std::array<ProcessMemoryRegion, 2> regions{};
|
||||
const size_t num_regions = SetupNroProcessMemoryRegions(
|
||||
regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
|
||||
|
||||
// Re-map the nro/bss as code memory in the destination process.
|
||||
R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions,
|
||||
generate_random));
|
||||
}
|
||||
|
||||
Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
|
||||
u64 rw_size) {
|
||||
const u64 rx_offset = 0;
|
||||
const u64 ro_offset = rx_offset + rx_size;
|
||||
const u64 rw_offset = ro_offset + ro_size;
|
||||
|
||||
R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size,
|
||||
Kernel::Svc::MemoryPermission::ReadExecute));
|
||||
R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size,
|
||||
Kernel::Svc::MemoryPermission::Read));
|
||||
R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size,
|
||||
Kernel::Svc::MemoryPermission::ReadWrite));
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
|
||||
u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
|
||||
// Set up the process memory regions.
|
||||
std::array<ProcessMemoryRegion, 2> regions{};
|
||||
const size_t num_regions = SetupNroProcessMemoryRegions(
|
||||
regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
|
||||
|
||||
// Unmap the nro/bss.
|
||||
R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions));
|
||||
}
|
||||
|
||||
} // namespace Service::RO
|
||||
@@ -1,26 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <random>
|
||||
|
||||
#include "common/common_types.h"
|
||||
|
||||
namespace Kernel {
|
||||
class KProcess;
|
||||
}
|
||||
|
||||
union Result;
|
||||
|
||||
namespace Service::RO {
|
||||
|
||||
Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
|
||||
u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
|
||||
std::mt19937_64& generate_random);
|
||||
Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
|
||||
u64 rw_size);
|
||||
Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
|
||||
u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size);
|
||||
|
||||
} // namespace Service::RO
|
||||
@@ -1,29 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/result.h"
|
||||
|
||||
namespace Service::RO {
|
||||
|
||||
constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2};
|
||||
constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3};
|
||||
constexpr Result ResultInvalidNro{ErrorModule::RO, 4};
|
||||
constexpr Result ResultInvalidNrr{ErrorModule::RO, 6};
|
||||
constexpr Result ResultTooManyNro{ErrorModule::RO, 7};
|
||||
constexpr Result ResultTooManyNrr{ErrorModule::RO, 8};
|
||||
constexpr Result ResultNotAuthorized{ErrorModule::RO, 9};
|
||||
constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10};
|
||||
constexpr Result ResultInternalError{ErrorModule::RO, 1023};
|
||||
constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025};
|
||||
constexpr Result ResultInvalidSize{ErrorModule::RO, 1026};
|
||||
constexpr Result ResultNotLoaded{ErrorModule::RO, 1028};
|
||||
constexpr Result ResultNotRegistered{ErrorModule::RO, 1029};
|
||||
constexpr Result ResultInvalidSession{ErrorModule::RO, 1030};
|
||||
constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031};
|
||||
|
||||
} // namespace Service::RO
|
||||
@@ -1,142 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common/assert.h"
|
||||
#include "common/common_funcs.h"
|
||||
#include "common/common_types.h"
|
||||
|
||||
namespace Service::RO {
|
||||
|
||||
enum class NrrKind : u8 {
|
||||
User = 0,
|
||||
JitPlugin = 1,
|
||||
Count,
|
||||
};
|
||||
|
||||
static constexpr size_t ModuleIdSize = 0x20;
|
||||
struct ModuleId {
|
||||
std::array<u8, ModuleIdSize> data;
|
||||
};
|
||||
static_assert(sizeof(ModuleId) == ModuleIdSize);
|
||||
|
||||
struct NrrCertification {
|
||||
static constexpr size_t RsaKeySize = 0x100;
|
||||
static constexpr size_t SignedSize = 0x120;
|
||||
|
||||
u64 program_id_mask;
|
||||
u64 program_id_pattern;
|
||||
std::array<u8, 0x10> reserved_10;
|
||||
std::array<u8, RsaKeySize> modulus;
|
||||
std::array<u8, RsaKeySize> signature;
|
||||
};
|
||||
static_assert(sizeof(NrrCertification) ==
|
||||
NrrCertification::RsaKeySize + NrrCertification::SignedSize);
|
||||
|
||||
class NrrHeader {
|
||||
public:
|
||||
static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0');
|
||||
|
||||
public:
|
||||
bool IsMagicValid() const {
|
||||
return m_magic == Magic;
|
||||
}
|
||||
|
||||
bool IsProgramIdValid() const {
|
||||
return (m_program_id & m_certification.program_id_mask) ==
|
||||
m_certification.program_id_pattern;
|
||||
}
|
||||
|
||||
NrrKind GetNrrKind() const {
|
||||
const NrrKind kind = static_cast<NrrKind>(m_nrr_kind);
|
||||
ASSERT(kind < NrrKind::Count);
|
||||
return kind;
|
||||
}
|
||||
|
||||
u64 GetProgramId() const {
|
||||
return m_program_id;
|
||||
}
|
||||
|
||||
u32 GetSize() const {
|
||||
return m_size;
|
||||
}
|
||||
|
||||
u32 GetNumHashes() const {
|
||||
return m_num_hashes;
|
||||
}
|
||||
|
||||
size_t GetHashesOffset() const {
|
||||
return m_hashes_offset;
|
||||
}
|
||||
|
||||
u32 GetKeyGeneration() const {
|
||||
return m_key_generation;
|
||||
}
|
||||
|
||||
const u8* GetCertificationSignature() const {
|
||||
return m_certification.signature.data();
|
||||
}
|
||||
|
||||
const u8* GetCertificationSignedArea() const {
|
||||
return reinterpret_cast<const u8*>(std::addressof(m_certification));
|
||||
}
|
||||
|
||||
const u8* GetCertificationModulus() const {
|
||||
return m_certification.modulus.data();
|
||||
}
|
||||
|
||||
const u8* GetSignature() const {
|
||||
return m_signature.data();
|
||||
}
|
||||
|
||||
size_t GetSignedAreaSize() const {
|
||||
return m_size - GetSignedAreaOffset();
|
||||
}
|
||||
|
||||
static constexpr size_t GetSignedAreaOffset() {
|
||||
return offsetof(NrrHeader, m_program_id);
|
||||
}
|
||||
|
||||
private:
|
||||
u32 m_magic;
|
||||
u32 m_key_generation;
|
||||
INSERT_PADDING_BYTES_NOINIT(8);
|
||||
NrrCertification m_certification;
|
||||
std::array<u8, 0x100> m_signature;
|
||||
u64 m_program_id;
|
||||
u32 m_size;
|
||||
u8 m_nrr_kind; // 7.0.0+
|
||||
INSERT_PADDING_BYTES_NOINIT(3);
|
||||
u32 m_hashes_offset;
|
||||
u32 m_num_hashes;
|
||||
INSERT_PADDING_BYTES_NOINIT(8);
|
||||
};
|
||||
static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size");
|
||||
|
||||
static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0');
|
||||
struct NroHeader {
|
||||
u32 m_entrypoint_insn;
|
||||
u32 m_mod_offset;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x8);
|
||||
u32 m_magic;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x4);
|
||||
u32 m_size;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x4);
|
||||
u32 m_text_offset;
|
||||
u32 m_text_size;
|
||||
u32 m_ro_offset;
|
||||
u32 m_ro_size;
|
||||
u32 m_rw_offset;
|
||||
u32 m_rw_size;
|
||||
u32 m_bss_size;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x4);
|
||||
ModuleId m_module_id;
|
||||
INSERT_PADDING_BYTES_NOINIT(0x20);
|
||||
};
|
||||
static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size");
|
||||
|
||||
} // namespace Service::RO
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "core/hle/service/service.h"
|
||||
#include "core/hle/service/sm/sm.h"
|
||||
#include "core/reporter.h"
|
||||
#include "frontend_common/firmware_manager.h"
|
||||
|
||||
namespace Service {
|
||||
|
||||
@@ -47,7 +48,7 @@ ServiceFrameworkBase::~ServiceFrameworkBase() {
|
||||
const auto guard = ServiceFrameworkBase::LockService();
|
||||
}
|
||||
|
||||
void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info) {
|
||||
void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated) {
|
||||
auto cmd_buf = ctx.CommandBuffer();
|
||||
std::string function_name = bool(info) ? info->name : "<unknown>";
|
||||
|
||||
@@ -58,7 +59,11 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, c
|
||||
buf.push_back('}');
|
||||
|
||||
system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, service_name);
|
||||
UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf));
|
||||
if (gated) {
|
||||
LOG_ERROR(Service, "Version gated {}", fmt::to_string(buf));
|
||||
} else {
|
||||
UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf));
|
||||
}
|
||||
if (Settings::values.use_auto_stub) {
|
||||
LOG_WARNING(Service, "Using auto stub fallback!");
|
||||
IPC::ResponseBuilder rb{ctx, 2};
|
||||
@@ -66,11 +71,28 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, c
|
||||
}
|
||||
}
|
||||
|
||||
[[nodiscard]] static bool VersionGateCheck(Core::System& system, u32 vg) {
|
||||
u32 const c_maj = FirmwareManager::GetFirmwareVersion(system).first.major;
|
||||
u32 const c_min = FirmwareManager::GetFirmwareVersion(system).first.minor;
|
||||
u32 const c_pat = FirmwareManager::GetFirmwareVersion(system).first.micro;
|
||||
u32 const cg = (c_pat << 0) | (c_min << 4) | (c_maj << 8);
|
||||
u32 const sg = vg & 0xfff;
|
||||
u32 const ug = (vg >> 12) & 0xfff;
|
||||
// feature available after current
|
||||
if (sg && cg < sg)
|
||||
return false;
|
||||
// feature until xxx (0 = up to current)
|
||||
return ug ? ug >= cg : true;
|
||||
}
|
||||
|
||||
void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) {
|
||||
const bool is_cmd_read = ctx.GetCommand() == 0;
|
||||
auto const info = FindRequest(ctx.GetCommand());
|
||||
if (!info.has_value() || info->handler_callback == nullptr)
|
||||
return ReportUnimplementedFunction(ctx, &*info);
|
||||
return ReportUnimplementedFunction(ctx, &*info, false);
|
||||
|
||||
if (VersionGateCheck(system, info->version_gating))
|
||||
return ReportUnimplementedFunction(ctx, &*info, true);
|
||||
|
||||
LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer()));
|
||||
handler_invoker(this, info->handler_callback, ctx);
|
||||
@@ -85,7 +107,10 @@ void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) {
|
||||
void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) {
|
||||
auto const info = FindRequestTipc(ctx.GetCommand());
|
||||
if (!info.has_value() || info->handler_callback == nullptr)
|
||||
return ReportUnimplementedFunction(ctx, &*info);
|
||||
return ReportUnimplementedFunction(ctx, &*info, false);
|
||||
|
||||
if (VersionGateCheck(system, info->version_gating))
|
||||
return ReportUnimplementedFunction(ctx, &*info, true);
|
||||
|
||||
LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer()));
|
||||
handler_invoker(this, info->handler_callback, ctx);
|
||||
|
||||
@@ -107,7 +107,7 @@ private:
|
||||
virtual std::optional<FunctionInfoBase> FindRequest(u32 key) = 0;
|
||||
virtual std::optional<FunctionInfoBase> FindRequestTipc(u32 key) = 0;
|
||||
|
||||
void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info);
|
||||
void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated);
|
||||
|
||||
protected:
|
||||
/// Used to gain exclusive access to the service members, e.g. from CoreTiming thread.
|
||||
@@ -162,20 +162,31 @@ protected:
|
||||
};
|
||||
using FunctionInfo = FunctionInfoTyped<Self>;
|
||||
|
||||
// expected_header serves as a key to 'address' function handlers, thus only include the minimal
|
||||
template <typename T>
|
||||
struct FunctionValueInfo {
|
||||
explicit constexpr FunctionValueInfo(HandlerFnP<T> handler_callback_, u32 version_gating_)
|
||||
: handler_callback{handler_callback_}
|
||||
, version_gating{version_gating_}
|
||||
{}
|
||||
HandlerFnP<T> handler_callback;
|
||||
u32 version_gating;
|
||||
};
|
||||
|
||||
template<typename ...Ts>
|
||||
//requires (std::same_as<Ts, FunctionInfo> && ...)
|
||||
[[nodiscard]] static consteval frozen::map<u32, HandlerFnP<Self>, sizeof...(Ts)> CreateStaticMap(Ts... args) {
|
||||
return frozen::map<u32, HandlerFnP<Self>, sizeof...(args)>{
|
||||
{args.expected_header, args.handler_callback}...
|
||||
[[nodiscard]] static consteval frozen::map<u32, FunctionValueInfo<Self>, sizeof...(Ts)> CreateStaticMap(Ts... args) {
|
||||
return frozen::map<u32, FunctionValueInfo<Self>, sizeof...(args)>{
|
||||
{args.expected_header, FunctionValueInfo<Self>{args.handler_callback, args.version_gating}}...
|
||||
};
|
||||
}
|
||||
|
||||
// Used exclusively by NFC
|
||||
template<typename T, typename ...Ts>
|
||||
//requires (std::same_as<Ts, FunctionInfoTyped<T>> && ...)
|
||||
[[nodiscard]] static consteval frozen::map<u32, HandlerFnP<T>, sizeof...(Ts)> CreateStaticMapWithClass(Ts... args) {
|
||||
return frozen::map<u32, HandlerFnP<T>, sizeof...(args)>{
|
||||
{args.expected_header, args.handler_callback}...
|
||||
[[nodiscard]] static consteval frozen::map<u32, FunctionValueInfo<T>, sizeof...(Ts)> CreateStaticMapWithClass(Ts... args) {
|
||||
return frozen::map<u32, FunctionValueInfo<T>, sizeof...(args)>{
|
||||
{args.expected_header, FunctionValueInfo<T>{args.handler_callback, args.version_gating}}...
|
||||
};
|
||||
}
|
||||
|
||||
@@ -183,9 +194,12 @@ protected:
|
||||
[[nodiscard]] static std::optional<FunctionInfoBase> HandlerTableGenerateWithFind(u32 key, T const& map) {
|
||||
auto const it = map.find(key);
|
||||
if (it != map.end()) {
|
||||
auto fake = FunctionInfoBase{};
|
||||
fake.handler_callback = HandlerFnP<ServiceFrameworkBase>(it->second);
|
||||
return std::optional<FunctionInfoBase>{fake};
|
||||
auto const r = it->second;
|
||||
return std::optional<FunctionInfoBase>{{
|
||||
HandlerFnP<ServiceFrameworkBase>(r.handler_callback),
|
||||
nullptr,
|
||||
r.version_gating
|
||||
}};
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
@@ -32,8 +32,8 @@ public:
|
||||
FunctionInfo{21, nullptr, "SetAllowedSslHosts"},
|
||||
FunctionInfo{22, nullptr, "SetHostFsMountPoint"},
|
||||
FunctionInfo{23, nullptr, "SetMemoryUsageRateFlag"},
|
||||
FunctionInfo{24, nullptr, "CommitSettings"}, //20.0.0+
|
||||
FunctionInfo{27, nullptr, "SetHttpAuthConfigs"} //21.0.0+
|
||||
FunctionInfo{24, nullptr, "CommitSettings", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{27, nullptr, "SetHttpAuthConfigs", MakeVersionGate({21,0,0})}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -324,29 +324,29 @@ std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemSettingsServer::Fin
|
||||
FunctionInfo{208, nullptr, "SetHearingProtectionSafeguardFlag"},
|
||||
FunctionInfo{209, nullptr, "GetHearingProtectionSafeguardRemainingTime"},
|
||||
FunctionInfo{210, nullptr, "SetHearingProtectionSafeguardRemainingTime"},
|
||||
FunctionInfo{221, nullptr, "GetForceMonauralOutputFlag"}, //17.0.0+
|
||||
FunctionInfo{222, nullptr, "SetForceMonauralOutputFlag"}, //17.0.0+
|
||||
FunctionInfo{251, nullptr, "GetAccountIdentificationSettings"}, //18.0.0+
|
||||
FunctionInfo{252, nullptr, "SetAccountIdentificationSettings"}, //18.0.0+
|
||||
FunctionInfo{263, nullptr, "AcquireVphymDirtyFlagEventHandle"}, //20.0.0+
|
||||
FunctionInfo{264, nullptr, "GetVphymDirtyFlags"}, //20.0.0+
|
||||
FunctionInfo{282, nullptr, "ConvertToProductModel"}, //20.0.0+
|
||||
FunctionInfo{283, nullptr, "ConvertToProductModelName"}, //20.0.0+
|
||||
FunctionInfo{289, nullptr, "GetDefaultAccountIdentificationFlagSet"}, //20.0.0+
|
||||
FunctionInfo{300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle"}, //20.0.0+
|
||||
FunctionInfo{301, nullptr, "GetPushNotificationDirtyFlags"}, //20.0.0+
|
||||
FunctionInfo{306, nullptr, "GetPinCodeReregistrationGuideAccounts"}, //20.0.0+
|
||||
FunctionInfo{307, nullptr, "SetPinCodeReregistrationGuideAccounts"}, //20.0.0+
|
||||
FunctionInfo{315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs"}, //21.0.0+
|
||||
FunctionInfo{319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings"}, //21.0.0+
|
||||
FunctionInfo{320, nullptr, "SetAccountUserSettings"}, //21.0.0+
|
||||
FunctionInfo{321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings"} //21.0.0+
|
||||
FunctionInfo{221, nullptr, "GetForceMonauralOutputFlag", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{222, nullptr, "SetForceMonauralOutputFlag", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{251, nullptr, "GetAccountIdentificationSettings", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{252, nullptr, "SetAccountIdentificationSettings", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{263, nullptr, "AcquireVphymDirtyFlagEventHandle", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{264, nullptr, "GetVphymDirtyFlags", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{282, nullptr, "ConvertToProductModel", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{283, nullptr, "ConvertToProductModelName", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{289, nullptr, "GetDefaultAccountIdentificationFlagSet", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{301, nullptr, "GetPushNotificationDirtyFlags", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{306, nullptr, "GetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{307, nullptr, "SetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{320, nullptr, "SetAccountUserSettings", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings", MakeVersionGate({21,0,0})}
|
||||
);
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
|
||||
: ServiceFramework{system_, "set:sys"}, m_system{system} {
|
||||
: ServiceFramework{system_, "set:sys"} {
|
||||
SetupSettings();
|
||||
|
||||
m_system_settings.region_code =
|
||||
|
||||
@@ -180,7 +180,6 @@ private:
|
||||
void SetSaveNeeded();
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override;
|
||||
Core::System& m_system;
|
||||
SystemSettings m_system_settings{};
|
||||
PrivateSettings m_private_settings{};
|
||||
DeviceSettings m_device_settings{};
|
||||
|
||||
@@ -18,7 +18,16 @@
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/server_manager.h"
|
||||
#include "core/hle/service/sm/sm.h"
|
||||
#include "core/hle/service/sm/sm_controller.h"
|
||||
#include "common/assert.h"
|
||||
#include "common/logging.h"
|
||||
#include "core/core.h"
|
||||
#include "core/hle/kernel/k_client_port.h"
|
||||
#include "core/hle/kernel/k_port.h"
|
||||
#include "core/hle/kernel/k_scoped_resource_reservation.h"
|
||||
#include "core/hle/kernel/k_server_session.h"
|
||||
#include "core/hle/kernel/k_session.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/server_manager.h"
|
||||
|
||||
namespace Service::SM {
|
||||
|
||||
@@ -27,6 +36,116 @@ constexpr Result ResultAlreadyRegistered(ErrorModule::SM, 4);
|
||||
constexpr Result ResultInvalidServiceName(ErrorModule::SM, 6);
|
||||
constexpr Result ResultNotRegistered(ErrorModule::SM, 7);
|
||||
|
||||
class Controller final : public ServiceFramework<Controller> {
|
||||
public:
|
||||
// https://switchbrew.org/wiki/IPC_Marshalling
|
||||
explicit Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {}
|
||||
~Controller() override = default;
|
||||
|
||||
void ConvertCurrentObjectToDomain(HLERequestContext& ctx) {
|
||||
ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain");
|
||||
LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId());
|
||||
ctx.GetManager()->ConvertToDomainOnRequestEnd();
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.Push<u32>(1); // Converted sessions start with 1 request handler
|
||||
}
|
||||
|
||||
void CloneCurrentObject(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
auto session_manager = ctx.GetManager();
|
||||
|
||||
// FIXME: this is duplicated from the SVC, it should just call it instead
|
||||
// once this is a proper process
|
||||
|
||||
// Reserve a new session from the process resource limit.
|
||||
Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax);
|
||||
ASSERT(session_reservation.Succeeded());
|
||||
|
||||
// Create the session.
|
||||
Kernel::KSession* session = Kernel::KSession::Create(kernel);
|
||||
ASSERT(session != nullptr);
|
||||
|
||||
// Initialize the session.
|
||||
session->Initialize(kernel, nullptr, 0);
|
||||
|
||||
// Commit the session reservation.
|
||||
session_reservation.Commit();
|
||||
|
||||
// Register the session.
|
||||
Kernel::KSession::Register(kernel, session);
|
||||
|
||||
// Register with server manager.
|
||||
session_manager->GetServerManager().RegisterSession(&session->GetServerSession(),
|
||||
session_manager);
|
||||
|
||||
// We succeeded.
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.PushMoveObjects(ctx, session->GetClientSession());
|
||||
}
|
||||
|
||||
void CloneCurrentObjectEx(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
CloneCurrentObject(ctx);
|
||||
}
|
||||
|
||||
void QueryPointerBufferSize(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
auto* process = Kernel::GetCurrentProcessPointer(kernel);
|
||||
ASSERT(process != nullptr);
|
||||
|
||||
u32 buffer_size = process->GetPointerBufferSize();
|
||||
if (buffer_size > (std::numeric_limits<u16>::max)()) {
|
||||
LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping");
|
||||
buffer_size = (std::numeric_limits<u16>::max)();
|
||||
}
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.Push<u16>(static_cast<u16>(buffer_size));
|
||||
}
|
||||
|
||||
void SetPointerBufferSize(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
auto* process = Kernel::GetCurrentProcessPointer(kernel);
|
||||
ASSERT(process != nullptr);
|
||||
|
||||
IPC::RequestParser rp{ctx};
|
||||
|
||||
u32 requested_size = rp.PopRaw<u32>();
|
||||
|
||||
if (requested_size > (std::numeric_limits<u16>::max)()) {
|
||||
LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF");
|
||||
requested_size = (std::numeric_limits<u16>::max)();
|
||||
}
|
||||
|
||||
process->SetPointerBufferSize(requested_size);
|
||||
|
||||
LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size);
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 2};
|
||||
rb.Push(ResultSuccess);
|
||||
}
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"},
|
||||
FunctionInfo{1, nullptr, "CopyFromCurrentDomain"},
|
||||
FunctionInfo{2, &Controller::CloneCurrentObject, "CloneCurrentObject"},
|
||||
FunctionInfo{3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"},
|
||||
FunctionInfo{4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"},
|
||||
FunctionInfo{5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"} //TODO: where does this come from
|
||||
);
|
||||
};
|
||||
|
||||
ServiceManager::ServiceManager(Kernel::KernelCore& kernel_) : kernel{kernel_} {
|
||||
controller_interface = std::make_unique<Controller>(kernel.System());
|
||||
}
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "common/assert.h"
|
||||
#include "common/logging.h"
|
||||
#include "core/core.h"
|
||||
#include "core/hle/kernel/k_client_port.h"
|
||||
#include "core/hle/kernel/k_port.h"
|
||||
#include "core/hle/kernel/k_scoped_resource_reservation.h"
|
||||
#include "core/hle/kernel/k_server_session.h"
|
||||
#include "core/hle/kernel/k_session.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/server_manager.h"
|
||||
#include "core/hle/service/sm/sm_controller.h"
|
||||
|
||||
namespace Service::SM {
|
||||
|
||||
void Controller::ConvertCurrentObjectToDomain(HLERequestContext& ctx) {
|
||||
ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain");
|
||||
LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId());
|
||||
ctx.GetManager()->ConvertToDomainOnRequestEnd();
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.Push<u32>(1); // Converted sessions start with 1 request handler
|
||||
}
|
||||
|
||||
void Controller::CloneCurrentObject(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
auto session_manager = ctx.GetManager();
|
||||
|
||||
// FIXME: this is duplicated from the SVC, it should just call it instead
|
||||
// once this is a proper process
|
||||
|
||||
// Reserve a new session from the process resource limit.
|
||||
Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax);
|
||||
ASSERT(session_reservation.Succeeded());
|
||||
|
||||
// Create the session.
|
||||
Kernel::KSession* session = Kernel::KSession::Create(kernel);
|
||||
ASSERT(session != nullptr);
|
||||
|
||||
// Initialize the session.
|
||||
session->Initialize(kernel, nullptr, 0);
|
||||
|
||||
// Commit the session reservation.
|
||||
session_reservation.Commit();
|
||||
|
||||
// Register the session.
|
||||
Kernel::KSession::Register(kernel, session);
|
||||
|
||||
// Register with server manager.
|
||||
session_manager->GetServerManager().RegisterSession(&session->GetServerSession(),
|
||||
session_manager);
|
||||
|
||||
// We succeeded.
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.PushMoveObjects(ctx, session->GetClientSession());
|
||||
}
|
||||
|
||||
void Controller::CloneCurrentObjectEx(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
CloneCurrentObject(ctx);
|
||||
}
|
||||
|
||||
void Controller::QueryPointerBufferSize(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
auto* process = Kernel::GetCurrentProcessPointer(kernel);
|
||||
ASSERT(process != nullptr);
|
||||
|
||||
u32 buffer_size = process->GetPointerBufferSize();
|
||||
if (buffer_size > (std::numeric_limits<u16>::max)()) {
|
||||
LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping");
|
||||
buffer_size = (std::numeric_limits<u16>::max)();
|
||||
}
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.Push<u16>(static_cast<u16>(buffer_size));
|
||||
}
|
||||
|
||||
void Controller::SetPointerBufferSize(HLERequestContext& ctx) {
|
||||
LOG_DEBUG(Service, "called");
|
||||
|
||||
auto* process = Kernel::GetCurrentProcessPointer(kernel);
|
||||
ASSERT(process != nullptr);
|
||||
|
||||
IPC::RequestParser rp{ctx};
|
||||
|
||||
u32 requested_size = rp.PopRaw<u32>();
|
||||
|
||||
if (requested_size > (std::numeric_limits<u16>::max)()) {
|
||||
LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF");
|
||||
requested_size = (std::numeric_limits<u16>::max)();
|
||||
}
|
||||
|
||||
process->SetPointerBufferSize(requested_size);
|
||||
|
||||
LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size);
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 2};
|
||||
rb.Push(ResultSuccess);
|
||||
}
|
||||
|
||||
|
||||
// https://switchbrew.org/wiki/IPC_Marshalling
|
||||
Controller::Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {
|
||||
}
|
||||
|
||||
Controller::~Controller() = default;
|
||||
|
||||
} // namespace Service::SM
|
||||
@@ -1,42 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Core {
|
||||
class System;
|
||||
}
|
||||
|
||||
namespace Service::SM {
|
||||
|
||||
class Controller final : public ServiceFramework<Controller> {
|
||||
public:
|
||||
explicit Controller(Core::System& system_);
|
||||
~Controller() override;
|
||||
|
||||
private:
|
||||
void ConvertCurrentObjectToDomain(HLERequestContext& ctx);
|
||||
void CloneCurrentObject(HLERequestContext& ctx);
|
||||
void CloneCurrentObjectEx(HLERequestContext& ctx);
|
||||
void QueryPointerBufferSize(HLERequestContext& ctx);
|
||||
void SetPointerBufferSize(HLERequestContext& ctx);
|
||||
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"},
|
||||
FunctionInfo{1, nullptr, "CopyFromCurrentDomain"},
|
||||
FunctionInfo{2, &Controller::CloneCurrentObject, "CloneCurrentObject"},
|
||||
FunctionInfo{3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"},
|
||||
FunctionInfo{4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"},
|
||||
FunctionInfo{5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"} //TODO: where does this come from
|
||||
);
|
||||
};
|
||||
|
||||
} // namespace Service::SM
|
||||
@@ -223,23 +223,23 @@ protected:
|
||||
FunctionInfo{26, &BSD_USA::Close, "Close"},
|
||||
FunctionInfo{27, &BSD_USA::DuplicateSocket, "DuplicateSocket"},
|
||||
FunctionInfo{28, nullptr, "GetResourceStatistics"},
|
||||
FunctionInfo{29, nullptr, "RecvMMsg"}, //3.0.0+
|
||||
FunctionInfo{30, nullptr, "SendMMsg"}, //3.0.0+
|
||||
FunctionInfo{31, &BSD_USA::EventFd, "EventFd"}, //7.0.0+
|
||||
FunctionInfo{32, nullptr, "RegisterResourceStatisticsName"}, //7.0.0+
|
||||
FunctionInfo{33, nullptr, "RegisterClientShared"}, //10.0.0+
|
||||
FunctionInfo{34, nullptr, "GetSocketStatistics"}, //15.0.0+
|
||||
FunctionInfo{35, nullptr, "NifIoctl"}, //17.0.0+
|
||||
FunctionInfo{36, nullptr, "Unknown36"}, //18.0.0+
|
||||
FunctionInfo{37, nullptr, "Unknown37"}, //18.0.0+
|
||||
FunctionInfo{38, nullptr, "Unknown38"}, //18.0.0+
|
||||
FunctionInfo{39, nullptr, "Unknown39"}, //20.0.0+
|
||||
FunctionInfo{40, nullptr, "Unknown40"}, //20.0.0+
|
||||
FunctionInfo{41, nullptr, "Unknown41"}, //21.0.0+
|
||||
FunctionInfo{42, nullptr, "Unknown42"}, //21.0.0+
|
||||
FunctionInfo{43, nullptr, "Unknown43"}, //21.0.0+
|
||||
FunctionInfo{200, nullptr, "SetThreadCoreMask"}, //15.0.0+
|
||||
FunctionInfo{201, nullptr, "GetThreadCoreMask"} //15.0.0+
|
||||
FunctionInfo{29, nullptr, "RecvMMsg", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{30, nullptr, "SendMMsg", MakeVersionGate({3,0,0})},
|
||||
FunctionInfo{31, &BSD_USA::EventFd, "EventFd", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{32, nullptr, "RegisterResourceStatisticsName", MakeVersionGate({7,0,0})},
|
||||
FunctionInfo{33, nullptr, "RegisterClientShared", MakeVersionGate({10,0,0})},
|
||||
FunctionInfo{34, nullptr, "GetSocketStatistics", MakeVersionGate({15,0,0})},
|
||||
FunctionInfo{35, nullptr, "NifIoctl", MakeVersionGate({17,0,0})},
|
||||
FunctionInfo{36, nullptr, "Unknown36", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{37, nullptr, "Unknown37", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{38, nullptr, "Unknown38", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{39, nullptr, "Unknown39", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{40, nullptr, "Unknown40", MakeVersionGate({20,0,0})},
|
||||
FunctionInfo{41, nullptr, "Unknown41", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{42, nullptr, "Unknown42", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})},
|
||||
FunctionInfo{200, nullptr, "SetThreadCoreMask", MakeVersionGate({15,0,0})},
|
||||
FunctionInfo{201, nullptr, "GetThreadCoreMask", MakeVersionGate({15,0,0})}
|
||||
);
|
||||
bool is_user = false;
|
||||
};
|
||||
|
||||
@@ -20,20 +20,20 @@ public:
|
||||
explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "AddEndpoint"},
|
||||
FunctionInfo{1, nullptr, "GetSetupEvent"},
|
||||
FunctionInfo{2, nullptr, "GetSetupPacket"},
|
||||
FunctionInfo{3, nullptr, "Enable"},
|
||||
FunctionInfo{4, nullptr, "Disable"},
|
||||
FunctionInfo{5, nullptr, "CtrlIn"},
|
||||
FunctionInfo{6, nullptr, "CtrlOut"},
|
||||
FunctionInfo{7, nullptr, "GetCtrlInCompletionEvent"},
|
||||
FunctionInfo{8, nullptr, "GetCtrlInUrbReport"},
|
||||
FunctionInfo{9, nullptr, "GetCtrlOutCompletionEvent"},
|
||||
FunctionInfo{10, nullptr, "GetCtrlOutUrbReport"},
|
||||
FunctionInfo{11, nullptr, "CtrlStall"},
|
||||
FunctionInfo{12, nullptr, "AppendConfigurationData"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "AddEndpoint"},
|
||||
FunctionInfo{1, nullptr, "GetSetupEvent"},
|
||||
FunctionInfo{2, nullptr, "GetSetupPacket"},
|
||||
FunctionInfo{3, nullptr, "Enable"},
|
||||
FunctionInfo{4, nullptr, "Disable"},
|
||||
FunctionInfo{5, nullptr, "CtrlIn"},
|
||||
FunctionInfo{6, nullptr, "CtrlOut"},
|
||||
FunctionInfo{7, nullptr, "GetCtrlInCompletionEvent"},
|
||||
FunctionInfo{8, nullptr, "GetCtrlInUrbReport"},
|
||||
FunctionInfo{9, nullptr, "GetCtrlOutCompletionEvent"},
|
||||
FunctionInfo{10, nullptr, "GetCtrlOutUrbReport"},
|
||||
FunctionInfo{11, nullptr, "CtrlStall"},
|
||||
FunctionInfo{12, nullptr, "AppendConfigurationData"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -44,8 +44,8 @@ public:
|
||||
explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "OpenDsService"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "OpenDsService"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -57,16 +57,16 @@ public:
|
||||
: ServiceFramework{system_, "IClientEpSession"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "ReOpen"},
|
||||
FunctionInfo{1, nullptr, "Close"},
|
||||
FunctionInfo{2, nullptr, "GetCompletionEvent"},
|
||||
FunctionInfo{3, nullptr, "PopulateRing"},
|
||||
FunctionInfo{4, nullptr, "PostBufferAsync"},
|
||||
FunctionInfo{5, nullptr, "GetXferReport"},
|
||||
FunctionInfo{6, nullptr, "PostBufferMultiAsync"},
|
||||
FunctionInfo{7, nullptr, "CreateSmmuSpace"},
|
||||
FunctionInfo{8, nullptr, "ShareReportRing"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "ReOpen"},
|
||||
FunctionInfo{1, nullptr, "Close"},
|
||||
FunctionInfo{2, nullptr, "GetCompletionEvent"},
|
||||
FunctionInfo{3, nullptr, "PopulateRing"},
|
||||
FunctionInfo{4, nullptr, "PostBufferAsync"},
|
||||
FunctionInfo{5, nullptr, "GetXferReport"},
|
||||
FunctionInfo{6, nullptr, "PostBufferMultiAsync"},
|
||||
FunctionInfo{7, nullptr, "CreateSmmuSpace"},
|
||||
FunctionInfo{8, nullptr, "ShareReportRing"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -78,17 +78,17 @@ public:
|
||||
: ServiceFramework{system_, "IClientIfSession"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "GetStateChangeEvent"},
|
||||
FunctionInfo{1, nullptr, "SetInterface"},
|
||||
FunctionInfo{2, nullptr, "GetInterface"},
|
||||
FunctionInfo{3, nullptr, "GetAlternateInterface"},
|
||||
FunctionInfo{4, nullptr, "GetCurrentFrame"},
|
||||
FunctionInfo{5, nullptr, "CtrlXferAsync"},
|
||||
FunctionInfo{6, nullptr, "GetCtrlXferCompletionEvent"},
|
||||
FunctionInfo{7, nullptr, "GetCtrlXferReport"},
|
||||
FunctionInfo{8, nullptr, "ResetDevice"},
|
||||
FunctionInfo{9, nullptr, "OpenUsbEp"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "GetStateChangeEvent"},
|
||||
FunctionInfo{1, nullptr, "SetInterface"},
|
||||
FunctionInfo{2, nullptr, "GetInterface"},
|
||||
FunctionInfo{3, nullptr, "GetAlternateInterface"},
|
||||
FunctionInfo{4, nullptr, "GetCurrentFrame"},
|
||||
FunctionInfo{5, nullptr, "CtrlXferAsync"},
|
||||
FunctionInfo{6, nullptr, "GetCtrlXferCompletionEvent"},
|
||||
FunctionInfo{7, nullptr, "GetCtrlXferReport"},
|
||||
FunctionInfo{8, nullptr, "ResetDevice"},
|
||||
FunctionInfo{9, nullptr, "OpenUsbEp"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -99,16 +99,16 @@ public:
|
||||
explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "BindClientProcess"},
|
||||
FunctionInfo{1, nullptr, "QueryAllInterfaces"},
|
||||
FunctionInfo{2, nullptr, "QueryAvailableInterfaces"},
|
||||
FunctionInfo{3, nullptr, "QueryAcquiredInterfaces"},
|
||||
FunctionInfo{4, nullptr, "CreateInterfaceAvailableEvent"},
|
||||
FunctionInfo{5, nullptr, "DestroyInterfaceAvailableEvent"},
|
||||
FunctionInfo{6, nullptr, "GetInterfaceStateChangeEvent"},
|
||||
FunctionInfo{7, nullptr, "AcquireUsbIf"},
|
||||
FunctionInfo{8, nullptr, "SetTestMode"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "BindClientProcess"},
|
||||
FunctionInfo{1, nullptr, "QueryAllInterfaces"},
|
||||
FunctionInfo{2, nullptr, "QueryAvailableInterfaces"},
|
||||
FunctionInfo{3, nullptr, "QueryAcquiredInterfaces"},
|
||||
FunctionInfo{4, nullptr, "CreateInterfaceAvailableEvent"},
|
||||
FunctionInfo{5, nullptr, "DestroyInterfaceAvailableEvent"},
|
||||
FunctionInfo{6, nullptr, "GetInterfaceStateChangeEvent"},
|
||||
FunctionInfo{7, nullptr, "AcquireUsbIf"},
|
||||
FunctionInfo{8, nullptr, "SetTestMode"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -119,14 +119,14 @@ public:
|
||||
explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "BindNoticeEvent"},
|
||||
FunctionInfo{1, nullptr, "UnbindNoticeEvent"},
|
||||
FunctionInfo{2, nullptr, "GetStatus"},
|
||||
FunctionInfo{3, nullptr, "GetNotice"},
|
||||
FunctionInfo{4, nullptr, "EnablePowerRequestNotice"},
|
||||
FunctionInfo{5, nullptr, "DisablePowerRequestNotice"},
|
||||
FunctionInfo{6, nullptr, "ReplyPowerRequest"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "BindNoticeEvent"},
|
||||
FunctionInfo{1, nullptr, "UnbindNoticeEvent"},
|
||||
FunctionInfo{2, nullptr, "GetStatus"},
|
||||
FunctionInfo{3, nullptr, "GetNotice"},
|
||||
FunctionInfo{4, nullptr, "EnablePowerRequestNotice"},
|
||||
FunctionInfo{5, nullptr, "DisablePowerRequestNotice"},
|
||||
FunctionInfo{6, nullptr, "ReplyPowerRequest"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -160,16 +160,16 @@ public:
|
||||
: ServiceFramework{system_, "IPdCradleSession"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "SetCradleVdo"},
|
||||
FunctionInfo{1, nullptr, "GetCradleVdo"},
|
||||
FunctionInfo{2, nullptr, "ResetCradleUsbHub"},
|
||||
FunctionInfo{3, nullptr, "GetHostPdcFirmwareType"},
|
||||
FunctionInfo{4, nullptr, "GetHostPdcFirmwareRevision"},
|
||||
FunctionInfo{5, nullptr, "GetHostPdcManufactureId"},
|
||||
FunctionInfo{6, nullptr, "GetHostPdcDeviceId"},
|
||||
FunctionInfo{7, nullptr, "EnableCradleRecovery"},
|
||||
FunctionInfo{8, nullptr, "DisableCradleRecovery"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "SetCradleVdo"},
|
||||
FunctionInfo{1, nullptr, "GetCradleVdo"},
|
||||
FunctionInfo{2, nullptr, "ResetCradleUsbHub"},
|
||||
FunctionInfo{3, nullptr, "GetHostPdcFirmwareType"},
|
||||
FunctionInfo{4, nullptr, "GetHostPdcFirmwareRevision"},
|
||||
FunctionInfo{5, nullptr, "GetHostPdcManufactureId"},
|
||||
FunctionInfo{6, nullptr, "GetHostPdcDeviceId"},
|
||||
FunctionInfo{7, nullptr, "EnableCradleRecovery"},
|
||||
FunctionInfo{8, nullptr, "DisableCradleRecovery"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -202,13 +202,13 @@ public:
|
||||
explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "GetPowerEvent"},
|
||||
FunctionInfo{1, nullptr, "GetPowerState"},
|
||||
FunctionInfo{2, nullptr, "GetDataEvent"},
|
||||
FunctionInfo{3, nullptr, "GetDataRole"},
|
||||
FunctionInfo{4, nullptr, "SetDiagData"},
|
||||
FunctionInfo{5, nullptr, "GetDiagData"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "GetPowerEvent"},
|
||||
FunctionInfo{1, nullptr, "GetPowerState"},
|
||||
FunctionInfo{2, nullptr, "GetDataEvent"},
|
||||
FunctionInfo{3, nullptr, "GetDataRole"},
|
||||
FunctionInfo{4, nullptr, "SetDiagData"},
|
||||
FunctionInfo{5, nullptr, "GetDiagData"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -219,8 +219,8 @@ public:
|
||||
explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "OpenManufactureSession"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "OpenManufactureSession"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -231,9 +231,9 @@ public:
|
||||
explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "ImportQuirkDevices"},
|
||||
FunctionInfo{1, nullptr, "HasQuirk"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "ImportQuirkDevices"},
|
||||
FunctionInfo{1, nullptr, "HasQuirk"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
@@ -244,9 +244,9 @@ public:
|
||||
explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} {}
|
||||
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "GetTopologyChangeEvent"},
|
||||
FunctionInfo{1, nullptr, "GetFlattenedTopology"}
|
||||
);
|
||||
FunctionInfo{0, nullptr, "GetTopologyChangeEvent"},
|
||||
FunctionInfo{1, nullptr, "GetFlattenedTopology"}
|
||||
);
|
||||
std::optional<FunctionInfoBase> FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
|
||||
@@ -18,6 +18,10 @@ class KPageGroup;
|
||||
class KReadableEvent;
|
||||
} // namespace Kernel
|
||||
|
||||
namespace Core {
|
||||
class System;
|
||||
}
|
||||
|
||||
namespace Service::android {
|
||||
class BufferQueueProducer;
|
||||
}
|
||||
|
||||
+140
-140
@@ -22,103 +22,103 @@ public:
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "OpenMasterMode" },
|
||||
FunctionInfo{0, nullptr, "OpenMode_2" },
|
||||
FunctionInfo{1, nullptr, "CloseMasterMode" },
|
||||
FunctionInfo{1, nullptr, "CloseMode_2" },
|
||||
FunctionInfo{2, nullptr, "OpenClientMode" },
|
||||
FunctionInfo{2, nullptr, "GetMacAddress_2" },
|
||||
FunctionInfo{3, nullptr, "CloseClientMode" },
|
||||
FunctionInfo{3, nullptr, "CreateBss" },
|
||||
FunctionInfo{4, nullptr, "OpenSpectatorMode" },
|
||||
FunctionInfo{4, nullptr, "DestroyBss" },
|
||||
FunctionInfo{5, nullptr, "CloseSpectatorMode" },
|
||||
FunctionInfo{5, nullptr, "StartScan_2" },
|
||||
FunctionInfo{6, nullptr, "GetMacAddress_2" },
|
||||
FunctionInfo{6, nullptr, "StopScan_2" },
|
||||
FunctionInfo{7, nullptr, "CreateBss" },
|
||||
FunctionInfo{7, nullptr, "Connect_2" },
|
||||
FunctionInfo{8, nullptr, "DestroyBss" },
|
||||
FunctionInfo{8, nullptr, "CancelConnect_2" },
|
||||
FunctionInfo{9, nullptr, "StartScan_2" },
|
||||
FunctionInfo{9, nullptr, "Join" },
|
||||
FunctionInfo{10, nullptr, "StopScan_2" },
|
||||
FunctionInfo{10, nullptr, "CancelJoin" },
|
||||
FunctionInfo{11, nullptr, "Connect_2" },
|
||||
FunctionInfo{11, nullptr, "Disconnect_2" },
|
||||
FunctionInfo{12, nullptr, "CancelConnect_2" },
|
||||
FunctionInfo{12, nullptr, "SetBeaconLostCount" },
|
||||
FunctionInfo{13, nullptr, "Join" },
|
||||
FunctionInfo{13, nullptr, "GetSystemEvent_2" },
|
||||
FunctionInfo{14, nullptr, "CancelJoin" },
|
||||
FunctionInfo{14, nullptr, "GetConnectionStatus_2" },
|
||||
FunctionInfo{15, nullptr, "Disconnect_2" },
|
||||
FunctionInfo{15, nullptr, "GetClientStatus" },
|
||||
FunctionInfo{16, nullptr, "SetBeaconLostCount" },
|
||||
FunctionInfo{16, nullptr, "GetBssIndicationEvent" },
|
||||
FunctionInfo{17, nullptr, "GetSystemEvent_2" },
|
||||
FunctionInfo{17, nullptr, "GetBssIndicationInfo" },
|
||||
FunctionInfo{18, nullptr, "GetConnectionStatus_2" },
|
||||
FunctionInfo{18, nullptr, "GetState_2" },
|
||||
FunctionInfo{19, nullptr, "GetClientStatus" },
|
||||
FunctionInfo{19, nullptr, "GetAllowedChannels" },
|
||||
FunctionInfo{20, nullptr, "GetBssIndicationEvent" },
|
||||
FunctionInfo{20, nullptr, "AddIe" },
|
||||
FunctionInfo{21, nullptr, "GetBssIndicationInfo" },
|
||||
FunctionInfo{21, nullptr, "DeleteIe" },
|
||||
FunctionInfo{22, nullptr, "GetState_2" },
|
||||
FunctionInfo{22, nullptr, "PutFrameRaw" },
|
||||
FunctionInfo{23, nullptr, "GetAllowedChannels" },
|
||||
FunctionInfo{23, nullptr, "CancelGetFrame" },
|
||||
FunctionInfo{24, nullptr, "AddIe" },
|
||||
FunctionInfo{24, nullptr, "CreateRxEntry" },
|
||||
FunctionInfo{25, nullptr, "DeleteIe" },
|
||||
FunctionInfo{25, nullptr, "DeleteRxEntry" },
|
||||
FunctionInfo{26, nullptr, "PutFrameRaw" },
|
||||
FunctionInfo{26, nullptr, "AddEthertypeToRxEntry" },
|
||||
FunctionInfo{27, nullptr, "CancelGetFrame" },
|
||||
FunctionInfo{27, nullptr, "DeleteEthertypeFromRxEntry" },
|
||||
FunctionInfo{28, nullptr, "CreateRxEntry" },
|
||||
FunctionInfo{28, nullptr, "AddMatchingDataToRxEntry" },
|
||||
FunctionInfo{29, nullptr, "DeleteRxEntry" },
|
||||
FunctionInfo{29, nullptr, "RemoveMatchingDataFromRxEntry" },
|
||||
FunctionInfo{30, nullptr, "AddEthertypeToRxEntry" },
|
||||
FunctionInfo{30, nullptr, "GetScanResult_2" },
|
||||
FunctionInfo{31, nullptr, "DeleteEthertypeFromRxEntry" },
|
||||
FunctionInfo{31, nullptr, "PutActionFrameOneShot" },
|
||||
FunctionInfo{32, nullptr, "AddMatchingDataToRxEntry" },
|
||||
FunctionInfo{32, nullptr, "SetActionFrameWithBeacon" },
|
||||
FunctionInfo{33, nullptr, "RemoveMatchingDataFromRxEntry" },
|
||||
FunctionInfo{33, nullptr, "CancelActionFrameWithBeacon" },
|
||||
FunctionInfo{34, nullptr, "GetScanResult_2" },
|
||||
FunctionInfo{34, nullptr, "CreateRxEntryForActionFrame" },
|
||||
FunctionInfo{35, nullptr, "PutActionFrameOneShot" },
|
||||
FunctionInfo{35, nullptr, "DeleteRxEntryForActionFrame" },
|
||||
FunctionInfo{36, nullptr, "SetActionFrameWithBeacon" },
|
||||
FunctionInfo{36, nullptr, "AddSubtypeToRxEntryForActionFrame" },
|
||||
FunctionInfo{37, nullptr, "CancelActionFrameWithBeacon" },
|
||||
FunctionInfo{37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" },
|
||||
FunctionInfo{38, nullptr, "CreateRxEntryForActionFrame" },
|
||||
FunctionInfo{38, nullptr, "CancelGetActionFrame" },
|
||||
FunctionInfo{39, nullptr, "DeleteRxEntryForActionFrame" },
|
||||
FunctionInfo{39, nullptr, "GetRssi_2" },
|
||||
FunctionInfo{40, nullptr, "AddSubtypeToRxEntryForActionFrame" },
|
||||
FunctionInfo{40, nullptr, "SetMaxAssociationNumber" },
|
||||
FunctionInfo{41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" },
|
||||
FunctionInfo{41, nullptr, "Cmd41" },
|
||||
FunctionInfo{42, nullptr, "CancelGetActionFrame" },
|
||||
FunctionInfo{42, nullptr, "Cmd42" },
|
||||
FunctionInfo{43, nullptr, "GetRssi_2" },
|
||||
FunctionInfo{43, nullptr, "Cmd43" },
|
||||
FunctionInfo{44, nullptr, "SetMaxAssociationNumber" },
|
||||
FunctionInfo{45, nullptr, "OpenLcsMasterMode" },
|
||||
FunctionInfo{46, nullptr, "CloseLcsMasterMode" },
|
||||
FunctionInfo{47, nullptr, "OpenLcsClientMode" },
|
||||
FunctionInfo{48, nullptr, "CloseLcsClientMode" },
|
||||
FunctionInfo{49, nullptr, "GetChannelStats" },
|
||||
FunctionInfo{50, nullptr, "Cmd50" },
|
||||
FunctionInfo{51, nullptr, "Cmd51" },
|
||||
FunctionInfo{52, nullptr, "Cmd52" }
|
||||
FunctionInfo{0, nullptr, "OpenMasterMode"},
|
||||
FunctionInfo{0, nullptr, "OpenMode_2"},
|
||||
FunctionInfo{1, nullptr, "CloseMasterMode"},
|
||||
FunctionInfo{1, nullptr, "CloseMode_2"},
|
||||
FunctionInfo{2, nullptr, "OpenClientMode"},
|
||||
FunctionInfo{2, nullptr, "GetMacAddress_2"},
|
||||
FunctionInfo{3, nullptr, "CloseClientMode"},
|
||||
FunctionInfo{3, nullptr, "CreateBss"},
|
||||
FunctionInfo{4, nullptr, "OpenSpectatorMode"},
|
||||
FunctionInfo{4, nullptr, "DestroyBss"},
|
||||
FunctionInfo{5, nullptr, "CloseSpectatorMode"},
|
||||
FunctionInfo{5, nullptr, "StartScan_2"},
|
||||
FunctionInfo{6, nullptr, "GetMacAddress_2"},
|
||||
FunctionInfo{6, nullptr, "StopScan_2"},
|
||||
FunctionInfo{7, nullptr, "CreateBss"},
|
||||
FunctionInfo{7, nullptr, "Connect_2"},
|
||||
FunctionInfo{8, nullptr, "DestroyBss"},
|
||||
FunctionInfo{8, nullptr, "CancelConnect_2"},
|
||||
FunctionInfo{9, nullptr, "StartScan_2"},
|
||||
FunctionInfo{9, nullptr, "Join"},
|
||||
FunctionInfo{10, nullptr, "StopScan_2"},
|
||||
FunctionInfo{10, nullptr, "CancelJoin"},
|
||||
FunctionInfo{11, nullptr, "Connect_2"},
|
||||
FunctionInfo{11, nullptr, "Disconnect_2"},
|
||||
FunctionInfo{12, nullptr, "CancelConnect_2"},
|
||||
FunctionInfo{12, nullptr, "SetBeaconLostCount"},
|
||||
FunctionInfo{13, nullptr, "Join"},
|
||||
FunctionInfo{13, nullptr, "GetSystemEvent_2"},
|
||||
FunctionInfo{14, nullptr, "CancelJoin"},
|
||||
FunctionInfo{14, nullptr, "GetConnectionStatus_2"},
|
||||
FunctionInfo{15, nullptr, "Disconnect_2"},
|
||||
FunctionInfo{15, nullptr, "GetClientStatus"},
|
||||
FunctionInfo{16, nullptr, "SetBeaconLostCount"},
|
||||
FunctionInfo{16, nullptr, "GetBssIndicationEvent"},
|
||||
FunctionInfo{17, nullptr, "GetSystemEvent_2"},
|
||||
FunctionInfo{17, nullptr, "GetBssIndicationInfo"},
|
||||
FunctionInfo{18, nullptr, "GetConnectionStatus_2"},
|
||||
FunctionInfo{18, nullptr, "GetState_2"},
|
||||
FunctionInfo{19, nullptr, "GetClientStatus"},
|
||||
FunctionInfo{19, nullptr, "GetAllowedChannels"},
|
||||
FunctionInfo{20, nullptr, "GetBssIndicationEvent"},
|
||||
FunctionInfo{20, nullptr, "AddIe"},
|
||||
FunctionInfo{21, nullptr, "GetBssIndicationInfo"},
|
||||
FunctionInfo{21, nullptr, "DeleteIe"},
|
||||
FunctionInfo{22, nullptr, "GetState_2"},
|
||||
FunctionInfo{22, nullptr, "PutFrameRaw"},
|
||||
FunctionInfo{23, nullptr, "GetAllowedChannels"},
|
||||
FunctionInfo{23, nullptr, "CancelGetFrame"},
|
||||
FunctionInfo{24, nullptr, "AddIe"},
|
||||
FunctionInfo{24, nullptr, "CreateRxEntry"},
|
||||
FunctionInfo{25, nullptr, "DeleteIe"},
|
||||
FunctionInfo{25, nullptr, "DeleteRxEntry"},
|
||||
FunctionInfo{26, nullptr, "PutFrameRaw"},
|
||||
FunctionInfo{26, nullptr, "AddEthertypeToRxEntry"},
|
||||
FunctionInfo{27, nullptr, "CancelGetFrame"},
|
||||
FunctionInfo{27, nullptr, "DeleteEthertypeFromRxEntry"},
|
||||
FunctionInfo{28, nullptr, "CreateRxEntry"},
|
||||
FunctionInfo{28, nullptr, "AddMatchingDataToRxEntry"},
|
||||
FunctionInfo{29, nullptr, "DeleteRxEntry"},
|
||||
FunctionInfo{29, nullptr, "RemoveMatchingDataFromRxEntry"},
|
||||
FunctionInfo{30, nullptr, "AddEthertypeToRxEntry"},
|
||||
FunctionInfo{30, nullptr, "GetScanResult_2"},
|
||||
FunctionInfo{31, nullptr, "DeleteEthertypeFromRxEntry"},
|
||||
FunctionInfo{31, nullptr, "PutActionFrameOneShot"},
|
||||
FunctionInfo{32, nullptr, "AddMatchingDataToRxEntry"},
|
||||
FunctionInfo{32, nullptr, "SetActionFrameWithBeacon"},
|
||||
FunctionInfo{33, nullptr, "RemoveMatchingDataFromRxEntry"},
|
||||
FunctionInfo{33, nullptr, "CancelActionFrameWithBeacon"},
|
||||
FunctionInfo{34, nullptr, "GetScanResult_2"},
|
||||
FunctionInfo{34, nullptr, "CreateRxEntryForActionFrame"},
|
||||
FunctionInfo{35, nullptr, "PutActionFrameOneShot"},
|
||||
FunctionInfo{35, nullptr, "DeleteRxEntryForActionFrame"},
|
||||
FunctionInfo{36, nullptr, "SetActionFrameWithBeacon"},
|
||||
FunctionInfo{36, nullptr, "AddSubtypeToRxEntryForActionFrame"},
|
||||
FunctionInfo{37, nullptr, "CancelActionFrameWithBeacon"},
|
||||
FunctionInfo{37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"},
|
||||
FunctionInfo{38, nullptr, "CreateRxEntryForActionFrame"},
|
||||
FunctionInfo{38, nullptr, "CancelGetActionFrame"},
|
||||
FunctionInfo{39, nullptr, "DeleteRxEntryForActionFrame"},
|
||||
FunctionInfo{39, nullptr, "GetRssi_2"},
|
||||
FunctionInfo{40, nullptr, "AddSubtypeToRxEntryForActionFrame"},
|
||||
FunctionInfo{40, nullptr, "SetMaxAssociationNumber"},
|
||||
FunctionInfo{41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"},
|
||||
FunctionInfo{41, nullptr, "Cmd41"},
|
||||
FunctionInfo{42, nullptr, "CancelGetActionFrame"},
|
||||
FunctionInfo{42, nullptr, "Cmd42"},
|
||||
FunctionInfo{43, nullptr, "GetRssi_2"},
|
||||
FunctionInfo{43, nullptr, "Cmd43"},
|
||||
FunctionInfo{44, nullptr, "SetMaxAssociationNumber"},
|
||||
FunctionInfo{45, nullptr, "OpenLcsMasterMode"},
|
||||
FunctionInfo{46, nullptr, "CloseLcsMasterMode"},
|
||||
FunctionInfo{47, nullptr, "OpenLcsClientMode"},
|
||||
FunctionInfo{48, nullptr, "CloseLcsClientMode"},
|
||||
FunctionInfo{49, nullptr, "GetChannelStats"},
|
||||
FunctionInfo{50, nullptr, "Cmd50"},
|
||||
FunctionInfo{51, nullptr, "Cmd51"},
|
||||
FunctionInfo{52, nullptr, "Cmd52"}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -174,19 +174,19 @@ public:
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "PutFrameRaw_2" },
|
||||
FunctionInfo{1, nullptr, "CancelGetFrame_2" },
|
||||
FunctionInfo{2, nullptr, "CreateRxEntry_2" },
|
||||
FunctionInfo{3, nullptr, "DeleteRxEntry_2" },
|
||||
FunctionInfo{4, nullptr, "AddEthertypeToRxEntry_2" },
|
||||
FunctionInfo{5, nullptr, "DeleteEthertypeFromRxEntry_2" },
|
||||
FunctionInfo{6, nullptr, "GetMacAddress_3" },
|
||||
FunctionInfo{7, nullptr, "SwitchTsfTimerFunction" },
|
||||
FunctionInfo{8, nullptr, "GetDeltaTimeBetweenSystemAndTsf" },
|
||||
FunctionInfo{9, nullptr, "RegisterSharedMemory" },
|
||||
FunctionInfo{10, nullptr, "UnregisterSharedMemory" },
|
||||
FunctionInfo{11, nullptr, "EnableSharedMemory" },
|
||||
FunctionInfo{12, nullptr, "SetMulticastFilter" }
|
||||
FunctionInfo{0, nullptr, "PutFrameRaw_2"},
|
||||
FunctionInfo{1, nullptr, "CancelGetFrame_2"},
|
||||
FunctionInfo{2, nullptr, "CreateRxEntry_2"},
|
||||
FunctionInfo{3, nullptr, "DeleteRxEntry_2"},
|
||||
FunctionInfo{4, nullptr, "AddEthertypeToRxEntry_2"},
|
||||
FunctionInfo{5, nullptr, "DeleteEthertypeFromRxEntry_2"},
|
||||
FunctionInfo{6, nullptr, "GetMacAddress_3"},
|
||||
FunctionInfo{7, nullptr, "SwitchTsfTimerFunction"},
|
||||
FunctionInfo{8, nullptr, "GetDeltaTimeBetweenSystemAndTsf"},
|
||||
FunctionInfo{9, nullptr, "RegisterSharedMemory"},
|
||||
FunctionInfo{10, nullptr, "UnregisterSharedMemory"},
|
||||
FunctionInfo{11, nullptr, "EnableSharedMemory"},
|
||||
FunctionInfo{12, nullptr, "SetMulticastFilter"}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -200,34 +200,34 @@ public:
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "Cmd0" },
|
||||
FunctionInfo{1, nullptr, "Cmd1" },
|
||||
FunctionInfo{2, nullptr, "Cmd2" },
|
||||
FunctionInfo{3, nullptr, "Cmd3" },
|
||||
FunctionInfo{4, nullptr, "Cmd4" },
|
||||
FunctionInfo{5, nullptr, "Cmd5" },
|
||||
FunctionInfo{6, nullptr, "Cmd6" },
|
||||
FunctionInfo{7, nullptr, "Cmd7" },
|
||||
FunctionInfo{8, nullptr, "Cmd8" },
|
||||
FunctionInfo{9, nullptr, "Cmd9" },
|
||||
FunctionInfo{10, nullptr, "Cmd10" },
|
||||
FunctionInfo{11, nullptr, "Cmd11" },
|
||||
FunctionInfo{12, nullptr, "Cmd12" },
|
||||
FunctionInfo{13, nullptr, "Cmd13" },
|
||||
FunctionInfo{14, nullptr, "Cmd14" },
|
||||
FunctionInfo{15, nullptr, "Cmd15" },
|
||||
FunctionInfo{16, nullptr, "Cmd16" },
|
||||
FunctionInfo{17, nullptr, "Cmd17" },
|
||||
FunctionInfo{18, nullptr, "Cmd18" },
|
||||
FunctionInfo{19, nullptr, "Cmd19" },
|
||||
FunctionInfo{20, nullptr, "Cmd20" },
|
||||
FunctionInfo{21, nullptr, "Cmd21" },
|
||||
FunctionInfo{22, nullptr, "Cmd22" },
|
||||
FunctionInfo{23, nullptr, "Cmd23" },
|
||||
FunctionInfo{24, nullptr, "Cmd24" },
|
||||
FunctionInfo{25, nullptr, "Cmd25" },
|
||||
FunctionInfo{26, nullptr, "Cmd26" },
|
||||
FunctionInfo{27, nullptr, "Cmd27" }
|
||||
FunctionInfo{0, nullptr, "Cmd0"},
|
||||
FunctionInfo{1, nullptr, "Cmd1"},
|
||||
FunctionInfo{2, nullptr, "Cmd2"},
|
||||
FunctionInfo{3, nullptr, "Cmd3"},
|
||||
FunctionInfo{4, nullptr, "Cmd4"},
|
||||
FunctionInfo{5, nullptr, "Cmd5"},
|
||||
FunctionInfo{6, nullptr, "Cmd6"},
|
||||
FunctionInfo{7, nullptr, "Cmd7"},
|
||||
FunctionInfo{8, nullptr, "Cmd8"},
|
||||
FunctionInfo{9, nullptr, "Cmd9"},
|
||||
FunctionInfo{10, nullptr, "Cmd10"},
|
||||
FunctionInfo{11, nullptr, "Cmd11"},
|
||||
FunctionInfo{12, nullptr, "Cmd12"},
|
||||
FunctionInfo{13, nullptr, "Cmd13"},
|
||||
FunctionInfo{14, nullptr, "Cmd14"},
|
||||
FunctionInfo{15, nullptr, "Cmd15"},
|
||||
FunctionInfo{16, nullptr, "Cmd16"},
|
||||
FunctionInfo{17, nullptr, "Cmd17"},
|
||||
FunctionInfo{18, nullptr, "Cmd18"},
|
||||
FunctionInfo{19, nullptr, "Cmd19"},
|
||||
FunctionInfo{20, nullptr, "Cmd20"},
|
||||
FunctionInfo{21, nullptr, "Cmd21"},
|
||||
FunctionInfo{22, nullptr, "Cmd22"},
|
||||
FunctionInfo{23, nullptr, "Cmd23"},
|
||||
FunctionInfo{24, nullptr, "Cmd24"},
|
||||
FunctionInfo{25, nullptr, "Cmd25"},
|
||||
FunctionInfo{26, nullptr, "Cmd26"},
|
||||
FunctionInfo{27, nullptr, "Cmd27"}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -241,8 +241,8 @@ public:
|
||||
return HandlerTableGenerateWithFind(key, functions);
|
||||
}
|
||||
static constexpr auto functions = CreateStaticMap(
|
||||
FunctionInfo{0, nullptr, "CreateWirelessCommunicationService" },
|
||||
FunctionInfo{1, nullptr, "CreatePrivateWirelessCommunicationService" }
|
||||
FunctionInfo{0, nullptr, "CreateWirelessCommunicationService"},
|
||||
FunctionInfo{1, nullptr, "CreatePrivateWirelessCommunicationService"}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user