SysFn09/ru
Jump to navigation
Jump to search
Функция 9 - информация о потоке
Параметры:
- eax = 9 - номер функции
- ebx = указатель на буфер размера 1 Кб
- ecx = номер слота потока
- ecx = -1 - получить информацию о текущем потоке
Возвращаемое значение:
- eax = максимальный номер слота потока
- но, если указатель в ebx недопустимый, например,
- регион [ebx, ebx + 0x4C) пересекается с памятью ядра,
- то тогда функция возвращает -1
- буфер, на который указывает ebx, содержит следующую информацию:
- +0: dword: использование процессора (сколько тактов в секунду
- уходит на исполнение именно этого потока)
- +4: word: позиция окна потока в оконном стэке
- +6: word: (не имеет отношения к запрошенному потоку)
- номер слота потока, окно которого находится в оконном стэке
- в позиции ecx
- +8: word: зарезервировано
- +10 = +0xA: 11 байт: имя процесса
- (имя запущенного файла - исполняемый файл без расширения)
- +21 = +0x15: byte: зарезервировано, этот байт не изменяется
- +22 = +0x16: dword: адрес процесса в памяти
- +26 = +0x1A: dword: размер используемой памяти - 1
- +30 = +0x1E: dword: идентификатор (PID/TID)
- +34 = +0x22: dword: координата окна потока по оси x
- +38 = +0x26: dword: координата окна потока по оси y
- +42 = +0x2A: dword: размер окна потока по оси x
- +46 = +0x2E: dword: размер окна потока по оси y
- +50 = +0x32: word: состояние слота потока:
- 0 = поток выполняется
- 1 = поток приостановлен
- 2 = поток приостановлен в момент ожидания события
- 3 = поток завершается в результате вызова функции -1 или
- насильственно как следствие вызова подфункции 2 функции 18
- или завершения работы системы
- 4 = поток завершается в результате исключения
- 5 = поток ожидает события
- 9 = запрошенный слот свободен, вся остальная информация о
- слоте не имеет смысла
- +52 = +0x34: word: зарезервировано, это слово не изменяется
- +54 = +0x36: dword: координата начала клиентской области
- по оси x
- +58 = +0x3A: dword: координата начала клиентской области
- по оси y
- +62 = +0x3E: dword: ширина клиентской области
- +66 = +0x42: dword: высота клиентской области
- +70 = +0x46: byte: состояние окна - битовое поле
- бит 0 (маска 1): окно максимизировано
- бит 1 (маска 2): окно минимизировано в панель задач
- бит 2 (маска 4): окно свёрнуто в заголовок
- +71 = +0x47: dword: маска событий
- +75 = +0x4B: byte: режим ввода с клавиатуры(ASCII = 0; SCAN = 1)
Замечания:
- Слоты нумеруются с 1.
- Возвращаемое значение не есть общее число потоков, поскольку
- бывают свободные слоты.
- При создании процесса автоматически создается поток выполнения.
- Функция выдает информацию о потоке. Каждый процесс имеет
- хотя бы один поток. Один процесс может создать несколько потоков,
- в этом случае каждый поток получает свой слот, причем поля
- +10, +22, +26 в этих слотах совпадают.
- Для приложений не существует общего способа определить,
- принадлежат ли два потока одному процессу.
- Активное окно - окно, находящееся на вершине оконного стэка,
- оно получает сообщения о вводе с клавиатуры. Для него позиция в
- оконном стэке совпадает с возвращаемым значением.
- Слот 1 соответствует специальному потоку операционной системы,
- для которого:
- окно находится внизу оконного стэка, поля +4 и +6 содержат
- значение 1
- имя процесса - "OS/IDLE" (дополненное пробелами)
- адрес процесса в памяти равен 0, размер используемой памяти
- 16 Mb (0x1000000)
- PID=1
- координаты и размеры окна, равно как и клиентской области,
- условно полагаются равными 0
- состояние слота - всегда 0 (выполняется)
- время выполнения складывается из времени, уходящего на
- собственно работу, и времени простоя в ожидании прерывания
- (которое можно получить вызовом подфункции 4 функции 18).
- Начиная со слота 2, размещаются обычные приложения.
- Обычные приложения размещаются в памяти по адресу 0
- (константа ядра std_application_base_address).
- Наложения не происходит, поскольку у каждого процесса своя
- таблица страниц.
- При создании потока ему назначаются слот в системной таблице и
- идентификатор (Process/Thread IDentifier = PID/TID), которые для
- заданного потока не изменяются со временем.
- После завершения потока его слот может быть заново использован
- для другого потока. Идентификатор потока не может быть назначен
- другому потоку даже после завершения первого.
- Назначаемые новым потокам идентификаторы монотонно растут.
- Если поток еще не определил свое окно вызовом функции 0, то
- положение и размеры этого окна полагаются нулями.
- Координаты клиентской области окна берутся относительно окна.
- В данный момент используется только часть буфера размером
- 76 = 0x4C байта. Тем не менее рекомендуется использовать буфер
- размером 1 Кб для будущей совместимости, в будущем могут быть
- добавлены некоторые поля.
Константы для регистров:
- eax - SF_THREAD_INFO (9)
|