From 1231e95a70a5398b27f0712aea56d82af26c8ce7 Mon Sep 17 00:00:00 2001 From: zqm Date: Tue, 7 Apr 2026 13:02:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=90=8E=E9=80=80=E5=87=BA?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Windows/CS/Framework4.0/BootLoader/Cargo.lock | 61 ++++++++++++++++ Windows/CS/Framework4.0/BootLoader/Cargo.toml | 3 +- .../CS/Framework4.0/BootLoader/src/main.rs | 72 +++++++++++++++---- 3 files changed, 121 insertions(+), 15 deletions(-) diff --git a/Windows/CS/Framework4.0/BootLoader/Cargo.lock b/Windows/CS/Framework4.0/BootLoader/Cargo.lock index 3461d63..8207cf2 100644 --- a/Windows/CS/Framework4.0/BootLoader/Cargo.lock +++ b/Windows/CS/Framework4.0/BootLoader/Cargo.lock @@ -6,9 +6,22 @@ version = 4 name = "BootLoader" version = "0.1.0" dependencies = [ + "serde_json", "windows", ] +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + [[package]] name = "proc-macro2" version = "1.0.106" @@ -27,6 +40,48 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + [[package]] name = "syn" version = "2.0.117" @@ -160,3 +215,9 @@ name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Windows/CS/Framework4.0/BootLoader/Cargo.toml b/Windows/CS/Framework4.0/BootLoader/Cargo.toml index 2289934..49089bc 100644 --- a/Windows/CS/Framework4.0/BootLoader/Cargo.toml +++ b/Windows/CS/Framework4.0/BootLoader/Cargo.toml @@ -4,4 +4,5 @@ version = "0.1.0" edition = "2024" [dependencies] -windows = { version = "0.56", features = ["Win32_System_Console", "Win32_Foundation", "Win32_System_ProcessStatus"] } +serde_json = "1.0" +windows = { version = "0.56", features = ["Win32_System_Console", "Win32_Foundation", "Win32_System_ProcessStatus", "Win32_System_Threading"] } diff --git a/Windows/CS/Framework4.0/BootLoader/src/main.rs b/Windows/CS/Framework4.0/BootLoader/src/main.rs index 5575cd3..3d96854 100644 --- a/Windows/CS/Framework4.0/BootLoader/src/main.rs +++ b/Windows/CS/Framework4.0/BootLoader/src/main.rs @@ -42,24 +42,68 @@ fn main() { Err(e) => println!("Rename failed: {:?}", e), } + // 读取 Updater 的 debug_mode 配置,决定启动方式 + let updater_debug_mode = load_updater_debug_mode(&appdata_dir); + println!("Updater debug_mode: {}", updater_debug_mode); + // 启动 Updater.exe println!("Starting Updater.exe..."); - println!("Updater.exe path: {:?}", updater_exe); - println!("Updater.exe exists: {:?}", updater_exe.exists()); + let started = spawn_updater(&updater_exe, updater_debug_mode); - match Command::new(updater_exe).spawn() { - Ok(child) => { - println!("Updater.exe started successfully with PID: {}", child.id()); - // 等待一点时间,确保 Updater 有足够的时间启动 - sleep(Duration::from_secs(1)); - // 检查 Updater 进程是否仍在运行 - if is_process_running("Updater.exe") { - println!("Updater.exe is running"); - } else { - println!("Updater.exe may have exited immediately"); - } + if started { + println!("Updater.exe started successfully"); + // 等待一点时间,确保 Updater 有足够的时间启动 + sleep(Duration::from_secs(1)); + // 检查 Updater 进程是否仍在运行 + if is_process_running("Updater.exe") { + println!("Updater.exe is running"); + } else { + println!("Updater.exe may have exited immediately"); + } + } else { + println!("Failed to start Updater.exe"); + } +} + +/// 读取 Updater 的配置文件,获取 debug_mode +fn load_updater_debug_mode(appdata_dir: &std::path::Path) -> bool { + let config_path = appdata_dir.join("Updater").join("config.json"); + if let Ok(content) = fs::read_to_string(&config_path) { + if let Ok(json) = serde_json::from_str::(&content) { + return json.get("debug_mode").and_then(|v| v.as_bool()).unwrap_or(false); + } + } + false +} + +/// 根据 debug_mode 以不同方式启动 Updater.exe: +/// - debug_mode = true → CREATE_NEW_CONSOLE:Updater 获得独立的新终端窗口 +/// - debug_mode = false → DETACHED_PROCESS:Updater 完全后台运行,无控制台 +fn spawn_updater(updater_exe: &std::path::Path, debug_mode: bool) -> bool { + use std::os::windows::process::CommandExt; + + // Windows 进程创建标志 + const CREATE_NEW_CONSOLE: u32 = 0x00000010; + const DETACHED_PROCESS: u32 = 0x00000008; + + let creation_flags = if debug_mode { + CREATE_NEW_CONSOLE // 新建独立控制台窗口 + } else { + DETACHED_PROCESS // 完全脱离控制台,后台静默运行 + }; + + match Command::new(updater_exe) + .creation_flags(creation_flags) + .spawn() + { + Ok(child) => { + drop(child); + true + } + Err(e) => { + println!("Failed to start Updater.exe: {:?}", e); + false } - Err(e) => println!("Failed to start Updater.exe: {:?}", e), } }