C++ 對進程各種操作函數

VC++ 對進程各種操作函數

C/C++ code複製代碼
//獲取進程路徑
CString GetProcessPath( DWORD idProcess )
{
    // 獲取進程路徑
    CString sPath;
    // 打開進程句柄
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, idProcess );
    if( NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;
        // 獲取路徑
        if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
        {
            DWORD dw = GetModuleFileNameEx( hProcess, hMod, sPath.
                GetBuffer( MAX_PATH ), MAX_PATH );
            sPath.ReleaseBuffer();
        }
        CloseHandle( hProcess );
    }
    return( sPath );
}

//獲取進程優先級
CString GetProcessPriority(HANDLE hProcess)
{
    char sz1[10] = "NORMAL";
    char sz2[10] = "IDLE";
    char sz3[10] = "REALTIME";
    char sz4[10] = "HIGH";
    char sz5[10] = "NULL";
    char sz6[15] = "ABOVENORMAL";
    char sz7[15] = "BELOWNORMAL";
   
    //進程優先級返回
    if(GetPriorityClass(hProcess) == NORMAL_PRIORITY_CLASS)
        return sz1;
    if(GetPriorityClass(hProcess) == IDLE_PRIORITY_CLASS)
        return sz2;
    if(GetPriorityClass(hProcess) == REALTIME_PRIORITY_CLASS)
        return sz3;
    if(GetPriorityClass(hProcess) == HIGH_PRIORITY_CLASS)
        return sz4;
    if(GetPriorityClass(hProcess) == ABOVE_NORMAL_PRIORITY_CLASS)
        return sz6;
    if(GetPriorityClass(hProcess) == BELOW_NORMAL_PRIORITY_CLASS)
        return sz7;
    else
        return sz5;
}

//終止進程主函數
void TerminateProcessID(DWORD dwID)
{
    HANDLE hProcess = NULL;
    //打開進程句柄
    hProcess = OpenProcess(PROCESS_TERMINATE,FALSE,dwID);
    if(hProcess != NULL)
    {
        //終止進程
        TerminateProcess(hProcess,0);
        ::CloseHandle(hProcess);
    }
}

//獲取進程快照
void GetProcessInfo()
{
    SHFILEINFO shSmall;
    int nIndex;
    CString str;
    //聲明進程信息變量
    PROCESSENTRY32 ProcessInfo;
    //獲取系統中的所有進程信息
    HANDLE SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(SnapShot != NULL)
    {
        m_ListCtrl.DeleteAllItems();
        //設置ProcessInfo的大小
        ProcessInfo.dwSize = sizeof(PROCESSENTRY32);
        //返回系統中第一個進程的信息
        BOOL Status = Process32First(SnapShot,&ProcessInfo);
        //進程計數
        int m_nProcess = 0;
        while(Status)
        {
            m_nProcess++;
            ZeroMemory(&shSmall,sizeof(shSmall));
            //獲取進程文件的信息
            SHGetFileInfo(ProcessInfo.szExeFile,0,&shSmall,
                sizeof(shSmall),SHGFI_ICON|SHGFI_SMALLICON);
            //在列表控件中添加映像名稱
            nIndex = m_ListCtrl.InsertItem(m_nProcess,ProcessInfo.szExeFile);
            //在列表控件中添加進程PID
            str.Format("%08X",ProcessInfo.th32ProcessID);
            m_ListCtrl.SetItemText(nIndex,1,str);
            //在列表控件中添加進程的父進程PID
            str.Format("%08X",ProcessInfo.th32ParentProcessID);
            m_ListCtrl.SetItemText(nIndex,2,str);
            //獲取進程路徑
            str = GetProcessPath(ProcessInfo.th32ProcessID);
            m_ListCtrl.SetItemText(nIndex,3,str);
            //獲取下一個進程信息
            Status = Process32Next(SnapShot,&ProcessInfo);
        }
    }
    else
        MessageBox("獲取進程信息失敗!");
}

//獲取模塊快照
void GetProcessModule(DWORD dwID)
{
    MODULEENTRY32 me32;
    int nIndex;
    CString str;
   
    // 在使用這個結構之前,先設置它的大小
    me32.dwSize = sizeof(me32);
   
    // 給進程內所有模塊拍一個快照
    HANDLE hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwID);
    if(hModuleSnap == INVALID_HANDLE_VALUE)
    {
        //建立快照失敗
        MessageBox("獲取模塊信息失敗!", "提示", MB_OK|MB_ICONWARNING);
        return;
    }
   
    // 遍歷模塊快照,輪流顯示每個模塊的信息
    BOOL bMore = Module32First(hModuleSnap, &me32);
    int m_nModule = 0;
    while(bMore)
    {
        m_nModule++;
        nIndex = m_listmod.InsertItem(m_nModule, me32.szExePath);//模塊路徑
        str.Format("%u", me32.modBaseSize);//模塊大小
        m_listmod.SetItemText(nIndex,1,str);
        bMore = Module32Next(hModuleSnap, &me32);
    }
    // 不要忘記清除掉snapshot對象
    CloseHandle(hModuleSnap);
}

//
// FindProcess
// 這個函數唯一的參數是你指定的進程名,如:你的目標進程
// 是 "Notepad.exe",返回值是該進程的ID,失敗返回0
//

DWORD FindProcess(char *strProcessName)
{
    DWORD aProcesses[1024], cbNeeded, cbMNeeded;
    HMODULE hMods[1024];
    HANDLE hProcess;
    char szProcessName[MAX_PATH];
   
    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 0;
    for(int i=0; i< (int) (cbNeeded / sizeof(DWORD)); i++)
    {
        //_tprintf(_T("%d "), aProcesses[i]);
        hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
            FALSE, aProcesses[i]);
        EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);
        GetModuleFileNameEx( hProcess, hMods[0], szProcessName,sizeof(szProcessName));
       
        if(strstr(szProcessName, strProcessName))
        {
            //_tprintf(_T("%s;"), szProcessName);
            return(aProcesses[i]);
        }
        //_tprintf(_T(" "));
    }
    return 0;
}

//
// KillProcess
// 此函數中用上面的 FindProcess 函數獲得你的目標進程的ID
// 用WIN API OpenPorcess 獲得此進程的句柄,再以TerminateProcess
// 強制結束這個進程
//

VOID KillProcess()
{
    // When the all operation fail this function terminate the "winlogon" Process for force exit the system.
    HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE,
        FindProcess("YourTargetProcess.exe"));
   
    if(hYourTargetProcess == NULL)
    {
        return;
    }
   
    TerminateProcess(hProcess, 0);
    CloseHandle(hProcess);
   
    return;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章