Перевод потока в состояние Suspend

Тема в разделе "WASM.NT.KERNEL", создана пользователем Lecko, 20 дек 2010.

  1. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Доброго времени суток!

    Вопрос заключается в следующем: в данной статье http://www.wasm.ru/article.php?article=scheduler описаны API-функции, которые переводят процесс в состояние Suspend или выводят из него. Вопрос: можно ли "засуспендить" процесс модификацией определенных структур ядра (например, через отладчик)? Исследование с помощью WinDbg показало, что скорее всего в модификации нуждается структура KTHREAD, в частности, поля WaitBlock и WaitBlockList, однако, изменение значений в них на снятые с того же процесса в "завешенном" состоянии результата не дает. Какие поля все-таки нужно модифицировать?

    Заранее спасибо
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Здесь
    Суть понятна?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Поток нужно исключить из списка готовых потоков планировщика.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Реализовать это несколько труднее, чем зашедулить APC, которая повесит поток.
     
  5. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Спасибо за ответ!
    Суть понятна, в деталях начинаются проблемы. Сложность возникла в этом месте
    Код (Text):
    1. KiInsertQueueApc(&Thread->SuspendApc, RESUME_INCREMENT);
    Насколько я понимаю, это вызов асинхронной процедуры SuspendAPC. Как следует отсюда http://www.opening-windows.com/techart_windows_vista_apc_internals.htm, функция KiInsertQueueApc сначала выставляет флаг KTHREAD.ApcState.KernelApcPending, а затем KTHREAD.SpecialApcDisable (или KTHREAD.KernelApcDisable для Windows XP), то есть установка этих флагов заставляет поток при получении управления передать управление на нужную АРС (в ApcListHead установлена именно SuspendAPC, я проверил). Однако "зависания" не происходит...что я делаю не так?
     
  6. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Или даже так, сформулируем вопрос по-другому: как манипуляцией с объектами ядра вызвать АРС?
     
  7. Lecko

    Lecko Андрей

    Публикаций:
    0
    Регистрация:
    20 дек 2010
    Сообщения:
    60
    Ау! Неужели никто не знает, возможно ли это сделать хотя бы теоретически? Все предварительные действия (проверка флагов, настройка списков) я выполнил, однако дальше должен следовать вызов функции hal!HalRequestSoftwareInterrupt. Как вызвать ее, имея только доступ на чтение/запись к памяти?