![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Firster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 16.8.2007 Где: Ukraine Репутация: нет Всего: нет |
Уважаемые эксперты! Возник вопрос, связанный с определением окончания(конца) загрузки приложения. Например, как определить сколько секунд грузиться MS Word и т.п. Теоретически все легко. ДЛИТЕЛЬНОСТЬ ЗАГРУЗКИ=ОКОНЧАНИЕ ЗАГРУЗКИ-СТАРТ ЗАГРУЗКИ. А вот как определить ОКОНЧАНИЕ ЗАГРУЗКИ? Заранее спасибо всем откликнувшимся.
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
WaitForInputIdle
Добавлено через 49 секунд правда если приложение не консольное и имеет цикл обработки сообщений -------------------- There are always someone smarter than you... |
|||
|
||||
| Firster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 16.8.2007 Где: Ukraine Репутация: нет Всего: нет |
Спасибо! Для тех кто столкнулся с такой проблемой даю код как делал я :
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
-------------------- There are always someone smarter than you... |
|||
|
||||
| Firster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 16.8.2007 Где: Ukraine Репутация: нет Всего: нет |
у меня разница в три часа идет. Поэтому отнимаю 3600 секунд
|
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Пыталась бороться с сабжевой темой. К сожалению, ветка на www.delphimaster.ru, где это обсуждалось уже умерла. Поэтому попробую привести выдержку из нее. В общем случае задача не так уж и проста, см., например http://groups.google.com/group/microsoft.p...49a244670a56d2b (в этом треде отметились не самые последние эксперты по подобным вопросам См. также http://groups.google.com/group/microsoft.p...7e944f5640757f3 Опираясь на приведенные ссылки и помощь Leonid Troyanovsky (он выполнил основную работу получила следующий механизм решения задачи: Подготавливаем APCProc, примерно такого вида: (Требования к коду APCProc такие же, как в случае с CRT) procedure APCProc(dwParam: Dword); stdcall; var OldState: Boolean; begin with PInjectInfo(dwParam) do // InjectInfo - нами созданная структура. описание ниже begin //... LastStatus := _NtSetEvent(hReadyEvent, @OldState); if LastStatus <> STATUS_INVALID_HANDLE then begin LastStatus := _NtClose(hReadyEvent); //... Создаем процесс: CreateProcess(..., CREATE_SUSPENDED, ..., Proc_Info); и hEvent, сигнал котрого будем ожидать: hEvent := CreateEvent(nil, True, False, nil); "Дупликатим" его DuplicateHandle(GetCurrentProcess, hEvent, Proc_Info.hProcess, @hDupEvent, 0, False, DUPLICATE_SAME_ACCESS); Пишем в адресное пространство жертвы структуру TInjectInfo, содержащую 1. Адреса функций, которые будем использовать в APCProc 2. hDupEvent - дубликат нашего hEvent 3. Всякие полезные мелочи 4. и сам код нашей APCProc Proc_WriteMemory(Proc_Info.hProcess, pInjectInfo, TmpSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE, pRemoteData) Создаем нить в теле жертвы: QueueUserAPC(PInjectInfo(pRemoteData).pInjectTreadCode, Proc_Info.hThread, DWord(pRemoteData)); Будим целевой процесс: ResumeThread(Proc_Info.hThread) И ждем срабатывания нашего hEvent - а. WaitArr := Make_Int64(Proc_Info.hProcess, hEvent); WaitResult := WaitForMultipleObjects(2, @WaitArr, False, TimeOut); Вот, вроде, и все. Тестировала на самых разных(специально для этого созданных) процессах. Как и говорил Leonid Troyanovsky: "APCProc срабатывает _непосредственно_после_инициализации процесса, но _до_выполнения main & etc". Очень удобное место |
|||
|
||||
| Firster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 16.8.2007 Где: Ukraine Репутация: нет Всего: нет |
Riply
Добавлено через 4 минуты и 25 секунд а то как то сложновато.... |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Firster,
Выдернуть пример из проекта сложновато: слишком много "внутренних ссылок" :( Если будет время (которого всегда не хватает), то напишу отдельный пример. Это только внешне так кажется. "Не так страшен черт, как его малюют" Читай Help. Споткнулся на каком-то месте - спрашивай. |
|||
|
||||
| Firster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 16.8.2007 Где: Ukraine Репутация: нет Всего: нет |
Riply хочу спросить по ходу дела. Я так понял ты делала перехват запуска приложения и момент ЗАВЕРШЕНИЯ ЕГО работы. Меня вот что интересует.
Делаю инжект ДЛЛ к ВинКомандеру. ДЛЛка успешно перехватывает запуск любого приложения из него (ВинКомандера). При запуске нового приложения из ВинКомандера делаю инжект ДЛЛ к этому процессу. При закрытии процесса должен произойти перехват функции ExitProcess, но его НЕ ПРОИСХОДИТ. Может я не то перехватываю или не в ту степь пошел...? Если есть идеи будк очень благодарен. |
|||
|
||||
| Riply |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Нет. Не делала. Если ты про мой пост выше, то там ловиться момент завершения инициализации процесса.
Причины могут быть разные: от неправильно сделанного перехвата до "невызова" жертвой целевой функции.
Не понимаю зачем вообще он (перехват ExitProcess) нужен. Можно организовать ожидание завершения процесса, благо его Handle известен. Можно обрабатывать, например, DLL_PROCESS_DETACH - раз уж в него(процесс) залезли. |
||||||
|
|||||||
| Firster |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 16.8.2007 Где: Ukraine Репутация: нет Всего: нет |
Точно и как я не дошел до этой мысли!!! Спасибо.
А это какая функция? |
||||
|
|||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Можно попробовать WaitFor(Single)MultipleObject(s), только, наверное не стоит их использовать "внутри" жертвы |
|||
|
||||
| Firster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 16.8.2007 Где: Ukraine Репутация: нет Всего: нет |
WaitForSingleObject подошел. Но возник вопрос с ожиданием ответа функции. Придеться создавать отдельно поток для ожидания ответа о завершении каждого процесса. Буду обрабатывать DLL_PROCESS_DETACH. Но здесь у меня небольшие проблемы... |
|||
|
||||
| Riply |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Если процессов меньше 64, то можно использовать WaitForMultipleObjects - она как раз для этого. Если же их больше, то тоже можно красиво "выкрутиться" - например WaitForMultipleObjectsEx (если правильно помню) или пул потоков.
Что "не так" ? |
||||
|
|||||
| Firster |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 16.8.2007 Где: Ukraine Репутация: нет Всего: нет |
Riply а не слишком ли ресурсы это забьет? Я просто еще не знаю как лучше, и нахожусь в так называемом творческом поиске ;)
Добавлено через 1 минуту и 43 секунды и спасибо ОГРОМНОЕ, что помогаешь разобраться в этом!!! |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |