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

2024-02-27

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

DWORD getParentPid( DWORD pid );

为此,我正在使用CreateToolhelp32Snapshot http://msdn.microsoft.com/en-us/library/ms682489%28v=vs.85%29.aspx函数(和相关函数)来获取PROCESSENTRY32 http://msdn.microsoft.com/en-us/library/ms684839%28v=vs.85%29.aspx我给定的 PID 的结构pid。然后我可以使用th32ParentProcessId结构体的字段来获取创建我给定进程的进程的 PID。

但是,由于父进程可能已经被销毁(并且它的 PID 可能已被 Windows 重用),所以我正在使用GetProcessTimes http://msdn.microsoft.com/en-us/library/ms683223%28v=vs.85%29.aspx函数获取假定的父进程和子进程的创建时间,然后使用CompareFileTime http://msdn.microsoft.com/en-us/library/ms724214%28v=vs.85%29.aspx.

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

问题在于它非常依赖于严格单调的系统时钟和粒度GetProcessTimes。我确实经历过这样的案例CompareFileTime0(这意味着“同等时间”)即使正在考虑的过程确实处于父子关系中。我可以更改我的支票,以便CompareFileTime结果值<= 0会被认为指示父进程,但随后我会打破(理论上的)情况,其中父进程创建了一个子进程,然后父进程被销毁,然后 Windows 重新使用了 PID - 所有这些都在 100 纳秒内(这是GetProcessTimes).

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

Edit:我需要这个函数来确定所有子进程(这意味着包括孙进程)。这CreateToolhelp32Snapshot http://msdn.microsoft.com/en-us/library/ms682489%28v=vs.85%29.aspx让我迭代所有进程,但我需要查看每个进程的父 PID,以判断它是否是我手头进程的子进程。


示例在这里:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何将图像重置到原始位置

    我正在使用 TouchImageView 类 位于https github com MikeOrtiz TouchImageView https github com MikeOrtiz TouchImageView 我使用这个类对我的图像
  • 指定的容器不存在

    我陷入了这个错误The specified container does not exist 让我解释 CloudBlobClient blobStorage GetBlobStorage upload CloudBlockBlob blo
  • 如何隐藏RCP中的默认菜单?

    我是 Eclipse RCP 插件开发的新手 我用自己的视角编写了一个插件 并在其中添加了视角特定的菜单 我的问题是如何隐藏 Eclipse 中提供的默认菜单 例如 编辑 导航 搜索 项目 我尝试使用 并提出我的观点具体条件 以及菜单贡献
  • 未搜索SBT maven本地存储库

    我想从本地 Maven 存储库加载一些库 我已经配置了 sbt 0 13 plugins plugins sbt resolvers Resolver sonatypeRepo snapshots resolvers Resolver ma
  • Swift - 如何使用 XIB 文件创建自定义 viewForHeaderInSection?

    我可以像下面这样以编程方式创建简单的自定义 viewForHeaderInSection 但我想做更复杂的事情 可能与不同的类连接并像 tableView 单元格一样访问它们的属性 很简单 我想看看我在做什么 func tableView
  • 禁用 WebView 中的可选链接

    我有一个webView包含在一个scrollView 然后一切都包含在一个viewPager 当我跳到下一个视图页面时 页面中间的链接将被聚焦 文本周围以橙色突出显示 这会导致页面跳转到最近的链接 有没有办法禁止链接在触摸时聚焦 我已经尝试
  • 在Excel中计算不同值 - 频率函数

    我的任务是计算 Excel 中某一列中不同字符串的数量 后来快速谷歌搜索发现了以下公式here http office microsoft com en us excel HP030561181033 aspx Count 20the 20
  • 升级编译sdk版本后findViewById出错

    升级后编译SDK版本26 全部findViewById显示错误 没有足够的信息来推断 fun 中的参数 T findViewById id Int T 这是因为从 Android O 开始 我们不需要强制转换它 有几种选择 代替 val t
  • 我可以在同一台计算机上安装两个不同版本的 Visual Studio 吗?

    我可以在同一台计算机上安装 Visual Studio 2005 和 2010 吗 会造成什么问题吗 是的 你可以这样做 我在一台机器上安装了VS 2005 2008和2010 它们都是独立工作的 但是 在此之前 请记住 低版本制作的项目只
  • 如何重定向到 404 上的特定网址

    error 404 def error404 error return Nothing here sorry 这是响应404的方式bottle framework 但是在 404 上我想重定向到特定的 url 说http abc com h
  • 为什么不能创建抽象类的对象?

    这是我脑海中的一个场景 我用谷歌搜索了很多 但得到了像这样的答案 抽象类没有实现方法 所以我们无法创建对象 抽象 一词指示编译器不要创建该类的对象 但是在一个简单的类中 我们拥有所有虚拟方法 能够创建对象 此外 我们可以定义不同的访问权限来
  • 从 HSV 直方图中获取主色值

    我正在根据如下图像创建 HSV 直方图 void processImageWithHsv Mat image Mat image hsv cvtColor image image hsv CV BGR2HSV int hbins 50 sb
  • 如何停止 IIS 要求对本地主机上的默认网站进行身份验证

    我在 Windows XP Pro SP2 上安装了 IIS 5 1 此外 我还安装了带有 NET 3 5 的 VS 2008 Express 显然 IIS 已针对 NET 3 5 自动配置为 ASP NET 问题是每当我访问http lo
  • 如何确保weak_ptr不是从临时的shared_ptr创建的?

    我们来上课吧Foo和方法void use weak ptr std weak ptr
  • ANDROID:无法解析方法 getSupportActionBar()

    这件事让我发疯 我似乎无法让我的应用程序正确编译 我通过复制 jar 文件 将它们放入 libs 文件夹 右键单击并将它们添加为库 在我的应用程序中添加了支持库 我已经尝试扩展 ActionBaractivity 但仍然没有任何方法无法识别
  • 关于 C# 泛型最重要的事情...经验教训 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 删除字符串中 JavaScript 代码中的新行

    我在 javascript 文件的源代码中有一个带有换行符的字符串 如下所示 var str new line 现在我想删除代码中的换行符 我找不到任何关于此的内容 我一直在获取相关内容 n and r 提前致谢 编辑 2021 这个问题是
  • 刚习惯在 OS X 上的 emacs 中进行 paredit - 为什么 C-) 不起作用?

    我最近在 Mac OS X Leopard 中设置了 Common Lisp 编程环境 我发现 paredit 是一个不可或缺的 emacs 模块 Paredit 正在尽力帮助我更轻松地处理我的 Lisp 代码 但我遇到了一些陷阱 C 必然
  • Mongoose.js 交易

    我知道 MongoDB 不像关系数据库那样支持事务 但我仍然想知道如何实现多个操作的原子性 在网上搜寻 我看到人们提到没有交易的交易 http www infoq com presentations Transactions without
  • 如何在 C++ 中可靠地检查一个 Windows 进程是否是另一个 Windows 进程的父进程?

    我正在开发一个函数 它可以获取给定 PID 的父进程的 PID 该函数的原型是 DWORD getParentPid DWORD pid 为此 我正在使用CreateToolhelp32Snapshot http msdn microsof