![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
внедрение Dll и Open/SaveDialog [D5, Win2k]
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
Сергей М.
> Для начала удивленно чесать репу
Бис, маэстро!!!! :)))