关闭进程需要特定权限,如果你程序权限不够也会导致关闭进程失败。关闭进程树,需要遍历给定进程下的所有子进程,这个过程可以用并查集来做。

    1、编写获取进程父进程的代码

    

#define ProcessBasicInformation 0  

typedef struct
{
DWORD ExitStatus;
DWORD PebBaseAddress;
DWORD AffinityMask;
DWORD BasePriority;
ULONG UniqueProcessId;
ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION; typedef LONG (__stdcall *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG); DWORD GetParentProcessID(DWORD dwProcessId)
{
LONG status;
DWORD dwParentPID = (DWORD)-;
HANDLE hProcess;
PROCESS_BASIC_INFORMATION pbi; PROCNTQSIP NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(
GetModuleHandle("ntdll"), "NtQueryInformationProcess"); if(NULL == NtQueryInformationProcess)
{
return (DWORD)-;
}
// Get process handle
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE, dwProcessId);
if (!hProcess)
{
return (DWORD)-;
} // Retrieve information
status = NtQueryInformationProcess( hProcess,
ProcessBasicInformation,
(PVOID)&pbi,
sizeof(PROCESS_BASIC_INFORMATION),
NULL
); // Copy parent Id on success
if (!status)
{
dwParentPID = pbi.InheritedFromUniqueProcessId;
} CloseHandle (hProcess); return dwParentPID; }

      2、并查集find的代码

    

DWORD FindParentPID(std::map<DWORD,DWORD>& mapPPID,DWORD dwParentPID)
{
if(mapPPID.find(dwParentPID) == mapPPID.end() || mapPPID[dwParentPID]==dwParentPID)
return dwParentPID;
DWORD root = FindParentPID(mapPPID,mapPPID[dwParentPID]);
mapPPID[dwParentPID] = root;
return root;
}

3、通过进程id来结束进程树代码

  

BOOL StopProcessTree(DWORD dwProcessID)
{

    HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32 info;
    info.dwSize = sizeof(PROCESSENTRY32);
    Process32First(handle, &info);
    std::map<DWORD,DWORD> mapPID; //key为进程id,val为根进程id。
    while (Process32Next(handle, &info) != FALSE)
    {
      DWORD dwPPID= GetParentProcessID(info.th32ProcessID); //找直接上一级的父进程
      if(info.th32ProcessID == dwProcessID)
      {
        mapPID[dwProcessID] = dwProcessID;
      }
      else if(dwPPID != (DWORD)-1)
      {
        mapPID[info.th32ProcessID] = dwPPID;
      }
    }
    ::CloseHandle(handle);


    BOOL bRet = TRUE;
    //使用并查集原理优化查询特定进程的进程树效率。
    for(std::map<DWORD,DWORD>::iterator iter = mapPID.begin();iter != mapPID.end();iter++)
    {
      DWORD dwTempPID = iter->first;
      if(FindParentPID(mapPID,dwTempPID)==dwProcessID)
      {
        HANDLE hProcess= OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwTempPID);
        bRet = TerminateProcess(hProcess,0)?bRet:FALSE;
        ::CloseHandle(hProcess);
      }
    }

    return bRet;

}

4、通过进程名来结束进程树

BOOL StopProcessByName(LPCTSTR pszProcessName)
{
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
PROCESSENTRY32 info;
info.dwSize = sizeof(PROCESSENTRY32);
Process32First(handle, &info);
BOOL bRet = TRUE;
while (Process32Next(handle, &info) != FALSE)
{
CString csProcessName = pszProcessName;
CString csExeFile = info.szExeFile;
if(csExeFile.CompareNoCase(csProcessName)==)
{
StopProcessTree(info.th32ProcessID);
break;
}
}
::CloseHandle(handle);
return bRet;
}

