首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

要可靠地检查一个Windows进程是否是C++中另一个进程的父进程,可以使用Windows API函数NtQueryInformationProcess。以下是一个示例代码:

代码语言:cpp
复制
#include<iostream>
#include<Windows.h>
#include <TlHelp32.h>
#include <winternl.h>

typedef LONG(NTAPI *_NtQueryInformationProcess)(
    HANDLE ProcessHandle,
    PROCESSINFOCLASS ProcessInformationClass,
    PVOID ProcessInformation,
    ULONG ProcessInformationLength,
    PULONG ReturnLength);

bool IsParentProcess(DWORD parentId, DWORD childId)
{
    _NtQueryInformationProcess NtQueryInformationProcess = (_NtQueryInformationProcess)GetProcAddress(GetModuleHandleA("ntdll"), "NtQueryInformationProcess");

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, childId);
    if (hProcess == NULL)
        return false;

    ULONG cbBuffer = sizeof(PROCESS_BASIC_INFORMATION);
    PROCESS_BASIC_INFORMATION pbi = {0};

    NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, cbBuffer, NULL);
    if (status != 0)
        return false;

    return pbi.InheritedFromUniqueProcessId == parentId;
}

int main()
{
    DWORD parentProcessId = 1234; // 替换为要检查的父进程ID
    DWORD childProcessId = 5678; // 替换为要检查的子进进程ID

    if (IsParentProcess(parentProcessId, childProcessId))
        std::cout << "子进程是父进程的子进程"<< std::endl;
    else
        std::cout << "子进程不是父进程的子进程"<< std::endl;

    return 0;
}

这个代码示例使用了NtQueryInformationProcess函数来获取进程的基本信息,并检查InheritedFromUniqueProcessId字段是否与给定的父进程ID匹配。如果匹配,则说明子进程是父进程的子进程。

请注意,这个代码示例仅适用于Windows操作系统,并且需要管理员权限才能运行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何进程读取子(外部)进程标准输出和标准错误输出结果

最近接手一个小项目,要求使用谷歌aapt.exe获取apk软件包信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程输出结果,当时还研究了一番,只是没有做整理。...但是,实际情况并不是我们想那么简单。比如我文前提到问题:别人提供了一个Console控制台程序,我们将如何获取其执行输出结果呢?...这个问题,从微软以为为我们考虑过了,我们可以从一个API可以找到一些端倪——CreateProcess。...我们之后将hWrite交给我们创建进程,让它去将信息写入管道。而我们进程,则使用hRead去读取子进程写入管道内容。...我想应该有人借用过网上相似的代码,但是却发现一个问题,就是读取出来信息不全。这个问题关键就在读取方法上,其实没什么玄妙,只要控制好读取起始位置就行了。

3.8K10

如何在 Python 终止 Windows 上运行进程

在这篇综合性文章,我们将探讨各种方法来完成使用 Python 终止 Windows 上运行进程任务。...方法1:使用多功能“os”模块 “os”模块Python与操作系统交互基石,拥有丰富功能。其中,“system()”函数提供了一个执行操作系统命令网关。...值得注意Windows利用“taskkill”命令来终止活动进程。...shell=True' 参数在 Windows 命令外壳执行命令时变得不可或缺。 结论 在这次深入探索,我们阐明了使用 Python 终止 Windows 上运行进程三种不同方法。...“psutil”库作为一个强大工具出现,为我们提供了一个全面的、跨平台系统信息检索和过程操作解决方案。此外,“子流程”模块解锁了新维度,使我们能够毫不费力地生成进程和执行命令。

44330
  • 如何判断进程在哪个容器运行

    在某些情况下,可能在宿主机上存在“看得到却摸不到”进程;有的时候容器太多,想知道进程具体哪个容器运行?...我们来尝试下: 首先在容器test目录下运行sleep 10000 在宿主机ps能看到对应进程 看对应proc下cwd,也确实和容器路径一样,在/test目录下,但是宿主机实际上并没有这个路径...大概率可以判断这个进程不是在宿主机上,可以通过如下这个命令判断命令是否在容器执行: ps -e -o pid,cmd,comm,cgroup 可以看到pid为29656cgroup在docker...或者cat对应进程cgroup也可以: cat /proc/xxxx/cgroup 和我们执行sleep命令容器一致: 因此可以得出结论,pid为29656进程在 bf85501b3084601ba76b8cb303917134d58b5e7783c14c1636ff1c56a3d83c1f...容器里执行

    5K30

    如何在 Linux 查找一个命令或进程执行时间

    在类 Unix 系统,你可能知道一个命令或进程开始执行时间,以及一个进程运行了多久。 但是,你如何知道这个命令或进程何时结束或者它完成运行所花费总时长呢?...在 Linux 查找一个命令或进程执行时间 要测量一个命令或程序执行时间,运行: $ /usr/bin/time -p ls 或者, $ time ls 输出样例: dir1 dir2 file1...参考如下教程了解更多细节: 在 Linux 如何一个命令运行特定时长 time 与 /usr/bin/time 你可能注意到了, 我们在上面的例子中使用了两个命令 time 和 /usr/bin/...内建关键字 一个可执行文件,如 /usr/bin/time 由于 shell 关键字优先级高于可执行文件,当你没有给出完整路径只运行 time 命令时,你运行 shell 内建命令。...$ man time 想要了解有关 Bash 内建 time 关键字更多信息,请运行: $ help time 总结 以上所述小编给大家介绍在 Linux 查找一个命令或进程执行时间,希望对大家有所帮助

    1.7K21

    psutilProcess python获取进程信息「建议收藏」

    进程是否还在运行 :is_running() 返回此进程是否正在运行。它还检查PID是否已被另一个进程重用,在这种情况下返回False。 s.is_running() 6....进程对象:parent() 预先返回进程作为进程对象,检查PID是否已被重用。如果没有节点,则返回None。 s.parent() 7. 进程pid :ppid() 进程PID。...在Linux上,ioclassioprio_class_常量之一。value一个从0到7数。值越高,进程I/O优先级越低。...在Windows上,这将不会挂起所有进程线程。 29. 恢复进程:resume() 使用SIGCONT预先检查PID是否已被重用,恢复进程执行。在Windows上,这可以恢复所有进程线程。 30....终止进程:terminate() 使用SIGTERM提前终止进程检查PID是否已被重用。在Windows上,这是kill()别名。 31.

    2.4K20

    如何编写bash脚本以便在进程死机时重新启动进程

    问: 我有一个python脚本,它将检查队列并对每个元素执行操作: # checkqueue.py while True: check_queue() do_something() 我如何编写一个...bash脚本来检查是否正在运行,如果没有,则启动它。...假设你进程名为procA,监控它进程名为procB,则需要procB成为procA进程。因为只有启动你进程进程才能可靠地等待它结束。而这在Bash很容易实现。...PID重用(可能导致杀死错误进程)。 2. PID文件过时。你需要过于更复杂逻辑来检查PID文件是否过时,而任何这样逻辑都同样有1缺陷。 3....你可以在/lib/systemd/system目录添加一个名为procA.service配置文件,让systemd进程监控你procA。

    17920

    操作系统课设详细解答

    图1-1 一个简单 Windows 控制台应用程序输出结果 (2)创建进程 本实验显示了创建子进程基本框架。该程序只是再一次地启动自身,显示它系统进程 ID和它在进程列表位置。...,通过while((x=fork())== -1)判断创建进程是否成功,如果x>0,则继续创建子进程,若成功,则此时有两个子进程一个进程,先创建进程会输出c,接下来进程执行完毕,输出a,后面后创建进程执行完毕输出...在Linux利用fork建立一个进程进程继续运行,子进程在同样位置执行同样程序。...对于进程,fork()返回子进程 pid, 对于子进程,fork()返回 0,出错时返回-1,while((x=fork())==-1)这句话用来判断子进程是否能创建成功,而且当x=0时运行子进程...,生产者消费者问题一个典型例题,主要涉及同步与互斥,这也保证了在程序运行过程只能有一个线程进行。

    1K20

    进程和线程创建过程

    Flags 创建标志,其中有一个标志PROCESS_CREATE_FLAGS_INHERIT_HANDLES 特别值得一提:NtCreateProcess专门有一个布尔参数指定是否该标志为TRUE,表明新进程对象句柄表是否要复制进程句柄表...对于有进程进程不是PsInitialSystemProcess 进程,首先执行访问检查,然后计算进程访问权限。...如果这是进程一个线程,则判断系统是否支持应用程序预取特性,如果,则通知缓存管理器预取可执行映像文件页面(见2 106 行CcPfBeginAppLaunch调用)。...,如何以对象方式来管理它们,并创建和初始化进程和线程,使它们变成真正可以工作功能实体。...然后检查是否一个线程已被选出来作为该处理器上运行一个线程,如果有,则分发该线程,使它运行。

    1.6K20

    vc++ 在程序运行另一个程序方法

    在vc++ 程序运行另一个程序方法有三个: WinExec(),ShellExcute()和CreateProcess() 三个SDK函数: WinExec,ShellExecute ,CreateProcess...lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回句柄是否可被子进程继承。   ...lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回句柄是否可被子进程继承。   ...lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程主窗口将如何显示。   ...其返回值布尔型,而真正感兴趣返回值发生于作为参数传送结构(PROCESS_INFORMATION)。CreateProcess返回该结构进程ID及其句柄,以及初始线程ID及其句柄。

    3.8K90

    这些操作系统概念,保你没听过!

    在这种情形下,操作系统会检查是否有其他可以运行进程。这样,当有用户输入 时候,进程会提醒操作系统,然后返回第 9 步继续运行。...在 fork 之后,原有进程以及副本(与子)就分开了。在 fork 过程,所有的变量都有相同值,虽然进程数据通过复制给子进程,但是后续对其中任何一个进程修改不会影响到另外一个。...fork 调用会返回一个值,在子进程该值为 0 ,并且在进程中等于子进程 进程标识符(Process IDentified,PID)。使用返回 PID,就可以看出来哪个进程和子进程。 ?...Windows 没有类似 UNIX 进程层次,所以不存在进程和子进程概念。在进程创建之后,创建者和被创建者平等。...服务器中有一个特殊服务器称为 再生服务器(reincarnation server),它任务就是检查服务器和驱动程序功能是否正确,一旦检查出来错误,它就会补上去,无需用户干预。

    35110

    【Chromium中文文档】沙箱FAQ

    什么沙箱? 沙箱一个允许沙箱进程创建C++库,沙箱进程一种运行在非常限制性环境进程。沙箱进程可以唯一自由使用资源CPU周期和内存。例如,沙箱进程不能写磁盘或者显示他们自己窗口。...沙箱一个纯用户模式库,任何用户可以运行沙箱化进程。 如果没有虚拟机,你该怎样用C++实现沙箱? 我们为Windows安全模型划分等级。...在Windows里,没有进行系统调用的话,代码不能执行任何形式I/O(无论磁盘,键盘,还是显示器)。在大多数系统调用里,Windows执行一些安全检查。...沙箱会设置好环境,这样你不愿沙箱化进程执行动作就会因安全检查而失败。在Chromium,沙箱就是这样,因此所有访问检查都会失败。 所以一个沙箱化进程(比如渲染器)如何完成任务?...一个进程具有比较高优先级,执行I/O,与用户进行交互;另一个进程基本上没有什么优先权力,并执行不受信任数据处理。 需要做很多工作吗? 可能需要。

    2.6K100

    这些操作系统概念,保你都听过!

    在这种情形下,操作系统会检查是否有其他可以运行进程。这样,当有用户输入 时候,进程会提醒操作系统,然后返回第 9 步继续运行。...在 fork 之后,原有进程以及副本(与子)就分开了。在 fork 过程,所有的变量都有相同值,虽然进程数据通过复制给子进程,但是后续对其中任何一个进程修改不会影响到另外一个。...fork 调用会返回一个值,在子进程该值为 0 ,并且在进程中等于子进程 进程标识符(Process IDentified,PID)。使用返回 PID,就可以看出来哪个进程和子进程。 ?...Windows 没有类似 UNIX 进程层次,所以不存在进程和子进程概念。在进程创建之后,创建者和被创建者平等。...服务器中有一个特殊服务器称为 再生服务器(reincarnation server),它任务就是检查服务器和驱动程序功能是否正确,一旦检查出来错误,它就会补上去,无需用户干预。

    51010

    如何通过特权句柄泄漏找到 UAC 提权和绕过

    本质上,我们目标了解我们是否以及如何自动搜索持有有价值资源句柄非特权(即中等完整性)进程,例如高完整性进程(也称为提升进程)、SYSTEM 进程或属于进程线程提及。...把手 101 正如我在这个Twitter 线程简要讨论那样,Windows 一个基于对象操作系统(不要与面向对象编程语言相混淆,后者另外一回事)。...(true / false),用于指定函数返回句柄是否必须可继承,这意味着,如果调用进程随后创建子进程,OpenProcess则将复制返回句柄以及访问级别,在子进程句柄表 dwProcessId...在循环每次迭代结束时,while我们执行函数Process32NextW并使用快照包含一个进程数据填充processEntry,直到我们检查了快照所有进程。...对于这些过程一个,我们使用 function 来检查完整性级别,这是一个我编写并改编自 MSDN 上可用许多在线 PoC 和函数辅助函数。

    96930

    Windows核心编程+第一个内核程序】爆肝120小时整理-80%程序员最欠缺能力,一半以上研究生毕业了还不懂?理解各种深度技术基本功

    这个内存块一个数据结构,其成员维护着与对象相关信息。 3. 应用程序如何操纵这些内核对象呢? 答案利用 Windows 提供一组函数,以经过良好定义方式来操纵这些结构。...在 32 位 Windows 进程,句柄一个32 位值;在 64 位 Windows 进程,则是一个 64 位值。...所以,如果将句柄值传给另一个进程线程(通过某种进程间通信方式),那么另一个进程用你进程句柄值来发出调用时,就可能失败;甚至更糟,它们会在你进程句柄表一个索引位置处,创建到一个完全不同内核对象引用...在下一节,我们要讨论如何利用三种不同机制来允许进程共享内核对象:使用对象句柄继承;为对象命名;以及复制对象句柄: 1.使用对象句柄继承 只有在进程之间有一个–子关系时候,才可以使用对象句柄继承...这是通过 CreateProcess 函数来完成,如下所示: 接下来谈谈在进程句柄表记录项中保存标志。句柄表每个记录项都有一个指明句柄是否可以继承标志位。

    1.2K30

    如何绕过IsDebuggerPresent反调试

    -1-1.html 反调试 什么反调试技术 反调试技术,顾名思义就是用来防止被调试一种技术 简单反调试往往识别是否被调试,如果则退出程序,封禁账号等等 (检测) 再复杂些可以在反汇编代码插入花指令...反调试手段层出不穷,可以分为两类: 0环,内核级调试 3环,用户应用层调试 之前写对抗沙盒时候:判断进程是否explorer.exe,不是则退出,似乎也可以作为一种简单反调试手段,之前没怎么了解过反调试...确定是否正在调试指定进程。...64位,MFC做,c++,没壳 ASLR 什么ASLR 维基百科:在计算机科学,地址空间配置随机加载(英语:Address space layout randomization,缩写ASLR...lstrcmpi函数对一个CString和另一个CString进行比较 返回值为: 由参数lpsz指定这个用于比较string。

    2.2K20

    用 SetWindowPos 方法设置一个停止响应窗口将卡调用方

    经过调试发现出现问题时候,采用 SetWindowPos 设置窗口句柄确实是属于另一个进程窗口,而另一个进程刚好也是处于无响应状态。...也就是说本质原因另一个进程无响应,导致了当前进程通过 SetWindowPos 设置另一个进程窗口,由于另一个进程无响应,没有处理 Windows 消息,从而让当前进程阻塞也无响应 学到知识: 如果某个应用调用...SetWindowPos 方法阻塞,那么优先调试调用 SetWindowPos 方法传入窗口句柄参数,通过窗口句柄寻找对应进程,调查对应进程是否无响应或者窗口所在线程没有继续处理 Windows...项目,这个项目的功能在点击按钮时,让主线程卡住,也就是让 UI 线程不处理 Windows 消息,模拟一个未响应进程 在 WpfApp1 项目的 MainWindow.xaml 上放一个按钮,这个按钮就是点击时候...进程卡在调用 SetWindowPos 方法,如何预期 以下就是 NawnayarlallliwurHifowaleeli 调用堆栈 win32u.dll!

    80320

    WinExec, ShellExecute, CreateProcess

    在vc++ 程序运行另一个程序方法有三个: WinExec(),ShellExcute()和CreateProcess() 三个SDK函数: WinExec,ShellExecute ,CreateProcess...uCmdShow:定义Windows应用程序窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数wShowWindow成员值。   ...lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程主窗口将如何显示。   ...其返回值布尔型,而真正感兴趣返回值发生于作为参数传送结构(PROCESS_INFORMATION)。CreateProcess返回该结构进程ID及其句柄,以及初始线程ID及其句柄。...lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程主窗口将如何显示。

    1.4K20

    深入理解浏览器原理

    了解浏览器及其原理可以让我们打开另一个世界。 1. 浏览器引擎 以下市面留存主流浏览器引擎介绍。...2.1.3 渲染过程管理 RenderProcess:每个渲染进程都有一个全局对象,管理与浏览器通信并维护全局状态 RenderProcessHost:浏览器为每个渲染进程维护相应渲染进程宿主,...)访问,而须通过浏览器进程访问 内存交回:进程最小化、隐藏选项卡将其内存自动放入“可用内存”,内存不足时,windows会将该可用内存数据写磁盘,内存被用于更高优先级任务,以提高可见程序响应速度...2.3 V8 V8Google开源高性能JavaScript和WebAssembly引擎,用C++编写,它实现ECMAScript和WebAssembly,可独立运行或嵌入到任何C++应用程序,如...4.3 安全检查 恶意名单检查:如果域和响应数据在恶意站点名单,则网络线程发出和显示警告页面。 跨域读取检查:CrossOriginReadBlock检查,敏感跨站点数据不进入渲染器进程 5.

    4.6K31

    C和C++安全编码笔记:文件IO

    绝对路径名以一个文件分割字符开始(在POSIX系统,通常是一个正斜杠”/”,而在Windows系统反斜杠”\”),这意味着路径名一个文件名前面这个进程根目录。...长度为零文件(在它上面没有已写入输出流字符)是否确实存在实现定义。关闭文件可能随后被相同或另一个程序执行重新打开,并且其内容被回收或修改。...一种常见利用攻击耗尽可用文件描述符数量来发动拒绝服务(Dos)攻击。打开文件描述符一个进程或一组进程正在如何访问文件记录。文件描述符只是一个标识符或句柄,它实际上并没有描述什么。...login程序检查/etc/passwd或shadow文件/etc/shadow来确定用户名是否对应到该系统上有效用户,并检查提供密码是否与该UID所关联密码对应。 ...进程特权:实际用户ID(Real User ID, RUID)启动该进程用户ID,它与进程用户ID相同,除非它被改变。

    94300
    领券