From c62a8c10b7054bc3f2d079c6705ecd4b39fe9d65 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Tue, 1 Apr 2025 15:46:28 +0800 Subject: [PATCH] Add current_Dir --- src/cfg.rs | 5 +++++ src/main.rs | 8 ++++---- src/windows.rs | 18 ++++++++++++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/cfg.rs b/src/cfg.rs index 6636bb3..e9c5d49 100644 --- a/src/cfg.rs +++ b/src/cfg.rs @@ -162,4 +162,9 @@ impl Config { pub fn hook_dll(&self) -> Vec { self.get_str_vec("hook_dll").unwrap_or(vec![]) } + + #[cfg(windows)] + pub fn current_dir(&self) -> Option { + self.get_str("current_dir").map(|s| s.to_owned()) + } } diff --git a/src/main.rs b/src/main.rs index dcc78c6..d4238a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -119,12 +119,12 @@ impl Main { #[cfg(windows)] fn call(cml: Vec) -> Result { let t = Vec::::new(); - windows::call(&cml, &t).map(|c| ExitStatus::Exited(c)) + windows::call(&cml, &t, None::).map(|c| ExitStatus::Exited(c)) } #[cfg(windows)] - fn call2(cml: Vec, dlls: Vec) -> Result { - windows::call(&cml, &dlls).map(|c| ExitStatus::Exited(c)) + fn call2(cml: Vec, dlls: Vec, cdir: Option) -> Result { + windows::call(&cml, &dlls, cdir).map(|c| ExitStatus::Exited(c)) } fn restore(&self) -> Result<(), Error> { @@ -223,7 +223,7 @@ impl Main { #[cfg(not(windows))] let e = Self::call(cml)?; #[cfg(windows)] - let e = Self::call2(cml, self._cfg.hook_dll())?; + let e = Self::call2(cml, self._cfg.hook_dll(), self._cfg.current_dir())?; #[cfg(windows)] if hide { windows::show_window(); diff --git a/src/windows.rs b/src/windows.rs index defee54..8417875 100644 --- a/src/windows.rs +++ b/src/windows.rs @@ -50,7 +50,7 @@ pub enum PopenError { CreateThreadFailed, } -pub fn call, T: AsRef>(argv: &[S], dlls: &[T]) -> Result { +pub fn call, T: AsRef, C: AsRef>(argv: &[S], dlls: &[T], cdir: Option) -> Result { let job = unsafe { CreateJobObjectA(null_mut(), null()) }; if job.is_null() { println!("Failed to create job: {}.", unsafe { GetLastError() }); @@ -105,6 +105,20 @@ pub fn call, T: AsRef>(argv: &[S], dlls: &[T]) -> Result< } let mut cmlw: Vec<_> = cml.encode_wide().collect(); cmlw.resize(cmlw.len() + 1000, 0); + let mut cdir = match cdir.as_ref() { + Some(c) => { + let mut c: Vec<_> = c.as_ref().encode_wide().collect(); + c.push(0); + Some(c) + }, + None => None, + }; + let cdir = match cdir.as_mut() { + Some(c) => { + c.as_mut_ptr() + } + None => null_mut(), + }; let re = unsafe { CreateProcessW( null(), @@ -114,7 +128,7 @@ pub fn call, T: AsRef>(argv: &[S], dlls: &[T]) -> Result< 1, CREATE_SUSPENDED, null_mut(), - null_mut(), + cdir, addr_of_mut!(si), addr_of_mut!(pi), ) != 0