From 2c088d3504e1bc46c62492310091e99c2bb3cdd6 Mon Sep 17 00:00:00 2001 From: 21pages Date: Tue, 14 Oct 2025 12:11:05 +0800 Subject: [PATCH] fix can't run from cmd on win7 (#13160) Signed-off-by: 21pages --- Cargo.lock | 71 ++++++++++++++++++++------------------- libs/portable/Cargo.toml | 8 +++++ libs/portable/src/main.rs | 56 +++++++++++++++++++++++++----- 3 files changed, 92 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5cd90655c..671e31f9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4010,7 +4010,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if 1.0.0", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -5426,7 +5426,7 @@ dependencies = [ "libc", "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -6649,6 +6649,7 @@ dependencies = [ "md5", "native-windows-gui", "winapi 0.3.9", + "windows 0.61.1", "winres", ] @@ -9044,7 +9045,7 @@ dependencies = [ "windows-core 0.52.0", "windows-implement 0.52.0", "windows-interface 0.52.0", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -9054,7 +9055,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" dependencies = [ "windows-core 0.54.0", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -9094,7 +9095,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -9104,7 +9105,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" dependencies = [ "windows-result 0.1.2", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -9207,7 +9208,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -9272,7 +9273,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -9307,18 +9308,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm 0.52.5", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -9343,7 +9344,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -9369,9 +9370,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" @@ -9405,9 +9406,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" @@ -9441,9 +9442,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" @@ -9453,9 +9454,9 @@ checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" @@ -9489,9 +9490,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" @@ -9525,9 +9526,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" @@ -9549,9 +9550,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" @@ -9585,9 +9586,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" diff --git a/libs/portable/Cargo.toml b/libs/portable/Cargo.toml index 8bccf68ec..fab511f0f 100644 --- a/libs/portable/Cargo.toml +++ b/libs/portable/Cargo.toml @@ -15,6 +15,14 @@ md5 = "0.7" winapi = { version = "0.3", features = ["winbase"] } [target.'cfg(target_os = "windows")'.dependencies] +windows = { version = "0.61", features = [ + "Wdk", + "Wdk_System", + "Wdk_System_SystemServices", + "Win32", + "Win32_System", + "Win32_System_SystemInformation", +] } native-windows-gui = {version = "1.0", default-features = false, features = ["animation-timer", "image-decoder"]} [package.metadata.winres] diff --git a/libs/portable/src/main.rs b/libs/portable/src/main.rs index 87d4897c2..85b19e9e9 100644 --- a/libs/portable/src/main.rs +++ b/libs/portable/src/main.rs @@ -92,12 +92,46 @@ fn setup( } write_meta(&dir, ts); #[cfg(windows)] - windows::copy_runtime_broker(&dir); + win::copy_runtime_broker(&dir); #[cfg(linux)] reader.configure_permission(&dir); Some(dir.join(&reader.exe)) } +fn use_null_stdio() -> bool { + #[cfg(windows)] + { + // When running in CMD on Windows 7, using Stdio::inherit() with spawn returns an "invalid handle" error. + // Since using Stdio::null() didn’t cause any issues, and determining whether the program is launched from CMD or by double-clicking would require calling more APIs during startup, we also use Stdio::null() when launched by double-clicking on Windows 7. + let is_windows_7 = is_windows_7(); + println!("is windows7: {}", is_windows_7); + return is_windows_7; + } + #[cfg(not(windows))] + false +} + +#[cfg(windows)] +fn is_windows_7() -> bool { + use windows::Wdk::System::SystemServices::RtlGetVersion; + use windows::Win32::System::SystemInformation::OSVERSIONINFOW; + + unsafe { + let mut version_info = OSVERSIONINFOW::default(); + version_info.dwOSVersionInfoSize = std::mem::size_of::() as u32; + + if RtlGetVersion(&mut version_info).is_ok() { + // Windows 7 is version 6.1 + println!( + "Windows version: {}.{}", + version_info.dwMajorVersion, version_info.dwMinorVersion + ); + return version_info.dwMajorVersion == 6 && version_info.dwMinorVersion == 1; + } + } + false +} + fn execute(path: PathBuf, args: Vec, _ui: bool) { println!("executing {}", path.display()); // setup env @@ -114,12 +148,18 @@ fn execute(path: PathBuf, args: Vec, _ui: bool) { cmd.env(SET_FOREGROUND_WINDOW_ENV_KEY, "1"); } } - let _child = cmd - .env(APPNAME_RUNTIME_ENV_KEY, exe_name) - .stdin(Stdio::inherit()) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .spawn(); + + cmd.env(APPNAME_RUNTIME_ENV_KEY, exe_name); + if use_null_stdio() { + cmd.stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()); + } else { + cmd.stdin(Stdio::inherit()) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()); + } + let _child = cmd.spawn(); #[cfg(windows)] if _ui { @@ -168,7 +208,7 @@ fn main() { } #[cfg(windows)] -mod windows { +mod win { use std::{fs, os::windows::process::CommandExt, path::Path, process::Command}; // Used for privacy mode(magnifier impl).