Subversion Repositories Kolibri OS

Rev

Rev 5926 | Rev 5967 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2455 mario79 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
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=0 - тип I - окно фиксированных размеров
29
      * Y=1 - только определить область окна, ничего не рисовать
30
      * Y=2 - тип II - окно изменяемых размеров
31
      * Y=3 - окно со скином
32
      * Y=4 - окно со скином фиксированных размеров
33
      * остальные возможные значения (от 5 до 15) зарезервированы,
34
        вызов функции с такими Y игнорируется
35
    * RR, GG, BB = соответственно красная, зеленая, синяя
36
      составляющие цвета рабочей области окна
4051 heavyiron 37
      (игнорируется для стиля Y=1)
3539 clevermous 38
    * X = DCBA (биты)
39
      * A = 1 - у окна есть заголовок; для стилей Y=3,4 адрес строки
40
                  заголовка задаётся в edi, для прочих стилей
41
                  используется подфункция 1 функции 71
42
      * B = 1 - координаты всех графических примитивов задаются
43
                  относительно клиентской области окна
44
      * C = 1 - не закрашивать рабочую область при отрисовке окна
45
      * D = 0 - нормальная заливка рабочей области, 1 - градиентная
46
    Следующие параметры предназначены для окон типа I и II и
47
    игнорируются для стилей Y=1,3:
48
  * esi = 0xXYRRGGBB - цвет заголовка
49
    * RR, GG, BB определяют сам цвет
4051 heavyiron 50
    * Y=0 - обычное окно, Y=1 - неперемещаемое окно (работает для всех стилей окон)
3780 Serge 51
    * X определяет градиент заголовка: X=0 - нет градиента,
3539 clevermous 52
      X=8 - обычный градиент,
53
      для окон типа II X=4 - негативный градиент
54
    * прочие значения X и Y зарезервированы
55
  * edi = 0x00RRGGBB - цвет рамки
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
  * Вид окна типа I:
86
    * рисуется внешняя рамка цвета, указанного в edi,
87
      шириной 1 пиксель
88
    * рисуется заголовок - прямоугольник с левым верхним углом (1,1)
4572 clevermous 89
      и правым нижним (xsize-1,min(20,ysize-1)) цвета, указанного в esi
3539 clevermous 90
      (с учетом градиента)
4572 clevermous 91
    * если ysize>21, то закрашивается рабочая область окна -
3539 clevermous 92
      прямоугольник с левым верхним углом (1,21) и правым нижним
93
      (xsize-1,ysize-1) (размерами (xsize-1)*(ysize-21)) - цветом,
94
      указанным в edx (с учетом градиента)
95
    * если A=1 и строка заголовка установлена подфункцией 1
96
      функции 71, то она выводится в соответствующем месте заголовка
97
  * Вид окна стиля Y=1:
98
    * полностью определяется приложением
99
  * Вид окна типа II:
100
    * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета
101
      edi (все составляющие цвета уменьшаются в два раза)
102
    * рисуется промежуточная рамка шириной 3 пикселя цвета edi
103
    * рисуется внутренняя рамка шириной 1 пиксель
104
      "затенённого" цвета edi
105
    * рисуется заголовок - прямоугольник с левым верхним углом (4,4)
106
      и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi
107
      (с учетом градиента)
108
    * если ysize>=26, то закрашивается рабочая область окна -
109
      прямоугольник с левым верхним углом (5,20) и правым нижним
110
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
111
    * если A=1 и строка заголовка установлена подфункцией 1
112
      функции 71, то она выводится в соответствующем месте заголовка
113
  * Вид окна со скином:
114
    * рисуется внешняя рамка шириной 1 пиксель
115
      цвета 'outer' из скина
116
    * рисуется промежуточная рамка шириной 3 пикселя
117
      цвета 'frame' из скина
118
    * рисуется внутренняя рамка шириной 1 пиксель
119
      цвета 'inner' из скина
120
    * рисуется заголовок (по картинкам из скина) в прямоугольнике
77 diamond 121
      (0,0) - (xsize,_skinh-1)
3539 clevermous 122
    * если ysize>=26, то закрашивается рабочая область окна -
123
      прямоугольник с левым верхним углом (5,_skinh) и правым нижним
124
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
125
    * определяются две стандартные кнопки: закрытия и минимизации
126
      (смотри функцию 8)
127
    * если A=1 и в edi (ненулевой) указатель на строку заголовка,
128
      то она выводится в заголовке в месте, определяемом скином
129
    * Значение переменной _skinh доступно как результат вызова
130
      подфункции 4 функции 48
77 diamond 131
 
132
======================================================================
3539 clevermous 133
================= Функция 1 - поставить точку в окне. ================
77 diamond 134
======================================================================
3539 clevermous 135
Параметры:
136
  * eax = 1 - номер функции
137
  * ebx = x-координата (относительно окна)
138
  * ecx = y-координата (относительно окна)
139
  * edx = 0x00RRGGBB - цвет точки
140
    edx = 0x01xxxxxx - инвертировать цвет точки
141
          (младшие 24 бита игнорируются)
142
Возвращаемое значение:
143
  * функция не возвращает значения
77 diamond 144
 
145
======================================================================
3539 clevermous 146
============== Функция 2 - получить код нажатой клавиши. =============
77 diamond 147
======================================================================
3539 clevermous 148
Забирает код нажатой клавиши из буфера.
149
Параметры:
150
  * eax = 2 - номер функции
151
Возвращаемое значение:
152
  * если буфер пуст, возвращается eax=1
153
  * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
4612 mario79 154
    биты 16-23 содержат сканкод нажатой клавиши в режиме ASCII,
155
               в режме сканкодов биты обнулены.
4588 mario79 156
    биты 23-31 обнулены
3539 clevermous 157
  * если есть "горячая клавиша", то возвращается
158
    al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
159
    старшее слово регистра eax содержит состояние управляющих клавиш
160
    в момент нажатия горячей клавиши
161
Замечания:
162
  * Существует общесистемный буфер нажатых клавиш размером 120 байт,
163
    организованный как очередь.
164
  * Существует ещё один общесистемный буфер на 120 "горячих клавиш".
165
  * При вызове этой функции приложением с неактивным окном
166
    считается, что буфер нажатых клавиш пуст.
167
  * По умолчанию эта функция возвращает ASCII-коды; переключиться на
168
    режим сканкодов (и назад) можно с использованием функции 66.
169
    Однако, горячие клавиши всегда возвращаются как сканкоды.
170
  * Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
171
    запустив приложения keyascii и scancode.
172
  * Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
173
    ASCII-коды получаются с использованием таблиц преобразования,
174
    которые можно установить подфункцией 2 функции 21 и прочитать
175
    подфункцией 2 функции 26.
176
  * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
177
    (rus/en) в отличие от сканкодов.
178
  * Поступает информация только о тех горячих клавишах, которые были
179
    определены этим потоком подфункцией 4 функции 66.
77 diamond 180
 
181
======================================================================
3539 clevermous 182
================ Функция 3 - получить системное время. ===============
77 diamond 183
======================================================================
3539 clevermous 184
Параметры:
185
  * eax = 3 - номер функции
186
Возвращаемое значение:
187
  * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
188
  * каждый элемент возвращается как BCD-число, например,
189
    для времени 23:59:59 результат будет 0x00595923
190
Замечания:
191
  * Смотри также подфункцию 9 функции 26 - получение времени
192
    с момента запуска системы; она во многих случаях удобнее,
193
    поскольку возвращает просто DWORD-значение счетчика времени.
194
  * Системное время можно установить функцией 22.
77 diamond 195
 
196
======================================================================
5848 pathoswith 197
================ Функция 4 - нарисовать строку текста. ===============
77 diamond 198
======================================================================
3539 clevermous 199
Параметры:
200
  * eax = 4 - номер функции
5848 pathoswith 201
  * ebx = X*65536+Y, координаты в окне или буфере
202
  * ecx = 0xXXRRGGBB, где
3539 clevermous 203
    * RR, GG, BB задают цвет текста
5848 pathoswith 204
    * XX=ABFFCSSS (биты):
205
      * A=1 - рисуемая строка заканчивается нулём
206
      * B=1 - закрашивать фон (цвет = edi)
5682 leency 207
      * FF задает шрифт и кодировку:
208
 
5867 pathoswith 209
        1 = 8x16 cp866
5682 leency 210
        2 = 8x16 UTF-16LE
211
        3 = 8x16 UTF-8
5848 pathoswith 212
      * C=0 - рисовать в окно,
213
        С=1 - рисовать в буфер (edi)
214
      * SSS = (множитель размера)-1, то-есть 0 = x1, 7 = x8
3539 clevermous 215
  * edx = указатель на начало строки
5682 leency 216
  * esi = для A=0 длина строки, для A=1 игнорируется
5848 pathoswith 217
  * edi = если B=1 - цвет для закраски фона,
218
          если C=1 - указатель на буфер
5682 leency 219
 
3539 clevermous 220
Возвращаемое значение:
221
  * функция не возвращает значения
222
Замечания:
5682 leency 223
  * Нельзя одновременно использовать B=1 и C=1,
224
    поскольку в обоих случаях используется регистр edi.
5848 pathoswith 225
  * Если SSS=0, шрифт может сглаживаться,
226
    в зависимости от системной настройки.
227
  * Структура буфера:
228
Xsize       dd
229
Ysize       dd
230
picture     rb  Xsize*Ysize*4  ; 32 бита
5682 leency 231
 
77 diamond 232
======================================================================
3539 clevermous 233
========================= Функция 5 - пауза. =========================
77 diamond 234
======================================================================
3539 clevermous 235
Задерживает выполнение программы на заданное время.
236
Параметры:
237
  * eax = 5 - номер функции
238
  * ebx = время в сотых долях секунды
239
Возвращаемое значение:
240
  * функция не возвращает значения
241
Замечания:
242
  * Передача ebx=0 не передает управление следующему процессу и
243
    вообще не производит никаких действий. Если действительно
244
    требуется передать управление следующему процессу
245
    (закончить текущий квант времени), используйте подфункцию 1
246
    функции 68.
77 diamond 247
 
248
======================================================================
3539 clevermous 249
=============== Функция 6 - прочитать файл с рамдиска. ===============
77 diamond 250
======================================================================
3539 clevermous 251
Параметры:
252
  * eax = 6 - номер функции
253
  * ebx = указатель на имя файла
254
  * ecx = номер стартового блока, считая с 1;
255
    ecx=0 - читать с начала файла (то же самое, что и ecx=1)
256
  * edx = число блоков для чтения;
257
    edx=0 - читать один блок (то же самое, что и edx=1)
258
  * esi = указатель на область памяти, куда будут записаны данные
259
Возвращаемое значение:
260
  * eax = длина файла в байтах, если файл успешно прочитан
261
  * eax = -1, если файл не найден
262
Замечания:
263
  * Данная функция является устаревшей; функция 70
264
    позволяет выполнять те же действия с расширенными возможностями.
265
  * Блок = 512 байт.
266
  * Для чтения всего файла можно указать заведомо большое значение
267
    в edx, например, edx = -1; но в этом случае будьте готовы к тому,
268
    что программа "упадет", если файл окажется слишком большим
269
    и "не влезет" в память программы.
270
  * Имя файла должно быть либо в формате 8+3 символов
271
    (первые 8 символов - собственно имя, последние 3 - расширение,
272
    короткие имена и расширения дополняются пробелами),
273
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
274
    (имя не более 8 символов, точка, расширение 3 символа,
275
    дополненное при необходимости пробелами).
276
    Имя файла должно быть записано заглавными буквами.
277
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
278
  * Эта функция не поддерживает папки на рамдиске.
77 diamond 279
 
280
======================================================================
3539 clevermous 281
=============== Функция 7 - вывести изображение в окно. ==============
77 diamond 282
======================================================================
3539 clevermous 283
Параметры:
284
  * eax = 7 - номер функции
285
  * ebx = указатель на изображение в формате BBGGRRBBGGRR...
286
  * ecx = [размер по оси x]*65536 + [размер по оси y]
287
  * edx = [координата по оси x]*65536 + [координата по оси y]
288
Возвращаемое значение:
289
  * функция не возвращает значения
290
Замечания:
291
  * Координаты изображения - это координаты верхнего левого угла
292
    изображения относительно окна.
293
  * Размер изображения в байтах есть 3*xsize*ysize.
77 diamond 294
 
295
======================================================================
3539 clevermous 296
=============== Функция 8 - определить/удалить кнопку. ===============
77 diamond 297
======================================================================
3539 clevermous 298
Параметры для определения кнопки:
299
  * eax = 8 - номер функции
300
  * ebx = [координата по оси x]*65536 + [размер по оси x]
301
  * ecx = [координата по оси y]*65536 + [размер по оси y]
302
  * edx = 0xXYnnnnnn, где:
303
    * nnnnnn = идентификатор кнопки
304
    * старший (31-й) бит edx сброшен
305
    * если 30-й бит edx установлен - не прорисовывать кнопку
306
    * если 29-й бит edx установлен - не рисовать рамку
307
      при нажатии на кнопку
308
  * esi = 0x00RRGGBB - цвет кнопки
309
Параметры для удаления кнопки:
310
  * eax = 8 - номер функции
311
  * edx = 0x80nnnnnn, где nnnnnn - идентификатор кнопки
312
Возвращаемое значение:
313
  * функция не возвращает значения
314
Замечания:
315
  * Размеры кнопки должны быть больше 0 и меньше 0x8000.
316
  * Для окон со скином при определении окна (вызове 0-й функции)
317
    создаются две стандартные кнопки - закрытия окна
318
    с идентификатором 1 и минимизации окна с идентификатором 0xffff.
319
  * Создание двух кнопок с одинаковыми идентификаторами
320
    вполне допустимо.
321
  * Кнопка с идентификатором 0xffff при нажатии интерпретируется
322
    системой как кнопка минимизации, система обрабатывает такое
323
    нажатие самостоятельно, не обращаясь к приложению.
324
    В остальном это обычная кнопка.
325
  * Общее количество кнопок для всех приложений ограничено
326
    числом 4095.
77 diamond 327
 
328
======================================================================
3539 clevermous 329
============= Функция 9 - информация о потоке выполнения. ============
77 diamond 330
======================================================================
3539 clevermous 331
Параметры:
332
  * eax = 9 - номер функции
333
  * ebx = указатель на буфер размера 1 Кб
334
  * ecx = номер слота потока
335
    ecx = -1 - получить информацию о текущем потоке
336
Возвращаемое значение:
337
  * eax = максимальный номер слота потока
338
  * буфер, на который указывает ebx, содержит следующую информацию:
339
    * +0: dword: использование процессора (сколько тактов в секунду
340
      уходит на исполнение именно этого потока)
341
    * +4: word: позиция окна потока в оконном стэке
342
    * +6: word: (не имеет отношения к запрошенному потоку)
343
      номер слота потока, окно которого находится в оконном стэке
344
      в позиции ecx
345
    * +8: word: зарезервировано
346
    * +10 = +0xA: 11 байт: имя процесса
347
      (имя запущенного файла - исполняемый файл без расширения)
348
    * +21 = +0x15: byte: зарезервировано, этот байт не изменяется
349
    * +22 = +0x16: dword: адрес процесса в памяти
350
    * +26 = +0x1A: dword: размер используемой памяти - 1
351
    * +30 = +0x1E: dword: идентификатор (PID/TID)
352
    * +34 = +0x22: dword: координата окна потока по оси x
353
    * +38 = +0x26: dword: координата окна потока по оси y
354
    * +42 = +0x2A: dword: размер окна потока по оси x
355
    * +46 = +0x2E: dword: размер окна потока по оси y
356
    * +50 = +0x32: word: состояние слота потока:
357
      * 0 = поток выполняется
358
      * 1 = поток приостановлен
359
      * 2 = поток приостановлен в момент ожидания события
360
      * 3 = поток завершается в результате вызова функции -1 или
361
        насильственно как следствие вызова подфункции 2 функции 18
362
        или завершения работы системы
363
      * 4 = поток завершается в результате исключения
364
      * 5 = поток ожидает события
365
      * 9 = запрошенный слот свободен, вся остальная информация о
366
        слоте не имеет смысла
367
    * +52 = +0x34: word: зарезервировано, это слово не изменяется
368
    * +54 = +0x36: dword: координата начала клиентской области
369
                          по оси x
370
    * +58 = +0x3A: dword: координата начала клиентской области
371
                          по оси y
372
    * +62 = +0x3E: dword: ширина клиентской области
373
    * +66 = +0x42: dword: высота клиентской области
374
    * +70 = +0x46: byte: состояние окна - битовое поле
375
      * бит 0 (маска 1): окно максимизировано
376
      * бит 1 (маска 2): окно минимизировано в панель задач
377
      * бит 2 (маска 4): окно свёрнуто в заголовок
378
    * +71 = +0x47: dword: маска событий
4264 0CodErr 379
    * +75 = +0x4B: byte: режим ввода с клавиатуры(ASCII = 0; SCAN = 1)
3539 clevermous 380
Замечания:
381
  * Слоты нумеруются с 1.
382
  * Возвращаемое значение не есть общее число потоков, поскольку
383
    бывают свободные слоты.
384
  * При создании процесса автоматически создается поток выполнения.
385
  * Функция выдает информацию о потоке. Каждый процесс имеет
386
    хотя бы один поток. Один процесс может создать несколько потоков,
387
    в этом случае каждый поток получает свой слот, причем поля
388
    +10, +22, +26 в этих слотах совпадают.
389
    Для приложений не существует общего способа определить,
390
    принадлежат ли два потока одному процессу.
391
  * Активное окно - окно, находящееся на вершине оконного стэка,
392
    оно получает сообщения о вводе с клавиатуры. Для него позиция в
393
    оконном стэке совпадает с возвращаемым значением.
394
  * Слот 1 соответствует специальному потоку операционной системы,
395
    для которого:
396
    * окно находится внизу оконного стэка, поля +4 и +6 содержат
397
      значение 1
398
    * имя процесса - "OS/IDLE" (дополненное пробелами)
399
    * адрес процесса в памяти равен 0, размер используемой памяти
77 diamond 400
      16 Mb (0x1000000)
401
    * PID=1
3539 clevermous 402
    * координаты и размеры окна, равно как и клиентской области,
403
      условно полагаются равными 0
404
    * состояние слота - всегда 0 (выполняется)
405
    * время выполнения складывается из времени, уходящего на
406
      собственно работу, и времени простоя в ожидании прерывания
407
      (которое можно получить вызовом подфункции 4 функции 18).
408
  * Начиная со слота 2, размещаются обычные приложения.
409
  * Обычные приложения размещаются в памяти по адресу 0
410
    (константа ядра std_application_base_address).
411
    Наложения не происходит, поскольку у каждого процесса своя
412
    таблица страниц.
413
  * При создании потока ему назначаются слот в системной таблице и
414
    идентификатор (Process/Thread IDentifier = PID/TID), которые для
415
    заданного потока не изменяются со временем.
416
    После завершения потока его слот может быть заново использован
417
    для другого потока. Идентификатор потока не может быть назначен
418
    другому потоку даже после завершения первого.
419
    Назначаемые новым потокам идентификаторы монотонно растут.
420
  * Если поток еще не определил свое окно вызовом функции 0, то
421
    положение и размеры этого окна полагаются нулями.
422
  * Координаты клиентской области окна берутся относительно окна.
423
  * В данный момент используется только часть буфера размером
4264 0CodErr 424
    76 = 0x4C байта. Тем не менее рекомендуется использовать буфер
3539 clevermous 425
    размером 1 Кб для будущей совместимости, в будущем могут быть
426
    добавлены некоторые поля.
77 diamond 427
 
428
======================================================================
3539 clevermous 429
==================== Функция 10 - ожидать события. ===================
77 diamond 430
======================================================================
3539 clevermous 431
Если очередь сообщений пуста, то ждет появления сообщения в очереди.
432
В таком состоянии поток не получает процессорного времени.
433
Затем считывает сообщение из очереди.
77 diamond 434
 
3539 clevermous 435
Параметры:
436
  * eax = 10 - номер функции
437
Возвращаемое значение:
438
  * eax = событие (смотри список событий)
439
Замечания:
440
  * Учитываются только те события, которые входят в маску,
441
    устанавливаемую функцией 40. По умолчанию это события
442
    перерисовки, нажатия на клавиши и на кнопки.
443
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
444
    Чтобы ждать не более определенного времени, используйте
445
    функцию 23.
77 diamond 446
 
447
======================================================================
3539 clevermous 448
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
77 diamond 449
======================================================================
3539 clevermous 450
Если в очереди сообщений есть какое-то событие, то считывает и
451
возвращает его. Если очередь пуста, возвращает нуль.
452
Параметры:
453
  * eax = 11 - номер функции
454
Возвращаемое значение:
455
  * eax = 0 - очередь сообщений пуста
456
  * иначе eax = событие (смотри список событий)
457
Замечания:
458
  * Учитываются только те события, которые входят в маску,
459
    устанавливаемую функцией 40. По умолчанию это события
460
    перерисовки, нажатия на клавиши и на кнопки.
461
  * Для ожидания появления события в очереди, используйте функцию 10.
462
    Чтобы ждать не более определенного времени, используйте
463
    функцию 23.
77 diamond 464
 
465
======================================================================
3539 clevermous 466
=========== Функция 12 - начать/закончить перерисовку окна. ==========
77 diamond 467
======================================================================
468
 
3539 clevermous 469
-------------- Подфункция 1 - начать перерисовку окна. ---------------
470
Параметры:
471
  * eax = 12 - номер функции
472
  * ebx = 1 - номер подфункции
473
Возвращаемое значение:
474
  * функция не возвращает значения
77 diamond 475
 
3539 clevermous 476
------------- Подфункция 2 - закончить перерисовку окна. -------------
477
Параметры:
478
  * eax = 12 - номер функции
479
  * ebx = 2 - номер подфункции
480
Возвращаемое значение:
481
  * функция не возвращает значения
482
Замечания:
483
  * Функция начала перерисовки удаляет все определённые
484
    функцией 8 кнопки, их следует определить повторно.
77 diamond 485
 
486
======================================================================
3539 clevermous 487
============ Функция 13 - нарисовать прямоугольник в окне. ===========
77 diamond 488
======================================================================
3539 clevermous 489
Параметры:
490
  * eax = 13 - номер функции
491
  * ebx = [координата по оси x]*65536 + [размер по оси x]
492
  * ecx = [координата по оси y]*65536 + [размер по оси y]
493
  * edx = цвет 0xRRGGBB или 0x80RRGGBB для градиентной заливки
494
Возвращаемое значение:
495
  * функция не возвращает значения
496
Замечания:
497
  * Под координатами понимаются координаты левого верхнего угла
498
    прямоугольника относительно окна.
77 diamond 499
 
500
======================================================================
3539 clevermous 501
================ Функция 14 - получить размеры экрана. ===============
77 diamond 502
======================================================================
3539 clevermous 503
Параметры:
504
  * eax = 14 - номер функции
505
Возвращаемое значение:
506
  * eax = [xsize]*65536 + [ysize], где
507
  * xsize = x-координата правого нижнего угла экрана =
508
            размер по горизонтали - 1
509
  * ysize = y-координата правого нижнего угла экрана =
510
            размер по вертикали - 1
511
Замечания:
512
  * Смотри также подфункцию 5 функции 48 - получить размеры рабочей
513
    области экрана.
77 diamond 514
 
515
======================================================================
3539 clevermous 516
= Функция 15, подфункция 1 - установить размер фонового изображения. =
77 diamond 517
======================================================================
3539 clevermous 518
Параметры:
519
  * eax = 15 - номер функции
520
  * ebx = 1 - номер подфункции
521
  * ecx = ширина изображения
522
  * edx = высота изображения
523
Возвращаемое значение:
524
  * функция не возвращает значения
525
Замечания:
526
  * Вызов функции обязателен перед вызовом подфункций 2 и 5.
527
  * Для обновления экрана (после завершения серии команд, работающих с
528
    фоном) вызывайте подфункцию 3 перерисовки фона.
529
  * Есть парная функция получения размеров фонового изображения -
530
    подфункция 1 функции 39.
77 diamond 531
 
532
======================================================================
3539 clevermous 533
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
77 diamond 534
======================================================================
3539 clevermous 535
Параметры:
536
  * eax = 15 - номер функции
537
  * ebx = 2 - номер подфункции
538
  * ecx = смещение
539
  * edx = цвет точки 0xRRGGBB
540
Возвращаемое значение:
541
  * функция не возвращает значения
542
Замечания:
543
  * Смещение для точки с координатами (x,y) вычисляется как
77 diamond 544
    (x+y*xsize)*3.
3539 clevermous 545
  * Если указанное смещение превышает установленный подфункцией 1
546
    размер, вызов игнорируется.
547
  * Для обновления экрана (после завершения серии команд, работающих с
548
    фоном) вызывайте подфункцию 3 перерисовки фона.
549
  * Есть парная функция получения точки с фонового изображения -
550
    подфункция 2 функции 39.
77 diamond 551
 
552
======================================================================
3539 clevermous 553
============ Функция 15, подфункция 3 - перерисовать фон. ============
77 diamond 554
======================================================================
3539 clevermous 555
Параметры:
556
  * eax = 15 - номер функции
557
  * ebx = 3 - номер подфункции
558
Возвращаемое значение:
559
  * функция не возвращает значения
77 diamond 560
 
561
======================================================================
3539 clevermous 562
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
77 diamond 563
======================================================================
3539 clevermous 564
Параметры:
565
  * eax = 15 - номер функции
566
  * ebx = 4 - номер подфункции
567
  * ecx = режим отрисовки:
568
    * 1 = замостить
569
    * 2 = растянуть
570
Возвращаемое значение:
571
  * функция не возвращает значения
572
Замечания:
573
  * Для обновления экрана (после завершения серии команд, работающих с
574
    фоном) вызывайте подфункцию 3 перерисовки фона.
575
  * Есть парная команда получения режима отрисовки фона -
576
    подфункция 4 функции 39.
77 diamond 577
 
578
======================================================================
3539 clevermous 579
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
77 diamond 580
======================================================================
3539 clevermous 581
Параметры:
582
  * eax = 15 - номер функции
583
  * ebx = 5 - номер подфункции
584
  * ecx = указатель на данные в формате BBGGRRBBGGRR...
585
  * edx = смещение в данных фонового изображения
586
  * esi = размер данных в байтах = 3 * число пикселей
587
Возвращаемое значение:
588
  * функция не возвращает значения
589
Замечания:
590
  * Проверки корректности смещения и размера не производится.
591
  * Цвет каждого пикселя хранится как 3-байтная величина BBGGRR.
592
  * Пиксели фонового изображения записываются последовательно
593
    слева направо, сверху вниз.
594
  * Смещение пикселя с координатами (x,y) есть (x+y*xsize)*3.
595
  * Для обновления экрана (после завершения серии команд, работающих с
596
    фоном) вызывайте подфункцию 3 перерисовки фона.
77 diamond 597
 
598
======================================================================
3539 clevermous 599
====================== Функция 15, подфункция 6 ======================
600
==== Спроецировать данные фона на адресное пространство процесса. ====
546 diamond 601
======================================================================
3539 clevermous 602
Параметры:
603
  * eax = 15 - номер функции
604
  * ebx = 6 - номер подфункции
605
Возвращаемое значение:
606
  * eax = указатель на данные фона, 0 при ошибке
607
Замечания:
608
  * Спроецированные данные доступны на чтение и запись.
609
  * Размер данных фона равен 3*xsize*ysize. Изменение размеров фона
610
    блокируется на время работы с спроецированными данными.
611
  * Цвет каждого пикселя хранится как 3-байтовая величина BBGGRR.
612
  * Пиксели фонового изображения записываются последовательно
613
    слева направо, сверху вниз.
546 diamond 614
 
615
======================================================================
3539 clevermous 616
====================== Функция 15, подфункция 7 ======================
617
=== Закрыть проекцию данных фона на адресное пространство процесса. ==
546 diamond 618
======================================================================
3539 clevermous 619
Параметры:
620
  * eax = 15 - номер функции
621
  * ebx = 7 - номер подфункции
622
  * ecx = указатель на данные фона
623
Возвращаемое значение:
624
  * eax = 1 при успехе, 0 при ошибке
546 diamond 625
 
626
======================================================================
3539 clevermous 627
====================== Функция 15, подфункция 8 ======================
628
=========== Получить координаты последней отрисовки фона. ============
2515 mario79 629
======================================================================
3539 clevermous 630
Параметры:
631
  * eax = 15 - номер функции
632
  * ebx = 8 - номер подфункции
633
Возвращаемое значение:
2515 mario79 634
  * eax = [left]*65536 + [right]
635
  * ebx = [top]*65536 + [bottom]
3539 clevermous 636
Замечания:
637
  * (left,top) - координаты левого верхнего угла,
638
    (right,bottom) - координаты правого нижнего.
639
  * Для получения более достоверных сведений, необходимо вызвать
640
    функцию сразу после получения события:
641
             5 = завершилась перерисовка фона рабочего стола
2515 mario79 642
 
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
 
659
======================================================================
3539 clevermous 660
============= Функция 16 - сохранить рамдиск на дискету. =============
77 diamond 661
======================================================================
3539 clevermous 662
Параметры:
663
  * eax = 16 - номер функции
664
  * ebx = 1 или ebx = 2 - на какую дискету сохранять
665
Возвращаемое значение:
666
  * eax = 0 - успешно
667
  * eax = 1 - ошибка
77 diamond 668
 
669
======================================================================
3539 clevermous 670
============== Функция 17 - получить код нажатой кнопки. =============
77 diamond 671
======================================================================
3539 clevermous 672
Забирает код нажатой кнопки из буфера.
673
Параметры:
674
  * eax = 17 - номер функции
675
Возвращаемое значение:
676
  * если буфер пуст, возвращается eax=1
677
  * если буфер непуст:
678
    * старшие 24 бита eax содержат идентификатор кнопки
679
      (в частности, в ah оказывается младший байт идентификатора;
680
      если все кнопки имеют идентификатор, меньший 256,
681
      то для различения достаточно ah)
682
    * al = 0 - кнопка была нажата левой кнопкой мыши
683
    * al = бит, соответствующий нажавшей кнопке мыши, если не левой
684
Замечания:
685
  * "Буфер" хранит только одну кнопку, при нажатии новой кнопки
686
    информация о старой теряется.
687
  * При вызове этой функции приложением с неактивным окном
688
    возвращается ответ "буфер пуст".
689
  * Возвращаемое значение al соответствует состоянию кнопок мыши
690
    в формате подфункции 2 функции 37 в момент начала нажатия
691
    на кнопку, за исключением младшего бита (соответствующего левой
692
    кнопке мыши), который сбрасывается.
2244 mario79 693
======================================================================
3539 clevermous 694
= Функция 18, подфункция 1 - сделать самым нижним окно потока. =======
2244 mario79 695
======================================================================
3539 clevermous 696
Параметры:
697
  * eax = 18 - номер функции
698
  * ebx = 1 - номер подфункции
699
  * ecx = номер слота потока
700
Возвращаемое значение:
701
  * функция не возвращает значения
77 diamond 702
 
703
======================================================================
3539 clevermous 704
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
77 diamond 705
======================================================================
3539 clevermous 706
Параметры:
707
  * eax = 18 - номер функции
708
  * ebx = 2 - номер подфункции
709
  * ecx = номер слота процесса/потока
710
Возвращаемое значение:
711
  * функция не возвращает значения
712
Замечания:
713
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
714
    1), можно завершить любой обычный поток/процесс.
715
  * Смотри также подфункцию 18 - завершение
716
    процесса/потока с заданным идентификатором.
77 diamond 717
 
718
======================================================================
3539 clevermous 719
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
77 diamond 720
======================================================================
3539 clevermous 721
Параметры:
722
  * eax = 18 - номер функции
723
  * ebx = 3 - номер подфункции
724
  * ecx = номер слота потока
725
Возвращаемое значение:
726
  * функция не возвращает значения
727
Замечания:
728
  * При указании корректного, но несуществующего слота активизируется
729
    какое-то окно.
730
  * Узнать, какое окно является активным, можно вызовом подфункции 7.
77 diamond 731
 
732
======================================================================
3780 Serge 733
 Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
77 diamond 734
======================================================================
3539 clevermous 735
Под пустыми тактами понимается время, в которое процессор простаивает
736
в ожидании прерывания (в инструкции hlt).
77 diamond 737
 
3539 clevermous 738
Параметры:
739
  * eax = 18 - номер функции
740
  * ebx = 4 - номер подфункции
741
Возвращаемое значение:
742
  * eax = значение счётчика пустых тактов в секунду
77 diamond 743
 
744
======================================================================
3539 clevermous 745
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
77 diamond 746
======================================================================
3539 clevermous 747
Параметры:
748
  * eax = 18 - номер функции
749
  * ebx = 5 - номер подфункции
750
Возвращаемое значение:
751
  * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
77 diamond 752
 
753
======================================================================
3780 Serge 754
 Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
77 diamond 755
======================================================================
3539 clevermous 756
Параметры:
757
  * eax = 18 - номер функции
758
  * ebx = 6 - номер подфункции
759
  * ecx = указатель на строку с полным именем файла
760
    (например, "/hd0/1/kolibri/kolibri.img")
761
Возвращаемое значение:
762
  * eax = 0 - успешно
763
  * иначе eax = код ошибки файловой системы
764
Замечания:
765
  * Все папки в указанном пути должны существовать, иначе вернётся
766
    значение 5, "файл не найден".
77 diamond 767
 
768
======================================================================
3539 clevermous 769
====== Функция 18, подфункция 7 - получить номер активного окна. =====
77 diamond 770
======================================================================
3539 clevermous 771
Параметры:
772
  * eax = 18 - номер функции
773
  * ebx = 7 - номер подфункции
774
Возвращаемое значение:
775
  * eax = номер активного окна (номер слота потока, окно которого
776
    активно)
777
Замечания:
778
  * Активное окно находится вверху оконного стэка и получает
779
    сообщения обо всём вводе с клавиатуры.
780
  * Сделать окно активным можно вызовом подфункции 3.
77 diamond 781
 
782
======================================================================
3539 clevermous 783
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
77 diamond 784
======================================================================
3539 clevermous 785
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
786
При включённом - направляются на встроенный спикер.
77 diamond 787
 
3539 clevermous 788
--------------- Подподфункция 1 - получить состояние. ----------------
789
Параметры:
790
  * eax = 18 - номер функции
791
  * ebx = 8 - номер подфункции
792
  * ecx = 1 - номер подподфункции
793
Возвращаемое значение:
794
  * eax = 0 - звук спикера разрешён; 1 - запрещён
77 diamond 795
 
3539 clevermous 796
-------------- Подподфункция 2 - переключить состояние. --------------
797
Переключает состояния разрешения/запрещения.
798
Параметры:
799
  * eax = 18 - номер функции
800
  * ebx = 8 - номер подфункции
801
  * ecx = 2 - номер подподфункции
802
Возвращаемое значение:
803
  * функция не возвращает значения
77 diamond 804
 
805
======================================================================
3539 clevermous 806
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
77 diamond 807
======================================================================
3539 clevermous 808
Параметры:
809
  * eax = 18 - номер функции
810
  * ebx = 9 - номер подфункции
811
  * ecx = параметр:
812
    * 2 = выключить компьютер
813
    * 3 = перезагрузить компьютер
814
    * 4 = перезапустить ядро из файла kernel.mnt на рамдиске
815
Возвращаемое значение:
816
  * при неверном ecx регистры не меняются (т.е. eax=18)
817
  * при правильном вызове всегда возвращается признак успеха eax=0
818
Замечания:
819
  * Не следует полагаться на возвращаемое значение при неверном
820
    вызове, оно может измениться в последующих версиях ядра.
1018 diamond 821
 
77 diamond 822
======================================================================
4573 clevermous 823
========= Функция 18, подфункция 10 - свернуть активное окно. ========
77 diamond 824
======================================================================
4573 clevermous 825
Сворачивает активное окно.
3539 clevermous 826
Параметры:
827
  * eax = 18 - номер функции
828
  * ebx = 10 - номер подфункции
829
Возвращаемое значение:
830
  * функция не возвращает значения
831
Замечания:
832
  * Минимизированное окно с точки зрения функции 9 сохраняет положение
833
    и размеры.
3780 Serge 834
  * Восстановление окна приложения происходит при активизировании
3539 clevermous 835
    подфункцией 3.
836
  * Обычно нет необходимости явно сворачивать/разворачивать своё окно:
837
    сворачивание окна осуществляется системой при нажатии на кнопку
838
    минимизации (которая для окон со скином определяется автоматически
839
    функцией 0, для окон без скина её можно определить функцией 8),
5452 leency 840
    восстановление - приложением @taskbar.
77 diamond 841
 
842
======================================================================
3539 clevermous 843
====================== Функция 18, подфункция 11 =====================
844
============= Получить информацию о дисковой подсистеме. =============
77 diamond 845
======================================================================
3539 clevermous 846
Параметры:
847
  * eax = 18 - номер функции
848
  * ebx = 11 - номер подфункции
849
  * ecx = тип таблицы:
4700 mario79 850
    * 1 = короткая версия, 16 байт
3539 clevermous 851
  * edx = указатель на буфер (в приложении) для таблицы
852
Возвращаемое значение:
853
  * функция не возвращает значения
854
Формат таблицы: короткая версия:
855
  * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
856
    где AAAA задаёт тип первого дисковода, BBBB - второго согласно
857
    следующему списку:
858
    * 0 = нет дисковода
77 diamond 859
    * 1 = 360Kb, 5.25''
860
    * 2 = 1.2Mb, 5.25''
861
    * 3 = 720Kb, 3.5''
862
    * 4 = 1.44Mb, 3.5''
3539 clevermous 863
    * 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
864
    Например, для стандартной конфигурации из одного 1.44-дисковода
865
    здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
866
    значение оказывается 24h.
4700 mario79 867
 
868
  Первый контроллер IDE:
3539 clevermous 869
  * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
870
    где AA соответствует контроллеру IDE0, ..., DD - IDE3:
871
    * 0 = устройство отсутствует
872
    * 1 = жёсткий диск
873
    * 2 = CD-привод
874
    Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
875
  * +2: 4 db: число найденных разделов на жёстких дисках с
876
    соответственно IDE0,...,IDE3.
4700 mario79 877
 
878
  Второй контроллер IDE:
879
  * +6: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
880
    где AA соответствует контроллеру IDE4, ..., DD - IDE7:
881
    * 0 = устройство отсутствует
882
    * 1 = жёсткий диск
883
    * 2 = CD-привод
884
    Например, в случае HD на IDE4 и CD на IDE6 здесь будет 48h.
885
  * +7: 4 db: число найденных разделов на жёстких дисках с
886
    соответственно IDE4,...,IDE7.
887
 
888
  Третий контроллер IDE:
889
  * +11: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
890
    где AA соответствует контроллеру IDE8, ..., DD - IDE11:
891
    * 0 = устройство отсутствует
892
    * 1 = жёсткий диск
893
    * 2 = CD-привод
894
    Например, в случае HD на IDE8 и CD на IDE10 здесь будет 48h.
895
  * +12: 4 db: число найденных разделов на жёстких дисках с
896
    соответственно IDE8,...,IDE11.
897
 
3539 clevermous 898
    При отсутствии жёсткого диска на IDEx соответствующий байт
899
    нулевой, при наличии показывает число распознанных разделов,
900
    которых может и не быть (если носитель не отформатирован или
901
    если файловая система не поддерживается). В текущей версии ядра
4700 mario79 902
    для жёстких дисков поддерживаются только FAT12/16/32, NTFS,
903
    ext2/3/4 и XFS.
4641 mario79 904
 
3539 clevermous 905
Замечания:
4700 mario79 906
  * Таблица может быть использована для получения информации
3539 clevermous 907
    об имеющихся устройствах.
77 diamond 908
 
909
======================================================================
3539 clevermous 910
========== Функция 18, подфункция 13 - получить версию ядра. =========
77 diamond 911
======================================================================
3539 clevermous 912
Параметры:
913
  * eax = 18 - номер функции
914
  * ebx = 13 - номер подфункции
915
  * ecx = указатель на буфер (не менее 16 байт), куда будет помещена
916
    информация
917
Возвращаемое значение:
918
  * функция не возвращает значения
919
Структура буфера:
920
db a,b,c,d для версии a.b.c.d
921
db 0: зарезервировано
922
dd REV - номер svn-ревизии ядра
923
Для ядра Kolibri 0.7.7.0+:
1662 Nasarus 924
db 0,7,7,0
1675 Nasarus 925
db 0
1676 Nasarus 926
dd 1675
77 diamond 927
 
928
======================================================================
3539 clevermous 929
====================== Функция 18, подфункция 14 =====================
930
======= Ожидать начала обратного хода луча развёртки монитора. =======
77 diamond 931
======================================================================
3539 clevermous 932
Параметры:
933
  * eax = 18 - номер функции
934
  * ebx = 14 - номер подфункции
935
Возвращаемое значение:
936
  * eax = 0 как признак успеха
937
Замечания:
938
  * Функция предназначена исключительно для активных
939
    высокопроизводительных графических приложений; используется для
940
    плавного вывода графики.
77 diamond 941
 
942
======================================================================
3539 clevermous 943
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
77 diamond 944
======================================================================
3539 clevermous 945
Параметры:
946
  * eax = 18 - номер функции
947
  * ebx = 15 - номер подфункции
948
Возвращаемое значение:
949
  * eax = 0 как признак успеха
77 diamond 950
 
951
======================================================================
3539 clevermous 952
====================== Функция 18, подфункция 16 =====================
953
============ Получить размер свободной оперативной памяти. ===========
77 diamond 954
======================================================================
3539 clevermous 955
Параметры:
956
  * eax = 18 - номер функции
957
  * ebx = 16 - номер подфункции
958
Возвращаемое значение:
959
  * eax = размер свободной памяти в килобайтах
77 diamond 960
 
961
======================================================================
3539 clevermous 962
====================== Функция 18, подфункция 17 =====================
963
============ Получить размер имеющейся оперативной памяти. ===========
77 diamond 964
======================================================================
3539 clevermous 965
Параметры:
966
  * eax = 18 - номер функции
967
  * ebx = 17 - номер подфункции
968
Возвращаемое значение:
969
  * eax = общий размер имеющейся памяти в килобайтах
77 diamond 970
 
971
======================================================================
3539 clevermous 972
====================== Функция 18, подфункция 18 =====================
973
============= Завершить процесс/поток по идентификатору. =============
85 halyavin 974
======================================================================
3539 clevermous 975
Параметры:
976
  * eax = 18 - номер функции
977
  * ebx = 18 - номер подфункции
978
  * ecx = идентификатор процесса/потока (PID/TID)
979
Возвращаемое значение:
980
  * eax = 0 - успешно
981
  * eax = -1 - ошибка (процесс не найден или является системным)
982
Замечания:
983
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
984
    1), можно завершить любой обычный поток/процесс.
985
  * Смотри также подфункцию 2 - завершение
986
    процесса/потока по заданному слоту.
85 halyavin 987
 
988
======================================================================
3539 clevermous 989
=== Функция 18, подфункция 19 - получить/установить настройки мыши. ==
120 mario79 990
======================================================================
131 diamond 991
 
3539 clevermous 992
------------- Подподфункция 0 - получить скорость мыши. --------------
993
Параметры:
994
  * eax = 18 - номер функции
995
  * ebx = 19 - номер подфункции
996
  * ecx = 0 - номер подподфункции
997
Возвращаемое значение:
998
  * eax = текущая скорость мыши
120 mario79 999
 
3539 clevermous 1000
------------ Подподфункция 1 - установить скорость мыши. -------------
1001
Параметры:
1002
  * eax = 18 - номер функции
1003
  * ebx = 19 - номер подфункции
1004
  * ecx = 1 - номер подподфункции
1005
  * edx = новое значение скорости
1006
Возвращаемое значение:
1007
  * функция не возвращает значения
120 mario79 1008
 
5956 pathoswith 1009
Замечание: рекомендуемая скорость = 1, 0 = заблокировать курсор.
1010
 
1011
------------- Подподфункция 2 - получить ускорение мыши. -------------
3539 clevermous 1012
Параметры:
1013
  * eax = 18 - номер функции
1014
  * ebx = 19 - номер подфункции
1015
  * ecx = 2 - номер подподфункции
1016
Возвращаемое значение:
5956 pathoswith 1017
  * eax = 2 - лютое, 1 - слабое, 0 - выключить
120 mario79 1018
 
5956 pathoswith 1019
------------ Подподфункция 3 - установить ускорение мыши. ------------
3539 clevermous 1020
Параметры:
1021
  * eax = 18 - номер функции
1022
  * ebx = 19 - номер подфункции
1023
  * ecx = 3 - номер подподфункции
5956 pathoswith 1024
  * edx = 2 - лютое, 1 - слабое, 0 - выключить
3539 clevermous 1025
Возвращаемое значение:
1026
  * функция не возвращает значения
120 mario79 1027
 
3539 clevermous 1028
-------- Подподфункция 4 - установить положение курсора мыши. --------
1029
Параметры:
1030
  * eax = 18 - номер функции
1031
  * ebx = 19 - номер подфункции
1032
  * ecx = 4 - номер подподфункции
1033
  * edx = [координата по оси x]*65536 + [координата по оси y]
1034
Возвращаемое значение:
1035
  * функция не возвращает значения
621 mario79 1036
 
3539 clevermous 1037
------- Подподфункция 5 - симулировать состояние клавиш мыши. --------
1038
Параметры:
1039
  * eax = 18 - номер функции
1040
  * ebx = 19 - номер подфункции
1041
  * ecx = 5 - номер подподфункции
1042
  * edx = информация о эмулируемом состоянии кнопок мыши:
1043
    (соответствует возвращаемому значению подфункции 2 функции 37)
1044
    * бит 0 установлен = левая кнопка нажата
1045
    * бит 1 установлен = правая кнопка нажата
1046
    * бит 2 установлен = средняя кнопка нажата
1047
    * бит 3 установлен = 4-я кнопка нажата
1048
    * бит 4 установлен = 5-я кнопка нажата
1049
Возвращаемое значение:
1050
  * функция не возвращает значения
5851 pathoswith 1051
 
1052
-------- Подподфункция 6 - получить задержку двойного щелчка. --------
1053
Параметры:
1054
  * eax = 18 - номер функции
1055
  * ebx = 19 - номер подфункции
1056
  * ecx = 6 - номер подподфункции
1057
Возвращаемое значение:
1058
  * eax = текущая задержка двойного щелчка (100 = секунда)
1059
 
1060
------- Подподфункция 7 - установить задержку двойного щелчка. -------
1061
Параметры:
1062
  * eax = 18 - номер функции
1063
  * ebx = 19 - номер подфункции
1064
  * ecx = 7 - номер подподфункции
1065
  * dl  = новое значение задержки двойного щелчка (100 = секунда)
1066
Возвращаемое значение:
1067
  * функция не возвращает значения
1068
 
5956 pathoswith 1069
Замечание: настройки мыши можно регулировать в приложении mouse_cfg.
120 mario79 1070
 
1071
======================================================================
3539 clevermous 1072
====================== Функция 18, подфункция 20 =====================
1073
============= Получить информацию об оперативной памяти. =============
172 serge 1074
======================================================================
3539 clevermous 1075
Параметры:
1076
  * eax = 18 - номер функции
