枚举进程

全部代码//
bool CMy20130608Dlg::DebugPrivilege(const char *PName, BOOL bEnable)
{
    bool              bResult = TRUE;
    HANDLE            hToken;
    TOKEN_PRIVILEGES  TokenPrivileges;
    
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
        bResult = FALSE;
        return bResult;
    }
    TokenPrivileges.PrivilegeCount = 1;
    TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
    
    LookupPrivilegeValue(NULL, PName, &TokenPrivileges.Privileges[0].Luid);
    AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
    if (GetLastError() != ERROR_SUCCESS)
    {
        bResult = FALSE;
    }
    
    CloseHandle(hToken);
    return bResult;    
}

void CMy20130608Dlg::EnumProcess()
{
    m_list.DeleteAllItems();
    
    //提升权限
    DebugPrivilege(SE_DEBUG_NAME, TRUE);

    //CreateToolhelp32Snapshot函数通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照.
    //说到底,可以获取系统中正在运行的进程信息,线程信息,等
    //参数一:用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
    //参数二:一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
    HANDLE            hSnapshot = NULL;
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    //创建系统快照  
    if(hSnapshot == INVALID_HANDLE_VALUE)  return;
    
    //进程中的模块
    HMODULE            hModules  = NULL;
     DWORD            cbNeeded;
    //进程的ID
     CString            strProcessID;
    //进程的完整名称(包含路径)
     char            strProcessName[MAX_PATH] = {0};

    PROCESSENTRY32    pe32      = {0};
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if(Process32First(hSnapshot, &pe32))//process32First函数来获得第一个进程的句柄.
    {
        HANDLE            hProcess  = NULL;
        do
        {      
            //打开进程句柄
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, pe32.th32ProcessID);
            if ((pe32.th32ProcessID !=0 ) && (pe32.th32ProcessID != 4) && (pe32.th32ProcessID != 8))
            {
                //枚举进程的第一个模块其实就是自身
                EnumProcessModules(hProcess, &hModules, sizeof(hModules), &cbNeeded);

                //根据模块得到模块的名字
                GetModuleFileNameEx(hProcess, hModules, strProcessName, sizeof(strProcessName));
                
                m_list.InsertItem(0, pe32.szExeFile);       //进程的名字
                strProcessID.Format("%d",pe32.th32ProcessID);  
                m_list.SetItemText(0, 1, strProcessID);      
                m_list.SetItemText(0, 2, strProcessName);    
            }
        }
        //得到快照中下一个进程
        while(Process32Next(hSnapshot, &pe32));         
    }
    
    //降低权限
    DebugPrivilege(SE_DEBUG_NAME, FALSE);
    //关闭句柄
    CloseHandle(hSnapshot);                     
}
void CMy20130608Dlg::OnButFlash()
{
    // TODO: Add your control notification handler code here
    EnumProcess();
}
//强制结束进程
void CMy20130608Dlg::OnButExit()
{
    // TODO: Add your control notification handler code here
    HANDLE hProcess = NULL;
    CString strProcessID;
    DWORD dwProcessID;
    int nSelect=m_list.GetSelectionMark();       //得到选中的条目
    if (nSelect<0)
    {
        return;
    }
    DebugPrivilege(SE_DEBUG_NAME, TRUE);
    strProcessID=m_list.GetItemText(nSelect,1);        //得到要结束进程的ID
    dwProcessID=atoi(strProcessID);              
    
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);    //打开进程获得其句柄
    TerminateProcess(hProcess, 0);       //结束进程
    CloseHandle(hProcess);      //关闭打开的句柄
    DebugPrivilege(SE_DEBUG_NAME, FALSE);
    // 稍稍Sleep下,防止出错
    Sleep(100);
    EnumProcess();
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部