Difference between revisions of "SysFn09/ru"

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