Subversion Repositories Kolibri OS

Rev

Rev 9995 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2455 mario79 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
6272 pathoswith 3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
2455 mario79 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
3539 clevermous 8
СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.7.7.0
77 diamond 9
 
3539 clevermous 10
Номер функции помещается в регистр eax.
11
Вызов системной функции осуществляется командой "int 0x40".
12
Все регистры, кроме явно указанных в возвращаемом значении,
13
    включая регистр флагов eflags, сохраняются.
77 diamond 14
 
15
 
16
======================================================================
3539 clevermous 17
============== Функция 0 - определить и нарисовать окно. =============
77 diamond 18
======================================================================
3539 clevermous 19
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
20
область. Для окон со скином определяет стандартные кнопки закрытия и
21
минимизации.
22
Параметры:
23
  * eax = 0 - номер функции
24
  * ebx = [координата по оси x]*65536 + [размер по оси x]
25
  * ecx = [координата по оси y]*65536 + [размер по оси y]
26
  * edx = 0xXYRRGGBB, где:
27
    * Y = стиль окна:
28
      * Y=1 - только определить область окна, ничего не рисовать
29
      * Y=3 - окно со скином
30
      * Y=4 - окно со скином фиксированных размеров
8018 leency 31
      * Y=0,2 эти стили не должны более использоваться и оставлены
32
              только для совместимости со старыми приложениями
6171 leency 33
      * остальные возможные значения (от 5 до 15) зарезервированы,
34
        вызов функции с такими Y игнорируется
3539 clevermous 35
    * RR, GG, BB = соответственно красная, зеленая, синяя
36
      составляющие цвета рабочей области окна
4051 heavyiron 37
      (игнорируется для стиля Y=1)
3539 clevermous 38
    * X = DCBA (биты)
6168 leency 39
      * A = 1 - у окна есть заголовок
3539 clevermous 40
      * B = 1 - координаты всех графических примитивов задаются
8018 leency 41
                относительно клиентской области окна
3539 clevermous 42
      * C = 1 - не закрашивать рабочую область при отрисовке окна
43
      * D = 0 - нормальная заливка рабочей области, 1 - градиентная
44
    Следующие параметры предназначены для окон типа I и II и
45
    игнорируются для стилей Y=1,3:
46
  * esi = 0xXYRRGGBB - цвет заголовка
47
    * RR, GG, BB определяют сам цвет
8018 leency 48
    * Y = 0 - обычное окно
49
      Y = 1 - неперемещаемое окно (работает для всех стилей окон)
50
    * X определяет градиент заголовка:
51
      X = 0 - нет градиента,
52
      X = 8 - обычный градиент,
3539 clevermous 53
      для окон типа II X=4 - негативный градиент
54
    * прочие значения X и Y зарезервированы
8018 leency 55
  * edi = адрес строки заголовка для стилей Y=3,4 (см. функцию 71.1)
3539 clevermous 56
Возвращаемое значение:
57
  * функция не возвращает значения
58
Замечания:
59
  * Положение и размеры окна устанавливаются при первом вызове
60
    этой функции и игнорируются при последующих; для изменения
61
    положения и/или размеров уже созданного окна используйте
62
    67-ю функцию.
63
  * Для окон стилей Y=3,4 с заголовком (A=1) строка заголовка
64
    устанавливается при первом вызове этой функции и игнорируется при
65
    последующих (точнее говоря, игнорируется после вызова
66
    подфункции 2 функции 12 - конца перерисовки);
67
    для изменения строки заголовка уже созданного окна используйте
68
    подфункцию 1 функции 71.
69
  * Если использовать окна соответствующих стилей, то положение
70
    и/или размеры окна могут меняться пользователем.
71
    Текущие положение и размеры могут быть получены вызовом функции 9.
72
  * Окно должно умещаться на экране. Если переданные координаты
73
    и размеры не удовлетворяют этому условию, то соответствующая
74
    координата (или, возможно, обе) считается нулем, а если и это
75
    не помогает, то соответствующий размер (или, возможно, оба)
76
    устанавливается в размер экрана.
3780 Serge 77
 
3539 clevermous 78
    Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые
79
    в ebx,ecx. Координаты приводятся относительно левого верхнего
80
    угла окна, который, таким образом, задается как (0,0), координаты
81
    правого нижнего угла суть (xsize,ysize).
82
  * Размеры окна понимаются в смысле координат правого нижнего угла.
83
    Это же относится и ко всем остальным функциям.
84
    Это означает, что реальные размеры на 1 пиксель больше.
85
  * Вид окна стиля Y=1:
86
    * полностью определяется приложением
6168 leency 87
  * Вид окна со скином Y=3,4:
3539 clevermous 88
    * рисуется внешняя рамка шириной 1 пиксель
89
      цвета 'outer' из скина
90
    * рисуется промежуточная рамка шириной 3 пикселя
91
      цвета 'frame' из скина
92
    * рисуется внутренняя рамка шириной 1 пиксель
93
      цвета 'inner' из скина
94
    * рисуется заголовок (по картинкам из скина) в прямоугольнике
77 diamond 95
      (0,0) - (xsize,_skinh-1)
3539 clevermous 96
    * если ysize>=26, то закрашивается рабочая область окна -
97
      прямоугольник с левым верхним углом (5,_skinh) и правым нижним
98
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
99
    * определяются две стандартные кнопки: закрытия и минимизации
100
      (смотри функцию 8)
101
    * если A=1 и в edi (ненулевой) указатель на строку заголовка,
102
      то она выводится в заголовке в месте, определяемом скином
103
    * Значение переменной _skinh доступно как результат вызова
104
      подфункции 4 функции 48
77 diamond 105
 
6056 IgorA 106
---------------------- Константы для регистров: ----------------------
107
  eax - SF_CREATE_WINDOW (0)
77 diamond 108
======================================================================
3539 clevermous 109
================= Функция 1 - поставить точку в окне. ================
77 diamond 110
======================================================================
3539 clevermous 111
Параметры:
112
  * eax = 1 - номер функции
113
  * ebx = x-координата (относительно окна)
114
  * ecx = y-координата (относительно окна)
115
  * edx = 0x00RRGGBB - цвет точки
116
    edx = 0x01xxxxxx - инвертировать цвет точки
117
          (младшие 24 бита игнорируются)
118
Возвращаемое значение:
119
  * функция не возвращает значения
77 diamond 120
 
6056 IgorA 121
---------------------- Константы для регистров: ----------------------
122
  eax - SF_PUT_PIXEL (1)
77 diamond 123
======================================================================
3539 clevermous 124
============== Функция 2 - получить код нажатой клавиши. =============
77 diamond 125
======================================================================
3539 clevermous 126
Забирает код нажатой клавиши из буфера.
127
Параметры:
128
  * eax = 2 - номер функции
129
Возвращаемое значение:
130
  * если буфер пуст, возвращается eax=1
131
  * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
4612 mario79 132
    биты 16-23 содержат сканкод нажатой клавиши в режиме ASCII,
7722 dunkaist 133
               в режиме сканкодов биты обнулены.
4588 mario79 134
    биты 23-31 обнулены
3539 clevermous 135
  * если есть "горячая клавиша", то возвращается
136
    al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
137
    старшее слово регистра eax содержит состояние управляющих клавиш
138
    в момент нажатия горячей клавиши
139
Замечания:
140
  * Существует общесистемный буфер нажатых клавиш размером 120 байт,
141
    организованный как очередь.
142
  * Существует ещё один общесистемный буфер на 120 "горячих клавиш".
143
  * При вызове этой функции приложением с неактивным окном
144
    считается, что буфер нажатых клавиш пуст.
145
  * По умолчанию эта функция возвращает ASCII-коды; переключиться на
146
    режим сканкодов (и назад) можно с использованием функции 66.
147
    Однако, горячие клавиши всегда возвращаются как сканкоды.
148
  * Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
149
    запустив приложения keyascii и scancode.
150
  * Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
151
    ASCII-коды получаются с использованием таблиц преобразования,
152
    которые можно установить подфункцией 2 функции 21 и прочитать
153
    подфункцией 2 функции 26.
154
  * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
155
    (rus/en) в отличие от сканкодов.
156
  * Поступает информация только о тех горячих клавишах, которые были
157
    определены этим потоком подфункцией 4 функции 66.
77 diamond 158
 
6056 IgorA 159
---------------------- Константы для регистров: ----------------------
160
  eax - SF_GET_KEY (2)
77 diamond 161
======================================================================
3539 clevermous 162
================ Функция 3 - получить системное время. ===============
77 diamond 163
======================================================================
3539 clevermous 164
Параметры:
165
  * eax = 3 - номер функции
166
Возвращаемое значение:
167
  * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
168
  * каждый элемент возвращается как BCD-число, например,
169
    для времени 23:59:59 результат будет 0x00595923
170
Замечания:
171
  * Смотри также подфункцию 9 функции 26 - получение времени
172
    с момента запуска системы; она во многих случаях удобнее,
173
    поскольку возвращает просто DWORD-значение счетчика времени.
174
  * Системное время можно установить функцией 22.
77 diamond 175
 
6056 IgorA 176
---------------------- Константы для регистров: ----------------------
177
  eax - SF_GET_SYS_TIME (3)
77 diamond 178
======================================================================
5848 pathoswith 179
================ Функция 4 - нарисовать строку текста. ===============
77 diamond 180
======================================================================
3539 clevermous 181
Параметры:
182
  * eax = 4 - номер функции
5848 pathoswith 183
  * ebx = X*65536+Y, координаты в окне или буфере
184
  * ecx = 0xXXRRGGBB, где
3539 clevermous 185
    * RR, GG, BB задают цвет текста
5848 pathoswith 186
    * XX=ABFFCSSS (биты):
187
      * A=1 - рисуемая строка заканчивается нулём
188
      * B=1 - закрашивать фон (цвет = edi)
5682 leency 189
      * FF задает шрифт и кодировку:
190
 
5867 pathoswith 191
        1 = 8x16 cp866
5682 leency 192
        2 = 8x16 UTF-16LE
193
        3 = 8x16 UTF-8
5848 pathoswith 194
      * C=0 - рисовать в окно,
195
        С=1 - рисовать в буфер (edi)
196
      * SSS = (множитель размера)-1, то-есть 0 = x1, 7 = x8
3539 clevermous 197
  * edx = указатель на начало строки
5682 leency 198
  * esi = для A=0 длина строки, для A=1 игнорируется
5848 pathoswith 199
  * edi = если B=1 - цвет для закраски фона,
200
          если C=1 - указатель на буфер
5682 leency 201
 
3539 clevermous 202
Возвращаемое значение:
203
  * функция не возвращает значения
204
Замечания:
5682 leency 205
  * Нельзя одновременно использовать B=1 и C=1,
206
    поскольку в обоих случаях используется регистр edi.
5848 pathoswith 207
  * Если SSS=0, шрифт может сглаживаться,
208
    в зависимости от системной настройки.
209
  * Структура буфера:
210
Xsize       dd
211
Ysize       dd
212
picture     rb  Xsize*Ysize*4  ; 32 бита
5682 leency 213
 
6056 IgorA 214
---------------------- Константы для регистров: ----------------------
215
  eax - SF_DRAW_TEXT (4)
77 diamond 216
======================================================================
3539 clevermous 217
========================= Функция 5 - пауза. =========================
77 diamond 218
======================================================================
3539 clevermous 219
Задерживает выполнение программы на заданное время.
220
Параметры:
221
  * eax = 5 - номер функции
222
  * ebx = время в сотых долях секунды
223
Возвращаемое значение:
224
  * функция не возвращает значения
225
Замечания:
226
  * Передача ebx=0 не передает управление следующему процессу и
227
    вообще не производит никаких действий. Если действительно
228
    требуется передать управление следующему процессу
229
    (закончить текущий квант времени), используйте подфункцию 1
230
    функции 68.
77 diamond 231
 
6056 IgorA 232
---------------------- Константы для регистров: ----------------------
233
  eax - SF_SLEEP (5)
77 diamond 234
======================================================================
3539 clevermous 235
=============== Функция 7 - вывести изображение в окно. ==============
77 diamond 236
======================================================================
3539 clevermous 237
Параметры:
238
  * eax = 7 - номер функции
239
  * ebx = указатель на изображение в формате BBGGRRBBGGRR...
240
  * ecx = [размер по оси x]*65536 + [размер по оси y]
241
  * edx = [координата по оси x]*65536 + [координата по оси y]
242
Возвращаемое значение:
243
  * функция не возвращает значения
244
Замечания:
245
  * Координаты изображения - это координаты верхнего левого угла
246
    изображения относительно окна.
247
  * Размер изображения в байтах есть 3*xsize*ysize.
77 diamond 248
 
6056 IgorA 249
---------------------- Константы для регистров: ----------------------
250
  eax - SF_PUT_IMAGE (7)
77 diamond 251
======================================================================
3539 clevermous 252
=============== Функция 8 - определить/удалить кнопку. ===============
77 diamond 253
======================================================================
3539 clevermous 254
Параметры для определения кнопки:
255
  * eax = 8 - номер функции
256
  * ebx = [координата по оси x]*65536 + [размер по оси x]
257
  * ecx = [координата по оси y]*65536 + [размер по оси y]
258
  * edx = 0xXYnnnnnn, где:
259
    * nnnnnn = идентификатор кнопки
260
    * старший (31-й) бит edx сброшен
261
    * если 30-й бит edx установлен - не прорисовывать кнопку
262
    * если 29-й бит edx установлен - не рисовать рамку
263
      при нажатии на кнопку
264
  * esi = 0x00RRGGBB - цвет кнопки
265
Параметры для удаления кнопки:
266
  * eax = 8 - номер функции
267
  * edx = 0x80nnnnnn, где nnnnnn - идентификатор кнопки
268
Возвращаемое значение:
269
  * функция не возвращает значения
270
Замечания:
271
  * Размеры кнопки должны быть больше 0 и меньше 0x8000.
272
  * Для окон со скином при определении окна (вызове 0-й функции)
273
    создаются две стандартные кнопки - закрытия окна
274
    с идентификатором 1 и минимизации окна с идентификатором 0xffff.
275
  * Создание двух кнопок с одинаковыми идентификаторами
276
    вполне допустимо.
277
  * Кнопка с идентификатором 0xffff при нажатии интерпретируется
278
    системой как кнопка минимизации, система обрабатывает такое
279
    нажатие самостоятельно, не обращаясь к приложению.
280
    В остальном это обычная кнопка.
281
  * Общее количество кнопок для всех приложений ограничено
282
    числом 4095.
77 diamond 283
 
6056 IgorA 284
---------------------- Константы для регистров: ----------------------
285
  eax - SF_DEFINE_BUTTON (8)
77 diamond 286
======================================================================
3539 clevermous 287
============= Функция 9 - информация о потоке выполнения. ============
77 diamond 288
======================================================================
3539 clevermous 289
Параметры:
290
  * eax = 9 - номер функции
291
  * ebx = указатель на буфер размера 1 Кб
292
  * ecx = номер слота потока
293
    ecx = -1 - получить информацию о текущем потоке
294
Возвращаемое значение:
295
  * eax = максимальный номер слота потока
8246 rgimad 296
    но, если указатель в ebx недопустимый, например,
297
    регион [ebx, ebx + 0x4C) пересекается с памятью ядра,
298
    то тогда функция возвращает -1
3539 clevermous 299
  * буфер, на который указывает ebx, содержит следующую информацию:
300
    * +0: dword: использование процессора (сколько тактов в секунду
301
      уходит на исполнение именно этого потока)
302
    * +4: word: позиция окна потока в оконном стэке
303
    * +6: word: (не имеет отношения к запрошенному потоку)
304
      номер слота потока, окно которого находится в оконном стэке
305
      в позиции ecx
306
    * +8: word: зарезервировано
307
    * +10 = +0xA: 11 байт: имя процесса
308
      (имя запущенного файла - исполняемый файл без расширения)
309
    * +21 = +0x15: byte: зарезервировано, этот байт не изменяется
310
    * +22 = +0x16: dword: адрес процесса в памяти
311
    * +26 = +0x1A: dword: размер используемой памяти - 1
312
    * +30 = +0x1E: dword: идентификатор (PID/TID)
313
    * +34 = +0x22: dword: координата окна потока по оси x
314
    * +38 = +0x26: dword: координата окна потока по оси y
315
    * +42 = +0x2A: dword: размер окна потока по оси x
316
    * +46 = +0x2E: dword: размер окна потока по оси y
317
    * +50 = +0x32: word: состояние слота потока:
318
      * 0 = поток выполняется
319
      * 1 = поток приостановлен
320
      * 2 = поток приостановлен в момент ожидания события
321
      * 3 = поток завершается в результате вызова функции -1 или
322
        насильственно как следствие вызова подфункции 2 функции 18
323
        или завершения работы системы
324
      * 4 = поток завершается в результате исключения
325
      * 5 = поток ожидает события
326
      * 9 = запрошенный слот свободен, вся остальная информация о
327
        слоте не имеет смысла
328
    * +52 = +0x34: word: зарезервировано, это слово не изменяется
329
    * +54 = +0x36: dword: координата начала клиентской области
330
                          по оси x
331
    * +58 = +0x3A: dword: координата начала клиентской области
332
                          по оси y
333
    * +62 = +0x3E: dword: ширина клиентской области
334
    * +66 = +0x42: dword: высота клиентской области
335
    * +70 = +0x46: byte: состояние окна - битовое поле
336
      * бит 0 (маска 1): окно максимизировано
337
      * бит 1 (маска 2): окно минимизировано в панель задач
338
      * бит 2 (маска 4): окно свёрнуто в заголовок
339
    * +71 = +0x47: dword: маска событий
4264 0CodErr 340
    * +75 = +0x4B: byte: режим ввода с клавиатуры(ASCII = 0; SCAN = 1)
3539 clevermous 341
Замечания:
342
  * Слоты нумеруются с 1.
343
  * Возвращаемое значение не есть общее число потоков, поскольку
344
    бывают свободные слоты.
345
  * При создании процесса автоматически создается поток выполнения.
346
  * Функция выдает информацию о потоке. Каждый процесс имеет
347
    хотя бы один поток. Один процесс может создать несколько потоков,
348
    в этом случае каждый поток получает свой слот, причем поля
349
    +10, +22, +26 в этих слотах совпадают.
350
    Для приложений не существует общего способа определить,
351
    принадлежат ли два потока одному процессу.
352
  * Активное окно - окно, находящееся на вершине оконного стэка,
353
    оно получает сообщения о вводе с клавиатуры. Для него позиция в
354
    оконном стэке совпадает с возвращаемым значением.
355
  * Слот 1 соответствует специальному потоку операционной системы,
356
    для которого:
357
    * окно находится внизу оконного стэка, поля +4 и +6 содержат
358
      значение 1
9964 dunkaist 359
    * имя процесса - "IDLE" (дополненное пробелами)
3539 clevermous 360
    * адрес процесса в памяти равен 0, размер используемой памяти
77 diamond 361
      16 Mb (0x1000000)
362
    * PID=1
3539 clevermous 363
    * координаты и размеры окна, равно как и клиентской области,
364
      условно полагаются равными 0
365
    * состояние слота - всегда 0 (выполняется)
366
    * время выполнения складывается из времени, уходящего на
367
      собственно работу, и времени простоя в ожидании прерывания
368
      (которое можно получить вызовом подфункции 4 функции 18).
9964 dunkaist 369
  * Слот 2 (и некоторые другие) соответствуют специальным потокам
370
    операционной системы, для которых:
371
    * имя процесса - "OS" (дополненное пробелами)
3539 clevermous 372
  * Обычные приложения размещаются в памяти по адресу 0
373
    (константа ядра std_application_base_address).
374
    Наложения не происходит, поскольку у каждого процесса своя
375
    таблица страниц.
376
  * При создании потока ему назначаются слот в системной таблице и
377
    идентификатор (Process/Thread IDentifier = PID/TID), которые для
378
    заданного потока не изменяются со временем.
379
    После завершения потока его слот может быть заново использован
380
    для другого потока. Идентификатор потока не может быть назначен
381
    другому потоку даже после завершения первого.
382
    Назначаемые новым потокам идентификаторы монотонно растут.
383
  * Если поток еще не определил свое окно вызовом функции 0, то
384
    положение и размеры этого окна полагаются нулями.
385
  * Координаты клиентской области окна берутся относительно окна.
386
  * В данный момент используется только часть буфера размером
4264 0CodErr 387
    76 = 0x4C байта. Тем не менее рекомендуется использовать буфер
3539 clevermous 388
    размером 1 Кб для будущей совместимости, в будущем могут быть
389
    добавлены некоторые поля.
77 diamond 390
 
6056 IgorA 391
---------------------- Константы для регистров: ----------------------
392
  eax - SF_THREAD_INFO (9)
77 diamond 393
======================================================================
3539 clevermous 394
==================== Функция 10 - ожидать события. ===================
77 diamond 395
======================================================================
3539 clevermous 396
Если очередь сообщений пуста, то ждет появления сообщения в очереди.
397
В таком состоянии поток не получает процессорного времени.
398
Затем считывает сообщение из очереди.
77 diamond 399
 
3539 clevermous 400
Параметры:
401
  * eax = 10 - номер функции
402
Возвращаемое значение:
403
  * eax = событие (смотри список событий)
404
Замечания:
405
  * Учитываются только те события, которые входят в маску,
406
    устанавливаемую функцией 40. По умолчанию это события
407
    перерисовки, нажатия на клавиши и на кнопки.
408
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
409
    Чтобы ждать не более определенного времени, используйте
410
    функцию 23.
77 diamond 411
 
6056 IgorA 412
---------------------- Константы для регистров: ----------------------
413
  eax - SF_WAIT_EVENT (10)
77 diamond 414
======================================================================
3539 clevermous 415
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
77 diamond 416
======================================================================
3539 clevermous 417
Если в очереди сообщений есть какое-то событие, то считывает и
418
возвращает его. Если очередь пуста, возвращает нуль.
419
Параметры:
420
  * eax = 11 - номер функции
421
Возвращаемое значение:
422
  * eax = 0 - очередь сообщений пуста
423
  * иначе eax = событие (смотри список событий)
424
Замечания:
425
  * Учитываются только те события, которые входят в маску,
426
    устанавливаемую функцией 40. По умолчанию это события
427
    перерисовки, нажатия на клавиши и на кнопки.
428
  * Для ожидания появления события в очереди, используйте функцию 10.
429
    Чтобы ждать не более определенного времени, используйте
430
    функцию 23.
77 diamond 431
 
6056 IgorA 432
---------------------- Константы для регистров: ----------------------
433
  eax - SF_CHECK_EVENT (11)
77 diamond 434
======================================================================
3539 clevermous 435
=========== Функция 12 - начать/закончить перерисовку окна. ==========
77 diamond 436
======================================================================
437
 
3539 clevermous 438
-------------- Подфункция 1 - начать перерисовку окна. ---------------
439
Параметры:
440
  * eax = 12 - номер функции
441
  * ebx = 1 - номер подфункции
442
Возвращаемое значение:
443
  * функция не возвращает значения
77 diamond 444
 
3539 clevermous 445
------------- Подфункция 2 - закончить перерисовку окна. -------------
446
Параметры:
447
  * eax = 12 - номер функции
448
  * ebx = 2 - номер подфункции
449
Возвращаемое значение:
450
  * функция не возвращает значения
451
Замечания:
452
  * Функция начала перерисовки удаляет все определённые
453
    функцией 8 кнопки, их следует определить повторно.
77 diamond 454
 
6056 IgorA 455
---------------------- Константы для регистров: ----------------------
456
  eax - SF_REDRAW (12)
457
  ebx - SSF_BEGIN_DRAW (1), SSF_END_DRAW (2)
77 diamond 458
======================================================================
3539 clevermous 459
============ Функция 13 - нарисовать прямоугольник в окне. ===========
77 diamond 460
======================================================================
3539 clevermous 461
Параметры:
462
  * eax = 13 - номер функции
463
  * ebx = [координата по оси x]*65536 + [размер по оси x]
464
  * ecx = [координата по оси y]*65536 + [размер по оси y]
465
  * edx = цвет 0xRRGGBB или 0x80RRGGBB для градиентной заливки
466
Возвращаемое значение:
467
  * функция не возвращает значения
468
Замечания:
469
  * Под координатами понимаются координаты левого верхнего угла
470
    прямоугольника относительно окна.
77 diamond 471
 
6056 IgorA 472
---------------------- Константы для регистров: ----------------------
473
  eax - SF_DRAW_RECT (13)
77 diamond 474
======================================================================
3539 clevermous 475
================ Функция 14 - получить размеры экрана. ===============
77 diamond 476
======================================================================
3539 clevermous 477
Параметры:
478
  * eax = 14 - номер функции
479
Возвращаемое значение:
480
  * eax = [xsize]*65536 + [ysize], где
481
  * xsize = x-координата правого нижнего угла экрана =
482
            размер по горизонтали - 1
483
  * ysize = y-координата правого нижнего угла экрана =
484
            размер по вертикали - 1
485
Замечания:
486
  * Смотри также подфункцию 5 функции 48 - получить размеры рабочей
487
    области экрана.
77 diamond 488
 
6056 IgorA 489
---------------------- Константы для регистров: ----------------------
490
  eax - SF_GET_SCREEN_SIZE (14)
77 diamond 491
======================================================================
3539 clevermous 492
= Функция 15, подфункция 1 - установить размер фонового изображения. =
77 diamond 493
======================================================================
3539 clevermous 494
Параметры:
495
  * eax = 15 - номер функции
496
  * ebx = 1 - номер подфункции
497
  * ecx = ширина изображения
498
  * edx = высота изображения
499
Возвращаемое значение:
500
  * функция не возвращает значения
501
Замечания:
502
  * Вызов функции обязателен перед вызовом подфункций 2 и 5.
503
  * Для обновления экрана (после завершения серии команд, работающих с
504
    фоном) вызывайте подфункцию 3 перерисовки фона.
505
  * Есть парная функция получения размеров фонового изображения -
506
    подфункция 1 функции 39.
77 diamond 507
 
6056 IgorA 508
---------------------- Константы для регистров: ----------------------
509
  eax - SF_BACKGROUND_SET (15)
510
  ebx - SSF_SIZE_BG (1)
77 diamond 511
======================================================================
3539 clevermous 512
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
77 diamond 513
======================================================================
3539 clevermous 514
Параметры:
515
  * eax = 15 - номер функции
516
  * ebx = 2 - номер подфункции
517
  * ecx = смещение
518
  * edx = цвет точки 0xRRGGBB
519
Возвращаемое значение:
520
  * функция не возвращает значения
521
Замечания:
522
  * Смещение для точки с координатами (x,y) вычисляется как
77 diamond 523
    (x+y*xsize)*3.
3539 clevermous 524
  * Если указанное смещение превышает установленный подфункцией 1
525
    размер, вызов игнорируется.
526
  * Для обновления экрана (после завершения серии команд, работающих с
527
    фоном) вызывайте подфункцию 3 перерисовки фона.
528
  * Есть парная функция получения точки с фонового изображения -
529
    подфункция 2 функции 39.
77 diamond 530
 
6056 IgorA 531
---------------------- Константы для регистров: ----------------------
532
  eax - SF_BACKGROUND_SET (15)
533
  ebx - SSF_PIXEL_BG (2)
77 diamond 534
======================================================================
3539 clevermous 535
============ Функция 15, подфункция 3 - перерисовать фон. ============
77 diamond 536
======================================================================
3539 clevermous 537
Параметры:
538
  * eax = 15 - номер функции
539
  * ebx = 3 - номер подфункции
540
Возвращаемое значение:
541
  * функция не возвращает значения
77 diamond 542
 
6056 IgorA 543
---------------------- Константы для регистров: ----------------------
544
  eax - SF_BACKGROUND_SET (15)
545
  ebx - SSF_REDRAW_BG (3)
77 diamond 546
======================================================================
3539 clevermous 547
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
77 diamond 548
======================================================================
3539 clevermous 549
Параметры:
550
  * eax = 15 - номер функции
551
  * ebx = 4 - номер подфункции
552
  * ecx = режим отрисовки:
553
    * 1 = замостить
554
    * 2 = растянуть
555
Возвращаемое значение:
556
  * функция не возвращает значения
557
Замечания:
558
  * Для обновления экрана (после завершения серии команд, работающих с
559
    фоном) вызывайте подфункцию 3 перерисовки фона.
560
  * Есть парная команда получения режима отрисовки фона -
561
    подфункция 4 функции 39.
77 diamond 562
 
6056 IgorA 563
---------------------- Константы для регистров: ----------------------
564
  eax - SF_BACKGROUND_SET (15)
565
  ebx - SSF_MODE_BG (4)
77 diamond 566
======================================================================
3539 clevermous 567
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
77 diamond 568
======================================================================
3539 clevermous 569
Параметры:
570
  * eax = 15 - номер функции
571
  * ebx = 5 - номер подфункции
572
  * ecx = указатель на данные в формате BBGGRRBBGGRR...
573
  * edx = смещение в данных фонового изображения
574
  * esi = размер данных в байтах = 3 * число пикселей
575
Возвращаемое значение:
576
  * функция не возвращает значения
577
Замечания:
578
  * Проверки корректности смещения и размера не производится.
579
  * Цвет каждого пикселя хранится как 3-байтная величина BBGGRR.
580
  * Пиксели фонового изображения записываются последовательно
581
    слева направо, сверху вниз.
582
  * Смещение пикселя с координатами (x,y) есть (x+y*xsize)*3.
583
  * Для обновления экрана (после завершения серии команд, работающих с
584
    фоном) вызывайте подфункцию 3 перерисовки фона.
77 diamond 585
 
6056 IgorA 586
---------------------- Константы для регистров: ----------------------
587
  eax - SF_BACKGROUND_SET (15)
588
  ebx - SSF_IMAGE_BG (5)
77 diamond 589
======================================================================
3539 clevermous 590
====================== Функция 15, подфункция 6 ======================
591
==== Спроецировать данные фона на адресное пространство процесса. ====
546 diamond 592
======================================================================
3539 clevermous 593
Параметры:
594
  * eax = 15 - номер функции
595
  * ebx = 6 - номер подфункции
596
Возвращаемое значение:
597
  * eax = указатель на данные фона, 0 при ошибке
598
Замечания:
599
  * Спроецированные данные доступны на чтение и запись.
600
  * Размер данных фона равен 3*xsize*ysize. Изменение размеров фона
601
    блокируется на время работы с спроецированными данными.
602
  * Цвет каждого пикселя хранится как 3-байтовая величина BBGGRR.
603
  * Пиксели фонового изображения записываются последовательно
604
    слева направо, сверху вниз.
546 diamond 605
 
6056 IgorA 606
---------------------- Константы для регистров: ----------------------
607
  eax - SF_BACKGROUND_SET (15)
608
  ebx - SSF_MAP_BG (6)
546 diamond 609
======================================================================
3539 clevermous 610
====================== Функция 15, подфункция 7 ======================
611
=== Закрыть проекцию данных фона на адресное пространство процесса. ==
546 diamond 612
======================================================================
3539 clevermous 613
Параметры:
614
  * eax = 15 - номер функции
615
  * ebx = 7 - номер подфункции
616
  * ecx = указатель на данные фона
617
Возвращаемое значение:
618
  * eax = 1 при успехе, 0 при ошибке
546 diamond 619
 
6056 IgorA 620
---------------------- Константы для регистров: ----------------------
621
  eax - SF_BACKGROUND_SET (15)
