Ru/api/kernel: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
(Функция 1 - перенесена)
(Добавлено упоминание подфункции 31 функции 68. Добавлено нормальное название страницы.)
 
(117 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 - получить код нажатой клавиши. ==
 
Забирает код нажатой клавиши из буфера.
Параметры:
  * eax = 2 - номер функции
Возвращаемое значение:
  * если буфер пуст, возвращается eax=1
  * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
    старшее слово регистра eax обнулено
  * если есть "горячая клавиша", то возвращается
    al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
    старшее слово регистра eax содержит состояние управляющих клавиш
    в момент нажатия горячей клавиши
Замечания:
  * Существует общесистемный буфер нажатых клавиш размером 120 байт,
    организованный как очередь.
  * Существует ещё один общесистемный буфер на 120 "горячих клавиш".
  * При вызове этой функции приложением с неактивным окном
    считается, что буфер нажатых клавиш пуст.
  * По умолчанию эта функция возвращает ASCII-коды; переключиться на
    режим сканкодов (и назад) можно с использованием функции 66.
    Однако, горячие клавиши всегда возвращаются как сканкоды.
  * Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
    запустив приложения keyascii и scancode.
  * Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
    ASCII-коды получаются с использованием таблиц преобразования,
    которые можно установить подфункцией 2 функции 21 и прочитать
    подфункцией 2 функции 26.
  * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
    (rus/en) в отличие от сканкодов.
  * Поступает информация только о тех горячих клавишах, которые были
    определены этим потоком подфункцией 4 функции 66.
 
 
== Функция 3 - получить системное время. ==
 
Параметры:
  * eax = 3 - номер функции
Возвращаемое значение:
  * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
  * каждый элемент возвращается как BCD-число, например,
    для времени 23:59:59 результат будет 0x00595923
Замечания:
  * Смотри также подфункцию 9 функции 26 - получение времени
    с момента запуска системы; она во многих случаях удобнее,
    поскольку возвращает просто DWORD-значение счетчика времени.
  * Системное время можно установить функцией 22.
 
 
== Функция 4 - вывести строку текста в окно. ==
 
Параметры:
  * eax = 4 - номер функции
  * ebx = [координата по оси x]*65536 + [координата по оси y]
  * ecx = 0xX0RRGGBB, где
    * RR, GG, BB задают цвет текста
    * X=ABnn (биты):
    * nn задает используемый шрифт: 0=системный моноширинный,
      1=системный шрифт переменной ширины
    * A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
    * B=1 - закрашивать фон цветом edi
  * edx = указатель на начало строки
  * esi = для A=0 длина строки, должна быть не больше 255;
          для A=1 игнорируется
Возвращаемое значение:
  * функция не возвращает значения
Замечания:
  * Первый системный шрифт считывается при загрузке из файла char.mt,
    второй - из char2.mt.
  * Оба шрифта имеют высоту 9 пикселей, ширина моноширинного шрифта
    равна 6 пикселей.
 
 
== Функция 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: адрес п