From 78f7ff24058c3d12e83f88fcb00d3548ef5e486a Mon Sep 17 00:00:00 2001 From: ddidderr Date: Thu, 20 Mar 2025 20:57:32 +0100 Subject: [PATCH] [wip] use windows crate to run as admin --- Cargo.lock | 104 +++++++++++++++--- Cargo.toml | 1 + .../src-tauri/Cargo.toml | 3 + .../src-tauri/src/lib.rs | 25 ++++- 4 files changed, 117 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 26e8a93..b268a17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2436,6 +2436,7 @@ dependencies = [ "tauri-plugin-shell", "tauri-plugin-store", "tokio", + "windows 0.61.1", ] [[package]] @@ -4768,7 +4769,7 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows", + "windows 0.60.0", "windows-core 0.60.1", "windows-version", "x11-dl", @@ -4844,7 +4845,7 @@ dependencies = [ "webkit2gtk", "webview2-com", "window-vibrancy", - "windows", + "windows 0.60.0", ] [[package]] @@ -5043,7 +5044,7 @@ dependencies = [ "tauri-utils", "thiserror 2.0.12", "url", - "windows", + "windows 0.60.0", ] [[package]] @@ -5069,7 +5070,7 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows", + "windows 0.60.0", "wry", ] @@ -5902,9 +5903,9 @@ checksum = "b0d606f600e5272b514dbb66539dd068211cc20155be8d3958201b4b5bd79ed3" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows", + "windows 0.60.0", "windows-core 0.60.1", - "windows-implement", + "windows-implement 0.59.0", "windows-interface", ] @@ -5926,7 +5927,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfb27fccd3c27f68e9a6af1bcf48c2d82534b8675b83608a4d81446d095a17ac" dependencies = [ "thiserror 2.0.12", - "windows", + "windows 0.60.0", "windows-core 0.60.1", ] @@ -5994,11 +5995,24 @@ version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529" dependencies = [ - "windows-collections", + "windows-collections 0.1.1", "windows-core 0.60.1", - "windows-future", + "windows-future 0.1.1", "windows-link", - "windows-numerics", + "windows-numerics 0.1.1", +] + +[[package]] +name = "windows" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" +dependencies = [ + "windows-collections 0.2.0", + "windows-core 0.61.0", + "windows-future 0.2.0", + "windows-link", + "windows-numerics 0.2.0", ] [[package]] @@ -6010,6 +6024,15 @@ dependencies = [ "windows-core 0.60.1", ] +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.0", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -6025,11 +6048,24 @@ version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247" dependencies = [ - "windows-implement", + "windows-implement 0.59.0", "windows-interface", "windows-link", "windows-result", - "windows-strings", + "windows-strings 0.3.1", +] + +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", ] [[package]] @@ -6042,6 +6078,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-future" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" +dependencies = [ + "windows-core 0.61.0", + "windows-link", +] + [[package]] name = "windows-implement" version = "0.59.0" @@ -6053,6 +6099,17 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "windows-interface" version = "0.59.1" @@ -6080,6 +6137,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.0", + "windows-link", +] + [[package]] name = "windows-registry" version = "0.4.0" @@ -6087,7 +6154,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", - "windows-strings", + "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -6109,6 +6176,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -6483,7 +6559,7 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows", + "windows 0.60.0", "windows-core 0.60.1", "windows-version", "x11-dl", diff --git a/Cargo.toml b/Cargo.toml index 1f25375..6fa13cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } uuid = { version = "1", features = ["v7"] } walkdir = "2" +windows = { version = "0.61" } [profile.release] debug = true diff --git a/crates/lanspread-tauri-deno-ts/src-tauri/Cargo.toml b/crates/lanspread-tauri-deno-ts/src-tauri/Cargo.toml index eb3b787..e81a413 100644 --- a/crates/lanspread-tauri-deno-ts/src-tauri/Cargo.toml +++ b/crates/lanspread-tauri-deno-ts/src-tauri/Cargo.toml @@ -34,3 +34,6 @@ tauri-plugin-shell = { workspace = true } tauri-plugin-dialog = { workspace = true } tauri-plugin-store = { workspace = true } tokio = { workspace = true } + +[target.'cfg(windows)'.dependencies] +windows = { workspace = true } diff --git a/crates/lanspread-tauri-deno-ts/src-tauri/src/lib.rs b/crates/lanspread-tauri-deno-ts/src-tauri/src/lib.rs index b112870..6007ee4 100644 --- a/crates/lanspread-tauri-deno-ts/src-tauri/src/lib.rs +++ b/crates/lanspread-tauri-deno-ts/src-tauri/src/lib.rs @@ -1,3 +1,5 @@ +#[cfg(target_os = "windows")] +use std::os::windows::ffi::OsStrExt; use std::{ collections::HashSet, fs::File, @@ -54,12 +56,31 @@ fn install_game(id: String, state: tauri::State) -> bool { true } +#[cfg(target_os = "windows")] +fn run_as_admin(file: &str, params: &str, dir: &str) -> bool { + todo!(); + let file_wide: Vec = OsStr::new(file).encode_wide().chain(Some(0)).collect(); + let params_wide: Vec = OsStr::new(params).encode_wide().chain(Some(0)).collect(); + let dir_wide: Vec = OsStr::new(dir).encode_wide().chain(Some(0)).collect(); + + let result = unsafe { + ShellExecuteW( + HWND(0), + Some("runas"), + &file_wide, + Some(¶ms_wide), + Some(&dir_wide), + windows::Win32::UI::WindowsAndMessaging::SW_SHOWNORMAL, + ) + }; + + result.0 > 32 // Success if greater than 32 +} + #[tauri::command] fn run_game(id: String, state: tauri::State) { const FIRST_START_DONE_FILE: &str = ".softlan_first_start_done"; - log::error!("run_game {id}"); - let games_folder = tauri::async_runtime::block_on(async { state.inner().games_folder.lock().await.clone() });