ХУК(искал, но не нашел)

Тема в разделе "WASM.WIN32", создана пользователем Keith, 28 фев 2005.

  1. Keith

    Keith New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    13
    Три вопроса:



    1. SetWindowsHookEx(WH_GETMESSAGE,...) не вешается на первичный поток, который был создан и сразу приостановлен(CREATE_SUSPENDED). На сколько я понял – это из-за 'WH_GETMESSAGE'. Посоветуйте на что еще можно повесить хук для того, чтобы он работал в 98-XP.



    2. Мне нужно, чтобы чужой поток, на который я делаю хук, выполнял определенный код, когда мой поток вызывает UnhookWindowsHookEx(). Как это лучше сделать?



    3. Как лучше передать информацию(строка + хэндл) из потока на который поставлен хук в поток, который устанавливал хук? Я так понимаю, что потоку на который вешается хук надо будет передавать свой ThreadId? Как это лучше сделать?



    Выслушаю любые мысли. Заранее - большое СПАСИБО.
     
  2. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    1) Видимо из-за CREATE_SUSPENDED )

    2) такой вариант я бы использовал: перед вызовом unhook

    ручками рассылать всем копиям хука уведомления (например,собственное сообщение во все оконные функции)

    3)MemoryMappedFile имхо.
     
  3. Keith

    Keith New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    13
    1) Посоветуйте на что еще можно повесить хук для того, чтобы он работал в 98-XP? MSDN читал, но там нет ничего про CREATE_SUSPENDED, видимо надо логически догадаться, а у меня знаний про хуки не достаточно.



    2) А если в dll'ке будет объект моего класса, который будет выполнять необходимые действия при дестрое? На сколько это корректно?



    3)Громоздко, но пока ничего лучше не примал.
     
  4. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    1) Обязательно креате суспендед? или тебе нужно запускаться в каждом процессе?



    2)

    Тоже выход - обрабатывать DLL_PROCESS_DETACH

    Но тогда неизвестно,когда код выгрузки длл будет выполнен, так как по моему опыту длл может ждать выгрузки и десятки секунд. Возможно - минуты.



    3) действительно лучший выход. причем легальный.
     
  5. Keith

    Keith New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    13
    1) Не нужно запускаться в каждом, но нужно, чтобы некоторые первичные потоки начинали выполнение с моего кода.



    2) То же заметил.



    3) А как на счет записи в реестре? Накладно это?
     
  6. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    3) Нет, не накладно. Копия реестра находится в памяти.



    Но это "некрасиво" )
     
  7. Keith

    Keith New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    13
    А что на счет 1)? Может быть можно не SUSPENDED сделать, а еще как-то запаузить выполнение чужого потока так, чтобы на него можно было повесить хук?
     
  8. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    так просто это не решается.

    придется перехватывать API функции создания процессов
     
  9. Keith

    Keith New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2005
    Сообщения:
    13
    Я не против. Что надо делать внутри API функции создания процессов?