Subversion Repositories Kolibri OS

Rev

Rev 10002 | 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
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
77 diamond 1289
======================================================================
3539 clevermous 1290
Раскладка клавиатуры используется для преобразования сканкодов,
1291
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1292
Параметры:
1293
  * eax = 21 - номер функции
1294
  * ebx = 2 - номер подфункции
1295
  * ecx = какую раскладку устанавливать:
1296
    * 1 = нормальную
1297
    * 2 = раскладку при нажатом Shift
1298
    * 3 = раскладку при нажатом Alt
1299
  * edx = указатель на раскладку - таблицу длиной 128 байт
1300
Или:
77 diamond 1301
  * ecx = 9
3539 clevermous 1302
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1303
Возвращаемое значение:
1304
  * eax = 0 - успешно
1305
  * eax = 1 - параметр задан неверно
1306
Замечания:
1307
  * Если нажат Alt, то используется раскладка с Alt;
1308
    если не нажат Alt, но нажат Shift, то
1309
    используется раскладка с Shift;
1310
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1311
    нормальная раскладка, после чего из кода вычитается 0x60;
1312
    если не нажата ни одна из управляющих клавиш, то используется
1313
    нормальная раскладка.
3780 Serge 1314
  * Получить раскладки и идентификатор страны можно с помощью
3539 clevermous 1315
    подфункции 2 функции 26.
1316
  * Идентификатор страны - глобальная системная переменная, которая
5452 leency 1317
    самим ядром не используется; однако приложение @taskbar отображает
3539 clevermous 1318
    соответствующую текущей стране иконку.
5452 leency 1319
  * Приложение @taskbar переключает раскладки по запросу пользователя.
77 diamond 1320
 
6056 IgorA 1321
---------------------- Константы для регистров: ----------------------
1322
  eax - SF_SYSTEM_SET (21)
1323
  ebx - SSF_KEYBOARD_LAYOUT (2)
77 diamond 1324
======================================================================
3539 clevermous 1325
========= Функция 21, подфункция 5 - установить язык системы. ========
77 diamond 1326
======================================================================
3539 clevermous 1327
Параметры:
1328
  * eax = 21 - номер функции
1329
  * ebx = 5 - номер подфункции
1330
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1331
Возвращаемое значение:
77 diamond 1332
  * eax = 0
3539 clevermous 1333
Замечания:
1334
  * Язык системы - глобальная системная переменная, никак
5452 leency 1335
    не используемая самим ядром, однако приложение @taskbar рисует
3539 clevermous 1336
    соответствующую иконку.
1337
  * Проверок на корректность не делается, поскольку ядро эту
1338
    переменную не использует.
1339
  * Получить язык системы можно вызовом подфункции 5 функции 26.
77 diamond 1340
 
6056 IgorA 1341
---------------------- Константы для регистров: ----------------------
1342
  eax - SF_SYSTEM_SET (21)
1343
  ebx - SSF_SYS_LANG (5)
77 diamond 1344
======================================================================
3539 clevermous 1345
====================== Функция 21, подфункция 11 =====================
1346
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
77 diamond 1347
======================================================================
3539 clevermous 1348
Параметры:
1349
  * eax = 21 - номер функции
1350
  * ebx = 11 - номер подфункции
1351
  * ecx = 0/1 - запретить/разрешить
1352
Возвращаемое значение:
77 diamond 1353
  * eax = 0
3539 clevermous 1354
Замечания:
1355
  * Используется при LBA-чтении (подфункция 8 функции 58).
1356
  * Текущая реализация использует только младший бит ecx.
1357
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
77 diamond 1358
 
6056 IgorA 1359
---------------------- Константы для регистров: ----------------------
1360
  eax - SF_SYSTEM_SET (21)
1361
  ebx - SSF_ACCESS_HD_LBA (11)
77 diamond 1362
======================================================================
3539 clevermous 1363
====================== Функция 21, подфункция 12 =====================
1364
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
77 diamond 1365
======================================================================
3539 clevermous 1366
Параметры:
1367
  * eax = 21 - номер функции
1368
  * ebx = 12 - номер подфункции
1369
  * ecx = 0/1 - запретить/разрешить
1370
Возвращаемое значение:
77 diamond 1371
  * eax = 0
3539 clevermous 1372
Замечания:
1373
  * Используется при работе с шиной PCI (функция 62).
1374
  * Текущая реализация использует только младший бит ecx.
1375
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
77 diamond 1376
 
6056 IgorA 1377
---------------------- Константы для регистров: ----------------------
1378
  eax - SF_SYSTEM_SET (21)
1379
  ebx - SSF_ACCESS_PCI (12)
77 diamond 1380
======================================================================
3539 clevermous 1381
============ Функция 22 - установить системную дату/время. ===========
77 diamond 1382
======================================================================
3539 clevermous 1383
Параметры:
1384
  * eax = 22 - номер функции
1385
  * ebx = 0 - установить время
1386
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1387
    * HH=час 00..23
1388
    * MM=минута 00..59
1389
    * SS=секунда 00..59
1390
  * ebx = 1 - установить дату
1391
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1392
    * DD=день 01..31
1393
    * MM=месяц 01..12
1394
    * YY=год 00..99
1395
  * ebx = 2 - установить день недели
1396
    * ecx = 1 для воскресенья, ..., 7 для субботы
1397
  * ebx = 3 - установить будильник
77 diamond 1398
    * ecx = 0x00SSMMHH
3539 clevermous 1399
Возвращаемое значение:
1400
  * eax = 0 - успешно
1401
  * eax = 1 - параметр задан неверно
1402
  * eax = 2 - CMOS-батарейки разрядились
1403
Замечания:
1404
  * Ценность установки дня недели представляется сомнительной,
1405
    поскольку он мало где используется
1406
    (день недели можно рассчитать по дате).
1407
  * Будильник можно установить на срабатывание в заданное время
1408
    каждые сутки. При этом отключить его существующими системными
1409
    функциями нельзя.
1410
  * Срабатывание будильника заключается в генерации IRQ8.
1411
  * Вообще-то CMOS поддерживает для будильника установку значения
1412
    0xFF в качестве одного из параметров и означает это, что
1413
    соответствующий параметр игнорируется. Но в текущей реализации
1414
    это не пройдёт (вернётся значение 1).
1415
  * Будильник - глобальный системный ресурс; установка будильника
1416
    автоматически отменяет предыдущую установку. Впрочем, на данный
1417
    момент ни одна программа его не использует.
77 diamond 1418
 
6056 IgorA 1419
---------------------- Константы для регистров: ----------------------
1420
  eax - SF_SET_TIME_DATE (22)
77 diamond 1421
======================================================================
3539 clevermous 1422
============== Функция 23 - ожидать события с таймаутом. =============
77 diamond 1423
======================================================================
3539 clevermous 1424
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1425
но не более указанного времени. Затем считывает сообщение из очереди.
77 diamond 1426
 
3539 clevermous 1427
Параметры:
1428
  * eax = 23 - номер функции
1429
  * ebx = таймаут (в сотых долях секунды)
1430
Возвращаемое значение:
1431
  * eax = 0 - очередь сообщений пуста
1432
  * иначе eax = событие (смотри список событий)
1433
Замечания:
1434
  * Учитываются только те события, которые входят в маску,
1435
    устанавливаемую функцией 40. По умолчанию это события
1436
    перерисовки, нажатия на клавиши и на кнопки.
1437
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1438
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1439
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1440
  * При текущей реализации произойдёт немедленный возврат из функции
1441
    с eax=0, если сложение ebx с текущим значением счётчика времени
1442
    вызовет 32-битное переполнение.
77 diamond 1443
 
6056 IgorA 1444
---------------------- Константы для регистров: ----------------------
1445
  eax - SF_WAIT_EVENT_TIMEOUT (23)
77 diamond 1446
======================================================================
3539 clevermous 1447
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
588 diamond 1448
======================================================================
9995 Doczom 1449
 
1450
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
1451
 
3539 clevermous 1452
Параметры:
1453
  * eax = 24 - номер функции
1454
  * ebx = 4 - номер подфункции
1455
  * ecx = номер CD/DVD-диска
4711 mario79 1456
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1457
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1458
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
3539 clevermous 1459
Возвращаемое значение:
1460
  * функция не возвращает значения
1461
Замечания:
1462
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1463
  * При извлечении лотка производится разблокировка ручного управления
1464
    механизмом лотка.
1465
  * При извлечении лотка код производит очистку кэша соответствующего
1466
    устройства.
1467
  * Примером использования функции является приложение CD_tray.
588 diamond 1468
 
6056 IgorA 1469
---------------------- Константы для регистров: ----------------------
1470
  eax - SF_CD (24)
1471
  ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5)
588 diamond 1472
======================================================================
3539 clevermous 1473
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
588 diamond 1474
======================================================================
9995 Doczom 1475
 
1476
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
1477
 
3539 clevermous 1478
Параметры:
1479
  * eax = 24 - номер функции
1480
  * ebx = 5 - номер подфункции
1481
  * ecx = номер CD/DVD-диска
4711 mario79 1482
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1483
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1484
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
3539 clevermous 1485
Возвращаемое значение:
1486
  * функция не возвращает значения
1487
Замечания:
1488
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1489
  * Примером использования функции является приложение CD_tray.
588 diamond 1490
 
6056 IgorA 1491
---------------------- Константы для регистров: ----------------------
1492
  eax - SF_CD (24)
1493
  ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5)
588 diamond 1494
======================================================================
3539 clevermous 1495
========== Функция 25 - записать область на слой фона. ===============
2509 mario79 1496
======================================================================
3539 clevermous 1497
Параметры:
1498
  * eax = 25 - номер функции
1499
  * ebx = указатель на предварительно выделенную область памяти,
1500
      где размещено исходное изображение в формате BBGGRRTTBBGGRRTT...
1501
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1502
  * edx = [координата по оси x]*65536 + [координата по оси y]
1503
Возвращаемое значение:
1504
  * функция не возвращает значения
1505
Замечания:
1506
  * Координаты области - это координаты верхнего левого угла
1507
    области относительно экрана.
1508
  * Размер изображения в байтах есть 4*xsize*ysize.
1509
  * TT - байт указатель прозрачности, в настоящее время:
1510
         от 1 до FF - непрозрачно, от 0 - прозрачно.
1511
  * Функция размещает изображение не на фоновое изображение (ф.15),
1512
    а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
2509 mario79 1513
 
6056 IgorA 1514
---------------------- Константы для регистров: ----------------------
1515
  eax - SF_SCREEN_PUT_IMAGE (25)
2509 mario79 1516
======================================================================
3539 clevermous 1517
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
77 diamond 1518
======================================================================
3539 clevermous 1519
Раскладка клавиатуры используется для преобразования сканкодов,
1520
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1521
Параметры:
1522
  * eax = 26 - номер функции
1523
  * ebx = 2 - номер подфункции
1524
  * ecx = какую раскладку получать:
1525
    * 1 = нормальную
1526
    * 2 = раскладку при нажатом Shift
1527
    * 3 = раскладку при нажатом Alt
1528
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1529
    раскладка
1530
Возвращаемое значение:
8161 rgimad 1531
  * функция не возвращает значения,
1532
    но, если указатель в edx недопустимый, например,
1533
    регион [edx, edx + 128) пересекается с памятью ядра,
1534
    то тогда функция возвращает -1
3539 clevermous 1535
Или:
1536
  * eax = 26 - номер функции
1537
  * ebx = 2 - номер подфункции
77 diamond 1538
  * ecx = 9
3539 clevermous 1539
Возвращаемое значение:
1540
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1541
Замечания:
1542
  * Если нажат Alt, то используется раскладка с Alt;
1543
    если не нажат Alt, но нажат Shift, то используется
1544
    раскладка с Shift;
1545
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1546
    нормальная раскладка, после чего из кода вычитается 0x60;
1547
    если не нажата ни одна из управляющих клавиш, то используется
1548
    нормальная раскладка.
3780 Serge 1549
  * Установить раскладки и идентификатор страны можно с помощью
3539 clevermous 1550
    подфункции 2 функции 21.
1551
  * Идентификатор страны - глобальная системная переменная, которая
5452 leency 1552
    самим ядром не используется; однако приложение @taskbar отображает
3539 clevermous 1553
    соответствующую текущей стране иконку
1554
    (используя описываемую функцию).
5452 leency 1555
  * Приложение @taskbar переключает раскладки по запросу пользователя.
77 diamond 1556
 
6056 IgorA 1557
---------------------- Константы для регистров: ----------------------
1558
  eax - SF_SYSTEM_GET (26)
1559
  ebx - SSF_KEYBOARD_LAYOUT (2)
77 diamond 1560
======================================================================
3539 clevermous 1561
========== Функция 26, подфункция 5 - получить язык системы. =========
77 diamond 1562
======================================================================
3539 clevermous 1563
Параметры:
1564
  * eax = 26 - номер функции
1565
  * ebx = 5 - номер подфункции
1566
Возвращаемое значение:
1567
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1568
Замечания:
1569
  * Язык системы - глобальная системная переменная, никак
5452 leency 1570
    не используемая самим ядром, однако приложение @taskbar рисует
3539 clevermous 1571
    соответствующую иконку (используя описываемую функцию).
1572
  * Установить язык системы можно вызовом подфункции 5 функции 21.
77 diamond 1573
 
6056 IgorA 1574
---------------------- Константы для регистров: ----------------------
1575
  eax - SF_SYSTEM_GET (26)
1576
  ebx - SSF_SYS_LANG (5)
77 diamond 1577
======================================================================
3539 clevermous 1578
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
77 diamond 1579
======================================================================
3539 clevermous 1580
Параметры:
1581
  * eax = 26 - номер функции
1582
  * ebx = 9 - номер подфункции
1583
Возвращаемое значение:
1584
  * eax = число сотых долей секунды, прошедших с момента
1585
    запуска системы
1586
Замечания:
1587
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1588
    497 суток.
1589
  * Системное время можно получить функцией 3.
77 diamond 1590
 
6056 IgorA 1591
---------------------- Константы для регистров: ----------------------
1592
  eax - SF_SYSTEM_GET (26)
1593
  ebx - SSF_TIME_COUNT (9)
77 diamond 1594
======================================================================
5813 serge 1595
===================== Функция 26, подфункция 10 ======================
1596
========== Получить значение высокоточного счётчика времени. =========
1597
======================================================================
1598
Parameters:
1599
  * eax = 26 - номер функции
1600
  * ebx = 10 - номер подфункции
1601
Returned value:
1602
  * edx:eax = число наносекунд с момента загрузки ядра
1603
  * eax = младшее двойное слово
6473 pathoswith 1604
  * edx = старшее двойное слово
5813 serge 1605
Remarks:
1606
  * функция использует счётчик HPET, если HPET не доступен используется
1607
    счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
1608
    наносекунд.
1609
 
6056 IgorA 1610
---------------------- Константы для регистров: ----------------------
1611
  eax - SF_SYSTEM_GET (26)
1612
  ebx - SSF_TIME_COUNT_PRO (10)
5813 serge 1613
======================================================================
3539 clevermous 1614
====================== Функция 26, подфункция 11 =====================
1615
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
77 diamond 1616
======================================================================
3539 clevermous 1617
Параметры:
1618
  * eax = 26 - номер функции
1619
  * ebx = 11 - номер подфункции
1620
Возвращаемое значение:
1621
  * eax = 0/1 - запрещён/разрешён
1622
Замечания:
1623
  * Используется при LBA-чтении (подфункция 8 функции 58).
3780 Serge 1624
  * Установить текущее состояние можно вызовом
3539 clevermous 1625
    подфункции 11 функции 21.
77 diamond 1626
 
6056 IgorA 1627
---------------------- Константы для регистров: ----------------------
1628
  eax - SF_SYSTEM_GET (26)
1629
  ebx - SSF_ACCESS_HD_LBA (11)
77 diamond 1630
======================================================================
3539 clevermous 1631
====================== Функция 26, подфункция 12 =====================
1632
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
77 diamond 1633
======================================================================
3539 clevermous 1634
Параметры:
1635
  * eax = 26 - номер функции
1636
  * ebx = 12 - номер подфункции
1637
Возвращаемое значение:
1638
  * eax = 0/1 - запрещён/разрешён
1639
Замечания:
1640
  * Используется при работе с шиной PCI (функция 62).
1641
  * Текущая реализация использует только младший бит ecx.
3780 Serge 1642
  * Установить текущее состояние можно вызовом
3539 clevermous 1643
    подфункции 12 функции 21.
77 diamond 1644
 
6056 IgorA 1645
---------------------- Константы для регистров: ----------------------
1646
  eax - SF_SYSTEM_GET (26)
1647
  ebx - SSF_ACCESS_PCI (12)
77 diamond 1648
======================================================================
3539 clevermous 1649
================ Функция 29 - получить системную дату. ===============
77 diamond 1650
======================================================================
3539 clevermous 1651
Параметры:
1652
  * eax = 29 - номер функции
1653
Возвращаемое значение:
1654
  * eax = 0x00DDMMYY, где
1655
    (используется двоично-десятичное кодирование, BCD)
1656
  * YY = две младшие цифры года (00..99)
1657
  * MM = месяц (01..12)
1658
  * DD = день (01..31)
1659
Замечания:
1660
  * Системную дату можно установить функцией 22.
77 diamond 1661
 
6056 IgorA 1662
---------------------- Константы для регистров: ----------------------
1663
  eax - SF_GET_SYS_DATE (29)
77 diamond 1664
======================================================================
3539 clevermous 1665
================ Функция 30 - работа с текущей папкой. ===============
521 diamond 1666
======================================================================
3539 clevermous 1667
-------- Подфункция 1 - установить текущую папку для потока. ---------
1668
Параметры:
1669
  * eax = 30 - номер функции
1670
  * ebx = 1 - номер подфункции
6473 pathoswith 1671
  * ecx = указатель на строку с путём к новой текущей папке,
1672
    правила формирования строки указаны в описании функции 70.
3539 clevermous 1673
Возвращаемое значение:
1674
  * функция не возвращает значения
6798 pathoswith 1675
----------------------------------------------------------------------
3539 clevermous 1676
--------- Подфункция 2 - получить текущую папку для потока. ----------
1677
Параметры:
1678
  * eax = 30 - номер функции
1679
  * ebx = 2 - номер подфункции
1680
  * ecx = указатель на буфер
1681
  * edx = размер буфера
1682
Возвращаемое значение:
6798 pathoswith 1683
  * eax = длина строки (включая завершающий 0)
3539 clevermous 1684
Замечания:
6798 pathoswith 1685
  * Если размера буфера недостаточно для копирования всего пути,
1686
    копируются только часть строки и в конце ставится завершающий 0.
3539 clevermous 1687
  * По умолчанию, текущая папка для потока - "/rd/1".
1688
  * При создании процесса/потока текущая папка наследуется от
1689
    родителя.
6798 pathoswith 1690
----------------------------------------------------------------------
3663 mario79 1691
---- Подфункция 3 - установить доп. системную директорию для ядра ----
1692
Параметры:
1693
  * eax = 30 - номер функции
1694
  * ebx = 3 - номер подфункции
1695
  * ecx = указатель на блок данных:
6473 pathoswith 1696
key     rb  64
1697
path    rb  64
1698
    Пример:
1699
align 64
1700
key     db  'kolibrios',0   ; ключ должен быть в нижнем регистре
1701
align 64
1702
path    db  'HD0/1',0
1703
 
3663 mario79 1704
Возвращаемое значение:
1705
  * функция не возвращает значения
1706
Замечания:
1707
  * Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
6798 pathoswith 1708
  * При вводе пути символьный ключ не зависит от кодировки.
1709
----------------------------------------------------------------------
1710
--- Подфункция 4 - установить текущую папку с указанием кодировки. ---
6473 pathoswith 1711
Параметры:
1712
  * eax = 30 - номер функции
1713
  * ebx = 4 - номер подфункции
6798 pathoswith 1714
  * ecx = указатель на строку с путём к новой текущей папке
1715
  * edx = кодировка строки, подробности указаны в описании функции 80.
1716
Возвращаемое значение:
1717
  * функция не возвращает значения
1718
----------------------------------------------------------------------
1719
---- Подфункция 5 - получить текущую папку с указанием кодировки. ----
1720
Параметры:
1721
  * eax = 30 - номер функции
1722
  * ebx = 5 - номер подфункции
6473 pathoswith 1723
  * ecx = указатель на буфер
1724
  * edx = размер буфера
6798 pathoswith 1725
  * esi = кодировка строки
6473 pathoswith 1726
Возвращаемое значение:
6798 pathoswith 1727
  * eax = длина строки в байтах (включая завершающий 0)
6473 pathoswith 1728
Замечания:
6798 pathoswith 1729
  * Если размера буфера недостаточно для копирования всего пути,
1730
    копируются только часть строки и в конце ставится завершающий 0.
6473 pathoswith 1731
  * По умолчанию, текущая папка для потока - "/rd/1".
1732
  * При создании процесса/потока текущая папка наследуется от
1733
    родителя.
1734
 
6056 IgorA 1735
---------------------- Константы для регистров: ----------------------
1736
  eax - SF_CURRENT_FOLDER (30)
1737
  ebx - SSF_SET_CF (1), SSF_GET_CF (2), SSF_ADD_SYS_FOLDER (3)
521 diamond 1738
======================================================================
3539 clevermous 1739
========= Функция 34 - узнать кому принадлежит точка экрана. =========
2511 mario79 1740
======================================================================
3539 clevermous 1741
Параметры:
1742
  * eax = 34 - номер функции
1743
  * ebx = x-координата (относительно экрана)
1744
  * ecx = y-координата (относительно экрана)
2511 mario79 1745
 
3539 clevermous 1746
Возвращаемое значение:
1747
  * eax = 0x000000XX - точка принадлежит слоту окна N
1748
    При некорректных значениях ebx и ecx функция возвращает 0
1749
  * Функция берет значения из области [_WinMapAddress]
2511 mario79 1750
 
6056 IgorA 1751
---------------------- Константы для регистров: ----------------------
1752
  eax - SF_GET_PIXEL_OWNER (34)
2511 mario79 1753
======================================================================
3539 clevermous 1754
============ Функция 35 - прочитать цвет точки на экране. ============
77 diamond 1755
======================================================================
3539 clevermous 1756
Параметры:
77 diamond 1757
  * eax = 35
3539 clevermous 1758
  * ebx = y*xsize+x, где
1759
  * (x,y) = координаты точки (считая от 0)
1760
  * xsize = размер экрана по горизонтали
1761
Возвращаемое значение:
1762
  * eax = цвет 0x00RRGGBB
1763
Замечания:
1764
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1765
    что она вычитает 1 из обоих размеров.
1766
  * К видеопамяти есть также прямой доступ (без вызовов системных
1767
    функций) через селектор gs. Параметры текущего видеорежима
1768
    можно получить функцией 61.
77 diamond 1769
 
6056 IgorA 1770
---------------------- Константы для регистров: ----------------------
1771
  eax - SF_GET_PIXEL (35)
77 diamond 1772
======================================================================
3539 clevermous 1773
=============== Функция 36 - прочитать область экрана. ===============
921 mario79 1774
======================================================================
3539 clevermous 1775
Параметры:
1776
  * eax = 36 - номер функции
