From a05db6251f6c4c30f5889cb9598533d0f3fdcbe2 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 20 May 2026 04:00:54 +0000 Subject: [PATCH] properly give targetinput? --- src/core/hle/service/am/applet_manager.cpp | 24 ++++++++++++++++++++++ src/core/hle/service/am/applet_manager.h | 2 ++ src/yuzu/main_window.cpp | 19 +---------------- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/core/hle/service/am/applet_manager.cpp b/src/core/hle/service/am/applet_manager.cpp index c2920f91ae..51a371f2cf 100644 --- a/src/core/hle/service/am/applet_manager.cpp +++ b/src/core/hle/service/am/applet_manager.cpp @@ -292,8 +292,32 @@ void AppletManager::SetWindowSystem(WindowSystem* window_system) { applet->previous_program_index = params.previous_program_index; // Push UserChannel data from previous application + // Or ulaunch initialization where we push parameters willingly! if (params.launch_type == LaunchType::ApplicationInitiated) { applet->user_channel_launch_parameter.swap(m_system.GetUserChannel()); + } else if (params.launch_type == LaunchType::FrontendUlaunchInitiated) { + constexpr size_t NroPathSize = 512; + constexpr size_t NroArgvSize = 2048; + constexpr size_t MenuCaptionSize = 1024; + struct UlauncherTargetInput { + u32 magic; + bool target_once; + bool is_auto_game_recording; + std::array unused; + std::array nro_path; + std::array nro_argv; + std::array menu_caption; + } target_ipt = {}; + static_assert(sizeof(target_ipt) == 3592); + + target_ipt.magic = 0x49444C55; // "ULDI" + target_ipt.nro_path = {"sdmc:/hbmenu.nro"}; + target_ipt.menu_caption = {"Loaded by uLoader v1.2.4 - uLaunch's custom hbloader replacement ;)"}; + + std::vector v(sizeof(target_ipt)); + std::memcpy(v.data(), &target_ipt, sizeof(target_ipt)); + applet->user_channel_launch_parameter.clear(); + applet->user_channel_launch_parameter.push_back(std::move(v)); } // TODO: Read whether we need a preselected user from NACP? diff --git a/src/core/hle/service/am/applet_manager.h b/src/core/hle/service/am/applet_manager.h index 2b0714adf7..cd97a6e157 100644 --- a/src/core/hle/service/am/applet_manager.h +++ b/src/core/hle/service/am/applet_manager.h @@ -26,6 +26,8 @@ class WindowSystem; enum class LaunchType { FrontendInitiated, ApplicationInitiated, + // Special masquerade for AMS + uLaunch CFW + FrontendUlaunchInitiated = 0x800, }; struct FrontendAppletParameters { diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 340d082cea..714555a633 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -586,27 +586,10 @@ MainWindow::MainWindow(bool has_broken_vulkan) auto const path = (sd_dir / "atmosphere" / "hbl.nsp").string(); BootGame(QString::fromStdString(path), ApplicationAppletParameters()); } else if (should_launch_ulaunch) { - constexpr size_t NroPathSize = 512; - constexpr size_t NroArgvSize = 2048; - constexpr size_t MenuCaptionSize = 1024; - struct UlauncherTargetInput { - u32 magic; - bool target_once; - bool is_auto_game_recording; - std::array unused; - std::array nro_path; - std::array nro_argv; - std::array menu_caption; - } target_ipt = {}; - - target_ipt.magic = 0x49444C55; // "ULDI" - QtCommon::system->GetUserChannel().resize(sizeof(target_ipt)); - std::memcpy(QtCommon::system->GetUserChannel().data(), &target_ipt, sizeof(target_ipt)); - std::filesystem::path const sd_dir = Common::FS::GetEdenPathString(Common::FS::EdenPath::SDMCDir); auto const path = (sd_dir / "ulaunch" / "bin" / "uLoader" / "application" / "main").string(); auto params = ApplicationAppletParameters(); - params.launch_type = Service::AM::LaunchType::ApplicationInitiated; + params.launch_type = Service::AM::LaunchType::FrontendUlaunchInitiated; BootGame(QString::fromStdString(path), params); } }