add process path resolution for better identification

This commit is contained in:
Adir Shitrit
2025-11-08 11:08:21 +02:00
parent c7ae466c05
commit a726adb185

View File

@@ -24,6 +24,8 @@ mod platform {
CreateToolhelp32Snapshot, Process32FirstW, Process32NextW, PROCESSENTRY32W, CreateToolhelp32Snapshot, Process32FirstW, Process32NextW, PROCESSENTRY32W,
TH32CS_SNAPPROCESS, TH32CS_SNAPPROCESS,
}; };
use windows::Win32::System::Threading::{OpenProcess, PROCESS_QUERY_LIMITED_INFORMATION};
use windows::Win32::System::ProcessStatus::GetProcessImageFileNameW;
pub fn enumerate_processes() -> Result<Vec<ProcessInfo>> { pub fn enumerate_processes() -> Result<Vec<ProcessInfo>> {
let mut processes = Vec::new(); let mut processes = Vec::new();
@@ -47,11 +49,14 @@ mod platform {
.unwrap_or(entry.szExeFile.len())], .unwrap_or(entry.szExeFile.len())],
); );
// Try to get full process path
let path = get_process_path(entry.th32ProcessID);
processes.push(ProcessInfo { processes.push(ProcessInfo {
pid: entry.th32ProcessID, pid: entry.th32ProcessID,
ppid: entry.th32ParentProcessID, ppid: entry.th32ParentProcessID,
name, name,
path: None, path,
thread_count: entry.cntThreads, thread_count: entry.cntThreads,
}); });
@@ -66,6 +71,24 @@ mod platform {
Ok(processes) Ok(processes)
} }
fn get_process_path(pid: u32) -> Option<String> {
unsafe {
let handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, pid).ok()?;
let mut buffer = [0u16; 1024];
if GetProcessImageFileNameW(handle, &mut buffer) > 0 {
let _ = CloseHandle(handle);
let path = String::from_utf16_lossy(
&buffer[..buffer.iter().position(|&c| c == 0).unwrap_or(buffer.len())],
);
Some(path)
} else {
let _ = CloseHandle(handle);
None
}
}
}
} }
#[cfg(not(windows))] #[cfg(not(windows))]