622
  ebx - SSF_UNMAP_BG (7)
546 diamond 623
======================================================================
3539 clevermous 624
====================== Функция 15, подфункция 8 ======================
625
=========== Получить координаты последней отрисовки фона. ============
2515 mario79 626
======================================================================
3539 clevermous 627
Параметры:
628
  * eax = 15 - номер функции
629
  * ebx = 8 - номер подфункции
630
Возвращаемое значение:
2515 mario79 631
  * eax = [left]*65536 + [right]
632
  * ebx = [top]*65536 + [bottom]
3539 clevermous 633
Замечания:
634
  * (left,top) - координаты левого верхнего угла,
635
    (right,bottom) - координаты правого нижнего.
636
  * Для получения более достоверных сведений, необходимо вызвать
637
    функцию сразу после получения события:
638
             5 = завершилась перерисовка фона рабочего стола
2515 mario79 639
 
6056 IgorA 640
---------------------- Константы для регистров: ----------------------
641
  eax - SF_BACKGROUND_SET (15)
642
  ebx - SSF_LAST_DRAW (8)
2515 mario79 643
======================================================================
3539 clevermous 644
====================== Функция 15, подфункция 9 ======================
645
=============== Перерисовать прямоугольную часть фона. ===============
2547 mario79 646
======================================================================
3539 clevermous 647
Параметры:
648
  * eax = 15 - номер функции
649
  * ebx = 9 - номер подфункции
2547 mario79 650
  * ecx = [left]*65536 + [right]
651
  * edx = [top]*65536 + [bottom]
3539 clevermous 652
Возвращаемое значение:
653
  * функция не возвращает значения
654
Замечания:
655
  * (left,top) - координаты левого верхнего угла,
656
    (right,bottom) - координаты правого нижнего.
657
  * Если параметры установлены некорректно - фон не перерисовывается.
2547 mario79 658
 
6056 IgorA 659
---------------------- Константы для регистров: ----------------------
660
  eax - SF_BACKGROUND_SET (15)
661
  ebx - SSF_REDRAW_RECT (9)
2547 mario79 662
======================================================================
3539 clevermous 663
============= Функция 16 - сохранить рамдиск на дискету. =============
77 diamond 664
======================================================================
3539 clevermous 665
Параметры:
666
  * eax = 16 - номер функции
667
  * ebx = 1 или ebx = 2 - на какую дискету сохранять
668
Возвращаемое значение:
669
  * eax = 0 - успешно
670
  * eax = 1 - ошибка
77 diamond 671
 
6056 IgorA 672
---------------------- Константы для регистров: ----------------------
673
  eax - SF_RD_TO_FLOPPY (16)
77 diamond 674
======================================================================
3539 clevermous 675
============== Функция 17 - получить код нажатой кнопки. =============
77 diamond 676
======================================================================
3539 clevermous 677
Забирает код нажатой кнопки из буфера.
678
Параметры:
679
  * eax = 17 - номер функции
680
Возвращаемое значение:
681
  * если буфер пуст, возвращается eax=1
682
  * если буфер непуст:
683
    * старшие 24 бита eax содержат идентификатор кнопки
684
      (в частности, в ah оказывается младший байт идентификатора;
685
      если все кнопки имеют идентификатор, меньший 256,
686
      то для различения достаточно ah)
687
    * al = 0 - кнопка была нажата левой кнопкой мыши
688
    * al = бит, соответствующий нажавшей кнопке мыши, если не левой
689
Замечания:
690
  * "Буфер" хранит только одну кнопку, при нажатии новой кнопки
691
    информация о старой теряется.
692
  * При вызове этой функции приложением с неактивным окном
693
    возвращается ответ "буфер пуст".
694
  * Возвращаемое значение al соответствует состоянию кнопок мыши
695
    в формате подфункции 2 функции 37 в момент начала нажатия
696
    на кнопку, за исключением младшего бита (соответствующего левой
697
    кнопке мыши), который сбрасывается.
6056 IgorA 698
 
699
---------------------- Константы для регистров: ----------------------
700
  eax - SF_GET_BUTTON (17)
2244 mario79 701
======================================================================
3539 clevermous 702
= Функция 18, подфункция 1 - сделать самым нижним окно потока. =======
2244 mario79 703
======================================================================
3539 clevermous 704
Параметры:
705
  * eax = 18 - номер функции
706
  * ebx = 1 - номер подфункции
707
  * ecx = номер слота потока
708
Возвращаемое значение:
709
  * функция не возвращает значения
77 diamond 710
 
6056 IgorA 711
---------------------- Константы для регистров: ----------------------
712
  eax - SF_SYSTEM (18)
713
  ebx - SSF_UNFOCUS_WINDOW (1)
77 diamond 714
======================================================================
3539 clevermous 715
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
77 diamond 716
======================================================================
3539 clevermous 717
Параметры:
718
  * eax = 18 - номер функции
719
  * ebx = 2 - номер подфункции
720
  * ecx = номер слота процесса/потока
721
Возвращаемое значение:
722
  * функция не возвращает значения
723
Замечания:
724
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
725
    1), можно завершить любой обычный поток/процесс.
726
  * Смотри также подфункцию 18 - завершение
727
    процесса/потока с заданным идентификатором.
77 diamond 728
 
6056 IgorA 729
---------------------- Константы для регистров: ----------------------
730
  eax - SF_SYSTEM (18)
731
  ebx - SSF_TERMINATE_THREAD (2)
77 diamond 732
======================================================================
3539 clevermous 733
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
77 diamond 734
======================================================================
3539 clevermous 735
Параметры:
736
  * eax = 18 - номер функции
737
  * ebx = 3 - номер подфункции
738
  * ecx = номер слота потока
739
Возвращаемое значение:
740
  * функция не возвращает значения
741
Замечания:
742
  * При указании корректного, но несуществующего слота активизируется
743
    какое-то окно.
744
  * Узнать, какое окно является активным, можно вызовом подфункции 7.
77 diamond 745
 
6056 IgorA 746
---------------------- Константы для регистров: ----------------------
747
  eax - SF_SYSTEM (18)
748
  ebx - SSF_FOCUS_WINDOW (3)
77 diamond 749
======================================================================
3780 Serge 750
 Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
77 diamond 751
======================================================================
3539 clevermous 752
Под пустыми тактами понимается время, в которое процессор простаивает
753
в ожидании прерывания (в инструкции hlt).
77 diamond 754
 
3539 clevermous 755
Параметры:
756
  * eax = 18 - номер функции
757
  * ebx = 4 - номер подфункции
758
Возвращаемое значение:
759
  * eax = значение счётчика пустых тактов в секунду
77 diamond 760
 
6056 IgorA 761
---------------------- Константы для регистров: ----------------------
762
  eax - SF_SYSTEM (18)
763
  ebx - SSF_GET_IDLE_COUNT (4)
77 diamond 764
======================================================================
3539 clevermous 765
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
77 diamond 766
======================================================================
3539 clevermous 767
Параметры:
768
  * eax = 18 - номер функции
769
  * ebx = 5 - номер подфункции
770
Возвращаемое значение:
771
  * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
77 diamond 772
 
6056 IgorA 773
---------------------- Константы для регистров: ----------------------
774
  eax - SF_SYSTEM (18)
6683 leency 775
  ebx - SSF_GET_CPU_FREQUENCY (5)
77 diamond 776
======================================================================
3780 Serge 777
 Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
77 diamond 778
======================================================================
3539 clevermous 779
Параметры:
780
  * eax = 18 - номер функции
781
  * ebx = 6 - номер подфункции
782
  * ecx = указатель на строку с полным именем файла
783
    (например, "/hd0/1/kolibri/kolibri.img")
784
Возвращаемое значение:
785
  * eax = 0 - успешно
786
  * иначе eax = код ошибки файловой системы
787
Замечания:
788
  * Все папки в указанном пути должны существовать, иначе вернётся
789
    значение 5, "файл не найден".
77 diamond 790
 
6056 IgorA 791
---------------------- Константы для регистров: ----------------------
792
  eax - SF_SYSTEM (18)
793
  ebx - SSF_RD_TO_HDD (6)
77 diamond 794
======================================================================
3539 clevermous 795
====== Функция 18, подфункция 7 - получить номер активного окна. =====
77 diamond 796
======================================================================
3539 clevermous 797
Параметры:
798
  * eax = 18 - номер функции
799
  * ebx = 7 - номер подфункции
800
Возвращаемое значение:
801
  * eax = номер активного окна (номер слота потока, окно которого
802
    активно)
803
Замечания:
804
  * Активное окно находится вверху оконного стэка и получает
805
    сообщения обо всём вводе с клавиатуры.
806
  * Сделать окно активным можно вызовом подфункции 3.
77 diamond 807
 
6056 IgorA 808
---------------------- Константы для регистров: ----------------------
809
  eax - SF_SYSTEM (18)
810
  ebx - SSF_GET_ACTIVE_WINDOW (7)
77 diamond 811
======================================================================
3539 clevermous 812
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
77 diamond 813
======================================================================
3539 clevermous 814
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
815
При включённом - направляются на встроенный спикер.
77 diamond 816
 
3539 clevermous 817
--------------- Подподфункция 1 - получить состояние. ----------------
818
Параметры:
819
  * eax = 18 - номер функции
820
  * ebx = 8 - номер подфункции
821
  * ecx = 1 - номер подподфункции
822
Возвращаемое значение:
823
  * eax = 0 - звук спикера разрешён; 1 - запрещён
77 diamond 824
 
3539 clevermous 825
-------------- Подподфункция 2 - переключить состояние. --------------
826
Переключает состояния разрешения/запрещения.
827
Параметры:
828
  * eax = 18 - номер функции
829
  * ebx = 8 - номер подфункции
830
  * ecx = 2 - номер подподфункции
831
Возвращаемое значение:
832
  * функция не возвращает значения
77 diamond 833
 
6056 IgorA 834
---------------------- Константы для регистров: ----------------------
835
  eax - SF_SYSTEM (18)
836
  ebx - SSF_SPEAKER (8)
837
  ecx - SSSF_GET_STATE (1), SSSF_TOGGLE (2)
77 diamond 838
======================================================================
3539 clevermous 839
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
77 diamond 840
======================================================================
3539 clevermous 841
Параметры:
842
  * eax = 18 - номер функции
843
  * ebx = 9 - номер подфункции
844
  * ecx = параметр:
845
    * 2 = выключить компьютер
846
    * 3 = перезагрузить компьютер
847
    * 4 = перезапустить ядро из файла kernel.mnt на рамдиске
848
Возвращаемое значение:
849
  * при неверном ecx регистры не меняются (т.е. eax=18)
850
  * при правильном вызове всегда возвращается признак успеха eax=0
851
Замечания:
852
  * Не следует полагаться на возвращаемое значение при неверном
853
    вызове, оно может измениться в последующих версиях ядра.
1018 diamond 854
 
6056 IgorA 855
---------------------- Константы для регистров: ----------------------
856
  eax - SF_SYSTEM (18)
857
  ebx - SSF_SHUTDOWN (9)
77 diamond 858
======================================================================
4573 clevermous 859
========= Функция 18, подфункция 10 - свернуть активное окно. ========
77 diamond 860
======================================================================
4573 clevermous 861
Сворачивает активное окно.
3539 clevermous 862
Параметры:
863
  * eax = 18 - номер функции
864
  * ebx = 10 - номер подфункции
865
Возвращаемое значение:
866
  * функция не возвращает значения
867
Замечания:
868
  * Минимизированное окно с точки зрения функции 9 сохраняет положение
869
    и размеры.
3780 Serge 870
  * Восстановление окна приложения происходит при активизировании
3539 clevermous 871
    подфункцией 3.
872
  * Обычно нет необходимости явно сворачивать/разворачивать своё окно:
873
    сворачивание окна осуществляется системой при нажатии на кнопку
874
    минимизации (которая для окон со скином определяется автоматически
875
    функцией 0, для окон без скина её можно определить функцией 8),
5452 leency 876
    восстановление - приложением @taskbar.
77 diamond 877
 
6056 IgorA 878
---------------------- Константы для регистров: ----------------------
879
  eax - SF_SYSTEM (18)
880
  ebx - SSF_MINIMIZE_WINDOW (10)
77 diamond 881
======================================================================
3539 clevermous 882
====================== Функция 18, подфункция 11 =====================
883
============= Получить информацию о дисковой подсистеме. =============
77 diamond 884
======================================================================
9995 Doczom 885
 
886
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
887
 
3539 clevermous 888
Параметры:
889
  * eax = 18 - номер функции
890
  * ebx = 11 - номер подфункции
891
  * ecx = тип таблицы:
4700 mario79 892
    * 1 = короткая версия, 16 байт
3539 clevermous 893
  * edx = указатель на буфер (в приложении) для таблицы
894
Возвращаемое значение:
895
  * функция не возвращает значения
896
Формат таблицы: короткая версия:
897
  * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
898
    где AAAA задаёт тип первого дисковода, BBBB - второго согласно
899
    следующему списку:
900
    * 0 = нет дисковода
77 diamond 901
    * 1 = 360Kb, 5.25''
902
    * 2 = 1.2Mb, 5.25''
903
    * 3 = 720Kb, 3.5''
904
    * 4 = 1.44Mb, 3.5''
3539 clevermous 905
    * 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
906
    Например, для стандартной конфигурации из одного 1.44-дисковода
907
    здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
908
    значение оказывается 24h.
4700 mario79 909
 
910
  Первый контроллер IDE:
3539 clevermous 911
  * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
912
    где AA соответствует контроллеру IDE0, ..., DD - IDE3:
913
    * 0 = устройство отсутствует
914
    * 1 = жёсткий диск
915
    * 2 = CD-привод
916
    Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
917
  * +2: 4 db: число найденных разделов на жёстких дисках с
918
    соответственно IDE0,...,IDE3.
4700 mario79 919
 
920
  Второй контроллер IDE:
921
  * +6: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
922
    где AA соответствует контроллеру IDE4, ..., DD - IDE7:
923
    * 0 = устройство отсутствует
924
    * 1 = жёсткий диск
925
    * 2 = CD-привод
926
    Например, в случае HD на IDE4 и CD на IDE6 здесь будет 48h.
927
  * +7: 4 db: число найденных разделов на жёстких дисках с
928
    соответственно IDE4,...,IDE7.
929
 
930
  Третий контроллер IDE:
931
  * +11: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
932
    где AA соответствует контроллеру IDE8, ..., DD - IDE11:
933
    * 0 = устройство отсутствует
934
    * 1 = жёсткий диск
935
    * 2 = CD-привод
936
    Например, в случае HD на IDE8 и CD на IDE10 здесь будет 48h.
937
  * +12: 4 db: число найденных разделов на жёстких дисках с
938
    соответственно IDE8,...,IDE11.
939
 
3539 clevermous 940
    При отсутствии жёсткого диска на IDEx соответствующий байт
941
    нулевой, при наличии показывает число распознанных разделов,
942
    которых может и не быть (если носитель не отформатирован или
943
    если файловая система не поддерживается). В текущей версии ядра
4700 mario79 944
    для жёстких дисков поддерживаются только FAT12/16/32, NTFS,
945
    ext2/3/4 и XFS.
4641 mario79 946
 
3539 clevermous 947
Замечания:
4700 mario79 948
  * Таблица может быть использована для получения информации
3539 clevermous 949
    об имеющихся устройствах.
77 diamond 950
 
6056 IgorA 951
---------------------- Константы для регистров: ----------------------
952
  eax - SF_SYSTEM (18)
953
  ebx - SSF_INFO_DISC_SYS (11)
77 diamond 954
======================================================================
3539 clevermous 955
========== Функция 18, подфункция 13 - получить версию ядра. =========
77 diamond 956
======================================================================
3539 clevermous 957
Параметры:
958
  * eax = 18 - номер функции
959
  * ebx = 13 - номер подфункции
960
  * ecx = указатель на буфер (не менее 16 байт), куда будет помещена
961
    информация
962
Возвращаемое значение:
963
  * функция не возвращает значения
8247 rgimad 964
    но, если указатель в ecx недопустимый, например,
965
    регион [ecx, ecx + 9) пересекается с памятью ядра,
966
    то тогда функция возвращает -1
967
Замечания:
968
  * В данный момент используется только часть буфера размером
969
    9 байт. Тем не менее рекомендуется использовать буфер
970
    размером 16 байт для будущей совместимости, в будущем могут быть
971
    добавлены некоторые поля.
3539 clevermous 972
Структура буфера:
973
db a,b,c,d для версии a.b.c.d
974
db 0: зарезервировано
975
dd REV - номер svn-ревизии ядра
976
Для ядра Kolibri 0.7.7.0+:
1662 Nasarus 977
db 0,7,7,0
1675 Nasarus 978
db 0
1676 Nasarus 979
dd 1675
77 diamond 980
 
6056 IgorA 981
---------------------- Константы для регистров: ----------------------
982
  eax - SF_SYSTEM (18)
983
  ebx - SSF_KERNEL_VERSION (13)
77 diamond 984
======================================================================
3539 clevermous 985
====================== Функция 18, подфункция 14 =====================
986
======= Ожидать начала обратного хода луча развёртки монитора. =======
77 diamond 987
======================================================================
3539 clevermous 988
Параметры:
989
  * eax = 18 - номер функции
990
  * ebx = 14 - номер подфункции
991
Возвращаемое значение:
992
  * eax = 0 как признак успеха
993
Замечания:
994
  * Функция предназначена исключительно для активных
995
    высокопроизводительных графических приложений; используется для
996
    плавного вывода графики.
77 diamond 997
 
6056 IgorA 998
---------------------- Константы для регистров: ----------------------
999
  eax - SF_SYSTEM (18)
1000
  ebx - SSF_WAIT_RETRACE (14)
77 diamond 1001
======================================================================
3539 clevermous 1002
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
77 diamond 1003
======================================================================
3539 clevermous 1004
Параметры:
1005
  * eax = 18 - номер функции
1006
  * ebx = 15 - номер подфункции
1007
Возвращаемое значение:
1008
  * eax = 0 как признак успеха
77 diamond 1009
 
6056 IgorA 1010
---------------------- Константы для регистров: ----------------------
1011
  eax - SF_SYSTEM (18)
1012
  ebx - SSF_CURSOR_CENTER (15)
77 diamond 1013
======================================================================
3539 clevermous 1014
====================== Функция 18, подфункция 16 =====================
1015
============ Получить размер свободной оперативной памяти. ===========
77 diamond 1016
======================================================================
3539 clevermous 1017
Параметры:
1018
  * eax = 18 - номер функции
1019
  * ebx = 16 - номер подфункции
1020
Возвращаемое значение:
1021
  * eax = размер свободной памяти в килобайтах
77 diamond 1022
 
6056 IgorA 1023
---------------------- Константы для регистров: ----------------------
1024
  eax - SF_SYSTEM (18)
1025
  ebx - SSF_GET_FREE_RAM (16)
77 diamond 1026
======================================================================
3539 clevermous 1027
====================== Функция 18, подфункция 17 =====================
1028
============ Получить размер имеющейся оперативной памяти. ===========
77 diamond 1029
======================================================================
3539 clevermous 1030
Параметры:
1031
  * eax = 18 - номер функции
1032
  * ebx = 17 - номер подфункции
1033
Возвращаемое значение:
1034
  * eax = общий размер имеющейся памяти в килобайтах
77 diamond 1035
 
6056 IgorA 1036
---------------------- Константы для регистров: ----------------------
1037
  eax - SF_SYSTEM (18)
1038
  ebx - SSF_GET_TOTAL_RAM (17)
77 diamond 1039
======================================================================
3539 clevermous 1040
====================== Функция 18, подфункция 18 =====================
1041
============= Завершить процесс/поток по идентификатору. =============
85 halyavin 1042
======================================================================
3539 clevermous 1043
Параметры:
1044
  * eax = 18 - номер функции
1045
  * ebx = 18 - номер подфункции
1046
  * ecx = идентификатор процесса/потока (PID/TID)
1047
Возвращаемое значение:
1048
  * eax = 0 - успешно
1049
  * eax = -1 - ошибка (процесс не найден или является системным)
1050
Замечания:
1051
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
1052
    1), можно завершить любой обычный поток/процесс.
1053
  * Смотри также подфункцию 2 - завершение
1054
    процесса/потока по заданному слоту.
85 halyavin 1055
 
6056 IgorA 1056
---------------------- Константы для регистров: ----------------------
1057
  eax - SF_SYSTEM (18)
1058
  ebx - SSF_TERMINATE_THREAD_ID (18)
85 halyavin 1059
======================================================================
3539 clevermous 1060
=== Функция 18, подфункция 19 - получить/установить настройки мыши. ==
120 mario79 1061
======================================================================
131 diamond 1062
 
3539 clevermous 1063
------------- Подподфункция 0 - получить скорость мыши. --------------
1064
Параметры:
1065
  * eax = 18 - номер функции
1066
  * ebx = 19 - номер подфункции
1067
  * ecx = 0 - номер подподфункции
1068
Возвращаемое значение:
6235 pathoswith 1069
  * eax = текущий делитель скорости
120 mario79 1070
 
3539 clevermous 1071
------------ Подподфункция 1 - установить скорость мыши. -------------
1072
Параметры:
1073
  * eax = 18 - номер функции
1074
  * ebx = 19 - номер подфункции
1075
  * ecx = 1 - номер подподфункции
6235 pathoswith 1076
  * edx = новое значение делителя скорости
3539 clevermous 1077
Возвращаемое значение:
1078
  * функция не возвращает значения
120 mario79 1079
 
6235 pathoswith 1080
Замечание: рекомендуемый делитель скорости = 4
5956 pathoswith 1081
 
6235 pathoswith 1082
---------- Подподфункция 2 - получить чувствительность мыши ----------
3539 clevermous 1083
Параметры:
1084
  * eax = 18 - номер функции
1085
  * ebx = 19 - номер подфункции
1086
  * ecx = 2 - номер подподфункции
1087
Возвращаемое значение:
6235 pathoswith 1088
  * eax = текущий коэффициент чувствительности
120 mario79 1089
 
6235 pathoswith 1090
--------- Подподфункция 3 - установить чувствительность мыши ---------
3539 clevermous 1091
Параметры:
1092
  * eax = 18 - номер функции
1093
  * ebx = 19 - номер подфункции
1094
  * ecx = 3 - номер подподфункции
6235 pathoswith 1095
  * edx = новое значение коэффициента чувствительности
3539 clevermous 1096
Возвращаемое значение:
1097
  * функция не возвращает значения
120 mario79 1098
 
6235 pathoswith 1099
Замечание: рекомендуемый коэффициент чувствительности = 3
1100
 
3539 clevermous 1101
-------- Подподфункция 4 - установить положение курсора мыши. --------
1102
Параметры:
1103
  * eax = 18 - номер функции
1104
  * ebx = 19 - номер подфункции
1105
  * ecx = 4 - номер подподфункции
1106
  * edx = [координата по оси x]*65536 + [координата по оси y]
1107
Возвращаемое значение:
1108
  * функция не возвращает значения
621 mario79 1109
 
3539 clevermous 1110
------- Подподфункция 5 - симулировать состояние клавиш мыши. --------
1111
Параметры:
1112
  * eax = 18 - номер функции
1113
  * ebx = 19 - номер подфункции
1114
  * ecx = 5 - номер подподфункции
1115
  * edx = информация о эмулируемом состоянии кнопок мыши:
1116
    (соответствует возвращаемому значению подфункции 2 функции 37)
1117
    * бит 0 установлен = левая кнопка нажата
1118
    * бит 1 установлен = правая кнопка нажата
1119
    * бит 2 установлен = средняя кнопка нажата
1120
    * бит 3 установлен = 4-я кнопка нажата
1121
    * бит 4 установлен = 5-я кнопка нажата
1122
Возвращаемое значение:
1123
  * функция не возвращает значения
5851 pathoswith 1124
 
1125
-------- Подподфункция 6 - получить задержку двойного щелчка. --------
1126
Параметры:
1127
  * eax = 18 - номер функции
1128
  * ebx = 19 - номер подфункции
1129
  * ecx = 6 - номер подподфункции
1130
Возвращаемое значение:
1131
  * eax = текущая задержка двойного щелчка (100 = секунда)
1132
 
1133
------- Подподфункция 7 - установить задержку двойного щелчка. -------
1134
Параметры:
1135
  * eax = 18 - номер функции
1136
  * ebx = 19 - номер подфункции
1137
  * ecx = 7 - номер подподфункции
1138
  * dl  = новое значение задержки двойного щелчка (100 = секунда)
1139
Возвращаемое значение:
1140
  * функция не возвращает значения
1141
 
5956 pathoswith 1142
Замечание: настройки мыши можно регулировать в приложении mouse_cfg.
120 mario79 1143
 
6056 IgorA 1144
---------------------- Константы для регистров: ----------------------
1145
  eax - SF_SYSTEM (18)
1146
  ebx - SSF_MOUSE_SETTINGS (19)
1147
  ecx - SSSF_GET_SPEED (0), SSSF_SET_SPEED (1), SSSF_GET_SPEEDUP (2),
1148
    SSSF_SET_SPEEDUP (3), SSSF_SET_POS (4), SSSF_SET_BUTTON (5),
1149
    SSSF_GET_DOUBLE_CLICK_DELAY (6), SSSF_SET_DOUBLE_CLICK_DELAY (7)
120 mario79 1150
======================================================================
3539 clevermous 1151
====================== Функция 18, подфункция 20 =====================
1152
============= Получить информацию об оперативной памяти. =============
172 serge 1153
======================================================================
3539 clevermous 1154
Параметры:
1155
  * eax = 18 - номер функции
1156
  * ebx = 20 - номер подфункции
1157
  * ecx = указатель на буфер для информации (36 байт)
1158
Возвращаемое значение:
1159
  * eax = общий размер имеющейся оперативной памяти в байтах
1160
    или -1 в случае ошибки
1161
  * буфер, на который указывает ecx, содержит следующую информацию:
1162
    * +0: dword: общий размер имеющейся оперативной памяти в страницах
1163
    * +4:  dword: размер свободной оперативной памяти в страницах
