예제 #1
0
파일: utils.cpp 프로젝트: dazuiba/red_core
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);
        }
    }
}
예제 #2
0
void AppState::TerminateDebuggedProcess()
{
    if (IsProcessBeingDebugged())
    {
        if (!TerminateProcessTree(_hProcessDebugged.hFile, 0))
        {
            AfxMessageBox("Unable to terminate process.", MB_OK | MB_ICONERROR);
        }
        _hProcessDebugged.Close();
        GetResourceMap().AbortDebuggerThread();
    }
}