windows下关闭进程树
关闭进程需要特定权限,如果你程序权限不够也会导致关闭进程失败。关闭进程树,需要遍历给定进程下的所有子进程,这个过程可以用并查集来做。
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下关闭进程树的更多相关文章
- windows下关闭指定端口服务,解决tomcat端口占用问题
http://blog.aizhet.com/Server/640.html 在windows下做java EE的开发时:搭建 Eclipse+tomcat的java web开发环境:在应用之中经常遇 ...
- windows下关闭自动更新方法
第一种方法: 1.windows+R键打开运行窗口,输入services.msc 2.找到windows update服务右键属性 第二种方法 Win键+R键在弹出的运行对话框中输入gpedit.ms ...
- windows下关闭进程
1.首先查找到占用8080端口的进程号PID是多少 CMD>netstat -ano | findstr 8888 这个命令输出的最后一列表示占用8080端口的进程号是多少,这里是5880 2. ...
- windows下关闭80端口被system占用的情况
用管理员运行cmd然后用net stop http 停止pid 为4的进程
- 批处理文件:windows下关闭指定端口
@echo offsetlocal enabledelayedexpansionset /p port=please input port number:for /f "tokens=1-5 ...
- windows下快速启动或关闭系统服务方法
在windows下有些后台服务会开机自动启动. 用命令行方式启动关闭应用服务 使用sc.exe命令功能列表 修改服务启动类型的命令行格式为(特别注意start=后面有一个空格) sc config 服 ...
- windows下启动/关闭Sybase数据库服务器
启动.关闭Sybase数据库服务器 一.启动Sybase服务器 在windows下介绍两种方法启动Sybase数据库服务器. 1.通过服务器管理器 依次打开控制面板>管理工具>服务 管理窗 ...
- windows和linux下关闭Tomcat进程
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
- Windows下Mysql数据库服务的关闭和重启
有时我们在手动修改了Mysql的配置文件之后,我们要重启Mysql服务才能使之生效,这里提供几种重启方法: 1.windows下重新启动mysql5的方法:在安装mysql时系统会添加服务,可以通过管 ...
随机推荐
- java查询MySQL时,MySQL中tinyint长度为1时转换为boolean
看到别人代码,MySQL数据库中,有下面这个字段,tinyint(1) 这时候java代码中取出来的数据类型就是boolean类型,如果长度 > 1的话,就会变成int类型,特意查了一下,这里参 ...
- java连接数据库(经常用)
一.配置环境 1.首先下载sqlserver2008驱动文件,找到sqljdbc4.jar文件,将这个文件拷到C:\Program Files\Java\jdk1.8.0_121\jre\lib\ex ...
- Linux下汇编语言学习笔记71 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- xcode5下取消ARC
打开你的工程,点击目录的工程文件,最顶端蓝色的,然后选择project下你的工程,还是蓝色那项,然后build Settings,然后往下拉,在Apple LLVM 5.0 - Language - ...
- Ubuntu 16.04下Markdown编辑器Haroopad
1.下载deb包 地址:https://bitbucket.org/rhiokim/haroopad-download/downloads/haroopad-v0.13.2-x64.deb 这里是历史 ...
- 1.3-动态路由协议EIGRP②
LAB3:Wildcard Mask in EIGRP (通过反掩码,控制运行EIGRP的接口的范围 作用:控制有哪些接口在运行EIGRP) ~~~~~~~~~~~~~~~~~ ...
- Redis源代码分析(三十)--- pubsub公布订阅模式
今天学习了Redis中比較高大上的名词,"公布订阅模式".公布订阅模式这个词在我最開始接触听说的时候是在JMS(Java Message Service)java消息服务中听说的. ...
- Android开发之ListView实现不同品种分类分隔栏的效果(非ExpandableListView实现)
我们有时候会遇到这么一个情况.就是我在一个ListView里面须要显示的东西事实上是有种类之分的.比方我要分冬天,夏天.秋天.春天,然后在这每一个季节以下再去载入各自的条目数据. 还有,比方我们的通讯 ...
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- Java 实现抽象工厂模式
抽象工厂模式 里面有几个概念:抽象工厂.实体工厂.抽象产品.实体产品 抽象工厂:定义创建产品的抽象方法 实体工厂:详细的创建哪种产品 抽象产品:一个接口或基类 实体产品:实现详细功能,或派生 类图 ...