Ожидание завершения процесса и его дочерних процессов
От: Xsyst  
Дата: 06.11.14 12:41
Оценка:
Добрый день!
Есть программа, которая создает сторонний процесс A и ожидает его завершения по описателю процесса на WaitForSingleObject. Процесс А в свою очередь создает процессы B и C и сам при этом завершается. После завершения процесса А я получаю возврат из функции ожидания. Вопрос в том, как мне дождаться завершения процессов A, B и С?
Через задание — не вариант, т.к. программа, которая создает процесс А может уже сама находиться в задании из которого не сможет выйти и включить дочерние процессы в другое задание.
Re: Ожидание завершения процесса и его дочерних процессов
От: boris_ Германия  
Дата: 06.11.14 14:36
Оценка:
Здравствуйте, Xsyst, Вы писали:

X>Добрый день!

X>Есть программа, которая создает сторонний процесс A и ожидает его завершения по описателю процесса на WaitForSingleObject. Процесс А в свою очередь создает процессы B и C и сам при этом завершается. После завершения процесса А я получаю возврат из функции ожидания. Вопрос в том, как мне дождаться завершения процессов A, B и С?

Воткнуть в процесс A ожидание завершения процессов B и C ?
Re: Ожидание завершения процесса и его дочерних процессов
От: Pavel Dvorkin Россия  
Дата: 06.11.14 14:47
Оценка:
Здравствуйте, Xsyst, Вы писали:

>Вопрос в том, как мне дождаться завершения процессов A, B и С?


Исходники всех программ есть ? можно править ?
With best regards
Pavel Dvorkin
Re: Ожидание завершения процесса и его дочерних процессов
От: ononim  
Дата: 06.11.14 17:29
Оценка: 4 (1)
X>Добрый день!
X>Есть программа, которая создает сторонний процесс A и ожидает его завершения по описателю процесса на WaitForSingleObject. Процесс А в свою очередь создает процессы B и C и сам при этом завершается. После завершения процесса А я получаю возврат из функции ожидания. Вопрос в том, как мне дождаться завершения процессов A, B и С?
X>Через задание — не вариант, т.к. программа, которая создает процесс А может уже сама находиться в задании из которого не сможет выйти и включить дочерние процессы в другое задание.

Навскидку несколько решений, но все топорные:
1) Метод влоб. Toolhelp'ом периодически перечислять все живые процессы, проверяя их парентов. Метод требует _не закрывания_ хэндла на процесс A до окончания всей спецоперации, в противном случае его PID может реюзнуться и выйдет конфуз.
2) Запустить процесс А под каким нить спецюзером. Периодически проверять список всех процессов и если никого под этим юзером не осталось — значит, час настал.
3) Создать какой нить десктоп CreateDesktop'ом. Запускить процесс А на нем. Периодически проверять десктоп на существование OpenDesktop'ом. Минусы — не будет видать гуя (а может это плюс?), могут возникнуть различные проблемы если например процессы затребуют шелловский функционал или еще чего.
4) Проставить переменную окружения в себе. Ее отнаследуют все ваши дети и внуки (хотя могут и отказаться от "наследства" при желании). Периодически чекать процессы, роясь в их PEBах. По 5 балльной шкале злостного пользования недокументированным функционалом тянет балла на 2. Но потрахаться придеться.
5) Запустить процесс А под дебагом. Ловить дебажные ивенты создания процессов. Советую в процессах первым делом подчищать флажок PEB::BeingDebugged (в wow64 процессах — в обоих PEBах). Иначе хип будет работать в особом, тормозном режиме.
..подумаю, может еще чего добавлю, если конечно методы такого рода представляют интерес
Как много веселых ребят, и все делают велосипед...
Re: Ожидание завершения процесса и его дочерних процессов
От: tlp  
Дата: 06.11.14 17:47
Оценка:
Здравствуйте, Xsyst, Вы писали:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684161(v=vs.85).aspx
Re[2]: Ожидание завершения процесса и его дочерних процессов
От: Xsyst  
Дата: 07.11.14 07:21
Оценка:
Здравствуйте, boris_, Вы писали:

