Ru/api/kernel: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
(Функция 5 - перенесена)
(Добавлено упоминание подфункции 31 функции 68. Добавлено нормальное название страницы.)
 
(113 intermediate revisions by 11 users not shown)
Line 1: Line 1:
= СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.7.1.0 =
{{DISPLAYTITLE:API ядра}}
 
''' СИСТЕМНЫЕ ФУНКЦИИ KolibriOS'''


Номер функции помещается в регистр eax.
Номер функции помещается в регистр eax.
Line 5: Line 7:
Все регистры, кроме явно указанных в возвращаемом значении, включая регистр флагов eflags, сохраняются.
Все регистры, кроме явно указанных в возвращаемом значении, включая регистр флагов eflags, сохраняются.


== Перечень функций ==


== Функция 0 - определить и нарисовать окно. ==
[[SysFn00/ru | Функция 0]] - определить и нарисовать окно.
 
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
область. Для окон со скином определяет стандартные кнопки закрытия и
минимизации.
 
Описание функции перенесено в отдельную статью: [[SysFn00 | Функция 0]]
 
== Функция 1 - поставить точку в окне. ==
 
Описание функции перенесено в отдельную статью: [[SysFn01 | Функция 1]]
 
== Функция 2 - получить код нажатой клавиши. ==
 
Извлекает из буфера код нажатой клавиши.
 
Описание функции перенесено в отдельную статью: [[SysFn02 | Функция 2]]
 
== Функция 3 - получить системное время. ==
 
Описание функции перенесено в отдельную статью: [[SysFn03 | Функция 3]]
 
== Функция 4 - вывести строку текста в окно. ==
 
Описание функции перенесено в отдельную статью: [[SysFn04 | Функция 4]]
 
== Функция 5 - пауза. ==
 
Задерживает выполнение программы на заданное время.
 
Описание функции перенесено в отдельную статью: [[SysFn05 | Функция 5]]
 
== Функция 6 - прочитать файл с рамдиска. ==
 
Параметры:
  * eax = 6 - номер функции
  * ebx = указатель на имя файла
  * ecx = номер стартового блока, считая с 1;
    ecx=0 - читать с начала файла (то же самое, что и ecx=1)
  * edx = число блоков для чтения;
    edx=0 - читать один блок (то же самое, что и edx=1)
  * esi = указатель на область памяти, куда будут записаны данные
Возвращаемое значение:
  * eax = длина файла в байтах, если файл успешно прочитан
  * eax = -1, если файл не найден
Замечания:
  * Данная функция является устаревшей; функция 70
    позволяет выполнять те же действия с расширенными возможностями.
  * Блок = 512 байт.
  * Для чтения всего файла можно указать заведомо большое значение
    в edx, например, edx = -1; но в этом случае будьте готовы к тому,
    что программа "упадет", если файл окажется слишком большим
    и "не влезет" в память программы.
  * Имя файла должно быть либо в формате 8+3 символов
    (первые 8 символов - собственно имя, последние 3 - расширение,
    короткие имена и расширения дополняются пробелами),
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
    (имя не более 8 символов, точка, расширение 3 символа,
    дополненное при необходимости пробелами).
    Имя файла должно быть записано заглавными буквами.
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
  * Эта функция не поддерживает папки на рамдиске.
 
 
== Функция 7 - вывести изображение в окно. ==
 
Параметры:
  * eax = 7 - номер функции
  * ebx = указатель на изображение в формате BBGGRRBBGGRR...
  * ecx = [размер по оси x]*65536 + [размер по оси y]
  * edx = [координата по оси x]*65536 + [координата по оси y]
Возвращаемое значение:
  * функция не возвращает значения
Замечания:
  * Координаты изображения - это координаты верхнего левого угла
    изображения относительно окна.
  * Размер изображения в байтах есть 3*xsize*ysize.
 
 
== Функция 8 - определить/удалить кнопку. ==
 
