杀死指定名称的进程(C++)
2014-10-08 22:54
344 查看
在windows下杀死某个运行的进程,可以利用C++提供的API函数来实现,用到的函数主要有以下几个
<pre class="syntax"><strong> CreateToolhelp32Snapshot</strong><span style="font-family: Arial, Helvetica, sans-serif;">:获得当前运行进程的WINAPI的句柄</span>
/************************************************************************/
/* params:
/* processName-指定的需要杀死的进程名
/* return value:
/* TRUE-找到并将该进程杀死
/* FALSE-没有找到该进程
/************************************************************************/
#include "Tlhelp32.h"
BOOL KillProcessByName(CString processName)
{
BOOL bRet = FALSE;
HANDLE SnapShot, ProcessHandle;
SHFILEINFO shSmall;
PROCESSENTRY32 ProcessInfo;
CString strSearchName;
CString strRunProcessName;
//get the process list in the snapshot.
SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(SnapShot != NULL)
{
//提升升级工具进程权限为SE_DEBUG_NAME,否则XP下无法杀掉进程
HANDLE hToken;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
{
LUID luid;
if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
{
TOKEN_PRIVILEGES TokenPrivileges;
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
TokenPrivileges.Privileges[0].Luid = luid;
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL);
}
CloseHandle(hToken);
}
BOOL Status = Process32First(SnapShot, &ProcessInfo);
while(Status)
{
// 获取进程文件信息
SHGetFileInfo(ProcessInfo.szExeFile, 0, &shSmall, sizeof(shSmall), SHGFI_ICON|SHGFI_SMALLICON);
// 检测进程是否需要关闭
if (processName==ProcessInfo.szExeFile)
{
// 获取进程句柄,强行关闭
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessInfo.th32ProcessID);
if (ProcessHandle != NULL)
{
bRet = TerminateProcess(ProcessHandle, 1);
CloseHandle(ProcessHandle);
}
}
// 获取下一个进程的信息
Status = Process32Next(SnapShot, &ProcessInfo);
}
}
return bRet;
}
<pre class="syntax"><strong> CreateToolhelp32Snapshot</strong><span style="font-family: Arial, Helvetica, sans-serif;">:获得当前运行进程的WINAPI的句柄</span>
Process32First:得到PROCESSENTRY32的一个变量
SHGetFileInfo:获取进程文件信息
OpenProcess:通过id获得进程句柄
TerminateProcess:通过 OpenProcess 获得的句柄杀死进程
源代码如下所示:
/************************************************************************/
/* params:
/* processName-指定的需要杀死的进程名
/* return value:
/* TRUE-找到并将该进程杀死
/* FALSE-没有找到该进程
/************************************************************************/
#include "Tlhelp32.h"
BOOL KillProcessByName(CString processName)
{
BOOL bRet = FALSE;
HANDLE SnapShot, ProcessHandle;
SHFILEINFO shSmall;
PROCESSENTRY32 ProcessInfo;
CString strSearchName;
CString strRunProcessName;
//get the process list in the snapshot.
SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(SnapShot != NULL)
{
//提升升级工具进程权限为SE_DEBUG_NAME,否则XP下无法杀掉进程
HANDLE hToken;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
{
LUID luid;
if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
{
TOKEN_PRIVILEGES TokenPrivileges;
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
TokenPrivileges.Privileges[0].Luid = luid;
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL);
}
CloseHandle(hToken);
}
BOOL Status = Process32First(SnapShot, &ProcessInfo);
while(Status)
{
// 获取进程文件信息
SHGetFileInfo(ProcessInfo.szExeFile, 0, &shSmall, sizeof(shSmall), SHGFI_ICON|SHGFI_SMALLICON);
// 检测进程是否需要关闭
if (processName==ProcessInfo.szExeFile)
{
// 获取进程句柄,强行关闭
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessInfo.th32ProcessID);
if (ProcessHandle != NULL)
{
bRet = TerminateProcess(ProcessHandle, 1);
CloseHandle(ProcessHandle);
}
}
// 获取下一个进程的信息
Status = Process32Next(SnapShot, &ProcessInfo);
}
}
return bRet;
}
相关文章推荐
- 杀死指定进程名称的小VBS
- 一行shell命令杀死指定进程名称的进程方法
- 转:shell杀死指定名称的进程
- linux 杀死指定名称进程
- 根据进程名称杀死指定进程
- linux使用脚本杀死指定名称的进程[zl]
- 杀死指定进程名称的小VBS
- linux使用脚本杀死指定名称的进程
- shell 杀死指定进程名称的进程方法
- linux使用脚本杀死指定名称的进程
- 如何用shell脚本杀死指定名称的进程
- 杀死指定进程名称的小VBS
- 如何杀死指定的进程
- MySQL 杀死指定用户的全部进程
- 快捷启动、停止、重启、杀死指定端口MySQL进程的sh脚本
- C++调用NTAPI枚举并强制关闭指定进程
- Linux kill 杀死指定进程
- IBM/AIX下找到占用指定端口的进程并杀死它
- Linux kill 杀死指定进程
- linux 批量杀死包含指定关键词的进程