1777
  * ebx = указатель на предварительно выделенную область памяти,
1778
            куда будет помещено изображение в формате BBGGRRBBGGRR...
1779
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1780
  * edx = [координата по оси x]*65536 + [координата по оси y]
1781
Возвращаемое значение:
1782
  * функция не возвращает значения
1783
Замечания:
1784
  * Координаты области - это координаты верхнего левого угла
1785
    области относительно экрана.
1786
  * Размер изображения в байтах есть 3*xsize*ysize.
921 mario79 1787
 
6056 IgorA 1788
---------------------- Константы для регистров: ----------------------
1789
  eax - SF_GET_IMAGE (36)
921 mario79 1790
======================================================================
3539 clevermous 1791
==================== Функция 37 - работа с мышью. ====================
77 diamond 1792
======================================================================
1793
 
3539 clevermous 1794
-------------- Подфункция 0 - экранные координаты мыши ---------------
1795
Параметры:
1796
  * eax = 37 - номер функции
1797
  * ebx = 0 - номер подфункции
1798
Возвращаемое значение:
1799
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
77 diamond 1800
 
3539 clevermous 1801
---------- Подфункция 1 - координаты мыши относительно окна ----------
1802
Параметры:
1803
  * eax = 37 - номер функции
1804
  * ebx = 1 - номер подфункции
1805
Возвращаемое значение:
1806
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1807
    окна приложения (считая от 0)
1808
Замечания:
1809
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1810
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1811
    относительную y-координату, а старшее - относительную x-координату
1812
    (правильного знака). В противном случае младшее слово отрицательно
1813
    и всё равно содержит относительную y-координату,
1814
    а к старшему слову следует прибавить 1.
77 diamond 1815
 
5851 pathoswith 1816
---------------- Подфункция 2 - состояния кнопок мыши ----------------
3539 clevermous 1817
Параметры:
1818
  * eax = 37 - номер функции
1819
  * ebx = 2 - номер подфункции
1820
Возвращаемое значение:
5851 pathoswith 1821
  * eax = биты 0-4 соответствуют подфункции 3
77 diamond 1822
 
5851 pathoswith 1823
----------- Подфункция 3 - состояния и события кнопок мыши -----------
1824
Параметры:
1825
  * eax = 37 - номер функции
1826
  * ebx = 3 - номер подфункции
1827
Возвращаемое значение:
1828
  * eax содержит следующую информацию:
1829
 
1830
состояния:
1831
  * бит 0 установлен = удерживается левая кнопка
1832
  * бит 1 установлен = удерживается правая кнопка
1833
  * бит 2 установлен = удерживается средняя кнопка
1834
  * бит 3 установлен = удерживается 4-я кнопка
1835
  * бит 4 установлен = удерживается 5-я кнопка
1836
 
1837
события:
1838
  * бит 8 установлен  = нажата левая кнопка
1839
  * бит 9 установлен  = нажата правая кнопка
1840
  * бит 10 установлен = нажата средняя кнопка
1841
 
1842
  * бит 15 установлен = используется вертикальная прокрутка
1843
 
1844
  * бит 16 установлен = отпущена левая кнопка
1845
  * бит 17 установлен = отпущена правая кнопка
1846
  * бит 18 установлен = отпущена средняя кнопка
1847
 
1848
  * бит 23 установлен = используется горизонтальная прокрутка
1849
 
1850
  * бит 24 установлен = двойной щелчёк левой кнопкой
1851
 
3539 clevermous 1852
------------------ Подфункция 4 - загрузить курсор -------------------
1853
Параметры:
1854
  * eax = 37 - номер функции
1855
  * ebx = 4 - номер подфункции
1856
  * dx = источник данных:
1857
  * dx = LOAD_FROM_FILE = 0 - данные в файле
1858
    * ecx = указатель на полный путь к файлу курсора
1859
    * файл курсора должен быть в формате .cur, стандартном для
1860
      MS Windows, причём размером 32*32 пикселя
1861
  * dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
1862
    * ecx = указатель на данные файла курсора
1863
    * формат данных такой же, как и в предыдущем случае
1864
  * dx = LOAD_INDIRECT = 2 - данные в памяти
1865
    * ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
1866
    * edx = 0xXXYY0002, где
1867
      * XX = x-координата "горячей точки" курсора
1868
      * YY = y-координата
277 diamond 1869
      * 0 <= XX, YY <= 31
3539 clevermous 1870
Возвращаемое значение:
1871
  * eax = 0 - неудача
1872
  * иначе eax = хэндл курсора
221 serge 1873
 
3539 clevermous 1874
------------------ Подфункция 5 - установить курсор ------------------
1875
Устанавливает новый курсор для окна текущего потока.
1876
Параметры:
1877
  * eax = 37 - номер функции
1878
  * ebx = 5 - номер подфункции
1879
  * ecx = хэндл курсора
1880
Возвращаемое значение:
1881
  * eax = хэндл предыдущего установленного курсора
1882
Замечания:
1883
  * Если передан некорректный хэндл, то функция восстановит курсор
1884
    по умолчанию (стандартную стрелку). В частности, к восстановлению
1885
    курсора по умолчанию приводит передача ecx=0.
221 serge 1886
 
3539 clevermous 1887
------------------- Подфункция 6 - удалить курсор --------------------
1888
Параметры:
1889
  * eax = 37 - номер функции
1890
  * ebx = 6 - номер подфункции
1891
  * ecx = хэндл курсора
1892
Возвращаемое значение:
1893
  * eax разрушается
1894
Замечания:
1895
  * Курсор должен был быть ранее загружен текущим потоком
1896
    (вызовом подфункции 4). Функция не удаляет системные курсоры и
1897
    курсоры, загруженные другими приложениями.
1898
  * Если удаляется активный (установленный подфункцией 5) курсор, то
1899
    восстанавливается курсор по умолчанию (стандартная стрелка).
221 serge 1900
 
3539 clevermous 1901
------------------ Подфункция 7 - данные прокрутки -------------------
1902
Параметры:
1903
  * eax = 37 - номер функции
1904
  * ebx = 7 - номер подфункции
1905
Возвращаемое значение:
499 diamond 1906
  * eax = [horizontal offset]*65536 + [vertical offset]
3539 clevermous 1907
Замечания:
1908
  * Данные доступны только активному окну.
1909
  * После прочтения значения обнуляются.
1910
  * Данные имеют знаковые значения.
486 kastigar 1911
 
6800 pathoswith 1912
------- Подфункция 8 - загрузить курсор с указанием кодировки. -------
1913
Параметры:
1914
  * eax = 37 - номер функции
1915
  * ebx = 8 - номер подфункции
1916
  * ecx = указатель на строку с путём к файлу курсора
1917
  * edx = кодировка строки, подробности указаны в описании функции 80.
1918
Возвращаемое значение:
1919
  * eax = хэндл курсора, 0 - неудача
1920
 
6056 IgorA 1921
---------------------- Константы для регистров: ----------------------
1922
  eax - SF_MOUSE_GET (37)
1923
  ebx - SSF_SCREEN_POSITION (0), SSF_WINDOW_POSITION (1),
1924
    SSF_BUTTON (2), SSF_BUTTON_EXT (3), SSF_LOAD_CURSOR (4),
1925
    SSF_SET_CURSOR (5), SSF_DEL_CURSOR (6), SSF_SCROLL_DATA (7)
77 diamond 1926
======================================================================
3539 clevermous 1927
================== Функция 38 - нарисовать отрезок. ==================
77 diamond 1928
======================================================================
3539 clevermous 1929
Параметры:
1930
  * eax = 38 - номер функции
1931
  * ebx = [координата начала по оси x]*65536 +
1932
              [координата конца по оси x]
1933
  * ecx = [координата начала по оси y]*65536 +
1934
              [координата конца по оси y]
1935
  * edx = 0x00RRGGBB - цвет
1936
    edx = 0x01xxxxxx - рисовать инверсный отрезок
1937
          (младшие 24 бита игнорируются)
1938
Возвращаемое значение:
1939
  * функция не возвращает значения
1940
Замечания:
1941
  * Координаты берутся относительно окна.
1942
  * Конечная точка также рисуется.
77 diamond 1943
 
6056 IgorA 1944
---------------------- Константы для регистров: ----------------------
1945
  eax - SF_DRAW_LINE (38)
77 diamond 1946
======================================================================
3539 clevermous 1947
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
77 diamond 1948
======================================================================
3539 clevermous 1949
Параметры:
1950
  * eax = 39 - номер функции
1951
  * ebx = 1 - номер подфункции
1952
Возвращаемое значение:
1953
  * eax = [ширина]*65536 + [высота]
1954
Замечания:
3780 Serge 1955
  * Есть парная команда установки размеров фонового изображения -
3539 clevermous 1956
    подфункция 1 функции 15. После которой, разумеется, следует
1957
    заново определить само изображение.
77 diamond 1958
 
6056 IgorA 1959
---------------------- Константы для регистров: ----------------------
1960
  eax - SF_BACKGROUND_GET (39)
77 diamond 1961
======================================================================
3539 clevermous 1962
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
77 diamond 1963
======================================================================
3539 clevermous 1964
Параметры:
1965
  * eax = 39 - номер функции
1966
  * ebx = 2 - номер подфункции
1967
  * ecx = смещение
1968
Возвращаемое значение:
1969
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
1970
    (меньше 0x160000-16)
1971
  * eax = 2 - иначе
1972
Замечания:
1973
  * Не следует полагаться на возвращаемое значение в случае неверного
1974
    смещения, оно может измениться в следующих версиях ядра.
1975
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
3780 Serge 1976
  * Есть парная функция установки точки на фоновом изображении -
3539 clevermous 1977
    подфункция 2 функции 15.
77 diamond 1978
 
6056 IgorA 1979
---------------------- Константы для регистров: ----------------------
9458 rgimad 1980
  eax - SF_BACKGROUND_GET_RECT (39)
1981
======================================================================
1982
== Функция 39, подфункция 3 - получить прямоугольную область фона    =
1983
======================================================================
1984
Параметры:
1985
  * eax = 39 - номер функции
1986
  * ebx = 3 - номер подфункции
1987
  * ecx = [x]*65536 + [y]
1988
  * edx = [width]*65536 + [height]
1989
  * esi = адрес буфера
1990
Возвращаемое значение:
1991
  * eax = 0 - успех
1992
  * eax = -1 - ошибка
1993
Замечания:
1994
  * Функция копирует указанную прямоугольную область в буфер в формате
1995
    0x00RRGGBB
1996
 
1997
---------------------- Константы для регистров: ----------------------
6056 IgorA 1998
  eax - SF_BACKGROUND_GET (39)
77 diamond 1999
======================================================================
3539 clevermous 2000
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
77 diamond 2001
======================================================================
3539 clevermous 2002
Параметры:
2003
  * eax = 39 - номер функции
2004
  * ebx = 4 - номер подфункции
2005
Возвращаемое значение:
2006
  * eax = 1 - замостить
2007
  * eax = 2 - растянуть
2008
Замечания:
3780 Serge 2009
  * Есть парная функция установки режима отрисовки фона -
3539 clevermous 2010
    подфункция 4 функции 15.
77 diamond 2011
 
6056 IgorA 2012
---------------------- Константы для регистров: ----------------------
2013
  eax - SF_BACKGROUND_GET (39)
77 diamond 2014
======================================================================
3539 clevermous 2015
======== Функция 40 - установить маску для ожидаемых событий. ========
77 diamond 2016
======================================================================
3539 clevermous 2017
Маска для ожидаемых событий влияет на функции работы с событиями 10,
2018
11, 23 - они сообщают только о событиях, разрешённых этой маской.
2019
Параметры:
2020
  * eax = 40 - номер функции
2021
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
2022
    (установленный бит разрешает извещение о событии)
3940 mario79 2023
    bit 31: фильтр активности событий мыши
2024
    bit 31 = 0 - неактивное окно всегда получает события от мыши
2025
    bit 31 = 1 - неактивное окно не получает события от мыши
2026
    bit 30: фильтр позиции курсора
2027
    bit 30 = 0 - окно принимает события мыши, если курсор
2028
                 за пределами окна
2029
    bit 30 = 1 - окно не принимает события мыши, если курсор
2030
                 за пределами окна
3539 clevermous 2031
Возвращаемое значение:
2032
  * eax = предыдущее значение маски
2033
Замечания:
2034
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
2035
    и нажатиях клавиш и кнопок.
2036
    Этого достаточно для большинства приложений.
2037
  * События, запрещённые в маске, всё равно сохраняются, если
2038
    приходят; о них просто не извещают функции работы с событиями.
2039
  * Функции работы с событиями учитывают маску на момент
2040
    вызова функции, а не на момент поступления сообщения.
77 diamond 2041
 
6056 IgorA 2042
---------------------- Константы для регистров: ----------------------
2043
  eax - SF_SET_EVENTS_MASK (40)
77 diamond 2044
======================================================================
3780 Serge 2045
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
77 diamond 2046
======================================================================
3539 clevermous 2047
К зарезервированным портам можно обращаться напрямую из приложения
9995 Doczom 2048
командами in/out .
3539 clevermous 2049
Параметры:
2050
  * eax = 46 - номер функции
2051
  * ebx = 0 - зарезервировать, 1 - освободить
2052
  * ecx = номер начала диапазона портов
2053
  * edx = номер конца диапазона портов (включительно)
2054
Возвращаемое значение:
2055
  * eax = 0 - успешно
2056
  * eax = 1 - ошибка
2057
Замечания:
2058
  * В случае резервирования портов ошибкой считается выполнение
2059
    одного из условий:
2060
    * начальный адрес больше конечного;
2061
    * указанный диапазон содержит некорректный номер порта
2062
      (корректные - от 0 до 0xFFFF);
2063
    * превышено ограничение на общее число зарезервированных областей
2064
      - допускается максимум 255;
2065
    * указанный диапазон пересекается с одним из
2066
      ранее зарезервированных
2067
  * В случае освобождения портов ошибкой считается попытка
2068
    освобождения диапазона, который ранее не был целиком
2069
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
2070
  * При обнаружении ошибки (в обоих случаях) никаких действий
2071
    не производится.
2072
  * При загрузке система резервирует за собой порты
2073
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (включительно).
2074
  * При завершении потока автоматически освобождаются все
2075
    зарезервированные им порты.
77 diamond 2076
 
6056 IgorA 2077
---------------------- Константы для регистров: ----------------------
2078
  eax - SF_SET_PORTS (46)
77 diamond 2079
======================================================================
3539 clevermous 2080
================= Функция 47 - вывести число в окно. =================
77 diamond 2081
======================================================================
3539 clevermous 2082
Параметры:
2083
  * eax = 47 - номер функции
2084
  * ebx = параметры преобразования числа в текст:
2085
    * bl = 0 - ecx содержит число
2086
    * bl = 1 - ecx содержит указатель на dword/qword-число
2087
    * bh = 0 - отображать в десятичной системе счисления
2088
    * bh = 1 - отображать в шестнадцатеричной системе
2089
    * bh = 2 - отображать в двоичной системе
2090
    * биты 16-21 = сколько цифр отображать
2091
    * биты 22-29 зарезервированы и должны быть установлены в 0
2092
    * бит 30 установлен = выводить qword (64-битное число);
2093
                              при этом должно быть bl = 1
2094
    * бит 31 установлен = не выводить ведущие нули числа
2095
  * ecx = число (при bl=0) или указатель (при bl=1)
2096
  * edx = [координата по оси x]*65536 + [координата по оси y]
6272 pathoswith 2097
  * esi = 0xXXRRGGBB, где
2098
    * RR, GG, BB задают цвет текста
2099
    * XX=0B0FCSSS (биты):
2100
      * B=1 - закрашивать фон (цвет = edi)
2101
      * F задает шрифт:
2102
 
2103
        1 = 8x16
2104
      * C=0 - рисовать в окно,
2105
        С=1 - рисовать в буфер (edi)
2106
      * SSS = (множитель размера)-1, то-есть 0 = x1, 7 = x8
3539 clevermous 2107
Возвращаемое значение:
2108
  * функция не возвращает значения
2109
Замечания:
2110
  * Указанная длина не должна превосходить 60.
2111
  * Выводится ровно указанное количество цифр. Если число мало и
2112
    может быть записано меньшим количеством цифр, оно дополняется
2113
    ведущими нулями; если число велико и не может быть записано
2114
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
77 diamond 2115
 
6056 IgorA 2116
---------------------- Константы для регистров: ----------------------
2117
  eax - SF_DRAW_NUMBER (47)
77 diamond 2118
======================================================================
3539 clevermous 2119
======= Функция 48, подфункция 0 - применить настройки экрана. =======
77 diamond 2120
======================================================================
3539 clevermous 2121
Параметры:
2122
  * eax = 48 - номер функции
2123
  * ebx = 0 - номер подфункции
2124
  * ecx = 0 - зарезервировано
2125
Возвращаемое значение:
2126
  * функция не возвращает значения
2127
Замечания:
2128
  * Функция перерисовывает экран после изменения параметров
2129
    подфункциями 1 и 2.
2130
  * Вызов функции без предшествующих вызовов указанных подфункций
2131
    игнорируется.
2132
  * Вызов функции с ненулевым ecx игнорируется.
77 diamond 2133
 
6056 IgorA 2134
---------------------- Константы для регистров: ----------------------
2135
  eax - SF_STYLE_SETTINGS (48)
2136
  ebx - SSF_APPLY (0)
77 diamond 2137
======================================================================
3539 clevermous 2138
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
77 diamond 2139
======================================================================
3539 clevermous 2140
Параметры:
2141
  * eax = 48 - номер функции
2142
  * ebx = 1 - номер подфункции
2143
  * ecx = тип кнопок:
2144
    * 0 = плоские
2145
    * 1 = объёмные
2146
Возвращаемое значение:
2147
  * функция не возвращает значения
2148
Замечания:
3780 Serge 2149
  * После вызова описываемой функции следует перерисовать экран
3539 clevermous 2150
    подфункцией 0.
2151
  * Тип кнопок влияет только на их прорисовку функцией 8.
77 diamond 2152
 
6056 IgorA 2153
---------------------- Константы для регистров: ----------------------
2154
  eax - SF_STYLE_SETTINGS (48)
2155
  ebx - SSF_SET_BUTTON_STYLE (1)
77 diamond 2156
======================================================================
3539 clevermous 2157
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
77 diamond 2158
======================================================================
3539 clevermous 2159
Параметры:
2160
  * eax = 48 - номер функции
2161
  * ebx = 2 - номер подфункции
2162
  * ecx = указатель на таблицу цветов
2163
  * edx = размер таблицы цветов
2164
    (должен быть 40 байт для будущей совместимости)
2165
Формат таблицы цветов указан в описании подфункции 3.
2166
Возвращаемое значение:
2167
  * функция не возвращает значения
2168
Замечания:
3780 Serge 2169
  * После вызова описываемой функции следует перерисовать экран
3539 clevermous 2170
    подфункцией 0.
2171
  * Таблица стандартных цветов влияет только на приложения,
2172
    которые эту таблицу явным образом получают (подфункцией 3) и
2173
    используют (указывая цвета из неё при вызовах функций рисования).
2174
  * Таблица стандартных цветов входит в скин и устанавливается заново
2175
    при установке скина (подфункции 8).
2176
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
2177
    приложения desktop.
77 diamond 2178
 
6056 IgorA 2179
---------------------- Константы для регистров: ----------------------
2180
  eax - SF_STYLE_SETTINGS (48)
2181
  ebx - SSF_SET_COLORS (2)
77 diamond 2182
======================================================================
3539 clevermous 2183
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
77 diamond 2184
======================================================================
3539 clevermous 2185
Параметры:
2186
  * eax = 48 - номер функции
2187
  * ebx = 3 - номер подфункции
2188
  * ecx = указатель на буфер размером edx байт,
2189
    куда будет записана таблица
2190
  * edx = размер таблицы цветов
2191
    (должен быть 40 байт для будущей совместимости)
2192
Возвращаемое значение:
2193
  * функция не возвращает значения
2194
Формат таблицы цветов: каждый элемент -
2195
dword-значение цвета 0x00RRGGBB
9052 leency 2196
  * +0: dword: none - зарезервировано
2197
  * +4: dword: none - зарезервировано
2198
  * +8: dword: work_dark - темный цвет рабочей области для придания
2199
    объемна элементам интерфейса
2200
  * +12 = +0xC: dword: work_light - светлый цвет рабочей области для
2201
    придания объемна элементам интерфейса
3539 clevermous 2202
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
2203
  * +20 = +0x14: dword: work - цвет рабочей области
9052 leency 2204
  * +24 = +0x18: dword: button - цвет кнопки в рабочей области
2205
  * +28 = +0x1C: dword: button_text - цвет текста на кнопке
3539 clevermous 2206
    в рабочей области
2207
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
9052 leency 2208
  * +36 = +0x24: dword: graph - цвет графики в рабочей области
3539 clevermous 2209
Замечания:
2210
  * Структура таблицы цветов описана в стандартном включаемом файле
2211
    macros.inc под названием system_colors; например, можно писать:
2212
    	sc	system_colors		; объявление переменной
2213
    	...				; где-то надо вызвать
2214
    					; описываемую функцию с ecx=sc
9052 leency 2215
    	mov	ecx, [sc.button_text]	; читаем цвет текста
3539 clevermous 2216
    					; на кнопке в рабочей области
2217
  * Использование/неиспользование этих цветов - дело исключительно
2218
    самой программы. Для использования нужно просто при вызове функций
2219
    рисования указывать цвет, взятый из этой таблицы.
2220
  * При изменении таблицы стандартных цветов (подфункцией 2 с
2221
    последующим применением изменений подфункцией 0 или
2222
    при установке скина подфункцией 8) всем окнам посылается сообщение
2223
    о необходимости перерисовки (событие с кодом 1).
2224
  * Стандартные цвета можно просматривать/изменять интерактивно
2225
    с помощью приложения desktop.
77 diamond 2226
 
6056 IgorA 2227
---------------------- Константы для регистров: ----------------------
2228
  eax - SF_STYLE_SETTINGS (48)
2229
  ebx - SSF_GET_COLORS (3)
77 diamond 2230
======================================================================
3539 clevermous 2231
========== Функция 48, подфункция 4 - получить высоту скина. =========
77 diamond 2232
======================================================================
3539 clevermous 2233
Параметры:
2234
  * eax = 48 - номер функции
2235
  * ebx = 4 - номер подфункции
2236
Возвращаемое значение:
2237
  * eax = высота скина
2238
Замечания:
2239
  * Высотой скина по определению считается высота заголовка окон,
2240
    использующих скин.
2241
  * Смотри также общую структуру окна в описании функции 0.
77 diamond 2242
 
6056 IgorA 2243
---------------------- Константы для регистров: ----------------------
2244
  eax - SF_STYLE_SETTINGS (48)
2245
  ebx - SSF_GET_SKIN_HEIGHT (4)
77 diamond 2246
======================================================================
3539 clevermous 2247
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
77 diamond 2248
======================================================================
3539 clevermous 2249
Параметры:
2250
  * eax = 48 - номер функции
2251
  * ebx = 5 - номер подфункции
2252
Возвращаемое значение:
77 diamond 2253
  * eax = [left]*65536 + [right]
2254
  * ebx = [top]*65536 + [bottom]
3539 clevermous 2255
Замечания:
2256
  * Рабочая область экрана определяет положение и координаты
2257
    максимизированного окна.
2258
  * Рабочая область экрана при нормальной работе есть весь экран
5452 leency 2259
    за вычетом панели (@taskbar).
3539 clevermous 2260
  * (left,top) - координаты левого верхнего угла,
2261
    (right,bottom) - координаты правого нижнего.
2262
    Таким образом, размер рабочей области по оси x определяется
8994 leency 2263
    формулой right-left+1, по оси y - формулой bottom-top+1.
3539 clevermous 2264
  * Смотри также функцию 14,
2265
    позволяющую определить размеры всего экрана.
2266
  * Есть парная функция установки рабочей области - подфункция 6.
77 diamond 2267
 
6056 IgorA 2268
---------------------- Константы для регистров: ----------------------
2269
  eax - SF_STYLE_SETTINGS (48)
2270
  ebx - SSF_GET_SCREEN_AREA (5)
77 diamond 2271
======================================================================
3539 clevermous 2272
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
77 diamond 2273
======================================================================
3539 clevermous 2274
Параметры:
2275
  * eax = 48 - номер функции
2276
  * ebx = 6 - номер подфункции
77 diamond 2277
  * ecx = [left]*65536 + [right]
2278
  * edx = [top]*65536 + [bottom]
3539 clevermous 2279
Возвращаемое значение:
2280
  * функция не возвращает значения
2281
Замечания:
2282
  * Рабочая область экрана определяет положение и координаты
2283
    максимизированного окна.
5452 leency 2284
  * Эта функция используется только приложением @taskbar,
3539 clevermous 2285
    устанавливающим рабочей областью весь экран за вычетом панели.
2286
  * (left,top) - координаты левого верхнего угла,
2287
    (right,bottom) - координаты правого нижнего.
2288
    Таким образом, размер рабочей области по оси x определяется
2289
    формулой right-left+1, по оси y - формулой bottom-right+1.
2290
  * Если left>=right, то x-координаты рабочей области не изменяются.
2291
    Если left<0, то left не устанавливается. Если right больше
2292
    или равно ширины экрана, то right не устанавливается.
2293
    Аналогично по оси y.
2294
  * Смотри также функцию 14,
2295
    позволяющую определить размеры всего экрана.
3780 Serge 2296
  * Есть парная функция получения рабочей области -
3539 clevermous 2297
    подфункция 5.
2298
  * Эта функция автоматически перерисовывает экран, по ходу дела
2299
    обновляет координаты и размеры максимизированных окон.
2300
    Все окна извещаются о необходимости перерисовки (событие 1).
77 diamond 2301
 
6056 IgorA 2302
---------------------- Константы для регистров: ----------------------
2303
  eax - SF_STYLE_SETTINGS (48)
2304
  ebx - SSF_SET_SCREEN_AREA (6)
77 diamond 2305
======================================================================
3539 clevermous 2306
====================== Функция 48, подфункция 7 ======================
2307
============ Получить область скина для текста заголовка. ============
77 diamond 2308
======================================================================
3539 clevermous 2309
Возвращает область заголовка окна со скином, предназначенную
2310
для вывода текста заголовка.
2311
Параметры:
2312
  * eax = 48 - номер функции
2313
  * ebx = 7 - номер подфункции
2314
Возвращаемое значение:
77 diamond 2315
  * eax = [left]*65536 + [right]
2316
  * ebx = [top]*65536 + [bottom]
3539 clevermous 2317
Замечания:
2318
  * Использование/неиспользование этой функции -
2319
    личное дело приложения.
2320
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2321
    при выборе места для рисования текста заголовка (функцией 4) или
2322
    какого-нибудь заменителя текста заголовка
2323
    (по усмотрению приложения).
77 diamond 2324
 
6056 IgorA 2325
---------------------- Константы для регистров: ----------------------
2326
  eax - SF_STYLE_SETTINGS (48)
2327
  ebx - SSF_GET_SKIN_MARGINS (7)
77 diamond 2328
======================================================================
3539 clevermous 2329
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
77 diamond 2330
======================================================================
3539 clevermous 2331
Параметры:
2332
  * eax = 48 - номер функции
2333
  * ebx = 8 - номер подфункции
2334
  * ecx = указатель на имя файла скина
2335
Возвращаемое значение:
2336
  * eax = 0 - успешно
2337
  * eax = 1 - не удалось загрузить файл
2338
  * eax = 2 - файл не является файлом скина
2339
Замечания:
2340
  * При успешной загрузке скина все окна извещаются о необходимости
2341
    перерисовки (событие 1).
2342
  * При загрузке система считывает скин из файла default.skn
2343
    на рамдиске.
2344
  * Пользователь может изменять скин статически, создав свой
2345
    default.skn, или динамически с помощью приложения desktop.
77 diamond 2346
 
6056 IgorA 2347
---------------------- Константы для регистров: ----------------------
2348
  eax - SF_STYLE_SETTINGS (48)
2349
  ebx - SSF_SET_SKIN (8)
77 diamond 2350
======================================================================
5848 pathoswith 2351
= Функция 48, подфункция 9 - получить настройку сглаживания шрифтов. =
5682 leency 2352
======================================================================
2353
Параметры:
2354
  * eax = 48 - номер функции
2355
  * ebx = 9 - номер подфункции
5848 pathoswith 2356
Возвращаемое значение:
2357
  * eax = 2 - субпиксельное, 1 - обычное, 0 - выключить
5682 leency 2358
 
6056 IgorA 2359
---------------------- Константы для регистров: ----------------------
2360
  eax - SF_STYLE_SETTINGS (48)
2361
  ebx - SSF_GET_FONT_SMOOTH (9)
5682 leency 2362
======================================================================
5848 pathoswith 2363
===== Функция 48, подфункция 10 - настроить сглаживание шрифтов. =====
2364
======================================================================
2365
Параметры:
2366
  * eax = 48 - номер функции
2367
  * ebx = 10 - номер подфункции
2368
  * cl  = 2 - субпиксельное, 1 - обычное, 0 - выключить
2369
 
6056 IgorA 2370
---------------------- Константы для регистров: ----------------------
2371
  eax - SF_STYLE_SETTINGS (48)
2372
  ebx - SSF_SET_FONT_SMOOTH (10)
5848 pathoswith 2373
======================================================================
5867 pathoswith 2374
======== Функция 48, подфункция 11 - получить размер шрифтов. ========
2375
======================================================================
2376
Параметры:
2377
  * eax = 48 - номер функции
7722 dunkaist 2378
  * ebx = 11 - номер подфункции
5867 pathoswith 2379
Возвращаемое значение:
2380
  * eax = текущая высота шрифта в пикселях
2381
 
6056 IgorA 2382
---------------------- Константы для регистров: ----------------------
2383
  eax - SF_STYLE_SETTINGS (48)
2384
  ebx - SSF_GET_FONT_SIZE (11)
5867 pathoswith 2385
======================================================================
2386
======= Функция 48, подфункция 12 - установить размер шрифтов. =======
2387
======================================================================
2388
Параметры:
2389
  * eax = 48 - номер функции
7722 dunkaist 2390
  * ebx = 12 - номер подфункции
5867 pathoswith 2391
  * cl  = новая высота шрифта в пикселях
2392
 
6056 IgorA 2393
---------------------- Константы для регистров: ----------------------
2394
  eax - SF_STYLE_SETTINGS (48)
2395
  ebx - SSF_SET_FONT_SIZE (12)
5867 pathoswith 2396
======================================================================
6800 pathoswith 2397
= Функция 48, подфункция 13 - установить скин с указанием кодировки. =
2398
======================================================================
2399
Параметры:
2400
  * eax = 48 - номер функции
2401
  * ebx = 13 - номер подфункции
2402
  * ecx = указатель на строку с путём к файлу скина
2403
  * edx = кодировка строки, подробности указаны в описании функции 80.
2404
Возвращаемое значение:
2405
  * eax = 0 - успешно
2406
  * eax = 1 - не удалось загрузить файл
2407
  * eax = 2 - файл не является файлом скина
2408
Замечания:
2409
  * При успешной загрузке скина все окна извещаются о необходимости
2410
    перерисовки (событие 1).
2411
  * При загрузке система считывает скин из файла default.skn
2412
    на рамдиске.
2413
  * Пользователь может изменять скин статически, создав свой
2414
    default.skn, или динамически с помощью приложения desktop.
2415
 
2416
======================================================================
3539 clevermous 2417
============ Функция 49 - Advanced Power Management (APM). ===========
78 diamond 2418
======================================================================
3539 clevermous 2419
Параметры:
2420
  * eax = 49 - номер функции
2421
  * dx = номер функции APM (аналог ax в спецификации)
2422
  * bx, cx = параметры функции APM
2423
Возвращаемое значение:
2424
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2425
    установлены в соответствии со спецификацией APM
2426
  * старшие половины 32-битных регистров eax, ebx, ecx,
2427
    edx, esi, edi разрушаются
2428
Замечания:
2429
  * Спецификация APM 1.2 описывается в документе
78 diamond 2430
    "Advanced Power Management (APM) BIOS Specification"
3539 clevermous 2431
    (Revision 1.2), доступном на
78 diamond 2432
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
3539 clevermous 2433
    кроме того, она включена в известный Interrupt List by Ralf Brown
78 diamond 2434
    (http://www.pobox.com/~ralf/files.html,
2435
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2436
 
6056 IgorA 2437
---------------------- Константы для регистров: ----------------------
2438
  eax - SF_APM (49)
78 diamond 2439
======================================================================
3539 clevermous 2440
================= Функция 50 - установка формы окна. =================
77 diamond 2441
======================================================================
3539 clevermous 2442
Обычные окна представляют собой прямоугольники. С помощью этой функции
2443
окну можно придать произвольную форму. Форма задаётся набором точек
2444
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2445
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2446
функцией 67.
77 diamond 2447
 
3539 clevermous 2448
--------------- Установка данных с информацией о форме ---------------
2449
Параметры:
2450
  * eax = 50 - номер функции
2451
  * ebx = 0 - номер подфункции
2452
  * ecx = указатель на данные формы (массив байт 0/1)
2453
Возвращаемое значение:
2454
  * функция не возвращает значения
77 diamond 2455
 
3539 clevermous 2456
------------------ Установка масштаба данных формы -------------------
2457
Параметры:
2458
  * eax = 50 - номер функции
2459
  * ebx = 1 - номер подфункции
2460
  * ecx задаёт масштаб: каждый байт данных определяет
2461
    (2^scale)*(2^scale) пикселей
2462
Возвращаемое значение:
2463
  * функция не возвращает значения
2464
Замечания:
2465
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2466
    данных формы один байт соответствует одному пикселю, то масштаб
2467
    можно не устанавливать.
2468
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2469
    обратите внимание, что они на единицу больше, чем устанавливаемые
2470
    функциями 0, 67.
2471
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2472
  * Байт данных по смещению a должен быть 0/1 и
2473
    определяет принадлежность окну квадрата со стороной 2^scale
2474
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
77 diamond 2475
    (a mod (xsize shr scale), a div (xsize shr scale))
3539 clevermous 2476
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2477
  * Данные должны присутствовать в памяти и не меняться
2478
    после установки формы.
2479
  * Система просматривает данные о форме при каждой перерисовке окна
2480
    функцией 0.
2481
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2482
    к прямоугольной форме.
77 diamond 2483
 
6056 IgorA 2484
---------------------- Константы для регистров: ----------------------
2485
  eax - SF_SET_WINDOW_SHAPE (50)
77 diamond 2486
======================================================================
10002 Jurgen 2487
===================== Функция 51, подфункция 1 =======================
2488
========================== Создать поток =============================
77 diamond 2489
======================================================================
3539 clevermous 2490
Параметры:
2491
  * eax = 51 - номер функции
10002 Jurgen 2492
  * ebx = 1 - номер подфункции
3539 clevermous 2493
  * ecx = адрес точки входа потока (начальный eip)
2494
  * edx = указатель стэка потока (начальный esp)
2495
Возвращаемое значение:
2496
  * eax = -1 - ошибка (в системе слишком много потоков)
2497
  * иначе eax = TID - идентификатор потока
77 diamond 2498
 
6056 IgorA 2499
---------------------- Константы для регистров: ----------------------
2500
  eax - SF_CREATE_THREAD (51)
77 diamond 2501
======================================================================
10002 Jurgen 2502
===================== Функция 51, подфункция 2 =======================
2503
=================== Получить номер слота потока ======================
2504
======================================================================
2505
Параметры:
2506
  * eax = 51 - номер функции
2507
  * ebx = 2 - номер подфункции
2508
Возвращаемое значение:
2509
  * eax = номер слота потока
2510
 
2511
======================================================================
2512
===================== Функция 51, подфункция 3 =======================
2513
==================== Получить приоритет потока =======================
2514
======================================================================
2515
Параметры:
2516
  * eax = 51 - номер функции
2517
  * ebx = 3 - номер подфункции
2518
  * ecx = номер слота потока или -1 (текущий поток)
2519
Возвращаемое значение:
2520
  * eax = -1 - ошибка (неверный номер слота потока или поток завершен)
2521
  * иначе eax = номер приоритета потока
2522
Замечания:
2523
  * Приоритет потока имеет диапазон значений от 0 до 255.
2524
  Значение 0 - наивысший приоритет потока, устанавливаемый по умолчанию при создании потока.
2525
 
2526
======================================================================
2527
===================== Функция 51, подфункция 4 =======================
2528
=================== Установить приоритет потока ======================
2529
======================================================================
2530
Параметры:
2531
  * eax = 51 - номер функции
2532
  * ebx = 4 - номер подфункции
2533
  * ecx = номер слота потока или -1 (текущий поток)
2534
  * edx = приоритет потока
2535
Возвращаемое значение:
2536
  * eax = -1 - ошибка (неверный номер слота потока или поток завершен)
2537
  * иначе eax = старое значение приоритета потока
2538
Замечания:
2539
  * Приоритет потока имеет диапазон значений от 0 до 255.
2540
  Значение 0 - наивысший приоритет потока, устанавливаемый по умолчанию при создании потока.
2541
 
2542
======================================================================
4199 mario79 2543
====================== Функция 54, подфункция 0 ======================
2544
============== Узнать количество слотов в буфере обмена. =============
2545
======================================================================
2546
Параметры:
2547
  * eax = 54 - номер функции
2548
  * ebx = 0 - номер подфункции
2549
Возвращаемое значение:
6473 pathoswith 2550
  * eax = количество слотов в буфере
4199 mario79 2551
  * eax = -1 - отсутствует область главного списка
2552
 
6056 IgorA 2553
---------------------- Константы для регистров: ----------------------
2554
  eax - SF_CLIPBOARD (54)
2555
  ebx - SSF_GET_SLOT_COUNT (0)
4199 mario79 2556
======================================================================
2557
====================== Функция 54, подфункция 1 ======================
2558
================== Считать данные из буфера обмена. ==================
2559
======================================================================
2560
Параметры:
2561
  * eax = 54 - номер функции
2562
  * ebx = 1 - номер подфункции
2563
  * eсx = номер слота
2564
Возвращаемое значение:
2565
  * eax = если успешно - указатель на область памяти с данными
2566
  * eax = 1 - ошибка
2567
  * eax = -1 - отсутствует область главного списка
6369 IgorA 2568
Замечания:
2569
  * буфер, на который указывает eax, содержит следующую информацию:
2570
    * +0: dword: общая длина данных
2571
    * +4: dword: определяет тип данныx:
2572
      * 0 = Текст
2573
      * 1 = Текст с блочным выделением
2574
      * 2 = Изображение
2575
      * 3 = RAW
2576
      * 4 и выше зарезервировано
2577
    * +8: более детально смотрите файл clipboard_container_rus.txt
6974 0CodErr 2578
  * Функция должна использоваться совместно с 68.11. Приложение должно
2579
    предварительно проинициализировать локальную кучу вызовом 68.11.
2580
 
6056 IgorA 2581
---------------------- Константы для регистров: ----------------------
2582
  eax - SF_CLIPBOARD (54)
2583
  ebx - SSF_READ_CB (1)
4199 mario79 2584
======================================================================
2585
====================== Функция 54, подфункция 2 ======================
2586
================== Записать данные в буфер обмена. ===================
2587
======================================================================
2588
Параметры:
2589
  * eax = 54 - номер функции
2590
  * ebx = 2 - номер подфункции
2591
  * eсx = количество копируемых байт
2592
  * edx = указатель на буфер под копируемые данные
2593
Возвращаемое значение:
2594
  * eax = 0 - успешно
2595
  * eax = 1 - ошибка
2596
  * eax = -1 - отсутствует область главного списка
2597
 
6056 IgorA 2598
---------------------- Константы для регистров: ----------------------
2599
  eax - SF_CLIPBOARD (54)
2600
  ebx - SSF_WRITE_CB (2)
4199 mario79 2601
======================================================================
2602
====================== Функция 54, подфункция 3 ======================
2603
========= Удалить последний слот с данными в буфере обмена ===========
2604
======================================================================
2605
Параметры:
2606
  * eax = 54 - номер функции
2607
  * ebx = 3 - номер подфункции
2608
Возвращаемое значение:
2609
  * eax = 0 - успешно
2610
  * eax = 1 - ошибка
2611
  * eax = -1 - отсутствует область главного списка
2612
 
6056 IgorA 2613
---------------------- Константы для регистров: ----------------------
2614
  eax - SF_CLIPBOARD (54)
2615
  ebx - SSF_DEL_SLOT (3)
4199 mario79 2616
======================================================================
2617
====================== Функция 54, подфункция 4 ======================
2618
=================== Аварийный сброс блокировки буфера ================
2619
======================================================================
2620
Параметры:
2621
  * eax = 54 - номер функции
2622
  * ebx = 4 - номер подфункции
2623
Возвращаемое значение:
2624
  * eax = 0 - успешно
2625
  * eax = -1 - отсутствует область главного списка или нет блокировки
2626
Замечания:
2627
  * Используется в исключительных случаях, когда зависшее или убитое
2628
    приложение заблокировало работу с буфером обмена.
2629
 
6056 IgorA 2630
---------------------- Константы для регистров: ----------------------
2631
  eax - SF_CLIPBOARD (54)
2632
  ebx - SSF_UNLOCK_BUFFER (4)
4199 mario79 2633
======================================================================
3539 clevermous 2634
====================== Функция 55, подфункция 55 =====================
2635
========== Начать проигрывать данные на встроенном спикере. ==========
77 diamond 2636
======================================================================
3539 clevermous 2637
Параметры:
2638
  * eax = 55 - номер функции
2639
  * ebx = 55 - номер подфункции
2640
  * esi = указатель на данные
2641
Возвращаемое значение:
2642
  * eax = 0 - успешно
2643
  * eax = 55 - ошибка (спикер отключён или занят)
2644
Данные - это массив элементов переменной длины.
2645
Формат каждого элемента определяется первым байтом:
2646
  * 0 = конец данных
2647
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2648
    ноты, определяемой непосредственным значением частоты
2649
    * следующее слово (2 байта) содержит делитель частоты;
2650
      частота определяется как 1193180/divider
77 diamond 2651
  * 0x81 = invalid
3539 clevermous 2652
  * 0x82..0xFF = нота, определяемая октавой и номером:
2653
    * длительность в сотых долях секунды = (первый байт)-0x81
2654
    * присутствует ещё один байт;
2655
    * (второй байт)=0xFF - пауза
2656
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2657
      до 12, a=номер октавы (считая с 0)
2658
Замечания:
2659
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2660
    функции 18.
2661
  * Функция возвращает управление, сообщив куда следует информацию
2662
    о запросе. Само проигрывание идёт независимо от программы.
2663
  * Данные должны сохраняться в памяти по крайней мере
2664
    до конца проигрывания.
77 diamond 2665
 
6056 IgorA 2666
---------------------- Константы для регистров: ----------------------
2667
  eax - SF_SPEAKER_PLAY (55)
77 diamond 2668
======================================================================
3539 clevermous 2669
======================= Функция 57 - PCI BIOS. =======================
586 serge 2670
======================================================================
3539 clevermous 2671
Параметры:
2672
  * eax = 57 - номер функции
2673
  * ebp соответствует регистру al в спецификации PCI BIOS
2674
  * остальные регистры - по спецификации PCI BIOS
2675
Возвращаемое значение:
2676
  * CF не определён
2677
  * остальные регистры - по спецификации PCI BIOS
2678
Замечания:
2679
  * Многих результатов этой функции можно также добиться вызовом
2680
    соответствующих подфункций функции 62.
2681
  * Функция вызывает расширение PCI32 BIOS, документированное,
2682
    например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
2683
  * Если BIOS не поддерживает это расширение, поведение функции
2684
    эмулируется (через аналоги подфункций функции 62 режима ядра).
586 serge 2685
 
6056 IgorA 2686
---------------------- Константы для регистров: ----------------------
2687
  eax - SF_PCI_BIOS (57)
586 serge 2688
======================================================================
3539 clevermous 2689
=========== Функция 60 - Inter Process Communication (IPC). ==========
77 diamond 2690
======================================================================
3539 clevermous 2691
IPC применяется для посылок сообщений от одного процесса/потока
2692
другому. При этом следует предварительно договориться о том, как
2693
интерпретировать конкретное сообщение.
77 diamond 2694
 
3539 clevermous 2695
-------- Подфункция 1 - установить область для получения IPC ---------
2696
Вызывается процессом-приёмником.
2697
Параметры:
2698
  * eax = 60 - номер функции
2699
  * ebx = 1 - номер подфункции
2700
  * ecx = указатель на буфер
2701
  * edx = размер буфера
2702
Возвращаемое значение:
2703
  * eax = 0 - всегда успешно
2704
Формат IPC-буфера:
2705
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
2706
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
2707
    и вам надо, чтобы извне не изменялись данные буфера
2708
    (не поступали новые сообщения)
2709
  * +4: dword: занято места в буфере (в байтах)
2710
  * +8: первое сообщение
2711
  * +8+n: второе сообщение
77 diamond 2712
  * ...
3539 clevermous 2713
Формат сообщения:
2714
  * +0: dword: PID процесса/потока, пославшего сообщение
2715
  * +4: dword: длина сообщения (не считая этот заголовок)
2716
  * +8: n*byte: данные сообщения
77 diamond 2717
 
3539 clevermous 2718
--------------- Подфункция 2 - послать сообщение IPC. ----------------
2719
Вызывается процессом-инициатором.
2720
Параметры:
2721
  * eax = 60 - номер функции
2722
  * ebx = 2 - номер подфункции
2723
  * ecx = PID приёмника
2724
  * edx = указатель на данные сообщения
2725
  * esi = длина сообщения (в байтах)
2726
Возвращаемое значение:
2727
  * eax = 0 - успешно
2728
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
2729
    (может быть, ещё не успел, а может быть, это не тот поток,
2730
    который нужен)
2731
  * eax = 2 - приёмник заблокировал IPC-буфер;
2732
    попробуйте немного подождать
2733
  * eax = 3 - переполнение IPC-буфера приёмника
2734
  * eax = 4 - процесса/потока с таким PID не существует
2735
Замечания:
2736
  * Система сразу после записи IPC-сообщения в буфер посылает
2737
    потоку-приёмнику событие с кодом 7 (см. коды событий).
77 diamond 2738
 
6056 IgorA 2739
---------------------- Константы для регистров: ----------------------
2740
  eax - SF_IPC (60)
2741
  ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2)
77 diamond 2742
======================================================================
3539 clevermous 2743
=== Функция 61 - получить параметры для прямого доступа к графике. ===
77 diamond 2744
======================================================================
3539 clevermous 2745
Программе доступны данные графического экрана (область памяти, которая
2746
собственно и отображает содержимое экрана) напрямую без вызовов
2747
системных функций через селектор gs:
1662 Nasarus 2748
	mov	eax, [gs:0]
3539 clevermous 2749
поместит в eax первый dword буфера, содержащий информацию о цвете
2750
левой верхней точки (и, возможно, цвета нескольких следующих).
1662 Nasarus 2751
	mov	[gs:0], eax
3539 clevermous 2752
при работе в режимах VESA c LFB
2753
установит цвет левой верхней точки
2754
(и возможно, цвета нескольких следующих).
2755
Для интерпретации данных графического экрана требуется знание
2756
некоторых параметров, которые возвращаются этой функцией.
2757
Замечания:
7121 dunkaist 2758
  * Параметры графики очень редко меняются при работе системы.
3539 clevermous 2759
  * При изменении видеорежима система перерисовывает все окна
2760
    (событие с кодом 1) и перерисовывает фон (событие 5).
2761
    Эти же события происходят и в других случаях,
2762
    которые встречаются значительно чаще, чем изменение видеорежима.
2763
  * При работе в видеорежимах с LFB селектор gs указывает на
2764
    собственно LFB, так что чтение/запись по gs приводят
2765
    непосредственно к изменению содержимого экрана. При работе в
2766
    видеорежимах без LFB gs указывает на некоторую область данных
2767
    ядра, причём все функции вывода на экран добросовестно выполняют
2768
    двойную работу по записи непосредственно на экран и по записи
2769
    в этот буфер. В результате при чтении содержимого этого буфера
2770
    результаты соответствуют содержимому экрана
2771
    (с, вообще говоря, большим цветовым разрешением),
2772
    а запись игнорируется.
2773
    Исключением является режим 320*200, для которого в главном цикле
2774
    системного потока выполняется обновление экрана в соответствии
2775
    с движениями курсора мыши.
77 diamond 2776
 
3539 clevermous 2777
------------------------- Разрешение экрана --------------------------
2778
Параметры:
2779
  * eax = 61 - номер функции
2780
  * ebx = 1 - номер подфункции
2781
Возвращаемое значение:
2782
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
2783
Замечания:
2784
  * Можно использовать функцию 14 с учётом того, что она возвращает
2785
    размеры на 1 меньше. Это полностью эквивалентный способ.
77 diamond 2786
 
3539 clevermous 2787
------------------------ Число бит на пиксель ------------------------
2788
Параметры:
2789
  * eax = 61 - номер функции
2790
  * ebx = 2 - номер подфункции
2791
Возвращаемое значение:
2792
  * eax = число бит на пиксель (24 или 32)
77 diamond 2793
 
3539 clevermous 2794
------------------------ Число байт на строку ------------------------
2795
Параметры:
2796
  * eax = 61 - номер функции
2797
  * ebx = 3 - номер подфункции
2798
Возвращаемое значение:
2799
  * eax = число байт, которое занимает одна строка развёртки
2800
    (горизонтальная линия на экране)
77 diamond 2801
 
6056 IgorA 2802
---------------------- Константы для регистров: ----------------------
2803
  eax - SF_GET_GRAPHICAL_PARAMS (61)
2804
  ebx - SSF_SCREEN_SIZE (1), SSF_BITS_PER_PIXEL (2),
2805
    SSF_BYTES_PER_LINE (3)
77 diamond 2806
======================================================================
3539 clevermous 2807
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
77 diamond 2808
======================================================================
3539 clevermous 2809
Параметры:
2810
  * eax = 62 - номер функции
2811
  * bl = 0 - номер подфункции
2812
Возвращаемое значение:
2813
  * eax = -1 - доступ к PCI запрещён; иначе
2814
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
2815
  * старшее слово eax обнулено
2816
Замечания:
2817
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2818
    для приложений подфункцией 12 функции 21.
2819
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
77 diamond 2820
 
6056 IgorA 2821
---------------------- Константы для регистров: ----------------------
2822
  eax - SF_PCI (62)
2823
  ebx - SSF_GET_VERSION (0)
77 diamond 2824
======================================================================
3539 clevermous 2825
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
77 diamond 2826
======================================================================
3539 clevermous 2827
Параметры:
2828
  * eax = 62 - номер функции
2829
  * bl = 1 - номер подфункции
2830
Возвращаемое значение:
2831
  * eax = -1 - доступ к PCI запрещён; иначе
2832
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
2833
Замечания:
2834
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2835
    для приложений подфункцией 12 функции 21.
2836
  * Если PCI BIOS не поддерживается, то значение al неопределено.
77 diamond 2837
 
6056 IgorA 2838
---------------------- Константы для регистров: ----------------------
2839
  eax - SF_PCI (62)
2840
  ebx - SSF_GET_LAST_BUS (1)
77 diamond 2841
======================================================================
3539 clevermous 2842
====================== Функция 62, подфункция 2 ======================
2843
== Получить механизм обращения к конфигурационному пространству PCI. =
77 diamond 2844
======================================================================
3539 clevermous 2845
Параметры:
2846
  * eax = 62 - номер функции
2847
  * bl = 2 - номер подфункции
2848
Возвращаемое значение:
2849
  * eax = -1 - доступ к PCI запрещён; иначе
2850
  * al = механизм (1 или 2); прочие байты eax разрушаются
2851
Замечания:
2852
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2853
    для приложений подфункцией 12 функции 21.
2854
  * Механизм обращения выбирается в соответствии
2855
    с характеристиками оборудования.
2856
  * Подфункции чтения и записи автоматически работают
2857
    с выбранным механизмом.
77 diamond 2858
 
6056 IgorA 2859
---------------------- Константы для регистров: ----------------------
2860
  eax - SF_PCI (62)
2861
  ebx - SSF_GET_ADRR_MODE (2)
77 diamond 2862
======================================================================
3539 clevermous 2863
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
77 diamond 2864
======================================================================
3539 clevermous 2865
Параметры:
2866
  * eax = 62 - номер функции
2867
  * bl = 4 - читать байт
2868
  * bl = 5 - читать слово
2869
  * bl = 6 - читать двойное слово
2870
  * bh = номер PCI-шины
2871
  * ch = dddddfff, где ddddd = номер устройства на шине,
2872
    fff = номер функции устройства
2873
  * cl = номер регистра (должен быть чётным для bl=5,
2874
    делиться на 4 для bl=6)
2875
Возвращаемое значение:
2876
  * eax = -1 - ошибка (запрещён доступ к PCI или
2877
    неподдерживаемые параметры); иначе
2878
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
2879
    оставшаяся часть регистра eax разрушается
2880
Замечания:
2881
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2882
    для приложений подфункцией 12 функции 21.
2883
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2884
    игнорирует номер функции. Получить механизм доступа можно вызовом
2885
    подфункции 2.
2886
  * Некоторые регистры стандартны и существуют для всех устройств,
2887
    некоторые определяются конкретным устройством. Список первых
2888
    входит, например, в известный Interrupt List by Ralf Brown
77 diamond 2889
    (http://www.pobox.com/~ralf/files.html,
2890
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
3539 clevermous 2891
    список вторых должен быть указан в документации по устройству.
77 diamond 2892
 
6056 IgorA 2893
---------------------- Константы для регистров: ----------------------
2894
  eax - SF_PCI (62)
2895
  ebx - SSF_READ_BYTE (4), SSF_READ_WORD (5), SSF_READ_DWORD (6)
77 diamond 2896
======================================================================
3539 clevermous 2897
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
77 diamond 2898
======================================================================
3539 clevermous 2899
Параметры:
2900
  * eax = 62 - номер функции
2901
  * bl = 8 - писать байт
2902
  * bl = 9 - писать слово
2903
  * bl = 10 - писать двойное слово
2904
  * bh = номер PCI-шины
2905
  * ch = dddddfff, где ddddd = номер устройства на шине,
2906
    fff = номер функции устройства
2907
  * cl = номер регистра (должен быть чётным для bl=9,
2908
    делиться на 4 для bl=10)
2909
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
2910
    данные для записи
2911
Возвращаемое значение:
2912
  * eax = -1 - ошибка (запрещён доступ к PCI или
2913
    неподдерживаемые параметры)
2914
  * eax = 0 - успешно
2915
Замечания:
2916
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2917
    для приложений подфункцией 12 функции 21.
2918
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2919
    игнорирует номер функции. Получить механизм доступа можно вызовом
2920
    подфункции 2.
2921
  * Некоторые регистры стандартны и существуют для всех устройств,
2922
    некоторые определяются конкретным устройством. Список первых
2923
    входит, например, в известный Interrupt List by Ralf Brown;
2924
    список вторых должен быть указан в документации по устройству.
77 diamond 2925
 
6056 IgorA 2926
---------------------- Константы для регистров: ----------------------
2927
  eax - SF_PCI (62)
2928
  ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10)
77 diamond 2929
======================================================================
3539 clevermous 2930
================ Функция 63 - работа с доской отладки. ===============
77 diamond 2931
======================================================================
3539 clevermous 2932
Доска отладки представляет собой системный буфер (на 4096 байт),
2933
в который любая программа может записать (вообще говоря, произвольные)
2934
данные и из которого другая программа может эти данные прочитать.
2935
Есть соглашение, в соответствии с которым записываемые данные -
2936
текстовые строки, интерпретируемые как отладочные сообщения о ходе
2937
выполнения программы. Ядро в определённых ситуациях также записывает
2938
на доску отладки сведения о выполнении некоторых функций;
2939
по соглашению сообщения ядра начинаются с префикса "K : ".
2940
Для просмотра доски отладки создано приложение board,
2941
которое считывает данные из буфера и отображает их в своём окне. board
2942
понимает последовательность кодов 13,10 как переход на новую строку.
2943
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
2944
В связи с появлением отладчика ценность доски отладки несколько
2945
снизилась, поскольку отладчик позволяет полностью контролировать ход
2946
выполнения программы, причём для этого не требуется никаких усилий
2947
со стороны самой программы. Тем не менее во многих случаях
2948
доска отладки продолжает оставаться полезной.
77 diamond 2949
 
3539 clevermous 2950
---------------------------- Запись байта ----------------------------
2951
Параметры:
2952
  * eax = 63 - номер функции
2953
  * ebx = 1 - номер подфункции
2954
  * cl = байт данных
2955
Возвращаемое значение:
2956
  * функция не возвращает значения
2957
Замечания:
2958
  * Байт записывается в буфер. Длина буфера - 512 байт.
2959
    При переполнении буфера все полученные данные теряются
2960
    и заполнение начинается снова с нуля.
2961
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
2962
    достаточно этой функции, вызываемой в цикле. Можно не писать
2963
    вручную соответствующий код, а воспользоваться файлом debug.inc,
2964
    входящим в дистрибутив.
77 diamond 2965
 
3539 clevermous 2966
---------------------------- Чтение байта ----------------------------
2967
Забирает байт из буфера.
2968
Параметры:
2969
  * eax = 63 - номер функции
2970
  * ebx = 2 - номер подфункции
2971
Возвращаемое значение:
2972
  * eax = ebx = 0 - буфер пуст
2973
  * eax = байт, ebx = 1 - байт успешно прочитан
77 diamond 2974
 
6056 IgorA 2975
---------------------- Константы для регистров: ----------------------
2976
  eax - SF_BOARD (63)
2977
  ebx - SSF_DEBUG_WRITE (1), SSF_DEBUG_READ (2)
77 diamond 2978
======================================================================
3539 clevermous 2979
========== Функция 64 - перераспределить память приложения. ==========
77 diamond 2980
======================================================================
9995 Doczom 2981
 
2982
 !!! ВНИМАНИЕ. Данный интерфейс устарел и не должен использоваться !!!
2983
 
3539 clevermous 2984
Параметры:
2985
  * eax = 64 - номер функции
2986
  * ebx = 1 - единственная подфункция
2987
  * ecx = новый размер памяти
2988
Возвращаемое значение:
2989
  * eax = 0 - успешно
2990
  * eax = 1 - недостаточно памяти
2991
Замечания:
2992
  * Есть другой способ выделения/освобождения динамической памяти -
6974 0CodErr 2993
    подфункции 11, 12, 13 функции 68.
2994
  * Функция не может использоваться совместно с 68.11, 68.12, 68.13.
2995
    Вызов функции будет игнорироваться, если приложение создаст
2996
    локальную кучу вызовом 68.11.
77 diamond 2997
 
6056 IgorA 2998
---------------------- Константы для регистров: ----------------------
2999
  eax - SF_MEMORY_RESIZE (64)
77 diamond 3000
======================================================================
3539 clevermous 3001
========= Функция 65 - вывести изображение с палитрой в окно. ========
283 diamond 3002
======================================================================
3539 clevermous 3003
Параметры:
3004
  * eax = 65 - номер функции
3005
  * ebx = указатель на изображение
3006
  * ecx = [размер по оси x]*65536 + [размер по оси y]
3007
  * edx = [координата по оси x]*65536 + [координата по оси y]
3008
  * esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
3009
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
3010
          игнорируется при esi > 8
3011
  * ebp = смещение данных каждой следующей строки изображения
3012
          относительно предыдущей
3013
Возвращаемое значение:
3014
  * функция не возвращает значения
3015
Замечания:
3016
  * Координаты изображения - это координаты верхнего левого угла
3017
    изображения относительно окна.
3018
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
3019
    за исключением, быть может, последних байтов строк, содержит
3020
    информацию о цвете 8 пикселей, старший бит соответствует первому
3021
    пикселю.
3022
  * Формат изображения с 2 битами на пиксель: каждый байт изображения,
3023
    за исключением, быть может, последних байтов строк, содержит
3024
    информацию о цвете 4 пикселей, старшие два бита соответствуют
3025
    первому пикселю.
3026
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
3027
    за исключением последних байтов строк (если ширина изображения
3028
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
3029
    соответствует первому пикселю.
3030
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
3031
    рассматривается как индекс в палитре.
3032
  * Формат изображения с 9 битами на пиксель: каждый байт изображения
3033
    (8 бит) обозначает интенсивность серого для одного пикселя, т.о.
3034
    этот тип изображения идентичен 8 бит на пиксель без палитры.
3035
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
3036
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
3037
    по 5 пикселей на каждый цвет.
3038
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
3039
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
3040
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
3041
    кодируется тремя байтами - последовательно синяя, зелёная, красная
3042
    составляющие цвета.
3043
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
3044
    есть ещё игнорируемый четвёртый байт.
3045
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
314 diamond 3046
    esi=24, ebp=0.
283 diamond 3047
 
6056 IgorA 3048
---------------------- Константы для регистров: ----------------------
3049
  eax - SF_PUT_IMAGE_EXT (65)
283 diamond 3050
======================================================================
3539 clevermous 3051
================= Функция 66 - работа с клавиатурой. =================
77 diamond 3052
======================================================================
3539 clevermous 3053
Режим ввода влияет на результаты чтения клавиш функцией 2.
3054
При загрузке программы для неё устанавливается ASCII-режим ввода.
77 diamond 3055
 
3539 clevermous 3056
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
3057
Параметры:
3058
  * eax = 66 - номер функции
3059
  * ebx = 1 - номер подфункции
3060
  * ecx = режим:
3061
    * 0 = обычный (ASCII-символы)
3062
    * 1 = сканкоды
3063
Возвращаемое значение:
3064
  * функция не возвращает значения
77 diamond 3065
 
3539 clevermous 3066
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
3067
Параметры:
3068
  * eax = 66 - номер функции
3069
  * ebx = 2 - номер подфункции
3070
Возвращаемое значение:
3071
  * eax = текущий режим
77 diamond 3072
 
3539 clevermous 3073
------- Подфункция 3 - получить состояние управляющих клавиш. --------
3074
Параметры:
3075
  * eax = 66 - номер функции
3076
  * ebx = 3 - номер подфункции
3077
Возвращаемое значение:
3078
  * eax = битовая маска:
3079
  * бит 0  (маска 1): левый Shift нажат
3080
  * бит 1  (маска 2): правый Shift нажат
3081
  * бит 2  (маска 4): левый Ctrl нажат
3082
  * бит 3  (маска 8): правый Ctrl нажат
3083
  * бит 4  (маска 0x10): левый Alt нажат
3084
  * бит 5  (маска 0x20): правый Alt нажат
3085
  * бит 6  (маска 0x40): CapsLock включён
3086
  * бит 7  (маска 0x80): NumLock включён
3087
  * бит 8  (маска 0x100): ScrollLock включён
3088
  * бит 9  (маска 0x200): левый Win нажат
3089
  * бит 10 (маска 0x400): правый Win нажат
3090
  * прочие биты сброшены
77 diamond 3091
 
3539 clevermous 3092
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
3093
О нажатии "горячей клавиши" извещаются только приложения,
3094
установившие её; активное приложение (к которому поступает
3095
весь нормальный ввод) таких клавиш не получает.
3096
Извещение заключается в посылке события с кодом 2.
3097
Прочитать "горячую клавишу" можно так же, как и обычную, -
3098
функцией 2.
3099
Параметры:
3100
  * eax = 66 - номер функции
3101
  * ebx = 4 - номер подфункции
3102
  * cl задаёт сканкод клавиши;
3103
    используйте cl=0 для задания комбинаций типа Ctrl+Shift
3104
  * edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
3105
    * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
3106
      * 0 = ни одна из клавиш не должна быть нажата;
3107
      * 1 = ровно одна из клавиш должна быть нажата;
3108
      * 2 = обе клавиши должны быть нажаты;
3109
      * 3 = должна быть нажата LShift, но не RShift;
3110
      * 4 = должна быть нажата RShift, но не LShift
3111
    * Y - аналогично для LCtrl и RCtrl;
3112
    * X - аналогично для LAlt и RAlt
3113
Возвращаемое значение:
3114
  * eax=0 - успешно
3115
  * eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
3116
Замечания:
3117
  * Горячая клавиша может срабатывать либо при нажатии,
3118
    либо при отпускании. Сканкод отпускания клавиши на 128 больше,
3119
    чем сканкод нажатия (т.е. установлен старший бит).
3120
  * Несколько приложений могут установить одну и ту же комбинацию;
3121
    о нажатии такой комбинации будут извещаться все такие приложения.
92 diamond 3122
 
3539 clevermous 3123
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
3124
Параметры:
3125
  * eax = 66 - номер функции
3126
  * ebx = 5 - номер подфункции
3127
  * cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
3128
Возвращаемое значение:
3129
  * eax = 0 - успешно
3130
  * eax = 1 - нет такой горячей клавиши
3131
Замечания:
3132
  * При завершении процесса/потока удаляются все установленные им
3133
    горячие клавиши.
3134
  * Вызов функции не влияет на другие приложения.
3135
    Если другое приложение определило эту же комбинацию,
3136
    оно по-прежнему будет получать уведомления.
92 diamond 3137
 
3539 clevermous 3138
------------- Подфункция 6 - заблокировать обычный ввод. -------------
3139
Параметры:
3140
  * eax = 66 - номер функции
3141
  * ebx = 6 - номер подфункции
3142
Возвращаемое значение:
3143
  * функция не возвращает значения
3144
Замечания:
3145
  * Блокируется обычный ввод данных с клавиатуры для установленных
3146
    "горячих" клавиш
3147
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2709 mario79 3148
 
3539 clevermous 3149
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
3150
Параметры:
3151
  * eax = 66 - номер функции
3152
  * ebx = 7 - номер подфункции
3153
Возвращаемое значение:
3154
  * функция не возвращает значения
3155
Замечания:
3156
  * Разблокирование результатов ф. 66.6
3157
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2709 mario79 3158
 
6056 IgorA 3159
---------------------- Константы для регистров: ----------------------
3160
  eax - SF_KEYBOARD (66)
3161
  ebx - SSF_SET_INPUT_MODE (1), SSF_GET_INPUT_MODE (2),
3162
    SSF_GET_CONTROL_KEYS (3), SSF_SET_SYS_HOTKEY (4),
3163
    SSF_DEL_SYS_HOTKEY (5),  SSF_LOCK_INPUT (6), SSF_UNLOCK_INPUT (7)
77 diamond 3164
======================================================================
3539 clevermous 3165
============ Функция 67 - изменить положение/размеры окна. ===========
77 diamond 3166
======================================================================
3539 clevermous 3167
Параметры:
3168
  * eax = 67 - номер функции
3169
  * ebx = новая x-координата окна
3170
  * ecx = новая y-координата окна
3171
  * edx = новый x-размер окна
3172
  * esi = новый y-размер окна
3173
Возвращаемое значение:
3174
  * функция не возвращает значения
3175
Замечания:
3176
  * Значение -1 для параметра означает "не изменять"; например, для
3177
    перемещения окна без изменения размеров можно указать edx=esi=-1.
3178
  * Предварительно окно должно быть определено функцией 0.
3179
    Она же задаёт начальные координаты и размеры окна.
3180
  * Размеры окна понимаются в смысле функции 0, т.е.
3181
    на один пиксель меньше, чем реальные размеры.
3182
  * Вызов функции для максимизированных окон просто игнорируется.
3183
  * Для окон соответствующих стилей положение и/или размеры могут быть
3184
    изменены пользователем; текущие положение и размеры могут быть
3185
    получены вызовом функции 9.
3186
  * Функция посылает окну событие перерисовки (с кодом 1).
77 diamond 3187
 
6056 IgorA 3188
---------------------- Константы для регистров: ----------------------
3189
  eax - SF_CHANGE_WINDOW (67)
77 diamond 3190
======================================================================
3539 clevermous 3191
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
77 diamond 3192
======================================================================
3539 clevermous 3193
Параметры:
3194
  * eax = 68 - номер функции
3195
  * ebx = 0 - номер подфункции
3196
Возвращаемое значение:
3197
  * eax = число переключений задач с момента загрузки системы
3198
    (по модулю 2^32)
77 diamond 3199
 
6056 IgorA 3200
---------------------- Константы для регистров: ----------------------
3201
  eax - SF_SYS_MISC (68)
3202
  ebx - SSF_GET_TASK_SWITCH_COUNT (0)
77 diamond 3203
======================================================================
3539 clevermous 3204
====================== Функция 68, подфункция 1 ======================
3205
============ Переключиться на следующий поток выполнения. ============
77 diamond 3206
======================================================================
3539 clevermous 3207
Функция завершает текущий квант времени, выделенный потоку,
3208
и переключается на следующий.
3209
(Какой поток какого процесса будет следующим, предсказать нельзя).
3210
Позднее, когда до текущего потока дойдёт очередь,
3211
выполнение возобновится.
3212
Параметры:
3213
  * eax = 68 - номер функции
3214
  * ebx = 1 - номер подфункции
3215
Возвращаемое значение:
3216
  * функция не возвращает значения
77 diamond 3217
 
6056 IgorA 3218
---------------------- Константы для регистров: ----------------------
3219
  eax - SF_SYS_MISC (68)
3220
  ebx - SSF_SWITCH_TASK (1)
77 diamond 3221
======================================================================
3539 clevermous 3222
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
77 diamond 3223
======================================================================
3539 clevermous 3224
Параметры:
3225
  * eax = 68 - номер функции
3226
  * ebx = 2 - номер подфункции
3227
  * ecx = требуемое действие:
3228
    * ecx = 0 - разрешить выполнение инструкции rdpmc
77 diamond 3229
      (ReaD Performance-Monitoring Counters)
3539 clevermous 3230
    * ecx = 1 - узнать, включён/выключен кэш
3231
    * ecx = 2 - включить кэш
3232
    * ecx = 3 - выключить кэш
3233
Возвращаемое значение:
3234
  * для ecx=0:
3235
    * eax = значение cr4
3236
  * для ecx=1:
77 diamond 3237
    * eax = (cr0 and 0x60000000):
3539 clevermous 3238
    * eax = 0 - кэш включён
3239
    * eax <> 0 - кэш выключен
3240
  * для ecx=2 и ecx=3:
3241
    * функция не возвращает значения
77 diamond 3242
 
6056 IgorA 3243
---------------------- Константы для регистров: ----------------------
3244
  eax - SF_SYS_MISC (68)
3245
  ebx - SSF_PERFORMANCE (2)
3246
  ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1),