_>Здравствуйте, Xsyst, Вы писали:


X>>Добрый день!

X>>Есть программа, которая создает сторонний процесс A и ожидает его завершения по описателю процесса на WaitForSingleObject. Процесс А в свою очередь создает процессы B и C и сам при этом завершается. После завершения процесса А я получаю возврат из функции ожидания. Вопрос в том, как мне дождаться завершения процессов A, B и С?

_>Воткнуть в процесс A ожидание завершения процессов B и C ?


Не вариант, программа вообще ничего не знает о процессах, создаваемых процессом А
Re[2]: Ожидание завершения процесса и его дочерних процессов
От: Xsyst  
Дата: 07.11.14 07:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Xsyst, Вы писали:


>>Вопрос в том, как мне дождаться завершения процессов A, B и С?


PD>Исходники всех программ есть ? можно править ?


Нет, A, B и С — сторонние программы
Re[2]: Ожидание завершения процесса и его дочерних процессов
От: Xsyst  
Дата: 07.11.14 07:35
Оценка:
Здравствуйте, ononim, Вы писали:

X>>Добрый день!

X>>Есть программа, которая создает сторонний процесс A и ожидает его завершения по описателю процесса на WaitForSingleObject. Процесс А в свою очередь создает процессы B и C и сам при этом завершается. После завершения процесса А я получаю возврат из функции ожидания. Вопрос в том, как мне дождаться завершения процессов A, B и С?
X>>Через задание — не вариант, т.к. программа, которая создает процесс А может уже сама находиться в задании из которого не сможет выйти и включить дочерние процессы в другое задание.

O>Навскидку несколько решений, но все топорные:

O>1) Метод влоб. Toolhelp'ом периодически перечислять все живые процессы, проверяя их парентов. Метод требует _не закрывания_ хэндла на процесс A до окончания всей спецоперации, в противном случае его PID может реюзнуться и выйдет конфуз.
Как вариант, но думал есть варианты попроще

O>2) Запустить процесс А под каким нить спецюзером. Периодически проверять список всех процессов и если никого под этим юзером не осталось — значит, час настал.

Не пойдет, процесс должен работать именно под текущим пользователем

O>3) Создать какой нить десктоп CreateDesktop'ом. Запускить процесс А на нем. Периодически проверять десктоп на существование OpenDesktop'ом. Минусы — не будет видать гуя (а может это плюс?), могут возникнуть различные проблемы если например процессы затребуют шелловский функционал или еще чего.

Для некоторых ситуаций как вариант. Спасибо.

O>4) Проставить переменную окружения в себе. Ее отнаследуют все ваши дети и внуки (хотя могут и отказаться от "наследства" при желании). Периодически чекать процессы, роясь в их PEBах. По 5 балльной шкале злостного пользования недокументированным функционалом тянет балла на 2. Но потрахаться придеться.

По моему 1-й вариант проще

O>5) Запустить процесс А под дебагом. Ловить дебажные ивенты создания процессов. Советую в процессах первым делом подчищать флажок PEB::BeingDebugged (в wow64 процессах — в обоих PEBах). Иначе хип будет работать в особом, тормозном режиме.

Тоже не пойдет, т.к. в принципе процессы B и C тоже могут создать дочерние процессы. Задача состоит в том, чтоб отследить момент завершения создаваемого процесса и всех его внуков, если таковые будут.

O>..подумаю, может еще чего добавлю, если конечно методы такого рода представляют интерес


Наверное можно еще сделать перехват CreateProcess и если эта функция вызывается в интересующем процессе, то передавать PID этого процесса ожидающей программе.
Re[2]: Ожидание завершения процесса и его дочерних процессов
От: Xsyst  
Дата: 07.11.14 07:39
Оценка:
Здравствуйте, tlp, Вы писали:

tlp>Здравствуйте, Xsyst, Вы писали:


tlp>http://msdn.microsoft.com/en-us/library/windows/desktop/ms684161(v=vs.85).aspx


Я же написал что Jobы не вариант.
Re: Ожидание завершения процесса и его дочерних процессов
От: кубик  
Дата: 07.11.14 08:03
Оценка:
Можно забобахать драйвер PsCreateProcessNotification
Re[3]: Ожидание завершения процесса и его дочерних процессов
От: visual_wind  
Дата: 07.11.14 10:32
Оценка:
Здравствуйте, Xsyst, Вы писали:

[...]
X>Наверное можно еще сделать перехват CreateProcess и если эта функция вызывается в интересующем процессе, то передавать PID этого процесса ожидающей программе.

Если пойдете по этому пути, то, помимо написания драйвера, можно воспользоваться WMI. Пример можно найти здесь..
Re: Ожидание завершения процесса и его дочерних процессов
От: DiZSl  
Дата: 07.11.14 10:39
Оценка:
Здравствуйте, Xsyst, Вы писали:

Задетурить функцию CreateProcess у программы A — получить все хендлы и отслеживать еще и их.
Re[3]: Ожидание завершения процесса и его дочерних процессов
От: ononim  
Дата: 07.11.14 11:03
Оценка:
O>>Навскидку несколько решений, но все топорные:
O>>1) Метод влоб. Toolhelp'ом периодически перечислять все живые процессы, проверяя их парентов. Метод требует _не закрывания_ хэндла на процесс A до окончания всей спецоперации, в противном случае его PID может реюзнуться и выйдет конфуз.
X>Как вариант, но думал есть варианты попроще
У него есть и большой недостаток — если как вы ниже написали процессы B и C могут порождать правнуков, которых тоже нужно ждать — то этот вариант — не вариант.

O>>4) Проставить переменную окружения в себе. Ее отнаследуют все ваши дети и внуки (хотя могут и отказаться от "наследства" при желании). Периодически чекать процессы, роясь в их PEBах. По 5 балльной шкале злостного пользования недокументированным функционалом тянет балла на 2. Но потрахаться придеться.

X>По моему 1-й вариант проще
Зато этот сработает с правнутками.

O>>5) Запустить процесс А под дебагом. Ловить дебажные ивенты создания процессов. Советую в процессах первым делом подчищать флажок PEB::BeingDebugged (в wow64 процессах — в обоих PEBах). Иначе хип будет работать в особом, тормозном режиме.

X>Тоже не пойдет, т.к. в принципе процессы B и C тоже могут создать дочерние процессы. Задача состоит в том, чтоб отследить момент завершения создаваемого процесса и всех его внуков, если таковые будут.
Ну так — дебажить надобно всех.

O>>..подумаю, может еще чего добавлю, если конечно методы такого рода представляют интерес

X>Наверное можно еще сделать перехват CreateProcess и если эта функция вызывается в интересующем процессе, то передавать PID этого процесса ожидающей программе.
Сделать перехват, и сделать перехват, работающий стабильно на различных системах — это проблемы разных порядков. Особенно если это перехват CreateProcess'а.
Как много веселых ребят, и все делают велосипед...
Re: авантюрное решение
От: Pavel Dvorkin Россия  
Дата: 07.11.14 11:17
Оценка: 12 (2) +1
Здравствуйте, Xsyst, Вы писали:

X>Добрый день!

X>Есть программа, которая создает сторонний процесс A и ожидает его завершения по описателю процесса на WaitForSingleObject. Процесс А в свою очередь создает процессы B и C и сам при этом завершается. После завершения процесса А я получаю возврат из функции ожидания. Вопрос в том, как мне дождаться завершения процессов A, B и С?

А запускает B.EXE и C.EXE.

Переименовываем B.EXE в XB.EXE, C.EXE в XC.EXE.

Пишем свои B.EXE, который запускает XB.EXE и С.EXE, который запускает XС.EXE

Или как-то иначе, если можно. Словом, сделать так, чтобы A вызывала B и C через наши промежуточные процессы.

Остальное дело техники. Например, B.EXE ждет окончания XB.EXE и , дождавшись, шлет сообщение Parent.EXE
With best regards
Pavel Dvorkin
Re[3]: Ожидание завершения процесса и его дочерних процессов
От: tlp  
Дата: 07.11.14 18:45
Оценка:
Здравствуйте, Xsyst, Вы писали:

