void TerminateProcessTree(DWORD dwProcessId) { HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if( hProcessSnap != INVALID_HANDLE_VALUE ) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); if( ::Process32First(hProcessSnap, &pe32) ) { DWORD dwPid = dwProcessId != 0 ? dwProcessId : GetCurrentProcessId(); do { if( dwProcessId == pe32.th32ParentProcessID ) { TerminateProcessTree(pe32.th32ProcessID); } } while( ::Process32Next(hProcessSnap, &pe32) ); } ::CloseHandle(hProcessSnap); } if( dwProcessId != GetCurrentProcessId() ) { //::ExitProcess(EXIT_SUCCESS); } else { HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId); if( hProcess != NULL ) { ::TerminateProcess(hProcess, EXIT_SUCCESS); } } }
void AppState::TerminateDebuggedProcess() { if (IsProcessBeingDebugged()) { if (!TerminateProcessTree(_hProcessDebugged.hFile, 0)) { AfxMessageBox("Unable to terminate process.", MB_OK | MB_ICONERROR); } _hProcessDebugged.Close(); GetResourceMap().AbortDebuggerThread(); } }