From de62d976eec1308f6e254a7694a0b42a03353926 Mon Sep 17 00:00:00 2001 From: Caelan Sayler Date: Sat, 20 Jan 2024 17:01:07 +0000 Subject: [PATCH] CreateToolhelp32Snapshot doesn't seem to work on x86 --- src/Rust/.cargo/config.toml | 1 + src/Rust/Cargo.lock | 108 +++++++++++----------------- src/Rust/Cargo.toml | 7 +- src/Rust/src/shared/util_windows.rs | 66 +++++++++++------ 4 files changed, 89 insertions(+), 93 deletions(-) diff --git a/src/Rust/.cargo/config.toml b/src/Rust/.cargo/config.toml index 05e992db..871a66f1 100644 --- a/src/Rust/.cargo/config.toml +++ b/src/Rust/.cargo/config.toml @@ -3,6 +3,7 @@ bx = "build" tx = "test" tw = "test --features windows" +tw86 = "test --target i686-pc-windows-msvc --features windows" bw = "build --features windows" bw86 = "build --target i686-pc-windows-msvc --features windows" diff --git a/src/Rust/Cargo.lock b/src/Rust/Cargo.lock index 4ec315e6..c9c9c8dc 100644 --- a/src/Rust/Cargo.lock +++ b/src/Rust/Cargo.lock @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -136,9 +136,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "block" @@ -211,9 +211,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.15" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c12ed66a79a555082f595f7eb980d08669de95009dd4b3d61168c573ebe38fc9" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ "clap_builder", "clap_derive", @@ -221,9 +221,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.15" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4645eab3431e5a8403a96bea02506a8b35d28cd0f0330977dd5d22f9c84f43" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ "anstream", "anstyle", @@ -503,9 +503,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fdeflate" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -694,16 +694,15 @@ dependencies = [ [[package]] name = "image" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" dependencies = [ "bytemuck", "byteorder", "color_quant", "gif", "jpeg-decoder", - "num-rational", "num-traits", "png", ] @@ -744,15 +743,15 @@ dependencies = [ [[package]] name = "jpeg-decoder" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" dependencies = [ "wasm-bindgen", ] @@ -785,16 +784,16 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", "redox_syscall", ] [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "log" @@ -946,27 +945,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -1028,11 +1006,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.62" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if 1.0.0", "foreign-types 0.3.2", "libc", @@ -1060,9 +1038,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.98" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", @@ -1078,15 +1056,15 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pkg-config" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "png" -version = "0.17.10" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -1267,11 +1245,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", @@ -1598,9 +1576,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -1750,9 +1728,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -1760,9 +1738,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" dependencies = [ "bumpalo", "log", @@ -1775,9 +1753,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1785,9 +1763,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", @@ -1798,9 +1776,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "weezl" diff --git a/src/Rust/Cargo.toml b/src/Rust/Cargo.toml index fd7dda01..6af98fdb 100644 --- a/src/Rust/Cargo.toml +++ b/src/Rust/Cargo.toml @@ -85,11 +85,7 @@ libc = "0.2" [target.'cfg(windows)'.dependencies] fs_extra = "1.2" memmap2 = "0.9" -winsafe = { version = "0.0.19", features = [ - "version", - "user", - "gui", -] } +winsafe = { version = "0.0.19", features = ["version", "user", "gui"] } image = { version = "0.24", default-features = false, features = [ "gif", "jpeg", @@ -108,6 +104,7 @@ windows = { version = "0.52", default-features = false, features = [ "Win32_System_Com_StructuredStorage", "Win32_System_Registry", "Win32_System_Threading", + "Win32_System_ProcessStatus", "Win32_System_WindowsProgramming", "Win32_UI_Shell_Common", "Win32_UI_Shell_PropertiesSystem", diff --git a/src/Rust/src/shared/util_windows.rs b/src/Rust/src/shared/util_windows.rs index 3bf07bc4..a8de88dd 100644 --- a/src/Rust/src/shared/util_windows.rs +++ b/src/Rust/src/shared/util_windows.rs @@ -7,18 +7,21 @@ use std::{ path::{Path, PathBuf}, process::Command as Process, }; +use windows::Win32::System::ProcessStatus::EnumProcesses; +use windows_sys::Wdk::System::Threading::{NtQueryInformationProcess, ProcessBasicInformation}; +use windows_sys::Win32::System::Threading::{GetCurrentProcess, PROCESS_BASIC_INFORMATION}; use winsafe::{self as w, co, prelude::*}; use super::bundle::{self, EntryNameInfo, Manifest}; pub fn wait_for_parent_to_exit(ms_to_wait: u32) -> Result<()> { info!("Reading parent process information."); - let basic_info = windows_sys::Wdk::System::Threading::ProcessBasicInformation; - let handle = unsafe { windows_sys::Win32::System::Threading::GetCurrentProcess() }; + let basic_info = ProcessBasicInformation; + let handle = unsafe { GetCurrentProcess() }; let mut return_length: u32 = 0; let return_length_ptr: *mut u32 = &mut return_length as *mut u32; - let mut info = windows_sys::Win32::System::Threading::PROCESS_BASIC_INFORMATION { + let mut info = PROCESS_BASIC_INFORMATION { AffinityMask: 0, BasePriority: 0, ExitStatus: 0, @@ -28,8 +31,8 @@ pub fn wait_for_parent_to_exit(ms_to_wait: u32) -> Result<()> { }; let info_ptr: *mut ::core::ffi::c_void = &mut info as *mut _ as *mut ::core::ffi::c_void; - let info_size = std::mem::size_of::() as u32; - let hr = unsafe { windows_sys::Wdk::System::Threading::NtQueryInformationProcess(handle, basic_info, info_ptr, info_size, return_length_ptr) }; + let info_size = std::mem::size_of::() as u32; + let hr = unsafe { NtQueryInformationProcess(handle, basic_info, info_ptr, info_size, return_length_ptr) }; if hr != 0 { return Err(anyhow!("Failed to query process information: {}", hr)); @@ -72,32 +75,49 @@ pub fn wait_for_parent_to_exit(ms_to_wait: u32) -> Result<()> { } } +// https://github.com/nushell/nushell/blob/4458aae3d41517d74ce1507ad3e8cd94021feb16/crates/nu-system/src/windows.rs#L593 +fn get_pids() -> Result> { + let dword_size = std::mem::size_of::(); + let mut pids: Vec = Vec::with_capacity(101920); + let mut cb_needed = 0; + + unsafe { + pids.set_len(101920); + let _ = EnumProcesses(pids.as_mut_ptr(), (dword_size * pids.len()) as u32, &mut cb_needed)?; + let pids_len = cb_needed / dword_size as u32; + pids.set_len(pids_len as usize); + } + + Ok(pids.iter().map(|x| *x as u32).collect()) +} + fn get_processes_running_in_directory>(dir: P) -> Result> { let dir = dir.as_ref(); let mut oup = HashMap::new(); - let mut hpl = w::HPROCESSLIST::CreateToolhelp32Snapshot(co::TH32CS::SNAPPROCESS, None)?; - for proc_entry in hpl.iter_processes() { - if let Ok(proc) = proc_entry { - let process = w::HPROCESS::OpenProcess(co::PROCESS::QUERY_LIMITED_INFORMATION, false, proc.th32ProcessID); - if process.is_err() { - continue; - } - let process = process.unwrap(); - let full_path = process.QueryFullProcessImageName(co::PROCESS_NAME::WIN32); - if full_path.is_err() { - continue; - } + for pid in get_pids()? { + let process = w::HPROCESS::OpenProcess(co::PROCESS::QUERY_LIMITED_INFORMATION, false, pid); + if let Err(_) = process { + // trace!("Failed to open process: {} ({})", pid, e); + continue; + } - let full_path = full_path.unwrap(); - let full_path = Path::new(&full_path); - if let Ok(is_subpath) = crate::windows::is_sub_path(full_path, dir) { - if is_subpath { - oup.insert(proc.th32ProcessID, full_path.to_path_buf()); - } + let process = process.unwrap(); + let full_path = process.QueryFullProcessImageName(co::PROCESS_NAME::WIN32); + if let Err(_) = full_path { + // trace!("Failed to query process path: {} ({})", pid, e); + continue; + } + + let full_path = full_path.unwrap(); + let full_path = Path::new(&full_path); + if let Ok(is_subpath) = crate::windows::is_sub_path(full_path, dir) { + if is_subpath { + oup.insert(pid, full_path.to_path_buf()); } } } + Ok(oup) }