Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Запуск процесса   Найти похожие ветки 

 
UsAd   (2004-09-13 14:58) [0]

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

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

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

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


 
Digitman ©   (2004-09-13 15:01) [1]

WaitForInputIdle ?


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

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


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

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


 
Digitman ©   (2004-09-13 15:27) [4]


> UsAd   (13.09.04 15:14) [2]


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


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


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

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


 
Digitman ©   (2004-09-13 16:52) [6]


> UsAd   (13.09.04 16:40) [5]


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


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

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


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

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


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

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


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

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

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


 
Digitman ©   (2004-09-14 08:18) [11]


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


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

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


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

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


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

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

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

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

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


 
имя   (2004-09-15 20:09) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
14-1096031715
Шишкин Илья
2004-09-24 17:15
2004.10.17
Чат для LAN без сервера


4-1094851020
массив
2004-09-11 01:17
2004.10.17
Как определить время простаивания системы для Win9x ?


10-1047265554
Softik
2003-03-10 06:05
2004.10.17
Как выгрузить корректно из памяти ОЛЕ-объект? ведь присвоение


3-1095821078
ProgC
2004-09-22 06:44
2004.10.17
При закрытии приложения появляется двойная запись в БД


1-1096976842
СержК
2004-10-05 15:47
2004.10.17
Ошибка при установке компонент