Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual C++
Перезагрузить страницу Не работает безопасное завершение дочерних процессов
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Макс1 Макс1 вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.06.2013
По умолчанию Не работает безопасное завершение дочерних процессов - 19.07.2016, 21:26

Необходимо завершать процесс и все его дочерние процессы в программе на Microsoft Visual C++
Используется немного измененный код из Интернета.
Функция SafeTerminateProcess для безопасного завершения процесса.
И функция KillProcessTree для рекурсивного завершения дочерних процессов.
Если не удается завершить процесс с помощью функции SafeTerminateProcess, завершаю его с помощью функции TerminateProcess.
Завершение процессов работает, но для дочерних процессов отладка показывает, что в большинстве случаев не работает функция SafeTerminateProcess, и в результате вызывается функция TerminateProcess. Для основного процесса SafeTerminateProcess всегда работает.
Появляется одна из двух ошибок (если не было первой, в большинстве случаев появляется вторая).
Функция GetExitCodeProcess получает ExitCode для дочернего процесса, равный нулю.
Или бывает вторая ошибка hRT == null с ошибкой код 0x5 - Access Denied.
Если сделать следующий код, вместо нее появляется ошибка Error unknown revision 0x519

cpp Код:
PSECURITY_DESCRIPTOR pSD;
pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,
            SECURITY_DESCRIPTOR_MIN_LENGTH);
 
        SECURITY_ATTRIBUTES sa;
        sa.nLength = sizeof (SECURITY_ATTRIBUTES);
        sa.lpSecurityDescriptor = pSD;
        sa.bInheritHandle = TRUE;
 
hRT = CreateRemoteThread((bDup) ? hProcessDup : hProcess,
            &sa,
            0,
            (LPTHREAD_START_ROUTINE)pfnExitProc,
            (PVOID)uExitCode, 0, &dwTID);

Если делать несколько попыток заврешения того же процесса с помощью SafeTerminateProcess, это не помогает. Можно ли исправить эти 2 ошибки и сделать, чтобы функция SafeTerminateProcess всегда завершала дочерние процессы?


cpp Код:
BOOL SafeTerminateProcess(HANDLE hProcess, UINT uExitCode)
{
    DWORD dwTID, dwCode, dwErr = 0;
    HANDLE hProcessDup = INVALID_HANDLE_VALUE;
    HANDLE hRT = NULL;
    HINSTANCE hKernel = GetModuleHandle(_T("kernel32"));
    BOOL bSuccess = FALSE;
    BOOL bDup = DuplicateHandle(GetCurrentProcess(),
        hProcess,
        GetCurrentProcess(),
        &hProcessDup,
        PROCESS_ALL_ACCESS,
        FALSE,
        0);
 
    if (GetExitCodeProcess((bDup) ? hProcessDup : hProcess, &dwCode) &&  
(dwCode == STILL_ACTIVE))
    {
        FARPROC pfnExitProc;
        pfnExitProc = GetProcAddress(hKernel, "ExitProcess");
        hRT = CreateRemoteThread((bDup) ? hProcessDup : hProcess,
            NULL,
            0,
            (LPTHREAD_START_ROUTINE)pfnExitProc,
            (PVOID)uExitCode, 0, &dwTID);
 
        if (hRT == NULL) dwErr = GetLastError();
    }
    else
    {
        dwErr = ERROR_PROCESS_ABORTED;
    }
    if (hRT)
    {
        WaitForSingleObject((bDup) ? hProcessDup : hProcess, (DWORD)
10);
        CloseHandle(hRT);
        bSuccess = TRUE;
    }
    if (bDup)
        CloseHandle(hProcessDup);
    if (!bSuccess)
        SetLastError(dwErr);
    return bSuccess;
}
 
bool KillProcessTree(DWORD myprocID, DWORD dwTimeout)
{
    bool bRet = true;
    HANDLE hWnd;
    PROCESSENTRY32 pe;
 
    memset(&pe, 0, sizeof(PROCESSENTRY32));
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    if (Process32First(hSnap, &pe))
    {
        BOOL bContinue = TRUE;
 
        while (bContinue)
        {
            if (pe.th32ParentProcessID == myprocID)
            {
 
                KillProcessTree(pe.th32ProcessID, dwTimeout);
 
                HANDLE hChildProc = OpenProcess
(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
 
                if (hChildProc)
                {
 
                    if (WaitForSingleObject(hChildProc,  
dwTimeout) == WAIT_OBJECT_0)
                        bRet = true;
                    else
                    {  
                             bRet =  
SafeTerminateProcess(hChildProc, 0);
                        if (!bRet)
                            bRet =  
TerminateProcess(hChildProc, 0);
                    }
                    CloseHandle(hChildProc);
                }
            }
            bContinue = Process32Next(hSnap, &pe);
        }
 
        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE,  
myprocID);
 
        if (hProc)
        {
            if (!SafeTerminateProcess(hProc, 0))
                TerminateProcess(hProc, 0);
            CloseHandle(hProc);
        }
    }
    return bRet;
}
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Безопасное извлечение устройств и дисков vve2003 Периферия 3 25.10.2013 23:51
Завершение работы с OLE KIG C++ Builder 2 08.11.2009 09:40
События дочерних окон NicroMan WinAPI 4 12.04.2008 15:25
безопасное общение в ICQ/QIP Dmitriy Компьютерная безопасность 3 11.06.2007 19:15
Получаю список дочерних процессов как это сделать bugZex C++ на Unix 12 21.03.2007 14:13
Как создать несколько дочерних форм baklan2004 Delphi 4 30.01.2006 20:05
Стиль дочерних окон MDI rue Visual C++ 1 01.09.2005 22:39
Безопасное php соединение с MySQL сервером Trolll MySQL 0 30.05.2005 12:18
Безопасное php соединение с MySQL сервером Trolll PHP 0 27.05.2005 20:16
Выбор дочерних MDI-окон с помощью набора закладок TabSet Exploder Delphi 7 07.02.2005 00:50
Корректное завершение процессов в программе Olegg C++ Builder 3 20.09.2004 10:32
Как выводить список дочерних окон ^GENTLY^ WinAPI 4 20.07.2004 17:07



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов