如何在C++中可靠地检查一个Windows进程是否是另一个进程的父进程

How can I reliably check whether one Windows process is the parent of another in C++?

本文关键字:进程 Windows 一个 是否是 另一个 C++ 检查      更新时间:2023-10-16

我正在处理一个函数,该函数为我获取给定PID的父进程的PID。该功能的原型是

DWORD getParentPid( DWORD pid );

为此,我使用CreateToolhelp32Snapshot函数(以及相关函数(来获得给定PID pidPROCESSENTRY32结构。然后,我可以使用结构的th32ParentProcessId字段来获得创建给定进程的进程的PID。

然而,由于父进程可能已经被破坏(它的PID可能已经被Windows重用(,我使用GetProcessTimes函数来获取假定的父进程和子进程的创建时间,然后使用CompareFileTime进行比较。

如果CompareFileTime返回-1,我知道具有父ID的进程是在我的子进程之前创建的,所以它确实是父进程。否则,它显然是一个重复使用的ID,并且父PID无效(它不再引用原始父PID(。

这样做的问题是,它在很大程度上依赖于严格单调的系统时钟和GetProcessTimes的粒度。我确实经历过CompareFileTime返回0(意思是"相等的时间"(的情况,尽管所考虑的过程确实是父子关系。我可以更改我的检查,以便CompareFileTime结果值<= 0将被视为指示父进程,但随后我将打破(理论(情况,即父进程创建了一个子进程,然后父进程被销毁,然后Windows重新使用PID-所有这些都在100ns内(这是GetProcessTimes的分辨率(。

我想知道,在C++中,是否有一种不同的、更可靠的机制来验证某个进程确实是另一个进程的父进程?

编辑:我需要这个函数来确定所有子进程(这意味着包括子进程(。CreateToolhelp32Snapshot允许我迭代所有进程,但我需要查看每个进程的父PID,以判断它是否是我手头进程的子进程。

此处的示例:

http://msdn.microsoft.com/en-us/library/ms686701(v=vs.85(.aspx

显示使用processId的参数0调用CreateToolhelp32Snapshot,并使用选项TH32CS_SNAPPROCESS,该选项表示它捕获所有进程。然后,一旦您获得了快照,就像在示例中一样,您就可以遍历快照中存在的进程。父id在快照中应该是有效的,因为您查看的是所有进程在拍摄快照时的状态。你不必为你的流程开始时间比较而烦恼。

如果进程是在应用程序运行时创建的,那么您可以随着时间的推移反复迭代它,并捕获PID重用。