Subversion Repositories Kolibri OS

Rev

Rev 9976 | Rev 10002 | Go to most recent revision | 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
======================================================================
3539 clevermous 2553
===================== Функция 51 - создать поток. ====================
77 diamond 2554
======================================================================
3539 clevermous 2555
Параметры:
2556
  * eax = 51 - номер функции
2557
  * ebx = 1 - единственная подфункция
2558
  * ecx = адрес точки входа потока (начальный eip)
2559
  * edx = указатель стэка потока (начальный esp)
2560
Возвращаемое значение:
2561
  * eax = -1 - ошибка (в системе слишком много потоков)
2562
  * иначе eax = TID - идентификатор потока
77 diamond 2563
 
6056 IgorA 2564
---------------------- Константы для регистров: ----------------------
2565
  eax - SF_CREATE_THREAD (51)
77 diamond 2566
======================================================================
4199 mario79 2567
====================== Функция 54, подфункция 0 ======================
2568
============== Узнать количество слотов в буфере обмена. =============
2569
======================================================================
2570
Параметры:
2571
  * eax = 54 - номер функции
2572
  * ebx = 0 - номер подфункции
2573
Возвращаемое значение:
6473 pathoswith 2574
  * eax = количество слотов в буфере
4199 mario79 2575
  * eax = -1 - отсутствует область главного списка
2576
 
6056 IgorA 2577
---------------------- Константы для регистров: ----------------------
2578
  eax - SF_CLIPBOARD (54)
2579
  ebx - SSF_GET_SLOT_COUNT (0)
4199 mario79 2580
======================================================================
2581
====================== Функция 54, подфункция 1 ======================
2582
================== Считать данные из буфера обмена. ==================
2583
======================================================================
2584
Параметры:
2585
  * eax = 54 - номер функции
2586
  * ebx = 1 - номер подфункции
2587
  * eсx = номер слота
2588
Возвращаемое значение:
2589
  * eax = если успешно - указатель на область памяти с данными
2590
  * eax = 1 - ошибка
2591
  * eax = -1 - отсутствует область главного списка
6369 IgorA 2592
Замечания:
2593
  * буфер, на который указывает eax, содержит следующую информацию:
2594
    * +0: dword: общая длина данных
2595
    * +4: dword: определяет тип данныx:
2596
      * 0 = Текст
2597
      * 1 = Текст с блочным выделением
2598
      * 2 = Изображение
2599
      * 3 = RAW
2600
      * 4 и выше зарезервировано
2601
    * +8: более детально смотрите файл clipboard_container_rus.txt
6974 0CodErr 2602
  * Функция должна использоваться совместно с 68.11. Приложение должно
2603
    предварительно проинициализировать локальную кучу вызовом 68.11.
2604
 
6056 IgorA 2605
---------------------- Константы для регистров: ----------------------
2606
  eax - SF_CLIPBOARD (54)
2607
  ebx - SSF_READ_CB (1)
4199 mario79 2608
======================================================================
2609
====================== Функция 54, подфункция 2 ======================
2610
================== Записать данные в буфер обмена. ===================
2611
======================================================================
2612
Параметры:
2613
  * eax = 54 - номер функции
2614
  * ebx = 2 - номер подфункции
2615
  * eсx = количество копируемых байт
2616
  * edx = указатель на буфер под копируемые данные
2617
Возвращаемое значение:
2618
  * eax = 0 - успешно
2619
  * eax = 1 - ошибка
2620
  * eax = -1 - отсутствует область главного списка
2621
 
6056 IgorA 2622
---------------------- Константы для регистров: ----------------------
2623
  eax - SF_CLIPBOARD (54)
2624
  ebx - SSF_WRITE_CB (2)
4199 mario79 2625
======================================================================
2626
====================== Функция 54, подфункция 3 ======================
2627
========= Удалить последний слот с данными в буфере обмена ===========
2628
======================================================================
2629
Параметры:
2630
  * eax = 54 - номер функции
2631
  * ebx = 3 - номер подфункции
2632
Возвращаемое значение:
2633
  * eax = 0 - успешно
2634
  * eax = 1 - ошибка
2635
  * eax = -1 - отсутствует область главного списка
2636
 
6056 IgorA 2637
---------------------- Константы для регистров: ----------------------
2638
  eax - SF_CLIPBOARD (54)
2639
  ebx - SSF_DEL_SLOT (3)
4199 mario79 2640
======================================================================
2641
====================== Функция 54, подфункция 4 ======================
2642
=================== Аварийный сброс блокировки буфера ================
2643
======================================================================
2644
Параметры:
2645
  * eax = 54 - номер функции
2646
  * ebx = 4 - номер подфункции
2647
Возвращаемое значение:
2648
  * eax = 0 - успешно
2649
  * eax = -1 - отсутствует область главного списка или нет блокировки
2650
Замечания:
2651
  * Используется в исключительных случаях, когда зависшее или убитое
2652
    приложение заблокировало работу с буфером обмена.
2653
 
6056 IgorA 2654
---------------------- Константы для регистров: ----------------------
2655
  eax - SF_CLIPBOARD (54)
2656
  ebx - SSF_UNLOCK_BUFFER (4)
4199 mario79 2657
======================================================================
3539 clevermous 2658
====================== Функция 55, подфункция 55 =====================
2659
========== Начать проигрывать данные на встроенном спикере. ==========
77 diamond 2660
======================================================================
3539 clevermous 2661
Параметры:
2662
  * eax = 55 - номер функции
2663
  * ebx = 55 - номер подфункции
2664
  * esi = указатель на данные
2665
Возвращаемое значение:
2666
  * eax = 0 - успешно
2667
  * eax = 55 - ошибка (спикер отключён или занят)
2668
Данные - это массив элементов переменной длины.
2669
Формат каждого элемента определяется первым байтом:
2670
  * 0 = конец данных
2671
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2672
    ноты, определяемой непосредственным значением частоты
2673
    * следующее слово (2 байта) содержит делитель частоты;
2674
      частота определяется как 1193180/divider
77 diamond 2675
  * 0x81 = invalid
3539 clevermous 2676
  * 0x82..0xFF = нота, определяемая октавой и номером:
2677
    * длительность в сотых долях секунды = (первый байт)-0x81
2678
    * присутствует ещё один байт;
2679
    * (второй байт)=0xFF - пауза
2680
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2681
      до 12, a=номер октавы (считая с 0)
2682
Замечания:
2683
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2684
    функции 18.
2685
  * Функция возвращает управление, сообщив куда следует информацию
2686
    о запросе. Само проигрывание идёт независимо от программы.
2687
  * Данные должны сохраняться в памяти по крайней мере
2688
    до конца проигрывания.
77 diamond 2689
 
6056 IgorA 2690
---------------------- Константы для регистров: ----------------------
2691
  eax - SF_SPEAKER_PLAY (55)
77 diamond 2692
======================================================================
3539 clevermous 2693
======================= Функция 57 - PCI BIOS. =======================
586 serge 2694
======================================================================
3539 clevermous 2695
Параметры:
2696
  * eax = 57 - номер функции
2697
  * ebp соответствует регистру al в спецификации PCI BIOS
2698
  * остальные регистры - по спецификации PCI BIOS
2699
Возвращаемое значение:
2700
  * CF не определён
2701
  * остальные регистры - по спецификации PCI BIOS
2702
Замечания:
2703
  * Многих результатов этой функции можно также добиться вызовом
2704
    соответствующих подфункций функции 62.
2705
  * Функция вызывает расширение PCI32 BIOS, документированное,
2706
    например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
2707
  * Если BIOS не поддерживает это расширение, поведение функции
2708
    эмулируется (через аналоги подфункций функции 62 режима ядра).
586 serge 2709
 
6056 IgorA 2710
---------------------- Константы для регистров: ----------------------
2711
  eax - SF_PCI_BIOS (57)
586 serge 2712
======================================================================
3539 clevermous 2713
=========== Функция 60 - Inter Process Communication (IPC). ==========
77 diamond 2714
======================================================================
3539 clevermous 2715
IPC применяется для посылок сообщений от одного процесса/потока
2716
другому. При этом следует предварительно договориться о том, как
2717
интерпретировать конкретное сообщение.
77 diamond 2718
 
3539 clevermous 2719
-------- Подфункция 1 - установить область для получения IPC ---------
2720
Вызывается процессом-приёмником.
2721
Параметры:
2722
  * eax = 60 - номер функции
2723
  * ebx = 1 - номер подфункции
2724
  * ecx = указатель на буфер
2725
  * edx = размер буфера
2726
Возвращаемое значение:
2727
  * eax = 0 - всегда успешно
2728
Формат IPC-буфера:
2729
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
2730
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
2731
    и вам надо, чтобы извне не изменялись данные буфера
2732
    (не поступали новые сообщения)
2733
  * +4: dword: занято места в буфере (в байтах)
2734
  * +8: первое сообщение
2735
  * +8+n: второе сообщение
77 diamond 2736
  * ...
3539 clevermous 2737
Формат сообщения:
2738
  * +0: dword: PID процесса/потока, пославшего сообщение
2739
  * +4: dword: длина сообщения (не считая этот заголовок)
2740
  * +8: n*byte: данные сообщения
77 diamond 2741
 
3539 clevermous 2742
--------------- Подфункция 2 - послать сообщение IPC. ----------------
2743
Вызывается процессом-инициатором.
2744
Параметры:
2745
  * eax = 60 - номер функции
2746
  * ebx = 2 - номер подфункции
2747
  * ecx = PID приёмника
2748
  * edx = указатель на данные сообщения
2749
  * esi = длина сообщения (в байтах)
2750
Возвращаемое значение:
2751
  * eax = 0 - успешно
2752
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
2753
    (может быть, ещё не успел, а может быть, это не тот поток,
2754
    который нужен)
2755
  * eax = 2 - приёмник заблокировал IPC-буфер;
2756
    попробуйте немного подождать
2757
  * eax = 3 - переполнение IPC-буфера приёмника
2758
  * eax = 4 - процесса/потока с таким PID не существует
2759
Замечания:
2760
  * Система сразу после записи IPC-сообщения в буфер посылает
2761
    потоку-приёмнику событие с кодом 7 (см. коды событий).
77 diamond 2762
 
6056 IgorA 2763
---------------------- Константы для регистров: ----------------------
2764
  eax - SF_IPC (60)
2765
  ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2)
77 diamond 2766
======================================================================
3539 clevermous 2767
=== Функция 61 - получить параметры для прямого доступа к графике. ===
77 diamond 2768
======================================================================
3539 clevermous 2769
Программе доступны данные графического экрана (область памяти, которая
2770
собственно и отображает содержимое экрана) напрямую без вызовов
2771
системных функций через селектор gs:
1662 Nasarus 2772
	mov	eax, [gs:0]
3539 clevermous 2773
поместит в eax первый dword буфера, содержащий информацию о цвете
2774
левой верхней точки (и, возможно, цвета нескольких следующих).
1662 Nasarus 2775
	mov	[gs:0], eax
3539 clevermous 2776
при работе в режимах VESA c LFB
2777
установит цвет левой верхней точки
2778
(и возможно, цвета нескольких следующих).
2779
Для интерпретации данных графического экрана требуется знание
2780
некоторых параметров, которые возвращаются этой функцией.
2781
Замечания:
7121 dunkaist 2782
  * Параметры графики очень редко меняются при работе системы.
3539 clevermous 2783
  * При изменении видеорежима система перерисовывает все окна
2784
    (событие с кодом 1) и перерисовывает фон (событие 5).
2785
    Эти же события происходят и в других случаях,
2786
    которые встречаются значительно чаще, чем изменение видеорежима.
2787
  * При работе в видеорежимах с LFB селектор gs указывает на
2788
    собственно LFB, так что чтение/запись по gs приводят
2789
    непосредственно к изменению содержимого экрана. При работе в
2790
    видеорежимах без LFB gs указывает на некоторую область данных
2791
    ядра, причём все функции вывода на экран добросовестно выполняют
2792
    двойную работу по записи непосредственно на экран и по записи
2793
    в этот буфер. В результате при чтении содержимого этого буфера
2794
    результаты соответствуют содержимому экрана
2795
    (с, вообще говоря, большим цветовым разрешением),
2796
    а запись игнорируется.
2797
    Исключением является режим 320*200, для которого в главном цикле
2798
    системного потока выполняется обновление экрана в соответствии
2799
    с движениями курсора мыши.
77 diamond 2800
 
3539 clevermous 2801
------------------------- Разрешение экрана --------------------------
2802
Параметры:
2803
  * eax = 61 - номер функции
2804
  * ebx = 1 - номер подфункции
2805
Возвращаемое значение:
2806
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
2807
Замечания:
2808
  * Можно использовать функцию 14 с учётом того, что она возвращает
2809
    размеры на 1 меньше. Это полностью эквивалентный способ.
77 diamond 2810
 
3539 clevermous 2811
------------------------ Число бит на пиксель ------------------------
2812
Параметры:
2813
  * eax = 61 - номер функции
2814
  * ebx = 2 - номер подфункции
2815
Возвращаемое значение:
2816
  * eax = число бит на пиксель (24 или 32)
77 diamond 2817
 
3539 clevermous 2818
------------------------ Число байт на строку ------------------------
2819
Параметры:
2820
  * eax = 61 - номер функции
2821
  * ebx = 3 - номер подфункции
2822
Возвращаемое значение:
2823
  * eax = число байт, которое занимает одна строка развёртки
2824
    (горизонтальная линия на экране)
77 diamond 2825
 
6056 IgorA 2826
---------------------- Константы для регистров: ----------------------
2827
  eax - SF_GET_GRAPHICAL_PARAMS (61)
2828
  ebx - SSF_SCREEN_SIZE (1), SSF_BITS_PER_PIXEL (2),
2829
    SSF_BYTES_PER_LINE (3)
77 diamond 2830
======================================================================
3539 clevermous 2831
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
77 diamond 2832
======================================================================
3539 clevermous 2833
Параметры:
2834
  * eax = 62 - номер функции
2835
  * bl = 0 - номер подфункции
2836
Возвращаемое значение:
2837
  * eax = -1 - доступ к PCI запрещён; иначе
2838
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
2839
  * старшее слово eax обнулено
2840
Замечания:
2841
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2842
    для приложений подфункцией 12 функции 21.
2843
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
77 diamond 2844
 
6056 IgorA 2845
---------------------- Константы для регистров: ----------------------
2846
  eax - SF_PCI (62)
2847
  ebx - SSF_GET_VERSION (0)
77 diamond 2848
======================================================================
3539 clevermous 2849
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
77 diamond 2850
======================================================================
3539 clevermous 2851
Параметры:
2852
  * eax = 62 - номер функции
2853
  * bl = 1 - номер подфункции
2854
Возвращаемое значение:
2855
  * eax = -1 - доступ к PCI запрещён; иначе
2856
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
2857
Замечания:
2858
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2859
    для приложений подфункцией 12 функции 21.
2860
  * Если PCI BIOS не поддерживается, то значение al неопределено.
77 diamond 2861
 
6056 IgorA 2862
---------------------- Константы для регистров: ----------------------
2863
  eax - SF_PCI (62)
2864
  ebx - SSF_GET_LAST_BUS (1)
77 diamond 2865
======================================================================
3539 clevermous 2866
====================== Функция 62, подфункция 2 ======================
2867
== Получить механизм обращения к конфигурационному пространству PCI. =
77 diamond 2868
======================================================================
3539 clevermous 2869
Параметры:
2870
  * eax = 62 - номер функции
2871
  * bl = 2 - номер подфункции
2872
Возвращаемое значение:
2873
  * eax = -1 - доступ к PCI запрещён; иначе
2874
  * al = механизм (1 или 2); прочие байты eax разрушаются
2875
Замечания:
2876
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2877
    для приложений подфункцией 12 функции 21.
2878
  * Механизм обращения выбирается в соответствии
2879
    с характеристиками оборудования.
2880
  * Подфункции чтения и записи автоматически работают
2881
    с выбранным механизмом.
77 diamond 2882
 
6056 IgorA 2883
---------------------- Константы для регистров: ----------------------
2884
  eax - SF_PCI (62)
2885
  ebx - SSF_GET_ADRR_MODE (2)
77 diamond 2886
======================================================================
3539 clevermous 2887
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
77 diamond 2888
======================================================================
3539 clevermous 2889
Параметры:
2890
  * eax = 62 - номер функции
2891
  * bl = 4 - читать байт
2892
  * bl = 5 - читать слово
2893
  * bl = 6 - читать двойное слово
2894
  * bh = номер PCI-шины
2895
  * ch = dddddfff, где ddddd = номер устройства на шине,
2896
    fff = номер функции устройства
2897
  * cl = номер регистра (должен быть чётным для bl=5,
2898
    делиться на 4 для bl=6)
2899
Возвращаемое значение:
2900
  * eax = -1 - ошибка (запрещён доступ к PCI или
2901
    неподдерживаемые параметры); иначе
2902
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
2903
    оставшаяся часть регистра eax разрушается
2904
Замечания:
2905
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2906
    для приложений подфункцией 12 функции 21.
2907
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2908
    игнорирует номер функции. Получить механизм доступа можно вызовом
2909
    подфункции 2.
2910
  * Некоторые регистры стандартны и существуют для всех устройств,
2911
    некоторые определяются конкретным устройством. Список первых
2912
    входит, например, в известный Interrupt List by Ralf Brown
77 diamond 2913
    (http://www.pobox.com/~ralf/files.html,
2914
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
3539 clevermous 2915
    список вторых должен быть указан в документации по устройству.
77 diamond 2916
 
6056 IgorA 2917
---------------------- Константы для регистров: ----------------------
2918
  eax - SF_PCI (62)
2919
  ebx - SSF_READ_BYTE (4), SSF_READ_WORD (5), SSF_READ_DWORD (6)
77 diamond 2920
======================================================================
3539 clevermous 2921
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
77 diamond 2922
======================================================================
3539 clevermous 2923
Параметры:
2924
  * eax = 62 - номер функции
2925
  * bl = 8 - писать байт
2926
  * bl = 9 - писать слово
2927
  * bl = 10 - писать двойное слово
2928
  * bh = номер PCI-шины
2929
  * ch = dddddfff, где ddddd = номер устройства на шине,
2930
    fff = номер функции устройства
2931
  * cl = номер регистра (должен быть чётным для bl=9,
2932
    делиться на 4 для bl=10)
2933
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
2934
    данные для записи
2935
Возвращаемое значение:
2936
  * eax = -1 - ошибка (запрещён доступ к PCI или
2937
    неподдерживаемые параметры)
2938
  * eax = 0 - успешно
2939
Замечания:
2940
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2941
    для приложений подфункцией 12 функции 21.
2942
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2943
    игнорирует номер функции. Получить механизм доступа можно вызовом
2944
    подфункции 2.
2945
  * Некоторые регистры стандартны и существуют для всех устройств,
2946
    некоторые определяются конкретным устройством. Список первых
2947
    входит, например, в известный Interrupt List by Ralf Brown;
2948
    список вторых должен быть указан в документации по устройству.
77 diamond 2949
 
6056 IgorA 2950
---------------------- Константы для регистров: ----------------------
2951
  eax - SF_PCI (62)
2952
  ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10)
77 diamond 2953
======================================================================
3539 clevermous 2954
================ Функция 63 - работа с доской отладки. ===============
77 diamond 2955
======================================================================
3539 clevermous 2956
Доска отладки представляет собой системный буфер (на 4096 байт),
2957
в который любая программа может записать (вообще говоря, произвольные)
2958
данные и из которого другая программа может эти данные прочитать.
2959
Есть соглашение, в соответствии с которым записываемые данные -
2960
текстовые строки, интерпретируемые как отладочные сообщения о ходе
2961
выполнения программы. Ядро в определённых ситуациях также записывает
2962
на доску отладки сведения о выполнении некоторых функций;
2963
по соглашению сообщения ядра начинаются с префикса "K : ".
2964
Для просмотра доски отладки создано приложение board,
2965
которое считывает данные из буфера и отображает их в своём окне. board
2966
понимает последовательность кодов 13,10 как переход на новую строку.
2967
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
2968
В связи с появлением отладчика ценность доски отладки несколько
2969
снизилась, поскольку отладчик позволяет полностью контролировать ход
2970
выполнения программы, причём для этого не требуется никаких усилий
2971
со стороны самой программы. Тем не менее во многих случаях
2972
доска отладки продолжает оставаться полезной.
77 diamond 2973
 
3539 clevermous 2974
---------------------------- Запись байта ----------------------------
2975
Параметры:
2976
  * eax = 63 - номер функции
2977
  * ebx = 1 - номер подфункции
2978
  * cl = байт данных
2979
Возвращаемое значение:
2980
  * функция не возвращает значения
2981
Замечания:
2982
  * Байт записывается в буфер. Длина буфера - 512 байт.
2983
    При переполнении буфера все полученные данные теряются
2984
    и заполнение начинается снова с нуля.
2985
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
2986
    достаточно этой функции, вызываемой в цикле. Можно не писать
2987
    вручную соответствующий код, а воспользоваться файлом debug.inc,
2988
    входящим в дистрибутив.
77 diamond 2989
 
3539 clevermous 2990
---------------------------- Чтение байта ----------------------------
2991
Забирает байт из буфера.
2992
Параметры:
2993
  * eax = 63 - номер функции
2994
  * ebx = 2 - номер подфункции
2995
Возвращаемое значение:
2996
  * eax = ebx = 0 - буфер пуст
2997
  * eax = байт, ebx = 1 - байт успешно прочитан
77 diamond 2998
 
6056 IgorA 2999
---------------------- Константы для регистров: ----------------------
3000
  eax - SF_BOARD (63)
3001
  ebx - SSF_DEBUG_WRITE (1), SSF_DEBUG_READ (2)
77 diamond 3002
======================================================================
3539 clevermous 3003
========== Функция 64 - перераспределить память приложения. ==========
77 diamond 3004
======================================================================
9995 Doczom 3005
 
3006
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
3007
 
3539 clevermous 3008
Параметры:
3009
  * eax = 64 - номер функции
3010
  * ebx = 1 - единственная подфункция
3011
  * ecx = новый размер памяти
3012
Возвращаемое значение:
3013
  * eax = 0 - успешно
3014
  * eax = 1 - недостаточно памяти
3015
Замечания:
3016
  * Есть другой способ выделения/освобождения динамической памяти -
6974 0CodErr 3017
    подфункции 11, 12, 13 функции 68.
3018
  * Функция не может использоваться совместно с 68.11, 68.12, 68.13.
3019
    Вызов функции будет игнорироваться, если приложение создаст
3020
    локальную кучу вызовом 68.11.
77 diamond 3021
 
6056 IgorA 3022
---------------------- Константы для регистров: ----------------------
3023
  eax - SF_MEMORY_RESIZE (64)
77 diamond 3024
======================================================================
3539 clevermous 3025
========= Функция 65 - вывести изображение с палитрой в окно. ========
283 diamond 3026
======================================================================
3539 clevermous 3027
Параметры:
3028
  * eax = 65 - номер функции
3029
  * ebx = указатель на изображение
3030
  * ecx = [размер по оси x]*65536 + [размер по оси y]
3031
  * edx = [координата по оси x]*65536 + [координата по оси y]
3032
  * esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
3033
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
3034
          игнорируется при esi > 8
3035
  * ebp = смещение данных каждой следующей строки изображения
3036
          относительно предыдущей
3037
Возвращаемое значение:
3038
  * функция не возвращает значения
3039
Замечания:
3040
  * Координаты изображения - это координаты верхнего левого угла
3041
    изображения относительно окна.
3042
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
3043
    за исключением, быть может, последних байтов строк, содержит
3044
    информацию о цвете 8 пикселей, старший бит соответствует первому
3045
    пикселю.
3046
  * Формат изображения с 2 битами на пиксель: каждый байт изображения,
3047
    за исключением, быть может, последних байтов строк, содержит
3048
    информацию о цвете 4 пикселей, старшие два бита соответствуют
3049
    первому пикселю.
3050
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
3051
    за исключением последних байтов строк (если ширина изображения
3052
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
3053
    соответствует первому пикселю.
3054
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
3055
    рассматривается как индекс в палитре.
3056
  * Формат изображения с 9 битами на пиксель: каждый байт изображения
3057
    (8 бит) обозначает интенсивность серого для одного пикселя, т.о.
3058
    этот тип изображения идентичен 8 бит на пиксель без палитры.
3059
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
3060
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
3061
    по 5 пикселей на каждый цвет.
3062
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
3063
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
3064
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
3065
    кодируется тремя байтами - последовательно синяя, зелёная, красная
3066
    составляющие цвета.
3067
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
3068
    есть ещё игнорируемый четвёртый байт.
3069
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
314 diamond 3070
    esi=24, ebp=0.
283 diamond 3071
 
6056 IgorA 3072
---------------------- Константы для регистров: ----------------------
3073
  eax - SF_PUT_IMAGE_EXT (65)
283 diamond 3074
======================================================================
3539 clevermous 3075
================= Функция 66 - работа с клавиатурой. =================
77 diamond 3076
======================================================================
3539 clevermous 3077
Режим ввода влияет на результаты чтения клавиш функцией 2.
3078
При загрузке программы для неё устанавливается ASCII-режим ввода.
77 diamond 3079
 
3539 clevermous 3080
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
3081
Параметры:
3082
  * eax = 66 - номер функции
3083
  * ebx = 1 - номер подфункции
3084
  * ecx = режим:
3085
    * 0 = обычный (ASCII-символы)
3086
    * 1 = сканкоды
3087
Возвращаемое значение:
3088
  * функция не возвращает значения
77 diamond 3089
 
3539 clevermous 3090
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
3091
Параметры:
3092
  * eax = 66 - номер функции
3093
  * ebx = 2 - номер подфункции
3094
Возвращаемое значение:
3095
  * eax = текущий режим
77 diamond 3096
 
3539 clevermous 3097
------- Подфункция 3 - получить состояние управляющих клавиш. --------
3098
Параметры:
3099
  * eax = 66 - номер функции
3100
  * ebx = 3 - номер подфункции
3101
Возвращаемое значение:
3102
  * eax = битовая маска:
3103
  * бит 0  (маска 1): левый Shift нажат
3104
  * бит 1  (маска 2): правый Shift нажат
3105
  * бит 2  (маска 4): левый Ctrl нажат
3106
  * бит 3  (маска 8): правый Ctrl нажат
3107
  * бит 4  (маска 0x10): левый Alt нажат
3108
  * бит 5  (маска 0x20): правый Alt нажат
3109
  * бит 6  (маска 0x40): CapsLock включён
3110
  * бит 7  (маска 0x80): NumLock включён
3111
  * бит 8  (маска 0x100): ScrollLock включён
3112
  * бит 9  (маска 0x200): левый Win нажат
3113
  * бит 10 (маска 0x400): правый Win нажат
3114
  * прочие биты сброшены
77 diamond 3115
 
3539 clevermous 3116
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
3117
О нажатии "горячей клавиши" извещаются только приложения,
3118
установившие её; активное приложение (к которому поступает
3119
весь нормальный ввод) таких клавиш не получает.
3120
Извещение заключается в посылке события с кодом 2.
3121
Прочитать "горячую клавишу" можно так же, как и обычную, -
3122
функцией 2.
3123
Параметры:
3124
  * eax = 66 - номер функции
3125
  * ebx = 4 - номер подфункции
3126
  * cl задаёт сканкод клавиши;
3127
    используйте cl=0 для задания комбинаций типа Ctrl+Shift
3128
  * edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
3129
    * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
3130
      * 0 = ни одна из клавиш не должна быть нажата;
3131
      * 1 = ровно одна из клавиш должна быть нажата;
3132
      * 2 = обе клавиши должны быть нажаты;
3133
      * 3 = должна быть нажата LShift, но не RShift;
3134
      * 4 = должна быть нажата RShift, но не LShift
3135
    * Y - аналогично для LCtrl и RCtrl;
3136
    * X - аналогично для LAlt и RAlt
3137
Возвращаемое значение:
3138
  * eax=0 - успешно
3139
  * eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
3140
Замечания:
3141
  * Горячая клавиша может срабатывать либо при нажатии,
3142
    либо при отпускании. Сканкод отпускания клавиши на 128 больше,
3143
    чем сканкод нажатия (т.е. установлен старший бит).
3144
  * Несколько приложений могут установить одну и ту же комбинацию;
3145
    о нажатии такой комбинации будут извещаться все такие приложения.
92 diamond 3146
 
3539 clevermous 3147
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
3148
Параметры:
3149
  * eax = 66 - номер функции
3150
  * ebx = 5 - номер подфункции
3151
  * cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
3152
Возвращаемое значение:
3153
  * eax = 0 - успешно
3154
  * eax = 1 - нет такой горячей клавиши
3155
Замечания:
3156
  * При завершении процесса/потока удаляются все установленные им
3157
    горячие клавиши.
3158
  * Вызов функции не влияет на другие приложения.
3159
    Если другое приложение определило эту же комбинацию,
3160
    оно по-прежнему будет получать уведомления.
92 diamond 3161
 
3539 clevermous 3162
------------- Подфункция 6 - заблокировать обычный ввод. -------------
3163
Параметры:
3164
  * eax = 66 - номер функции
3165
  * ebx = 6 - номер подфункции
3166
Возвращаемое значение:
3167
  * функция не возвращает значения
3168
Замечания:
3169
  * Блокируется обычный ввод данных с клавиатуры для установленных
3170
    "горячих" клавиш
3171
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2709 mario79 3172
 
3539 clevermous 3173
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
3174
Параметры:
3175
  * eax = 66 - номер функции
3176
  * ebx = 7 - номер подфункции
3177
Возвращаемое значение:
3178
  * функция не возвращает значения
3179
Замечания:
3180
  * Разблокирование результатов ф. 66.6
3181
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2709 mario79 3182
 
6056 IgorA 3183
---------------------- Константы для регистров: ----------------------
3184
  eax - SF_KEYBOARD (66)
3185
  ebx - SSF_SET_INPUT_MODE (1), SSF_GET_INPUT_MODE (2),
3186
    SSF_GET_CONTROL_KEYS (3), SSF_SET_SYS_HOTKEY (4),
3187
    SSF_DEL_SYS_HOTKEY (5),  SSF_LOCK_INPUT (6), SSF_UNLOCK_INPUT (7)
77 diamond 3188
======================================================================
3539 clevermous 3189
============ Функция 67 - изменить положение/размеры окна. ===========
77 diamond 3190
======================================================================
3539 clevermous 3191
Параметры:
3192
  * eax = 67 - номер функции
3193
  * ebx = новая x-координата окна
3194
  * ecx = новая y-координата окна
3195
  * edx = новый x-размер окна
3196
  * esi = новый y-размер окна
3197
Возвращаемое значение:
3198
  * функция не возвращает значения
3199
Замечания:
3200
  * Значение -1 для параметра означает "не изменять"; например, для
3201
    перемещения окна без изменения размеров можно указать edx=esi=-1.
3202
  * Предварительно окно должно быть определено функцией 0.
3203
    Она же задаёт начальные координаты и размеры окна.
3204
  * Размеры окна понимаются в смысле функции 0, т.е.
3205
    на один пиксель меньше, чем реальные размеры.
3206
  * Вызов функции для максимизированных окон просто игнорируется.
3207
  * Для окон соответствующих стилей положение и/или размеры могут быть
3208
    изменены пользователем; текущие положение и размеры могут быть
3209
    получены вызовом функции 9.
3210
  * Функция посылает окну событие перерисовки (с кодом 1).
77 diamond 3211
 
6056 IgorA 3212
---------------------- Константы для регистров: ----------------------
3213
  eax - SF_CHANGE_WINDOW (67)
77 diamond 3214
======================================================================
3539 clevermous 3215
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
77 diamond 3216
======================================================================
3539 clevermous 3217
Параметры:
3218
  * eax = 68 - номер функции
3219
  * ebx = 0 - номер подфункции
3220
Возвращаемое значение:
3221
  * eax = число переключений задач с момента загрузки системы
3222
    (по модулю 2^32)
77 diamond 3223
 
6056 IgorA 3224
---------------------- Константы для регистров: ----------------------
3225
  eax - SF_SYS_MISC (68)
3226
  ebx - SSF_GET_TASK_SWITCH_COUNT (0)
77 diamond 3227
======================================================================
3539 clevermous 3228
====================== Функция 68, подфункция 1 ======================
3229
============ Переключиться на следующий поток выполнения. ============
77 diamond 3230
======================================================================
3539 clevermous 3231
Функция завершает текущий квант времени, выделенный потоку,
3232
и переключается на следующий.
3233
(Какой поток какого процесса будет следующим, предсказать нельзя).
3234
Позднее, когда до текущего потока дойдёт очередь,
3235
выполнение возобновится.
3236
Параметры:
3237
  * eax = 68 - номер функции
3238
  * ebx = 1 - номер подфункции
3239
Возвращаемое значение:
3240
  * функция не возвращает значения
77 diamond 3241
 
6056 IgorA 3242
---------------------- Константы для регистров: ----------------------
3243
  eax - SF_SYS_MISC (68)
3244
  ebx - SSF_SWITCH_TASK (1)
77 diamond 3245
======================================================================
3539 clevermous 3246
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
77 diamond 3247
======================================================================
3539 clevermous 3248
Параметры:
3249
  * eax = 68 - номер функции
3250
  * ebx = 2 - номер подфункции
3251
  * ecx = требуемое действие:
3252
    * ecx = 0 - разрешить выполнение инструкции rdpmc
77 diamond 3253
      (ReaD Performance-Monitoring Counters)
3539 clevermous 3254
    * ecx = 1 - узнать, включён/выключен кэш
3255
    * ecx = 2 - включить кэш
3256
    * ecx = 3 - выключить кэш
3257
Возвращаемое значение:
3258
  * для ecx=0:
3259
    * eax = значение cr4
3260
  * для ecx=1:
77 diamond 3261
    * eax = (cr0 and 0x60000000):
3539 clevermous 3262
    * eax = 0 - кэш включён
3263
    * eax <> 0 - кэш выключен
3264
  * для ecx=2 и ecx=3:
3265
    * функция не возвращает значения
77 diamond 3266
 
6056 IgorA 3267
---------------------- Константы для регистров: ----------------------
3268
  eax - SF_SYS_MISC (68)
3269
  ebx - SSF_PERFORMANCE (2)
3270
  ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1),