1077
  * ebx = 20 - номер подфункции
1078
  * ecx = указатель на буфер для информации (36 байт)
1079
Возвращаемое значение:
1080
  * eax = общий размер имеющейся оперативной памяти в байтах
1081
    или -1 в случае ошибки
1082
  * буфер, на который указывает ecx, содержит следующую информацию:
1083
    * +0: dword: общий размер имеющейся оперативной памяти в страницах
1084
    * +4:  dword: размер свободной оперативной памяти в страницах
1085
    * +8:  dword: число страничных ошибок (исключений #PF)
1086
                 в приложениях
1087
    * +12: dword: размер кучи ядра в байтах
1088
    * +16: dword: размер свободной памяти в куче ядра в байтах
1089
    * +20: dword: общее количество блоков памяти в куче ядра
1090
    * +24: dword: количество свободных блоков памяти в куче ядра
1091
    * +28: dword: размер наибольшего свободного блока в куче ядра
1092
                 (зарезервировано)
1093
    * +32: dword: размер наибольшего выделенного блока в куче ядра
1094
                 (зарезервировано)
172 serge 1095
 
1096
======================================================================
3539 clevermous 1097
====================== Функция 18, подфункция 21 =====================
1098
======= Получить номер слота процесса/потока по идентификатору. ======
608 alver 1099
======================================================================
3539 clevermous 1100
Параметры:
1101
  * eax = 18 - номер функции
1102
  * ebx = 21 - номер подфункции
1103
  * ecx = идентификатор процесса/потока (PID/TID)
1104
Возвращаемое значение:
1105
  * eax = 0 - ошибка (неверный идентификатор)
1106
  * иначе eax = номер слота
608 alver 1107
 
1108
======================================================================
3780 Serge 1109
 Функция 18, подфункция 22 - операции с окном другого процесса/потока.
608 alver 1110
======================================================================
3539 clevermous 1111
Параметры:
1112
  * eax = 18 - номер функции
1113
  * ebx = 22 - номер подфункции
1114
  * ecx = тип операции:
1115
    * 0 = минимизация окна, поток задан номером слота
1116
    * 1 = минимизация окна, поток задан идентификатором
1117
    * 2 = восстановление окна, поток задан номером слота
1118
    * 3 = восстановление окна, поток задан идентификатором
1119
  * edx = параметр операции (номер слота или PID/TID)
1120
Возвращаемое значение:
1121
  * eax = 0 - успешно
1122
  * eax = -1 - ошибка (неправильный параметр)
1123
Замечания:
1124
  * Поток может свернуть своё окно вызовом подфункции 10.
1125
  * Восстановление окна с одновременной активизацией осуществляется
1126
    подфункции 3 (принимающей номер слота).
608 alver 1127
 
1128
======================================================================
3539 clevermous 1129
======= Функция 18, подфункция 23 - минимизировать все окна. =========
2648 mario79 1130
======================================================================
3539 clevermous 1131
Параметры:
1132
  * eax = 18 - номер функции
1133
  * ebx = 23 - номер подфункции
1134
Возвращаемое значение:
1135
  * eax = 0 - все окна были минимизированы до вызова функции
1136
  * eax = N - количество окон свернутых функцией
1137
Замечания:
1138
  * Окна спец. потоков (имя начинается с символа @) не сворачиваются.
2648 mario79 1139
 
1140
======================================================================
3539 clevermous 1141
===== Функция 18, подфункция 24 - установить пределы отрисовки. ======
2654 mario79 1142
======================================================================
3539 clevermous 1143
Параметры:
1144
  * eax = 18 - номер функции
1145
  * ebx = 24 - номер подфункции
1146
  * ecx = новый размер по X
1147
  * edx = новый размер по Y
1148
Возвращаемое значение:
1149
  * функция не возвращает значения
1150
Замечания:
1151
  * Функция не меняет физический размер видеорежима. Она предназначена
1152
    для нестандартных дисплеев, отображающих изображение частично.
1153
  * Размеры указываемые в функции не должны превышать размеры текущего
1154
    видеорежима, иначе функция ничего не изменит.
2654 mario79 1155
 
1156
======================================================================
5836 GerdtR 1157
===================== Функция 18, подфункция 25 ======================
1158
======== Управление положением окна относительно других окон. ========
1159
======================================================================
1160
 
1161
------------- Подподфункция 1 - получить положение  ------------------
1162
Параметры:
1163
  * eax = 18 - номер функции
1164
  * ebx = 25 - номер подфункции
1165
  * ecx = 1 - номер подподфункции
1166
  * edx = -1(для текущего окна) или PID приложения
1167
Возвращаемое значение:
1168
  * eax = одна из констант положения окна
1169
 
1170
------------- Подподфункция 2 - установить положение  ----------------
1171
Параметры:
1172
  * eax = 18 - номер функции
1173
  * ebx = 25 - номер подфункции
1174
  * ecx = 2 - номер подподфункции
1175
  * edx = -1(для текущего окна) или PID приложения
1176
  * esi = новое положение окна (одна из констант ниже)
1177
Возвращаемое значение:
1178
  * eax = 0 - неудача
1179
  * eax = 1 - успех
1180
 
1181
Константы положения окна относительно других окон:
5865 GerdtR 1182
 ZPOS_DESKTOP     = -2 - на самом заднем плане
1183
 ZPOS_ALWAYS_BACK = -1 - позади всех окон
1184
 ZPOS_NORMAL      = 0  - обычное
1185
 ZPOS_ALWAYS_TOP  = 1  - поверх всех окон
5836 GerdtR 1186
 
1187
======================================================================
3539 clevermous 1188
==================== Функция 20 - интерфейс MIDI. ====================
77 diamond 1189
======================================================================
1190
 
3539 clevermous 1191
------------------------ Подфункция 1 - сброс ------------------------
1192
Параметры:
1193
  * eax = 20 - номер функции
1194
  * ebx = 1 - номер подфункции
77 diamond 1195
 
3539 clevermous 1196
-------------------- Подфункция 2 - вывести байт ---------------------
1197
Параметры:
1198
  * eax = 20 - номер функции
1199
  * ebx = 2 - номер подфункции
1200
  * cl = байт для вывода
1201
Возвращаемое значение (одинаково для обеих подфункций):
1202
  * eax = 0 - успешно
1203
  * eax = 1 - не определён базовый порт
1204
Замечания:
3780 Serge 1205
  * Предварительно должен быть определён базовый порт вызовом
3539 clevermous 1206
    подфункции 1 функции 21.
77 diamond 1207
 
1208
======================================================================
3539 clevermous 1209
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
77 diamond 1210
======================================================================
3539 clevermous 1211
Параметры:
1212
  * eax = 21 - номер функции
1213
  * ebx = 1 - номер подфункции
1214
  * ecx = номер базового порта
1215
Возвращаемое значение:
1216
  * eax = 0 - успешно
1217
  * eax = -1 - ошибочный номер порта
1218
Замечания:
1219
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1220
  * Установка базы нужна для работы функции 20.
3780 Serge 1221
  * Получить установленный базовый порт можно вызовом
3539 clevermous 1222
    подфункции 1 функции 26.
77 diamond 1223
 
1224
======================================================================
3539 clevermous 1225
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
77 diamond 1226
======================================================================
3539 clevermous 1227
Раскладка клавиатуры используется для преобразования сканкодов,
1228
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1229
Параметры:
1230
  * eax = 21 - номер функции
1231
  * ebx = 2 - номер подфункции
1232
  * ecx = какую раскладку устанавливать:
1233
    * 1 = нормальную
1234
    * 2 = раскладку при нажатом Shift
1235
    * 3 = раскладку при нажатом Alt
1236
  * edx = указатель на раскладку - таблицу длиной 128 байт
1237
Или:
77 diamond 1238
  * ecx = 9
3539 clevermous 1239
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1240
Возвращаемое значение:
1241
  * eax = 0 - успешно
1242
  * eax = 1 - параметр задан неверно
1243
Замечания:
1244
  * Если нажат Alt, то используется раскладка с Alt;
1245
    если не нажат Alt, но нажат Shift, то
1246
    используется раскладка с Shift;
1247
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1248
    нормальная раскладка, после чего из кода вычитается 0x60;
1249
    если не нажата ни одна из управляющих клавиш, то используется
1250
    нормальная раскладка.
3780 Serge 1251
  * Получить раскладки и идентификатор страны можно с помощью
3539 clevermous 1252
    подфункции 2 функции 26.
1253
  * Идентификатор страны - глобальная системная переменная, которая
5452 leency 1254
    самим ядром не используется; однако приложение @taskbar отображает
3539 clevermous 1255
    соответствующую текущей стране иконку.
5452 leency 1256
  * Приложение @taskbar переключает раскладки по запросу пользователя.
77 diamond 1257
 
1258
======================================================================
3539 clevermous 1259
========= Функция 21, подфункция 5 - установить язык системы. ========
77 diamond 1260
======================================================================
3539 clevermous 1261
Параметры:
1262
  * eax = 21 - номер функции
1263
  * ebx = 5 - номер подфункции
1264
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1265
Возвращаемое значение:
77 diamond 1266
  * eax = 0
3539 clevermous 1267
Замечания:
1268
  * Язык системы - глобальная системная переменная, никак
5452 leency 1269
    не используемая самим ядром, однако приложение @taskbar рисует
3539 clevermous 1270
    соответствующую иконку.
1271
  * Проверок на корректность не делается, поскольку ядро эту
1272
    переменную не использует.
1273
  * Получить язык системы можно вызовом подфункции 5 функции 26.
77 diamond 1274
 
1275
======================================================================
3539 clevermous 1276
====================== Функция 21, подфункция 11 =====================
1277
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
77 diamond 1278
======================================================================
3539 clevermous 1279
Параметры:
1280
  * eax = 21 - номер функции
1281
  * ebx = 11 - номер подфункции
1282
  * ecx = 0/1 - запретить/разрешить
1283
Возвращаемое значение:
77 diamond 1284
  * eax = 0
3539 clevermous 1285
Замечания:
1286
  * Используется при LBA-чтении (подфункция 8 функции 58).
1287
  * Текущая реализация использует только младший бит ecx.
1288
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
77 diamond 1289
 
1290
======================================================================
3539 clevermous 1291
====================== Функция 21, подфункция 12 =====================
1292
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
77 diamond 1293
======================================================================
3539 clevermous 1294
Параметры:
1295
  * eax = 21 - номер функции
1296
  * ebx = 12 - номер подфункции
1297
  * ecx = 0/1 - запретить/разрешить
1298
Возвращаемое значение:
77 diamond 1299
  * eax = 0
3539 clevermous 1300
Замечания:
1301
  * Используется при работе с шиной PCI (функция 62).
1302
  * Текущая реализация использует только младший бит ecx.
1303
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
77 diamond 1304
 
1305
======================================================================
3539 clevermous 1306
============ Функция 22 - установить системную дату/время. ===========
77 diamond 1307
======================================================================
3539 clevermous 1308
Параметры:
1309
  * eax = 22 - номер функции
1310
  * ebx = 0 - установить время
1311
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1312
    * HH=час 00..23
1313
    * MM=минута 00..59
1314
    * SS=секунда 00..59
1315
  * ebx = 1 - установить дату
1316
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1317
    * DD=день 01..31
1318
    * MM=месяц 01..12
1319
    * YY=год 00..99
1320
  * ebx = 2 - установить день недели
1321
    * ecx = 1 для воскресенья, ..., 7 для субботы
1322
  * ebx = 3 - установить будильник
77 diamond 1323
    * ecx = 0x00SSMMHH
3539 clevermous 1324
Возвращаемое значение:
1325
  * eax = 0 - успешно
1326
  * eax = 1 - параметр задан неверно
1327
  * eax = 2 - CMOS-батарейки разрядились
1328
Замечания:
1329
  * Ценность установки дня недели представляется сомнительной,
1330
    поскольку он мало где используется
1331
    (день недели можно рассчитать по дате).
1332
  * Будильник можно установить на срабатывание в заданное время
1333
    каждые сутки. При этом отключить его существующими системными
1334
    функциями нельзя.
1335
  * Срабатывание будильника заключается в генерации IRQ8.
1336
  * Вообще-то CMOS поддерживает для будильника установку значения
1337
    0xFF в качестве одного из параметров и означает это, что
1338
    соответствующий параметр игнорируется. Но в текущей реализации
1339
    это не пройдёт (вернётся значение 1).
1340
  * Будильник - глобальный системный ресурс; установка будильника
1341
    автоматически отменяет предыдущую установку. Впрочем, на данный
1342
    момент ни одна программа его не использует.
77 diamond 1343
 
1344
======================================================================
3539 clevermous 1345
============== Функция 23 - ожидать события с таймаутом. =============
77 diamond 1346
======================================================================
3539 clevermous 1347
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1348
но не более указанного времени. Затем считывает сообщение из очереди.
77 diamond 1349
 
3539 clevermous 1350
Параметры:
1351
  * eax = 23 - номер функции
1352
  * ebx = таймаут (в сотых долях секунды)
1353
Возвращаемое значение:
1354
  * eax = 0 - очередь сообщений пуста
1355
  * иначе eax = событие (смотри список событий)
1356
Замечания:
1357
  * Учитываются только те события, которые входят в маску,
1358
    устанавливаемую функцией 40. По умолчанию это события
1359
    перерисовки, нажатия на клавиши и на кнопки.
1360
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1361
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1362
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1363
  * При текущей реализации произойдёт немедленный возврат из функции
1364
    с eax=0, если сложение ebx с текущим значением счётчика времени
1365
    вызовет 32-битное переполнение.
77 diamond 1366
 
1367
======================================================================
3539 clevermous 1368
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
588 diamond 1369
======================================================================
3539 clevermous 1370
Параметры:
1371
  * eax = 24 - номер функции
1372
  * ebx = 4 - номер подфункции
1373
  * ecx = номер CD/DVD-диска
4711 mario79 1374
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1375
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1376
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
3539 clevermous 1377
Возвращаемое значение:
1378
  * функция не возвращает значения
1379
Замечания:
1380
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1381
  * При извлечении лотка производится разблокировка ручного управления
1382
    механизмом лотка.
1383
  * При извлечении лотка код производит очистку кэша соответствующего
1384
    устройства.
1385
  * Примером использования функции является приложение CD_tray.
588 diamond 1386
 
1387
======================================================================
3539 clevermous 1388
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
588 diamond 1389
======================================================================
3539 clevermous 1390
Параметры:
1391
  * eax = 24 - номер функции
1392
  * ebx = 5 - номер подфункции
1393
  * ecx = номер CD/DVD-диска
4711 mario79 1394
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1395
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1396
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
3539 clevermous 1397
Возвращаемое значение:
1398
  * функция не возвращает значения
1399
Замечания:
1400
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1401
  * Примером использования функции является приложение CD_tray.
588 diamond 1402
 
1403
======================================================================
3539 clevermous 1404
========== Функция 25 - записать область на слой фона. ===============
2509 mario79 1405
======================================================================
3539 clevermous 1406
Параметры:
1407
  * eax = 25 - номер функции
1408
  * ebx = указатель на предварительно выделенную область памяти,
1409
      где размещено исходное изображение в формате BBGGRRTTBBGGRRTT...
1410
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1411
  * edx = [координата по оси x]*65536 + [координата по оси y]
1412
Возвращаемое значение:
1413
  * функция не возвращает значения
1414
Замечания:
1415
  * Координаты области - это координаты верхнего левого угла
1416
    области относительно экрана.
1417
  * Размер изображения в байтах есть 4*xsize*ysize.
1418
  * TT - байт указатель прозрачности, в настоящее время:
1419
         от 1 до FF - непрозрачно, от 0 - прозрачно.
1420
  * Функция размещает изображение не на фоновое изображение (ф.15),
1421
    а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
2509 mario79 1422
 
1423
======================================================================
3539 clevermous 1424
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
77 diamond 1425
======================================================================
3539 clevermous 1426
Параметры:
1427
  * eax = 26 - номер функции
1428
  * ebx = 1 - номер подфункции
1429
Возвращаемое значение:
1430
  * eax = номер порта
1431
Замечания:
3780 Serge 1432
  * Установить базовый порт можно вызовом
3539 clevermous 1433
    подфункции 1 функции 21.
77 diamond 1434
 
1435
======================================================================
3539 clevermous 1436
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
77 diamond 1437
======================================================================
3539 clevermous 1438
Раскладка клавиатуры используется для преобразования сканкодов,
1439
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1440
Параметры:
1441
  * eax = 26 - номер функции
1442
  * ebx = 2 - номер подфункции
1443
  * ecx = какую раскладку получать:
1444
    * 1 = нормальную
1445
    * 2 = раскладку при нажатом Shift
1446
    * 3 = раскладку при нажатом Alt
1447
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1448
    раскладка
1449
Возвращаемое значение:
1450
  * функция не возвращает значения
1451
Или:
1452
  * eax = 26 - номер функции
1453
  * ebx = 2 - номер подфункции
77 diamond 1454
  * ecx = 9
3539 clevermous 1455
Возвращаемое значение:
1456
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1457
Замечания:
1458
  * Если нажат Alt, то используется раскладка с Alt;
1459
    если не нажат Alt, но нажат Shift, то используется
1460
    раскладка с Shift;
1461
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1462
    нормальная раскладка, после чего из кода вычитается 0x60;
1463
    если не нажата ни одна из управляющих клавиш, то используется
1464
    нормальная раскладка.
3780 Serge 1465
  * Установить раскладки и идентификатор страны можно с помощью
3539 clevermous 1466
    подфункции 2 функции 21.
1467
  * Идентификатор страны - глобальная системная переменная, которая
5452 leency 1468
    самим ядром не используется; однако приложение @taskbar отображает
3539 clevermous 1469
    соответствующую текущей стране иконку
1470
    (используя описываемую функцию).
5452 leency 1471
  * Приложение @taskbar переключает раскладки по запросу пользователя.
77 diamond 1472
 
1473
======================================================================
3539 clevermous 1474
========== Функция 26, подфункция 5 - получить язык системы. =========
77 diamond 1475
======================================================================
3539 clevermous 1476
Параметры:
1477
  * eax = 26 - номер функции
1478
  * ebx = 5 - номер подфункции
1479
Возвращаемое значение:
1480
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1481
Замечания:
1482
  * Язык системы - глобальная системная переменная, никак
5452 leency 1483
    не используемая самим ядром, однако приложение @taskbar рисует
3539 clevermous 1484
    соответствующую иконку (используя описываемую функцию).
1485
  * Установить язык системы можно вызовом подфункции 5 функции 21.
77 diamond 1486
 
1487
======================================================================
3539 clevermous 1488
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
77 diamond 1489
======================================================================
3539 clevermous 1490
Параметры:
1491
  * eax = 26 - номер функции
1492
  * ebx = 9 - номер подфункции
1493
Возвращаемое значение:
1494
  * eax = число сотых долей секунды, прошедших с момента
1495
    запуска системы
1496
Замечания:
1497
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1498
    497 суток.
1499
  * Системное время можно получить функцией 3.
77 diamond 1500
 
1501
======================================================================
5813 serge 1502
===================== Функция 26, подфункция 10 ======================
1503
========== Получить значение высокоточного счётчика времени. =========
1504
======================================================================
1505
Parameters:
1506
  * eax = 26 - номер функции
1507
  * ebx = 10 - номер подфункции
1508
Returned value:
1509
  * edx:eax = число наносекунд с момента загрузки ядра
1510
  * eax = младшее двойное слово
1511
  * edx = старшее двойное слово
1512
Remarks:
1513
  * функция использует счётчик HPET, если HPET не доступен используется
1514
    счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
1515
    наносекунд.
1516
 
1517
======================================================================
3539 clevermous 1518
====================== Функция 26, подфункция 11 =====================
1519
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
77 diamond 1520
======================================================================
3539 clevermous 1521
Параметры:
1522
  * eax = 26 - номер функции
1523
  * ebx = 11 - номер подфункции
1524
Возвращаемое значение:
1525
  * eax = 0/1 - запрещён/разрешён
1526
Замечания:
1527
  * Используется при LBA-чтении (подфункция 8 функции 58).
3780 Serge 1528
  * Установить текущее состояние можно вызовом
3539 clevermous 1529
    подфункции 11 функции 21.
77 diamond 1530
 
1531
======================================================================
3539 clevermous 1532
====================== Функция 26, подфункция 12 =====================
1533
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
77 diamond 1534
======================================================================
3539 clevermous 1535
Параметры:
1536
  * eax = 26 - номер функции
1537
  * ebx = 12 - номер подфункции
1538
Возвращаемое значение:
1539
  * eax = 0/1 - запрещён/разрешён
1540
Замечания:
1541
  * Используется при работе с шиной PCI (функция 62).
1542
  * Текущая реализация использует только младший бит ecx.
3780 Serge 1543
  * Установить текущее состояние можно вызовом
3539 clevermous 1544
    подфункции 12 функции 21.
77 diamond 1545
 
1546
======================================================================
3539 clevermous 1547
================ Функция 29 - получить системную дату. ===============
77 diamond 1548
======================================================================
3539 clevermous 1549
Параметры:
1550
  * eax = 29 - номер функции
1551
Возвращаемое значение:
1552
  * eax = 0x00DDMMYY, где
1553
    (используется двоично-десятичное кодирование, BCD)
1554
  * YY = две младшие цифры года (00..99)
1555
  * MM = месяц (01..12)
1556
  * DD = день (01..31)
1557
Замечания:
1558
  * Системную дату можно установить функцией 22.
77 diamond 1559
 
1560
======================================================================
3539 clevermous 1561
================ Функция 30 - работа с текущей папкой. ===============
521 diamond 1562
======================================================================
1563
 
3539 clevermous 1564
-------- Подфункция 1 - установить текущую папку для потока. ---------
1565
Параметры:
1566
  * eax = 30 - номер функции
1567
  * ebx = 1 - номер подфункции
1568
  * ecx = указатель на ASCIIZ-строку с путём к новой текущей папке
1569
Возвращаемое значение:
1570
  * функция не возвращает значения
521 diamond 1571
 
3539 clevermous 1572
--------- Подфункция 2 - получить текущую папку для потока. ----------
1573
Параметры:
1574
  * eax = 30 - номер функции
1575
  * ebx = 2 - номер подфункции
1576
  * ecx = указатель на буфер
1577
  * edx = размер буфера
1578
Возвращаемое значение:
1579
  * eax = длина имени текущей папки (включая завершающий 0)
1580
Замечания:
1581
  * Если размера буфера недостаточно для копирования всего имени,
3780 Serge 1582
    копируются только первые (edx-1) байт и в конце ставится
3539 clevermous 1583
    завершающий 0.
1584
  * По умолчанию, текущая папка для потока - "/rd/1".
1585
  * При создании процесса/потока текущая папка наследуется от
1586
    родителя.
521 diamond 1587
 
3663 mario79 1588
---- Подфункция 3 - установить доп. системную директорию для ядра ----
1589
Параметры:
1590
  * eax = 30 - номер функции
1591
  * ebx = 3 - номер подфункции
1592
  * ecx = указатель на блок данных:
1593
          sysdir_name     rb 64
1594
          sysdir_path     rb 64
3780 Serge 1595
Пример:
1596
dir_name1       db 'KolibriOS',0
3912 mario79 1597
                rb 64-10
3663 mario79 1598
dir_path1       db 'HD0/1',0
1599
                rb 64-6
1600
Возвращаемое значение:
1601
  * функция не возвращает значения
1602
Замечания:
1603
  * Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
1604
 
521 diamond 1605
======================================================================
3539 clevermous 1606
========= Функция 34 - узнать кому принадлежит точка экрана. =========
2511 mario79 1607
======================================================================
3539 clevermous 1608
Параметры:
1609
  * eax = 34 - номер функции
1610
  * ebx = x-координата (относительно экрана)
1611
  * ecx = y-координата (относительно экрана)
2511 mario79 1612
 
3539 clevermous 1613
Возвращаемое значение:
1614
  * eax = 0x000000XX - точка принадлежит слоту окна N
1615
    При некорректных значениях ebx и ecx функция возвращает 0
1616
  * Функция берет значения из области [_WinMapAddress]
2511 mario79 1617
 
1618
======================================================================
3539 clevermous 1619
============ Функция 35 - прочитать цвет точки на экране. ============
77 diamond 1620
======================================================================
3539 clevermous 1621
Параметры:
77 diamond 1622
  * eax = 35
3539 clevermous 1623
  * ebx = y*xsize+x, где
1624
  * (x,y) = координаты точки (считая от 0)
1625
  * xsize = размер экрана по горизонтали
1626
Возвращаемое значение:
1627
  * eax = цвет 0x00RRGGBB
1628
Замечания:
1629
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1630
    что она вычитает 1 из обоих размеров.
1631
  * К видеопамяти есть также прямой доступ (без вызовов системных
1632
    функций) через селектор gs. Параметры текущего видеорежима
1633
    можно получить функцией 61.
77 diamond 1634
 
1635
======================================================================
3539 clevermous 1636
=============== Функция 36 - прочитать область экрана. ===============
921 mario79 1637
======================================================================
3539 clevermous 1638
Параметры:
1639
  * eax = 36 - номер функции
1640
  * ebx = указатель на предварительно выделенную область памяти,
1641
            куда будет помещено изображение в формате BBGGRRBBGGRR...
1642
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1643
  * edx = [координата по оси x]*65536 + [координата по оси y]
1644
Возвращаемое значение:
1645
  * функция не возвращает значения
1646
Замечания:
1647
  * Координаты области - это координаты верхнего левого угла
1648
    области относительно экрана.
1649
  * Размер изображения в байтах есть 3*xsize*ysize.
921 mario79 1650
 
1651
======================================================================
3539 clevermous 1652
==================== Функция 37 - работа с мышью. ====================
77 diamond 1653
======================================================================
1654
 
3539 clevermous 1655
-------------- Подфункция 0 - экранные координаты мыши ---------------
1656
Параметры:
1657
  * eax = 37 - номер функции
1658
  * ebx = 0 - номер подфункции
1659
Возвращаемое значение:
1660
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
77 diamond 1661
 
3539 clevermous 1662
---------- Подфункция 1 - координаты мыши относительно окна ----------
1663
Параметры:
1664
  * eax = 37 - номер функции
1665
  * ebx = 1 - номер подфункции
1666
Возвращаемое значение:
1667
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1668
    окна приложения (считая от 0)
1669
Замечания:
1670
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1671
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1672
    относительную y-координату, а старшее - относительную x-координату
1673
    (правильного знака). В противном случае младшее слово отрицательно
1674
    и всё равно содержит относительную y-координату,
1675
    а к старшему слову следует прибавить 1.
77 diamond 1676
 
5851 pathoswith 1677
---------------- Подфункция 2 - состояния кнопок мыши ----------------
3539 clevermous 1678
Параметры:
1679
  * eax = 37 - номер функции
1680
  * ebx = 2 - номер подфункции
1681
Возвращаемое значение:
5851 pathoswith 1682
  * eax = биты 0-4 соответствуют подфункции 3
77 diamond 1683
 
5851 pathoswith 1684
----------- Подфункция 3 - состояния и события кнопок мыши -----------
1685
Параметры:
1686
  * eax = 37 - номер функции
1687
  * ebx = 3 - номер подфункции
1688
Возвращаемое значение:
1689
  * eax содержит следующую информацию:
1690
 
1691
состояния:
1692
  * бит 0 установлен = удерживается левая кнопка
1693
  * бит 1 установлен = удерживается правая кнопка
1694
  * бит 2 установлен = удерживается средняя кнопка
1695
  * бит 3 установлен = удерживается 4-я кнопка
1696
  * бит 4 установлен = удерживается 5-я кнопка
1697
 
1698
события:
1699
  * бит 8 установлен  = нажата левая кнопка
1700
  * бит 9 установлен  = нажата правая кнопка
1701
  * бит 10 установлен = нажата средняя кнопка
1702
 
1703
  * бит 15 установлен = используется вертикальная прокрутка
1704
 
1705
  * бит 16 установлен = отпущена левая кнопка
1706
  * бит 17 установлен = отпущена правая кнопка
1707
  * бит 18 установлен = отпущена средняя кнопка
1708
 
1709
  * бит 23 установлен = используется горизонтальная прокрутка
1710
 
1711
  * бит 24 установлен = двойной щелчёк левой кнопкой
1712
 
3539 clevermous 1713
------------------ Подфункция 4 - загрузить курсор -------------------
1714
Параметры:
1715
  * eax = 37 - номер функции
1716
  * ebx = 4 - номер подфункции
1717
  * dx = источник данных:
1718
  * dx = LOAD_FROM_FILE = 0 - данные в файле
1719
    * ecx = указатель на полный путь к файлу курсора
1720
    * файл курсора должен быть в формате .cur, стандартном для
1721
      MS Windows, причём размером 32*32 пикселя
1722
  * dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
1723
    * ecx = указатель на данные файла курсора
1724
    * формат данных такой же, как и в предыдущем случае
1725
  * dx = LOAD_INDIRECT = 2 - данные в памяти
1726
    * ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
1727
    * edx = 0xXXYY0002, где
1728
      * XX = x-координата "горячей точки" курсора
1729
      * YY = y-координата
277 diamond 1730
      * 0 <= XX, YY <= 31
3539 clevermous 1731
Возвращаемое значение:
1732
  * eax = 0 - неудача
1733
  * иначе eax = хэндл курсора
221 serge 1734
 
3539 clevermous 1735
------------------ Подфункция 5 - установить курсор ------------------
1736
Устанавливает новый курсор для окна текущего потока.
1737
Параметры:
1738
  * eax = 37 - номер функции
1739
  * ebx = 5 - номер подфункции
1740
  * ecx = хэндл курсора
1741
Возвращаемое значение:
1742
  * eax = хэндл предыдущего установленного курсора
1743
Замечания:
1744
  * Если передан некорректный хэндл, то функция восстановит курсор
1745
    по умолчанию (стандартную стрелку). В частности, к восстановлению
1746
    курсора по умолчанию приводит передача ecx=0.
221 serge 1747
 
3539 clevermous 1748
------------------- Подфункция 6 - удалить курсор --------------------
1749
Параметры:
1750
  * eax = 37 - номер функции
1751
  * ebx = 6 - номер подфункции
1752
  * ecx = хэндл курсора
1753
Возвращаемое значение:
1754
  * eax разрушается
1755
Замечания:
1756
  * Курсор должен был быть ранее загружен текущим потоком
1757
    (вызовом подфункции 4). Функция не удаляет системные курсоры и
1758
    курсоры, загруженные другими приложениями.
1759
  * Если удаляется активный (установленный подфункцией 5) курсор, то
1760
    восстанавливается курсор по умолчанию (стандартная стрелка).
221 serge 1761
 
3539 clevermous 1762
------------------ Подфункция 7 - данные прокрутки -------------------
1763
Параметры:
1764
  * eax = 37 - номер функции
1765
  * ebx = 7 - номер подфункции
1766
Возвращаемое значение:
499 diamond 1767
  * eax = [horizontal offset]*65536 + [vertical offset]
3539 clevermous 1768
Замечания:
1769
  * Данные доступны только активному окну.
1770
  * После прочтения значения обнуляются.
1771
  * Данные имеют знаковые значения.
486 kastigar 1772
 
77 diamond 1773
======================================================================
3539 clevermous 1774
================== Функция 38 - нарисовать отрезок. ==================
77 diamond 1775
======================================================================
3539 clevermous 1776
Параметры:
1777
  * eax = 38 - номер функции
1778
  * ebx = [координата начала по оси x]*65536 +
1779
              [координата конца по оси x]
1780
  * ecx = [координата начала по оси y]*65536 +
1781
              [координата конца по оси y]
1782
  * edx = 0x00RRGGBB - цвет
1783
    edx = 0x01xxxxxx - рисовать инверсный отрезок
1784
          (младшие 24 бита игнорируются)
1785
Возвращаемое значение:
1786
  * функция не возвращает значения
1787
Замечания:
1788
  * Координаты берутся относительно окна.
1789
  * Конечная точка также рисуется.
77 diamond 1790
 
1791
======================================================================
3539 clevermous 1792
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
77 diamond 1793
======================================================================
3539 clevermous 1794
Параметры:
1795
  * eax = 39 - номер функции
1796
  * ebx = 1 - номер подфункции
1797
Возвращаемое значение:
1798
  * eax = [ширина]*65536 + [высота]
1799
Замечания:
3780 Serge 1800
  * Есть парная команда установки размеров фонового изображения -
3539 clevermous 1801
    подфункция 1 функции 15. После которой, разумеется, следует
1802
    заново определить само изображение.
77 diamond 1803
 
1804
======================================================================
3539 clevermous 1805
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
77 diamond 1806
======================================================================
3539 clevermous 1807
Параметры:
1808
  * eax = 39 - номер функции
1809
  * ebx = 2 - номер подфункции
1810
  * ecx = смещение
1811
Возвращаемое значение:
1812
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
1813
    (меньше 0x160000-16)
1814
  * eax = 2 - иначе
1815
Замечания:
1816
  * Не следует полагаться на возвращаемое значение в случае неверного
1817
    смещения, оно может измениться в следующих версиях ядра.
1818
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
3780 Serge 1819
  * Есть парная функция установки точки на фоновом изображении -
3539 clevermous 1820
    подфункция 2 функции 15.
77 diamond 1821
 
1822
======================================================================
3539 clevermous 1823
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
77 diamond 1824
======================================================================
3539 clevermous 1825
Параметры:
1826
  * eax = 39 - номер функции
1827
  * ebx = 4 - номер подфункции
1828
Возвращаемое значение:
1829
  * eax = 1 - замостить
1830
  * eax = 2 - растянуть
1831
Замечания:
3780 Serge 1832
  * Есть парная функция установки режима отрисовки фона -
3539 clevermous 1833
    подфункция 4 функции 15.
77 diamond 1834
 
1835
======================================================================
3539 clevermous 1836
======== Функция 40 - установить маску для ожидаемых событий. ========
77 diamond 1837
======================================================================
3539 clevermous 1838
Маска для ожидаемых событий влияет на функции работы с событиями 10,
1839
11, 23 - они сообщают только о событиях, разрешённых этой маской.
1840
Параметры:
1841
  * eax = 40 - номер функции
1842
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
1843
    (установленный бит разрешает извещение о событии)
3940 mario79 1844
    bit 31: фильтр активности событий мыши
1845
    bit 31 = 0 - неактивное окно всегда получает события от мыши
1846
    bit 31 = 1 - неактивное окно не получает события от мыши
1847
    bit 30: фильтр позиции курсора
1848
    bit 30 = 0 - окно принимает события мыши, если курсор
1849
                 за пределами окна
1850
    bit 30 = 1 - окно не принимает события мыши, если курсор
1851
                 за пределами окна
3539 clevermous 1852
Возвращаемое значение:
1853
  * eax = предыдущее значение маски
1854
Замечания:
1855
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
1856
    и нажатиях клавиш и кнопок.
1857
    Этого достаточно для большинства приложений.
1858
  * События, запрещённые в маске, всё равно сохраняются, если
1859
    приходят; о них просто не извещают функции работы с событиями.
1860
  * Функции работы с событиями учитывают маску на момент
1861
    вызова функции, а не на момент поступления сообщения.
77 diamond 1862
 
1863
 
1864
======================================================================
3539 clevermous 1865
=================== Функция 43 - ввод/вывод в порт. ==================
77 diamond 1866
======================================================================
1867
 
3539 clevermous 1868
------------------------ Вывод данных в порт -------------------------
1869
Параметры:
1870
  * eax = 43 - номер функции
1871
  * bl = байт для вывода
1872
  * ecx = номер порта 0xnnnn (от 0 до 0xFFFF)
1873
Возвращаемое значение:
1874
  * eax = 0 - успешно
1875
  * eax = 1 - поток не зарезервировал указанный порт
77 diamond 1876
 
3539 clevermous 1877
------------------------ Ввод данных из порта ------------------------
1878
Параметры:
1879
  * eax = 43 - номер функции
1880
  * ebx игнорируется
1881
  * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF)