Параметры для определения кнопки:
  * eax = 8 - номер функции
  * ebx = [координата по оси x]*65536 + [размер по оси x]
  * ecx = [координата по оси y]*65536 + [размер по оси y]
  * edx = 0xXYnnnnnn, где:
    * nnnnnn = идентификатор кнопки
    * старший (31-й) бит edx сброшен
    * если 30-й бит edx установлен - не прорисовывать кнопку
    * если 29-й бит edx установлен - не рисовать рамку
      при нажатии на кнопку
  * esi = 0x00RRGGBB - цвет кнопки
Параметры для удаления кнопки:
  * eax = 8 - номер функции
  * edx = 0x80nnnnnn, где nnnnnn - идентификатор кнопки
Возвращаемое значение:
  * функция не возвращает значения
Замечания:
  * Размеры кнопки должны быть больше 0 и меньше 0x8000.
  * Для окон со скином при определении окна (вызове 0-й функции)
    создаются две стандартные кнопки - закрытия окна
    с идентификатором 1 и минимизации окна с идентификатором 0xffff.
  * Создание двух кнопок с одинаковыми идентификаторами
    вполне допустимо.
  * Кнопка с идентификатором 0xffff при нажатии интерпретируется
    системой как кнопка минимизации, система обрабатывает такое
    нажатие самостоятельно, не обращаясь к приложению.
    В остальном это обычная кнопка.
  * Общее количество кнопок для всех приложений ограничено
    числом 4095.
 
 
== Функция 9 - информация о потоке выполнения. ==
 
Параметры:
  * eax = 9 - номер функции
  * ebx = указатель на буфер размера 1 Кб
  * ecx = номер слота потока
    ecx = -1 - получить информацию о текущем потоке
Возвращаемое значение:
  * eax = максимальный номер слота потока
  * буфер, на который указывает ebx, содержит следующую информацию:
    * +0: dword: использование процессора (сколько тактов в секунду
      уходит на исполнение именно этого потока)
    * +4: word: позиция окна потока в оконном стэке
    * +6: word: (не имеет отношения к запрошенному потоку)
      номер слота потока, окно которого находится в оконном стэке
      в позиции ecx
    * +8: word: зарезервировано
    * +10 = +0xA: 11 байт: имя процесса
      (имя соответствующего исполняемого файла в формате 8+3)
    * +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): окно свёрнуто в заголовок
 
Замечания:
  * Слоты нумеруются с 1.
  * Возвращаемое значение не есть общее число потоков, поскольку
    бывают свободные слоты.
  * При создании процесса автоматически создается поток выполнения.
  * Функция выдает информацию о потоке. Каждый процесс имеет
    хотя бы один поток. Один процесс может создать несколько потоков,
    в этом случае каждый поток получает свой слот, причем поля
    +10, +22, +26 в этих слотах совпадают.
    Для приложений не существует общего способа определить,
    принадлежат ли два потока одному процессу.
  * Активное окно - окно, находящееся на вершине оконного стэка,
    оно получает сообщения о вводе с клавиатуры. Для него позиция в
    оконном стэке совпадает с возвращаемым значением.
  * Слот 1 соответствует специальному потоку операционной системы,
    для которого:
    * окно находится внизу оконного стэка, поля +4 и +6 содержат
      значение 1
    * имя процесса - "OS/IDLE" (дополненное пробелами)
    * адрес процесса в памяти равен 0, размер используемой памяти
      16 Mb (0x1000000)
    * PID=1
    * координаты и размеры окна, равно как и клиентской области,
      условно полагаются равными 0
    * состояние слота - всегда 0 (выполняется)
    * время выполнения складывается из времени, уходящего на
      собственно работу, и времени простоя в ожидании прерывания
      (которое можно получить вызовом подфункции 4 функции 18).
  * Начиная со слота 2, размещаются обычные приложения.
  * Обычные приложения размещаются в памяти по адресу 0x60400000
    (константа ядра std_application_base_address).
    Наложения не происходит, поскольку у каждого процесса своя
    таблица страниц.
  * При создании потока ему назначаются слот в системной таблице и
    идентификатор (Process/Thread IDentifier = PID/TID), которые для
    заданного потока не изменяются со временем.
    После завершения потока его слот может быть заново использован
    для другого потока. Идентификатор потока не может быть назначен
    другому потоку даже после завершения первого.