1164
    * +8:  dword: число страничных ошибок (исключений #PF)
1165
                 в приложениях
1166
    * +12: dword: размер кучи ядра в байтах
1167
    * +16: dword: размер свободной памяти в куче ядра в байтах
1168
    * +20: dword: общее количество блоков памяти в куче ядра
1169
    * +24: dword: количество свободных блоков памяти в куче ядра
1170
    * +28: dword: размер наибольшего свободного блока в куче ядра
1171
                 (зарезервировано)
1172
    * +32: dword: размер наибольшего выделенного блока в куче ядра
1173
                 (зарезервировано)
172 serge 1174
 
6056 IgorA 1175
---------------------- Константы для регистров: ----------------------
1176
  eax - SF_SYSTEM (18)
1177
  ebx - SSF_GET_RAM_INFO (20)
172 serge 1178
======================================================================
3539 clevermous 1179
====================== Функция 18, подфункция 21 =====================
1180
======= Получить номер слота процесса/потока по идентификатору. ======
608 alver 1181
======================================================================
3539 clevermous 1182
Параметры:
1183
  * eax = 18 - номер функции
1184
  * ebx = 21 - номер подфункции
1185
  * ecx = идентификатор процесса/потока (PID/TID)
1186
Возвращаемое значение:
1187
  * eax = 0 - ошибка (неверный идентификатор)
1188
  * иначе eax = номер слота
608 alver 1189
 
6056 IgorA 1190
---------------------- Константы для регистров: ----------------------
1191
  eax - SF_SYSTEM (18)
1192
  ebx - SSF_GET_THREAD_SLOT (21)
608 alver 1193
======================================================================
3780 Serge 1194
 Функция 18, подфункция 22 - операции с окном другого процесса/потока.
608 alver 1195
======================================================================
3539 clevermous 1196
Параметры:
1197
  * eax = 18 - номер функции
1198
  * ebx = 22 - номер подфункции
1199
  * ecx = тип операции:
1200
    * 0 = минимизация окна, поток задан номером слота
1201
    * 1 = минимизация окна, поток задан идентификатором
1202
    * 2 = восстановление окна, поток задан номером слота
1203
    * 3 = восстановление окна, поток задан идентификатором
1204
  * edx = параметр операции (номер слота или PID/TID)
1205
Возвращаемое значение:
1206
  * eax = 0 - успешно
1207
  * eax = -1 - ошибка (неправильный параметр)
1208
Замечания:
1209
  * Поток может свернуть своё окно вызовом подфункции 10.
1210
  * Восстановление окна с одновременной активизацией осуществляется
1211
    подфункции 3 (принимающей номер слота).
608 alver 1212
 
6056 IgorA 1213
---------------------- Константы для регистров: ----------------------
1214
  eax - SF_SYSTEM (18)
1215
  ebx - SSF_FOREIGN_WINDOW (22)
1216
  ecx - SSSF_MINIMIZE (0), SSSF_MINIMIZE_ID (1), SSSF_RESTORE (2),
1217
    SSSF_RESTORE_ID (3)
608 alver 1218
======================================================================
3539 clevermous 1219
======= Функция 18, подфункция 23 - минимизировать все окна. =========
2648 mario79 1220
======================================================================
3539 clevermous 1221
Параметры:
1222
  * eax = 18 - номер функции
1223
  * ebx = 23 - номер подфункции
1224
Возвращаемое значение:
1225
  * eax = 0 - все окна были минимизированы до вызова функции
1226
  * eax = N - количество окон свернутых функцией
1227
Замечания:
1228
  * Окна спец. потоков (имя начинается с символа @) не сворачиваются.
2648 mario79 1229
 
6056 IgorA 1230
---------------------- Константы для регистров: ----------------------
1231
  eax - SF_SYSTEM (18)
1232
  ebx - SSF_MINIMIZE_ALL (23)
2648 mario79 1233
======================================================================
3539 clevermous 1234
===== Функция 18, подфункция 24 - установить пределы отрисовки. ======
2654 mario79 1235
======================================================================
3539 clevermous 1236
Параметры:
1237
  * eax = 18 - номер функции
1238
  * ebx = 24 - номер подфункции
1239
  * ecx = новый размер по X
1240
  * edx = новый размер по Y
1241
Возвращаемое значение:
1242
  * функция не возвращает значения
1243
Замечания:
1244
  * Функция не меняет физический размер видеорежима. Она предназначена
1245
    для нестандартных дисплеев, отображающих изображение частично.
1246
  * Размеры указываемые в функции не должны превышать размеры текущего
1247
    видеорежима, иначе функция ничего не изменит.
2654 mario79 1248
 
6056 IgorA 1249
---------------------- Константы для регистров: ----------------------
1250
  eax - SF_SYSTEM (18)
1251
  ebx - SSF_SET_SCREEN_LIMITS (24)
2654 mario79 1252
======================================================================
5836 GerdtR 1253
===================== Функция 18, подфункция 25 ======================
1254
======== Управление положением окна относительно других окон. ========
1255
======================================================================
1256
 
1257
------------- Подподфункция 1 - получить положение  ------------------
1258
Параметры:
1259
  * eax = 18 - номер функции
1260
  * ebx = 25 - номер подфункции
9995 Doczom 1261
  * ecx = 1  - номер подподфункции
1262
  * edx = -1 (для текущего окна) или PID приложения
5836 GerdtR 1263
Возвращаемое значение:
1264
  * eax = одна из констант положения окна
1265
 
1266
------------- Подподфункция 2 - установить положение  ----------------
1267
Параметры:
1268
  * eax = 18 - номер функции
1269
  * ebx = 25 - номер подфункции
9995 Doczom 1270
  * ecx = 2  - номер подподфункции
1271
  * edx = -1 (для текущего окна) или PID приложения
5836 GerdtR 1272
  * esi = новое положение окна (одна из констант ниже)
1273
Возвращаемое значение:
1274
  * eax = 0 - неудача
1275
  * eax = 1 - успех
1276
 
1277
Константы положения окна относительно других окон:
6473 pathoswith 1278
 ZPOS_DESKTOP     = -2 - на самом заднем плане
5865 GerdtR 1279
 ZPOS_ALWAYS_BACK = -1 - позади всех окон
1280
 ZPOS_NORMAL      = 0  - обычное
1281
 ZPOS_ALWAYS_TOP  = 1  - поверх всех окон
5836 GerdtR 1282
 
6056 IgorA 1283
---------------------- Константы для регистров: ----------------------
1284
  eax - SF_SYSTEM (18)
1285
  ebx - SSF_WINDOW_BEHAVIOR (25)
1286
  ecx - SSSF_GET_WB (1), SSSF_SET_WB (2)
5836 GerdtR 1287
======================================================================
3539 clevermous 1288
==================== Функция 20 - интерфейс MIDI. ====================
77 diamond 1289
======================================================================
1290
 
9995 Doczom 1291
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
1292
 
3539 clevermous 1293
------------------------ Подфункция 1 - сброс ------------------------
1294
Параметры:
1295
  * eax = 20 - номер функции
9995 Doczom 1296
  * ebx = 1  - номер подфункции
77 diamond 1297
 
3539 clevermous 1298
-------------------- Подфункция 2 - вывести байт ---------------------
1299
Параметры:
1300
  * eax = 20 - номер функции
9995 Doczom 1301
  * ebx = 2  - номер подфункции
3539 clevermous 1302
  * cl = байт для вывода
1303
Возвращаемое значение (одинаково для обеих подфункций):
1304
  * eax = 0 - успешно
1305
  * eax = 1 - не определён базовый порт
1306
Замечания:
3780 Serge 1307
  * Предварительно должен быть определён базовый порт вызовом
3539 clevermous 1308
    подфункции 1 функции 21.
77 diamond 1309
 
6056 IgorA 1310
---------------------- Константы для регистров: ----------------------
1311
  eax - SF_MIDI (20)
1312
  ebx - SSF_RESET (1), SSF_OUTPUT (2)
77 diamond 1313
======================================================================
3539 clevermous 1314
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
77 diamond 1315
======================================================================
9995 Doczom 1316
 
1317
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
1318
 
3539 clevermous 1319
Параметры:
1320
  * eax = 21 - номер функции
1321
  * ebx = 1 - номер подфункции
1322
  * ecx = номер базового порта
1323
Возвращаемое значение:
1324
  * eax = 0 - успешно
1325
  * eax = -1 - ошибочный номер порта
1326
Замечания:
1327
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1328
  * Установка базы нужна для работы функции 20.
3780 Serge 1329
  * Получить установленный базовый порт можно вызовом
3539 clevermous 1330
    подфункции 1 функции 26.
77 diamond 1331
 
6056 IgorA 1332
---------------------- Константы для регистров: ----------------------
1333
  eax - SF_SYSTEM_SET (21)
1334
  ebx - SSF_MPU_MIDI_BASE (1)
77 diamond 1335
======================================================================
3539 clevermous 1336
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
77 diamond 1337
======================================================================
3539 clevermous 1338
Раскладка клавиатуры используется для преобразования сканкодов,
1339
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1340
Параметры:
1341
  * eax = 21 - номер функции
1342
  * ebx = 2 - номер подфункции
1343
  * ecx = какую раскладку устанавливать:
1344
    * 1 = нормальную
1345
    * 2 = раскладку при нажатом Shift
1346
    * 3 = раскладку при нажатом Alt
1347
  * edx = указатель на раскладку - таблицу длиной 128 байт
1348
Или:
77 diamond 1349
  * ecx = 9
3539 clevermous 1350
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1351
Возвращаемое значение:
1352
  * eax = 0 - успешно
1353
  * eax = 1 - параметр задан неверно
1354
Замечания:
1355
  * Если нажат Alt, то используется раскладка с Alt;
1356
    если не нажат Alt, но нажат Shift, то
1357
    используется раскладка с Shift;
1358
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1359
    нормальная раскладка, после чего из кода вычитается 0x60;
1360
    если не нажата ни одна из управляющих клавиш, то используется
1361
    нормальная раскладка.
3780 Serge 1362
  * Получить раскладки и идентификатор страны можно с помощью
3539 clevermous 1363
    подфункции 2 функции 26.
1364
  * Идентификатор страны - глобальная системная переменная, которая
5452 leency 1365
    самим ядром не используется; однако приложение @taskbar отображает
3539 clevermous 1366
    соответствующую текущей стране иконку.
5452 leency 1367
  * Приложение @taskbar переключает раскладки по запросу пользователя.
77 diamond 1368
 
6056 IgorA 1369
---------------------- Константы для регистров: ----------------------
1370
  eax - SF_SYSTEM_SET (21)
1371
  ebx - SSF_KEYBOARD_LAYOUT (2)
77 diamond 1372
======================================================================
3539 clevermous 1373
========= Функция 21, подфункция 5 - установить язык системы. ========
77 diamond 1374
======================================================================
3539 clevermous 1375
Параметры:
1376
  * eax = 21 - номер функции
1377
  * ebx = 5 - номер подфункции
1378
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1379
Возвращаемое значение:
77 diamond 1380
  * eax = 0
3539 clevermous 1381
Замечания:
1382
  * Язык системы - глобальная системная переменная, никак
5452 leency 1383
    не используемая самим ядром, однако приложение @taskbar рисует
3539 clevermous 1384
    соответствующую иконку.
1385
  * Проверок на корректность не делается, поскольку ядро эту
1386
    переменную не использует.
1387
  * Получить язык системы можно вызовом подфункции 5 функции 26.
77 diamond 1388
 
6056 IgorA 1389
---------------------- Константы для регистров: ----------------------
1390
  eax - SF_SYSTEM_SET (21)
1391
  ebx - SSF_SYS_LANG (5)
77 diamond 1392
======================================================================
3539 clevermous 1393
====================== Функция 21, подфункция 11 =====================
1394
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
77 diamond 1395
======================================================================
3539 clevermous 1396
Параметры:
1397
  * eax = 21 - номер функции
1398
  * ebx = 11 - номер подфункции
1399
  * ecx = 0/1 - запретить/разрешить
1400
Возвращаемое значение:
77 diamond 1401
  * eax = 0
3539 clevermous 1402
Замечания:
1403
  * Используется при LBA-чтении (подфункция 8 функции 58).
1404
  * Текущая реализация использует только младший бит ecx.
1405
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
77 diamond 1406
 
6056 IgorA 1407
---------------------- Константы для регистров: ----------------------
1408
  eax - SF_SYSTEM_SET (21)
1409
  ebx - SSF_ACCESS_HD_LBA (11)
77 diamond 1410
======================================================================
3539 clevermous 1411
====================== Функция 21, подфункция 12 =====================
1412
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
77 diamond 1413
======================================================================
3539 clevermous 1414
Параметры:
1415
  * eax = 21 - номер функции
1416
  * ebx = 12 - номер подфункции
1417
  * ecx = 0/1 - запретить/разрешить
1418
Возвращаемое значение:
77 diamond 1419
  * eax = 0
3539 clevermous 1420
Замечания:
1421
  * Используется при работе с шиной PCI (функция 62).
1422
  * Текущая реализация использует только младший бит ecx.
1423
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
77 diamond 1424
 
6056 IgorA 1425
---------------------- Константы для регистров: ----------------------
1426
  eax - SF_SYSTEM_SET (21)
1427
  ebx - SSF_ACCESS_PCI (12)
77 diamond 1428
======================================================================
3539 clevermous 1429
============ Функция 22 - установить системную дату/время. ===========
77 diamond 1430
======================================================================
3539 clevermous 1431
Параметры:
1432
  * eax = 22 - номер функции
1433
  * ebx = 0 - установить время
1434
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1435
    * HH=час 00..23
1436
    * MM=минута 00..59
1437
    * SS=секунда 00..59
1438
  * ebx = 1 - установить дату
1439
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1440
    * DD=день 01..31
1441
    * MM=месяц 01..12
1442
    * YY=год 00..99
1443
  * ebx = 2 - установить день недели
1444
    * ecx = 1 для воскресенья, ..., 7 для субботы
1445
  * ebx = 3 - установить будильник
77 diamond 1446
    * ecx = 0x00SSMMHH
3539 clevermous 1447
Возвращаемое значение:
1448
  * eax = 0 - успешно
1449
  * eax = 1 - параметр задан неверно
1450
  * eax = 2 - CMOS-батарейки разрядились
1451
Замечания:
1452
  * Ценность установки дня недели представляется сомнительной,
1453
    поскольку он мало где используется
1454
    (день недели можно рассчитать по дате).
1455
  * Будильник можно установить на срабатывание в заданное время
1456
    каждые сутки. При этом отключить его существующими системными
1457
    функциями нельзя.
1458
  * Срабатывание будильника заключается в генерации IRQ8.
1459
  * Вообще-то CMOS поддерживает для будильника установку значения
1460
    0xFF в качестве одного из параметров и означает это, что
1461
    соответствующий параметр игнорируется. Но в текущей реализации
1462
    это не пройдёт (вернётся значение 1).
1463
  * Будильник - глобальный системный ресурс; установка будильника
1464
    автоматически отменяет предыдущую установку. Впрочем, на данный
1465
    момент ни одна программа его не использует.
77 diamond 1466
 
6056 IgorA 1467
---------------------- Константы для регистров: ----------------------
1468
  eax - SF_SET_TIME_DATE (22)
77 diamond 1469
======================================================================
3539 clevermous 1470
============== Функция 23 - ожидать события с таймаутом. =============
77 diamond 1471
======================================================================
3539 clevermous 1472
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1473
но не более указанного времени. Затем считывает сообщение из очереди.
77 diamond 1474
 
3539 clevermous 1475
Параметры:
1476
  * eax = 23 - номер функции
1477
  * ebx = таймаут (в сотых долях секунды)
1478
Возвращаемое значение:
1479
  * eax = 0 - очередь сообщений пуста
1480
  * иначе eax = событие (смотри список событий)
1481
Замечания:
1482
  * Учитываются только те события, которые входят в маску,
1483
    устанавливаемую функцией 40. По умолчанию это события
1484
    перерисовки, нажатия на клавиши и на кнопки.
1485
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1486
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1487
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1488
  * При текущей реализации произойдёт немедленный возврат из функции
1489
    с eax=0, если сложение ebx с текущим значением счётчика времени
1490
    вызовет 32-битное переполнение.
77 diamond 1491
 
6056 IgorA 1492
---------------------- Константы для регистров: ----------------------
1493
  eax - SF_WAIT_EVENT_TIMEOUT (23)
77 diamond 1494
======================================================================
3539 clevermous 1495
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
588 diamond 1496
======================================================================
9995 Doczom 1497
 
1498
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
1499
 
3539 clevermous 1500
Параметры:
1501
  * eax = 24 - номер функции
1502
  * ebx = 4 - номер подфункции
1503
  * ecx = номер CD/DVD-диска
4711 mario79 1504
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1505
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1506
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
3539 clevermous 1507
Возвращаемое значение:
1508
  * функция не возвращает значения
1509
Замечания:
1510
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1511
  * При извлечении лотка производится разблокировка ручного управления
1512
    механизмом лотка.
1513
  * При извлечении лотка код производит очистку кэша соответствующего
1514
    устройства.
1515
  * Примером использования функции является приложение CD_tray.
588 diamond 1516
 
6056 IgorA 1517
---------------------- Константы для регистров: ----------------------
1518
  eax - SF_CD (24)
1519
  ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5)
588 diamond 1520
======================================================================
3539 clevermous 1521
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
588 diamond 1522
======================================================================
9995 Doczom 1523
 
1524
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
1525
 
3539 clevermous 1526
Параметры:
1527
  * eax = 24 - номер функции
1528
  * ebx = 5 - номер подфункции
1529
  * ecx = номер CD/DVD-диска
4711 mario79 1530
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1531
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1532
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
3539 clevermous 1533
Возвращаемое значение:
1534
  * функция не возвращает значения
1535
Замечания:
1536
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1537
  * Примером использования функции является приложение CD_tray.
588 diamond 1538
 
6056 IgorA 1539
---------------------- Константы для регистров: ----------------------
1540
  eax - SF_CD (24)
1541
  ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5)
588 diamond 1542
======================================================================
3539 clevermous 1543
========== Функция 25 - записать область на слой фона. ===============
2509 mario79 1544
======================================================================
3539 clevermous 1545
Параметры:
1546
  * eax = 25 - номер функции
1547
  * ebx = указатель на предварительно выделенную область памяти,
1548
      где размещено исходное изображение в формате BBGGRRTTBBGGRRTT...
1549
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1550
  * edx = [координата по оси x]*65536 + [координата по оси y]
1551
Возвращаемое значение:
1552
  * функция не возвращает значения
1553
Замечания:
1554
  * Координаты области - это координаты верхнего левого угла
1555
    области относительно экрана.
1556
  * Размер изображения в байтах есть 4*xsize*ysize.
1557
  * TT - байт указатель прозрачности, в настоящее время:
1558
         от 1 до FF - непрозрачно, от 0 - прозрачно.
1559
  * Функция размещает изображение не на фоновое изображение (ф.15),
1560
    а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
2509 mario79 1561
 
6056 IgorA 1562
---------------------- Константы для регистров: ----------------------
1563
  eax - SF_SCREEN_PUT_IMAGE (25)
2509 mario79 1564
======================================================================
3539 clevermous 1565
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
77 diamond 1566
======================================================================
9995 Doczom 1567
 
1568
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
1569
 
3539 clevermous 1570
Параметры:
1571
  * eax = 26 - номер функции
1572
  * ebx = 1 - номер подфункции
1573
Возвращаемое значение:
1574
  * eax = номер порта
1575
Замечания:
3780 Serge 1576
  * Установить базовый порт можно вызовом
3539 clevermous 1577
    подфункции 1 функции 21.
77 diamond 1578
 
6056 IgorA 1579
---------------------- Константы для регистров: ----------------------
1580
  eax - SF_SYSTEM_GET (26)
1581
  ebx - SSF_MPU_MIDI_BASE (1)
77 diamond 1582
======================================================================
3539 clevermous 1583
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
77 diamond 1584
======================================================================
3539 clevermous 1585
Раскладка клавиатуры используется для преобразования сканкодов,
1586
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1587
Параметры:
1588
  * eax = 26 - номер функции
1589
  * ebx = 2 - номер подфункции
1590
  * ecx = какую раскладку получать:
1591
    * 1 = нормальную
1592
    * 2 = раскладку при нажатом Shift
1593
    * 3 = раскладку при нажатом Alt
1594
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1595
    раскладка
1596
Возвращаемое значение:
8161 rgimad 1597
  * функция не возвращает значения,
1598
    но, если указатель в edx недопустимый, например,
1599
    регион [edx, edx + 128) пересекается с памятью ядра,
1600
    то тогда функция возвращает -1
3539 clevermous 1601
Или:
1602
  * eax = 26 - номер функции
1603
  * ebx = 2 - номер подфункции
77 diamond 1604
  * ecx = 9
3539 clevermous 1605
Возвращаемое значение:
1606
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1607
Замечания:
1608
  * Если нажат Alt, то используется раскладка с Alt;
1609
    если не нажат Alt, но нажат Shift, то используется
1610
    раскладка с Shift;
1611
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1612
    нормальная раскладка, после чего из кода вычитается 0x60;
1613
    если не нажата ни одна из управляющих клавиш, то используется
1614
    нормальная раскладка.
3780 Serge 1615
  * Установить раскладки и идентификатор страны можно с помощью
3539 clevermous 1616
    подфункции 2 функции 21.
1617
  * Идентификатор страны - глобальная системная переменная, которая
5452 leency 1618
    самим ядром не используется; однако приложение @taskbar отображает
3539 clevermous 1619
    соответствующую текущей стране иконку
1620
    (используя описываемую функцию).
5452 leency 1621
  * Приложение @taskbar переключает раскладки по запросу пользователя.
77 diamond 1622
 
6056 IgorA 1623
---------------------- Константы для регистров: ----------------------
1624
  eax - SF_SYSTEM_GET (26)
1625
  ebx - SSF_KEYBOARD_LAYOUT (2)
77 diamond 1626
======================================================================
3539 clevermous 1627
========== Функция 26, подфункция 5 - получить язык системы. =========
77 diamond 1628
======================================================================
3539 clevermous 1629
Параметры:
1630
  * eax = 26 - номер функции
1631
  * ebx = 5 - номер подфункции
1632
Возвращаемое значение:
1633
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1634
Замечания:
1635
  * Язык системы - глобальная системная переменная, никак
5452 leency 1636
    не используемая самим ядром, однако приложение @taskbar рисует
3539 clevermous 1637
    соответствующую иконку (используя описываемую функцию).
1638
  * Установить язык системы можно вызовом подфункции 5 функции 21.
77 diamond 1639
 
6056 IgorA 1640
---------------------- Константы для регистров: ----------------------
1641
  eax - SF_SYSTEM_GET (26)
1642
  ebx - SSF_SYS_LANG (5)
77 diamond 1643
======================================================================
3539 clevermous 1644
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
77 diamond 1645
======================================================================
3539 clevermous 1646
Параметры:
1647
  * eax = 26 - номер функции
1648
  * ebx = 9 - номер подфункции
1649
Возвращаемое значение:
1650
  * eax = число сотых долей секунды, прошедших с момента
1651
    запуска системы
1652
Замечания:
1653
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1654
    497 суток.
1655
  * Системное время можно получить функцией 3.
77 diamond 1656
 
6056 IgorA 1657
---------------------- Константы для регистров: ----------------------
1658
  eax - SF_SYSTEM_GET (26)
1659
  ebx - SSF_TIME_COUNT (9)
77 diamond 1660
======================================================================
5813 serge 1661
===================== Функция 26, подфункция 10 ======================
1662
========== Получить значение высокоточного счётчика времени. =========
1663
======================================================================
1664
Parameters:
1665
  * eax = 26 - номер функции
1666
  * ebx = 10 - номер подфункции
1667
Returned value:
1668
  * edx:eax = число наносекунд с момента загрузки ядра
1669
  * eax = младшее двойное слово
6473 pathoswith 1670
  * edx = старшее двойное слово
5813 serge 1671
Remarks:
1672
  * функция использует счётчик HPET, если HPET не доступен используется
1673
    счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
1674
    наносекунд.
1675
 
6056 IgorA 1676
---------------------- Константы для регистров: ----------------------
1677
  eax - SF_SYSTEM_GET (26)
1678
  ebx - SSF_TIME_COUNT_PRO (10)
5813 serge 1679
======================================================================
3539 clevermous 1680
====================== Функция 26, подфункция 11 =====================
1681
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
77 diamond 1682
======================================================================
3539 clevermous 1683
Параметры:
1684
  * eax = 26 - номер функции
1685
  * ebx = 11 - номер подфункции
1686
Возвращаемое значение:
1687
  * eax = 0/1 - запрещён/разрешён
1688
Замечания:
1689
  * Используется при LBA-чтении (подфункция 8 функции 58).
3780 Serge 1690
  * Установить текущее состояние можно вызовом
3539 clevermous 1691
    подфункции 11 функции 21.
77 diamond 1692
 
6056 IgorA 1693
---------------------- Константы для регистров: ----------------------
1694
  eax - SF_SYSTEM_GET (26)
1695
  ebx - SSF_ACCESS_HD_LBA (11)
77 diamond 1696
======================================================================
3539 clevermous 1697
====================== Функция 26, подфункция 12 =====================
1698
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
77 diamond 1699
======================================================================
3539 clevermous 1700
Параметры:
1701
  * eax = 26 - номер функции
1702
  * ebx = 12 - номер подфункции
1703
Возвращаемое значение:
1704
  * eax = 0/1 - запрещён/разрешён
1705
Замечания:
1706
  * Используется при работе с шиной PCI (функция 62).
1707
  * Текущая реализация использует только младший бит ecx.
3780 Serge 1708
  * Установить текущее состояние можно вызовом
3539 clevermous 1709
    подфункции 12 функции 21.
77 diamond 1710
 
6056 IgorA 1711
---------------------- Константы для регистров: ----------------------
1712
  eax - SF_SYSTEM_GET (26)
1713
  ebx - SSF_ACCESS_PCI (12)
77 diamond 1714
======================================================================
3539 clevermous 1715
================ Функция 29 - получить системную дату. ===============
77 diamond 1716
======================================================================
3539 clevermous 1717
Параметры:
1718
  * eax = 29 - номер функции
1719
Возвращаемое значение:
1720
  * eax = 0x00DDMMYY, где
1721
    (используется двоично-десятичное кодирование, BCD)
1722
  * YY = две младшие цифры года (00..99)
1723
  * MM = месяц (01..12)
1724
  * DD = день (01..31)
1725
Замечания:
1726
  * Системную дату можно установить функцией 22.
77 diamond 1727
 
6056 IgorA 1728
---------------------- Константы для регистров: ----------------------
1729
  eax - SF_GET_SYS_DATE (29)
77 diamond 1730
======================================================================
3539 clevermous 1731
================ Функция 30 - работа с текущей папкой. ===============
521 diamond 1732
======================================================================
3539 clevermous 1733
-------- Подфункция 1 - установить текущую папку для потока. ---------
1734
Параметры:
1735
  * eax = 30 - номер функции
1736
  * ebx = 1 - номер подфункции
6473 pathoswith 1737
  * ecx = указатель на строку с путём к новой текущей папке,
1738
    правила формирования строки указаны в описании функции 70.
3539 clevermous 1739
Возвращаемое значение:
1740
  * функция не возвращает значения
6798 pathoswith 1741
----------------------------------------------------------------------
3539 clevermous 1742
--------- Подфункция 2 - получить текущую папку для потока. ----------
1743
Параметры:
1744
  * eax = 30 - номер функции
1745
  * ebx = 2 - номер подфункции
1746
  * ecx = указатель на буфер
1747
  * edx = размер буфера
1748
Возвращаемое значение:
6798 pathoswith 1749
  * eax = длина строки (включая завершающий 0)
3539 clevermous 1750
Замечания:
6798 pathoswith 1751
  * Если размера буфера недостаточно для копирования всего пути,
1752
    копируются только часть строки и в конце ставится завершающий 0.
3539 clevermous 1753
  * По умолчанию, текущая папка для потока - "/rd/1".
1754
  * При создании процесса/потока текущая папка наследуется от
1755
    родителя.
6798 pathoswith 1756
----------------------------------------------------------------------
3663 mario79 1757
---- Подфункция 3 - установить доп. системную директорию для ядра ----
1758
Параметры:
1759
  * eax = 30 - номер функции
1760
  * ebx = 3 - номер подфункции
1761
  * ecx = указатель на блок данных:
6473 pathoswith 1762
key     rb  64
1763
path    rb  64
1764
    Пример:
1765
align 64
1766
key     db  'kolibrios',0   ; ключ должен быть в нижнем регистре
1767
align 64
1768
path    db  'HD0/1',0
1769
 
3663 mario79 1770
Возвращаемое значение:
1771
  * функция не возвращает значения
1772
Замечания:
1773
  * Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
6798 pathoswith 1774
  * При вводе пути символьный ключ не зависит от кодировки.
1775
----------------------------------------------------------------------
1776
--- Подфункция 4 - установить текущую папку с указанием кодировки. ---
6473 pathoswith 1777
Параметры:
1778
  * eax = 30 - номер функции
1779
  * ebx = 4 - номер подфункции
6798 pathoswith 1780
  * ecx = указатель на строку с путём к новой текущей папке
1781
  * edx = кодировка строки, подробности указаны в описании функции 80.
1782
Возвращаемое значение:
1783
  * функция не возвращает значения
1784
----------------------------------------------------------------------
1785
---- Подфункция 5 - получить текущую папку с указанием кодировки. ----
1786
Параметры:
1787
  * eax = 30 - номер функции
1788
  * ebx = 5 - номер подфункции
6473 pathoswith 1789
  * ecx = указатель на буфер
1790
  * edx = размер буфера
6798 pathoswith 1791
  * esi = кодировка строки
6473 pathoswith 1792
Возвращаемое значение:
6798 pathoswith 1793
  * eax = длина строки в байтах (включая завершающий 0)
6473 pathoswith 1794
Замечания:
6798 pathoswith 1795
  * Если размера буфера недостаточно для копирования всего пути,
1796
    копируются только часть строки и в конце ставится завершающий 0.
6473 pathoswith 1797
  * По умолчанию, текущая папка для потока - "/rd/1".
1798
  * При создании процесса/потока текущая папка наследуется от
1799
    родителя.
1800
 
6056 IgorA 1801
---------------------- Константы для регистров: ----------------------
1802
  eax - SF_CURRENT_FOLDER (30)
1803
  ebx - SSF_SET_CF (1), SSF_GET_CF (2), SSF_ADD_SYS_FOLDER (3)
521 diamond 1804
======================================================================
3539 clevermous 1805
========= Функция 34 - узнать кому принадлежит точка экрана. =========
2511 mario79 1806
======================================================================
3539 clevermous 1807
Параметры:
1808
  * eax = 34 - номер функции
1809
  * ebx = x-координата (относительно экрана)
1810
  * ecx = y-координата (относительно экрана)
2511 mario79 1811
 
3539 clevermous 1812
Возвращаемое значение:
1813
  * eax = 0x000000XX - точка принадлежит слоту окна N
1814
    При некорректных значениях ebx и ecx функция возвращает 0
1815
  * Функция берет значения из области [_WinMapAddress]
2511 mario79 1816
 
6056 IgorA 1817
---------------------- Константы для регистров: ----------------------
1818
  eax - SF_GET_PIXEL_OWNER (34)
2511 mario79 1819
======================================================================
3539 clevermous 1820
============ Функция 35 - прочитать цвет точки на экране. ============
77 diamond 1821
======================================================================
3539 clevermous 1822
Параметры:
77 diamond 1823
  * eax = 35
3539 clevermous 1824
  * ebx = y*xsize+x, где
1825
  * (x,y) = координаты точки (считая от 0)
1826
  * xsize = размер экрана по горизонтали
1827
Возвращаемое значение:
1828
  * eax = цвет 0x00RRGGBB
1829
Замечания:
1830
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1831
    что она вычитает 1 из обоих размеров.
1832
  * К видеопамяти есть также прямой доступ (без вызовов системных
1833
    функций) через селектор gs. Параметры текущего видеорежима
1834
    можно получить функцией 61.
77 diamond 1835
 
6056 IgorA 1836
---------------------- Константы для регистров: ----------------------
1837
  eax - SF_GET_PIXEL (35)
77 diamond 1838
======================================================================
3539 clevermous 1839
=============== Функция 36 - прочитать область экрана. ===============
921 mario79 1840
======================================================================
3539 clevermous 1841
Параметры:
1842
  * eax = 36 - номер функции
1843
  * ebx = указатель на предварительно выделенную область памяти,
1844
            куда будет помещено изображение в формате BBGGRRBBGGRR...
1845
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1846
  * edx = [координата по оси x]*65536 + [координата по оси y]
1847
Возвращаемое значение:
1848
  * функция не возвращает значения
1849
Замечания:
1850
  * Координаты области - это координаты верхнего левого угла
1851
    области относительно экрана.
1852
  * Размер изображения в байтах есть 3*xsize*ysize.
921 mario79 1853
 
6056 IgorA 1854
---------------------- Константы для регистров: ----------------------
1855
  eax - SF_GET_IMAGE (36)
921 mario79 1856
======================================================================
3539 clevermous 1857
==================== Функция 37 - работа с мышью. ====================
77 diamond 1858
======================================================================
1859
 
3539 clevermous 1860
-------------- Подфункция 0 - экранные координаты мыши ---------------
1861
Параметры:
1862
  * eax = 37 - номер функции
1863
  * ebx = 0 - номер подфункции
1864
Возвращаемое значение:
1865
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
77 diamond 1866
 
3539 clevermous 1867
---------- Подфункция 1 - координаты мыши относительно окна ----------
1868
Параметры:
1869
  * eax = 37 - номер функции
1870
  * ebx = 1 - номер подфункции
1871
Возвращаемое значение:
1872
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1873
    окна приложения (считая от 0)
1874
Замечания:
1875
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1876
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1877
    относительную y-координату, а старшее - относительную x-координату
1878
    (правильного знака). В противном случае младшее слово отрицательно
1879
    и всё равно содержит относительную y-координату,
1880
    а к старшему слову следует прибавить 1.
77 diamond 1881
 
5851 pathoswith 1882
---------------- Подфункция 2 - состояния кнопок мыши ----------------
3539 clevermous 1883
Параметры:
1884
  * eax = 37 - номер функции
1885
  * ebx = 2 - номер подфункции
1886
Возвращаемое значение:
5851 pathoswith 1887
  * eax = биты 0-4 соответствуют подфункции 3
77 diamond 1888
 
5851 pathoswith 1889
----------- Подфункция 3 - состояния и события кнопок мыши -----------
1890
Параметры:
1891
  * eax = 37 - номер функции
1892
  * ebx = 3 - номер подфункции
1893
Возвращаемое значение:
1894
  * eax содержит следующую информацию:
1895
 
1896
состояния:
1897
  * бит 0 установлен = удерживается левая кнопка
1898
  * бит 1 установлен = удерживается правая кнопка
1899
  * бит 2 установлен = удерживается средняя кнопка
1900
  * бит 3 установлен = удерживается 4-я кнопка
1901
  * бит 4 установлен = удерживается 5-я кнопка
1902
 
1903
события:
1904
  * бит 8 установлен  = нажата левая кнопка
1905
  * бит 9 установлен  = нажата правая кнопка
1906
  * бит 10 установлен = нажата средняя кнопка
1907
 
1908
  * бит 15 установлен = используется вертикальная прокрутка
1909
 
1910
  * бит 16 установлен = отпущена левая кнопка
1911
  * бит 17 установлен = отпущена правая кнопка
1912
  * бит 18 установлен = отпущена средняя кнопка
1913
 
1914
  * бит 23 установлен = используется горизонтальная прокрутка
1915
 
1916
  * бит 24 установлен = двойной щелчёк левой кнопкой
1917
 
3539 clevermous 1918
------------------ Подфункция 4 - загрузить курсор -------------------
1919
Параметры:
1920
  * eax = 37 - номер функции
1921
  * ebx = 4 - номер подфункции
1922
  * dx = источник данных:
1923
  * dx = LOAD_FROM_FILE = 0 - данные в файле
1924
    * ecx = указатель на полный путь к файлу курсора
1925
    * файл курсора должен быть в формате .cur, стандартном для
1926
      MS Windows, причём размером 32*32 пикселя
1927
  * dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
1928
    * ecx = указатель на данные файла курсора
1929
    * формат данных такой же, как и в предыдущем случае
1930
  * dx = LOAD_INDIRECT = 2 - данные в памяти
1931
    * ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
1932
    * edx = 0xXXYY0002, где
1933
      * XX = x-координата "горячей точки" курсора
1934
      * YY = y-координата
277 diamond 1935
      * 0 <= XX, YY <= 31
3539 clevermous 1936
Возвращаемое значение:
1937
  * eax = 0 - неудача
