![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Такое дело, создаю процесс при помощи CreateProcess. Хотелось бы дождаться его оконачательной инициализации и только потом с ним работать. В MSDN'е сказано юзать WaitForInputIdle, но это не помогает =( У кого какие соображения ?
P.S: Да, можно конечно сделать что-то типа Sleep(100), но это не красиво и не надёжно... Да, такой же вопрос меня мучает и под линукс, тобишь posix_spawn'ом создаю процесс, а как дождаться полной инициализации ? -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
тык, может послать сообщение из дочернего процесса "я готов"?
|
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Fixin, не, приложение не должно ничего слать, оно не должно даже знать что его запускают как дочернее.
Добавлено @ 08:37 Fixin, не, приложение не должно ничего слать, оно не должно даже знать что его запускают как дочернее. -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: нет Всего: 1 |
Я в потоках / процесах 0 =(
но вот что мне известно dwCreationFlags - вот сюда надо передать флаг CREATE_SUSPENDED после создания процесс передаст управление вызывающему проц. и замрет, пока не будит вызвана ResumeThread или ResumProccess или какая там ф-ия возобновляет работу проц/потока... |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
приостановка основного потока процесса в случае использования флага CREATE_SUSPENDED происходит после создания процесса системой. а приложению тоже надо инициализироваться(прочитать конфиги, создать окна, итд). так что в данном случае CREATE_SUSPENDED не поможет.
а это - поможет. если запускаемое приложение не консольное и имеет цикл обработки сообщений. |
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
dumb, а если консольное ? Как у меня. А CREATE_SUSPENDED всё-таки надо будет попробовать
-------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
вообще, все зависит от того, что ты хочешь делать в запускаемом приложении. в данном случае проще всего "поспать" секунду-другую. это будет "красивше", чем развешивать хуки и подобной фигней страдать.
|
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
dumb, я должет читать/писать в моё дочернее консольное приложение немедленно. Но если так делать, то может так получиться что приложение ещё не инициализировалось, а я уже пишу/читаю
-------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Может, попробовать перехватить точку входа в приложение?
|
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
586, интересно, а что значит перехватить точку входа в приложение ?, поясни
Добавлено @ 21:10 Насколько мне известно, точка входа - это адрес, а что значит "перехватить" адрес ? -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
||||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: нет Всего: 3 |
Ну и как же мне это сделать интересно. Мне что exe'шник пропатчить чтоли ?
Мне нужно лишь дождаться инициализации, причём как я говорил приложение не знает, что оно дочернее. -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Запускаешь дочерний процесс функцией CreateProcess, с флагом CREATE_SUSPENDED. Дальше, с помощью функции VirtualAllocEx выделяешь в процессе память и WriteProcessMemory внедряешь туда код.
Это сообщение отредактировал(а) 586 - 26.7.2006, 00:32 |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
если под "читать/писать" подразумевается работа с его входным/выходным потоком, то можно просто перенаправить его потоки в пайпы и ждать определенной строки(которую пишет приложение после старта) в пайпе выходного потока. в данном случае, правда, пользователь не сможет напрямую работать с консолью запускаемого приложения.
пардон муа, нет смысла. состояние создаваемого процесса после выхода "родителя" из CreateProcess(...CREATE_SUSPENDED...) ничем не отличается от состояния, в котором оно будет на EP(Entry Point). если и имеет смысл внедрять куда-то код, то тогда уж в функции чтения потока ввода. повторюсь: многое зависит от конкретного приложения, которое мы запускаем - все эти "танцы с бубном" имеют смысл, если оно имеет довольно длительную и зависящую от различных факторов стадию инициализации. если оно просто грузит много тяжелых библиотек, то достаточно CREATE_SUSPENDED + небольшой Sleep... ps. гадание на кофейной гуще... впрочем, как обычно. |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Да? А тогда как объяснишь, что Process Explorer не хочет работать с этим процессом? ИМХО потому что он не инициализирован. Отладчик его тоже не берет. С приостановленными процессами во время выполнения таких проблем нет. К тому же приостановленный процесс не требует статически подключенных библиотек, что опять же говорит, что процесс не инициализирован.
|
|||
|
||||
![]()
|
| Правила форума "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. |