结束进程
使用TerminateProcess直接结束进程,如果结束不了,则修改token获取SE_DEBUG_NAME特权,再次TerminateProcess结束进程。
//请求获取特权
BOOL CKillPSDlg::SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnable)
{
OutputDebugString(lpszPrivilege);
BOOL bRet = FALSE;
HANDLE hToken = NULL;
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, ::GetCurrentProcessId());
if (!::OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
{
goto __EXIT;
}
LUID Luid;
if (!::LookupPrivilegeValue(NULL, lpszPrivilege, &Luid))
{
goto __EXIT;
}
TOKEN_PRIVILEGES newPrivilege;
newPrivilege.PrivilegeCount = 1;
newPrivilege.Privileges[0].Luid = Luid;
newPrivilege.Privileges[0].Attributes = //设置特权属性
bEnable ?
SE_PRIVILEGE_ENABLED :
SE_PRIVILEGE_ENABLED_BY_DEFAULT;
if (!::AdjustTokenPrivileges(hToken, FALSE, &newPrivilege,
sizeof(TOKEN_PRIVILEGES), NULL, NULL))
{
CString s;
s.Format(_T("AdjustTokenPrivileges error: %u\n"), GetLastError());
OutputDebugString(s);
goto __EXIT;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)//查看是否真的设置成功了
{
OutputDebugString(_T("The token does not have the specified privilege. \n"));
goto __EXIT;
}
bRet = TRUE;
OutputDebugString(_T("Set OK"));
__EXIT:
if (hProcess)
{
::CloseHandle(hProcess);
}
if (hToken)
{
::CloseHandle(hToken);
}
return bRet;
}
BOOL CKillPSDlg::KillPS(DWORD id)//结束进程
{
HANDLE hProcess = NULL, hProcessToken = NULL;
BOOL IsKilled = FALSE, bRet = FALSE;
if ((hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, id)) != NULL)
{
if (TerminateProcess(hProcess, 1))
{
return TRUE;
}
}
__try
{
SetPrivilege(SE_DEBUG_NAME, TRUE);
if ((hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, id)) == NULL)
{
printf("\nOpen Process %d failed:%d", id, GetLastError());
__leave;
}
//printf("\nOpen Process %d ok!",id);
if (!TerminateProcess(hProcess, 1))
{
printf("\nTerminateProcess failed:%d", GetLastError());
__leave;
}
IsKilled = TRUE;
}
__finally
{
if (hProcessToken != NULL) CloseHandle(hProcessToken);
if (hProcess != NULL) CloseHandle(hProcess);
}
return(IsKilled);
}
void CKillPSDlg::OnBnClickedOk()
{
CString name;
GetDlgItemText(IDC_EDIT1, name);
if (!name.IsEmpty())//结束特定名字的进程
{
PROCESSENTRY32 pe;
auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(handle, &pe))
{
while (TRUE)
{
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32Next(handle, &pe))
break;
if (CString(pe.szExeFile).CompareNoCase(name) == 0)
{
KillPS(pe.th32ProcessID);
}
}
}
CloseHandle(handle);
}
CDialogEx::OnOK();
}
代码链接:
VS2015工程:http://download.youkuaiyun.com/detail/yangyang031213/9891564
https://github.com/yangyang0312/cpp/tree/master/windows/KillPS