Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.029 c
9-1087401083
Гость
2004-06-16 19:51
2004.10.17
Помогите найти исходник на Си или Си++


4-1095162606
noname
2004-09-14 15:50
2004.10.17
Биты в структурах


1-1096754425
Lakshmy
2004-10-03 02:00
2004.10.17
Печать данных из StringGrid


9-1086871238
Evgeniy_K
2004-06-10 16:40
2004.10.17
DirectSound


8-1090855559
asat
2004-07-26 19:25
2004.10.17
Graphics32





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский