From 7d0490eb63ac498d01475f6ce497c269b2963b8c Mon Sep 17 00:00:00 2001 From: JPikachu Date: Tue, 21 Oct 2025 20:01:14 +0100 Subject: [PATCH 1/7] [acc, ldn] Impliment CreateClientProcessMonitor and stub LoadIdTokenCache changes - Impliment CreateClientProcessMonitor to ldn:s and ldn:u - IManagerForApplication/SystemService: from 19.0.0+ LoadIdTokenCache (3) is now LoadIdTokenCacheDeprecated (3) - IManagerForApplication/SystemService: LoadIdTokenCache (4) stubbed Thanks to SwitchBrew documentation, aims to fix 'Pokemon: Legends Z-A' LDN issues. --- src/core/hle/service/acc/acc.cpp | 15 +++++++++++++-- src/core/hle/service/ldn/ldn.cpp | 23 +++++++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) 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/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index 46e10e21c5..be04146a0a 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -1,3 +1,6 @@ +// 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 @@ -40,7 +43,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 +58,14 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } + + Result CreateClientProcessMonitor( + OutInterface out_interface) { + LOG_DEBUG(Service_LDN, "called"); + + *out_interface = std::make_shared(system); + R_SUCCEED(); + } }; class IUserServiceCreator final : public ServiceFramework { @@ -63,7 +74,7 @@ public: // clang-format off static const FunctionInfo functions[] = { {0, C<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"}, - {1, nullptr, "CreateClientProcessMonitor"} // 18.0.0+ + {1, C<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+ }; // clang-format on @@ -78,6 +89,14 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } + + Result CreateClientProcessMonitor( + OutInterface out_interface) { + LOG_DEBUG(Service_LDN, "called"); + + *out_interface = std::make_shared(system); + R_SUCCEED(); + } }; class ISfServiceCreator final : public ServiceFramework { From ba797f58169e952dab0dd739faef38f3fa703163 Mon Sep 17 00:00:00 2001 From: JPikachu Date: Tue, 21 Oct 2025 22:14:50 +0100 Subject: [PATCH 2/7] [ldn] Implement IClientProcessMonitor Thank you to Lizzie (a.k.a. one of the smartest devs in the world) --- .../service/ldn/client_process_monitor.cpp | 22 ++++++++++++++++ .../hle/service/ldn/client_process_monitor.h | 25 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/core/hle/service/ldn/client_process_monitor.cpp create mode 100644 src/core/hle/service/ldn/client_process_monitor.h 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..cbb4a5cbe0 --- /dev/null +++ b/src/core/hle/service/ldn/client_process_monitor.cpp @@ -0,0 +1,22 @@ +// 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" + +namespace Service::LDN { + +IClientProcessMonitor::IClientProcessMonitor(Core::System& system_) + : ServiceFramework{system_, "IClientProcessMonitor"} { + //RegisterHandlers(functions); +} + +IClientProcessMonitor::~IClientProcessMonitor() = default; + +Result IClientProcessMonitor::InitializeSystem2() { + 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..d94f23bd4b --- /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 { +public: + explicit IClientProcessMonitor(Core::System& system_); + ~IClientProcessMonitor() override; + +private: + Result InitializeSystem2(); +}; + +} // namespace Service::LDN From 31f49606b8ea7844010c0fe10eefc4a0062fb80c Mon Sep 17 00:00:00 2001 From: JPikachu Date: Tue, 21 Oct 2025 22:44:26 +0100 Subject: [PATCH 3/7] I need a couple more braincells --- src/core/hle/service/ldn/ldn.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index be04146a0a..57067ee83f 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -7,6 +7,7 @@ #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" From 05504a2444e764e41fcae0f265fe69970b2be548 Mon Sep 17 00:00:00 2001 From: JPikachu Date: Tue, 21 Oct 2025 23:11:30 +0100 Subject: [PATCH 4/7] the commit above still before this still applies --- src/core/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) 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 From 955289122aca886843ecf32214c0e7e4584e0d0f Mon Sep 17 00:00:00 2001 From: JPikachu Date: Wed, 22 Oct 2025 19:08:32 +0100 Subject: [PATCH 5/7] more accurate to switchbrew --- src/core/hle/service/ldn/client_process_monitor.cpp | 13 ++++++++++--- src/core/hle/service/ldn/client_process_monitor.h | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/core/hle/service/ldn/client_process_monitor.cpp b/src/core/hle/service/ldn/client_process_monitor.cpp index cbb4a5cbe0..1279026d79 100644 --- a/src/core/hle/service/ldn/client_process_monitor.cpp +++ b/src/core/hle/service/ldn/client_process_monitor.cpp @@ -4,18 +4,25 @@ #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"} { - //RegisterHandlers(functions); + static const FunctionInfo functions[] = { + {0, &IClientProcessMonitor::RegisterClient, "RegisterClient"}, + }; + RegisterHandlers(functions); } IClientProcessMonitor::~IClientProcessMonitor() = default; -Result IClientProcessMonitor::InitializeSystem2() { - LOG_WARNING(Service_LDN, "(STUBBED) called"); +Result IClientProcessMonitor::RegisterClient(Handle process_handle, u64 pid_placeholder) { + LOG_WARNING(Service_LDN, + "(STUBBED) called, process_handle=0x{:08X}, pid_placeholder=0x{:016X}", + process_handle, pid_placeholder); + R_SUCCEED(); } diff --git a/src/core/hle/service/ldn/client_process_monitor.h b/src/core/hle/service/ldn/client_process_monitor.h index d94f23bd4b..5cd678da54 100644 --- a/src/core/hle/service/ldn/client_process_monitor.h +++ b/src/core/hle/service/ldn/client_process_monitor.h @@ -19,7 +19,7 @@ public: ~IClientProcessMonitor() override; private: - Result InitializeSystem2(); + Result RegisterClient(Handle process_handle, u64 pid_placeholder); }; } // namespace Service::LDN From b901748de9d414b788b710a9931ba03b62f96de7 Mon Sep 17 00:00:00 2001 From: JPikachu Date: Wed, 22 Oct 2025 19:28:00 +0100 Subject: [PATCH 6/7] f --- src/core/hle/service/ldn/client_process_monitor.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/core/hle/service/ldn/client_process_monitor.cpp b/src/core/hle/service/ldn/client_process_monitor.cpp index 1279026d79..5278a21609 100644 --- a/src/core/hle/service/ldn/client_process_monitor.cpp +++ b/src/core/hle/service/ldn/client_process_monitor.cpp @@ -11,7 +11,7 @@ namespace Service::LDN { IClientProcessMonitor::IClientProcessMonitor(Core::System& system_) : ServiceFramework{system_, "IClientProcessMonitor"} { static const FunctionInfo functions[] = { - {0, &IClientProcessMonitor::RegisterClient, "RegisterClient"}, + {0, C<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}, }; RegisterHandlers(functions); } @@ -19,8 +19,7 @@ IClientProcessMonitor::IClientProcessMonitor(Core::System& system_) IClientProcessMonitor::~IClientProcessMonitor() = default; Result IClientProcessMonitor::RegisterClient(Handle process_handle, u64 pid_placeholder) { - LOG_WARNING(Service_LDN, - "(STUBBED) called, process_handle=0x{:08X}, pid_placeholder=0x{:016X}", + LOG_WARNING(Service_LDN, "(STUBBED) called, process_handle={}, pid_placeholder={}", process_handle, pid_placeholder); R_SUCCEED(); From 8f1de7d6225eae0119b08664608b0dd95c263c5c Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 22 Oct 2025 22:05:09 +0200 Subject: [PATCH 7/7] change non-domain (C) function to domain (D) function --- src/core/hle/service/cmif_serialization.h | 12 ++++- .../service/ldn/client_process_monitor.cpp | 7 ++- .../hle/service/ldn/client_process_monitor.h | 2 +- src/core/hle/service/ldn/ldn.cpp | 4 +- .../ldn/user_local_communication_service.cpp | 52 +++++++++---------- 5 files changed, 43 insertions(+), 34 deletions(-) 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 namespace Service { @@ -439,7 +440,16 @@ template 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(ctx.GetCommandType()), static_cast(ctx.GetCommand()), + ctx.HasDomainMessageHeader(), _mgr ? static_cast(_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 index 5278a21609..0c1963a4ca 100644 --- a/src/core/hle/service/ldn/client_process_monitor.cpp +++ b/src/core/hle/service/ldn/client_process_monitor.cpp @@ -11,16 +11,15 @@ namespace Service::LDN { IClientProcessMonitor::IClientProcessMonitor(Core::System& system_) : ServiceFramework{system_, "IClientProcessMonitor"} { static const FunctionInfo functions[] = { - {0, C<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}, + {0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}, }; RegisterHandlers(functions); } IClientProcessMonitor::~IClientProcessMonitor() = default; -Result IClientProcessMonitor::RegisterClient(Handle process_handle, u64 pid_placeholder) { - LOG_WARNING(Service_LDN, "(STUBBED) called, process_handle={}, pid_placeholder={}", - process_handle, pid_placeholder); +Result IClientProcessMonitor::RegisterClient() { + LOG_WARNING(Service_LDN, "(STUBBED) called"); R_SUCCEED(); } diff --git a/src/core/hle/service/ldn/client_process_monitor.h b/src/core/hle/service/ldn/client_process_monitor.h index 5cd678da54..9caa337795 100644 --- a/src/core/hle/service/ldn/client_process_monitor.h +++ b/src/core/hle/service/ldn/client_process_monitor.h @@ -19,7 +19,7 @@ public: ~IClientProcessMonitor() override; private: - Result RegisterClient(Handle process_handle, u64 pid_placeholder); + Result RegisterClient(); }; } // namespace Service::LDN diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index 57067ee83f..c77ae2911e 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -74,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, C<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+ + {0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"}, + {1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+ }; // clang-format on 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