2012-03-13 17:51:57 +01:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
2016-02-21 01:05:15 +01:00
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
2012-03-13 17:51:57 +01:00
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2013-05-28 00:16:00 +02:00
СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.7.7.0
Номер функции помещается в регистр eax.
Вызов системной функции осуществляется командой "int 0x40".
В с е регистры, кроме явно указанных в возвращаемом значении,
включая регистр флагов eflags, сохраняются.
======================================================================
============== Функция 0 - определить и нарисовать окно. =============
======================================================================
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
область. Для окон с о скином определяет стандартные кнопки закрытия и
минимизации.
Параметры:
* eax = 0 - номер функции
* ebx = [координата по оси x]*65536 + [размер по оси x]
* ecx = [координата по оси y]*65536 + [размер по оси y]
* edx = 0xXYRRGGBB, где:
* Y = стиль окна:
* Y=1 - только определить область окна, ничего не рисовать
* Y=3 - окно с о скином
* Y=4 - окно с о скином фиксированных размеров
2020-06-03 17:13:04 +02:00
* Y=0,2 эти стили не должны более использоваться и оставлены
только для совместимости с о старыми приложениями
2016-02-08 16:04:09 +01:00
* остальные возможные значения (от 5 до 15) зарезервированы,
вызов функции с такими Y игнорируется
2013-05-28 00:16:00 +02:00
* RR, GG, BB = соответственно красная, зеленая, синяя
составляющие цвета рабочей области окна
2013-10-19 12:24:30 +02:00
(игнорируется для стиля Y=1)
2013-05-28 00:16:00 +02:00
* X = DCBA (биты)
2016-02-08 13:17:05 +01:00
* A = 1 - у окна есть заголовок
2013-05-28 00:16:00 +02:00
* B = 1 - координаты всех графических примитивов задаются
2020-06-03 17:13:04 +02:00
относительно клиентской области окна
2013-05-28 00:16:00 +02:00
* C = 1 - не закрашивать рабочую область при отрисовке окна
* D = 0 - нормальная заливка рабочей области, 1 - градиентная
Следующие параметры предназначены для окон типа I и II и
игнорируются для стилей Y=1,3:
* esi = 0xXYRRGGBB - цвет заголовка
* RR, GG, BB определяют сам цвет
2020-06-03 17:13:04 +02:00
* Y = 0 - обычное окно
Y = 1 - неперемещаемое окно (работает для всех стилей окон)
* X определяет градиент заголовка:
X = 0 - нет градиента,
X = 8 - обычный градиент,
2013-05-28 00:16:00 +02:00
для окон типа II X=4 - негативный градиент
* прочие значения X и Y зарезервированы
2020-06-03 17:13:04 +02:00
* edi = адрес строки заголовка для стилей Y=3,4 (см. функцию 71.1)
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Положение и размеры окна устанавливаются при первом вызове
этой функции и игнорируются при последующих; для изменения
положения и/или размеров уже созданного окна используйте
67-ю функцию.
* Для окон стилей Y=3,4 с заголовком (A=1) строка заголовка
устанавливается при первом вызове этой функции и игнорируется при
последующих (точнее говоря, игнорируется после вызова
подфункции 2 функции 12 - конца перерисовки);
для изменения строки заголовка уже созданного окна используйте
подфункцию 1 функции 71.
* Если использовать окна соответствующих стилей, то положение
и/или размеры окна могут меняться пользователем.
Текущие положение и размеры могут быть получены вызовом функции 9.
* Окно должно умещаться на экране. Если переданные координаты
и размеры не удовлетворяют этому условию, то соответствующая
координата (или, возможно, о б е ) считается нулем, а если и это
не помогает, то соответствующий размер (или, возможно, о б а )
устанавливается в размер экрана.
2013-07-08 10:17:53 +02:00
2013-05-28 00:16:00 +02:00
Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые
в ebx,ecx. Координаты приводятся относительно левого верхнего
угла окна, который, таким образом, задается как (0,0), координаты
правого нижнего угла суть (xsize,ysize).
* Размеры окна понимаются в смысле координат правого нижнего угла.
Это же относится и ко всем остальным функциям.
Это означает, что реальные размеры на 1 пиксель больше.
* Вид окна стиля Y=1:
* полностью определяется приложением
2016-02-08 13:17:05 +01:00
* Вид окна с о скином Y=3,4:
2013-05-28 00:16:00 +02:00
* рисуется внешняя рамка шириной 1 пиксель
цвета 'outer' из скина
* рисуется промежуточная рамка шириной 3 пикселя
цвета 'frame' из скина
* рисуется внутренняя рамка шириной 1 пиксель
цвета 'inner' из скина
* рисуется заголовок (по картинкам из скина) в прямоугольнике
2006-05-10 16:30:38 +02:00
(0,0) - (xsize,_skinh-1)
2013-05-28 00:16:00 +02:00
* если ysize>=26, то закрашивается рабочая область окна -
прямоугольник с левым верхним углом (5,_skinh) и правым нижним
(xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
* определяются две стандартные кнопки: закрытия и минимизации
(смотри функцию 8)
* если A=1 и в edi (ненулевой) указатель на строку заголовка,
то она выводится в заголовке в месте, определяемом скином
* Значение переменной _skinh доступно как результат вызова
подфункции 4 функции 48
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CREATE_WINDOW (0)
2013-05-28 00:16:00 +02:00
======================================================================
================= Функция 1 - поставить точку в окне. ================
======================================================================
Параметры:
* eax = 1 - номер функции
* ebx = x-координата (относительно окна)
* ecx = y-координата (относительно окна)
* edx = 0x00RRGGBB - цвет точки
edx = 0x01xxxxxx - инвертировать цвет точки
(младшие 24 бита игнорируются)
Возвращаемое значение:
* функция не возвращает значения
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PUT_PIXEL (1)
2013-05-28 00:16:00 +02:00
======================================================================
============== Функция 2 - получить код нажатой клавиши. =============
======================================================================
Забирает код нажатой клавиши из буфера.
Параметры:
* eax = 2 - номер функции
Возвращаемое значение:
* если буфер пуст, возвращается eax=1
* если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
2014-03-05 16:31:09 +01:00
биты 16-23 содержат сканкод нажатой клавиши в режиме ASCII,
2020-02-17 03:52:27 +01:00
в режиме сканкодов биты обнулены.
2014-02-25 02:03:37 +01:00
биты 23-31 обнулены
2013-05-28 00:16:00 +02:00
* если есть "горячая клавиша", то возвращается
al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
старшее слово регистра eax содержит состояние управляющих клавиш
в момент нажатия горячей клавиши
Замечания:
* Существует общесистемный буфер нажатых клавиш размером 120 байт,
организованный как очередь.
* Существует ещё один общесистемный буфер на 120 "горячих клавиш".
* При вызове этой функции приложением с неактивным окном
считается, что буфер нажатых клавиш пуст.
* По умолчанию эта функция возвращает ASCII-коды; переключиться на
режим сканкодов (и назад) можно с использованием функции 66.
Однако, горячие клавиши всегда возвращаются как сканкоды.
* Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
запустив приложения keyascii и scancode.
* Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
ASCII-коды получаются с использованием таблиц преобразования,
которые можно установить подфункцией 2 функции 21 и прочитать
подфункцией 2 функции 26.
* Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
(rus/en) в отличие от сканкодов.
* Поступает информация только о тех горячих клавишах, которые были
определены этим потоком подфункцией 4 функции 66.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_KEY (2)
2013-05-28 00:16:00 +02:00
======================================================================
================ Функция 3 - получить системное время. ===============
======================================================================
Параметры:
* eax = 3 - номер функции
Возвращаемое значение:
* eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
* каждый элемент возвращается как BCD-число, например,
для времени 23:59:59 результат будет 0x00595923
Замечания:
* Смотри также подфункцию 9 функции 26 - получение времени
с момента запуска системы; она во многих случаях удобнее,
поскольку возвращает просто DWORD-значение счетчика времени.
* Системное время можно установить функцией 22.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_SYS_TIME (3)
2013-05-28 00:16:00 +02:00
======================================================================
2015-10-15 17:20:20 +02:00
================ Функция 4 - нарисовать строку текста. ===============
2013-05-28 00:16:00 +02:00
======================================================================
Параметры:
* eax = 4 - номер функции
2015-10-15 17:20:20 +02:00
* ebx = X*65536+Y, координаты в окне или буфере
* ecx = 0xXXRRGGBB, где
2013-05-28 00:16:00 +02:00
* RR, GG, BB задают цвет текста
2015-10-15 17:20:20 +02:00
* XX=ABFFCSSS (биты):
* A=1 - рисуемая строка заканчивается нулём
* B=1 - закрашивать фон (цвет = edi)
2015-08-05 12:02:18 +02:00
* FF задает шрифт и кодировку:
0 = 6x9 cp866
2015-10-29 15:43:15 +01:00
1 = 8x16 cp866
2015-08-05 12:02:18 +02:00
2 = 8x16 UTF-16LE
3 = 8x16 UTF-8
2015-10-15 17:20:20 +02:00
* C=0 - рисовать в окно,
С =1 - рисовать в буфер (edi)
* SSS = (множитель размера)-1, то-есть 0 = x1, 7 = x8
2013-05-28 00:16:00 +02:00
* edx = указатель на начало строки
2015-08-05 12:02:18 +02:00
* esi = для A=0 длина строки, для A=1 игнорируется
2015-10-15 17:20:20 +02:00
* edi = если B=1 - цвет для закраски фона,
если C=1 - указатель на буфер
2015-08-05 12:02:18 +02:00
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
2015-08-05 12:02:18 +02:00
* Нельзя одновременно использовать B=1 и C=1,
поскольку в обоих случаях используется регистр edi.
2015-10-15 17:20:20 +02:00
* Если SSS=0, шрифт может сглаживаться,
в зависимости от системной настройки.
* Структура буфера:
Xsize dd
Ysize dd
picture rb Xsize*Ysize*4 ; 32 бита
2015-08-05 12:02:18 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DRAW_TEXT (4)
2013-05-28 00:16:00 +02:00
======================================================================
========================= Функция 5 - пауза. =========================
======================================================================
Задерживает выполнение программы на заданное время.
Параметры:
* eax = 5 - номер функции
* ebx = время в сотых долях секунды
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Передача ebx=0 не передает управление следующему процессу и
вообще не производит никаких действий. Если действительно
требуется передать управление следующему процессу
(закончить текущий квант времени), используйте подфункцию 1
функции 68.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SLEEP (5)
2013-05-28 00:16:00 +02:00
======================================================================
=============== Функция 7 - вывести изображение в окно. ==============
======================================================================
Параметры:
* eax = 7 - номер функции
* ebx = указатель на изображение в формате BBGGRRBBGGRR...
* ecx = [размер по оси x]*65536 + [размер по оси y]
* edx = [координата по оси x]*65536 + [координата по оси y]
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Координаты изображения - это координаты верхнего левого угла
изображения относительно окна.
* Размер изображения в байтах есть 3*xsize*ysize.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PUT_IMAGE (7)
2013-05-28 00:16:00 +02:00
======================================================================
=============== Функция 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.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEFINE_BUTTON (8)
2013-05-28 00:16:00 +02:00
======================================================================
============= Функция 9 - информация о потоке выполнения. ============
======================================================================
Параметры:
* eax = 9 - номер функции
* ebx = указатель на буфер размера 1 К б
* ecx = номер слота потока
ecx = -1 - получить информацию о текущем потоке
Возвращаемое значение:
* eax = максимальный номер слота потока
2020-11-23 19:52:56 +01:00
но, если указатель в ebx недопустимый, например,
регион [ebx, ebx + 0x4C) пересекается с памятью ядра,
то тогда функция возвращает -1
2013-05-28 00:16:00 +02:00
* буфер, на который указывает 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: маска событий
2013-11-20 22:19:36 +01:00
* +75 = +0x4B: byte: режим ввода с клавиатуры(ASCII = 0; SCAN = 1)
2013-05-28 00:16:00 +02:00
Замечания:
* Слоты нумеруются с 1.
* Возвращаемое значение не есть общее число потоков, поскольку
бывают свободные слоты.
* При создании процесса автоматически создается поток выполнения.
* Функция выдает информацию о потоке. Каждый процесс имеет
хотя бы один поток. Один процесс может создать несколько потоков,
в этом случае каждый поток получает свой слот, причем поля
+10, +22, +26 в этих слотах совпадают.
Для приложений не существует общего способа определить,
принадлежат ли два потока одному процессу.
* Активное окно - окно, находящееся на вершине оконного стэка,
оно получает сообщения о вводе с клавиатуры. Для него позиция в
оконном стэке совпадает с возвращаемым значением.
* Слот 1 соответствует специальному потоку операционной системы,
для которого:
* окно находится внизу оконного стэка, поля +4 и +6 содержат
значение 1
2024-01-14 20:34:21 +01:00
* имя процесса - "IDLE" (дополненное пробелами)
2013-05-28 00:16:00 +02:00
* адрес процесса в памяти равен 0, размер используемой памяти
2006-05-10 16:30:38 +02:00
16 Mb (0x1000000)
* PID=1
2013-05-28 00:16:00 +02:00
* координаты и размеры окна, равно как и клиентской области,
условно полагаются равными 0
* состояние слота - всегда 0 (выполняется)
* время выполнения складывается из времени, уходящего на
собственно работу, и времени простоя в ожидании прерывания
(которое можно получить вызовом подфункции 4 функции 18).
2024-01-14 20:34:21 +01:00
* Слот 2 (и некоторые другие) соответствуют специальным потокам
операционной системы, для которых:
* имя процесса - "OS" (дополненное пробелами)
2013-05-28 00:16:00 +02:00
* Обычные приложения размещаются в памяти по адресу 0
(константа ядра std_application_base_address).
Наложения не происходит, поскольку у каждого процесса своя
таблица страниц.
* При создании потока ему назначаются слот в системной таблице и
идентификатор (Process/Thread IDentifier = PID/TID), которые для
заданного потока не изменяются с о временем.
После завершения потока е г о слот может быть заново использован
для другого потока. Идентификатор потока не может быть назначен
другому потоку даже после завершения первого.
Назначаемые новым потокам идентификаторы монотонно растут.
* Если поток еще не определил свое окно вызовом функции 0, то
положение и размеры этого окна полагаются нулями.
* Координаты клиентской области окна берутся относительно окна.
* В данный момент используется только часть буфера размером
2013-11-20 22:19:36 +01:00
76 = 0x4C байта. Тем не менее рекомендуется использовать буфер
2013-05-28 00:16:00 +02:00
размером 1 К б для будущей совместимости, в будущем могут быть
добавлены некоторые поля.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_THREAD_INFO (9)
2013-05-28 00:16:00 +02:00
======================================================================
==================== Функция 10 - ожидать события. ===================
======================================================================
Если очередь сообщений пуста, то ждет появления сообщения в очереди.
В таком состоянии поток не получает процессорного времени.
Затем считывает сообщение из очереди.
Параметры:
* eax = 10 - номер функции
Возвращаемое значение:
* eax = событие (смотри список событий)
Замечания:
* Учитываются только те события, которые входят в маску,
устанавливаемую функцией 40. По умолчанию это события
перерисовки, нажатия на клавиши и на кнопки.
* Для проверки, есть ли сообщение в очереди, используйте функцию 11.
Чтобы ждать не более определенного времени, используйте
функцию 23.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_WAIT_EVENT (10)
2013-05-28 00:16:00 +02:00
======================================================================
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
======================================================================
Если в очереди сообщений есть какое-то событие, то считывает и
возвращает е г о . Если очередь пуста, возвращает нуль.
Параметры:
* eax = 11 - номер функции
Возвращаемое значение:
* eax = 0 - очередь сообщений пуста
* иначе eax = событие (смотри список событий)
Замечания:
* Учитываются только те события, которые входят в маску,
устанавливаемую функцией 40. По умолчанию это события
перерисовки, нажатия на клавиши и на кнопки.
* Для ожидания появления события в очереди, используйте функцию 10.
Чтобы ждать не более определенного времени, используйте
функцию 23.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CHECK_EVENT (11)
2013-05-28 00:16:00 +02:00
======================================================================
=========== Функция 12 - начать/закончить перерисовку окна. ==========
======================================================================
-------------- Подфункция 1 - начать перерисовку окна. ---------------
Параметры:
* eax = 12 - номер функции
* ebx = 1 - номер подфункции
Возвращаемое значение:
* функция не возвращает значения
------------- Подфункция 2 - закончить перерисовку окна. -------------
Параметры:
* eax = 12 - номер функции
* ebx = 2 - номер подфункции
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Функция начала перерисовки удаляет все определённые
функцией 8 кнопки, их следует определить повторно.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_REDRAW (12)
ebx - SSF_BEGIN_DRAW (1), SSF_END_DRAW (2)
2013-05-28 00:16:00 +02:00
======================================================================
============ Функция 13 - нарисовать прямоугольник в окне. ===========
======================================================================
Параметры:
* eax = 13 - номер функции
* ebx = [координата по оси x]*65536 + [размер по оси x]
* ecx = [координата по оси y]*65536 + [размер по оси y]
* edx = цвет 0xRRGGBB или 0x80RRGGBB для градиентной заливки
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Под координатами понимаются координаты левого верхнего угла
прямоугольника относительно окна.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DRAW_RECT (13)
2013-05-28 00:16:00 +02:00
======================================================================
================ Функция 14 - получить размеры экрана. ===============
======================================================================
Параметры:
* eax = 14 - номер функции
Возвращаемое значение:
* eax = [xsize]*65536 + [ysize], где
* xsize = x-координата правого нижнего угла экрана =
размер по горизонтали - 1
* ysize = y-координата правого нижнего угла экрана =
размер по вертикали - 1
Замечания:
* Смотри также подфункцию 5 функции 48 - получить размеры рабочей
области экрана.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_SCREEN_SIZE (14)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 15, подфункция 1 - установить размер фонового изображения. =
======================================================================
Параметры:
* eax = 15 - номер функции
* ebx = 1 - номер подфункции
* ecx = ширина изображения
* edx = высота изображения
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Вызов функции обязателен перед вызовом подфункций 2 и 5.
* Для обновления экрана (после завершения серии команд, работающих с
фоном) вызывайте подфункцию 3 перерисовки фона.
* Есть парная функция получения размеров фонового изображения -
подфункция 1 функции 39.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_SIZE_BG (1)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
======================================================================
Параметры:
* eax = 15 - номер функции
* ebx = 2 - номер подфункции
* ecx = смещение
* edx = цвет точки 0xRRGGBB
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Смещение для точки с координатами (x,y) вычисляется как
2006-05-10 16:30:38 +02:00
(x+y*xsize)*3.
2013-05-28 00:16:00 +02:00
* Если указанное смещение превышает установленный подфункцией 1
размер, вызов игнорируется.
* Для обновления экрана (после завершения серии команд, работающих с
фоном) вызывайте подфункцию 3 перерисовки фона.
* Есть парная функция получения точки с фонового изображения -
подфункция 2 функции 39.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_PIXEL_BG (2)
2013-05-28 00:16:00 +02:00
======================================================================
============ Функция 15, подфункция 3 - перерисовать фон. ============
======================================================================
Параметры:
* eax = 15 - номер функции
* ebx = 3 - номер подфункции
Возвращаемое значение:
* функция не возвращает значения
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_REDRAW_BG (3)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
======================================================================
Параметры:
* eax = 15 - номер функции
* ebx = 4 - номер подфункции
* ecx = режим отрисовки:
* 1 = замостить
* 2 = растянуть
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Для обновления экрана (после завершения серии команд, работающих с
фоном) вызывайте подфункцию 3 перерисовки фона.
* Есть парная команда получения режима отрисовки фона -
подфункция 4 функции 39.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_MODE_BG (4)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
======================================================================
Параметры:
* eax = 15 - номер функции
* ebx = 5 - номер подфункции
* ecx = указатель на данные в формате BBGGRRBBGGRR...
* edx = смещение в данных фонового изображения
* esi = размер данных в байтах = 3 * число пикселей
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Проверки корректности смещения и размера не производится.
* Цвет каждого пикселя хранится как 3-байтная величина BBGGRR.
* Пиксели фонового изображения записываются последовательно
слева направо, сверху вниз.
* Смещение пикселя с координатами (x,y) есть (x+y*xsize)*3.
* Для обновления экрана (после завершения серии команд, работающих с
фоном) вызывайте подфункцию 3 перерисовки фона.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_IMAGE_BG (5)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 15, подфункция 6 ======================
==== Спроецировать данные фона на адресное пространство процесса. ====
======================================================================
Параметры:
* eax = 15 - номер функции
* ebx = 6 - номер подфункции
Возвращаемое значение:
* eax = указатель на данные фона, 0 при ошибке
Замечания:
* Спроецированные данные доступны на чтение и запись.
* Размер данных фона равен 3*xsize*ysize. Изменение размеров фона
блокируется на время работы с спроецированными данными.
* Цвет каждого пикселя хранится как 3-байтовая величина BBGGRR.
* Пиксели фонового изображения записываются последовательно
слева направо, сверху вниз.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_MAP_BG (6)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 15, подфункция 7 ======================
=== Закрыть проекцию данных фона на адресное пространство процесса. ==
======================================================================
Параметры:
* eax = 15 - номер функции
* ebx = 7 - номер подфункции
* ecx = указатель на данные фона
Возвращаемое значение:
* eax = 1 при успехе, 0 при ошибке
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_UNMAP_BG (7)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 15, подфункция 8 ======================
=========== Получить координаты последней отрисовки фона. ============
======================================================================
Параметры:
* eax = 15 - номер функции
* ebx = 8 - номер подфункции
Возвращаемое значение:
2012-03-28 18:32:08 +02:00
* eax = [left]*65536 + [right]
* ebx = [top]*65536 + [bottom]
2013-05-28 00:16:00 +02:00
Замечания:
* (left,top) - координаты левого верхнего угла,
(right,bottom) - координаты правого нижнего.
* Для получения более достоверных сведений, необходимо вызвать
функцию сразу после получения события:
5 = завершилась перерисовка фона рабочего стола
2012-03-28 18:32:08 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_LAST_DRAW (8)
2012-04-03 00:30:24 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
====================== Функция 15, подфункция 9 ======================
=============== Перерисовать прямоугольную часть фона. ===============
2012-04-03 00:30:24 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 15 - номер функции
* ebx = 9 - номер подфункции
2012-04-03 00:30:24 +02:00
* ecx = [left]*65536 + [right]
* edx = [top]*65536 + [bottom]
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* (left,top) - координаты левого верхнего угла,
(right,bottom) - координаты правого нижнего.
* Если параметры установлены некорректно - фон не перерисовывается.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_REDRAW_RECT (9)
2013-05-28 00:16:00 +02:00
======================================================================
============= Функция 16 - сохранить рамдиск на дискету. =============
======================================================================
Параметры:
* eax = 16 - номер функции
* ebx = 1 или ebx = 2 - на какую дискету сохранять
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - ошибка
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_RD_TO_FLOPPY (16)
2013-05-28 00:16:00 +02:00
======================================================================
============== Функция 17 - получить код нажатой кнопки. =============
======================================================================
Забирает код нажатой кнопки из буфера.
Параметры:
* eax = 17 - номер функции
Возвращаемое значение:
* если буфер пуст, возвращается eax=1
* если буфер непуст:
* старшие 24 бита eax содержат идентификатор кнопки
(в частности, в ah оказывается младший байт идентификатора;
если все кнопки имеют идентификатор, меньший 256,
то для различения достаточно ah)
* al = 0 - кнопка была нажата левой кнопкой мыши
* al = бит, соответствующий нажавшей кнопке мыши, если не левой
Замечания:
* "Буфер" хранит только одну кнопку, при нажатии новой кнопки
информация о старой теряется.
* При вызове этой функции приложением с неактивным окном
возвращается ответ "буфер пуст".
* Возвращаемое значение al соответствует состоянию кнопок мыши
в формате подфункции 2 функции 37 в момент начала нажатия
на кнопку, за исключением младшего бита (соответствующего левой
кнопке мыши), который сбрасывается.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_BUTTON (17)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 18, подфункция 1 - сделать самым нижним окно потока. =======
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 1 - номер подфункции
* ecx = номер слота потока
Возвращаемое значение:
* функция не возвращает значения
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_UNFOCUS_WINDOW (1)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 2 - номер подфункции
* ecx = номер слота процесса/потока
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Нельзя завершить поток операционной системы OS/IDLE (номер слота
1), можно завершить любой обычный поток/процесс.
* Смотри также подфункцию 18 - завершение
процесса/потока с заданным идентификатором.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_TERMINATE_THREAD (2)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 3 - номер подфункции
* ecx = номер слота потока
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* При указании корректного, но несуществующего слота активизируется
какое-то окно.
* Узнать, какое окно является активным, можно вызовом подфункции 7.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_FOCUS_WINDOW (3)
2013-05-28 00:16:00 +02:00
======================================================================
2013-07-08 10:17:53 +02:00
Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
2013-05-28 00:16:00 +02:00
======================================================================
Под пустыми тактами понимается время, в которое процессор простаивает
в ожидании прерывания (в инструкции hlt).
Параметры:
* eax = 18 - номер функции
* ebx = 4 - номер подфункции
Возвращаемое значение:
* eax = значение счётчика пустых тактов в секунду
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_IDLE_COUNT (4)
2013-05-28 00:16:00 +02:00
======================================================================
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 5 - номер подфункции
Возвращаемое значение:
* eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
2016-11-06 23:37:32 +01:00
ebx - SSF_GET_CPU_FREQUENCY (5)
2013-05-28 00:16:00 +02:00
======================================================================
2013-07-08 10:17:53 +02:00
Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
2013-05-28 00:16:00 +02:00
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 6 - номер подфункции
* ecx = указатель на строку с полным именем файла
(например, "/hd0/1/kolibri/kolibri.img")
Возвращаемое значение:
* eax = 0 - успешно
* иначе eax = код ошибки файловой системы
Замечания:
* В с е папки в указанном пути должны существовать, иначе вернётся
значение 5, "файл не найден".
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_RD_TO_HDD (6)
2013-05-28 00:16:00 +02:00
======================================================================
====== Функция 18, подфункция 7 - получить номер активного окна. =====
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 7 - номер подфункции
Возвращаемое значение:
* eax = номер активного окна (номер слота потока, окно которого
активно)
Замечания:
* Активное окно находится вверху оконного стэка и получает
сообщения о б о всём вводе с клавиатуры.
* Сделать окно активным можно вызовом подфункции 3.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_ACTIVE_WINDOW (7)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
======================================================================
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
При включённом - направляются на встроенный спикер.
--------------- Подподфункция 1 - получить состояние. ----------------
Параметры:
* eax = 18 - номер функции
* ebx = 8 - номер подфункции
* ecx = 1 - номер подподфункции
Возвращаемое значение:
* eax = 0 - звук спикера разрешён; 1 - запрещён
-------------- Подподфункция 2 - переключить состояние. --------------
Переключает состояния разрешения/запрещения.
Параметры:
* eax = 18 - номер функции
* ebx = 8 - номер подфункции
* ecx = 2 - номер подподфункции
Возвращаемое значение:
* функция не возвращает значения
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_SPEAKER (8)
ecx - SSSF_GET_STATE (1), SSSF_TOGGLE (2)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 9 - номер подфункции
* ecx = параметр:
* 2 = выключить компьютер
* 3 = перезагрузить компьютер
* 4 = перезапустить ядро из файла kernel.mnt на рамдиске
Возвращаемое значение:
* при неверном ecx регистры не меняются (т.е . eax=18)
* при правильном вызове всегда возвращается признак успеха eax=0
Замечания:
* Н е следует полагаться на возвращаемое значение при неверном
вызове, оно может измениться в последующих версиях ядра.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_SHUTDOWN (9)
2013-05-28 00:16:00 +02:00
======================================================================
2014-02-18 19:21:49 +01:00
========= Функция 18, подфункция 10 - свернуть активное окно. ========
2013-05-28 00:16:00 +02:00
======================================================================
2014-02-18 19:21:49 +01:00
Сворачивает активное окно.
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 18 - номер функции
* ebx = 10 - номер подфункции
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Минимизированное окно с точки зрения функции 9 сохраняет положение
и размеры.
2013-07-08 10:17:53 +02:00
* Восстановление окна приложения происходит при активизировании
2013-05-28 00:16:00 +02:00
подфункцией 3.
* Обычно нет необходимости явно сворачивать/разворачивать своё окно:
сворачивание окна осуществляется системой при нажатии на кнопку
минимизации (которая для окон с о скином определяется автоматически
функцией 0, для окон без скина её можно определить функцией 8),
2015-02-23 17:01:43 +01:00
восстановление - приложением @taskbar.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_MINIMIZE_WINDOW (10)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 18, подфункция 11 =====================
============= Получить информацию о дисковой подсистеме. =============
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 11 - номер подфункции
* ecx = тип таблицы:
2014-03-27 21:44:32 +01:00
* 1 = короткая версия, 16 байт
2013-05-28 00:16:00 +02:00
* edx = указатель на буфер (в приложении) для таблицы
Возвращаемое значение:
* функция не возвращает значения
Формат таблицы: короткая версия:
* +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
где AAAA задаёт тип первого дисковода, BBBB - второго согласно
следующему списку:
* 0 = нет дисковода
2006-05-10 16:30:38 +02:00
* 1 = 360Kb, 5.25''
* 2 = 1.2Mb, 5.25''
* 3 = 720Kb, 3.5''
* 4 = 1.44Mb, 3.5''
2013-05-28 00:16:00 +02:00
* 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
Например, для стандартной конфигурации из одного 1.44-дисковода
здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
значение оказывается 24h.
2014-03-27 21:44:32 +01:00
Первый контроллер IDE:
2013-05-28 00:16:00 +02:00
* +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
где AA соответствует контроллеру IDE0, ..., DD - IDE3:
* 0 = устройство отсутствует
* 1 = жёсткий диск
* 2 = CD-привод
Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
* +2: 4 db: число найденных разделов на жёстких дисках с
соответственно IDE0,...,IDE3.
2014-03-27 21:44:32 +01:00
Второй контроллер IDE:
* +6: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
где AA соответствует контроллеру IDE4, ..., DD - IDE7:
* 0 = устройство отсутствует
* 1 = жёсткий диск
* 2 = CD-привод
Например, в случае HD на IDE4 и CD на IDE6 здесь будет 48h.
* +7: 4 db: число найденных разделов на жёстких дисках с
соответственно IDE4,...,IDE7.
Третий контроллер IDE:
* +11: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
где AA соответствует контроллеру IDE8, ..., DD - IDE11:
* 0 = устройство отсутствует
* 1 = жёсткий диск
* 2 = CD-привод
Например, в случае HD на IDE8 и CD на IDE10 здесь будет 48h.
* +12: 4 db: число найденных разделов на жёстких дисках с
соответственно IDE8,...,IDE11.
2013-05-28 00:16:00 +02:00
При отсутствии жёсткого диска на IDEx соответствующий байт
нулевой, при наличии показывает число распознанных разделов,
которых может и не быть (если носитель не отформатирован или
если файловая система не поддерживается). В текущей версии ядра
2014-03-27 21:44:32 +01:00
для жёстких дисков поддерживаются только FAT12/16/32, NTFS,
ext2/3/4 и XFS.
2014-03-13 08:21:24 +01:00
2013-05-28 00:16:00 +02:00
Замечания:
2014-03-27 21:44:32 +01:00
* Таблица может быть использована для получения информации
2013-05-28 00:16:00 +02:00
о б имеющихся устройствах.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_INFO_DISC_SYS (11)
2013-05-28 00:16:00 +02:00
======================================================================
========== Функция 18, подфункция 13 - получить версию ядра. =========
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 13 - номер подфункции
* ecx = указатель на буфер (не менее 16 байт), куда будет помещена
информация
Возвращаемое значение:
* функция не возвращает значения
2020-11-24 13:49:42 +01:00
но, если указатель в ecx недопустимый, например,
регион [ecx, ecx + 9) пересекается с памятью ядра,
то тогда функция возвращает -1
Замечания:
* В данный момент используется только часть буфера размером
9 байт. Тем не менее рекомендуется использовать буфер
размером 16 байт для будущей совместимости, в будущем могут быть
добавлены некоторые поля.
2013-05-28 00:16:00 +02:00
Структура буфера:
db a,b,c,d для версии a.b.c.d
db 0: зарезервировано
dd REV - номер svn-ревизии ядра
Для ядра Kolibri 0.7.7.0+:
2010-10-17 10:53:29 +02:00
db 0,7,7,0
2010-10-24 18:06:14 +02:00
db 0
2010-10-24 18:08:19 +02:00
dd 1675
2006-05-10 16:30:38 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_KERNEL_VERSION (13)
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
====================== Функция 18, подфункция 14 =====================
======= Ожидать начала обратного хода луча развёртки монитора. =======
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 14 - номер подфункции
Возвращаемое значение:
* eax = 0 как признак успеха
Замечания:
* Функция предназначена исключительно для активных
высокопроизводительных графических приложений; используется для
плавного вывода графики.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_WAIT_RETRACE (14)
2013-05-28 00:16:00 +02:00
======================================================================
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 15 - номер подфункции
Возвращаемое значение:
* eax = 0 как признак успеха
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_CURSOR_CENTER (15)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 18, подфункция 16 =====================
============ Получить размер свободной оперативной памяти. ===========
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 16 - номер подфункции
Возвращаемое значение:
* eax = размер свободной памяти в килобайтах
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_FREE_RAM (16)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 18, подфункция 17 =====================
============ Получить размер имеющейся оперативной памяти. ===========
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 17 - номер подфункции
Возвращаемое значение:
* eax = общий размер имеющейся памяти в килобайтах
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_TOTAL_RAM (17)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 18, подфункция 18 =====================
============= Завершить процесс/поток по идентификатору. =============
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 18 - номер подфункции
* ecx = идентификатор процесса/потока (PID/TID)
Возвращаемое значение:
* eax = 0 - успешно
* eax = -1 - ошибка (процесс не найден или является системным)
Замечания:
* Нельзя завершить поток операционной системы OS/IDLE (номер слота
1), можно завершить любой обычный поток/процесс.
* Смотри также подфункцию 2 - завершение
процесса/потока по заданному слоту.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_TERMINATE_THREAD_ID (18)
2013-05-28 00:16:00 +02:00
======================================================================
=== Функция 18, подфункция 19 - получить/установить настройки мыши. ==
======================================================================
------------- Подподфункция 0 - получить скорость мыши. --------------
Параметры:
* eax = 18 - номер функции
* ebx = 19 - номер подфункции
* ecx = 0 - номер подподфункции
Возвращаемое значение:
2016-02-15 20:48:46 +01:00
* eax = текущий делитель скорости
2013-05-28 00:16:00 +02:00
------------ Подподфункция 1 - установить скорость мыши. -------------
Параметры:
* eax = 18 - номер функции
* ebx = 19 - номер подфункции
* ecx = 1 - номер подподфункции
2016-02-15 20:48:46 +01:00
* edx = новое значение делителя скорости
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
2016-02-15 20:48:46 +01:00
Замечание: рекомендуемый делитель скорости = 4
2015-12-11 22:28:02 +01:00
2016-02-15 20:48:46 +01:00
---------- Подподфункция 2 - получить чувствительность мыши ----------
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 18 - номер функции
* ebx = 19 - номер подфункции
* ecx = 2 - номер подподфункции
Возвращаемое значение:
2016-02-15 20:48:46 +01:00
* eax = текущий коэффициент чувствительности
2013-05-28 00:16:00 +02:00
2016-02-15 20:48:46 +01:00
--------- Подподфункция 3 - установить чувствительность мыши ---------
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 18 - номер функции
* ebx = 19 - номер подфункции
* ecx = 3 - номер подподфункции
2016-02-15 20:48:46 +01:00
* edx = новое значение коэффициента чувствительности
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
2016-02-15 20:48:46 +01:00
Замечание: рекомендуемый коэффициент чувствительности = 3
2013-05-28 00:16:00 +02:00
-------- Подподфункция 4 - установить положение курсора мыши. --------
Параметры:
* eax = 18 - номер функции
* ebx = 19 - номер подфункции
* ecx = 4 - номер подподфункции
* edx = [координата по оси x]*65536 + [координата по оси y]
Возвращаемое значение:
* функция не возвращает значения
------- Подподфункция 5 - симулировать состояние клавиш мыши. --------
Параметры:
* eax = 18 - номер функции
* ebx = 19 - номер подфункции
* ecx = 5 - номер подподфункции
* edx = информация о эмулируемом состоянии кнопок мыши:
(соответствует возвращаемому значению подфункции 2 функции 37)
* бит 0 установлен = левая кнопка нажата
* бит 1 установлен = правая кнопка нажата
* бит 2 установлен = средняя кнопка нажата
* бит 3 установлен = 4-я кнопка нажата
* бит 4 установлен = 5-я кнопка нажата
Возвращаемое значение:
* функция не возвращает значения
2015-10-16 21:00:13 +02:00
-------- Подподфункция 6 - получить задержку двойного щелчка. --------
Параметры:
* eax = 18 - номер функции
* ebx = 19 - номер подфункции
* ecx = 6 - номер подподфункции
Возвращаемое значение:
* eax = текущая задержка двойного щелчка (100 = секунда)
------- Подподфункция 7 - установить задержку двойного щелчка. -------
Параметры:
* eax = 18 - номер функции
* ebx = 19 - номер подфункции
* ecx = 7 - номер подподфункции
* dl = новое значение задержки двойного щелчка (100 = секунда)
Возвращаемое значение:
* функция не возвращает значения
2015-12-11 22:28:02 +01:00
Замечание: настройки мыши можно регулировать в приложении mouse_cfg.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_MOUSE_SETTINGS (19)
ecx - SSSF_GET_SPEED (0), SSSF_SET_SPEED (1), SSSF_GET_SPEEDUP (2),
SSSF_SET_SPEEDUP (3), SSSF_SET_POS (4), SSSF_SET_BUTTON (5),
SSSF_GET_DOUBLE_CLICK_DELAY (6), SSSF_SET_DOUBLE_CLICK_DELAY (7)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 18, подфункция 20 =====================
============= Получить информацию о б оперативной памяти. =============
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 20 - номер подфункции
* ecx = указатель на буфер для информации (36 байт)
Возвращаемое значение:
* eax = общий размер имеющейся оперативной памяти в байтах
или -1 в случае ошибки
* буфер, на который указывает ecx, содержит следующую информацию:
* +0: dword: общий размер имеющейся оперативной памяти в страницах
* +4: dword: размер свободной оперативной памяти в страницах
* +8: dword: число страничных ошибок (исключений #PF)
в приложениях
* +12: dword: размер кучи ядра в байтах
* +16: dword: размер свободной памяти в куче ядра в байтах
* +20: dword: общее количество блоков памяти в куче ядра
* +24: dword: количество свободных блоков памяти в куче ядра
* +28: dword: размер наибольшего свободного блока в куче ядра
(зарезервировано)
* +32: dword: размер наибольшего выделенного блока в куче ядра
(зарезервировано)
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_RAM_INFO (20)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 18, подфункция 21 =====================
======= Получить номер слота процесса/потока по идентификатору. ======
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 21 - номер подфункции
* ecx = идентификатор процесса/потока (PID/TID)
Возвращаемое значение:
* eax = 0 - ошибка (неверный идентификатор)
* иначе eax = номер слота
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_THREAD_SLOT (21)
2013-05-28 00:16:00 +02:00
======================================================================
2013-07-08 10:17:53 +02:00
Функция 18, подфункция 22 - операции с окном другого процесса/потока.
2013-05-28 00:16:00 +02:00
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 22 - номер подфункции
* ecx = тип операции:
* 0 = минимизация окна, поток задан номером слота
* 1 = минимизация окна, поток задан идентификатором
* 2 = восстановление окна, поток задан номером слота
* 3 = восстановление окна, поток задан идентификатором
* edx = параметр операции (номер слота или PID/TID)
Возвращаемое значение:
* eax = 0 - успешно
* eax = -1 - ошибка (неправильный параметр)
Замечания:
* Поток может свернуть своё окно вызовом подфункции 10.
* Восстановление окна с одновременной активизацией осуществляется
подфункции 3 (принимающей номер слота).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_FOREIGN_WINDOW (22)
ecx - SSSF_MINIMIZE (0), SSSF_MINIMIZE_ID (1), SSSF_RESTORE (2),
SSSF_RESTORE_ID (3)
2013-05-28 00:16:00 +02:00
======================================================================
======= Функция 18, подфункция 23 - минимизировать все окна. =========
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 23 - номер подфункции
Возвращаемое значение:
* eax = 0 - все окна были минимизированы до вызова функции
* eax = N - количество окон свернутых функцией
Замечания:
* Окна спец. потоков (имя начинается с символа @) не сворачиваются.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_MINIMIZE_ALL (23)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 18, подфункция 24 - установить пределы отрисовки. ======
======================================================================
Параметры:
* eax = 18 - номер функции
* ebx = 24 - номер подфункции
* ecx = новый размер по X
* edx = новый размер по Y
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Функция не меняет физический размер видеорежима. Она предназначена
для нестандартных дисплеев, отображающих изображение частично.
* Размеры указываемые в функции не должны превышать размеры текущего
видеорежима, иначе функция ничего не изменит.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_SET_SCREEN_LIMITS (24)
2015-10-09 15:59:11 +02:00
======================================================================
===================== Функция 18, подфункция 25 ======================
======== Управление положением окна относительно других окон. ========
======================================================================
------------- Подподфункция 1 - получить положение ------------------
Параметры:
* eax = 18 - номер функции
* ebx = 25 - номер подфункции
* ecx = 1 - номер подподфункции
* edx = -1(для текущего окна) или PID приложения
Возвращаемое значение:
* eax = одна из констант положения окна
------------- Подподфункция 2 - установить положение ----------------
Параметры:
* eax = 18 - номер функции
* ebx = 25 - номер подфункции
* ecx = 2 - номер подподфункции
* edx = -1(для текущего окна) или PID приложения
* esi = новое положение окна (одна из констант ниже)
Возвращаемое значение:
* eax = 0 - неудача
* eax = 1 - успех
Константы положения окна относительно других окон:
2016-08-15 19:02:18 +02:00
ZPOS_DESKTOP = -2 - на самом заднем плане
2015-10-27 21:29:29 +01:00
ZPOS_ALWAYS_BACK = -1 - позади всех окон
ZPOS_NORMAL = 0 - обычное
ZPOS_ALWAYS_TOP = 1 - поверх всех окон
2015-10-09 15:59:11 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_WINDOW_BEHAVIOR (25)
ecx - SSSF_GET_WB (1), SSSF_SET_WB (2)
2013-05-28 00:16:00 +02:00
======================================================================
==================== Функция 20 - интерфейс MIDI. ====================
======================================================================
------------------------ Подфункция 1 - с б р о с ------------------------
Параметры:
* eax = 20 - номер функции
* ebx = 1 - номер подфункции
-------------------- Подфункция 2 - вывести байт ---------------------
Параметры:
* eax = 20 - номер функции
* ebx = 2 - номер подфункции
* cl = байт для вывода
Возвращаемое значение (одинаково для обеих подфункций):
* eax = 0 - успешно
* eax = 1 - не определён базовый порт
Замечания:
2013-07-08 10:17:53 +02:00
* Предварительно должен быть определён базовый порт вызовом
2013-05-28 00:16:00 +02:00
подфункции 1 функции 21.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_MIDI (20)
ebx - SSF_RESET (1), SSF_OUTPUT (2)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
======================================================================
Параметры:
* eax = 21 - номер функции
* ebx = 1 - номер подфункции
* ecx = номер базового порта
Возвращаемое значение:
* eax = 0 - успешно
* eax = -1 - ошибочный номер порта
Замечания:
* Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
* Установка базы нужна для работы функции 20.
2013-07-08 10:17:53 +02:00
* Получить установленный базовый порт можно вызовом
2013-05-28 00:16:00 +02:00
подфункции 1 функции 26.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_MPU_MIDI_BASE (1)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
======================================================================
Раскладка клавиатуры используется для преобразования сканкодов,
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
Параметры:
* eax = 21 - номер функции
* ebx = 2 - номер подфункции
* ecx = какую раскладку устанавливать:
* 1 = нормальную
* 2 = раскладку при нажатом Shift
* 3 = раскладку при нажатом Alt
* edx = указатель на раскладку - таблицу длиной 128 байт
Или:
2006-05-10 16:30:38 +02:00
* ecx = 9
2013-05-28 00:16:00 +02:00
* dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - параметр задан неверно
Замечания:
* Если нажат Alt, то используется раскладка с Alt;
если не нажат Alt, но нажат Shift, то
используется раскладка с Shift;
если не нажаты Alt и Shift, но нажат Ctrl, то используется
нормальная раскладка, после чего из кода вычитается 0x60;
если не нажата ни одна из управляющих клавиш, то используется
нормальная раскладка.
2013-07-08 10:17:53 +02:00
* Получить раскладки и идентификатор страны можно с помощью
2013-05-28 00:16:00 +02:00
подфункции 2 функции 26.
* Идентификатор страны - глобальная системная переменная, которая
2015-02-23 17:01:43 +01:00
самим ядром не используется; однако приложение @taskbar отображает
2013-05-28 00:16:00 +02:00
соответствующую текущей стране иконку.
2015-02-23 17:01:43 +01:00
* Приложение @taskbar переключает раскладки по запросу пользователя.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_KEYBOARD_LAYOUT (2)
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
========= Функция 21, подфункция 5 - установить язык системы. ========
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 21 - номер функции
* ebx = 5 - номер подфункции
* ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
Возвращаемое значение:
2006-05-10 16:30:38 +02:00
* eax = 0
2013-05-28 00:16:00 +02:00
Замечания:
* Язык системы - глобальная системная переменная, никак
2015-02-23 17:01:43 +01:00
не используемая самим ядром, однако приложение @taskbar рисует
2013-05-28 00:16:00 +02:00
соответствующую иконку.
* Проверок на корректность не делается, поскольку ядро эту
переменную не использует.
* Получить язык системы можно вызовом подфункции 5 функции 26.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_SYS_LANG (5)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 21, подфункция 11 =====================
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
======================================================================
Параметры:
* eax = 21 - номер функции
* ebx = 11 - номер подфункции
* ecx = 0/1 - запретить/разрешить
Возвращаемое значение:
2006-05-10 16:30:38 +02:00
* eax = 0
2013-05-28 00:16:00 +02:00
Замечания:
* Используется при LBA-чтении (подфункция 8 функции 58).
* Текущая реализация использует только младший бит ecx.
* Получить текущее состояние можно вызовом подфункции 11 функции 26.
2006-05-10 16:30:38 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_ACCESS_HD_LBA (11)
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
====================== Функция 21, подфункция 12 =====================
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 21 - номер функции
* ebx = 12 - номер подфункции
* ecx = 0/1 - запретить/разрешить
Возвращаемое значение:
2006-05-10 16:30:38 +02:00
* eax = 0
2013-05-28 00:16:00 +02:00
Замечания:
* Используется при работе с шиной PCI (функция 62).
* Текущая реализация использует только младший бит ecx.
* Получить текущее состояние можно вызовом подфункции 12 функции 26.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_ACCESS_PCI (12)
2013-05-28 00:16:00 +02:00
======================================================================
============ Функция 22 - установить системную дату/время. ===========
======================================================================
Параметры:
* eax = 22 - номер функции
* ebx = 0 - установить время
* ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
* HH=час 00..23
* MM=минута 00..59
* SS=секунда 00..59
* ebx = 1 - установить дату
* ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
* DD=день 01..31
* MM=месяц 01..12
* YY=год 00..99
* ebx = 2 - установить день недели
* ecx = 1 для воскресенья, ..., 7 для субботы
* ebx = 3 - установить будильник
2006-05-10 16:30:38 +02:00
* ecx = 0x00SSMMHH
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - параметр задан неверно
* eax = 2 - CMOS-батарейки разрядились
Замечания:
* Ценность установки дня недели представляется сомнительной,
поскольку он мало где используется
(день недели можно рассчитать по дате).
* Будильник можно установить на срабатывание в заданное время
каждые сутки. При этом отключить е г о существующими системными
функциями нельзя.
* Срабатывание будильника заключается в генерации IRQ8.
* Вообще-то CMOS поддерживает для будильника установку значения
0xFF в качестве одного из параметров и означает это, что
соответствующий параметр игнорируется. Н о в текущей реализации
это не пройдёт (вернётся значение 1).
* Будильник - глобальный системный р е с у р с ; установка будильника
автоматически отменяет предыдущую установку. Впрочем, на данный
момент ни одна программа е г о не использует.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SET_TIME_DATE (22)
2013-05-28 00:16:00 +02:00
======================================================================
============== Функция 23 - ожидать события с таймаутом. =============
======================================================================
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
но не более указанного времени. Затем считывает сообщение из очереди.
Параметры:
* eax = 23 - номер функции
* ebx = таймаут (в сотых долях секунды)
Возвращаемое значение:
* eax = 0 - очередь сообщений пуста
* иначе eax = событие (смотри список событий)
Замечания:
* Учитываются только те события, которые входят в маску,
устанавливаемую функцией 40. По умолчанию это события
перерисовки, нажатия на клавиши и на кнопки.
* Для проверки, есть ли сообщение в очереди, используйте функцию 11.
Чтобы ждать сколь угодно долго, используйте функцию 10.
* Передача ebx=0 приводит к моментальному возвращению eax=0.
* При текущей реализации произойдёт немедленный возврат из функции
с eax=0, если сложение ebx с текущим значением счётчика времени
вызовет 32-битное переполнение.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_WAIT_EVENT_TIMEOUT (23)
2013-05-28 00:16:00 +02:00
======================================================================
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
======================================================================
Параметры:
* eax = 24 - номер функции
* ebx = 4 - номер подфункции
* ecx = номер CD/DVD-диска
2014-03-28 21:04:31 +01:00
от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Функция поддерживается только для ATAPI-устройств (CD и DVD).
* При извлечении лотка производится разблокировка ручного управления
механизмом лотка.
* При извлечении лотка код производит очистку кэша соответствующего
устройства.
* Примером использования функции является приложение CD_tray.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CD (24)
ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5)
2013-05-28 00:16:00 +02:00
======================================================================
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
======================================================================
Параметры:
* eax = 24 - номер функции
* ebx = 5 - номер подфункции
* ecx = номер CD/DVD-диска
2014-03-28 21:04:31 +01:00
от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Функция поддерживается только для ATAPI-устройств (CD и DVD).
* Примером использования функции является приложение CD_tray.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CD (24)
ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5)
2013-05-28 00:16:00 +02:00
======================================================================
========== Функция 25 - записать область на слой фона. ===============
======================================================================
Параметры:
* eax = 25 - номер функции
* ebx = указатель на предварительно выделенную область памяти,
где размещено исходное изображение в формате BBGGRRTTBBGGRRTT...
* ecx = [размер по оси x]*65536 + [размер по оси y]
* edx = [координата по оси x]*65536 + [координата по оси y]
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Координаты области - это координаты верхнего левого угла
области относительно экрана.
* Размер изображения в байтах есть 4*xsize*ysize.
* TT - байт указатель прозрачности, в настоящее время:
от 1 до FF - непрозрачно, от 0 - прозрачно.
* Функция размещает изображение не на фоновое изображение (ф.15),
а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SCREEN_PUT_IMAGE (25)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
======================================================================
Параметры:
* eax = 26 - номер функции
* ebx = 1 - номер подфункции
Возвращаемое значение:
* eax = номер порта
Замечания:
2013-07-08 10:17:53 +02:00
* Установить базовый порт можно вызовом
2013-05-28 00:16:00 +02:00
подфункции 1 функции 21.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_MPU_MIDI_BASE (1)
2013-05-28 00:16:00 +02:00
======================================================================
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
======================================================================
Раскладка клавиатуры используется для преобразования сканкодов,
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
Параметры:
* eax = 26 - номер функции
* ebx = 2 - номер подфункции
* ecx = какую раскладку получать:
* 1 = нормальную
* 2 = раскладку при нажатом Shift
* 3 = раскладку при нажатом Alt
* edx = указатель на буфер длиной 128 байт, куда будет скопирована
раскладка
Возвращаемое значение:
2020-11-07 17:53:46 +01:00
* функция не возвращает значения,
но, если указатель в edx недопустимый, например,
регион [edx, edx + 128) пересекается с памятью ядра,
то тогда функция возвращает -1
2013-05-28 00:16:00 +02:00
Или:
* eax = 26 - номер функции
* ebx = 2 - номер подфункции
2006-05-10 16:30:38 +02:00
* ecx = 9
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
Замечания:
* Если нажат Alt, то используется раскладка с Alt;
если не нажат Alt, но нажат Shift, то используется
раскладка с Shift;
если не нажаты Alt и Shift, но нажат Ctrl, то используется
нормальная раскладка, после чего из кода вычитается 0x60;
если не нажата ни одна из управляющих клавиш, то используется
нормальная раскладка.
2013-07-08 10:17:53 +02:00
* Установить раскладки и идентификатор страны можно с помощью
2013-05-28 00:16:00 +02:00
подфункции 2 функции 21.
* Идентификатор страны - глобальная системная переменная, которая
2015-02-23 17:01:43 +01:00
самим ядром не используется; однако приложение @taskbar отображает
2013-05-28 00:16:00 +02:00
соответствующую текущей стране иконку
(используя описываемую функцию).
2015-02-23 17:01:43 +01:00
* Приложение @taskbar переключает раскладки по запросу пользователя.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_KEYBOARD_LAYOUT (2)
2013-05-28 00:16:00 +02:00
======================================================================
========== Функция 26, подфункция 5 - получить язык системы. =========
======================================================================
Параметры:
* eax = 26 - номер функции
* ebx = 5 - номер подфункции
Возвращаемое значение:
* eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
Замечания:
* Язык системы - глобальная системная переменная, никак
2015-02-23 17:01:43 +01:00
не используемая самим ядром, однако приложение @taskbar рисует
2013-05-28 00:16:00 +02:00
соответствующую иконку (используя описываемую функцию).
* Установить язык системы можно вызовом подфункции 5 функции 21.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_SYS_LANG (5)
2013-05-28 00:16:00 +02:00
======================================================================
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
======================================================================
Параметры:
* eax = 26 - номер функции
* ebx = 9 - номер подфункции
Возвращаемое значение:
* eax = число сотых долей секунды, прошедших с момента
запуска системы
Замечания:
* Счётчик берётся по модулю 2^32, что соответствует немногим более
497 суток.
* Системное время можно получить функцией 3.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_TIME_COUNT (9)
2015-09-06 17:44:18 +02:00
======================================================================
===================== Функция 26, подфункция 10 ======================
========== Получить значение высокоточного счётчика времени. =========
======================================================================
Parameters:
* eax = 26 - номер функции
* ebx = 10 - номер подфункции
Returned value:
* edx:eax = число наносекунд с момента загрузки ядра
* eax = младшее двойное слово
2016-08-15 19:02:18 +02:00
* edx = старшее двойное слово
2015-09-06 17:44:18 +02:00
Remarks:
* функция использует счётчик HPET, если HPET не доступен используется
счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
наносекунд.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_TIME_COUNT_PRO (10)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 26, подфункция 11 =====================
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
======================================================================
Параметры:
* eax = 26 - номер функции
* ebx = 11 - номер подфункции
Возвращаемое значение:
* eax = 0/1 - запрещён/разрешён
Замечания:
* Используется при LBA-чтении (подфункция 8 функции 58).
2013-07-08 10:17:53 +02:00
* Установить текущее состояние можно вызовом
2013-05-28 00:16:00 +02:00
подфункции 11 функции 21.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_ACCESS_HD_LBA (11)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 26, подфункция 12 =====================
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
======================================================================
Параметры:
* eax = 26 - номер функции
* ebx = 12 - номер подфункции
Возвращаемое значение:
* eax = 0/1 - запрещён/разрешён
Замечания:
* Используется при работе с шиной PCI (функция 62).
* Текущая реализация использует только младший бит ecx.
2013-07-08 10:17:53 +02:00
* Установить текущее состояние можно вызовом
2013-05-28 00:16:00 +02:00
подфункции 12 функции 21.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_ACCESS_PCI (12)
2013-05-28 00:16:00 +02:00
======================================================================
================ Функция 29 - получить системную дату. ===============
======================================================================
Параметры:
* eax = 29 - номер функции
Возвращаемое значение:
* eax = 0x00DDMMYY, где
(используется двоично-десятичное кодирование, BCD)
* YY = две младшие цифры года (00..99)
* MM = месяц (01..12)
* DD = день (01..31)
Замечания:
* Системную дату можно установить функцией 22.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_SYS_DATE (29)
2013-05-28 00:16:00 +02:00
======================================================================
================ Функция 30 - работа с текущей папкой. ===============
======================================================================
-------- Подфункция 1 - установить текущую папку для потока. ---------
Параметры:
* eax = 30 - номер функции
* ebx = 1 - номер подфункции
2016-08-15 19:02:18 +02:00
* ecx = указатель на строку с путём к новой текущей папке,
правила формирования строки указаны в описании функции 70.
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
2016-12-15 18:38:17 +01:00
----------------------------------------------------------------------
2013-05-28 00:16:00 +02:00
--------- Подфункция 2 - получить текущую папку для потока. ----------
Параметры:
* eax = 30 - номер функции
* ebx = 2 - номер подфункции
* ecx = указатель на буфер
* edx = размер буфера
Возвращаемое значение:
2016-12-15 18:38:17 +01:00
* eax = длина строки (включая завершающий 0)
2013-05-28 00:16:00 +02:00
Замечания:
2016-12-15 18:38:17 +01:00
* Если размера буфера недостаточно для копирования всего пути,
копируются только часть строки и в конце ставится завершающий 0.
2013-05-28 00:16:00 +02:00
* По умолчанию, текущая папка для потока - "/rd/1".
* При создании процесса/потока текущая папка наследуется от
родителя.
2016-12-15 18:38:17 +01:00
----------------------------------------------------------------------
2013-06-15 23:17:06 +02:00
---- Подфункция 3 - установить доп. системную директорию для ядра ----
Параметры:
* eax = 30 - номер функции
* ebx = 3 - номер подфункции
* ecx = указатель на блок данных:
2016-08-15 19:02:18 +02:00
key rb 64
path rb 64
Пример:
align 64
key db 'kolibrios',0 ; ключ должен быть в нижнем регистре
align 64
path db 'HD0/1',0
2013-06-15 23:17:06 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Функция может быть вызвана только 1 раз за 1 сессию работы О С .
2016-12-15 18:38:17 +01:00
* При вводе пути символьный ключ не зависит от кодировки.
----------------------------------------------------------------------
--- Подфункция 4 - установить текущую папку с указанием кодировки. ---
2016-08-15 19:02:18 +02:00
Параметры:
* eax = 30 - номер функции
* ebx = 4 - номер подфункции
2016-12-15 18:38:17 +01:00
* ecx = указатель на строку с путём к новой текущей папке
* edx = кодировка строки, подробности указаны в описании функции 80.
Возвращаемое значение:
* функция не возвращает значения
----------------------------------------------------------------------
---- Подфункция 5 - получить текущую папку с указанием кодировки. ----
Параметры:
* eax = 30 - номер функции
* ebx = 5 - номер подфункции
2016-08-15 19:02:18 +02:00
* ecx = указатель на буфер
* edx = размер буфера
2016-12-15 18:38:17 +01:00
* esi = кодировка строки
2016-08-15 19:02:18 +02:00
Возвращаемое значение:
2016-12-15 18:38:17 +01:00
* eax = длина строки в байтах (включая завершающий 0)
2016-08-15 19:02:18 +02:00
Замечания:
2016-12-15 18:38:17 +01:00
* Если размера буфера недостаточно для копирования всего пути,
копируются только часть строки и в конце ставится завершающий 0.
2016-08-15 19:02:18 +02:00
* По умолчанию, текущая папка для потока - "/rd/1".
* При создании процесса/потока текущая папка наследуется от
родителя.
2013-06-15 23:17:06 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CURRENT_FOLDER (30)
ebx - SSF_SET_CF (1), SSF_GET_CF (2), SSF_ADD_SYS_FOLDER (3)
2013-05-28 00:16:00 +02:00
======================================================================
========= Функция 34 - узнать кому принадлежит точка экрана. =========
======================================================================
Параметры:
* eax = 34 - номер функции
* ebx = x-координата (относительно экрана)
* ecx = y-координата (относительно экрана)
Возвращаемое значение:
* eax = 0x000000XX - точка принадлежит слоту окна N
При некорректных значениях ebx и ecx функция возвращает 0
* Функция берет значения из области [_WinMapAddress]
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_PIXEL_OWNER (34)
2013-05-28 00:16:00 +02:00
======================================================================
============ Функция 35 - прочитать цвет точки на экране. ============
======================================================================
Параметры:
2006-05-10 16:30:38 +02:00
* eax = 35
2013-05-28 00:16:00 +02:00
* ebx = y*xsize+x, где
* (x,y) = координаты точки (считая от 0)
* xsize = размер экрана по горизонтали
Возвращаемое значение:
* eax = цвет 0x00RRGGBB
Замечания:
* Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
что она вычитает 1 из обоих размеров.
* К видеопамяти есть также прямой доступ (без вызовов системных
функций) через селектор gs. Параметры текущего видеорежима
можно получить функцией 61.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_PIXEL (35)
2013-05-28 00:16:00 +02:00
======================================================================
=============== Функция 36 - прочитать область экрана. ===============
======================================================================
Параметры:
* eax = 36 - номер функции
* ebx = указатель на предварительно выделенную область памяти,
куда будет помещено изображение в формате BBGGRRBBGGRR...
* ecx = [размер по оси x]*65536 + [размер по оси y]
* edx = [координата по оси x]*65536 + [координата по оси y]
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Координаты области - это координаты верхнего левого угла
области относительно экрана.
* Размер изображения в байтах есть 3*xsize*ysize.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_IMAGE (36)
2013-05-28 00:16:00 +02:00
======================================================================
==================== Функция 37 - работа с мышью. ====================
======================================================================
-------------- Подфункция 0 - экранные координаты мыши ---------------
Параметры:
* eax = 37 - номер функции
* ebx = 0 - номер подфункции
Возвращаемое значение:
* eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
---------- Подфункция 1 - координаты мыши относительно окна ----------
Параметры:
* eax = 37 - номер функции
* ebx = 1 - номер подфункции
Возвращаемое значение:
* eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
окна приложения (считая от 0)
Замечания:
* Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
Если y>=ywnd, то младшее слово неотрицательно и содержит
относительную y-координату, а старшее - относительную x-координату
(правильного знака). В противном случае младшее слово отрицательно
и всё равно содержит относительную y-координату,
а к старшему слову следует прибавить 1.
2015-10-16 21:00:13 +02:00
---------------- Подфункция 2 - состояния кнопок мыши ----------------
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 37 - номер функции
* ebx = 2 - номер подфункции
Возвращаемое значение:
2015-10-16 21:00:13 +02:00
* eax = биты 0-4 соответствуют подфункции 3
----------- Подфункция 3 - состояния и события кнопок мыши -----------
Параметры:
* eax = 37 - номер функции
* ebx = 3 - номер подфункции
Возвращаемое значение:
* eax содержит следующую информацию:
состояния:
* бит 0 установлен = удерживается левая кнопка
* бит 1 установлен = удерживается правая кнопка
* бит 2 установлен = удерживается средняя кнопка
* бит 3 установлен = удерживается 4-я кнопка
* бит 4 установлен = удерживается 5-я кнопка
события:
* бит 8 установлен = нажата левая кнопка
* бит 9 установлен = нажата правая кнопка
* бит 10 установлен = нажата средняя кнопка
* бит 15 установлен = используется вертикальная прокрутка
* бит 16 установлен = отпущена левая кнопка
* бит 17 установлен = отпущена правая кнопка
* бит 18 установлен = отпущена средняя кнопка
* бит 23 установлен = используется горизонтальная прокрутка
* бит 24 установлен = двойной щелчёк левой кнопкой
2013-05-28 00:16:00 +02:00
------------------ Подфункция 4 - загрузить курсор -------------------
Параметры:
* eax = 37 - номер функции
* ebx = 4 - номер подфункции
* dx = источник данных:
* dx = LOAD_FROM_FILE = 0 - данные в файле
* ecx = указатель на полный путь к файлу курсора
* файл курсора должен быть в формате .cur, стандартном для
MS Windows, причём размером 32*32 пикселя
* dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
* ecx = указатель на данные файла курсора
* формат данных такой же, как и в предыдущем случае
* dx = LOAD_INDIRECT = 2 - данные в памяти
* ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
* edx = 0xXXYY0002, где
* XX = x-координата "горячей точки" курсора
* YY = y-координата
2007-01-17 15:43:18 +01:00
* 0 <= XX, YY <= 31
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - неудача
* иначе eax = хэндл курсора
------------------ Подфункция 5 - установить курсор ------------------
Устанавливает новый курсор для окна текущего потока.
Параметры:
* eax = 37 - номер функции
* ebx = 5 - номер подфункции
* ecx = хэндл курсора
Возвращаемое значение:
* eax = хэндл предыдущего установленного курсора
Замечания:
* Если передан некорректный хэндл, то функция восстановит курсор
по умолчанию (стандартную стрелку). В частности, к восстановлению
курсора по умолчанию приводит передача ecx=0.
------------------- Подфункция 6 - удалить курсор --------------------
Параметры:
* eax = 37 - номер функции
* ebx = 6 - номер подфункции
* ecx = хэндл курсора
Возвращаемое значение:
* eax разрушается
Замечания:
* К у р с о р должен был быть ранее загружен текущим потоком
(вызовом подфункции 4). Функция не удаляет системные курсоры и
курсоры, загруженные другими приложениями.
* Если удаляется активный (установленный подфункцией 5) курсор, то
восстанавливается курсор по умолчанию (стандартная стрелка).
------------------ Подфункция 7 - данные прокрутки -------------------
Параметры:
* eax = 37 - номер функции
* ebx = 7 - номер подфункции
Возвращаемое значение:
2007-05-16 15:59:46 +02:00
* eax = [horizontal offset]*65536 + [vertical offset]
2013-05-28 00:16:00 +02:00
Замечания:
* Данные доступны только активному окну.
* После прочтения значения обнуляются.
* Данные имеют знаковые значения.
2016-12-18 04:13:18 +01:00
------- Подфункция 8 - загрузить курсор с указанием кодировки. -------
Параметры:
* eax = 37 - номер функции
* ebx = 8 - номер подфункции
* ecx = указатель на строку с путём к файлу курсора
* edx = кодировка строки, подробности указаны в описании функции 80.
Возвращаемое значение:
* eax = хэндл курсора, 0 - неудача
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_MOUSE_GET (37)
ebx - SSF_SCREEN_POSITION (0), SSF_WINDOW_POSITION (1),
SSF_BUTTON (2), SSF_BUTTON_EXT (3), SSF_LOAD_CURSOR (4),
SSF_SET_CURSOR (5), SSF_DEL_CURSOR (6), SSF_SCROLL_DATA (7)
2013-05-28 00:16:00 +02:00
======================================================================
================== Функция 38 - нарисовать отрезок. ==================
======================================================================
Параметры:
* eax = 38 - номер функции
* ebx = [координата начала по оси x]*65536 +
[координата конца по оси x]
* ecx = [координата начала по оси y]*65536 +
[координата конца по оси y]
* edx = 0x00RRGGBB - цвет
edx = 0x01xxxxxx - рисовать инверсный отрезок
(младшие 24 бита игнорируются)
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Координаты берутся относительно окна.
* Конечная точка также рисуется.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DRAW_LINE (38)
2013-05-28 00:16:00 +02:00
======================================================================
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
======================================================================
Параметры:
* eax = 39 - номер функции
* ebx = 1 - номер подфункции
Возвращаемое значение:
* eax = [ширина]*65536 + [высота]
Замечания:
2013-07-08 10:17:53 +02:00
* Есть парная команда установки размеров фонового изображения -
2013-05-28 00:16:00 +02:00
подфункция 1 функции 15. После которой, разумеется, следует
заново определить само изображение.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET (39)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
======================================================================
Параметры:
* eax = 39 - номер функции
* ebx = 2 - номер подфункции
* ecx = смещение
Возвращаемое значение:
* eax = 0x00RRGGBB - цвет точки, если смещение допустимо
(меньше 0x160000-16)
* eax = 2 - иначе
Замечания:
* Н е следует полагаться на возвращаемое значение в случае неверного
смещения, оно может измениться в следующих версиях ядра.
* Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
2013-07-08 10:17:53 +02:00
* Есть парная функция установки точки на фоновом изображении -
2013-05-28 00:16:00 +02:00
подфункция 2 функции 15.
2021-12-22 18:10:59 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET_RECT (39)
======================================================================
== Функция 39, подфункция 3 - получить прямоугольную область фона =
======================================================================
Параметры:
* eax = 39 - номер функции
* ebx = 3 - номер подфункции
* ecx = [x]*65536 + [y]
* edx = [width]*65536 + [height]
* esi = адрес буфера
Возвращаемое значение:
* eax = 0 - успех
* eax = -1 - ошибка
Замечания:
* Функция копирует указанную прямоугольную область в буфер в формате
0x00RRGGBB
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET (39)
2013-05-28 00:16:00 +02:00
======================================================================
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
======================================================================
Параметры:
* eax = 39 - номер функции
* ebx = 4 - номер подфункции
Возвращаемое значение:
* eax = 1 - замостить
* eax = 2 - растянуть
Замечания:
2013-07-08 10:17:53 +02:00
* Есть парная функция установки режима отрисовки фона -
2013-05-28 00:16:00 +02:00
подфункция 4 функции 15.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET (39)
2013-05-28 00:16:00 +02:00
======================================================================
======== Функция 40 - установить маску для ожидаемых событий. ========
======================================================================
Маска для ожидаемых событий влияет на функции работы с событиями 10,
11, 23 - они сообщают только о событиях, разрешённых этой маской.
Параметры:
* eax = 40 - номер функции
* ebx = маска: бит i соответствует событию i+1 (см. список событий)
(установленный бит разрешает извещение о событии)
2013-09-29 15:41:21 +02:00
bit 31: фильтр активности событий мыши
bit 31 = 0 - неактивное окно всегда получает события от мыши
bit 31 = 1 - неактивное окно не получает события от мыши
bit 30: фильтр позиции курсора
bit 30 = 0 - окно принимает события мыши, если курсор
за пределами окна
bit 30 = 1 - окно не принимает события мыши, если курсор
за пределами окна
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = предыдущее значение маски
Замечания:
* Маска по умолчанию (7=111b) разрешает извещения о перерисовке
и нажатиях клавиш и кнопок.
Этого достаточно для большинства приложений.
* События, запрещённые в маске, всё равно сохраняются, если
приходят; о них просто не извещают функции работы с событиями.
* Функции работы с событиями учитывают маску на момент
вызова функции, а не на момент поступления сообщения.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SET_EVENTS_MASK (40)
2013-05-28 00:16:00 +02:00
======================================================================
=================== Функция 43 - ввод/вывод в порт. ==================
======================================================================
------------------------ Вывод данных в порт -------------------------
Параметры:
* eax = 43 - номер функции
* bl = байт для вывода
* ecx = номер порта 0xnnnn (от 0 до 0xFFFF)
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - поток не зарезервировал указанный порт
------------------------ Ввод данных из порта ------------------------
Параметры:
* eax = 43 - номер функции
* ebx игнорируется
* ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF)
Возвращаемое значение:
* eax = 0 - успешно, при этом ebx = введённый байт
* eax = 1 - поток не зарезервировал данный порт
Замечания:
* Предварительно поток должен зарезервировать за собой
указанный порт функцией 46.
* Для зарезервированных портов вместо вызова этих функций
лучше использовать команды процессора in/out - это значительно
быстрее и несколько короче и проще. Из незарезервированных
портов читать всё равно нельзя.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PORT_IN_OUT (43)
2013-05-28 00:16:00 +02:00
======================================================================
2013-07-08 10:17:53 +02:00
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
2013-05-28 00:16:00 +02:00
======================================================================
К зарезервированным портам можно обращаться напрямую из приложения
командами in/out (рекомендуемый способ) и вызовом функции 43
(нерекомендуемый способ).
Параметры:
* eax = 46 - номер функции
* ebx = 0 - зарезервировать, 1 - освободить
* ecx = номер начала диапазона портов
* edx = номер конца диапазона портов (включительно)
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - ошибка
Замечания:
* В случае резервирования портов ошибкой считается выполнение
одного из условий:
* начальный адрес больше конечного;
* указанный диапазон содержит некорректный номер порта
(корректные - от 0 до 0xFFFF);
* превышено ограничение на общее число зарезервированных областей
- допускается максимум 255;
* указанный диапазон пересекается с одним из
ранее зарезервированных
* В случае освобождения портов ошибкой считается попытка
освобождения диапазона, который ранее не был целиком
зарезервирован этой же функцией (с такими же значениями ecx,edx).
* При обнаружении ошибки (в обоих случаях) никаких действий
не производится.
* При загрузке система резервирует за собой порты
0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (включительно).
* При завершении потока автоматически освобождаются все
зарезервированные им порты.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SET_PORTS (46)
2013-05-28 00:16:00 +02:00
======================================================================
================= Функция 47 - вывести число в окно. =================
======================================================================
Параметры:
* eax = 47 - номер функции
* ebx = параметры преобразования числа в текст:
* bl = 0 - ecx содержит число
* bl = 1 - ecx содержит указатель на dword/qword-число
* bh = 0 - отображать в десятичной системе счисления
* bh = 1 - отображать в шестнадцатеричной системе
* bh = 2 - отображать в двоичной системе
* биты 16-21 = сколько цифр отображать
* биты 22-29 зарезервированы и должны быть установлены в 0
* бит 30 установлен = выводить qword (64-битное число);
при этом должно быть bl = 1
* бит 31 установлен = не выводить ведущие нули числа
* ecx = число (при bl=0) или указатель (при bl=1)
* edx = [координата по оси x]*65536 + [координата по оси y]
2016-02-21 01:05:15 +01:00
* esi = 0xXXRRGGBB, где
* RR, GG, BB задают цвет текста
* XX=0B0FCSSS (биты):
* B=1 - закрашивать фон (цвет = edi)
* F задает шрифт:
0 = 6x9
1 = 8x16
* C=0 - рисовать в окно,
С =1 - рисовать в буфер (edi)
* SSS = (множитель размера)-1, то-есть 0 = x1, 7 = x8
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Указанная длина не должна превосходить 60.
* Выводится ровно указанное количество цифр. Если число мало и
может быть записано меньшим количеством цифр, оно дополняется
ведущими нулями; если число велико и не может быть записано
таким количеством цифр, "лишние" ведущие цифры обрезаются.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DRAW_NUMBER (47)
2013-05-28 00:16:00 +02:00
======================================================================
======= Функция 48, подфункция 0 - применить настройки экрана. =======
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 0 - номер подфункции
* ecx = 0 - зарезервировано
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Функция перерисовывает экран после изменения параметров
подфункциями 1 и 2.
* Вызов функции без предшествующих вызовов указанных подфункций
игнорируется.
* Вызов функции с ненулевым ecx игнорируется.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_APPLY (0)
2013-05-28 00:16:00 +02:00
======================================================================
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 1 - номер подфункции
* ecx = тип кнопок:
* 0 = плоские
* 1 = объёмные
Возвращаемое значение:
* функция не возвращает значения
Замечания:
2013-07-08 10:17:53 +02:00
* После вызова описываемой функции следует перерисовать экран
2013-05-28 00:16:00 +02:00
подфункцией 0.
* Тип кнопок влияет только на их прорисовку функцией 8.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_BUTTON_STYLE (1)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 2 - номер подфункции
* ecx = указатель на таблицу цветов
* edx = размер таблицы цветов
(должен быть 40 байт для будущей совместимости)
Формат таблицы цветов указан в описании подфункции 3.
Возвращаемое значение:
* функция не возвращает значения
Замечания:
2013-07-08 10:17:53 +02:00
* После вызова описываемой функции следует перерисовать экран
2013-05-28 00:16:00 +02:00
подфункцией 0.
* Таблица стандартных цветов влияет только на приложения,
которые эту таблицу явным образом получают (подфункцией 3) и
используют (указывая цвета из неё при вызовах функций рисования).
* Таблица стандартных цветов входит в скин и устанавливается заново
при установке скина (подфункции 8).
* Таблицу цветов можно просматривать/изменять интерактивно с помощью
приложения desktop.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_COLORS (2)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 3 - номер подфункции
* ecx = указатель на буфер размером edx байт,
куда будет записана таблица
* edx = размер таблицы цветов
(должен быть 40 байт для будущей совместимости)
Возвращаемое значение:
* функция не возвращает значения
Формат таблицы цветов: каждый элемент -
dword-значение цвета 0x00RRGGBB
2021-07-12 11:45:12 +02:00
* +0: dword: none - зарезервировано
* +4: dword: none - зарезервировано
* +8: dword: work_dark - темный цвет рабочей области для придания
объемна элементам интерфейса
* +12 = +0xC: dword: work_light - светлый цвет рабочей области для
придания объемна элементам интерфейса
2013-05-28 00:16:00 +02:00
* +16 = +0x10: dword: grab_text - цвет текста на заголовке
* +20 = +0x14: dword: work - цвет рабочей области
2021-07-12 11:45:12 +02:00
* +24 = +0x18: dword: button - цвет кнопки в рабочей области
* +28 = +0x1C: dword: button_text - цвет текста на кнопке
2013-05-28 00:16:00 +02:00
в рабочей области
* +32 = +0x20: dword: work_text - цвет текста в рабочей области
2021-07-12 11:45:12 +02:00
* +36 = +0x24: dword: graph - цвет графики в рабочей области
2013-05-28 00:16:00 +02:00
Замечания:
* Структура таблицы цветов описана в стандартном включаемом файле
macros.inc под названием system_colors; например, можно писать:
sc system_colors ; объявление переменной
... ; где-то надо вызвать
; описываемую функцию с ecx=sc
2021-07-12 11:45:12 +02:00
mov ecx, [sc.button_text] ; читаем цвет текста
2013-05-28 00:16:00 +02:00
; на кнопке в рабочей области
* Использование/неиспользование этих цветов - дело исключительно
самой программы. Для использования нужно просто при вызове функций
рисования указывать цвет, взятый из этой таблицы.
* При изменении таблицы стандартных цветов (подфункцией 2 с
последующим применением изменений подфункцией 0 или
при установке скина подфункцией 8) всем окнам посылается сообщение
о необходимости перерисовки (событие с кодом 1).
* Стандартные цвета можно просматривать/изменять интерактивно
с помощью приложения desktop.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_COLORS (3)
2013-05-28 00:16:00 +02:00
======================================================================
========== Функция 48, подфункция 4 - получить высоту скина. =========
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 4 - номер подфункции
Возвращаемое значение:
* eax = высота скина
Замечания:
* Высотой скина по определению считается высота заголовка окон,
использующих скин.
* Смотри также общую структуру окна в описании функции 0.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_SKIN_HEIGHT (4)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 5 - номер подфункции
Возвращаемое значение:
2006-05-10 16:30:38 +02:00
* eax = [left]*65536 + [right]
* ebx = [top]*65536 + [bottom]
2013-05-28 00:16:00 +02:00
Замечания:
* Рабочая область экрана определяет положение и координаты
максимизированного окна.
* Рабочая область экрана при нормальной работе есть весь экран
2015-02-23 17:01:43 +01:00
за вычетом панели (@taskbar).
2013-05-28 00:16:00 +02:00
* (left,top) - координаты левого верхнего угла,
(right,bottom) - координаты правого нижнего.
Таким образом, размер рабочей области по оси x определяется
2021-07-04 13:59:11 +02:00
формулой right-left+1, по оси y - формулой bottom-top+1.
2013-05-28 00:16:00 +02:00
* Смотри также функцию 14,
позволяющую определить размеры всего экрана.
* Есть парная функция установки рабочей области - подфункция 6.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_SCREEN_AREA (5)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 6 - номер подфункции
2006-05-10 16:30:38 +02:00
* ecx = [left]*65536 + [right]
* edx = [top]*65536 + [bottom]
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Рабочая область экрана определяет положение и координаты
максимизированного окна.
2015-02-23 17:01:43 +01:00
* Эта функция используется только приложением @taskbar,
2013-05-28 00:16:00 +02:00
устанавливающим рабочей областью весь экран за вычетом панели.
* (left,top) - координаты левого верхнего угла,
(right,bottom) - координаты правого нижнего.
Таким образом, размер рабочей области по оси x определяется
формулой right-left+1, по оси y - формулой bottom-right+1.
* Если left>=right, то x-координаты рабочей области не изменяются.
Если left<0, то left не устанавливается. Если right больше
или равно ширины экрана, то right не устанавливается.
Аналогично по оси y.
* Смотри также функцию 14,
позволяющую определить размеры всего экрана.
2013-07-08 10:17:53 +02:00
* Есть парная функция получения рабочей области -
2013-05-28 00:16:00 +02:00
подфункция 5.
* Эта функция автоматически перерисовывает экран, по ходу дела
обновляет координаты и размеры максимизированных окон.
В с е окна извещаются о необходимости перерисовки (событие 1).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_SCREEN_AREA (6)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 48, подфункция 7 ======================
============ Получить область скина для текста заголовка. ============
======================================================================
Возвращает область заголовка окна с о скином, предназначенную
для вывода текста заголовка.
Параметры:
* eax = 48 - номер функции
* ebx = 7 - номер подфункции
Возвращаемое значение:
2006-05-10 16:30:38 +02:00
* eax = [left]*65536 + [right]
* ebx = [top]*65536 + [bottom]
2013-05-28 00:16:00 +02:00
Замечания:
* Использование/неиспользование этой функции -
личное дело приложения.
* Рекомендуется учитывать значения, возвращаемые этой функцией,
при выборе места для рисования текста заголовка (функцией 4) или
какого-нибудь заменителя текста заголовка
(по усмотрению приложения).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_SKIN_MARGINS (7)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 8 - номер подфункции
* ecx = указатель на имя файла скина
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - не удалось загрузить файл
* eax = 2 - файл не является файлом скина
Замечания:
* При успешной загрузке скина все окна извещаются о необходимости
перерисовки (событие 1).
* При загрузке система считывает скин из файла default.skn
на рамдиске.
* Пользователь может изменять скин статически, создав свой
default.skn, или динамически с помощью приложения desktop.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_SKIN (8)
2015-08-05 12:02:18 +02:00
======================================================================
2015-10-15 17:20:20 +02:00
= Функция 48, подфункция 9 - получить настройку сглаживания шрифтов. =
2015-08-05 12:02:18 +02:00
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 9 - номер подфункции
2015-10-15 17:20:20 +02:00
Возвращаемое значение:
* eax = 2 - субпиксельное, 1 - обычное, 0 - выключить
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_FONT_SMOOTH (9)
2015-10-15 17:20:20 +02:00
======================================================================
===== Функция 48, подфункция 10 - настроить сглаживание шрифтов. =====
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 10 - номер подфункции
* cl = 2 - субпиксельное, 1 - обычное, 0 - выключить
2015-08-05 12:02:18 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_FONT_SMOOTH (10)
2015-10-29 15:43:15 +01:00
======================================================================
======== Функция 48, подфункция 11 - получить размер шрифтов. ========
======================================================================
Параметры:
* eax = 48 - номер функции
2020-02-17 03:52:27 +01:00
* ebx = 11 - номер подфункции
2015-10-29 15:43:15 +01:00
Возвращаемое значение:
* eax = текущая высота шрифта в пикселях
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_FONT_SIZE (11)
2015-10-29 15:43:15 +01:00
======================================================================
======= Функция 48, подфункция 12 - установить размер шрифтов. =======
======================================================================
Параметры:
* eax = 48 - номер функции
2020-02-17 03:52:27 +01:00
* ebx = 12 - номер подфункции
2015-10-29 15:43:15 +01:00
* cl = новая высота шрифта в пикселях
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_FONT_SIZE (12)
2013-05-28 00:16:00 +02:00
======================================================================
2016-12-18 04:13:18 +01:00
= Функция 48, подфункция 13 - установить скин с указанием кодировки. =
======================================================================
Параметры:
* eax = 48 - номер функции
* ebx = 13 - номер подфункции
* ecx = указатель на строку с путём к файлу скина
* edx = кодировка строки, подробности указаны в описании функции 80.
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - не удалось загрузить файл
* eax = 2 - файл не является файлом скина
Замечания:
* При успешной загрузке скина все окна извещаются о необходимости
перерисовки (событие 1).
* При загрузке система считывает скин из файла default.skn
на рамдиске.
* Пользователь может изменять скин статически, создав свой
default.skn, или динамически с помощью приложения desktop.
======================================================================
2013-05-28 00:16:00 +02:00
============ Функция 49 - Advanced Power Management (APM). ===========
======================================================================
Параметры:
* eax = 49 - номер функции
* dx = номер функции APM (аналог ax в спецификации)
* bx, cx = параметры функции APM
Возвращаемое значение:
* 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
установлены в соответствии с о спецификацией APM
* старшие половины 32-битных регистров eax, ebx, ecx,
edx, esi, edi разрушаются
Замечания:
* Спецификация APM 1.2 описывается в документе
2006-05-12 14:47:52 +02:00
"Advanced Power Management (APM) BIOS Specification"
2013-05-28 00:16:00 +02:00
(Revision 1.2), доступном на
2006-05-12 14:47:52 +02:00
http://www.microsoft.com/whdc/archive/amp_12.mspx;
2013-05-28 00:16:00 +02:00
кроме того, она включена в известный Interrupt List by Ralf Brown
2006-05-12 14:47:52 +02:00
(http://www.pobox.com/~ralf/files.html,
ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_APM (49)
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
================= Функция 50 - установка формы окна. =================
======================================================================
Обычные окна представляют собой прямоугольники. С помощью этой функции
окну можно придать произвольную форму. Форма задаётся набором точек
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
функцией 67.
--------------- Установка данных с информацией о форме ---------------
Параметры:
* eax = 50 - номер функции
* ebx = 0 - номер подфункции
* ecx = указатель на данные формы (массив байт 0/1)
Возвращаемое значение:
* функция не возвращает значения
------------------ Установка масштаба данных формы -------------------
Параметры:
* eax = 50 - номер функции
* ebx = 1 - номер подфункции
* ecx задаёт масштаб: каждый байт данных определяет
(2^scale)*(2^scale) пикселей
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
данных формы один байт соответствует одному пикселю, то масштаб
можно не устанавливать.
* Обозначим xsize = ширина окна (в пикселях), ysize = высота;
обратите внимание, что они на единицу больше, чем устанавливаемые
функциями 0, 67.
* По определению масштаба xsize и ysize должны делиться на 2^scale.
* Байт данных по смещению a должен быть 0/1 и
определяет принадлежность окну квадрата с о стороной 2^scale
(при scale=0 получаем пиксель) и координатами левого верхнего угла
2006-05-10 16:30:38 +02:00
(a mod (xsize shr scale), a div (xsize shr scale))
2013-05-28 00:16:00 +02:00
* Размер данных: (xsize shr scale)*(ysize shr scale).
* Данные должны присутствовать в памяти и не меняться
после установки формы.
* Система просматривает данные о форме при каждой перерисовке окна
функцией 0.
* Вызов подфункции 0 с нулевым указателем приводит к возврату
к прямоугольной форме.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SET_WINDOW_SHAPE (50)
2013-05-28 00:16:00 +02:00
======================================================================
===================== Функция 51 - создать поток. ====================
======================================================================
Параметры:
* eax = 51 - номер функции
* ebx = 1 - единственная подфункция
* ecx = адрес точки входа потока (начальный eip)
* edx = указатель стэка потока (начальный esp)
Возвращаемое значение:
* eax = -1 - ошибка (в системе слишком много потоков)
* иначе eax = TID - идентификатор потока
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CREATE_THREAD (51)
2013-11-10 05:10:03 +01:00
======================================================================
====================== Функция 54, подфункция 0 ======================
============== Узнать количество слотов в буфере обмена. =============
======================================================================
Параметры:
* eax = 54 - номер функции
* ebx = 0 - номер подфункции
Возвращаемое значение:
2016-08-15 19:02:18 +02:00
* eax = количество слотов в буфере
2013-11-10 05:10:03 +01:00
* eax = -1 - отсутствует область главного списка
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_GET_SLOT_COUNT (0)
2013-11-10 05:10:03 +01:00
======================================================================
====================== Функция 54, подфункция 1 ======================
================== Считать данные из буфера обмена. ==================
======================================================================
Параметры:
* eax = 54 - номер функции
* ebx = 1 - номер подфункции
* eс x = номер слота
Возвращаемое значение:
* eax = если успешно - указатель на область памяти с данными
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
2016-03-23 22:55:26 +01:00
Замечания:
* буфер, на который указывает eax, содержит следующую информацию:
* +0: dword: общая длина данных
* +4: dword: определяет тип да нныx:
* 0 = Текст
* 1 = Текст с блочным выделением
* 2 = Изображение
* 3 = RAW
* 4 и выше зарезервировано
* +8: более детально смотрите файл clipboard_container_rus.txt
2017-09-13 12:53:39 +02:00
* Функция должна использоваться совместно с 68.11. Приложение должно
предварительно проинициализировать локальную кучу вызовом 68.11.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_READ_CB (1)
2013-11-10 05:10:03 +01:00
======================================================================
====================== Функция 54, подфункция 2 ======================
================== Записать данные в буфер обмена. ===================
======================================================================
Параметры:
* eax = 54 - номер функции
* ebx = 2 - номер подфункции
* eс x = количество копируемых байт
* edx = указатель на буфер под копируемые данные
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_WRITE_CB (2)
2013-11-10 05:10:03 +01:00
======================================================================
====================== Функция 54, подфункция 3 ======================
========= Удалить последний слот с данными в буфере обмена ===========
======================================================================
Параметры:
* eax = 54 - номер функции
* ebx = 3 - номер подфункции
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_DEL_SLOT (3)
2013-11-10 05:10:03 +01:00
======================================================================
====================== Функция 54, подфункция 4 ======================
=================== Аварийный с б р о с блокировки буфера ================
======================================================================
Параметры:
* eax = 54 - номер функции
* ebx = 4 - номер подфункции
Возвращаемое значение:
* eax = 0 - успешно
* eax = -1 - отсутствует область главного списка или нет блокировки
Замечания:
* Используется в исключительных случаях, когда зависшее или убитое
приложение заблокировало работу с буфером обмена.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_UNLOCK_BUFFER (4)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 55, подфункция 55 =====================
========== Начать проигрывать данные на встроенном спикере. ==========
======================================================================
Параметры:
* eax = 55 - номер функции
* ebx = 55 - номер подфункции
* esi = указатель на данные
Возвращаемое значение:
* eax = 0 - успешно
* eax = 55 - ошибка (спикер отключён или занят)
Данные - это массив элементов переменной длины.
Формат каждого элемента определяется первым байтом:
* 0 = конец данных
* 1..0x80 = задаёт длительность звучания в сотых долях секунды
ноты, определяемой непосредственным значением частоты
* следующее слово (2 байта) содержит делитель частоты;
частота определяется как 1193180/divider
2006-05-10 16:30:38 +02:00
* 0x81 = invalid
2013-05-28 00:16:00 +02:00
* 0x82..0xFF = нота, определяемая октавой и номером:
* длительность в сотых долях секунды = (первый байт)-0x81
* присутствует ещё один байт;
* (второй байт)=0xFF - пауза
* иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
до 12, a=номер октавы (считая с 0)
Замечания:
* Пищание спикером может быть запрещено/разрешено подфункцией 8
функции 18.
* Функция возвращает управление, сообщив куда следует информацию
о запросе. Само проигрывание идёт независимо от программы.
* Данные должны сохраняться в памяти по крайней мере
до конца проигрывания.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SPEAKER_PLAY (55)
2013-05-28 00:16:00 +02:00
======================================================================
======================= Функция 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 режима ядра).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PCI_BIOS (57)
2013-05-28 00:16:00 +02:00
======================================================================
=========== Функция 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: второе сообщение
2006-05-10 16:30:38 +02:00
* ...
2013-05-28 00:16:00 +02:00
Формат сообщения:
* +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 (см. коды событий).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_IPC (60)
ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2)
2013-05-28 00:16:00 +02:00
======================================================================
=== Функция 61 - получить параметры для прямого доступа к графике. ===
======================================================================
Программе доступны данные графического экрана (область памяти, которая
собственно и отображает содержимое экрана) напрямую без вызовов
системных функций через селектор gs:
2010-10-17 10:53:29 +02:00
mov eax, [gs:0]
2013-05-28 00:16:00 +02:00
поместит в eax первый dword буфера, содержащий информацию о цвете
левой верхней точки (и, возможно, цвета нескольких следующих).
2010-10-17 10:53:29 +02:00
mov [gs:0], eax
2013-05-28 00:16:00 +02:00
при работе в режимах VESA c LFB
установит цвет левой верхней точки
(и возможно, цвета нескольких следующих).
Для интерпретации данных графического экрана требуется знание
некоторых параметров, которые возвращаются этой функцией.
Замечания:
2017-11-29 01:15:25 +01:00
* Параметры графики очень редко меняются при работе системы.
2013-05-28 00:16:00 +02:00
* При изменении видеорежима система перерисовывает все окна
(событие с кодом 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 = число байт, которое занимает одна строка развёртки
(горизонтальная линия на экране)
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_GET_GRAPHICAL_PARAMS (61)
ebx - SSF_SCREEN_SIZE (1), SSF_BITS_PER_PIXEL (2),
SSF_BYTES_PER_LINE (3)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
======================================================================
Параметры:
* eax = 62 - номер функции
* bl = 0 - номер подфункции
Возвращаемое значение:
* eax = -1 - доступ к PCI запрещён; иначе
* ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
* старшее слово eax обнулено
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI
для приложений подфункцией 12 функции 21.
* Если PCI BIOS не поддерживается, то значение ax неопределено.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_GET_VERSION (0)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
======================================================================
Параметры:
* eax = 62 - номер функции
* bl = 1 - номер подфункции
Возвращаемое значение:
* eax = -1 - доступ к PCI запрещён; иначе
* al = номер последней PCI-шины; оставшиеся байты eax разрушаются
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI
для приложений подфункцией 12 функции 21.
* Если PCI BIOS не поддерживается, то значение al неопределено.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_GET_LAST_BUS (1)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 62, подфункция 2 ======================
== Получить механизм обращения к конфигурационному пространству PCI. =
======================================================================
Параметры:
* eax = 62 - номер функции
* bl = 2 - номер подфункции
Возвращаемое значение:
* eax = -1 - доступ к PCI запрещён; иначе
* al = механизм (1 или 2); прочие байты eax разрушаются
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI
для приложений подфункцией 12 функции 21.
* Механизм обращения выбирается в соответствии
с характеристиками оборудования.
* Подфункции чтения и записи автоматически работают
с выбранным механизмом.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_GET_ADRR_MODE (2)
2013-05-28 00:16:00 +02:00
======================================================================
======== Функция 62, подфункции 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
2006-05-10 16:30:38 +02:00
(http://www.pobox.com/~ralf/files.html,
ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
2013-05-28 00:16:00 +02:00
список вторых должен быть указан в документации по устройству.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_READ_BYTE (4), SSF_READ_WORD (5), SSF_READ_DWORD (6)
2013-05-28 00:16:00 +02:00
======================================================================
======= Функция 62, подфункции 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;
список вторых должен быть указан в документации по устройству.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10)
2013-05-28 00:16:00 +02:00
======================================================================
================ Функция 63 - работа с доской отладки. ===============
======================================================================
Доска отладки представляет собой системный буфер (на 4096 байт),
в который любая программа может записать (вообще говоря, произвольные)
данные и из которого другая программа может эти данные прочитать.
Есть соглашение, в соответствии с которым записываемые данные -
текстовые строки, интерпретируемые как отладочные сообщения о ходе
выполнения программы. Ядро в определённых ситуациях также записывает
на доску отладки сведения о выполнении некоторых функций;
по соглашению сообщения ядра начинаются с префикса "K : ".
Для просмотра доски отладки создано приложение board,
которое считывает данные из буфера и отображает их в своём окне. board
понимает последовательность кодов 13,10 как переход на новую строку.
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
В связи с появлением отладчика ценность доски отладки несколько
снизилась, поскольку отладчик позволяет полностью контролировать ход
выполнения программы, причём для этого не требуется никаких усилий
с о стороны самой программы. Тем не менее во многих случаях
доска отладки продолжает оставаться полезной.
---------------------------- Запись байта ----------------------------
Параметры:
* eax = 63 - номер функции
* ebx = 1 - номер подфункции
* cl = байт данных
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Байт записывается в буфер. Длина буфера - 512 байт.
При переполнении буфера все полученные данные теряются
и заполнение начинается снова с нуля.
* Для вывода на доску отладки более сложных объектов (строк, чисел)
достаточно этой функции, вызываемой в цикле. Можно не писать
вручную соответствующий код, а воспользоваться файлом debug.inc,
входящим в дистрибутив.
---------------------------- Чтение байта ----------------------------
Забирает байт из буфера.
Параметры:
* eax = 63 - номер функции
* ebx = 2 - номер подфункции
Возвращаемое значение:
* eax = ebx = 0 - буфер пуст
* eax = байт, ebx = 1 - байт успешно прочитан
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BOARD (63)
ebx - SSF_DEBUG_WRITE (1), SSF_DEBUG_READ (2)
2013-05-28 00:16:00 +02:00
======================================================================
========== Функция 64 - перераспределить память приложения. ==========
======================================================================
Параметры:
* eax = 64 - номер функции
* ebx = 1 - единственная подфункция
* ecx = новый размер памяти
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - недостаточно памяти
Замечания:
* Есть другой способ выделения/освобождения динамической памяти -
2017-09-13 12:53:39 +02:00
подфункции 11, 12, 13 функции 68.
* Функция не может использоваться совместно с 68.11, 68.12, 68.13.
Вызов функции будет игнорироваться, если приложение создаст
локальную кучу вызовом 68.11.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_MEMORY_RESIZE (64)
2013-05-28 00:16:00 +02:00
======================================================================
========= Функция 65 - вывести изображение с палитрой в окно. ========
======================================================================
Параметры:
* eax = 65 - номер функции
* ebx = указатель на изображение
* ecx = [размер по оси x]*65536 + [размер по оси y]
* edx = [координата по оси x]*65536 + [координата по оси y]
* esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
* edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
игнорируется при esi > 8
* ebp = смещение данных каждой следующей строки изображения
относительно предыдущей
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Координаты изображения - это координаты верхнего левого угла
изображения относительно окна.
* Формат изображения с 1 битом на пиксель: каждый байт изображения,
за исключением, быть может, последних байтов строк, содержит
информацию о цвете 8 пикселей, старший бит соответствует первому
пикселю.
* Формат изображения с 2 битами на пиксель: каждый байт изображения,
за исключением, быть может, последних байтов строк, содержит
информацию о цвете 4 пикселей, старшие два бита соответствуют
первому пикселю.
* Формат изображения с 4 битами на пиксель: каждый байт изображения,
за исключением последних байтов строк (если ширина изображения
нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
соответствует первому пикселю.
* Формат изображения с 8 битами на пиксель: каждый байт изображения
рассматривается как индекс в палитре.
* Формат изображения с 9 битами на пиксель: каждый байт изображения
(8 бит) обозначает интенсивность с е р о г о для одного пикселя, т.о .
этот тип изображения идентичен 8 бит на пиксель без палитры.
* Формат изображения с 15 битами на пиксель: цвет каждого пикселя
кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
по 5 пикселей на каждый цвет.
* Формат изображения с 16 битами на пиксель: цвет каждого пикселя
кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
* Формат изображения с 24 битами на пиксель: цвет каждого пикселя
кодируется тремя байтами - последовательно синяя, зелёная, красная
составляющие цвета.
* Формат изображения с 32 битами на пиксель: аналогично 24, только
есть ещё игнорируемый четвёртый байт.
* Вызов функции 7 эквивалентен вызову этой функции с параметрами
2007-02-02 16:09:14 +01:00
esi=24, ebp=0.
2007-01-19 16:02:33 +01:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_PUT_IMAGE_EXT (65)
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
================= Функция 66 - работа с клавиатурой. =================
======================================================================
Режим ввода влияет на результаты чтения клавиш функцией 2.
При загрузке программы для неё устанавливается ASCII-режим ввода.
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
Параметры:
* eax = 66 - номер функции
* ebx = 1 - номер подфункции
* ecx = режим:
* 0 = обычный (ASCII-символы)
* 1 = сканкоды
Возвращаемое значение:
* функция не возвращает значения
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
Параметры:
* eax = 66 - номер функции
* ebx = 2 - номер подфункции
Возвращаемое значение:
* eax = текущий режим
------- Подфункция 3 - получить состояние управляющих клавиш. --------
Параметры:
* eax = 66 - номер функции
* ebx = 3 - номер подфункции
Возвращаемое значение:
* eax = битовая маска:
* бит 0 (маска 1): левый Shift нажат
* бит 1 (маска 2): правый Shift нажат
* бит 2 (маска 4): левый Ctrl нажат
* бит 3 (маска 8): правый Ctrl нажат
* бит 4 (маска 0x10): левый Alt нажат
* бит 5 (маска 0x20): правый Alt нажат
* бит 6 (маска 0x40): CapsLock включён
* бит 7 (маска 0x80): NumLock включён
* бит 8 (маска 0x100): ScrollLock включён
* бит 9 (маска 0x200): левый Win нажат
* бит 10 (маска 0x400): правый Win нажат
* прочие биты сброшены
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
О нажатии "горячей клавиши" извещаются только приложения,
установившие её; активное приложение (к которому поступает
весь нормальный ввод) таких клавиш не получает.
Извещение заключается в посылке события с кодом 2.
Прочитать "горячую клавишу" можно так же, как и обычную, -
функцией 2.
Параметры:
* eax = 66 - номер функции
* ebx = 4 - номер подфункции
* cl задаёт сканкод клавиши;
используйте cl=0 для задания комбинаций типа Ctrl+Shift
* edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
* Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
* 0 = ни одна из клавиш не должна быть нажата;
* 1 = ровно одна из клавиш должна быть нажата;
* 2 = о б е клавиши должны быть нажаты;
* 3 = должна быть нажата LShift, но не RShift;
* 4 = должна быть нажата RShift, но не LShift
* Y - аналогично для LCtrl и RCtrl;
* X - аналогично для LAlt и RAlt
Возвращаемое значение:
* eax=0 - успешно
* eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
Замечания:
* Горячая клавиша может срабатывать либо при нажатии,
либо при отпускании. Сканкод отпускания клавиши на 128 больше,
чем сканкод нажатия (т.е . установлен старший бит).
* Несколько приложений могут установить одну и ту же комбинацию;
о нажатии такой комбинации будут извещаться все такие приложения.
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
Параметры:
* eax = 66 - номер функции
* ebx = 5 - номер подфункции
* cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - нет такой горячей клавиши
Замечания:
* При завершении процесса/потока удаляются все установленные им
горячие клавиши.
* Вызов функции не влияет на другие приложения.
Если другое приложение определило эту же комбинацию,
оно по-прежнему будет получать уведомления.
------------- Подфункция 6 - заблокировать обычный ввод. -------------
Параметры:
* eax = 66 - номер функции
* ebx = 6 - номер подфункции
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Блокируется обычный ввод данных с клавиатуры для установленных
"горячих" клавиш
* Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
Параметры:
* eax = 66 - номер функции
* ebx = 7 - номер подфункции
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Разблокирование результатов ф. 66.6
* Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_KEYBOARD (66)
ebx - SSF_SET_INPUT_MODE (1), SSF_GET_INPUT_MODE (2),
SSF_GET_CONTROL_KEYS (3), SSF_SET_SYS_HOTKEY (4),
SSF_DEL_SYS_HOTKEY (5), SSF_LOCK_INPUT (6), SSF_UNLOCK_INPUT (7)
2013-05-28 00:16:00 +02:00
======================================================================
============ Функция 67 - изменить положение/размеры окна. ===========
======================================================================
Параметры:
* eax = 67 - номер функции
* ebx = новая x-координата окна
* ecx = новая y-координата окна
* edx = новый x-размер окна
* esi = новый y-размер окна
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Значение -1 для параметра означает "не изменять"; например, для
перемещения окна без изменения размеров можно указать edx=esi=-1.
* Предварительно окно должно быть определено функцией 0.
Она же задаёт начальные координаты и размеры окна.
* Размеры окна понимаются в смысле функции 0, т.е .
на один пиксель меньше, чем реальные размеры.
* Вызов функции для максимизированных окон просто игнорируется.
* Для окон соответствующих стилей положение и/или размеры могут быть
изменены пользователем; текущие положение и размеры могут быть
получены вызовом функции 9.
* Функция посылает окну событие перерисовки (с кодом 1).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_CHANGE_WINDOW (67)
2013-05-28 00:16:00 +02:00
======================================================================
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 0 - номер подфункции
Возвращаемое значение:
* eax = число переключений задач с момента загрузки системы
(по модулю 2^32)
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_GET_TASK_SWITCH_COUNT (0)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 68, подфункция 1 ======================
============ Переключиться на следующий поток выполнения. ============
======================================================================
Функция завершает текущий квант времени, выделенный потоку,
и переключается на следующий.
(Какой поток какого процесса будет следующим, предсказать нельзя).
Позднее, когда до текущего потока дойдёт очередь,
выполнение возобновится.
Параметры:
* eax = 68 - номер функции
* ebx = 1 - номер подфункции
Возвращаемое значение:
* функция не возвращает значения
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_SWITCH_TASK (1)
2013-05-28 00:16:00 +02:00
======================================================================
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 2 - номер подфункции
* ecx = требуемое действие:
* ecx = 0 - разрешить выполнение инструкции rdpmc
2006-05-10 16:30:38 +02:00
(ReaD Performance-Monitoring Counters)
2013-05-28 00:16:00 +02:00
* ecx = 1 - узнать, включён/выключен кэш
* ecx = 2 - включить кэш
* ecx = 3 - выключить кэш
Возвращаемое значение:
* для ecx=0:
* eax = значение cr4
* для ecx=1:
2006-05-10 16:30:38 +02:00
* eax = (cr0 and 0x60000000):
2013-05-28 00:16:00 +02:00
* eax = 0 - кэш включён
* eax <> 0 - кэш выключен
* для ecx=2 и ecx=3:
* функция не возвращает значения
2006-05-10 16:30:38 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_PERFORMANCE (2)
ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1),
SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3)
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
MSR = Model Specific Register; полный список MSR-регистров процессора
содержится в документации по процессору (например, IA-32 Intel
2006-05-10 16:30:38 +02:00
Architecture Software Developer's Manual, Volume 3, Appendix B);
2013-05-28 00:16:00 +02:00
каждое семейство процессоров имеет своё подмножество MSR-регистров.
Параметры:
* eax = 68 - номер функции
* ebx = 3 - номер подфункции
* ecx игнорируется
* edx = адрес MSR
Возвращаемое значение:
* ebx:eax = старший:младший dword результата
Замечания:
* Указание в ecx несуществующего или нереализованного для данного
процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
* Предварительно следует определить, поддерживаются ли MSR в целом,
командой cpuid. Иначе возникнет уже другое исключение в ядре,
которое всё равно прибьёт поток.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_READ_MSR (3)
2013-05-28 00:16:00 +02:00
======================================================================
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
======================================================================
MSR = Model Specific Register; полный список MSR-регистров процессора
содержится в документации по процессору (например, IA-32 Intel
2006-05-10 16:30:38 +02:00
Architecture Software Developer's Manual, Volume 3, Appendix B);
2013-05-28 00:16:00 +02:00
каждое семейство процессоров имеет своё подмножество MSR-регистров.
Параметры:
* eax = 68 - номер функции
* ebx = 4 - номер подфункции
* ecx игнорируется
* edx = адрес MSR
* esi:edi = старший:младший dword
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Указание в ecx несуществующего или нереализованного для данного
процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
* Предварительно следует определить, поддерживаются ли MSR в целом,
командой cpuid. Иначе возникнет уже другое исключение в ядре,
которое всё равно прибьёт поток.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_WRITE_MSR (4)
2013-05-28 00:16:00 +02:00
======================================================================
2017-09-13 12:53:39 +02:00
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
2013-05-28 00:16:00 +02:00
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 11 - номер подфункции
Возвращаемое значение:
* eax = 0 - неуспех
* иначе размер созданной кучи
Замечания:
* Вызов функции инициализирует кучу, из которой впоследствии можно
2017-05-13 08:41:42 +02:00
выделять и освобождать блоки памяти подфункциями 12, 13 и 20.
* Если куча уже создана, функция вернёт размер существующей кучи.
2013-05-28 00:16:00 +02:00
Размер кучи равен размеру всей свободной памяти приложения.
* После создания кучи вызовы функции 64 игнорируются.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_HEAP_INIT (11)
2013-05-28 00:16:00 +02:00
======================================================================
========== Функция 68, подфункция 12 - выделить блок памяти. =========
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 12 - номер подфункции
* ecx = требуемый размер в байтах
Возвращаемое значение:
* eax = указатель на выделенный блок
Замечания:
* Функция выделяет целое число страниц (4 К б ) так, что фактический
размер выделенного блока больше или равен запрошенному.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_ALLOC (12)
2013-05-28 00:16:00 +02:00
======================================================================
========= Функция 68, подфункция 13 - освободить блок памяти. ========
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 13 - номер подфункции
* ecx = указатель на блок памяти
Возвращаемое значение:
* eax = 1 - успешно
* eax = 0 - неудача
Замечания:
* Блок памяти должен быть ранее выделен подфункцией 12
или подфункцией 20.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_FREE (13)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 68, подфункция 14 =====================
====== Ожидать получения сигнала от других приложений/драйверов. =====
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 14 - номер подфункции
* ecx = указатель на буфер для информации (24 байта)
Возвращаемое значение:
* eax разрушается
* буфер, на который указывает ecx, содержит следующую информацию:
* +0: dword: идентификатор последующих данных сигнала
* +4: данные принятого сигнала (20 байт), формат которых
определяется первым dword-ом
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_WAIT_SIGNAL (14)
2013-05-28 00:16:00 +02:00
======================================================================
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 16 - номер подфункции
* ecx = указатель на ASCIIZ-строку с именем драйвера
Возвращаемое значение:
* eax = 0 - неудача
* иначе eax = хэндл драйвера
Замечания:
* Если драйвер ещё не загружен, он загружается;
если драйвер уже загружен, ничего не меняется.
* Имя драйвера чувствительно к регистру символов.
Максимальная длина имени - 16 символов, включая завершающий
нулевой символ, остальные символы игнорируются.
2022-04-03 01:04:09 +02:00
* Драйвер с именем ABC загружается из файла /sys/drivers/ABC.sys.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DRIVER (16)
2013-05-28 00:16:00 +02:00
======================================================================
========== Функция 68, подфункция 17 - управление драйвером. =========
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 17 - номер подфункции
* ecx = указатель на управляющую структуру:
* +0: dword: хэндл драйвера
* +4: dword: код функции драйвера
* +8: dword: указатель на входные данные
* +12 = +0xC: dword: размер входных данных
* +16 = +0x10: dword: указатель на выходные данные
* +20 = +0x14: dword: размер выходных данных
Возвращаемое значение:
* eax = определяется драйвером
Замечания:
* Коды функций и структура входных/выходных данных
определяются драйвером.
* Предварительно должен быть получен хэндл драйвера подфункцией 16.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_CONTROL_DRIVER (17)
2013-05-28 00:16:00 +02:00
======================================================================
2016-12-15 18:38:17 +01:00
== Функция 68, подфункция 18 - загрузить DLL с указанием кодировки. ==
2013-05-28 00:16:00 +02:00
======================================================================
Параметры:
* eax = 68 - номер функции
2016-12-15 18:38:17 +01:00
* ebx = 18 - номер подфункции
* ecx = указатель на строку с путём к DLL
* edx = кодировка строки, подробности указаны в описании функции 80.
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - неудача
* иначе eax = указатель на таблицу экспорта DLL
Замечания:
* Таблица экспорта представляет собой массив структур по 2 dword'а ,
заканчивающийся нулём. Первый dword в структуре является
указателем на имя функции, второй содержит адрес функции.
2016-12-15 18:38:17 +01:00
======================================================================
============= Функция 68, подфункция 19 - загрузить DLL. =============
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 19 - номер подфункции
* ecx = указатель на строку с путём к DLL,
правила формирования строки указаны в описании функции 70.
Возвращаемое значение:
* eax = 0 - неудача
* иначе eax = указатель на таблицу экспорта DLL
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DLL (19)
2013-05-28 00:16:00 +02:00
======================================================================
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 20 - номер подфункции
* ecx = новый размер в байтах
* edx = указатель на уже выделенный блок памяти
Возвращаемое значение:
* eax = указатель на перераспределённый блок, 0 при ошибке
Замечания:
2017-09-13 12:53:39 +02:00
* Предварительно следует инициализировать кучу процесса вызовом
подфункции 11.
2013-05-28 00:16:00 +02:00
* Функция выделяет целое число страниц (4 К б ) так, что фактический
размер выделенного блока больше или равен запрошенному.
* Если edx=0, то вызов функции эквивалентен выделению памяти
подфункцией 12. В противном случае блок памяти по адресу edx
должен быть ранее выделен подфункцией 12 или
описываемой подфункцией.
* Если ecx=0, то функция освобождает блок памяти по адресу edx и
возвращает 0.
* Содержимое памяти вплоть до наименьшего из старого и нового
размеров сохраняется.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_REALLOC (20)
2013-05-28 00:16:00 +02:00
======================================================================
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 21 - номер подфункции
* ecx = указатель на ASCIIZ-строку с именем драйвера
* edx = указатель на командную строку
Возвращаемое значение:
* eax = 0 - неудача
* иначе eax = хэндл драйвера
Замечания:
* Если драйвер ещё не загружен, он загружается;
если драйвер уже загружен, ничего не меняется.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DRIVER_PE (21)
2013-05-28 00:16:00 +02:00
======================================================================
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 22 - номер подфункции
* ecx = имя области. Максимум 31 символ, включая завершающий ноль
* edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
* esi = флаги открытия и доступа:
* SHM_OPEN = 0x00 - открыть существующую область памяти.
Если область с таким именем не существует,
функция вернёт код ошибки 5.
* SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
область памяти.
* SHM_CREATE = 0x08 - создать новую область памяти.
Если область с таким именем уже существует,
функция вернёт код ошибки 10.
* SHM_READ = 0x00 - доступ только на чтение
* SHM_WRITE = 0x01 - доступ на чтение и запись
Возвращаемое значение:
* eax = указатель на область памяти, 0 при ошибке
* при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
edx = 0 - успех, иначе - код ошибки
* при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
edx = код ошибки (при eax=0) или размер области в байтах
Коды ошибок:
2009-01-31 07:09:36 +01:00
* E_NOTFOUND = 5
* E_ACCESS = 10
* E_NOMEM = 30
* E_PARAM = 33
2013-05-28 00:16:00 +02:00
Замечания:
2017-09-13 12:53:39 +02:00
* Предварительно следует инициализировать кучу процесса вызовом
подфункции 11.
2013-05-28 00:16:00 +02:00
* Если создаётся новая область, то флаги доступа устанавливают
максимальные права доступа для остальных процессов. Попытка
открытия другим потоком с неразрешёнными правами провалится
с кодом ошибки E_ACCESS.
* Процесс, создавший область, всегда имеет доступ на запись.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_OPEN (22)
2013-05-28 00:16:00 +02:00
======================================================================
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 23 - номер подфункции
* ecx = имя области. Максимум 31 символ, включая завершающий ноль
Возвращаемое значение:
* eax разрушается
Замечания:
* Область памяти физически освобождается (с забыванием всех данных
и высвобождением физической памяти), когда её закроют
все открывшие потоки.
* При завершении потока освобождаются все открытые им
области памяти.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_CLOSE (23)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 24 - номер подфункции
* ecx = адрес нового обработчика исключений
* edx = маска обрабатываемых исключений
Возвращаемое значение:
* eax = адрес старого обработчика исключений (0, если не установлен)
* ebx = маска старого обработчика исключений
Замечания:
* Номер бита в маске исключений соответствует номеру исключения по
спецификации на процессор (Intel-PC). Так, например, исключения
FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
* В данной реализации игнорируется запрос на перехват исключения 7
- система обрабатывает #NM самостоятельно.
* Пользовательский обработчик получает номер исключения параметром
в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
при этом производится на команду, вызвавшую исключение.
* При передаче управления обработчику исключений сбрасывается
соответствующий бит в маске исключений. Возникновение этого же
исключения впоследствии приведёт к умолчальной обработке такового.
А именно: к завершению работы приложения в отсутствии отладчика,
приостановка с уведомлением отлаживающего приложения иначе.
* После завершения критических действий в обработчике пользователя
восстановление бита маски данного исключения можно сделать
2024-02-16 19:07:13 +01:00
подфункцией 25. С б р о с флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
Внимание:
Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен адрес резервного стека в заголовке программы (см. структуру APP_HEADER_01_ taskman.inc).
В этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK sys32.inc).
Пользовательский бработчик,при завершении обработки этого исключения, должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_SET_EXCEPTION_HANDLER (24)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 68, подфункция 25 - изменить состояние активности сигнала. =
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 25 - номер подфункции
* ecx = номер сигнала
* edx = значение устанавливаемой активности (0/1)
Возвращаемое значение:
* eax = -1 - задан неверный номер сигнала
* иначе eax = старое значение активности сигнала (0/1)
Замечания:
* В текущей реализации изменяется только маска пользовательского
обработчика исключений, установленного подфункцией 24. При этом
номер сигнала соответствует номеру исключения.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_SET_EXCEPTION_STATE (25)
2013-11-08 05:43:29 +01:00
======================================================================
2016-12-15 18:38:17 +01:00
======= Функция 68, подфункция 26 - освободить страницы памяти =======
2013-11-08 05:43:29 +01:00
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 26 - номер подфункции
* ecx = указатель на блок памяти выделенный подфункцией 12
* edx = смещение от начала блока
* esi = размер высвобождаемого блока памяти, в байтах
Примечания:
* функция освобождает страницы с ecx+edx по ecx+edx+esi
и устанавливает виртуальную память в зарезервированное состояние.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_FREE_EXT (26)
2013-11-08 05:43:29 +01:00
======================================================================
2016-12-15 18:38:17 +01:00
============= Функция 68, подфункция 27 - загрузить файл =============
2013-11-08 05:43:29 +01:00
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 27 - номер подфункции
2016-09-04 03:43:19 +02:00
* ecx = указатель на строку с путём к файлу,
правила формирования строки указаны в описании функции 70.
2013-11-08 05:43:29 +01:00
Возвращаемое значение:
* eax = указатель на загруженный файл или 0
* edx = размер загруженного файла или 0
Примечания:
* функция загружает и, при необходимости, распаковывает файл (kunpack)
2017-09-13 12:53:39 +02:00
* Предварительно следует инициализировать кучу процесса вызовом
подфункции 11.
2013-11-08 05:43:29 +01:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_FILE (27)
2013-05-28 00:16:00 +02:00
======================================================================
2016-12-15 18:38:17 +01:00
== Функция 68, подфункция 28 - загрузить файл с указанием кодировки ==
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 28 - номер подфункции
* ecx = указатель на строку с путём к файлу
* edx = кодировка строки, подробности указаны в описании функции 80.
Возвращаемое значение:
* eax = указатель на загруженный файл или 0
* edx = размер загруженного файла или 0
Примечания:
* функция загружает и, при необходимости, распаковывает файл (kunpack)
2022-04-23 23:32:11 +02:00
======================================================================
======== Функция 68, подфункция 29 - allocate ring memory. =========
======================================================================
Parameters:
* eax = 68 - function number
* ebx = 29 - subfunction number
* ecx = required size in bytes
Returned value:
* eax = 0 - failed
* eax = pointer to the allocated ring
Remarks:
* The requested size must be an exact multiple of pagesize (4 Kb)
* The function allocates memory in such a way that you can read and
write beyond the size of the allocated memory and will reach the
beginning of the buffer again.
======================================================================
======== Функция 68, подфункция 31 - получить данные драйвера. =======
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 31 - номер подфункции
* ecx = функция (1 - получить начальные значения списка,
2 - получить элемент списка)
* edx = Если ecx=2 указатель на структуру.
* edi = Если ecx=2 указатель на память под структуру
Возвращаемое значение:
* Если ecx = 1, то ebx = fd
ecx = bk
* Если ecx = 2, то eax = 0 операция прошла успешно
eax = -1 ошибка
Примечания:
* возвращаемая структура
data_service:
.name: rb 16
.fd: rd 1
.bk: rd 1
.base: rd 1
.entry: rd 1
.srv_proc: rd 1
2016-12-15 18:38:17 +01:00
======================================================================
2013-05-28 00:16:00 +02:00
======================== Функция 69 - отладка. =======================
======================================================================
Процесс может загрузить другой процесс как отлаживаемый установкой
соответствующего бита при вызове подфункции 7 функции 70.
У процесса может быть только один отладчик; один процесс может
отлаживать несколько разных. Система уведомляет отладчик о событиях,
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
определённый подфункцией 0.
Формат сообщения:
* +0: dword: код сообщения
* +4: dword: PID отлаживаемого процесса
* +8: могут присутствовать дополнительные данные,
определяемые кодом сообщения
Коды сообщений:
* 1 = исключение
* дополнительно передаётся dword-номер исключения
* процесс приостановлен
* 2 = процесс завершился
* приходит при любом завершении: как через системную функцию -1,
так и при "убийстве" любым другим процессом
(в том числе самим отладчиком)
* 3 = отладочное исключение int 1 = #DB
* дополнительно передаётся dword-образ регистра DR6:
* биты 0-3: выполнено условие соответствующей точки останова
(установленной подфункцией 9)
* бит 14: исключение произошло из-за режима
пошаговой трассировки (установлен флаг TF)
* процесс приостановлен
При завершении отладчика прибиваются все отлаживаемые процессы.
Если отладчик этого не хочет, он должен предварительно отключиться
подфункцией 3.
В с е подфункции применимы только к процессам/потокам, запущенным
из текущего функцией 70 с установленным флагом отладки.
Отладка многопоточных программ пока не поддерживается.
Полный список подфункций:
* подфункция 0 - определить область данных для отладочных сообщений
* подфункция 1 - получить состояние регистров отлаживаемого потока
* подфункция 2 - установить состояние регистров отлаживаемого потока
* подфункция 3 - отключиться от отлаживаемого процесса
* подфункция 4 - приостановить отлаживаемый поток
* подфункция 5 - возобновить выполнение отлаживаемого потока
* подфункция 6 - прочитать из памяти отлаживаемого процесса
* подфункция 7 - записать в память отлаживаемого процесса
* подфункция 8 - завершить отлаживаемый поток
* подфункция 9 - установить/снять аппаратную точку останова
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_SET_MESSAGE_AREA (0), SSF_GET_REGISTERS (1),
SSF_SET_REGISTERS (2), SSF_DETACH (3), SSF_SUSPEND (4),
SSF_RESUME (5), SSF_READ_MEMORY (6), SSF_WRITE_MEMORY (7),
SSF_TERMINATE (8), SSF_DEFINE_BREAKPOINT (9)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 69, подфункция 0 ======================
========= Определить область данных для отладочных сообщений. ========
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 0 - номер подфункции
* ecx = указатель
Формат области данных:
* +0: dword: N = размер буфера (не считая этого заголовка)
* +4: dword: занято в буфере
* +8: N*byte: буфер
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Если поле размера отрицательно, буфер считается заблокированным
и при поступлении нового сообщения система будет ждать.
Для синхронизации обрамляйте всю работу с буфером операциями
блокировки/разблокировки
2010-10-17 10:53:29 +02:00
neg [bufsize]
2013-05-28 00:16:00 +02:00
* Данные в буфере трактуются как массив элементов переменной длины -
сообщений. Формат сообщения указан в общем описании.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_SET_MESSAGE_AREA (0)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 69, подфункция 1 ======================
========= Получить состояние регистров отлаживаемого потока. =========
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 1 - номер подфункции
* ecx = идентификатор потока
* edx = длина структуры контекста, должно быть 0x28=40 байт
* esi = указатель на структуру контекста
Возвращаемое значение:
* функция не возвращает значения
Формат структуры контекста: (FPU пока не поддерживается)
2006-05-10 16:30:38 +02:00
* +0: dword: eip
* +4: dword: eflags
* +8: dword: eax
* +12 = +0xC: dword: ecx
* +16 = +0x10: dword: edx
* +20 = +0x14: dword: ebx
* +24 = +0x18: dword: esp
* +28 = +0x1C: dword: ebp
* +32 = +0x20: dword: esi
* +36 = +0x24: dword: edi
2013-05-28 00:16:00 +02:00
Замечания:
* Если поток выполняет код 0-кольца, возвращается
состояние регистров 3-кольца.
* Процесс должен быть загружен для отладки (как указано в
общем описании).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_GET_REGISTERS (1)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 69, подфункция 2 ======================
======== Установить состояние регистров отлаживаемого потока. ========
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 2 - номер подфункции
* ecx = идентификатор потока
* edx = длина структуры контекста, должно быть 0x28=40 байт
* esi = указатель на структуру контекста
Возвращаемое значение:
* функция не возвращает значения
Формат структуры контекста указан в описании подфункции 1.
Замечания:
* Если поток выполняет код 0-кольца, устанавливается
состояние регистров 3-кольца.
* Процесс должен быть загружен для отладки (как указано в
общем описании).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_SET_REGISTERS (2)
2013-05-28 00:16:00 +02:00
======================================================================
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 3 - номер подфункции
* ecx = идентификатор
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Если процесс был приостановлен, он возобновляет выполнение.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_DETACH (3)
2013-05-28 00:16:00 +02:00
======================================================================
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
======================================================================
Параметры:
* eax = 69 - номер процесса
* ebx = 4 - номер подфункции
* ecx = идентификатор
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Процесс должен быть загружен для отладки (как указано в
общем описании).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_SUSPEND (4)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 69, подфункция 5 ======================
============ Возобновить выполнение отлаживаемого потока. ============
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 5 - номер подфункции
* ecx = идентификатор
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Процесс должен быть загружен для отладки (как указано в
общем описании).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_RESUME (5)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 69, подфункция 6 ======================
============= Прочитать из памяти отлаживаемого процесса. ============
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 6 - номер подфункции
* ecx = идентификатор
* edx = сколько байт читать
* esi = адрес памяти отлаживаемого процесса
* edi = указатель на буфер для данных
Возвращаемое значение:
* eax = -1 при ошибке (неверный PID или буфер)
* иначе eax = число прочитанных байт (возможно, 0,
если в esi слишком большое значение)
Замечания:
* Процесс должен быть загружен для отладки (как указано в
общем описании).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_READ_MEMORY (6)
2013-05-28 00:16:00 +02:00
======================================================================
2013-07-08 10:17:53 +02:00
Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
2013-05-28 00:16:00 +02:00
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 7 - номер подфункции
* ecx = идентификатор
* edx = сколько байт писать
* esi = адрес памяти в отлаживаемом процессе
* edi = указатель на данные
Возвращаемое значение:
* eax = -1 при ошибке (неверный PID или буфер)
* иначе eax = число записанных байт (возможно, 0,
если в esi слишком большое значение)
Замечания:
* Процесс должен быть загружен для отладки (как указано в
общем описании).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_WRITE_MEMORY (7)
2013-05-28 00:16:00 +02:00
======================================================================
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 8 - номер подфункции
* ecx = идентификатор
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Процесс должен быть загружен для отладки (как указано в
общем описании).
* Функция аналогична подфункции 2 функции 18 с двумя отличиями:
требуется выполнение первого замечания и принимается PID,
а не номер слота.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_TERMINATE (8)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 69, подфункция 9 ======================
============= Установить/снять аппаратную точку останова. ============
======================================================================
Параметры:
* eax = 69 - номер функции
* ebx = 9 - номер подфункции
* ecx = идентификатор потока
* dl = индекс точки останова, от 0 до 3 включительно
* dh = флаги:
* если старший бит сброшен - установить точку останова:
* биты 0-1 - условие:
* 00 = точка останова на выполнение
* 01 = точка останова на запись
* 11 = точка останова на чтение/запись
* биты 2-3 - длина; для точек останова на исполнение должно быть
00, в противном случае одно из
* 00 = байт
* 01 = слово
* 11 = двойное слово
* esi = адрес точки останова; должен быть выровнен
соответственно длине (т.е . должен быть чётным для
точек останова на слово, кратен 4 для двойного слова)
* если старший бит установлен - сбросить точку останова
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - ошибка во входных данных
* eax = 2 - (зарезервировано, никогда не возвращается
в текущей реализации) с этим индексом уже установлена
глобальная точка останова
Замечания:
* Процесс должен быть загружен для отладки (как указано в
общем описании).
* Аппаратные точки останова реализуются через DRx-регистры
процессора, отсюда все ограничения.
* Функция может переустановить ранее установленную ей же
точку останова (никак не сообщая о б этом).
Ведите список установленных точек останова в отладчике.
* Срабатывание точки останова заключается в генерировании
отладочного исключения #DB, о котором система сообщает отладчику.
* Точка останова на запись и чтение/запись срабатывает после
выполнения вызвавшей её инструкции.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_DEFINE_BREAKPOINT (9)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
======================================================================
Параметры:
2006-05-10 16:30:38 +02:00
* eax = 70
2013-05-28 00:16:00 +02:00
* ebx = указатель на информационную структуру
Возвращаемое значение:
* eax = 0 - успешно; иначе код ошибки файловой системы
* в зависимости от подфункции может возвращаться значение и
в других регистрах
Общий формат информационной структуры:
* +0: dword: номер подфункции
2016-12-15 18:38:17 +01:00
* +4: dword: смещение в файле или папке
* +8: dword: старшая часть смещения или поле флагов
* +12 = +0xC: dword: размер данных
2013-05-28 00:16:00 +02:00
* +16 = +0x10: dword: указатель на данные
2016-08-15 19:02:18 +02:00
* +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
2016-08-25 21:30:08 +02:00
или
2016-08-15 19:02:18 +02:00
* +20 = +0x14: byte: 0
* +21 = +0x15: dword: указатель на строку
Чувствительность к регистру букв зависит от файловой системы.
2016-11-25 16:11:25 +01:00
Если путь начинается не с '/', то он считается относительным.
Получить или установить текущую папку можно с помощью сисфункции 30.
2016-12-15 18:38:17 +01:00
'../' в пути означает подъём на одну папку относительно текущей.
2016-11-25 16:11:25 +01:00
Можно указать кодировку строки, поместив в её начале байт с о значениями:
2016-08-25 21:30:08 +02:00
* 1 = cp866
* 2 = UTF-16LE
* 3 = UTF-8
2016-11-25 16:11:25 +01:00
иначе будет использоваться кодировка cp866. В абсолютном пути можно
поместить этот байт после '/' или добавить дополнительный '/' перед ним.
2016-12-15 18:38:17 +01:00
Также, можно использовать сисфункцию 80.
2016-11-25 16:11:25 +01:00
Формат абсолютного пути:
2016-08-15 19:02:18 +02:00
/base/number/dir1/dir2/.../dirn/file,
где base/number идентифицирует устройство, на котором ищется файл:
* RD/1 = рамдиск
* FD/1 = первый флоппи-дисковод,
FD/2 = второй флоппи-дисковод
* HD0/x, HD1/x, HD2/x, HD3/x = жёсткие диски соответственно на
IDE0 (Primary Master), IDE1 (Primary Slave),
2006-05-10 16:30:38 +02:00
IDE2 (Secondary Master), IDE3 (Secondary Slave);
2016-08-15 19:02:18 +02:00
x - номер раздела на выбранном винчестере, начиная с 1
* CD0/1, CD1/1, CD2/1, CD3/1 = аналогично для cd
2020-02-17 03:52:27 +01:00
* SYS - системная папка (является ключом, не зависит от кодировки),
2016-08-15 19:02:18 +02:00
второй ключ может быть установлен сисфункцией 30.3.
2013-05-28 00:16:00 +02:00
Примеры:
2016-08-15 19:02:18 +02:00
* '/sys/example.asm',0
* '/rd/1/example.asm',0
* '/HD0/1/folder/file.txt',0
* '/hd2/2/pics/tanzania.bmp',0
* 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0
2013-05-28 00:16:00 +02:00
Доступные подфункции:
* подфункция 0 - чтение файла
* подфункция 1 - чтение папки
* подфункция 2 - создание/перезапись файла
* подфункция 3 - запись в существующий файл
* подфункция 4 - установка размера файла
* подфункция 5 - получение атрибутов файла/папки
* подфункция 6 - установка атрибутов файла/папки
* подфункция 7 - запуск программы
* подфункция 8 - удаление файла/папки
* подфункция 9 - создание папки
Для CD-приводов в связи с аппаратными ограничениями доступны
только подфункции 0,1,5 и 7, вызов других подфункций завершится
ошибкой с кодом 2.
При первом обращении подфункций 0,1,5,7 к устройствам ATAPI
(CD и DVD) производится блокировка ручного управления механизмом
лотка. Это связано с кэшированием данных, полученных от привода.
Разблокировка осуществляется при обращении подфункции 4 функции 24
к соответствующему устройству.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_READ_FILE (0), SSF_READ_FOLDER (1), SSF_CREATE_FILE (2),
SSF_WRITE_FILE (3), SSF_SET_END (4), SSF_GET_INFO (5),
SSF_SET_INFO (6), SSF_START_APP (7), SSF_DELETE (8),
SSF_CREATE_FOLDER (9)
2013-05-28 00:16:00 +02:00
======================================================================
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 0 = номер подфункции
* +4: dword: позиция в файле (в байтах)
* +8: dword: 0 (зарезервировано под старший dword позиции)
* +12 = +0xC: dword: сколько байт читать
* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
2017-03-28 16:30:08 +02:00
* ebx = число прочитанных байт
2013-05-28 00:16:00 +02:00
Замечания:
* Если файл кончился раньше, чем был прочитан последний запрошенный
блок, то функция прочитает, сколько сможет, после чего вернёт
2006-05-10 16:30:38 +02:00
eax=6 (EOF).
2013-05-28 00:16:00 +02:00
* Функция не позволяет читать папки
(вернётся eax=10, access denied).
2006-05-10 16:30:38 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_READ_FILE (0)
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
2006-05-10 16:30:38 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 1 = номер подфункции
* +4: dword: индекс начального блока (считая с 0)
2016-08-15 19:02:18 +02:00
* +8: dword: в какой кодировке возвращать имена:
2016-12-15 18:38:17 +01:00
0 = по умолчанию
1 = cp866
2 = UTF-16LE
3 = UTF-8
2013-05-28 00:16:00 +02:00
* +12 = +0xC: dword: сколько блоков читать
2016-12-15 18:38:17 +01:00
* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные.
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
2017-03-28 16:30:08 +02:00
* ebx = число файлов, информация о которых была записана в буфер
2013-05-28 00:16:00 +02:00
Структура буфера:
2016-08-15 19:02:18 +02:00
* заголовок (32 байта)
* блок с информацией о файле 1
* блок с информацией о файле 2
2006-05-10 16:30:38 +02:00
* ...
2013-05-28 00:16:00 +02:00
Структура заголовка:
* +0: dword: версия структуры (текущая версия = 1)
* +4: dword: количество размещённых блоков; не больше, чем запрошено
в поле +12 информационной структуры; может быть меньше,
если в папке кончились файлы (то же самое, что и в ebx)
* +8: dword: общее число файлов в папке
* +12 = +0xC: 20*byte: зарезервировано (нули)
Структура блока данных входа каталога (БДВК):
* +0: dword: атрибуты файла:
* бит 0 (маска 1): файл только для чтения
* бит 1 (маска 2): файл является скрытым
* бит 2 (маска 4): файл является системным
2017-05-19 11:02:21 +02:00
* бит 3 (маска 8): это метка тома (возвращается подфункцией 5)
2013-05-28 00:16:00 +02:00
* бит 4 (маска 0x10): это папка
* бит 5 (маска 0x20): файл не архивировался - многие программы
архивации имеют опцию, по которой архивируются только файлы
с установленным этим битом, после чего этот бит сбрасывается -
это может быть полезно для автоматического создания
backup-архивов, ибо при записи бит обычно устанавливается
(не в Kolibri, правда)
2016-12-15 18:38:17 +01:00
* +4: dword: кодировка имени, соответствует полю +8 информационной структуры
2013-05-28 00:16:00 +02:00
* +8: 4*byte: время создания файла
* +12 = +0xC: 4*byte: дата создания файла
* +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
* +20 = +0x14: 4*byte: дата последнего доступа
* +24 = +0x18: 4*byte: время последней модификации
* +28 = +0x1C: 4*byte: дата последней модификации
* +32 = +0x20: qword: размер файла в байтах (до 16777216 Т б )
2016-12-15 18:38:17 +01:00
* +40 = +0x28: имя, размер в cp866 составляет 264 байта, иначе - 520 байт.
2013-05-28 00:16:00 +02:00
Формат времени:
* +0: byte: секунды
* +1: byte: минуты
* +2: byte: часы
* +3: byte: зарезервировано (0)
* например, 23.59.59 записывается как (в hex) 3B 3B 17 00
Формат даты:
* +0: byte: день
* +1: byte: месяц
* +2: word: год
* например, 25.11.1979 записывается как (в hex) 19 0B BB 07
2022-03-20 14:09:59 +01:00
Некоторые файловые системы ведут дату с 01.01.1980,
например: FAT12/16/32 и exFAT
2013-05-28 00:16:00 +02:00
Замечания:
2016-12-15 18:38:17 +01:00
* Если БДВК содержит имя в cp866, то длина БДВК составляет
304 байта, иначе - 560 байт.
2016-08-15 19:02:18 +02:00
* Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
2013-05-28 00:16:00 +02:00
* Если файлы в папке кончились раньше, чем было прочитано
запрошенное количество, то функция прочитает, сколько сможет,
после чего вернёт eax=6 (EOF).
* Любая папка на диске, кроме корневой, содержит два специальных
входа "." и "..", идентифицирующих соответственно саму папку и
родительскую папку.
* Функция позволяет также читать виртуальные папки "/", "/rd",
"/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
2016-08-15 19:02:18 +02:00
0x10, а времена и даты обнулены.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_READ_FOLDER (1)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 70, подфункция 2 ======================
======== Создание/перезапись файла с поддержкой длинных имён. ========
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 2 = номер подфункции
* +4: dword: 0 (зарезервировано)
* +8: dword: 0 (зарезервировано)
* +12 = +0xC: dword: сколько байт писать
* +16 = +0x10: dword: указатель на данные
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
* ebx = число записанных байт (возможно, 0)
Замечания:
* Если файл с таким именем не существовал, он создаётся; если
существовал, то перезаписывается.
* Если свободного места на диске недостаточно, то функция запишет,
сколько сможет, после чего вернёт код ошибки 8.
* Функция не поддерживается для CD (вернётся код ошибки 2).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_CREATE_FILE (2)
2013-05-28 00:16:00 +02:00
======================================================================
====================== Функция 70, подфункция 3 ======================
======== Запись в существующий файл с поддержкой длинных имён. =======
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 3 = номер подфункции
* +4: dword: позиция в файле (в байтах)
* +8: dword: старший dword позиции (должен быть 0 для FAT)
* +12 = +0xC: dword: сколько байт писать
* +16 = +0x10: dword: указатель на данные
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
* ebx = число записанных байт (возможно, 0)
Замечания:
* Файл должен уже существовать, иначе вернётся eax=5.
* Единственным результатом записи 0 байт является установка в
атрибутах файла даты/времени модификации и доступа в текущую.
* Если начальная и/или конечная позиция выходит за пределы файла
(за исключением предыдущего случая), файл расширяется до
необходимого размера нулевыми символами.
* Функция не поддерживается для CD (вернётся код ошибки 2).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_WRITE_FILE (3)
2013-05-28 00:16:00 +02:00
======================================================================
========= Функция 70, подфункция 4 - установка размера файла. ========
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 4 = номер подфункции
* +4: dword: младший dword нового размера файла
* +8: dword: старший dword нового размера файла
* +12 = +0xC: dword: 0 (зарезервировано)
* +16 = +0x10: dword: 0 (зарезервировано)
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
* ebx разрушается
Замечания:
2016-11-25 16:11:25 +01:00
* Если новый размер файла меньше старого, файл усекается.
Если новый размер больше старого, файл расширяется, и если
разница в размере не больше 16 МБ, новое место очищается нулями.
2013-05-28 00:16:00 +02:00
* Если свободного места на диске недостаточно для расширения файла,
то функция расширит насколько возможно, после чего вернёт
код ошибки 8.
* Функция не поддерживается для CD (вернётся код ошибки 2).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_SET_END (4)
2013-05-28 00:16:00 +02:00
======================================================================
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 5 = номер подфункции
* +4: dword: 0 (зарезервировано)
2016-05-13 00:34:08 +02:00
* +8: dword: 0 или флаги (для корневого каталога)
2013-05-28 00:16:00 +02:00
* +12 = +0xC: dword: 0 (зарезервировано)
* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
(40 байт)
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
* ebx разрушается
Информация о файле возвращается в формате БДВК
2016-05-13 00:34:08 +02:00
(блока данных входа каталога), указанном в описании подфункции 1,
но без имени файла, за исключением корневого каталога.
2013-05-28 00:16:00 +02:00
Замечания:
2017-03-07 17:28:02 +01:00
* Для корневого каталога возвращается размер раздела,
а при указании кодировки (не ноль), также е г о имя.
2017-03-06 14:45:37 +01:00
* Для устройства возвращается только размер.
2013-05-28 00:16:00 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_GET_INFO (5)
2013-05-28 00:16:00 +02:00
======================================================================
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 6 = номер подфункции
* +4: dword: 0 (зарезервировано)
* +8: dword: 0 (зарезервировано)
* +12 = +0xC: dword: 0 (зарезервировано)
* +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
* ebx разрушается
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
формат которого указан в описании подфункции 1
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
(биты 3,4 в dword'е +0) не меняется.
Байт +4 (формат имени) игнорируется.
Замечания:
* Функция не поддерживает виртуальные папки типа /, /rd и
корневые папки типа /rd/1.
* Функция не поддерживается для CD (вернётся код ошибки 2).
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_SET_INFO (6)
2013-05-28 00:16:00 +02:00
======================================================================
============ Функция 70, подфункция 7 - запуск программы. ============
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 7 = номер подфункции
* +4: dword: поле флагов:
* бит 0: запустить процесс как отлаживаемый
* остальные биты зарезервированы и должны быть установлены в 0
* +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
* +12 = +0xC: dword: 0 (зарезервировано)
* +16 = +0x10: dword: 0 (зарезервировано)
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax > 0 - программа загружена, eax содержит PID
* eax < 0 - произошла ошибка, -eax содержит
код ошибки файловой системы
* ebx разрушается
Замечания:
* Командная строка должна заканчиваться символом с кодом 0
(ASCIIZ-строка); учитываются либо все символы до завершающего нуля
включительно, либо первые 256 символов, в зависимости от того,
что меньше.
* Если процесс запускается как отлаживаемый, он создаётся
в замороженном состоянии; для запуска используйте
подфункцию 5 функции 69.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_START_APP (7)
2013-05-28 00:16:00 +02:00
======================================================================
========== Функция 70, подфункция 8 - удаление файла/папки. ==========
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 8 = номер подфункции
* +4: dword: 0 (зарезервировано)
* +8: dword: 0 (зарезервировано)
* +12 = +0xC: dword: 0 (зарезервировано)
* +16 = +0x10: dword: 0 (зарезервировано)
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
* ebx разрушается
Замечания:
* Функция не поддерживается для CD (вернётся код ошибки 2).
* Можно удалять только пустые папки (попытка удаления непустой папки
приведёт к ошибке с кодом 10, "доступ запрещён").
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_DELETE (8)
2013-05-28 00:16:00 +02:00
======================================================================
============= Функция 70, подфункция 9 - создание папки. =============
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 9 = номер подфункции
* +4: dword: 0 (зарезервировано)
* +8: dword: 0 (зарезервировано)
* +12 = +0xC: dword: 0 (зарезервировано)
* +16 = +0x10: dword: 0 (зарезервировано)
2016-08-15 19:02:18 +02:00
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
* ebx разрушается
Замечания:
* Функция не поддерживается для CD (вернётся код ошибки 2).
* Родительская папка должна уже существовать.
* Если папка уже существует, функция завершится успешно (eax=0).
2007-02-05 15:20:36 +01:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_CREATE_FOLDER (9)
2006-08-03 21:30:32 +02:00
======================================================================
2017-06-08 12:03:01 +02:00
======= Функция 70, подфункция 10 - переименование/перемещение =======
======================================================================
Параметры:
* eax = 70 - номер функции
* ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 10 = номер подфункции
* +4: dword: 0 (зарезервировано)
* +8: dword: 0 (зарезервировано)
* +12 = +0xC: dword: 0 (зарезервировано)
* +16 = +0x10: dword: указатель на строку с новым именем/путём
* +20 = +0x14: путь, правила формирования имён указаны в общем описании
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы
* ebx разрушается
Замечания:
* Формирование нового пути отличается от общих правил:
относительный путь относится к папке целевого файла (или папки),
абсолютный путь считается от корня раздела.
======================================================================
2016-12-21 10:11:27 +01:00
========== Функция 71 - установить заголовок окна программы ==========
2006-08-03 21:30:32 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 71 - номер функции
2016-12-21 10:11:27 +01:00
* ebx = 1
* ecx = адрес строки заголовка,
строка может начинаться с байта кодировки:
1 = cp866
2 = UTF-16LE
3 = UTF-8
или:
* ebx = 2
2013-05-28 00:16:00 +02:00
* ecx = адрес строки заголовка
2016-12-21 10:11:27 +01:00
* dl = кодировка строки
2013-05-28 00:16:00 +02:00
Возвращаемое значение:
* функция не возвращает значения
Замечания:
2015-11-23 05:21:00 +01:00
* Строка заголовка должна заканчиваться нулём.
2013-05-28 00:16:00 +02:00
* Чтобы убрать заголовок, передайте NULL в ecx.
2006-08-03 21:30:32 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SET_CAPTION (71)
2007-10-25 13:20:02 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
================ Функция 72 - послать сообщение окну. ================
2007-10-25 13:20:02 +02:00
======================================================================
2013-05-28 00:16:00 +02:00
--- Подфункция 1 - послать сообщение с параметром активному окну. ----
Параметры:
* eax = 72 - номер функции
* ebx = 1 - номер подфункции
* ecx = код события: 2 или 3
* edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3
Возвращаемое значение:
* eax = 0 - успешно
* eax = 1 - буфер заполнен
2007-10-25 13:20:02 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_SEND_MESSAGE (72)
2013-03-03 16:03:27 +01:00
======================================================================
2013-05-28 00:16:00 +02:00
===================== Функция 73 - blit bitmap =====================
2013-03-03 16:03:27 +01:00
======================================================================
2013-05-28 00:16:00 +02:00
блит - копирование битового массив
2013-03-03 16:03:27 +01:00
2013-05-28 00:16:00 +02:00
Параметры:
* eax = 73 - номер функции
2013-03-03 16:03:27 +01:00
2013-05-28 00:16:00 +02:00
* ebx = ROP и опциональные флаги
2016-12-07 19:33:17 +01:00
31 30 29 28 6 5 4 3 0
[reserved][CR][reserved][T][B][ROP]
2013-05-28 00:16:00 +02:00
ROP - код растровых операций
0: копировать
1-15: Зарезервировано
2020-02-17 03:52:27 +01:00
B - блит на фоновую поверхность
2013-05-28 00:16:00 +02:00
T - блит с прозрачностью
2016-12-07 19:33:17 +01:00
CR - относительно клиентской области окна
2016-12-15 18:38:17 +01:00
2013-05-28 00:16:00 +02:00
* ecx = указатель на параметры функции
смещение цели и отсечение
+0 signed dword: смещение по X окна, для целевого прямоугольника
верхний левый угол
+4 signed dword: смещение по Y окна, для целевого прямоугольника
верхний левый угол
+8 dword: ширина целевого прямоугольника
+12 dword: высота целевого прямоугольника
смещение исходника и отсечение
+16 signed dword: смещение по X bitmap, для исходного прямоугольника
верхний левый угол
+20 signed dword: смещение по Y bitmap, для исходного прямоугольника
верхний левый угол
+24 dword: ширина исходного прямоугольника
+28 dword: высота исходного прямоугольника
+32: dword: данные bitmap - должны быть 32bpp
+36: dword: размер строки bitmap в байтах
Возвращаемое значение:
* функция не возвращает значения
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_BLITTER (73)
2013-07-25 14:27:56 +02:00
======================================================================
=================== Функция 74, подфункция -1 ========================
=========== Получить количество активных сетевых устройств. ==========
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = -1 - номер подфункции
Возвращаемое значение:
* eax = количество активных сетевых устройств
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_DEVICE_COUNT (255)
2013-07-25 14:27:56 +02:00
======================================================================
==== Функция 74, подфункция 0, Получить тип сетевого устройства. =====
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 0 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = тип устройства
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_DEVICE_TYPE (0)
2013-07-25 14:27:56 +02:00
======================================================================
==== Функция 74, подфункция 1, Получить имя сетевого устройства. =====
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 1 - номер подфункции
* bh = номер устройства
2016-08-15 19:02:18 +02:00
* ecx = указатель на буфера - 64 байт
2013-07-25 14:27:56 +02:00
Возвращаемое значение:
* eax = -1 для ошибки
* В случае успеха в буфер записывается имя сетевого устройства
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_DEVICE_NAME (1)
2013-07-25 14:27:56 +02:00
======================================================================
======= Функция 74, подфункция 2, С б р о с сетевого устройства. =========
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 2 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = -1 для ошибки
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_RESET_DEVICE (2)
2013-07-25 14:27:56 +02:00
======================================================================
====== Функция 74, подфункция 3, Остановить сетевое устройство. ======
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 3 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = -1 для ошибки
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_STOP_DEVICE (3)
2015-12-17 23:50:34 +01:00
======================================================================
===== Функция 74, подфункция 4, Получить указатель на устройство =====
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 4 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = указатель, -1 для ошибки
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
2020-02-17 03:52:27 +01:00
bl - SSF_DEVICE_POINTER (4)
2015-12-17 23:50:34 +01:00
======================================================================
=== Функция 74, подфункция 6, Получить количество посланых пакетов ===
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 6 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = количество с момента старта устройства, -1 для ошибки
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_TX_PACKET_COUNT (6)
2015-12-17 23:50:34 +01:00
======================================================================
=== Функция 74, подфункция 7, Получить количество принятых пакетов ===
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 7 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = количество с момента старта устройства, -1 для ошибки
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_RX_PACKET_COUNT (7)
2015-12-17 23:50:34 +01:00
======================================================================
==== Функция 74, подфункция 8, Получить количество посланых байт. ====
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 8 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = количество с момента старта устройства, -1 для ошибки
* ebx = старшая часть
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_TX_BYTE_COUNT (8)
2015-12-17 23:50:34 +01:00
======================================================================
==== Функция 74, подфункция 9, Получить количество принятых байт. ====
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 9 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = количество с момента старта устройства, -1 для ошибки
* ebx = старшая часть
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_RX_BYTE_COUNT (9)
2015-12-17 23:50:34 +01:00
======================================================================
======= Функция 74, подфункция 10, Получить статус соединения. =======
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 10 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = статус соединения, -1 для ошибки
Статусы:
0 = нет соединения
1 = неизвестное соединение
4 = 10 Мбит
8 = 100 Мбит
12 = 1 Гбит
10b = флаг полного дуплекса
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_LINK_STATUS (10)
2013-07-25 14:27:56 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
== Функция 74.11, Получить количество пакетов переданных с ошибкой. ==
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
Параметры:
* eax = 74 - номер функции
* bl = 11 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = Количество ошибочных пакетов, переданных с момента запуска
устройства, -1 при ошибке
2021-07-07 21:26:17 +02:00
2021-07-13 12:30:43 +02:00
---------------------- Константы для регистров: ----------------------
2021-07-07 21:26:17 +02:00
eax - SF_NETWORK_GET (74)
2021-07-13 12:30:43 +02:00
bl - SSF_TX_PACKET_ERROR_COUNT (11)
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
=== Функция 74.12, Получить число пакетов отброшенных при отправке. ==
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
Параметры:
* eax = 74 - номер функции
* bl = 12 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = число отброшенных пакетов с момента запуска устройства,
-1 при ошибке
2021-07-07 21:26:17 +02:00
2021-07-13 12:30:43 +02:00
---------------------- Константы для регистров: ----------------------
2021-07-07 21:26:17 +02:00
eax - SF_NETWORK_GET (74)
2021-07-13 12:30:43 +02:00
bl - SSF_TX_PACKET_DROP_COUNT (12)
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
=== Функция 74.13, Получить число пакетов утерянных при отправке. ====
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
Параметры:
* eax = 74 - номер функции
* bl = 13 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = число утерянных пакетов с момента запуска устройства,
-1 при ошибке
2021-07-07 21:26:17 +02:00
2021-07-13 12:30:43 +02:00
---------------------- Константы для регистров: ----------------------
2021-07-07 21:26:17 +02:00
eax - SF_NETWORK_GET (74)
2021-07-13 12:30:43 +02:00
bl - SSF_TX_PACKET_MISS_COUNT (13)
2021-07-07 21:26:17 +02:00
2021-07-13 12:30:43 +02:00
======================================================================
==== Функция 74.14, Получить число пакетов полученных с ошибкой. =====
======================================================================
Параметры:
* eax = 74 - номер функции
* bl = 14 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = число пакетов, полученных с ошибкой с момента запуска
устройства, -1 при ошибке
---------------------- Константы для регистров: ----------------------
2021-07-07 21:26:17 +02:00
eax - SF_NETWORK_GET (74)
2021-07-13 12:30:43 +02:00
bl - SSF_RX_PACKET_ERROR_COUNT (14)
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
== Функция 74.15, Получить число пакетов отброшенных при получении. ==
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
Параметры:
* eax = 74 - номер функции
* bl = 15 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = число отброшенных пакетов с момента запуска устройства,
-1 при ошибке
2021-07-07 21:26:17 +02:00
2021-07-13 12:30:43 +02:00
---------------------- Константы для регистров: ----------------------
2021-07-07 21:26:17 +02:00
eax - SF_NETWORK_GET (74)
2021-07-13 12:30:43 +02:00
bl - SSF_RX_PACKET_DROP_COUNT (12)
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
=== Функция 74.16, Получить число пакетов утерянных при получении. ===
2021-07-07 21:26:17 +02:00
======================================================================
2021-07-13 12:30:43 +02:00
Параметры:
* eax = 74 - номер функции
* bl = 16 - номер подфункции
* bh = номер устройства
Возвращаемое значение:
* eax = число утерянных пакетов с момента запуска устройства,
-1 при ошибке
2021-07-07 21:26:17 +02:00
2021-07-13 12:30:43 +02:00
---------------------- Константы для регистров: ----------------------
2021-07-07 21:26:17 +02:00
eax - SF_NETWORK_GET (74)
2021-07-13 12:30:43 +02:00
bl - SSF_RX_PACKET_MISS_COUNT (16)
2021-07-07 21:26:17 +02:00
======================================================================
2016-02-15 20:48:46 +01:00
============== Функция 75, подфункция 0, Открыть сокет. ==============
2013-07-25 14:27:56 +02:00
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 0 - номер подфункции
* ecx = домен
* edx = тип
* esi = протокол
Возвращаемое значение:
* eax = номер сокета, -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_OPEN (0)
2013-07-25 14:27:56 +02:00
======================================================================
2016-02-15 20:48:46 +01:00
============== Функция 75, подфункция 1, Закрыть сокет. ==============
2013-07-25 14:27:56 +02:00
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 1 - номер подфункции
* ecx = номер сокета
Возвращаемое значение:
* eax = -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_CLOSE (1)
2013-07-25 14:27:56 +02:00
======================================================================
============= Функция 75, подфункция 2, Bind (Привязка). =============
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 2 - номер подфункции
* ecx = номер сокета
* edx = указатель на структуру sockaddr
* esi = длина структуры sockaddr
2016-11-15 13:33:12 +01:00
Формат структуры SockAddr:
* +0: Word: Family
* +2: 14*Byte: Data
2013-07-25 14:27:56 +02:00
Возвращаемое значение:
* eax = -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_BIND (2)
2013-07-25 14:27:56 +02:00
======================================================================
============ Функция 75, подфункция 3, Listen (Слушать). =============
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 3 - номер подфункции
* ecx = номер сокета
* edx = backlog (возвращаемый лог)
Возвращаемое значение:
* eax = -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_LISTEN (3)
2013-07-25 14:27:56 +02:00
======================================================================
========== Функция 75, подфункция 4, Connect (Соединение). ===========
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 4 - номер подфункции
* ecx = номер сокета
* edx = указатель на структуру sockaddr
* esi = длина структуры sockaddr
2016-11-15 13:33:12 +01:00
Формат структуры SockAddr:
* +0: Word: Family
2016-11-25 16:11:25 +01:00
* +2: 14*Byte: Data
2013-07-25 14:27:56 +02:00
Возвращаемое значение:
* eax = -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_CONNECT (4)
2013-07-25 14:27:56 +02:00
======================================================================
=========== Функция 75, подфункция 5, Accept (Соглашение). ===========
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 5 - номер подфункции
* ecx = номер сокета
* edx = указатель на структуру sockaddr
* esi = длина структуры sockaddr
2016-11-15 13:33:12 +01:00
Формат структуры SockAddr:
* +0: Word: Family
2016-11-25 16:11:25 +01:00
* +2: 14*Byte: Data
2013-07-25 14:27:56 +02:00
Возвращаемое значение:
2013-08-10 23:43:13 +02:00
* eax = номер сокета из принятого сокета, -1 для ошибки
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_ACCEPT (5)
2013-07-25 14:27:56 +02:00
======================================================================
============= Функция 75, подфункция 6, Send (Послать). ==============
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 6 - номер подфункции
* ecx = номер сокета
* edx = указатель на буфер
* esi = длина буфера
2013-08-10 23:43:13 +02:00
* edi = флаги
2013-07-25 14:27:56 +02:00
Возвращаемое значение:
* eax = количество скопированных байтов, -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_SEND (6)
2013-07-25 14:27:56 +02:00
======================================================================
============ Функция 75, подфункция 7, Receive (Получить). ===========
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 7 - номер подфункции
* ecx = номер сокета
* edx = указатель на буфер
* esi = длина буфера
* edi = флаги
Возвращаемое значение:
* eax = количество скопированных байтов, -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_RECEIVE (7)
2013-07-25 14:27:56 +02:00
======================================================================
2016-02-15 20:48:46 +01:00
=========== Функция 75, подфункция 8, Задать опции сокета. ===========
2013-07-25 14:27:56 +02:00
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 8 - номер подфункции
* ecx = номер сокета
* edx = указатель на optstruct
Возвращаемое значение:
* eax = -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
Замечания:
Optstruct: dd level
dd optionname
dd optlength
db options...
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_SET_OPTIONS (8)
2013-07-25 14:27:56 +02:00
======================================================================
2016-02-15 20:48:46 +01:00
========== Функция 75, подфункция 9, Получить опции сокета. ==========
2013-07-25 14:27:56 +02:00
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 9 - номер подфункции
* ecx = номер сокета
* edx = указатель на optstruct
Возвращаемое значение:
* eax = -1 для ошибки
2013-08-10 23:43:13 +02:00
* ebx = код ошибки
2013-07-25 14:27:56 +02:00
Замечания:
Optstruct: dd level
dd optionname
dd optlength
db options...
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_GET_OPTIONS (9)
2013-07-25 14:27:56 +02:00
======================================================================
2016-02-15 20:48:46 +01:00
========== Функция 75, подфункция 10, Получить парный сокет ==========
2013-07-25 14:27:56 +02:00
======================================================================
Параметры:
* eax = 75 - номер функции
* bl = 10 - номер подфункции
Возвращаемое значение:
2016-02-15 20:48:46 +01:00
* eax = номер первого сокета / -1 для ошибки
* ebx = номер второго сокета / код ошибки
2013-07-25 14:27:56 +02:00
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_GET_PAIR (10)
======================================================================
=============== Функция 76, Сетевые опции и статистика. ==============
======================================================================
Параметры:
* eax = 76 - номер функции
* верхняя часть ebx = номер протокола
* bh = номер устройства
* bl = номер подфункции
2016-02-15 20:48:46 +01:00
Протоколы и подфункции:
0 - Ethernet:
2016-01-12 12:45:46 +01:00
0 - Read MAC
2016-02-15 20:48:46 +01:00
общие подфункции:
0 - пакетов послано
1 - пакетов принято
1 - IPv4:
2016-01-12 12:45:46 +01:00
2 - Read IP
3 - Write IP
4 - Read DNS
5 - Write DNS
6 - Read subnet
7 - Write subnet
8 - Read gateway
9 - Write gateway
2016-02-15 20:48:46 +01:00
2 - ICMP:
2016-01-12 12:45:46 +01:00
3 - enable/disable ICMP echo reply
2016-02-15 20:48:46 +01:00
3 - UDP
4 - TCP
5 - ARP:
2016-01-12 12:45:46 +01:00
2 - Read # ARP entry's
3 - Read ARP entry
4 - Add static ARP entry
5 - Remove ARP entry (-1 = remove all)
6 - Send ARP announce on specified interface
7 - Read # ARP conflicts (IP address conflicts)
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_PROTOCOL (76)
2013-05-28 00:16:00 +02:00
======================================================================
2016-02-15 20:48:46 +01:00
============= Функция 77, подфункция 0, Создать фьютекс. =============
======================================================================
Параметры:
* eax = 77 - номер функции
* ebx = 0 - номер подфункции
* ecx = указатель на контрольное значение фьютекса (dword)
Возвращаемое значение:
* eax = дескриптор фьютекса, 0 при ошибке
---------------------- Константы для регистров: ----------------------
eax - SF_FUTEX (77)
ebx - SSF_CREATE (0)
======================================================================
============= Функция 77, подфункция 1, Удалить фьютекс. =============
======================================================================
Параметры:
* eax = 77 - номер функции
* ebx = 1 - номер подфункции
* ecx = дескриптор фьютекса
Возвращаемое значение:
* eax = 0 - успешно, -1 при ошибке
Замечания:
* Ядро автоматически удаляет фьютексы при завершении процесса.
---------------------- Константы для регистров: ----------------------
eax - SF_FUTEX (77)
ebx - SSF_DESTROY (1)
======================================================================
================= Функция 77, подфункция 2, Ожидать. =================
======================================================================
Параметры:
* eax = 77 - номер функции
* ebx = 2 - номер подфункции
* ecx = дескриптор фьютекса
* edx = контрольное значение
* esi = таймаут в сотых секунды, 0 - ждать бесконечно
Возвращаемое значение:
* eax = 0 - успешно, -1 - таймаут,
-2 - контрольное значение не соответствует
---------------------- Константы для регистров: ----------------------
eax - SF_FUTEX (77)
ebx - SSF_WAIT (2)
======================================================================
================ Функция 77, подфункция 3, Разбудить. ================
======================================================================
Параметры:
* eax = 77 - номер функции
* ebx = 3 - номер подфункции
* ecx = дескриптор фьютекса
* edx = сколько ожидающих будить (максимум)
Возвращаемое значение:
* eax = количество разбуженых
---------------------- Константы для регистров: ----------------------
eax - SF_FUTEX (77)
ebx - SSF_WAKE (3)
======================================================================
2022-06-05 00:48:35 +02:00
======= Функция 77, подфункция 10, Прочитать из файла в буфер. =======
======================================================================
Параметры:
* eax = 77 - номер функции
* ebx = 10 - номер подфункции
* ecx = дескриптор файла
* edx = указатель на буфер, куда читать
* esi = сколько байт прочитать
Возвращаемое значение:
* eax = количество прочитанных байт
---------------------- Константы для регистров: ----------------------
eax - SF_FUTEX (77)
ebx - ...
======================================================================
======== Функция 77, подфункция 11, Записать из буфера в файл. =======
======================================================================
Параметры:
* eax = 77 - номер функции
* ebx = 11 - номер подфункции
* ecx = дескриптор файла
* edx = указатель на буфер, откуда брать данные для записи
* esi = сколько байт записать
Возвращаемое значение:
* eax = количество записанных байт
---------------------- Константы для регистров: ----------------------
eax - SF_FUTEX (77)
ebx - ...
======================================================================
=========== Функция 77, подфункция 13, Создать новый pipe. ===========
======================================================================
Создает новый pipe. В 4 байта по адресу pipefd будет записан
дескриптор для чтения из канала.
В 4 байта по адресу pipefd + 4 будет записан дескриптор для записи в
канал.
Параметры:
* eax = 77 - номер функции
* ebx = 13 - номер подфункции
* ecx = адрес pipefd
* edx = флаги. Н а данный момент если поднят O_CLOEXEC (0x40000), то
сисфункция завершится с ошибкой. Поэтому в качестве флагов можно
передать просто 0.
Возвращаемое значение:
* eax = 0 если успех, иначе ошибка.
---------------------- Константы для регистров: ----------------------
eax - SF_FUTEX (77)
ebx - ...
======================================================================
2013-05-28 00:16:00 +02:00
========== Функция -1 - завершить выполнение потока/процесса =========
======================================================================
Параметры:
* eax = -1 - номер функции
Возвращаемое значение:
* функция не возвращает ни значения, ни управления
Замечания:
* Если процесс явно не создавал потоков, то у него есть только
один поток, завершение которого приводит к завершению процесса.
* Если текущий поток - последний в процессе, то е г о завершение
также приводит к завершению процесса.
* Эта функция завершает текущий поток. Другой поток можно прибить
вызовом подфункции 2 функции 18.
2016-01-12 12:45:46 +01:00
---------------------- Константы для регистров: ----------------------
eax - SF_TERMINATE_PROCESS (-1)
2013-05-28 00:16:00 +02:00
======================================================================
2016-12-15 18:38:17 +01:00
=== Функция 80 - работа с файловой системой с указанием кодировки. ===
======================================================================
Параметры:
* eax = 80
* ebx = указатель на информационную структуру
Возвращаемое значение:
* eax = 0 - успешно; иначе код ошибки файловой системы
* в зависимости от подфункции может возвращаться значение и
в других регистрах
Общий формат информационной структуры:
* +0: dword: номер подфункции
* +4: dword: смещение в файле или папке
* +8: dword: старшая часть смещения или поле флагов
* +12 = +0xC: dword: размер данных
* +16 = +0x10: dword: указатель на данные
* +20 = +0x14: dword: кодировка строки:
1 = cp866
2 = UTF-16LE
3 = UTF-8
0 = по умолчанию (поддерживает байт кодировки в начале строки)
* +24 = +0x18: dword: указатель на строку пути (заканчивается нулём)
В остальном полностью соответствует функции 70.
======================================================================
2013-05-28 00:16:00 +02:00
=========================== Список событий ===========================
======================================================================
Очередное событие можно получить вызовом одной из функций 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 = успешно
* 2 = функция не поддерживается для данной файловой системы
* 3 = неизвестная файловая система
* 5 = файл не найден
* 6 = файл закончился
* 7 = указатель вне памяти приложения
* 8 = диск заполнен
2016-02-15 20:48:46 +01:00
* 9 = ошибка файловой системы
2013-05-28 00:16:00 +02:00
* 10 = доступ запрещён
* 11 = ошибка устройства
2016-02-15 20:48:46 +01:00
* 12 = файловой системе недостаточно оперативной памяти
2013-05-28 00:16:00 +02:00
При запуске программы возможны также следующие коды ошибок:
* 30 = 0x1E = недостаточно памяти
* 31 = 0x1F = файл не является исполнимым
* 32 = 0x20 = слишком много процессов