Конференция "WinAPI" » Найти дочерний процесс
 
  • Александр69 (11.10.17 13:41) [0]
    Прошу помочь. Много лет пользуюсь загрузчиком для оперы собственной разработки, но появилась проблема. Раньше запускал опера.exe  функцией CreateProcess, получал хендл дочернего процесса и его контролировал. Но теперь Опера нахимичила и получается что после запуска процесса опера.ехе похоже запускает дочерний процесс и сама убивается. В результате родителем дерева процессов Опера становится десктоп. Как мне гарантировано отследить это и остаться родительским процессом имея хендл процесса, которого я напрямую не создавал??
    Просто желающие помочь скачайте с сайта оперы последнюю версию и запустите ее через CreateProcess и сами поймете, посмотрев дерево процессов. Последняя нормально запускаемая версия оперы - 44.0.2510.1449.
  • Игорь Шевченко © (12.10.17 10:28) [1]
    В Windows нет понятия родительский/дочерний процесс
  • Александр69 (12.10.17 13:53) [2]
    Охренеть ответ...и с каких это пор
  • Игорь Шевченко © (12.10.17 18:54) [3]
    https://www.e-reading.club/chapter.php/89563/22/Russinovich%2C_Solomon_-_1.Vnutrennee_ustroiistvo_Windows_%28gl._1-4%29.html

    "Каждый процесс также указывает на свой родительский процесс (процесс-создатель). Однако, если родитель существует, эта информация не обновляется. Поэтому есть вероятность, что некий процесс указывает на уже несуществующего родителя. Это не создает никакой проблемы, поскольку никто не полагается на наличие такой информации"
  • Александр69 (12.10.17 20:33) [4]
    Из этого никак не следует что "В Windows нет понятия родительский/дочерний процесс", так как и в статье и в ваших аргументах используется именно эти термины. А если родитель пропал, это не значит что его не было. Короче это все чушь, если нет ответа по сути, просьба воздержаться от комментариев.
  • Игорь Шевченко © (12.10.17 21:14) [5]

    > Короче это все чушь


    Тогда я процитирую Таненбаума: "В операционной системе Windows 2000 е поддерживается какой-либо иерархии процессов, например "родительский-дочерний". Все созданные процессы равны (не существует процессов, более равных, чем другие). Однако, поскольку один из 18 параметров, возвращаемых вызывающему процессу, представляет собой дескриптор нового процесса (что предоставляет контроль над новым процессом), существует негласная иерархия, заключающаяся в том, кто чьим дескриптором владеет. Хотя эти дескрипторы не могут напрямую передаваться другим процессам, у процесса есть способ создать дубликат дескриптора. Дубликат дескриптора может быть передан другому процессу и использоваться им, поэтому неявная иерархия процессов может просуществовать недолго."

    Из всего процитированного ответ на исходный вопрос только один - нет такой возможности контролировать что-либо, созданное вызванным через CreateProcess процессом, в том числе и созданные им процессы.
  • Александр69 (13.10.17 06:53) [6]
    Это все теоризирование...меня интерисует практическая сторона вопроса, а именно как указано выше "представляет собой дескриптор нового процесса (что предоставляет контроль над новым процессом)". На практике , по крайней мере я, гарантировано могу завершить лишь дочерний процесс, а не тот, пид которого я знаю. То что иерархия не гарантируется меня мало интересует, смена родителя или создание дубриката дескриптора это как я понимаю сознательное действие программиста а не забавы операционки. Гравное чтобы опера этого не делала и все.
  • Leonid Troyanovsky © (13.10.17 08:23) [7]

    > Александр69   (13.10.17 06:53) [6]

    > лишь дочерний процесс, а не тот, пид которого я знаю.

    Открой для себя OpenProcess.

    --
    Regards, LVT.
  • Александр69 (13.10.17 09:27) [8]
    Вот вся это хрень не помогает:

    function TerminateProgram(dwPID: DWORD; dwTimeout: DWORD): DWORD;
    const
     TA_FAILED = 0;
     TA_SUCCESS_CLEAN = 1;
     TA_SUCCESS_KILL = 2;
     TA_SUCCESS_16 = 3;
    var
     hProc: THandle;

     function TerminateProgramEnum(Window: HWND; lParam: LPARAM): Bool; stdcall;
     var
       dwID: DWORD;
     begin
       GetWindowThreadProcessId(Window, @dwID);
       if dwID = DWORD(lParam) then
         PostMessage(Window, WM_CLOSE, 0, 0);
       Result := True;
     end;
    begin
     hProc := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, FALSE, dwPID);
     if (hProc <> 0) then
     try
       EnumWindows(@TerminateProgramEnum, dwPID);
       if WaitForSingleObject(hProc, dwTimeout) <> WAIT_OBJECT_0 then
       begin
         if TerminateProcess(hProc, 0) then
           Result := TA_SUCCESS_KILL
         else
           Result := TA_FAILED
       end
       else
         Result := TA_SUCCESS_CLEAN
     finally
       CloseHandle(hProc)
     end
    esult := TA_FAILED
    end;   else
       R

    function KillTask(ExeFileName: string): integer;
    const
     PROCESS_TERMINATE = $0001;
    var
     ContinueLoop: BOOL;
     FSnapshotHandle: THandle;
     FProcessEntry32: TProcessEntry32;
    begin
     result := 0;

     FSnapshotHandle := CreateToolhelp32Snapshot
       (TH32CS_SNAPPROCESS, 0);
     FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
     ContinueLoop := Process32First(FSnapshotHandle,
       FProcessEntry32);

     while integer(ContinueLoop) <> 0 do
     begin
       if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
         result := TerminateProgram(FProcessEntry32.th32ProcessID, 0);
       ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
     end;

     CloseHandle(FSnapshotHandle);

     try
       WinExec(PANsiChar('TASKKILL /F /IM ' + ExeFileName), SW_HIDE);
     except
     end;

    end;
  • Leonid Troyanovsky © (14.10.17 08:32) [9]

    > Александр69   (13.10.17 09:27) [8]

    > Вот вся это хрень не помогает

    Ужас.

    А опера где?

    --
    Regards, LVT.
  • Rouse_ © (14.10.17 09:39) [10]

    > Игорь Шевченко ©   (12.10.17 10:28) [1]
    > В Windows нет понятия родительский/дочерний процесс

    И давно?


    > Александр69

    http://forum.sources.ru/index.php?s=d0c16bb2e0e552b03f6ad554d1d44880&showtopic=209024&view=findpost&p=17 53628
  • Rouse_ © (14.10.17 09:40) [11]
    Блин, кривая ссылка, чет у исходников поломалось все, короче седьмой пост:
    http://forum.sources.ru/index.php?showtopic=209024
  • Rouse_ © (14.10.17 09:42) [12]
    Ну соответственно перебор процесов и по ним смотри родителя - так найдешь дочерний
  • Игорь Шевченко © (14.10.17 10:23) [13]

    > И давно?


    С самого начала
  • Inovet © (14.10.17 11:13) [14]
    Розыч и ИШ, вопрос терминологии - есть или нет. У автора конкретная задача - он хочет чтобы Опера работала так, как он привык, а есть или нет в данный момент родительский процесс, не волнует. В общем как обычно: Я хочу, а вы все демамоги.
  • Александр69 (14.10.17 15:10) [15]
    Чет испорченый телефон...мне не надо искать родителя процесса- я и есть родитель. Мне надо чтобы дочерний процесс (опера)  оставался дочерним, для полного контроля. ВОТ И ВСЕ. Проблема в том в новых версиях оперы при запуске опера дочерний процесс как бы промежуточный, он порождает дерево процессов опера и убивается сам.
  • Inovet © (14.10.17 15:29) [16]
    > [15] Александр69   (14.10.17 15:10)

    О чём тебе и говорят умные книжки - не надо надеяться на присутсвие родителя.

    Может получится разрулить объектами синхронизации.
  • QAZ © (14.10.17 17:02) [17]
    ну все же просто, ё маё...
    опера наверняка запускает этот свой второй процесс с конкретной командной строкой
    соответственно меняешь свой opera.exe на opera.exe /x /y /chegototam:65 и все... живешь дальше как раньше, с непонятно для чего написаным запускатором
    :)
  • Александр69 (14.10.17 17:30) [18]
    "соответственно меняешь свой opera.exe на opera.exe /x /y /chegototam:65 и все... живешь дальше как раньше, "
    что имеется ввиду не понял
  • Александр69 (14.10.17 17:37) [19]
    "с непонятно для чего написаным запускатором" я конечно могу здесь подробно пояснить, оно вам это надо? Если вкратце - для работы с опера на рабочем компе, возможен доступ других лиц. Реализована работа оперы с профилем внутри автоматом подключаемого и отключаемого контейнера TrueCrypt. Есть таймаут бездействия и т.д. Можно спокойно синхронизироваться с домом. Не кому не навязываю, но мне так удобно много лет. Надо контролировать дочерний процесс и гарантировано прибивать.
  • QAZ © (14.10.17 18:09) [20]

    > что имеется ввиду не понял

    что непонятного, это содержимое CreateProcess
  • Александр69 (14.10.17 20:23) [21]
    "что непонятного, это содержимое CreateProcess" Вы вообще о чем, какое отношение это имеет к проблеме. У меня большая к вам просьба, или почитайте вопрос и напрягитесь понять о чем речь, или воздержитесь от комментариев. Вот уже 20 постов, не имеющих отношения к теме. Если нет ни у кого решения, зачем писать что - то типа "да нафига это надо". У вас нет достаточной информации, вы не видели исходники, чтобы коверкать постановку вопроса. Если здесь есть профи а не балаболы то прошу помочь. Если нет то тема закрыта.
  • Игорь Шевченко © (14.10.17 20:58) [22]

    > Мне надо чтобы дочерний процесс (опера)  оставался дочерним,
    >  для полного контроля. ВОТ И ВСЕ.


    Попробуй запустить его как Job (я очень сильно не уверен, но вдруг)

    https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682409(v=vs.85).aspx
    https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms681949(v=vs.85).aspx
  • Leonid Troyanovsky © (15.10.17 08:39) [23]

    > Александр69   (14.10.17 20:23) [21]

    > "что непонятного, это содержимое CreateProcess" Вы вообще
    > о чем, какое отношение это имеет к проблеме. У меня большая
    > к вам просьба, или почитайте вопрос и напрягитесь понять
    > о чем речь, или воздержитесь от комментариев. Вот уже 20
    > постов, не имеющих отношения к теме. Если нет ни у кого
    > решения, зачем писать что - то типа "да нафига это надо".
    >  У вас нет достаточной информации, вы не видели исходники,
    >  чтобы коверкать постановку вопроса. Если здесь есть профи
    > а не балаболы то прошу помочь. Если нет то тема закрыта.


    А как тут можно помочь?

    Вот, например, Гамлет не ограничился беседами с тенью  своего отца,
    а производил некоторые осмысленные действия.

    За 20 постов уважаемый топикстартер так и не рассказал, какие
    параметры были у CreateProcess, и какие секретные манипуляции
    осуществлялись с искомым хендлом.

    Не был показан и уровень подготовки, достаточный для OpenProcess
    хотя бы с целью терминирования.

    Чем же тут поможешь?

    --
    Regards, LVT.
  • QAZ © (15.10.17 11:03) [24]

    > Александр69   (14.10.17 20:23) [21]

    вообще печально когда "прогромист" не шарит вообще как работает система под которую он "прогромист" и от этого не может понять что ему пишут профи типа меня
    вторую строку из [17] читаем до полного просветления
  • QAZ © (15.10.17 11:55) [25]
    ладно, так и быть сменю гнев на милость
    вот так выглядит командная строка для запуска главного процеса без промежуточного
    "C:\Program Files\Opera\48.0.2685.39\opera.exe" --ran-launcher
    подчеркнутое заменить на свое
  • Inovet © (15.10.17 13:04) [26]
    > [25] QAZ ©   (15.10.17 11:55)

    Ты демагог. Полный код давай.
  • QAZ © (15.10.17 13:13) [27]

    > Inovet ©   (15.10.17 13:04) [26]

    он у него уже "много лет" есть :)
    или мне за него нужно в CreateProcess вставить эту строку?
  • Александр69 (15.10.17 13:32) [28]
    Удалено модератором
 
Конференция "WinAPI" » Найти дочерний процесс
Есть новые Нет новых   [134427   +35][b:0][p:0.001]