![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Purple_Light |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 19.4.2007 Репутация: нет Всего: нет |
Всем привет!
Вижу, что тема списка процессов уже поднималась, но у меня есть конкретная проблемма. Есть процесс в системе, этот процесс может порождать детей. Перед тем как убить родительский процесс, необходимо пройтись по всем детям, которых он создал и завершить их. Вопрос как получить списов детей? Поискал на форуме и нашел, только недокументированную функцию ZwQuerySystemInformation, но как написано на MSDN она может меняться от версии к версии, что не есть хорошо Может кто-нить поделится другим способом, если он существует. З.Ы.: Система Windows XP, Windows 2000, Windows 200* Server, Windows Vista Это сообщение отредактировал(а) Purple_Light - 8.8.2008, 13:05 |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 3 Всего: 191 |
Могу посоветовать посмотреть в сторону WMI. Там есть класс Win32_Process. Его экземпляры - все процессы в системе. Что там есть интересного? Поле ParentProcessId ,в котором хранится ID породившего процесса (подобно th32ParentProcessID в ToolHelp). Т.е. проходимся по всем процессам, и если их ParentProcessId совпадает с требуемым - значит, дочерние. Их и закрываем.
Может есть способ и лучше. Это сообщение отредактировал(а) Rrader - 12.8.2008, 10:33 |
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 2 Всего: 36 |
||||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 1 Всего: 32 |
Возможна ситуация, что ParentProcessId совпадает с требуемым, но на самом деле, процесс не является дочерним. (и это случается отнюдь не раз в сто лет (Система может использовать "значения" освободившихся ID) Для точного установления "родственных отношений", дополнительно к ParentId можно использовать, например, время создания процесса. IMHO, это уже дает полную гарантию, что нашли именно тех, кого искали Это сообщение отредактировал(а) Riply - 11.8.2008, 10:18 |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 3 Всего: 191 |
Riply, я не глядел в MSDN.
|
|||
|
||||
| Purple_Light |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 19.4.2007 Репутация: нет Всего: нет |
Спасибо за ответы.
Rififi в этой статье, как раз приведен пример с недокументированной функцией. Проблемма оказалась немного сложнее. Например, если рассмотреть случай, когда пользователь (который именно и создает дочернии процессы) запустит приложение запускающее само себя рекурсивно. Получится, к тому времени как программа получит слепок процессов системы, в системе появятся новые процессы (рекурсивно запущенная программа). Соответственно раз ID процессов не попали в слепок (snapshot) приложение их не убъет. Вообщем алгортм придумать, так и не удалось. Пришлось переписывать приложение, отслеживать запускаемые процессы и объединять их в группы. Ссылка на теорию (MSDN) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |