Форум: "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.038 c