Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

внедрение Dll и Open/SaveDialog [D5, Win2k]


Страницы:   1 2 3

lu0 ©   (2006-09-07 10:09:00) 

Проблема с вызовом Open/SaveDialog.
Ситуация такая:
- родительская программа запускает другую в suspended режиме и внедряет в неё dll.
выглядит внедрение так:


function Hoook(DLL:String):Boolean;
var
 Memory,LoadL:Pointer;
 hThread,TID:THANDLE;
 DLLSize,Written:dword;
begin
 Result:=False;
 try
   DLLSize:=Length(DLL)+2;
   Memory:=VirtualAllocEx(PROCESS.hProcess,Nil,DLLSize,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
   If Memory=Nil
   then Exit;
   If not WriteProcessMemory(PROCESS.hProcess,Memory,PChar(DLL),DLLSize,Written)
   then Exit;
   LoadL:=GetProcAddress(GetModuleHandle('Kernel32'),'LoadLibraryA');
   hThread:=CreateRemoteThread(PROCESS.hProcess,Nil,0,LoadL,Memory,0,TID);
   If hThread=0
   then Exit;
   WaitForSingleObject(hThread,INFINITE);
   Result:=True;


код практически один-в-один из примера Рихтера
после чего в вызываемой проге перестают работать диалоги Open/SaveDialog.

может кто скажет чего?


Сергей М.   (2006-09-08 13:29:00) [21]


> lu0 ©   (08.09.06 11:53) [29]
>
> Дядя Ketmar сильно молодец, однако.
> Проблема была в запуске дочерней проги в суспендеде


Что ж ты тогда горбатого лепил тут нам, что, мол, типа всеостальное работает, кроме как Open/SaveDialog ?)))

А как еще, спрашивается, иначе можно было истолковать твою "проблему" при таком ее изложении ?)


Ketmar   (2006-09-08 11:58:00) [22]

> [29] lu0 ©   (08.09.06 11:53)
исключительно для восстановления справедливости: это не я, это SleepyHead в своё время. %-)


lu0   (2006-09-08 11:53:00) [23]

Дядя Ketmarсильно молодец, однако.
Проблема была в запуске дочерней проги в суспендеде

всем спасибо.


Ketmar   (2006-09-07 17:48:00) [24]

> [27] lu0 ©   (07.09.06 17:17)
MSDN, Debugger API (или Debug API, не помню %-).


lu0   (2006-09-07 17:17:00) [25]


> отчего бы не открыть приложение с правами отладчика, дождаться
> правильного места, а потом внедрять, пока не надоест? в
> принципе, потом даже можно отладчик "отстрелить", но лучше
> не надо -- это ни разу не документированный хак.


подробнее можно ???
где смотреть/читать


lu0   (2006-09-07 17:16:00) [26]


> Вновь будешь упираться а-ля [2] ?

у томился я с тобой спорить ...
у меня на тесте сейчас код из Rouse_ ©   (07.09.06 13:56) [3]

>с этого следовало начинать.
это я ПРОВЕРИЛ УЖЕ ДАВНО, когда я говорил что dll не трогать я это и подразумевал.  

проблема где-то при внедрении-инициализации.


Ketmar   (2006-09-07 17:08:00) [27]

отчего бы не открыть приложение с правами отладчика, дождаться правильного места, а потом внедрять, пока не надоест? в принципе, потом даже можно отладчик "отстрелить", но лучше не надо -- это ни разу не документированный хак.


Ketmar   (2006-09-07 17:07:00) [28]

тьфу. не "синхронизация", а "инициализация".


Ketmar   (2006-09-07 17:07:00) [29]

а вот мне сильно подозрителен suspend. как известно, при suspend прошла ещё далеко не вся синхронизация, ибо суспендится оно в ливере ядра. не тут ли затык?


Сергей М.   (2006-09-07 17:01:00) [30]


> lu0 ©   (07.09.06 16:57) [21]


> проверил ... возвращает WAIT_OBJECT_0


малацца.

с этого следовало начинать.


> поток завершается нормально
> да и не должен он глючить


"глючит", видимо, не поток, а библиотека твоя, которую этот поток грузит.

Ы ?

Вновь будешь упираться а-ля [2] ?


lu0   (2006-09-07 16:57:00) [31]


>  еще можешь поймать WAIT_FAILED

проверил ... возвращает WAIT_OBJECT_0. т.е. поток завершается нормально
да и не должен он глючить


lu0   (2006-09-07 16:47:00) [32]


> Ты ж ни одним членом , судя по коду, не пошевелил, чтобы
> определить это ..

повторюсь ждёт она завершения ПОТОКА ...
перечитай  мой ответ № 14 ... только медленно ...

а штобы сильнее смеялось "ЭКСКАВАТОР"


lu0   (2006-09-07 16:46:00) [33]

в догонку ...
есть такая замечательная библиотечка advApiHook, в ней для внедрения DLL две функции InjectDll и InjectDllAlt.

так вот с InjectDll проблема, а с InjectDllAlt диалоги работают ....


Сергей М.   (2006-09-07 16:44:00) [34]


> lu0 ©   (07.09.06 16:40) [14]


> где смеяться ?


Известно где - при слове "лопата")


> ждёт ДОХРЕНА_КАК_ДОЛГО


Ну и дожидается хоть ?)
Ты ж ни одним членом , судя по коду, не пошевелил, чтобы определить это ..

Потому тебе и был дан намек на то , что это есть ф-ция, а ф-ция, как известно, призвана возвращать результат, а результат вфызова сей ф-ции, как известно, как раз и подскажет, дождался ли ты сего события)


Rouse_   (2006-09-07 16:43:00) [35]


> или я сильно не прав ?

не обязательно, еще можешь поймать WAIT_FAILED


lu0   (2006-09-07 16:43:00) [36]


> внедрения в той программе в которую внедрили

ВОТ ИМЕННО!!!


Rouse_   (2006-09-07 16:42:00) [37]

Да чего вы к WaitForSingleObject то привязались? :)
У него после внедрения в той программе в которую внедрили (а не в той, которая ожидает отработки потока) перестают диалоги срабатывать.


lu0   (2006-09-07 16:40:00) [38]


> WaitForSingleObject() - это функкция, а не процедура.

я конечно может и туплю ......
где смеяться ?

правильно ... ждёт когда объект перейдет в сигнальное состояние.
ждёт ДОХРЕНА_КАК_ДОЛГО...
для потока сигнальное состояние это "завершение потока"

или я сильно не прав ?


Сергей М.   (2006-09-07 16:36:00) [39]


> Бис, маэстро!


Да с превеликим удовольствием)) ..

Репу следует чесать ! На то она и репа головы)

Бездумно передирать чужой код без "чесания репы" - бессмыслица)


medved_68   (2006-09-07 16:21:00) [40]

И ждет она установки события по хендлу....hThread:=CreateRemoteThread(PROCESS.hProcess,Nil,0,LoadL,Memory,0,TID) ;
ООООчень подозрительно особенно hThread
Сергей М.
> Для начала удивленно чесать репу

Бис, маэстро!!!! :)))


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо