Прервать поток и выполнить в нём свой код

Тема в разделе "WASM.BEGINNERS", создана пользователем HoShiMin, 23 мар 2017.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Можно ли как-то прервать заданный поток, не находящийся в Alertable-состоянии, без SetThreadContext? Стоит задача в заданном потоке выполнять с заданной периодичностью собственную процедуру. Но этот поток не входит в Alertable-состояние, QueueUserAPC не сработает. Есть CreateTimerQueueTimer, он умеет прерывать потоки, но нельзя указать, в контексте какого именно потока нужно выполнить заданный код. Есть ли что-то подобное (таймеры), где можно указать, в каком именно потоке следует выполнять каллбэк?
     
  2. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Хотелось бы поподробнее узнать условия задачи и причины ограничений. Почему надо исполнять код в конкретном потоке, почему без SetThreadContext? Я бы остановил поток через SuspendThread, а потом уже похимичил бы с контекстом (сохранить, заменить на нужную функцию) ну и ResumeThread. После выполнения можно вызвать исключение и поменять назад контекст в обработчике. Ну а вызывать этот ужас из другого потока по таймеру. Чем подход SuspendThread/GetThreadContext/SetThreadContext/ResumeThread? не устраивает?
     
    Indy_ нравится это.
  3. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Понадобилось делать антиотладочные проверки в уже существующем Java-процессе: добавил свою библиотеку в импорты jvm.dll, в DllMain запускаю проверку. Но проблема в том, что поток проверки просто заморозят. Как и заморозят все WatchDog'и. Единственный выход вижу в назначении проверок в основной рабочий поток: заморозят проверки - заморозят процесс. Поэтому очень желательно обойтись без сторонних потоков вообще.
     
  4. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Надо разобраться, что в основном потоке происходит. Может там есть цикл или часто вызываемая функция. Можно или пропатчить какое либо место, или поставить на него бряку с помощью отладочных регистров. Если там есть обработка оконных сообщений, то можно воспользоваться функцией SetTimer и указать свой обработчик, который будет регулярно вызываться циклом обработки сообщений. С внутренностями jvm.dll к сожалению не знаком.
     
  5. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    А сделать то же самое, что CreateTimerQueueTimer, только для заданного потока, нет способов?
     
  6. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Надо в исходники винды смотреть.
    Можно единожды вызвать CreateTimerQueueTimer из основного потока с помощью техники SuspendThread/GetThreadContext/SetThreadContext/ResumeThread
     
  7. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Кстати, вариант, хоть и дикий
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Quatre_R_Winner

    Поток не правильно понимается тс, само это понятие не корректно воспринимается. Поток это не какой то обьект, который обладает только контекстом. Он например с памятью работает, без неё он существует в виде ядерных структур(обьектов), отложен и не исполняется. Посему способов бесчисленное множество, но тс интересует обход защиты, а там на всех сервисах ловушки.