1882
Возвращаемое значение:
1883
  * eax = 0 - успешно, при этом ebx = введённый байт
1884
  * eax = 1 - поток не зарезервировал данный порт
1885
Замечания:
1886
  * Предварительно поток должен зарезервировать за собой
1887
    указанный порт функцией 46.
1888
  * Для зарезервированных портов вместо вызова этих функций
1889
    лучше использовать команды процессора in/out - это значительно
1890
    быстрее и несколько короче и проще. Из незарезервированных
1891
    портов читать всё равно нельзя.
77 diamond 1892
 
1893
 
1894
======================================================================
3780 Serge 1895
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
77 diamond 1896
======================================================================
3539 clevermous 1897
К зарезервированным портам можно обращаться напрямую из приложения
1898
командами in/out (рекомендуемый способ) и вызовом функции 43
1899
(нерекомендуемый способ).
1900
Параметры:
1901
  * eax = 46 - номер функции
1902
  * ebx = 0 - зарезервировать, 1 - освободить
1903
  * ecx = номер начала диапазона портов
1904
  * edx = номер конца диапазона портов (включительно)
1905
Возвращаемое значение:
1906
  * eax = 0 - успешно
1907
  * eax = 1 - ошибка
1908
Замечания:
1909
  * В случае резервирования портов ошибкой считается выполнение
1910
    одного из условий:
1911
    * начальный адрес больше конечного;
1912
    * указанный диапазон содержит некорректный номер порта
1913
      (корректные - от 0 до 0xFFFF);
1914
    * превышено ограничение на общее число зарезервированных областей
1915
      - допускается максимум 255;
1916
    * указанный диапазон пересекается с одним из
1917
      ранее зарезервированных
1918
  * В случае освобождения портов ошибкой считается попытка
1919
    освобождения диапазона, который ранее не был целиком
1920
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
1921
  * При обнаружении ошибки (в обоих случаях) никаких действий
1922
    не производится.
1923
  * При загрузке система резервирует за собой порты
1924
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (включительно).
1925
  * При завершении потока автоматически освобождаются все
1926
    зарезервированные им порты.
77 diamond 1927
 
1928
======================================================================
3539 clevermous 1929
================= Функция 47 - вывести число в окно. =================
77 diamond 1930
======================================================================
3539 clevermous 1931
Параметры:
1932
  * eax = 47 - номер функции
1933
  * ebx = параметры преобразования числа в текст:
1934
    * bl = 0 - ecx содержит число
1935
    * bl = 1 - ecx содержит указатель на dword/qword-число
1936
    * bh = 0 - отображать в десятичной системе счисления
1937
    * bh = 1 - отображать в шестнадцатеричной системе
1938
    * bh = 2 - отображать в двоичной системе
1939
    * биты 16-21 = сколько цифр отображать
1940
    * биты 22-29 зарезервированы и должны быть установлены в 0
1941
    * бит 30 установлен = выводить qword (64-битное число);
1942
                              при этом должно быть bl = 1
1943
    * бит 31 установлен = не выводить ведущие нули числа
1944
  * ecx = число (при bl=0) или указатель (при bl=1)
1945
  * edx = [координата по оси x]*65536 + [координата по оси y]
142 diamond 1946
  * esi = 0xX0RRGGBB:
3539 clevermous 1947
    * RR, GG, BB задают цвет
1948
    * X = ABnn (биты)
1949
    * nn = шрифт (0/1)
1950
    * A игнорируется
1951
    * B=1 - закрашивать фон цветом edi
1952
Возвращаемое значение:
1953
  * функция не возвращает значения
1954
Замечания:
1955
  * Указанная длина не должна превосходить 60.
1956
  * Выводится ровно указанное количество цифр. Если число мало и
1957
    может быть записано меньшим количеством цифр, оно дополняется
1958
    ведущими нулями; если число велико и не может быть записано
1959
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
1960
  * Параметры шрифтов указаны в описании функции 4 (вывода текста).
77 diamond 1961
 
1962
======================================================================
3539 clevermous 1963
======= Функция 48, подфункция 0 - применить настройки экрана. =======
77 diamond 1964
======================================================================
3539 clevermous 1965
Параметры:
1966
  * eax = 48 - номер функции
1967
  * ebx = 0 - номер подфункции
1968
  * ecx = 0 - зарезервировано
1969
Возвращаемое значение:
1970
  * функция не возвращает значения
1971
Замечания:
1972
  * Функция перерисовывает экран после изменения параметров
1973
    подфункциями 1 и 2.
1974
  * Вызов функции без предшествующих вызовов указанных подфункций
1975
    игнорируется.
1976
  * Вызов функции с ненулевым ecx игнорируется.
77 diamond 1977
 
1978
======================================================================
3539 clevermous 1979
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
77 diamond 1980
======================================================================
3539 clevermous 1981
Параметры:
1982
  * eax = 48 - номер функции
1983
  * ebx = 1 - номер подфункции
1984
  * ecx = тип кнопок:
1985
    * 0 = плоские
1986
    * 1 = объёмные
1987
Возвращаемое значение:
1988
  * функция не возвращает значения
1989
Замечания:
3780 Serge 1990
  * После вызова описываемой функции следует перерисовать экран
3539 clevermous 1991
    подфункцией 0.
1992
  * Тип кнопок влияет только на их прорисовку функцией 8.
77 diamond 1993
 
1994
======================================================================
3539 clevermous 1995
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
77 diamond 1996
======================================================================
3539 clevermous 1997
Параметры:
1998
  * eax = 48 - номер функции
1999
  * ebx = 2 - номер подфункции
2000
  * ecx = указатель на таблицу цветов
2001
  * edx = размер таблицы цветов
2002
    (должен быть 40 байт для будущей совместимости)
2003
Формат таблицы цветов указан в описании подфункции 3.
2004
Возвращаемое значение:
2005
  * функция не возвращает значения
2006
Замечания:
3780 Serge 2007
  * После вызова описываемой функции следует перерисовать экран
3539 clevermous 2008
    подфункцией 0.
2009
  * Таблица стандартных цветов влияет только на приложения,
2010
    которые эту таблицу явным образом получают (подфункцией 3) и
2011
    используют (указывая цвета из неё при вызовах функций рисования).
2012
  * Таблица стандартных цветов входит в скин и устанавливается заново
2013
    при установке скина (подфункции 8).
2014
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
2015
    приложения desktop.
77 diamond 2016
 
2017
======================================================================
3539 clevermous 2018
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
77 diamond 2019
======================================================================
3539 clevermous 2020
Параметры:
2021
  * eax = 48 - номер функции
2022
  * ebx = 3 - номер подфункции
2023
  * ecx = указатель на буфер размером edx байт,
2024
    куда будет записана таблица
2025
  * edx = размер таблицы цветов
2026
    (должен быть 40 байт для будущей совместимости)
2027
Возвращаемое значение:
2028
  * функция не возвращает значения
2029
Формат таблицы цветов: каждый элемент -
2030
dword-значение цвета 0x00RRGGBB
2031
  * +0: dword: frames - цвет рамки
2032
  * +4: dword: grab - цвет заголовка
2033
  * +8: dword: grab_button - цвет кнопки на полосе заголовка
2034
  * +12 = +0xC: dword: grab_button_text - цвет текста на кнопке
2035
    на полосе заголовка
2036
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
2037
  * +20 = +0x14: dword: work - цвет рабочей области
2038
  * +24 = +0x18: dword: work_button - цвет кнопки в рабочей области
2039
  * +28 = +0x1C: dword: work_button_text - цвет текста на кнопке
2040
    в рабочей области
2041
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
2042
  * +36 = +0x24: dword: work_graph - цвет графики в рабочей области
2043
Замечания:
2044
  * Структура таблицы цветов описана в стандартном включаемом файле
2045
    macros.inc под названием system_colors; например, можно писать:
2046
    	sc	system_colors		; объявление переменной
2047
    	...				; где-то надо вызвать
2048
    					; описываемую функцию с ecx=sc
2049
    	mov	ecx, [sc.work_button_text]	; читаем цвет текста
2050
    					; на кнопке в рабочей области
2051
  * Использование/неиспользование этих цветов - дело исключительно
2052
    самой программы. Для использования нужно просто при вызове функций
2053
    рисования указывать цвет, взятый из этой таблицы.
2054
  * При изменении таблицы стандартных цветов (подфункцией 2 с
2055
    последующим применением изменений подфункцией 0 или
2056
    при установке скина подфункцией 8) всем окнам посылается сообщение
2057
    о необходимости перерисовки (событие с кодом 1).
2058
  * Стандартные цвета можно просматривать/изменять интерактивно
2059
    с помощью приложения desktop.
77 diamond 2060
 
2061
======================================================================
3539 clevermous 2062
========== Функция 48, подфункция 4 - получить высоту скина. =========
77 diamond 2063
======================================================================
3539 clevermous 2064
Параметры:
2065
  * eax = 48 - номер функции
2066
  * ebx = 4 - номер подфункции
2067
Возвращаемое значение:
2068
  * eax = высота скина
2069
Замечания:
2070
  * Высотой скина по определению считается высота заголовка окон,
2071
    использующих скин.
2072
  * Смотри также общую структуру окна в описании функции 0.
77 diamond 2073
 
2074
======================================================================
3539 clevermous 2075
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
77 diamond 2076
======================================================================
3539 clevermous 2077
Параметры:
2078
  * eax = 48 - номер функции
2079
  * ebx = 5 - номер подфункции
2080
Возвращаемое значение:
77 diamond 2081
  * eax = [left]*65536 + [right]
2082
  * ebx = [top]*65536 + [bottom]
3539 clevermous 2083
Замечания:
2084
  * Рабочая область экрана определяет положение и координаты
2085
    максимизированного окна.
2086
  * Рабочая область экрана при нормальной работе есть весь экран
5452 leency 2087
    за вычетом панели (@taskbar).
3539 clevermous 2088
  * (left,top) - координаты левого верхнего угла,
2089
    (right,bottom) - координаты правого нижнего.
2090
    Таким образом, размер рабочей области по оси x определяется
2091
    формулой right-left+1, по оси y - формулой bottom-right+1.
2092
  * Смотри также функцию 14,
2093
    позволяющую определить размеры всего экрана.
2094
  * Есть парная функция установки рабочей области - подфункция 6.
77 diamond 2095
 
2096
======================================================================
3539 clevermous 2097
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
77 diamond 2098
======================================================================
3539 clevermous 2099
Параметры:
2100
  * eax = 48 - номер функции
2101
  * ebx = 6 - номер подфункции
77 diamond 2102
  * ecx = [left]*65536 + [right]
2103
  * edx = [top]*65536 + [bottom]
3539 clevermous 2104
Возвращаемое значение:
2105
  * функция не возвращает значения
2106
Замечания:
2107
  * Рабочая область экрана определяет положение и координаты
2108
    максимизированного окна.
5452 leency 2109
  * Эта функция используется только приложением @taskbar,
3539 clevermous 2110
    устанавливающим рабочей областью весь экран за вычетом панели.
2111
  * (left,top) - координаты левого верхнего угла,
2112
    (right,bottom) - координаты правого нижнего.
2113
    Таким образом, размер рабочей области по оси x определяется
2114
    формулой right-left+1, по оси y - формулой bottom-right+1.
2115
  * Если left>=right, то x-координаты рабочей области не изменяются.
2116
    Если left<0, то left не устанавливается. Если right больше
2117
    или равно ширины экрана, то right не устанавливается.
2118
    Аналогично по оси y.
2119
  * Смотри также функцию 14,
2120
    позволяющую определить размеры всего экрана.
3780 Serge 2121
  * Есть парная функция получения рабочей области -
3539 clevermous 2122
    подфункция 5.
2123
  * Эта функция автоматически перерисовывает экран, по ходу дела
2124
    обновляет координаты и размеры максимизированных окон.
2125
    Все окна извещаются о необходимости перерисовки (событие 1).
77 diamond 2126
 
2127
======================================================================
3539 clevermous 2128
====================== Функция 48, подфункция 7 ======================
2129
============ Получить область скина для текста заголовка. ============
77 diamond 2130
======================================================================
3539 clevermous 2131
Возвращает область заголовка окна со скином, предназначенную
2132
для вывода текста заголовка.
2133
Параметры:
2134
  * eax = 48 - номер функции
2135
  * ebx = 7 - номер подфункции
2136
Возвращаемое значение:
77 diamond 2137
  * eax = [left]*65536 + [right]
2138
  * ebx = [top]*65536 + [bottom]
3539 clevermous 2139
Замечания:
2140
  * Использование/неиспользование этой функции -
2141
    личное дело приложения.
2142
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2143
    при выборе места для рисования текста заголовка (функцией 4) или
2144
    какого-нибудь заменителя текста заголовка
2145
    (по усмотрению приложения).
77 diamond 2146
 
2147
======================================================================
3539 clevermous 2148
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
77 diamond 2149
======================================================================
3539 clevermous 2150
Параметры:
2151
  * eax = 48 - номер функции
2152
  * ebx = 8 - номер подфункции
2153
  * ecx = указатель на имя файла скина
2154
Возвращаемое значение:
2155
  * eax = 0 - успешно
2156
  * eax = 1 - не удалось загрузить файл
2157
  * eax = 2 - файл не является файлом скина
2158
Замечания:
2159
  * При успешной загрузке скина все окна извещаются о необходимости
2160
    перерисовки (событие 1).
2161
  * При загрузке система считывает скин из файла default.skn
2162
    на рамдиске.
2163
  * Пользователь может изменять скин статически, создав свой
2164
    default.skn, или динамически с помощью приложения desktop.
77 diamond 2165
 
2166
======================================================================
5848 pathoswith 2167
= Функция 48, подфункция 9 - получить настройку сглаживания шрифтов. =
5682 leency 2168
======================================================================
2169
Параметры:
2170
  * eax = 48 - номер функции
2171
  * ebx = 9 - номер подфункции
5848 pathoswith 2172
Возвращаемое значение:
2173
  * eax = 2 - субпиксельное, 1 - обычное, 0 - выключить
5682 leency 2174
 
2175
======================================================================
5848 pathoswith 2176
===== Функция 48, подфункция 10 - настроить сглаживание шрифтов. =====
2177
======================================================================
2178
Параметры:
2179
  * eax = 48 - номер функции
2180
  * ebx = 10 - номер подфункции
2181
  * cl  = 2 - субпиксельное, 1 - обычное, 0 - выключить
2182
 
2183
======================================================================
5867 pathoswith 2184
======== Функция 48, подфункция 11 - получить размер шрифтов. ========
2185
======================================================================
2186
Параметры:
2187
  * eax = 48 - номер функции
2188
  * ebx = 9 - номер подфункции
2189
Возвращаемое значение:
2190
  * eax = текущая высота шрифта в пикселях
2191
 
2192
======================================================================
2193
======= Функция 48, подфункция 12 - установить размер шрифтов. =======
2194
======================================================================
2195
Параметры:
2196
  * eax = 48 - номер функции
2197
  * ebx = 10 - номер подфункции
2198
  * cl  = новая высота шрифта в пикселях
2199
 
2200
======================================================================
3539 clevermous 2201
============ Функция 49 - Advanced Power Management (APM). ===========
78 diamond 2202
======================================================================
3539 clevermous 2203
Параметры:
2204
  * eax = 49 - номер функции
2205
  * dx = номер функции APM (аналог ax в спецификации)
2206
  * bx, cx = параметры функции APM
2207
Возвращаемое значение:
2208
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2209
    установлены в соответствии со спецификацией APM
2210
  * старшие половины 32-битных регистров eax, ebx, ecx,
2211
    edx, esi, edi разрушаются
2212
Замечания:
2213
  * Спецификация APM 1.2 описывается в документе
78 diamond 2214
    "Advanced Power Management (APM) BIOS Specification"
3539 clevermous 2215
    (Revision 1.2), доступном на
78 diamond 2216
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
3539 clevermous 2217
    кроме того, она включена в известный Interrupt List by Ralf Brown
78 diamond 2218
    (http://www.pobox.com/~ralf/files.html,
2219
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2220
 
2221
======================================================================
3539 clevermous 2222
================= Функция 50 - установка формы окна. =================
77 diamond 2223
======================================================================
3539 clevermous 2224
Обычные окна представляют собой прямоугольники. С помощью этой функции
2225
окну можно придать произвольную форму. Форма задаётся набором точек
2226
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2227
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2228
функцией 67.
77 diamond 2229
 
3539 clevermous 2230
--------------- Установка данных с информацией о форме ---------------
2231
Параметры:
2232
  * eax = 50 - номер функции
2233
  * ebx = 0 - номер подфункции
2234
  * ecx = указатель на данные формы (массив байт 0/1)
2235
Возвращаемое значение:
2236
  * функция не возвращает значения
77 diamond 2237
 
3539 clevermous 2238
------------------ Установка масштаба данных формы -------------------
2239
Параметры:
2240
  * eax = 50 - номер функции
2241
  * ebx = 1 - номер подфункции
2242
  * ecx задаёт масштаб: каждый байт данных определяет
2243
    (2^scale)*(2^scale) пикселей
2244
Возвращаемое значение:
2245
  * функция не возвращает значения
2246
Замечания:
2247
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2248
    данных формы один байт соответствует одному пикселю, то масштаб
2249
    можно не устанавливать.
2250
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2251
    обратите внимание, что они на единицу больше, чем устанавливаемые
2252
    функциями 0, 67.
2253
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2254
  * Байт данных по смещению a должен быть 0/1 и
2255
    определяет принадлежность окну квадрата со стороной 2^scale
2256
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
77 diamond 2257
    (a mod (xsize shr scale), a div (xsize shr scale))
3539 clevermous 2258
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2259
  * Данные должны присутствовать в памяти и не меняться
2260
    после установки формы.
2261
  * Система просматривает данные о форме при каждой перерисовке окна
2262
    функцией 0.
2263
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2264
    к прямоугольной форме.
77 diamond 2265
 
2266
======================================================================
3539 clevermous 2267
===================== Функция 51 - создать поток. ====================
77 diamond 2268
======================================================================
3539 clevermous 2269
Параметры:
2270
  * eax = 51 - номер функции
2271
  * ebx = 1 - единственная подфункция
2272
  * ecx = адрес точки входа потока (начальный eip)
2273
  * edx = указатель стэка потока (начальный esp)
2274
Возвращаемое значение:
2275
  * eax = -1 - ошибка (в системе слишком много потоков)
2276
  * иначе eax = TID - идентификатор потока
77 diamond 2277
 
2278
======================================================================
4199 mario79 2279
====================== Функция 54, подфункция 0 ======================
2280
============== Узнать количество слотов в буфере обмена. =============
2281
======================================================================
2282
Параметры:
2283
  * eax = 54 - номер функции
2284
  * ebx = 0 - номер подфункции
2285
Возвращаемое значение:
2286
  * eax = количество слотов в буфере
2287
  * eax = -1 - отсутствует область главного списка
2288
 
2289
======================================================================
2290
====================== Функция 54, подфункция 1 ======================
2291
================== Считать данные из буфера обмена. ==================
2292
======================================================================
2293
Параметры:
2294
  * eax = 54 - номер функции
2295
  * ebx = 1 - номер подфункции
2296
  * eсx = номер слота
2297
Возвращаемое значение:
2298
  * eax = если успешно - указатель на область памяти с данными
2299
  * eax = 1 - ошибка
2300
  * eax = -1 - отсутствует область главного списка
2301
 
2302
======================================================================
2303
====================== Функция 54, подфункция 2 ======================
2304
================== Записать данные в буфер обмена. ===================
2305
======================================================================
2306
Параметры:
2307
  * eax = 54 - номер функции
2308
  * ebx = 2 - номер подфункции
2309
  * eсx = количество копируемых байт
2310
  * edx = указатель на буфер под копируемые данные
2311
Возвращаемое значение:
2312
  * eax = 0 - успешно
2313
  * eax = 1 - ошибка
2314
  * eax = -1 - отсутствует область главного списка
2315
 
2316
======================================================================
2317
====================== Функция 54, подфункция 3 ======================
2318
========= Удалить последний слот с данными в буфере обмена ===========
2319
======================================================================
2320
Параметры:
2321
  * eax = 54 - номер функции
2322
  * ebx = 3 - номер подфункции
2323
Возвращаемое значение:
2324
  * eax = 0 - успешно
2325
  * eax = 1 - ошибка
2326
  * eax = -1 - отсутствует область главного списка
2327
 
2328
======================================================================
2329
====================== Функция 54, подфункция 4 ======================
2330
=================== Аварийный сброс блокировки буфера ================
2331
======================================================================
2332
Параметры:
2333
  * eax = 54 - номер функции
2334
  * ebx = 4 - номер подфункции
2335
Возвращаемое значение:
2336
  * eax = 0 - успешно
2337
  * eax = -1 - отсутствует область главного списка или нет блокировки
2338
Замечания:
2339
  * Используется в исключительных случаях, когда зависшее или убитое
2340
    приложение заблокировало работу с буфером обмена.
2341
 
2342
======================================================================
3539 clevermous 2343
====================== Функция 55, подфункция 55 =====================
2344
========== Начать проигрывать данные на встроенном спикере. ==========
77 diamond 2345
======================================================================
3539 clevermous 2346
Параметры:
2347
  * eax = 55 - номер функции
2348
  * ebx = 55 - номер подфункции
2349
  * esi = указатель на данные
2350
Возвращаемое значение:
2351
  * eax = 0 - успешно
2352
  * eax = 55 - ошибка (спикер отключён или занят)
2353
Данные - это массив элементов переменной длины.
2354
Формат каждого элемента определяется первым байтом:
2355
  * 0 = конец данных
2356
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2357
    ноты, определяемой непосредственным значением частоты
2358
    * следующее слово (2 байта) содержит делитель частоты;
2359
      частота определяется как 1193180/divider
77 diamond 2360
  * 0x81 = invalid
3539 clevermous 2361
  * 0x82..0xFF = нота, определяемая октавой и номером:
2362
    * длительность в сотых долях секунды = (первый байт)-0x81
2363
    * присутствует ещё один байт;
2364
    * (второй байт)=0xFF - пауза
2365
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2366
      до 12, a=номер октавы (считая с 0)
2367
Замечания:
2368
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2369
    функции 18.
2370
  * Функция возвращает управление, сообщив куда следует информацию
2371
    о запросе. Само проигрывание идёт независимо от программы.
2372
  * Данные должны сохраняться в памяти по крайней мере
2373
    до конца проигрывания.
77 diamond 2374
 
2375
======================================================================
3539 clevermous 2376
======================= Функция 57 - PCI BIOS. =======================
586 serge 2377
======================================================================
3539 clevermous 2378
Параметры:
2379
  * eax = 57 - номер функции
2380
  * ebp соответствует регистру al в спецификации PCI BIOS
2381
  * остальные регистры - по спецификации PCI BIOS
2382
Возвращаемое значение:
2383
  * CF не определён
2384
  * остальные регистры - по спецификации PCI BIOS
2385
Замечания:
2386
  * Многих результатов этой функции можно также добиться вызовом
2387
    соответствующих подфункций функции 62.
2388
  * Функция вызывает расширение PCI32 BIOS, документированное,
2389
    например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
2390
  * Если BIOS не поддерживает это расширение, поведение функции
2391
    эмулируется (через аналоги подфункций функции 62 режима ядра).
586 serge 2392
 
2393
======================================================================
3539 clevermous 2394
=========== Функция 60 - Inter Process Communication (IPC). ==========
77 diamond 2395
======================================================================
3539 clevermous 2396
IPC применяется для посылок сообщений от одного процесса/потока
2397
другому. При этом следует предварительно договориться о том, как
2398
интерпретировать конкретное сообщение.
77 diamond 2399
 
3539 clevermous 2400
-------- Подфункция 1 - установить область для получения IPC ---------
2401
Вызывается процессом-приёмником.
2402
Параметры:
2403
  * eax = 60 - номер функции
2404
  * ebx = 1 - номер подфункции
2405
  * ecx = указатель на буфер
2406
  * edx = размер буфера
2407
Возвращаемое значение:
2408
  * eax = 0 - всегда успешно
2409
Формат IPC-буфера:
2410
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
2411
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
2412
    и вам надо, чтобы извне не изменялись данные буфера
2413
    (не поступали новые сообщения)
2414
  * +4: dword: занято места в буфере (в байтах)
2415
  * +8: первое сообщение
2416
  * +8+n: второе сообщение
77 diamond 2417
  * ...
3539 clevermous 2418
Формат сообщения:
2419
  * +0: dword: PID процесса/потока, пославшего сообщение
2420
  * +4: dword: длина сообщения (не считая этот заголовок)
2421
  * +8: n*byte: данные сообщения
77 diamond 2422
 
3539 clevermous 2423
--------------- Подфункция 2 - послать сообщение IPC. ----------------
2424
Вызывается процессом-инициатором.
2425
Параметры:
2426
  * eax = 60 - номер функции
2427
  * ebx = 2 - номер подфункции
2428
  * ecx = PID приёмника
2429
  * edx = указатель на данные сообщения
2430
  * esi = длина сообщения (в байтах)
2431
Возвращаемое значение:
2432
  * eax = 0 - успешно
2433
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
2434
    (может быть, ещё не успел, а может быть, это не тот поток,
2435
    который нужен)
2436
  * eax = 2 - приёмник заблокировал IPC-буфер;
2437
    попробуйте немного подождать
2438
  * eax = 3 - переполнение IPC-буфера приёмника
2439
  * eax = 4 - процесса/потока с таким PID не существует
2440
Замечания:
2441
  * Система сразу после записи IPC-сообщения в буфер посылает
2442
    потоку-приёмнику событие с кодом 7 (см. коды событий).
77 diamond 2443
 
2444
======================================================================
3539 clevermous 2445
=== Функция 61 - получить параметры для прямого доступа к графике. ===
77 diamond 2446
======================================================================
3539 clevermous 2447
Программе доступны данные графического экрана (область памяти, которая
2448
собственно и отображает содержимое экрана) напрямую без вызовов
2449
системных функций через селектор gs:
1662 Nasarus 2450
	mov	eax, [gs:0]
3539 clevermous 2451
поместит в eax первый dword буфера, содержащий информацию о цвете
2452
левой верхней точки (и, возможно, цвета нескольких следующих).
1662 Nasarus 2453
	mov	[gs:0], eax
3539 clevermous 2454
при работе в режимах VESA c LFB
2455
установит цвет левой верхней точки
2456
(и возможно, цвета нескольких следующих).
2457
Для интерпретации данных графического экрана требуется знание
2458
некоторых параметров, которые возвращаются этой функцией.
2459
Замечания:
2460
  * Параметры графики очень редко меняются при работе системы,
2461
    а именно, только в случаях, когда пользователь работает
2462
    с программой VRR.
2463
  * При изменении видеорежима система перерисовывает все окна
2464
    (событие с кодом 1) и перерисовывает фон (событие 5).
2465
    Эти же события происходят и в других случаях,
2466
    которые встречаются значительно чаще, чем изменение видеорежима.
2467
  * При работе в видеорежимах с LFB селектор gs указывает на
2468
    собственно LFB, так что чтение/запись по gs приводят
2469
    непосредственно к изменению содержимого экрана. При работе в
2470
    видеорежимах без LFB gs указывает на некоторую область данных
2471
    ядра, причём все функции вывода на экран добросовестно выполняют
2472
    двойную работу по записи непосредственно на экран и по записи
2473
    в этот буфер. В результате при чтении содержимого этого буфера
2474
    результаты соответствуют содержимому экрана
2475
    (с, вообще говоря, большим цветовым разрешением),
2476
    а запись игнорируется.
2477
    Исключением является режим 320*200, для которого в главном цикле
2478
    системного потока выполняется обновление экрана в соответствии
2479
    с движениями курсора мыши.
77 diamond 2480
 
3539 clevermous 2481
------------------------- Разрешение экрана --------------------------
2482
Параметры:
2483
  * eax = 61 - номер функции
2484
  * ebx = 1 - номер подфункции
2485
Возвращаемое значение:
2486
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
2487
Замечания:
2488
  * Можно использовать функцию 14 с учётом того, что она возвращает
2489
    размеры на 1 меньше. Это полностью эквивалентный способ.
77 diamond 2490
 
3539 clevermous 2491
------------------------ Число бит на пиксель ------------------------
2492
Параметры:
2493
  * eax = 61 - номер функции
2494
  * ebx = 2 - номер подфункции
2495
Возвращаемое значение:
2496
  * eax = число бит на пиксель (24 или 32)
77 diamond 2497
 
3539 clevermous 2498
------------------------ Число байт на строку ------------------------
2499
Параметры:
2500
  * eax = 61 - номер функции
2501
  * ebx = 3 - номер подфункции
2502
Возвращаемое значение:
2503
  * eax = число байт, которое занимает одна строка развёртки
2504
    (горизонтальная линия на экране)
77 diamond 2505
 
2506
======================================================================
3539 clevermous 2507
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
77 diamond 2508
======================================================================
3539 clevermous 2509
Параметры:
2510
  * eax = 62 - номер функции
2511
  * bl = 0 - номер подфункции
2512
Возвращаемое значение:
2513
  * eax = -1 - доступ к PCI запрещён; иначе
2514
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
2515
  * старшее слово eax обнулено
2516
Замечания:
2517
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2518
    для приложений подфункцией 12 функции 21.
2519
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
77 diamond 2520
 
2521
======================================================================
3539 clevermous 2522
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
77 diamond 2523
======================================================================
3539 clevermous 2524
Параметры:
2525
  * eax = 62 - номер функции
2526
  * bl = 1 - номер подфункции
2527
Возвращаемое значение:
2528
  * eax = -1 - доступ к PCI запрещён; иначе
2529
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
2530
Замечания:
2531
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2532
    для приложений подфункцией 12 функции 21.
2533
  * Если PCI BIOS не поддерживается, то значение al неопределено.
77 diamond 2534
 
2535
======================================================================
3539 clevermous 2536
====================== Функция 62, подфункция 2 ======================
2537
== Получить механизм обращения к конфигурационному пространству PCI. =
77 diamond 2538
======================================================================
3539 clevermous 2539
Параметры:
2540
  * eax = 62 - номер функции
2541
  * bl = 2 - номер подфункции
2542
Возвращаемое значение:
2543
  * eax = -1 - доступ к PCI запрещён; иначе
2544
  * al = механизм (1 или 2); прочие байты eax разрушаются
2545
Замечания:
2546
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2547
    для приложений подфункцией 12 функции 21.
2548
  * Механизм обращения выбирается в соответствии
2549
    с характеристиками оборудования.
2550
  * Подфункции чтения и записи автоматически работают
2551
    с выбранным механизмом.
77 diamond 2552
 
2553
======================================================================
3539 clevermous 2554
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
77 diamond 2555
======================================================================
3539 clevermous 2556
Параметры:
2557
  * eax = 62 - номер функции
2558
  * bl = 4 - читать байт
2559
  * bl = 5 - читать слово
2560
  * bl = 6 - читать двойное слово
2561
  * bh = номер PCI-шины
2562
  * ch = dddddfff, где ddddd = номер устройства на шине,
2563
    fff = номер функции устройства
2564
  * cl = номер регистра (должен быть чётным для bl=5,
2565
    делиться на 4 для bl=6)
2566
Возвращаемое значение:
2567
  * eax = -1 - ошибка (запрещён доступ к PCI или
2568
    неподдерживаемые параметры); иначе
2569
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
2570
    оставшаяся часть регистра eax разрушается
2571
Замечания:
2572
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2573
    для приложений подфункцией 12 функции 21.
2574
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2575
    игнорирует номер функции. Получить механизм доступа можно вызовом
2576
    подфункции 2.
2577
  * Некоторые регистры стандартны и существуют для всех устройств,
2578
    некоторые определяются конкретным устройством. Список первых
2579
    входит, например, в известный Interrupt List by Ralf Brown
77 diamond 2580
    (http://www.pobox.com/~ralf/files.html,
2581
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
3539 clevermous 2582
    список вторых должен быть указан в документации по устройству.
77 diamond 2583
 
2584
======================================================================
3539 clevermous 2585
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
77 diamond 2586
======================================================================
3539 clevermous 2587
Параметры:
2588
  * eax = 62 - номер функции
2589
  * bl = 8 - писать байт
2590
  * bl = 9 - писать слово
2591
  * bl = 10 - писать двойное слово
2592
  * bh = номер PCI-шины
2593
  * ch = dddddfff, где ddddd = номер устройства на шине,
2594
    fff = номер функции устройства
2595
  * cl = номер регистра (должен быть чётным для bl=9,
2596
    делиться на 4 для bl=10)
2597
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
2598
    данные для записи
2599
Возвращаемое значение:
2600
  * eax = -1 - ошибка (запрещён доступ к PCI или
2601
    неподдерживаемые параметры)
2602
  * eax = 0 - успешно
2603
Замечания:
2604
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2605
    для приложений подфункцией 12 функции 21.
2606
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2607
    игнорирует номер функции. Получить механизм доступа можно вызовом
2608
    подфункции 2.
2609
  * Некоторые регистры стандартны и существуют для всех устройств,
2610
    некоторые определяются конкретным устройством. Список первых
2611
    входит, например, в известный Interrupt List by Ralf Brown;
2612
    список вторых должен быть указан в документации по устройству.
77 diamond 2613
 
2614
======================================================================
3539 clevermous 2615
================ Функция 63 - работа с доской отладки. ===============
77 diamond 2616
======================================================================
3539 clevermous 2617
Доска отладки представляет собой системный буфер (на 4096 байт),
2618
в который любая программа может записать (вообще говоря, произвольные)
2619
данные и из которого другая программа может эти данные прочитать.
2620
Есть соглашение, в соответствии с которым записываемые данные -
2621
текстовые строки, интерпретируемые как отладочные сообщения о ходе
2622
выполнения программы. Ядро в определённых ситуациях также записывает
2623
на доску отладки сведения о выполнении некоторых функций;
2624
по соглашению сообщения ядра начинаются с префикса "K : ".
2625
Для просмотра доски отладки создано приложение board,
2626
которое считывает данные из буфера и отображает их в своём окне. board
2627
понимает последовательность кодов 13,10 как переход на новую строку.
2628
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
2629
В связи с появлением отладчика ценность доски отладки несколько
2630
снизилась, поскольку отладчик позволяет полностью контролировать ход
2631
выполнения программы, причём для этого не требуется никаких усилий
2632
со стороны самой программы. Тем не менее во многих случаях
2633
доска отладки продолжает оставаться полезной.
77 diamond 2634
 
3539 clevermous 2635
---------------------------- Запись байта ----------------------------
2636
Параметры:
2637
  * eax = 63 - номер функции
2638
  * ebx = 1 - номер подфункции
2639
  * cl = байт данных
2640
Возвращаемое значение:
2641
  * функция не возвращает значения
2642
Замечания:
2643
  * Байт записывается в буфер. Длина буфера - 512 байт.
2644
    При переполнении буфера все полученные данные теряются
2645
    и заполнение начинается снова с нуля.
2646
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
2647
    достаточно этой функции, вызываемой в цикле. Можно не писать
2648
    вручную соответствующий код, а воспользоваться файлом debug.inc,
2649
    входящим в дистрибутив.
77 diamond 2650
 
3539 clevermous 2651
---------------------------- Чтение байта ----------------------------
2652
Забирает байт из буфера.
2653
Параметры:
2654
  * eax = 63 - номер функции
2655
  * ebx = 2 - номер подфункции
2656
Возвращаемое значение:
2657
  * eax = ebx = 0 - буфер пуст
2658
  * eax = байт, ebx = 1 - байт успешно прочитан
77 diamond 2659
 
2660
======================================================================
3539 clevermous 2661
========== Функция 64 - перераспределить память приложения. ==========
77 diamond 2662
======================================================================
3539 clevermous 2663
Параметры:
2664
  * eax = 64 - номер функции
2665
  * ebx = 1 - единственная подфункция
2666
  * ecx = новый размер памяти
2667
Возвращаемое значение:
2668
  * eax = 0 - успешно
2669
  * eax = 1 - недостаточно памяти
2670
Замечания:
2671
  * Есть другой способ выделения/освобождения динамической памяти -
2672
    подфункции 11, 12, 13 функции 68.
2673
  * Функция не может использоваться совместно с 68.11, 68.12, 68.13.
2674
    Вызов функции будет игнорироваться, если приложение создаст
2675
    локальную кучу вызовом 68.11.
77 diamond 2676
 
2677
======================================================================
3539 clevermous 2678
========= Функция 65 - вывести изображение с палитрой в окно. ========
283 diamond 2679
======================================================================
3539 clevermous 2680
Параметры:
2681
  * eax = 65 - номер функции
2682
  * ebx = указатель на изображение
2683
  * ecx = [размер по оси x]*65536 + [размер по оси y]
2684
  * edx = [координата по оси x]*65536 + [координата по оси y]
2685
  * esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
2686
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
2687
          игнорируется при esi > 8
2688
  * ebp = смещение данных каждой следующей строки изображения
2689
          относительно предыдущей
2690
Возвращаемое значение:
2691
  * функция не возвращает значения
2692
Замечания:
2693
  * Координаты изображения - это координаты верхнего левого угла
2694
    изображения относительно окна.
2695
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
2696
    за исключением, быть может, последних байтов строк, содержит
2697
    информацию о цвете 8 пикселей, старший бит соответствует первому
2698
    пикселю.
2699
  * Формат изображения с 2 битами на пиксель: каждый байт изображения,
2700
    за исключением, быть может, последних байтов строк, содержит
2701
    информацию о цвете 4 пикселей, старшие два бита соответствуют
2702
    первому пикселю.
2703
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
2704
    за исключением последних байтов строк (если ширина изображения
2705
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
2706
    соответствует первому пикселю.
2707
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
2708
    рассматривается как индекс в палитре.
2709
  * Формат изображения с 9 битами на пиксель: каждый байт изображения
2710
    (8 бит) обозначает интенсивность серого для одного пикселя, т.о.
2711
    этот тип изображения идентичен 8 бит на пиксель без палитры.
2712
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
2713
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
2714
    по 5 пикселей на каждый цвет.
2715
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
2716
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
2717
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
2718
    кодируется тремя байтами - последовательно синяя, зелёная, красная
2719
    составляющие цвета.
2720
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
2721
    есть ещё игнорируемый четвёртый байт.
2722
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
314 diamond 2723
    esi=24, ebp=0.
283 diamond 2724
 
2725
======================================================================
3539 clevermous 2726
================= Функция 66 - работа с клавиатурой. =================
77 diamond 2727
======================================================================
3539 clevermous 2728
Режим ввода влияет на результаты чтения клавиш функцией 2.
2729
При загрузке программы для неё устанавливается ASCII-режим ввода.
77 diamond 2730
 
3539 clevermous 2731
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
2732
Параметры:
2733
  * eax = 66 - номер функции
2734
  * ebx = 1 - номер подфункции
2735
  * ecx = режим:
2736
    * 0 = обычный (ASCII-символы)
2737
    * 1 = сканкоды
2738
Возвращаемое значение:
2739
  * функция не возвращает значения
77 diamond 2740
 
3539 clevermous 2741
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
2742
Параметры:
2743
  * eax = 66 - номер функции
2744
  * ebx = 2 - номер подфункции
2745
Возвращаемое значение:
2746
  * eax = текущий режим
77 diamond 2747
 
3539 clevermous 2748
------- Подфункция 3 - получить состояние управляющих клавиш. --------
2749
Параметры:
2750
  * eax = 66 - номер функции
2751
  * ebx = 3 - номер подфункции
2752
Возвращаемое значение:
2753
  * eax = битовая маска:
2754
  * бит 0  (маска 1): левый Shift нажат
2755
  * бит 1  (маска 2): правый Shift нажат
2756
  * бит 2  (маска 4): левый Ctrl нажат
2757
  * бит 3  (маска 8): правый Ctrl нажат
2758
  * бит 4  (маска 0x10): левый Alt нажат
2759
  * бит 5  (маска 0x20): правый Alt нажат
2760
  * бит 6  (маска 0x40): CapsLock включён
2761
  * бит 7  (маска 0x80): NumLock включён
2762
  * бит 8  (маска 0x100): ScrollLock включён
2763
  * бит 9  (маска 0x200): левый Win нажат
2764
  * бит 10 (маска 0x400): правый Win нажат
2765
  * прочие биты сброшены
77 diamond 2766
 
3539 clevermous 2767
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
2768
О нажатии "горячей клавиши" извещаются только приложения,
2769
установившие её; активное приложение (к которому поступает
2770
весь нормальный ввод) таких клавиш не получает.
2771
Извещение заключается в посылке события с кодом 2.
2772
Прочитать "горячую клавишу" можно так же, как и обычную, -
2773
функцией 2.
2774
Параметры:
2775
  * eax = 66 - номер функции
2776
  * ebx = 4 - номер подфункции
2777
  * cl задаёт сканкод клавиши;
2778
    используйте cl=0 для задания комбинаций типа Ctrl+Shift
2779
  * edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
2780
    * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
2781
      * 0 = ни одна из клавиш не должна быть нажата;
2782
      * 1 = ровно одна из клавиш должна быть нажата;
2783
      * 2 = обе клавиши должны быть нажаты;
2784
      * 3 = должна быть нажата LShift, но не RShift;
2785
      * 4 = должна быть нажата RShift, но не LShift
2786
    * Y - аналогично для LCtrl и RCtrl;
2787
    * X - аналогично для LAlt и RAlt
2788
Возвращаемое значение:
2789
  * eax=0 - успешно
2790
  * eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
2791
Замечания:
2792
  * Горячая клавиша может срабатывать либо при нажатии,
2793
    либо при отпускании. Сканкод отпускания клавиши на 128 больше,
2794
    чем сканкод нажатия (т.е. установлен старший бит).
2795
  * Несколько приложений могут установить одну и ту же комбинацию;
2796
    о нажатии такой комбинации будут извещаться все такие приложения.
92 diamond 2797
 
3539 clevermous 2798
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
2799
Параметры:
2800
  * eax = 66 - номер функции
2801
  * ebx = 5 - номер подфункции
2802
  * cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
2803
Возвращаемое значение:
2804
  * eax = 0 - успешно
2805
  * eax = 1 - нет такой горячей клавиши
2806
Замечания:
2807
  * При завершении процесса/потока удаляются все установленные им
2808
    горячие клавиши.
2809
  * Вызов функции не влияет на другие приложения.
2810
    Если другое приложение определило эту же комбинацию,
2811
    оно по-прежнему будет получать уведомления.
92 diamond 2812
 
3539 clevermous 2813
------------- Подфункция 6 - заблокировать обычный ввод. -------------
2814
Параметры:
2815
  * eax = 66 - номер функции
2816
  * ebx = 6 - номер подфункции
2817
Возвращаемое значение:
2818
  * функция не возвращает значения
2819
Замечания:
2820
  * Блокируется обычный ввод данных с клавиатуры для установленных
2821
    "горячих" клавиш
2822
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2709 mario79 2823
 
3539 clevermous 2824
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
2825
Параметры:
2826
  * eax = 66 - номер функции
2827
  * ebx = 7 - номер подфункции
2828
Возвращаемое значение:
2829
  * функция не возвращает значения
2830
Замечания:
2831
  * Разблокирование результатов ф. 66.6
2832
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2709 mario79 2833
 
77 diamond 2834
======================================================================
3539 clevermous 2835
============ Функция 67 - изменить положение/размеры окна. ===========
77 diamond 2836
======================================================================
3539 clevermous 2837
Параметры:
2838
  * eax = 67 - номер функции
2839
  * ebx = новая x-координата окна
2840
  * ecx = новая y-координата окна
2841
  * edx = новый x-размер окна
2842
  * esi = новый y-размер окна
2843
Возвращаемое значение:
2844
  * функция не возвращает значения
2845
Замечания:
2846
  * Значение -1 для параметра означает "не изменять"; например, для
2847
    перемещения окна без изменения размеров можно указать edx=esi=-1.
2848
  * Предварительно окно должно быть определено функцией 0.
2849
    Она же задаёт начальные координаты и размеры окна.
2850
  * Размеры окна понимаются в смысле функции 0, т.е.
2851
    на один пиксель меньше, чем реальные размеры.
2852
  * Вызов функции для максимизированных окон просто игнорируется.
2853
  * Для окон соответствующих стилей положение и/или размеры могут быть
2854
    изменены пользователем; текущие положение и размеры могут быть
2855
    получены вызовом функции 9.
2856
  * Функция посылает окну событие перерисовки (с кодом 1).
77 diamond 2857
 
2858
======================================================================
3539 clevermous 2859
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
77 diamond 2860
======================================================================
3539 clevermous 2861
Параметры:
2862
  * eax = 68 - номер функции
2863
  * ebx = 0 - номер подфункции
2864
Возвращаемое значение:
2865
  * eax = число переключений задач с момента загрузки системы
2866
    (по модулю 2^32)
77 diamond 2867
 
2868
======================================================================
3539 clevermous 2869
====================== Функция 68, подфункция 1 ======================
2870
============ Переключиться на следующий поток выполнения. ============
77 diamond 2871
======================================================================
3539 clevermous 2872
Функция завершает текущий квант времени, выделенный потоку,
2873
и переключается на следующий.
2874
(Какой поток какого процесса будет следующим, предсказать нельзя).
2875
Позднее, когда до текущего потока дойдёт очередь,
2876
выполнение возобновится.
2877
Параметры:
2878
  * eax = 68 - номер функции
2879
  * ebx = 1 - номер подфункции
2880
Возвращаемое значение:
2881
  * функция не возвращает значения
77 diamond 2882
 
2883
======================================================================
3539 clevermous 2884
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
77 diamond 2885
======================================================================
3539 clevermous 2886
Параметры:
2887
  * eax = 68 - номер функции
2888
  * ebx = 2 - номер подфункции
2889
  * ecx = требуемое действие:
2890
    * ecx = 0 - разрешить выполнение инструкции rdpmc
77 diamond 2891
      (ReaD Performance-Monitoring Counters)
3539 clevermous 2892
    * ecx = 1 - узнать, включён/выключен кэш
2893
    * ecx = 2 - включить кэш
2894
    * ecx = 3 - выключить кэш
2895
Возвращаемое значение:
2896
  * для ecx=0:
2897
    * eax = значение cr4
2898
  * для ecx=1:
77 diamond 2899
    * eax = (cr0 and 0x60000000):
3539 clevermous 2900
    * eax = 0 - кэш включён
2901
    * eax <> 0 - кэш выключен
2902
  * для ecx=2 и ecx=3:
2903
    * функция не возвращает значения
77 diamond 2904
 
2905
======================================================================
3539 clevermous 2906
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
77 diamond 2907
======================================================================
3539 clevermous 2908
MSR = Model Specific Register; полный список MSR-регистров процессора
2909
содержится в документации по процессору (например, IA-32 Intel
77 diamond 2910
Architecture Software Developer's Manual, Volume 3, Appendix B);
3539 clevermous 2911
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2912
Параметры:
2913
  * eax = 68 - номер функции
2914
  * ebx = 3 - номер подфункции
2915
  * ecx игнорируется
2916
  * edx = адрес MSR
2917
Возвращаемое значение:
2918
  * ebx:eax = старший:младший dword результата
2919
Замечания:
2920
  * Указание в ecx несуществующего или нереализованного для данного
2921
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2922
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2923
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2924
    которое всё равно прибьёт поток.
77 diamond 2925
 
2926
======================================================================
3539 clevermous 2927
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
77 diamond 2928
======================================================================
3539 clevermous 2929
MSR = Model Specific Register; полный список MSR-регистров процессора
2930
содержится в документации по процессору (например, IA-32 Intel
77 diamond 2931
Architecture Software Developer's Manual, Volume 3, Appendix B);
3539 clevermous 2932
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2933
Параметры:
2934
  * eax = 68 - номер функции
2935
  * ebx = 4 - номер подфункции
2936
  * ecx игнорируется
2937
  * edx = адрес MSR
2938
  * esi:edi = старший:младший dword
2939
Возвращаемое значение:
2940
  * функция не возвращает значения
2941
Замечания:
2942
  * Указание в ecx несуществующего или нереализованного для данного
2943
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2944
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2945
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2946
    которое всё равно прибьёт поток.
77 diamond 2947
 
2948
======================================================================
3539 clevermous 2949
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
77 diamond 2950
======================================================================
3539 clevermous 2951
Параметры:
2952
  * eax = 68 - номер функции
2953
  * ebx = 11 - номер подфункции
2954
Возвращаемое значение:
2955
  * eax = 0 - неуспех
2956
  * иначе размер созданной кучи
2957
Замечания:
2958
  * Вызов функции инициализирует кучу, из которой впоследствии можно
2959
    выделять и освобождать блоки памяти подфункциями 12 и 13.
2960
    Размер кучи равен размеру всей свободной памяти приложения.
2961
  * При повторном вызове функции тем же процессом функция вернёт
2962
    размер существующей кучи.
2963
  * После создания кучи вызовы функции 64 игнорируются.
77 diamond 2964
 
2965
======================================================================
3539 clevermous 2966
========== Функция 68, подфункция 12 - выделить блок памяти. =========
77 diamond 2967
======================================================================
3539 clevermous 2968
Параметры:
2969
  * eax = 68 - номер функции
2970
  * ebx = 12 - номер подфункции
2971
  * ecx = требуемый размер в байтах
2972
Возвращаемое значение:
2973
  * eax = указатель на выделенный блок
2974
Замечания:
2975
  * Предварительно следует инициализировать кучу процесса вызовом
2976
    подфункции 11.
2977
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
2978
    размер выделенного блока больше или равен запрошенному.
77 diamond 2979
 
2980
======================================================================
3539 clevermous 2981
========= Функция 68, подфункция 13 - освободить блок памяти. ========
77 diamond 2982
======================================================================
3539 clevermous 2983
Параметры:
2984
  * eax = 68 - номер функции
2985
  * ebx = 13 - номер подфункции
2986
  * ecx = указатель на блок памяти
2987
Возвращаемое значение:
2988
  * eax = 1 - успешно
2989
  * eax = 0 - неудача
2990
Замечания:
2991
  * Блок памяти должен быть ранее выделен подфункцией 12
2992
    или подфункцией 20.
77 diamond 2993
 
2994
======================================================================
3539 clevermous 2995
====================== Функция 68, подфункция 14 =====================
2996
====== Ожидать получения сигнала от других приложений/драйверов. =====
77 diamond 2997
======================================================================
3539 clevermous 2998
Параметры:
2999
  * eax = 68 - номер функции
3000
  * ebx = 14 - номер подфункции
3001
  * ecx = указатель на буфер для информации (24 байта)
3002
Возвращаемое значение:
3003
  * eax разрушается
3004
  * буфер, на который указывает ecx, содержит следующую информацию:
3005
    * +0: dword: идентификатор последующих данных сигнала
3006
    * +4: данные принятого сигнала (20 байт), формат которых
3007
          определяется первым dword-ом
77 diamond 3008
 
3009
======================================================================
3539 clevermous 3010
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
172 serge 3011
======================================================================
3539 clevermous 3012
Параметры:
3013
  * eax = 68 - номер функции
3014
  * ebx = 16 - номер подфункции
3015
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3016
Возвращаемое значение:
3017
  * eax = 0 - неудача
3018
  * иначе eax = хэндл драйвера
3019
Замечания:
3020
  * Если драйвер ещё не загружен, он загружается;
3021
    если драйвер уже загружен, ничего не меняется.
3022
  * Имя драйвера чувствительно к регистру символов.
3023
    Максимальная длина имени - 16 символов, включая завершающий
3024
    нулевой символ, остальные символы игнорируются.
3025
  * Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
172 serge 3026
 
3027
======================================================================
3539 clevermous 3028
========== Функция 68, подфункция 17 - управление драйвером. =========
172 serge 3029
======================================================================
3539 clevermous 3030
Параметры:
3031
  * eax = 68 - номер функции
3032
  * ebx = 17 - номер подфункции
3033
  * ecx = указатель на управляющую структуру:
3034
    * +0: dword: хэндл драйвера
3035
    * +4: dword: код функции драйвера
3036
    * +8: dword: указатель на входные данные
3037
    * +12 = +0xC: dword: размер входных данных
3038
    * +16 = +0x10: dword: указатель на выходные данные
3039
    * +20 = +0x14: dword: размер выходных данных
3040
Возвращаемое значение:
3041
  * eax = определяется драйвером
3042
Замечания:
3043
  * Коды функций и структура входных/выходных данных
3044
    определяются драйвером.
3045
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
172 serge 3046
 
3047
======================================================================
3539 clevermous 3048
============= Функция 68, подфункция 19 - загрузить DLL. =============
277 diamond 3049
======================================================================
3539 clevermous 3050
Параметры:
3051
  * eax = 68 - номер функции
3052
  * ebx = 19 - номер подфункции
3053
  * ecx = указатель на ASCIIZ-строку с полным путём к DLL
3054
Возвращаемое значение:
3055
  * eax = 0 - неудача
3056
  * иначе eax = указатель на таблицу экспорта DLL
3057
Замечания:
3058
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
3059
    заканчивающийся нулём. Первый dword в структуре является
3060
    указателем на имя функции, второй содержит адрес функции.
277 diamond 3061
 
3062
======================================================================
3539 clevermous 3063
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
448 diamond 3064
======================================================================
3539 clevermous 3065
Параметры:
3066
  * eax = 68 - номер функции
3067
  * ebx = 20 - номер подфункции
3068
  * ecx = новый размер в байтах
3069
  * edx = указатель на уже выделенный блок памяти
3070
Возвращаемое значение:
3071
  * eax = указатель на перераспределённый блок, 0 при ошибке
3072
Замечания:
3073
  * Предварительно следует инициализировать кучу процесса вызовом
3074
    подфункции 11.
3075
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3076
    размер выделенного блока больше или равен запрошенному.
3077
  * Если edx=0, то вызов функции эквивалентен выделению памяти
3078
    подфункцией 12. В противном случае блок памяти по адресу edx
3079
    должен быть ранее выделен подфункцией 12 или
3080
    описываемой подфункцией.
3081
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
3082
    возвращает 0.
3083
  * Содержимое памяти вплоть до наименьшего из старого и нового
3084
    размеров сохраняется.
448 diamond 3085
 
1018 diamond 3086
======================================================================
3539 clevermous 3087
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
2646 mario79 3088
======================================================================
3539 clevermous 3089
Параметры:
3090
  * eax = 68 - номер функции
3091
  * ebx = 21 - номер подфункции
3092
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3093
  * edx = указатель на командную строку
3094
Возвращаемое значение:
3095
  * eax = 0 - неудача
3096
  * иначе eax = хэндл драйвера
3097
Замечания:
3098
  * Если драйвер ещё не загружен, он загружается;
3099
    если драйвер уже загружен, ничего не меняется.
2646 mario79 3100
 
3101
======================================================================
3539 clevermous 3102
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
1018 diamond 3103
======================================================================
3539 clevermous 3104
Параметры:
3105
  * eax = 68 - номер функции
3106
  * ebx = 22 - номер подфункции
3107
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3108
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
3109
  * esi = флаги открытия и доступа:
3110
    * SHM_OPEN        = 0x00 - открыть существующую область памяти.
3111
                          Если область с таким именем не существует,
3112
                          функция вернёт код ошибки 5.
3113
    * SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
3114
                          область памяти.
3115
    * SHM_CREATE      = 0x08 - создать новую область памяти.
3116
                          Если область с таким именем уже существует,
3117
                          функция вернёт код ошибки 10.
3118
    * SHM_READ        = 0x00 - доступ только на чтение
3119
    * SHM_WRITE       = 0x01 - доступ на чтение и запись
3120
Возвращаемое значение:
3121
  * eax = указатель на область памяти, 0 при ошибке
3122
  * при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
3123
    edx = 0 - успех, иначе - код ошибки
3124
  * при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
3125
    edx = код ошибки (при eax=0) или размер области в байтах
3126
Коды ошибок:
1018 diamond 3127
  * E_NOTFOUND = 5
3128
  * E_ACCESS = 10
3129
  * E_NOMEM = 30
3130
  * E_PARAM = 33
3539 clevermous 3131
Замечания:
3132
  * Предварительно следует инициализировать кучу процесса вызовом
3133
    подфункции 11.
3134
  * Если создаётся новая область, то флаги доступа устанавливают
3135
    максимальные права доступа для остальных процессов. Попытка
3136
    открытия другим потоком с неразрешёнными правами провалится
3137
    с кодом ошибки E_ACCESS.
3138
  * Процесс, создавший область, всегда имеет доступ на запись.
945 serge 3139
 
1018 diamond 3140
======================================================================
3539 clevermous 3141
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
1018 diamond 3142
======================================================================
3539 clevermous 3143
Параметры:
3144
  * eax = 68 - номер функции
3145
  * ebx = 23 - номер подфункции
3146
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3147
Возвращаемое значение:
3148
  * eax разрушается
3149
Замечания:
3150
  * Область памяти физически освобождается (с забыванием всех данных
3151
    и высвобождением физической памяти), когда её закроют
3152
    все открывшие потоки.
3153
  * При завершении потока освобождаются все открытые им
3154
    области памяти.
945 serge 3155
 
448 diamond 3156
======================================================================
3539 clevermous 3157
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
1077 Galkov 3158
======================================================================
3539 clevermous 3159
Параметры:
3160
  * eax = 68 - номер функции
3161
  * ebx = 24 - номер подфункции
3162
  * ecx = адрес нового обработчика исключений
3163
  * edx = маска обрабатываемых исключений
3164
Возвращаемое значение:
3165
  * eax = адрес старого обработчика исключений (0, если не установлен)
3166
  * ebx = маска старого обработчика исключений
3167
Замечания:
3168
  * Номер бита в маске исключений соответствует номеру исключения по
3169
    спецификации на процессор (Intel-PC). Так, например, исключения
3170
    FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
3171
  * В данной реализации игнорируется запрос на перехват исключения 7
3172
    - система обрабатывает #NM самостоятельно.
3173
  * Пользовательский обработчик получает номер исключения параметром
3174
    в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
3175
    при этом производится на команду, вызвавшую исключение.
3176
  * При передаче управления обработчику исключений сбрасывается
3177
    соответствующий бит в маске исключений. Возникновение этого же
3178
    исключения впоследствии приведёт к умолчальной обработке такового.
3179
    А именно: к завершению работы приложения в отсутствии отладчика,
3180
    приостановка с уведомлением отлаживающего приложения иначе.
3181
  * После завершения критических действий в обработчике пользователя
3182
    восстановление бита маски данного исключения можно сделать
3183
    подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также
3184
    возлагается на обработчик пользователя.
1077 Galkov 3185
 
3186
======================================================================
3539 clevermous 3187
= Функция 68, подфункция 25 - изменить состояние активности сигнала. =
1077 Galkov 3188
======================================================================
3539 clevermous 3189
Параметры:
3190
  * eax = 68 - номер функции
3191
  * ebx = 25 - номер подфункции
3192
  * ecx = номер сигнала
3193
  * edx = значение устанавливаемой активности (0/1)
3194
Возвращаемое значение:
3195
  * eax = -1 - задан неверный номер сигнала
3196
  * иначе eax = старое значение активности сигнала (0/1)
3197
Замечания:
3198
  * В текущей реализации изменяется только маска пользовательского
3199
    обработчика исключений, установленного подфункцией 24. При этом
3200
    номер сигнала соответствует номеру исключения.
1077 Galkov 3201
 
3202
======================================================================
4193 lev 3203
= Функция 68, подфункция 26 - освободить страницы памяти ============
3204
======================================================================
3205
Параметры:
3206
  * eax = 68 - номер функции
3207
  * ebx = 26 - номер подфункции
3208
  * ecx = указатель на блок памяти выделенный подфункцией 12
3209
  * edx = смещение от начала блока
3210
  * esi = размер высвобождаемого блока памяти, в байтах
3211
Примечания:
3212
  * функция освобождает страницы с ecx+edx по ecx+edx+esi
3213
    и устанавливает виртуальную память в зарезервированное состояние.
3214
 
3215
======================================================================
3216
= Функция 68, подфункция 27 - загрузить файл ===================
3217
======================================================================
3218
Параметры:
3219
  * eax = 68 - номер функции
3220
  * ebx = 27 - номер подфункции
3221
  * ecx = указатель на ASCIIZ-строку с именем файла
3222
Возвращаемое значение:
3223
  * eax = указатель на загруженный файл или 0
3224
  * edx = размер загруженного файла или 0
3225
Примечания:
3226
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
3227
 
3228
======================================================================
3539 clevermous 3229
======================== Функция 69 - отладка. =======================
77 diamond 3230
======================================================================
3539 clevermous 3231
Процесс может загрузить другой процесс как отлаживаемый установкой
3232
соответствующего бита при вызове подфункции 7 функции 70.
3233
У процесса может быть только один отладчик; один процесс может
3234
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3235
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3236
определённый подфункцией 0.
3237
Формат сообщения:
3238
  * +0: dword: код сообщения
3239
  * +4: dword: PID отлаживаемого процесса
3240
  * +8: могут присутствовать дополнительные данные,
3241
    определяемые кодом сообщения
3242
Коды сообщений:
3243
  * 1 = исключение
3244
    * дополнительно передаётся dword-номер исключения
3245
    * процесс приостановлен
3246
  * 2 = процесс завершился
3247
    * приходит при любом завершении: как через системную функцию -1,
3248
      так и при "убийстве" любым другим процессом
3249
      (в том числе самим отладчиком)
3250
  * 3 = отладочное исключение int 1 = #DB
3251
    * дополнительно передаётся dword-образ регистра DR6:
3252
      * биты 0-3: выполнено условие соответствующей точки останова
3253
        (установленной подфункцией 9)
3254
      * бит 14: исключение произошло из-за режима
3255
        пошаговой трассировки (установлен флаг TF)
3256
    * процесс приостановлен
3257
При завершении отладчика прибиваются все отлаживаемые процессы.
3258
Если отладчик этого не хочет, он должен предварительно отключиться
3259
подфункцией 3.
77 diamond 3260
 
3539 clevermous 3261
Все подфункции применимы только к процессам/потокам, запущенным
3262
из текущего функцией 70 с установленным флагом отладки.
3263
Отладка многопоточных программ пока не поддерживается.
3264
Полный список подфункций:
3265
  * подфункция 0 - определить область данных для отладочных сообщений
3266
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3267
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3268
  * подфункция 3 - отключиться от отлаживаемого процесса
3269
  * подфункция 4 - приостановить отлаживаемый поток
3270
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3271
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3272
  * подфункция 7 - записать в память отлаживаемого процесса
3273
  * подфункция 8 - завершить отлаживаемый поток
3274
  * подфункция 9 - установить/снять аппаратную точку останова
77 diamond 3275
 
3276
======================================================================
3539 clevermous 3277
====================== Функция 69, подфункция 0 ======================
3278
========= Определить область данных для отладочных сообщений. ========
77 diamond 3279
======================================================================
3539 clevermous 3280
Параметры:
3281
  * eax = 69 - номер функции
3282
  * ebx = 0 - номер подфункции
3283
  * ecx = указатель
3284
Формат области данных:
3285
  * +0: dword: N = размер буфера (не считая этого заголовка)
3286
  * +4: dword: занято в буфере
3287
  * +8: N*byte: буфер
3288
Возвращаемое значение:
3289
  * функция не возвращает значения
3290
Замечания:
3291
  * Если поле размера отрицательно, буфер считается заблокированным
3292
    и при поступлении нового сообщения система будет ждать.
3293
    Для синхронизации обрамляйте всю работу с буфером операциями
3294
    блокировки/разблокировки
1662 Nasarus 3295
    	neg	[bufsize]
3539 clevermous 3296
  * Данные в буфере трактуются как массив элементов переменной длины -
3297
    сообщений. Формат сообщения указан в общем описании.
77 diamond 3298
 
3299
======================================================================
3539 clevermous 3300
====================== Функция 69, подфункция 1 ======================
3301
========= Получить состояние регистров отлаживаемого потока. =========
77 diamond 3302
======================================================================
3539 clevermous 3303
Параметры:
3304
  * eax = 69 - номер функции
3305
  * ebx = 1 - номер подфункции
3306
  * ecx = идентификатор потока
3307
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3308
  * esi = указатель на структуру контекста
3309
Возвращаемое значение:
3310
  * функция не возвращает значения
3311
Формат структуры контекста: (FPU пока не поддерживается)
77 diamond 3312
  * +0: dword: eip
3313
  * +4: dword: eflags
3314
  * +8: dword: eax
3315
  * +12 = +0xC: dword: ecx
3316
  * +16 = +0x10: dword: edx
3317
  * +20 = +0x14: dword: ebx
3318
  * +24 = +0x18: dword: esp
3319
  * +28 = +0x1C: dword: ebp
3320
  * +32 = +0x20: dword: esi
3321
  * +36 = +0x24: dword: edi
3539 clevermous 3322
Замечания:
3323
  * Если поток выполняет код 0-кольца, возвращается
3324
    состояние регистров 3-кольца.
3325
  * Процесс должен быть загружен для отладки (как указано в
3326
    общем описании).
77 diamond 3327
 
3328
======================================================================
3539 clevermous 3329
====================== Функция 69, подфункция 2 ======================
3330
======== Установить состояние регистров отлаживаемого потока. ========
77 diamond 3331
======================================================================
3539 clevermous 3332
Параметры:
3333
  * eax = 69 - номер функции
3334
  * ebx = 2 - номер подфункции
3335
  * ecx = идентификатор потока
3336
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3337
  * esi = указатель на структуру контекста
3338
Возвращаемое значение:
3339
  * функция не возвращает значения
3340
Формат структуры контекста указан в описании подфункции 1.
3341
Замечания:
3342
  * Если поток выполняет код 0-кольца, устанавливается
3343
    состояние регистров 3-кольца.
3344
  * Процесс должен быть загружен для отладки (как указано в
3345
    общем описании).
77 diamond 3346
 
3347
======================================================================
3539 clevermous 3348
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
77 diamond 3349
======================================================================
3539 clevermous 3350
Параметры:
3351
  * eax = 69 - номер функции
3352
  * ebx = 3 - номер подфункции
3353
  * ecx = идентификатор
3354
Возвращаемое значение:
3355
  * функция не возвращает значения
3356
Замечания:
3357
  * Если процесс был приостановлен, он возобновляет выполнение.
77 diamond 3358
 
3359
======================================================================
3539 clevermous 3360
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
77 diamond 3361
======================================================================
3539 clevermous 3362
Параметры:
3363
  * eax = 69 - номер процесса
3364
  * ebx = 4 - номер подфункции
3365
  * ecx = идентификатор
3366
Возвращаемое значение:
3367
  * функция не возвращает значения
3368
Замечания:
3369
  * Процесс должен быть загружен для отладки (как указано в
3370
    общем описании).
77 diamond 3371
 
3372
======================================================================
3539 clevermous 3373
====================== Функция 69, подфункция 5 ======================
3374
============ Возобновить выполнение отлаживаемого потока. ============
77 diamond 3375
======================================================================
3539 clevermous 3376
Параметры:
3377
  * eax = 69 - номер функции
3378
  * ebx = 5 - номер подфункции
3379
  * ecx = идентификатор
3380
Возвращаемое значение:
3381
  * функция не возвращает значения
3382
Замечания:
3383
  * Процесс должен быть загружен для отладки (как указано в
3384
    общем описании).
77 diamond 3385
 
3386
======================================================================
3539 clevermous 3387
====================== Функция 69, подфункция 6 ======================
3388
============= Прочитать из памяти отлаживаемого процесса. ============
77 diamond 3389
======================================================================
3539 clevermous 3390
Параметры:
3391
  * eax = 69 - номер функции
3392
  * ebx = 6 - номер подфункции
3393
  * ecx = идентификатор
3394
  * edx = сколько байт читать
3395
  * esi = адрес памяти отлаживаемого процесса
3396
  * edi = указатель на буфер для данных
3397
Возвращаемое значение:
3398
  * eax = -1 при ошибке (неверный PID или буфер)
3399
  * иначе eax = число прочитанных байт (возможно, 0,
3400
    если в esi слишком большое значение)
3401
Замечания:
3402
  * Процесс должен быть загружен для отладки (как указано в
3403
    общем описании).
77 diamond 3404
 
3405
======================================================================
3780 Serge 3406
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
77 diamond 3407
======================================================================
3539 clevermous 3408
Параметры:
3409
  * eax = 69 - номер функции
3410
  * ebx = 7 - номер подфункции
3411
  * ecx = идентификатор
3412
  * edx = сколько байт писать
3413
  * esi = адрес памяти в отлаживаемом процессе
3414
  * edi = указатель на данные
3415
Возвращаемое значение:
3416
  * eax = -1 при ошибке (неверный PID или буфер)
3417
  * иначе eax = число записанных байт (возможно, 0,
3418
    если в esi слишком большое значение)
3419
Замечания:
3420
  * Процесс должен быть загружен для отладки (как указано в
3421
    общем описании).
77 diamond 3422
 
3423
======================================================================
3539 clevermous 3424
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
77 diamond 3425
======================================================================
3539 clevermous 3426
Параметры:
3427
  * eax = 69 - номер функции
3428
  * ebx = 8 - номер подфункции
3429
  * ecx = идентификатор
3430
Возвращаемое значение:
3431
  * функция не возвращает значения
3432
Замечания:
3433
  * Процесс должен быть загружен для отладки (как указано в
3434
    общем описании).
3435
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
3436
    требуется выполнение первого замечания и принимается PID,
3437
    а не номер слота.
77 diamond 3438
 
3439
======================================================================
3539 clevermous 3440
====================== Функция 69, подфункция 9 ======================
3441
============= Установить/снять аппаратную точку останова. ============
77 diamond 3442
======================================================================
3539 clevermous 3443
Параметры:
3444
  * eax = 69 - номер функции
3445
  * ebx = 9 - номер подфункции
3446
  * ecx = идентификатор потока
3447
  * dl = индекс точки останова, от 0 до 3 включительно
3448
  * dh = флаги:
3449
    * если старший бит сброшен - установить точку останова:
3450
      * биты 0-1 - условие:
3451
        * 00 = точка останова на выполнение
3452
        * 01 = точка останова на запись
3453
        * 11 = точка останова на чтение/запись
3454
      * биты 2-3 - длина; для точек останова на исполнение должно быть
3455
        00, в противном случае одно из
3456
        * 00 = байт
3457
        * 01 = слово
3458
        * 11 = двойное слово
3459
      * esi = адрес точки останова; должен быть выровнен
3460
        соответственно длине (т.е. должен быть чётным для
3461
        точек останова на слово, кратен 4 для двойного слова)
3462
    * если старший бит установлен - сбросить точку останова
3463
Возвращаемое значение:
3464
  * eax = 0 - успешно
3465
  * eax = 1 - ошибка во входных данных
3466
  * eax = 2 - (зарезервировано, никогда не возвращается
3467
    в текущей реализации) с этим индексом уже установлена
3468
    глобальная точка останова
3469
Замечания:
3470
  * Процесс должен быть загружен для отладки (как указано в
3471
    общем описании).
3472
  * Аппаратные точки останова реализуются через DRx-регистры
3473
    процессора, отсюда все ограничения.
3474
  * Функция может переустановить ранее установленную ей же
3475
    точку останова (никак не сообщая об этом).
3476
    Ведите список установленных точек останова в отладчике.
3477
  * Срабатывание точки останова заключается в генерировании
3478
    отладочного исключения #DB, о котором система сообщает отладчику.
3479
  * Точка останова на запись и чтение/запись срабатывает после
3480
    выполнения вызвавшей её инструкции.
77 diamond 3481
 
3482
======================================================================
3539 clevermous 3483
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
77 diamond 3484
======================================================================
3539 clevermous 3485
Параметры:
77 diamond 3486
  * eax = 70
3539 clevermous 3487
  * ebx = указатель на информационную структуру
3488
Возвращаемое значение:
3489
  * eax = 0 - успешно; иначе код ошибки файловой системы
3490
  * в зависимости от подфункции может возвращаться значение и
3491
    в других регистрах
3492
Общий формат информационной структуры:
3493
  * +0: dword: номер подфункции
3494
  * +4: dword: смещение в файле
3495
  * +8: dword: старший dword смещения (должен быть 0) или поле флагов
3496
  * +12 = +0xC: dword: размер
3497
  * +16 = +0x10: dword: указатель на данные
3498
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
3499
    или
86 diamond 3500
  * +20 = +0x14: db 0
3539 clevermous 3501
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3502
Уточнения - в документации на соответствующую подфункцию.
3503
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
3504
записаны в кодировке cp866 (DOS).
3505
Формат имени файла:
77 diamond 3506
/base/number/dir1/dir2/.../dirn/file,
3539 clevermous 3507
где /base/number идентифицирует устройство, на котором ищется файл:
3508
одно из
3509
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
3510
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
3511
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
3512
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
3513
    к жёстким дискам на IDE0 (Primary Master), IDE1 (Primary Slave),
77 diamond 3514
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
3539 clevermous 3515
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
3516
    (на каждом из винчестеров нумерация начинается с 1)
3517
  * /CD0/1, /CD1/1, /CD2/1, /CD3/1 для доступа соответственно
3518
    к CD на IDE0 (Primary Master), IDE1 (Primary Slave),
118 diamond 3519
    IDE2 (Secondary Master), IDE3 (Secondary Slave)
3539 clevermous 3520
  * /SYS - определяет системную папку; при обычной загрузке системы
3521
    с дискеты эквивалентно /RD/1
3522
Примеры:
83 diamond 3523
  * '/rd/1/kernel.asm',0
77 diamond 3524
  * '/HD0/1/kernel.asm',0
3525
  * '/hd0/2/menuet/pics/tanzania.bmp',0
3526
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
546 diamond 3527
  * '/sys/MySuperApp.ini',0
3539 clevermous 3528
Также функция поддерживает относительные имена. Если путь начинается
3529
не с '/', то он считается относительно текущей папки. Получить или
3530
установить текущую папку можно с помощью сисфункции 30.
1662 Nasarus 3531
 
3539 clevermous 3532
Доступные подфункции:
3533
  * подфункция 0 - чтение файла
3534
  * подфункция 1 - чтение папки
3535
  * подфункция 2 - создание/перезапись файла
3536
  * подфункция 3 - запись в существующий файл
3537
  * подфункция 4 - установка размера файла
3538
  * подфункция 5 - получение атрибутов файла/папки
3539
  * подфункция 6 - установка атрибутов файла/папки
3540
  * подфункция 7 - запуск программы
3541
  * подфункция 8 - удаление файла/папки
3542
  * подфункция 9 - создание папки
3543
Для CD-приводов в связи с аппаратными ограничениями доступны
3544
только подфункции 0,1,5 и 7, вызов других подфункций завершится
3545
ошибкой с кодом 2.
3546
При первом обращении подфункций 0,1,5,7 к устройствам ATAPI
3547
(CD и DVD) производится блокировка ручного управления механизмом
3548
лотка. Это связано с кэшированием данных, полученных от привода.
3549
Разблокировка осуществляется при обращении подфункции 4 функции 24
3550
к соответствующему устройству.
77 diamond 3551
 
3552
======================================================================
3539 clevermous 3553
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
77 diamond 3554
======================================================================
3539 clevermous 3555
Параметры:
3556
  * eax = 70 - номер функции
3557
  * ebx = указатель на информационную структуру
3558
Формат информационной структуры:
3559
  * +0: dword: 0 = номер подфункции
3560
  * +4: dword: позиция в файле (в байтах)
3561
  * +8: dword: 0 (зарезервировано под старший dword позиции)
3562
  * +12 = +0xC: dword: сколько байт читать
3563
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
3564
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3565
    общем описании
3566
    или
86 diamond 3567
  * +20 = +0x14: db 0
3539 clevermous 3568
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3569
Возвращаемое значение:
3570
  * eax = 0 - успешно, иначе код ошибки файловой системы
3571
  * ebx = число прочитанных байт или
3572
    -1=0xffffffff, если файл не найден
3573
Замечания:
3574
  * Если файл кончился раньше, чем был прочитан последний запрошенный
3575
    блок, то функция прочитает, сколько сможет, после чего вернёт
77 diamond 3576
    eax=6 (EOF).
3539 clevermous 3577
  * Функция не позволяет читать папки
3578
    (вернётся eax=10, access denied).
77 diamond 3579
 
3580
======================================================================
3539 clevermous 3581
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
77 diamond 3582
======================================================================
3539 clevermous 3583
Параметры:
3584
  * eax = 70 - номер функции
3585
  * ebx = указатель на информационную структуру
3586
Формат информационной структуры:
3587
  * +0: dword: 1 = номер подфункции
3588
  * +4: dword: индекс начального блока (считая с 0)
3589
  * +8: dword: поле флагов:
3590
    * бит 0 (маска 1): в каком формате возвращать имена,
78 diamond 3591
      0=ANSI, 1=UNICODE
3539 clevermous 3592
    * прочие биты зарезервированы и должны быть установлены в 0
3593
      для будущей совместимости
3594
  * +12 = +0xC: dword: сколько блоков читать
3595
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны
3596
    данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
3597
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
3598
    общем описании
3599
    или
86 diamond 3600
  * +20 = +0x14: db 0
3539 clevermous 3601
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3602
Возвращаемое значение:
3603
  * eax = 0 - успешно, иначе код ошибки файловой системы
3604
  * ebx = число файлов, информация о которых была записана в буфер,
3605
    или -1=0xffffffff, если папка не найдена
3606
Структура буфера:
3607
  * +0: 32*byte: заголовок
3608
  * +32 = +0x20: n1*byte: блок с информацией о файле 1
3609
  * +32+n1: n2*byte: блок с информацией о файле 2
77 diamond 3610
  * ...
3539 clevermous 3611
Структура заголовка:
3612
  * +0: dword: версия структуры (текущая версия = 1)
3613
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
3614
    в поле +12 информационной структуры; может быть меньше,
3615
    если в папке кончились файлы (то же самое, что и в ebx)
3616
  * +8: dword: общее число файлов в папке
3617
  * +12 = +0xC: 20*byte: зарезервировано (нули)
3618
Структура блока данных входа каталога (БДВК):
3619
  * +0: dword: атрибуты файла:
3620
    * бит 0 (маска 1): файл только для чтения
3621
    * бит 1 (маска 2): файл является скрытым
3622
    * бит 2 (маска 4): файл является системным
3623
    * бит 3 (маска 8): это не файл, а метка тома
3624
      (на заданном разделе встречается не более одного раза и
3625
      только в корневой папке)
3626
    * бит 4 (маска 0x10): это папка
3627
    * бит 5 (маска 0x20): файл не архивировался - многие программы
3628
      архивации имеют опцию, по которой архивируются только файлы
3629
      с установленным этим битом, после чего этот бит сбрасывается -
3630
      это может быть полезно для автоматического создания
3631
      backup-архивов, ибо при записи бит обычно устанавливается
3632
      (не в Kolibri, правда)
3633
  * +4: byte: тип данных имени:
3634
    (совпадает с битом 0 флагов информационной структуры)
3635
    * 0 = ASCII = 1-байтное представление каждого символа
3636
    * 1 = UNICODE = 2-байтное представление каждого символа
3637
  * +5: 3*byte: зарезервировано (нули)
3638
  * +8: 4*byte: время создания файла
3639
  * +12 = +0xC: 4*byte: дата создания файла
3640
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
3641
  * +20 = +0x14: 4*byte: дата последнего доступа
3642
  * +24 = +0x18: 4*byte: время последней модификации
3643
  * +28 = +0x1C: 4*byte: дата последней модификации
3644
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
3645
  * +40 = +0x28: имя
3646
    * для формата ASCII: максимальная длина имени 263 символа
3647
      (263 байта), байт после имени имеет значение 0
3648
    * для формата UNICODE: максимальная длина имени 259 символов
3649
      (518 байт), два байта после имени имеют значение 0
3650
Формат времени:
3651
  * +0: byte: секунды
3652
  * +1: byte: минуты
3653
  * +2: byte: часы
3654
  * +3: byte: зарезервировано (0)
3655
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
3656
Формат даты:
3657
  * +0: byte: день
3658
  * +1: byte: месяц
3659
  * +2: word: год
3660
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
3661
Замечания:
3662
  * Если в БДВК присутствует имя в ASCII, то длина БДВК составляет
3663
    304 байта, если в UNICODE - 560 байт. Значение длины выравнено
3664
    на целое кратное 16 байт
3665
    (для ускорения обработки в кэш-памяти CPU).
3666
  * Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие
3667
    данные содержат мусор.
3668
  * Если файлы в папке кончились раньше, чем было прочитано
3669
    запрошенное количество, то функция прочитает, сколько сможет,
3670
    после чего вернёт eax=6 (EOF).
3671
  * Любая папка на диске, кроме корневой, содержит два специальных
3672
    входа "." и "..", идентифицирующих соответственно саму папку и
3673
    родительскую папку.
3674
  * Функция позволяет также читать виртуальные папки "/", "/rd",
3675
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
3676
    0x10, а времена и даты обнулены. Альтернативный способ получения
3677
    информации об оборудовании - подфункция 11 функции 18.
77 diamond 3678
 
3679
======================================================================
3539 clevermous 3680
====================== Функция 70, подфункция 2 ======================
3681
======== Создание/перезапись файла с поддержкой длинных имён. ========
83 diamond 3682
======================================================================
3539 clevermous 3683
Параметры:
3684
  * eax = 70 - номер функции
3685
  * ebx = указатель на информационную структуру
3686
Формат информационной структуры:
3687
  * +0: dword: 2 = номер подфункции
3688
  * +4: dword: 0 (зарезервировано)
3689
  * +8: dword: 0 (зарезервировано)
3690
  * +12 = +0xC: dword: сколько байт писать
3691
  * +16 = +0x10: dword: указатель на данные
3692
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3693
    общем описании
3694
    или
86 diamond 3695
  * +20 = +0x14: db 0
3539 clevermous 3696
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3697
Возвращаемое значение:
3698
  * eax = 0 - успешно, иначе код ошибки файловой системы
3699
  * ebx = число записанных байт (возможно, 0)
3700
Замечания:
3701
  * Если файл с таким именем не существовал, он создаётся; если
3702
    существовал, то перезаписывается.
3703
  * Если свободного места на диске недостаточно, то функция запишет,
3704
    сколько сможет, после чего вернёт код ошибки 8.
3705
  * Функция не поддерживается для CD (вернётся код ошибки 2).
83 diamond 3706
 
3707
======================================================================
3539 clevermous 3708
====================== Функция 70, подфункция 3 ======================
3709
======== Запись в существующий файл с поддержкой длинных имён. =======
131 diamond 3710
======================================================================
3539 clevermous 3711
Параметры:
3712
  * eax = 70 - номер функции
3713
  * ebx = указатель на информационную структуру
3714
Формат информационной структуры:
3715
  * +0: dword: 3 = номер подфункции
3716
  * +4: dword: позиция в файле (в байтах)
3717
  * +8: dword: старший dword позиции (должен быть 0 для FAT)
3718
  * +12 = +0xC: dword: сколько байт писать
3719
  * +16 = +0x10: dword: указатель на данные
3720
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3721
    общем описании
3722
    или
131 diamond 3723
  * +20 = +0x14: db 0
3539 clevermous 3724
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3725
Возвращаемое значение:
3726
  * eax = 0 - успешно, иначе код ошибки файловой системы
3727
  * ebx = число записанных байт (возможно, 0)
3728
Замечания:
3729
  * Файл должен уже существовать, иначе вернётся eax=5.
3730
  * Единственным результатом записи 0 байт является установка в
3731
    атрибутах файла даты/времени модификации и доступа в текущую.
3732
  * Если начальная и/или конечная позиция выходит за пределы файла
3733
    (за исключением предыдущего случая), файл расширяется до
3734
    необходимого размера нулевыми символами.
3735
  * Функция не поддерживается для CD (вернётся код ошибки 2).
131 diamond 3736
 
3737
======================================================================
3539 clevermous 3738
========= Функция 70, подфункция 4 - установка размера файла. ========
133 diamond 3739
======================================================================
3539 clevermous 3740
Параметры:
3741
  * eax = 70 - номер функции
3742
  * ebx = указатель на информационную структуру
3743
Формат информационной структуры:
3744
  * +0: dword: 4 = номер подфункции
3745
  * +4: dword: младший dword нового размера файла
3746
  * +8: dword: старший dword нового размера файла
3747
                   (должен быть 0 для FAT)
3748
  * +12 = +0xC: dword: 0 (зарезервировано)
3749
  * +16 = +0x10: dword: 0 (зарезервировано)
3750
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3751
    общем описании
3752
    или
133 diamond 3753
  * +20 = +0x14: db 0
3539 clevermous 3754
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3755
Возвращаемое значение:
3756
  * eax = 0 - успешно, иначе код ошибки файловой системы
3757
  * ebx разрушается
3758
Замечания:
3759
  * Если новый размер файла меньше старого, файл усекается. Если
3760
    новый размер больше старого, файл расширяется нулевыми символами.
3761
    Если новый размер равен старому, единственным результатом вызова
3762
    является установка даты/времени модификации и доступа в текущие.
3763
  * Если свободного места на диске недостаточно для расширения файла,
3764
    то функция расширит насколько возможно, после чего вернёт
3765
    код ошибки 8.
3766
  * Функция не поддерживается для CD (вернётся код ошибки 2).
133 diamond 3767
 
3768
======================================================================
3539 clevermous 3769
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
86 diamond 3770
======================================================================
3539 clevermous 3771
Параметры:
3772
  * eax = 70 - номер функции
3773
  * ebx = указатель на информационную структуру
3774
Формат информационной структуры:
3775
  * +0: dword: 5 = номер подфункции
3776
  * +4: dword: 0 (зарезервировано)
3777
  * +8: dword: 0 (зарезервировано)
3778
  * +12 = +0xC: dword: 0 (зарезервировано)
3779
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
3780
                        (40 байт)
3781
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3782
    общем описании
3783
    или
86 diamond 3784
  * +20 = +0x14: db 0
3539 clevermous 3785
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3786
Возвращаемое значение:
3787
  * eax = 0 - успешно, иначе код ошибки файловой системы
3788
  * ebx разрушается
3789
Информация о файле возвращается в формате БДВК
3790
(блока данных входа каталога), указанном в описании
3791
подфункции 1, но без имени файла
3792
(то есть первые 40 = 0x28 байт).
3793
Замечания:
3794
  * Функция не поддерживает виртуальные папки типа /, /rd и
3795
    корневые папки типа /rd/1.
86 diamond 3796
 
3797
======================================================================
3539 clevermous 3798
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
86 diamond 3799
======================================================================
3539 clevermous 3800
Параметры:
3801
  * eax = 70 - номер функции
3802
  * ebx = указатель на информационную структуру
3803
Формат информационной структуры:
3804
  * +0: dword: 6 = номер подфункции
3805
  * +4: dword: 0 (зарезервировано)
3806
  * +8: dword: 0 (зарезервировано)
3807
  * +12 = +0xC: dword: 0 (зарезервировано)
3808
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
3809
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3810
    общем описании
3811
    или
86 diamond 3812
  * +20 = +0x14: db 0
3539 clevermous 3813
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3814
Возвращаемое значение:
3815
  * eax = 0 - успешно, иначе код ошибки файловой системы
3816
  * ebx разрушается
3817
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
3818
формат которого указан в описании подфункции 1
3819
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
3820
(биты 3,4 в dword'е +0) не меняется.
3821
Байт +4 (формат имени) игнорируется.
3822
Замечания:
3823
  * Функция не поддерживает виртуальные папки типа /, /rd и
3824
    корневые папки типа /rd/1.
3825
  * Функция не поддерживается для CD (вернётся код ошибки 2).
86 diamond 3826
 
3827
======================================================================
3539 clevermous 3828
============ Функция 70, подфункция 7 - запуск программы. ============
91 diamond 3829
======================================================================
3539 clevermous 3830
Параметры:
3831
  * eax = 70 - номер функции
3832
  * ebx = указатель на информационную структуру
3833
Формат информационной структуры:
3834
  * +0: dword: 7 = номер подфункции
3835
  * +4: dword: поле флагов:
3836
    * бит 0: запустить процесс как отлаживаемый
3837
    * остальные биты зарезервированы и должны быть установлены в 0
3838
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
3839
  * +12 = +0xC: dword: 0 (зарезервировано)
3840
  * +16 = +0x10: dword: 0 (зарезервировано)
3841
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3842
    общем описании
3843
    или
91 diamond 3844
  * +20 = +0x14: db 0
3539 clevermous 3845
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3846
Возвращаемое значение:
3847
  * eax > 0 - программа загружена, eax содержит PID
3848
  * eax < 0 - произошла ошибка, -eax содержит
3849
    код ошибки файловой системы
3850
  * ebx разрушается
3851
Замечания:
3852
  * Командная строка должна заканчиваться символом с кодом 0
3853
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
3854
    включительно, либо первые 256 символов, в зависимости от того,
3855
    что меньше.
3856
  * Если процесс запускается как отлаживаемый, он создаётся
3857
    в замороженном состоянии; для запуска используйте
3858
    подфункцию 5 функции 69.
91 diamond 3859
 
3860
======================================================================
3539 clevermous 3861
========== Функция 70, подфункция 8 - удаление файла/папки. ==========
172 serge 3862
======================================================================
3539 clevermous 3863
Параметры:
3864
  * eax = 70 - номер функции
3865
  * ebx = указатель на информационную структуру
3866
Формат информационной структуры:
3867
  * +0: dword: 8 = номер подфункции
3868
  * +4: dword: 0 (зарезервировано)
3869
  * +8: dword: 0 (зарезервировано)
3870
  * +12 = +0xC: dword: 0 (зарезервировано)
3871
  * +16 = +0x10: dword: 0 (зарезервировано)
3872
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3873
    общем описании
3874
    или
172 serge 3875
  * +20 = +0x14: db 0
3539 clevermous 3876
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
3877
Возвращаемое значение:
3878
  * eax = 0 - успешно, иначе код ошибки файловой системы
3879
  * ebx разрушается
3880
Замечания:
3881
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3882
  * Можно удалять только пустые папки (попытка удаления непустой папки
3883
    приведёт к ошибке с кодом 10, "доступ запрещён").
172 serge 3884
 
3885
======================================================================
3539 clevermous 3886
============= Функция 70, подфункция 9 - создание папки. =============
321 diamond 3887
======================================================================
3539 clevermous 3888
Параметры:
3889
  * eax = 70 - номер функции
3890
  * ebx = указатель на информационную структуру
3891
Формат информационной структуры:
3892
  * +0: dword: 9 = номер подфункции
3893
  * +4: dword: 0 (зарезервировано)
3894
  * +8: dword: 0 (зарезервировано)
3895
  * +12 = +0xC: dword: 0 (зарезервировано)
3896
  * +16 = +0x10: dword: 0 (зарезервировано)
3897
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
3898
    общем описании
3899
    или
321 diamond 3900
  * +20 = +0x14: db 0
3539 clevermous 3901
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки
3902
Возвращаемое значение:
3903
  * eax = 0 - успешно, иначе код ошибки файловой системы
3904
  * ebx разрушается
3905
Замечания:
3906
  * Функция не поддерживается для CD (вернётся код ошибки 2).
3907
  * Родительская папка должна уже существовать.
3908
  * Если папка уже существует, функция завершится успешно (eax=0).
321 diamond 3909
 
3910
======================================================================
3539 clevermous 3911
=== Функция 71, подфункция 1 - установить заголовок окна программы. ==
114 mikedld 3912
======================================================================
3539 clevermous 3913
Параметры:
3914
  * eax = 71 - номер функции
3915
  * ebx = 1 - номер подфункции
3916
  * ecx = адрес строки заголовка
3917
Возвращаемое значение:
3918
  * функция не возвращает значения
3919
Замечания:
5926 pathoswith 3920
  * Строка заголовка должна заканчиваться нулём.
3921
  * Можно указать кодировку заголовка,
3922
    поместив в начале строки байт со значениями:
3923
    1 = cp866
3924
    2 = UTF-16LE
3925
    3 = UTF-8
3926
    иначе будет использоваться cp866.
3539 clevermous 3927
  * Чтобы убрать заголовок, передайте NULL в ecx.
114 mikedld 3928
 
3929
======================================================================
3539 clevermous 3930
================ Функция 72 - послать сообщение окну. ================
665 diamond 3931
======================================================================
3932
 
3539 clevermous 3933
--- Подфункция 1 - послать сообщение с параметром активному окну. ----
3934
Параметры:
3935
  * eax = 72 - номер функции
3936
  * ebx = 1 - номер подфункции
3937
  * ecx = код события: 2 или 3
3938
  * edx = код клавиши для ecx=2, идентификатор кнопки для ecx=3
3939
Возвращаемое значение:
3940
  * eax = 0 - успешно
3941
  * eax = 1 - буфер заполнен
665 diamond 3942
 
3943
======================================================================
3539 clevermous 3944
===================== Функция 73 - blit bitmap  =====================
3315 mario79 3945
======================================================================
3539 clevermous 3946
блит - копирование битового массив
3315 mario79 3947
 
3539 clevermous 3948
Параметры:
3949
  * eax = 73 - номер функции
3315 mario79 3950
 
3539 clevermous 3951
  * ebx = ROP и опциональные флаги
3315 mario79 3952
     31           6 5  4 3   0
3953
     [  reserved  ][T][B][ROP]
3539 clevermous 3954
     ROP - код растровых операций
3955
        0: копировать
3956
     1-15: Зарезервировано
3957
     B   - блит на фоновую поферхность
3958
     T   - блит с прозрачностью
3315 mario79 3959
 
3539 clevermous 3960
  * ecx = указатель на параметры функции
3961
        смещение цели и отсечение
3962
     +0 signed dword: смещение по X окна, для целевого прямоугольника
3963
                      верхний левый угол
3964
     +4 signed dword: смещение по Y окна, для целевого прямоугольника
3965
                      верхний левый угол
3966
     +8 dword:        ширина целевого прямоугольника
3967
    +12 dword:        высота целевого прямоугольника
3315 mario79 3968
 
3539 clevermous 3969
        смещение исходника и отсечение
3970
    +16 signed dword: смещение по X bitmap, для исходного прямоугольника
3971
                      верхний левый угол
3972
    +20 signed dword: смещение по Y bitmap, для исходного прямоугольника
3973
                      верхний левый угол
3974
    +24 dword:        ширина исходного прямоугольника
3975
    +28 dword:        высота исходного прямоугольника
3315 mario79 3976
 
3539 clevermous 3977
    +32: dword: данные bitmap - должны быть 32bpp
3978
    +36: dword: размер строки bitmap в байтах
3315 mario79 3979
 
3539 clevermous 3980
Возвращаемое значение:
3981
  * функция не возвращает значения
3315 mario79 3982
 
3983
======================================================================
3837 mario79 3984
=================== Функция 74, подфункция -1 ========================
3985
=========== Получить количество активных сетевых устройств. ==========
3986
======================================================================
3987
Параметры:
3988
  * eax = 74 - номер функции
3989
  * bl = -1 - номер подфункции
3990
Возвращаемое значение:
3991
  * eax = количество активных сетевых устройств
3992
 
3993
======================================================================
3994
==== Функция 74, подфункция 0, Получить тип сетевого устройства. =====
3995
======================================================================
3996
Параметры:
3997
  * eax = 74 - номер функции
3998
  * bl = 0 - номер подфункции
3999
  * bh = номер устройства
4000
Возвращаемое значение:
4001
  * eax = тип устройства
4002
 
4003
======================================================================
4004
==== Функция 74, подфункция 1, Получить имя сетевого устройства. =====
4005
======================================================================
4006
Параметры:
4007
  * eax = 74 - номер функции
4008
  * bl = 1 - номер подфункции
4009
  * bh = номер устройства
4010
  * ecx = указатель на буфера - 64 байт
4011
Возвращаемое значение:
4012
  * eax = -1 для ошибки
4013
  * В случае успеха в буфер записывается имя сетевого устройства
4014
 
4015
======================================================================
4016
======= Функция 74, подфункция 2, Сброс сетевого устройства. =========
4017
======================================================================
4018
Параметры:
4019
  * eax = 74 - номер функции
4020
  * bl = 2 - номер подфункции
4021
  * bh = номер устройства
4022
Возвращаемое значение:
4023
  * eax = -1 для ошибки
4024
 
4025
======================================================================
4026
====== Функция 74, подфункция 3, Остановить сетевое устройство. ======
4027
======================================================================
4028
Параметры:
4029
  * eax = 74 - номер функции
4030
  * bl = 3 - номер подфункции
4031
  * bh = номер устройства
4032
Возвращаемое значение:
4033
  * eax = -1 для ошибки
4034
 
4035
======================================================================
4036
======= Функция 75, подфункция 0, Open socket (Открыть сокет). =======
4037
======================================================================
4038
Параметры:
4039
  * eax = 75 - номер функции
4040
  * bl = 0 - номер подфункции
4041
  * ecx = домен
4042
  * edx = тип
4043
  * esi = протокол
4044
Возвращаемое значение:
4045
  * eax = номер сокета, -1 для ошибки
3868 mario79 4046
  * ebx = код ошибки
3837 mario79 4047
 
4048
======================================================================
4049
======= Функция 75, подфункция 1, Close socket (Закрыть сокет). ======
4050
======================================================================
4051
Параметры:
4052
  * eax = 75 - номер функции
4053
  * bl = 1 - номер подфункции
4054
  * ecx = номер сокета
4055
Возвращаемое значение:
4056
  * eax = -1 для ошибки
3868 mario79 4057
  * ebx = код ошибки
3837 mario79 4058
 
4059
======================================================================
4060
============= Функция 75, подфункция 2, Bind (Привязка). =============
4061
======================================================================
4062
Параметры:
4063
  * eax = 75 - номер функции
4064
  * bl = 2 - номер подфункции
4065
  * ecx = номер сокета
4066
  * edx = указатель на структуру sockaddr
4067
  * esi = длина структуры sockaddr
4068
Возвращаемое значение:
4069
  * eax = -1 для ошибки
3868 mario79 4070
  * ebx = код ошибки
3837 mario79 4071
 
4072
======================================================================
4073
============ Функция 75, подфункция 3, Listen (Слушать). =============
4074
======================================================================
4075
Параметры:
4076
  * eax = 75 - номер функции
4077
  * bl = 3 - номер подфункции
4078
  * ecx = номер сокета
4079
  * edx = backlog (возвращаемый лог)
4080
Возвращаемое значение:
4081
  * eax = -1 для ошибки
3868 mario79 4082
  * ebx = код ошибки
3837 mario79 4083
 
4084
======================================================================
4085
========== Функция 75, подфункция 4, Connect (Соединение). ===========
4086
======================================================================
4087
Параметры:
4088
  * eax = 75 - номер функции
4089
  * bl = 4 - номер подфункции
4090
  * ecx = номер сокета
4091
  * edx = указатель на структуру sockaddr
4092
  * esi = длина структуры sockaddr
4093
Возвращаемое значение:
4094
  * eax = -1 для ошибки
3868 mario79 4095
  * ebx = код ошибки
3837 mario79 4096
 
4097
======================================================================
4098
=========== Функция 75, подфункция 5, Accept (Соглашение). ===========
4099
======================================================================
4100
Параметры:
4101
  * eax = 75 - номер функции
4102
  * bl = 5 - номер подфункции
4103
  * ecx = номер сокета
4104
  * edx = указатель на структуру sockaddr
4105
  * esi = длина структуры sockaddr
4106
Возвращаемое значение:
3868 mario79 4107
  * eax = номер сокета из принятого сокета, -1 для ошибки
4108
  * ebx = код ошибки
3837 mario79 4109
 
4110
======================================================================
4111
============= Функция 75, подфункция 6, Send (Послать). ==============
4112
======================================================================
4113
Параметры:
4114
  * eax = 75 - номер функции
4115
  * bl = 6 - номер подфункции
4116
  * ecx = номер сокета
4117
  * edx = указатель на буфер
4118
  * esi = длина буфера
3868 mario79 4119
  * edi = флаги
3837 mario79 4120
Возвращаемое значение:
4121
  * eax = количество скопированных байтов, -1 для ошибки
3868 mario79 4122
  * ebx = код ошибки
3837 mario79 4123
 
4124
======================================================================
4125
============ Функция 75, подфункция 7, Receive (Получить). ===========
4126
======================================================================
4127
Параметры:
4128
  * eax = 75 - номер функции
4129
  * bl = 7 - номер подфункции
4130
  * ecx = номер сокета
4131
  * edx = указатель на буфер
4132
  * esi = длина буфера
4133
  * edi = флаги
4134
Возвращаемое значение:
4135
  * eax = количество скопированных байтов, -1 для ошибки
3868 mario79 4136
  * ebx = код ошибки
3837 mario79 4137
 
4138
======================================================================
4139
= Функция 75, подфункция 8, Set socket options (Задать опции сокета) =
4140
======================================================================
4141
Параметры:
4142
  * eax = 75 - номер функции
4143
  * bl = 8 - номер подфункции
4144
  * ecx = номер сокета
4145
  * edx = указатель на optstruct
4146
Возвращаемое значение:
4147
  * eax = -1 для ошибки
3868 mario79 4148
  * ebx = код ошибки
3837 mario79 4149
Замечания:
4150
 
4151
  Optstruct: dd level
4152
             dd optionname
4153
             dd optlength
4154
             db options...
4155
 
4156
======================================================================
4157
= Функция 75, подфункция 9, Get socket options(Получить опции сокета)
4158
======================================================================
4159
Параметры:
4160
  * eax = 75 - номер функции
4161
  * bl = 9 - номер подфункции
4162
  * ecx = номер сокета
4163
  * edx = указатель на optstruct
4164
Возвращаемое значение:
4165
  * eax = -1 для ошибки
3868 mario79 4166
  * ebx = код ошибки
3837 mario79 4167
Замечания:
4168
 
4169
  Optstruct: dd level
4170
             dd optionname
4171
             dd optlength
4172
             db options...
4173
 
4174
======================================================================
4175
= Функция 75, подфункция 10, Get socketpair (Получить парный сокет). =
4176
======================================================================
4177
Параметры:
4178
  * eax = 75 - номер функции
4179
  * bl = 10 - номер подфункции
4180
Возвращаемое значение:
4181
  * eax = socketnum1, -1 для ошибки
3868 mario79 4182
  * ebx = socketnum2, код ошибки в случае ошибки
3837 mario79 4183
 
4184
======================================================================
3539 clevermous 4185
========== Функция -1 - завершить выполнение потока/процесса =========
77 diamond 4186
======================================================================
3539 clevermous 4187
Параметры:
4188
  * eax = -1 - номер функции
4189
Возвращаемое значение:
4190
  * функция не возвращает ни значения, ни управления
4191
Замечания:
4192
  * Если процесс явно не создавал потоков, то у него есть только
4193
    один поток, завершение которого приводит к завершению процесса.
4194
  * Если текущий поток - последний в процессе, то его завершение
4195
    также приводит к завершению процесса.
4196
  * Эта функция завершает текущий поток. Другой поток можно прибить
4197
    вызовом подфункции 2 функции 18.
77 diamond 4198
 
4199
======================================================================
3539 clevermous 4200
=========================== Список событий ===========================
77 diamond 4201
======================================================================
3539 clevermous 4202
Очередное событие можно получить вызовом одной из функций 10
4203
(ожидать события), 11 (проверить без ожидания), 23
4204
(ожидать в течение заданного времени).
4205
Эти функции возвращают только те события, которые входят в маску,
4206
устанавливаемую функцией 40. По умолчанию это первые три, чего
4207
вполне достаточно для многих приложений.
4208
Коды событий:
4209
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
4210
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
4211
    активно) или нажата "горячая клавиша";
4212
    сбрасывается, когда все клавиши из буфера считаны функцией 2
4213
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
4214
    закрытия, созданная неявно функцией 0; кнопка минимизации
4215
    обрабатывается системой и о ней сообщения не приходит;
4216
    поступает, только когда окно активно; сбрасывается, когда все
4217
    кнопки из буфера считаны функцией 17)
4218
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
4219
    при размаскировке функцией 40)
4220
  * 5 = завершилась перерисовка фона рабочего стола
4221
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
4222
    или перемещение; сбрасывается при прочтении)
4223
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
4224
    Communication; сбрасывается при прочтении)
4225
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
4226
    смотри работу с сетью)
4227
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
4228
    смотри отладочную подсистему)
4229
  * 16..31 = произошло событие с соответствующим IRQ
4230
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
77 diamond 4231
 
4232
======================================================================
3539 clevermous 4233
==================== Коды ошибок файловой системы ====================
77 diamond 4234
======================================================================
3539 clevermous 4235
  * 0 = успешно
4236
  * 1 = не определена база и/или раздел жёсткого диска (подфункциями
4237
    7, 8 функции 21)
4238
  * 2 = функция не поддерживается для данной файловой системы
4239
  * 3 = неизвестная файловая система
4240
  * 4 = зарезервировано, никогда не возвращается в текущей реализации
4241
  * 5 = файл не найден
4242
  * 6 = файл закончился
4243
  * 7 = указатель вне памяти приложения
4244
  * 8 = диск заполнен
4245
  * 9 = таблица FAT разрушена
4246
  * 10 = доступ запрещён
4247
  * 11 = ошибка устройства
4248
При запуске программы возможны также следующие коды ошибок:
4249
  * 30 = 0x1E = недостаточно памяти
4250
  * 31 = 0x1F = файл не является исполнимым
4251
  * 32 = 0x20 = слишком много процессов