1938
  * иначе eax = хэндл курсора
221 serge 1939
 
3539 clevermous 1940
------------------ Подфункция 5 - установить курсор ------------------
1941
Устанавливает новый курсор для окна текущего потока.
1942
Параметры:
1943
  * eax = 37 - номер функции
1944
  * ebx = 5 - номер подфункции
1945
  * ecx = хэндл курсора
1946
Возвращаемое значение:
1947
  * eax = хэндл предыдущего установленного курсора
1948
Замечания:
1949
  * Если передан некорректный хэндл, то функция восстановит курсор
1950
    по умолчанию (стандартную стрелку). В частности, к восстановлению
1951
    курсора по умолчанию приводит передача ecx=0.
221 serge 1952
 
3539 clevermous 1953
------------------- Подфункция 6 - удалить курсор --------------------
1954
Параметры:
1955
  * eax = 37 - номер функции
1956
  * ebx = 6 - номер подфункции
1957
  * ecx = хэндл курсора
1958
Возвращаемое значение:
1959
  * eax разрушается
1960
Замечания:
1961
  * Курсор должен был быть ранее загружен текущим потоком
1962
    (вызовом подфункции 4). Функция не удаляет системные курсоры и
1963
    курсоры, загруженные другими приложениями.
1964
  * Если удаляется активный (установленный подфункцией 5) курсор, то
1965
    восстанавливается курсор по умолчанию (стандартная стрелка).
221 serge 1966
 
3539 clevermous 1967
------------------ Подфункция 7 - данные прокрутки -------------------
1968
Параметры:
1969
  * eax = 37 - номер функции
1970
  * ebx = 7 - номер подфункции
1971
Возвращаемое значение:
499 diamond 1972
  * eax = [horizontal offset]*65536 + [vertical offset]
3539 clevermous 1973
Замечания:
1974
  * Данные доступны только активному окну.
1975
  * После прочтения значения обнуляются.
1976
  * Данные имеют знаковые значения.
486 kastigar 1977
 
6800 pathoswith 1978
------- Подфункция 8 - загрузить курсор с указанием кодировки. -------
1979
Параметры:
1980
  * eax = 37 - номер функции
1981
  * ebx = 8 - номер подфункции
1982
  * ecx = указатель на строку с путём к файлу курсора
1983
  * edx = кодировка строки, подробности указаны в описании функции 80.
1984
Возвращаемое значение:
1985
  * eax = хэндл курсора, 0 - неудача
1986
 
6056 IgorA 1987
---------------------- Константы для регистров: ----------------------
1988
  eax - SF_MOUSE_GET (37)
1989
  ebx - SSF_SCREEN_POSITION (0), SSF_WINDOW_POSITION (1),
1990
    SSF_BUTTON (2), SSF_BUTTON_EXT (3), SSF_LOAD_CURSOR (4),
1991
    SSF_SET_CURSOR (5), SSF_DEL_CURSOR (6), SSF_SCROLL_DATA (7)
77 diamond 1992
======================================================================
3539 clevermous 1993
================== Функция 38 - нарисовать отрезок. ==================
77 diamond 1994
======================================================================
3539 clevermous 1995
Параметры:
1996
  * eax = 38 - номер функции
1997
  * ebx = [координата начала по оси x]*65536 +
1998
              [координата конца по оси x]
1999
  * ecx = [координата начала по оси y]*65536 +
2000
              [координата конца по оси y]
2001
  * edx = 0x00RRGGBB - цвет
2002
    edx = 0x01xxxxxx - рисовать инверсный отрезок
2003
          (младшие 24 бита игнорируются)
2004
Возвращаемое значение:
2005
  * функция не возвращает значения
2006
Замечания:
2007
  * Координаты берутся относительно окна.
2008
  * Конечная точка также рисуется.
77 diamond 2009
 
6056 IgorA 2010
---------------------- Константы для регистров: ----------------------
2011
  eax - SF_DRAW_LINE (38)
77 diamond 2012
======================================================================
3539 clevermous 2013
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
77 diamond 2014
======================================================================
3539 clevermous 2015
Параметры:
2016
  * eax = 39 - номер функции
2017
  * ebx = 1 - номер подфункции
2018
Возвращаемое значение:
2019
  * eax = [ширина]*65536 + [высота]
2020
Замечания:
3780 Serge 2021
  * Есть парная команда установки размеров фонового изображения -
3539 clevermous 2022
    подфункция 1 функции 15. После которой, разумеется, следует
2023
    заново определить само изображение.
77 diamond 2024
 
6056 IgorA 2025
---------------------- Константы для регистров: ----------------------
2026
  eax - SF_BACKGROUND_GET (39)
77 diamond 2027
======================================================================
3539 clevermous 2028
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
77 diamond 2029
======================================================================
3539 clevermous 2030
Параметры:
2031
  * eax = 39 - номер функции
2032
  * ebx = 2 - номер подфункции
2033
  * ecx = смещение
2034
Возвращаемое значение:
2035
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
2036
    (меньше 0x160000-16)
2037
  * eax = 2 - иначе
2038
Замечания:
2039
  * Не следует полагаться на возвращаемое значение в случае неверного
2040
    смещения, оно может измениться в следующих версиях ядра.
2041
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
3780 Serge 2042
  * Есть парная функция установки точки на фоновом изображении -
3539 clevermous 2043
    подфункция 2 функции 15.
77 diamond 2044
 
6056 IgorA 2045
---------------------- Константы для регистров: ----------------------
9458 rgimad 2046
  eax - SF_BACKGROUND_GET_RECT (39)
2047
======================================================================
2048
== Функция 39, подфункция 3 - получить прямоугольную область фона    =
2049
======================================================================
2050
Параметры:
2051
  * eax = 39 - номер функции
2052
  * ebx = 3 - номер подфункции
2053
  * ecx = [x]*65536 + [y]
2054
  * edx = [width]*65536 + [height]
2055
  * esi = адрес буфера
2056
Возвращаемое значение:
2057
  * eax = 0 - успех
2058
  * eax = -1 - ошибка
2059
Замечания:
2060
  * Функция копирует указанную прямоугольную область в буфер в формате
2061
    0x00RRGGBB
2062
 
2063
---------------------- Константы для регистров: ----------------------
6056 IgorA 2064
  eax - SF_BACKGROUND_GET (39)
77 diamond 2065
======================================================================
3539 clevermous 2066
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
77 diamond 2067
======================================================================
3539 clevermous 2068
Параметры:
2069
  * eax = 39 - номер функции
2070
  * ebx = 4 - номер подфункции
2071
Возвращаемое значение:
2072
  * eax = 1 - замостить
2073
  * eax = 2 - растянуть
2074
Замечания:
3780 Serge 2075
  * Есть парная функция установки режима отрисовки фона -
3539 clevermous 2076
    подфункция 4 функции 15.
77 diamond 2077
 
6056 IgorA 2078
---------------------- Константы для регистров: ----------------------
2079
  eax - SF_BACKGROUND_GET (39)
77 diamond 2080
======================================================================
3539 clevermous 2081
======== Функция 40 - установить маску для ожидаемых событий. ========
77 diamond 2082
======================================================================
3539 clevermous 2083
Маска для ожидаемых событий влияет на функции работы с событиями 10,
2084
11, 23 - они сообщают только о событиях, разрешённых этой маской.
2085
Параметры:
2086
  * eax = 40 - номер функции
2087
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
2088
    (установленный бит разрешает извещение о событии)
3940 mario79 2089
    bit 31: фильтр активности событий мыши
2090
    bit 31 = 0 - неактивное окно всегда получает события от мыши
2091
    bit 31 = 1 - неактивное окно не получает события от мыши
2092
    bit 30: фильтр позиции курсора
2093
    bit 30 = 0 - окно принимает события мыши, если курсор
2094
                 за пределами окна
2095
    bit 30 = 1 - окно не принимает события мыши, если курсор
2096
                 за пределами окна
3539 clevermous 2097
Возвращаемое значение:
2098
  * eax = предыдущее значение маски
2099
Замечания:
2100
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
2101
    и нажатиях клавиш и кнопок.
2102
    Этого достаточно для большинства приложений.
2103
  * События, запрещённые в маске, всё равно сохраняются, если
2104
    приходят; о них просто не извещают функции работы с событиями.
2105
  * Функции работы с событиями учитывают маску на момент
2106
    вызова функции, а не на момент поступления сообщения.
77 diamond 2107
 
6056 IgorA 2108
---------------------- Константы для регистров: ----------------------
2109
  eax - SF_SET_EVENTS_MASK (40)
77 diamond 2110
======================================================================
3780 Serge 2111
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
77 diamond 2112
======================================================================
3539 clevermous 2113
К зарезервированным портам можно обращаться напрямую из приложения
9995 Doczom 2114
командами in/out .
3539 clevermous 2115
Параметры:
2116
  * eax = 46 - номер функции
2117
  * ebx = 0 - зарезервировать, 1 - освободить
2118
  * ecx = номер начала диапазона портов
2119
  * edx = номер конца диапазона портов (включительно)
2120
Возвращаемое значение:
2121
  * eax = 0 - успешно
2122
  * eax = 1 - ошибка
2123
Замечания:
2124
  * В случае резервирования портов ошибкой считается выполнение
2125
    одного из условий:
2126
    * начальный адрес больше конечного;
2127
    * указанный диапазон содержит некорректный номер порта
2128
      (корректные - от 0 до 0xFFFF);
2129
    * превышено ограничение на общее число зарезервированных областей
2130
      - допускается максимум 255;
2131
    * указанный диапазон пересекается с одним из
2132
      ранее зарезервированных
2133
  * В случае освобождения портов ошибкой считается попытка
2134
    освобождения диапазона, который ранее не был целиком
2135
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
2136
  * При обнаружении ошибки (в обоих случаях) никаких действий
2137
    не производится.
2138
  * При загрузке система резервирует за собой порты
2139
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (включительно).
2140
  * При завершении потока автоматически освобождаются все
2141
    зарезервированные им порты.
77 diamond 2142
 
6056 IgorA 2143
---------------------- Константы для регистров: ----------------------
2144
  eax - SF_SET_PORTS (46)
77 diamond 2145
======================================================================
3539 clevermous 2146
================= Функция 47 - вывести число в окно. =================
77 diamond 2147
======================================================================
3539 clevermous 2148
Параметры:
2149
  * eax = 47 - номер функции
2150
  * ebx = параметры преобразования числа в текст:
2151
    * bl = 0 - ecx содержит число
2152
    * bl = 1 - ecx содержит указатель на dword/qword-число
2153
    * bh = 0 - отображать в десятичной системе счисления
2154
    * bh = 1 - отображать в шестнадцатеричной системе
2155
    * bh = 2 - отображать в двоичной системе
2156
    * биты 16-21 = сколько цифр отображать
2157
    * биты 22-29 зарезервированы и должны быть установлены в 0
2158
    * бит 30 установлен = выводить qword (64-битное число);
2159
                              при этом должно быть bl = 1
2160
    * бит 31 установлен = не выводить ведущие нули числа
2161
  * ecx = число (при bl=0) или указатель (при bl=1)
2162
  * edx = [координата по оси x]*65536 + [координата по оси y]
6272 pathoswith 2163
  * esi = 0xXXRRGGBB, где
2164
    * RR, GG, BB задают цвет текста
2165
    * XX=0B0FCSSS (биты):
2166
      * B=1 - закрашивать фон (цвет = edi)
2167
      * F задает шрифт:
2168
 
2169
        1 = 8x16
2170
      * C=0 - рисовать в окно,
2171
        С=1 - рисовать в буфер (edi)
2172
      * SSS = (множитель размера)-1, то-есть 0 = x1, 7 = x8
3539 clevermous 2173
Возвращаемое значение:
2174
  * функция не возвращает значения
2175
Замечания:
2176
  * Указанная длина не должна превосходить 60.
2177
  * Выводится ровно указанное количество цифр. Если число мало и
2178
    может быть записано меньшим количеством цифр, оно дополняется
2179
    ведущими нулями; если число велико и не может быть записано
2180
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
77 diamond 2181
 
6056 IgorA 2182
---------------------- Константы для регистров: ----------------------
2183
  eax - SF_DRAW_NUMBER (47)
77 diamond 2184
======================================================================
3539 clevermous 2185
======= Функция 48, подфункция 0 - применить настройки экрана. =======
77 diamond 2186
======================================================================
3539 clevermous 2187
Параметры:
2188
  * eax = 48 - номер функции
2189
  * ebx = 0 - номер подфункции
2190
  * ecx = 0 - зарезервировано
2191
Возвращаемое значение:
2192
  * функция не возвращает значения
2193
Замечания:
2194
  * Функция перерисовывает экран после изменения параметров
2195
    подфункциями 1 и 2.
2196
  * Вызов функции без предшествующих вызовов указанных подфункций
2197
    игнорируется.
2198
  * Вызов функции с ненулевым ecx игнорируется.
77 diamond 2199
 
6056 IgorA 2200
---------------------- Константы для регистров: ----------------------
2201
  eax - SF_STYLE_SETTINGS (48)
2202
  ebx - SSF_APPLY (0)
77 diamond 2203
======================================================================
3539 clevermous 2204
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
77 diamond 2205
======================================================================
3539 clevermous 2206
Параметры:
2207
  * eax = 48 - номер функции
2208
  * ebx = 1 - номер подфункции
2209
  * ecx = тип кнопок:
2210
    * 0 = плоские
2211
    * 1 = объёмные
2212
Возвращаемое значение:
2213
  * функция не возвращает значения
2214
Замечания:
3780 Serge 2215
  * После вызова описываемой функции следует перерисовать экран
3539 clevermous 2216
    подфункцией 0.
2217
  * Тип кнопок влияет только на их прорисовку функцией 8.
77 diamond 2218
 
6056 IgorA 2219
---------------------- Константы для регистров: ----------------------
2220
  eax - SF_STYLE_SETTINGS (48)
2221
  ebx - SSF_SET_BUTTON_STYLE (1)
77 diamond 2222
======================================================================
3539 clevermous 2223
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
77 diamond 2224
======================================================================
3539 clevermous 2225
Параметры:
2226
  * eax = 48 - номер функции
2227
  * ebx = 2 - номер подфункции
2228
  * ecx = указатель на таблицу цветов
2229
  * edx = размер таблицы цветов
2230
    (должен быть 40 байт для будущей совместимости)
2231
Формат таблицы цветов указан в описании подфункции 3.
2232
Возвращаемое значение:
2233
  * функция не возвращает значения
2234
Замечания:
3780 Serge 2235
  * После вызова описываемой функции следует перерисовать экран
3539 clevermous 2236
    подфункцией 0.
2237
  * Таблица стандартных цветов влияет только на приложения,
2238
    которые эту таблицу явным образом получают (подфункцией 3) и
2239
    используют (указывая цвета из неё при вызовах функций рисования).
2240
  * Таблица стандартных цветов входит в скин и устанавливается заново
2241
    при установке скина (подфункции 8).
2242
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
2243
    приложения desktop.
77 diamond 2244
 
6056 IgorA 2245
---------------------- Константы для регистров: ----------------------
2246
  eax - SF_STYLE_SETTINGS (48)
2247
  ebx - SSF_SET_COLORS (2)
77 diamond 2248
======================================================================
3539 clevermous 2249
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
77 diamond 2250
======================================================================
3539 clevermous 2251
Параметры:
2252
  * eax = 48 - номер функции
2253
  * ebx = 3 - номер подфункции
2254
  * ecx = указатель на буфер размером edx байт,
2255
    куда будет записана таблица
2256
  * edx = размер таблицы цветов
2257
    (должен быть 40 байт для будущей совместимости)
2258
Возвращаемое значение:
2259
  * функция не возвращает значения
2260
Формат таблицы цветов: каждый элемент -
2261
dword-значение цвета 0x00RRGGBB
9052 leency 2262
  * +0: dword: none - зарезервировано
2263
  * +4: dword: none - зарезервировано
2264
  * +8: dword: work_dark - темный цвет рабочей области для придания
2265
    объемна элементам интерфейса
2266
  * +12 = +0xC: dword: work_light - светлый цвет рабочей области для
2267
    придания объемна элементам интерфейса
3539 clevermous 2268
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
2269
  * +20 = +0x14: dword: work - цвет рабочей области
9052 leency 2270
  * +24 = +0x18: dword: button - цвет кнопки в рабочей области
2271
  * +28 = +0x1C: dword: button_text - цвет текста на кнопке
3539 clevermous 2272
    в рабочей области
2273
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
9052 leency 2274
  * +36 = +0x24: dword: graph - цвет графики в рабочей области
3539 clevermous 2275
Замечания:
2276
  * Структура таблицы цветов описана в стандартном включаемом файле
2277
    macros.inc под названием system_colors; например, можно писать:
2278
    	sc	system_colors		; объявление переменной
2279
    	...				; где-то надо вызвать
2280
    					; описываемую функцию с ecx=sc
9052 leency 2281
    	mov	ecx, [sc.button_text]	; читаем цвет текста
3539 clevermous 2282
    					; на кнопке в рабочей области
2283
  * Использование/неиспользование этих цветов - дело исключительно
2284
    самой программы. Для использования нужно просто при вызове функций
2285
    рисования указывать цвет, взятый из этой таблицы.
2286
  * При изменении таблицы стандартных цветов (подфункцией 2 с
2287
    последующим применением изменений подфункцией 0 или
2288
    при установке скина подфункцией 8) всем окнам посылается сообщение
2289
    о необходимости перерисовки (событие с кодом 1).
2290
  * Стандартные цвета можно просматривать/изменять интерактивно
2291
    с помощью приложения desktop.
77 diamond 2292
 
6056 IgorA 2293
---------------------- Константы для регистров: ----------------------
2294
  eax - SF_STYLE_SETTINGS (48)
2295
  ebx - SSF_GET_COLORS (3)
77 diamond 2296
======================================================================
3539 clevermous 2297
========== Функция 48, подфункция 4 - получить высоту скина. =========
77 diamond 2298
======================================================================
3539 clevermous 2299
Параметры:
2300
  * eax = 48 - номер функции
2301
  * ebx = 4 - номер подфункции
2302
Возвращаемое значение:
2303
  * eax = высота скина
2304
Замечания:
2305
  * Высотой скина по определению считается высота заголовка окон,
2306
    использующих скин.
2307
  * Смотри также общую структуру окна в описании функции 0.
77 diamond 2308
 
6056 IgorA 2309
---------------------- Константы для регистров: ----------------------
2310
  eax - SF_STYLE_SETTINGS (48)
2311
  ebx - SSF_GET_SKIN_HEIGHT (4)
77 diamond 2312
======================================================================
3539 clevermous 2313
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
77 diamond 2314
======================================================================
3539 clevermous 2315
Параметры:
2316
  * eax = 48 - номер функции
2317
  * ebx = 5 - номер подфункции
2318
Возвращаемое значение:
77 diamond 2319
  * eax = [left]*65536 + [right]
2320
  * ebx = [top]*65536 + [bottom]
3539 clevermous 2321
Замечания:
2322
  * Рабочая область экрана определяет положение и координаты
2323
    максимизированного окна.
2324
  * Рабочая область экрана при нормальной работе есть весь экран
5452 leency 2325
    за вычетом панели (@taskbar).
3539 clevermous 2326
  * (left,top) - координаты левого верхнего угла,
2327
    (right,bottom) - координаты правого нижнего.
2328
    Таким образом, размер рабочей области по оси x определяется
8994 leency 2329
    формулой right-left+1, по оси y - формулой bottom-top+1.
3539 clevermous 2330
  * Смотри также функцию 14,
2331
    позволяющую определить размеры всего экрана.
2332
  * Есть парная функция установки рабочей области - подфункция 6.
77 diamond 2333
 
6056 IgorA 2334
---------------------- Константы для регистров: ----------------------
2335
  eax - SF_STYLE_SETTINGS (48)
2336
  ebx - SSF_GET_SCREEN_AREA (5)
77 diamond 2337
======================================================================
3539 clevermous 2338
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
77 diamond 2339
======================================================================
3539 clevermous 2340
Параметры:
2341
  * eax = 48 - номер функции
2342
  * ebx = 6 - номер подфункции
77 diamond 2343
  * ecx = [left]*65536 + [right]
2344
  * edx = [top]*65536 + [bottom]
3539 clevermous 2345
Возвращаемое значение:
2346
  * функция не возвращает значения
2347
Замечания:
2348
  * Рабочая область экрана определяет положение и координаты
2349
    максимизированного окна.
5452 leency 2350
  * Эта функция используется только приложением @taskbar,
3539 clevermous 2351
    устанавливающим рабочей областью весь экран за вычетом панели.
2352
  * (left,top) - координаты левого верхнего угла,
2353
    (right,bottom) - координаты правого нижнего.
2354
    Таким образом, размер рабочей области по оси x определяется
2355
    формулой right-left+1, по оси y - формулой bottom-right+1.
2356
  * Если left>=right, то x-координаты рабочей области не изменяются.
2357
    Если left<0, то left не устанавливается. Если right больше
2358
    или равно ширины экрана, то right не устанавливается.
2359
    Аналогично по оси y.
2360
  * Смотри также функцию 14,
2361
    позволяющую определить размеры всего экрана.
3780 Serge 2362
  * Есть парная функция получения рабочей области -
3539 clevermous 2363
    подфункция 5.
2364
  * Эта функция автоматически перерисовывает экран, по ходу дела
2365
    обновляет координаты и размеры максимизированных окон.
2366
    Все окна извещаются о необходимости перерисовки (событие 1).
77 diamond 2367
 
6056 IgorA 2368
---------------------- Константы для регистров: ----------------------
2369
  eax - SF_STYLE_SETTINGS (48)
2370
  ebx - SSF_SET_SCREEN_AREA (6)
77 diamond 2371
======================================================================
3539 clevermous 2372
====================== Функция 48, подфункция 7 ======================
2373
============ Получить область скина для текста заголовка. ============
77 diamond 2374
======================================================================
3539 clevermous 2375
Возвращает область заголовка окна со скином, предназначенную
2376
для вывода текста заголовка.
2377
Параметры:
2378
  * eax = 48 - номер функции
2379
  * ebx = 7 - номер подфункции
2380
Возвращаемое значение:
77 diamond 2381
  * eax = [left]*65536 + [right]
2382
  * ebx = [top]*65536 + [bottom]
3539 clevermous 2383
Замечания:
2384
  * Использование/неиспользование этой функции -
2385
    личное дело приложения.
2386
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2387
    при выборе места для рисования текста заголовка (функцией 4) или
2388
    какого-нибудь заменителя текста заголовка
2389
    (по усмотрению приложения).
77 diamond 2390
 
6056 IgorA 2391
---------------------- Константы для регистров: ----------------------
2392
  eax - SF_STYLE_SETTINGS (48)
2393
  ebx - SSF_GET_SKIN_MARGINS (7)
77 diamond 2394
======================================================================
3539 clevermous 2395
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
77 diamond 2396
======================================================================
3539 clevermous 2397
Параметры:
2398
  * eax = 48 - номер функции
2399
  * ebx = 8 - номер подфункции
2400
  * ecx = указатель на имя файла скина
2401
Возвращаемое значение:
2402
  * eax = 0 - успешно
2403
  * eax = 1 - не удалось загрузить файл
2404
  * eax = 2 - файл не является файлом скина
2405
Замечания:
2406
  * При успешной загрузке скина все окна извещаются о необходимости
2407
    перерисовки (событие 1).
2408
  * При загрузке система считывает скин из файла default.skn
2409
    на рамдиске.
2410
  * Пользователь может изменять скин статически, создав свой
2411
    default.skn, или динамически с помощью приложения desktop.
77 diamond 2412
 
6056 IgorA 2413
---------------------- Константы для регистров: ----------------------
2414
  eax - SF_STYLE_SETTINGS (48)
2415
  ebx - SSF_SET_SKIN (8)
77 diamond 2416
======================================================================
5848 pathoswith 2417
= Функция 48, подфункция 9 - получить настройку сглаживания шрифтов. =
5682 leency 2418
======================================================================
2419
Параметры:
2420
  * eax = 48 - номер функции
2421
  * ebx = 9 - номер подфункции
5848 pathoswith 2422
Возвращаемое значение:
2423
  * eax = 2 - субпиксельное, 1 - обычное, 0 - выключить
5682 leency 2424
 
6056 IgorA 2425
---------------------- Константы для регистров: ----------------------
2426
  eax - SF_STYLE_SETTINGS (48)
2427
  ebx - SSF_GET_FONT_SMOOTH (9)
5682 leency 2428
======================================================================
5848 pathoswith 2429
===== Функция 48, подфункция 10 - настроить сглаживание шрифтов. =====
2430
======================================================================
2431
Параметры:
2432
  * eax = 48 - номер функции
2433
  * ebx = 10 - номер подфункции
2434
  * cl  = 2 - субпиксельное, 1 - обычное, 0 - выключить
2435
 
6056 IgorA 2436
---------------------- Константы для регистров: ----------------------
2437
  eax - SF_STYLE_SETTINGS (48)
2438
  ebx - SSF_SET_FONT_SMOOTH (10)
5848 pathoswith 2439
======================================================================
5867 pathoswith 2440
======== Функция 48, подфункция 11 - получить размер шрифтов. ========
2441
======================================================================
2442
Параметры:
2443
  * eax = 48 - номер функции
7722 dunkaist 2444
  * ebx = 11 - номер подфункции
5867 pathoswith 2445
Возвращаемое значение:
2446
  * eax = текущая высота шрифта в пикселях
2447
 
6056 IgorA 2448
---------------------- Константы для регистров: ----------------------
2449
  eax - SF_STYLE_SETTINGS (48)
2450
  ebx - SSF_GET_FONT_SIZE (11)
5867 pathoswith 2451
======================================================================
2452
======= Функция 48, подфункция 12 - установить размер шрифтов. =======
2453
======================================================================
2454
Параметры:
2455
  * eax = 48 - номер функции
7722 dunkaist 2456
  * ebx = 12 - номер подфункции
5867 pathoswith 2457
  * cl  = новая высота шрифта в пикселях
2458
 
6056 IgorA 2459
---------------------- Константы для регистров: ----------------------
2460
  eax - SF_STYLE_SETTINGS (48)
2461
  ebx - SSF_SET_FONT_SIZE (12)
5867 pathoswith 2462
======================================================================
6800 pathoswith 2463
= Функция 48, подфункция 13 - установить скин с указанием кодировки. =
2464
======================================================================
2465
Параметры:
2466
  * eax = 48 - номер функции
2467
  * ebx = 13 - номер подфункции
2468
  * ecx = указатель на строку с путём к файлу скина
2469
  * edx = кодировка строки, подробности указаны в описании функции 80.
2470
Возвращаемое значение:
2471
  * eax = 0 - успешно
2472
  * eax = 1 - не удалось загрузить файл
2473
  * eax = 2 - файл не является файлом скина
2474
Замечания:
2475
  * При успешной загрузке скина все окна извещаются о необходимости
2476
    перерисовки (событие 1).
2477
  * При загрузке система считывает скин из файла default.skn
2478
    на рамдиске.
2479
  * Пользователь может изменять скин статически, создав свой
2480
    default.skn, или динамически с помощью приложения desktop.
2481
 
2482
======================================================================
3539 clevermous 2483
============ Функция 49 - Advanced Power Management (APM). ===========
78 diamond 2484
======================================================================
3539 clevermous 2485
Параметры:
2486
  * eax = 49 - номер функции
2487
  * dx = номер функции APM (аналог ax в спецификации)
2488
  * bx, cx = параметры функции APM
2489
Возвращаемое значение:
2490
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2491
    установлены в соответствии со спецификацией APM
2492
  * старшие половины 32-битных регистров eax, ebx, ecx,
2493
    edx, esi, edi разрушаются
2494
Замечания:
2495
  * Спецификация APM 1.2 описывается в документе
78 diamond 2496
    "Advanced Power Management (APM) BIOS Specification"
3539 clevermous 2497
    (Revision 1.2), доступном на
78 diamond 2498
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
3539 clevermous 2499
    кроме того, она включена в известный Interrupt List by Ralf Brown
