aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJPikachu <jpikachu@eden-emu.dev>2025-10-24 12:34:49 +0200
committercrueter <crueter@eden-emu.dev>2025-10-24 12:34:49 +0200
commitb5d54b8df73bf42d396a9b2a5e2e8d71e191848b (patch)
tree57227b5105f023a1c65bf56d5ae5c51fd910c275 /src
parentcd4bcb91ccc485a751c276616ef74d56d318f121 (diff)
[acc, ldn] Implement CreateClientProcessMonitor and stub LoadIdTokenCache changes (#2810)
- IManagerForApplication/SystemService: from 19.0.0+ LoadIdTokenCache (3) is now LoadIdTokenCacheDeprecated (3) - IManagerForApplication/SystemService: LoadIdTokenCache (4) stubbed - Implement CreateClientProcessMonitor to ldn:s and ldn:u - Create new client_process_monitor.cpp/.h files - Change non-domain (C) functions into domain (D) functions to fix crashes Thanks to SwitchBrew documentation, fixes 'Pokemon: Legends Z-A' LDN issues. Co-authored-by: JPikachu <jpikachu.eden@gmail.com> Co-authored-by: unknown <sahyno1996@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2810 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev> Co-authored-by: JPikachu <jpikachu@eden-emu.dev> Co-committed-by: JPikachu <jpikachu@eden-emu.dev>
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt2
-rw-r--r--src/core/hle/service/acc/acc.cpp15
-rw-r--r--src/core/hle/service/cmif_serialization.h12
-rw-r--r--src/core/hle/service/ldn/client_process_monitor.cpp27
-rw-r--r--src/core/hle/service/ldn/client_process_monitor.h25
-rw-r--r--src/core/hle/service/ldn/ldn.cpp26
-rw-r--r--src/core/hle/service/ldn/user_local_communication_service.cpp52
7 files changed, 127 insertions, 32 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 62dab070e3..96046af916 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -708,6 +708,8 @@ add_library(core STATIC
hle/service/kernel_helpers.h
hle/service/lbl/lbl.cpp
hle/service/lbl/lbl.h
+ hle/service/ldn/client_process_monitor.cpp
+ hle/service/ldn/client_process_monitor.h
hle/service/ldn/lan_discovery.cpp
hle/service/ldn/lan_discovery.h
hle/service/ldn/ldn.cpp
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp
index e8ccd483ab..76b0ba8818 100644
--- a/src/core/hle/service/acc/acc.cpp
+++ b/src/core/hle/service/acc/acc.cpp
@@ -84,7 +84,8 @@ public:
{0, D<&IManagerForSystemService::CheckAvailability>, "CheckAvailability"},
{1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"},
{2, nullptr, "EnsureIdTokenCacheAsync"},
- {3, nullptr, "LoadIdTokenCache"},
+ {3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated"}, // 19.0.0+
+ {4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache"}, // 19.0.0+
{100, nullptr, "SetSystemProgramIdentification"},
{101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+
{110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+
@@ -126,6 +127,16 @@ private:
R_SUCCEED();
}
+ Result LoadIdTokenCacheDeprecated() {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
+ Result LoadIdTokenCache() {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
Result GetNetworkServiceLicenseCacheEx() {
LOG_DEBUG(Service_ACC, "(STUBBED) called.");
@@ -647,7 +658,7 @@ public:
{0, &IManagerForApplication::CheckAvailability, "CheckAvailability"},
{1, &IManagerForApplication::GetAccountId, "GetAccountId"},
{2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"},
- {3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCache"},
+ {3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"},
{4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"},
{130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"},
{136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache"}, // 19.0.0+
diff --git a/src/core/hle/service/cmif_serialization.h b/src/core/hle/service/cmif_serialization.h
index cdbf32c8ee..39f4905f67 100644
--- a/src/core/hle/service/cmif_serialization.h
+++ b/src/core/hle/service/cmif_serialization.h
@@ -11,6 +11,7 @@
#include "core/hle/service/cmif_types.h"
#include "core/hle/service/ipc_helpers.h"
#include "core/hle/service/service.h"
+#include <typeinfo>
namespace Service {
@@ -439,7 +440,16 @@ template <bool Domain, typename T, typename... A>
void CmifReplyWrapImpl(HLERequestContext& ctx, T& t, Result (T::*f)(A...)) {
// Verify domain state.
if constexpr (!Domain) {
- ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Non-domain reply used on domain session");
+ const auto _mgr = ctx.GetManager();
+ const bool _is_domain = _mgr ? _mgr->IsDomain() : false;
+ ASSERT_MSG(!_is_domain,
+ "Non-domain reply used on domain session\n"
+ "Service={} (type={})\nTIPC={} CmdType={} Cmd=0x{:08X}\n"
+ "HasDomainHeader={} DomainHandlers={}\nDesc={}",
+ t.GetServiceName(), typeid(T).name(), ctx.IsTipc(),
+ static_cast<u32>(ctx.GetCommandType()), static_cast<u32>(ctx.GetCommand()),
+ ctx.HasDomainMessageHeader(), _mgr ? static_cast<u32>(_mgr->DomainHandlerCount()) : 0u,
+ ctx.Description());
}
const bool is_domain = Domain ? ctx.GetManager()->IsDomain() : false;
diff --git a/src/core/hle/service/ldn/client_process_monitor.cpp b/src/core/hle/service/ldn/client_process_monitor.cpp
new file mode 100644
index 0000000000..0c1963a4ca
--- /dev/null
+++ b/src/core/hle/service/ldn/client_process_monitor.cpp
@@ -0,0 +1,27 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ldn/ldn_results.h"
+#include "core/hle/service/ldn/client_process_monitor.h"
+#include "core/hle/service/ipc_helpers.h"
+
+namespace Service::LDN {
+
+IClientProcessMonitor::IClientProcessMonitor(Core::System& system_)
+ : ServiceFramework{system_, "IClientProcessMonitor"} {
+ static const FunctionInfo functions[] = {
+ {0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"},
+ };
+ RegisterHandlers(functions);
+}
+
+IClientProcessMonitor::~IClientProcessMonitor() = default;
+
+Result IClientProcessMonitor::RegisterClient() {
+ LOG_WARNING(Service_LDN, "(STUBBED) called");
+
+ R_SUCCEED();
+}
+
+} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/client_process_monitor.h b/src/core/hle/service/ldn/client_process_monitor.h
new file mode 100644
index 0000000000..9caa337795
--- /dev/null
+++ b/src/core/hle/service/ldn/client_process_monitor.h
@@ -0,0 +1,25 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden 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 IClientProcessMonitor final
+ : public ServiceFramework<IClientProcessMonitor> {
+public:
+ explicit IClientProcessMonitor(Core::System& system_);
+ ~IClientProcessMonitor() override;
+
+private:
+ Result RegisterClient();
+};
+
+} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp
index 46e10e21c5..c77ae2911e 100644
--- a/src/core/hle/service/ldn/ldn.cpp
+++ b/src/core/hle/service/ldn/ldn.cpp
@@ -1,9 +1,13 @@
+// SPDX-FileCopyrightText: Copyright 2025 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/core.h"
#include "core/hle/service/cmif_serialization.h"
#include "core/hle/service/ldn/ldn.h"
+#include "core/hle/service/ldn/client_process_monitor.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"
@@ -40,7 +44,7 @@ public:
// clang-format off
static const FunctionInfo functions[] = {
{0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"},
- {1, nullptr, "CreateClientProcessMonitor"} // 18.0.0+
+ {1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
};
// clang-format on
@@ -55,6 +59,14 @@ private:
*out_interface = std::make_shared<ISystemLocalCommunicationService>(system);
R_SUCCEED();
}
+
+ Result CreateClientProcessMonitor(
+ OutInterface<IClientProcessMonitor> out_interface) {
+ LOG_DEBUG(Service_LDN, "called");
+
+ *out_interface = std::make_shared<IClientProcessMonitor>(system);
+ R_SUCCEED();
+ }
};
class IUserServiceCreator final : public ServiceFramework<IUserServiceCreator> {
@@ -62,8 +74,8 @@ public:
explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {
// clang-format off
static const FunctionInfo functions[] = {
- {0, C<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
- {1, nullptr, "CreateClientProcessMonitor"} // 18.0.0+
+ {0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
+ {1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
};
// clang-format on
@@ -78,6 +90,14 @@ private:
*out_interface = std::make_shared<IUserLocalCommunicationService>(system);
R_SUCCEED();
}
+
+ Result CreateClientProcessMonitor(
+ OutInterface<IClientProcessMonitor> out_interface) {
+ LOG_DEBUG(Service_LDN, "called");
+
+ *out_interface = std::make_shared<IClientProcessMonitor>(system);
+ R_SUCCEED();
+ }
};
class ISfServiceCreator final : public ServiceFramework<ISfServiceCreator> {
diff --git a/src/core/hle/service/ldn/user_local_communication_service.cpp b/src/core/hle/service/ldn/user_local_communication_service.cpp
index b8770120a7..d6a67ed75b 100644
--- a/src/core/hle/service/ldn/user_local_communication_service.cpp
+++ b/src/core/hle/service/ldn/user_local_communication_service.cpp
@@ -27,35 +27,35 @@ IUserLocalCommunicationService::IUserLocalCommunicationService(Core::System& sys
lan_discovery{} {
// clang-format off
static const FunctionInfo functions[] = {
- {0, C<&IUserLocalCommunicationService::GetState>, "GetState"},
- {1, C<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"},
- {2, C<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"},
- {3, C<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"},
- {4, C<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"},
- {5, C<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"},
- {100, C<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"},
- {101, C<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"},
- {102, C<&IUserLocalCommunicationService::Scan>, "Scan"},
- {103, C<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"},
- {104, C<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"},
- {200, C<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"},
- {201, C<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"},
- {202, C<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"},
- {203, C<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"},
- {204, C<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"},
+ {0, D<&IUserLocalCommunicationService::GetState>, "GetState"},
+ {1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"},
+ {2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"},
+ {3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"},
+ {4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"},
+ {5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"},
+ {100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"},
+ {101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"},
+ {102, D<&IUserLocalCommunicationService::Scan>, "Scan"},
+ {103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"},
+ {104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"},
+ {200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"},
+ {201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"},
+ {202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"},
+ {203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"},
+ {204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"},
{205, nullptr, "Reject"},
- {206, C<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"},
- {207, C<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"},
- {208, C<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"},
+ {206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"},
+ {207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"},
+ {208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"},
{209, nullptr, "ClearAcceptFilter"},
- {300, C<&IUserLocalCommunicationService::OpenStation>, "OpenStation"},
- {301, C<&IUserLocalCommunicationService::CloseStation>, "CloseStation"},
- {302, C<&IUserLocalCommunicationService::Connect>, "Connect"},
+ {300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"},
+ {301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"},
+ {302, D<&IUserLocalCommunicationService::Connect>, "Connect"},
{303, nullptr, "ConnectPrivate"},
- {304, C<&IUserLocalCommunicationService::Disconnect>, "Disconnect"},
- {400, C<&IUserLocalCommunicationService::Initialize>, "Initialize"},
- {401, C<&IUserLocalCommunicationService::Finalize>, "Finalize"},
- {402, C<&IUserLocalCommunicationService::Initialize2>, "Initialize2"},
+ {304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"},
+ {400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"},
+ {401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"},
+ {402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"},
};
// clang-format on