////////////////////////////////////////////////////// #pragma once ////////////////// // Process iterator -- iterator over all system processes // Always skips the first (IDLE) process with PID=0. class CProcessIterator { protected: DWORD* m_pids; // array of procssor IDs DWORD m_count; // size of array DWORD m_current; // next array item
public: CProcessIterator(); ~CProcessIterator(); DWORD First(); DWORD Next() { return m_pids && m_current < m_count ? m_pids[m_current++] : 0; } DWORD GetCount() { return m_count; } };
////////////////// // Handy class to facilitate finding and killing a process by name. class CFindKillProcess { public: CFindKillProcess(); ~CFindKillProcess(); DWORD FindProcess(LPCTSTR lpModname, BOOL bAddExe=TRUE); BOOL KillProcess(DWORD pid, BOOL bZap); };
//////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "EnumProc.h" // CProcessIterator - Iterates all processes CProcessIterator::CProcessIterator() { m_pids = NULL; }
CProcessIterator::~CProcessIterator() { delete [] m_pids; }
////////////////// // Get first process: Call EnumProcesses to init array. Return first one. DWORD CProcessIterator::First() { m_current = (DWORD)-1; m_count = 0; DWORD nalloc = 1024; do { delete [] m_pids; m_pids = new DWORD [nalloc]; if (EnumProcesses(m_pids, nalloc*sizeof(DWORD), &m_count)) { m_count /= sizeof(DWORD); m_current = 1; // skip IDLE process } } while (nalloc <= m_count); return Next(); }
//////////////////////////////////////////////////////////////// // CFindKillProcess - to find/kill a process by module name. // CFindKillProcess::CFindKillProcess() {}
CFindKillProcess::~CFindKillProcess() {}
////////////////// // Search for process whose module name matches parameter. // Finds "foo" or "foo.exe" DWORD CFindKillProcess::FindProcess(LPCTSTR modname, BOOL bAddExe) { CProcessIterator itp; for (DWORD pid=itp.First(); pid; pid=itp.Next()) { TCHAR name[_MAX_PATH]; CProcessModuleIterator itm(pid); HMODULE hModule = itm.First(); // .EXE if (hModule) { GetModuleBaseName(itm.GetProcessHandle(),hModule, name, _MAX_PATH); string sModName = modname; if (strcmpi(sModName.c_str(),name)==0) return pid; sModName += ".exe"; if (bAddExe && strcmpi(sModName.c_str(),name)==0) return pid; } } return 0; }
////////////////// // Kill a process cleanly: Close main windows and wait. // bZap=TRUE to force kill. BOOL CFindKillProcess::KillProcess(DWORD pid, BOOL bZap) { CMainWindowIterator itw(pid); for (HWND hwnd=itw.First(); hwnd; hwnd=itw.Next()) { DWORD bOKToKill = FALSE; SendMessageTimeout(hwnd, WM_QUERYENDSESSION, 0, 0, SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG,100, &bOKToKill); if (!bOKToKill) return FALSE; // window doesn't want to die: abort PostMessage(hwnd, WM_CLOSE, 0, 0); } // I've closed the main windows; now wait for process to die. BOOL bKilled = TRUE; HANDLE hp=OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE,FALSE,pid); if (hp) { if (WaitForSingleObject(hp, 5000) != WAIT_OBJECT_0) { if (bZap) { // didn't die: force kill it if zap requested TerminateProcess(hp,0); } else { bKilled = FALSE; } } CloseHandle(hp); } return bKilled; }
////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "EnumProc.h" #define tpf _tprintf // to save typing typedef list<string> CStringList; // like MFC, but with STL // pre-declare functions int help(); // check for switch: / or - inline BOOL isswitch(TCHAR c) { return c==L'/' || c==L'-'; }
int main(int argc, TCHAR* argv[], TCHAR* envp[]) { CStringList cmdargs; // command-line args (processes to kill) BOOL bDisplayOnly=FALSE; // don't kill, just show results BOOL bQuiet=FALSE; // suppress error messages BOOL bZap=FALSE; // force-kill process // Parse command line. Switches can come in any order. for (int i=1; i<argc; i++) { if (isswitch(argv[i][0])) { for (UINT j=1; j<strlen(argv[i]); j++) { switch(tolower(argv[i][j])) { case '?': help(); return 0; case 'n': bDisplayOnly=TRUE; break; case 'q': bQuiet=TRUE; break; case 'z': bZap=TRUE; break; default: return help(); } } } else {
阅读(457)
(责任编辑:城市网)
|