Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Глобальный хук... |
Автор: tigger 7.2.2007, 18:19 |
Вообщем проблема в следующем. Создаю программу на отлов открытия окон сторонними программами. Прога состоит из двух модулей, сама программа и dll. Отлавливаемых программ может быть несколько. Так вот в своем приложении беру id процесса сторонней программы которую хочу контролировать на открытие окон, передаю этот id себе в dll и все работает как часы. Но вот вопрос если отлавливаемых программ несколько 2 и более т.е будет несколько id процессов как осуществить передачу их в dll и следовательно отлов их окон. |
Автор: MetalFan 7.2.2007, 22:25 |
так же, как и при передаче одного id. в чем собстно проблема то? как передать данные? |
Автор: tigger 8.2.2007, 02:11 |
Да проблема при передаче 2 или более id. У меня в приложении процедура которая стартует хук равна procedure StartHook(id:THandle) которая выполняется при нажатии на кнопку. А если процессов много как она будет выглядеть? |
Автор: dumb 8.2.2007, 05:02 |
тут два варианта: либо просто вызываешь эту же процедуру для новых id, либо делаешь по-настоящему глобальный хук - т.е. не указываешь tid, а разбор полетов делаешь в функции хука. |
Автор: MetalFan 8.2.2007, 09:32 | ||
tigger, как-как) а пофантазировать?! я же написал, пользуй array [0..0] of.... RangeChecking обязательно должен быть отключен!!!
как "принять", разберешься? учти, тебе еще в ловушку в других процессах нужно эти данные передать, через MMF например. |
Автор: tigger 8.2.2007, 19:14 |
MetalFan, очень ценную информацию дал. А как потом раскидать их по MMF по отдельным файлам. В один lPIDs а в другой размер массива, я что-то делал ошибка вылетает на функции фильтре. ![]() |
Автор: MetalFan 8.2.2007, 19:58 |
создается именованный MMF в приложении установившем хук, а остальные только читают. ты представляешь себе, как глобальные хуки вообще "фунцыклируют"? когда устанавливаешь глобальную ловушку, библиотека, содержащая функцию-фильтр проецируется во все процессы в системе... таким образом все специфические для процесса данные такие, как всяческие хэндлы (MMF, окон и проч.объектов системы) становятся непоределенными. Глобальные переменные содержат мусор и проч... значит в момент "присоединения" библиотеки к процессу тебе нужно получить все необходимые данные из созданного ранее при инициализации ловушки MMF. показывай, что делал ;) з.ы. могу конечно пример дать, хотя в принципе в сети они есть. остается только http://delphiworld.narod.ru/base/hooks_aspects_of_realization.html и адаптировать под свои нужды ;) да и хотелось бы чтоб сам разобрался большей частью... а я только направление могу дать и ошибки помочь подправить. |
Автор: tigger 9.2.2007, 14:32 | ||||
Вообщем что я написал В приложении.
теперь что имеем в dll
так вот в функции фильтре hook нет hMemFile1, length, hMemFile, Hide_id равны нулю что не так делаю ли как можно это победить? |
Автор: MetalFan 9.2.2007, 15:03 | ||
да, ошибочки есть...да и некоторые места я бы по-другому написал. явные ошибки (если я сам не ошибаюсь ;) ): 1)
ну это ты так думаешь ;) давай код 2) После MapViewOfFile и "отправки" данных надо вызывать UnMapViewOfFile... замечания: 1) зачем создавать 2!!! MMF? не проще ли отдать все за один раз в одной структуре? 2) зачем каждый раз в функции-ловушке открывать/считывать данные? достаточно один раз считать, имхо. либо при "подгрузке" длл (см DLLProc), либо при первом вызове ф-ции-ловушки. 3) для "копирования" кусков памяти лучче имхо юзать Move или давай так) приложи аттачем файлы этого проекта. я поправлю. и тоже приаттачу. а то влом Ctrl+C/Ctrl+V жать много раз) |
Автор: tigger 9.2.2007, 16:35 |
Знаешь явную ошибку здесь нашел это length := count; надо было так length^ := count^; а насчет всех твоих советов я попробую если не пойдет приложу, а то так обучения нет забудется скоро. |
Автор: tigger 19.2.2007, 15:52 |
MetalFan, посмотри код там приложение с dll и тестовое приложение которое нужно словить, но что-то не идет. В чем проблема. |
Автор: MetalFan 19.2.2007, 16:50 |
а вот здесь пжалуста по подробнее ;) з.ы. + посмотрю попозже аттач |
Автор: MetalFan 19.2.2007, 17:17 |
dumb, опередил) да уж, код не блещет наглядностью з.ы. ошибка как минимум в том, что не сделано UnmapViewOfFile |
Автор: tigger 20.2.2007, 12:55 |
dumb, по подробнее можно. |
Автор: dumb 20.2.2007, 14:17 |
схема достаточно подробна. рассказывай, что в ней тебе непонятно. ps. эта фраза относилась к твоему коду, а не к моей схеме... ![]() |
Автор: tigger 20.2.2007, 17:11 |
Так то все стало понятно отлов появления на панели задач сделал, а как теперь в тестовом приложении словить появление окна формы. Код прилагаю. Да еще без ide среды запускаешь проект ошибка обращения к памяти dll вылетает. |
Автор: dumb 20.2.2007, 18:29 | ||
tigger, основное твое непонимание: CreateFileMapping создает область памяти. MapViewOfFile - отображает эту область в адресное пространство твоего процесса. т.е. ты не должен выделять память для ArrHide, и работать с этим массивом нужно после CreateFileMapping/MapViewOfFile. причем в схеме, которую я приводил, это вроде как достаточно очевидно. вобщем, в dll у тебя правильно сделано, если убрать GetMem. относительно массива pid'ов: делай его размер на один элемент больше и последний эл-т делай = 0. в dll отловишь конец массива именно по этому нулевому эл-ту. StopHookProc вызываешь неинициализированный - это остался "хвост" от прошлой версии dll. сделай обычную процедуру с таким же именем:
|
Автор: MetalFan 20.2.2007, 22:11 |
+ ПОКА не будет сделано UnmapViewOfFile, данные, что ты поместил в отораженную область памяти у себя в процессе, будут недоступны другим процессам(читай-хукам в других процессах), AFAIK. p.s. хотя кажется я гоню) но главное не забыть про синхронизацию |
Автор: tigger 21.2.2007, 02:05 |
Я не понял почему этот код не отлавливает появление главного окна в моем тестовом приложении. |
Автор: dumb 21.2.2007, 06:11 | ||
потому, что он с кучей ошибок(часть которых тебе указали) и, как следствие, не является рабочим. ты определись, что ты хочешь: сам что-то понять и сделать или чтобы за тебя все сделали, а ты бы только вставил "if count > 2 then ShowMessage('это demo-версия')"? - если последнее, то я - пас. |
Автор: tigger 21.2.2007, 13:56 |
Спасибо за ответ. |
Автор: MetalFan 21.2.2007, 14:54 | ||||||
причеши код, а? честно говоря, с кодом, написаным ТАКИМ стилем ковыряться нет никакого удовольствия и/или желания( если приведешь в читаемый вид, то посмотрю ;)
трудно чтоли отформатировать так: ??
хотя зачем столько exit'ов и проверок?
з.ы. добавлю - ошибок просто масса... причем порой из-за ужасного кода |
Автор: tigger 21.2.2007, 15:50 |
MetalFan посмотри причесал вроде бы. Какие там ошибки там кода то мало я ничего не вижу? |
Автор: MetalFan 21.2.2007, 17:04 |
tigger, ММ.. что причесал? не вижу никакого причесывания. ладно, в кратце по ошибкам. в dll: 1) где выделяется/освобождается память под PHookRec? 2) почитай( в мсдн например) как правильно работать с хуком WH_CBT. у тебя бред написан, imho 3) в DllEntryPoint что-то тоже както неочень хорошо написано. проведи рефаторинг кода или забрось программирование... код написан просто УЖАСНО. 1) код отформатирован абсолюьно нечитаемо и не наглядно 2) названия локальных/глобальных переменных/полей классов ничем не отличаются 3) весь код в классах форм "свален" в обработчики событий... 4) и т.д. и т.п. з.ы. былоб время, причесал бы немного твой код. но время=деньги... если хошь, могу баксов за 10-20 довести до рабочего состояния твой проектик ;) |
Автор: tigger 22.2.2007, 01:56 |
MetalFan, сомневаюсь что от форматирования кода зависит его работа, то что код в обработчиках это не смертельно. PHookRec я уже не использую после подсказок "мозголома". И все таки ошибка в чем то глобальном. Всем спасибо, побольше бы таких учителей. |
Автор: MetalFan 22.2.2007, 09:04 | ||
зависит. еще как. ошибки гораздо проще находить. это как минимум. вот именно. на некоторые места, что содержат ошибки, я тебе уже указал. в таким образом оформленном коде их править мягкоговоря не удобно. а рефакторингом за тебя заниматься никто не будет) повторюсь:
к этому еще добавлю абсолютно не оправданное использование глобальных переменных. |