首页
学习
活动
专区
工具
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.9K10

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

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

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

    在某些情况下,可能在宿主机上存在“看得到却摸不到”进程;有的时候容器太多,想知道进程具体哪个容器运行?...我们来尝试下: 首先在容器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...容器里执行

    5.1K30

    如何在 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

    【Linux】解析在【进程PCB】如何实现【信号处理方式(抵达未决阻塞)】

    注意,阻塞和忽略不同,只要信号被阻塞就不会递达,而忽略在递达之后可选一种处理动作 二.信号处理动作在内核表示 1.示意图&作用机制介绍&信号集sigeset_t介绍...(pending),还有一个函数指针表示处理动作 信号集(sigeset_t): 这个类型可以表示每个信号“有效”或“无效”状态; 非0即1 在阻塞信号集中“有效”和“无效”含义该信号是否被阻塞...而在未决信号集中“有效”和“无效”含义该信号是否处于未决状态 信号集表表作用机制: 信号产生时,pending位图为1;递达后设置为0——只要block位图为1,就无法递答 阻塞信号,设置...block位图为1;阻塞状态解除后设置成0; 2.演示在三张表表示 演示: 3.如何改变信号默认实现动作 【1】实现原理:设置信号【默认处理函数】变成【自定义函数】 每个进程...PCB 都有如下图所示三张表,分别叫做 阻塞信号集,未决信号集,处理动作集 ,对应各个信号(1-64) 其中handler表存储函数指针,指向对应处理动作 原理:我们只要改变我们要改变信号

    12610

    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.5K20

    【Linux】————进程控制

    一、程序地址空间: 1、C/C++程序地址空间: ​ 在c++我们了解了这样空间分布图。 我们应如何去创建和访问变量呢?...二、进程创建: 1.作者主页 在linuxfork函数时非常重要函数,它从已存在进程创建一个进程。新进程为子进程,而原进程进程。 ​...另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”kill -9 也无能为力,因为谁也没有办法杀死一个已经死去进程。 最后,进程派给子进程任务完成的如何,我们需要知道。...如,子进程运行完成,结果对还是不对,或者是否正常退出。 进程通过进程等待方式,回收子进程资源,获取子进程退出信息。...2.进程程序替换原理 用fork创建子进程后执行进程相同程序(但有可能执行不同代码分支),子进程往往要调用一种exec函数以执行另一个程序。

    11910

    如何编写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。

    18720

    操作系统课设详细解答

    图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时运行子进程...,生产者消费者问题一个典型例题,主要涉及同步与互斥,这也保证了在程序运行过程只能有一个线程进行。

    1.1K20

    进程和线程创建过程

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

    1.7K20

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

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

    3.9K90

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

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

    51610

    【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),它任务就是检查服务器和驱动程序功能是否正确,一旦检查出来错误,它就会补上去,无需用户干预。

    35810

    如何绕过IsDebuggerPresent反调试

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

    2.3K20

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

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

    1K30

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

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

    1.4K30

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

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

    84320

    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
    领券