1) CreateThread(…). Создаёт новый поток в текущем процессе.
2) CreateRemoteThread(…).Создаёт новый поток в другом процессе.
3) ExitThread(…). Нормальное завершение потока.
4) TerminateThread(…). Аварийное завершение потока, завершение потока из другого потока.
5) GetExitCodeThread(…). Получение кода завершения любого потока.
6) GetThreadTimes(…). Возвращает временные характеристики другого потока, то есть время работы другого потока в пользовательском режиме и режиме ядра. В Windows 95 и Windows 98 не используются.
7) GetThreadContext(…). Возвращает регистры процессора для данного потока.
SetThreadContext(…). Изменяет регистры процессора для данного потока.
8) GetCurrentThread(…). Получить дескриптор текущего потока.
SetCurrentThreadId(…). Получить идентификатор текущего потока.
Аналогичные функции есть для процесса GetCurrentProcess и GetCurrentProcessId.
Управляющие структуры имеют kernel32.dll. Исполнительная система. Упрощённая структура.
TEB
Win32k.sys
Пользовательский режим
Область системных программ
W32THREAD
csrss.exe
База данных используется kernel32.dll.
Блок потока ядра – Win32 в режиме ядра.
Лекция № 10
1) TDB (ETHREAD). Начинается со стандартного заголовка, который содержит идентификатор объекта (от 0 до 27) и счётчик числа обращений к данному объекту. Далее следует указатель на структуру KTHREAD – блок потока ядра, указатель на PDB (EPROCESS), откуда поток может извлекать, структура CONTEXT – содержит описание регистров, время создания и завершения потока, стартовый адрес потока, и так далее.
2) KTHREAD. Содержит информацию необходимую ядру Windows для планирования потоков и их синхронизации с другими потоками.
· суммарное время работы в пользовательском режиме,
· суммарное время работы в режиме ядра,
· базовый и текущий приоритеты потока,
· значение кванта (для Windows 2000),
· маска привязки к процессорам, то есть в случае многопроцессорной системы информация о том, на каких процессорах может выполняться данный поток,
· список объектов, ожидаемых данным потоком, например, поток ждёт завершения какого-либо другого потока.
· указатель на блок окружения потока, который находится в пользовательском адресном прост-ранстве.
3) TEB. В нём содержится информация о стеке потока, базовый адрес.
заполненная часть стека
/////////////////////////
старший адрес
текущий адрес стека
базовый адрес стека младший адрес
В блоке TEB содержится локальная память потока TLS, значение кода последней ошибки, то есть LastError. Даные необходимые для работы модулей user32.dll и GDI32. В том случае, если поток работает в сети в TEB содержится указатель на данные WinSock.
4) W32THREAD. Дублирует данные, необходимые для работы user32 и gdi32.
Алгоритм работы функции CreateThread(…) (kernel32.dll).
1. Создаёт стек пользовательского режима в адресном пространстве процесса.
2. Инициализирует аппаратный процесс потока, то есть структуру CONTEXT.
3. Вызывает функцию ядра ОС NtCreateThread(…), которая создаёт все управляющие структуры, которые находятся в системной части адресного пространства.
4. Создаёт блок TEB.
5. Уведомляется подсистема Win32, которая создаёт блок W32THREAD.
6. Возвращает дескриптор и идентификатор вызывающей программе вновь созданного потока.
7. Вновь созданный поток ставится в очередь на выполнение.