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; }