diff --git a/Windows/CS/Framework4.0/BootLoader/Cargo.lock b/Windows/CS/Framework4.0/BootLoader/Cargo.lock new file mode 100644 index 0000000..3461d63 --- /dev/null +++ b/Windows/CS/Framework4.0/BootLoader/Cargo.lock @@ -0,0 +1,162 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "BootLoader" +version = "0.1.0" +dependencies = [ + "windows", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "windows" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" +dependencies = [ + "windows-core", + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-implement" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Windows/CS/Framework4.0/BootLoader/Cargo.toml b/Windows/CS/Framework4.0/BootLoader/Cargo.toml new file mode 100644 index 0000000..2289934 --- /dev/null +++ b/Windows/CS/Framework4.0/BootLoader/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "BootLoader" +version = "0.1.0" +edition = "2024" + +[dependencies] +windows = { version = "0.56", features = ["Win32_System_Console", "Win32_Foundation", "Win32_System_ProcessStatus"] } diff --git a/Windows/CS/Framework4.0/BootLoader/src/main.rs b/Windows/CS/Framework4.0/BootLoader/src/main.rs new file mode 100644 index 0000000..e513d36 --- /dev/null +++ b/Windows/CS/Framework4.0/BootLoader/src/main.rs @@ -0,0 +1,70 @@ +use std::fs; +use std::process::Command; +use std::thread::sleep; +use std::time::Duration; +use windows::Win32::System::Console; +use windows::Win32::Foundation::HWND; + +fn hide_console() { + unsafe { + let console = Console::GetConsoleWindow(); + if console != HWND::default() { + let _ = Console::FreeConsole(); + } + } +} + +fn main() { + // 隐藏控制台窗口 + hide_console(); + + // 获取 BootLoader 启动目录所在盘的 AppData 目录 + let appdata_dir = get_appdata_dir(); + + // 构建 Updater 相关文件路径 + let updater_exe = appdata_dir.join("Updater.exe"); + let updater_new_exe = appdata_dir.join("Updater.new.exe"); + + // 等待 Updater 进程退出 + wait_for_process_exit("Updater.exe"); + + // 检查 Updater.new.exe 是否存在 + if updater_new_exe.exists() { + // 直接覆盖 Updater.exe(fs::rename 在 Windows 上会自动替换已存在的文件) + fs::rename(&updater_new_exe, &updater_exe).expect("Failed to rename Updater.new.exe to Updater.exe"); + } + + // 启动 Updater.exe + Command::new(updater_exe) + .spawn() + .expect("Failed to start Updater.exe"); +} + +fn get_appdata_dir() -> std::path::PathBuf { + let exe_path = std::env::current_exe().expect("Failed to get executable path"); + let drive = if let Some(parent) = exe_path.parent() { + let drive = parent.as_os_str().to_str().unwrap_or("C:/").split('\\').next().unwrap_or("C:"); + std::path::Path::new(&format!("{}/", drive)).to_path_buf() + } else { + std::path::Path::new("C:/").to_path_buf() + }; + drive.join("AppData").join("Updater") +} + +fn wait_for_process_exit(process_name: &str) { + loop { + // 使用 tasklist 命令检查进程是否存在 + let output = Command::new("tasklist") + .args(["/FI", &format!("IMAGENAME eq {}", process_name)]) + .output() + .expect("Failed to execute tasklist"); + + let output_str = String::from_utf8_lossy(&output.stdout); + if !output_str.contains(process_name) { + break; + } + + // 等待 100 毫秒后再次检查 + sleep(Duration::from_millis(100)); + } +} diff --git a/Windows/CS/Framework4.0/BootLoader/target/.rustc_info.json b/Windows/CS/Framework4.0/BootLoader/target/.rustc_info.json new file mode 100644 index 0000000..93bee1d --- /dev/null +++ b/Windows/CS/Framework4.0/BootLoader/target/.rustc_info.json @@ -0,0 +1 @@ +{"rustc_fingerprint":17656983458485528297,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\xyzqm\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n","stderr":""},"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-pc-windows-msvc\nrelease: 1.94.1\nLLVM version: 21.1.8\n","stderr":""}},"successes":{}} \ No newline at end of file diff --git a/Windows/CS/Framework4.0/BootLoader/target/CACHEDIR.TAG b/Windows/CS/Framework4.0/BootLoader/target/CACHEDIR.TAG new file mode 100644 index 0000000..20d7c31 --- /dev/null +++ b/Windows/CS/Framework4.0/BootLoader/target/CACHEDIR.TAG @@ -0,0 +1,3 @@ +Signature: 8a477f597d28d172789f06886806bc55 +# This file is a cache directory tag created by cargo. +# For information about cache directory tags see https://bford.info/cachedir/