X>Здравствуйте, tlp, Вы писали:


tlp>>Здравствуйте, Xsyst, Вы писали:


tlp>>http://msdn.microsoft.com/en-us/library/windows/desktop/ms684161(v=vs.85).aspx


X>Я же написал что Jobы не вариант.


http://msdn.microsoft.com/en-us/library/windows/desktop/hh448388(v=vs.85).aspx
Re[4]: Ожидание завершения процесса и его дочерних процессов
От: CEMb  
Дата: 10.11.14 06:17
Оценка:
Здравствуйте, visual_wind, Вы писали:

_>[...]

X>>Наверное можно еще сделать перехват CreateProcess и если эта функция вызывается в интересующем процессе, то передавать PID этого процесса ожидающей программе.

_>Если пойдете по этому пути, то, помимо написания драйвера, можно воспользоваться WMI. Пример можно найти здесь..


WMI может быть отключен.

В качестве альтернативы для ToolHelp-а предлагаю ловить EVENT_OBJECT_CREATE, только их будет много, и только если у процессов есть окна. Зато не надо по таймеру снимки делать, при этом снимки надо делать отдельно для 32 и 64 бит, а вот окна меж собой равны
Re[2]: авантюрное решение
От: CEMb  
Дата: 10.11.14 06:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Пишем свои B.EXE, который запускает XB.EXE и С.EXE, который запускает XС.EXE


Пишем свой Kernel32.dll
Re[3]: авантюрное решение
От: Pavel Dvorkin Россия  
Дата: 10.11.14 07:24
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Пишем свой Kernel32.dll

CEM>

Опоздал. Он ИМХО под Windows File Protection.

Вот если бы в Windows 2000 — прошло бы.
With best regards
Pavel Dvorkin
Re[4]: Ожидание завершения процесса и его дочерних процессов
От: Xsyst  
Дата: 10.11.14 08:18
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>Навскидку несколько решений, но все топорные:

O>>>1) Метод влоб. Toolhelp'ом периодически перечислять все живые процессы, проверяя их парентов. Метод требует _не закрывания_ хэндла на процесс A до окончания всей спецоперации, в противном случае его PID может реюзнуться и выйдет конфуз.
X>>Как вариант, но думал есть варианты попроще
O>У него есть и большой недостаток — если как вы ниже написали процессы B и C могут порождать правнуков, которых тоже нужно ждать — то этот вариант — не вариант.
Почему не вариант? Я же знаю PID процессов B и C, почему тогда к правнукам нельзя применить тот же метод?

O>>>..подумаю, может еще чего добавлю, если конечно методы такого рода представляют интерес

X>>Наверное можно еще сделать перехват CreateProcess и если эта функция вызывается в интересующем процессе, то передавать PID этого процесса ожидающей программе.
O>Сделать перехват, и сделать перехват, работающий стабильно на различных системах — это проблемы разных порядков. Особенно если это перехват CreateProcess'а.
А чем перехват CreateProcess отличается от перехвата другой функции?
Re[2]: авантюрное решение
От: Xsyst  
Дата: 10.11.14 08:19
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Xsyst, Вы писали:


X>>Добрый день!

X>>Есть программа, которая создает сторонний процесс A и ожидает его завершения по описателю процесса на WaitForSingleObject. Процесс А в свою очередь создает процессы B и C и сам при этом завершается. После завершения процесса А я получаю возврат из функции ожидания. Вопрос в том, как мне дождаться завершения процессов A, B и С?

PD>А запускает B.EXE и C.EXE.


PD>Переименовываем B.EXE в XB.EXE, C.EXE в XC.EXE.


PD>Пишем свои B.EXE, который запускает XB.EXE и С.EXE, который запускает XС.EXE


PD>Или как-то иначе, если можно. Словом, сделать так, чтобы A вызывала B и C через наши промежуточные процессы.


PD>Остальное дело техники. Например, B.EXE ждет окончания XB.EXE и , дождавшись, шлет сообщение Parent.EXE


Не вариант, я же не в курсе, что будут за процессы B и C и будут ли они вообще
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.