78 diamond 2500
    (http://www.pobox.com/~ralf/files.html,
2501
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2502
 
6056 IgorA 2503
---------------------- Константы для регистров: ----------------------
2504
  eax - SF_APM (49)
78 diamond 2505
======================================================================
3539 clevermous 2506
================= Функция 50 - установка формы окна. =================
77 diamond 2507
======================================================================
3539 clevermous 2508
Обычные окна представляют собой прямоугольники. С помощью этой функции
2509
окну можно придать произвольную форму. Форма задаётся набором точек
2510
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2511
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2512
функцией 67.
77 diamond 2513
 
3539 clevermous 2514
--------------- Установка данных с информацией о форме ---------------
2515
Параметры:
2516
  * eax = 50 - номер функции
2517
  * ebx = 0 - номер подфункции
2518
  * ecx = указатель на данные формы (массив байт 0/1)
2519
Возвращаемое значение:
2520
  * функция не возвращает значения
77 diamond 2521
 
3539 clevermous 2522
------------------ Установка масштаба данных формы -------------------
2523
Параметры:
2524
  * eax = 50 - номер функции
2525
  * ebx = 1 - номер подфункции
2526
  * ecx задаёт масштаб: каждый байт данных определяет
2527
    (2^scale)*(2^scale) пикселей
2528
Возвращаемое значение:
2529
  * функция не возвращает значения
2530
Замечания:
2531
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2532
    данных формы один байт соответствует одному пикселю, то масштаб
2533
    можно не устанавливать.
2534
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2535
    обратите внимание, что они на единицу больше, чем устанавливаемые
2536
    функциями 0, 67.
2537
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2538
  * Байт данных по смещению a должен быть 0/1 и
2539
    определяет принадлежность окну квадрата со стороной 2^scale
2540
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
77 diamond 2541
    (a mod (xsize shr scale), a div (xsize shr scale))
3539 clevermous 2542
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2543
  * Данные должны присутствовать в памяти и не меняться
2544
    после установки формы.
2545
  * Система просматривает данные о форме при каждой перерисовке окна
2546
    функцией 0.
2547
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2548
    к прямоугольной форме.
77 diamond 2549
 
6056 IgorA 2550
---------------------- Константы для регистров: ----------------------
2551
  eax - SF_SET_WINDOW_SHAPE (50)
77 diamond 2552
======================================================================
10002 Jurgen 2553
===================== Функция 51, подфункция 1 =======================
2554
========================== Создать поток =============================
77 diamond 2555
======================================================================
3539 clevermous 2556
Параметры:
2557
  * eax = 51 - номер функции
10002 Jurgen 2558
  * ebx = 1 - номер подфункции
3539 clevermous 2559
  * ecx = адрес точки входа потока (начальный eip)
2560
  * edx = указатель стэка потока (начальный esp)
2561
Возвращаемое значение:
2562
  * eax = -1 - ошибка (в системе слишком много потоков)
2563
  * иначе eax = TID - идентификатор потока
77 diamond 2564
 
6056 IgorA 2565
---------------------- Константы для регистров: ----------------------
2566
  eax - SF_CREATE_THREAD (51)
77 diamond 2567
======================================================================
10002 Jurgen 2568
===================== Функция 51, подфункция 2 =======================
2569
=================== Получить номер слота потока ======================
2570
======================================================================
2571
Параметры:
2572
  * eax = 51 - номер функции
2573
  * ebx = 2 - номер подфункции
2574
Возвращаемое значение:
2575
  * eax = номер слота потока
2576
 
2577
======================================================================
2578
===================== Функция 51, подфункция 3 =======================
2579
==================== Получить приоритет потока =======================
2580
======================================================================
2581
Параметры:
2582
  * eax = 51 - номер функции
2583
  * ebx = 3 - номер подфункции
2584
  * ecx = номер слота потока или -1 (текущий поток)
2585
Возвращаемое значение:
2586
  * eax = -1 - ошибка (неверный номер слота потока или поток завершен)
2587
  * иначе eax = номер приоритета потока
2588
Замечания:
2589
  * Приоритет потока имеет диапазон значений от 0 до 255.
2590
  Значение 0 - наивысший приоритет потока, устанавливаемый по умолчанию при создании потока.
2591
 
2592
======================================================================
2593
===================== Функция 51, подфункция 4 =======================
2594
=================== Установить приоритет потока ======================
2595
======================================================================
2596
Параметры:
2597
  * eax = 51 - номер функции
2598
  * ebx = 4 - номер подфункции
2599
  * ecx = номер слота потока или -1 (текущий поток)
2600
  * edx = приоритет потока
2601
Возвращаемое значение:
2602
  * eax = -1 - ошибка (неверный номер слота потока или поток завершен)
2603
  * иначе eax = старое значение приоритета потока
2604
Замечания:
2605
  * Приоритет потока имеет диапазон значений от 0 до 255.
2606
  Значение 0 - наивысший приоритет потока, устанавливаемый по умолчанию при создании потока.
2607
 
2608
======================================================================
4199 mario79 2609
====================== Функция 54, подфункция 0 ======================
2610
============== Узнать количество слотов в буфере обмена. =============
2611
======================================================================
2612
Параметры:
2613
  * eax = 54 - номер функции
2614
  * ebx = 0 - номер подфункции
2615
Возвращаемое значение:
6473 pathoswith 2616
  * eax = количество слотов в буфере
4199 mario79 2617
  * eax = -1 - отсутствует область главного списка
2618
 
6056 IgorA 2619
---------------------- Константы для регистров: ----------------------
2620
  eax - SF_CLIPBOARD (54)
2621
  ebx - SSF_GET_SLOT_COUNT (0)
4199 mario79 2622
======================================================================
2623
====================== Функция 54, подфункция 1 ======================
2624
================== Считать данные из буфера обмена. ==================
2625
======================================================================
2626
Параметры:
2627
  * eax = 54 - номер функции
2628
  * ebx = 1 - номер подфункции
2629
  * eсx = номер слота
2630
Возвращаемое значение:
2631
  * eax = если успешно - указатель на область памяти с данными
2632
  * eax = 1 - ошибка
2633
  * eax = -1 - отсутствует область главного списка
6369 IgorA 2634
Замечания:
2635
  * буфер, на который указывает eax, содержит следующую информацию:
2636
    * +0: dword: общая длина данных
2637
    * +4: dword: определяет тип данныx:
2638
      * 0 = Текст
2639
      * 1 = Текст с блочным выделением
2640
      * 2 = Изображение
2641
      * 3 = RAW
2642
      * 4 и выше зарезервировано
2643
    * +8: более детально смотрите файл clipboard_container_rus.txt
6974 0CodErr 2644
  * Функция должна использоваться совместно с 68.11. Приложение должно
2645
    предварительно проинициализировать локальную кучу вызовом 68.11.
2646
 
6056 IgorA 2647
---------------------- Константы для регистров: ----------------------
2648
  eax - SF_CLIPBOARD (54)
2649
  ebx - SSF_READ_CB (1)
4199 mario79 2650
======================================================================
2651
====================== Функция 54, подфункция 2 ======================
2652
================== Записать данные в буфер обмена. ===================
2653
======================================================================
2654
Параметры:
2655
  * eax = 54 - номер функции
2656
  * ebx = 2 - номер подфункции
2657
  * eсx = количество копируемых байт
2658
  * edx = указатель на буфер под копируемые данные
2659
Возвращаемое значение:
2660
  * eax = 0 - успешно
2661
  * eax = 1 - ошибка
2662
  * eax = -1 - отсутствует область главного списка
2663
 
6056 IgorA 2664
---------------------- Константы для регистров: ----------------------
2665
  eax - SF_CLIPBOARD (54)
2666
  ebx - SSF_WRITE_CB (2)
4199 mario79 2667
======================================================================
2668
====================== Функция 54, подфункция 3 ======================
2669
========= Удалить последний слот с данными в буфере обмена ===========
2670
======================================================================
2671
Параметры:
2672
  * eax = 54 - номер функции
2673
  * ebx = 3 - номер подфункции
2674
Возвращаемое значение:
2675
  * eax = 0 - успешно
2676
  * eax = 1 - ошибка
2677
  * eax = -1 - отсутствует область главного списка
2678
 
6056 IgorA 2679
---------------------- Константы для регистров: ----------------------
2680
  eax - SF_CLIPBOARD (54)
2681
  ebx - SSF_DEL_SLOT (3)
4199 mario79 2682
======================================================================
2683
====================== Функция 54, подфункция 4 ======================
2684
=================== Аварийный сброс блокировки буфера ================
2685
======================================================================
2686
Параметры:
2687
  * eax = 54 - номер функции
2688
  * ebx = 4 - номер подфункции
2689
Возвращаемое значение:
2690
  * eax = 0 - успешно
2691
  * eax = -1 - отсутствует область главного списка или нет блокировки
2692
Замечания:
2693
  * Используется в исключительных случаях, когда зависшее или убитое
2694
    приложение заблокировало работу с буфером обмена.
2695
 
6056 IgorA 2696
---------------------- Константы для регистров: ----------------------
2697
  eax - SF_CLIPBOARD (54)
2698
  ebx - SSF_UNLOCK_BUFFER (4)
4199 mario79 2699
======================================================================
3539 clevermous 2700
====================== Функция 55, подфункция 55 =====================
2701
========== Начать проигрывать данные на встроенном спикере. ==========
77 diamond 2702
======================================================================
3539 clevermous 2703
Параметры:
2704
  * eax = 55 - номер функции
2705
  * ebx = 55 - номер подфункции
2706
  * esi = указатель на данные
2707
Возвращаемое значение:
2708
  * eax = 0 - успешно
2709
  * eax = 55 - ошибка (спикер отключён или занят)
2710
Данные - это массив элементов переменной длины.
2711
Формат каждого элемента определяется первым байтом:
2712
  * 0 = конец данных
2713
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2714
    ноты, определяемой непосредственным значением частоты
2715
    * следующее слово (2 байта) содержит делитель частоты;
2716
      частота определяется как 1193180/divider
77 diamond 2717
  * 0x81 = invalid
3539 clevermous 2718
  * 0x82..0xFF = нота, определяемая октавой и номером:
2719
    * длительность в сотых долях секунды = (первый байт)-0x81
2720
    * присутствует ещё один байт;
2721
    * (второй байт)=0xFF - пауза
2722
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2723
      до 12, a=номер октавы (считая с 0)
2724
Замечания:
2725
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2726
    функции 18.
2727
  * Функция возвращает управление, сообщив куда следует информацию
2728
    о запросе. Само проигрывание идёт независимо от программы.
2729
  * Данные должны сохраняться в памяти по крайней мере
2730
    до конца проигрывания.
77 diamond 2731
 
6056 IgorA 2732
---------------------- Константы для регистров: ----------------------
2733
  eax - SF_SPEAKER_PLAY (55)
77 diamond 2734
======================================================================
3539 clevermous 2735
======================= Функция 57 - PCI BIOS. =======================
586 serge 2736
======================================================================
3539 clevermous 2737
Параметры:
2738
  * eax = 57 - номер функции
2739
  * ebp соответствует регистру al в спецификации PCI BIOS
2740
  * остальные регистры - по спецификации PCI BIOS
2741
Возвращаемое значение:
2742
  * CF не определён
2743
  * остальные регистры - по спецификации PCI BIOS
2744
Замечания:
2745
  * Многих результатов этой функции можно также добиться вызовом
2746
    соответствующих подфункций функции 62.
2747
  * Функция вызывает расширение PCI32 BIOS, документированное,
2748
    например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
2749
  * Если BIOS не поддерживает это расширение, поведение функции
2750
    эмулируется (через аналоги подфункций функции 62 режима ядра).
586 serge 2751
 
6056 IgorA 2752
---------------------- Константы для регистров: ----------------------
2753
  eax - SF_PCI_BIOS (57)
586 serge 2754
======================================================================
3539 clevermous 2755
=========== Функция 60 - Inter Process Communication (IPC). ==========
77 diamond 2756
======================================================================
3539 clevermous 2757
IPC применяется для посылок сообщений от одного процесса/потока
2758
другому. При этом следует предварительно договориться о том, как
2759
интерпретировать конкретное сообщение.
77 diamond 2760
 
3539 clevermous 2761
-------- Подфункция 1 - установить область для получения IPC ---------
2762
Вызывается процессом-приёмником.
2763
Параметры:
2764
  * eax = 60 - номер функции
2765
  * ebx = 1 - номер подфункции
2766
  * ecx = указатель на буфер
2767
  * edx = размер буфера
2768
Возвращаемое значение:
2769
  * eax = 0 - всегда успешно
2770
Формат IPC-буфера:
2771
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
2772
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
2773
    и вам надо, чтобы извне не изменялись данные буфера
2774
    (не поступали новые сообщения)
2775
  * +4: dword: занято места в буфере (в байтах)
2776
  * +8: первое сообщение
2777
  * +8+n: второе сообщение
77 diamond 2778
  * ...
3539 clevermous 2779
Формат сообщения:
2780
  * +0: dword: PID процесса/потока, пославшего сообщение
2781
  * +4: dword: длина сообщения (не считая этот заголовок)
2782
  * +8: n*byte: данные сообщения
77 diamond 2783
 
3539 clevermous 2784
--------------- Подфункция 2 - послать сообщение IPC. ----------------
2785
Вызывается процессом-инициатором.
2786
Параметры:
2787
  * eax = 60 - номер функции
2788
  * ebx = 2 - номер подфункции
2789
  * ecx = PID приёмника
2790
  * edx = указатель на данные сообщения
2791
  * esi = длина сообщения (в байтах)
2792
Возвращаемое значение:
2793
  * eax = 0 - успешно
2794
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
2795
    (может быть, ещё не успел, а может быть, это не тот поток,
2796
    который нужен)
2797
  * eax = 2 - приёмник заблокировал IPC-буфер;
2798
    попробуйте немного подождать
2799
  * eax = 3 - переполнение IPC-буфера приёмника
2800
  * eax = 4 - процесса/потока с таким PID не существует
2801
Замечания:
2802
  * Система сразу после записи IPC-сообщения в буфер посылает
2803
    потоку-приёмнику событие с кодом 7 (см. коды событий).
77 diamond 2804
 
6056 IgorA 2805
---------------------- Константы для регистров: ----------------------
2806
  eax - SF_IPC (60)
2807
  ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2)
77 diamond 2808
======================================================================
3539 clevermous 2809
=== Функция 61 - получить параметры для прямого доступа к графике. ===
77 diamond 2810
======================================================================
3539 clevermous 2811
Программе доступны данные графического экрана (область памяти, которая
2812
собственно и отображает содержимое экрана) напрямую без вызовов
2813
системных функций через селектор gs:
1662 Nasarus 2814
	mov	eax, [gs:0]
3539 clevermous 2815
поместит в eax первый dword буфера, содержащий информацию о цвете
2816
левой верхней точки (и, возможно, цвета нескольких следующих).
1662 Nasarus 2817
	mov	[gs:0], eax
3539 clevermous 2818
при работе в режимах VESA c LFB
2819
установит цвет левой верхней точки
2820
(и возможно, цвета нескольких следующих).
2821
Для интерпретации данных графического экрана требуется знание
2822
некоторых параметров, которые возвращаются этой функцией.
2823
Замечания:
7121 dunkaist 2824
  * Параметры графики очень редко меняются при работе системы.
3539 clevermous 2825
  * При изменении видеорежима система перерисовывает все окна
2826
    (событие с кодом 1) и перерисовывает фон (событие 5).
2827
    Эти же события происходят и в других случаях,
2828
    которые встречаются значительно чаще, чем изменение видеорежима.
2829
  * При работе в видеорежимах с LFB селектор gs указывает на
2830
    собственно LFB, так что чтение/запись по gs приводят
2831
    непосредственно к изменению содержимого экрана. При работе в
2832
    видеорежимах без LFB gs указывает на некоторую область данных
2833
    ядра, причём все функции вывода на экран добросовестно выполняют
2834
    двойную работу по записи непосредственно на экран и по записи
2835
    в этот буфер. В результате при чтении содержимого этого буфера
2836
    результаты соответствуют содержимому экрана
2837
    (с, вообще говоря, большим цветовым разрешением),
2838
    а запись игнорируется.
2839
    Исключением является режим 320*200, для которого в главном цикле
2840
    системного потока выполняется обновление экрана в соответствии
2841
    с движениями курсора мыши.
77 diamond 2842
 
3539 clevermous 2843
------------------------- Разрешение экрана --------------------------
2844
Параметры:
2845
  * eax = 61 - номер функции
2846
  * ebx = 1 - номер подфункции
2847
Возвращаемое значение:
2848
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
2849
Замечания:
2850
  * Можно использовать функцию 14 с учётом того, что она возвращает
2851
    размеры на 1 меньше. Это полностью эквивалентный способ.
77 diamond 2852
 
3539 clevermous 2853
------------------------ Число бит на пиксель ------------------------
2854
Параметры:
2855
  * eax = 61 - номер функции
2856
  * ebx = 2 - номер подфункции
2857
Возвращаемое значение:
2858
  * eax = число бит на пиксель (24 или 32)
77 diamond 2859
 
3539 clevermous 2860
------------------------ Число байт на строку ------------------------
2861
Параметры:
2862
  * eax = 61 - номер функции
2863
  * ebx = 3 - номер подфункции
2864
Возвращаемое значение:
2865
  * eax = число байт, которое занимает одна строка развёртки
2866
    (горизонтальная линия на экране)
77 diamond 2867
 
6056 IgorA 2868
---------------------- Константы для регистров: ----------------------
2869
  eax - SF_GET_GRAPHICAL_PARAMS (61)
2870
  ebx - SSF_SCREEN_SIZE (1), SSF_BITS_PER_PIXEL (2),
2871
    SSF_BYTES_PER_LINE (3)
77 diamond 2872
======================================================================
3539 clevermous 2873
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
77 diamond 2874
======================================================================
3539 clevermous 2875
Параметры:
2876
  * eax = 62 - номер функции
2877
  * bl = 0 - номер подфункции
2878
Возвращаемое значение:
2879
  * eax = -1 - доступ к PCI запрещён; иначе
2880
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
2881
  * старшее слово eax обнулено
2882
Замечания:
2883
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2884
    для приложений подфункцией 12 функции 21.
2885
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
77 diamond 2886
 
6056 IgorA 2887
---------------------- Константы для регистров: ----------------------
2888
  eax - SF_PCI (62)
2889
  ebx - SSF_GET_VERSION (0)
77 diamond 2890
======================================================================
3539 clevermous 2891
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
77 diamond 2892
======================================================================
3539 clevermous 2893
Параметры:
2894
  * eax = 62 - номер функции
2895
  * bl = 1 - номер подфункции
2896
Возвращаемое значение:
2897
  * eax = -1 - доступ к PCI запрещён; иначе
2898
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
2899
Замечания:
2900
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2901
    для приложений подфункцией 12 функции 21.
2902
  * Если PCI BIOS не поддерживается, то значение al неопределено.
77 diamond 2903
 
6056 IgorA 2904
---------------------- Константы для регистров: ----------------------
2905
  eax - SF_PCI (62)
2906
  ebx - SSF_GET_LAST_BUS (1)
77 diamond 2907
======================================================================
3539 clevermous 2908
====================== Функция 62, подфункция 2 ======================
2909
== Получить механизм обращения к конфигурационному пространству PCI. =
77 diamond 2910
======================================================================
3539 clevermous 2911
Параметры:
2912
  * eax = 62 - номер функции
2913
  * bl = 2 - номер подфункции
2914
Возвращаемое значение:
2915
  * eax = -1 - доступ к PCI запрещён; иначе
2916
  * al = механизм (1 или 2); прочие байты eax разрушаются
2917
Замечания:
2918
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2919
    для приложений подфункцией 12 функции 21.
2920
  * Механизм обращения выбирается в соответствии
2921
    с характеристиками оборудования.
2922
  * Подфункции чтения и записи автоматически работают
2923
    с выбранным механизмом.
77 diamond 2924
 
6056 IgorA 2925
---------------------- Константы для регистров: ----------------------
2926
  eax - SF_PCI (62)
2927
  ebx - SSF_GET_ADRR_MODE (2)
77 diamond 2928
======================================================================
3539 clevermous 2929
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
77 diamond 2930
======================================================================
3539 clevermous 2931
Параметры:
2932
  * eax = 62 - номер функции
2933
  * bl = 4 - читать байт
2934
  * bl = 5 - читать слово
2935
  * bl = 6 - читать двойное слово
2936
  * bh = номер PCI-шины
2937
  * ch = dddddfff, где ddddd = номер устройства на шине,
2938
    fff = номер функции устройства
2939
  * cl = номер регистра (должен быть чётным для bl=5,
2940
    делиться на 4 для bl=6)
2941
Возвращаемое значение:
2942
  * eax = -1 - ошибка (запрещён доступ к PCI или
2943
    неподдерживаемые параметры); иначе
2944
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
2945
    оставшаяся часть регистра eax разрушается
2946
Замечания:
2947
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2948
    для приложений подфункцией 12 функции 21.
2949
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2950
    игнорирует номер функции. Получить механизм доступа можно вызовом
2951
    подфункции 2.
2952
  * Некоторые регистры стандартны и существуют для всех устройств,
2953
    некоторые определяются конкретным устройством. Список первых
2954
    входит, например, в известный Interrupt List by Ralf Brown
77 diamond 2955
    (http://www.pobox.com/~ralf/files.html,
2956
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
3539 clevermous 2957
    список вторых должен быть указан в документации по устройству.
77 diamond 2958
 
6056 IgorA 2959
---------------------- Константы для регистров: ----------------------
2960
  eax - SF_PCI (62)
2961
  ebx - SSF_READ_BYTE (4), SSF_READ_WORD (5), SSF_READ_DWORD (6)
77 diamond 2962
======================================================================
3539 clevermous 2963
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
77 diamond 2964
======================================================================
3539 clevermous 2965
Параметры:
2966
  * eax = 62 - номер функции
2967
  * bl = 8 - писать байт
2968
  * bl = 9 - писать слово
2969
  * bl = 10 - писать двойное слово
2970
  * bh = номер PCI-шины
2971
  * ch = dddddfff, где ddddd = номер устройства на шине,
2972
    fff = номер функции устройства
2973
  * cl = номер регистра (должен быть чётным для bl=9,
2974
    делиться на 4 для bl=10)
2975
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
2976
    данные для записи
2977
Возвращаемое значение:
2978
  * eax = -1 - ошибка (запрещён доступ к PCI или
2979
    неподдерживаемые параметры)
2980
  * eax = 0 - успешно
2981
Замечания:
2982
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2983
    для приложений подфункцией 12 функции 21.
2984
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2985
    игнорирует номер функции. Получить механизм доступа можно вызовом
2986
    подфункции 2.
2987
  * Некоторые регистры стандартны и существуют для всех устройств,
2988
    некоторые определяются конкретным устройством. Список первых
2989
    входит, например, в известный Interrupt List by Ralf Brown;
2990
    список вторых должен быть указан в документации по устройству.
77 diamond 2991
 
6056 IgorA 2992
---------------------- Константы для регистров: ----------------------
2993
  eax - SF_PCI (62)
2994
  ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10)
77 diamond 2995
======================================================================
3539 clevermous 2996
================ Функция 63 - работа с доской отладки. ===============
77 diamond 2997
======================================================================
3539 clevermous 2998
Доска отладки представляет собой системный буфер (на 4096 байт),
2999
в который любая программа может записать (вообще говоря, произвольные)
3000
данные и из которого другая программа может эти данные прочитать.
3001
Есть соглашение, в соответствии с которым записываемые данные -
3002
текстовые строки, интерпретируемые как отладочные сообщения о ходе
3003
выполнения программы. Ядро в определённых ситуациях также записывает
3004
на доску отладки сведения о выполнении некоторых функций;
3005
по соглашению сообщения ядра начинаются с префикса "K : ".
3006
Для просмотра доски отладки создано приложение board,
3007
которое считывает данные из буфера и отображает их в своём окне. board
3008
понимает последовательность кодов 13,10 как переход на новую строку.
3009
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
3010
В связи с появлением отладчика ценность доски отладки несколько
3011
снизилась, поскольку отладчик позволяет полностью контролировать ход
3012
выполнения программы, причём для этого не требуется никаких усилий
3013
со стороны самой программы. Тем не менее во многих случаях
3014
доска отладки продолжает оставаться полезной.
77 diamond 3015
 
3539 clevermous 3016
---------------------------- Запись байта ----------------------------
3017
Параметры:
3018
  * eax = 63 - номер функции
3019
  * ebx = 1 - номер подфункции
3020
  * cl = байт данных
3021
Возвращаемое значение:
3022
  * функция не возвращает значения
3023
Замечания:
3024
  * Байт записывается в буфер. Длина буфера - 512 байт.
3025
    При переполнении буфера все полученные данные теряются
3026
    и заполнение начинается снова с нуля.
3027
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
3028
    достаточно этой функции, вызываемой в цикле. Можно не писать
3029
    вручную соответствующий код, а воспользоваться файлом debug.inc,
3030
    входящим в дистрибутив.
77 diamond 3031
 
3539 clevermous 3032
---------------------------- Чтение байта ----------------------------
3033
Забирает байт из буфера.
3034
Параметры:
3035
  * eax = 63 - номер функции
3036
  * ebx = 2 - номер подфункции
3037
Возвращаемое значение:
3038
  * eax = ebx = 0 - буфер пуст
3039
  * eax = байт, ebx = 1 - байт успешно прочитан
77 diamond 3040
 
6056 IgorA 3041
---------------------- Константы для регистров: ----------------------
3042
  eax - SF_BOARD (63)
3043
  ebx - SSF_DEBUG_WRITE (1), SSF_DEBUG_READ (2)
77 diamond 3044
======================================================================
3539 clevermous 3045
========== Функция 64 - перераспределить память приложения. ==========
77 diamond 3046
======================================================================
9995 Doczom 3047
 
3048
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
3049
 
3539 clevermous 3050
Параметры:
3051
  * eax = 64 - номер функции
3052
  * ebx = 1 - единственная подфункция
3053
  * ecx = новый размер памяти
3054
Возвращаемое значение:
3055
  * eax = 0 - успешно
3056
  * eax = 1 - недостаточно памяти
3057
Замечания:
3058
  * Есть другой способ выделения/освобождения динамической памяти -
6974 0CodErr 3059
    подфункции 11, 12, 13 функции 68.
3060
  * Функция не может использоваться совместно с 68.11, 68.12, 68.13.
3061
    Вызов функции будет игнорироваться, если приложение создаст
3062
    локальную кучу вызовом 68.11.
77 diamond 3063
 
6056 IgorA 3064
---------------------- Константы для регистров: ----------------------
3065
  eax - SF_MEMORY_RESIZE (64)
77 diamond 3066
======================================================================
3539 clevermous 3067
========= Функция 65 - вывести изображение с палитрой в окно. ========
283 diamond 3068
======================================================================
3539 clevermous 3069
Параметры:
3070
  * eax = 65 - номер функции
3071
  * ebx = указатель на изображение
3072
  * ecx = [размер по оси x]*65536 + [размер по оси y]
3073
  * edx = [координата по оси x]*65536 + [координата по оси y]
3074
  * esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
3075
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
3076
          игнорируется при esi > 8
3077
  * ebp = смещение данных каждой следующей строки изображения
3078
          относительно предыдущей
3079
Возвращаемое значение:
3080
  * функция не возвращает значения
3081
Замечания:
3082
  * Координаты изображения - это координаты верхнего левого угла
3083
    изображения относительно окна.
3084
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
3085
    за исключением, быть может, последних байтов строк, содержит
3086
    информацию о цвете 8 пикселей, старший бит соответствует первому
3087
    пикселю.
3088
  * Формат изображения с 2 битами на пиксель: каждый байт изображения,
3089
    за исключением, быть может, последних байтов строк, содержит
3090
    информацию о цвете 4 пикселей, старшие два бита соответствуют
3091
    первому пикселю.
3092
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
3093
    за исключением последних байтов строк (если ширина изображения
3094
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
3095
    соответствует первому пикселю.
3096
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
3097
    рассматривается как индекс в палитре.
3098
  * Формат изображения с 9 битами на пиксель: каждый байт изображения
3099
    (8 бит) обозначает интенсивность серого для одного пикселя, т.о.
3100
    этот тип изображения идентичен 8 бит на пиксель без палитры.
3101
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
3102
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
3103
    по 5 пикселей на каждый цвет.
3104
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
3105
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
3106
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
3107
    кодируется тремя байтами - последовательно синяя, зелёная, красная
3108
    составляющие цвета.
3109
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
3110
    есть ещё игнорируемый четвёртый байт.
3111
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
314 diamond 3112
    esi=24, ebp=0.
283 diamond 3113
 
6056 IgorA 3114
---------------------- Константы для регистров: ----------------------
3115
  eax - SF_PUT_IMAGE_EXT (65)
283 diamond 3116
======================================================================
3539 clevermous 3117
================= Функция 66 - работа с клавиатурой. =================
77 diamond 3118
======================================================================
3539 clevermous 3119
Режим ввода влияет на результаты чтения клавиш функцией 2.
3120
При загрузке программы для неё устанавливается ASCII-режим ввода.
77 diamond 3121
 
3539 clevermous 3122
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
3123
Параметры:
3124
  * eax = 66 - номер функции
3125
  * ebx = 1 - номер подфункции
3126
  * ecx = режим:
3127
    * 0 = обычный (ASCII-символы)
3128
    * 1 = сканкоды
3129
Возвращаемое значение:
3130
  * функция не возвращает значения
77 diamond 3131
 
3539 clevermous 3132
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
3133
Параметры:
3134
  * eax = 66 - номер функции
3135
  * ebx = 2 - номер подфункции
3136
Возвращаемое значение:
3137
  * eax = текущий режим
77 diamond 3138
 
3539 clevermous 3139
------- Подфункция 3 - получить состояние управляющих клавиш. --------
3140
Параметры:
3141
  * eax = 66 - номер функции
3142
  * ebx = 3 - номер подфункции
3143
Возвращаемое значение:
3144
  * eax = битовая маска:
3145
  * бит 0  (маска 1): левый Shift нажат
3146
  * бит 1  (маска 2): правый Shift нажат
3147
  * бит 2  (маска 4): левый Ctrl нажат
3148
  * бит 3  (маска 8): правый Ctrl нажат
3149
  * бит 4  (маска 0x10): левый Alt нажат
3150
  * бит 5  (маска 0x20): правый Alt нажат
3151
  * бит 6  (маска 0x40): CapsLock включён
3152
  * бит 7  (маска 0x80): NumLock включён
3153
  * бит 8  (маска 0x100): ScrollLock включён
3154
  * бит 9  (маска 0x200): левый Win нажат
3155
  * бит 10 (маска 0x400): правый Win нажат
3156
  * прочие биты сброшены
77 diamond 3157
 
3539 clevermous 3158
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
3159
О нажатии "горячей клавиши" извещаются только приложения,
3160
установившие её; активное приложение (к которому поступает
3161
весь нормальный ввод) таких клавиш не получает.
3162
Извещение заключается в посылке события с кодом 2.
3163
Прочитать "горячую клавишу" можно так же, как и обычную, -
3164
функцией 2.
3165
Параметры:
3166
  * eax = 66 - номер функции
3167
  * ebx = 4 - номер подфункции
3168
  * cl задаёт сканкод клавиши;
3169
    используйте cl=0 для задания комбинаций типа Ctrl+Shift
3170
  * edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
3171
    * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
3172
      * 0 = ни одна из клавиш не должна быть нажата;
3173
      * 1 = ровно одна из клавиш должна быть нажата;
3174
      * 2 = обе клавиши должны быть нажаты;
3175
      * 3 = должна быть нажата LShift, но не RShift;
3176
      * 4 = должна быть нажата RShift, но не LShift
3177
    * Y - аналогично для LCtrl и RCtrl;
3178
    * X - аналогично для LAlt и RAlt
3179
Возвращаемое значение:
3180
  * eax=0 - успешно
3181
  * eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
3182
Замечания:
3183
  * Горячая клавиша может срабатывать либо при нажатии,
3184
    либо при отпускании. Сканкод отпускания клавиши на 128 больше,
3185
    чем сканкод нажатия (т.е. установлен старший бит).
3186
  * Несколько приложений могут установить одну и ту же комбинацию;
3187
    о нажатии такой комбинации будут извещаться все такие приложения.
92 diamond 3188
 
3539 clevermous 3189
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
3190
Параметры:
3191
  * eax = 66 - номер функции
3192
  * ebx = 5 - номер подфункции
3193
  * cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
3194
Возвращаемое значение:
3195
  * eax = 0 - успешно
3196
  * eax = 1 - нет такой горячей клавиши
3197
Замечания:
3198
  * При завершении процесса/потока удаляются все установленные им
3199
    горячие клавиши.
3200
  * Вызов функции не влияет на другие приложения.
3201
    Если другое приложение определило эту же комбинацию,
3202
    оно по-прежнему будет получать уведомления.
92 diamond 3203
 
3539 clevermous 3204
------------- Подфункция 6 - заблокировать обычный ввод. -------------
3205
Параметры:
3206
  * eax = 66 - номер функции
3207
  * ebx = 6 - номер подфункции
3208
Возвращаемое значение:
3209
  * функция не возвращает значения
3210
Замечания:
3211
  * Блокируется обычный ввод данных с клавиатуры для установленных
3212
    "горячих" клавиш
3213
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2709 mario79 3214
 
3539 clevermous 3215
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
3216
Параметры:
3217
  * eax = 66 - номер функции
3218
  * ebx = 7 - номер подфункции
3219
Возвращаемое значение:
3220
  * функция не возвращает значения
3221
Замечания:
3222
  * Разблокирование результатов ф. 66.6
3223
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2709 mario79 3224
 
6056 IgorA 3225
---------------------- Константы для регистров: ----------------------
3226
  eax - SF_KEYBOARD (66)
3227
  ebx - SSF_SET_INPUT_MODE (1), SSF_GET_INPUT_MODE (2),
3228
    SSF_GET_CONTROL_KEYS (3), SSF_SET_SYS_HOTKEY (4),
3229
    SSF_DEL_SYS_HOTKEY (5),  SSF_LOCK_INPUT (6), SSF_UNLOCK_INPUT (7)
77 diamond 3230
======================================================================
3539 clevermous 3231
============ Функция 67 - изменить положение/размеры окна. ===========
77 diamond 3232
======================================================================
3539 clevermous 3233
Параметры:
3234
  * eax = 67 - номер функции
3235
  * ebx = новая x-координата окна
3236
  * ecx = новая y-координата окна
3237
  * edx = новый x-размер окна
3238
  * esi = новый y-размер окна
3239
Возвращаемое значение:
3240
  * функция не возвращает значения
3241
Замечания:
3242
  * Значение -1 для параметра означает "не изменять"; например, для
3243
    перемещения окна без изменения размеров можно указать edx=esi=-1.
3244
  * Предварительно окно должно быть определено функцией 0.
3245
    Она же задаёт начальные координаты и размеры окна.
3246
  * Размеры окна понимаются в смысле функции 0, т.е.
3247
    на один пиксель меньше, чем реальные размеры.
3248
  * Вызов функции для максимизированных окон просто игнорируется.
3249
  * Для окон соответствующих стилей положение и/или размеры могут быть
3250
    изменены пользователем; текущие положение и размеры могут быть
3251
    получены вызовом функции 9.
3252
  * Функция посылает окну событие перерисовки (с кодом 1).
77 diamond 3253
 
6056 IgorA 3254
---------------------- Константы для регистров: ----------------------
3255
  eax - SF_CHANGE_WINDOW (67)
77 diamond 3256
======================================================================
3539 clevermous 3257
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
77 diamond 3258
======================================================================
3539 clevermous 3259
Параметры:
3260
  * eax = 68 - номер функции
3261
  * ebx = 0 - номер подфункции
3262
Возвращаемое значение:
3263
  * eax = число переключений задач с момента загрузки системы
3264
    (по модулю 2^32)
77 diamond 3265
 
6056 IgorA 3266
---------------------- Константы для регистров: ----------------------
3267
  eax - SF_SYS_MISC (68)
3268
  ebx - SSF_GET_TASK_SWITCH_COUNT (0)
77 diamond 3269
======================================================================
3539 clevermous 3270
====================== Функция 68, подфункция 1 ======================
3271
============ Переключиться на следующий поток выполнения. ============
77 diamond 3272
======================================================================
3539 clevermous 3273
Функция завершает текущий квант времени, выделенный потоку,
3274
и переключается на следующий.
3275
(Какой поток какого процесса будет следующим, предсказать нельзя).
3276
Позднее, когда до текущего потока дойдёт очередь,
3277
выполнение возобновится.
3278
Параметры:
3279
  * eax = 68 - номер функции
3280
  * ebx = 1 - номер подфункции
3281
Возвращаемое значение:
3282
  * функция не возвращает значения
77 diamond 3283
 
6056 IgorA 3284
---------------------- Константы для регистров: ----------------------
3285
  eax - SF_SYS_MISC (68)
3286
  ebx - SSF_SWITCH_TASK (1)
77 diamond 3287
======================================================================
3539 clevermous 3288
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
77 diamond 3289
======================================================================
3539 clevermous 3290
Параметры:
3291
  * eax = 68 - номер функции
3292
  * ebx = 2 - номер подфункции
3293
  * ecx = требуемое действие:
3294
    * ecx = 0 - разрешить выполнение инструкции rdpmc
77 diamond 3295
      (ReaD Performance-Monitoring Counters)
3539 clevermous 3296
    * ecx = 1 - узнать, включён/выключен кэш
3297
    * ecx = 2 - включить кэш
3298
    * ecx = 3 - выключить кэш
3299
Возвращаемое значение:
3300
  * для ecx=0:
3301
    * eax = значение cr4
3302
  * для ecx=1:
77 diamond 3303
    * eax = (cr0 and 0x60000000):
3539 clevermous 3304
    * eax = 0 - кэш включён
3305
    * eax <> 0 - кэш выключен
3306
  * для ecx=2 и ecx=3:
3307
    * функция не возвращает значения
77 diamond 3308
 
6056 IgorA 3309
---------------------- Константы для регистров: ----------------------
3310
  eax - SF_SYS_MISC (68)
3311
  ebx - SSF_PERFORMANCE (2)
3312
  ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1),
3313
    SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3)
77 diamond 3314
======================================================================
3539 clevermous 3315
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
77 diamond 3316
======================================================================
3539 clevermous 3317
MSR = Model Specific Register; полный список MSR-регистров процессора
3318
содержится в документации по процессору (например, IA-32 Intel
77 diamond 3319
Architecture Software Developer's Manual, Volume 3, Appendix B);
3539 clevermous 3320
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3321
Параметры:
3322
  * eax = 68 - номер функции
3323
  * ebx = 3 - номер подфункции
3324
  * ecx игнорируется
3325
  * edx = адрес MSR
3326
Возвращаемое значение:
3327
  * ebx:eax = старший:младший dword результата
3328
Замечания:
3329
  * Указание в ecx несуществующего или нереализованного для данного
3330
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3331
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3332
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3333
    которое всё равно прибьёт поток.
77 diamond 3334
 
6056 IgorA 3335
---------------------- Константы для регистров: ----------------------
3336
  eax - SF_SYS_MISC (68)
3337
  ebx - SSF_READ_MSR (3)
77 diamond 3338
======================================================================
3539 clevermous 3339
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
77 diamond 3340
======================================================================
3539 clevermous 3341
MSR = Model Specific Register; полный список MSR-регистров процессора
3342
содержится в документации по процессору (например, IA-32 Intel
77 diamond 3343
Architecture Software Developer's Manual, Volume 3, Appendix B);
3539 clevermous 3344
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3345
Параметры:
3346
  * eax = 68 - номер функции
3347
  * ebx = 4 - номер подфункции
3348
  * ecx игнорируется
3349
  * edx = адрес MSR
3350
  * esi:edi = старший:младший dword
3351
Возвращаемое значение:
3352
  * функция не возвращает значения
3353
Замечания:
3354
  * Указание в ecx несуществующего или нереализованного для данного
3355
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3356
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3357
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3358
    которое всё равно прибьёт поток.
77 diamond 3359
 
6056 IgorA 3360
---------------------- Константы для регистров: ----------------------
3361
  eax - SF_SYS_MISC (68)
3362
  ebx - SSF_WRITE_MSR (4)
77 diamond 3363
======================================================================
6974 0CodErr 3364
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
77 diamond 3365
======================================================================
3539 clevermous 3366
Параметры:
3367
  * eax = 68 - номер функции
3368
  * ebx = 11 - номер подфункции
3369
Возвращаемое значение:
3370
  * eax = 0 - неуспех
3371
  * иначе размер созданной кучи
3372
Замечания:
3373
  * Вызов функции инициализирует кучу, из которой впоследствии можно
6893 pathoswith 3374
    выделять и освобождать блоки памяти подфункциями 12, 13 и 20.
3375
  * Если куча уже создана, функция вернёт размер существующей кучи.
3539 clevermous 3376
    Размер кучи равен размеру всей свободной памяти приложения.
3377
  * После создания кучи вызовы функции 64 игнорируются.
77 diamond 3378
 
6056 IgorA 3379
---------------------- Константы для регистров: ----------------------
3380
  eax - SF_SYS_MISC (68)
3381
  ebx - SSF_HEAP_INIT (11)
77 diamond 3382
======================================================================
3539 clevermous 3383
========== Функция 68, подфункция 12 - выделить блок памяти. =========
77 diamond 3384
======================================================================
3539 clevermous 3385
Параметры:
3386
  * eax = 68 - номер функции
3387
  * ebx = 12 - номер подфункции
3388
  * ecx = требуемый размер в байтах
3389
Возвращаемое значение:
3390
  * eax = указатель на выделенный блок
3391
Замечания:
3392
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3393
    размер выделенного блока больше или равен запрошенному.
77 diamond 3394
 
6056 IgorA 3395
---------------------- Константы для регистров: ----------------------
3396
  eax - SF_SYS_MISC (68)
3397
  ebx - SSF_MEM_ALLOC (12)
77 diamond 3398
======================================================================
3539 clevermous 3399
========= Функция 68, подфункция 13 - освободить блок памяти. ========
77 diamond 3400
======================================================================
3539 clevermous 3401
Параметры:
3402
  * eax = 68 - номер функции
3403
  * ebx = 13 - номер подфункции
3404
  * ecx = указатель на блок памяти
3405
Возвращаемое значение:
3406
  * eax = 1 - успешно
3407
  * eax = 0 - неудача
3408
Замечания:
3409
  * Блок памяти должен быть ранее выделен подфункцией 12
3410
    или подфункцией 20.
77 diamond 3411
 
6056 IgorA 3412
---------------------- Константы для регистров: ----------------------
3413
  eax - SF_SYS_MISC (68)
3414
  ebx - SSF_MEM_FREE (13)
77 diamond 3415
======================================================================
3539 clevermous 3416
====================== Функция 68, подфункция 14 =====================
3417
====== Ожидать получения сигнала от других приложений/драйверов. =====
77 diamond 3418
======================================================================
3539 clevermous 3419
Параметры:
3420
  * eax = 68 - номер функции
3421
  * ebx = 14 - номер подфункции
3422
  * ecx = указатель на буфер для информации (24 байта)
3423
Возвращаемое значение:
3424
  * eax разрушается
3425
  * буфер, на который указывает ecx, содержит следующую информацию:
3426
    * +0: dword: идентификатор последующих данных сигнала
3427
    * +4: данные принятого сигнала (20 байт), формат которых
3428
          определяется первым dword-ом
77 diamond 3429
 
6056 IgorA 3430
---------------------- Константы для регистров: ----------------------
3431
  eax - SF_SYS_MISC (68)
3432
  ebx - SSF_WAIT_SIGNAL (14)
77 diamond 3433
======================================================================
3539 clevermous 3434
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
172 serge 3435
======================================================================
3539 clevermous 3436
Параметры:
3437
  * eax = 68 - номер функции
3438
  * ebx = 16 - номер подфункции
3439
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3440
Возвращаемое значение:
3441
  * eax = 0 - неудача
3442
  * иначе eax = хэндл драйвера
3443
Замечания:
3444
  * Если драйвер ещё не загружен, он загружается;
3445
    если драйвер уже загружен, ничего не меняется.
3446
  * Имя драйвера чувствительно к регистру символов.
3447
    Максимальная длина имени - 16 символов, включая завершающий
3448
    нулевой символ, остальные символы игнорируются.
9756 vitalkrilo 3449
  * Драйвер с именем ABC загружается из файла /sys/drivers/ABC.sys.
172 serge 3450
 
6056 IgorA 3451
---------------------- Константы для регистров: ----------------------
3452
  eax - SF_SYS_MISC (68)
3453
  ebx - SSF_LOAD_DRIVER (16)
172 serge 3454
======================================================================
3539 clevermous 3455
========== Функция 68, подфункция 17 - управление драйвером. =========
172 serge 3456
======================================================================
3539 clevermous 3457
Параметры:
3458
  * eax = 68 - номер функции
3459
  * ebx = 17 - номер подфункции
3460
  * ecx = указатель на управляющую структуру:
3461
    * +0: dword: хэндл драйвера
3462
    * +4: dword: код функции драйвера
3463
    * +8: dword: указатель на входные данные
3464
    * +12 = +0xC: dword: размер входных данных
3465
    * +16 = +0x10: dword: указатель на выходные данные
3466
    * +20 = +0x14: dword: размер выходных данных
3467
Возвращаемое значение:
3468
  * eax = определяется драйвером
3469
Замечания:
3470
  * Коды функций и структура входных/выходных данных
3471
    определяются драйвером.
3472
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
172 serge 3473
 
6056 IgorA 3474
---------------------- Константы для регистров: ----------------------
3475
  eax - SF_SYS_MISC (68)
3476
  ebx - SSF_CONTROL_DRIVER (17)
172 serge 3477
======================================================================
6798 pathoswith 3478
== Функция 68, подфункция 18 - загрузить DLL с указанием кодировки. ==
277 diamond 3479
======================================================================
3539 clevermous 3480
Параметры:
3481
  * eax = 68 - номер функции
6798 pathoswith 3482
  * ebx = 18 - номер подфункции
3483
  * ecx = указатель на строку с путём к DLL
3484
  * edx = кодировка строки, подробности указаны в описании функции 80.
3539 clevermous 3485
Возвращаемое значение:
3486
  * eax = 0 - неудача
3487
  * иначе eax = указатель на таблицу экспорта DLL
3488
Замечания:
3489
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
3490
    заканчивающийся нулём. Первый dword в структуре является
3491
    указателем на имя функции, второй содержит адрес функции.
277 diamond 3492
 
6798 pathoswith 3493
======================================================================
3494
============= Функция 68, подфункция 19 - загрузить DLL. =============
3495
======================================================================
3496
Параметры:
3497
  * eax = 68 - номер функции
3498
  * ebx = 19 - номер подфункции
3499
  * ecx = указатель на строку с путём к DLL,
3500
    правила формирования строки указаны в описании функции 70.
3501
Возвращаемое значение:
3502
  * eax = 0 - неудача
3503
  * иначе eax = указатель на таблицу экспорта DLL
3504
 
6056 IgorA 3505
---------------------- Константы для регистров: ----------------------
3506
  eax - SF_SYS_MISC (68)
3507
  ebx - SSF_LOAD_DLL (19)
277 diamond 3508
======================================================================
3539 clevermous 3509
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
448 diamond 3510
======================================================================
3539 clevermous 3511
Параметры:
3512
  * eax = 68 - номер функции
3513
  * ebx = 20 - номер подфункции
3514
  * ecx = новый размер в байтах
3515
  * edx = указатель на уже выделенный блок памяти
3516
Возвращаемое значение:
3517
  * eax = указатель на перераспределённый блок, 0 при ошибке
3518
Замечания:
6974 0CodErr 3519
  * Предварительно следует инициализировать кучу процесса вызовом
3520
    подфункции 11.
3539 clevermous 3521
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3522
    размер выделенного блока больше или равен запрошенному.
3523
  * Если edx=0, то вызов функции эквивалентен выделению памяти
3524
    подфункцией 12. В противном случае блок памяти по адресу edx
3525
    должен быть ранее выделен подфункцией 12 или
3526
    описываемой подфункцией.
3527
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
3528
    возвращает 0.
3529
  * Содержимое памяти вплоть до наименьшего из старого и нового
3530
    размеров сохраняется.
448 diamond 3531
 
6056 IgorA 3532
---------------------- Константы для регистров: ----------------------
3533
  eax - SF_SYS_MISC (68)
3534
  ebx - SSF_MEM_REALLOC (20)
1018 diamond 3535
======================================================================
3539 clevermous 3536
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
2646 mario79 3537
======================================================================
3539 clevermous 3538
Параметры:
3539
  * eax = 68 - номер функции
3540
  * ebx = 21 - номер подфункции
3541
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3542
  * edx = указатель на командную строку
3543
Возвращаемое значение:
3544
  * eax = 0 - неудача
3545
  * иначе eax = хэндл драйвера
3546
Замечания:
3547
  * Если драйвер ещё не загружен, он загружается;
3548
    если драйвер уже загружен, ничего не меняется.
2646 mario79 3549
 
6056 IgorA 3550
---------------------- Константы для регистров: ----------------------
3551
  eax - SF_SYS_MISC (68)
3552
  ebx - SSF_LOAD_DRIVER_PE (21)
2646 mario79 3553
======================================================================
3539 clevermous 3554
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
1018 diamond 3555
======================================================================
3539 clevermous 3556
Параметры:
3557
  * eax = 68 - номер функции
3558
  * ebx = 22 - номер подфункции
3559
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3560
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
3561
  * esi = флаги открытия и доступа:
3562
    * SHM_OPEN        = 0x00 - открыть существующую область памяти.
3563
                          Если область с таким именем не существует,
3564
                          функция вернёт код ошибки 5.
3565
    * SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
3566
                          область памяти.
3567
    * SHM_CREATE      = 0x08 - создать новую область памяти.
3568
                          Если область с таким именем уже существует,
3569
                          функция вернёт код ошибки 10.
3570
    * SHM_READ        = 0x00 - доступ только на чтение
3571
    * SHM_WRITE       = 0x01 - доступ на чтение и запись
3572
Возвращаемое значение:
3573
  * eax = указатель на область памяти, 0 при ошибке
3574
  * при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
3575
    edx = 0 - успех, иначе - код ошибки
3576
  * при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
3577
    edx = код ошибки (при eax=0) или размер области в байтах
3578
Коды ошибок:
1018 diamond 3579
  * E_NOTFOUND = 5
3580
  * E_ACCESS = 10
3581
  * E_NOMEM = 30
3582
  * E_PARAM = 33
3539 clevermous 3583
Замечания:
6974 0CodErr 3584
  * Предварительно следует инициализировать кучу процесса вызовом
3585
    подфункции 11.
3539 clevermous 3586
  * Если создаётся новая область, то флаги доступа устанавливают
3587
    максимальные права доступа для остальных процессов. Попытка
3588
    открытия другим потоком с неразрешёнными правами провалится
3589
    с кодом ошибки E_ACCESS.
3590
  * Процесс, создавший область, всегда имеет доступ на запись.
945 serge 3591
 
6056 IgorA 3592
---------------------- Константы для регистров: ----------------------
3593
  eax - SF_SYS_MISC (68)
3594
  ebx - SSF_MEM_OPEN (22)
1018 diamond 3595
======================================================================
3539 clevermous 3596
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
1018 diamond 3597
======================================================================
3539 clevermous 3598
Параметры:
3599
  * eax = 68 - номер функции
3600
  * ebx = 23 - номер подфункции
3601
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3602
Возвращаемое значение:
3603
  * eax разрушается
3604
Замечания:
3605
  * Область памяти физически освобождается (с забыванием всех данных
3606
    и высвобождением физической памяти), когда её закроют
3607
    все открывшие потоки.
3608
  * При завершении потока освобождаются все открытые им
3609
    области памяти.
945 serge 3610
 
6056 IgorA 3611
---------------------- Константы для регистров: ----------------------
3612
  eax - SF_SYS_MISC (68)
3613
  ebx - SSF_MEM_CLOSE (23)
448 diamond 3614
======================================================================
3539 clevermous 3615
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
1077 Galkov 3616
======================================================================
3539 clevermous 3617
Параметры:
3618
  * eax = 68 - номер функции
3619
  * ebx = 24 - номер подфункции
3620
  * ecx = адрес нового обработчика исключений
3621
  * edx = маска обрабатываемых исключений
3622
Возвращаемое значение:
3623
  * eax = адрес старого обработчика исключений (0, если не установлен)
3624
  * ebx = маска старого обработчика исключений
3625
Замечания:
3626
  * Номер бита в маске исключений соответствует номеру исключения по
3627
    спецификации на процессор (Intel-PC). Так, например, исключения
3628
    FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
3629
  * В данной реализации игнорируется запрос на перехват исключения 7
3630
    - система обрабатывает #NM самостоятельно.
3631
  * Пользовательский обработчик получает номер исключения параметром
3632
    в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
3633
    при этом производится на команду, вызвавшую исключение.
3634
  * При передаче управления обработчику исключений сбрасывается
3635
    соответствующий бит в маске исключений. Возникновение этого же
3636
    исключения впоследствии приведёт к умолчальной обработке такового.
3637
    А именно: к завершению работы приложения в отсутствии отладчика,
3638
    приостановка с уведомлением отлаживающего приложения иначе.
3639
  * После завершения критических действий в обработчике пользователя
3640
    восстановление бита маски данного исключения можно сделать
9976 Jurgen 3641
    подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
3642
 
3643
Внимание:
10002 Jurgen 3644
    1) Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен стартовый адрес резервного стека в регистре ESI.
3645
	При возникновении исключения (#SS), в этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK  sys32.inc).
3646
	При завершении обработки этого исключения, пользовательский обработчик должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
9976 Jurgen 3647
 
10002 Jurgen 3648
	2) Вы можете использовать режим "контролируемое исключение" для проверок на корректность адресов памяти при считывании\записи данных.
3649
	Для этого:
3650
    - В регистр ESI заносится адрес, куда должно перейти выполнение кода при возникновении исключения.
3651
	- В регистр EDI заносится сигнатура - текст 'EXPT'.
3652
 
1077 Galkov 3653
 
6056 IgorA 3654
---------------------- Константы для регистров: ----------------------
3655
  eax - SF_SYS_MISC (68)
3656
  ebx - SSF_SET_EXCEPTION_HANDLER (24)
1077 Galkov 3657
======================================================================
3539 clevermous 3658
= Функция 68, подфункция 25 - изменить состояние активности сигнала. =
1077 Galkov 3659
======================================================================
3539 clevermous 3660
Параметры:
3661
  * eax = 68 - номер функции
3662
  * ebx = 25 - номер подфункции
3663
  * ecx = номер сигнала
3664
  * edx = значение устанавливаемой активности (0/1)
3665
Возвращаемое значение:
3666
  * eax = -1 - задан неверный номер сигнала
3667
  * иначе eax = старое значение активности сигнала (0/1)
3668
Замечания:
3669
  * В текущей реализации изменяется только маска пользовательского
3670
    обработчика исключений, установленного подфункцией 24. При этом
3671
    номер сигнала соответствует номеру исключения.
1077 Galkov 3672
 
6056 IgorA 3673
---------------------- Константы для регистров: ----------------------
3674
  eax - SF_SYS_MISC (68)
3675
  ebx - SSF_SET_EXCEPTION_STATE (25)
1077 Galkov 3676
======================================================================
6798 pathoswith 3677
======= Функция 68, подфункция 26 - освободить страницы памяти =======
4193 lev 3678
======================================================================
3679
Параметры:
3680
  * eax = 68 - номер функции
3681
  * ebx = 26 - номер подфункции
3682
  * ecx = указатель на блок памяти выделенный подфункцией 12
3683
  * edx = смещение от начала блока
3684
  * esi = размер высвобождаемого блока памяти, в байтах
3685
Примечания:
3686
  * функция освобождает страницы с ecx+edx по ecx+edx+esi
3687
    и устанавливает виртуальную память в зарезервированное состояние.
3688
 
6056 IgorA 3689
---------------------- Константы для регистров: ----------------------
3690
  eax - SF_SYS_MISC (68)
3691
  ebx - SSF_MEM_FREE_EXT (26)
4193 lev 3692
======================================================================
6798 pathoswith 3693
============= Функция 68, подфункция 27 - загрузить файл =============
4193 lev 3694
======================================================================
3695
Параметры:
3696
  * eax = 68 - номер функции
3697
  * ebx = 27 - номер подфункции
6511 pathoswith 3698
  * ecx = указатель на строку с путём к файлу,
3699
    правила формирования строки указаны в описании функции 70.
4193 lev 3700
Возвращаемое значение:
3701
  * eax = указатель на загруженный файл или 0
3702
  * edx = размер загруженного файла или 0
3703
Примечания:
3704
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
6974 0CodErr 3705
  * Предварительно следует инициализировать кучу процесса вызовом
3706
    подфункции 11.
4193 lev 3707
 
6056 IgorA 3708
---------------------- Константы для регистров: ----------------------
3709
  eax - SF_SYS_MISC (68)
3710
  ebx - SSF_LOAD_FILE (27)
4193 lev 3711
======================================================================
6798 pathoswith 3712
== Функция 68, подфункция 28 - загрузить файл с указанием кодировки ==
3713
======================================================================
3714
Параметры:
3715
  * eax = 68 - номер функции
3716
  * ebx = 28 - номер подфункции
3717
  * ecx = указатель на строку с путём к файлу
3718
  * edx = кодировка строки, подробности указаны в описании функции 80.
3719
Возвращаемое значение:
3720
  * eax = указатель на загруженный файл или 0
3721
  * edx = размер загруженного файла или 0
3722
Примечания:
3723
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
3724
 
3725
======================================================================
9779 Doczom 3726
======== Функция 68, подфункция 29 - allocate ring memory. =========
3727
======================================================================
3728
Parameters:
3729
  * eax = 68 - function number
3730
  * ebx = 29 - subfunction number
3731
  * ecx = required size in bytes
3732
Returned value:
3733
  * eax = 0 - failed
3734
  * eax = pointer to the allocated ring
3735
Remarks:
3736
  * The requested size must be an exact multiple of pagesize (4 Kb)
3737
  * The function allocates memory in such a way that you can read and
3738
    write beyond the size of the allocated memory and will reach the
3739
    beginning of the buffer again.
3740
 
3741
 
3742
======================================================================
3743
======== Функция 68, подфункция 31 - получить данные драйвера. =======
3744
======================================================================
3745
Параметры:
3746
  * eax = 68 - номер функции
3747
  * ebx = 31 - номер подфункции
3748
  * ecx = функция (1 - получить начальные значения списка,
3749
                   2 - получить элемент списка)
3750
  * edx = Если ecx=2 указатель на структуру.
3751
  * edi = Если ecx=2 указатель на память под структуру
3752
Возвращаемое значение:
3753
  * Если ecx = 1, то ebx = fd
3754
                     ecx = bk
3755
  * Если ecx = 2, то eax = 0  операция прошла успешно
3756
                     eax = -1 ошибка
3757
Примечания:
3758
  * возвращаемая структура
3759
   data_service:
3760
     .name:         rb 16
3761
     .fd:           rd 1
3762
     .bk:           rd 1
3763
     .base:         rd 1
3764
     .entry:        rd 1
3765
     .srv_proc:     rd 1
3766
 
3767
======================================================================
3539 clevermous 3768
======================== Функция 69 - отладка. =======================
77 diamond 3769
======================================================================
3539 clevermous 3770
Процесс может загрузить другой процесс как отлаживаемый установкой
3771
соответствующего бита при вызове подфункции 7 функции 70.
3772
У процесса может быть только один отладчик; один процесс может
3773
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3774
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3775
определённый подфункцией 0.
3776
Формат сообщения:
3777
  * +0: dword: код сообщения
3778
  * +4: dword: PID отлаживаемого процесса
3779
  * +8: могут присутствовать дополнительные данные,
3780
    определяемые кодом сообщения
3781
Коды сообщений:
3782
  * 1 = исключение
3783
    * дополнительно передаётся dword-номер исключения
3784
    * процесс приостановлен
3785
  * 2 = процесс завершился
3786
    * приходит при любом завершении: как через системную функцию -1,
3787
      так и при "убийстве" любым другим процессом
3788
      (в том числе самим отладчиком)
3789
  * 3 = отладочное исключение int 1 = #DB
3790
    * дополнительно передаётся dword-образ регистра DR6:
3791
      * биты 0-3: выполнено условие соответствующей точки останова
3792
        (установленной подфункцией 9)
3793
      * бит 14: исключение произошло из-за режима
3794
        пошаговой трассировки (установлен флаг TF)
3795
    * процесс приостановлен
3796
При завершении отладчика прибиваются все отлаживаемые процессы.
3797
Если отладчик этого не хочет, он должен предварительно отключиться
3798
подфункцией 3.
77 diamond 3799
 
3539 clevermous 3800
Все подфункции применимы только к процессам/потокам, запущенным
3801
из текущего функцией 70 с установленным флагом отладки.
3802
Отладка многопоточных программ пока не поддерживается.
3803
Полный список подфункций:
3804
  * подфункция 0 - определить область данных для отладочных сообщений
3805
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3806
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3807
  * подфункция 3 - отключиться от отлаживаемого процесса
3808
  * подфункция 4 - приостановить отлаживаемый поток
3809
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3810
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3811
  * подфункция 7 - записать в память отлаживаемого процесса
3812
  * подфункция 8 - завершить отлаживаемый поток
3813
  * подфункция 9 - установить/снять аппаратную точку останова
77 diamond 3814
 
6056 IgorA 3815
---------------------- Константы для регистров: ----------------------
3816
  eax - SF_DEBUG (69)
3817
  ebx - SSF_SET_MESSAGE_AREA (0), SSF_GET_REGISTERS (1),
3818
    SSF_SET_REGISTERS (2), SSF_DETACH (3), SSF_SUSPEND (4),
3819
    SSF_RESUME (5), SSF_READ_MEMORY (6), SSF_WRITE_MEMORY (7),
3820
    SSF_TERMINATE (8), SSF_DEFINE_BREAKPOINT (9)
77 diamond 3821
======================================================================
3539 clevermous 3822
====================== Функция 69, подфункция 0 ======================
3823
========= Определить область данных для отладочных сообщений. ========
77 diamond 3824
======================================================================
3539 clevermous 3825
Параметры:
3826
  * eax = 69 - номер функции
3827
  * ebx = 0 - номер подфункции
3828
  * ecx = указатель
3829
Формат области данных:
3830
  * +0: dword: N = размер буфера (не считая этого заголовка)
3831
  * +4: dword: занято в буфере
3832
  * +8: N*byte: буфер
3833
Возвращаемое значение:
3834
  * функция не возвращает значения
3835
Замечания:
3836
  * Если поле размера отрицательно, буфер считается заблокированным
3837
    и при поступлении нового сообщения система будет ждать.
3838
    Для синхронизации обрамляйте всю работу с буфером операциями
3839
    блокировки/разблокировки
1662 Nasarus 3840
    	neg	[bufsize]
3539 clevermous 3841
  * Данные в буфере трактуются как массив элементов переменной длины -
3842
    сообщений. Формат сообщения указан в общем описании.
77 diamond 3843
 
6056 IgorA 3844
---------------------- Константы для регистров: ----------------------
3845
  eax - SF_DEBUG (69)
3846
  ebx - SSF_SET_MESSAGE_AREA (0)
77 diamond 3847
======================================================================
3539 clevermous 3848
====================== Функция 69, подфункция 1 ======================
3849
========= Получить состояние регистров отлаживаемого потока. =========
77 diamond 3850
======================================================================
3539 clevermous 3851
Параметры:
3852
  * eax = 69 - номер функции
3853
  * ebx = 1 - номер подфункции
3854
  * ecx = идентификатор потока
3855
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3856
  * esi = указатель на структуру контекста
3857
Возвращаемое значение:
3858
  * функция не возвращает значения
3859
Формат структуры контекста: (FPU пока не поддерживается)
77 diamond 3860
  * +0: dword: eip
3861
  * +4: dword: eflags
3862
  * +8: dword: eax
3863
  * +12 = +0xC: dword: ecx
3864
  * +16 = +0x10: dword: edx
3865
  * +20 = +0x14: dword: ebx
3866
  * +24 = +0x18: dword: esp
3867
  * +28 = +0x1C: dword: ebp
3868
  * +32 = +0x20: dword: esi
3869
  * +36 = +0x24: dword: edi
3539 clevermous 3870
Замечания:
3871
  * Если поток выполняет код 0-кольца, возвращается
3872
    состояние регистров 3-кольца.
3873
  * Процесс должен быть загружен для отладки (как указано в
3874
    общем описании).
77 diamond 3875
 
6056 IgorA 3876
---------------------- Константы для регистров: ----------------------
3877
  eax - SF_DEBUG (69)
3878
  ebx - SSF_GET_REGISTERS (1)
77 diamond 3879
======================================================================
3539 clevermous 3880
====================== Функция 69, подфункция 2 ======================
3881
======== Установить состояние регистров отлаживаемого потока. ========
77 diamond 3882
======================================================================
3539 clevermous 3883
Параметры:
3884
  * eax = 69 - номер функции
3885
  * ebx = 2 - номер подфункции
3886
  * ecx = идентификатор потока
3887
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3888
  * esi = указатель на структуру контекста
3889
Возвращаемое значение:
3890
  * функция не возвращает значения
3891
Формат структуры контекста указан в описании подфункции 1.
3892
Замечания:
3893
  * Если поток выполняет код 0-кольца, устанавливается
3894
    состояние регистров 3-кольца.
3895
  * Процесс должен быть загружен для отладки (как указано в
3896
    общем описании).
77 diamond 3897
 
6056 IgorA 3898
---------------------- Константы для регистров: ----------------------
3899
  eax - SF_DEBUG (69)
3900
  ebx - SSF_SET_REGISTERS (2)
77 diamond 3901
======================================================================
3539 clevermous 3902
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
77 diamond 3903
======================================================================
3539 clevermous 3904
Параметры:
3905
  * eax = 69 - номер функции
3906
  * ebx = 3 - номер подфункции
3907
  * ecx = идентификатор
3908
Возвращаемое значение:
3909
  * функция не возвращает значения
3910
Замечания:
3911
  * Если процесс был приостановлен, он возобновляет выполнение.
77 diamond 3912
 
6056 IgorA 3913
---------------------- Константы для регистров: ----------------------
3914
  eax - SF_DEBUG (69)
3915
  ebx - SSF_DETACH (3)
77 diamond 3916
======================================================================
3539 clevermous 3917
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
77 diamond 3918
======================================================================
3539 clevermous 3919
Параметры:
3920
  * eax = 69 - номер процесса
3921
  * ebx = 4 - номер подфункции
3922
  * ecx = идентификатор
3923
Возвращаемое значение:
3924
  * функция не возвращает значения
3925
Замечания:
3926
  * Процесс должен быть загружен для отладки (как указано в
3927
    общем описании).
77 diamond 3928
 
6056 IgorA 3929
---------------------- Константы для регистров: ----------------------
3930
  eax - SF_DEBUG (69)
3931
  ebx - SSF_SUSPEND (4)
77 diamond 3932
======================================================================
3539 clevermous 3933
====================== Функция 69, подфункция 5 ======================
3934
============ Возобновить выполнение отлаживаемого потока. ============
77 diamond 3935
======================================================================
3539 clevermous 3936
Параметры:
3937
  * eax = 69 - номер функции
3938
  * ebx = 5 - номер подфункции
3939
  * ecx = идентификатор
3940
Возвращаемое значение:
3941
  * функция не возвращает значения
3942
Замечания:
3943
  * Процесс должен быть загружен для отладки (как указано в
3944
    общем описании).
77 diamond 3945
 
6056 IgorA 3946
---------------------- Константы для регистров: ----------------------
3947
  eax - SF_DEBUG (69)
3948
  ebx - SSF_RESUME (5)
77 diamond 3949
======================================================================
3539 clevermous 3950
====================== Функция 69, подфункция 6 ======================
3951
============= Прочитать из памяти отлаживаемого процесса. ============
77 diamond 3952
======================================================================
3539 clevermous 3953
Параметры:
3954
  * eax = 69 - номер функции
3955
  * ebx = 6 - номер подфункции
3956
  * ecx = идентификатор
3957
  * edx = сколько байт читать
3958
  * esi = адрес памяти отлаживаемого процесса
3959
  * edi = указатель на буфер для данных
3960
Возвращаемое значение:
3961
  * eax = -1 при ошибке (неверный PID или буфер)
3962
  * иначе eax = число прочитанных байт (возможно, 0,
3963
    если в esi слишком большое значение)
3964
Замечания:
3965
  * Процесс должен быть загружен для отладки (как указано в
3966
    общем описании).
77 diamond 3967
 
6056 IgorA 3968
---------------------- Константы для регистров: ----------------------
3969
  eax - SF_DEBUG (69)
3970
  ebx - SSF_READ_MEMORY (6)
77 diamond 3971
======================================================================
3780 Serge 3972
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
77 diamond 3973
======================================================================
3539 clevermous 3974
Параметры:
3975
  * eax = 69 - номер функции
3976
  * ebx = 7 - номер подфункции
3977
  * ecx = идентификатор
3978
  * edx = сколько байт писать
3979
  * esi = адрес памяти в отлаживаемом процессе
3980
  * edi = указатель на данные
3981
Возвращаемое значение:
3982
  * eax = -1 при ошибке (неверный PID или буфер)
3983
  * иначе eax = число записанных байт (возможно, 0,
3984
    если в esi слишком большое значение)
3985
Замечания:
3986
  * Процесс должен быть загружен для отладки (как указано в
3987
    общем описании).
77 diamond 3988
 
6056 IgorA 3989
---------------------- Константы для регистров: ----------------------
3990
  eax - SF_DEBUG (69)
3991
  ebx - SSF_WRITE_MEMORY (7)
77 diamond 3992
======================================================================
3539 clevermous 3993
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
77 diamond 3994
======================================================================
3539 clevermous 3995
Параметры:
3996
  * eax = 69 - номер функции
3997
  * ebx = 8 - номер подфункции
3998
  * ecx = идентификатор
3999
Возвращаемое значение:
4000
  * функция не возвращает значения
4001
Замечания:
4002
  * Процесс должен быть загружен для отладки (как указано в
4003
    общем описании).
4004
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
4005
    требуется выполнение первого замечания и принимается PID,
4006
    а не номер слота.
77 diamond 4007
 
6056 IgorA 4008
---------------------- Константы для регистров: ----------------------
4009
  eax - SF_DEBUG (69)
4010
  ebx - SSF_TERMINATE (8)
77 diamond 4011
======================================================================
3539 clevermous 4012
====================== Функция 69, подфункция 9 ======================
4013
============= Установить/снять аппаратную точку останова. ============
77 diamond 4014
======================================================================
3539 clevermous 4015
Параметры:
4016
  * eax = 69 - номер функции
4017
  * ebx = 9 - номер подфункции
4018
  * ecx = идентификатор потока
4019
  * dl = индекс точки останова, от 0 до 3 включительно
4020
  * dh = флаги:
4021
    * если старший бит сброшен - установить точку останова:
4022
      * биты 0-1 - условие:
4023
        * 00 = точка останова на выполнение
4024
        * 01 = точка останова на запись
4025
        * 11 = точка останова на чтение/запись
4026
      * биты 2-3 - длина; для точек останова на исполнение должно быть
4027
        00, в противном случае одно из
4028
        * 00 = байт
4029
        * 01 = слово
4030
        * 11 = двойное слово
4031
      * esi = адрес точки останова; должен быть выровнен
4032
        соответственно длине (т.е. должен быть чётным для
4033
        точек останова на слово, кратен 4 для двойного слова)
4034
    * если старший бит установлен - сбросить точку останова
4035
Возвращаемое значение:
4036
  * eax = 0 - успешно
4037
  * eax = 1 - ошибка во входных данных
4038
  * eax = 2 - (зарезервировано, никогда не возвращается
4039
    в текущей реализации) с этим индексом уже установлена
4040
    глобальная точка останова
4041
Замечания:
4042
  * Процесс должен быть загружен для отладки (как указано в
4043
    общем описании).
4044
  * Аппаратные точки останова реализуются через DRx-регистры
4045
    процессора, отсюда все ограничения.
4046
  * Функция может переустановить ранее установленную ей же
4047
    точку останова (никак не сообщая об этом).
4048
    Ведите список установленных точек останова в отладчике.
4049
  * Срабатывание точки останова заключается в генерировании
4050
    отладочного исключения #DB, о котором система сообщает отладчику.
4051
  * Точка останова на запись и чтение/запись срабатывает после
4052
    выполнения вызвавшей её инструкции.
77 diamond 4053
 
6056 IgorA 4054
---------------------- Константы для регистров: ----------------------
4055
  eax - SF_DEBUG (69)
4056
  ebx - SSF_DEFINE_BREAKPOINT (9)
77 diamond 4057
======================================================================
3539 clevermous 4058
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
77 diamond 4059
======================================================================
3539 clevermous 4060
Параметры:
77 diamond 4061
  * eax = 70
3539 clevermous 4062
  * ebx = указатель на информационную структуру
4063
Возвращаемое значение:
4064
  * eax = 0 - успешно; иначе код ошибки файловой системы
4065
  * в зависимости от подфункции может возвращаться значение и
4066
    в других регистрах
4067
Общий формат информационной структуры:
4068
  * +0: dword: номер подфункции
6798 pathoswith 4069
  * +4: dword: смещение в файле или папке
4070
  * +8: dword: старшая часть смещения или поле флагов
4071
  * +12 = +0xC: dword: размер данных
3539 clevermous 4072
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4073
  * +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
6502 pathoswith 4074
  или
6473 pathoswith 4075
  * +20 = +0x14: byte: 0
4076
  * +21 = +0x15: dword: указатель на строку
4077
Чувствительность к регистру букв зависит от файловой системы.
6758 pathoswith 4078
Если путь начинается не с '/', то он считается относительным.
4079
Получить или установить текущую папку можно с помощью сисфункции 30.
6798 pathoswith 4080
'../' в пути означает подъём на одну папку относительно текущей.
6758 pathoswith 4081
Можно указать кодировку строки, поместив в её начале байт со значениями:
6502 pathoswith 4082
  * 1 = cp866
4083
  * 2 = UTF-16LE
4084
  * 3 = UTF-8
6758 pathoswith 4085
иначе будет использоваться кодировка cp866. В абсолютном пути можно
4086
поместить этот байт после '/' или добавить дополнительный '/' перед ним.
6798 pathoswith 4087
Также, можно использовать сисфункцию 80.
6758 pathoswith 4088
Формат абсолютного пути:
6473 pathoswith 4089
  /base/number/dir1/dir2/.../dirn/file,
4090
где base/number идентифицирует устройство, на котором ищется файл:
4091
  * RD/1 = рамдиск
4092
  * FD/1 = первый флоппи-дисковод,
4093
    FD/2 = второй флоппи-дисковод
4094
  * HD0/x, HD1/x, HD2/x, HD3/x = жёсткие диски соответственно на
4095
    IDE0 (Primary Master), IDE1 (Primary Slave),
77 diamond 4096
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
6473 pathoswith 4097
    x - номер раздела на выбранном винчестере, начиная с 1
4098
  * CD0/1, CD1/1, CD2/1, CD3/1 = аналогично для cd
7722 dunkaist 4099
  * SYS - системная папка (является ключом, не зависит от кодировки),
6473 pathoswith 4100
    второй ключ может быть установлен сисфункцией 30.3.
3539 clevermous 4101
Примеры:
6473 pathoswith 4102
  * '/sys/example.asm',0
4103
  * '/rd/1/example.asm',0
4104
  * '/HD0/1/folder/file.txt',0
4105
  * '/hd2/2/pics/tanzania.bmp',0
4106
  * 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0
1662 Nasarus 4107
 
3539 clevermous 4108
Доступные подфункции:
4109
  * подфункция 0 - чтение файла
4110
  * подфункция 1 - чтение папки
4111
  * подфункция 2 - создание/перезапись файла
4112
  * подфункция 3 - запись в существующий файл
4113
  * подфункция 4 - установка размера файла
4114
  * подфункция 5 - получение атрибутов файла/папки
4115
  * подфункция 6 - установка атрибутов файла/папки
4116
  * подфункция 7 - запуск программы
4117
  * подфункция 8 - удаление файла/папки
4118
  * подфункция 9 - создание папки
4119
Для CD-приводов в связи с аппаратными ограничениями доступны
4120
только подфункции 0,1,5 и 7, вызов других подфункций завершится
4121
ошибкой с кодом 2.
4122
При первом обращении подфункций 0,1,5,7 к устройствам ATAPI
4123
(CD и DVD) производится блокировка ручного управления механизмом
4124
лотка. Это связано с кэшированием данных, полученных от привода.
4125
Разблокировка осуществляется при обращении подфункции 4 функции 24
4126
к соответствующему устройству.
77 diamond 4127
 
6056 IgorA 4128
---------------------- Константы для регистров: ----------------------
4129
  eax - SF_FILE (70)
4130
 [ebx] - SSF_READ_FILE (0), SSF_READ_FOLDER (1), SSF_CREATE_FILE (2),
4131
    SSF_WRITE_FILE (3), SSF_SET_END (4), SSF_GET_INFO (5),
4132
    SSF_SET_INFO (6), SSF_START_APP (7), SSF_DELETE (8),
4133
    SSF_CREATE_FOLDER (9)
77 diamond 4134
======================================================================
3539 clevermous 4135
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
77 diamond 4136
======================================================================
3539 clevermous 4137
Параметры:
4138
  * eax = 70 - номер функции
4139
  * ebx = указатель на информационную структуру
4140
Формат информационной структуры:
4141
  * +0: dword: 0 = номер подфункции
4142
  * +4: dword: позиция в файле (в байтах)
4143
  * +8: dword: 0 (зарезервировано под старший dword позиции)
4144
  * +12 = +0xC: dword: сколько байт читать
4145
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
6473 pathoswith 4146
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4147
Возвращаемое значение:
4148
  * eax = 0 - успешно, иначе код ошибки файловой системы
6880 pathoswith 4149
  * ebx = число прочитанных байт
3539 clevermous 4150
Замечания:
4151
  * Если файл кончился раньше, чем был прочитан последний запрошенный
4152
    блок, то функция прочитает, сколько сможет, после чего вернёт
77 diamond 4153
    eax=6 (EOF).
3539 clevermous 4154
  * Функция не позволяет читать папки
4155
    (вернётся eax=10, access denied).
77 diamond 4156
 
6056 IgorA 4157
---------------------- Константы для регистров: ----------------------
4158
  eax - SF_FILE (70)
4159
 [ebx] - SSF_READ_FILE (0)
77 diamond 4160
======================================================================
3539 clevermous 4161
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
77 diamond 4162
======================================================================
3539 clevermous 4163
Параметры:
4164
  * eax = 70 - номер функции
4165
  * ebx = указатель на информационную структуру
4166
Формат информационной структуры:
4167
  * +0: dword: 1 = номер подфункции
4168
  * +4: dword: индекс начального блока (считая с 0)
6473 pathoswith 4169
  * +8: dword: в какой кодировке возвращать имена:
6798 pathoswith 4170
 
4171
    1 = cp866
4172
    2 = UTF-16LE
4173
    3 = UTF-8
3539 clevermous 4174
  * +12 = +0xC: dword: сколько блоков читать
6798 pathoswith 4175
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные.
6473 pathoswith 4176
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4177
Возвращаемое значение:
4178
  * eax = 0 - успешно, иначе код ошибки файловой системы
6880 pathoswith 4179
  * ebx = число файлов, информация о которых была записана в буфер
3539 clevermous 4180
Структура буфера:
6473 pathoswith 4181
  * заголовок (32 байта)
4182
  * блок с информацией о файле 1
4183
  * блок с информацией о файле 2
77 diamond 4184
  * ...
3539 clevermous 4185
Структура заголовка:
4186
  * +0: dword: версия структуры (текущая версия = 1)
4187
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
4188
    в поле +12 информационной структуры; может быть меньше,
4189
    если в папке кончились файлы (то же самое, что и в ebx)
4190
  * +8: dword: общее число файлов в папке
4191
  * +12 = +0xC: 20*byte: зарезервировано (нули)
4192
Структура блока данных входа каталога (БДВК):
4193
  * +0: dword: атрибуты файла:
4194
    * бит 0 (маска 1): файл только для чтения
4195
    * бит 1 (маска 2): файл является скрытым
4196
    * бит 2 (маска 4): файл является системным
6901 pathoswith 4197
    * бит 3 (маска 8): это метка тома (возвращается подфункцией 5)
3539 clevermous 4198
    * бит 4 (маска 0x10): это папка
4199
    * бит 5 (маска 0x20): файл не архивировался - многие программы
4200
      архивации имеют опцию, по которой архивируются только файлы
4201
      с установленным этим битом, после чего этот бит сбрасывается -
4202
      это может быть полезно для автоматического создания
4203
      backup-архивов, ибо при записи бит обычно устанавливается
4204
      (не в Kolibri, правда)
6798 pathoswith 4205
  * +4: dword: кодировка имени, соответствует полю +8 информационной структуры
3539 clevermous 4206
  * +8: 4*byte: время создания файла
4207
  * +12 = +0xC: 4*byte: дата создания файла
4208
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
4209
  * +20 = +0x14: 4*byte: дата последнего доступа
4210
  * +24 = +0x18: 4*byte: время последней модификации
4211
  * +28 = +0x1C: 4*byte: дата последней модификации
4212
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
6798 pathoswith 4213
  * +40 = +0x28: имя, размер в cp866 составляет 264 байта, иначе - 520 байт.
3539 clevermous 4214
Формат времени:
4215
  * +0: byte: секунды
4216
  * +1: byte: минуты
4217
  * +2: byte: часы
4218
  * +3: byte: зарезервировано (0)
4219
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
4220
Формат даты:
4221
  * +0: byte: день
4222
  * +1: byte: месяц
4223
  * +2: word: год
4224
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
9745 sober_dev 4225
    Некоторые файловые системы ведут дату с 01.01.1980,
4226
    например: FAT12/16/32 и exFAT
3539 clevermous 4227
Замечания:
6798 pathoswith 4228
  * Если БДВК содержит имя в cp866, то длина БДВК составляет
4229
    304 байта, иначе - 560 байт.
6473 pathoswith 4230
  * Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
3539 clevermous 4231
  * Если файлы в папке кончились раньше, чем было прочитано
4232
    запрошенное количество, то функция прочитает, сколько сможет,
4233
    после чего вернёт eax=6 (EOF).
4234
  * Любая папка на диске, кроме корневой, содержит два специальных
4235
    входа "." и "..", идентифицирующих соответственно саму папку и
4236
    родительскую папку.
4237
  * Функция позволяет также читать виртуальные папки "/", "/rd",
4238
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
6473 pathoswith 4239
    0x10, а времена и даты обнулены.
77 diamond 4240
 
6056 IgorA 4241
---------------------- Константы для регистров: ----------------------
4242
  eax - SF_FILE (70)
4243
 [ebx] - SSF_READ_FOLDER (1)
77 diamond 4244
======================================================================
3539 clevermous 4245
====================== Функция 70, подфункция 2 ======================
4246
======== Создание/перезапись файла с поддержкой длинных имён. ========
83 diamond 4247
======================================================================
3539 clevermous 4248
Параметры:
4249
  * eax = 70 - номер функции
4250
  * ebx = указатель на информационную структуру
4251
Формат информационной структуры:
4252
  * +0: dword: 2 = номер подфункции
4253
  * +4: dword: 0 (зарезервировано)
4254
  * +8: dword: 0 (зарезервировано)
4255
  * +12 = +0xC: dword: сколько байт писать
4256
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4257
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4258
Возвращаемое значение:
4259
  * eax = 0 - успешно, иначе код ошибки файловой системы
4260
  * ebx = число записанных байт (возможно, 0)
4261
Замечания:
4262
  * Если файл с таким именем не существовал, он создаётся; если
4263
    существовал, то перезаписывается.
4264
  * Если свободного места на диске недостаточно, то функция запишет,
4265
    сколько сможет, после чего вернёт код ошибки 8.
4266
  * Функция не поддерживается для CD (вернётся код ошибки 2).
83 diamond 4267
 
6056 IgorA 4268
---------------------- Константы для регистров: ----------------------
4269
  eax - SF_FILE (70)
4270
 [ebx] - SSF_CREATE_FILE (2)
83 diamond 4271
======================================================================
3539 clevermous 4272
====================== Функция 70, подфункция 3 ======================
4273
======== Запись в существующий файл с поддержкой длинных имён. =======
131 diamond 4274
======================================================================
3539 clevermous 4275
Параметры:
4276
  * eax = 70 - номер функции
4277
  * ebx = указатель на информационную структуру
4278
Формат информационной структуры:
4279
  * +0: dword: 3 = номер подфункции
4280
  * +4: dword: позиция в файле (в байтах)
4281
  * +8: dword: старший dword позиции (должен быть 0 для FAT)
4282
  * +12 = +0xC: dword: сколько байт писать
4283
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4284
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4285
Возвращаемое значение:
4286
  * eax = 0 - успешно, иначе код ошибки файловой системы
4287
  * ebx = число записанных байт (возможно, 0)
4288
Замечания:
4289
  * Файл должен уже существовать, иначе вернётся eax=5.
4290
  * Единственным результатом записи 0 байт является установка в
4291
    атрибутах файла даты/времени модификации и доступа в текущую.
4292
  * Если начальная и/или конечная позиция выходит за пределы файла
4293
    (за исключением предыдущего случая), файл расширяется до
4294
    необходимого размера нулевыми символами.
4295
  * Функция не поддерживается для CD (вернётся код ошибки 2).
131 diamond 4296
 
6056 IgorA 4297
---------------------- Константы для регистров: ----------------------
4298
  eax - SF_FILE (70)
4299
 [ebx] - SSF_WRITE_FILE (3)
131 diamond 4300
======================================================================
3539 clevermous 4301
========= Функция 70, подфункция 4 - установка размера файла. ========
133 diamond 4302
======================================================================
3539 clevermous 4303
Параметры:
4304
  * eax = 70 - номер функции
4305
  * ebx = указатель на информационную структуру
4306
Формат информационной структуры:
4307
  * +0: dword: 4 = номер подфункции
4308
  * +4: dword: младший dword нового размера файла
4309
  * +8: dword: старший dword нового размера файла
4310
  * +12 = +0xC: dword: 0 (зарезервировано)
4311
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4312
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4313
Возвращаемое значение:
4314
  * eax = 0 - успешно, иначе код ошибки файловой системы
4315
  * ebx разрушается
4316
Замечания:
6758 pathoswith 4317
  * Если новый размер файла меньше старого, файл усекается.
4318
    Если новый размер больше старого, файл расширяется, и если
4319
    разница в размере не больше 16 МБ, новое место очищается нулями.
3539 clevermous 4320
  * Если свободного места на диске недостаточно для расширения файла,
4321
    то функция расширит насколько возможно, после чего вернёт
4322
    код ошибки 8.
4323
  * Функция не поддерживается для CD (вернётся код ошибки 2).
133 diamond 4324
 
6056 IgorA 4325
---------------------- Константы для регистров: ----------------------
4326
  eax - SF_FILE (70)
4327
 [ebx] - SSF_SET_END (4)
133 diamond 4328
======================================================================
3539 clevermous 4329
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
86 diamond 4330
======================================================================
3539 clevermous 4331
Параметры:
4332
  * eax = 70 - номер функции
4333
  * ebx = указатель на информационную структуру
4334
Формат информационной структуры:
4335
  * +0: dword: 5 = номер подфункции
4336
  * +4: dword: 0 (зарезервировано)
6427 pathoswith 4337
  * +8: dword: 0 или флаги (для корневого каталога)
3539 clevermous 4338
  * +12 = +0xC: dword: 0 (зарезервировано)
4339
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
4340
                        (40 байт)
6473 pathoswith 4341
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4342
Возвращаемое значение:
4343
  * eax = 0 - успешно, иначе код ошибки файловой системы
4344
  * ebx разрушается
4345
Информация о файле возвращается в формате БДВК
6427 pathoswith 4346
(блока данных входа каталога), указанном в описании подфункции 1,
4347
но без имени файла, за исключением корневого каталога.
3539 clevermous 4348
Замечания:
6876 pathoswith 4349
  * Для корневого каталога возвращается размер раздела,
4350
    а при указании кодировки (не ноль), также его имя.
6875 pathoswith 4351
  * Для устройства возвращается только размер.
86 diamond 4352
 
6056 IgorA 4353
---------------------- Константы для регистров: ----------------------
4354
  eax - SF_FILE (70)
4355
 [ebx] - SSF_GET_INFO (5)
86 diamond 4356
======================================================================
3539 clevermous 4357
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
86 diamond 4358
======================================================================
3539 clevermous 4359
Параметры:
4360
  * eax = 70 - номер функции
4361
  * ebx = указатель на информационную структуру
4362
Формат информационной структуры:
4363
  * +0: dword: 6 = номер подфункции
4364
  * +4: dword: 0 (зарезервировано)
4365
  * +8: dword: 0 (зарезервировано)
4366
  * +12 = +0xC: dword: 0 (зарезервировано)
4367
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
6473 pathoswith 4368
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4369
Возвращаемое значение:
4370
  * eax = 0 - успешно, иначе код ошибки файловой системы
4371
  * ebx разрушается
4372
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
4373
формат которого указан в описании подфункции 1
4374
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
4375
(биты 3,4 в dword'е +0) не меняется.
4376
Байт +4 (формат имени) игнорируется.
4377
Замечания:
4378
  * Функция не поддерживает виртуальные папки типа /, /rd и
4379
    корневые папки типа /rd/1.
4380
  * Функция не поддерживается для CD (вернётся код ошибки 2).
86 diamond 4381
 
6056 IgorA 4382
---------------------- Константы для регистров: ----------------------
4383
  eax - SF_FILE (70)
4384
 [ebx] - SSF_SET_INFO (6)
86 diamond 4385
======================================================================
3539 clevermous 4386
============ Функция 70, подфункция 7 - запуск программы. ============
91 diamond 4387
======================================================================
3539 clevermous 4388
Параметры:
4389
  * eax = 70 - номер функции
4390
  * ebx = указатель на информационную структуру
4391
Формат информационной структуры:
4392
  * +0: dword: 7 = номер подфункции
4393
  * +4: dword: поле флагов:
4394
    * бит 0: запустить процесс как отлаживаемый
4395
    * остальные биты зарезервированы и должны быть установлены в 0
4396
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
4397
  * +12 = +0xC: dword: 0 (зарезервировано)
4398
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4399
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4400
Возвращаемое значение:
4401
  * eax > 0 - программа загружена, eax содержит PID
4402
  * eax < 0 - произошла ошибка, -eax содержит
4403
    код ошибки файловой системы
4404
  * ebx разрушается
4405
Замечания:
4406
  * Командная строка должна заканчиваться символом с кодом 0
4407
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
4408
    включительно, либо первые 256 символов, в зависимости от того,
4409
    что меньше.
4410
  * Если процесс запускается как отлаживаемый, он создаётся
4411
    в замороженном состоянии; для запуска используйте
4412
    подфункцию 5 функции 69.
91 diamond 4413
 
6056 IgorA 4414
---------------------- Константы для регистров: ----------------------
4415
  eax - SF_FILE (70)
4416
 [ebx] - SSF_START_APP (7)
91 diamond 4417
======================================================================
3539 clevermous 4418
========== Функция 70, подфункция 8 - удаление файла/папки. ==========
172 serge 4419
======================================================================
3539 clevermous 4420
Параметры:
4421
  * eax = 70 - номер функции
4422
  * ebx = указатель на информационную структуру
4423
Формат информационной структуры:
4424
  * +0: dword: 8 = номер подфункции
4425
  * +4: dword: 0 (зарезервировано)
4426
  * +8: dword: 0 (зарезервировано)
4427
  * +12 = +0xC: dword: 0 (зарезервировано)
4428
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4429
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4430
Возвращаемое значение:
4431
  * eax = 0 - успешно, иначе код ошибки файловой системы
4432
  * ebx разрушается
4433
Замечания:
4434
  * Функция не поддерживается для CD (вернётся код ошибки 2).
4435
  * Можно удалять только пустые папки (попытка удаления непустой папки
4436
    приведёт к ошибке с кодом 10, "доступ запрещён").
172 serge 4437
 
6056 IgorA 4438
---------------------- Константы для регистров: ----------------------
4439
  eax - SF_FILE (70)
4440
 [ebx] - SSF_DELETE (8)
172 serge 4441
======================================================================
3539 clevermous 4442
============= Функция 70, подфункция 9 - создание папки. =============
321 diamond 4443
======================================================================
3539 clevermous 4444
Параметры:
4445
  * eax = 70 - номер функции
4446
  * ebx = указатель на информационную структуру
4447
Формат информационной структуры:
4448
  * +0: dword: 9 = номер подфункции
4449
  * +4: dword: 0 (зарезервировано)
4450
  * +8: dword: 0 (зарезервировано)
4451
  * +12 = +0xC: dword: 0 (зарезервировано)
4452
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4453
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4454
Возвращаемое значение:
4455
  * eax = 0 - успешно, иначе код ошибки файловой системы
4456
  * ebx разрушается
4457
Замечания:
4458
  * Функция не поддерживается для CD (вернётся код ошибки 2).
4459
  * Родительская папка должна уже существовать.
4460
  * Если папка уже существует, функция завершится успешно (eax=0).
321 diamond 4461
 
6056 IgorA 4462
---------------------- Константы для регистров: ----------------------
4463
  eax - SF_FILE (70)
4464
 [ebx] - SSF_CREATE_FOLDER (9)
321 diamond 4465
======================================================================
6917 pathoswith 4466
======= Функция 70, подфункция 10 - переименование/перемещение =======
4467
======================================================================
4468
Параметры:
4469
  * eax = 70 - номер функции
4470
  * ebx = указатель на информационную структуру
4471
Формат информационной структуры:
4472
  * +0: dword: 10 = номер подфункции
4473
  * +4: dword: 0 (зарезервировано)
4474
  * +8: dword: 0 (зарезервировано)
4475
  * +12 = +0xC: dword: 0 (зарезервировано)
4476
  * +16 = +0x10: dword: указатель на строку с новым именем/путём
4477
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
4478
Возвращаемое значение:
4479
  * eax = 0 - успешно, иначе код ошибки файловой системы
4480
  * ebx разрушается
4481
Замечания:
4482
  * Формирование нового пути отличается от общих правил:
4483
    относительный путь относится к папке целевого файла (или папки),
4484
    абсолютный путь считается от корня раздела.
4485
======================================================================
6802 pathoswith 4486
========== Функция 71 - установить заголовок окна программы ==========
114 mikedld 4487
======================================================================
3539 clevermous 4488
Параметры:
4489
  * eax = 71 - номер функции
6802 pathoswith 4490
  * ebx = 1
4491
  * ecx = адрес строки заголовка,
4492
    строка может начинаться с байта кодировки:
4493
    1 = cp866
4494
    2 = UTF-16LE
4495
    3 = UTF-8
4496
  или:
4497
  * ebx = 2
3539 clevermous 4498
  * ecx = адрес строки заголовка
6802 pathoswith 4499
  * dl  = кодировка строки
3539 clevermous 4500
Возвращаемое значение:
4501
  * функция не возвращает значения
4502
Замечания:
5926 pathoswith 4503
  * Строка заголовка должна заканчиваться нулём.
3539 clevermous 4504
  * Чтобы убрать заголовок, передайте NULL в ecx.
114 mikedld 4505
 
6056 IgorA 4506
---------------------- Константы для регистров: ----------------------
4507
  eax - SF_SET_CAPTION (71)
114 mikedld 4508
======================================================================
3539 clevermous 4509
================ Функция 72 - послать сообщение окну. ================
665 diamond 4510
======================================================================
4511
 
3539 clevermous 4512
--- Подфункция 1 - послать сообщение с параметром активному окну. ----
4513
Параметры:
4514
  * eax = 72 - номер функции
4515
  * ebx = 1 - номер подфункции
4516
  * ecx = код события: 2 или 3
4517
  * edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3
4518
Возвращаемое значение:
4519
  * eax = 0 - успешно
4520
  * eax = 1 - буфер заполнен
665 diamond 4521
 
6056 IgorA 4522
---------------------- Константы для регистров: ----------------------
4523
  eax - SF_SEND_MESSAGE (72)
665 diamond 4524
======================================================================
3539 clevermous 4525
===================== Функция 73 - blit bitmap  =====================
3315 mario79 4526
======================================================================
3539 clevermous 4527
блит - копирование битового массив
3315 mario79 4528
 
3539 clevermous 4529
Параметры:
4530
  * eax = 73 - номер функции
3315 mario79 4531
 
3539 clevermous 4532
  * ebx = ROP и опциональные флаги
6790 0CodErr 4533
     31      30 29 28       6 5  4 3   0
4534
     [reserved][CR][reserved][T][B][ROP]
3539 clevermous 4535
     ROP - код растровых операций
4536
        0: копировать
4537
     1-15: Зарезервировано
7722 dunkaist 4538
     B   - блит на фоновую поверхность
3539 clevermous 4539
     T   - блит с прозрачностью
6790 0CodErr 4540
     CR  - относительно клиентской области окна
6798 pathoswith 4541
 
3539 clevermous 4542
  * ecx = указатель на параметры функции
4543
        смещение цели и отсечение
4544
     +0 signed dword: смещение по X окна, для целевого прямоугольника
4545
                      верхний левый угол
4546
     +4 signed dword: смещение по Y окна, для целевого прямоугольника
4547
                      верхний левый угол
4548
     +8 dword:        ширина целевого прямоугольника
4549
    +12 dword:        высота целевого прямоугольника
3315 mario79 4550
 
3539 clevermous 4551
        смещение исходника и отсечение
4552
    +16 signed dword: смещение по X bitmap, для исходного прямоугольника
4553
                      верхний левый угол
4554
    +20 signed dword: смещение по Y bitmap, для исходного прямоугольника
4555
                      верхний левый угол
4556
    +24 dword:        ширина исходного прямоугольника
4557
    +28 dword:        высота исходного прямоугольника
3315 mario79 4558
 
3539 clevermous 4559
    +32: dword: данные bitmap - должны быть 32bpp
4560
    +36: dword: размер строки bitmap в байтах
3315 mario79 4561
 
3539 clevermous 4562
Возвращаемое значение:
4563
  * функция не возвращает значения
3315 mario79 4564
 
6056 IgorA 4565
---------------------- Константы для регистров: ----------------------
4566
  eax - SF_BLITTER (73)
3315 mario79 4567
======================================================================
3837 mario79 4568
=================== Функция 74, подфункция -1 ========================
4569
=========== Получить количество активных сетевых устройств. ==========
4570
======================================================================
4571
Параметры:
4572
  * eax = 74 - номер функции
4573
  * bl = -1 - номер подфункции
4574
Возвращаемое значение:
4575
  * eax = количество активных сетевых устройств
4576
 
6056 IgorA 4577
---------------------- Константы для регистров: ----------------------
4578
  eax - SF_NETWORK_GET (74)
4579
   bl - SSF_DEVICE_COUNT (255)
3837 mario79 4580
======================================================================
4581
==== Функция 74, подфункция 0, Получить тип сетевого устройства. =====
4582
======================================================================
4583
Параметры:
4584
  * eax = 74 - номер функции
4585
  * bl = 0 - номер подфункции
4586
  * bh = номер устройства
4587
Возвращаемое значение:
4588
  * eax = тип устройства
4589
 
6056 IgorA 4590
---------------------- Константы для регистров: ----------------------
4591
  eax - SF_NETWORK_GET (74)
4592
   bl - SSF_DEVICE_TYPE (0)
3837 mario79 4593
======================================================================
4594
==== Функция 74, подфункция 1, Получить имя сетевого устройства. =====
4595
======================================================================
4596
Параметры:
4597
  * eax = 74 - номер функции
4598
  * bl = 1 - номер подфункции
4599
  * bh = номер устройства
6473 pathoswith 4600
  * ecx = указатель на буфера - 64 байт
3837 mario79 4601
Возвращаемое значение:
4602
  * eax = -1 для ошибки
4603
  * В случае успеха в буфер записывается имя сетевого устройства
4604
 
6056 IgorA 4605
---------------------- Константы для регистров: ----------------------
4606
  eax - SF_NETWORK_GET (74)
4607
   bl - SSF_DEVICE_NAME (1)
3837 mario79 4608
======================================================================
4609
======= Функция 74, подфункция 2, Сброс сетевого устройства. =========
4610
======================================================================
4611
Параметры:
4612
  * eax = 74 - номер функции
4613
  * bl = 2 - номер подфункции
4614
  * bh = номер устройства
4615
Возвращаемое значение:
4616
  * eax = -1 для ошибки
4617
 
6056 IgorA 4618
---------------------- Константы для регистров: ----------------------
4619
  eax - SF_NETWORK_GET (74)
4620
   bl - SSF_RESET_DEVICE (2)
3837 mario79 4621
======================================================================
4622
====== Функция 74, подфункция 3, Остановить сетевое устройство. ======
4623
======================================================================
4624
Параметры:
4625
  * eax = 74 - номер функции
4626
  * bl = 3 - номер подфункции
4627
  * bh = номер устройства
4628
Возвращаемое значение:
4629
  * eax = -1 для ошибки
4630
 
6056 IgorA 4631
---------------------- Константы для регистров: ----------------------
4632
  eax - SF_NETWORK_GET (74)
4633
   bl - SSF_STOP_DEVICE (3)
3837 mario79 4634
======================================================================
5983 pathoswith 4635
===== Функция 74, подфункция 4, Получить указатель на устройство =====
4636
======================================================================
4637
Параметры:
4638
  * eax = 74 - номер функции
4639
  * bl = 4 - номер подфункции
4640
  * bh = номер устройства
4641
Возвращаемое значение:
4642
  * eax = указатель, -1 для ошибки
4643
 
6056 IgorA 4644
---------------------- Константы для регистров: ----------------------
4645
  eax - SF_NETWORK_GET (74)
7722 dunkaist 4646
   bl - SSF_DEVICE_POINTER (4)
5983 pathoswith 4647
======================================================================
4648
=== Функция 74, подфункция 6, Получить количество посланых пакетов ===
4649
======================================================================
4650
Параметры:
4651
  * eax = 74 - номер функции
4652
  * bl = 6 - номер подфункции
4653
  * bh = номер устройства
4654
Возвращаемое значение:
4655
  * eax = количество с момента старта устройства, -1 для ошибки
4656
 
6056 IgorA 4657
---------------------- Константы для регистров: ----------------------
4658
  eax - SF_NETWORK_GET (74)
4659
   bl - SSF_TX_PACKET_COUNT (6)
5983 pathoswith 4660
======================================================================
4661
=== Функция 74, подфункция 7, Получить количество принятых пакетов ===
4662
======================================================================
4663
Параметры:
4664
  * eax = 74 - номер функции
4665
  * bl = 7 - номер подфункции
4666
  * bh = номер устройства
4667
Возвращаемое значение:
4668
  * eax = количество с момента старта устройства, -1 для ошибки
4669
 
6056 IgorA 4670
---------------------- Константы для регистров: ----------------------
4671
  eax - SF_NETWORK_GET (74)
4672
   bl - SSF_RX_PACKET_COUNT (7)
5983 pathoswith 4673
======================================================================
4674
==== Функция 74, подфункция 8, Получить количество посланых байт. ====
4675
======================================================================
4676
Параметры:
4677
  * eax = 74 - номер функции
4678
  * bl = 8 - номер подфункции
4679
  * bh = номер устройства
4680
Возвращаемое значение:
4681
  * eax = количество с момента старта устройства, -1 для ошибки
4682
  * ebx = старшая часть
4683
 
6056 IgorA 4684
---------------------- Константы для регистров: ----------------------
4685
  eax - SF_NETWORK_GET (74)
4686
   bl - SSF_TX_BYTE_COUNT (8)
5983 pathoswith 4687
======================================================================
4688
==== Функция 74, подфункция 9, Получить количество принятых байт. ====
4689
======================================================================
4690
Параметры:
4691
  * eax = 74 - номер функции
4692
  * bl = 9 - номер подфункции
4693
  * bh = номер устройства
4694
Возвращаемое значение:
4695
  * eax = количество с момента старта устройства, -1 для ошибки
4696
  * ebx = старшая часть
4697
 
6056 IgorA 4698
---------------------- Константы для регистров: ----------------------
4699
  eax - SF_NETWORK_GET (74)
4700
   bl - SSF_RX_BYTE_COUNT (9)
5983 pathoswith 4701
======================================================================
4702
======= Функция 74, подфункция 10, Получить статус соединения. =======
4703
======================================================================
4704
Параметры:
4705
  * eax = 74 - номер функции
4706
  * bl = 10 - номер подфункции
4707
  * bh = номер устройства
4708
Возвращаемое значение:
4709
  * eax = статус соединения, -1 для ошибки
4710
 
4711
Статусы:
4712
 
4713
  1 = неизвестное соединение
4714
  4 = 10 Мбит
4715
  8 = 100 Мбит
4716
  12 = 1 Гбит
4717
  10b = флаг полного дуплекса
4718
 
6056 IgorA 4719
---------------------- Константы для регистров: ----------------------
4720
  eax - SF_NETWORK_GET (74)
4721
   bl - SSF_LINK_STATUS (10)
5983 pathoswith 4722
======================================================================
9060 leency 4723
== Функция 74.11, Получить количество пакетов переданных с ошибкой. ==
9017 hidnplayr 4724
======================================================================
9060 leency 4725
Параметры:
4726
  * eax = 74 - номер функции
4727
  * bl = 11 - номер подфункции
4728
  * bh = номер устройства
4729
Возвращаемое значение:
4730
  * eax = Количество ошибочных пакетов, переданных с момента запуска
4731
          устройства, -1 при ошибке
9017 hidnplayr 4732
 
9060 leency 4733
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4734
  eax - SF_NETWORK_GET (74)
9060 leency 4735
   bl - SSF_TX_PACKET_ERROR_COUNT (11)
9017 hidnplayr 4736
======================================================================
9060 leency 4737
=== Функция 74.12, Получить число пакетов отброшенных при отправке. ==
9017 hidnplayr 4738
======================================================================
9060 leency 4739
Параметры:
4740
  * eax = 74 - номер функции
4741
  * bl = 12 - номер подфункции
4742
  * bh = номер устройства
4743
Возвращаемое значение:
4744
  * eax = число отброшенных пакетов с момента запуска устройства,
4745
    -1 при ошибке
9017 hidnplayr 4746
 
9060 leency 4747
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4748
  eax - SF_NETWORK_GET (74)
9060 leency 4749
   bl - SSF_TX_PACKET_DROP_COUNT (12)
9017 hidnplayr 4750
======================================================================
9060 leency 4751
=== Функция 74.13, Получить число пакетов утерянных при отправке. ====
9017 hidnplayr 4752
======================================================================
9060 leency 4753
Параметры:
4754
  * eax = 74 - номер функции
4755
  * bl = 13 - номер подфункции
4756
  * bh = номер устройства
4757
Возвращаемое значение:
4758
  * eax = число утерянных пакетов с момента запуска устройства,
4759
    -1 при ошибке
9017 hidnplayr 4760
 
9060 leency 4761
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4762
  eax - SF_NETWORK_GET (74)
9060 leency 4763
   bl - SSF_TX_PACKET_MISS_COUNT (13)
4764
 
9017 hidnplayr 4765
======================================================================
9060 leency 4766
==== Функция 74.14, Получить число пакетов полученных с ошибкой. =====
4767
======================================================================
4768
Параметры:
4769
  * eax = 74 - номер функции
4770
  * bl = 14 - номер подфункции
4771
  * bh = номер устройства
4772
Возвращаемое значение:
4773
  * eax = число пакетов, полученных с ошибкой с момента запуска
4774
    устройства, -1 при ошибке
4775
 
4776
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4777
  eax - SF_NETWORK_GET (74)
9060 leency 4778
   bl - SSF_RX_PACKET_ERROR_COUNT (14)
9017 hidnplayr 4779
======================================================================
9060 leency 4780
== Функция 74.15, Получить число пакетов отброшенных при получении. ==
9017 hidnplayr 4781
======================================================================
9060 leency 4782
Параметры:
4783
  * eax = 74 - номер функции
4784
  * bl = 15 - номер подфункции
4785
  * bh = номер устройства
4786
Возвращаемое значение:
4787
  * eax = число отброшенных пакетов с момента запуска устройства,
4788
    -1 при ошибке
9017 hidnplayr 4789
 
9060 leency 4790
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4791
  eax - SF_NETWORK_GET (74)
9060 leency 4792
   bl - SSF_RX_PACKET_DROP_COUNT (12)
9017 hidnplayr 4793
======================================================================
9060 leency 4794
=== Функция 74.16, Получить число пакетов утерянных при получении. ===
9017 hidnplayr 4795
======================================================================
9060 leency 4796
Параметры:
4797
  * eax = 74 - номер функции
4798
  * bl = 16 - номер подфункции
4799
  * bh = номер устройства
4800
Возвращаемое значение:
4801
  * eax = число утерянных пакетов с момента запуска устройства,
4802
    -1 при ошибке
9017 hidnplayr 4803
 
9060 leency 4804
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4805
  eax - SF_NETWORK_GET (74)
9060 leency 4806
   bl - SSF_RX_PACKET_MISS_COUNT (16)
9017 hidnplayr 4807
======================================================================
6235 pathoswith 4808
============== Функция 75, подфункция 0, Открыть сокет. ==============
3837 mario79 4809
======================================================================
4810
Параметры:
4811
  * eax = 75 - номер функции
4812
  * bl = 0 - номер подфункции
4813
  * ecx = домен
4814
  * edx = тип
4815
  * esi = протокол
4816
Возвращаемое значение:
4817
  * eax = номер сокета, -1 для ошибки
3868 mario79 4818
  * ebx = код ошибки
3837 mario79 4819
 
6056 IgorA 4820
---------------------- Константы для регистров: ----------------------
4821
  eax - SF_NETWORK_SOCKET (75)
4822
   bl - SSF_OPEN (0)
3837 mario79 4823
======================================================================
6235 pathoswith 4824
============== Функция 75, подфункция 1, Закрыть сокет. ==============
3837 mario79 4825
======================================================================
4826
Параметры:
4827
  * eax = 75 - номер функции
4828
  * bl = 1 - номер подфункции
4829
  * ecx = номер сокета
4830
Возвращаемое значение:
4831
  * eax = -1 для ошибки
3868 mario79 4832
  * ebx = код ошибки
3837 mario79 4833
 
6056 IgorA 4834
---------------------- Константы для регистров: ----------------------
4835
  eax - SF_NETWORK_SOCKET (75)
4836
   bl - SSF_CLOSE (1)
3837 mario79 4837
======================================================================
4838
============= Функция 75, подфункция 2, Bind (Привязка). =============
4839
======================================================================
4840
Параметры:
4841
  * eax = 75 - номер функции
4842
  * bl = 2 - номер подфункции
4843
  * ecx = номер сокета
4844
  * edx = указатель на структуру sockaddr
4845
  * esi = длина структуры sockaddr
6712 0CodErr 4846
Формат структуры SockAddr:
4847
  * +0: Word: Family
4848
  * +2: 14*Byte: Data
3837 mario79 4849
Возвращаемое значение:
4850
  * eax = -1 для ошибки
3868 mario79 4851
  * ebx = код ошибки
3837 mario79 4852
 
6056 IgorA 4853
---------------------- Константы для регистров: ----------------------
4854
  eax - SF_NETWORK_SOCKET (75)
4855
   bl - SSF_BIND (2)
3837 mario79 4856
======================================================================
4857
============ Функция 75, подфункция 3, Listen (Слушать). =============
4858
======================================================================
4859
Параметры:
4860
  * eax = 75 - номер функции
4861
  * bl = 3 - номер подфункции
4862
  * ecx = номер сокета
4863
  * edx = backlog (возвращаемый лог)
4864
Возвращаемое значение:
4865
  * eax = -1 для ошибки
3868 mario79 4866
  * ebx = код ошибки
3837 mario79 4867
 
6056 IgorA 4868
---------------------- Константы для регистров: ----------------------
4869
  eax - SF_NETWORK_SOCKET (75)
4870
   bl - SSF_LISTEN (3)
3837 mario79 4871
======================================================================
4872
========== Функция 75, подфункция 4, Connect (Соединение). ===========
4873
======================================================================
4874
Параметры:
4875
  * eax = 75 - номер функции
4876
  * bl = 4 - номер подфункции
4877
  * ecx = номер сокета
4878
  * edx = указатель на структуру sockaddr
4879
  * esi = длина структуры sockaddr
6712 0CodErr 4880
Формат структуры SockAddr:
4881
  * +0: Word: Family
6758 pathoswith 4882
  * +2: 14*Byte: Data
3837 mario79 4883
Возвращаемое значение:
4884
  * eax = -1 для ошибки
3868 mario79 4885
  * ebx = код ошибки
3837 mario79 4886
 
6056 IgorA 4887
---------------------- Константы для регистров: ----------------------
4888
  eax - SF_NETWORK_SOCKET (75)
4889
   bl - SSF_CONNECT (4)
3837 mario79 4890
======================================================================
4891
=========== Функция 75, подфункция 5, Accept (Соглашение). ===========
4892
======================================================================
4893
Параметры:
4894
  * eax = 75 - номер функции
4895
  * bl = 5 - номер подфункции
4896
  * ecx = номер сокета
4897
  * edx = указатель на структуру sockaddr
4898
  * esi = длина структуры sockaddr
6712 0CodErr 4899
Формат структуры SockAddr:
4900
  * +0: Word: Family
6758 pathoswith 4901
  * +2: 14*Byte: Data
3837 mario79 4902
Возвращаемое значение:
3868 mario79 4903
  * eax = номер сокета из принятого сокета, -1 для ошибки
4904
  * ebx = код ошибки
3837 mario79 4905
 
6056 IgorA 4906
---------------------- Константы для регистров: ----------------------
4907
  eax - SF_NETWORK_SOCKET (75)
4908
   bl - SSF_ACCEPT (5)
3837 mario79 4909
======================================================================
4910
============= Функция 75, подфункция 6, Send (Послать). ==============
4911
======================================================================
4912
Параметры:
4913
  * eax = 75 - номер функции
4914
  * bl = 6 - номер подфункции
4915
  * ecx = номер сокета
4916
  * edx = указатель на буфер
4917
  * esi = длина буфера
3868 mario79 4918
  * edi = флаги
3837 mario79 4919
Возвращаемое значение:
4920
  * eax = количество скопированных байтов, -1 для ошибки
3868 mario79 4921
  * ebx = код ошибки
3837 mario79 4922
 
6056 IgorA 4923
---------------------- Константы для регистров: ----------------------
4924
  eax - SF_NETWORK_SOCKET (75)
4925
   bl - SSF_SEND (6)
3837 mario79 4926
======================================================================
4927
============ Функция 75, подфункция 7, Receive (Получить). ===========
4928
======================================================================
4929
Параметры:
4930
  * eax = 75 - номер функции
4931
  * bl = 7 - номер подфункции
4932
  * ecx = номер сокета
4933
  * edx = указатель на буфер
4934
  * esi = длина буфера
4935
  * edi = флаги
4936
Возвращаемое значение:
4937
  * eax = количество скопированных байтов, -1 для ошибки
3868 mario79 4938
  * ebx = код ошибки
3837 mario79 4939
 
6056 IgorA 4940
---------------------- Константы для регистров: ----------------------
4941
  eax - SF_NETWORK_SOCKET (75)
4942
   bl - SSF_RECEIVE (7)
3837 mario79 4943
======================================================================
6235 pathoswith 4944
=========== Функция 75, подфункция 8, Задать опции сокета. ===========
3837 mario79 4945
======================================================================
4946
Параметры:
4947
  * eax = 75 - номер функции
4948
  * bl = 8 - номер подфункции
4949
  * ecx = номер сокета
4950
  * edx = указатель на optstruct
4951
Возвращаемое значение:
4952
  * eax = -1 для ошибки
3868 mario79 4953
  * ebx = код ошибки
3837 mario79 4954
Замечания:
4955
 
4956
  Optstruct: dd level
4957
             dd optionname
4958
             dd optlength
4959
             db options...
4960
 
6056 IgorA 4961
---------------------- Константы для регистров: ----------------------
4962
  eax - SF_NETWORK_SOCKET (75)
4963
   bl - SSF_SET_OPTIONS (8)
3837 mario79 4964
======================================================================
6235 pathoswith 4965
========== Функция 75, подфункция 9, Получить опции сокета. ==========
3837 mario79 4966
======================================================================
4967
Параметры:
4968
  * eax = 75 - номер функции
4969
  * bl = 9 - номер подфункции
4970
  * ecx = номер сокета
4971
  * edx = указатель на optstruct
4972
Возвращаемое значение:
4973
  * eax = -1 для ошибки
3868 mario79 4974
  * ebx = код ошибки
3837 mario79 4975
Замечания:
4976
 
4977
  Optstruct: dd level
4978
             dd optionname
4979
             dd optlength
4980
             db options...
4981
 
6056 IgorA 4982
---------------------- Константы для регистров: ----------------------
4983
  eax - SF_NETWORK_SOCKET (75)
4984
   bl - SSF_GET_OPTIONS (9)
3837 mario79 4985
======================================================================
6235 pathoswith 4986
========== Функция 75, подфункция 10, Получить парный сокет ==========
3837 mario79 4987
======================================================================
4988
Параметры:
4989
  * eax = 75 - номер функции
4990
  * bl = 10 - номер подфункции
4991
Возвращаемое значение:
6235 pathoswith 4992
  * eax = номер первого сокета / -1 для ошибки
4993
  * ebx = номер второго сокета / код ошибки
3837 mario79 4994
 
6056 IgorA 4995
---------------------- Константы для регистров: ----------------------
4996
  eax - SF_NETWORK_SOCKET (75)
4997
   bl - SSF_GET_PAIR (10)
3837 mario79 4998
======================================================================
6056 IgorA 4999
=============== Функция 76, Сетевые опции и статистика. ==============
5000
======================================================================
5001
Параметры:
5002
  * eax = 76 - номер функции
5003
  * верхняя часть ebx = номер протокола
5004
  * bh = номер устройства
5005
  * bl = номер подфункции
5006
 
6235 pathoswith 5007
Протоколы и подфункции:
5008
 
5009
 
6056 IgorA 5010
 
6235 pathoswith 5011
 
5012
    общие подфункции:
5013
 
5014
        1 - пакетов принято
5015
 
5016
1 - IPv4:
6056 IgorA 5017
        2 - Read IP
5018
        3 - Write IP
5019
        4 - Read DNS
5020
        5 - Write DNS
5021
        6 - Read subnet
5022
        7 - Write subnet
5023
        8 - Read gateway
5024
        9 - Write gateway
6235 pathoswith 5025
 
5026
2 - ICMP:
6056 IgorA 5027
        3 - enable/disable ICMP echo reply
5028
 
6235 pathoswith 5029
3 - UDP
5030
4 - TCP
6056 IgorA 5031
 
6235 pathoswith 5032
5 - ARP:
6056 IgorA 5033
        2 - Read # ARP entry's
5034
        3 - Read ARP entry
5035
        4 - Add static ARP entry
5036
        5 - Remove ARP entry (-1 = remove all)
5037
        6 - Send ARP announce on specified interface
5038
        7 - Read # ARP conflicts (IP address conflicts)
5039
 
5040
---------------------- Константы для регистров: ----------------------
5041
  eax - SF_NETWORK_PROTOCOL (76)
5042
======================================================================
6235 pathoswith 5043
============= Функция 77, подфункция 0, Создать фьютекс. =============
5044
======================================================================
5045
Параметры:
5046
  * eax = 77 - номер функции
5047
  * ebx = 0 - номер подфункции
5048
  * ecx = указатель на контрольное значение фьютекса (dword)
5049
Возвращаемое значение:
5050
  * eax = дескриптор фьютекса, 0 при ошибке
5051
 
5052
---------------------- Константы для регистров: ----------------------
5053
  eax - SF_FUTEX (77)
5054
  ebx - SSF_CREATE (0)
5055
======================================================================
5056
============= Функция 77, подфункция 1, Удалить фьютекс. =============
5057
======================================================================
5058
Параметры:
5059
  * eax = 77 - номер функции
5060
  * ebx = 1 - номер подфункции
5061
  * ecx = дескриптор фьютекса
5062
Возвращаемое значение:
5063
  * eax = 0 - успешно, -1 при ошибке
5064
Замечания:
5065
  * Ядро автоматически удаляет фьютексы при завершении процесса.
5066
 
5067
---------------------- Константы для регистров: ----------------------
5068
  eax - SF_FUTEX (77)
5069
  ebx - SSF_DESTROY (1)
5070
======================================================================
5071
================= Функция 77, подфункция 2, Ожидать. =================
5072
======================================================================
5073
Параметры:
5074
  * eax = 77 - номер функции
5075
  * ebx = 2 - номер подфункции
5076
  * ecx = дескриптор фьютекса
5077
  * edx = контрольное значение
5078
  * esi = таймаут в сотых секунды, 0 - ждать бесконечно
5079
Возвращаемое значение:
5080
  * eax = 0 - успешно, -1 - таймаут,
5081
        -2 - контрольное значение не соответствует
5082
 
5083
---------------------- Константы для регистров: ----------------------
5084
  eax - SF_FUTEX (77)
5085
  ebx - SSF_WAIT (2)
5086
======================================================================
5087
================ Функция 77, подфункция 3, Разбудить. ================
5088
======================================================================
5089
Параметры:
5090
  * eax = 77 - номер функции
5091
  * ebx = 3 - номер подфункции
5092
  * ecx = дескриптор фьютекса
5093
  * edx = сколько ожидающих будить (максимум)
5094
Возвращаемое значение:
5095
  * eax = количество разбуженых
5096
 
5097
---------------------- Константы для регистров: ----------------------
5098
  eax - SF_FUTEX (77)
5099
  ebx - SSF_WAKE (3)
5100
======================================================================
9829 vitalkrilo 5101
======= Функция 77, подфункция 10, Прочитать из файла в буфер. =======
5102
======================================================================
5103
Параметры:
5104
  * eax = 77 - номер функции
5105
  * ebx = 10 - номер подфункции
5106
  * ecx = дескриптор файла
5107
  * edx = указатель на буфер, куда читать
5108
  * esi = сколько байт прочитать
5109
Возвращаемое значение:
5110
  * eax = количество прочитанных байт
5111
 
5112
---------------------- Константы для регистров: ----------------------
5113
  eax - SF_FUTEX (77)
5114
  ebx - ...
5115
======================================================================
5116
======== Функция 77, подфункция 11, Записать из буфера в файл. =======
5117
======================================================================
5118
Параметры:
5119
  * eax = 77 - номер функции
5120
  * ebx = 11 - номер подфункции
5121
  * ecx = дескриптор файла
5122
  * edx =  указатель на буфер, откуда брать данные для записи
5123
  * esi = сколько байт записать
5124
Возвращаемое значение:
5125
  * eax = количество записанных байт
5126
 
5127
---------------------- Константы для регистров: ----------------------
5128
  eax - SF_FUTEX (77)
5129
  ebx - ...
5130
======================================================================
5131
=========== Функция 77, подфункция 13, Создать новый pipe. ===========
5132
======================================================================
5133
Создает новый pipe. В 4 байта по адресу pipefd будет записан
5134
дескриптор для чтения из канала.
5135
В 4 байта по адресу pipefd + 4 будет записан дескриптор для записи в
5136
канал.
5137
Параметры:
5138
  * eax = 77 - номер функции
5139
  * ebx = 13 - номер подфункции
5140
  * ecx = адрес pipefd
5141
  * edx = флаги. На данный момент если поднят O_CLOEXEC (0x40000), то
5142
    сисфункция завершится с ошибкой. Поэтому в качестве флагов можно
5143
    передать просто 0.
5144
Возвращаемое значение:
5145
  * eax = 0 если успех, иначе ошибка.
5146
 
5147
---------------------- Константы для регистров: ----------------------
5148
  eax - SF_FUTEX (77)
5149
  ebx - ...
5150
======================================================================
3539 clevermous 5151
========== Функция -1 - завершить выполнение потока/процесса =========
77 diamond 5152
======================================================================
3539 clevermous 5153
Параметры:
5154
  * eax = -1 - номер функции
5155
Возвращаемое значение:
5156
  * функция не возвращает ни значения, ни управления
5157
Замечания:
5158
  * Если процесс явно не создавал потоков, то у него есть только
5159
    один поток, завершение которого приводит к завершению процесса.
5160
  * Если текущий поток - последний в процессе, то его завершение
5161
    также приводит к завершению процесса.
5162
  * Эта функция завершает текущий поток. Другой поток можно прибить
5163
    вызовом подфункции 2 функции 18.
77 diamond 5164
 
6056 IgorA 5165
---------------------- Константы для регистров: ----------------------
5166
  eax - SF_TERMINATE_PROCESS (-1)
77 diamond 5167
======================================================================
6798 pathoswith 5168
=== Функция 80 - работа с файловой системой с указанием кодировки. ===
5169
======================================================================
5170
Параметры:
5171
  * eax = 80
5172
  * ebx = указатель на информационную структуру
5173
Возвращаемое значение:
5174
  * eax = 0 - успешно; иначе код ошибки файловой системы
5175
  * в зависимости от подфункции может возвращаться значение и
5176
    в других регистрах
5177
Общий формат информационной структуры:
5178
  * +0: dword: номер подфункции
5179
  * +4: dword: смещение в файле или папке
5180
  * +8: dword: старшая часть смещения или поле флагов
5181
  * +12 = +0xC: dword: размер данных
5182
  * +16 = +0x10: dword: указатель на данные
5183
  * +20 = +0x14: dword: кодировка строки:
5184
    1 = cp866
5185
    2 = UTF-16LE
5186
    3 = UTF-8
5187
 
5188
  * +24 = +0x18: dword: указатель на строку пути (заканчивается нулём)
5189
 
5190
В остальном полностью соответствует функции 70.
5191
 
5192
======================================================================
3539 clevermous 5193
=========================== Список событий ===========================
77 diamond 5194
======================================================================
3539 clevermous 5195
Очередное событие можно получить вызовом одной из функций 10
5196
(ожидать события), 11 (проверить без ожидания), 23
5197
(ожидать в течение заданного времени).
5198
Эти функции возвращают только те события, которые входят в маску,
5199
устанавливаемую функцией 40. По умолчанию это первые три, чего
5200
вполне достаточно для многих приложений.
5201
Коды событий:
5202
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
5203
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
5204
    активно) или нажата "горячая клавиша";
5205
    сбрасывается, когда все клавиши из буфера считаны функцией 2
5206
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
5207
    закрытия, созданная неявно функцией 0; кнопка минимизации
5208
    обрабатывается системой и о ней сообщения не приходит;
5209
    поступает, только когда окно активно; сбрасывается, когда все
5210
    кнопки из буфера считаны функцией 17)
5211
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
5212
    при размаскировке функцией 40)
5213
  * 5 = завершилась перерисовка фона рабочего стола
5214
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
5215
    или перемещение; сбрасывается при прочтении)
5216
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
5217
    Communication; сбрасывается при прочтении)
5218
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
5219
    смотри работу с сетью)
5220
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
5221
    смотри отладочную подсистему)
5222
  * 16..31 = произошло событие с соответствующим IRQ
5223
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
77 diamond 5224
 
5225
======================================================================
3539 clevermous 5226
==================== Коды ошибок файловой системы ====================
77 diamond 5227
======================================================================
3539 clevermous 5228
  * 0 = успешно
5229
  * 2 = функция не поддерживается для данной файловой системы
5230
  * 3 = неизвестная файловая система
5231
  * 5 = файл не найден
5232
  * 6 = файл закончился
5233
  * 7 = указатель вне памяти приложения
5234
  * 8 = диск заполнен
6235 pathoswith 5235
  * 9 = ошибка файловой системы
3539 clevermous 5236
  * 10 = доступ запрещён
5237
  * 11 = ошибка устройства
6235 pathoswith 5238
  * 12 = файловой системе недостаточно оперативной памяти
5239
 
3539 clevermous 5240
При запуске программы возможны также следующие коды ошибок:
5241
  * 30 = 0x1E = недостаточно памяти
5242
  * 31 = 0x1F = файл не является исполнимым
5243
  * 32 = 0x20 = слишком много процессов