windows下关闭进程树的更多相关文章

  1. windows下关闭指定端口服务,解决tomcat端口占用问题

    http://blog.aizhet.com/Server/640.html 在windows下做java EE的开发时:搭建 Eclipse+tomcat的java web开发环境:在应用之中经常遇 ...

  2. windows下关闭自动更新方法

    第一种方法: 1.windows+R键打开运行窗口,输入services.msc 2.找到windows update服务右键属性 第二种方法 Win键+R键在弹出的运行对话框中输入gpedit.ms ...

  3. windows下关闭进程

    1.首先查找到占用8080端口的进程号PID是多少 CMD>netstat -ano | findstr 8888 这个命令输出的最后一列表示占用8080端口的进程号是多少,这里是5880 2. ...

  4. windows下关闭80端口被system占用的情况

    用管理员运行cmd然后用net stop http 停止pid 为4的进程

  5. 批处理文件:windows下关闭指定端口

    @echo offsetlocal enabledelayedexpansionset /p port=please input port number:for /f "tokens=1-5 ...

  6. windows下快速启动或关闭系统服务方法

    在windows下有些后台服务会开机自动启动. 用命令行方式启动关闭应用服务 使用sc.exe命令功能列表 修改服务启动类型的命令行格式为(特别注意start=后面有一个空格) sc config 服 ...

  7. windows下启动/关闭Sybase数据库服务器

    启动.关闭Sybase数据库服务器 一.启动Sybase服务器 在windows下介绍两种方法启动Sybase数据库服务器. 1.通过服务器管理器 依次打开控制面板>管理工具>服务 管理窗 ...

  8. windows和linux下关闭Tomcat进程

    windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

  9. Windows下Mysql数据库服务的关闭和重启

    有时我们在手动修改了Mysql的配置文件之后,我们要重启Mysql服务才能使之生效,这里提供几种重启方法: 1.windows下重新启动mysql5的方法:在安装mysql时系统会添加服务,可以通过管 ...

随机推荐

  1. hdu 3804树链剖分+离线操作

    /* 树链刨分+离线操作 题意:给你一棵树,和询问x,y 从节点x--节点1的小于等于y的最大值. 解:先建一个空树,将树的边权值从小到大排序,将询问y按从小到大排序 对于每次询问y将小于等于y的边权 ...

  2. [USACO09JAN]全流Total Flow

    题目描述 Farmer John always wants his cows to have enough water and thus has made a map of the N (1 < ...

  3. codevs1009 产生数

    题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规 ...

  4. java实现WebService 以及客户端不同的调用方式

    java 实现WebService 以及不同的调用方式 webservice:    就是应用程序之间跨语言的调用    wwww.webxml.com.cn    1.xml    2.    ws ...

  5. 从理论到实践,全方位认识DNS(实践篇)

    在理论篇中,我们基本了解了DNS的整个协议原理,但是可能还会有着下面的疑问: 为什么我想申请的域名都没了? DNS 域名还要备案,这是为什么啊? 如何将刚申请的域名绑定到自己的网站呢? 怎么才能看到那 ...

  6. ubuntu 建立加密分區及其安全刪除

    加密分區1: sudo apt-get install cryptsetup2: 用“磁盤實用工具“,建立新的分區 或者 格式化現有分區,且勾選“加密底層設備“,按提示設定密碼3:同時選擇加密條件:i ...

  7. (寻找第K小的数&amp;&amp;寻找第K小的数的和)

    这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了 ...

  8. 快速编译system.img和boot.img的方法【转】

    本文转载自:http://www.cnblogs.com/wanqieddy/archive/2012/10/22/2734024.html 快速编译system.img,可以使用这个命令: #mak ...

  9. RAID5配置及服务器2003系统安装方法。2000系统的安装要使用7.9版本的引导盘

    服务器2003系统安装方法.2000系统的安装要使用7.9版本的引导盘 RAID5配置: 1.为新到的惠普DL380服务器装系统,首先要配置RAID阵列. 如下图进行配置. 启动到如上图阶段,按F8. ...

  10. [POI 2018] Prawnicy

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5102 [算法] 首先,n条线段的交集一定是[Lmax,Rmin] , 其中,Lmax ...