3247
    SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3)
77 diamond 3248
======================================================================
3539 clevermous 3249
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
77 diamond 3250
======================================================================
3539 clevermous 3251
MSR = Model Specific Register; полный список MSR-регистров процессора
3252
содержится в документации по процессору (например, IA-32 Intel
77 diamond 3253
Architecture Software Developer's Manual, Volume 3, Appendix B);
3539 clevermous 3254
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3255
Параметры:
3256
  * eax = 68 - номер функции
3257
  * ebx = 3 - номер подфункции
3258
  * ecx игнорируется
3259
  * edx = адрес MSR
3260
Возвращаемое значение:
3261
  * ebx:eax = старший:младший dword результата
3262
Замечания:
3263
  * Указание в ecx несуществующего или нереализованного для данного
3264
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3265
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3266
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3267
    которое всё равно прибьёт поток.
77 diamond 3268
 
6056 IgorA 3269
---------------------- Константы для регистров: ----------------------
3270
  eax - SF_SYS_MISC (68)
3271
  ebx - SSF_READ_MSR (3)
77 diamond 3272
======================================================================
3539 clevermous 3273
========= Функция 68, подфункция 4 - записать в 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 = 4 - номер подфункции
3282
  * ecx игнорируется
3283
  * edx = адрес MSR
3284
  * esi:edi = старший:младший dword
3285
Возвращаемое значение:
3286
  * функция не возвращает значения
3287
Замечания:
3288
  * Указание в ecx несуществующего или нереализованного для данного
3289
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3290
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3291
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3292
    которое всё равно прибьёт поток.
77 diamond 3293
 
6056 IgorA 3294
---------------------- Константы для регистров: ----------------------
3295
  eax - SF_SYS_MISC (68)
3296
  ebx - SSF_WRITE_MSR (4)
77 diamond 3297
======================================================================
6974 0CodErr 3298
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
77 diamond 3299
======================================================================
3539 clevermous 3300
Параметры:
3301
  * eax = 68 - номер функции
3302
  * ebx = 11 - номер подфункции
3303
Возвращаемое значение:
3304
  * eax = 0 - неуспех
3305
  * иначе размер созданной кучи
3306
Замечания:
3307
  * Вызов функции инициализирует кучу, из которой впоследствии можно
6893 pathoswith 3308
    выделять и освобождать блоки памяти подфункциями 12, 13 и 20.
3309
  * Если куча уже создана, функция вернёт размер существующей кучи.
3539 clevermous 3310
    Размер кучи равен размеру всей свободной памяти приложения.
3311
  * После создания кучи вызовы функции 64 игнорируются.
77 diamond 3312
 
6056 IgorA 3313
---------------------- Константы для регистров: ----------------------
3314
  eax - SF_SYS_MISC (68)
3315
  ebx - SSF_HEAP_INIT (11)
77 diamond 3316
======================================================================
3539 clevermous 3317
========== Функция 68, подфункция 12 - выделить блок памяти. =========
77 diamond 3318
======================================================================
3539 clevermous 3319
Параметры:
3320
  * eax = 68 - номер функции
3321
  * ebx = 12 - номер подфункции
3322
  * ecx = требуемый размер в байтах
3323
Возвращаемое значение:
3324
  * eax = указатель на выделенный блок
3325
Замечания:
3326
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3327
    размер выделенного блока больше или равен запрошенному.
77 diamond 3328
 
6056 IgorA 3329
---------------------- Константы для регистров: ----------------------
3330
  eax - SF_SYS_MISC (68)
3331
  ebx - SSF_MEM_ALLOC (12)
77 diamond 3332
======================================================================
3539 clevermous 3333
========= Функция 68, подфункция 13 - освободить блок памяти. ========
77 diamond 3334
======================================================================
3539 clevermous 3335
Параметры:
3336
  * eax = 68 - номер функции
3337
  * ebx = 13 - номер подфункции
3338
  * ecx = указатель на блок памяти
3339
Возвращаемое значение:
3340
  * eax = 1 - успешно
3341
  * eax = 0 - неудача
3342
Замечания:
3343
  * Блок памяти должен быть ранее выделен подфункцией 12
3344
    или подфункцией 20.
77 diamond 3345
 
6056 IgorA 3346
---------------------- Константы для регистров: ----------------------
3347
  eax - SF_SYS_MISC (68)
3348
  ebx - SSF_MEM_FREE (13)
77 diamond 3349
======================================================================
3539 clevermous 3350
====================== Функция 68, подфункция 14 =====================
3351
====== Ожидать получения сигнала от других приложений/драйверов. =====
77 diamond 3352
======================================================================
3539 clevermous 3353
Параметры:
3354
  * eax = 68 - номер функции
3355
  * ebx = 14 - номер подфункции
3356
  * ecx = указатель на буфер для информации (24 байта)
3357
Возвращаемое значение:
3358
  * eax разрушается
3359
  * буфер, на который указывает ecx, содержит следующую информацию:
3360
    * +0: dword: идентификатор последующих данных сигнала
3361
    * +4: данные принятого сигнала (20 байт), формат которых
3362
          определяется первым dword-ом
77 diamond 3363
 
6056 IgorA 3364
---------------------- Константы для регистров: ----------------------
3365
  eax - SF_SYS_MISC (68)
3366
  ebx - SSF_WAIT_SIGNAL (14)
77 diamond 3367
======================================================================
3539 clevermous 3368
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
172 serge 3369
======================================================================
3539 clevermous 3370
Параметры:
3371
  * eax = 68 - номер функции
3372
  * ebx = 16 - номер подфункции
3373
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3374
Возвращаемое значение:
3375
  * eax = 0 - неудача
3376
  * иначе eax = хэндл драйвера
3377
Замечания:
3378
  * Если драйвер ещё не загружен, он загружается;
3379
    если драйвер уже загружен, ничего не меняется.
3380
  * Имя драйвера чувствительно к регистру символов.
3381
    Максимальная длина имени - 16 символов, включая завершающий
3382
    нулевой символ, остальные символы игнорируются.
9756 vitalkrilo 3383
  * Драйвер с именем ABC загружается из файла /sys/drivers/ABC.sys.
172 serge 3384
 
6056 IgorA 3385
---------------------- Константы для регистров: ----------------------
3386
  eax - SF_SYS_MISC (68)
3387
  ebx - SSF_LOAD_DRIVER (16)
172 serge 3388
======================================================================
3539 clevermous 3389
========== Функция 68, подфункция 17 - управление драйвером. =========
172 serge 3390
======================================================================
3539 clevermous 3391
Параметры:
3392
  * eax = 68 - номер функции
3393
  * ebx = 17 - номер подфункции
3394
  * ecx = указатель на управляющую структуру:
3395
    * +0: dword: хэндл драйвера
3396
    * +4: dword: код функции драйвера
3397
    * +8: dword: указатель на входные данные
3398
    * +12 = +0xC: dword: размер входных данных
3399
    * +16 = +0x10: dword: указатель на выходные данные
3400
    * +20 = +0x14: dword: размер выходных данных
3401
Возвращаемое значение:
3402
  * eax = определяется драйвером
3403
Замечания:
3404
  * Коды функций и структура входных/выходных данных
3405
    определяются драйвером.
3406
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
172 serge 3407
 
6056 IgorA 3408
---------------------- Константы для регистров: ----------------------
3409
  eax - SF_SYS_MISC (68)
3410
  ebx - SSF_CONTROL_DRIVER (17)
172 serge 3411
======================================================================
6798 pathoswith 3412
== Функция 68, подфункция 18 - загрузить DLL с указанием кодировки. ==
277 diamond 3413
======================================================================
3539 clevermous 3414
Параметры:
3415
  * eax = 68 - номер функции
6798 pathoswith 3416
  * ebx = 18 - номер подфункции
3417
  * ecx = указатель на строку с путём к DLL
3418
  * edx = кодировка строки, подробности указаны в описании функции 80.
3539 clevermous 3419
Возвращаемое значение:
3420
  * eax = 0 - неудача
3421
  * иначе eax = указатель на таблицу экспорта DLL
3422
Замечания:
3423
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
3424
    заканчивающийся нулём. Первый dword в структуре является
3425
    указателем на имя функции, второй содержит адрес функции.
277 diamond 3426
 
6798 pathoswith 3427
======================================================================
3428
============= Функция 68, подфункция 19 - загрузить DLL. =============
3429
======================================================================
3430
Параметры:
3431
  * eax = 68 - номер функции
3432
  * ebx = 19 - номер подфункции
3433
  * ecx = указатель на строку с путём к DLL,
3434
    правила формирования строки указаны в описании функции 70.
3435
Возвращаемое значение:
3436
  * eax = 0 - неудача
3437
  * иначе eax = указатель на таблицу экспорта DLL
3438
 
6056 IgorA 3439
---------------------- Константы для регистров: ----------------------
3440
  eax - SF_SYS_MISC (68)
3441
  ebx - SSF_LOAD_DLL (19)
277 diamond 3442
======================================================================
3539 clevermous 3443
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
448 diamond 3444
======================================================================
3539 clevermous 3445
Параметры:
3446
  * eax = 68 - номер функции
3447
  * ebx = 20 - номер подфункции
3448
  * ecx = новый размер в байтах
3449
  * edx = указатель на уже выделенный блок памяти
3450
Возвращаемое значение:
3451
  * eax = указатель на перераспределённый блок, 0 при ошибке
3452
Замечания:
6974 0CodErr 3453
  * Предварительно следует инициализировать кучу процесса вызовом
3454
    подфункции 11.
3539 clevermous 3455
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3456
    размер выделенного блока больше или равен запрошенному.
3457
  * Если edx=0, то вызов функции эквивалентен выделению памяти
3458
    подфункцией 12. В противном случае блок памяти по адресу edx
3459
    должен быть ранее выделен подфункцией 12 или
3460
    описываемой подфункцией.
3461
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
3462
    возвращает 0.
3463
  * Содержимое памяти вплоть до наименьшего из старого и нового
3464
    размеров сохраняется.
448 diamond 3465
 
6056 IgorA 3466
---------------------- Константы для регистров: ----------------------
3467
  eax - SF_SYS_MISC (68)
3468
  ebx - SSF_MEM_REALLOC (20)
1018 diamond 3469
======================================================================
3539 clevermous 3470
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
2646 mario79 3471
======================================================================
3539 clevermous 3472
Параметры:
3473
  * eax = 68 - номер функции
3474
  * ebx = 21 - номер подфункции
3475
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3476
  * edx = указатель на командную строку
3477
Возвращаемое значение:
3478
  * eax = 0 - неудача
3479
  * иначе eax = хэндл драйвера
3480
Замечания:
3481
  * Если драйвер ещё не загружен, он загружается;
3482
    если драйвер уже загружен, ничего не меняется.
2646 mario79 3483
 
6056 IgorA 3484
---------------------- Константы для регистров: ----------------------
3485
  eax - SF_SYS_MISC (68)
3486
  ebx - SSF_LOAD_DRIVER_PE (21)
2646 mario79 3487
======================================================================
3539 clevermous 3488
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
1018 diamond 3489
======================================================================
3539 clevermous 3490
Параметры:
3491
  * eax = 68 - номер функции
3492
  * ebx = 22 - номер подфункции
3493
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3494
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
3495
  * esi = флаги открытия и доступа:
3496
    * SHM_OPEN        = 0x00 - открыть существующую область памяти.
3497
                          Если область с таким именем не существует,
3498
                          функция вернёт код ошибки 5.
3499
    * SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
3500
                          область памяти.
3501
    * SHM_CREATE      = 0x08 - создать новую область памяти.
3502
                          Если область с таким именем уже существует,
3503
                          функция вернёт код ошибки 10.
3504
    * SHM_READ        = 0x00 - доступ только на чтение
3505
    * SHM_WRITE       = 0x01 - доступ на чтение и запись
3506
Возвращаемое значение:
3507
  * eax = указатель на область памяти, 0 при ошибке
3508
  * при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
3509
    edx = 0 - успех, иначе - код ошибки
3510
  * при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
3511
    edx = код ошибки (при eax=0) или размер области в байтах
3512
Коды ошибок:
1018 diamond 3513
  * E_NOTFOUND = 5
3514
  * E_ACCESS = 10
3515
  * E_NOMEM = 30
3516
  * E_PARAM = 33
3539 clevermous 3517
Замечания:
6974 0CodErr 3518
  * Предварительно следует инициализировать кучу процесса вызовом
3519
    подфункции 11.
3539 clevermous 3520
  * Если создаётся новая область, то флаги доступа устанавливают
3521
    максимальные права доступа для остальных процессов. Попытка
3522
    открытия другим потоком с неразрешёнными правами провалится
3523
    с кодом ошибки E_ACCESS.
3524
  * Процесс, создавший область, всегда имеет доступ на запись.
945 serge 3525
 
6056 IgorA 3526
---------------------- Константы для регистров: ----------------------
3527
  eax - SF_SYS_MISC (68)
3528
  ebx - SSF_MEM_OPEN (22)
1018 diamond 3529
======================================================================
3539 clevermous 3530
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
1018 diamond 3531
======================================================================
3539 clevermous 3532
Параметры:
3533
  * eax = 68 - номер функции
3534
  * ebx = 23 - номер подфункции
3535
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3536
Возвращаемое значение:
3537
  * eax разрушается
3538
Замечания:
3539
  * Область памяти физически освобождается (с забыванием всех данных
3540
    и высвобождением физической памяти), когда её закроют
3541
    все открывшие потоки.
3542
  * При завершении потока освобождаются все открытые им
3543
    области памяти.
945 serge 3544
 
6056 IgorA 3545
---------------------- Константы для регистров: ----------------------
3546
  eax - SF_SYS_MISC (68)
3547
  ebx - SSF_MEM_CLOSE (23)
448 diamond 3548
======================================================================
3539 clevermous 3549
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
1077 Galkov 3550
======================================================================
3539 clevermous 3551
Параметры:
3552
  * eax = 68 - номер функции
3553
  * ebx = 24 - номер подфункции
3554
  * ecx = адрес нового обработчика исключений
3555
  * edx = маска обрабатываемых исключений
3556
Возвращаемое значение:
3557
  * eax = адрес старого обработчика исключений (0, если не установлен)
3558
  * ebx = маска старого обработчика исключений
3559
Замечания:
3560
  * Номер бита в маске исключений соответствует номеру исключения по
3561
    спецификации на процессор (Intel-PC). Так, например, исключения
3562
    FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
3563
  * В данной реализации игнорируется запрос на перехват исключения 7
3564
    - система обрабатывает #NM самостоятельно.
3565
  * Пользовательский обработчик получает номер исключения параметром
3566
    в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
3567
    при этом производится на команду, вызвавшую исключение.
3568
  * При передаче управления обработчику исключений сбрасывается
3569
    соответствующий бит в маске исключений. Возникновение этого же
3570
    исключения впоследствии приведёт к умолчальной обработке такового.
3571
    А именно: к завершению работы приложения в отсутствии отладчика,
3572
    приостановка с уведомлением отлаживающего приложения иначе.
3573
  * После завершения критических действий в обработчике пользователя
3574
    восстановление бита маски данного исключения можно сделать
9976 Jurgen 3575
    подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
3576
 
3577
Внимание:
10002 Jurgen 3578
    1) Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен стартовый адрес резервного стека в регистре ESI.
3579
	При возникновении исключения (#SS), в этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK  sys32.inc).
3580
	При завершении обработки этого исключения, пользовательский обработчик должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
9976 Jurgen 3581
 
10002 Jurgen 3582
	2) Вы можете использовать режим "контролируемое исключение" для проверок на корректность адресов памяти при считывании\записи данных.
3583
	Для этого:
3584
    - В регистр ESI заносится адрес, куда должно перейти выполнение кода при возникновении исключения.
3585
	- В регистр EDI заносится сигнатура - текст 'EXPT'.
3586
 
1077 Galkov 3587
 
6056 IgorA 3588
---------------------- Константы для регистров: ----------------------
3589
  eax - SF_SYS_MISC (68)
3590
  ebx - SSF_SET_EXCEPTION_HANDLER (24)
1077 Galkov 3591
======================================================================
3539 clevermous 3592
= Функция 68, подфункция 25 - изменить состояние активности сигнала. =
1077 Galkov 3593
======================================================================
3539 clevermous 3594
Параметры:
3595
  * eax = 68 - номер функции
3596
  * ebx = 25 - номер подфункции
3597
  * ecx = номер сигнала
3598
  * edx = значение устанавливаемой активности (0/1)
3599
Возвращаемое значение:
3600
  * eax = -1 - задан неверный номер сигнала
3601
  * иначе eax = старое значение активности сигнала (0/1)
3602
Замечания:
3603
  * В текущей реализации изменяется только маска пользовательского
3604
    обработчика исключений, установленного подфункцией 24. При этом
3605
    номер сигнала соответствует номеру исключения.
1077 Galkov 3606
 
6056 IgorA 3607
---------------------- Константы для регистров: ----------------------
3608
  eax - SF_SYS_MISC (68)
3609
  ebx - SSF_SET_EXCEPTION_STATE (25)
1077 Galkov 3610
======================================================================
6798 pathoswith 3611
======= Функция 68, подфункция 26 - освободить страницы памяти =======
4193 lev 3612
======================================================================
3613
Параметры:
3614
  * eax = 68 - номер функции
3615
  * ebx = 26 - номер подфункции
3616
  * ecx = указатель на блок памяти выделенный подфункцией 12
3617
  * edx = смещение от начала блока
3618
  * esi = размер высвобождаемого блока памяти, в байтах
3619
Примечания:
3620
  * функция освобождает страницы с ecx+edx по ecx+edx+esi
3621
    и устанавливает виртуальную память в зарезервированное состояние.
3622
 
6056 IgorA 3623
---------------------- Константы для регистров: ----------------------
3624
  eax - SF_SYS_MISC (68)
3625
  ebx - SSF_MEM_FREE_EXT (26)
4193 lev 3626
======================================================================
6798 pathoswith 3627
============= Функция 68, подфункция 27 - загрузить файл =============
4193 lev 3628
======================================================================
3629
Параметры:
3630
  * eax = 68 - номер функции
3631
  * ebx = 27 - номер подфункции
6511 pathoswith 3632
  * ecx = указатель на строку с путём к файлу,
3633
    правила формирования строки указаны в описании функции 70.
4193 lev 3634
Возвращаемое значение:
3635
  * eax = указатель на загруженный файл или 0
3636
  * edx = размер загруженного файла или 0
3637
Примечания:
3638
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
6974 0CodErr 3639
  * Предварительно следует инициализировать кучу процесса вызовом
3640
    подфункции 11.
4193 lev 3641
 
6056 IgorA 3642
---------------------- Константы для регистров: ----------------------
3643
  eax - SF_SYS_MISC (68)
3644
  ebx - SSF_LOAD_FILE (27)
4193 lev 3645
======================================================================
6798 pathoswith 3646
== Функция 68, подфункция 28 - загрузить файл с указанием кодировки ==
3647
======================================================================
3648
Параметры:
3649
  * eax = 68 - номер функции
3650
  * ebx = 28 - номер подфункции
3651
  * ecx = указатель на строку с путём к файлу
3652
  * edx = кодировка строки, подробности указаны в описании функции 80.
3653
Возвращаемое значение:
3654
  * eax = указатель на загруженный файл или 0
3655
  * edx = размер загруженного файла или 0
3656
Примечания:
3657
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
3658
 
3659
======================================================================
9779 Doczom 3660
======== Функция 68, подфункция 29 - allocate ring memory. =========
3661
======================================================================
3662
Parameters:
3663
  * eax = 68 - function number
3664
  * ebx = 29 - subfunction number
3665
  * ecx = required size in bytes
3666
Returned value:
3667
  * eax = 0 - failed
3668
  * eax = pointer to the allocated ring
3669
Remarks:
3670
  * The requested size must be an exact multiple of pagesize (4 Kb)
3671
  * The function allocates memory in such a way that you can read and
3672
    write beyond the size of the allocated memory and will reach the
3673
    beginning of the buffer again.
3674
 
3675
 
3676
======================================================================
3677
======== Функция 68, подфункция 31 - получить данные драйвера. =======
3678
======================================================================
3679
Параметры:
3680
  * eax = 68 - номер функции
3681
  * ebx = 31 - номер подфункции
3682
  * ecx = функция (1 - получить начальные значения списка,
3683
                   2 - получить элемент списка)
3684
  * edx = Если ecx=2 указатель на структуру.
3685
  * edi = Если ecx=2 указатель на память под структуру
3686
Возвращаемое значение:
3687
  * Если ecx = 1, то ebx = fd
3688
                     ecx = bk
3689
  * Если ecx = 2, то eax = 0  операция прошла успешно
3690
                     eax = -1 ошибка
3691
Примечания:
3692
  * возвращаемая структура
3693
   data_service:
3694
     .name:         rb 16
3695
     .fd:           rd 1
3696
     .bk:           rd 1
3697
     .base:         rd 1
3698
     .entry:        rd 1
3699
     .srv_proc:     rd 1
3700
 
3701
======================================================================
3539 clevermous 3702
======================== Функция 69 - отладка. =======================
77 diamond 3703
======================================================================
3539 clevermous 3704
Процесс может загрузить другой процесс как отлаживаемый установкой
3705
соответствующего бита при вызове подфункции 7 функции 70.
3706
У процесса может быть только один отладчик; один процесс может
3707
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3708
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3709
определённый подфункцией 0.
3710
Формат сообщения:
3711
  * +0: dword: код сообщения
3712
  * +4: dword: PID отлаживаемого процесса
3713
  * +8: могут присутствовать дополнительные данные,
3714
    определяемые кодом сообщения
3715
Коды сообщений:
3716
  * 1 = исключение
3717
    * дополнительно передаётся dword-номер исключения
3718
    * процесс приостановлен
3719
  * 2 = процесс завершился
3720
    * приходит при любом завершении: как через системную функцию -1,
3721
      так и при "убийстве" любым другим процессом
3722
      (в том числе самим отладчиком)
3723
  * 3 = отладочное исключение int 1 = #DB
3724
    * дополнительно передаётся dword-образ регистра DR6:
3725
      * биты 0-3: выполнено условие соответствующей точки останова
3726
        (установленной подфункцией 9)
3727
      * бит 14: исключение произошло из-за режима
3728
        пошаговой трассировки (установлен флаг TF)
3729
    * процесс приостановлен
3730
При завершении отладчика прибиваются все отлаживаемые процессы.
3731
Если отладчик этого не хочет, он должен предварительно отключиться
3732
подфункцией 3.
77 diamond 3733
 
3539 clevermous 3734
Все подфункции применимы только к процессам/потокам, запущенным
3735
из текущего функцией 70 с установленным флагом отладки.
3736
Отладка многопоточных программ пока не поддерживается.
3737
Полный список подфункций:
3738
  * подфункция 0 - определить область данных для отладочных сообщений
3739
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3740
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3741
  * подфункция 3 - отключиться от отлаживаемого процесса
3742
  * подфункция 4 - приостановить отлаживаемый поток
3743
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3744
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3745
  * подфункция 7 - записать в память отлаживаемого процесса
3746
  * подфункция 8 - завершить отлаживаемый поток
3747
  * подфункция 9 - установить/снять аппаратную точку останова
77 diamond 3748
 
6056 IgorA 3749
---------------------- Константы для регистров: ----------------------
3750
  eax - SF_DEBUG (69)
3751
  ebx - SSF_SET_MESSAGE_AREA (0), SSF_GET_REGISTERS (1),
3752
    SSF_SET_REGISTERS (2), SSF_DETACH (3), SSF_SUSPEND (4),
3753
    SSF_RESUME (5), SSF_READ_MEMORY (6), SSF_WRITE_MEMORY (7),
3754
    SSF_TERMINATE (8), SSF_DEFINE_BREAKPOINT (9)
77 diamond 3755
======================================================================
3539 clevermous 3756
====================== Функция 69, подфункция 0 ======================
3757
========= Определить область данных для отладочных сообщений. ========
77 diamond 3758
======================================================================
3539 clevermous 3759
Параметры:
3760
  * eax = 69 - номер функции
3761
  * ebx = 0 - номер подфункции
3762
  * ecx = указатель
3763
Формат области данных:
3764
  * +0: dword: N = размер буфера (не считая этого заголовка)
3765
  * +4: dword: занято в буфере
3766
  * +8: N*byte: буфер
3767
Возвращаемое значение:
3768
  * функция не возвращает значения
3769
Замечания:
3770
  * Если поле размера отрицательно, буфер считается заблокированным
3771
    и при поступлении нового сообщения система будет ждать.
3772
    Для синхронизации обрамляйте всю работу с буфером операциями
3773
    блокировки/разблокировки
1662 Nasarus 3774
    	neg	[bufsize]
3539 clevermous 3775
  * Данные в буфере трактуются как массив элементов переменной длины -
3776
    сообщений. Формат сообщения указан в общем описании.
77 diamond 3777
 
6056 IgorA 3778
---------------------- Константы для регистров: ----------------------
3779
  eax - SF_DEBUG (69)
3780
  ebx - SSF_SET_MESSAGE_AREA (0)
77 diamond 3781
======================================================================
3539 clevermous 3782
====================== Функция 69, подфункция 1 ======================
3783
========= Получить состояние регистров отлаживаемого потока. =========
77 diamond 3784
======================================================================
3539 clevermous 3785
Параметры:
3786
  * eax = 69 - номер функции
3787
  * ebx = 1 - номер подфункции
3788
  * ecx = идентификатор потока
3789
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3790
  * esi = указатель на структуру контекста
3791
Возвращаемое значение:
3792
  * функция не возвращает значения
3793
Формат структуры контекста: (FPU пока не поддерживается)
77 diamond 3794
  * +0: dword: eip
3795
  * +4: dword: eflags
3796
  * +8: dword: eax
3797
  * +12 = +0xC: dword: ecx
3798
  * +16 = +0x10: dword: edx
3799
  * +20 = +0x14: dword: ebx
3800
  * +24 = +0x18: dword: esp
3801
  * +28 = +0x1C: dword: ebp
3802
  * +32 = +0x20: dword: esi
3803
  * +36 = +0x24: dword: edi
3539 clevermous 3804
Замечания:
3805
  * Если поток выполняет код 0-кольца, возвращается
3806
    состояние регистров 3-кольца.
3807
  * Процесс должен быть загружен для отладки (как указано в
3808
    общем описании).
77 diamond 3809
 
6056 IgorA 3810
---------------------- Константы для регистров: ----------------------
3811
  eax - SF_DEBUG (69)
3812
  ebx - SSF_GET_REGISTERS (1)
77 diamond 3813
======================================================================
3539 clevermous 3814
====================== Функция 69, подфункция 2 ======================
3815
======== Установить состояние регистров отлаживаемого потока. ========
77 diamond 3816
======================================================================
3539 clevermous 3817
Параметры:
3818
  * eax = 69 - номер функции
3819
  * ebx = 2 - номер подфункции
3820
  * ecx = идентификатор потока
3821
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3822
  * esi = указатель на структуру контекста
3823
Возвращаемое значение:
3824
  * функция не возвращает значения
3825
Формат структуры контекста указан в описании подфункции 1.
3826
Замечания:
3827
  * Если поток выполняет код 0-кольца, устанавливается
3828
    состояние регистров 3-кольца.
3829
  * Процесс должен быть загружен для отладки (как указано в
3830
    общем описании).
77 diamond 3831
 
6056 IgorA 3832
---------------------- Константы для регистров: ----------------------
3833
  eax - SF_DEBUG (69)
3834
  ebx - SSF_SET_REGISTERS (2)
77 diamond 3835
======================================================================
3539 clevermous 3836
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
77 diamond 3837
======================================================================
3539 clevermous 3838
Параметры:
3839
  * eax = 69 - номер функции
3840
  * ebx = 3 - номер подфункции
3841
  * ecx = идентификатор
3842
Возвращаемое значение:
3843
  * функция не возвращает значения
3844
Замечания:
3845
  * Если процесс был приостановлен, он возобновляет выполнение.
77 diamond 3846
 
6056 IgorA 3847
---------------------- Константы для регистров: ----------------------
3848
  eax - SF_DEBUG (69)
3849
  ebx - SSF_DETACH (3)
77 diamond 3850
======================================================================
3539 clevermous 3851
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
77 diamond 3852
======================================================================
3539 clevermous 3853
Параметры:
3854
  * eax = 69 - номер процесса
3855
  * ebx = 4 - номер подфункции
3856
  * ecx = идентификатор
3857
Возвращаемое значение:
3858
  * функция не возвращает значения
3859
Замечания:
3860
  * Процесс должен быть загружен для отладки (как указано в
3861
    общем описании).
77 diamond 3862
 
6056 IgorA 3863
---------------------- Константы для регистров: ----------------------
3864
  eax - SF_DEBUG (69)
3865
  ebx - SSF_SUSPEND (4)
77 diamond 3866
======================================================================
3539 clevermous 3867
====================== Функция 69, подфункция 5 ======================
3868
============ Возобновить выполнение отлаживаемого потока. ============
77 diamond 3869
======================================================================
3539 clevermous 3870
Параметры:
3871
  * eax = 69 - номер функции
3872
  * ebx = 5 - номер подфункции
3873
  * ecx = идентификатор
3874
Возвращаемое значение:
3875
  * функция не возвращает значения
3876
Замечания:
3877
  * Процесс должен быть загружен для отладки (как указано в
3878
    общем описании).
77 diamond 3879
 
6056 IgorA 3880
---------------------- Константы для регистров: ----------------------
3881
  eax - SF_DEBUG (69)
3882
  ebx - SSF_RESUME (5)
77 diamond 3883
======================================================================
3539 clevermous 3884
====================== Функция 69, подфункция 6 ======================
3885
============= Прочитать из памяти отлаживаемого процесса. ============
77 diamond 3886
======================================================================
3539 clevermous 3887
Параметры:
3888
  * eax = 69 - номер функции
3889
  * ebx = 6 - номер подфункции
3890
  * ecx = идентификатор
3891
  * edx = сколько байт читать
3892
  * esi = адрес памяти отлаживаемого процесса
3893
  * edi = указатель на буфер для данных
3894
Возвращаемое значение:
3895
  * eax = -1 при ошибке (неверный PID или буфер)
3896
  * иначе eax = число прочитанных байт (возможно, 0,
3897
    если в esi слишком большое значение)
3898
Замечания:
3899
  * Процесс должен быть загружен для отладки (как указано в
3900
    общем описании).
77 diamond 3901
 
6056 IgorA 3902
---------------------- Константы для регистров: ----------------------
3903
  eax - SF_DEBUG (69)
3904
  ebx - SSF_READ_MEMORY (6)
77 diamond 3905
======================================================================
3780 Serge 3906
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
77 diamond 3907
======================================================================
3539 clevermous 3908
Параметры:
3909
  * eax = 69 - номер функции
3910
  * ebx = 7 - номер подфункции
3911
  * ecx = идентификатор
3912
  * edx = сколько байт писать
3913
  * esi = адрес памяти в отлаживаемом процессе
3914
  * edi = указатель на данные
3915
Возвращаемое значение:
3916
  * eax = -1 при ошибке (неверный PID или буфер)
3917
  * иначе eax = число записанных байт (возможно, 0,
3918
    если в esi слишком большое значение)
3919
Замечания:
3920
  * Процесс должен быть загружен для отладки (как указано в
3921
    общем описании).
77 diamond 3922
 
6056 IgorA 3923
---------------------- Константы для регистров: ----------------------
3924
  eax - SF_DEBUG (69)
3925
  ebx - SSF_WRITE_MEMORY (7)
77 diamond 3926
======================================================================
3539 clevermous 3927
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
77 diamond 3928
======================================================================
3539 clevermous 3929
Параметры:
3930
  * eax = 69 - номер функции
3931
  * ebx = 8 - номер подфункции
3932
  * ecx = идентификатор
3933
Возвращаемое значение:
3934
  * функция не возвращает значения
3935
Замечания:
3936
  * Процесс должен быть загружен для отладки (как указано в
3937
    общем описании).
3938
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
3939
    требуется выполнение первого замечания и принимается PID,
3940
    а не номер слота.
77 diamond 3941
 
6056 IgorA 3942
---------------------- Константы для регистров: ----------------------
3943
  eax - SF_DEBUG (69)
3944
  ebx - SSF_TERMINATE (8)
77 diamond 3945
======================================================================
3539 clevermous 3946
====================== Функция 69, подфункция 9 ======================
3947
============= Установить/снять аппаратную точку останова. ============
77 diamond 3948
======================================================================
3539 clevermous 3949
Параметры:
3950
  * eax = 69 - номер функции
3951
  * ebx = 9 - номер подфункции
3952
  * ecx = идентификатор потока
3953
  * dl = индекс точки останова, от 0 до 3 включительно
3954
  * dh = флаги:
3955
    * если старший бит сброшен - установить точку останова:
3956
      * биты 0-1 - условие:
3957
        * 00 = точка останова на выполнение
3958
        * 01 = точка останова на запись
3959
        * 11 = точка останова на чтение/запись
3960
      * биты 2-3 - длина; для точек останова на исполнение должно быть
3961
        00, в противном случае одно из
3962
        * 00 = байт
3963
        * 01 = слово
3964
        * 11 = двойное слово
3965
      * esi = адрес точки останова; должен быть выровнен
3966
        соответственно длине (т.е. должен быть чётным для
3967
        точек останова на слово, кратен 4 для двойного слова)
3968
    * если старший бит установлен - сбросить точку останова
3969
Возвращаемое значение:
3970
  * eax = 0 - успешно
3971
  * eax = 1 - ошибка во входных данных
3972
  * eax = 2 - (зарезервировано, никогда не возвращается
3973
    в текущей реализации) с этим индексом уже установлена
3974
    глобальная точка останова
3975
Замечания:
3976
  * Процесс должен быть загружен для отладки (как указано в
3977
    общем описании).
3978
  * Аппаратные точки останова реализуются через DRx-регистры
3979
    процессора, отсюда все ограничения.
3980
  * Функция может переустановить ранее установленную ей же
3981
    точку останова (никак не сообщая об этом).
3982
    Ведите список установленных точек останова в отладчике.
3983
  * Срабатывание точки останова заключается в генерировании
3984
    отладочного исключения #DB, о котором система сообщает отладчику.
3985
  * Точка останова на запись и чтение/запись срабатывает после
3986
    выполнения вызвавшей её инструкции.
77 diamond 3987
 
6056 IgorA 3988
---------------------- Константы для регистров: ----------------------
3989
  eax - SF_DEBUG (69)
3990
  ebx - SSF_DEFINE_BREAKPOINT (9)
77 diamond 3991
======================================================================
3539 clevermous 3992
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
77 diamond 3993
======================================================================
3539 clevermous 3994
Параметры:
77 diamond 3995
  * eax = 70
3539 clevermous 3996
  * ebx = указатель на информационную структуру
3997
Возвращаемое значение:
3998
  * eax = 0 - успешно; иначе код ошибки файловой системы
3999
  * в зависимости от подфункции может возвращаться значение и
4000
    в других регистрах
4001
Общий формат информационной структуры:
4002
  * +0: dword: номер подфункции
6798 pathoswith 4003
  * +4: dword: смещение в файле или папке
4004
  * +8: dword: старшая часть смещения или поле флагов
4005
  * +12 = +0xC: dword: размер данных
3539 clevermous 4006
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4007
  * +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
6502 pathoswith 4008
  или
6473 pathoswith 4009
  * +20 = +0x14: byte: 0
4010
  * +21 = +0x15: dword: указатель на строку
4011
Чувствительность к регистру букв зависит от файловой системы.
6758 pathoswith 4012
Если путь начинается не с '/', то он считается относительным.
4013
Получить или установить текущую папку можно с помощью сисфункции 30.
6798 pathoswith 4014
'../' в пути означает подъём на одну папку относительно текущей.
6758 pathoswith 4015
Можно указать кодировку строки, поместив в её начале байт со значениями:
6502 pathoswith 4016
  * 1 = cp866
4017
  * 2 = UTF-16LE
4018
  * 3 = UTF-8
6758 pathoswith 4019
иначе будет использоваться кодировка cp866. В абсолютном пути можно
4020
поместить этот байт после '/' или добавить дополнительный '/' перед ним.
6798 pathoswith 4021
Также, можно использовать сисфункцию 80.
6758 pathoswith 4022
Формат абсолютного пути:
6473 pathoswith 4023
  /base/number/dir1/dir2/.../dirn/file,
4024
где base/number идентифицирует устройство, на котором ищется файл:
4025
  * RD/1 = рамдиск
4026
  * FD/1 = первый флоппи-дисковод,
4027
    FD/2 = второй флоппи-дисковод
4028
  * HD0/x, HD1/x, HD2/x, HD3/x = жёсткие диски соответственно на
4029
    IDE0 (Primary Master), IDE1 (Primary Slave),
77 diamond 4030
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
6473 pathoswith 4031
    x - номер раздела на выбранном винчестере, начиная с 1
4032
  * CD0/1, CD1/1, CD2/1, CD3/1 = аналогично для cd
7722 dunkaist 4033
  * SYS - системная папка (является ключом, не зависит от кодировки),
6473 pathoswith 4034
    второй ключ может быть установлен сисфункцией 30.3.
3539 clevermous 4035
Примеры:
6473 pathoswith 4036
  * '/sys/example.asm',0
4037
  * '/rd/1/example.asm',0
4038
  * '/HD0/1/folder/file.txt',0
4039
  * '/hd2/2/pics/tanzania.bmp',0
4040
  * 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0
1662 Nasarus 4041
 
3539 clevermous 4042
Доступные подфункции:
4043
  * подфункция 0 - чтение файла
4044
  * подфункция 1 - чтение папки
4045
  * подфункция 2 - создание/перезапись файла
4046
  * подфункция 3 - запись в существующий файл
4047
  * подфункция 4 - установка размера файла
4048
  * подфункция 5 - получение атрибутов файла/папки
4049
  * подфункция 6 - установка атрибутов файла/папки
4050
  * подфункция 7 - запуск программы
4051
  * подфункция 8 - удаление файла/папки
4052
  * подфункция 9 - создание папки
4053
Для CD-приводов в связи с аппаратными ограничениями доступны
4054
только подфункции 0,1,5 и 7, вызов других подфункций завершится
4055
ошибкой с кодом 2.
4056
При первом обращении подфункций 0,1,5,7 к устройствам ATAPI
4057
(CD и DVD) производится блокировка ручного управления механизмом
4058
лотка. Это связано с кэшированием данных, полученных от привода.
4059
Разблокировка осуществляется при обращении подфункции 4 функции 24
4060
к соответствующему устройству.
77 diamond 4061
 
6056 IgorA 4062
---------------------- Константы для регистров: ----------------------
4063
  eax - SF_FILE (70)
4064
 [ebx] - SSF_READ_FILE (0), SSF_READ_FOLDER (1), SSF_CREATE_FILE (2),
4065
    SSF_WRITE_FILE (3), SSF_SET_END (4), SSF_GET_INFO (5),
4066
    SSF_SET_INFO (6), SSF_START_APP (7), SSF_DELETE (8),
4067
    SSF_CREATE_FOLDER (9)
77 diamond 4068
======================================================================
3539 clevermous 4069
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
77 diamond 4070
======================================================================
3539 clevermous 4071
Параметры:
4072
  * eax = 70 - номер функции
4073
  * ebx = указатель на информационную структуру
4074
Формат информационной структуры:
4075
  * +0: dword: 0 = номер подфункции
4076
  * +4: dword: позиция в файле (в байтах)
4077
  * +8: dword: 0 (зарезервировано под старший dword позиции)
4078
  * +12 = +0xC: dword: сколько байт читать
4079
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
6473 pathoswith 4080
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4081
Возвращаемое значение:
4082
  * eax = 0 - успешно, иначе код ошибки файловой системы
6880 pathoswith 4083
  * ebx = число прочитанных байт
3539 clevermous 4084
Замечания:
4085
  * Если файл кончился раньше, чем был прочитан последний запрошенный
4086
    блок, то функция прочитает, сколько сможет, после чего вернёт
77 diamond 4087
    eax=6 (EOF).
3539 clevermous 4088
  * Функция не позволяет читать папки
4089
    (вернётся eax=10, access denied).
77 diamond 4090
 
6056 IgorA 4091
---------------------- Константы для регистров: ----------------------
4092
  eax - SF_FILE (70)
4093
 [ebx] - SSF_READ_FILE (0)
77 diamond 4094
======================================================================
3539 clevermous 4095
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
77 diamond 4096
======================================================================
3539 clevermous 4097
Параметры:
4098
  * eax = 70 - номер функции
4099
  * ebx = указатель на информационную структуру
4100
Формат информационной структуры:
4101
  * +0: dword: 1 = номер подфункции
4102
  * +4: dword: индекс начального блока (считая с 0)
6473 pathoswith 4103
  * +8: dword: в какой кодировке возвращать имена:
6798 pathoswith 4104
 
4105
    1 = cp866
4106
    2 = UTF-16LE
4107
    3 = UTF-8
3539 clevermous 4108
  * +12 = +0xC: dword: сколько блоков читать
6798 pathoswith 4109
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные.
6473 pathoswith 4110
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4111
Возвращаемое значение:
4112
  * eax = 0 - успешно, иначе код ошибки файловой системы
6880 pathoswith 4113
  * ebx = число файлов, информация о которых была записана в буфер
3539 clevermous 4114
Структура буфера:
6473 pathoswith 4115
  * заголовок (32 байта)
4116
  * блок с информацией о файле 1
4117
  * блок с информацией о файле 2
77 diamond 4118
  * ...
3539 clevermous 4119
Структура заголовка:
4120
  * +0: dword: версия структуры (текущая версия = 1)
4121
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
4122
    в поле +12 информационной структуры; может быть меньше,
4123
    если в папке кончились файлы (то же самое, что и в ebx)
4124
  * +8: dword: общее число файлов в папке
4125
  * +12 = +0xC: 20*byte: зарезервировано (нули)
4126
Структура блока данных входа каталога (БДВК):
4127
  * +0: dword: атрибуты файла:
4128
    * бит 0 (маска 1): файл только для чтения
4129
    * бит 1 (маска 2): файл является скрытым
4130
    * бит 2 (маска 4): файл является системным
6901 pathoswith 4131
    * бит 3 (маска 8): это метка тома (возвращается подфункцией 5)
3539 clevermous 4132
    * бит 4 (маска 0x10): это папка
4133
    * бит 5 (маска 0x20): файл не архивировался - многие программы
4134
      архивации имеют опцию, по которой архивируются только файлы
4135
      с установленным этим битом, после чего этот бит сбрасывается -
4136
      это может быть полезно для автоматического создания
4137
      backup-архивов, ибо при записи бит обычно устанавливается
4138
      (не в Kolibri, правда)
6798 pathoswith 4139
  * +4: dword: кодировка имени, соответствует полю +8 информационной структуры
3539 clevermous 4140
  * +8: 4*byte: время создания файла
4141
  * +12 = +0xC: 4*byte: дата создания файла
4142
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
4143
  * +20 = +0x14: 4*byte: дата последнего доступа
4144
  * +24 = +0x18: 4*byte: время последней модификации
4145
  * +28 = +0x1C: 4*byte: дата последней модификации
4146
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
6798 pathoswith 4147
  * +40 = +0x28: имя, размер в cp866 составляет 264 байта, иначе - 520 байт.
3539 clevermous 4148
Формат времени:
4149
  * +0: byte: секунды
4150
  * +1: byte: минуты
4151
  * +2: byte: часы
4152
  * +3: byte: зарезервировано (0)
4153
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
4154
Формат даты:
4155
  * +0: byte: день
4156
  * +1: byte: месяц
4157
  * +2: word: год
4158
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
9745 sober_dev 4159
    Некоторые файловые системы ведут дату с 01.01.1980,
4160
    например: FAT12/16/32 и exFAT
3539 clevermous 4161
Замечания:
6798 pathoswith 4162
  * Если БДВК содержит имя в cp866, то длина БДВК составляет
4163
    304 байта, иначе - 560 байт.
6473 pathoswith 4164
  * Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
3539 clevermous 4165
  * Если файлы в папке кончились раньше, чем было прочитано
4166
    запрошенное количество, то функция прочитает, сколько сможет,
4167
    после чего вернёт eax=6 (EOF).
4168
  * Любая папка на диске, кроме корневой, содержит два специальных
4169
    входа "." и "..", идентифицирующих соответственно саму папку и
4170
    родительскую папку.
4171
  * Функция позволяет также читать виртуальные папки "/", "/rd",
4172
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
6473 pathoswith 4173
    0x10, а времена и даты обнулены.
77 diamond 4174
 
6056 IgorA 4175
---------------------- Константы для регистров: ----------------------
4176
  eax - SF_FILE (70)
4177
 [ebx] - SSF_READ_FOLDER (1)
77 diamond 4178
======================================================================
3539 clevermous 4179
====================== Функция 70, подфункция 2 ======================
4180
======== Создание/перезапись файла с поддержкой длинных имён. ========
83 diamond 4181
======================================================================
3539 clevermous 4182
Параметры:
4183
  * eax = 70 - номер функции
4184
  * ebx = указатель на информационную структуру
4185
Формат информационной структуры:
4186
  * +0: dword: 2 = номер подфункции
4187
  * +4: dword: 0 (зарезервировано)
4188
  * +8: dword: 0 (зарезервировано)
4189
  * +12 = +0xC: dword: сколько байт писать
4190
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4191
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4192
Возвращаемое значение:
4193
  * eax = 0 - успешно, иначе код ошибки файловой системы
4194
  * ebx = число записанных байт (возможно, 0)
4195
Замечания:
4196
  * Если файл с таким именем не существовал, он создаётся; если
4197
    существовал, то перезаписывается.
4198
  * Если свободного места на диске недостаточно, то функция запишет,
4199
    сколько сможет, после чего вернёт код ошибки 8.
4200
  * Функция не поддерживается для CD (вернётся код ошибки 2).
83 diamond 4201
 
6056 IgorA 4202
---------------------- Константы для регистров: ----------------------
4203
  eax - SF_FILE (70)
4204
 [ebx] - SSF_CREATE_FILE (2)
83 diamond 4205
======================================================================
3539 clevermous 4206
====================== Функция 70, подфункция 3 ======================
4207
======== Запись в существующий файл с поддержкой длинных имён. =======
131 diamond 4208
======================================================================
3539 clevermous 4209
Параметры:
4210
  * eax = 70 - номер функции
4211
  * ebx = указатель на информационную структуру
4212
Формат информационной структуры:
4213
  * +0: dword: 3 = номер подфункции
4214
  * +4: dword: позиция в файле (в байтах)
4215
  * +8: dword: старший dword позиции (должен быть 0 для FAT)
4216
  * +12 = +0xC: dword: сколько байт писать
4217
  * +16 = +0x10: dword: указатель на данные
6473 pathoswith 4218
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4219
Возвращаемое значение:
4220
  * eax = 0 - успешно, иначе код ошибки файловой системы
4221
  * ebx = число записанных байт (возможно, 0)
4222
Замечания:
4223
  * Файл должен уже существовать, иначе вернётся eax=5.
4224
  * Единственным результатом записи 0 байт является установка в
4225
    атрибутах файла даты/времени модификации и доступа в текущую.
4226
  * Если начальная и/или конечная позиция выходит за пределы файла
4227
    (за исключением предыдущего случая), файл расширяется до
4228
    необходимого размера нулевыми символами.
4229
  * Функция не поддерживается для CD (вернётся код ошибки 2).
131 diamond 4230
 
6056 IgorA 4231
---------------------- Константы для регистров: ----------------------
4232
  eax - SF_FILE (70)
4233
 [ebx] - SSF_WRITE_FILE (3)
131 diamond 4234
======================================================================
3539 clevermous 4235
========= Функция 70, подфункция 4 - установка размера файла. ========
133 diamond 4236
======================================================================
3539 clevermous 4237
Параметры:
4238
  * eax = 70 - номер функции
4239
  * ebx = указатель на информационную структуру
4240
Формат информационной структуры:
4241
  * +0: dword: 4 = номер подфункции
4242
  * +4: dword: младший dword нового размера файла
4243
  * +8: dword: старший dword нового размера файла
4244
  * +12 = +0xC: dword: 0 (зарезервировано)
4245
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4246
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4247
Возвращаемое значение:
4248
  * eax = 0 - успешно, иначе код ошибки файловой системы
4249
  * ebx разрушается
4250
Замечания:
6758 pathoswith 4251
  * Если новый размер файла меньше старого, файл усекается.
4252
    Если новый размер больше старого, файл расширяется, и если
4253
    разница в размере не больше 16 МБ, новое место очищается нулями.
3539 clevermous 4254
  * Если свободного места на диске недостаточно для расширения файла,
4255
    то функция расширит насколько возможно, после чего вернёт
4256
    код ошибки 8.
4257
  * Функция не поддерживается для CD (вернётся код ошибки 2).
133 diamond 4258
 
6056 IgorA 4259
---------------------- Константы для регистров: ----------------------
4260
  eax - SF_FILE (70)
4261
 [ebx] - SSF_SET_END (4)
133 diamond 4262
======================================================================
3539 clevermous 4263
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
86 diamond 4264
======================================================================
3539 clevermous 4265
Параметры:
4266
  * eax = 70 - номер функции
4267
  * ebx = указатель на информационную структуру
4268
Формат информационной структуры:
4269
  * +0: dword: 5 = номер подфункции
4270
  * +4: dword: 0 (зарезервировано)
6427 pathoswith 4271
  * +8: dword: 0 или флаги (для корневого каталога)
3539 clevermous 4272
  * +12 = +0xC: dword: 0 (зарезервировано)
4273
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
4274
                        (40 байт)
6473 pathoswith 4275
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4276
Возвращаемое значение:
4277
  * eax = 0 - успешно, иначе код ошибки файловой системы
4278
  * ebx разрушается
4279
Информация о файле возвращается в формате БДВК
6427 pathoswith 4280
(блока данных входа каталога), указанном в описании подфункции 1,
4281
но без имени файла, за исключением корневого каталога.
3539 clevermous 4282
Замечания:
6876 pathoswith 4283
  * Для корневого каталога возвращается размер раздела,
4284
    а при указании кодировки (не ноль), также его имя.
6875 pathoswith 4285
  * Для устройства возвращается только размер.
86 diamond 4286
 
6056 IgorA 4287
---------------------- Константы для регистров: ----------------------
4288
  eax - SF_FILE (70)
4289
 [ebx] - SSF_GET_INFO (5)
86 diamond 4290
======================================================================
3539 clevermous 4291
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
86 diamond 4292
======================================================================
3539 clevermous 4293
Параметры:
4294
  * eax = 70 - номер функции
4295
  * ebx = указатель на информационную структуру
4296
Формат информационной структуры:
4297
  * +0: dword: 6 = номер подфункции
4298
  * +4: dword: 0 (зарезервировано)
4299
  * +8: dword: 0 (зарезервировано)
4300
  * +12 = +0xC: dword: 0 (зарезервировано)
4301
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
6473 pathoswith 4302
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4303
Возвращаемое значение:
4304
  * eax = 0 - успешно, иначе код ошибки файловой системы
4305
  * ebx разрушается
4306
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
4307
формат которого указан в описании подфункции 1
4308
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
4309
(биты 3,4 в dword'е +0) не меняется.
4310
Байт +4 (формат имени) игнорируется.
4311
Замечания:
4312
  * Функция не поддерживает виртуальные папки типа /, /rd и
4313
    корневые папки типа /rd/1.
4314
  * Функция не поддерживается для CD (вернётся код ошибки 2).
86 diamond 4315
 
6056 IgorA 4316
---------------------- Константы для регистров: ----------------------
4317
  eax - SF_FILE (70)
4318
 [ebx] - SSF_SET_INFO (6)
86 diamond 4319
======================================================================
3539 clevermous 4320
============ Функция 70, подфункция 7 - запуск программы. ============
91 diamond 4321
======================================================================
3539 clevermous 4322
Параметры:
4323
  * eax = 70 - номер функции
4324
  * ebx = указатель на информационную структуру
4325
Формат информационной структуры:
4326
  * +0: dword: 7 = номер подфункции
4327
  * +4: dword: поле флагов:
4328
    * бит 0: запустить процесс как отлаживаемый
4329
    * остальные биты зарезервированы и должны быть установлены в 0
4330
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
4331
  * +12 = +0xC: dword: 0 (зарезервировано)
4332
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4333
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4334
Возвращаемое значение:
4335
  * eax > 0 - программа загружена, eax содержит PID
4336
  * eax < 0 - произошла ошибка, -eax содержит
4337
    код ошибки файловой системы
4338
  * ebx разрушается
4339
Замечания:
4340
  * Командная строка должна заканчиваться символом с кодом 0
4341
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
4342
    включительно, либо первые 256 символов, в зависимости от того,
4343
    что меньше.
4344
  * Если процесс запускается как отлаживаемый, он создаётся
4345
    в замороженном состоянии; для запуска используйте
4346
    подфункцию 5 функции 69.
91 diamond 4347
 
6056 IgorA 4348
---------------------- Константы для регистров: ----------------------
4349
  eax - SF_FILE (70)
4350
 [ebx] - SSF_START_APP (7)
91 diamond 4351
======================================================================
3539 clevermous 4352
========== Функция 70, подфункция 8 - удаление файла/папки. ==========
172 serge 4353
======================================================================
3539 clevermous 4354
Параметры:
4355
  * eax = 70 - номер функции
4356
  * ebx = указатель на информационную структуру
4357
Формат информационной структуры:
4358
  * +0: dword: 8 = номер подфункции
4359
  * +4: dword: 0 (зарезервировано)
4360
  * +8: dword: 0 (зарезервировано)
4361
  * +12 = +0xC: dword: 0 (зарезервировано)
4362
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4363
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4364
Возвращаемое значение:
4365
  * eax = 0 - успешно, иначе код ошибки файловой системы
4366
  * ebx разрушается
4367
Замечания:
4368
  * Функция не поддерживается для CD (вернётся код ошибки 2).
4369
  * Можно удалять только пустые папки (попытка удаления непустой папки
4370
    приведёт к ошибке с кодом 10, "доступ запрещён").
172 serge 4371
 
6056 IgorA 4372
---------------------- Константы для регистров: ----------------------
4373
  eax - SF_FILE (70)
4374
 [ebx] - SSF_DELETE (8)
172 serge 4375
======================================================================
3539 clevermous 4376
============= Функция 70, подфункция 9 - создание папки. =============
321 diamond 4377
======================================================================
3539 clevermous 4378
Параметры:
4379
  * eax = 70 - номер функции
4380
  * ebx = указатель на информационную структуру
4381
Формат информационной структуры:
4382
  * +0: dword: 9 = номер подфункции
4383
  * +4: dword: 0 (зарезервировано)
4384
  * +8: dword: 0 (зарезервировано)
4385
  * +12 = +0xC: dword: 0 (зарезервировано)
4386
  * +16 = +0x10: dword: 0 (зарезервировано)
6473 pathoswith 4387
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
3539 clevermous 4388
Возвращаемое значение:
4389
  * eax = 0 - успешно, иначе код ошибки файловой системы
4390
  * ebx разрушается
4391
Замечания:
4392
  * Функция не поддерживается для CD (вернётся код ошибки 2).
4393
  * Родительская папка должна уже существовать.
4394
  * Если папка уже существует, функция завершится успешно (eax=0).
321 diamond 4395
 
6056 IgorA 4396
---------------------- Константы для регистров: ----------------------
4397
  eax - SF_FILE (70)
4398
 [ebx] - SSF_CREATE_FOLDER (9)
321 diamond 4399
======================================================================
6917 pathoswith 4400
======= Функция 70, подфункция 10 - переименование/перемещение =======
4401
======================================================================
4402
Параметры:
4403
  * eax = 70 - номер функции
4404
  * ebx = указатель на информационную структуру
4405
Формат информационной структуры:
4406
  * +0: dword: 10 = номер подфункции
4407
  * +4: dword: 0 (зарезервировано)
4408
  * +8: dword: 0 (зарезервировано)
4409
  * +12 = +0xC: dword: 0 (зарезервировано)
4410
  * +16 = +0x10: dword: указатель на строку с новым именем/путём
4411
  * +20 = +0x14: путь, правила формирования имён указаны в общем описании
4412
Возвращаемое значение:
4413
  * eax = 0 - успешно, иначе код ошибки файловой системы
4414
  * ebx разрушается
4415
Замечания:
4416
  * Формирование нового пути отличается от общих правил:
4417
    относительный путь относится к папке целевого файла (или папки),
4418
    абсолютный путь считается от корня раздела.
4419
======================================================================
6802 pathoswith 4420
========== Функция 71 - установить заголовок окна программы ==========
114 mikedld 4421
======================================================================
3539 clevermous 4422
Параметры:
4423
  * eax = 71 - номер функции
6802 pathoswith 4424
  * ebx = 1
4425
  * ecx = адрес строки заголовка,
4426
    строка может начинаться с байта кодировки:
4427
    1 = cp866
4428
    2 = UTF-16LE
4429
    3 = UTF-8
4430
  или:
4431
  * ebx = 2
3539 clevermous 4432
  * ecx = адрес строки заголовка
6802 pathoswith 4433
  * dl  = кодировка строки
3539 clevermous 4434
Возвращаемое значение:
4435
  * функция не возвращает значения
4436
Замечания:
5926 pathoswith 4437
  * Строка заголовка должна заканчиваться нулём.
3539 clevermous 4438
  * Чтобы убрать заголовок, передайте NULL в ecx.
114 mikedld 4439
 
6056 IgorA 4440
---------------------- Константы для регистров: ----------------------
4441
  eax - SF_SET_CAPTION (71)
114 mikedld 4442
======================================================================
3539 clevermous 4443
================ Функция 72 - послать сообщение окну. ================
665 diamond 4444
======================================================================
4445
 
3539 clevermous 4446
--- Подфункция 1 - послать сообщение с параметром активному окну. ----
4447
Параметры:
4448
  * eax = 72 - номер функции
4449
  * ebx = 1 - номер подфункции
4450
  * ecx = код события: 2 или 3
4451
  * edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3
4452
Возвращаемое значение:
4453
  * eax = 0 - успешно
4454
  * eax = 1 - буфер заполнен
665 diamond 4455
 
6056 IgorA 4456
---------------------- Константы для регистров: ----------------------
4457
  eax - SF_SEND_MESSAGE (72)
665 diamond 4458
======================================================================
3539 clevermous 4459
===================== Функция 73 - blit bitmap  =====================
3315 mario79 4460
======================================================================
3539 clevermous 4461
блит - копирование битового массив
3315 mario79 4462
 
3539 clevermous 4463
Параметры:
4464
  * eax = 73 - номер функции
3315 mario79 4465
 
3539 clevermous 4466
  * ebx = ROP и опциональные флаги
6790 0CodErr 4467
     31      30 29 28       6 5  4 3   0
4468
     [reserved][CR][reserved][T][B][ROP]
3539 clevermous 4469
     ROP - код растровых операций
4470
        0: копировать
4471
     1-15: Зарезервировано
7722 dunkaist 4472
     B   - блит на фоновую поверхность
3539 clevermous 4473
     T   - блит с прозрачностью
6790 0CodErr 4474
     CR  - относительно клиентской области окна
6798 pathoswith 4475
 
3539 clevermous 4476
  * ecx = указатель на параметры функции
4477
        смещение цели и отсечение
4478
     +0 signed dword: смещение по X окна, для целевого прямоугольника
4479
                      верхний левый угол
4480
     +4 signed dword: смещение по Y окна, для целевого прямоугольника
4481
                      верхний левый угол
4482
     +8 dword:        ширина целевого прямоугольника
4483
    +12 dword:        высота целевого прямоугольника
3315 mario79 4484
 
3539 clevermous 4485
        смещение исходника и отсечение
4486
    +16 signed dword: смещение по X bitmap, для исходного прямоугольника
4487
                      верхний левый угол
4488
    +20 signed dword: смещение по Y bitmap, для исходного прямоугольника
4489
                      верхний левый угол
4490
    +24 dword:        ширина исходного прямоугольника
4491
    +28 dword:        высота исходного прямоугольника
3315 mario79 4492
 
3539 clevermous 4493
    +32: dword: данные bitmap - должны быть 32bpp
4494
    +36: dword: размер строки bitmap в байтах
3315 mario79 4495
 
3539 clevermous 4496
Возвращаемое значение:
4497
  * функция не возвращает значения
3315 mario79 4498
 
6056 IgorA 4499
---------------------- Константы для регистров: ----------------------
4500
  eax - SF_BLITTER (73)
3315 mario79 4501
======================================================================
3837 mario79 4502
=================== Функция 74, подфункция -1 ========================
4503
=========== Получить количество активных сетевых устройств. ==========
4504
======================================================================
4505
Параметры:
4506
  * eax = 74 - номер функции
4507
  * bl = -1 - номер подфункции
4508
Возвращаемое значение:
4509
  * eax = количество активных сетевых устройств
4510
 
6056 IgorA 4511
---------------------- Константы для регистров: ----------------------
4512
  eax - SF_NETWORK_GET (74)
4513
   bl - SSF_DEVICE_COUNT (255)
3837 mario79 4514
======================================================================
4515
==== Функция 74, подфункция 0, Получить тип сетевого устройства. =====
4516
======================================================================
4517
Параметры:
4518
  * eax = 74 - номер функции
4519
  * bl = 0 - номер подфункции
4520
  * bh = номер устройства
4521
Возвращаемое значение:
4522
  * eax = тип устройства
4523
 
6056 IgorA 4524
---------------------- Константы для регистров: ----------------------
4525
  eax - SF_NETWORK_GET (74)
4526
   bl - SSF_DEVICE_TYPE (0)
3837 mario79 4527
======================================================================
4528
==== Функция 74, подфункция 1, Получить имя сетевого устройства. =====
4529
======================================================================
4530
Параметры:
4531
  * eax = 74 - номер функции
4532
  * bl = 1 - номер подфункции
4533
  * bh = номер устройства
6473 pathoswith 4534
  * ecx = указатель на буфера - 64 байт
3837 mario79 4535
Возвращаемое значение:
4536
  * eax = -1 для ошибки
4537
  * В случае успеха в буфер записывается имя сетевого устройства
4538
 
6056 IgorA 4539
---------------------- Константы для регистров: ----------------------
4540
  eax - SF_NETWORK_GET (74)
4541
   bl - SSF_DEVICE_NAME (1)
3837 mario79 4542
======================================================================
4543
======= Функция 74, подфункция 2, Сброс сетевого устройства. =========
4544
======================================================================
4545
Параметры:
4546
  * eax = 74 - номер функции
4547
  * bl = 2 - номер подфункции
4548
  * bh = номер устройства
4549
Возвращаемое значение:
4550
  * eax = -1 для ошибки
4551
 
6056 IgorA 4552
---------------------- Константы для регистров: ----------------------
4553
  eax - SF_NETWORK_GET (74)
4554
   bl - SSF_RESET_DEVICE (2)
3837 mario79 4555
======================================================================
4556
====== Функция 74, подфункция 3, Остановить сетевое устройство. ======
4557
======================================================================
4558
Параметры:
4559
  * eax = 74 - номер функции
4560
  * bl = 3 - номер подфункции
4561
  * bh = номер устройства
4562
Возвращаемое значение:
4563
  * eax = -1 для ошибки
4564
 
6056 IgorA 4565
---------------------- Константы для регистров: ----------------------
4566
  eax - SF_NETWORK_GET (74)
4567
   bl - SSF_STOP_DEVICE (3)
3837 mario79 4568
======================================================================
5983 pathoswith 4569
===== Функция 74, подфункция 4, Получить указатель на устройство =====
4570
======================================================================
4571
Параметры:
4572
  * eax = 74 - номер функции
4573
  * bl = 4 - номер подфункции
4574
  * bh = номер устройства
4575
Возвращаемое значение:
4576
  * eax = указатель, -1 для ошибки
4577
 
6056 IgorA 4578
---------------------- Константы для регистров: ----------------------
4579
  eax - SF_NETWORK_GET (74)
7722 dunkaist 4580
   bl - SSF_DEVICE_POINTER (4)
5983 pathoswith 4581
======================================================================
4582
=== Функция 74, подфункция 6, Получить количество посланых пакетов ===
4583
======================================================================
4584
Параметры:
4585
  * eax = 74 - номер функции
4586
  * bl = 6 - номер подфункции
4587
  * bh = номер устройства
4588
Возвращаемое значение:
4589
  * eax = количество с момента старта устройства, -1 для ошибки
4590
 
6056 IgorA 4591
---------------------- Константы для регистров: ----------------------
4592
  eax - SF_NETWORK_GET (74)
4593
   bl - SSF_TX_PACKET_COUNT (6)
5983 pathoswith 4594
======================================================================
4595
=== Функция 74, подфункция 7, Получить количество принятых пакетов ===
4596
======================================================================
4597
Параметры:
4598
  * eax = 74 - номер функции
4599
  * bl = 7 - номер подфункции
4600
  * bh = номер устройства
4601
Возвращаемое значение:
4602
  * eax = количество с момента старта устройства, -1 для ошибки
4603
 
6056 IgorA 4604
---------------------- Константы для регистров: ----------------------
4605
  eax - SF_NETWORK_GET (74)
4606
   bl - SSF_RX_PACKET_COUNT (7)
5983 pathoswith 4607
======================================================================
4608
==== Функция 74, подфункция 8, Получить количество посланых байт. ====
4609
======================================================================
4610
Параметры:
4611
  * eax = 74 - номер функции
4612
  * bl = 8 - номер подфункции
4613
  * bh = номер устройства
4614
Возвращаемое значение:
4615
  * eax = количество с момента старта устройства, -1 для ошибки
4616
  * ebx = старшая часть
4617
 
6056 IgorA 4618
---------------------- Константы для регистров: ----------------------
4619
  eax - SF_NETWORK_GET (74)
4620
   bl - SSF_TX_BYTE_COUNT (8)
5983 pathoswith 4621
======================================================================
4622
==== Функция 74, подфункция 9, Получить количество принятых байт. ====
4623
======================================================================
4624
Параметры:
4625
  * eax = 74 - номер функции
4626
  * bl = 9 - номер подфункции
4627
  * bh = номер устройства
4628
Возвращаемое значение:
4629
  * eax = количество с момента старта устройства, -1 для ошибки
4630
  * ebx = старшая часть
4631
 
6056 IgorA 4632
---------------------- Константы для регистров: ----------------------
4633
  eax - SF_NETWORK_GET (74)
4634
   bl - SSF_RX_BYTE_COUNT (9)
5983 pathoswith 4635
======================================================================
4636
======= Функция 74, подфункция 10, Получить статус соединения. =======
4637
======================================================================
4638
Параметры:
4639
  * eax = 74 - номер функции
4640
  * bl = 10 - номер подфункции
4641
  * bh = номер устройства
4642
Возвращаемое значение:
4643
  * eax = статус соединения, -1 для ошибки
4644
 
4645
Статусы:
4646
 
4647
  1 = неизвестное соединение
4648
  4 = 10 Мбит
4649
  8 = 100 Мбит
4650
  12 = 1 Гбит
4651
  10b = флаг полного дуплекса
4652
 
6056 IgorA 4653
---------------------- Константы для регистров: ----------------------
4654
  eax - SF_NETWORK_GET (74)
4655
   bl - SSF_LINK_STATUS (10)
5983 pathoswith 4656
======================================================================
9060 leency 4657
== Функция 74.11, Получить количество пакетов переданных с ошибкой. ==
9017 hidnplayr 4658
======================================================================
9060 leency 4659
Параметры:
4660
  * eax = 74 - номер функции
4661
  * bl = 11 - номер подфункции
4662
  * bh = номер устройства
4663
Возвращаемое значение:
4664
  * eax = Количество ошибочных пакетов, переданных с момента запуска
4665
          устройства, -1 при ошибке
9017 hidnplayr 4666
 
9060 leency 4667
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4668
  eax - SF_NETWORK_GET (74)
9060 leency 4669
   bl - SSF_TX_PACKET_ERROR_COUNT (11)
9017 hidnplayr 4670
======================================================================
9060 leency 4671
=== Функция 74.12, Получить число пакетов отброшенных при отправке. ==
9017 hidnplayr 4672
======================================================================
9060 leency 4673
Параметры:
4674
  * eax = 74 - номер функции
4675
  * bl = 12 - номер подфункции
4676
  * bh = номер устройства
4677
Возвращаемое значение:
4678
  * eax = число отброшенных пакетов с момента запуска устройства,
4679
    -1 при ошибке
9017 hidnplayr 4680
 
9060 leency 4681
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4682
  eax - SF_NETWORK_GET (74)
9060 leency 4683
   bl - SSF_TX_PACKET_DROP_COUNT (12)
9017 hidnplayr 4684
======================================================================
9060 leency 4685
=== Функция 74.13, Получить число пакетов утерянных при отправке. ====
9017 hidnplayr 4686
======================================================================
9060 leency 4687
Параметры:
4688
  * eax = 74 - номер функции
4689
  * bl = 13 - номер подфункции
4690
  * bh = номер устройства
4691
Возвращаемое значение:
4692
  * eax = число утерянных пакетов с момента запуска устройства,
4693
    -1 при ошибке
9017 hidnplayr 4694
 
9060 leency 4695
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4696
  eax - SF_NETWORK_GET (74)
9060 leency 4697
   bl - SSF_TX_PACKET_MISS_COUNT (13)
4698
 
9017 hidnplayr 4699
======================================================================
9060 leency 4700
==== Функция 74.14, Получить число пакетов полученных с ошибкой. =====
4701
======================================================================
4702
Параметры:
4703
  * eax = 74 - номер функции
4704
  * bl = 14 - номер подфункции
4705
  * bh = номер устройства
4706
Возвращаемое значение:
4707
  * eax = число пакетов, полученных с ошибкой с момента запуска
4708
    устройства, -1 при ошибке
4709
 
4710
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4711
  eax - SF_NETWORK_GET (74)
9060 leency 4712
   bl - SSF_RX_PACKET_ERROR_COUNT (14)
9017 hidnplayr 4713
======================================================================
9060 leency 4714
== Функция 74.15, Получить число пакетов отброшенных при получении. ==
9017 hidnplayr 4715
======================================================================
9060 leency 4716
Параметры:
4717
  * eax = 74 - номер функции
4718
  * bl = 15 - номер подфункции
4719
  * bh = номер устройства
4720
Возвращаемое значение:
4721
  * eax = число отброшенных пакетов с момента запуска устройства,
4722
    -1 при ошибке
9017 hidnplayr 4723
 
9060 leency 4724
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4725
  eax - SF_NETWORK_GET (74)
9060 leency 4726
   bl - SSF_RX_PACKET_DROP_COUNT (12)
9017 hidnplayr 4727
======================================================================
9060 leency 4728
=== Функция 74.16, Получить число пакетов утерянных при получении. ===
9017 hidnplayr 4729
======================================================================
9060 leency 4730
Параметры:
4731
  * eax = 74 - номер функции
4732
  * bl = 16 - номер подфункции
4733
  * bh = номер устройства
4734
Возвращаемое значение:
4735
  * eax = число утерянных пакетов с момента запуска устройства,
4736
    -1 при ошибке
9017 hidnplayr 4737
 
9060 leency 4738
---------------------- Константы для регистров: ----------------------
9017 hidnplayr 4739
  eax - SF_NETWORK_GET (74)
9060 leency 4740
   bl - SSF_RX_PACKET_MISS_COUNT (16)
9017 hidnplayr 4741
======================================================================
6235 pathoswith 4742
============== Функция 75, подфункция 0, Открыть сокет. ==============
3837 mario79 4743
======================================================================
4744
Параметры:
4745
  * eax = 75 - номер функции
4746
  * bl = 0 - номер подфункции
4747
  * ecx = домен
4748
  * edx = тип
4749
  * esi = протокол
4750
Возвращаемое значение:
4751
  * eax = номер сокета, -1 для ошибки
3868 mario79 4752
  * ebx = код ошибки
3837 mario79 4753
 
6056 IgorA 4754
---------------------- Константы для регистров: ----------------------
4755
  eax - SF_NETWORK_SOCKET (75)
4756
   bl - SSF_OPEN (0)
3837 mario79 4757
======================================================================
6235 pathoswith 4758
============== Функция 75, подфункция 1, Закрыть сокет. ==============
3837 mario79 4759
======================================================================
4760
Параметры:
4761
  * eax = 75 - номер функции
4762
  * bl = 1 - номер подфункции
4763
  * ecx = номер сокета
4764
Возвращаемое значение:
4765
  * eax = -1 для ошибки
3868 mario79 4766
  * ebx = код ошибки
3837 mario79 4767
 
6056 IgorA 4768
---------------------- Константы для регистров: ----------------------
4769
  eax - SF_NETWORK_SOCKET (75)
4770
   bl - SSF_CLOSE (1)
3837 mario79 4771
======================================================================
4772
============= Функция 75, подфункция 2, Bind (Привязка). =============
4773
======================================================================
4774
Параметры:
4775
  * eax = 75 - номер функции
4776
  * bl = 2 - номер подфункции
4777
  * ecx = номер сокета
4778
  * edx = указатель на структуру sockaddr
4779
  * esi = длина структуры sockaddr
6712 0CodErr 4780
Формат структуры SockAddr:
4781
  * +0: Word: Family
4782
  * +2: 14*Byte: Data
3837 mario79 4783
Возвращаемое значение:
4784
  * eax = -1 для ошибки
3868 mario79 4785
  * ebx = код ошибки
3837 mario79 4786
 
6056 IgorA 4787
---------------------- Константы для регистров: ----------------------
4788
  eax - SF_NETWORK_SOCKET (75)
4789
   bl - SSF_BIND (2)
3837 mario79 4790
======================================================================
4791
============ Функция 75, подфункция 3, Listen (Слушать). =============
4792
======================================================================
4793
Параметры:
4794
  * eax = 75 - номер функции
4795
  * bl = 3 - номер подфункции
4796
  * ecx = номер сокета
4797
  * edx = backlog (возвращаемый лог)
4798
Возвращаемое значение:
4799
  * eax = -1 для ошибки
3868 mario79 4800
  * ebx = код ошибки
3837 mario79 4801
 
6056 IgorA 4802
---------------------- Константы для регистров: ----------------------
4803
  eax - SF_NETWORK_SOCKET (75)
4804
   bl - SSF_LISTEN (3)
3837 mario79 4805
======================================================================
4806
========== Функция 75, подфункция 4, Connect (Соединение). ===========
4807
======================================================================
4808
Параметры:
4809
  * eax = 75 - номер функции
4810
  * bl = 4 - номер подфункции
4811
  * ecx = номер сокета
4812
  * edx = указатель на структуру sockaddr
4813
  * esi = длина структуры sockaddr
6712 0CodErr 4814
Формат структуры SockAddr:
4815
  * +0: Word: Family
6758 pathoswith 4816
  * +2: 14*Byte: Data
3837 mario79 4817
Возвращаемое значение:
4818
  * eax = -1 для ошибки
3868 mario79 4819
  * ebx = код ошибки
3837 mario79 4820
 
6056 IgorA 4821
---------------------- Константы для регистров: ----------------------
4822
  eax - SF_NETWORK_SOCKET (75)
4823
   bl - SSF_CONNECT (4)
3837 mario79 4824
======================================================================
4825
=========== Функция 75, подфункция 5, Accept (Соглашение). ===========
4826
======================================================================
4827
Параметры:
4828
  * eax = 75 - номер функции
4829
  * bl = 5 - номер подфункции
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
Возвращаемое значение:
3868 mario79 4837
  * eax = номер сокета из принятого сокета, -1 для ошибки
4838
  * ebx = код ошибки
3837 mario79 4839
 
6056 IgorA 4840
---------------------- Константы для регистров: ----------------------
4841
  eax - SF_NETWORK_SOCKET (75)
4842
   bl - SSF_ACCEPT (5)
3837 mario79 4843
======================================================================
4844
============= Функция 75, подфункция 6, Send (Послать). ==============
4845
======================================================================
4846
Параметры:
4847
  * eax = 75 - номер функции
4848
  * bl = 6 - номер подфункции
4849
  * ecx = номер сокета
4850
  * edx = указатель на буфер
4851
  * esi = длина буфера
3868 mario79 4852
  * edi = флаги
3837 mario79 4853
Возвращаемое значение:
4854
  * eax = количество скопированных байтов, -1 для ошибки
3868 mario79 4855
  * ebx = код ошибки
3837 mario79 4856
 
6056 IgorA 4857
---------------------- Константы для регистров: ----------------------
4858
  eax - SF_NETWORK_SOCKET (75)
4859
   bl - SSF_SEND (6)
3837 mario79 4860
======================================================================
4861
============ Функция 75, подфункция 7, Receive (Получить). ===========
4862
======================================================================
4863
Параметры:
4864
  * eax = 75 - номер функции
4865
  * bl = 7 - номер подфункции
4866
  * ecx = номер сокета
4867
  * edx = указатель на буфер
4868
  * esi = длина буфера
4869
  * edi = флаги
4870
Возвращаемое значение:
4871
  * eax = количество скопированных байтов, -1 для ошибки
3868 mario79 4872
  * ebx = код ошибки
3837 mario79 4873
 
6056 IgorA 4874
---------------------- Константы для регистров: ----------------------
4875
  eax - SF_NETWORK_SOCKET (75)
4876
   bl - SSF_RECEIVE (7)
3837 mario79 4877
======================================================================
6235 pathoswith 4878
=========== Функция 75, подфункция 8, Задать опции сокета. ===========
3837 mario79 4879
======================================================================
4880
Параметры:
4881
  * eax = 75 - номер функции
4882
  * bl = 8 - номер подфункции
4883
  * ecx = номер сокета
4884
  * edx = указатель на optstruct
4885
Возвращаемое значение:
4886
  * eax = -1 для ошибки
3868 mario79 4887
  * ebx = код ошибки
3837 mario79 4888
Замечания:
4889
 
4890
  Optstruct: dd level
4891
             dd optionname
4892
             dd optlength
4893
             db options...
4894
 
6056 IgorA 4895
---------------------- Константы для регистров: ----------------------
4896
  eax - SF_NETWORK_SOCKET (75)
4897
   bl - SSF_SET_OPTIONS (8)
3837 mario79 4898
======================================================================
6235 pathoswith 4899
========== Функция 75, подфункция 9, Получить опции сокета. ==========
3837 mario79 4900
======================================================================
4901
Параметры:
4902
  * eax = 75 - номер функции
4903
  * bl = 9 - номер подфункции
4904
  * ecx = номер сокета
4905
  * edx = указатель на optstruct
4906
Возвращаемое значение:
4907
  * eax = -1 для ошибки
3868 mario79 4908
  * ebx = код ошибки
3837 mario79 4909
Замечания:
4910
 
4911
  Optstruct: dd level
4912
             dd optionname
4913
             dd optlength
4914
             db options...
4915
 
6056 IgorA 4916
---------------------- Константы для регистров: ----------------------
4917
  eax - SF_NETWORK_SOCKET (75)
4918
   bl - SSF_GET_OPTIONS (9)
3837 mario79 4919
======================================================================
6235 pathoswith 4920
========== Функция 75, подфункция 10, Получить парный сокет ==========
3837 mario79 4921
======================================================================
4922
Параметры:
4923
  * eax = 75 - номер функции
4924
  * bl = 10 - номер подфункции
4925
Возвращаемое значение:
6235 pathoswith 4926
  * eax = номер первого сокета / -1 для ошибки
4927
  * ebx = номер второго сокета / код ошибки
3837 mario79 4928
 
6056 IgorA 4929
---------------------- Константы для регистров: ----------------------
4930
  eax - SF_NETWORK_SOCKET (75)
4931
   bl - SSF_GET_PAIR (10)
3837 mario79 4932
======================================================================
6056 IgorA 4933
=============== Функция 76, Сетевые опции и статистика. ==============
4934
======================================================================
4935
Параметры:
4936
  * eax = 76 - номер функции
4937
  * верхняя часть ebx = номер протокола
4938
  * bh = номер устройства
4939
  * bl = номер подфункции
4940
 
6235 pathoswith 4941
Протоколы и подфункции:
4942
 
4943
 
6056 IgorA 4944
 
6235 pathoswith 4945
 
4946
    общие подфункции:
4947
 
4948
        1 - пакетов принято
4949
 
4950
1 - IPv4:
6056 IgorA 4951
        2 - Read IP
4952
        3 - Write IP
4953
        4 - Read DNS
4954
        5 - Write DNS
4955
        6 - Read subnet
4956
        7 - Write subnet
4957
        8 - Read gateway
4958
        9 - Write gateway
6235 pathoswith 4959
 
4960
2 - ICMP:
6056 IgorA 4961
        3 - enable/disable ICMP echo reply
4962
 
6235 pathoswith 4963
3 - UDP
4964
4 - TCP
6056 IgorA 4965
 
6235 pathoswith 4966
5 - ARP:
6056 IgorA 4967
        2 - Read # ARP entry's
4968
        3 - Read ARP entry
4969
        4 - Add static ARP entry
4970
        5 - Remove ARP entry (-1 = remove all)
4971
        6 - Send ARP announce on specified interface
4972
        7 - Read # ARP conflicts (IP address conflicts)
4973
 
4974
---------------------- Константы для регистров: ----------------------
4975
  eax - SF_NETWORK_PROTOCOL (76)
4976
======================================================================
6235 pathoswith 4977
============= Функция 77, подфункция 0, Создать фьютекс. =============
4978
======================================================================
4979
Параметры:
4980
  * eax = 77 - номер функции
4981
  * ebx = 0 - номер подфункции
4982
  * ecx = указатель на контрольное значение фьютекса (dword)
4983
Возвращаемое значение:
4984
  * eax = дескриптор фьютекса, 0 при ошибке
4985
 
4986
---------------------- Константы для регистров: ----------------------
4987
  eax - SF_FUTEX (77)
4988
  ebx - SSF_CREATE (0)
4989
======================================================================
4990
============= Функция 77, подфункция 1, Удалить фьютекс. =============
4991
======================================================================
4992
Параметры:
4993
  * eax = 77 - номер функции
4994
  * ebx = 1 - номер подфункции
4995
  * ecx = дескриптор фьютекса
4996
Возвращаемое значение:
4997
  * eax = 0 - успешно, -1 при ошибке
4998
Замечания:
4999
  * Ядро автоматически удаляет фьютексы при завершении процесса.
5000
 
5001
---------------------- Константы для регистров: ----------------------
5002
  eax - SF_FUTEX (77)
5003
  ebx - SSF_DESTROY (1)
5004
======================================================================
5005
================= Функция 77, подфункция 2, Ожидать. =================
5006
======================================================================
5007
Параметры:
5008
  * eax = 77 - номер функции
5009
  * ebx = 2 - номер подфункции
5010
  * ecx = дескриптор фьютекса
5011
  * edx = контрольное значение
5012
  * esi = таймаут в сотых секунды, 0 - ждать бесконечно
5013
Возвращаемое значение:
5014
  * eax = 0 - успешно, -1 - таймаут,
5015
        -2 - контрольное значение не соответствует
5016
 
5017
---------------------- Константы для регистров: ----------------------
5018
  eax - SF_FUTEX (77)
5019
  ebx - SSF_WAIT (2)
5020
======================================================================
5021
================ Функция 77, подфункция 3, Разбудить. ================
5022
======================================================================
5023
Параметры:
5024
  * eax = 77 - номер функции
5025
  * ebx = 3 - номер подфункции
5026
  * ecx = дескриптор фьютекса
5027
  * edx = сколько ожидающих будить (максимум)
5028
Возвращаемое значение:
5029
  * eax = количество разбуженых
5030
 
5031
---------------------- Константы для регистров: ----------------------
5032
  eax - SF_FUTEX (77)
5033
  ebx - SSF_WAKE (3)
5034
======================================================================
9829 vitalkrilo 5035
======= Функция 77, подфункция 10, Прочитать из файла в буфер. =======
5036
======================================================================
5037
Параметры:
5038
  * eax = 77 - номер функции
5039
  * ebx = 10 - номер подфункции
5040
  * ecx = дескриптор файла
5041
  * edx = указатель на буфер, куда читать
5042
  * esi = сколько байт прочитать
5043
Возвращаемое значение:
5044
  * eax = количество прочитанных байт
5045
 
5046
---------------------- Константы для регистров: ----------------------
5047
  eax - SF_FUTEX (77)
5048
  ebx - ...
5049
======================================================================
5050
======== Функция 77, подфункция 11, Записать из буфера в файл. =======
5051
======================================================================
5052
Параметры:
5053
  * eax = 77 - номер функции
5054
  * ebx = 11 - номер подфункции
5055
  * ecx = дескриптор файла
5056
  * edx =  указатель на буфер, откуда брать данные для записи
5057
  * esi = сколько байт записать
5058
Возвращаемое значение:
5059
  * eax = количество записанных байт
5060
 
5061
---------------------- Константы для регистров: ----------------------
5062
  eax - SF_FUTEX (77)
5063
  ebx - ...
5064
======================================================================
5065
=========== Функция 77, подфункция 13, Создать новый pipe. ===========
5066
======================================================================
5067
Создает новый pipe. В 4 байта по адресу pipefd будет записан
5068
дескриптор для чтения из канала.
5069
В 4 байта по адресу pipefd + 4 будет записан дескриптор для записи в
5070
канал.
5071
Параметры:
5072
  * eax = 77 - номер функции
5073
  * ebx = 13 - номер подфункции
5074
  * ecx = адрес pipefd
5075
  * edx = флаги. На данный момент если поднят O_CLOEXEC (0x40000), то
5076
    сисфункция завершится с ошибкой. Поэтому в качестве флагов можно
5077
    передать просто 0.
5078
Возвращаемое значение:
5079
  * eax = 0 если успех, иначе ошибка.
5080
 
5081
---------------------- Константы для регистров: ----------------------
5082
  eax - SF_FUTEX (77)
5083
  ebx - ...
5084
======================================================================
3539 clevermous 5085
========== Функция -1 - завершить выполнение потока/процесса =========
77 diamond 5086
======================================================================
3539 clevermous 5087
Параметры:
5088
  * eax = -1 - номер функции
5089
Возвращаемое значение:
5090
  * функция не возвращает ни значения, ни управления
5091
Замечания:
5092
  * Если процесс явно не создавал потоков, то у него есть только
5093
    один поток, завершение которого приводит к завершению процесса.
5094
  * Если текущий поток - последний в процессе, то его завершение
5095
    также приводит к завершению процесса.
5096
  * Эта функция завершает текущий поток. Другой поток можно прибить
5097
    вызовом подфункции 2 функции 18.
77 diamond 5098
 
6056 IgorA 5099
---------------------- Константы для регистров: ----------------------
5100
  eax - SF_TERMINATE_PROCESS (-1)
77 diamond 5101
======================================================================
6798 pathoswith 5102
=== Функция 80 - работа с файловой системой с указанием кодировки. ===
5103
======================================================================
5104
Параметры:
5105
  * eax = 80
5106
  * ebx = указатель на информационную структуру
5107
Возвращаемое значение:
5108
  * eax = 0 - успешно; иначе код ошибки файловой системы
5109
  * в зависимости от подфункции может возвращаться значение и
5110
    в других регистрах
5111
Общий формат информационной структуры:
5112
  * +0: dword: номер подфункции
5113
  * +4: dword: смещение в файле или папке
5114
  * +8: dword: старшая часть смещения или поле флагов
5115
  * +12 = +0xC: dword: размер данных
5116
  * +16 = +0x10: dword: указатель на данные
5117
  * +20 = +0x14: dword: кодировка строки:
5118
    1 = cp866
5119
    2 = UTF-16LE
5120
    3 = UTF-8
5121
 
5122
  * +24 = +0x18: dword: указатель на строку пути (заканчивается нулём)
5123
 
5124
В остальном полностью соответствует функции 70.
5125
 
5126
======================================================================
3539 clevermous 5127
=========================== Список событий ===========================
77 diamond 5128
======================================================================
3539 clevermous 5129
Очередное событие можно получить вызовом одной из функций 10
5130
(ожидать события), 11 (проверить без ожидания), 23
5131
(ожидать в течение заданного времени).
5132
Эти функции возвращают только те события, которые входят в маску,
5133
устанавливаемую функцией 40. По умолчанию это первые три, чего
5134
вполне достаточно для многих приложений.
5135
Коды событий:
5136
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
5137
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
5138
    активно) или нажата "горячая клавиша";
5139
    сбрасывается, когда все клавиши из буфера считаны функцией 2
5140
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
5141
    закрытия, созданная неявно функцией 0; кнопка минимизации
5142
    обрабатывается системой и о ней сообщения не приходит;
5143
    поступает, только когда окно активно; сбрасывается, когда все
5144
    кнопки из буфера считаны функцией 17)
5145
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
5146
    при размаскировке функцией 40)
5147
  * 5 = завершилась перерисовка фона рабочего стола
5148
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
5149
    или перемещение; сбрасывается при прочтении)
5150
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
5151
    Communication; сбрасывается при прочтении)
5152
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
5153
    смотри работу с сетью)
5154
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
5155
    смотри отладочную подсистему)
5156
  * 16..31 = произошло событие с соответствующим IRQ
5157
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
77 diamond 5158
 
5159
======================================================================
3539 clevermous 5160
==================== Коды ошибок файловой системы ====================
77 diamond 5161
======================================================================
3539 clevermous 5162
  * 0 = успешно
5163
  * 2 = функция не поддерживается для данной файловой системы
5164
  * 3 = неизвестная файловая система
5165
  * 5 = файл не найден
5166
  * 6 = файл закончился
5167
  * 7 = указатель вне памяти приложения
5168
  * 8 = диск заполнен
6235 pathoswith 5169
  * 9 = ошибка файловой системы
3539 clevermous 5170
  * 10 = доступ запрещён
5171
  * 11 = ошибка устройства
6235 pathoswith 5172
  * 12 = файловой системе недостаточно оперативной памяти
5173
 
3539 clevermous 5174
При запуске программы возможны также следующие коды ошибок:
5175
  * 30 = 0x1E = недостаточно памяти
5176
  * 31 = 0x1F = файл не является исполнимым
5177
  * 32 = 0x20 = слишком много процессов