#windows #multithreading #kernel #scheduler
Вопрос:
Переключение контекста Windows
Планировщик поддерживает очередь исполняемых потоков для каждого уровня приоритета. Они известны как готовые потоки. Когда процессор становится доступным, система выполняет переключение контекста. Шаги при переключении контекста следующие:
- Сохраните контекст потока, который только что завершил выполнение.
- Поместите поток, который только что завершил выполнение, в конец очереди для его приоритета.
- Найдите очередь с наивысшим приоритетом, содержащую готовые потоки.
- Удалите поток во главе очереди, загрузите его контекст и выполните его.
Я еще мало знаю об этой теме, поэтому не знаю, как развить свой вопрос. Где сохраняется контекст потока и можно ли получить к нему доступ (редактировать: читать) программно (без изменения ядра)?
Комментарии:
1. Из любопытства, как вы думаете, что могла бы сделать ваша программа, если бы она могла изменять контексты своих собственных приостановленных потоков?
2. @SolomonSlow, возможно, не изменит, просто прочтет для целей сканирования. Инструменты кибербезопасности.
3. Хмм… Я удаляю свой предыдущий комментарий. Я не очень ясно обдумывал этот вопрос. Вполне вероятно, что в Windows есть API отладки . (Как еще отладчик может работать в ОС с защищенным режимом?) Я не знаю, где бы вы это искали, но, вероятно, это то, что вам нужно.
4. @SolomonSlow это так, но как вредоносные, так и неопасные программы пытаются предотвратить отладку, легко обнаружить, что отладчик подключен.
5. AFAIK, контекст потока хранится в структурах данных ядра, и вы не можете получить к нему прямой доступ без привилегированных прав и, скорее всего, не с земли пользователя. Я не знаком с ядром Windows, но модули ядра Linux могут легко получить доступ к информации о расписании, поэтому я думаю, что службы Windows в режиме ядра тоже могли бы это сделать.
Ответ №1:
Если у вас есть дескриптор потока с необходимыми правами доступа, вы можете приостановить поток, а затем позвонить GetThreadContext
. Когда поток запущен, значения находятся в реальных регистрах процессора, когда он не запущен, контекст хранится в памяти, недоступной из пользовательского режима.
Контекст хранит значения различных регистров процессора, он полезен только отладчикам и расширенным функциям, таким как ввод кода и регистрация ошибок.