![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск процесса
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 ?