3271
    SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3)
77 diamond 3272
======================================================================
3539 clevermous 3273
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
77 diamond 3274
======================================================================
3539 clevermous 3275
MSR = Model Specific Register; полный список MSR-регистров процессора
3276
содержится в документации по процессору (например, IA-32 Intel
77 diamond 3277
Architecture Software Developer's Manual, Volume 3, Appendix B);
3539 clevermous 3278
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3279
Параметры:
3280
  * eax = 68 - номер функции
3281
  * ebx = 3 - номер подфункции
3282
  * ecx игнорируется
3283
  * edx = адрес MSR
3284
Возвращаемое значение:
3285
  * ebx:eax = старший:младший dword результата
3286
Замечания:
3287
  * Указание в ecx несуществующего или нереализованного для данного
3288
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3289
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3290
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3291
    которое всё равно прибьёт поток.
77 diamond 3292
 
6056 IgorA 3293
---------------------- Константы для регистров: ----------------------
3294
  eax - SF_SYS_MISC (68)
3295
  ebx - SSF_READ_MSR (3)
77 diamond 3296
======================================================================
3539 clevermous 3297
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
77 diamond 3298
======================================================================
3539 clevermous 3299
MSR = Model Specific Register; полный список MSR-регистров процессора
3300
содержится в документации по процессору (например, IA-32 Intel
77 diamond 3301
Architecture Software Developer's Manual, Volume 3, Appendix B);
3539 clevermous 3302
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3303
Параметры:
3304
  * eax = 68 - номер функции
3305
  * ebx = 4 - номер подфункции
3306
  * ecx игнорируется
3307
  * edx = адрес MSR
3308
  * esi:edi = старший:младший dword
3309
Возвращаемое значение:
3310
  * функция не возвращает значения
3311
Замечания:
3312
  * Указание в ecx несуществующего или нереализованного для данного
3313
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3314
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3315
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3316
    которое всё равно прибьёт поток.
77 diamond 3317
 
6056 IgorA 3318
---------------------- Константы для регистров: ----------------------
3319
  eax - SF_SYS_MISC (68)
3320
  ebx - SSF_WRITE_MSR (4)
77 diamond 3321
======================================================================
6974 0CodErr 3322
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
77 diamond 3323
======================================================================
3539 clevermous 3324
Параметры:
3325
  * eax = 68 - номер функции
3326
  * ebx = 11 - номер подфункции
3327
Возвращаемое значение:
3328
  * eax = 0 - неуспех
3329
  * иначе размер созданной кучи
3330
Замечания:
3331
  * Вызов функции инициализирует кучу, из которой впоследствии можно
6893 pathoswith 3332
    выделять и освобождать блоки памяти подфункциями 12, 13 и 20.
3333
  * Если куча уже создана, функция вернёт размер существующей кучи.
3539 clevermous 3334
    Размер кучи равен размеру всей свободной памяти приложения.
3335
  * После создания кучи вызовы функции 64 игнорируются.
77 diamond 3336
 
6056 IgorA 3337
---------------------- Константы для регистров: ----------------------
3338
  eax - SF_SYS_MISC (68)
3339
  ebx - SSF_HEAP_INIT (11)
77 diamond 3340
======================================================================
3539 clevermous 3341
========== Функция 68, подфункция 12 - выделить блок памяти. =========
77 diamond 3342
======================================================================
3539 clevermous 3343
Параметры:
3344
  * eax = 68 - номер функции
3345
  * ebx = 12 - номер подфункции
3346
  * ecx = требуемый размер в байтах
3347
Возвращаемое значение:
3348
  * eax = указатель на выделенный блок
3349
Замечания:
3350
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3351
    размер выделенного блока больше или равен запрошенному.
77 diamond 3352
 
6056 IgorA 3353
---------------------- Константы для регистров: ----------------------
3354
  eax - SF_SYS_MISC (68)
3355
  ebx - SSF_MEM_ALLOC (12)
77 diamond 3356
======================================================================
3539 clevermous 3357
========= Функция 68, подфункция 13 - освободить блок памяти. ========
77 diamond 3358
======================================================================
3539 clevermous 3359
Параметры:
3360
  * eax = 68 - номер функции
3361
  * ebx = 13 - номер подфункции
3362
  * ecx = указатель на блок памяти
3363
Возвращаемое значение:
3364
  * eax = 1 - успешно
3365
  * eax = 0 - неудача
3366
Замечания:
3367
  * Блок памяти должен быть ранее выделен подфункцией 12
3368
    или подфункцией 20.
77 diamond 3369
 
6056 IgorA 3370
---------------------- Константы для регистров: ----------------------
3371
  eax - SF_SYS_MISC (68)
3372
  ebx - SSF_MEM_FREE (13)
77 diamond 3373
======================================================================
3539 clevermous 3374
====================== Функция 68, подфункция 14 =====================
3375
====== Ожидать получения сигнала от других приложений/драйверов. =====
77 diamond 3376
======================================================================
3539 clevermous 3377
Параметры:
3378
  * eax = 68 - номер функции
3379
  * ebx = 14 - номер подфункции
3380
  * ecx = указатель на буфер для информации (24 байта)
3381
Возвращаемое значение:
3382
  * eax разрушается
3383
  * буфер, на который указывает ecx, содержит следующую информацию:
3384
    * +0: dword: идентификатор последующих данных сигнала
3385
    * +4: данные принятого сигнала (20 байт), формат которых
3386
          определяется первым dword-ом
77 diamond 3387
 
6056 IgorA 3388
---------------------- Константы для регистров: ----------------------
3389
  eax - SF_SYS_MISC (68)
3390
  ebx - SSF_WAIT_SIGNAL (14)
77 diamond 3391
======================================================================
3539 clevermous 3392
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
172 serge 3393
======================================================================
3539 clevermous 3394
Параметры:
3395
  * eax = 68 - номер функции
3396
  * ebx = 16 - номер подфункции
3397
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3398
Возвращаемое значение:
3399
  * eax = 0 - неудача
3400
  * иначе eax = хэндл драйвера
3401
Замечания:
3402
  * Если драйвер ещё не загружен, он загружается;
3403
    если драйвер уже загружен, ничего не меняется.
3404
  * Имя драйвера чувствительно к регистру символов.
3405
    Максимальная длина имени - 16 символов, включая завершающий
3406
    нулевой символ, остальные символы игнорируются.
9756 vitalkrilo 3407
  * Драйвер с именем ABC загружается из файла /sys/drivers/ABC.sys.
172 serge 3408
 
6056 IgorA 3409
---------------------- Константы для регистров: ----------------------
3410
  eax - SF_SYS_MISC (68)
3411
  ebx - SSF_LOAD_DRIVER (16)
172 serge 3412
======================================================================
3539 clevermous 3413
========== Функция 68, подфункция 17 - управление драйвером. =========
172 serge 3414
======================================================================
3539 clevermous 3415
Параметры:
3416
  * eax = 68 - номер функции
3417
  * ebx = 17 - номер подфункции
3418
  * ecx = указатель на управляющую структуру:
3419
    * +0: dword: хэндл драйвера
3420
    * +4: dword: код функции драйвера
3421
    * +8: dword: указатель на входные данные
3422
    * +12 = +0xC: dword: размер входных данных
3423
    * +16 = +0x10: dword: указатель на выходные данные
3424
    * +20 = +0x14: dword: размер выходных данных
3425
Возвращаемое значение:
3426
  * eax = определяется драйвером
3427
Замечания:
3428
  * Коды функций и структура входных/выходных данных
3429
    определяются драйвером.
3430
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
172 serge 3431
 
6056 IgorA 3432
---------------------- Константы для регистров: ----------------------
3433
  eax - SF_SYS_MISC (68)
3434
  ebx - SSF_CONTROL_DRIVER (17)
172 serge 3435
======================================================================
6798 pathoswith 3436
== Функция 68, подфункция 18 - загрузить DLL с указанием кодировки. ==
277 diamond 3437
======================================================================
3539 clevermous 3438
Параметры:
3439
  * eax = 68 - номер функции
6798 pathoswith 3440
  * ebx = 18 - номер подфункции
3441
  * ecx = указатель на строку с путём к DLL
3442
  * edx = кодировка строки, подробности указаны в описании функции 80.
3539 clevermous 3443
Возвращаемое значение:
3444
  * eax = 0 - неудача
3445
  * иначе eax = указатель на таблицу экспорта DLL
3446
Замечания:
3447
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
3448
    заканчивающийся нулём. Первый dword в структуре является
3449
    указателем на имя функции, второй содержит адрес функции.
277 diamond 3450
 
6798 pathoswith 3451
======================================================================
3452
============= Функция 68, подфункция 19 - загрузить DLL. =============
3453
======================================================================
3454
Параметры:
3455
  * eax = 68 - номер функции
3456
  * ebx = 19 - номер подфункции
3457
  * ecx = указатель на строку с путём к DLL,
3458
    правила формирования строки указаны в описании функции 70.
3459
Возвращаемое значение:
3460
  * eax = 0 - неудача
3461
  * иначе eax = указатель на таблицу экспорта DLL
3462
 
6056 IgorA 3463
---------------------- Константы для регистров: ----------------------
3464
  eax - SF_SYS_MISC (68)
3465
  ebx - SSF_LOAD_DLL (19)
277 diamond 3466
======================================================================
3539 clevermous 3467
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
448 diamond 3468
======================================================================
3539 clevermous 3469
Параметры:
3470
  * eax = 68 - номер функции
3471
  * ebx = 20 - номер подфункции
3472
  * ecx = новый размер в байтах
3473
  * edx = указатель на уже выделенный блок памяти
3474
Возвращаемое значение:
3475
  * eax = указатель на перераспределённый блок, 0 при ошибке
3476
Замечания:
6974 0CodErr 3477
  * Предварительно следует инициализировать кучу процесса вызовом
3478
    подфункции 11.
3539 clevermous 3479
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3480
    размер выделенного блока больше или равен запрошенному.
3481
  * Если edx=0, то вызов функции эквивалентен выделению памяти
3482
    подфункцией 12. В противном случае блок памяти по адресу edx
3483
    должен быть ранее выделен подфункцией 12 или
3484
    описываемой подфункцией.
3485
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
3486
    возвращает 0.
3487
  * Содержимое памяти вплоть до наименьшего из старого и нового
3488
    размеров сохраняется.
448 diamond 3489
 
6056 IgorA 3490
---------------------- Константы для регистров: ----------------------
3491
  eax - SF_SYS_MISC (68)
3492
  ebx - SSF_MEM_REALLOC (20)
1018 diamond 3493
======================================================================
3539 clevermous 3494
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
2646 mario79 3495
======================================================================
3539 clevermous 3496
Параметры:
3497
  * eax = 68 - номер функции
3498
  * ebx = 21 - номер подфункции
3499
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3500
  * edx = указатель на командную строку
3501
Возвращаемое значение:
3502
  * eax = 0 - неудача
3503
  * иначе eax = хэндл драйвера
3504
Замечания:
3505
  * Если драйвер ещё не загружен, он загружается;
3506
    если драйвер уже загружен, ничего не меняется.
2646 mario79 3507
 
6056 IgorA 3508
---------------------- Константы для регистров: ----------------------
3509
  eax - SF_SYS_MISC (68)
3510
  ebx - SSF_LOAD_DRIVER_PE (21)
2646 mario79 3511
======================================================================
3539 clevermous 3512
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
1018 diamond 3513
======================================================================
3539 clevermous 3514
Параметры:
3515
  * eax = 68 - номер функции
3516
  * ebx = 22 - номер подфункции
3517
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3518
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
3519
  * esi = флаги открытия и доступа:
3520
    * SHM_OPEN        = 0x00 - открыть существующую область памяти.
3521
                          Если область с таким именем не существует,
3522
                          функция вернёт код ошибки 5.
3523
    * SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
3524
                          область памяти.
3525
    * SHM_CREATE      = 0x08 - создать новую область памяти.
3526
                          Если область с таким именем уже существует,
3527
                          функция вернёт код ошибки 10.
3528
    * SHM_READ        = 0x00 - доступ только на чтение
3529
    * SHM_WRITE       = 0x01 - доступ на чтение и запись
3530
Возвращаемое значение:
3531
  * eax = указатель на область памяти, 0 при ошибке
3532
  * при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
3533
    edx = 0 - успех, иначе - код ошибки
3534
  * при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
3535
    edx = код ошибки (при eax=0) или размер области в байтах
3536
Коды ошибок:
1018 diamond 3537
  * E_NOTFOUND = 5
3538
  * E_ACCESS = 10
3539
  * E_NOMEM = 30
3540
  * E_PARAM = 33
3539 clevermous 3541
Замечания:
6974 0CodErr 3542
  * Предварительно следует инициализировать кучу процесса вызовом
3543
    подфункции 11.
3539 clevermous 3544
  * Если создаётся новая область, то флаги доступа устанавливают
3545
    максимальные права доступа для остальных процессов. Попытка
3546
    открытия другим потоком с неразрешёнными правами провалится
3547
    с кодом ошибки E_ACCESS.
3548
  * Процесс, создавший область, всегда имеет доступ на запись.
945 serge 3549
 
6056 IgorA 3550
---------------------- Константы для регистров: ----------------------
3551
  eax - SF_SYS_MISC (68)
3552
  ebx - SSF_MEM_OPEN (22)
1018 diamond 3553
======================================================================
3539 clevermous 3554
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
1018 diamond 3555
======================================================================
3539 clevermous 3556
Параметры:
3557
  * eax = 68 - номер функции
3558
  * ebx = 23 - номер подфункции
3559
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3560
Возвращаемое значение:
3561
  * eax разрушается
3562
Замечания:
3563
  * Область памяти физически освобождается (с забыванием всех данных
3564
    и высвобождением физической памяти), когда её закроют
3565
    все открывшие потоки.
3566
  * При завершении потока освобождаются все открытые им
3567
    области памяти.
945 serge 3568
 
6056 IgorA 3569
---------------------- Константы для регистров: ----------------------
3570
  eax - SF_SYS_MISC (68)
3571
  ebx - SSF_MEM_CLOSE (23)
448 diamond 3572
======================================================================
3539 clevermous 3573
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
1077 Galkov 3574
======================================================================
3539 clevermous 3575
Параметры:
3576
  * eax = 68 - номер функции
3577
  * ebx = 24 - номер подфункции
3578
  * ecx = адрес нового обработчика исключений
3579
  * edx = маска обрабатываемых исключений
3580
Возвращаемое значение:
3581
  * eax = адрес старого обработчика исключений (0, если не установлен)
3582
  * ebx = маска старого обработчика исключений
3583
Замечания:
3584
  * Номер бита в маске исключений соответствует номеру исключения по
3585
    спецификации на процессор (Intel-PC). Так, например, исключения
3586
    FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
3587
  * В данной реализации игнорируется запрос на перехват исключения 7
3588
    - система обрабатывает #NM самостоятельно.
3589
  * Пользовательский обработчик получает номер исключения параметром
3590
    в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
3591
    при этом производится на команду, вызвавшую исключение.
3592
  * При передаче управления обработчику исключений сбрасывается
3593
    соответствующий бит в маске исключений. Возникновение этого же
3594
    исключения впоследствии приведёт к умолчальной обработке такового.
3595
    А именно: к завершению работы приложения в отсутствии отладчика,
3596
    приостановка с уведомлением отлаживающего приложения иначе.
3597
  * После завершения критических действий в обработчике пользователя
3598
    восстановление бита маски данного исключения можно сделать
9976 Jurgen 3599
    подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
3600
 
3601
Внимание:
3602
	Если пользовательский обработчик обрабатывает исключение 		переполнения стека (#SS), то должен быть установлен адрес резервного стека в заголовке программы (см. структуру APP_HEADER_01_  taskman.inc).
3603
	В этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK  sys32.inc).
3604
	Пользовательский бработчик,при завершении обработки этого исключения, должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
3605
 
1077 Galkov 3606
 
6056 IgorA 3607
---------------------- Константы для регистров: ----------------------
3608
  eax - SF_SYS_MISC (68)
3609
  ebx - SSF_SET_EXCEPTION_HANDLER (24)
1077 Galkov 3610
======================================================================
3539 clevermous 3611
= Функция 68, подфункция 25 - изменить состояние активности сигнала. =
1077 Galkov 3612
======================================================================
3539 clevermous 3613
Параметры:
3614
  * eax = 68 - номер функции
3615
  * ebx = 25 - номер подфункции
3616
  * ecx = номер сигнала
3617
  * edx = значение устанавливаемой активности (0/1)
3618
Возвращаемое значение:
3619
  * eax = -1 - задан неверный номер сигнала
3620
  * иначе eax = старое значение активности сигнала (0/1)
3621
Замечания:
3622
  * В текущей реализации изменяется только маска пользовательского
3623
    обработчика исключений, установленного подфункцией 24. При этом
3624
    номер сигнала соответствует номеру исключения.
1077 Galkov 3625
 
6056 IgorA 3626
---------------------- Константы для регистров: ----------------------
3627
  eax - SF_SYS_MISC (68)
3628
  ebx - SSF_SET_EXCEPTION_STATE (25)
1077 Galkov 3629
======================================================================
6798 pathoswith 3630
======= Функция 68, подфункция 26 - освободить страницы памяти =======
4193 lev 3631
======================================================================
3632
Параметры:
3633
  * eax = 68 - номер функции
3634
  * ebx = 26 - номер подфункции
3635
  * ecx = указатель на блок памяти выделенный подфункцией 12
3636
  * edx = смещение от начала блока
3637
  * esi = размер высвобождаемого блока памяти, в байтах
3638
Примечания:
3639
  * функция освобождает страницы с ecx+edx по ecx+edx+esi
3640
    и устанавливает виртуальную память в зарезервированное состояние.
3641
 
6056 IgorA 3642
---------------------- Константы для регистров: ----------------------
3643
  eax - SF_SYS_MISC (68)
3644
  ebx - SSF_MEM_FREE_EXT (26)
4193 lev 3645
======================================================================
6798 pathoswith 3646
============= Функция 68, подфункция 27 - загрузить файл =============
4193 lev 3647
======================================================================
3648
Параметры:
3649
  * eax = 68 - номер функции
3650
  * ebx = 27 - номер подфункции
6511 pathoswith 3651
  * ecx = указатель на строку с путём к файлу,
3652
    правила формирования строки указаны в описании функции 70.
4193 lev 3653
Возвращаемое значение:
3654
  * eax = указатель на загруженный файл или 0
3655
  * edx = размер загруженного файла или 0
3656
Примечания:
3657
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
6974 0CodErr 3658
  * Предварительно следует инициализировать кучу процесса вызовом
3659
    подфункции 11.
4193 lev 3660
 
6056 IgorA 3661
---------------------- Константы для регистров: ----------------------
3662
  eax - SF_SYS_MISC (68)
3663
  ebx - SSF_LOAD_FILE (27)
4193 lev 3664
======================================================================
6798 pathoswith 3665
== Функция 68, подфункция 28 - загрузить файл с указанием кодировки ==
3666
======================================================================
3667
Параметры:
3668
  * eax = 68 - номер функции
3669
  * ebx = 28 - номер подфункции
3670
  * ecx = указатель на строку с путём к файлу
3671
  * edx = кодировка строки, подробности указаны в описании функции 80.
3672
Возвращаемое значение:
3673
  * eax = указатель на загруженный файл или 0
3674
  * edx = размер загруженного файла или 0
3675
Примечания:
3676
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
3677
 
3678
======================================================================
9779 Doczom 3679
======== Функция 68, подфункция 29 - allocate ring memory. =========
3680
======================================================================
3681
Parameters:
3682
  * eax = 68 - function number
3683
  * ebx = 29 - subfunction number
3684
  * ecx = required size in bytes
3685
Returned value:
3686
  * eax = 0 - failed
3687
  * eax = pointer to the allocated ring
3688
Remarks:
3689
  * The requested size must be an exact multiple of pagesize (4 Kb)
3690
  * The function allocates memory in such a way that you can read and
3691
    write beyond the size of the allocated memory and will reach the
3692
    beginning of the buffer again.
3693
 
3694
 
3695
======================================================================
3696
======== Функция 68, подфункция 31 - получить данные драйвера. =======
3697
======================================================================
3698
Параметры:
3699
  * eax = 68 - номер функции
3700
  * ebx = 31 - номер подфункции
3701
  * ecx = функция (1 - получить начальные значения списка,
3702
                   2 - получить элемент списка)
3703
  * edx = Если ecx=2 указатель на структуру.
3704
  * edi = Если ecx=2 указатель на память под структуру
3705
Возвращаемое значение:
3706
  * Если ecx = 1, то ebx = fd
3707
                     ecx = bk
3708
  * Если ecx = 2, то eax = 0  операция прошла успешно
3709
                     eax = -1 ошибка
3710
Примечания:
3711
  * возвращаемая структура
3712
   data_service:
3713
     .name:         rb 16
3714
     .fd:           rd 1
3715
     .bk:           rd 1
3716
     .base:         rd 1
3717
     .entry:        rd 1
3718
     .srv_proc:     rd 1
3719
 
3720
======================================================================
3539 clevermous 3721
======================== Функция 69 - отладка. =======================
77 diamond 3722
======================================================================
3539 clevermous 3723
Процесс может загрузить другой процесс как отлаживаемый установкой
3724
соответствующего бита при вызове подфункции 7 функции 70.
3725
У процесса может быть только один отладчик; один процесс может
3726
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3727
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3728
определённый подфункцией 0.
3729
Формат сообщения:
3730
  * +0: dword: код сообщения
3731
  * +4: dword: PID отлаживаемого процесса
3732
  * +8: могут присутствовать дополнительные данные,
3733
    определяемые кодом сообщения
3734
Коды сообщений:
3735
  * 1 = исключение
3736
    * дополнительно передаётся dword-номер исключения
3737
    * процесс приостановлен
3738
  * 2 = процесс завершился
3739
    * приходит при любом завершении: как через системную функцию -1,
3740
      так и при "убийстве" любым другим процессом
3741
      (в том числе самим отладчиком)
3742
  * 3 = отладочное исключение int 1 = #DB
3743
    * дополнительно передаётся dword-образ регистра DR6:
3744
      * биты 0-3: выполнено условие соответствующей точки останова
3745
        (установленной подфункцией 9)
3746
      * бит 14: исключение произошло из-за режима
3747
        пошаговой трассировки (установлен флаг TF)
3748
    * процесс приостановлен
3749
При завершении отладчика прибиваются все отлаживаемые процессы.
3750
Если отладчик этого не хочет, он должен предварительно отключиться
3751
подфункцией 3.
77 diamond 3752
 
3539 clevermous 3753
Все подфункции применимы только к процессам/потокам, запущенным
3754
из текущего функцией 70 с установленным флагом отладки.
3755
Отладка многопоточных программ пока не поддерживается.
3756
Полный список подфункций:
3757
  * подфункция 0 - определить область данных для отладочных сообщений
3758
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3759
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3760
  * подфункция 3 - отключиться от отлаживаемого процесса
3761
  * подфункция 4 - приостановить отлаживаемый поток
3762
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3763
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3764
  * подфункция 7 - записать в память отлаживаемого процесса
3765
  * подфункция 8 - завершить отлаживаемый поток
3766
  * подфункция 9 - установить/снять аппаратную точку останова
77 diamond 3767
 
6056 IgorA 3768
---------------------- Константы для регистров: ----------------------
3769
  eax - SF_DEBUG (69)
3770
  ebx - SSF_SET_MESSAGE_AREA (0), SSF_GET_REGISTERS (1),
3771
    SSF_SET_REGISTERS (2), SSF_DETACH (3), SSF_SUSPEND (4),
3772
    SSF_RESUME (5), SSF_READ_MEMORY (6), SSF_WRITE_MEMORY (7),
3773
    SSF_TERMINATE (8), SSF_DEFINE_BREAKPOINT (9)
77 diamond 3774
======================================================================
3539 clevermous 3775
====================== Функция 69, подфункция 0 ======================
3776
========= Определить область данных для отладочных сообщений. ========
77 diamond 3777
======================================================================
3539 clevermous 3778
Параметры:
3779
  * eax = 69 - номер функции
3780
  * ebx = 0 - номер подфункции
3781
  * ecx = указатель
3782
Формат области данных:
3783
  * +0: dword: N = размер буфера (не считая этого заголовка)
3784
  * +4: dword: занято в буфере
3785
  * +8: N*byte: буфер
3786
Возвращаемое значение:
3787
  * функция не возвращает значения
3788
Замечания:
3789
  * Если поле размера отрицательно, буфер считается заблокированным
3790
    и при поступлении нового сообщения система будет ждать.
3791
    Для синхронизации обрамляйте всю работу с буфером операциями
3792
    блокировки/разблокировки
1662 Nasarus 3793
    	neg	[bufsize]
3539 clevermous 3794
  * Данные в буфере трактуются как массив элементов переменной длины -
3795
    сообщений. Формат сообщения указан в общем описании.
77 diamond 3796
 
6056 IgorA 3797
---------------------- Константы для регистров: ----------------------
3798
  eax - SF_DEBUG (69)
3799
  ebx - SSF_SET_MESSAGE_AREA (0)
77 diamond 3800
======================================================================
3539 clevermous 3801
====================== Функция 69, подфункция 1 ======================
3802
========= Получить состояние регистров отлаживаемого потока. =========
77 diamond 3803
======================================================================
3539 clevermous 3804
Параметры:
3805
  * eax = 69 - номер функции
3806
  * ebx = 1 - номер подфункции
3807
  * ecx = идентификатор потока
3808
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3809
  * esi = указатель на структуру контекста
3810
Возвращаемое значение:
3811
  * функция не возвращает значения
3812
Формат структуры контекста: (FPU пока не поддерживается)
77 diamond 3813
  * +0: dword: eip
3814
  * +4: dword: eflags
3815
  * +8: dword: eax
3816
  * +12 = +0xC: dword: ecx
3817
  * +16 = +0x10: dword: edx
3818
  * +20 = +0x14: dword: ebx
3819
  * +24 = +0x18: dword: esp
3820
  * +28 = +0x1C: dword: ebp
3821
  * +32 = +0x20: dword: esi
3822
  * +36 = +0x24: dword: edi
3539 clevermous 3823
Замечания:
3824
  * Если поток выполняет код 0-кольца, возвращается
3825
    состояние регистров 3-кольца.
3826
  * Процесс должен быть загружен для отладки (как указано в
3827
    общем описании).
77 diamond 3828
 
6056 IgorA 3829
---------------------- Константы для регистров: ----------------------
3830
  eax - SF_DEBUG (69)
3831
  ebx - SSF_GET_REGISTERS (1)
77 diamond 3832
======================================================================
3539 clevermous 3833
====================== Функция 69, подфункция 2 ======================
3834
======== Установить состояние регистров отлаживаемого потока. ========
77 diamond 3835
======================================================================
3539 clevermous 3836
Параметры:
3837
  * eax = 69 - номер функции
3838
  * ebx = 2 - номер подфункции
3839
  * ecx = идентификатор потока
3840
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3841
  * esi = указатель на структуру контекста
3842
Возвращаемое значение:
3843
  * функция не возвращает значения
3844
Формат структуры контекста указан в описании подфункции 1.
3845
Замечания:
3846
  * Если поток выполняет код 0-кольца, устанавливается
3847
    состояние регистров 3-кольца.
3848
  * Процесс должен быть загружен для отладки (как указано в
3849
    общем описании).
77 diamond 3850
 
6056 IgorA 3851
---------------------- Константы для регистров: ----------------------
3852
  eax - SF_DEBUG (69)
3853
  ebx - SSF_SET_REGISTERS (2)
77 diamond 3854
======================================================================
3539 clevermous 3855
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
77 diamond 3856
======================================================================
3539 clevermous 3857
Параметры:
3858
  * eax = 69 - номер функции
3859
  * ebx = 3 - номер подфункции
3860
  * ecx = идентификатор
3861
Возвращаемое значение:
3862
  * функция не возвращает значения
3863
Замечания:
3864
  * Если процесс был приостановлен, он возобновляет выполнение.
77 diamond 3865
 
6056 IgorA 3866
---------------------- Константы для регистров: ----------------------
3867
  eax - SF_DEBUG (69)
3868
  ebx - SSF_DETACH (3)
77 diamond 3869
======================================================================
3539 clevermous 3870
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
77 diamond 3871
======================================================================
3539 clevermous 3872
Параметры:
3873
  * eax = 69 - номер процесса
3874
  * ebx = 4 - номер подфункции
3875
  * ecx = идентификатор
3876
Возвращаемое значение:
3877
  * функция не возвращает значения
3878
Замечания:
3879
  * Процесс должен быть загружен для отладки (как указано в
3880
    общем описании).
77 diamond 3881
 
6056 IgorA 3882
---------------------- Константы для регистров: ----------------------
3883
  eax - SF_DEBUG (69)
3884
  ebx - SSF_SUSPEND (4)
77 diamond 3885
======================================================================
3539 clevermous 3886
====================== Функция 69, подфункция 5 ======================
3887
============ Возобновить выполнение отлаживаемого потока. ============
77 diamond 3888
======================================================================
3539 clevermous 3889
Параметры:
3890
  * eax = 69 - номер функции
3891
  * ebx = 5 - номер подфункции
3892
  * ecx = идентификатор
3893
Возвращаемое значение:
3894
  * функция не возвращает значения
3895
Замечания:
3896
  * Процесс должен быть загружен для отладки (как указано в
3897
    общем описании).
77 diamond 3898
 
6056 IgorA 3899
---------------------- Константы для регистров: ----------------------
3900
  eax - SF_DEBUG (69)
3901
  ebx - SSF_RESUME (5)
77 diamond 3902
======================================================================
3539 clevermous 3903
====================== Функция 69, подфункция 6 ======================
3904
============= Прочитать из памяти отлаживаемого процесса. ============
77 diamond 3905
======================================================================
3539 clevermous 3906
Параметры:
3907
  * eax = 69 - номер функции
3908
  * ebx = 6 - номер подфункции
3909
  * ecx = идентификатор
3910
  * edx = сколько байт читать
3911
  * esi = адрес памяти отлаживаемого процесса
3912
  * edi = указатель на буфер для данных
3913
Возвращаемое значение:
3914
  * eax = -1 при ошибке (неверный PID или буфер)
3915
  * иначе eax = число прочитанных байт (возможно, 0,
3916
    если в esi слишком большое значение)
3917
Замечания:
3918
  * Процесс должен быть загружен для отладки (как указано в
3919
    общем описании).
77 diamond 3920
 
6056 IgorA 3921
---------------------- Константы для регистров: ----------------------
3922
  eax - SF_DEBUG (69)
3923
  ebx - SSF_READ_MEMORY (6)
77 diamond 3924
======================================================================
3780 Serge 3925
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
77 diamond 3926
======================================================================
3539 clevermous 3927
Параметры:
3928
  * eax = 69 - номер функции
3929
  * ebx = 7 - номер подфункции
3930
  * ecx = идентификатор
3931
  * edx = сколько байт писать
3932
  * esi = адрес памяти в отлаживаемом процессе
3933
  * edi = указатель на данные
3934
Возвращаемое значение:
3935
  * eax = -1 при ошибке (неверный PID или буфер)
3936
  * иначе eax = число записанных байт (возможно, 0,
3937
    если в esi слишком большое значение)
3938
Замечания:
3939
  * Процесс должен быть загружен для отладки (как указано в
3940
    общем описании).
77 diamond 3941
 
6056 IgorA 3942
---------------------- Константы для регистров: ----------------------
3943
  eax - SF_DEBUG (69)
3944
  ebx - SSF_WRITE_MEMORY (7)
77 diamond 3945
======================================================================
3539 clevermous 3946
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
77 diamond 3947
======================================================================
3539 clevermous 3948
Параметры:
3949
  * eax = 69 - номер функции
3950
  * ebx = 8 - номер подфункции
3951
  * ecx = идентификатор
3952
Возвращаемое значение:
3953
  * функция не возвращает значения
3954
Замечания:
3955
  * Процесс должен быть загружен для отладки (как указано в
3956
    общем описании).
3957
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
3958
    требуется выполнение первого замечания и принимается PID,
3959
    а не номер слота.
77 diamond 3960
 
6056 IgorA 3961
---------------------- Константы для регистров: ----------------------
3962
  eax - SF_DEBUG (69)
3963
  ebx - SSF_TERMINATE (8)
77 diamond 3964
======================================================================
3539 clevermous 3965
====================== Функция 69, подфункция 9 ======================
3966
============= Установить/снять аппаратную точку останова. ============
77 diamond 3967
======================================================================
3539 clevermous 3968
Параметры:
3969
  * eax = 69 - номер функции
3970
  * ebx = 9 - номер подфункции
3971
  * ecx = идентификатор потока
3972
  * dl = индекс точки останова, от 0 до 3 включительно
3973
  * dh = флаги:
3974
    * если старший бит сброшен - установить точку останова:
3975
      * биты 0-1 - условие:
3976
        * 00 = точка останова на выполнение
3977
        * 01 = точка останова на запись
3978
        * 11 = точка останова на чтение/запись
3979
      * биты 2-3 - длина; для точек останова на исполнение должно быть
3980
        00, в противном случае одно из
3981
        * 00 = байт
3982
        * 01 = слово
3983
        * 11 = двойное слово
3984
      * esi = адрес точки останова; должен быть выровнен
3985
        соответственно длине (т.е. должен быть чётным для
3986
        точек останова на слово, кратен 4 для двойного слова)
3987
    * если старший бит установлен - сбросить точку останова
3988
Возвращаемое значение:
3989
  * eax = 0 - успешно
3990
  * eax = 1 - ошибка во входных данных
3991
  * eax = 2 - (зарезервировано, никогда не возвращается
3992
    в текущей реализации) с этим индексом уже установлена
3993
    глобальная точка останова
3994
Замечания:
3995
  * Процесс должен быть загружен для отладки (как указано в
3996
    общем описании).
3997
  * Аппаратные точки останова реализуются через DRx-регистры
3998
    процессора, отсюда все ограничения.
3999
  * Функция может переустановить ранее установленную ей же
4000
    точку останова (никак не сообщая об этом).
4001
    Ведите список установленных точек останова в отладчике.
4002
  * Срабатывание точки останова заключается в генерировании
4003
    отладочного исключения #DB, о котором система сообщает отладчику.
4004
  * Точка останова на запись и чтение/запись срабатывает после
4005
    выполнения вызвавшей её инструкции.
77 diamond 4006
 
6056 IgorA 4007
---------------------- Константы для регистров: ----------------------
4008
  eax - SF_DEBUG (69)
4009
  ebx - SSF_DEFINE_BREAKPOINT (9)
77 diamond 4010
======================================================================
3539 clevermous 4011
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
77 diamond 4012
======================================================================
3539 clevermous 4013
Параметры:
77 diamond 4014
  * eax = 70
3539 clevermous 4015
  * ebx = указатель на информационную структуру
4016
Возвращаемое значение:
4017
  * eax = 0 - успешно; иначе код ошибки файловой системы
4018
  * в зависимости от подфункции может возвращаться значение и
4019
    в других регистрах
4020
Общий формат информационной структуры:
4021
  * +0: dword: номер подфункции
6798 pathoswith 4022
  * +4: dword: смещение в файле или папке
4023
  * +8: dword: старшая часть смещения или поле флагов
4024
  * +12 = +0xC: dword: размер данных
3539 clevermous 4025
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4026
  * +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
6502 pathoswith 4027
  или
6473 pathoswith 4028
  * +20 = +0x14: byte: 0
4029
  * +21 = +0x15: dword: указатель на строку
4030
Чувствительность к регистру букв зависит от файловой системы.
6758 pathoswith 4031
Если путь начинается не с '/', то он считается относительным.
4032
Получить или установить текущую папку можно с помощью сисфункции 30.
6798 pathoswith 4033
'../' в пути означает подъём на одну папку относительно текущей.
6758 pathoswith 4034
Можно указать кодировку строки, поместив в её начале байт со значениями:
6502 pathoswith 4035
  * 1 = cp866
4036
  * 2 = UTF-16LE
4037
  * 3 = UTF-8
6758 pathoswith 4038
иначе будет использоваться кодировка cp866. В абсолютном пути можно
4039
поместить этот байт после '/' или добавить дополнительный '/' перед ним.
6798 pathoswith 4040
Также, можно использовать сисфункцию 80.
6758 pathoswith 4041
Формат абсолютного пути:
6473 pathoswith 4042
  /base/number/dir1/dir2/.../dirn/file,
4043
где base/number идентифицирует устройство, на котором ищется файл:
4044
  * RD/1 = рамдиск
4045
  * FD/1 = первый флоппи-дисковод,
4046
    FD/2 = второй флоппи-дисковод
4047
  * HD0/x, HD1/x, HD2/x, HD3/x = жёсткие диски соответственно на
4048
    IDE0 (Primary Master), IDE1 (Primary Slave),
77 diamond 4049
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
6473 pathoswith 4050
    x - номер раздела на выбранном винчестере, начиная с 1
4051
  * CD0/1, CD1/1, CD2/1, CD3/1 = аналогично для cd
7722 dunkaist 4052
  * SYS - системная папка (является ключом, не зависит от кодировки),
6473 pathoswith 4053
    второй ключ может быть установлен сисфункцией 30.3.
3539 clevermous 4054
Примеры:
6473 pathoswith 4055
  * '/sys/example.asm',0
4056
  * '/rd/1/example.asm',0
4057
  * '/HD0/1/folder/file.txt',0
4058
  * '/hd2/2/pics/tanzania.bmp',0
4059
  * 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0
1662 Nasarus 4060
 
3539 clevermous 4061
Доступные подфункции:
4062
  * подфункция 0 - чтение файла
4063
  * подфункция 1 - чтение папки
4064
  * подфункция 2 - создание/перезапись файла
4065
  * подфункция 3 - запись в существующий файл
4066
  * подфункция 4 - установка размера файла
4067
  * подфункция 5 - получение атрибутов файла/папки
4068
  * подфункция 6 - установка атрибутов файла/папки
4069
  * подфункция 7 - запуск программы
4070
  * подфункция 8 - удаление файла/папки
4071
  * подфункция 9 - создание папки
4072
Для CD-приводов в связи с аппаратными ограничениями доступны
4073
только подфункции 0,1,5 и 7, вызов других подфункций завершится
4074
ошибкой с кодом 2.
4075
При первом обращении подфункций 0,1,5,7 к устройствам ATAPI
4076
(CD и DVD) производится блокировка ручного управления механизмом
4077
лотка. Это связано с кэшированием данных, полученных от привода.
4078
Разблокировка осуществляется при обращении подфункции 4 функции 24
4079
к соответствующему устройству.
77 diamond 4080
 
6056 IgorA 4081
---------------------- Константы для регистров: ----------------------
4082
  eax - SF_FILE (70)
4083
 [ebx] - SSF_READ_FILE (0), SSF_READ_FOLDER (1), SSF_CREATE_FILE (2),
4084
    SSF_WRITE_FILE (3), SSF_SET_END (4), SSF_GET_INFO (5),
4085
    SSF_SET_INFO (6), SSF_START_APP (7), SSF_DELETE (8),
4086
    SSF_CREATE_FOLDER (9)
77 diamond 4087
======================================================================
3539 clevermous 4088
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
77 diamond 4089
======================================================================
3539 clevermous 4090
Параметры:
4091
  * eax = 70 - номер функции
4092
  * ebx = указатель на информационную структуру
4093
Формат информационной структуры:
4094
  * +0: dword: 0 = номер подфункции
4095
  * +4: dword: позиция в файле (в байтах)
4096
  * +8: dword: 0 (зарезервировано под старший dword позиции)
4097
  * +12 = +0xC: dword: сколько байт читать
4098
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
6473 pathoswith 4099
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4100
Возвращаемое значение:
4101
  * eax = 0 - успешно, иначе код ошибки файловой системы
6880 pathoswith 4102
  * ebx = число прочитанных байт
3539 clevermous 4103
Замечания:
4104
  * Если файл кончился раньше, чем был прочитан последний запрошенный
4105
    блок, то функция прочитает, сколько сможет, после чего вернёт
77 diamond 4106
    eax=6 (EOF).
3539 clevermous 4107
  * Функция не позволяет читать папки
4108
    (вернётся eax=10, access denied).
77 diamond 4109
 
6056 IgorA 4110
---------------------- Константы для регистров: ----------------------
4111
  eax - SF_FILE (70)
4112
 [ebx] - SSF_READ_FILE (0)
77 diamond 4113
======================================================================
3539 clevermous 4114
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
77 diamond 4115
======================================================================
3539 clevermous 4116
Параметры:
4117
  * eax = 70 - номер функции
4118
  * ebx = указатель на информационную структуру
4119
Формат информационной структуры:
4120
  * +0: dword: 1 = номер подфункции
4121
  * +4: dword: индекс начального блока (считая с 0)
6473 pathoswith 4122
  * +8: dword: в какой кодировке возвращать имена:
6798 pathoswith 4123
 
4124
    1 = cp866
4125
    2 = UTF-16LE
4126
    3 = UTF-8
3539 clevermous 4127
  * +12 = +0xC: dword: сколько блоков читать
6798 pathoswith 4128
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные.
6473 pathoswith 4129
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4130
Возвращаемое значение:
4131
  * eax = 0 - успешно, иначе код ошибки файловой системы
6880 pathoswith 4132
  * ebx = число файлов, информация о которых была записана в буфер
3539 clevermous 4133
Структура буфера:
6473 pathoswith 4134
  * заголовок (32 байта)
4135
  * блок с информацией о файле 1
4136
  * блок с информацией о файле 2
77 diamond 4137
  * ...
3539 clevermous 4138
Структура заголовка:
4139
  * +0: dword: версия структуры (текущая версия = 1)
4140
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
4141
    в поле +12 информационной структуры; может быть меньше,
4142
    если в папке кончились файлы (то же самое, что и в ebx)
4143
  * +8: dword: общее число файлов в папке
4144
  * +12 = +0xC: 20*byte: зарезервировано (нули)
4145
Структура блока данных входа каталога (БДВК):
4146
  * +0: dword: атрибуты файла:
4147
    * бит 0 (маска 1): файл только для чтения
4148
    * бит 1 (маска 2): файл является скрытым
4149
    * бит 2 (маска 4): файл является системным
6901 pathoswith 4150
    * бит 3 (маска 8): это метка тома (возвращается подфункцией 5)
3539 clevermous 4151
    * бит 4 (маска 0x10): это папка
4152
    * бит 5 (маска 0x20): файл не архивировался - многие программы
4153
      архивации имеют опцию, по которой архивируются только файлы
4154
      с установленным этим битом, после чего этот бит сбрасывается -
4155
      это может быть полезно для автоматического создания
4156
      backup-архивов, ибо при записи бит обычно устанавливается
4157
      (не в Kolibri, правда)
6798 pathoswith 4158
  * +4: dword: кодировка имени, соответствует полю +8 информационной структуры
3539 clevermous 4159
  * +8: 4*byte: время создания файла
4160
  * +12 = +0xC: 4*byte: дата создания файла
4161
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
4162
  * +20 = +0x14: 4*byte: дата последнего доступа
4163
  * +24 = +0x18: 4*byte: время последней модификации
4164
  * +28 = +0x1C: 4*byte: дата последней модификации
4165
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
6798 pathoswith 4166
  * +40 = +0x28: имя, размер в cp866 составляет 264 байта, иначе - 520 байт.
3539 clevermous 4167
Формат времени:
4168
  * +0: byte: секунды
4169
  * +1: byte: минуты
4170
  * +2: byte: часы
4171
  * +3: byte: зарезервировано (0)
4172
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
4173
Формат даты:
4174
  * +0: byte: день
4175
  * +1: byte: месяц
4176
  * +2: word: год
4177
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
9745 sober_dev 4178
    Некоторые файловые системы ведут дату с 01.01.1980,
4179
    например: FAT12/16/32 и exFAT
3539 clevermous 4180
Замечания:
6798 pathoswith 4181
  * Если БДВК содержит имя в cp866, то длина БДВК составляет
4182
    304 байта, иначе - 560 байт.
6473 pathoswith 4183
  * Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
3539 clevermous 4184
  * Если файлы в папке кончились раньше, чем было прочитано
4185
    запрошенное количество, то функция прочитает, сколько сможет,
4186
    после чего вернёт eax=6 (EOF).
4187
  * Любая папка на диске, кроме корневой, содержит два специальных
4188
    входа "." и "..", идентифицирующих соответственно саму папку и
4189
    родительскую папку.
4190
  * Функция позволяет также читать виртуальные папки "/", "/rd",
4191
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
6473 pathoswith 4192
    0x10, а времена и даты обнулены.
77 diamond 4193
 
6056 IgorA 4194
---------------------- Константы для регистров: ----------------------
4195
  eax - SF_FILE (70)
4196
 [ebx] - SSF_READ_FOLDER (1)
77 diamond 4197
======================================================================
3539 clevermous 4198
====================== Функция 70, подфункция 2 ======================
4199
======== Создание/перезапись файла с поддержкой длинных имён. ========
83 diamond 4200
======================================================================
3539 clevermous 4201
Параметры:
4202
  * eax = 70 - номер функции
4203
  * ebx = указатель на информационную структуру
4204
Формат информационной структуры:
4205
  * +0: dword: 2 = номер подфункции
4206
  * +4: dword: 0 (зарезервировано)
4207
  * +8: dword: 0 (зарезервировано)
4208
  * +12 = +0xC: dword: сколько байт писать
4209
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4210
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4211
Возвращаемое значение:
4212
  * eax = 0 - успешно, иначе код ошибки файловой системы
4213
  * ebx = число записанных байт (возможно, 0)
4214
Замечания:
4215
  * Если файл с таким именем не существовал, он создаётся; если
4216
    существовал, то перезаписывается.
4217
  * Если свободного места на диске недостаточно, то функция запишет,
4218
    сколько сможет, после чего вернёт код ошибки 8.
4219
  * Функция не поддерживается для CD (вернётся код ошибки 2).
83 diamond 4220
 
6056 IgorA 4221
---------------------- Константы для регистров: ----------------------
4222
  eax - SF_FILE (70)
4223
 [ebx] - SSF_CREATE_FILE (2)
83 diamond 4224
======================================================================
3539 clevermous 4225
====================== Функция 70, подфункция 3 ======================
4226
======== Запись в существующий файл с поддержкой длинных имён. =======
131 diamond 4227
======================================================================
3539 clevermous 4228
Параметры:
4229
  * eax = 70 - номер функции
4230
  * ebx = указатель на информационную структуру
4231
Формат информационной структуры:
4232
  * +0: dword: 3 = номер подфункции
4233
  * +4: dword: позиция в файле (в байтах)
4234
  * +8: dword: старший dword позиции (должен быть 0 для FAT)
4235
  * +12 = +0xC: dword: сколько байт писать
4236
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4237
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4238
Возвращаемое значение:
4239
  * eax = 0 - успешно, иначе код ошибки файловой системы
4240
  * ebx = число записанных байт (возможно, 0)
4241
Замечания:
4242
  * Файл должен уже существовать, иначе вернётся eax=5.
4243
  * Единственным результатом записи 0 байт является установка в
4244
    атрибутах файла даты/времени модификации и доступа в текущую.
4245
  * Если начальная и/или конечная позиция выходит за пределы файла
4246
    (за исключением предыдущего случая), файл расширяется до
4247
    необходимого размера нулевыми символами.
4248
  * Функция не поддерживается для CD (вернётся код ошибки 2).
131 diamond 4249
 
6056 IgorA 4250
---------------------- Константы для регистров: ----------------------
4251
  eax - SF_FILE (70)
4252
 [ebx] - SSF_WRITE_FILE (3)
131 diamond 4253
======================================================================
3539 clevermous 4254
========= Функция 70, подфункция 4 - установка размера файла. ========
133 diamond 4255
======================================================================
3539 clevermous 4256
Параметры:
4257
  * eax = 70 - номер функции
4258
  * ebx = указатель на информационную структуру
4259
Формат информационной структуры:
4260
  * +0: dword: 4 = номер подфункции
4261
  * +4: dword: младший dword нового размера файла
4262
  * +8: dword: старший dword нового размера файла
4263
  * +12 = +0xC: dword: 0 (зарезервировано)
4264
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4265
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4266
Возвращаемое значение:
4267
  * eax = 0 - успешно, иначе код ошибки файловой системы
4268
  * ebx разрушается
4269
Замечания:
6758 pathoswith 4270
  * Если новый размер файла меньше старого, файл усекается.
4271
    Если новый размер больше старого, файл расширяется, и если
4272
    разница в размере не больше 16 МБ, новое место очищается нулями.
3539 clevermous 4273
  * Если свободного места на диске недостаточно для расширения файла,
4274
    то функция расширит насколько возможно, после чего вернёт
4275
    код ошибки 8.
4276
  * Функция не поддерживается для CD (вернётся код ошибки 2).
133 diamond 4277
 
6056 IgorA 4278
---------------------- Константы для регистров: ----------------------
4279
  eax - SF_FILE (70)
4280
 [ebx] - SSF_SET_END (4)
133 diamond 4281
======================================================================
3539 clevermous 4282
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
86 diamond 4283
======================================================================
3539 clevermous 4284
Параметры:
4285
  * eax = 70 - номер функции
4286
  * ebx = указатель на информационную структуру
4287
Формат информационной структуры:
4288
  * +0: dword: 5 = номер подфункции
4289
  * +4: dword: 0 (зарезервировано)
6427 pathoswith 4290
  * +8: dword: 0 или флаги (для корневого каталога)
3539 clevermous 4291
  * +12 = +0xC: dword: 0 (зарезервировано)
4292
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
4293
                        (40 байт)
6473 pathoswith 4294
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4295
Возвращаемое значение:
4296
  * eax = 0 - успешно, иначе код ошибки файловой системы
4297
  * ebx разрушается
4298
Информация о файле возвращается в формате БДВК
6427 pathoswith 4299
(блока данных входа каталога), указанном в описании подфункции 1,
4300
но без имени файла, за исключением корневого каталога.
3539 clevermous 4301
Замечания:
6876 pathoswith 4302
  * Для корневого каталога возвращается размер раздела,
4303
    а при указании кодировки (не ноль), также его имя.
6875 pathoswith 4304
  * Для устройства возвращается только размер.
86 diamond 4305
 
6056 IgorA 4306
---------------------- Константы для регистров: ----------------------
4307
  eax - SF_FILE (70)
4308
 [ebx] - SSF_GET_INFO (5)
86 diamond 4309
======================================================================
3539 clevermous 4310
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
86 diamond 4311
======================================================================
3539 clevermous 4312
Параметры:
4313
  * eax = 70 - номер функции
4314
  * ebx = указатель на информационную структуру
4315
Формат информационной структуры:
4316
  * +0: dword: 6 = номер подфункции
4317
  * +4: dword: 0 (зарезервировано)
4318
  * +8: dword: 0 (зарезервировано)
4319
  * +12 = +0xC: dword: 0 (зарезервировано)
4320
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
6473 pathoswith 4321
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4322
Возвращаемое значение:
4323
  * eax = 0 - успешно, иначе код ошибки файловой системы
4324
  * ebx разрушается
4325
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
4326
формат которого указан в описании подфункции 1
4327
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
4328
(биты 3,4 в dword'е +0) не меняется.
4329
Байт +4 (формат имени) игнорируется.
4330
Замечания:
4331
  * Функция не поддерживает виртуальные папки типа /, /rd и
4332
    корневые папки типа /rd/1.
4333
  * Функция не поддерживается для CD (вернётся код ошибки 2).
86 diamond 4334
 
6056 IgorA 4335
---------------------- Константы для регистров: ----------------------
4336
  eax - SF_FILE (70)
4337
 [ebx] - SSF_SET_INFO (6)
86 diamond 4338
======================================================================
3539 clevermous 4339
============ Функция 70, подфункция 7 - запуск программы. ============
91 diamond 4340
======================================================================
3539 clevermous 4341
Параметры:
4342
  * eax = 70 - номер функции
4343
  * ebx = указатель на информационную структуру
4344
Формат информационной структуры:
4345
  * +0: dword: 7 = номер подфункции
4346
  * +4: dword: поле флагов:
4347
    * бит 0: запустить процесс как отлаживаемый
4348
    * остальные биты зарезервированы и должны быть установлены в 0
4349
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
4350
  * +12 = +0xC: dword: 0 (зарезервировано)
4351
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4352
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4353
Возвращаемое значение:
4354
  * eax > 0 - программа загружена, eax содержит PID
4355
  * eax < 0 - произошла ошибка, -eax содержит
4356
    код ошибки файловой системы
4357
  * ebx разрушается
4358
Замечания:
4359
  * Командная строка должна заканчиваться символом с кодом 0
4360
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
4361
    включительно, либо первые 256 символов, в зависимости от того,
4362
    что меньше.
4363
  * Если процесс запускается как отлаживаемый, он создаётся
4364
    в замороженном состоянии; для запуска используйте
4365
    подфункцию 5 функции 69.
91 diamond 4366
 
6056 IgorA 4367
---------------------- Константы для регистров: ----------------------
4368
  eax - SF_FILE (70)
4369
 [ebx] - SSF_START_APP (7)
91 diamond 4370
======================================================================
3539 clevermous 4371
========== Функция 70, подфункция 8 - удаление файла/папки. ==========
172 serge 4372
======================================================================
3539 clevermous 4373
Параметры:
4374
  * eax = 70 - номер функции
4375
  * ebx = указатель на информационную структуру
4376
Формат информационной структуры:
4377
  * +0: dword: 8 = номер подфункции
4378
  * +4: dword: 0 (зарезервировано)
4379
  * +8: dword: 0 (зарезервировано)
4380
  * +12 = +0xC: dword: 0 (зарезервировано)
4381
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4382
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4383
Возвращаемое значение:
4384
  * eax = 0 - успешно, иначе код ошибки файловой системы
4385
  * ebx разрушается
4386
Замечания:
4387
  * Функция не поддерживается для CD (вернётся код ошибки 2).
4388
  * Можно удалять только пустые папки (попытка удаления непустой папки
4389
    приведёт к ошибке с кодом 10, "доступ запрещён").
172 serge 4390
 
6056 IgorA 4391
---------------------- Константы для регистров: ----------------------
4392
  eax - SF_FILE (70)
4393
 [ebx] - SSF_DELETE (8)
172 serge 4394
======================================================================
3539 clevermous 4395
============= Функция 70, подфункция 9 - создание папки. =============
321 diamond 4396
======================================================================
3539 clevermous 4397
Параметры:
4398
  * eax = 70 - номер функции
4399
  * ebx = указатель на информационную структуру
4400
Формат информационной структуры:
4401
  * +0: dword: 9 = номер подфункции
4402
  * +4: dword: 0 (зарезервировано)
4403
  * +8: dword: 0 (зарезервировано)
4404
  * +12 = +0xC: dword: 0 (зарезервировано)
4405
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4406
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4407
Возвращаемое значение:
4408
  * eax = 0 - успешно, иначе код ошибки файловой системы
4409
  * ebx разрушается
4410
Замечания:
4411
  * Функция не поддерживается для CD (вернётся код ошибки 2).
4412
  * Родительская папка должна уже существовать.
4413
  * Если папка уже существует, функция завершится успешно (eax=0).
321 diamond 4414
 
6056 IgorA 4415
---------------------- Константы для регистров: ----------------------
4416
  eax - SF_FILE (70)
4417
 [ebx] - SSF_CREATE_FOLDER (9)
321 diamond 4418
======================================================================
6917 pathoswith 4419
======= Функция 70, подфункция 10 - переименование/перемещение =======
4420
======================================================================
4421
Параметры:
4422
  * eax = 70 - номер функции
4423
  * ebx = указатель на информационную структуру
4424
Формат информационной структуры:
4425
  * +0: dword: 10 = номер подфункции
4426
  * +4: dword: 0 (зарезервировано)
4427
  * +8: dword: 0 (зарезервировано)
4428
  * +12 = +0xC: dword: 0 (зарезервировано)
4429
  * +16 = +0x10: dword: указатель на строку с новым именем/путём
4430
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
4431
Возвращаемое значение:
4432
  * eax = 0 - успешно, иначе код ошибки файловой системы
4433
  * ebx разрушается
4434
Замечания:
4435
  * Формирование нового пути отличается от общих правил:
4436
    относительный путь относится к папке целевого файла (или папки),
4437
    абсолютный путь считается от корня раздела.
4438
======================================================================
6802 pathoswith 4439
========== Функция 71 - установить заголовок окна программы ==========
114 mikedld 4440
======================================================================
3539 clevermous 4441
Параметры:
4442
  * eax = 71 - номер функции
6802 pathoswith 4443
  * ebx = 1
4444
  * ecx = адрес строки заголовка,
4445
    строка может начинаться с байта кодировки:
4446
    1 = cp866
4447
    2 = UTF-16LE
4448
    3 = UTF-8
4449
  или:
4450
  * ebx = 2
3539 clevermous 4451
  * ecx = адрес строки заголовка
6802 pathoswith 4452
  * dl  = кодировка строки
3539 clevermous 4453
Возвращаемое значение:
4454
  * функция не возвращает значения
4455
Замечания:
5926 pathoswith 4456
  * Строка заголовка должна заканчиваться нулём.
3539 clevermous 4457
  * Чтобы убрать заголовок, передайте NULL в ecx.
114 mikedld 4458
 
6056 IgorA 4459
---------------------- Константы для регистров: ----------------------
4460
  eax - SF_SET_CAPTION (71)
114 mikedld 4461
======================================================================
3539 clevermous 4462
================ Функция 72 - послать сообщение окну. ================
665 diamond 4463
======================================================================
4464
 
3539 clevermous 4465
--- Подфункция 1 - послать сообщение с параметром активному окну. ----
4466
Параметры:
4467
  * eax = 72 - номер функции
4468
  * ebx = 1 - номер подфункции
4469
  * ecx = код события: 2 или 3
4470
  * edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3
4471
Возвращаемое значение:
4472
  * eax = 0 - успешно
4473
  * eax = 1 - буфер заполнен
665 diamond 4474
 
6056 IgorA 4475
---------------------- Константы для регистров: ----------------------
4476
  eax - SF_SEND_MESSAGE (72)
665 diamond 4477
======================================================================
3539 clevermous 4478
===================== Функция 73 - blit bitmap  =====================
3315 mario79 4479
======================================================================
3539 clevermous 4480
блит - копирование битового массив
3315 mario79 4481
 
3539 clevermous 4482
Параметры:
4483
  * eax = 73 - номер функции
3315 mario79 4484
 
3539 clevermous 4485
  * ebx = ROP и опциональные флаги
6790 0CodErr 4486
     31      30 29 28       6 5  4 3   0
4487
     [reserved][CR][reserved][T][B][ROP]
3539 clevermous 4488
     ROP - код растровых операций
4489
        0: копировать
4490
     1-15: Зарезервировано
7722 dunkaist 4491
     B   - блит на фоновую поверхность
3539 clevermous 4492
     T   - блит с прозрачностью
6790 0CodErr 4493
     CR  - относительно клиентской области окна
6798 pathoswith 4494
 
3539 clevermous 4495
  * ecx = указатель на параметры функции
4496
        смещение цели и отсечение
4497
     +0 signed dword: смещение по X окна, для целевого прямоугольника
4498
                      верхний левый угол
4499
     +4 signed dword: смещение по Y окна, для целевого прямоугольника
4500
                      верхний левый угол
4501
     +8 dword:        ширина целевого прямоугольника
4502
    +12 dword:        высота целевого прямоугольника
3315 mario79 4503
 
3539 clevermous 4504
        смещение исходника и отсечение
4505
    +16 signed dword: смещение по X bitmap, для исходного прямоугольника
4506
                      верхний левый угол
4507
    +20 signed dword: смещение по Y bitmap, для исходного прямоугольника
4508
                      верхний левый угол
4509
    +24 dword:        ширина исходного прямоугольника
4510
    +28 dword:        высота исходного прямоугольника
3315 mario79 4511
 
3539 clevermous 4512
    +32: dword: данные bitmap - должны быть 32bpp
4513
    +36: dword: размер строки bitmap в байтах
3315 mario79 4514
 
3539 clevermous 4515
Возвращаемое значение:
4516
  * функция не возвращает значения
3315 mario79 4517
 
6056 IgorA 4518
---------------------- Константы для регистров: ----------------------
4519
  eax - SF_BLITTER (73)
3315 mario79 4520
======================================================================
3837 mario79 4521
=================== Функция 74, подфункция -1 ========================
4522
=========== Получить количество активных сетевых устройств. ==========
4523
======================================================================
4524
Параметры:
4525
  * eax = 74 - номер функции
4526
  * bl = -1 - номер подфункции
4527
Возвращаемое значение:
4528
  * eax = количество активных сетевых устройств
4529
 
6056 IgorA 4530
---------------------- Константы для регистров: ----------------------
4531
  eax - SF_NETWORK_GET (74)
4532
   bl - SSF_DEVICE_COUNT (255)
3837 mario79 4533
======================================================================
4534
==== Функция 74, подфункция 0, Получить тип сетевого устройства. =====
4535
======================================================================
4536
Параметры:
4537
  * eax = 74 - номер функции
4538
  * bl = 0 - номер подфункции
4539
  * bh = номер устройства
4540
Возвращаемое значение:
4541
  * eax = тип устройства
4542
 
6056 IgorA 4543
---------------------- Константы для регистров: ----------------------
4544
  eax - SF_NETWORK_GET (74)
4545
   bl - SSF_DEVICE_TYPE (0)
3837 mario79 4546
======================================================================
4547
==== Функция 74, подфункция 1, Получить имя сетевого устройства. =====
4548
======================================================================
4549
Параметры:
4550
  * eax = 74 - номер функции
4551
  * bl = 1 - номер подфункции
4552
  * bh = номер устройства
6473 pathoswith 4553
  * ecx = указатель на буфера - 64 байт
3837 mario79 4554
Возвращаемое значение:
4555
  * eax = -1 для ошибки
4556
  * В случае успеха в буфер записывается имя сетевого устройства
4557
 
6056 IgorA 4558
---------------------- Константы для регистров: ----------------------
4559
  eax - SF_NETWORK_GET (74)
4560
   bl - SSF_DEVICE_NAME (1)
3837 mario79 4561
======================================================================
4562
======= Функция 74, подфункция 2, Сброс сетевого устройства. =========
4563
======================================================================
4564
Параметры:
4565
  * eax = 74 - номер функции
4566
  * bl = 2 - номер подфункции
4567
  * bh = номер устройства
4568
Возвращаемое значение:
4569
  * eax = -1 для ошибки
4570
 
6056 IgorA 4571
---------------------- Константы для регистров: ----------------------
4572
  eax - SF_NETWORK_GET (74)
4573
   bl - SSF_RESET_DEVICE (2)
3837 mario79 4574
======================================================================
4575
====== Функция 74, подфункция 3, Остановить сетевое устройство. ======
4576
======================================================================
4577
Параметры:
4578
  * eax = 74 - номер функции
4579
  * bl = 3 - номер подфункции
4580
  * bh = номер устройства
4581
Возвращаемое значение:
4582
  * eax = -1 для ошибки
4583
 
6056 IgorA 4584
---------------------- Константы для регистров: ----------------------
4585
  eax - SF_NETWORK_GET (74)
4586
   bl - SSF_STOP_DEVICE (3)
3837 mario79 4587
======================================================================
5983 pathoswith 4588
===== Функция 74, подфункция 4, Получить указатель на устройство =====
4589
======================================================================
4590
Параметры:
4591
  * eax = 74 - номер функции
4592
  * bl = 4 - номер подфункции
4593
  * bh = номер устройства
4594
Возвращаемое значение:
4595
  * eax = указатель, -1 для ошибки
4596
 
6056 IgorA 4597
---------------------- Константы для регистров: ----------------------
4598
  eax - SF_NETWORK_GET (74)
7722 dunkaist 4599
   bl - SSF_DEVICE_POINTER (4)
5983 pathoswith 4600
======================================================================
4601
=== Функция 74, подфункция 6, Получить количество посланых пакетов ===
4602
======================================================================
4603
Параметры:
4604
  * eax = 74 - номер функции
4605
  * bl = 6 - номер подфункции
4606
  * bh = номер устройства
4607
Возвращаемое значение:
4608
  * eax = количество с момента старта устройства, -1 для ошибки
4609
 
6056 IgorA 4610
---------------------- Константы для регистров: ----------------------
4611
  eax - SF_NETWORK_GET (74)
4612
   bl - SSF_TX_PACKET_COUNT (6)
5983 pathoswith 4613
======================================================================
4614
=== Функция 74, подфункция 7, Получить количество принятых пакетов ===
4615
======================================================================
4616
Параметры:
4617
  * eax = 74 - номер функции
4618
  * bl = 7 - номер подфункции
4619
  * bh = номер устройства
4620
Возвращаемое значение:
4621
  * eax = количество с момента старта устройства, -1 для ошибки
4622
 
6056 IgorA 4623
---------------------- Константы для регистров: ----------------------
4624
  eax - SF_NETWORK_GET (74)
4625
   bl - SSF_RX_PACKET_COUNT (7)
5983 pathoswith 4626
======================================================================
4627
==== Функция 74, подфункция 8, Получить количество посланых байт. ====
4628
======================================================================
4629
Параметры:
4630
  * eax = 74 - номер функции
4631
  * bl = 8 - номер подфункции
4632
  * bh = номер устройства
4633
Возвращаемое значение:
4634
  * eax = количество с момента старта устройства, -1 для ошибки
4635
  * ebx = старшая часть
4636
 
6056 IgorA 4637
---------------------- Константы для регистров: ----------------------
4638
  eax - SF_NETWORK_GET (74)
4639
   bl - SSF_TX_BYTE_COUNT (8)
5983 pathoswith 4640
======================================================================
4641
==== Функция 74, подфункция 9, Получить количество принятых байт. ====
4642
======================================================================
4643
Параметры:
4644
  * eax = 74 - номер функции
4645
  * bl = 9 - номер подфункции
4646
  * bh = номер устройства
4647
Возвращаемое значение:
4648
  * eax = количество с момента старта устройства, -1 для ошибки
4649
  * ebx = старшая часть
4650
 
6056 IgorA 4651
---------------------- Константы для регистров: ----------------------
4652
  eax - SF_NETWORK_GET (74)
4653
   bl - SSF_RX_BYTE_COUNT (9)
5983 pathoswith 4654
======================================================================
4655
======= Функция 74, подфункция 10, Получить статус соединения. =======
4656
======================================================================
4657
Параметры:
4658
  * eax = 74 - номер функции
4659
  * bl = 10 - номер подфункции
4660
  * bh = номер устройства
4661
Возвращаемое значение:
4662
  * eax = статус соединения, -1 для ошибки
4663
 
4664
Статусы:
4665
 
4666
  1 = неизвестное соединение
4667
  4 = 10 Мбит
4668
  8 = 100 Мбит
4669
  12 = 1 Гбит
4670
  10b = флаг полного дуплекса
4671
 
6056 IgorA 4672
---------------------- Константы для регистров: ----------------------
4673
  eax - SF_NETWORK_GET (74)
4674
   bl - SSF_LINK_STATUS (10)
5983 pathoswith 4675
======================================================================
9060 leency 4676
== Функция 74.11, Получить количество пакетов переданных с ошибкой. ==
9017 hidnplayr 4677
======================================================================
9060 leency 4678
Параметры:
4679
  * eax = 74 - номер функции
4680
  * bl = 11 - номер подфункции
4681
  * bh = номер устройства
4682
Возвращаемое значение:
4683
  * eax = Количество ошибочных пакетов, переданных с момента запуска
4684
          устройства, -1 при ошибке
9017 hidnplayr 4685
 
9060 leency 4686
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4687
  eax - SF_NETWORK_GET (74)
9060 leency 4688
   bl - SSF_TX_PACKET_ERROR_COUNT (11)
9017 hidnplayr 4689
======================================================================
9060 leency 4690
=== Функция 74.12, Получить число пакетов отброшенных при отправке. ==
9017 hidnplayr 4691
======================================================================
9060 leency 4692
Параметры:
4693
  * eax = 74 - номер функции
4694
  * bl = 12 - номер подфункции
4695
  * bh = номер устройства
4696
Возвращаемое значение:
4697
  * eax = число отброшенных пакетов с момента запуска устройства,
4698
    -1 при ошибке
9017 hidnplayr 4699
 
9060 leency 4700
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4701
  eax - SF_NETWORK_GET (74)
9060 leency 4702
   bl - SSF_TX_PACKET_DROP_COUNT (12)
9017 hidnplayr 4703
======================================================================
9060 leency 4704
=== Функция 74.13, Получить число пакетов утерянных при отправке. ====
9017 hidnplayr 4705
======================================================================
9060 leency 4706
Параметры:
4707
  * eax = 74 - номер функции
4708
  * bl = 13 - номер подфункции
4709
  * bh = номер устройства
4710
Возвращаемое значение:
4711
  * eax = число утерянных пакетов с момента запуска устройства,
4712
    -1 при ошибке
9017 hidnplayr 4713
 
9060 leency 4714
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4715
  eax - SF_NETWORK_GET (74)
9060 leency 4716
   bl - SSF_TX_PACKET_MISS_COUNT (13)
4717
 
9017 hidnplayr 4718
======================================================================
9060 leency 4719
==== Функция 74.14, Получить число пакетов полученных с ошибкой. =====
4720
======================================================================
4721
Параметры:
4722
  * eax = 74 - номер функции
4723
  * bl = 14 - номер подфункции
4724
  * bh = номер устройства
4725
Возвращаемое значение:
4726
  * eax = число пакетов, полученных с ошибкой с момента запуска
4727
    устройства, -1 при ошибке
4728
 
4729
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4730
  eax - SF_NETWORK_GET (74)
9060 leency 4731
   bl - SSF_RX_PACKET_ERROR_COUNT (14)
9017 hidnplayr 4732
======================================================================
9060 leency 4733
== Функция 74.15, Получить число пакетов отброшенных при получении. ==
9017 hidnplayr 4734
======================================================================
9060 leency 4735
Параметры:
4736
  * eax = 74 - номер функции
4737
  * bl = 15 - номер подфункции
4738
  * bh = номер устройства
4739
Возвращаемое значение:
4740
  * eax = число отброшенных пакетов с момента запуска устройства,
4741
    -1 при ошибке
9017 hidnplayr 4742
 
9060 leency 4743
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4744
  eax - SF_NETWORK_GET (74)
9060 leency 4745
   bl - SSF_RX_PACKET_DROP_COUNT (12)
9017 hidnplayr 4746
======================================================================
9060 leency 4747
=== Функция 74.16, Получить число пакетов утерянных при получении. ===
9017 hidnplayr 4748
======================================================================
9060 leency 4749
Параметры:
4750
  * eax = 74 - номер функции
4751
  * bl = 16 - номер подфункции
4752
  * bh = номер устройства
4753
Возвращаемое значение:
4754
  * eax = число утерянных пакетов с момента запуска устройства,
4755
    -1 при ошибке
9017 hidnplayr 4756
 
9060 leency 4757
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4758
  eax - SF_NETWORK_GET (74)
9060 leency 4759
   bl - SSF_RX_PACKET_MISS_COUNT (16)
9017 hidnplayr 4760
======================================================================
6235 pathoswith 4761
============== Функция 75, подфункция 0, Открыть сокет. ==============
3837 mario79 4762
======================================================================
4763
Параметры:
4764
  * eax = 75 - номер функции
4765
  * bl = 0 - номер подфункции
4766
  * ecx = домен
4767
  * edx = тип
4768
  * esi = протокол
4769
Возвращаемое значение:
4770
  * eax = номер сокета, -1 для ошибки
3868 mario79 4771
  * ebx = код ошибки
3837 mario79 4772
 
6056 IgorA 4773
---------------------- Константы для регистров: ----------------------
4774
  eax - SF_NETWORK_SOCKET (75)
4775
   bl - SSF_OPEN (0)
3837 mario79 4776
======================================================================
6235 pathoswith 4777
============== Функция 75, подфункция 1, Закрыть сокет. ==============
3837 mario79 4778
======================================================================
4779
Параметры:
4780
  * eax = 75 - номер функции
4781
  * bl = 1 - номер подфункции
4782
  * ecx = номер сокета
4783
Возвращаемое значение:
4784
  * eax = -1 для ошибки
3868 mario79 4785
  * ebx = код ошибки
3837 mario79 4786
 
6056 IgorA 4787
---------------------- Константы для регистров: ----------------------
4788
  eax - SF_NETWORK_SOCKET (75)
4789
   bl - SSF_CLOSE (1)
3837 mario79 4790
======================================================================
4791
============= Функция 75, подфункция 2, Bind (Привязка). =============
4792
======================================================================
4793
Параметры:
4794
  * eax = 75 - номер функции
4795
  * bl = 2 - номер подфункции
4796
  * ecx = номер сокета
4797
  * edx = указатель на структуру sockaddr
4798
  * esi = длина структуры sockaddr
6712 0CodErr 4799
Формат структуры SockAddr:
4800
  * +0: Word: Family
4801
  * +2: 14*Byte: Data
3837 mario79 4802
Возвращаемое значение:
4803
  * eax = -1 для ошибки
3868 mario79 4804
  * ebx = код ошибки
3837 mario79 4805
 
6056 IgorA 4806
---------------------- Константы для регистров: ----------------------
4807
  eax - SF_NETWORK_SOCKET (75)
4808
   bl - SSF_BIND (2)
3837 mario79 4809
======================================================================
4810
============ Функция 75, подфункция 3, Listen (Слушать). =============
4811
======================================================================
4812
Параметры:
4813
  * eax = 75 - номер функции
4814
  * bl = 3 - номер подфункции
4815
  * ecx = номер сокета
4816
  * edx = backlog (возвращаемый лог)
4817
Возвращаемое значение:
4818
  * eax = -1 для ошибки
3868 mario79 4819
  * ebx = код ошибки
3837 mario79 4820
 
6056 IgorA 4821
---------------------- Константы для регистров: ----------------------
4822
  eax - SF_NETWORK_SOCKET (75)
4823
   bl - SSF_LISTEN (3)
3837 mario79 4824
======================================================================
4825
========== Функция 75, подфункция 4, Connect (Соединение). ===========
4826
======================================================================
4827
Параметры:
4828
  * eax = 75 - номер функции
4829
  * bl = 4 - номер подфункции
4830
  * ecx = номер сокета
4831
  * edx = указатель на структуру sockaddr
4832
  * esi = длина структуры sockaddr
6712 0CodErr 4833
Формат структуры SockAddr:
4834
  * +0: Word: Family
6758 pathoswith 4835
  * +2: 14*Byte: Data
3837 mario79 4836
Возвращаемое значение:
4837
  * eax = -1 для ошибки
3868 mario79 4838
  * ebx = код ошибки
3837 mario79 4839
 
6056 IgorA 4840
---------------------- Константы для регистров: ----------------------
4841
  eax - SF_NETWORK_SOCKET (75)
4842
   bl - SSF_CONNECT (4)
3837 mario79 4843
======================================================================
4844
=========== Функция 75, подфункция 5, Accept (Соглашение). ===========
4845
======================================================================
4846
Параметры:
4847
  * eax = 75 - номер функции
4848
  * bl = 5 - номер подфункции
4849
  * ecx = номер сокета
4850
  * edx = указатель на структуру sockaddr
4851
  * esi = длина структуры sockaddr
6712 0CodErr 4852
Формат структуры SockAddr:
4853
  * +0: Word: Family
6758 pathoswith 4854
  * +2: 14*Byte: Data
3837 mario79 4855
Возвращаемое значение:
3868 mario79 4856
  * eax = номер сокета из принятого сокета, -1 для ошибки
4857
  * ebx = код ошибки
3837 mario79 4858
 
6056 IgorA 4859
---------------------- Константы для регистров: ----------------------
4860
  eax - SF_NETWORK_SOCKET (75)
4861
   bl - SSF_ACCEPT (5)
3837 mario79 4862
======================================================================
4863
============= Функция 75, подфункция 6, Send (Послать). ==============
4864
======================================================================
4865
Параметры:
4866
  * eax = 75 - номер функции
4867
  * bl = 6 - номер подфункции
4868
  * ecx = номер сокета
4869
  * edx = указатель на буфер
4870
  * esi = длина буфера
3868 mario79 4871
  * edi = флаги
3837 mario79 4872
Возвращаемое значение:
4873
  * eax = количество скопированных байтов, -1 для ошибки
3868 mario79 4874
  * ebx = код ошибки
3837 mario79 4875
 
6056 IgorA 4876
---------------------- Константы для регистров: ----------------------
4877
  eax - SF_NETWORK_SOCKET (75)
4878
   bl - SSF_SEND (6)
3837 mario79 4879
======================================================================
4880
============ Функция 75, подфункция 7, Receive (Получить). ===========
4881
======================================================================
4882
Параметры:
4883
  * eax = 75 - номер функции
4884
  * bl = 7 - номер подфункции
4885
  * ecx = номер сокета
4886
  * edx = указатель на буфер
4887
  * esi = длина буфера
4888
  * edi = флаги
4889
Возвращаемое значение:
4890
  * eax = количество скопированных байтов, -1 для ошибки
3868 mario79 4891
  * ebx = код ошибки
3837 mario79 4892
 
6056 IgorA 4893
---------------------- Константы для регистров: ----------------------
4894
  eax - SF_NETWORK_SOCKET (75)
4895
   bl - SSF_RECEIVE (7)
3837 mario79 4896
======================================================================
6235 pathoswith 4897
=========== Функция 75, подфункция 8, Задать опции сокета. ===========
3837 mario79 4898
======================================================================
4899
Параметры:
4900
  * eax = 75 - номер функции
4901
  * bl = 8 - номер подфункции
4902
  * ecx = номер сокета
4903
  * edx = указатель на optstruct
4904
Возвращаемое значение:
4905
  * eax = -1 для ошибки
3868 mario79 4906
  * ebx = код ошибки
3837 mario79 4907
Замечания:
4908
 
4909
  Optstruct: dd level
4910
             dd optionname
4911
             dd optlength
4912
             db options...
4913
 
6056 IgorA 4914
---------------------- Константы для регистров: ----------------------
4915
  eax - SF_NETWORK_SOCKET (75)
4916
   bl - SSF_SET_OPTIONS (8)
3837 mario79 4917
======================================================================
6235 pathoswith 4918
========== Функция 75, подфункция 9, Получить опции сокета. ==========
3837 mario79 4919
======================================================================
4920
Параметры:
4921
  * eax = 75 - номер функции
4922
  * bl = 9 - номер подфункции
4923
  * ecx = номер сокета
4924
  * edx = указатель на optstruct
4925
Возвращаемое значение:
4926
  * eax = -1 для ошибки
3868 mario79 4927
  * ebx = код ошибки
3837 mario79 4928
Замечания:
4929
 
4930
  Optstruct: dd level
4931
             dd optionname
4932
             dd optlength
4933
             db options...
4934
 
6056 IgorA 4935
---------------------- Константы для регистров: ----------------------
4936
  eax - SF_NETWORK_SOCKET (75)
4937
   bl - SSF_GET_OPTIONS (9)
3837 mario79 4938
======================================================================
6235 pathoswith 4939
========== Функция 75, подфункция 10, Получить парный сокет ==========
3837 mario79 4940
======================================================================
4941
Параметры:
4942
  * eax = 75 - номер функции
4943
  * bl = 10 - номер подфункции
4944
Возвращаемое значение:
6235 pathoswith 4945
  * eax = номер первого сокета / -1 для ошибки
4946
  * ebx = номер второго сокета / код ошибки
3837 mario79 4947
 
6056 IgorA 4948
---------------------- Константы для регистров: ----------------------
4949
  eax - SF_NETWORK_SOCKET (75)
4950
   bl - SSF_GET_PAIR (10)
3837 mario79 4951
======================================================================
6056 IgorA 4952
=============== Функция 76, Сетевые опции и статистика. ==============
4953
======================================================================
4954
Параметры:
4955
  * eax = 76 - номер функции
4956
  * верхняя часть ebx = номер протокола
4957
  * bh = номер устройства
4958
  * bl = номер подфункции
4959
 
6235 pathoswith 4960
Протоколы и подфункции:
4961
 
4962
 
6056 IgorA 4963
 
6235 pathoswith 4964
 
4965
    общие подфункции:
4966
 
4967
        1 - пакетов принято
4968
 
4969
1 - IPv4:
6056 IgorA 4970
        2 - Read IP
4971
        3 - Write IP
4972
        4 - Read DNS
4973
        5 - Write DNS
4974
        6 - Read subnet
4975
        7 - Write subnet
4976
        8 - Read gateway
4977
        9 - Write gateway
6235 pathoswith 4978
 
4979
2 - ICMP:
6056 IgorA 4980
        3 - enable/disable ICMP echo reply
4981
 
6235 pathoswith 4982
3 - UDP
4983
4 - TCP
6056 IgorA 4984
 
6235 pathoswith 4985
5 - ARP:
6056 IgorA 4986
        2 - Read # ARP entry's
4987
        3 - Read ARP entry
4988
        4 - Add static ARP entry
4989
        5 - Remove ARP entry (-1 = remove all)
4990
        6 - Send ARP announce on specified interface
4991
        7 - Read # ARP conflicts (IP address conflicts)
4992
 
4993
---------------------- Константы для регистров: ----------------------
4994
  eax - SF_NETWORK_PROTOCOL (76)
4995
======================================================================
6235 pathoswith 4996
============= Функция 77, подфункция 0, Создать фьютекс. =============
4997
======================================================================
4998
Параметры:
4999
  * eax = 77 - номер функции
5000
  * ebx = 0 - номер подфункции
5001
  * ecx = указатель на контрольное значение фьютекса (dword)
5002
Возвращаемое значение:
5003
  * eax = дескриптор фьютекса, 0 при ошибке
5004
 
5005
---------------------- Константы для регистров: ----------------------
5006
  eax - SF_FUTEX (77)
5007
  ebx - SSF_CREATE (0)
5008
======================================================================
5009
============= Функция 77, подфункция 1, Удалить фьютекс. =============
5010
======================================================================
5011
Параметры:
5012
  * eax = 77 - номер функции
5013
  * ebx = 1 - номер подфункции
5014
  * ecx = дескриптор фьютекса
5015
Возвращаемое значение:
5016
  * eax = 0 - успешно, -1 при ошибке
5017
Замечания:
5018
  * Ядро автоматически удаляет фьютексы при завершении процесса.
5019
 
5020
---------------------- Константы для регистров: ----------------------
5021
  eax - SF_FUTEX (77)
5022
  ebx - SSF_DESTROY (1)
5023
======================================================================
5024
================= Функция 77, подфункция 2, Ожидать. =================
5025
======================================================================
5026
Параметры:
5027
  * eax = 77 - номер функции
5028
  * ebx = 2 - номер подфункции
5029
  * ecx = дескриптор фьютекса
5030
  * edx = контрольное значение
5031
  * esi = таймаут в сотых секунды, 0 - ждать бесконечно
5032
Возвращаемое значение:
5033
  * eax = 0 - успешно, -1 - таймаут,
5034
        -2 - контрольное значение не соответствует
5035
 
5036
---------------------- Константы для регистров: ----------------------
5037
  eax - SF_FUTEX (77)
5038
  ebx - SSF_WAIT (2)
5039
======================================================================
5040
================ Функция 77, подфункция 3, Разбудить. ================
5041
======================================================================
5042
Параметры:
5043
  * eax = 77 - номер функции
5044
  * ebx = 3 - номер подфункции
5045
  * ecx = дескриптор фьютекса
5046
  * edx = сколько ожидающих будить (максимум)
5047
Возвращаемое значение:
5048
  * eax = количество разбуженых
5049
 
5050
---------------------- Константы для регистров: ----------------------
5051
  eax - SF_FUTEX (77)
5052
  ebx - SSF_WAKE (3)
5053
======================================================================
9829 vitalkrilo 5054
======= Функция 77, подфункция 10, Прочитать из файла в буфер. =======
5055
======================================================================
5056
Параметры:
5057
  * eax = 77 - номер функции
5058
  * ebx = 10 - номер подфункции
5059
  * ecx = дескриптор файла
5060
  * edx = указатель на буфер, куда читать
5061
  * esi = сколько байт прочитать
5062
Возвращаемое значение:
5063
  * eax = количество прочитанных байт
5064
 
5065
---------------------- Константы для регистров: ----------------------
5066
  eax - SF_FUTEX (77)
5067
  ebx - ...
5068
======================================================================
5069
======== Функция 77, подфункция 11, Записать из буфера в файл. =======
5070
======================================================================
5071
Параметры:
5072
  * eax = 77 - номер функции
5073
  * ebx = 11 - номер подфункции
5074
  * ecx = дескриптор файла
5075
  * edx =  указатель на буфер, откуда брать данные для записи
5076
  * esi = сколько байт записать
5077
Возвращаемое значение:
5078
  * eax = количество записанных байт
5079
 
5080
---------------------- Константы для регистров: ----------------------
5081
  eax - SF_FUTEX (77)
5082
  ebx - ...
5083
======================================================================
5084
=========== Функция 77, подфункция 13, Создать новый pipe. ===========
5085
======================================================================
5086
Создает новый pipe. В 4 байта по адресу pipefd будет записан
5087
дескриптор для чтения из канала.
5088
В 4 байта по адресу pipefd + 4 будет записан дескриптор для записи в
5089
канал.
5090
Параметры:
5091
  * eax = 77 - номер функции
5092
  * ebx = 13 - номер подфункции
5093
  * ecx = адрес pipefd
5094
  * edx = флаги. На данный момент если поднят O_CLOEXEC (0x40000), то
5095
    сисфункция завершится с ошибкой. Поэтому в качестве флагов можно
5096
    передать просто 0.
5097
Возвращаемое значение:
5098
  * eax = 0 если успех, иначе ошибка.
5099
 
5100
---------------------- Константы для регистров: ----------------------
5101
  eax - SF_FUTEX (77)
5102
  ebx - ...
5103
======================================================================
3539 clevermous 5104
========== Функция -1 - завершить выполнение потока/процесса =========
77 diamond 5105
======================================================================
3539 clevermous 5106
Параметры:
5107
  * eax = -1 - номер функции
5108
Возвращаемое значение:
5109
  * функция не возвращает ни значения, ни управления
5110
Замечания:
5111
  * Если процесс явно не создавал потоков, то у него есть только
5112
    один поток, завершение которого приводит к завершению процесса.
5113
  * Если текущий поток - последний в процессе, то его завершение
5114
    также приводит к завершению процесса.
5115
  * Эта функция завершает текущий поток. Другой поток можно прибить
5116
    вызовом подфункции 2 функции 18.
77 diamond 5117
 
6056 IgorA 5118
---------------------- Константы для регистров: ----------------------
5119
  eax - SF_TERMINATE_PROCESS (-1)
77 diamond 5120
======================================================================
6798 pathoswith 5121
=== Функция 80 - работа с файловой системой с указанием кодировки. ===
5122
======================================================================
5123
Параметры:
5124
  * eax = 80
5125
  * ebx = указатель на информационную структуру
5126
Возвращаемое значение:
5127
  * eax = 0 - успешно; иначе код ошибки файловой системы
5128
  * в зависимости от подфункции может возвращаться значение и
5129
    в других регистрах
5130
Общий формат информационной структуры:
5131
  * +0: dword: номер подфункции
5132
  * +4: dword: смещение в файле или папке
5133
  * +8: dword: старшая часть смещения или поле флагов
5134
  * +12 = +0xC: dword: размер данных
5135
  * +16 = +0x10: dword: указатель на данные
5136
  * +20 = +0x14: dword: кодировка строки:
5137
    1 = cp866
5138
    2 = UTF-16LE
5139
    3 = UTF-8
5140
 
5141
  * +24 = +0x18: dword: указатель на строку пути (заканчивается нулём)
5142
 
5143
В остальном полностью соответствует функции 70.
5144
 
5145
======================================================================
3539 clevermous 5146
=========================== Список событий ===========================
77 diamond 5147
======================================================================
3539 clevermous 5148
Очередное событие можно получить вызовом одной из функций 10
5149
(ожидать события), 11 (проверить без ожидания), 23
5150
(ожидать в течение заданного времени).
5151
Эти функции возвращают только те события, которые входят в маску,
5152
устанавливаемую функцией 40. По умолчанию это первые три, чего
5153
вполне достаточно для многих приложений.
5154
Коды событий:
5155
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
5156
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
5157
    активно) или нажата "горячая клавиша";
5158
    сбрасывается, когда все клавиши из буфера считаны функцией 2
5159
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
5160
    закрытия, созданная неявно функцией 0; кнопка минимизации
5161
    обрабатывается системой и о ней сообщения не приходит;
5162
    поступает, только когда окно активно; сбрасывается, когда все
5163
    кнопки из буфера считаны функцией 17)
5164
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
5165
    при размаскировке функцией 40)
