Ru/api/kernel: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
Line 844: Line 844:
== Функция 65 - вывести изображение с палитрой в окно. ==
== Функция 65 - вывести изображение с палитрой в окно. ==


Параметры:
Описание функции перенесено в отдельную статью: [[SysFn65/ru|Функция 65]]
  * eax = 65 - номер функции
  * ebx = указатель на изображение
  * ecx = [размер по оси x]*65536 + [размер по оси y]
  * edx = [координата по оси x]*65536 + [координата по оси y]
  * esi = число бит на пиксель, должно быть 1, 4, 8, 15, 16, 24 или 32
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
          игнорируется при esi > 8
  * ebp = смещение данных каждой следующей строки изображения
          относительно предыдущей
Возвращаемое значение:
  * функция не возвращает значения
Замечания:
  * Координаты изображения - это координаты верхнего левого угла
    изображения относительно окна.
  * Размер изображения в байтах есть xsize*ysize.
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
    за исключением, быть может, последних байтов строк, содержит
    информацию о цвете 8 пикселей, старший бит соответствует первому
    пикселю.
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
    за исключением последних байтов строк (если ширина изображения
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
    соответствует первому пикселю.
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
    рассматривается как индекс в палитре.
  * Если изображение использует не все 256 цветов, а меньше,
    размер палитры может быть меньше 256.
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
    по 5 пикселей на каждый цвет.
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
    кодируется тремя байтами - последовательно синяя, зелёная,
    красная составляющие цвета.
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
    есть ещё игнорируемый четвёртый байт.
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
    esi=24, ebp=0.
 


== Функция 66 - работа с клавиатурой. ==
== Функция 66 - работа с клавиатурой. ==

Revision as of 07:30, 10 April 2010

СИСТЕМНЫЕ ФУНКЦИИ KolibriOS 0.7.7.0

Номер функции помещается в регистр eax. Вызов системной функции осуществляется командой "int 0x40". Все регистры, кроме явно указанных в возвращаемом значении, включая регистр флагов eflags, сохраняются.


Функция 0 - определить и нарисовать окно.

Определяет окно приложения. Рисует рамку окна, заголовок и рабочую область. Для окон со скином определяет стандартные кнопки закрытия и минимизации.

Описание функции перенесено в отдельную статью: Функция 0

Функция 1 - поставить точку в окне.

Описание функции перенесено в отдельную статью: Функция 1

Функция 2 - получить код нажатой клавиши.

Извлекает из буфера код нажатой клавиши.

Описание функции перенесено в отдельную статью: Функция 2

Функция 3 - получить системное время.

Описание функции перенесено в отдельную статью: Функция 3

Функция 4 - вывести строку текста в окно.

Описание функции перенесено в отдельную статью: Функция 4

Функция 5 - пауза.

Задерживает выполнение программы на заданное время.

Описание функции перенесено в отдельную статью: Функция 5

Функция 6 - прочитать файл с рамдиска.

Описание функции перенесено в отдельную статью: Функция 6

Функция 7 - вывести изображение в окно.

Описание функции перенесено в отдельную статью: Функция 7

Функция 8 - определить/удалить кнопку.

Описание функции перенесено в отдельную статью: Функция 8

Функция 9 - информация о потоке выполнения.

Описание функции перенесено в отдельную статью: Функция 9

Функция 10 - ожидать события.

Если очередь сообщений пуста, то ждет появления сообщения в очереди. В таком состоянии поток не получает процессорного времени. Затем считывает сообщение из очереди.

Описание функции перенесено в отдельную статью: Функция 10

Функция 11 - проверить, есть ли событие, без ожидания.

Если в очереди сообщений есть какое-то событие, то считывает и возвращает его. Если очередь пуста, возвращает нуль.

Описание функции перенесено в отдельную статью: Функция 11

Функция 12 - начать/закончить перерисовку окна.

Подфункция 1 - начать перерисовку окна. Подфункция 2 - закончить перерисовку окна.

Перенесены в отдельную статью: Функция 12

Функция 13 - нарисовать прямоугольник в окне.

Функция перенесена в статью Функция 13

Функция 14 - получить размеры экрана.

Описание функции перенесено в отдельную статью: Функция 14

Функция 15 - работа с фоновой графикой

Описание функции перенесено в отдельную статью: Функция 15

Функция 16 - сохранить рамдиск на дискету.

Описание функции перенесено в отдельную статью: Функция 16

Функция 17 - получить код нажатой кнопки.

Описание функции перенесено в отдельную статью: Функция 17

Функция 18 - системные настройки и информация

Описание функции перенесено в отдельную статью: Функция 18

Функция 20 - интерфейс MIDI.

Описание функции перенесено в отдельную статью: Функция 20

Функция 21 - установка системных параметров

Описание функции перенесено в отдельную статью: Функция 21

Функция 22 - установить системную дату/время.

Описание функции перенесено в отдельную статью: Функция 22

Функция 23 - ожидать события с таймаутом.

Описание функции перенесено в отдельную статью: Функция 23

Функция 24 - работа с проигрывателем компакт-дисков

Описание функции перенесено в отдельную статью: Функция 24

Функция 25 - установить громкость SBPro.

Удалена

Функция 26 - аппаратный сервис

Описание функции перенесено в отдельную статью: Функция 26

Функция 27

сведения об этой функции отсутствуют

Функция 28 - установить громкость SB16.

Удалена

Функция 29 - получить системную дату.

Описание функции перенесено в отдельную статью: Функция 29

Функция 30 - работа с текущей папкой.

Описание функции перенесено в отдельную статью: Функция 30

Функция 31

сведения об этой функции отсутствуют

Функция 32

Системная функция с этим номером использовалась в ранних версиях КОС для удаления файла с рамдиска. удалена

Функция 33

Системная функция с этим номером использовалась в ранних версиях КОС для записи файла на рамдиск. удалена

Функция 34

сведения об этой функции отсутствуют

Функция 35 - прочитать цвет точки на экране.

Описание функции перенесено в отдельную статью: Функция 35

Функция 36 - прочитать область экрана.

Описание функции перенесено в отдельную статью: Функция 36

Функция 37 - работа с мышью.

Описание функции перенесено в отдельную статью: Функция 37

Функция 38 - нарисовать отрезок.

Описание функции перенесено в отдельную статью: Функция 38

Функция 39 - чтение фона.

Описание функции перенесено в отдельную статью: Функция 39

Функция 40 - установить маску для ожидаемых событий.

Описание функции перенесено в отдельную статью: Функция 40

Функция 41 - узнать владельца IRQ.

Описание функции перенесено в отдельную статью: Функция 41

Функция 42 - работа с данными, полученными по IRQ.

Описание функции перенесено в отдельную статью: Функция 42

Функция 43 - ввод/вывод в порт.

Описание функции перенесено в отдельную статью: Функция 43

Функция 44 - определить действия при поступлении IRQ.

Описание функции перенесено в отдельную статью: Функция 44

Функция 45 - зарезервировать/освободить IRQ.

Описание функции перенесено в отдельную статью: Функция 45

Функция 46 - зарезервировать/освободить группу портов ввода/вывода.

Внимание: Эта функция устарела и может быть удалена в следующих версиях ядра.

Описание функции перенесено в отдельную статью: Функция 46

Функция 47 - вывести число в окно.

Описание функции перенесено в отдельную статью: Функция 47

Функция 48 - стили отображения окон

Описание функции перенесено в отдельную статью: Функция 48

Функция 49 - Advanced Power Management (APM).

Описание функции перенесено в отдельную статью: Функция 49

Функция 50 - установка формы окна.

Описание функции перенесено в отдельную статью: Функция 50

Функция 51 - создать поток.

Описание функции перенесено в отдельную статью: Функция 51

Функция 52 - сетевой сервис.

Описание функции перенесено в отдельную статью: Функция 52

Функция 53 - работа с сетевым сокетами.

Описание функции перенесено в отдельную статью: Функция 53

Функция 54

Описание сисфункции с этим номером отсутствует.

Функция 55 - аудио сервис.

Подфункция 0 - загрузить данные для SB16.

Параметры:

 * eax = 55 - номер функции
 * ebx = 0 - номер подфункции
 * ecx = указатель на данные (копируется 64 килобайта, используется
   столько, сколько установлено подфункцией 2)

Возвращаемое значение:

 * функция не возвращает значения

Замечания:

 * Формат и размер данных устанавливаются подфункцией 2.


Подфункция 1 - начать проигрывать данные на SB16.

Параметры:

 * eax = 55 - номер функции
 * ebx = 1 - номер подфункции

Возвращаемое значение:

 * функция не возвращает значения

Замечания:

 * Предварительно данные должны быть загружены подфункцией 0 и
   определён их формат подфункцией 2.
 * Функция возвращает управление, когда началось проигрывание данных;
   после этого проигрывание идёт независимо от приложения (и вообще
   не требует загрузки процессора).
 * Предварительно должны быть определены базовый порт SB16
   (подфункцией 4 функции 21) и канал DMA
   (подфункцией 10 функции 21).


Подфункция 2 - установить формат данных SB16.

Параметры:

 * eax = 55 - номер функции
 * ebx = 2 - номер подфункции
 * ecx = 0 - установить разрядность
   * edx = 1 - 8бит моно
   * edx = 2 - 8бит стерео
 * ecx = 1 - установить размер данных
   * edx = размер в байтах
 * ecx = 2 - установить частоту проигрывания
   * edx = частота

Возвращаемое значение:

 * функция не возвращает значения

Замечания:

 * При загрузке системы устанавливаются следующие параметры
   по умолчанию: разрядность - 8 бит моно, размер - 64 Кб,
   частота 44100 Гц. Тем не менее рекомендуется явно устанавливать
   необходимые значения, поскольку они могли быть переустановлены
   какой-нибудь программой.


Подфункция 55 - начать проигрывать данные на встроенном спикере.

Параметры:

 * eax = 55 - номер функции
 * ebx = 55 - номер подфункции
 * esi = указатель на данные

Возвращаемое значение:

 * eax = 0 - успешно
 * eax = 55 - ошибка (спикер отключён или занят)

Данные - это массив элементов переменной длины. Формат каждого элемента определяется первым байтом:

 * 0 = конец данных
 * 1..0x80 = задаёт длительность звучания в сотых долях секунды
   ноты, определяемой непосредственным значением частоты
   * следующее слово (2 байта) содержит делитель частоты;
     частота определяется как 1193180/divider
 * 0x81 = invalid
 * 0x82..0xFF = нота, определяемая октавой и номером:
   * длительность в сотых долях секунды = (первый байт)-0x81
   * присутствует ещё один байт;
   * (второй байт)=0xFF - пауза
   * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
     до 12, a=номер октавы (считая с 0)

Замечания:

 * Пищание спикером может быть запрещено/разрешено подфункцией 8
   функции 18.
 * Функция возвращает управление, сообщив куда следует информацию
   о запросе. Само проигрывание идёт независимо от программы.
 * Данные должны сохраняться в памяти по крайней мере
   до конца проигрывания.


Функция 57 - PCI BIOS.

Параметры:

 * eax = 57 - номер функции
 * ebp соответствует регистру al в спецификации PCI BIOS
 * остальные регистры - по спецификации PCI BIOS

Возвращаемое значение:

 * CF не определён
 * остальные регистры - по спецификации PCI BIOS

Замечания:

 * Многих результатов этой функции можно также добиться вызовом
   соответствующих подфункций функции 62.
 * Функция вызывает расширение PCI32 BIOS, документированное,
   например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
 * Если BIOS не поддерживает это расширение, поведение функции
   эмулируется (через аналоги подфункций функции 62 режима ядра).


Функция 58 - работа с файловой системой.

Параметры:

 * eax = 58
 * ebx = указатель на информационную структуру

Возвращаемое значение:

 * eax = 0 - успешно; иначе код ошибки файловой системы
 * в зависимости от подфункции может возвращаться значение и
   в других регистрах

Общий формат информационной структуры:

 * +0: dword: номер подфункции
 * +4: dword: номер блока
 * +8: dword: размер
 * +12 = +0xC: dword: указатель на данные
 * +16 = +0x10: dword: указатель на память для работы системы
   (4096 байт)
 * +20 = +0x14: n db: ASCIIZ-строка с именем файла

Уточнения - в документации на соответствующую подфункцию. Имя файла нечувствительно к регистру латинских букв, русские буквы должны быть заглавными. Формат имени файла: /base/number/dir1/dir2/.../dirn/file, где /base/number идентифицирует устройство, на котором ищется файл: одно из

 * /RD/1 = /RAMDISK/1 для доступа к рамдиску
 * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
   /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
 * /HD/x = /HARDDISK/x - устаревший вариант доступа к жёсткому диску
   (в этом случае база определяется подфункцией 7 функции 21),
   x - номер раздела (считая с 1)
 * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
   к устройствам IDE0 (Primary Master), IDE1 (Primary Slave),
   IDE2 (Secondary Master), IDE3 (Secondary Slave);
   x - номер раздела на выбранном винчестере, изменяется от 1 до 255
   (на каждом из винчестеров нумерация начинается с 1)

Замечания:

 * В первых двух случаях допускается использование FIRST вместо 1,
   SECOND вместо 2, но использовать эту возможность
   не рекомендуется для удобства перехода на будущие расширения.
 * Накладывается ограничение n<=39.
 * Имена папок и файла dir1,...,dirn,file должны быть в формате 8.3:
   имя не более 8 символов, точка, расширение не более 3 символов.
   Хвостовые пробелы игнорируются. Других пробелов быть не должно.
   Если имя занимает ровно 8 символов, точку можно опустить
   (хотя пользоваться этим не рекомендуется для удобства перехода
   на будущие расширения).
 * Функция не поддерживает папок на рамдиске.

Примеры:

 * '/RAMDISK/FIRST/KERNEL.ASM',0
   '/rd/1/kernel.asm',0
 * '/HD0/1/kernel.asm',0
 * '/hd0/1/menuet/pics/tanzania.bmp',0

Доступные подфункции:

 * подфункция 0 - чтение файла/папки
 * подфункция 8 - LBA-чтение с устройства
 * подфункция 15 - получение информации о файловой системе


Подфункция 0 - прочитать файл/папку.

Параметры:

 * eax = 58
 * ebx = указатель на информационную структуру

Формат информационной структуры:

 * +0: dword: 0 = номер подфункции
 * +4: dword: номер блока для чтения (считая с 0)
 * +8: dword: число блоков для чтения
 * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные
 * +16 = +0x10: dword: указатель на буфер для работы системы
   (4096 байт)
 * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
   общем описании

Возвращаемое значение:

 * eax = 0 - успешно, иначе код ошибки файловой системы
 * ebx = размер файла (в байтах) или
   -1=0xffffffff, если файл не найден

Замечания:

 * Размер блока - 512 байт.
 * Эта функция устарела, для чтения файлов используйте подфункцию 0
   функции 70, для чтения папок - подфункцию 1 функции 70.
 * Функция позволяет читать содержимое папки. Из файловых систем
   поддерживается только FAT. Формат FAT-папки описан в любой
   документации по FAT.
 * Размер папки определяется по размеру цепочки кластеров в FAT.
 * Если файл кончился раньше, чем был прочитан последний запрошенный
   блок, то функция прочитает, сколько сможет, после чего вернёт
   eax=6 (EOF).
 * Функция позволяет читать корневые папки /rd/1,/fd/x,/hd[n]/x, но
   в первых двух случаях текущая реализация не следует
   установленным правилам:
   для /rd/1:
   * если указано 0 блоков для чтения, считается,
     что запрашивается 1;
   * если запрашивается больше 14 блоков или начальный блок
     не меньше 14-го, то возвращается eax=5 (not found) и ebx=-1;
   * размер корневого каталога рамдиска = 14 блоков,
     0x1C00=7168 байт; но возвращается ebx=0
     (за исключением случая предыдущего пункта);
   * как ни странно, можно прочитать 14-й блок (там, вообще говоря,
     мусор - напоминаю, счёт ведётся с 0);
   * если был запрошен хотя бы один блок с номером, не меньшим 14,
     то возвращается eax=6(EOF); иначе eax=0.
   Для /fd/x:
   * если начальный блок не меньше 14-го, то возвращается
     eax=5 (not found) и ebx=0;
   * кстати говоря, формат FAT12 допускает дискеты с размером
     корневого каталога меньше или больше 14 блоков;
   * проверки длины не делается;
   * если удалось прочитать данные с дискеты, возвращается
     eax=0,ebx=0; в противном случае eax=10 (access denied), ebx=-1.
 * Функция обрабатывает чтение специальных папок /,/rd,/fd,/hd[n];
   но результат не соответствует ожидаемому
   (по работе с обычными файлами/папками), не следует установленным
   правилам, может измениться в следующих версиях ядра и потому
   не описывается. Для получения информации об оборудовании
   используйте подфункцию 11 функции 18 или
   читайте соответствующие папки подфункцией 1 функции 70.


Подфункция 8 - LBA-чтение с устройства.

Параметры:

 * eax = 58 - номер функции
 * ebx = указатель на информационную структуру

Формат информационной структуры:

 * +0: dword: 8 = номер подфункции
 * +4: dword: номер блока для чтения (считая с 0)
 * +8: dword: игнорируется (устанавливайте в 1)
 * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные
   (512 байт)
 * +16 = +0x10: dword: указатель на буфер для работы системы
   (4096 байт)
 * +20 = +0x14: ASCIIZ-имя устройства: нечувствительно к регистру,
   одно из /rd/1 = /RamDisk/1, /hd/n = /HardDisk/n,
   1<=n<=4 - номер устройства: 1=IDE0, ..., 4=IDE3.
   Вместо цифр допускается, хотя и не рекомендуется для удобства
   перехода на будущие расширения,
   использование 'first','second','third','fourth'.

Возвращаемое значение:

 * если указано имя устройства /hd/xxx, где xxx не находится
   в списке выше:
   * eax = ebx = 1
 * если указано неправильное имя устройства
   (за исключением предыдущего случая):
   * eax = 5
   * ebx не меняется
 * если LBA-доступ запрещён подфункцией 11 функции 21:
   * eax = 2
   * ebx разрушается
 * для рамдиска: попытка чтения блока за пределами рамдиска
   (18*2*80 блоков) приводит к
   * eax = 3
   * ebx = 0
 * при успешном чтении:
   * eax = ebx = 0

Замечания:

 * Размер блока - 512 байт; читается один блок.
 * Не следует полагаться на возвращаемое значение,
   оно может измениться в следующих версиях.
 * Требуется, чтобы был разрешён LBA-доступ к устройствам
   подфункцией 11 функции 21. Узнать это можно вызовом
   подфункцией 11 функции 26.
 * LBA-чтение дискеты не поддерживается.
 * Функция считывает данные физического жёсткого диска;
   если по каким-то причинам нужны данные конкретного раздела,
   придётся определять начальный сектор этого раздела
   (либо напрямую через MBR, либо из расширенной структуры,
   возвращаемой той же подфункцией 11 функции 18).
 * Функция не проверяет код ошибки жёсткого диска, так что запрос
   несуществующего сектора всё равно что-то прочитает
   (вероятнее всего, нули, но это определяется устройством) и
   это будет считаться успехом (eax=0).


= Функция 58, подфункция 15 - получить информацию о файловой системе.

Параметры:

 * eax = 58 - номер функции
 * ebx = указатель на информационную структуру

Формат информационной структуры:

 * +0: dword: 15 = номер подфункции
 * +4: dword: игнорируется
 * +8: dword: игнорируется
 * +12 = +0xC: dword: игнорируется
 * +16 = +0x10: dword: игнорируется
 * +20 = +0x14: (проверяется только второй символ, сразу после слэша)
   /rd=/RAMDISK или /hd=/HARDDISK

Возвращаемое значение:

 * если второй символ не принадлежит множеству {'r','R','h','H'}:
   * eax = 3
   * ebx = ecx = dword [fileinfo] = 0
 * для рамдиска:
   * eax = 0 (успех)
   * ebx = общее число кластеров = 2847
   * ecx = число свободных кластеров
   * dword [fileinfo] = размер кластера = 512
 * для жёсткого диска: база и раздел определяются подфункциями 7 и 8
   функции 21:
   * eax = 0 (успех)
   * ebx = общее число кластеров
   * ecx = число свободных кластеров
   * dword [fileinfo] = размер кластера (в байтах)

Замечания:

 * Не удивляйтесь странному расположению 4-го возвращаемого
   параметра - когда писался этот код, при системных вызовах
   приложению возвращались только регистры eax,ebx,ecx (из
   pushad-структуры, передающейся как аргумент системной функции).
   Теперь это исправлено, так что, возможно, имеет смысл возвращать
   размер кластера в edx, пока эту функцию не начали использовать.
 * Вообще-то ещё существует подфункция 11 функции 18, возвращающая
   информацию о файловой системе. По расширенной таблице дисковой
   подсистемы можно определить размер кластера (там он хранится
   в секторах) и общее число кластеров для жёстких дисков.


Функция 60 - Inter Process Communication (IPC).

IPC применяется для посылок сообщений от одного процесса/потока другому. При этом следует предварительно договориться о том, как интерпретировать конкретное сообщение.

Подфункция 1 - установить область для получения IPC

Вызывается процессом-приёмником. Параметры:

 * eax = 60 - номер функции
 * ebx = 1 - номер подфункции
 * ecx = указатель на буфер
 * edx = размер буфера

Возвращаемое значение:

 * eax = 0 - всегда успешно

Формат IPC-буфера:

 * +0: dword: если здесь не 0, то буфер считается заблокированным;
   блокируйте/разблокируйте буфер, когда вы с ним активно работаете
   и вам надо, чтобы извне не изменялись данные буфера
   (не поступали новые сообщения)
 * +4: dword: занято места в буфере (в байтах)
 * +8: первое сообщение
 * +8+n: второе сообщение
 * ...

Формат сообщения:

 * +0: dword: PID процесса/потока, пославшего сообщение
 * +4: dword: длина сообщения (не считая этот заголовок)
 * +8: n*byte: данные сообщения

=== Подфункция 2 - послать сообщение IPC. ===- Вызывается процессом-инициатором. Параметры:

 * eax = 60 - номер функции
 * ebx = 2 - номер подфункции
 * ecx = PID приёмника
 * edx = указатель на данные сообщения
 * esi = длина сообщения (в байтах)

Возвращаемое значение:

 * eax = 0 - успешно
 * eax = 1 - приёмник не определил буфер для IPC-сообщений
   (может быть, ещё не успел, а может быть, это не тот поток,
   который нужен)
 * eax = 2 - приёмник заблокировал IPC-буфер;
   попробуйте немного подождать
 * eax = 3 - переполнение IPC-буфера приёмника
 * eax = 4 - процесса/потока с таким PID не существует

Замечания:

 * Система сразу после записи IPC-сообщения в буфер посылает
   потоку-приёмнику событие с кодом 7 (см. коды событий).


Функция 61 - получить параметры для прямого доступа к графике.

Программе доступны данные графического экрана (область памяти, которая собственно и отображает содержимое экрана) напрямую без вызовов системных функций через селектор gs:

       mov     eax, [gs:0]

поместит в eax первый dword буфера, содержащий информацию о цвете левой верхней точки (и, возможно, цвета нескольких следующих).

       mov     [gs:0], eax

при работе в режимах VESA c LFB установит цвет левой верхней точки (и возможно, цвета нескольких следующих). Для интерпретации данных графического экрана требуется знание некоторых параметров, которые возвращаются этой функцией. Замечания:

 * Параметры графики очень редко меняются при работе системы,
   а именно, только в случаях, когда пользователь работает
   с программой VRR.
 * При изменении видеорежима система перерисовывает все окна
   (событие с кодом 1) и перерисовывает фон (событие 5).
   Эти же события происходят и в других случаях,
   которые встречаются значительно чаще, чем изменение видеорежима.
 * При работе в видеорежимах с LFB селектор gs указывает на
   собственно LFB, так что чтение/запись по gs приводят
   непосредственно к изменению содержимого экрана. При работе в
   видеорежимах без LFB gs указывает на некоторую область данных
   ядра, причём все функции вывода на экран добросовестно выполняют
   двойную работу по записи непосредственно на экран и по записи
   в этот буфер. В результате при чтении содержимого этого буфера
   результаты соответствуют содержимому экрана
   (с, вообще говоря, большим цветовым разрешением),
   а запись игнорируется.
   Исключением является режим 320*200, для которого в главном цикле
   системного потока выполняется обновление экрана в соответствии
   с движениями курсора мыши.

Разрешение экрана

Параметры:

 * eax = 61 - номер функции
 * ebx = 1 - номер подфункции

Возвращаемое значение:

 * eax = [разрешение по оси x]*65536 + [разрешение по оси y]

Замечания:

 * Можно использовать функцию 14 с учётом того, что она возвращает
   размеры на 1 меньше. Это полностью эквивалентный способ.

Число бит на пиксель

Параметры:

 * eax = 61 - номер функции
 * ebx = 2 - номер подфункции

Возвращаемое значение:

 * eax = число бит на пиксель (24 или 32)

Число байт на строку

Параметры:

 * eax = 61 - номер функции
 * ebx = 3 - номер подфункции

Возвращаемое значение:

 * eax = число байт, которое занимает одна строка развёртки
   (горизонтальная линия на экране)


Функция 62 - пользовательский доступ к PCI.

Подфункция 0 - получить версию PCI-интерфейса.

Параметры:

 * eax = 62 - номер функции
 * bl = 0 - номер подфункции

Возвращаемое значение:

 * eax = -1 - доступ к PCI запрещён; иначе
 * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
 * старшее слово eax обнулено

Замечания:

 * Предварительно должен быть разрешён низкоуровневый доступ к PCI
   для приложений подфункцией 12 функции 21.
 * Если PCI BIOS не поддерживается, то значение ax неопределено.

Подфункция 1 - получить номер последней PCI-шины.

Параметры:

 * eax = 62 - номер функции
 * bl = 1 - номер подфункции

Возвращаемое значение:

 * eax = -1 - доступ к PCI запрещён; иначе
 * al = номер последней PCI-шины; оставшиеся байты eax разрушаются

Замечания:

 * Предварительно должен быть разрешён низкоуровневый доступ к PCI
   для приложений подфункцией 12 функции 21.
 * Если PCI BIOS не поддерживается, то значение al неопределено.


Подфункция 2 - Получить механизм обращения к конфигурационному пространству PCI.

Параметры:

 * eax = 62 - номер функции
 * bl = 2 - номер подфункции

Возвращаемое значение:

 * eax = -1 - доступ к PCI запрещён; иначе
 * al = механизм (1 или 2); прочие байты eax разрушаются

Замечания:

 * Предварительно должен быть разрешён низкоуровневый доступ к PCI
   для приложений подфункцией 12 функции 21.
 * Механизм обращения выбирается в соответствии
   с характеристиками оборудования.
 * Подфункции чтения и записи автоматически работают
   с выбранным механизмом.


подфункции 4,5,6 - прочитать PCI-регистр.

Параметры:

 * eax = 62 - номер функции
 * bl = 4 - читать байт
 * bl = 5 - читать слово
 * bl = 6 - читать двойное слово
 * bh = номер PCI-шины
 * ch = dddddfff, где ddddd = номер устройства на шине,
   fff = номер функции устройства
 * cl = номер регистра (должен быть чётным для bl=5,
   делиться на 4 для bl=6)

Возвращаемое значение:

 * eax = -1 - ошибка (запрещён доступ к PCI или
   неподдерживаемые параметры); иначе
 * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
   оставшаяся часть регистра eax разрушается

Замечания:

 * Предварительно должен быть разрешён низкоуровневый доступ к PCI
   для приложений подфункцией 12 функции 21.
 * Механизм доступа 2 поддерживает только 16 устройств на шине и
   игнорирует номер функции. Получить механизм доступа можно вызовом
   подфункции 2.
 * Некоторые регистры стандартны и существуют для всех устройств,
   некоторые определяются конкретным устройством. Список первых
   входит, например, в известный Interrupt List by Ralf Brown
   (http://www.pobox.com/~ralf/files.html,
   ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
   список вторых должен быть указан в документации по устройству.


подфункции 8,9,10 - записать в PCI-регистр.

Параметры:

 * eax = 62 - номер функции
 * bl = 8 - писать байт
 * bl = 9 - писать слово
 * bl = 10 - писать двойное слово
 * bh = номер PCI-шины
 * ch = dddddfff, где ddddd = номер устройства на шине,
   fff = номер функции устройства
 * cl = номер регистра (должен быть чётным для bl=9,
   делиться на 4 для bl=10)
 * dl/dx/edx (в зависимости от запрошенного размера) содержит
   данные для записи

Возвращаемое значение:

 * eax = -1 - ошибка (запрещён доступ к PCI или
   неподдерживаемые параметры)
 * eax = 0 - успешно

Замечания:

 * Предварительно должен быть разрешён низкоуровневый доступ к PCI
   для приложений подфункцией 12 функции 21.
 * Механизм доступа 2 поддерживает только 16 устройств на шине и
   игнорирует номер функции. Получить механизм доступа можно вызовом
   подфункции 2.
 * Некоторые регистры стандартны и существуют для всех устройств,
   некоторые определяются конкретным устройством. Список первых
   входит, например, в известный Interrupt List by Ralf Brown;
   список вторых должен быть указан в документации по устройству.

подфункция 11 - инициализировать доступ к MMIO

Параметры:

 * eax = 62 - номер функции
 * bl = 11 - номер подфункции
 * cx = адрес PCI-устройства 

Возвращаемое значение:

 * eax = -1 - доступ к PCI запрещён; 
 * eax = -2 - доступ к MMIO-блокам устройства не разрешён; 
 * eax = -3 - ошибка аллокации пользовательской дин. памяти; иначе
 * eax = размер доступной динамической памяти.

Замечания:

 * Предварительно должен быть разрешён низкоуровневый доступ к PCI
   для приложений подфункцией 12 функции 21.
 * адрес PCI-устройства должен совпадать с системной переменной
   mmio_pci_addr

подфункция 12 - получить линейный адрес MMIO-блока

Параметры:

 * eax = 62 - номер функции
 * bl  = 12 - номер подфункции
 * bh  = номер BAR-регистра в конфигурационной зоне PCI
 * ecx = размер MMIO-блока (в байтах)
 * edx = смещение относительно начала MMIO-блока (в 4K-страницах!)

Возвращаемое значение:

 * eax = -1 - доступ к PCI запрещён; 
 * eax = -2 - неверный номер BAR-регистра; 
 * eax = -3 - BAR не содержит адреса IO;
 * eax = -4 - BAR адресует порты IO;
 * eax = -5 - ошибка аллокации; иначе
 * eax = начальный адрес MMIO в адресном пространстве приложения.

Замечания:

 * Предварительно должен быть разрешён низкоуровневый доступ к PCI
   для приложений подфункцией 12 функции 21.
 * Адрес PCI-устройства задается системной переменной mmio_pci_addr.
 * Предоставленный диапазон линейных адресов должен освобождаться
   посредством вызова функции 62:13

подфункция 13 - освободить линейные адреса MMIO

Параметры:

 * eax = 62 - номер функции
 * bl  = 12 - номер подфункции
 * ecx = начальный адрес освобождаемого MMIO-блока в адресном
   пространстве приложения

Возвращаемое значение:

 * eax = 1 - блок успешно освобожден; 

Замечания:

 * Предварительно приложению должен быть выделен uMMIO-блок (fn62:12)

Функция 63 - работа с доской отладки.

Описание функции перенесено в отдельную статью: Функция 63

Функция 64 - перераспределить память приложения.

Описание функции перенесено в отдельную статью: Функция 64

Функция 65 - вывести изображение с палитрой в окно.

Описание функции перенесено в отдельную статью: Функция 65

Функция 66 - работа с клавиатурой.

Описание функции перенесено в отдельную статью: Функция 66

  • Подфункция 1 - установить режим ввода с клавиатуры.
  • Подфункция 2 - получить режим ввода с клавиатуры.
  • Подфункция 3 - получить состояние управляющих клавиш.
  • Подфункция 4 - установить общесистемную "горячую клавишу".
  • Подфункция 5 - удалить установленную "горячую клавишу".

Функция 67 - изменить положение/размеры окна.

Описание функции перенесено в отдельную статью: Функция 67

Функция 68 - внутренние системные службы

Описание функции перенесено в отдельную статью: Функция 68

  • Подфункция 0 - получить счётчик переключений задач.
  • Подфункция 1 - переключиться на следующий поток выполнения.
  • Подфункция 2 - кэш + rdpmc.
  • Подфункция 3 - прочитать MSR-регистр.
  • Подфункция 4 - записать в MSR-регистр.
  • Подфункция 11 - инициализировать кучу процесса.
  • Подфункция 12 - выделить блок памяти.
  • Подфункция 13 - освободить блок памяти.
  • Подфункция 14 - ожидать извещения от драйвера.
  • Подфункция 15 - установить обработчик исключений FPU.
  • Подфункция 16 - загрузить драйвер.
  • Подфункция 17 - управление драйвером.
  • Подфункция 18 - установить обработчик исключений SSE.
  • Подфункция 19 - загрузить DLL.
  • Подфункция 20 - перераспределить блок памяти.
  • Подфункция 22 - открыть именованую область памяти.
  • Подфункция 23 - закрыть именованую область памяти.

Функция 69 - отладка.

Описание функции перенесено в отдельную статью: Функция 69

  • Подфункция 0 - определить область данных для отладочных сообщений.
  • Подфункция 1 - получить состояние регистров отлаживаемого потока.
  • Подфункция 2 - установить состояние регистров отлаживаемого потока.
  • Подфункция 3 - отключиться от отлаживаемого процесса.
  • Подфункция 4 - приостановить поток.
  • Подфункция 5 - возобновить выполнение потока.
  • Подфункция 6 - прочитать из памяти отлаживаемого процесса.
  • Подфункция 7 - записать в память отлаживаемого процесса.
  • Подфункция 8 - завершить отлаживаемый поток.
  • Подфункция 9 - установить/снять аппаратную точку останова.

Функция 70 - работа с файловой системой с поддержкой длинных имён.

Описание функции перенесено в отдельную статью: Функция 70

  • Подфункция 0 - чтение файла с поддержкой длинных имён.
  • Подфункция 1 - чтение папки с поддержкой длинных имён.
  • Подфункция 2 - создание/перезапись файла с поддержкой длинных имён.
  • Подфункция 3 - запись в существующий файл с поддержкой длинных имён.
  • Подфункция 4 - установка размера файла.
  • Подфункция 5 - получение информации о файле/папке.
  • Подфункция 6 - установка атрибутов файла/папки.
  • Подфункция 7 - запуск программы.
  • Подфункция 8 - удаление файла/папки.
  • Подфункция 9 - создание папки.

Функция 72 - послать сообщение окну.

Описание функции перенесено в отдельную статью: Функция 72

Подфункция 1 - послать сообщение с параметром активному окну.

Функция -1 - завершить выполнение потока/процесса

Описание функции перенесено в отдельную статью: Функция -1

Список событий

Очередное событие можно получить вызовом одной из функций 10 (ожидать события), 11 (проверить без ожидания), 23 (ожидать в течение заданного времени). Эти функции возвращают только те события, которые входят в маску, устанавливаемую функцией 40. По умолчанию это первые три, чего вполне достаточно для многих приложений. Коды событий:

 * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
 * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
   активно) или нажата "горячая клавиша";
   сбрасывается, когда все клавиши из буфера считаны функцией 2
 * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
   закрытия, созданная неявно функцией 0; кнопка минимизации
   обрабатывается системой и о ней сообщения не приходит;
   поступает, только когда окно активно; сбрасывается, когда все
   кнопки из буфера считаны функцией 17)
 * 4 = зарезервировано (в текущей реализации никогда не приходит даже
   при размаскировке функцией 40)
 * 5 = перерисовывается фон рабочего стола (сбрасывается
   автоматически после перерисовки, так что если во время перерисовки
   фона программа не ждёт и не проверяет события, то этого события
   она не заметит)
 * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
   или перемещение; сбрасывается при прочтении)
 * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
   Communication; сбрасывается при прочтении)
 * 8 = произошло сетевое событие (сбрасывается при прочтении;
   смотри работу с сетью)
 * 9 = произошло отладочное событие (сбрасывается при прочтении;
   смотри отладочную подсистему)
 * 16..31 = произошло событие с соответствующим IRQ
   (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)


Коды ошибок файловой системы

 * 0 = успешно
 * 1 = не определена база и/или раздел жёсткого диска (подфункциями
   7, 8 функции 21)
 * 2 = функция не поддерживается для данной файловой системы
 * 3 = неизвестная файловая система
 * 4 = зарезервировано, никогда не возвращается в текущей реализации
 * 5 = файл не найден
 * 6 = файл закончился
 * 7 = указатель вне памяти приложения
 * 8 = диск заполнен
 * 9 = таблица FAT разрушена
 * 10 = доступ запрещён
 * 11 = ошибка устройства

При запуске программы возможны также следующие коды ошибок:

 * 30 = 0x1E = недостаточно памяти
 * 31 = 0x1F = файл не является исполнимым
 * 32 = 0x20 = слишком много процессов