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;
}
最新文章
- HTML <;fieldset>; 标签
- Linux中/proc目录下文件详解
- thinkphp 删除多条记录
- .Net语言 APP开发平台——Smobiler学习日志:开发APP时,如何快速地实现屏幕自适应
- bzoj 3672: [Noi2014]购票 树链剖分+维护凸包
- 谈谈SpringMVC Validation
- T-SQL开窗函数
- .NET Core 2.0体验
- Win10开启“上帝模式”
- Map Task内部实现分析
- Hidden Markov Models(HMM) 初理解
- 什么是,session、cookies、token
- RBMQ发布和订阅消息
- Ant 与jemter的结合--批量执行jmeter脚本
- [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现
- POJ 2155 Matrix(二维BIT)
- vo和pojo
- django,flask接口初试
- java中正则表达式基本用法(转)
- xlrd模块学习