5166
  * 5 = завершилась перерисовка фона рабочего стола
5167
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
5168
    или перемещение; сбрасывается при прочтении)
5169
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
5170
    Communication; сбрасывается при прочтении)
5171
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
5172
    смотри работу с сетью)
5173
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
5174
    смотри отладочную подсистему)
5175
  * 16..31 = произошло событие с соответствующим IRQ
5176
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
77 diamond 5177
 
5178
======================================================================
3539 clevermous 5179
==================== Коды ошибок файловой системы ====================
77 diamond 5180
======================================================================
3539 clevermous 5181
  * 0 = успешно
5182
  * 2 = функция не поддерживается для данной файловой системы
5183
  * 3 = неизвестная файловая система
5184
  * 5 = файл не найден
5185
  * 6 = файл закончился
5186
  * 7 = указатель вне памяти приложения
5187
  * 8 = диск заполнен
6235 pathoswith 5188
  * 9 = ошибка файловой системы
3539 clevermous 5189
  * 10 = доступ запрещён
5190
  * 11 = ошибка устройства
6235 pathoswith 5191
  * 12 = файловой системе недостаточно оперативной памяти
5192
 
3539 clevermous 5193
При запуске программы возможны также следующие коды ошибок:
5194
  * 30 = 0x1E = недостаточно памяти
5195
  * 31 = 0x1F = файл не является исполнимым
5196
  * 32 = 0x20 = слишком много процессов