Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск процесса


UsAd ©   (2004-09-13 14:58:00) 

Уважаемые мастера! есть такая проблема: программа отслеживает запуск процесса. если запустился новый процесс, то она создаёт новый поток, который выполняет определённые действия с процессом, используя openProcess и т.п. и если программа не успела инициализироваться(любая, т.е. notepad или photoshop), то происходит ошибка при работе с процессом.

а если поставить в начале запуска потока Sleep(1000);, то всё отлично работает.

т.е. как можно определить(м.б. послать какое-то сообщение процессу или т.п.), что  он уже нормально функционирует?

Sleep(1000) не устраивает, так как если процесс инициализируется раньше, то он успеет произвести какие-то изменеия.


  (2004-09-15 20:09:00) [1]

Удалено модератором


UsAd   (2004-09-15 16:53:00) [2]

наёл то место, где происходит ошибка. делаю так:

H:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
DebugActiveProcess(H);

оказалось,ч то ошибка происходит если вызывать DebugActiveProcess. после вызова этой функции процесс уже не существует. и происходит [8]. м.б. можно послать какой-то запрос приложению и подождать ответа?

>[12]. если вместо DebugActiveProcess вставить код, который вызывает CreateRemoteThread, то поток не будет создан(я всё ещё говрю про этот конкретный слчай. случай, когда запускаются массивныйе приложения. типа photoshop).


Burmistroff   (2004-09-14 18:51:00) [3]

>Digitman
Я абсолютно не уверен, но мне кажется, что поток, созданный через CreateRemoteThread может начать выполняться раньше. Хотя опять повторю, это лишь необоснованное предположение :)


Digitman   (2004-09-14 08:18:00) [4]


> UsAd   (13.09.04 17:02) [7]
> "программа не успела инициализироваться"=не успели загрузиться
> все библиотеки, которые указаны в import table


к моменту, когда WaitForInputIdle вернет управление, все статически загружаемые PE-модули уже загружены системой в АП целевого процесса и успешно инициализированы ... система делает это еще ДО того как управление будет передано на точку входа

так что твоя проблема в чем-то ином, но не в этом


Burmistroff   (2004-09-13 20:23:00) [5]

>Digitman
Где-то видел подробное объяснение того что это значит, но искать лень. Во всяком случае у меня была похожая проблема: WinCmd например при таком вмешательстве запускался с пустыми ListBox'ами или как там их (где список файлов), хотя все остальное вроде как работало

>UsAd
Попробуй действовать немного по-другому: запускай процесс с флагом SUSPENDED (ну или что-то в этом духе) а затем менять контекст главного thread'a, ставя EIP на адрес своей процедуры, которая загрузит DLL и вернет поток (EIP) назад.
Пример (правда жутко грязный и вообще :) ) есть на http://maxcomputing.narod.ru/ahijack2.html(см. "DoRemoteJob")


UsAd   (2004-09-13 18:31:00) [6]

никто не поможет?


UsAd   (2004-09-13 17:23:00) [7]

Даж сама система сообщает о том, что "Ошибка при инициализации приложения(0xc0000142). Для выхода из приложения нажмите Ок."


UsAd   (2004-09-13 17:02:00) [8]

"программа не успела инициализироваться"=не успели загрузиться все библиотеки, которые указаны в import table и другие операции такого рода.


Digitman   (2004-09-13 16:52:00) [9]


> UsAd   (13.09.04 16:40) [5]


еще раз спрашиваю - что тобой подразумевается под "программа не успела инициализироваться" ?


UsAd   (2004-09-13 16:40:00) [10]

WaitForInputIdle не изменило положения. например: мы подключаемся к thebat.exe. если не поставить задержку, то программа сразу вылетает. GPF. какие операции выполняем с процессом? читаем и пишем в его памяти. с задержкой всё ок...


Digitman   (2004-09-13 15:27:00) [11]


> UsAd   (13.09.04 15:14) [2]


> а если процесс запустится и сразу будет выполнять работу?


а если сначала пояснить, что тобой подразумевается под "программа не успела инициализироваться" ?


UsAd   (2004-09-13 15:16:00) [12]

или это "The WaitForInputIdle function enables a thread to suspend its execution until a specified process has finished its initialization" можно считать тем чем нужно?


UsAd   (2004-09-13 15:14:00) [13]

а если процесс запустится и сразу будет выполнять работу? или в dwMilliseconds ставить 1000 и не мучаться? или всё-таки после запуска произойдёт ilde и тогда ставить INFINITE?


Digitman   (2004-09-13 15:01:00) [14]

WaitForInputIdle ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо