Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Не отрабатывает хук


Автор: epsilon 13.2.2007, 11:42
В общем задача такая: поставить локальный  хук на оконные сообщения в чужом процессе при помощи нитеграции DLL, в которой и будет обработчик.
Проблема такая: хук ставится, но не отрабатывает
Интеграция DLL через CreateRemoteThread по Рихтеру.

Код

...
static HMODULE ModuleFromAddress(PVOID pv)
{
 MEMORY_BASIC_INFORMATION mbi;
 return ((VirtualQuery(pv,&mbi,sizeof(mbi))!=0) ? (HMODULE)mbi.AllocationBase : NULL);
}
...
 //это в секции DLL_PROCESS_ATTACH
  HMODULE hMod = ModuleFromAddress((HOOKPROC)CallWndRetProc);// GetModuleHandle(NULL);
     HOOKPROC pProcAddr = GetProcAddress(hinst,"CallWndRetProc");

     HANDLE shot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
     THREADENTRY32 sThreadEntry;
     sThreadEntry.dwSize = sizeof(sThreadEntry);


     int i=0;
     for(BOOL fOK = Thread32First(shot,&sThreadEntry);fOK;fOK = Thread32Next(shot,&sThreadEntry))
     {
      if ((sThreadEntry.th32OwnerProcessID==pid)&&(sThreadEntry.th32ThreadID!=thid))
      {
       hhkWndMess[i++]  = SetWindowsHookEx(WH_CALLWNDPROCRET,pProcAddr,hMod,sThreadEntry.th32ThreadID);

      }
     }
...

Автор: dumb 15.2.2007, 04:23
Цитата(epsilon @  13.2.2007,  11:42 Найти цитируемый пост)
Интеграция DLL через CreateRemoteThread по Рихтеру.

масло масляное. SetWindowsHookEx сама подгружает твою dll в нужный(или во все) процесс.

перечислять потоки и расставлять на них хуки нужно в хост-приложении.

как вариант - в хосте создать mmf с массивом pid'ов, а в DLL_PROCESS_ATTACH открывать его, сравнивать с текущим pid(GetCurrentProcessId) и если свой pid не найден, вываливаться с 0. или, что менее требовательно к ресурсам, выставить флаг для функции-обработчика хука, в зависимости от которого либо производить обработку, либо просто return CallNextHookEx.

Автор: epsilon 16.2.2007, 09:55
это уже от отчаяния
Код

 hhkWndMess[i++]  = SetWindowsHookEx(WH_CALLWNDPROCRET,pProcAddr,hMod,sThreadEntry.th32ThreadID);

 пробовал так
Код

 hhkWndMess[i++]  = SetWindowsHookEx(WH_CALLWNDPROCRET,pProcAddr,NULL,sThreadEntry.th32ThreadID);

и так 
Код

 hhkWndMess[i++]  = SetWindowsHookEx(WH_CALLWNDPROCRET,pProcAddr,(HINSTANCE)0x400000,sThreadEntry.th32ThreadID);

не помогло
делать привязки к хосту или к чему-то еще (guest-у) крайне не желательно, DLL должна быть автономной (на сколько это возможно)
если работа SetWindowsHookEx не таит для тебя никаких секретов, то поясни почему не работает мой вариант, 
хук должна ставит именно DLL и именно при аттаче.  

переделать внедрение DLL в процесс через SetWindowsHookEx вполне возможно(может и правильней) - это не противоречить преследуемой цели, однако присутствует спортивный интерес или если хотите вопрос о том на сколько хорошо мы понимаем как все это работает...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)