Ru/api/kernel: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
(Функция 4 - перенесена)
(Добавлено упоминание подфункции 31 функции 68. Добавлено нормальное название страницы.)
 
(114 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 - пауза. ==
 
Задерживает выполнение программы на заданное время.
Параметры:
  * eax = 5 - номер функции
  * ebx = время в сотых долях секунды
Возвращаемое значение:
  * функция не возвращает значения
Замечания:
  * Передача ebx=0 не передает управление следующему процессу и
    вообще не производит никаких действий. Если действительно
    требуется передать управление следующему процессу
    (закончить текущий квант времени), используйте подфункцию 1
    функции 68.
  * При текущей реализации произойдет немедленный возврат из функции,
    если сложение ebx с текущим значением счетчика времени вызовет
    32-битное переполнение.
 
 
== Функция 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 (выполняется)
    * время выполнения складывается из времени, уходящего на
      собственно работу, и времени простоя в ожидании прерывания
      (к