结束进程

结束进程

使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值