首页
学习
活动
专区
工具
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”库作为一个强大的工具出现,为我们提供了一个全面的、跨平台的系统信息检索和过程操作解决方案。此外,“子流程”模块解锁了新的维度,使我们能够毫不费力地生成进程和执行命令。

57630
  • 如何判断进程是在哪个容器中运行的?

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

    5.3K30

    【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表中存储的是函数指针,指向对应的处理动作 原理:我们只要改变我们要改变的信号

    13210

    【linux】进程等待与进程替换

    根据不同的状态宏,可以判断子进程是如何退出的,并做相应的处理。这种机制使得父进程能够详细了解子进程的退出原因,而不仅仅是它的退出码。...特定的位字段:表明子进程是否被信号中止、是否正常退出、是否由信号停止(这些信息是由 WIFEXITED、WIFSIGNALED 和 WIFSTOPPED 等宏检查)。...02.进程替换 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。...fork() 在父进程中返回子进程的 PID,在子进程中返回 0。 由于操作系统的调度策略,父进程和子进程之后的执行顺序是不确定的。...父进程检查 waitpid() 返回值以确认等待是否成功,并从状态码中提取具体的退出信息,正确处理并报告子进程的退出状态。

    7510

    psutil的Process python获取进程信息「建议收藏」

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

    2.6K20

    【Linux】————进程控制

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

    13010

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

    19220

    操作系统课设详细解答

    图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及其句柄。

    4K90

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

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

    36310

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

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

    52210

    如何绕过IsDebuggerPresent的反调试

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

    2.4K20

    如何通过特权句柄泄漏找到 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.6K30

    【Chromium中文文档】沙箱FAQ

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

    2.6K100

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

    深入理解浏览器原理

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

    4.7K31
    领券