You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust开发应用拦截工具:如何查找启动进程的父进程?

在Rust中查找进程的父进程实现方案

针对你开发应用拦截工具时遇到的更新程序误识别问题,下面提供两种在Rust中获取进程父进程的实现方式:

方法一:使用sysinfo第三方库(推荐,跨平台)

sysinfo是一个跨平台的系统信息库,能轻松获取进程的父进程ID及相关信息,无需直接调用系统API。

  1. 添加依赖到Cargo.toml:
[dependencies]
sysinfo = "0.30.0"
  1. 实现代码示例:
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。

  1. 添加依赖到Cargo.toml:
[dependencies]
winapi = { version = "0.3", features = ["tlhelp32", "processenv"] }
  1. 实现代码示例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:50:30