Rust开发应用拦截工具:如何查找启动进程的父进程?
在Rust中查找进程的父进程实现方案
针对你开发应用拦截工具时遇到的更新程序误识别问题,下面提供两种在Rust中获取进程父进程的实现方式:
方法一:使用sysinfo第三方库(推荐,跨平台)
sysinfo是一个跨平台的系统信息库,能轻松获取进程的父进程ID及相关信息,无需直接调用系统API。
- 添加依赖到
Cargo.toml:
[dependencies] sysinfo = "0.30.0"
- 实现代码示例:
use sysinfo::{ProcessExt, System, SystemExt}; fn get_parent_process(pid: u32) -> Option<(u32, String)> { let mut sys = System::new_all(); sys.refresh_all(); // 获取目标进程 let target_process = sys.process(pid)?; // 获取父进程ID let parent_pid = target_process.parent()?; // 获取父进程信息 let parent_process = sys.process(parent_pid)?; Some((parent_pid, parent_process.name().to_string())) } fn main() { // 替换为你要查询的主进程PID let main_process_pid = 1234; match get_parent_process(main_process_pid) { Some((ppid, pname)) => println!("父进程ID: {}, 进程名: {}", ppid, pname), None => println!("未找到父进程"), } }
方法二:直接调用Windows API(Windows专属)
如果需要更底层的控制,可以直接调用Windows的进程快照API来遍历进程列表,获取父进程ID。
- 添加依赖到
Cargo.toml:
[dependencies] winapi = { version = "0.3", features = ["tlhelp32", "processenv"] }
- 实现代码示例:
use winapi::{ shared::minwindef::{DWORD, BOOL}, um::{tlhelp32::*, processthreadsapi::OpenProcess, winnt::PROCESS_QUERY_INFORMATION}, }; use std::ptr; fn get_parent_pid(pid: DWORD) -> Option<DWORD> { // 创建进程快照 let snapshot = unsafe { CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) }; if snapshot == winapi::um::handleapi::INVALID_HANDLE_VALUE { return None; } let mut entry = PROCESSENTRY32W { dwSize: std::mem::size_of::<PROCESSENTRY32W>() as DWORD, ..Default::default() }; // 遍历进程列表 if unsafe { Process32FirstW(snapshot, &mut entry) } == 0 { unsafe { winapi::um::handleapi::CloseHandle(snapshot) }; return None; } loop { if entry.th32ProcessID == pid { let parent_pid = entry.th32ParentProcessID; unsafe { winapi::um::handleapi::CloseHandle(snapshot) }; return Some(parent_pid); } if unsafe { Process32NextW(snapshot, &mut entry) } == 0 { break; } } unsafe { winapi::um::handleapi::CloseHandle(snapshot) }; None } fn main() { let main_process_pid = 1234; // 替换为目标进程PID match get_parent_pid(main_process_pid) { Some(ppid) => println!("父进程ID: {}", ppid), None => println!("未找到父进程"), } }
结合业务场景使用
拿到主进程的父进程ID后,你可以进一步获取父进程的可执行文件路径,对比是否是之前从开始菜单识别到的更新程序路径。如果匹配,就将主程序的可执行路径加入拦截列表,避免误拦截更新程序却漏掉主程序的问题。
内容的提问来源于stack exchange,提问作者Jamzy01
相关产品推荐
相关产品推荐

