SysFn09/ru: Difference between revisions
Jump to navigation
Jump to search
Punk Joker (talk | contribs) No edit summary |
No edit summary |
||
(One intermediate revision by one other user not shown) | |||
Line 10: | Line 10: | ||
Возвращаемое значение: | Возвращаемое значение: | ||
:* eax = максимальный номер слота потока | :* eax = максимальный номер слота потока | ||
::но, если указатель в ebx недопустимый, например, | |||
::регион [ebx, ebx + 0x4C) пересекается с памятью ядра, | |||
::то тогда функция возвращает -1 | |||
:* буфер, на который указывает ebx, содержит следующую информацию: | :* буфер, на который указывает ebx, содержит следующую информацию: | ||
::* +0: dword: использование процессора (сколько тактов в секунду | ::* +0: dword: использование процессора (сколько тактов в секунду | ||
Line 33: | Line 36: | ||
:::* 2 = поток приостановлен в момент ожидания события | :::* 2 = поток приостановлен в момент ожидания события | ||
:::* 3 = поток завершается в результате вызова функции -1 или | :::* 3 = поток завершается в результате вызова функции -1 или | ||
::::насильственно как следствие вызова подфункции 2 функции 18 | ::::насильственно как следствие вызова подфункции 2 [[SysFn18/ru|функции 18]] | ||
::::или завершения работы системы | ::::или завершения работы системы | ||
:::* 4 = поток завершается в результате исключения | :::* 4 = поток завершается в результате исключения | ||
Line 79: | Line 82: | ||
::* время выполнения складывается из времени, уходящего на | ::* время выполнения складывается из времени, уходящего на | ||
:::собственно работу, и времени простоя в ожидании прерывания | :::собственно работу, и времени простоя в ожидании прерывания | ||
:::(которое можно получить вызовом подфункции 4 функции 18). | :::(которое можно получить вызовом подфункции 4 [[SysFn18/ru|функции 18]]). | ||
:* Начиная со слота 2, размещаются обычные приложения. | :* Начиная со слота 2, размещаются обычные приложения. | ||
:* Обычные приложения размещаются в памяти по адресу 0 | :* Обычные приложения размещаются в памяти по адресу 0 | ||
Line 100: | Line 103: | ||
::добавлены некоторые поля. | ::добавлены некоторые поля. | ||
'''Константы для регистров:''' | |||
::eax - SF_THREAD_INFO (9) | |||
{{System_functions}} | {{System_functions}} | ||
[[Category: SysCalls]] | [[Category: SysCalls]] |
Latest revision as of 21:53, 25 November 2020
Функция 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)
|