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

Fre*_*abe 7 c++ windows winapi

我正在开发一个函数,它可以获取给定PID的父进程的PID.该功能的原型是

DWORD getParentPid( DWORD pid );
Run Code Online (Sandbox Code Playgroud)

为此,我正在使用CreateToolhelp32Snapshot函数(和相关函数)来获取PROCESSENTRY32给定PID 的结构pid.然后我可以使用th32ParentProcessId结构的字段来获取创建我给定进程的进程的PID.

但是,由于父进程可能已经被破坏(并且它的PID可能已被Windows重用),我正在使用该GetProcessTimes函数来获取假定的父进程和子进程的创建时间,然后比较那些使用的进程CompareFileTime.

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

这个问题是它非常依赖于严格单调的系统时钟和粒度GetProcessTimes.即使正在考虑的过程确实处于亲子关系中,我确实遇到了CompareFileTime返回0(即"平等时间")的案例.我可以更改我的检查,以便将CompareFileTime结果值<= 0视为表示父项,但是我会打破(理论上)父项创建子进程,然后父进程被销毁,然后Windows重新使用PID的情况- 全部在100ns(这是分辨率GetProcessTimes).

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

编辑:我需要这个函数来确定所有子进程(这意味着包括祖子进程).该CreateToolhelp32Snapshot让我遍历所有进程,但我需要看每个人的父PID告诉它是否是我手头过程的孩子.

Sco*_*ham 1

示例在这里:

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

显示使用 processId 参数 0 调用 CreateToolhelp32Snapshot,并使用选项 TH32CS_SNAPPPROCESS,该选项表示它捕获所有进程。然后,一旦获得快照(如示例中所示),您就可以按照快照中存在的方式遍历进程。父 ID 在快照中应该是有效的,因为您正在查看所有进程的状态,因为它们在拍摄快照时存在。您不必担心流程开始时间比较的问题。